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
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sources":["main.ts"],"sourceRoot":"/","sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * IDLERPG.TERMINAL - Main Entry Point\r\n * An AI-native game that lives in your terminal.\r\n */\r\n\r\n\r\nimport { getIdleGameManager, type IdleGameManager, type IdleGamePhase, type IdleGameState } from './core/IdleGameManager.js';\r\nimport { adaptIdleGameStateToGameState, getConnectedRoomsForUI } from './core/StateAdapter.js';\r\nimport { getRouter, type RouteType } from './app/Router.js';\r\nimport { getEventBus } from './app/EventBus.js';\r\nimport { getCommandRegistry, type CommandContext } from './commands/index.js';\r\nimport { setLanguage, getStrings } from './i18n/index.js';\r\nimport { initiateLogin, completeLogin, generateQRCode, getAIClient, tryRestoreAuth, setNickname, getNickname, logout, type AuthCallbacks, type AIOperationResult, type LoginInfo } from './ai/PlayKitClient.js';\r\nimport { getGameUI, getScreen, getInput, ANSI, type KeyEvent } from './tui/index.js';\r\nimport { getNPCManager } from './npc/NPCManager.js';\r\nimport { getQuestManager } from './quest/QuestManager.js';\r\nimport { getNPCGenerator } from './npc/NPCGenerator.js';\r\nimport { saveGame, loadGame, listSaveSlots, autoSave, formatPlayTime, formatTimestamp } from './core/SaveManager.js';\r\nimport { getAffixRegistry } from './affix/AffixRegistry.js';\r\nimport { migrateConfigDirectory } from './utils/configMigration.js';\r\nimport { Sentry } from './instrument.js';\r\nimport type { Player, Actor, Team, Dungeon, TownFacility } from './core/types.js';\r\nimport type { ExtendedNPC } from './npc/types.js';\r\nimport type { Quest } from './quest/types.js';\r\nimport type { AffixPlugin } from './affix/types.js';\r\nimport { createActor, playerToActor } from './core/Actor.js';\r\nimport { createTeamWithActor } from './core/Team.js';\r\nimport { NewGameFlowManager } from './core/NewGameFlowManager.js';\r\nimport {\r\n TitleScreenHandler,\r\n DialogHandler,\r\n SaveLoadHandler,\r\n WorkshopHandler,\r\n} from './handlers/index.js';\r\n\r\n// Run config migration early (before any config files are accessed)\r\nmigrateConfigDirectory();\r\n\r\n// Spinner frames for loading animation\r\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\r\n\r\n/**\r\n * Main Application class\r\n */\r\nclass IdleRPGTerminal {\r\n private idleGameManager: IdleGameManager;\r\n private ui = getGameUI();\r\n private screen = getScreen();\r\n private input = getInput();\r\n private npcManager = getNPCManager();\r\n private questManager = getQuestManager();\r\n private router = getRouter();\r\n private bus = getEventBus();\r\n private commandRegistry = getCommandRegistry();\r\n private isRunning = false;\r\n private isInFullScreenMode = false; // For character creation, prologue, etc.\r\n\r\n // Handlers - extracted functionality for better organization\r\n private titleScreenHandler: TitleScreenHandler;\r\n private dialogHandler: DialogHandler;\r\n private saveLoadHandler: SaveLoadHandler;\r\n private workshopHandler: WorkshopHandler;\r\n\r\n constructor() {\r\n this.idleGameManager = getIdleGameManager();\r\n\r\n // Initialize handlers\r\n this.titleScreenHandler = new TitleScreenHandler(\r\n this.screen,\r\n this.input,\r\n () => this.cleanup()\r\n );\r\n\r\n this.dialogHandler = new DialogHandler({\r\n ui: this.ui,\r\n screen: this.screen,\r\n input: this.input,\r\n idleGameManager: this.idleGameManager,\r\n router: this.router,\r\n bus: this.bus,\r\n npcManager: this.npcManager,\r\n questManager: this.questManager,\r\n addLog: (msg) => this.ui.addEventLog(msg),\r\n });\r\n\r\n this.saveLoadHandler = new SaveLoadHandler(\r\n this.idleGameManager,\r\n this.npcManager,\r\n this.questManager,\r\n (msg) => this.ui.addEventLog(msg)\r\n );\r\n\r\n this.workshopHandler = new WorkshopHandler(\r\n this.idleGameManager,\r\n (msg) => this.ui.addEventLog(msg)\r\n );\r\n\r\n this.setupRouterNavigation();\r\n this.setupEventBusSubscriptions();\r\n this.setupCommands();\r\n }\r\n\r\n /**\r\n * Set up command registry with all game commands\r\n */\r\n private setupCommands(): void {\r\n // Create command context\r\n const context: CommandContext = {\r\n gameManager: this.idleGameManager,\r\n router: this.router,\r\n bus: this.bus,\r\n log: (msg) => this.ui.addEventLog(msg),\r\n };\r\n this.commandRegistry.setContext(context);\r\n\r\n // Register navigation commands\r\n this.commandRegistry.registerAll([\r\n {\r\n name: 'map',\r\n aliases: ['m'],\r\n description: 'Show the map panel',\r\n category: 'navigation',\r\n execute: () => {\r\n this.ui.addEventLog('Map is displayed on the left panel.');\r\n },\r\n },\r\n {\r\n name: 'travel',\r\n aliases: ['t'],\r\n description: 'Show available facilities',\r\n category: 'navigation',\r\n execute: () => this.handleTravelCommand(),\r\n isAvailable: (ctx) => ctx.gameManager.getState()?.phase === 'in_town',\r\n },\r\n {\r\n name: 'dungeon',\r\n aliases: ['d'],\r\n description: 'Show available dungeons',\r\n category: 'navigation',\r\n execute: () => this.handleDungeonCommand(),\r\n isAvailable: (ctx) => ctx.gameManager.getState()?.phase === 'in_town',\r\n },\r\n {\r\n name: 'npc',\r\n aliases: ['n'],\r\n description: 'Talk to NPCs',\r\n category: 'navigation',\r\n execute: () => this.handleNPCCommand(),\r\n },\r\n ]);\r\n\r\n // Register system commands\r\n this.commandRegistry.registerAll([\r\n {\r\n name: 'help',\r\n aliases: ['h', '?'],\r\n description: 'Show help',\r\n category: 'system',\r\n execute: () => this.showHelp(),\r\n },\r\n {\r\n name: 'save',\r\n description: 'Save the game',\r\n category: 'system',\r\n execute: () => this.saveLoadHandler.handleSaveCommand(),\r\n },\r\n {\r\n name: 'load',\r\n description: 'Load a saved game',\r\n category: 'system',\r\n execute: () => this.saveLoadHandler.handleLoadCommand(),\r\n },\r\n {\r\n name: 'newgame',\r\n description: 'Start a new game',\r\n category: 'system',\r\n execute: () => this.handleNewGameCommand(),\r\n },\r\n {\r\n name: 'quit',\r\n aliases: ['exit'],\r\n description: 'Exit the game',\r\n category: 'system',\r\n execute: () => { this.isRunning = false; },\r\n },\r\n ]);\r\n }\r\n\r\n /**\r\n * Set up EventBus subscriptions for cross-component communication\r\n */\r\n private setupEventBusSubscriptions(): void {\r\n // Subscribe to UI log events\r\n this.bus.subscribe('ui:log', ({ message }) => {\r\n this.ui.addEventLog(message);\r\n });\r\n }\r\n\r\n /**\r\n * Set up IdleGameManager callbacks with EventBus bridging\r\n */\r\n private setupIdleGameCallbacks(): void {\r\n this.idleGameManager.setCallbacks({\r\n onPhaseChange: (phase, state) => {\r\n this.bus.dispatch('idle:phaseChange', {\r\n phase: phase as import('./app/EventBus.js').IdleGamePhase,\r\n town: state.currentTown,\r\n dungeon: state.currentDungeon\r\n });\r\n this.onIdlePhaseChange(phase, state);\r\n },\r\n onPlayerUpdate: (p) => {\r\n this.bus.dispatch('player:update', { player: p });\r\n this.onIdlePlayerUpdate(p);\r\n },\r\n onDungeonProgress: (runnerState, combat) => {\r\n this.bus.dispatch('idle:dungeonProgress', { runnerState, combat });\r\n this.onDungeonProgress(runnerState, combat);\r\n },\r\n onEventLog: (message) => {\r\n this.bus.log(message);\r\n },\r\n onTravelProgress: (progress, duration) => {\r\n this.bus.dispatch('travel:progress', { progress, duration });\r\n this.onTravelProgress(progress, duration);\r\n },\r\n onDungeonComplete: (success, rewards) => {\r\n this.bus.dispatch('idle:dungeonComplete', { success, rewards });\r\n this.onDungeonComplete(success, rewards);\r\n },\r\n onPlayerDeath: () => {\r\n this.bus.dispatch('player:death', undefined as unknown as void);\r\n this.onPlayerDeath();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Set up router navigation listener\r\n * Maps route changes to UI mode changes\r\n */\r\n private setupRouterNavigation(): void {\r\n this.router.onNavigate((route, prev) => {\r\n this.handleRouteChange(route, prev);\r\n });\r\n\r\n this.router.onBack((route) => {\r\n this.handleRouteChange(route, null);\r\n });\r\n }\r\n\r\n /**\r\n * Handle route changes and update UI accordingly\r\n */\r\n private handleRouteChange(route: RouteType, prev: RouteType | null): void {\r\n switch (route.type) {\r\n case 'explore':\r\n this.ui.setMode('explore');\r\n // Clear any selection modes\r\n this.npcSelectionMode = false;\r\n this.dungeonSelectionMode = false;\r\n break;\r\n\r\n case 'dialog':\r\n this.ui.setMode('dialog');\r\n break;\r\n\r\n case 'travel':\r\n this.ui.setMode('travel');\r\n break;\r\n\r\n case 'combat':\r\n this.ui.setMode('combat');\r\n break;\r\n\r\n case 'dungeon':\r\n this.ui.setMode('explore');\r\n this.ui.enterDungeonMode();\r\n break;\r\n\r\n case 'npcSelection':\r\n // NPC selection is a sub-mode within explore\r\n this.npcSelectionMode = true;\r\n break;\r\n\r\n case 'dungeonSelection':\r\n // Dungeon selection is a sub-mode within explore\r\n this.dungeonSelectionMode = true;\r\n break;\r\n\r\n case 'save':\r\n // Save mode handled by SaveLoadHandler\r\n break;\r\n\r\n case 'load':\r\n // Load mode handled by SaveLoadHandler\r\n break;\r\n\r\n case 'workshop':\r\n // Workshop mode handled by WorkshopHandler\r\n break;\r\n\r\n case 'prologue':\r\n case 'characterCreation':\r\n this.isInFullScreenMode = true;\r\n this.ui.pauseRendering();\r\n break;\r\n\r\n case 'dead':\r\n // Dead state handled separately\r\n break;\r\n\r\n case 'gameover':\r\n this.isRunning = false;\r\n break;\r\n }\r\n\r\n // Handle leaving full-screen modes\r\n if (prev?.type === 'prologue' || prev?.type === 'characterCreation') {\r\n if (route.type !== 'prologue' && route.type !== 'characterCreation') {\r\n this.isInFullScreenMode = false;\r\n this.ui.resumeRendering();\r\n }\r\n }\r\n }\r\n \r\n // NPC interaction state\r\n private npcSelectionMode = false;\r\n private availableNPCs: ExtendedNPC[] = [];\r\n private currentDialogNPC: ExtendedNPC | null = null;\r\n private dialogHistory: Array<{ role: string; text: string }> = [];\r\n\r\n // Dungeon selection state\r\n private dungeonSelectionMode = false;\r\n private availableDungeons: Dungeon[] = [];\r\n\r\n // AI error handling state\r\n private consecutiveAIFailures = 0;\r\n private readonly MAX_CONSECUTIVE_FAILURES = 3;\r\n\r\n /**\r\n * Start the game\r\n */\r\n async start(): Promise<void> {\r\n try {\r\n // Check terminal size first (before any UI)\r\n await this.ensureMinimumTerminalSize();\r\n\r\n // Show title screen and get player name (uses simple input, before full UI init)\r\n const playerName = await this.showTitleScreen();\r\n\r\n // Now initialize the full game UI (after title screen)\r\n await this.ui.initialize();\r\n\r\n // Initialize systems\r\n await this.initializeSystems();\r\n\r\n // Set up callbacks with EventBus bridging\r\n this.setupIdleGameCallbacks();\r\n\r\n // Check for existing saves to determine flow\r\n const hasSaves = await this.checkForExistingSaves();\r\n\r\n if (hasSaves) {\r\n // Returning player: Initialize with their name (save will be loaded via menu)\r\n this.initializeGame(playerName);\r\n this.ui.addEventLog(`Welcome back, ${playerName}!`);\r\n this.ui.addEventLog(`Type 'load' to continue your adventure, or 'newgame' to start fresh.`);\r\n } else {\r\n // New player: Run the full New Game flow\r\n const flowResult = await this.runNewGameFlowAndStart();\r\n if (!flowResult) {\r\n // User cancelled - exit gracefully\r\n this.cleanup();\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Set up command and event handlers\r\n this.ui.onCommandInput((cmd) => this.handleCommand(cmd));\r\n this.setupEventHandlers();\r\n\r\n // Start main loop\r\n await this.mainLoop();\r\n\r\n } catch (error) {\r\n this.cleanup();\r\n console.error('Fatal error:', error);\r\n process.exit(1);\r\n }\r\n }\r\n\r\n /**\r\n * Check if any save files exist\r\n */\r\n private async checkForExistingSaves(): Promise<boolean> {\r\n const slots = await listSaveSlots();\r\n return slots.some(s => s.exists);\r\n }\r\n\r\n /**\r\n * Run the New Game flow and initialize the game\r\n * @returns true if successful, false if cancelled\r\n */\r\n private async runNewGameFlowAndStart(): Promise<boolean> {\r\n this.isInFullScreenMode = true;\r\n this.ui.pauseRendering(); // Stop GameUIAdapter refresh to prevent screen flicker\r\n\r\n try {\r\n const flowManager = new NewGameFlowManager(this.screen, this.input);\r\n const result = await flowManager.run();\r\n\r\n if (result.success && result.actor) {\r\n // Create team and initialize game\r\n const team = createTeamWithActor(result.actor, `${result.actor.name}'s Team`);\r\n const actors: Record<string, Actor> = { [result.actor.id]: result.actor };\r\n this.idleGameManager.initializeWithTeam(team, actors);\r\n\r\n // Clear screen and show welcome\r\n this.screen.clear();\r\n\r\n this.ui.addEventLog(`══════════════════════════════════════`);\r\n this.ui.addEventLog(` Welcome, ${result.actor.name} the ${result.actor.role}!`);\r\n this.ui.addEventLog(` Your adventure begins...`);\r\n this.ui.addEventLog(`══════════════════════════════════════`);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n } finally {\r\n this.ui.resumeRendering(); // Always restore GameUIAdapter refresh\r\n this.isInFullScreenMode = false;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new team with the starting actor\r\n * Team system is the core game design - always enabled\r\n */\r\n private createTeamWithStartingActor(name: string): { team: Team; actors: Record<string, Actor> } {\r\n // Create the first actor with balanced role\r\n const actor = createActor(name, 'balanced');\r\n\r\n // Create a team with this actor\r\n const team = createTeamWithActor(actor, `${name}'s Team`);\r\n\r\n // Store actors in a record\r\n const actors: Record<string, Actor> = { [actor.id]: actor };\r\n\r\n return { team, actors };\r\n }\r\n\r\n /**\r\n * Initialize the game with team mode (always enabled)\r\n */\r\n private initializeGame(playerName: string): void {\r\n const { team, actors } = this.createTeamWithStartingActor(playerName);\r\n this.idleGameManager.initializeWithTeam(team, actors);\r\n }\r\n\r\n /**\r\n * Ensure terminal meets minimum size requirements\r\n * Waits for user to resize if too small\r\n */\r\n private async ensureMinimumTerminalSize(): Promise<void> {\r\n // Enter alternate screen buffer to avoid overlapping with terminal history\r\n this.screen.enterAlternateScreen();\r\n // Hide cursor during size check\r\n this.screen.hideCursor();\r\n\r\n const check = this.screen.checkMinimumSize();\r\n \r\n if (check.valid) {\r\n return; // Size is OK\r\n }\r\n \r\n // Show warning and wait for resize\r\n this.screen.renderSizeWarning();\r\n \r\n // Wait for resize to valid size\r\n return new Promise((resolve) => {\r\n const checkAndResolve = (width: number, height: number) => {\r\n const newCheck = this.screen.checkMinimumSize();\r\n if (newCheck.valid) {\r\n // Clear the warning\r\n this.screen.clear();\r\n this.screen.forceRedraw();\r\n resolve();\r\n } else {\r\n // Still too small, show warning again\r\n this.screen.renderSizeWarning();\r\n }\r\n };\r\n \r\n // Register resize callback\r\n this.screen.onResize(checkAndResolve);\r\n });\r\n }\r\n\r\n /**\r\n * Wait for Enter key to start login\r\n */\r\n private async waitForLoginKey(): Promise<void> {\r\n return new Promise((resolve) => {\r\n const handler = (key: KeyEvent) => {\r\n if (key.name === 'return') {\r\n this.input.offKey(handler);\r\n resolve();\r\n } else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\r\n this.cleanup();\r\n process.exit(0);\r\n }\r\n };\r\n this.input.onKey(handler);\r\n });\r\n }\r\n\r\n /**\r\n * Show \"Press Enter to start\" and wait for Enter key\r\n * Features: blinking text, Ctrl+C graceful exit, Ctrl+O logout\r\n */\r\n private async waitForGameStart(playerName: string): Promise<void> {\r\n const { width } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n\r\n this.screen.clear();\r\n const logoY = this.drawAsciiTitle();\r\n const contentY = logoY + 3;\r\n\r\n // Show welcome message\r\n const welcomeMsg = `Welcome, ${playerName}!`;\r\n this.screen.write(centerX - Math.floor(welcomeMsg.length / 2), contentY, welcomeMsg, ANSI.fg.green);\r\n\r\n // Show \"Press Enter to start\" with blinking effect\r\n const startMsg = '▶ Press ENTER to Start ◀';\r\n const startMsgX = centerX - Math.floor(startMsg.length / 2);\r\n const startMsgY = contentY + 3;\r\n let blinkVisible = true;\r\n\r\n // Blinking interval\r\n const blinkInterval = setInterval(() => {\r\n if (blinkVisible) {\r\n this.screen.write(startMsgX, startMsgY, startMsg, ANSI.fg.cyan);\r\n } else {\r\n this.screen.write(startMsgX, startMsgY, ' '.repeat(startMsg.length), ANSI.fg.cyan);\r\n }\r\n blinkVisible = !blinkVisible;\r\n this.screen.forceRedraw();\r\n }, 600);\r\n\r\n // Initial draw\r\n this.screen.write(startMsgX, startMsgY, startMsg, ANSI.fg.cyan);\r\n\r\n // Show hint for logout\r\n const logoutHint = 'Ctrl+O to logout';\r\n this.screen.write(centerX - Math.floor(logoutHint.length / 2), startMsgY + 3, logoutHint, ANSI.fg.gray);\r\n\r\n this.screen.forceRedraw();\r\n\r\n // Wait for Enter\r\n return new Promise((resolve) => {\r\n const handler = async (key: KeyEvent) => {\r\n if (key.name === 'return') {\r\n clearInterval(blinkInterval);\r\n this.input.offKey(handler);\r\n resolve();\r\n } else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\r\n clearInterval(blinkInterval);\r\n this.input.offKey(handler);\r\n this.cleanup();\r\n process.exit(0);\r\n } else if (key.ctrl && key.name === 'o') {\r\n // Logout\r\n clearInterval(blinkInterval);\r\n this.input.offKey(handler);\r\n await this.handleLogout();\r\n }\r\n };\r\n this.input.onKey(handler);\r\n });\r\n }\r\n\r\n /**\r\n * Handle logout from title screen\r\n */\r\n private async handleLogout(): Promise<void> {\r\n const { width } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n\r\n this.screen.clear();\r\n const logoY = this.drawAsciiTitle();\r\n const contentY = logoY + 3;\r\n\r\n this.screen.write(centerX - 10, contentY, 'Logging out...', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n\r\n try {\r\n await logout();\r\n this.screen.write(centerX - 15, contentY + 2, '✓ Logged out successfully', ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n await this.sleep(1000);\r\n\r\n // Restart the title screen flow\r\n const playerName = await this.showTitleScreen();\r\n // Continue with game start\r\n await this.continueAfterLogin(playerName);\r\n } catch (error) {\r\n this.screen.write(centerX - 10, contentY + 2, '✗ Logout failed', ANSI.fg.red);\r\n this.screen.forceRedraw();\r\n await this.sleep(1500);\r\n // Restart anyway\r\n const playerName = await this.showTitleScreen();\r\n await this.continueAfterLogin(playerName);\r\n }\r\n }\r\n\r\n /**\r\n * Continue game after login (extracted to avoid duplication)\r\n */\r\n private async continueAfterLogin(playerName: string): Promise<void> {\r\n // Now initialize the full game UI (after title screen)\r\n await this.ui.initialize();\r\n\r\n // Initialize systems\r\n await this.initializeSystems();\r\n\r\n // Set up callbacks with EventBus bridging\r\n this.setupIdleGameCallbacks();\r\n\r\n // Initialize game (team or legacy mode based on USE_TEAM_MODE)\r\n this.initializeGame(playerName);\r\n\r\n this.ui.addEventLog(`Welcome to ${this.idleGameManager.getState()?.currentTown.name || 'town'}!`);\r\n this.ui.addEventLog(`Your adventure begins, ${playerName}...`);\r\n\r\n // Set up command and event handlers\r\n this.ui.onCommandInput((cmd) => this.handleCommand(cmd));\r\n this.setupEventHandlers();\r\n\r\n // Start main loop\r\n await this.mainLoop();\r\n }\r\n\r\n // ASCII Art Logo\r\n private static readonly ASCII_LOGO = [\r\n '██╗██████╗ ██╗ ███████╗██████╗ ██████╗ ██████╗ ',\r\n '██║██╔══██╗██║ ██╔════╝██╔══██╗██╔══██╗██╔════╝ ',\r\n '██║██║ ██║██║ █████╗ ██████╔╝██████╔╝██║ ███╗',\r\n '██║██║ ██║██║ ██╔══╝ ██╔══██╗██╔═══╝ ██║ ██║',\r\n '██║██████╔╝███████╗███████╗██║ ██║██║ ╚██████╔╝',\r\n '╚═╝╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ',\r\n ];\r\n\r\n private static readonly ASCII_TERMINAL = [\r\n '████████╗███████╗██████╗ ███╗ ███╗██╗███╗ ██╗ █████╗ ██╗ ',\r\n '╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██║████╗ ██║██╔══██╗██║ ',\r\n ' ██║ █████╗ ██████╔╝██╔████╔██║██║██╔██╗ ██║███████║██║ ',\r\n ' ██║ ██╔══╝ ██╔══██╗██║╚██╔╝██║██║██║╚██╗██║██╔══██║██║ ',\r\n ' ██║ ███████╗██║ ██║██║ ╚═╝ ██║██║██║ ╚████║██║ ██║███████╗',\r\n ' ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚══════╝',\r\n ];\r\n\r\n private static readonly ASCII_COMPACT = [\r\n ' ╔═══════════════════════════════════════╗',\r\n ' ║ █ ████ █ █████ ████ ████ ██ ║',\r\n ' ║ █ █ █ █ █ █ █ █ █ █ ║',\r\n ' ║ █ █ █ █ ████ ████ ████ █ ██ ║',\r\n ' ║ █ █ █ █ █ █ █ █ █ █ ║',\r\n ' ║ █ ████ █████ █████ █ █ █ ██ ║',\r\n ' ╠═══════════════════════════════════════╣',\r\n ' ║ T E R M I N A L v0.1.0 ║',\r\n ' ╚═══════════════════════════════════════╝',\r\n ];\r\n\r\n /**\r\n * Draw ASCII art title\r\n */\r\n private drawAsciiTitle(): number {\r\n const { width, height } = this.screen.getSize();\r\n \r\n // Use compact logo for smaller terminals\r\n const useCompact = width < 75;\r\n const logo = useCompact ? IdleRPGTerminal.ASCII_COMPACT : IdleRPGTerminal.ASCII_LOGO;\r\n const logoWidth = logo[0].length;\r\n \r\n const logoX = Math.floor((width - logoWidth) / 2);\r\n let y = 2;\r\n\r\n // Draw ASCII logo\r\n for (const line of logo) {\r\n this.screen.write(Math.max(1, logoX), y++, line, ANSI.fg.cyan);\r\n }\r\n\r\n // Draw TERMINAL text (if using full logo)\r\n if (!useCompact) {\r\n y++;\r\n const termX = Math.floor((width - IdleRPGTerminal.ASCII_TERMINAL[0].length) / 2);\r\n for (const line of IdleRPGTerminal.ASCII_TERMINAL) {\r\n this.screen.write(Math.max(1, termX), y++, line, ANSI.fg.yellow);\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n /**\r\n * Show title screen and get player name with login flow\r\n * Flow: Try restore auth -> if success, welcome back | else Enter -> show URL | Enter again -> open browser | Q -> show QR code (hide title)\r\n */\r\n private async showTitleScreen(): Promise<string> {\r\n const { width, height } = this.screen.getSize();\r\n this.screen.clear();\r\n\r\n // Draw ASCII art\r\n let y = this.drawAsciiTitle();\r\n y += 2;\r\n\r\n const centerX = Math.floor(width / 2);\r\n\r\n // Tagline\r\n const tagline = '~ An AI-native adventure that lives in your terminal ~';\r\n this.screen.write(centerX - Math.floor(tagline.length / 2), y++, tagline, ANSI.fg.gray);\r\n y++;\r\n\r\n // Decorative line\r\n const lineWidth = Math.min(50, width - 10);\r\n const lineX = Math.floor((width - lineWidth) / 2);\r\n this.screen.write(lineX, y++, '═'.repeat(lineWidth), ANSI.fg.gray);\r\n y++;\r\n\r\n const loginY = y;\r\n\r\n // Start input (needed for key detection)\r\n this.input.start();\r\n this.input.setMode('raw');\r\n\r\n // Show \"Checking authentication...\" while trying to restore\r\n this.screen.write(centerX - 15, loginY, 'Checking authentication...', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n\r\n // Try to restore authentication from saved tokens\r\n const restoreResult = await tryRestoreAuth();\r\n \r\n if (restoreResult.success) {\r\n // Authentication restored successfully!\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n \r\n const msg = restoreResult.needsRefresh \r\n ? '✓ Session refreshed!' \r\n : '✓ Welcome back!';\r\n this.screen.write(centerX - 12, loginY, msg, ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n \r\n // Get nickname from PlayKit\r\n const nickname = await getNickname();\r\n \r\n if (nickname) {\r\n // Has nickname, wait for Enter to start game\r\n await this.waitForGameStart(nickname);\r\n return nickname;\r\n } else {\r\n // No nickname set, prompt user to set one\r\n this.screen.write(centerX - 15, loginY + 2, 'You need to set a nickname first', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n await this.sleep(1000);\r\n\r\n const newNickname = await this.promptSetNickname();\r\n await this.waitForGameStart(newNickname);\r\n return newNickname;\r\n }\r\n }\r\n\r\n // No saved auth or restore failed - show login UI\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n \r\n // Show \"Press ENTER to login\" message\r\n this.screen.write(centerX - 15, loginY, 'Login required to play', ANSI.fg.gray);\r\n this.screen.write(centerX - 15, loginY + 2, '▶ Press ENTER to Login ◀', ANSI.fg.cyan);\r\n this.screen.write(centerX - 10, loginY + 4, 'Esc to quit', ANSI.fg.gray);\r\n this.screen.forceRedraw();\r\n\r\n // Wait for Enter key\r\n await this.waitForLoginKey();\r\n\r\n // Now start the login process\r\n let playerName = '';\r\n let spinnerFrame = 0;\r\n let spinnerInterval: NodeJS.Timeout | null = null;\r\n let showingQR = false;\r\n let qrCode = '';\r\n\r\n const startSpinner = () => {\r\n spinnerInterval = setInterval(() => {\r\n spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES.length;\r\n }, 100);\r\n };\r\n\r\n const stopSpinner = () => {\r\n if (spinnerInterval) {\r\n clearInterval(spinnerInterval);\r\n spinnerInterval = null;\r\n }\r\n };\r\n\r\n const getSpinner = () => SPINNER_FRAMES[spinnerFrame];\r\n\r\n try {\r\n // Step 1: Show \"Preparing login...\" with spinner\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 15, loginY, `${getSpinner()} Preparing login...`, ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n startSpinner();\r\n\r\n // Initiate login to get URL\r\n const loginInfo = await initiateLogin();\r\n\r\n // Generate QR code in background (for when user presses Q)\r\n qrCode = await generateQRCode(loginInfo.authUrl);\r\n\r\n // Helper to redraw the waiting screen\r\n const redrawWaitingScreen = () => {\r\n this.screen.clear();\r\n \r\n let contentY = 2;\r\n \r\n if (!showingQR) {\r\n // Show with title\r\n contentY = this.drawAsciiTitle();\r\n contentY += 2;\r\n \r\n // Show URL\r\n this.screen.write(centerX - 10, contentY++, 'Please visit:', ANSI.fg.white);\r\n contentY++;\r\n \r\n const url = loginInfo.authUrl;\r\n const maxLen = width - 10;\r\n const displayUrl = url.length > maxLen ? url.slice(0, maxLen - 3) + '...' : url;\r\n this.screen.write(centerX - Math.floor(displayUrl.length / 2), contentY++, displayUrl, ANSI.fg.cyan);\r\n contentY += 2;\r\n \r\n // Status line\r\n this.screen.write(centerX - 18, contentY, `${getSpinner()} Waiting for authentication...`, ANSI.fg.yellow);\r\n contentY += 2;\r\n \r\n // Instructions\r\n this.screen.write(centerX - 20, contentY++, 'Enter: Open in browser', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Q: Show QR code (hide title)', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Esc: Cancel', ANSI.fg.gray);\r\n } else {\r\n // Show QR code only (no title, more space)\r\n contentY = 1;\r\n \r\n // Draw QR code\r\n const qrLines = qrCode.split('\\n');\r\n for (const line of qrLines) {\r\n if (line.trim()) {\r\n this.screen.write(centerX - Math.floor(line.length / 2), contentY++, line, ANSI.fg.white);\r\n }\r\n }\r\n contentY++;\r\n \r\n // URL below QR\r\n const url = loginInfo.authUrl;\r\n const maxLen = width - 4;\r\n const displayUrl = url.length > maxLen ? url.slice(0, maxLen - 3) + '...' : url;\r\n this.screen.write(centerX - Math.floor(displayUrl.length / 2), contentY++, displayUrl, ANSI.fg.cyan);\r\n contentY += 2;\r\n \r\n // Status\r\n this.screen.write(centerX - 18, contentY, `${getSpinner()} Waiting for authentication...`, ANSI.fg.yellow);\r\n contentY += 2;\r\n \r\n // Instructions\r\n this.screen.write(centerX - 20, contentY++, 'Enter: Open in browser', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Q: Show title (hide QR)', ANSI.fg.gray);\r\n this.screen.write(centerX - 20, contentY++, 'Esc: Cancel', ANSI.fg.gray);\r\n }\r\n \r\n this.screen.forceRedraw();\r\n };\r\n\r\n // Initial draw (showing URL, not QR)\r\n redrawWaitingScreen();\r\n\r\n // Set up key handler\r\n let cancelled = false;\r\n let exitRequested = false;\r\n let spinnerUpdateInterval: NodeJS.Timeout | null = null;\r\n\r\n const keyHandler = (key: KeyEvent) => {\r\n if (key.name === 'return') {\r\n // Open URL in browser\r\n import('open').then(({ default: openUrl }) => {\r\n openUrl(loginInfo.authUrl).catch(() => {});\r\n }).catch(() => {});\r\n } else if (key.raw === 'q' || key.raw === 'Q') {\r\n // Toggle QR code display\r\n showingQR = !showingQR;\r\n redrawWaitingScreen();\r\n } else if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\r\n cancelled = true;\r\n exitRequested = true;\r\n // Graceful exit\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n this.cleanup();\r\n process.exit(0);\r\n }\r\n };\r\n this.input.onKey(keyHandler);\r\n\r\n // Spinner update loop - only update the spinner character, don't redraw everything\r\n spinnerUpdateInterval = setInterval(() => {\r\n if (cancelled) return;\r\n // Just redraw the entire screen with updated spinner\r\n redrawWaitingScreen();\r\n }, 100);\r\n\r\n // Wait for login completion\r\n try {\r\n const result = await completeLogin((status) => {\r\n if (cancelled) return;\r\n if (status === 'completed') {\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n\r\n // Show success\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 12, loginY, '✓ Login successful!', ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n }\r\n });\r\n\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n\r\n if (cancelled) {\r\n throw new Error('Login cancelled');\r\n }\r\n\r\n // Show success\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 12, loginY, '✓ Login successful!', ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n \r\n // Get nickname from PlayKit (may be set from previous sessions)\r\n const nickname = await getNickname();\r\n\r\n if (nickname) {\r\n playerName = nickname;\r\n } else {\r\n // No nickname set, prompt user to set one\r\n this.screen.write(centerX - 15, loginY + 2, 'Set your adventurer name', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n await this.sleep(1000);\r\n\r\n playerName = await this.promptSetNickname();\r\n }\r\n\r\n // Wait for Enter to start game\r\n await this.waitForGameStart(playerName);\r\n\r\n } catch (loginError) {\r\n if (spinnerUpdateInterval) clearInterval(spinnerUpdateInterval);\r\n this.input.offKey(keyHandler);\r\n stopSpinner();\r\n throw loginError;\r\n }\r\n\r\n } catch (error) {\r\n stopSpinner();\r\n \r\n // Show error\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n this.screen.write(centerX - 10, loginY, '✗ Login failed', ANSI.fg.red);\r\n this.screen.write(centerX - Math.floor(((error as Error).message || 'Unknown error').length / 2), loginY + 2, \r\n (error as Error).message || 'Unknown error', ANSI.fg.gray);\r\n this.screen.write(centerX - 15, loginY + 4, 'Press any key to exit...', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n\r\n await this.input.waitForKey();\r\n this.cleanup();\r\n process.exit(1);\r\n }\r\n\r\n // If we got a player name from auth, use it; otherwise prompt\r\n if (playerName) {\r\n return playerName;\r\n }\r\n\r\n // Fallback: prompt to set nickname (this shouldn't normally be reached)\r\n const fallbackName = await this.promptSetNickname();\r\n await this.waitForGameStart(fallbackName);\r\n return fallbackName;\r\n }\r\n\r\n /**\r\n * Prompt user to set their nickname (saved to PlayKit)\r\n */\r\n private async promptSetNickname(): Promise<string> {\r\n const { width, height } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n const maxNameLength = 16; // PlayKit limit is 1-16 characters\r\n \r\n // Calculate position\r\n const useCompact = width < 75;\r\n const inputY = useCompact ? 14 : 20;\r\n \r\n let inputBuffer = '';\r\n let errorMessage = '';\r\n \r\n const drawPrompt = () => {\r\n this.screen.clear();\r\n this.drawAsciiTitle();\r\n \r\n const promptText = 'Set your adventurer name:';\r\n this.screen.write(centerX - Math.floor(promptText.length / 2), inputY, promptText, ANSI.fg.white);\r\n \r\n // Rules hint\r\n const rulesText = '(1-16 chars, letters, numbers, Chinese, _, space)';\r\n this.screen.write(centerX - Math.floor(rulesText.length / 2), inputY + 1, rulesText, ANSI.fg.gray);\r\n \r\n // Input box\r\n const inputWidth = 24;\r\n const inputX = Math.floor((width - inputWidth) / 2);\r\n \r\n this.screen.write(inputX, inputY + 3, '╔' + '═'.repeat(inputWidth - 2) + '╗', ANSI.fg.cyan);\r\n this.screen.write(inputX, inputY + 4, '║ ', ANSI.fg.cyan);\r\n this.screen.write(inputX + 2, inputY + 4, inputBuffer.slice(0, maxNameLength).padEnd(inputWidth - 4) + '▌', ANSI.fg.white);\r\n this.screen.write(inputX + inputWidth - 1, inputY + 4, '║', ANSI.fg.cyan);\r\n this.screen.write(inputX, inputY + 5, '╚' + '═'.repeat(inputWidth - 2) + '╝', ANSI.fg.cyan);\r\n \r\n // Error message\r\n if (errorMessage) {\r\n this.screen.write(centerX - Math.floor(errorMessage.length / 2), inputY + 7, errorMessage, ANSI.fg.red);\r\n }\r\n \r\n // Instructions\r\n this.screen.write(centerX - 15, inputY + 9, 'Enter to confirm Esc to use default', ANSI.fg.gray);\r\n \r\n this.screen.forceRedraw();\r\n };\r\n \r\n drawPrompt();\r\n this.screen.showCursor();\r\n \r\n return new Promise<string>((resolve) => {\r\n let isProcessing = false; // Prevent double-processing\r\n \r\n const handleKeypress = (key: KeyEvent) => {\r\n // Ignore input while processing async operation\r\n if (isProcessing) return;\r\n \r\n if (key.name === 'return') {\r\n const trimmed = inputBuffer.trim();\r\n \r\n if (!trimmed) {\r\n errorMessage = 'Name cannot be empty';\r\n drawPrompt();\r\n return;\r\n }\r\n \r\n // Mark as processing to prevent double-submit\r\n isProcessing = true;\r\n \r\n // Try to set nickname on PlayKit\r\n this.screen.write(centerX - 10, inputY + 7, 'Saving... ', ANSI.fg.yellow);\r\n this.screen.forceRedraw();\r\n \r\n setNickname(trimmed).then((result) => {\r\n if (result.success && result.nickname) {\r\n this.input.offKey(handleKeypress);\r\n this.screen.hideCursor();\r\n \r\n // Show success\r\n this.screen.write(centerX - 15, inputY + 7, `✓ Welcome, ${result.nickname}!`.padEnd(30), ANSI.fg.green);\r\n this.screen.forceRedraw();\r\n \r\n setTimeout(() => {\r\n resolve(result.nickname!);\r\n }, 1500);\r\n } else {\r\n isProcessing = false;\r\n errorMessage = result.error || 'Failed to set name';\r\n drawPrompt();\r\n }\r\n }).catch((err) => {\r\n isProcessing = false;\r\n errorMessage = 'Network error, please try again';\r\n drawPrompt();\r\n });\r\n } else if (key.name === 'backspace') {\r\n inputBuffer = inputBuffer.slice(0, -1);\r\n errorMessage = '';\r\n drawPrompt();\r\n } else if (key.name === 'escape') {\r\n // Use default name\r\n this.input.offKey(handleKeypress);\r\n this.screen.hideCursor();\r\n resolve('Adventurer');\r\n } else if (key.raw && !key.ctrl && !key.meta) {\r\n const charCode = key.raw.charCodeAt(0);\r\n if (charCode >= 32 && inputBuffer.length < maxNameLength) {\r\n inputBuffer += key.raw;\r\n errorMessage = '';\r\n drawPrompt();\r\n }\r\n }\r\n };\r\n \r\n this.input.onKey(handleKeypress);\r\n });\r\n }\r\n\r\n /**\r\n * Get player name input on title screen\r\n * Self-contained input handling that doesn't rely on GameUI\r\n */\r\n private async getTitleScreenInput(): Promise<string> {\r\n const { width, height } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n const maxNameLength = 20;\r\n \r\n // Calculate input position based on ASCII art\r\n const getInputY = () => {\r\n const { width: w } = this.screen.getSize();\r\n const useCompact = w < 75;\r\n // ASCII logo height + TERMINAL + spacing\r\n return useCompact ? 14 : 20;\r\n };\r\n \r\n // Draw prompt\r\n const drawPrompt = (currentInput: string) => {\r\n const { width: w } = this.screen.getSize();\r\n const cx = Math.floor(w / 2);\r\n const inputY = getInputY();\r\n \r\n this.screen.write(cx - 15, inputY, 'What is your name, adventurer?', ANSI.fg.white);\r\n \r\n // Input box\r\n const inputWidth = 24;\r\n const inputX = Math.floor((w - inputWidth) / 2);\r\n \r\n this.screen.write(inputX, inputY + 2, '╔' + '═'.repeat(inputWidth - 2) + '╗', ANSI.fg.cyan);\r\n this.screen.write(inputX, inputY + 3, '║ ', ANSI.fg.cyan);\r\n this.screen.write(inputX + 2, inputY + 3, currentInput.slice(0, maxNameLength).padEnd(inputWidth - 4) + '▌', ANSI.fg.white);\r\n this.screen.write(inputX + inputWidth - 1, inputY + 3, '║', ANSI.fg.cyan);\r\n this.screen.write(inputX, inputY + 4, '╚' + '═'.repeat(inputWidth - 2) + '╝', ANSI.fg.cyan);\r\n \r\n this.screen.write(cx - 15, inputY + 6, 'Enter to confirm Esc to quit', ANSI.fg.gray);\r\n };\r\n \r\n // Full redraw for title screen (used after resize)\r\n const redrawTitleScreen = (currentInput: string) => {\r\n const { width: w } = this.screen.getSize();\r\n const cx = Math.floor(w / 2);\r\n \r\n this.screen.clear();\r\n \r\n // Draw ASCII art\r\n this.drawAsciiTitle();\r\n \r\n // Tagline\r\n const tagline = '~ An AI-native adventure that lives in your terminal ~';\r\n const useCompact = w < 75;\r\n const tagY = useCompact ? 12 : 16;\r\n this.screen.write(cx - Math.floor(tagline.length / 2), tagY, tagline, ANSI.fg.gray);\r\n \r\n drawPrompt(currentInput);\r\n this.screen.forceRedraw();\r\n };\r\n \r\n // Initial draw\r\n drawPrompt('');\r\n this.screen.showCursor();\r\n this.screen.forceRedraw();\r\n \r\n // Set up resize handler for title screen\r\n let inputBuffer = '';\r\n const resizeHandler = () => {\r\n const sizeCheck = this.screen.checkMinimumSize();\r\n if (!sizeCheck.valid) {\r\n this.screen.renderSizeWarning();\r\n } else {\r\n redrawTitleScreen(inputBuffer);\r\n }\r\n };\r\n this.screen.onResize(resizeHandler);\r\n \r\n // Start input\r\n this.input.start();\r\n \r\n return new Promise<string>((resolve) => {\r\n const handleKeypress = (key: KeyEvent) => {\r\n if (key.name === 'return') {\r\n // Enter pressed - submit\r\n this.input.offKey(handleKeypress);\r\n this.screen.hideCursor();\r\n resolve(inputBuffer.trim() || 'Wanderer');\r\n } else if (key.name === 'backspace') {\r\n // Backspace - delete last char\r\n inputBuffer = inputBuffer.slice(0, -1);\r\n drawPrompt(inputBuffer);\r\n this.screen.render();\r\n } else if (key.name === 'escape') {\r\n // Escape - clear input\r\n inputBuffer = '';\r\n drawPrompt(inputBuffer);\r\n this.screen.render();\r\n } else if (key.raw && !key.ctrl && !key.meta) {\r\n // Printable character\r\n const charCode = key.raw.charCodeAt(0);\r\n if (charCode >= 32 && inputBuffer.length < maxNameLength) {\r\n inputBuffer += key.raw;\r\n drawPrompt(inputBuffer);\r\n this.screen.render();\r\n }\r\n }\r\n };\r\n \r\n this.input.onKey(handleKeypress);\r\n });\r\n }\r\n\r\n /**\r\n * Initialize game systems\r\n */\r\n private async initializeSystems(): Promise<void> {\r\n // Systems are initialized as singletons when accessed\r\n // NPC Manager already loads fixed NPCs\r\n // Quest Manager is ready\r\n }\r\n\r\n /**\r\n * Set up event handlers (called from start())\r\n */\r\n private setupEventHandlers(): void {\r\n // Character edit handler\r\n this.ui.onCharacterEditHandler((field, value) => this.handleCharacterEdit(field, value));\r\n\r\n // Cancel travel handler\r\n this.ui.setOnCancelTravel(() => this.cancelTravel());\r\n\r\n // Abort dungeon handler\r\n this.ui.setOnAbortDungeon(() => this.abortDungeon());\r\n\r\n // Process signals - cleanup and exit gracefully\r\n process.on('SIGINT', () => {\r\n this.cleanup();\r\n process.exit(0);\r\n });\r\n process.on('SIGTERM', () => {\r\n this.cleanup();\r\n process.exit(0);\r\n });\r\n }\r\n\r\n /**\r\n * Handle character customization edits\r\n */\r\n private async handleCharacterEdit(field: string, value: string): Promise<void> {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) return;\r\n\r\n if (field === 'name') {\r\n // Update player name both locally and on PlayKit\r\n idleState.player.name = value;\r\n\r\n // Try to update nickname on PlayKit\r\n const result = await setNickname(value);\r\n\r\n if (result.success) {\r\n this.ui.addEventLog(`✓ Name changed to \"${value}\"`);\r\n } else {\r\n // Name was updated locally, but PlayKit sync failed\r\n this.ui.addEventLog(`✓ Name changed to \"${value}\"`);\r\n if (result.error) {\r\n this.ui.addEventLog(`⚠ Online sync failed: ${result.error}`);\r\n }\r\n }\r\n } else {\r\n // Update character customization field\r\n const characterUpdate: Record<string, string> = {};\r\n characterUpdate[field] = value;\r\n\r\n if (idleState.player.character) {\r\n Object.assign(idleState.player.character, characterUpdate);\r\n }\r\n \r\n const fieldLabels: Record<string, string> = {\r\n backstory: 'Background Story',\r\n appearance: 'Appearance',\r\n personality: 'Personality',\r\n motivation: 'Motivation',\r\n origin: 'Origin',\r\n };\r\n \r\n const label = fieldLabels[field] || field;\r\n this.ui.addEventLog(`✓ ${label} updated`);\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // IdleGameManager Callbacks\r\n // ==========================================================================\r\n\r\n private onIdlePhaseChange(phase: IdleGamePhase, state: IdleGameState): void {\r\n switch (phase) {\r\n case 'in_town':\r\n case 'resting':\r\n this.router.navigate({ type: 'explore' });\r\n break;\r\n case 'traveling_to_dungeon':\r\n this.router.navigate({\r\n type: 'travel',\r\n targetRoomId: state.currentDungeon?.id || '',\r\n phase: 'traveling_to_dungeon'\r\n });\r\n break;\r\n case 'returning_to_town':\r\n this.router.navigate({\r\n type: 'travel',\r\n targetRoomId: state.currentTown.id,\r\n phase: 'returning_to_town'\r\n });\r\n break;\r\n case 'in_dungeon':\r\n const runnerState = state.dungeonRunner?.getState();\r\n if (runnerState?.activeCombat) {\r\n this.router.navigate({ type: 'combat', encounterId: 'current' });\r\n } else {\r\n this.router.navigate({ type: 'dungeon', dungeonId: state.currentDungeon?.id || '' });\r\n }\r\n break;\r\n case 'dead':\r\n this.router.navigate({ type: 'dead' });\r\n this.ui.addEventLog('You have died...');\r\n break;\r\n }\r\n }\r\n\r\n private onIdlePlayerUpdate(player: Player): void {\r\n // Player stats updated, UI will refresh on next render\r\n }\r\n\r\n private onDungeonProgress(\r\n runnerState: import('./core/DungeonRunner.js').DungeonRunnerState,\r\n combat: import('./core/IdleCombat.js').IdleCombatState | null\r\n ): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (combat) {\r\n this.router.navigate({ type: 'combat', encounterId: 'current' });\r\n } else if (idleState?.currentDungeon) {\r\n this.router.navigate({ type: 'dungeon', dungeonId: idleState.currentDungeon.id });\r\n }\r\n }\r\n\r\n private onTravelProgress(progress: number, duration: number): void {\r\n // Travel progress updated, UI will refresh on next render\r\n }\r\n\r\n private onDungeonComplete(\r\n success: boolean,\r\n rewards: { gold: number; exp: number; items: string[] }\r\n ): void {\r\n if (success) {\r\n this.ui.addEventLog(`Dungeon cleared! Gained ${rewards.gold} gold and ${rewards.exp} exp.`);\r\n if (rewards.items.length > 0) {\r\n this.ui.addEventLog(`Found: ${rewards.items.join(', ')}`);\r\n }\r\n } else {\r\n this.ui.addEventLog('Dungeon run failed.');\r\n }\r\n }\r\n\r\n private onPlayerDeath(): void {\r\n this.ui.addEventLog('Press R to respawn at town, or Q to quit.');\r\n }\r\n\r\n /**\r\n * Main game loop\r\n */\r\n private async mainLoop(): Promise<void> {\r\n this.isRunning = true;\r\n this.router.navigate({ type: 'explore' });\r\n\r\n while (this.isRunning) {\r\n // Skip normal rendering when in full screen mode (character creation, etc.)\r\n if (this.isInFullScreenMode) {\r\n await this.sleep(50);\r\n continue;\r\n }\r\n\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) break;\r\n\r\n // Convert IdleGameState to GameState for UI\r\n const state = adaptIdleGameStateToGameState(idleState);\r\n\r\n // Check for daily death check\r\n if (this.npcManager.shouldPerformDeathCheck()) {\r\n const result = this.npcManager.performDailyDeathCheck();\r\n if (result.died.length > 0) {\r\n for (const npc of result.died) {\r\n this.ui.addEventLog(`${npc.name} has died: ${npc.deathCause}`);\r\n }\r\n }\r\n }\r\n\r\n // Check quest timeouts\r\n const failedQuests = this.questManager.checkTimeouts();\r\n for (const quest of failedQuests) {\r\n this.ui.addEventLog(`Quest failed: ${quest.name}`);\r\n }\r\n\r\n // Render based on current phase\r\n switch (idleState.phase) {\r\n case 'in_town':\r\n case 'resting':\r\n this.renderExploreMode(state);\r\n break;\r\n case 'traveling_to_dungeon':\r\n case 'returning_to_town':\r\n this.renderTravelMode(state);\r\n break;\r\n case 'in_dungeon':\r\n if (state.phase === 'combat' && state.combat) {\r\n this.renderCombatMode(state);\r\n } else {\r\n this.renderDungeonMode(state);\r\n }\r\n break;\r\n case 'dead':\r\n this.renderDeadScreen(state);\r\n break;\r\n }\r\n\r\n // Small delay to prevent CPU spinning\r\n await this.sleep(50);\r\n }\r\n\r\n this.cleanup();\r\n }\r\n\r\n /**\r\n * Render dead screen\r\n */\r\n private renderDeadScreen(state: import('./core/types.js').GameState): void {\r\n const { width, height } = this.screen.getSize();\r\n const centerX = Math.floor(width / 2);\r\n const centerY = Math.floor(height / 2);\r\n\r\n this.screen.clear();\r\n this.screen.write(centerX - 8, centerY - 2, 'YOU HAVE DIED', ANSI.fg.red, undefined, ANSI.bold);\r\n this.screen.write(centerX - 15, centerY + 1, 'Press [R] to respawn at town', ANSI.fg.gray);\r\n this.screen.write(centerX - 10, centerY + 2, 'Press [Q] to quit', ANSI.fg.gray);\r\n this.screen.render();\r\n }\r\n\r\n /**\r\n * Render explore mode\r\n */\r\n private renderExploreMode(state: import('./core/types.js').GameState): void {\r\n const idleState = this.idleGameManager.getState();\r\n\r\n // If not in traveling state, ensure we exit travel mode\r\n if (idleState && idleState.phase !== 'traveling_to_dungeon' && idleState.phase !== 'returning_to_town') {\r\n this.ui.exitTravelMode();\r\n this.ui.clearTravelState();\r\n }\r\n\r\n // If not in dungeon, ensure we exit dungeon mode\r\n if (idleState && idleState.phase !== 'in_dungeon') {\r\n this.ui.exitDungeonMode();\r\n }\r\n\r\n const npcsInRoom = this.npcManager.getByRoom(state.currentRoom.id);\r\n const activeQuests = this.questManager.getActiveQuests();\r\n this.ui.renderMainScreen(state, npcsInRoom, activeQuests);\r\n }\r\n\r\n /**\r\n * Render travel mode - uses main explore layout with TravelingSection\r\n */\r\n private renderTravelMode(state: import('./core/types.js').GameState): void {\r\n if (!state.travelState) return;\r\n\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) return;\r\n\r\n const events = state.travelState.events.map(e => e.title);\r\n\r\n // Determine from/to names and room IDs for the player icon\r\n let fromName: string;\r\n let toName: string;\r\n let fromRoomId: string;\r\n let toRoomId: string;\r\n\r\n if (idleState.phase === 'traveling_to_dungeon') {\r\n // Traveling to dungeon: from town center to dungeon entrance\r\n fromName = idleState.currentTown.name;\r\n toName = idleState.currentDungeon?.name || 'Unknown Dungeon';\r\n fromRoomId = `${idleState.currentTown.id}_center`;\r\n // Find the dungeon entrance room in the map\r\n const dungeonId = idleState.currentDungeon?.id;\r\n toRoomId = fromRoomId; // Default fallback\r\n if (dungeonId) {\r\n for (const [id, room] of state.currentMap.rooms) {\r\n if (room.type === 'dungeon_entrance' && room.name.includes(dungeonId)) {\r\n toRoomId = id;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n // Returning to town: from dungeon to town center\r\n fromName = idleState.currentDungeon?.name || 'Dungeon';\r\n toName = idleState.currentTown.name;\r\n fromRoomId = `${idleState.currentTown.id}_center`; // Will be at town map\r\n toRoomId = `${idleState.currentTown.id}_center`;\r\n }\r\n\r\n // Ensure we're in travel mode\r\n this.ui.enterTravelMode();\r\n\r\n // Update travel state for UI\r\n this.ui.updateTravelState({\r\n fromRoomId: fromRoomId,\r\n toRoomId: toRoomId,\r\n fromName: fromName,\r\n toName: toName,\r\n progress: state.travelState.progress,\r\n duration: state.travelState.duration,\r\n events: events,\r\n phase: idleState.phase as 'traveling_to_dungeon' | 'returning_to_town',\r\n });\r\n\r\n // Use main screen rendering (with TravelingSection visible)\r\n this.renderExploreMode(state);\r\n }\r\n\r\n /**\r\n * Render dungeon mode - uses dungeon layout with DungeonSection\r\n */\r\n private renderDungeonMode(state: import('./core/types.js').GameState): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState || !idleState.dungeonRunner) return;\r\n\r\n const runnerState = idleState.dungeonRunner.getState();\r\n if (!runnerState) return;\r\n\r\n // Ensure we're in dungeon mode\r\n this.ui.enterDungeonMode();\r\n\r\n // Calculate dungeon progress data\r\n const dungeon = idleState.currentDungeon;\r\n const totalRooms = dungeon ? Array.from(state.currentMap.rooms.values()).length : 0;\r\n const exploredRooms = runnerState.exploredRooms.size;\r\n\r\n // Calculate elapsed time from startTime\r\n const elapsedTime = (Date.now() - runnerState.startTime) / 1000; // seconds\r\n\r\n // Estimate time remaining based on progress\r\n const progressPct = totalRooms > 0 ? exploredRooms / totalRooms : 0;\r\n const estimatedTotal = progressPct > 0.1 ? elapsedTime / progressPct : (dungeon?.estimatedTime || 120);\r\n const estimatedRemaining = Math.max(0, estimatedTotal - elapsedTime);\r\n\r\n // Update dungeon section data\r\n this.ui.updateDungeonData({\r\n dungeonName: dungeon?.name || 'Unknown Dungeon',\r\n currentFloor: runnerState.currentLevel,\r\n totalFloors: dungeon?.levels.length || 1,\r\n roomsExplored: exploredRooms,\r\n totalRooms: totalRooms,\r\n enemiesDefeated: runnerState.enemiesKilled,\r\n totalEnemies: totalRooms, // Approximate\r\n treasuresFound: runnerState.lootCollected.length,\r\n currentRoomType: state.currentRoom.type,\r\n playerHp: state.player.stats.hp,\r\n playerMaxHp: state.player.stats.maxHp,\r\n estimatedTimeRemaining: estimatedRemaining,\r\n elapsedTime: elapsedTime,\r\n });\r\n\r\n // Render using main screen\r\n const npcsInRoom = this.npcManager.getByRoom(state.currentRoom.id);\r\n const activeQuests = this.questManager.getActiveQuests();\r\n this.ui.renderMainScreen(state, npcsInRoom, activeQuests);\r\n }\r\n\r\n /**\r\n * Render combat mode\r\n */\r\n private renderCombatMode(state: import('./core/types.js').GameState): void {\r\n if (!state.combat) return;\r\n this.ui.renderCombatScreen(state.combat, state.player);\r\n }\r\n\r\n /**\r\n * Handle command input\r\n */\r\n private handleCommand(cmd: string): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) return;\r\n\r\n // Handle dead state special commands\r\n if (idleState.phase === 'dead') {\r\n if (cmd === 'r' || cmd === 'respawn') {\r\n this.idleGameManager.respawn();\r\n this.router.navigate({ type: 'explore' });\r\n return;\r\n }\r\n if (cmd === 'q' || cmd === 'quit') {\r\n this.router.navigate({ type: 'gameover' });\r\n return;\r\n }\r\n return; // Ignore other commands when dead\r\n }\r\n\r\n // Try registered commands first\r\n if (this.commandRegistry.execute(cmd)) {\r\n return;\r\n }\r\n\r\n // Handle special cases: numeric input and mode-specific commands\r\n if (!cmd) return;\r\n\r\n // Check if it's a number\r\n const num = parseInt(cmd, 10);\r\n if (!isNaN(num)) {\r\n // Handle based on current mode (using handlers)\r\n if (this.saveLoadHandler.handleNumericInput(num)) {\r\n return;\r\n } else if (this.workshopHandler.workshopMode) {\r\n this.workshopHandler.handleInput(num);\r\n return;\r\n } else if (this.npcSelectionMode) {\r\n this.handleNPCSelection(num);\r\n return;\r\n } else if (this.dungeonSelectionMode) {\r\n this.handleDungeonSelection(num);\r\n return;\r\n } else {\r\n // Handle map room selection (dungeon entrance, facilities)\r\n this.handleMapRoomSelection(num);\r\n return;\r\n }\r\n }\r\n\r\n // Non-numeric unknown command - cancel any pending modes or show error\r\n if (this.saveLoadHandler.saveMode) {\r\n this.saveLoadHandler.cancelSave();\r\n } else if (this.saveLoadHandler.loadMode) {\r\n this.saveLoadHandler.cancelLoad();\r\n } else if (this.workshopHandler.workshopMode) {\r\n this.workshopHandler.exit();\r\n } else if (this.dungeonSelectionMode) {\r\n this.dungeonSelectionMode = false;\r\n this.ui.addEventLog('Dungeon selection cancelled.');\r\n } else {\r\n this.ui.addEventLog(`Unknown command: ${cmd}. Type 'help' for commands.`);\r\n }\r\n }\r\n\r\n /**\r\n * Handle travel command - shows available facilities in town\r\n */\r\n private handleTravelCommand(): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState || idleState.phase !== 'in_town') {\r\n this.ui.addEventLog('You can only visit facilities when in town.');\r\n return;\r\n }\r\n\r\n const facilities = idleState.currentTown.facilities;\r\n if (facilities.length === 0) {\r\n this.ui.addEventLog('No facilities available in this town.');\r\n return;\r\n }\r\n\r\n this.ui.addEventLog('─── Town Facilities ───');\r\n facilities.forEach((facility, index) => {\r\n this.ui.addEventLog(` [${index + 1}] ${facility.name} (${facility.type})`);\r\n });\r\n this.ui.addEventLog('Enter a number to visit a facility.');\r\n }\r\n\r\n /**\r\n * Handle dungeon command - shows available dungeons\r\n */\r\n private handleDungeonCommand(): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState || idleState.phase !== 'in_town') {\r\n this.ui.addEventLog('You can only select dungeons when in town.');\r\n return;\r\n }\r\n\r\n this.availableDungeons = this.idleGameManager.getAvailableDungeons();\r\n if (this.availableDungeons.length === 0) {\r\n this.ui.addEventLog('No dungeons available from this town.');\r\n return;\r\n }\r\n\r\n this.dungeonSelectionMode = true;\r\n this.ui.addEventLog('─── Available Dungeons ───');\r\n this.availableDungeons.forEach((dungeon, index) => {\r\n const difficulty = dungeon.difficulty.charAt(0).toUpperCase() + dungeon.difficulty.slice(1);\r\n this.ui.addEventLog(` [${index + 1}] ${dungeon.name} (${difficulty}, Lv.${dungeon.recommendedLevel})`);\r\n });\r\n this.ui.addEventLog('Enter a number to travel to a dungeon, or any key to cancel.');\r\n }\r\n\r\n /**\r\n * Handle dungeon selection\r\n */\r\n private handleDungeonSelection(num: number): void {\r\n const index = num - 1;\r\n if (index >= 0 && index < this.availableDungeons.length) {\r\n const dungeon = this.availableDungeons[index];\r\n const success = this.idleGameManager.selectDungeon(dungeon.id);\r\n if (success) {\r\n this.router.navigate({\r\n type: 'travel',\r\n targetRoomId: dungeon.id,\r\n phase: 'traveling_to_dungeon'\r\n });\r\n this.ui.addEventLog(`Traveling to ${dungeon.name}...`);\r\n } else {\r\n this.ui.addEventLog('Cannot travel to that dungeon.');\r\n }\r\n } else {\r\n this.ui.addEventLog(`Invalid selection. Use 1-${this.availableDungeons.length}`);\r\n }\r\n this.dungeonSelectionMode = false;\r\n }\r\n\r\n /**\r\n * Handle room selection from map\r\n */\r\n private handleMapRoomSelection(num: number): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState || idleState.phase !== 'in_town') {\r\n return;\r\n }\r\n\r\n // Get current room's connections\r\n const gameState = adaptIdleGameStateToGameState(idleState);\r\n const connections = gameState.currentRoom.connections;\r\n const index = num - 1;\r\n\r\n if (index < 0 || index >= connections.length) {\r\n return; // Invalid selection\r\n }\r\n\r\n const roomId = connections[index];\r\n const targetRoom = gameState.currentMap.rooms.get(roomId);\r\n\r\n if (!targetRoom) {\r\n return;\r\n }\r\n\r\n // Check if it's a dungeon entrance\r\n if (targetRoom.type === 'dungeon_entrance') {\r\n // Extract dungeonId from room name (format: \"→ dungeonId\")\r\n const dungeonId = targetRoom.name.replace('→ ', '').trim();\r\n const success = this.idleGameManager.selectDungeon(dungeonId);\r\n if (success) {\r\n this.router.navigate({\r\n type: 'travel',\r\n targetRoomId: dungeonId,\r\n phase: 'traveling_to_dungeon'\r\n });\r\n this.ui.addEventLog(`Traveling to dungeon: ${dungeonId}...`);\r\n } else {\r\n this.ui.addEventLog(`Cannot travel to ${dungeonId}`);\r\n }\r\n return;\r\n }\r\n\r\n // Handle facility access\r\n const facilities = idleState.currentTown.facilities;\r\n if (index < facilities.length) {\r\n const facility = facilities[index];\r\n this.idleGameManager.useFacility(facility);\r\n this.ui.addEventLog(`Visiting ${facility.name}...`);\r\n }\r\n }\r\n\r\n /**\r\n * Cancel current travel and return to town\r\n */\r\n private cancelTravel(): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) return;\r\n\r\n if (idleState.phase === 'traveling_to_dungeon' || idleState.phase === 'returning_to_town') {\r\n // Cancel travel via IdleGameManager\r\n const success = this.idleGameManager.cancelTravel();\r\n if (success) {\r\n this.ui.exitTravelMode();\r\n this.ui.clearTravelState();\r\n this.router.navigate({ type: 'explore' });\r\n this.ui.addEventLog('Travel cancelled.');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Abort current dungeon and return to town\r\n */\r\n private abortDungeon(): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) return;\r\n\r\n if (idleState.phase === 'in_dungeon') {\r\n this.idleGameManager.abortDungeon();\r\n this.ui.exitDungeonMode();\r\n this.ui.addEventLog('Retreating from dungeon...');\r\n }\r\n }\r\n\r\n /**\r\n * Handle inventory command\r\n */\r\n private handleInventoryCommand(): void {\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n this.ui.addEventLog('─── Inventory ───');\r\n this.ui.addEventLog(`Gold: ${player.stats.gold}`);\r\n\r\n if (player.inventory.length === 0) {\r\n this.ui.addEventLog('(empty)');\r\n } else {\r\n for (const item of player.inventory.slice(0, 5)) {\r\n this.ui.addEventLog(`• ${item.name} x${item.quantity}`);\r\n }\r\n if (player.inventory.length > 5) {\r\n this.ui.addEventLog(`... and ${player.inventory.length - 5} more`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle character command\r\n */\r\n private handleCharacterCommand(): void {\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n const s = player.stats;\r\n this.ui.addEventLog(`─── ${player.name} ───`);\r\n this.ui.addEventLog(`Level ${s.level} | HP: ${s.hp}/${s.maxHp} | MP: ${s.mp}/${s.maxMp}`);\r\n this.ui.addEventLog(`ATK: ${s.attack} | DEF: ${s.defense} | SPD: ${s.speed}`);\r\n this.ui.addEventLog(`EXP: ${s.exp}/${s.expToNextLevel}`);\r\n }\r\n\r\n /**\r\n * Handle NPC command\r\n */\r\n private handleNPCCommand(): void {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) return;\r\n\r\n // In town, use town center room ID for NPC lookup\r\n const roomId = idleState.phase === 'in_town'\r\n ? `${idleState.currentTown.id}_center`\r\n : '';\r\n const npcs = this.npcManager.getByRoom(roomId);\r\n\r\n if (npcs.length === 0) {\r\n // Check for encounter NPCs on current floor (floor 1 for town)\r\n const floor = idleState.phase === 'in_dungeon' && idleState.dungeonRunner\r\n ? idleState.dungeonRunner.getState()?.currentLevel ?? 1\r\n : 1;\r\n const floorNPCs = this.npcManager.getByFloor(floor);\r\n if (floorNPCs.length === 0) {\r\n this.ui.addEventLog('No NPCs nearby.');\r\n } else {\r\n this.ui.addEventLog('No NPCs in this room, but others are on this floor.');\r\n }\r\n this.npcSelectionMode = false;\r\n return;\r\n }\r\n\r\n // Enter NPC selection mode\r\n this.npcSelectionMode = true;\r\n this.availableNPCs = npcs;\r\n\r\n this.ui.addEventLog('─── NPCs Here ───');\r\n npcs.forEach((npc, i) => {\r\n const relationship = npc.playerRelationship > 0 ? '♥' : npc.playerRelationship < 0 ? '✗' : '○';\r\n const met = npc.metPlayer ? '' : ' (new)';\r\n this.ui.addEventLog(` [${i + 1}] ${npc.name} (${npc.role}) ${relationship}${met}`);\r\n });\r\n this.ui.addEventLog('Type a number to talk, or any command to cancel.');\r\n }\r\n\r\n /**\r\n * Handle NPC selection (when in NPC selection mode)\r\n */\r\n private handleNPCSelection(num: number): void {\r\n const index = num - 1;\r\n\r\n if (index >= 0 && index < this.availableNPCs.length) {\r\n const npc = this.availableNPCs[index];\r\n this.npcSelectionMode = false;\r\n // Use DialogHandler for NPC dialog\r\n this.dialogHandler.startDialog(npc);\r\n } else {\r\n this.ui.addEventLog(`Invalid selection. Choose 1-${this.availableNPCs.length}`);\r\n }\r\n }\r\n\r\n /**\r\n * Start dialog with an NPC\r\n */\r\n private async startNPCDialog(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.generateNPCGreeting(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.handleDialogInput(input));\r\n\r\n // Render initial dialog screen\r\n this.renderDialogMode();\r\n }\r\n\r\n /**\r\n * Generate NPC greeting based on relationship and history\r\n */\r\n private generateNPCGreeting(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 // First meeting\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 private async handleDialogInput(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.acceptPendingQuest();\r\n return;\r\n } else if (lower === 'no' || lower === 'n' || lower === 'decline') {\r\n this.declinePendingQuest();\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.renderDialogMode();\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.buildDialogContext(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 (with built-in retry)\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 // Reset failure counter on success\r\n this.consecutiveAIFailures = 0;\r\n \r\n // Add NPC response to history\r\n this.dialogHistory.push({ role: 'npc', text: result.data });\r\n\r\n // Record interaction in NPC manager\r\n this.npcManager.recordInteraction(npc.id, trimmed, result.data);\r\n\r\n // Check for relationship changes based on keywords\r\n this.updateRelationshipFromDialog(npc, trimmed, result.data);\r\n } else {\r\n // AI failed after retries\r\n this.consecutiveAIFailures++;\r\n \r\n // Report dialog failure with context\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 // Use fallback response\r\n const fallback = this.getFallbackResponse(this.currentDialogNPC);\r\n this.dialogHistory.push({ role: 'npc', text: fallback });\r\n \r\n // Check if we've hit too many consecutive failures\r\n if (result.retriesExhausted && this.consecutiveAIFailures >= this.MAX_CONSECUTIVE_FAILURES) {\r\n await this.promptLoadLastSave();\r\n }\r\n }\r\n\r\n this.renderDialogMode();\r\n }\r\n\r\n /**\r\n * Build context for AI dialog\r\n */\r\n private buildDialogContext(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 updateRelationshipFromDialog(npc: ExtendedNPC, playerMessage: string, npcResponse: string): void {\r\n const lower = playerMessage.toLowerCase();\r\n \r\n // Positive keywords\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 // Negative keywords\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 private 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 // Check if NPC has available quests\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 // Store pending quest for acceptance\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(npc);\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.renderDialogMode();\r\n }\r\n\r\n private pendingQuest: Quest | null = null;\r\n private awaitingQuestResponse = false;\r\n\r\n /**\r\n * Accept a pending quest\r\n */\r\n private acceptPendingQuest(): 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 // Add to quest manager\r\n const success = this.questManager.acceptQuest(quest);\r\n\r\n if (success) {\r\n // Update NPC tracking\r\n if (!npc.givenQuests) npc.givenQuests = [];\r\n npc.givenQuests.push(quest.id);\r\n\r\n // Update relationship\r\n this.npcManager.updateRelationship(npc.id, 5);\r\n\r\n // Dialog response\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.ui.addEventLog(`✓ 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.renderDialogMode();\r\n }\r\n\r\n /**\r\n * Decline a pending quest\r\n */\r\n private declinePendingQuest(): void {\r\n if (!this.pendingQuest || !this.currentDialogNPC) return;\r\n\r\n const npc = this.currentDialogNPC;\r\n\r\n // Slight relationship decrease\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.renderDialogMode();\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 // Generate a simple quest based on NPC role\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, // 30 minutes in seconds\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 if (template) {\r\n return template();\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get location lore from NPC\r\n */\r\n private getLocationLore(npc: ExtendedNPC): 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 * Prompt user to load last save after multiple AI failures\r\n */\r\n private async promptLoadLastSave(): Promise<void> {\r\n // SENTRY ADD HERE - Report critical AI failure requiring save load prompt\r\n \r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('═══════════════════════════════════════');\r\n this.ui.addEventLog('⚠ AI connection issues detected.');\r\n this.ui.addEventLog('Multiple attempts have failed.');\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('Options:');\r\n this.ui.addEventLog(' [R] Retry connection');\r\n this.ui.addEventLog(' [L] Load last save');\r\n this.ui.addEventLog('═══════════════════════════════════════');\r\n \r\n // Wait for valid input\r\n while (true) {\r\n this.input.setMode('raw');\r\n const key = await this.input.waitForKey();\r\n const keyName = key.name.toLowerCase();\r\n \r\n if (keyName === 'r') {\r\n // Retry - reset counter and let user try again\r\n this.consecutiveAIFailures = 0;\r\n this.ui.addEventLog('Retrying connection...');\r\n break;\r\n } else if (keyName === 'l') {\r\n // Reset failure counter\r\n this.consecutiveAIFailures = 0;\r\n \r\n // End current dialog if active\r\n if (this.currentDialogNPC) {\r\n this.endDialog();\r\n }\r\n \r\n // Trigger load\r\n await this.handleLoadCommand();\r\n break;\r\n } else {\r\n // Invalid key, wait for valid input\r\n this.ui.addEventLog('Press [R] to retry or [L] to load save.');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get quick dialog options\r\n */\r\n private 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 mode\r\n */\r\n private renderDialogMode(): 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 private endDialog(): void {\r\n if (this.currentDialogNPC) {\r\n const farewell = this.generateFarewell(this.currentDialogNPC);\r\n this.ui.addEventLog(farewell);\r\n }\r\n\r\n this.currentDialogNPC = null;\r\n this.dialogHistory = [];\r\n this.pendingQuest = null;\r\n\r\n // Navigate back or to explore mode\r\n if (!this.router.back()) {\r\n this.router.navigate({ type: 'explore' });\r\n }\r\n // Resume dungeon if paused\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 /**\r\n * Handle quest command\r\n */\r\n private handleQuestCommand(): void {\r\n const quests = this.questManager.getActiveQuests();\r\n\r\n if (quests.length === 0) {\r\n this.ui.addEventLog('No active quests. Talk to NPCs to get quests.');\r\n return;\r\n }\r\n\r\n this.ui.addEventLog('─── Active Quests ───');\r\n for (const quest of quests) {\r\n const completed = quest.objectives.filter(o => o.isComplete).length;\r\n const total = quest.objectives.length;\r\n this.ui.addEventLog(`• ${quest.name} [${completed}/${total}]`);\r\n }\r\n }\r\n\r\n /**\r\n * Show help\r\n */\r\n private showHelp(): void {\r\n this.ui.addEventLog('─── Navigation ───');\r\n this.ui.addEventLog('Arrow keys: move between sections');\r\n this.ui.addEventLog('Enter: enter section | Esc: exit section');\r\n this.ui.addEventLog('─── Shortcuts ───');\r\n this.ui.addEventLog('[I]nv [C]har [Q]uest [W]ork [N]PC [H]elp');\r\n this.ui.addEventLog('[S]ave [L]oad | 1-9: quick travel');\r\n }\r\n\r\n /**\r\n * Handle save command\r\n */\r\n private async handleSaveCommand(): Promise<void> {\r\n const idleState = this.idleGameManager.getState();\r\n if (!idleState) {\r\n this.ui.addEventLog('✗ Failed to save game.');\r\n return;\r\n }\r\n\r\n // Create save data from IdleGameState\r\n const saveData: import('./core/types.js').SaveData = {\r\n version: '0.1.0',\r\n timestamp: Date.now(),\r\n player: idleState.player,\r\n currentMapId: idleState.currentTown.id,\r\n currentRoomId: `${idleState.currentTown.id}_center`,\r\n discoveredMaps: [idleState.currentTown.id],\r\n gameTime: idleState.statistics.totalPlayTime,\r\n settings: {\r\n language: 'en',\r\n autoSave: true,\r\n autoSaveInterval: 300,\r\n combatSpeed: 1,\r\n soundEnabled: false,\r\n },\r\n };\r\n\r\n // Also save NPC and quest state\r\n const npcSave = this.npcManager.save();\r\n const questSave = this.questManager.save();\r\n\r\n // Show save slots\r\n this.ui.addEventLog('─── Save Game ───');\r\n const slots = await listSaveSlots();\r\n\r\n for (const slot of slots) {\r\n if (slot.exists) {\r\n this.ui.addEventLog(` [${slot.slot}] ${slot.playerName} Lv.${slot.level} - ${formatTimestamp(slot.timestamp)}`);\r\n } else {\r\n this.ui.addEventLog(` [${slot.slot}] Empty`);\r\n }\r\n }\r\n\r\n this.ui.addEventLog('Type slot number (1-5) to save:');\r\n\r\n // Set up temporary command handler for slot selection\r\n this.pendingSaveData = { game: saveData, npcs: npcSave, quests: questSave };\r\n this.saveMode = true;\r\n }\r\n\r\n private pendingSaveData: { game: import('./core/types.js').SaveData; npcs: import('./npc/types.js').NPCSaveData; quests: import('./quest/types.js').QuestSaveData } | null = null;\r\n private saveMode = false;\r\n private loadMode = false;\r\n private workshopMode = false;\r\n private workshopSubMode: 'main' | 'view' | 'forge' | 'research' = 'main';\r\n\r\n /**\r\n * Complete save to slot\r\n */\r\n private async completeSave(slot: number): Promise<void> {\r\n if (!this.pendingSaveData) return;\r\n \r\n const result = await saveGame(\r\n slot,\r\n this.pendingSaveData.game,\r\n this.pendingSaveData.npcs,\r\n this.pendingSaveData.quests\r\n );\r\n\r\n if (result.success) {\r\n this.ui.addEventLog(`✓ Saved to slot ${slot}!`);\r\n this.ui.addEventLog(` Time played: ${formatPlayTime(this.pendingSaveData.game.gameTime)}`);\r\n } else {\r\n this.ui.addEventLog(`✗ Save failed: ${result.error}`);\r\n }\r\n\r\n this.pendingSaveData = null;\r\n this.saveMode = false;\r\n }\r\n\r\n /**\r\n * Handle load command\r\n */\r\n private async handleLoadCommand(): Promise<void> {\r\n this.ui.addEventLog('─── Load Game ───');\r\n const slots = await listSaveSlots();\r\n \r\n let hasAnySave = false;\r\n for (const slot of slots) {\r\n if (slot.exists) {\r\n hasAnySave = true;\r\n this.ui.addEventLog(` [${slot.slot}] ${slot.playerName} Lv.${slot.level} - ${formatPlayTime(slot.gameTime)}`);\r\n } else {\r\n this.ui.addEventLog(` [${slot.slot}] Empty`);\r\n }\r\n }\r\n\r\n if (!hasAnySave) {\r\n this.ui.addEventLog('No saved games found.');\r\n return;\r\n }\r\n \r\n this.ui.addEventLog('Type slot number (1-5) to load:');\r\n this.loadMode = true;\r\n }\r\n\r\n /**\r\n * Complete load from slot\r\n */\r\n private async completeLoad(slot: number): Promise<void> {\r\n const result = await loadGame(slot);\r\n\r\n if (result.success && result.data) {\r\n // Destroy current game state and reinitialize with loaded player\r\n this.idleGameManager.destroy();\r\n this.idleGameManager.initialize(result.data.game.player);\r\n\r\n // Load NPC and quest state\r\n this.npcManager.load(result.data.npcs);\r\n this.questManager.load(result.data.quests);\r\n\r\n this.ui.addEventLog(`✓ Loaded from slot ${slot}!`);\r\n this.ui.addEventLog(` Welcome back, ${result.data.game.player.name}!`);\r\n } else {\r\n this.ui.addEventLog(`✗ Load failed: ${result.error}`);\r\n }\r\n\r\n this.loadMode = false;\r\n }\r\n\r\n /**\r\n * Handle new game command - opens character creation wizard\r\n * Uses NewGameFlowManager for consistent flow handling\r\n */\r\n private handleNewGameCommand(): void {\r\n // Run the async flow without blocking\r\n this.runNewGameFlowFromMenu().catch((error) => {\r\n console.error('New game flow error:', error);\r\n // Safety fallback (try/finally in runNewGameFlowFromMenu should handle this)\r\n this.ui.resumeRendering();\r\n this.isInFullScreenMode = false;\r\n this.ui.addEventLog('New game cancelled.');\r\n });\r\n }\r\n\r\n /**\r\n * Run the New Game flow from the in-game menu\r\n * This destroys the current game and starts fresh\r\n */\r\n private async runNewGameFlowFromMenu(): Promise<void> {\r\n this.isInFullScreenMode = true;\r\n this.ui.pauseRendering(); // Stop GameUIAdapter refresh to prevent screen flicker\r\n\r\n try {\r\n const flowManager = new NewGameFlowManager(this.screen, this.input);\r\n const result = await flowManager.run();\r\n\r\n if (result.success && result.actor) {\r\n // Create team and reinitialize game\r\n const team = createTeamWithActor(result.actor, `${result.actor.name}'s Team`);\r\n const actors: Record<string, Actor> = { [result.actor.id]: result.actor };\r\n\r\n // Destroy old game and reinitialize\r\n this.idleGameManager.destroy();\r\n this.idleGameManager.initializeWithTeam(team, actors);\r\n\r\n // Resume normal game\r\n this.screen.clear();\r\n\r\n this.ui.addEventLog(`══════════════════════════════════════`);\r\n this.ui.addEventLog(` Welcome, ${result.actor.name} the ${result.actor.role}!`);\r\n this.ui.addEventLog(` Your adventure begins...`);\r\n this.ui.addEventLog(`══════════════════════════════════════`);\r\n } else {\r\n // Cancelled - return to current game\r\n this.ui.addEventLog('New game cancelled.');\r\n }\r\n } finally {\r\n this.ui.resumeRendering(); // Always restore GameUIAdapter refresh\r\n this.isInFullScreenMode = false;\r\n }\r\n }\r\n\r\n // =========================================================================\r\n // AFFIX WORKSHOP\r\n // =========================================================================\r\n\r\n /**\r\n * Handle workshop command\r\n */\r\n private handleWorkshopCommand(): void {\r\n this.workshopMode = true;\r\n this.workshopSubMode = 'main';\r\n this.showWorkshopMenu();\r\n }\r\n\r\n /**\r\n * Show workshop main menu\r\n */\r\n private showWorkshopMenu(): void {\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n const unlockedCount = player.unlockedAffixes.length;\r\n const registry = getAffixRegistry();\r\n const totalAffixes = registry.getAll().length;\r\n\r\n this.ui.addEventLog('════════ AFFIX WORKSHOP ════════');\r\n this.ui.addEventLog(`Affixes discovered: ${unlockedCount}/${totalAffixes}`);\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('[1] View Affixes - Browse your collection');\r\n this.ui.addEventLog('[2] Forge - Apply affixes to weapons');\r\n this.ui.addEventLog('[3] Research - Study unknown affixes');\r\n this.ui.addEventLog('[0] Exit Workshop');\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('Select an option:');\r\n }\r\n\r\n /**\r\n * Handle workshop input\r\n */\r\n private handleWorkshopInput(num: number): void {\r\n if (this.workshopSubMode === 'main') {\r\n switch (num) {\r\n case 0:\r\n this.exitWorkshop();\r\n break;\r\n case 1:\r\n this.showAffixCollection();\r\n break;\r\n case 2:\r\n this.showForgeMenu();\r\n break;\r\n case 3:\r\n this.showResearchMenu();\r\n break;\r\n default:\r\n this.ui.addEventLog('Invalid option.');\r\n }\r\n } else if (this.workshopSubMode === 'view') {\r\n this.handleViewAffixInput(num);\r\n } else if (this.workshopSubMode === 'forge') {\r\n this.handleForgeInput(num);\r\n } else if (this.workshopSubMode === 'research') {\r\n this.handleResearchInput(num);\r\n }\r\n }\r\n\r\n /**\r\n * Show affix collection\r\n */\r\n private showAffixCollection(): void {\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n this.workshopSubMode = 'view';\r\n const registry = getAffixRegistry();\r\n const allAffixes = registry.getAll();\r\n\r\n this.ui.addEventLog('────── Your Affixes ──────');\r\n \r\n // Group by type\r\n const prefixes = allAffixes.filter(a => a.type === 'prefix');\r\n const suffixes = allAffixes.filter(a => a.type === 'suffix');\r\n const legendaries = allAffixes.filter(a => a.type === 'legendary');\r\n\r\n const isUnlocked = (id: string) => player.unlockedAffixes.includes(id);\r\n const rarityColor = (r: string) => {\r\n const colors: Record<string, string> = {\r\n common: '◯', uncommon: '●', rare: '◆', epic: '★', legendary: '✦'\r\n };\r\n return colors[r] || '?';\r\n };\r\n\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('PREFIXES:');\r\n prefixes.slice(0, 4).forEach((a, i) => {\r\n const status = isUnlocked(a.id) ? `${rarityColor(a.rarity)} ${a.name}` : `? ???`;\r\n this.ui.addEventLog(` [${i + 1}] ${status}`);\r\n });\r\n\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('SUFFIXES:');\r\n suffixes.slice(0, 4).forEach((a, i) => {\r\n const status = isUnlocked(a.id) ? `${rarityColor(a.rarity)} ${a.name}` : `? ???`;\r\n this.ui.addEventLog(` [${i + 5}] ${status}`);\r\n });\r\n\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('LEGENDARY:');\r\n legendaries.slice(0, 3).forEach((a, i) => {\r\n const status = isUnlocked(a.id) ? `✦ ${a.name}` : `? ???`;\r\n this.ui.addEventLog(` [${i + 9}] ${status}`);\r\n });\r\n\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('[0] Back to Workshop');\r\n }\r\n\r\n /**\r\n * Handle view affix input\r\n */\r\n private handleViewAffixInput(num: number): void {\r\n if (num === 0) {\r\n this.workshopSubMode = 'main';\r\n this.showWorkshopMenu();\r\n return;\r\n }\r\n\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n const registry = getAffixRegistry();\r\n const allAffixes = registry.getAll();\r\n const prefixes = allAffixes.filter(a => a.type === 'prefix');\r\n const suffixes = allAffixes.filter(a => a.type === 'suffix');\r\n const legendaries = allAffixes.filter(a => a.type === 'legendary');\r\n\r\n let affix: AffixPlugin | undefined;\r\n if (num >= 1 && num <= 4) {\r\n affix = prefixes[num - 1];\r\n } else if (num >= 5 && num <= 8) {\r\n affix = suffixes[num - 5];\r\n } else if (num >= 9 && num <= 11) {\r\n affix = legendaries[num - 9];\r\n }\r\n\r\n if (affix && player.unlockedAffixes.includes(affix.id)) {\r\n this.showAffixDetails(affix);\r\n } else if (affix) {\r\n this.ui.addEventLog('This affix has not been discovered yet.');\r\n this.ui.addEventLog('Defeat enemies or complete quests to discover new affixes.');\r\n } else {\r\n this.ui.addEventLog('Invalid selection.');\r\n }\r\n }\r\n\r\n /**\r\n * Show affix details\r\n */\r\n private showAffixDetails(affix: AffixPlugin): void {\r\n const rarityLabels: Record<string, string> = {\r\n common: 'Common', uncommon: 'Uncommon', rare: 'Rare', epic: 'Epic', legendary: 'Legendary'\r\n };\r\n\r\n this.ui.addEventLog(`══════ ${affix.name} ══════`);\r\n this.ui.addEventLog(`Type: ${affix.type.toUpperCase()}`);\r\n this.ui.addEventLog(`Rarity: ${rarityLabels[affix.rarity]}`);\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog(affix.description);\r\n \r\n if (affix.statModifiers) {\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('Stats:');\r\n for (const [stat, value] of Object.entries(affix.statModifiers)) {\r\n if (value !== undefined && value !== 0) {\r\n const sign = value > 0 ? '+' : '';\r\n this.ui.addEventLog(` ${stat}: ${sign}${value}`);\r\n }\r\n }\r\n }\r\n\r\n if (affix.onHitEffects && affix.onHitEffects.length > 0) {\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('On Hit:');\r\n for (const effect of affix.onHitEffects) {\r\n const chance = effect.chance < 1 ? `${Math.round(effect.chance * 100)}% chance` : '';\r\n this.ui.addEventLog(` ${effect.type} ${effect.element || ''} ${effect.value} ${chance}`);\r\n }\r\n }\r\n\r\n if (affix.requiresLevel) {\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog(`Requires Level: ${affix.requiresLevel}`);\r\n }\r\n\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('[0] Back');\r\n }\r\n\r\n /**\r\n * Show forge menu\r\n */\r\n private showForgeMenu(): void {\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n this.workshopSubMode = 'forge';\r\n\r\n this.ui.addEventLog('────── Forge ──────');\r\n \r\n if (!player.equipment.weapon) {\r\n this.ui.addEventLog('You have no weapon equipped!');\r\n this.ui.addEventLog('Equip a weapon first to apply affixes.');\r\n } else {\r\n const weapon = player.equipment.weapon;\r\n this.ui.addEventLog(`Current Weapon: ${weapon.name}`);\r\n this.ui.addEventLog(`Attack: ${weapon.baseAttack} | Durability: ${weapon.durability}/${weapon.maxDurability}`);\r\n this.ui.addEventLog(`Affixes: ${weapon.affixes.length > 0 ? weapon.affixes.map(a => a.name).join(', ') : 'None'}`);\r\n this.ui.addEventLog('');\r\n \r\n if (player.unlockedAffixes.length === 0) {\r\n this.ui.addEventLog('You have no unlocked affixes to apply.');\r\n } else {\r\n this.ui.addEventLog('Available affixes to apply:');\r\n const registry = getAffixRegistry();\r\n player.unlockedAffixes.slice(0, 5).forEach((id, i) => {\r\n const affix = registry.get(id);\r\n if (affix) {\r\n this.ui.addEventLog(` [${i + 1}] ${affix.name} (${affix.rarity})`);\r\n }\r\n });\r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('(Forging costs gold based on rarity)');\r\n }\r\n }\r\n \r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('[0] Back to Workshop');\r\n }\r\n\r\n /**\r\n * Handle forge input\r\n */\r\n private handleForgeInput(num: number): void {\r\n if (num === 0) {\r\n this.workshopSubMode = 'main';\r\n this.showWorkshopMenu();\r\n return;\r\n }\r\n\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player || !player.equipment.weapon) {\r\n this.ui.addEventLog('No weapon to forge!');\r\n return;\r\n }\r\n\r\n const affixId = player.unlockedAffixes[num - 1];\r\n if (!affixId) {\r\n this.ui.addEventLog('Invalid selection.');\r\n return;\r\n }\r\n\r\n const registry = getAffixRegistry();\r\n const affix = registry.get(affixId);\r\n if (!affix) {\r\n this.ui.addEventLog('Affix not found.');\r\n return;\r\n }\r\n\r\n // Calculate cost\r\n const costByRarity: Record<string, number> = {\r\n common: 20, uncommon: 50, rare: 100, epic: 250, legendary: 500\r\n };\r\n const cost = costByRarity[affix.rarity] || 50;\r\n\r\n if (player.stats.gold < cost) {\r\n this.ui.addEventLog(`Not enough gold! Need ${cost}g, have ${player.stats.gold}g.`);\r\n return;\r\n }\r\n\r\n // Check if affix is compatible\r\n const existingAffixes = player.equipment.weapon.affixes;\r\n const hasConflict = existingAffixes.some(existing => \r\n affix.incompatibleWith?.includes(existing.definitionId) || \r\n registry.get(existing.definitionId)?.incompatibleWith?.includes(affix.id)\r\n );\r\n\r\n if (hasConflict) {\r\n this.ui.addEventLog('This affix conflicts with an existing one!');\r\n return;\r\n }\r\n\r\n // Apply affix\r\n player.stats.gold -= cost;\r\n player.equipment.weapon.affixes.push({\r\n definitionId: affix.id,\r\n name: affix.name,\r\n type: affix.type,\r\n rarity: affix.rarity,\r\n });\r\n\r\n this.ui.addEventLog(`✓ Applied \"${affix.name}\" to ${player.equipment.weapon.name}!`);\r\n this.ui.addEventLog(` Cost: ${cost}g | Remaining: ${player.stats.gold}g`);\r\n \r\n this.showForgeMenu();\r\n }\r\n\r\n /**\r\n * Show research menu\r\n */\r\n private showResearchMenu(): void {\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n this.workshopSubMode = 'research';\r\n\r\n const registry = getAffixRegistry();\r\n const allAffixes = registry.getAll();\r\n const locked = allAffixes.filter(a => !player.unlockedAffixes.includes(a.id));\r\n\r\n this.ui.addEventLog('────── Research ──────');\r\n this.ui.addEventLog('Study mysterious affixes to unlock them.');\r\n this.ui.addEventLog('');\r\n \r\n if (locked.length === 0) {\r\n this.ui.addEventLog('All affixes have been discovered!');\r\n } else {\r\n this.ui.addEventLog(`Unknown affixes: ${locked.length}`);\r\n this.ui.addEventLog('');\r\n \r\n // Show hints for a few random locked affixes\r\n const hints = locked.slice(0, 3);\r\n hints.forEach((a, i) => {\r\n const hint = this.getAffixHint(a);\r\n this.ui.addEventLog(` [${i + 1}] ${hint} (${a.rarity})`);\r\n });\r\n \r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('Research cost: 100g per attempt (50% success)');\r\n }\r\n \r\n this.ui.addEventLog('');\r\n this.ui.addEventLog('[0] Back to Workshop');\r\n }\r\n\r\n /**\r\n * Get a hint for an unknown affix\r\n */\r\n private getAffixHint(affix: AffixPlugin): string {\r\n // Provide vague hints based on type/effects\r\n if (affix.type === 'legendary') {\r\n return '??? (Legendary power)';\r\n }\r\n \r\n if (affix.onHitEffects?.some(e => e.element === 'fire')) {\r\n return '??? (Burns with flames)';\r\n }\r\n if (affix.onHitEffects?.some(e => e.element === 'ice')) {\r\n return '??? (Chills to the bone)';\r\n }\r\n if (affix.onHitEffects?.some(e => e.element === 'lightning')) {\r\n return '??? (Crackles with energy)';\r\n }\r\n if (affix.statModifiers?.attack && affix.statModifiers.attack > 10) {\r\n return '??? (Raw power)';\r\n }\r\n if (affix.statModifiers?.speed && affix.statModifiers.speed > 0) {\r\n return '??? (Swift as wind)';\r\n }\r\n \r\n return '??? (Unknown properties)';\r\n }\r\n\r\n /**\r\n * Handle research input\r\n */\r\n private handleResearchInput(num: number): void {\r\n if (num === 0) {\r\n this.workshopSubMode = 'main';\r\n this.showWorkshopMenu();\r\n return;\r\n }\r\n\r\n const player = this.idleGameManager.getState()?.player;\r\n if (!player) return;\r\n\r\n const registry = getAffixRegistry();\r\n const allAffixes = registry.getAll();\r\n const locked = allAffixes.filter(a => !player.unlockedAffixes.includes(a.id));\r\n\r\n const targetAffix = locked[num - 1];\r\n if (!targetAffix) {\r\n this.ui.addEventLog('Invalid selection.');\r\n return;\r\n }\r\n\r\n const cost = 100;\r\n if (player.stats.gold < cost) {\r\n this.ui.addEventLog(`Not enough gold! Need ${cost}g, have ${player.stats.gold}g.`);\r\n return;\r\n }\r\n\r\n player.stats.gold -= cost;\r\n\r\n // 50% success chance (increased by higher rarity being harder)\r\n const rarityBonus: Record<string, number> = {\r\n common: 0.3, uncommon: 0.2, rare: 0.1, epic: 0, legendary: -0.2\r\n };\r\n const successChance = 0.5 + (rarityBonus[targetAffix.rarity] || 0);\r\n const success = Math.random() < successChance;\r\n\r\n if (success) {\r\n player.unlockedAffixes.push(targetAffix.id);\r\n this.ui.addEventLog(`✓ Research successful!`);\r\n this.ui.addEventLog(` Discovered: ${targetAffix.name}`);\r\n this.ui.addEventLog(` \"${targetAffix.description}\"`);\r\n } else {\r\n this.ui.addEventLog('✗ Research failed...');\r\n this.ui.addEventLog(' The affix remains mysterious.');\r\n this.ui.addEventLog(' Try again or seek clues in the dungeon.');\r\n }\r\n\r\n this.ui.addEventLog(` Gold spent: ${cost}g | Remaining: ${player.stats.gold}g`);\r\n }\r\n\r\n /**\r\n * Exit workshop\r\n */\r\n private exitWorkshop(): void {\r\n this.workshopMode = false;\r\n this.workshopSubMode = 'main';\r\n this.ui.addEventLog('Leaving the Workshop...');\r\n }\r\n\r\n\r\n // =========================================================================\r\n // EVENT HANDLERS\r\n // =========================================================================\r\n\r\n private onTick(): void {\r\n // Tick handling done in main loop\r\n }\r\n\r\n private onTravelStarted(data: unknown): void {\r\n const travel = data as { duration: number };\r\n this.ui.addEventLog(`Setting out... (${travel.duration}s)`);\r\n // Route change handled via onIdlePhaseChange callback\r\n }\r\n\r\n private onTravelArrived(data: unknown): void {\r\n const { room } = data as { room: { name: string; description: string } };\r\n this.ui.addEventLog(`Arrived at: ${room.name}`);\r\n this.ui.addEventLog(room.description);\r\n this.router.navigate({ type: 'explore' });\r\n\r\n // Check for random NPC encounter\r\n if (Math.random() < 0.3) {\r\n const idleState = this.idleGameManager.getState();\r\n if (idleState) {\r\n const floor = idleState.phase === 'in_dungeon' && idleState.dungeonRunner\r\n ? idleState.dungeonRunner.getState()?.currentLevel ?? 1\r\n : 1;\r\n const npc = getNPCGenerator().generate({ floor });\r\n this.ui.addEventLog(`You encounter ${npc.name}, a ${npc.race} ${npc.role}.`);\r\n }\r\n }\r\n }\r\n\r\n private onCombatStarted(data: unknown): void {\r\n this.ui.addEventLog('== Combat started! ==');\r\n this.router.navigate({ type: 'combat', encounterId: 'current' });\r\n }\r\n\r\n private onCombatTick(data: unknown): void {\r\n // Handled by render\r\n }\r\n\r\n private onCombatVictory(data: unknown): void {\r\n const { rewards } = data as { rewards: { exp: number; gold: number } };\r\n this.ui.addEventLog('Victory!');\r\n this.ui.addEventLog(`Gained ${rewards.exp} EXP, ${rewards.gold} gold`);\r\n this.router.navigate({ type: 'explore' });\r\n\r\n // Update quest progress - use adapted state for combat info\r\n const idleState = this.idleGameManager.getState();\r\n if (idleState?.dungeonRunner) {\r\n const runnerState = idleState.dungeonRunner.getState();\r\n if (runnerState?.activeCombat) {\r\n for (const enemy of runnerState.activeCombat.enemies) {\r\n this.questManager.updateProgress('kill', enemy.id);\r\n this.questManager.updateProgress('kill', `enemy_${enemy.name.toLowerCase().replace(/\\s/g, '_')}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private onCombatDefeat(): void {\r\n this.ui.addEventLog('You have been defeated...');\r\n }\r\n\r\n private onPlayerRespawn(data: unknown): void {\r\n const { room } = data as { room: { name: string } };\r\n this.ui.addEventLog('═══ RESPAWNING ═══');\r\n this.ui.addEventLog(`You wake up at ${room.name}, fully healed.`);\r\n this.ui.addEventLog('Your adventure continues...');\r\n this.router.navigate({ type: 'explore' });\r\n }\r\n\r\n private onNewEvent(data: unknown): void {\r\n const event = data as { title: string; description: string };\r\n this.ui.addEventLog(`${event.title}: ${event.description}`);\r\n }\r\n\r\n // =========================================================================\r\n // UTILITIES\r\n // =========================================================================\r\n\r\n private sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n private cleanup(): void {\r\n this.isRunning = false;\r\n this.idleGameManager.destroy();\r\n this.ui.cleanup();\r\n // Exit alternate screen buffer to restore terminal history\r\n this.screen.exitAlternateScreen();\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// ENTRY POINT\r\n// ============================================================================\r\n\r\nconst app = new IdleRPGTerminal();\r\napp.start().catch((error) => {\r\n console.error('Fatal error:', error);\r\n process.exit(1);\r\n});\r\n"],"names":[],"mappings":"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","debug_id":"bfa08172-04b0-56af-9640-104baeb3ae89"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continent Manager - Manages world map hierarchy
|
|
3
|
+
* Handles continents, towns, and dungeon access
|
|
4
|
+
*/
|
|
5
|
+
import type { Continent, Town, Dungeon, TownConnection, CurrentLocation, WorldState } from '../core/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Manager for world map hierarchy
|
|
8
|
+
*/
|
|
9
|
+
export declare class ContinentManager {
|
|
10
|
+
private continents;
|
|
11
|
+
private towns;
|
|
12
|
+
private dungeons;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Load a continent into the manager
|
|
16
|
+
*/
|
|
17
|
+
loadContinent(continent: Continent): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get a continent by ID
|
|
20
|
+
*/
|
|
21
|
+
getContinent(id: string): Continent | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Get a town by ID
|
|
24
|
+
*/
|
|
25
|
+
getTown(id: string): Town | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Get a dungeon by ID
|
|
28
|
+
*/
|
|
29
|
+
getDungeon(id: string): Dungeon | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Get all continents
|
|
32
|
+
*/
|
|
33
|
+
getAllContinents(): Continent[];
|
|
34
|
+
/**
|
|
35
|
+
* Get all towns in a continent
|
|
36
|
+
*/
|
|
37
|
+
getTownsInContinent(continentId: string): Town[];
|
|
38
|
+
/**
|
|
39
|
+
* Get all dungeons in a continent
|
|
40
|
+
*/
|
|
41
|
+
getDungeonsInContinent(continentId: string): Dungeon[];
|
|
42
|
+
/**
|
|
43
|
+
* Get dungeons accessible from a town
|
|
44
|
+
*/
|
|
45
|
+
getDungeonsFromTown(townId: string): Dungeon[];
|
|
46
|
+
/**
|
|
47
|
+
* Get connected towns from a town
|
|
48
|
+
*/
|
|
49
|
+
getConnectedTowns(townId: string): Array<{
|
|
50
|
+
town: Town;
|
|
51
|
+
connection: TownConnection;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Calculate travel time between two towns
|
|
55
|
+
*/
|
|
56
|
+
calculateTownTravelTime(fromTownId: string, toTownId: string): number | null;
|
|
57
|
+
/**
|
|
58
|
+
* Calculate travel time from town to dungeon
|
|
59
|
+
*/
|
|
60
|
+
calculateDungeonTravelTime(townId: string, dungeonId: string): number | null;
|
|
61
|
+
/**
|
|
62
|
+
* Get the starting location for a new game
|
|
63
|
+
*/
|
|
64
|
+
getStartingLocation(): CurrentLocation | null;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a location is unlocked for a player
|
|
67
|
+
*/
|
|
68
|
+
isLocationUnlocked(location: CurrentLocation, worldState: WorldState, playerLevel: number): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Get available destinations from current location
|
|
71
|
+
*/
|
|
72
|
+
getAvailableDestinations(currentLocation: CurrentLocation, worldState: WorldState, playerLevel: number): Array<{
|
|
73
|
+
type: 'town' | 'dungeon';
|
|
74
|
+
id: string;
|
|
75
|
+
name: string;
|
|
76
|
+
travelTime: number;
|
|
77
|
+
}>;
|
|
78
|
+
/**
|
|
79
|
+
* Get the nearest town to a dungeon
|
|
80
|
+
*/
|
|
81
|
+
getNearestTown(dungeonId: string): Town | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Get formatted location name
|
|
84
|
+
*/
|
|
85
|
+
getLocationName(location: CurrentLocation): string;
|
|
86
|
+
}
|
|
87
|
+
export declare function getContinentManager(): ContinentManager;
|
|
88
|
+
//# sourceMappingURL=ContinentManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContinentManager.d.ts","sourceRoot":"/","sources":["map/ContinentManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,IAAI,EACJ,OAAO,EACP,cAAc,EACd,eAAe,EACf,UAAU,EACX,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,QAAQ,CAAmC;;IAInD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAYzC;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI/C;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIrC;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C;;OAEG;IACH,gBAAgB,IAAI,SAAS,EAAE;IAI/B;;OAEG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE;IAKhD;;OAEG;IACH,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE;IAKtD;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE;IAS9C;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,UAAU,EAAE,cAAc,CAAA;KAAE,CAAC;IAYpF;;OAEG;IACH,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ5E;;OAEG;IACH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU5E;;OAEG;IACH,mBAAmB,IAAI,eAAe,GAAG,IAAI;IAgB7C;;OAEG;IACH,kBAAkB,CAChB,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO;IAgCV;;OAEG;IACH,wBAAwB,CACtB,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAClB,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA4CpF;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAMnD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;CAcnD;AAKD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD"}
|