idlerpg.sh 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -0
- package/dist/affix/AffixRegistry.d.ts +68 -0
- package/dist/affix/AffixRegistry.d.ts.map +1 -0
- package/dist/affix/AffixRegistry.js +245 -0
- package/dist/affix/AffixRegistry.js.map +1 -0
- package/dist/affix/PluginLoader.d.ts +66 -0
- package/dist/affix/PluginLoader.d.ts.map +1 -0
- package/dist/affix/PluginLoader.js +321 -0
- package/dist/affix/PluginLoader.js.map +1 -0
- package/dist/affix/builtin.d.ts +6 -0
- package/dist/affix/builtin.d.ts.map +1 -0
- package/dist/affix/builtin.js +311 -0
- package/dist/affix/builtin.js.map +1 -0
- package/dist/affix/index.d.ts +8 -0
- package/dist/affix/index.d.ts.map +1 -0
- package/dist/affix/index.js +11 -0
- package/dist/affix/index.js.map +1 -0
- package/dist/affix/types.d.ts +152 -0
- package/dist/affix/types.d.ts.map +1 -0
- package/dist/affix/types.js +8 -0
- package/dist/affix/types.js.map +1 -0
- package/dist/ai/PlayKitClient.d.ts +208 -0
- package/dist/ai/PlayKitClient.d.ts.map +1 -0
- package/dist/ai/PlayKitClient.js +721 -0
- package/dist/ai/PlayKitClient.js.map +1 -0
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +8 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/app/App.d.ts +85 -0
- package/dist/app/App.d.ts.map +1 -0
- package/dist/app/App.js +296 -0
- package/dist/app/App.js.map +1 -0
- package/dist/app/EventBus.d.ts +222 -0
- package/dist/app/EventBus.d.ts.map +1 -0
- package/dist/app/EventBus.js +88 -0
- package/dist/app/EventBus.js.map +1 -0
- package/dist/app/Keybind.d.ts +83 -0
- package/dist/app/Keybind.d.ts.map +1 -0
- package/dist/app/Keybind.js +184 -0
- package/dist/app/Keybind.js.map +1 -0
- package/dist/app/Router.d.ts +123 -0
- package/dist/app/Router.d.ts.map +1 -0
- package/dist/app/Router.js +142 -0
- package/dist/app/Router.js.map +1 -0
- package/dist/app/ScreenManager.d.ts +97 -0
- package/dist/app/ScreenManager.d.ts.map +1 -0
- package/dist/app/ScreenManager.js +216 -0
- package/dist/app/ScreenManager.js.map +1 -0
- package/dist/app/index.d.ts +14 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +19 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/screens/BaseScreen.d.ts +101 -0
- package/dist/app/screens/BaseScreen.d.ts.map +1 -0
- package/dist/app/screens/BaseScreen.js +132 -0
- package/dist/app/screens/BaseScreen.js.map +1 -0
- package/dist/app/screens/CharacterCreationScreen.d.ts +42 -0
- package/dist/app/screens/CharacterCreationScreen.d.ts.map +1 -0
- package/dist/app/screens/CharacterCreationScreen.js +467 -0
- package/dist/app/screens/CharacterCreationScreen.js.map +1 -0
- package/dist/app/screens/CombatScreen.d.ts +30 -0
- package/dist/app/screens/CombatScreen.d.ts.map +1 -0
- package/dist/app/screens/CombatScreen.js +309 -0
- package/dist/app/screens/CombatScreen.js.map +1 -0
- package/dist/app/screens/DialogScreen.d.ts +29 -0
- package/dist/app/screens/DialogScreen.d.ts.map +1 -0
- package/dist/app/screens/DialogScreen.js +295 -0
- package/dist/app/screens/DialogScreen.js.map +1 -0
- package/dist/app/screens/ExploreScreen.d.ts +50 -0
- package/dist/app/screens/ExploreScreen.d.ts.map +1 -0
- package/dist/app/screens/ExploreScreen.js +308 -0
- package/dist/app/screens/ExploreScreen.js.map +1 -0
- package/dist/app/screens/HelpScreen.d.ts +12 -0
- package/dist/app/screens/HelpScreen.d.ts.map +1 -0
- package/dist/app/screens/HelpScreen.js +155 -0
- package/dist/app/screens/HelpScreen.js.map +1 -0
- package/dist/app/screens/InventoryScreen.d.ts +27 -0
- package/dist/app/screens/InventoryScreen.d.ts.map +1 -0
- package/dist/app/screens/InventoryScreen.js +326 -0
- package/dist/app/screens/InventoryScreen.js.map +1 -0
- package/dist/app/screens/PrologueScreen.d.ts +24 -0
- package/dist/app/screens/PrologueScreen.d.ts.map +1 -0
- package/dist/app/screens/PrologueScreen.js +176 -0
- package/dist/app/screens/PrologueScreen.js.map +1 -0
- package/dist/app/screens/TitleScreen.d.ts +42 -0
- package/dist/app/screens/TitleScreen.d.ts.map +1 -0
- package/dist/app/screens/TitleScreen.js +380 -0
- package/dist/app/screens/TitleScreen.js.map +1 -0
- package/dist/app/screens/TravelScreen.d.ts +22 -0
- package/dist/app/screens/TravelScreen.d.ts.map +1 -0
- package/dist/app/screens/TravelScreen.js +122 -0
- package/dist/app/screens/TravelScreen.js.map +1 -0
- package/dist/app/screens/index.d.ts +14 -0
- package/dist/app/screens/index.d.ts.map +1 -0
- package/dist/app/screens/index.js +17 -0
- package/dist/app/screens/index.js.map +1 -0
- package/dist/commands/CommandRegistry.d.ts +91 -0
- package/dist/commands/CommandRegistry.d.ts.map +1 -0
- package/dist/commands/CommandRegistry.js +159 -0
- package/dist/commands/CommandRegistry.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/core/Actor.d.ts +103 -0
- package/dist/core/Actor.d.ts.map +1 -0
- package/dist/core/Actor.js +409 -0
- package/dist/core/Actor.js.map +1 -0
- package/dist/core/Combat.d.ts +37 -0
- package/dist/core/Combat.d.ts.map +1 -0
- package/dist/core/Combat.js +294 -0
- package/dist/core/Combat.js.map +1 -0
- package/dist/core/DungeonRunner.d.ts +169 -0
- package/dist/core/DungeonRunner.d.ts.map +1 -0
- package/dist/core/DungeonRunner.js +627 -0
- package/dist/core/DungeonRunner.js.map +1 -0
- package/dist/core/Game.d.ts +133 -0
- package/dist/core/Game.d.ts.map +1 -0
- package/dist/core/Game.js +644 -0
- package/dist/core/Game.js.map +1 -0
- package/dist/core/IdleCombat.d.ts +61 -0
- package/dist/core/IdleCombat.d.ts.map +1 -0
- package/dist/core/IdleCombat.js +461 -0
- package/dist/core/IdleCombat.js.map +1 -0
- package/dist/core/IdleGameManager.d.ts +198 -0
- package/dist/core/IdleGameManager.d.ts.map +1 -0
- package/dist/core/IdleGameManager.js +688 -0
- package/dist/core/IdleGameManager.js.map +1 -0
- package/dist/core/IdleSaveManager.d.ts +109 -0
- package/dist/core/IdleSaveManager.d.ts.map +1 -0
- package/dist/core/IdleSaveManager.js +296 -0
- package/dist/core/IdleSaveManager.js.map +1 -0
- package/dist/core/NewGameFlowManager.d.ts +64 -0
- package/dist/core/NewGameFlowManager.d.ts.map +1 -0
- package/dist/core/NewGameFlowManager.js +153 -0
- package/dist/core/NewGameFlowManager.js.map +1 -0
- package/dist/core/Player.d.ts +65 -0
- package/dist/core/Player.d.ts.map +1 -0
- package/dist/core/Player.js +261 -0
- package/dist/core/Player.js.map +1 -0
- package/dist/core/RoomHandlers.d.ts +75 -0
- package/dist/core/RoomHandlers.d.ts.map +1 -0
- package/dist/core/RoomHandlers.js +383 -0
- package/dist/core/RoomHandlers.js.map +1 -0
- package/dist/core/SaveManager.d.ts +84 -0
- package/dist/core/SaveManager.d.ts.map +1 -0
- package/dist/core/SaveManager.js +281 -0
- package/dist/core/SaveManager.js.map +1 -0
- package/dist/core/SaveMigration.d.ts +69 -0
- package/dist/core/SaveMigration.d.ts.map +1 -0
- package/dist/core/SaveMigration.js +408 -0
- package/dist/core/SaveMigration.js.map +1 -0
- package/dist/core/StateAdapter.d.ts +79 -0
- package/dist/core/StateAdapter.d.ts.map +1 -0
- package/dist/core/StateAdapter.js +397 -0
- package/dist/core/StateAdapter.js.map +1 -0
- package/dist/core/Team.d.ts +145 -0
- package/dist/core/Team.d.ts.map +1 -0
- package/dist/core/Team.js +371 -0
- package/dist/core/Team.js.map +1 -0
- package/dist/core/TeamCombat.d.ts +88 -0
- package/dist/core/TeamCombat.d.ts.map +1 -0
- package/dist/core/TeamCombat.js +405 -0
- package/dist/core/TeamCombat.js.map +1 -0
- package/dist/core/TeamDungeonRunner.d.ts +186 -0
- package/dist/core/TeamDungeonRunner.d.ts.map +1 -0
- package/dist/core/TeamDungeonRunner.js +758 -0
- package/dist/core/TeamDungeonRunner.js.map +1 -0
- package/dist/core/TimeManager.d.ts +114 -0
- package/dist/core/TimeManager.d.ts.map +1 -0
- package/dist/core/TimeManager.js +318 -0
- package/dist/core/TimeManager.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/timeConstants.d.ts +135 -0
- package/dist/core/timeConstants.d.ts.map +1 -0
- package/dist/core/timeConstants.js +157 -0
- package/dist/core/timeConstants.js.map +1 -0
- package/dist/core/types.d.ts +780 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +16 -0
- package/dist/core/types.js.map +1 -0
- package/dist/data/continents/index.d.ts +163 -0
- package/dist/data/continents/index.d.ts.map +1 -0
- package/dist/data/continents/index.js +31 -0
- package/dist/data/continents/index.js.map +1 -0
- package/dist/data/continents/verdantia.d.ts +294 -0
- package/dist/data/continents/verdantia.d.ts.map +1 -0
- package/dist/data/continents/verdantia.js +327 -0
- package/dist/data/continents/verdantia.js.map +1 -0
- package/dist/handlers/DialogHandler.d.ts +95 -0
- package/dist/handlers/DialogHandler.d.ts.map +1 -0
- package/dist/handlers/DialogHandler.js +450 -0
- package/dist/handlers/DialogHandler.js.map +1 -0
- package/dist/handlers/SaveLoadHandler.d.ts +60 -0
- package/dist/handlers/SaveLoadHandler.d.ts.map +1 -0
- package/dist/handlers/SaveLoadHandler.js +187 -0
- package/dist/handlers/SaveLoadHandler.js.map +1 -0
- package/dist/handlers/TitleScreenHandler.d.ts +43 -0
- package/dist/handlers/TitleScreenHandler.d.ts.map +1 -0
- package/dist/handlers/TitleScreenHandler.js +508 -0
- package/dist/handlers/TitleScreenHandler.js.map +1 -0
- package/dist/handlers/WorkshopHandler.d.ts +75 -0
- package/dist/handlers/WorkshopHandler.d.ts.map +1 -0
- package/dist/handlers/WorkshopHandler.js +401 -0
- package/dist/handlers/WorkshopHandler.js.map +1 -0
- package/dist/handlers/index.d.ts +12 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +14 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/types.d.ts +34 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +8 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +130 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +40 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +105 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +133 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +3 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +130 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/instrument.d.ts +8 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +33 -0
- package/dist/instrument.js.map +1 -0
- package/dist/main-new.d.ts +12 -0
- package/dist/main-new.d.ts.map +1 -0
- package/dist/main-new.js +32 -0
- package/dist/main-new.js.map +1 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +2816 -0
- package/dist/main.js.map +1 -0
- package/dist/map/ContinentManager.d.ts +88 -0
- package/dist/map/ContinentManager.d.ts.map +1 -0
- package/dist/map/ContinentManager.js +241 -0
- package/dist/map/ContinentManager.js.map +1 -0
- package/dist/map/DungeonGenerator.d.ts +32 -0
- package/dist/map/DungeonGenerator.d.ts.map +1 -0
- package/dist/map/DungeonGenerator.js +615 -0
- package/dist/map/DungeonGenerator.js.map +1 -0
- package/dist/map/MapGenerator.d.ts +27 -0
- package/dist/map/MapGenerator.d.ts.map +1 -0
- package/dist/map/MapGenerator.js +485 -0
- package/dist/map/MapGenerator.js.map +1 -0
- package/dist/map/index.d.ts +5 -0
- package/dist/map/index.d.ts.map +1 -0
- package/dist/map/index.js +8 -0
- package/dist/map/index.js.map +1 -0
- package/dist/npc/NPCGenerator.d.ts +68 -0
- package/dist/npc/NPCGenerator.d.ts.map +1 -0
- package/dist/npc/NPCGenerator.js +468 -0
- package/dist/npc/NPCGenerator.js.map +1 -0
- package/dist/npc/NPCManager.d.ts +86 -0
- package/dist/npc/NPCManager.d.ts.map +1 -0
- package/dist/npc/NPCManager.js +217 -0
- package/dist/npc/NPCManager.js.map +1 -0
- package/dist/npc/fixedNPCs.d.ts +7 -0
- package/dist/npc/fixedNPCs.d.ts.map +1 -0
- package/dist/npc/fixedNPCs.js +196 -0
- package/dist/npc/fixedNPCs.js.map +1 -0
- package/dist/npc/index.d.ts +9 -0
- package/dist/npc/index.d.ts.map +1 -0
- package/dist/npc/index.js +12 -0
- package/dist/npc/index.js.map +1 -0
- package/dist/npc/traits.d.ts +33 -0
- package/dist/npc/traits.d.ts.map +1 -0
- package/dist/npc/traits.js +795 -0
- package/dist/npc/traits.js.map +1 -0
- package/dist/npc/types.d.ts +193 -0
- package/dist/npc/types.d.ts.map +1 -0
- package/dist/npc/types.js +9 -0
- package/dist/npc/types.js.map +1 -0
- package/dist/quest/QuestManager.d.ts +79 -0
- package/dist/quest/QuestManager.d.ts.map +1 -0
- package/dist/quest/QuestManager.js +273 -0
- package/dist/quest/QuestManager.js.map +1 -0
- package/dist/quest/index.d.ts +6 -0
- package/dist/quest/index.d.ts.map +1 -0
- package/dist/quest/index.js +9 -0
- package/dist/quest/index.js.map +1 -0
- package/dist/quest/types.d.ts +81 -0
- package/dist/quest/types.d.ts.map +1 -0
- package/dist/quest/types.js +8 -0
- package/dist/quest/types.js.map +1 -0
- package/dist/strategy/StrategyExecutor.d.ts +159 -0
- package/dist/strategy/StrategyExecutor.d.ts.map +1 -0
- package/dist/strategy/StrategyExecutor.js +479 -0
- package/dist/strategy/StrategyExecutor.js.map +1 -0
- package/dist/strategy/StrategyParser.d.ts +48 -0
- package/dist/strategy/StrategyParser.d.ts.map +1 -0
- package/dist/strategy/StrategyParser.js +321 -0
- package/dist/strategy/StrategyParser.js.map +1 -0
- package/dist/strategy/defaultStrategy.d.ts +40 -0
- package/dist/strategy/defaultStrategy.d.ts.map +1 -0
- package/dist/strategy/defaultStrategy.js +254 -0
- package/dist/strategy/defaultStrategy.js.map +1 -0
- package/dist/strategy/index.d.ts +8 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +14 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/tui/ExploreMenu.d.ts +106 -0
- package/dist/tui/ExploreMenu.d.ts.map +1 -0
- package/dist/tui/ExploreMenu.js +282 -0
- package/dist/tui/ExploreMenu.js.map +1 -0
- package/dist/tui/GameUI.d.ts +313 -0
- package/dist/tui/GameUI.d.ts.map +1 -0
- package/dist/tui/GameUI.js +2116 -0
- package/dist/tui/GameUI.js.map +1 -0
- package/dist/tui/GameUIAdapter.d.ts +207 -0
- package/dist/tui/GameUIAdapter.d.ts.map +1 -0
- package/dist/tui/GameUIAdapter.js +1342 -0
- package/dist/tui/GameUIAdapter.js.map +1 -0
- package/dist/tui/Input.d.ts +139 -0
- package/dist/tui/Input.d.ts.map +1 -0
- package/dist/tui/Input.js +278 -0
- package/dist/tui/Input.js.map +1 -0
- package/dist/tui/Menu.d.ts +110 -0
- package/dist/tui/Menu.d.ts.map +1 -0
- package/dist/tui/Menu.js +365 -0
- package/dist/tui/Menu.js.map +1 -0
- package/dist/tui/Screen.d.ts +228 -0
- package/dist/tui/Screen.d.ts.map +1 -0
- package/dist/tui/Screen.js +502 -0
- package/dist/tui/Screen.js.map +1 -0
- package/dist/tui/components/Box.d.ts +36 -0
- package/dist/tui/components/Box.d.ts.map +1 -0
- package/dist/tui/components/Box.js +43 -0
- package/dist/tui/components/Box.js.map +1 -0
- package/dist/tui/components/List.d.ts +69 -0
- package/dist/tui/components/List.d.ts.map +1 -0
- package/dist/tui/components/List.js +136 -0
- package/dist/tui/components/List.js.map +1 -0
- package/dist/tui/components/ProgressBar.d.ts +42 -0
- package/dist/tui/components/ProgressBar.d.ts.map +1 -0
- package/dist/tui/components/ProgressBar.js +75 -0
- package/dist/tui/components/ProgressBar.js.map +1 -0
- package/dist/tui/components/index.d.ts +8 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +11 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/core/BaseSection.d.ts +98 -0
- package/dist/tui/core/BaseSection.d.ts.map +1 -0
- package/dist/tui/core/BaseSection.js +174 -0
- package/dist/tui/core/BaseSection.js.map +1 -0
- package/dist/tui/core/Component.d.ts +61 -0
- package/dist/tui/core/Component.d.ts.map +1 -0
- package/dist/tui/core/Component.js +32 -0
- package/dist/tui/core/Component.js.map +1 -0
- package/dist/tui/core/Section.d.ts +101 -0
- package/dist/tui/core/Section.d.ts.map +1 -0
- package/dist/tui/core/Section.js +24 -0
- package/dist/tui/core/Section.js.map +1 -0
- package/dist/tui/core/SectionManager.d.ts +108 -0
- package/dist/tui/core/SectionManager.d.ts.map +1 -0
- package/dist/tui/core/SectionManager.js +258 -0
- package/dist/tui/core/SectionManager.js.map +1 -0
- package/dist/tui/core/index.d.ts +9 -0
- package/dist/tui/core/index.d.ts.map +1 -0
- package/dist/tui/core/index.js +12 -0
- package/dist/tui/core/index.js.map +1 -0
- package/dist/tui/index.d.ts +15 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +23 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/screens/BaseScreen.d.ts +62 -0
- package/dist/tui/screens/BaseScreen.d.ts.map +1 -0
- package/dist/tui/screens/BaseScreen.js +55 -0
- package/dist/tui/screens/BaseScreen.js.map +1 -0
- package/dist/tui/screens/CombatScreen.d.ts +43 -0
- package/dist/tui/screens/CombatScreen.d.ts.map +1 -0
- package/dist/tui/screens/CombatScreen.js +125 -0
- package/dist/tui/screens/CombatScreen.js.map +1 -0
- package/dist/tui/screens/DialogScreen.d.ts +53 -0
- package/dist/tui/screens/DialogScreen.d.ts.map +1 -0
- package/dist/tui/screens/DialogScreen.js +90 -0
- package/dist/tui/screens/DialogScreen.js.map +1 -0
- package/dist/tui/screens/DungeonScreen.d.ts +80 -0
- package/dist/tui/screens/DungeonScreen.d.ts.map +1 -0
- package/dist/tui/screens/DungeonScreen.js +317 -0
- package/dist/tui/screens/DungeonScreen.js.map +1 -0
- package/dist/tui/screens/ExploreScreen.d.ts +69 -0
- package/dist/tui/screens/ExploreScreen.d.ts.map +1 -0
- package/dist/tui/screens/ExploreScreen.js +224 -0
- package/dist/tui/screens/ExploreScreen.js.map +1 -0
- package/dist/tui/screens/SectionScreen.d.ts +84 -0
- package/dist/tui/screens/SectionScreen.d.ts.map +1 -0
- package/dist/tui/screens/SectionScreen.js +156 -0
- package/dist/tui/screens/SectionScreen.js.map +1 -0
- package/dist/tui/screens/TitleScreen.d.ts +40 -0
- package/dist/tui/screens/TitleScreen.d.ts.map +1 -0
- package/dist/tui/screens/TitleScreen.js +253 -0
- package/dist/tui/screens/TitleScreen.js.map +1 -0
- package/dist/tui/screens/TownScreen.d.ts +98 -0
- package/dist/tui/screens/TownScreen.d.ts.map +1 -0
- package/dist/tui/screens/TownScreen.js +370 -0
- package/dist/tui/screens/TownScreen.js.map +1 -0
- package/dist/tui/screens/TravelScreen.d.ts +67 -0
- package/dist/tui/screens/TravelScreen.d.ts.map +1 -0
- package/dist/tui/screens/TravelScreen.js +286 -0
- package/dist/tui/screens/TravelScreen.js.map +1 -0
- package/dist/tui/screens/index.d.ts +8 -0
- package/dist/tui/screens/index.d.ts.map +1 -0
- package/dist/tui/screens/index.js +17 -0
- package/dist/tui/screens/index.js.map +1 -0
- package/dist/tui/sections/ActionsSection.d.ts +71 -0
- package/dist/tui/sections/ActionsSection.d.ts.map +1 -0
- package/dist/tui/sections/ActionsSection.js +184 -0
- package/dist/tui/sections/ActionsSection.js.map +1 -0
- package/dist/tui/sections/DungeonSection.d.ts +65 -0
- package/dist/tui/sections/DungeonSection.d.ts.map +1 -0
- package/dist/tui/sections/DungeonSection.js +144 -0
- package/dist/tui/sections/DungeonSection.js.map +1 -0
- package/dist/tui/sections/EventsSection.d.ts +50 -0
- package/dist/tui/sections/EventsSection.d.ts.map +1 -0
- package/dist/tui/sections/EventsSection.js +134 -0
- package/dist/tui/sections/EventsSection.js.map +1 -0
- package/dist/tui/sections/MapSection.d.ts +66 -0
- package/dist/tui/sections/MapSection.d.ts.map +1 -0
- package/dist/tui/sections/MapSection.js +669 -0
- package/dist/tui/sections/MapSection.js.map +1 -0
- package/dist/tui/sections/StatusSection.d.ts +47 -0
- package/dist/tui/sections/StatusSection.d.ts.map +1 -0
- package/dist/tui/sections/StatusSection.js +133 -0
- package/dist/tui/sections/StatusSection.js.map +1 -0
- package/dist/tui/sections/TeamSection.d.ts +71 -0
- package/dist/tui/sections/TeamSection.d.ts.map +1 -0
- package/dist/tui/sections/TeamSection.js +224 -0
- package/dist/tui/sections/TeamSection.js.map +1 -0
- package/dist/tui/sections/TravelingSection.d.ts +51 -0
- package/dist/tui/sections/TravelingSection.d.ts.map +1 -0
- package/dist/tui/sections/TravelingSection.js +106 -0
- package/dist/tui/sections/TravelingSection.js.map +1 -0
- package/dist/tui/sections/index.d.ts +9 -0
- package/dist/tui/sections/index.d.ts.map +1 -0
- package/dist/tui/sections/index.js +12 -0
- package/dist/tui/sections/index.js.map +1 -0
- package/dist/ui/Terminal.d.ts +68 -0
- package/dist/ui/Terminal.d.ts.map +1 -0
- package/dist/ui/Terminal.js +297 -0
- package/dist/ui/Terminal.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +8 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/configMigration.d.ts +14 -0
- package/dist/utils/configMigration.d.ts.map +1 -0
- package/dist/utils/configMigration.js +92 -0
- package/dist/utils/configMigration.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +86 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +224 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/weapon/WeaponFactory.d.ts +32 -0
- package/dist/weapon/WeaponFactory.d.ts.map +1 -0
- package/dist/weapon/WeaponFactory.js +216 -0
- package/dist/weapon/WeaponFactory.js.map +1 -0
- package/dist/weapon/index.d.ts +5 -0
- package/dist/weapon/index.d.ts.map +1 -0
- package/dist/weapon/index.js +8 -0
- package/dist/weapon/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DialogHandler - Handles NPC dialog interactions
|
|
3
|
+
*
|
|
4
|
+
* Extracted from main.ts to reduce file size.
|
|
5
|
+
* Manages NPC conversations, AI responses, quests from NPCs.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9702a696-0205-5406-84e6-7bea9b63df9d")}catch(e){}}();
|
|
9
|
+
import { getAIClient } from '../ai/PlayKitClient.js';
|
|
10
|
+
import { Sentry } from '../instrument.js';
|
|
11
|
+
/**
|
|
12
|
+
* Handles NPC dialog interactions
|
|
13
|
+
*/
|
|
14
|
+
export class DialogHandler {
|
|
15
|
+
ui;
|
|
16
|
+
npcManager;
|
|
17
|
+
questManager;
|
|
18
|
+
router;
|
|
19
|
+
idleGameManager;
|
|
20
|
+
addLog;
|
|
21
|
+
// Dialog state
|
|
22
|
+
currentDialogNPC = null;
|
|
23
|
+
dialogHistory = [];
|
|
24
|
+
pendingQuest = null;
|
|
25
|
+
awaitingQuestResponse = false;
|
|
26
|
+
// AI error handling
|
|
27
|
+
consecutiveAIFailures = 0;
|
|
28
|
+
MAX_CONSECUTIVE_FAILURES = 3;
|
|
29
|
+
constructor(deps) {
|
|
30
|
+
this.ui = deps.ui;
|
|
31
|
+
this.npcManager = deps.npcManager;
|
|
32
|
+
this.questManager = deps.questManager;
|
|
33
|
+
this.router = deps.router;
|
|
34
|
+
this.idleGameManager = deps.idleGameManager;
|
|
35
|
+
this.addLog = deps.addLog;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get current dialog NPC
|
|
39
|
+
*/
|
|
40
|
+
getCurrentNPC() {
|
|
41
|
+
return this.currentDialogNPC;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Start dialog with an NPC
|
|
45
|
+
*/
|
|
46
|
+
async startDialog(npc) {
|
|
47
|
+
this.currentDialogNPC = npc;
|
|
48
|
+
this.dialogHistory = [];
|
|
49
|
+
// Get greeting based on relationship
|
|
50
|
+
const greeting = this.generateGreeting(npc);
|
|
51
|
+
this.dialogHistory.push({ role: 'npc', text: greeting });
|
|
52
|
+
// Mark player as met
|
|
53
|
+
npc.metPlayer = true;
|
|
54
|
+
// Switch to dialog mode via router
|
|
55
|
+
this.router.navigate({ type: 'dialog', npcId: npc.id });
|
|
56
|
+
// Pause dungeon if in dungeon
|
|
57
|
+
this.idleGameManager.pauseDungeon();
|
|
58
|
+
// Set up dialog input handler
|
|
59
|
+
this.ui.onDialogInputHandler((input) => this.handleInput(input));
|
|
60
|
+
// Render initial dialog screen
|
|
61
|
+
this.renderDialog();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Generate NPC greeting based on relationship and history
|
|
65
|
+
*/
|
|
66
|
+
generateGreeting(npc) {
|
|
67
|
+
const relationship = npc.playerRelationship;
|
|
68
|
+
const met = npc.dialogHistory.length > 0;
|
|
69
|
+
if (!met) {
|
|
70
|
+
const greetings = {
|
|
71
|
+
merchant: `Welcome, traveler! I am ${npc.name}. Looking to trade?`,
|
|
72
|
+
sage: `Ah, a seeker of knowledge. I am ${npc.name}. What wisdom do you seek?`,
|
|
73
|
+
guard: `Halt. I am ${npc.name}, keeper of this area. State your business.`,
|
|
74
|
+
blacksmith: `*looks up from anvil* ${npc.name} here. Need something forged?`,
|
|
75
|
+
traveler: `Well met, fellow wanderer. I'm ${npc.name}. Strange place, isn't it?`,
|
|
76
|
+
quest_giver: `${npc.name} at your service. I might have work for someone like you.`,
|
|
77
|
+
};
|
|
78
|
+
return greetings[npc.role] || `Greetings. I am ${npc.name}.`;
|
|
79
|
+
}
|
|
80
|
+
else if (relationship > 50) {
|
|
81
|
+
return `${npc.name} smiles warmly. "Good to see you again, friend!"`;
|
|
82
|
+
}
|
|
83
|
+
else if (relationship > 0) {
|
|
84
|
+
return `"Ah, you're back," says ${npc.name}. "What can I do for you?"`;
|
|
85
|
+
}
|
|
86
|
+
else if (relationship < -50) {
|
|
87
|
+
return `${npc.name} glares at you. "What do you want now?"`;
|
|
88
|
+
}
|
|
89
|
+
else if (relationship < 0) {
|
|
90
|
+
return `${npc.name} regards you coldly. "Yes?"`;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return `${npc.name} nods in greeting. "How can I help?"`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Handle dialog input
|
|
98
|
+
*/
|
|
99
|
+
async handleInput(input) {
|
|
100
|
+
if (!this.currentDialogNPC)
|
|
101
|
+
return;
|
|
102
|
+
const trimmed = input.trim();
|
|
103
|
+
const lower = trimmed.toLowerCase();
|
|
104
|
+
// Check for exit commands
|
|
105
|
+
if (lower === 'bye' || lower === 'exit' || trimmed === '') {
|
|
106
|
+
this.endDialog();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Check if awaiting quest response
|
|
110
|
+
if (this.awaitingQuestResponse && this.pendingQuest) {
|
|
111
|
+
if (lower === 'yes' || lower === 'y' || lower === 'accept') {
|
|
112
|
+
this.acceptQuest();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
else if (lower === 'no' || lower === 'n' || lower === 'decline') {
|
|
116
|
+
this.declineQuest();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Check for quick options
|
|
121
|
+
if (trimmed === '1') {
|
|
122
|
+
this.handleQuickOption('quests');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
else if (trimmed === '2') {
|
|
126
|
+
this.handleQuickOption('trade');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
else if (trimmed === '3') {
|
|
130
|
+
this.handleQuickOption('lore');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Add player message to history
|
|
134
|
+
this.dialogHistory.push({ role: 'player', text: trimmed });
|
|
135
|
+
this.renderDialog();
|
|
136
|
+
// Get AI response
|
|
137
|
+
const aiClient = getAIClient();
|
|
138
|
+
const npc = this.currentDialogNPC;
|
|
139
|
+
// Build context for AI
|
|
140
|
+
const context = this.buildContext(npc, trimmed);
|
|
141
|
+
// Show thinking indicator
|
|
142
|
+
this.ui.renderDialogScreen(npc, this.dialogHistory, this.getQuickOptions(), true);
|
|
143
|
+
// Get response from AI
|
|
144
|
+
const result = await aiClient.talkToNPC(npc.role, context);
|
|
145
|
+
if (result.success && result.data) {
|
|
146
|
+
this.consecutiveAIFailures = 0;
|
|
147
|
+
this.dialogHistory.push({ role: 'npc', text: result.data });
|
|
148
|
+
this.npcManager.recordInteraction(npc.id, trimmed, result.data);
|
|
149
|
+
this.updateRelationship(npc, trimmed, result.data);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.consecutiveAIFailures++;
|
|
153
|
+
console.error('[Dialog] AI failed:', result.error);
|
|
154
|
+
Sentry.captureMessage('Dialog AI failed, using fallback response', {
|
|
155
|
+
level: 'warning',
|
|
156
|
+
tags: { operation: 'npc_dialog', fallback: true },
|
|
157
|
+
extra: {
|
|
158
|
+
npcId: npc.id,
|
|
159
|
+
npcRole: npc.role,
|
|
160
|
+
consecutiveFailures: this.consecutiveAIFailures,
|
|
161
|
+
error: result.error,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
const fallback = this.getFallbackResponse(this.currentDialogNPC);
|
|
165
|
+
this.dialogHistory.push({ role: 'npc', text: fallback });
|
|
166
|
+
if (result.retriesExhausted && this.consecutiveAIFailures >= this.MAX_CONSECUTIVE_FAILURES) {
|
|
167
|
+
// Let caller handle prompting for save load
|
|
168
|
+
this.addLog('⚠ Multiple AI failures detected. Consider loading a save.');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
this.renderDialog();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Build context for AI dialog
|
|
175
|
+
*/
|
|
176
|
+
buildContext(npc, playerMessage) {
|
|
177
|
+
const recentHistory = this.dialogHistory.slice(-6);
|
|
178
|
+
const historyText = recentHistory
|
|
179
|
+
.map(h => `${h.role === 'player' ? 'Player' : npc.name}: ${h.text}`)
|
|
180
|
+
.join('\n');
|
|
181
|
+
return `${historyText}\nPlayer: ${playerMessage}`;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Update relationship based on dialog
|
|
185
|
+
*/
|
|
186
|
+
updateRelationship(npc, playerMessage, npcResponse) {
|
|
187
|
+
const lower = playerMessage.toLowerCase();
|
|
188
|
+
if (lower.includes('thank') || lower.includes('please') || lower.includes('help')) {
|
|
189
|
+
this.npcManager.updateRelationship(npc.id, 1);
|
|
190
|
+
}
|
|
191
|
+
if (lower.includes('stupid') || lower.includes('idiot') || lower.includes('hate')) {
|
|
192
|
+
this.npcManager.updateRelationship(npc.id, -5);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Handle quick dialog options
|
|
197
|
+
*/
|
|
198
|
+
async handleQuickOption(option) {
|
|
199
|
+
if (!this.currentDialogNPC)
|
|
200
|
+
return;
|
|
201
|
+
const npc = this.currentDialogNPC;
|
|
202
|
+
let playerText = '';
|
|
203
|
+
let npcResponse = '';
|
|
204
|
+
switch (option) {
|
|
205
|
+
case 'quests':
|
|
206
|
+
playerText = 'Do you have any tasks for me?';
|
|
207
|
+
const availableQuest = this.getQuestFromNPC(npc);
|
|
208
|
+
if (availableQuest) {
|
|
209
|
+
npcResponse = `Yes, I have a task. ${availableQuest.description} Will you accept? (Type 'yes' or 'no')`;
|
|
210
|
+
this.pendingQuest = availableQuest;
|
|
211
|
+
this.awaitingQuestResponse = true;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
npcResponse = "I don't have anything for you right now. Check back later.";
|
|
215
|
+
}
|
|
216
|
+
break;
|
|
217
|
+
case 'trade':
|
|
218
|
+
playerText = 'What do you have for trade?';
|
|
219
|
+
if (npc.role === 'merchant' || npc.role === 'blacksmith') {
|
|
220
|
+
npcResponse = "Take a look at my wares. (Trade system coming soon)";
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
npcResponse = "I'm not a merchant, but perhaps someone else can help you.";
|
|
224
|
+
}
|
|
225
|
+
break;
|
|
226
|
+
case 'lore':
|
|
227
|
+
playerText = 'Tell me about this place.';
|
|
228
|
+
npcResponse = this.getLocationLore();
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
this.dialogHistory.push({ role: 'player', text: playerText });
|
|
232
|
+
this.dialogHistory.push({ role: 'npc', text: npcResponse });
|
|
233
|
+
this.npcManager.recordInteraction(npc.id, playerText, npcResponse);
|
|
234
|
+
this.renderDialog();
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Accept a pending quest
|
|
238
|
+
*/
|
|
239
|
+
acceptQuest() {
|
|
240
|
+
if (!this.pendingQuest || !this.currentDialogNPC)
|
|
241
|
+
return;
|
|
242
|
+
const npc = this.currentDialogNPC;
|
|
243
|
+
const quest = this.pendingQuest;
|
|
244
|
+
const success = this.questManager.acceptQuest(quest);
|
|
245
|
+
if (success) {
|
|
246
|
+
if (!npc.givenQuests)
|
|
247
|
+
npc.givenQuests = [];
|
|
248
|
+
npc.givenQuests.push(quest.id);
|
|
249
|
+
this.npcManager.updateRelationship(npc.id, 5);
|
|
250
|
+
const responses = [
|
|
251
|
+
`"Excellent! I knew I could count on you," says ${npc.name}.`,
|
|
252
|
+
`${npc.name} nods approvingly. "Good luck out there."`,
|
|
253
|
+
`"May the gods watch over you," ${npc.name} says with a smile.`,
|
|
254
|
+
];
|
|
255
|
+
const response = responses[Math.floor(Math.random() * responses.length)];
|
|
256
|
+
this.dialogHistory.push({ role: 'player', text: 'I accept.' });
|
|
257
|
+
this.dialogHistory.push({ role: 'npc', text: response });
|
|
258
|
+
this.addLog(`✓ Quest accepted: ${quest.name}`);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
this.dialogHistory.push({ role: 'npc', text: `"It seems you already have too many tasks. Come back when you're ready."` });
|
|
262
|
+
}
|
|
263
|
+
this.pendingQuest = null;
|
|
264
|
+
this.awaitingQuestResponse = false;
|
|
265
|
+
this.renderDialog();
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Decline a pending quest
|
|
269
|
+
*/
|
|
270
|
+
declineQuest() {
|
|
271
|
+
if (!this.pendingQuest || !this.currentDialogNPC)
|
|
272
|
+
return;
|
|
273
|
+
const npc = this.currentDialogNPC;
|
|
274
|
+
this.npcManager.updateRelationship(npc.id, -2);
|
|
275
|
+
const responses = [
|
|
276
|
+
`${npc.name} looks disappointed. "I understand. Perhaps another time."`,
|
|
277
|
+
`"Very well," ${npc.name} sighs. "The offer stands if you change your mind."`,
|
|
278
|
+
`${npc.name} shrugs. "Your choice. Others may be willing."`,
|
|
279
|
+
];
|
|
280
|
+
const response = responses[Math.floor(Math.random() * responses.length)];
|
|
281
|
+
this.dialogHistory.push({ role: 'player', text: 'I must decline.' });
|
|
282
|
+
this.dialogHistory.push({ role: 'npc', text: response });
|
|
283
|
+
this.pendingQuest = null;
|
|
284
|
+
this.awaitingQuestResponse = false;
|
|
285
|
+
this.renderDialog();
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get quest from NPC if available
|
|
289
|
+
*/
|
|
290
|
+
getQuestFromNPC(npc) {
|
|
291
|
+
const baseQuest = {
|
|
292
|
+
giverNPCId: npc.id,
|
|
293
|
+
giverNPCName: npc.name,
|
|
294
|
+
giveDialog: `Will you help me with this task?`,
|
|
295
|
+
progressDialog: `How is the task going?`,
|
|
296
|
+
completeDialog: `Excellent work! Here is your reward.`,
|
|
297
|
+
failDialog: `A shame you couldn't complete it.`,
|
|
298
|
+
difficulty: 'medium',
|
|
299
|
+
repeatable: false,
|
|
300
|
+
timesCompleted: 0,
|
|
301
|
+
};
|
|
302
|
+
const questTemplates = {
|
|
303
|
+
guard: () => ({
|
|
304
|
+
...baseQuest,
|
|
305
|
+
id: `quest_${Date.now()}`,
|
|
306
|
+
name: 'Clear the Threat',
|
|
307
|
+
description: 'Eliminate the monsters lurking in the nearby rooms.',
|
|
308
|
+
type: 'kill',
|
|
309
|
+
status: 'available',
|
|
310
|
+
objectives: [{
|
|
311
|
+
id: 'kill_monsters',
|
|
312
|
+
type: 'kill',
|
|
313
|
+
target: 'enemy_*',
|
|
314
|
+
targetName: 'enemies',
|
|
315
|
+
description: 'Defeat 3 enemies',
|
|
316
|
+
required: 3,
|
|
317
|
+
current: 0,
|
|
318
|
+
isComplete: false,
|
|
319
|
+
}],
|
|
320
|
+
rewards: [
|
|
321
|
+
{ type: 'exp', value: 50 },
|
|
322
|
+
{ type: 'gold', value: 25 },
|
|
323
|
+
],
|
|
324
|
+
timeLimit: 30 * 60,
|
|
325
|
+
}),
|
|
326
|
+
sage: () => ({
|
|
327
|
+
...baseQuest,
|
|
328
|
+
id: `quest_${Date.now()}`,
|
|
329
|
+
name: 'Seek Knowledge',
|
|
330
|
+
description: 'Explore the dungeon and discover hidden secrets.',
|
|
331
|
+
type: 'explore',
|
|
332
|
+
status: 'available',
|
|
333
|
+
objectives: [{
|
|
334
|
+
id: 'explore_rooms',
|
|
335
|
+
type: 'reach',
|
|
336
|
+
target: 'room_*',
|
|
337
|
+
targetName: 'rooms',
|
|
338
|
+
description: 'Explore 5 rooms',
|
|
339
|
+
required: 5,
|
|
340
|
+
current: 0,
|
|
341
|
+
isComplete: false,
|
|
342
|
+
}],
|
|
343
|
+
rewards: [
|
|
344
|
+
{ type: 'exp', value: 75 },
|
|
345
|
+
{ type: 'gold', value: 10 },
|
|
346
|
+
],
|
|
347
|
+
}),
|
|
348
|
+
merchant: () => ({
|
|
349
|
+
...baseQuest,
|
|
350
|
+
id: `quest_${Date.now()}`,
|
|
351
|
+
name: 'Trade Route',
|
|
352
|
+
description: 'Help me retrieve some valuable goods.',
|
|
353
|
+
type: 'collect',
|
|
354
|
+
status: 'available',
|
|
355
|
+
objectives: [{
|
|
356
|
+
id: 'collect_items',
|
|
357
|
+
type: 'collect',
|
|
358
|
+
target: 'treasure_*',
|
|
359
|
+
targetName: 'treasure',
|
|
360
|
+
description: 'Find treasure',
|
|
361
|
+
required: 1,
|
|
362
|
+
current: 0,
|
|
363
|
+
isComplete: false,
|
|
364
|
+
}],
|
|
365
|
+
rewards: [
|
|
366
|
+
{ type: 'exp', value: 30 },
|
|
367
|
+
{ type: 'gold', value: 50 },
|
|
368
|
+
],
|
|
369
|
+
}),
|
|
370
|
+
};
|
|
371
|
+
const template = questTemplates[npc.role];
|
|
372
|
+
return template ? template() : null;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get location lore
|
|
376
|
+
*/
|
|
377
|
+
getLocationLore() {
|
|
378
|
+
const loreOptions = [
|
|
379
|
+
"This dungeon has stood for centuries. Many have entered, few have left.",
|
|
380
|
+
"They say a great evil lurks in the depths below. Be careful if you venture there.",
|
|
381
|
+
"The walls whisper secrets to those who listen. Ancient magic permeates this place.",
|
|
382
|
+
"Long ago, this was a temple. Now it's home to creatures of darkness.",
|
|
383
|
+
"I've heard rumors of powerful artifacts hidden in the boss rooms.",
|
|
384
|
+
];
|
|
385
|
+
return loreOptions[Math.floor(Math.random() * loreOptions.length)];
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Get fallback response when AI fails
|
|
389
|
+
*/
|
|
390
|
+
getFallbackResponse(npc) {
|
|
391
|
+
const fallbacks = [
|
|
392
|
+
`${npc.name} seems distracted. "Hmm? Sorry, I was thinking about something else."`,
|
|
393
|
+
`"Interesting..." ${npc.name} strokes their chin thoughtfully.`,
|
|
394
|
+
`${npc.name} nods slowly. "I see what you mean."`,
|
|
395
|
+
`"That's... quite something," ${npc.name} responds carefully.`,
|
|
396
|
+
];
|
|
397
|
+
return fallbacks[Math.floor(Math.random() * fallbacks.length)];
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Get quick dialog options
|
|
401
|
+
*/
|
|
402
|
+
getQuickOptions() {
|
|
403
|
+
return [
|
|
404
|
+
{ key: '1', text: 'Ask about quests', action: 'quests' },
|
|
405
|
+
{ key: '2', text: 'Trade', action: 'trade' },
|
|
406
|
+
{ key: '3', text: 'Ask about this place', action: 'lore' },
|
|
407
|
+
];
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Render dialog screen
|
|
411
|
+
*/
|
|
412
|
+
renderDialog() {
|
|
413
|
+
if (!this.currentDialogNPC)
|
|
414
|
+
return;
|
|
415
|
+
this.ui.renderDialogScreen(this.currentDialogNPC, this.dialogHistory, this.getQuickOptions(), false);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* End dialog with NPC
|
|
419
|
+
*/
|
|
420
|
+
endDialog() {
|
|
421
|
+
if (this.currentDialogNPC) {
|
|
422
|
+
const farewell = this.generateFarewell(this.currentDialogNPC);
|
|
423
|
+
this.addLog(farewell);
|
|
424
|
+
}
|
|
425
|
+
this.currentDialogNPC = null;
|
|
426
|
+
this.dialogHistory = [];
|
|
427
|
+
this.pendingQuest = null;
|
|
428
|
+
if (!this.router.back()) {
|
|
429
|
+
this.router.navigate({ type: 'explore' });
|
|
430
|
+
}
|
|
431
|
+
this.idleGameManager.resumeDungeon();
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Generate farewell message
|
|
435
|
+
*/
|
|
436
|
+
generateFarewell(npc) {
|
|
437
|
+
const relationship = npc.playerRelationship;
|
|
438
|
+
if (relationship > 30) {
|
|
439
|
+
return `${npc.name}: "Take care, friend. Come back anytime!"`;
|
|
440
|
+
}
|
|
441
|
+
else if (relationship < -30) {
|
|
442
|
+
return `${npc.name} turns away without a word.`;
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
return `${npc.name}: "Farewell, traveler."`;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=DialogHandler.js.map
|
|
450
|
+
//# debugId=9702a696-0205-5406-84e6-7bea9b63df9d
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DialogHandler.js","sources":["handlers/DialogHandler.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * DialogHandler - Handles NPC dialog interactions\r\n *\r\n * Extracted from main.ts to reduce file size.\r\n * Manages NPC conversations, AI responses, quests from NPCs.\r\n */\r\n\r\nimport { getAIClient } from '../ai/PlayKitClient.js';\r\nimport { Sentry } from '../instrument.js';\r\nimport type { HandlerDeps } from './types.js';\r\nimport type { ExtendedNPC } from '../npc/types.js';\r\nimport type { Quest } from '../quest/types.js';\r\nimport type { GameUI } from '../tui/GameUIAdapter.js';\r\nimport type { NPCManager } from '../npc/NPCManager.js';\r\nimport type { QuestManager } from '../quest/QuestManager.js';\r\nimport type { Router } from '../app/Router.js';\r\nimport type { IdleGameManager } from '../core/IdleGameManager.js';\r\n\r\n/**\r\n * Dialog history entry\r\n */\r\ninterface DialogEntry {\r\n role: 'player' | 'npc';\r\n text: string;\r\n}\r\n\r\n/**\r\n * Handles NPC dialog interactions\r\n */\r\nexport class DialogHandler {\r\n private ui: GameUI;\r\n private npcManager: NPCManager;\r\n private questManager: QuestManager;\r\n private router: Router;\r\n private idleGameManager: IdleGameManager;\r\n private addLog: (message: string) => void;\r\n\r\n // Dialog state\r\n private currentDialogNPC: ExtendedNPC | null = null;\r\n private dialogHistory: DialogEntry[] = [];\r\n private pendingQuest: Quest | null = null;\r\n private awaitingQuestResponse = false;\r\n\r\n // AI error handling\r\n private consecutiveAIFailures = 0;\r\n private readonly MAX_CONSECUTIVE_FAILURES = 3;\r\n\r\n constructor(deps: HandlerDeps) {\r\n this.ui = deps.ui;\r\n this.npcManager = deps.npcManager;\r\n this.questManager = deps.questManager;\r\n this.router = deps.router;\r\n this.idleGameManager = deps.idleGameManager;\r\n this.addLog = deps.addLog;\r\n }\r\n\r\n /**\r\n * Get current dialog NPC\r\n */\r\n getCurrentNPC(): ExtendedNPC | null {\r\n return this.currentDialogNPC;\r\n }\r\n\r\n /**\r\n * Start dialog with an NPC\r\n */\r\n async startDialog(npc: ExtendedNPC): Promise<void> {\r\n this.currentDialogNPC = npc;\r\n this.dialogHistory = [];\r\n\r\n // Get greeting based on relationship\r\n const greeting = this.generateGreeting(npc);\r\n this.dialogHistory.push({ role: 'npc', text: greeting });\r\n\r\n // Mark player as met\r\n npc.metPlayer = true;\r\n\r\n // Switch to dialog mode via router\r\n this.router.navigate({ type: 'dialog', npcId: npc.id });\r\n // Pause dungeon if in dungeon\r\n this.idleGameManager.pauseDungeon();\r\n\r\n // Set up dialog input handler\r\n this.ui.onDialogInputHandler((input) => this.handleInput(input));\r\n\r\n // Render initial dialog screen\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Generate NPC greeting based on relationship and history\r\n */\r\n private generateGreeting(npc: ExtendedNPC): string {\r\n const relationship = npc.playerRelationship;\r\n const met = npc.dialogHistory.length > 0;\r\n\r\n if (!met) {\r\n const greetings: Record<string, string> = {\r\n merchant: `Welcome, traveler! I am ${npc.name}. Looking to trade?`,\r\n sage: `Ah, a seeker of knowledge. I am ${npc.name}. What wisdom do you seek?`,\r\n guard: `Halt. I am ${npc.name}, keeper of this area. State your business.`,\r\n blacksmith: `*looks up from anvil* ${npc.name} here. Need something forged?`,\r\n traveler: `Well met, fellow wanderer. I'm ${npc.name}. Strange place, isn't it?`,\r\n quest_giver: `${npc.name} at your service. I might have work for someone like you.`,\r\n };\r\n return greetings[npc.role] || `Greetings. I am ${npc.name}.`;\r\n } else if (relationship > 50) {\r\n return `${npc.name} smiles warmly. \"Good to see you again, friend!\"`;\r\n } else if (relationship > 0) {\r\n return `\"Ah, you're back,\" says ${npc.name}. \"What can I do for you?\"`;\r\n } else if (relationship < -50) {\r\n return `${npc.name} glares at you. \"What do you want now?\"`;\r\n } else if (relationship < 0) {\r\n return `${npc.name} regards you coldly. \"Yes?\"`;\r\n } else {\r\n return `${npc.name} nods in greeting. \"How can I help?\"`;\r\n }\r\n }\r\n\r\n /**\r\n * Handle dialog input\r\n */\r\n async handleInput(input: string): Promise<void> {\r\n if (!this.currentDialogNPC) return;\r\n\r\n const trimmed = input.trim();\r\n const lower = trimmed.toLowerCase();\r\n\r\n // Check for exit commands\r\n if (lower === 'bye' || lower === 'exit' || trimmed === '') {\r\n this.endDialog();\r\n return;\r\n }\r\n\r\n // Check if awaiting quest response\r\n if (this.awaitingQuestResponse && this.pendingQuest) {\r\n if (lower === 'yes' || lower === 'y' || lower === 'accept') {\r\n this.acceptQuest();\r\n return;\r\n } else if (lower === 'no' || lower === 'n' || lower === 'decline') {\r\n this.declineQuest();\r\n return;\r\n }\r\n }\r\n\r\n // Check for quick options\r\n if (trimmed === '1') {\r\n this.handleQuickOption('quests');\r\n return;\r\n } else if (trimmed === '2') {\r\n this.handleQuickOption('trade');\r\n return;\r\n } else if (trimmed === '3') {\r\n this.handleQuickOption('lore');\r\n return;\r\n }\r\n\r\n // Add player message to history\r\n this.dialogHistory.push({ role: 'player', text: trimmed });\r\n this.renderDialog();\r\n\r\n // Get AI response\r\n const aiClient = getAIClient();\r\n const npc = this.currentDialogNPC;\r\n\r\n // Build context for AI\r\n const context = this.buildContext(npc, trimmed);\r\n\r\n // Show thinking indicator\r\n this.ui.renderDialogScreen(npc, this.dialogHistory, this.getQuickOptions(), true);\r\n\r\n // Get response from AI\r\n const result = await aiClient.talkToNPC(\r\n npc.role as import('../core/types.js').NPCType,\r\n context\r\n );\r\n\r\n if (result.success && result.data) {\r\n this.consecutiveAIFailures = 0;\r\n\r\n this.dialogHistory.push({ role: 'npc', text: result.data });\r\n this.npcManager.recordInteraction(npc.id, trimmed, result.data);\r\n this.updateRelationship(npc, trimmed, result.data);\r\n } else {\r\n this.consecutiveAIFailures++;\r\n\r\n console.error('[Dialog] AI failed:', result.error);\r\n Sentry.captureMessage('Dialog AI failed, using fallback response', {\r\n level: 'warning',\r\n tags: { operation: 'npc_dialog', fallback: true },\r\n extra: {\r\n npcId: npc.id,\r\n npcRole: npc.role,\r\n consecutiveFailures: this.consecutiveAIFailures,\r\n error: result.error,\r\n },\r\n });\r\n\r\n const fallback = this.getFallbackResponse(this.currentDialogNPC);\r\n this.dialogHistory.push({ role: 'npc', text: fallback });\r\n\r\n if (result.retriesExhausted && this.consecutiveAIFailures >= this.MAX_CONSECUTIVE_FAILURES) {\r\n // Let caller handle prompting for save load\r\n this.addLog('⚠ Multiple AI failures detected. Consider loading a save.');\r\n }\r\n }\r\n\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Build context for AI dialog\r\n */\r\n private buildContext(npc: ExtendedNPC, playerMessage: string): string {\r\n const recentHistory = this.dialogHistory.slice(-6);\r\n const historyText = recentHistory\r\n .map(h => `${h.role === 'player' ? 'Player' : npc.name}: ${h.text}`)\r\n .join('\\n');\r\n\r\n return `${historyText}\\nPlayer: ${playerMessage}`;\r\n }\r\n\r\n /**\r\n * Update relationship based on dialog\r\n */\r\n private updateRelationship(npc: ExtendedNPC, playerMessage: string, npcResponse: string): void {\r\n const lower = playerMessage.toLowerCase();\r\n\r\n if (lower.includes('thank') || lower.includes('please') || lower.includes('help')) {\r\n this.npcManager.updateRelationship(npc.id, 1);\r\n }\r\n\r\n if (lower.includes('stupid') || lower.includes('idiot') || lower.includes('hate')) {\r\n this.npcManager.updateRelationship(npc.id, -5);\r\n }\r\n }\r\n\r\n /**\r\n * Handle quick dialog options\r\n */\r\n async handleQuickOption(option: string): Promise<void> {\r\n if (!this.currentDialogNPC) return;\r\n\r\n const npc = this.currentDialogNPC;\r\n let playerText = '';\r\n let npcResponse = '';\r\n\r\n switch (option) {\r\n case 'quests':\r\n playerText = 'Do you have any tasks for me?';\r\n const availableQuest = this.getQuestFromNPC(npc);\r\n if (availableQuest) {\r\n npcResponse = `Yes, I have a task. ${availableQuest.description} Will you accept? (Type 'yes' or 'no')`;\r\n this.pendingQuest = availableQuest;\r\n this.awaitingQuestResponse = true;\r\n } else {\r\n npcResponse = \"I don't have anything for you right now. Check back later.\";\r\n }\r\n break;\r\n\r\n case 'trade':\r\n playerText = 'What do you have for trade?';\r\n if (npc.role === 'merchant' || npc.role === 'blacksmith') {\r\n npcResponse = \"Take a look at my wares. (Trade system coming soon)\";\r\n } else {\r\n npcResponse = \"I'm not a merchant, but perhaps someone else can help you.\";\r\n }\r\n break;\r\n\r\n case 'lore':\r\n playerText = 'Tell me about this place.';\r\n npcResponse = this.getLocationLore();\r\n break;\r\n }\r\n\r\n this.dialogHistory.push({ role: 'player', text: playerText });\r\n this.dialogHistory.push({ role: 'npc', text: npcResponse });\r\n this.npcManager.recordInteraction(npc.id, playerText, npcResponse);\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Accept a pending quest\r\n */\r\n private acceptQuest(): void {\r\n if (!this.pendingQuest || !this.currentDialogNPC) return;\r\n\r\n const npc = this.currentDialogNPC;\r\n const quest = this.pendingQuest;\r\n\r\n const success = this.questManager.acceptQuest(quest);\r\n\r\n if (success) {\r\n if (!npc.givenQuests) npc.givenQuests = [];\r\n npc.givenQuests.push(quest.id);\r\n this.npcManager.updateRelationship(npc.id, 5);\r\n\r\n const responses = [\r\n `\"Excellent! I knew I could count on you,\" says ${npc.name}.`,\r\n `${npc.name} nods approvingly. \"Good luck out there.\"`,\r\n `\"May the gods watch over you,\" ${npc.name} says with a smile.`,\r\n ];\r\n const response = responses[Math.floor(Math.random() * responses.length)];\r\n\r\n this.dialogHistory.push({ role: 'player', text: 'I accept.' });\r\n this.dialogHistory.push({ role: 'npc', text: response });\r\n\r\n this.addLog(`✓ Quest accepted: ${quest.name}`);\r\n } else {\r\n this.dialogHistory.push({ role: 'npc', text: `\"It seems you already have too many tasks. Come back when you're ready.\"` });\r\n }\r\n\r\n this.pendingQuest = null;\r\n this.awaitingQuestResponse = false;\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Decline a pending quest\r\n */\r\n private declineQuest(): void {\r\n if (!this.pendingQuest || !this.currentDialogNPC) return;\r\n\r\n const npc = this.currentDialogNPC;\r\n this.npcManager.updateRelationship(npc.id, -2);\r\n\r\n const responses = [\r\n `${npc.name} looks disappointed. \"I understand. Perhaps another time.\"`,\r\n `\"Very well,\" ${npc.name} sighs. \"The offer stands if you change your mind.\"`,\r\n `${npc.name} shrugs. \"Your choice. Others may be willing.\"`,\r\n ];\r\n const response = responses[Math.floor(Math.random() * responses.length)];\r\n\r\n this.dialogHistory.push({ role: 'player', text: 'I must decline.' });\r\n this.dialogHistory.push({ role: 'npc', text: response });\r\n\r\n this.pendingQuest = null;\r\n this.awaitingQuestResponse = false;\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Get quest from NPC if available\r\n */\r\n private getQuestFromNPC(npc: ExtendedNPC): Quest | null {\r\n const baseQuest = {\r\n giverNPCId: npc.id,\r\n giverNPCName: npc.name,\r\n giveDialog: `Will you help me with this task?`,\r\n progressDialog: `How is the task going?`,\r\n completeDialog: `Excellent work! Here is your reward.`,\r\n failDialog: `A shame you couldn't complete it.`,\r\n difficulty: 'medium' as const,\r\n repeatable: false,\r\n timesCompleted: 0,\r\n };\r\n\r\n const questTemplates: Record<string, () => Quest> = {\r\n guard: () => ({\r\n ...baseQuest,\r\n id: `quest_${Date.now()}`,\r\n name: 'Clear the Threat',\r\n description: 'Eliminate the monsters lurking in the nearby rooms.',\r\n type: 'kill',\r\n status: 'available',\r\n objectives: [{\r\n id: 'kill_monsters',\r\n type: 'kill',\r\n target: 'enemy_*',\r\n targetName: 'enemies',\r\n description: 'Defeat 3 enemies',\r\n required: 3,\r\n current: 0,\r\n isComplete: false,\r\n }],\r\n rewards: [\r\n { type: 'exp', value: 50 },\r\n { type: 'gold', value: 25 },\r\n ],\r\n timeLimit: 30 * 60,\r\n }),\r\n sage: () => ({\r\n ...baseQuest,\r\n id: `quest_${Date.now()}`,\r\n name: 'Seek Knowledge',\r\n description: 'Explore the dungeon and discover hidden secrets.',\r\n type: 'explore',\r\n status: 'available',\r\n objectives: [{\r\n id: 'explore_rooms',\r\n type: 'reach',\r\n target: 'room_*',\r\n targetName: 'rooms',\r\n description: 'Explore 5 rooms',\r\n required: 5,\r\n current: 0,\r\n isComplete: false,\r\n }],\r\n rewards: [\r\n { type: 'exp', value: 75 },\r\n { type: 'gold', value: 10 },\r\n ],\r\n }),\r\n merchant: () => ({\r\n ...baseQuest,\r\n id: `quest_${Date.now()}`,\r\n name: 'Trade Route',\r\n description: 'Help me retrieve some valuable goods.',\r\n type: 'collect',\r\n status: 'available',\r\n objectives: [{\r\n id: 'collect_items',\r\n type: 'collect',\r\n target: 'treasure_*',\r\n targetName: 'treasure',\r\n description: 'Find treasure',\r\n required: 1,\r\n current: 0,\r\n isComplete: false,\r\n }],\r\n rewards: [\r\n { type: 'exp', value: 30 },\r\n { type: 'gold', value: 50 },\r\n ],\r\n }),\r\n };\r\n\r\n const template = questTemplates[npc.role];\r\n return template ? template() : null;\r\n }\r\n\r\n /**\r\n * Get location lore\r\n */\r\n private getLocationLore(): string {\r\n const loreOptions = [\r\n \"This dungeon has stood for centuries. Many have entered, few have left.\",\r\n \"They say a great evil lurks in the depths below. Be careful if you venture there.\",\r\n \"The walls whisper secrets to those who listen. Ancient magic permeates this place.\",\r\n \"Long ago, this was a temple. Now it's home to creatures of darkness.\",\r\n \"I've heard rumors of powerful artifacts hidden in the boss rooms.\",\r\n ];\r\n return loreOptions[Math.floor(Math.random() * loreOptions.length)];\r\n }\r\n\r\n /**\r\n * Get fallback response when AI fails\r\n */\r\n private getFallbackResponse(npc: ExtendedNPC): string {\r\n const fallbacks = [\r\n `${npc.name} seems distracted. \"Hmm? Sorry, I was thinking about something else.\"`,\r\n `\"Interesting...\" ${npc.name} strokes their chin thoughtfully.`,\r\n `${npc.name} nods slowly. \"I see what you mean.\"`,\r\n `\"That's... quite something,\" ${npc.name} responds carefully.`,\r\n ];\r\n return fallbacks[Math.floor(Math.random() * fallbacks.length)];\r\n }\r\n\r\n /**\r\n * Get quick dialog options\r\n */\r\n getQuickOptions(): Array<{ key: string; text: string; action: string }> {\r\n return [\r\n { key: '1', text: 'Ask about quests', action: 'quests' },\r\n { key: '2', text: 'Trade', action: 'trade' },\r\n { key: '3', text: 'Ask about this place', action: 'lore' },\r\n ];\r\n }\r\n\r\n /**\r\n * Render dialog screen\r\n */\r\n renderDialog(): void {\r\n if (!this.currentDialogNPC) return;\r\n this.ui.renderDialogScreen(\r\n this.currentDialogNPC,\r\n this.dialogHistory,\r\n this.getQuickOptions(),\r\n false\r\n );\r\n }\r\n\r\n /**\r\n * End dialog with NPC\r\n */\r\n endDialog(): void {\r\n if (this.currentDialogNPC) {\r\n const farewell = this.generateFarewell(this.currentDialogNPC);\r\n this.addLog(farewell);\r\n }\r\n\r\n this.currentDialogNPC = null;\r\n this.dialogHistory = [];\r\n this.pendingQuest = null;\r\n\r\n if (!this.router.back()) {\r\n this.router.navigate({ type: 'explore' });\r\n }\r\n this.idleGameManager.resumeDungeon();\r\n }\r\n\r\n /**\r\n * Generate farewell message\r\n */\r\n private generateFarewell(npc: ExtendedNPC): string {\r\n const relationship = npc.playerRelationship;\r\n if (relationship > 30) {\r\n return `${npc.name}: \"Take care, friend. Come back anytime!\"`;\r\n } else if (relationship < -30) {\r\n return `${npc.name} turns away without a word.`;\r\n } else {\r\n return `${npc.name}: \"Farewell, traveler.\"`;\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"9702a696-0205-5406-84e6-7bea9b63df9d"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveLoadHandler - Handles save/load functionality
|
|
3
|
+
*
|
|
4
|
+
* Extracted from main.ts to reduce file size.
|
|
5
|
+
* Manages game saving, loading, and slot management.
|
|
6
|
+
*/
|
|
7
|
+
import type { IdleGameManager } from '../core/IdleGameManager.js';
|
|
8
|
+
import type { NPCManager } from '../npc/NPCManager.js';
|
|
9
|
+
import type { QuestManager } from '../quest/QuestManager.js';
|
|
10
|
+
/**
|
|
11
|
+
* Handles save/load functionality
|
|
12
|
+
*/
|
|
13
|
+
export declare class SaveLoadHandler {
|
|
14
|
+
private idleGameManager;
|
|
15
|
+
private npcManager;
|
|
16
|
+
private questManager;
|
|
17
|
+
private addLog;
|
|
18
|
+
private pendingSaveData;
|
|
19
|
+
private _saveMode;
|
|
20
|
+
private _loadMode;
|
|
21
|
+
constructor(idleGameManager: IdleGameManager, npcManager: NPCManager, questManager: QuestManager, addLog: (message: string) => void);
|
|
22
|
+
/**
|
|
23
|
+
* Check if in save mode
|
|
24
|
+
*/
|
|
25
|
+
get saveMode(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Check if in load mode
|
|
28
|
+
*/
|
|
29
|
+
get loadMode(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Cancel save mode
|
|
32
|
+
*/
|
|
33
|
+
cancelSave(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Cancel load mode
|
|
36
|
+
*/
|
|
37
|
+
cancelLoad(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Handle save command - shows save slots
|
|
40
|
+
*/
|
|
41
|
+
handleSaveCommand(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Complete save to slot
|
|
44
|
+
*/
|
|
45
|
+
completeSave(slot: number): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Handle load command - shows available saves
|
|
48
|
+
*/
|
|
49
|
+
handleLoadCommand(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Complete load from slot
|
|
52
|
+
*/
|
|
53
|
+
completeLoad(slot: number): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Handle numeric input when in save/load mode
|
|
56
|
+
* @returns true if handled, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
handleNumericInput(num: number): boolean;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=SaveLoadHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveLoadHandler.d.ts","sourceRoot":"/","sources":["handlers/SaveLoadHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAc7D;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAA4B;IAG1C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAGxB,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAQnC;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgDxC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBxC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C;;;OAGG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAqBzC"}
|