idlerpg.sh 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -0
- package/dist/affix/AffixRegistry.d.ts +68 -0
- package/dist/affix/AffixRegistry.d.ts.map +1 -0
- package/dist/affix/AffixRegistry.js +245 -0
- package/dist/affix/AffixRegistry.js.map +1 -0
- package/dist/affix/PluginLoader.d.ts +66 -0
- package/dist/affix/PluginLoader.d.ts.map +1 -0
- package/dist/affix/PluginLoader.js +321 -0
- package/dist/affix/PluginLoader.js.map +1 -0
- package/dist/affix/builtin.d.ts +6 -0
- package/dist/affix/builtin.d.ts.map +1 -0
- package/dist/affix/builtin.js +311 -0
- package/dist/affix/builtin.js.map +1 -0
- package/dist/affix/index.d.ts +8 -0
- package/dist/affix/index.d.ts.map +1 -0
- package/dist/affix/index.js +11 -0
- package/dist/affix/index.js.map +1 -0
- package/dist/affix/types.d.ts +152 -0
- package/dist/affix/types.d.ts.map +1 -0
- package/dist/affix/types.js +8 -0
- package/dist/affix/types.js.map +1 -0
- package/dist/ai/PlayKitClient.d.ts +208 -0
- package/dist/ai/PlayKitClient.d.ts.map +1 -0
- package/dist/ai/PlayKitClient.js +721 -0
- package/dist/ai/PlayKitClient.js.map +1 -0
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +8 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/app/App.d.ts +85 -0
- package/dist/app/App.d.ts.map +1 -0
- package/dist/app/App.js +296 -0
- package/dist/app/App.js.map +1 -0
- package/dist/app/EventBus.d.ts +222 -0
- package/dist/app/EventBus.d.ts.map +1 -0
- package/dist/app/EventBus.js +88 -0
- package/dist/app/EventBus.js.map +1 -0
- package/dist/app/Keybind.d.ts +83 -0
- package/dist/app/Keybind.d.ts.map +1 -0
- package/dist/app/Keybind.js +184 -0
- package/dist/app/Keybind.js.map +1 -0
- package/dist/app/Router.d.ts +123 -0
- package/dist/app/Router.d.ts.map +1 -0
- package/dist/app/Router.js +142 -0
- package/dist/app/Router.js.map +1 -0
- package/dist/app/ScreenManager.d.ts +97 -0
- package/dist/app/ScreenManager.d.ts.map +1 -0
- package/dist/app/ScreenManager.js +216 -0
- package/dist/app/ScreenManager.js.map +1 -0
- package/dist/app/index.d.ts +14 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +19 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/screens/BaseScreen.d.ts +101 -0
- package/dist/app/screens/BaseScreen.d.ts.map +1 -0
- package/dist/app/screens/BaseScreen.js +132 -0
- package/dist/app/screens/BaseScreen.js.map +1 -0
- package/dist/app/screens/CharacterCreationScreen.d.ts +42 -0
- package/dist/app/screens/CharacterCreationScreen.d.ts.map +1 -0
- package/dist/app/screens/CharacterCreationScreen.js +467 -0
- package/dist/app/screens/CharacterCreationScreen.js.map +1 -0
- package/dist/app/screens/CombatScreen.d.ts +30 -0
- package/dist/app/screens/CombatScreen.d.ts.map +1 -0
- package/dist/app/screens/CombatScreen.js +309 -0
- package/dist/app/screens/CombatScreen.js.map +1 -0
- package/dist/app/screens/DialogScreen.d.ts +29 -0
- package/dist/app/screens/DialogScreen.d.ts.map +1 -0
- package/dist/app/screens/DialogScreen.js +295 -0
- package/dist/app/screens/DialogScreen.js.map +1 -0
- package/dist/app/screens/ExploreScreen.d.ts +50 -0
- package/dist/app/screens/ExploreScreen.d.ts.map +1 -0
- package/dist/app/screens/ExploreScreen.js +308 -0
- package/dist/app/screens/ExploreScreen.js.map +1 -0
- package/dist/app/screens/HelpScreen.d.ts +12 -0
- package/dist/app/screens/HelpScreen.d.ts.map +1 -0
- package/dist/app/screens/HelpScreen.js +155 -0
- package/dist/app/screens/HelpScreen.js.map +1 -0
- package/dist/app/screens/InventoryScreen.d.ts +27 -0
- package/dist/app/screens/InventoryScreen.d.ts.map +1 -0
- package/dist/app/screens/InventoryScreen.js +326 -0
- package/dist/app/screens/InventoryScreen.js.map +1 -0
- package/dist/app/screens/PrologueScreen.d.ts +24 -0
- package/dist/app/screens/PrologueScreen.d.ts.map +1 -0
- package/dist/app/screens/PrologueScreen.js +176 -0
- package/dist/app/screens/PrologueScreen.js.map +1 -0
- package/dist/app/screens/TitleScreen.d.ts +42 -0
- package/dist/app/screens/TitleScreen.d.ts.map +1 -0
- package/dist/app/screens/TitleScreen.js +380 -0
- package/dist/app/screens/TitleScreen.js.map +1 -0
- package/dist/app/screens/TravelScreen.d.ts +22 -0
- package/dist/app/screens/TravelScreen.d.ts.map +1 -0
- package/dist/app/screens/TravelScreen.js +122 -0
- package/dist/app/screens/TravelScreen.js.map +1 -0
- package/dist/app/screens/index.d.ts +14 -0
- package/dist/app/screens/index.d.ts.map +1 -0
- package/dist/app/screens/index.js +17 -0
- package/dist/app/screens/index.js.map +1 -0
- package/dist/commands/CommandRegistry.d.ts +91 -0
- package/dist/commands/CommandRegistry.d.ts.map +1 -0
- package/dist/commands/CommandRegistry.js +159 -0
- package/dist/commands/CommandRegistry.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/core/Actor.d.ts +103 -0
- package/dist/core/Actor.d.ts.map +1 -0
- package/dist/core/Actor.js +409 -0
- package/dist/core/Actor.js.map +1 -0
- package/dist/core/Combat.d.ts +37 -0
- package/dist/core/Combat.d.ts.map +1 -0
- package/dist/core/Combat.js +294 -0
- package/dist/core/Combat.js.map +1 -0
- package/dist/core/DungeonRunner.d.ts +169 -0
- package/dist/core/DungeonRunner.d.ts.map +1 -0
- package/dist/core/DungeonRunner.js +627 -0
- package/dist/core/DungeonRunner.js.map +1 -0
- package/dist/core/Game.d.ts +133 -0
- package/dist/core/Game.d.ts.map +1 -0
- package/dist/core/Game.js +644 -0
- package/dist/core/Game.js.map +1 -0
- package/dist/core/IdleCombat.d.ts +61 -0
- package/dist/core/IdleCombat.d.ts.map +1 -0
- package/dist/core/IdleCombat.js +461 -0
- package/dist/core/IdleCombat.js.map +1 -0
- package/dist/core/IdleGameManager.d.ts +198 -0
- package/dist/core/IdleGameManager.d.ts.map +1 -0
- package/dist/core/IdleGameManager.js +688 -0
- package/dist/core/IdleGameManager.js.map +1 -0
- package/dist/core/IdleSaveManager.d.ts +109 -0
- package/dist/core/IdleSaveManager.d.ts.map +1 -0
- package/dist/core/IdleSaveManager.js +296 -0
- package/dist/core/IdleSaveManager.js.map +1 -0
- package/dist/core/NewGameFlowManager.d.ts +64 -0
- package/dist/core/NewGameFlowManager.d.ts.map +1 -0
- package/dist/core/NewGameFlowManager.js +153 -0
- package/dist/core/NewGameFlowManager.js.map +1 -0
- package/dist/core/Player.d.ts +65 -0
- package/dist/core/Player.d.ts.map +1 -0
- package/dist/core/Player.js +261 -0
- package/dist/core/Player.js.map +1 -0
- package/dist/core/RoomHandlers.d.ts +75 -0
- package/dist/core/RoomHandlers.d.ts.map +1 -0
- package/dist/core/RoomHandlers.js +383 -0
- package/dist/core/RoomHandlers.js.map +1 -0
- package/dist/core/SaveManager.d.ts +84 -0
- package/dist/core/SaveManager.d.ts.map +1 -0
- package/dist/core/SaveManager.js +281 -0
- package/dist/core/SaveManager.js.map +1 -0
- package/dist/core/SaveMigration.d.ts +69 -0
- package/dist/core/SaveMigration.d.ts.map +1 -0
- package/dist/core/SaveMigration.js +408 -0
- package/dist/core/SaveMigration.js.map +1 -0
- package/dist/core/StateAdapter.d.ts +79 -0
- package/dist/core/StateAdapter.d.ts.map +1 -0
- package/dist/core/StateAdapter.js +397 -0
- package/dist/core/StateAdapter.js.map +1 -0
- package/dist/core/Team.d.ts +145 -0
- package/dist/core/Team.d.ts.map +1 -0
- package/dist/core/Team.js +371 -0
- package/dist/core/Team.js.map +1 -0
- package/dist/core/TeamCombat.d.ts +88 -0
- package/dist/core/TeamCombat.d.ts.map +1 -0
- package/dist/core/TeamCombat.js +405 -0
- package/dist/core/TeamCombat.js.map +1 -0
- package/dist/core/TeamDungeonRunner.d.ts +186 -0
- package/dist/core/TeamDungeonRunner.d.ts.map +1 -0
- package/dist/core/TeamDungeonRunner.js +758 -0
- package/dist/core/TeamDungeonRunner.js.map +1 -0
- package/dist/core/TimeManager.d.ts +114 -0
- package/dist/core/TimeManager.d.ts.map +1 -0
- package/dist/core/TimeManager.js +318 -0
- package/dist/core/TimeManager.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/timeConstants.d.ts +135 -0
- package/dist/core/timeConstants.d.ts.map +1 -0
- package/dist/core/timeConstants.js +157 -0
- package/dist/core/timeConstants.js.map +1 -0
- package/dist/core/types.d.ts +780 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +16 -0
- package/dist/core/types.js.map +1 -0
- package/dist/data/continents/index.d.ts +163 -0
- package/dist/data/continents/index.d.ts.map +1 -0
- package/dist/data/continents/index.js +31 -0
- package/dist/data/continents/index.js.map +1 -0
- package/dist/data/continents/verdantia.d.ts +294 -0
- package/dist/data/continents/verdantia.d.ts.map +1 -0
- package/dist/data/continents/verdantia.js +327 -0
- package/dist/data/continents/verdantia.js.map +1 -0
- package/dist/handlers/DialogHandler.d.ts +95 -0
- package/dist/handlers/DialogHandler.d.ts.map +1 -0
- package/dist/handlers/DialogHandler.js +450 -0
- package/dist/handlers/DialogHandler.js.map +1 -0
- package/dist/handlers/SaveLoadHandler.d.ts +60 -0
- package/dist/handlers/SaveLoadHandler.d.ts.map +1 -0
- package/dist/handlers/SaveLoadHandler.js +187 -0
- package/dist/handlers/SaveLoadHandler.js.map +1 -0
- package/dist/handlers/TitleScreenHandler.d.ts +43 -0
- package/dist/handlers/TitleScreenHandler.d.ts.map +1 -0
- package/dist/handlers/TitleScreenHandler.js +508 -0
- package/dist/handlers/TitleScreenHandler.js.map +1 -0
- package/dist/handlers/WorkshopHandler.d.ts +75 -0
- package/dist/handlers/WorkshopHandler.d.ts.map +1 -0
- package/dist/handlers/WorkshopHandler.js +401 -0
- package/dist/handlers/WorkshopHandler.js.map +1 -0
- package/dist/handlers/index.d.ts +12 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +14 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/types.d.ts +34 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +8 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +130 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +40 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +105 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +133 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +3 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +130 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/instrument.d.ts +8 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +33 -0
- package/dist/instrument.js.map +1 -0
- package/dist/main-new.d.ts +12 -0
- package/dist/main-new.d.ts.map +1 -0
- package/dist/main-new.js +32 -0
- package/dist/main-new.js.map +1 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +2816 -0
- package/dist/main.js.map +1 -0
- package/dist/map/ContinentManager.d.ts +88 -0
- package/dist/map/ContinentManager.d.ts.map +1 -0
- package/dist/map/ContinentManager.js +241 -0
- package/dist/map/ContinentManager.js.map +1 -0
- package/dist/map/DungeonGenerator.d.ts +32 -0
- package/dist/map/DungeonGenerator.d.ts.map +1 -0
- package/dist/map/DungeonGenerator.js +615 -0
- package/dist/map/DungeonGenerator.js.map +1 -0
- package/dist/map/MapGenerator.d.ts +27 -0
- package/dist/map/MapGenerator.d.ts.map +1 -0
- package/dist/map/MapGenerator.js +485 -0
- package/dist/map/MapGenerator.js.map +1 -0
- package/dist/map/index.d.ts +5 -0
- package/dist/map/index.d.ts.map +1 -0
- package/dist/map/index.js +8 -0
- package/dist/map/index.js.map +1 -0
- package/dist/npc/NPCGenerator.d.ts +68 -0
- package/dist/npc/NPCGenerator.d.ts.map +1 -0
- package/dist/npc/NPCGenerator.js +468 -0
- package/dist/npc/NPCGenerator.js.map +1 -0
- package/dist/npc/NPCManager.d.ts +86 -0
- package/dist/npc/NPCManager.d.ts.map +1 -0
- package/dist/npc/NPCManager.js +217 -0
- package/dist/npc/NPCManager.js.map +1 -0
- package/dist/npc/fixedNPCs.d.ts +7 -0
- package/dist/npc/fixedNPCs.d.ts.map +1 -0
- package/dist/npc/fixedNPCs.js +196 -0
- package/dist/npc/fixedNPCs.js.map +1 -0
- package/dist/npc/index.d.ts +9 -0
- package/dist/npc/index.d.ts.map +1 -0
- package/dist/npc/index.js +12 -0
- package/dist/npc/index.js.map +1 -0
- package/dist/npc/traits.d.ts +33 -0
- package/dist/npc/traits.d.ts.map +1 -0
- package/dist/npc/traits.js +795 -0
- package/dist/npc/traits.js.map +1 -0
- package/dist/npc/types.d.ts +193 -0
- package/dist/npc/types.d.ts.map +1 -0
- package/dist/npc/types.js +9 -0
- package/dist/npc/types.js.map +1 -0
- package/dist/quest/QuestManager.d.ts +79 -0
- package/dist/quest/QuestManager.d.ts.map +1 -0
- package/dist/quest/QuestManager.js +273 -0
- package/dist/quest/QuestManager.js.map +1 -0
- package/dist/quest/index.d.ts +6 -0
- package/dist/quest/index.d.ts.map +1 -0
- package/dist/quest/index.js +9 -0
- package/dist/quest/index.js.map +1 -0
- package/dist/quest/types.d.ts +81 -0
- package/dist/quest/types.d.ts.map +1 -0
- package/dist/quest/types.js +8 -0
- package/dist/quest/types.js.map +1 -0
- package/dist/strategy/StrategyExecutor.d.ts +159 -0
- package/dist/strategy/StrategyExecutor.d.ts.map +1 -0
- package/dist/strategy/StrategyExecutor.js +479 -0
- package/dist/strategy/StrategyExecutor.js.map +1 -0
- package/dist/strategy/StrategyParser.d.ts +48 -0
- package/dist/strategy/StrategyParser.d.ts.map +1 -0
- package/dist/strategy/StrategyParser.js +321 -0
- package/dist/strategy/StrategyParser.js.map +1 -0
- package/dist/strategy/defaultStrategy.d.ts +40 -0
- package/dist/strategy/defaultStrategy.d.ts.map +1 -0
- package/dist/strategy/defaultStrategy.js +254 -0
- package/dist/strategy/defaultStrategy.js.map +1 -0
- package/dist/strategy/index.d.ts +8 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +14 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/tui/ExploreMenu.d.ts +106 -0
- package/dist/tui/ExploreMenu.d.ts.map +1 -0
- package/dist/tui/ExploreMenu.js +282 -0
- package/dist/tui/ExploreMenu.js.map +1 -0
- package/dist/tui/GameUI.d.ts +313 -0
- package/dist/tui/GameUI.d.ts.map +1 -0
- package/dist/tui/GameUI.js +2116 -0
- package/dist/tui/GameUI.js.map +1 -0
- package/dist/tui/GameUIAdapter.d.ts +207 -0
- package/dist/tui/GameUIAdapter.d.ts.map +1 -0
- package/dist/tui/GameUIAdapter.js +1342 -0
- package/dist/tui/GameUIAdapter.js.map +1 -0
- package/dist/tui/Input.d.ts +139 -0
- package/dist/tui/Input.d.ts.map +1 -0
- package/dist/tui/Input.js +278 -0
- package/dist/tui/Input.js.map +1 -0
- package/dist/tui/Menu.d.ts +110 -0
- package/dist/tui/Menu.d.ts.map +1 -0
- package/dist/tui/Menu.js +365 -0
- package/dist/tui/Menu.js.map +1 -0
- package/dist/tui/Screen.d.ts +228 -0
- package/dist/tui/Screen.d.ts.map +1 -0
- package/dist/tui/Screen.js +502 -0
- package/dist/tui/Screen.js.map +1 -0
- package/dist/tui/components/Box.d.ts +36 -0
- package/dist/tui/components/Box.d.ts.map +1 -0
- package/dist/tui/components/Box.js +43 -0
- package/dist/tui/components/Box.js.map +1 -0
- package/dist/tui/components/List.d.ts +69 -0
- package/dist/tui/components/List.d.ts.map +1 -0
- package/dist/tui/components/List.js +136 -0
- package/dist/tui/components/List.js.map +1 -0
- package/dist/tui/components/ProgressBar.d.ts +42 -0
- package/dist/tui/components/ProgressBar.d.ts.map +1 -0
- package/dist/tui/components/ProgressBar.js +75 -0
- package/dist/tui/components/ProgressBar.js.map +1 -0
- package/dist/tui/components/index.d.ts +8 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +11 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/core/BaseSection.d.ts +98 -0
- package/dist/tui/core/BaseSection.d.ts.map +1 -0
- package/dist/tui/core/BaseSection.js +174 -0
- package/dist/tui/core/BaseSection.js.map +1 -0
- package/dist/tui/core/Component.d.ts +61 -0
- package/dist/tui/core/Component.d.ts.map +1 -0
- package/dist/tui/core/Component.js +32 -0
- package/dist/tui/core/Component.js.map +1 -0
- package/dist/tui/core/Section.d.ts +101 -0
- package/dist/tui/core/Section.d.ts.map +1 -0
- package/dist/tui/core/Section.js +24 -0
- package/dist/tui/core/Section.js.map +1 -0
- package/dist/tui/core/SectionManager.d.ts +108 -0
- package/dist/tui/core/SectionManager.d.ts.map +1 -0
- package/dist/tui/core/SectionManager.js +258 -0
- package/dist/tui/core/SectionManager.js.map +1 -0
- package/dist/tui/core/index.d.ts +9 -0
- package/dist/tui/core/index.d.ts.map +1 -0
- package/dist/tui/core/index.js +12 -0
- package/dist/tui/core/index.js.map +1 -0
- package/dist/tui/index.d.ts +15 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +23 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/screens/BaseScreen.d.ts +62 -0
- package/dist/tui/screens/BaseScreen.d.ts.map +1 -0
- package/dist/tui/screens/BaseScreen.js +55 -0
- package/dist/tui/screens/BaseScreen.js.map +1 -0
- package/dist/tui/screens/CombatScreen.d.ts +43 -0
- package/dist/tui/screens/CombatScreen.d.ts.map +1 -0
- package/dist/tui/screens/CombatScreen.js +125 -0
- package/dist/tui/screens/CombatScreen.js.map +1 -0
- package/dist/tui/screens/DialogScreen.d.ts +53 -0
- package/dist/tui/screens/DialogScreen.d.ts.map +1 -0
- package/dist/tui/screens/DialogScreen.js +90 -0
- package/dist/tui/screens/DialogScreen.js.map +1 -0
- package/dist/tui/screens/DungeonScreen.d.ts +80 -0
- package/dist/tui/screens/DungeonScreen.d.ts.map +1 -0
- package/dist/tui/screens/DungeonScreen.js +317 -0
- package/dist/tui/screens/DungeonScreen.js.map +1 -0
- package/dist/tui/screens/ExploreScreen.d.ts +69 -0
- package/dist/tui/screens/ExploreScreen.d.ts.map +1 -0
- package/dist/tui/screens/ExploreScreen.js +224 -0
- package/dist/tui/screens/ExploreScreen.js.map +1 -0
- package/dist/tui/screens/SectionScreen.d.ts +84 -0
- package/dist/tui/screens/SectionScreen.d.ts.map +1 -0
- package/dist/tui/screens/SectionScreen.js +156 -0
- package/dist/tui/screens/SectionScreen.js.map +1 -0
- package/dist/tui/screens/TitleScreen.d.ts +40 -0
- package/dist/tui/screens/TitleScreen.d.ts.map +1 -0
- package/dist/tui/screens/TitleScreen.js +253 -0
- package/dist/tui/screens/TitleScreen.js.map +1 -0
- package/dist/tui/screens/TownScreen.d.ts +98 -0
- package/dist/tui/screens/TownScreen.d.ts.map +1 -0
- package/dist/tui/screens/TownScreen.js +370 -0
- package/dist/tui/screens/TownScreen.js.map +1 -0
- package/dist/tui/screens/TravelScreen.d.ts +67 -0
- package/dist/tui/screens/TravelScreen.d.ts.map +1 -0
- package/dist/tui/screens/TravelScreen.js +286 -0
- package/dist/tui/screens/TravelScreen.js.map +1 -0
- package/dist/tui/screens/index.d.ts +8 -0
- package/dist/tui/screens/index.d.ts.map +1 -0
- package/dist/tui/screens/index.js +17 -0
- package/dist/tui/screens/index.js.map +1 -0
- package/dist/tui/sections/ActionsSection.d.ts +71 -0
- package/dist/tui/sections/ActionsSection.d.ts.map +1 -0
- package/dist/tui/sections/ActionsSection.js +184 -0
- package/dist/tui/sections/ActionsSection.js.map +1 -0
- package/dist/tui/sections/DungeonSection.d.ts +65 -0
- package/dist/tui/sections/DungeonSection.d.ts.map +1 -0
- package/dist/tui/sections/DungeonSection.js +144 -0
- package/dist/tui/sections/DungeonSection.js.map +1 -0
- package/dist/tui/sections/EventsSection.d.ts +50 -0
- package/dist/tui/sections/EventsSection.d.ts.map +1 -0
- package/dist/tui/sections/EventsSection.js +134 -0
- package/dist/tui/sections/EventsSection.js.map +1 -0
- package/dist/tui/sections/MapSection.d.ts +66 -0
- package/dist/tui/sections/MapSection.d.ts.map +1 -0
- package/dist/tui/sections/MapSection.js +669 -0
- package/dist/tui/sections/MapSection.js.map +1 -0
- package/dist/tui/sections/StatusSection.d.ts +47 -0
- package/dist/tui/sections/StatusSection.d.ts.map +1 -0
- package/dist/tui/sections/StatusSection.js +133 -0
- package/dist/tui/sections/StatusSection.js.map +1 -0
- package/dist/tui/sections/TeamSection.d.ts +71 -0
- package/dist/tui/sections/TeamSection.d.ts.map +1 -0
- package/dist/tui/sections/TeamSection.js +224 -0
- package/dist/tui/sections/TeamSection.js.map +1 -0
- package/dist/tui/sections/TravelingSection.d.ts +51 -0
- package/dist/tui/sections/TravelingSection.d.ts.map +1 -0
- package/dist/tui/sections/TravelingSection.js +106 -0
- package/dist/tui/sections/TravelingSection.js.map +1 -0
- package/dist/tui/sections/index.d.ts +9 -0
- package/dist/tui/sections/index.d.ts.map +1 -0
- package/dist/tui/sections/index.js +12 -0
- package/dist/tui/sections/index.js.map +1 -0
- package/dist/ui/Terminal.d.ts +68 -0
- package/dist/ui/Terminal.d.ts.map +1 -0
- package/dist/ui/Terminal.js +297 -0
- package/dist/ui/Terminal.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +8 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/configMigration.d.ts +14 -0
- package/dist/utils/configMigration.d.ts.map +1 -0
- package/dist/utils/configMigration.js +92 -0
- package/dist/utils/configMigration.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +86 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +224 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/weapon/WeaponFactory.d.ts +32 -0
- package/dist/weapon/WeaponFactory.d.ts.map +1 -0
- package/dist/weapon/WeaponFactory.js +216 -0
- package/dist/weapon/WeaponFactory.js.map +1 -0
- package/dist/weapon/index.d.ts +5 -0
- package/dist/weapon/index.d.ts.map +1 -0
- package/dist/weapon/index.js +8 -0
- package/dist/weapon/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdleGameManager.js","sources":["core/IdleGameManager.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * IdleGameManager - Orchestrates the IdleRPG game flow\r\n *\r\n * Manages the game state machine:\r\n * - Town phase: Player is in town, can select facilities/dungeons\r\n * - Travel phase: Moving between locations\r\n * - Dungeon phase: Auto-exploration via DungeonRunner\r\n * - Return phase: Returning to town after dungeon\r\n *\r\n * Supports both legacy single-player and new team system:\r\n * - Legacy: Uses Player directly with DungeonRunner\r\n * - Team: Uses Team and Actors with TeamDungeonRunner\r\n */\r\n\r\nimport type {\r\n Player,\r\n Actor,\r\n Team,\r\n Town,\r\n Dungeon,\r\n DungeonRoom,\r\n StrategyStateMachine,\r\n TownFacility,\r\n} from './types.js';\r\nimport { createDungeonRunner, type DungeonRunner, type DungeonRunnerState } from './DungeonRunner.js';\r\nimport { createTeamDungeonRunner, type TeamDungeonRunner, type TeamDungeonState } from './TeamDungeonRunner.js';\r\nimport type { IdleCombatState } from './IdleCombat.js';\r\nimport { getContinentManager, type ContinentManager } from '../map/ContinentManager.js';\r\nimport { generateDungeon } from '../map/DungeonGenerator.js';\r\nimport { DEFAULT_STRATEGY } from '../strategy/defaultStrategy.js';\r\nimport { VERDANTIA } from '../data/continents/verdantia.js';\r\nimport { playerToActor } from './Actor.js';\r\nimport { createTeamWithActor, getTeamLeaderId, getActiveMembers } from './Team.js';\r\nimport { getTeamLeaderAsPlayer } from './StateAdapter.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type IdleGamePhase =\r\n | 'in_town'\r\n | 'traveling_to_dungeon'\r\n | 'in_dungeon'\r\n | 'returning_to_town'\r\n | 'resting'\r\n | 'dead';\r\n\r\nexport interface IdleGameState {\r\n phase: IdleGamePhase;\r\n player: Player; // Legacy compatibility - leader or single player\r\n currentTown: Town;\r\n currentDungeon: Dungeon | null;\r\n dungeonRunner: DungeonRunner | null;\r\n strategy: StrategyStateMachine;\r\n travelProgress: number;\r\n travelDuration: number;\r\n eventLog: string[];\r\n statistics: GameStatistics;\r\n\r\n // Team system fields (optional for backward compatibility)\r\n team?: Team;\r\n actors?: Record<string, Actor>;\r\n teamDungeonRunner?: TeamDungeonRunner | null;\r\n isTeamMode?: boolean;\r\n}\r\n\r\nexport interface GameStatistics {\r\n dungeonsCleared: number;\r\n dungeonsAttempted: number;\r\n enemiesKilled: number;\r\n goldEarned: number;\r\n deathCount: number;\r\n totalPlayTime: number;\r\n}\r\n\r\nexport interface IdleGameCallbacks {\r\n onPhaseChange: (phase: IdleGamePhase, state: IdleGameState) => void;\r\n onPlayerUpdate: (player: Player) => void;\r\n onDungeonProgress: (runnerState: DungeonRunnerState, combat: IdleCombatState | null) => void;\r\n onEventLog: (message: string) => void;\r\n onTravelProgress: (progress: number, duration: number) => void;\r\n onDungeonComplete: (success: boolean, rewards: { gold: number; exp: number; items: string[] }) => void;\r\n onPlayerDeath: () => void;\r\n}\r\n\r\n// ============================================================================\r\n// IdleGameManager\r\n// ============================================================================\r\n\r\nexport class IdleGameManager {\r\n private state: IdleGameState | null = null;\r\n private callbacks: Partial<IdleGameCallbacks> = {};\r\n private continentManager: ContinentManager;\r\n private tickInterval: NodeJS.Timeout | null = null;\r\n private travelStartTime: number = 0;\r\n\r\n constructor() {\r\n this.continentManager = getContinentManager();\r\n // Load the starting continent\r\n this.continentManager.loadContinent(VERDANTIA);\r\n }\r\n\r\n /**\r\n * Initialize game with player (legacy single-player mode)\r\n */\r\n initialize(player: Player): void {\r\n const startTown = this.continentManager.getTown('willowbrook');\r\n if (!startTown) {\r\n throw new Error('Starting town not found');\r\n }\r\n\r\n this.state = {\r\n phase: 'in_town',\r\n player,\r\n currentTown: startTown,\r\n currentDungeon: null,\r\n dungeonRunner: null,\r\n strategy: DEFAULT_STRATEGY,\r\n travelProgress: 0,\r\n travelDuration: 0,\r\n eventLog: [],\r\n statistics: {\r\n dungeonsCleared: 0,\r\n dungeonsAttempted: 0,\r\n enemiesKilled: 0,\r\n goldEarned: 0,\r\n deathCount: 0,\r\n totalPlayTime: 0,\r\n },\r\n isTeamMode: false,\r\n };\r\n\r\n this.startTick();\r\n this.log(`Welcome to ${startTown.name}!`);\r\n }\r\n\r\n /**\r\n * Initialize game with team (new team mode)\r\n */\r\n initializeWithTeam(team: Team, actors: Record<string, Actor>): void {\r\n const startTown = this.continentManager.getTown('willowbrook');\r\n if (!startTown) {\r\n throw new Error('Starting town not found');\r\n }\r\n\r\n // Get team leader as the \"player\" for legacy compatibility\r\n const leader = getTeamLeaderAsPlayer(team, actors);\r\n if (!leader) {\r\n throw new Error('Team has no leader');\r\n }\r\n\r\n this.state = {\r\n phase: 'in_town',\r\n player: leader,\r\n currentTown: startTown,\r\n currentDungeon: null,\r\n dungeonRunner: null,\r\n strategy: team.strategy,\r\n travelProgress: 0,\r\n travelDuration: 0,\r\n eventLog: [],\r\n statistics: {\r\n dungeonsCleared: 0,\r\n dungeonsAttempted: 0,\r\n enemiesKilled: 0,\r\n goldEarned: 0,\r\n deathCount: 0,\r\n totalPlayTime: 0,\r\n },\r\n // Team system fields\r\n team,\r\n actors,\r\n teamDungeonRunner: null,\r\n isTeamMode: true,\r\n };\r\n\r\n this.startTick();\r\n this.log(`Team ${team.name} arrives at ${startTown.name}!`);\r\n }\r\n\r\n /**\r\n * Convert current single-player game to team mode\r\n * Useful for migration during gameplay\r\n */\r\n convertToTeamMode(): void {\r\n if (!this.state || this.state.isTeamMode) return;\r\n\r\n // Convert player to actor\r\n const actor = playerToActor(this.state.player);\r\n\r\n // Create team with the actor\r\n const team = createTeamWithActor(actor, `${actor.name}'s Team`);\r\n\r\n // Store actors\r\n const actors: Record<string, Actor> = { [actor.id]: actor };\r\n\r\n // Update state\r\n this.state.team = team;\r\n this.state.actors = actors;\r\n this.state.isTeamMode = true;\r\n\r\n this.log('Converted to team mode');\r\n }\r\n\r\n /**\r\n * Set callbacks\r\n */\r\n setCallbacks(callbacks: Partial<IdleGameCallbacks>): void {\r\n this.callbacks = { ...this.callbacks, ...callbacks };\r\n }\r\n\r\n /**\r\n * Start game tick\r\n */\r\n private startTick(): void {\r\n if (this.tickInterval) return;\r\n\r\n this.tickInterval = setInterval(() => {\r\n this.tick();\r\n }, 1000);\r\n }\r\n\r\n /**\r\n * Stop game tick\r\n */\r\n private stopTick(): void {\r\n if (this.tickInterval) {\r\n clearInterval(this.tickInterval);\r\n this.tickInterval = null;\r\n }\r\n }\r\n\r\n /**\r\n * Main game tick\r\n */\r\n private tick(): void {\r\n if (!this.state) return;\r\n\r\n this.state.statistics.totalPlayTime++;\r\n\r\n switch (this.state.phase) {\r\n case 'traveling_to_dungeon':\r\n case 'returning_to_town':\r\n this.processTravelTick();\r\n break;\r\n case 'resting':\r\n this.processRestTick();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Process travel tick\r\n */\r\n private processTravelTick(): void {\r\n if (!this.state) return;\r\n\r\n const elapsed = (Date.now() - this.travelStartTime) / 1000;\r\n this.state.travelProgress = Math.min(elapsed / this.state.travelDuration, 1);\r\n\r\n this.callbacks.onTravelProgress?.(this.state.travelProgress, this.state.travelDuration);\r\n\r\n if (this.state.travelProgress >= 1) {\r\n if (this.state.phase === 'traveling_to_dungeon') {\r\n this.enterDungeon();\r\n } else if (this.state.phase === 'returning_to_town') {\r\n this.arriveAtTown();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Process rest tick\r\n */\r\n private processRestTick(): void {\r\n if (!this.state) return;\r\n\r\n // Heal 10% per second\r\n const healRate = this.state.player.stats.maxHp * 0.1;\r\n this.state.player.stats.hp = Math.min(\r\n this.state.player.stats.maxHp,\r\n this.state.player.stats.hp + healRate\r\n );\r\n\r\n const manaRate = this.state.player.stats.maxMp * 0.1;\r\n this.state.player.stats.mp = Math.min(\r\n this.state.player.stats.maxMp,\r\n this.state.player.stats.mp + manaRate\r\n );\r\n\r\n this.callbacks.onPlayerUpdate?.(this.state.player);\r\n\r\n // Check if fully healed\r\n if (this.state.player.stats.hp >= this.state.player.stats.maxHp &&\r\n this.state.player.stats.mp >= this.state.player.stats.maxMp) {\r\n this.state.phase = 'in_town';\r\n this.log('You are fully rested!');\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // Town Actions\r\n // ============================================================================\r\n\r\n /**\r\n * Select a dungeon to enter\r\n */\r\n selectDungeon(dungeonId: string): boolean {\r\n if (!this.state || this.state.phase !== 'in_town') return false;\r\n\r\n const dungeonTemplate = this.continentManager.getDungeon(dungeonId);\r\n if (!dungeonTemplate) {\r\n this.log('Dungeon not found!');\r\n return false;\r\n }\r\n\r\n // Convert template to generator config and generate dungeon\r\n const config = this.createDungeonConfig(dungeonTemplate);\r\n const dungeon = generateDungeon(config);\r\n this.state.currentDungeon = dungeon;\r\n this.state.statistics.dungeonsAttempted++;\r\n\r\n // Start travel to dungeon\r\n this.state.phase = 'traveling_to_dungeon';\r\n this.state.travelDuration = dungeon.travelTimeFromTown;\r\n this.state.travelProgress = 0;\r\n this.travelStartTime = Date.now();\r\n\r\n this.log(`Traveling to ${dungeon.name}... (${Math.floor(this.state.travelDuration / 60)} min)`);\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Use a facility\r\n */\r\n useFacility(facility: TownFacility): boolean {\r\n if (!this.state || this.state.phase !== 'in_town') return false;\r\n\r\n switch (facility.type) {\r\n case 'inn':\r\n this.state.phase = 'resting';\r\n this.log('Resting at the inn...');\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n return true;\r\n\r\n case 'shop':\r\n this.log('Shop system not yet implemented');\r\n return false;\r\n\r\n case 'blacksmith':\r\n this.log('Blacksmith system not yet implemented');\r\n return false;\r\n\r\n default:\r\n this.log(`${facility.name} is not available yet`);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Update strategy\r\n */\r\n setStrategy(strategy: StrategyStateMachine): void {\r\n if (!this.state) return;\r\n this.state.strategy = strategy;\r\n this.log('Strategy updated!');\r\n }\r\n\r\n // ============================================================================\r\n // Dungeon Phase\r\n // ============================================================================\r\n\r\n /**\r\n * Enter dungeon after travel\r\n */\r\n private enterDungeon(): void {\r\n if (!this.state || !this.state.currentDungeon) return;\r\n\r\n this.state.phase = 'in_dungeon';\r\n this.log(`Entered ${this.state.currentDungeon.name}`);\r\n\r\n // Use team dungeon runner if in team mode\r\n if (this.state.isTeamMode && this.state.team && this.state.actors) {\r\n this.enterDungeonWithTeam();\r\n } else {\r\n this.enterDungeonLegacy();\r\n }\r\n\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n }\r\n\r\n /**\r\n * Enter dungeon with team (new team mode)\r\n */\r\n private enterDungeonWithTeam(): void {\r\n if (!this.state || !this.state.currentDungeon || !this.state.team || !this.state.actors) return;\r\n\r\n // Create team dungeon runner\r\n const runner = createTeamDungeonRunner(this.state.team, this.state.actors);\r\n this.state.teamDungeonRunner = runner;\r\n\r\n // Set up callbacks\r\n runner.setCallbacks({\r\n onPhaseChange: (phase, runnerState) => {\r\n // Convert TeamDungeonState to DungeonRunnerState for compatibility\r\n const compatState = this.convertTeamStateToLegacy(runnerState);\r\n this.callbacks.onDungeonProgress?.(compatState, runnerState.activeCombat as unknown as IdleCombatState);\r\n },\r\n onRoomEnter: (room, runnerState) => {\r\n this.log(`Team entered: ${room.name}`);\r\n const compatState = this.convertTeamStateToLegacy(runnerState);\r\n this.callbacks.onDungeonProgress?.(compatState, null);\r\n },\r\n onCombatStart: (enemies, runnerState) => {\r\n const activeCount = getActiveMembers(this.state!.team!, this.state!.actors!).length;\r\n this.log(`Combat started! ${activeCount} fighters vs ${enemies.length} enemies`);\r\n },\r\n onCombatTurn: (runnerState) => {\r\n const compatState = this.convertTeamStateToLegacy(runnerState);\r\n this.callbacks.onDungeonProgress?.(compatState, runnerState.activeCombat as unknown as IdleCombatState);\r\n },\r\n onCombatEnd: (result, runnerState) => {\r\n if (result.victory) {\r\n this.log(`Victory! Team gained +${result.rewards.exp} EXP, +${result.rewards.gold} Gold`);\r\n this.state!.statistics.enemiesKilled += runnerState.enemiesKilled;\r\n }\r\n const compatState = this.convertTeamStateToLegacy(runnerState);\r\n this.callbacks.onDungeonProgress?.(compatState, null);\r\n },\r\n onActorDefeated: (actorId, actorName, runnerState) => {\r\n this.log(`${actorName} was knocked out!`);\r\n },\r\n onActorLevelUp: (actorId, actorName, newLevel, runnerState) => {\r\n this.log(`${actorName} leveled up to Lv${newLevel}!`);\r\n },\r\n onLevelComplete: (level, runnerState) => {\r\n this.log(`Level ${level + 1} cleared!`);\r\n },\r\n onDungeonComplete: (runnerState) => {\r\n this.handleTeamDungeonComplete(true, runnerState);\r\n },\r\n onDungeonFailed: (reason, runnerState) => {\r\n this.log(`Dungeon failed: ${reason}`);\r\n this.handleTeamDungeonComplete(false, runnerState);\r\n },\r\n onEventLog: (message) => {\r\n this.log(message);\r\n },\r\n });\r\n\r\n // Start the dungeon\r\n runner.startDungeon(this.state.currentDungeon, this.state.team.strategy);\r\n }\r\n\r\n /**\r\n * Enter dungeon with legacy single player\r\n */\r\n private enterDungeonLegacy(): void {\r\n if (!this.state || !this.state.currentDungeon) return;\r\n\r\n // Create dungeon runner\r\n const runner = createDungeonRunner(this.state.player);\r\n this.state.dungeonRunner = runner;\r\n\r\n // Set up callbacks\r\n runner.setCallbacks({\r\n onPhaseChange: (phase, runnerState) => {\r\n this.callbacks.onDungeonProgress?.(runnerState, runnerState.activeCombat);\r\n },\r\n onRoomEnter: (room, runnerState) => {\r\n this.log(`Entered: ${room.name}`);\r\n this.callbacks.onDungeonProgress?.(runnerState, null);\r\n },\r\n onCombatStart: (enemies, runnerState) => {\r\n this.log(`Combat started! ${enemies.length} enemies`);\r\n },\r\n onCombatTurn: (result, runnerState) => {\r\n this.callbacks.onDungeonProgress?.(runnerState, runnerState.activeCombat);\r\n },\r\n onCombatEnd: (victory, rewards, runnerState) => {\r\n if (victory) {\r\n this.log(`Victory! +${rewards.exp} EXP, +${rewards.gold} Gold`);\r\n this.state!.statistics.enemiesKilled += runnerState.enemiesKilled;\r\n }\r\n this.callbacks.onDungeonProgress?.(runnerState, null);\r\n },\r\n onLevelComplete: (level, runnerState) => {\r\n this.log(`Level ${level + 1} cleared!`);\r\n },\r\n onDungeonComplete: (runnerState) => {\r\n this.handleDungeonComplete(true, runnerState);\r\n },\r\n onDungeonFailed: (reason, runnerState) => {\r\n this.log(`Dungeon failed: ${reason}`);\r\n this.handleDungeonComplete(false, runnerState);\r\n },\r\n onEventLog: (message) => {\r\n this.log(message);\r\n },\r\n });\r\n\r\n // Start the dungeon\r\n runner.startDungeon(this.state.currentDungeon, this.state.strategy);\r\n }\r\n\r\n /**\r\n * Convert TeamDungeonState to DungeonRunnerState for UI compatibility\r\n */\r\n private convertTeamStateToLegacy(teamState: TeamDungeonState): DungeonRunnerState {\r\n return {\r\n phase: teamState.phase,\r\n dungeon: teamState.dungeon,\r\n currentLevel: teamState.currentLevel,\r\n currentRoomId: teamState.currentRoomId,\r\n exploredRooms: teamState.exploredRooms,\r\n clearedRooms: teamState.clearedRooms,\r\n strategy: teamState.strategy,\r\n strategyExecutor: teamState.strategyExecutor,\r\n activeCombat: teamState.activeCombat as unknown as IdleCombatState,\r\n lootCollected: teamState.lootCollected,\r\n goldCollected: teamState.goldCollected,\r\n expGained: teamState.expGained,\r\n enemiesKilled: teamState.enemiesKilled,\r\n startTime: teamState.startTime,\r\n eventLog: teamState.eventLog,\r\n };\r\n }\r\n\r\n /**\r\n * Handle team dungeon completion\r\n */\r\n private handleTeamDungeonComplete(success: boolean, runnerState: TeamDungeonState): void {\r\n if (!this.state || !this.state.team) return;\r\n\r\n // Gold is already added to team in TeamDungeonRunner\r\n // Update player for UI compatibility\r\n this.state.player.stats.gold = this.state.team.sharedGold;\r\n\r\n const rewards = {\r\n gold: runnerState.goldCollected,\r\n exp: runnerState.expGained,\r\n items: runnerState.lootCollected.map(i => i.name),\r\n };\r\n\r\n if (success) {\r\n this.state.statistics.dungeonsCleared++;\r\n this.state.statistics.goldEarned += runnerState.goldCollected;\r\n this.log(`Dungeon cleared! Rewards: ${rewards.gold} gold, ${rewards.exp} exp`);\r\n }\r\n\r\n // Check for team wipe\r\n const aliveActors = this.state.team.activeMembers.filter(id => {\r\n const actor = this.state!.actors![id];\r\n return actor && actor.stats.hp > 0;\r\n });\r\n\r\n if (aliveActors.length === 0) {\r\n this.handleTeamDeath();\r\n return;\r\n }\r\n\r\n // Convert to legacy DungeonRunnerState for callback\r\n const compatState = this.convertTeamStateToLegacy(runnerState);\r\n this.callbacks.onDungeonComplete?.(success, rewards);\r\n\r\n // Start returning to town\r\n this.startReturnToTown();\r\n }\r\n\r\n /**\r\n * Handle team death (all members knocked out)\r\n */\r\n private handleTeamDeath(): void {\r\n if (!this.state) return;\r\n\r\n this.state.phase = 'dead';\r\n this.state.statistics.deathCount++;\r\n this.state.teamDungeonRunner = null;\r\n this.state.dungeonRunner = null;\r\n\r\n this.log('The entire team has been defeated...');\r\n this.callbacks.onPlayerDeath?.();\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n }\r\n\r\n /**\r\n * Handle dungeon completion\r\n */\r\n private handleDungeonComplete(success: boolean, runnerState: DungeonRunnerState): void {\r\n if (!this.state) return;\r\n\r\n // Update player with dungeon results (HP is updated via combat callbacks)\r\n this.state.player.stats.gold += runnerState.goldCollected;\r\n\r\n const rewards = {\r\n gold: runnerState.goldCollected,\r\n exp: runnerState.expGained,\r\n items: runnerState.lootCollected.map(i => i.name),\r\n };\r\n\r\n if (success) {\r\n this.state.statistics.dungeonsCleared++;\r\n this.state.statistics.goldEarned += runnerState.goldCollected;\r\n this.log(`Dungeon cleared! Rewards: ${rewards.gold} gold, ${rewards.exp} exp`);\r\n }\r\n\r\n // Check for death\r\n if (this.state.player.stats.hp <= 0) {\r\n this.handlePlayerDeath();\r\n return;\r\n }\r\n\r\n this.callbacks.onDungeonComplete?.(success, rewards);\r\n\r\n // Start returning to town\r\n this.startReturnToTown();\r\n }\r\n\r\n /**\r\n * Abort current dungeon run\r\n */\r\n abortDungeon(): void {\r\n if (!this.state || this.state.phase !== 'in_dungeon') return;\r\n\r\n this.state.dungeonRunner?.abort();\r\n this.log('Retreating from dungeon...');\r\n this.startReturnToTown();\r\n }\r\n\r\n /**\r\n * Cancel current travel and return to town immediately\r\n */\r\n cancelTravel(): boolean {\r\n if (!this.state) return false;\r\n\r\n if (this.state.phase !== 'traveling_to_dungeon' && this.state.phase !== 'returning_to_town') {\r\n return false;\r\n }\r\n\r\n // Reset to town state\r\n this.state.phase = 'in_town';\r\n this.state.travelProgress = 0;\r\n this.state.travelDuration = 0;\r\n this.state.currentDungeon = null;\r\n this.travelStartTime = 0;\r\n\r\n this.log('Travel cancelled. Returned to town.');\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Pause dungeon exploration\r\n */\r\n pauseDungeon(): void {\r\n this.state?.dungeonRunner?.pause();\r\n }\r\n\r\n /**\r\n * Resume dungeon exploration\r\n */\r\n resumeDungeon(): void {\r\n this.state?.dungeonRunner?.resume();\r\n }\r\n\r\n // ============================================================================\r\n // Return Phase\r\n // ============================================================================\r\n\r\n /**\r\n * Start returning to town\r\n */\r\n private startReturnToTown(): void {\r\n if (!this.state) return;\r\n\r\n this.state.phase = 'returning_to_town';\r\n this.state.dungeonRunner = null;\r\n this.state.travelDuration = 120; // 2 minutes base return time\r\n this.state.travelProgress = 0;\r\n this.travelStartTime = Date.now();\r\n\r\n this.log('Returning to town...');\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n }\r\n\r\n /**\r\n * Arrive at town\r\n */\r\n private arriveAtTown(): void {\r\n if (!this.state) return;\r\n\r\n this.state.phase = 'in_town';\r\n this.state.currentDungeon = null;\r\n this.log(`Arrived at ${this.state.currentTown.name}`);\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n this.callbacks.onPlayerUpdate?.(this.state.player);\r\n }\r\n\r\n // ============================================================================\r\n // Death Handling\r\n // ============================================================================\r\n\r\n /**\r\n * Handle player death\r\n */\r\n private handlePlayerDeath(): void {\r\n if (!this.state) return;\r\n\r\n this.state.phase = 'dead';\r\n this.state.statistics.deathCount++;\r\n this.state.dungeonRunner = null;\r\n\r\n this.log('You have been defeated...');\r\n this.callbacks.onPlayerDeath?.();\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n }\r\n\r\n /**\r\n * Respawn player\r\n */\r\n respawn(): void {\r\n if (!this.state || this.state.phase !== 'dead') return;\r\n\r\n // Restore HP to 50%, lose 10% gold\r\n this.state.player.stats.hp = Math.floor(this.state.player.stats.maxHp * 0.5);\r\n this.state.player.stats.mp = this.state.player.stats.maxMp;\r\n\r\n const goldLost = Math.floor(this.state.player.stats.gold * 0.1);\r\n this.state.player.stats.gold -= goldLost;\r\n\r\n this.state.phase = 'in_town';\r\n this.state.currentDungeon = null;\r\n\r\n this.log(`Respawned at ${this.state.currentTown.name}. Lost ${goldLost} gold.`);\r\n this.callbacks.onPhaseChange?.(this.state.phase, this.state);\r\n this.callbacks.onPlayerUpdate?.(this.state.player);\r\n }\r\n\r\n // ============================================================================\r\n // Utilities\r\n // ============================================================================\r\n\r\n /**\r\n * Create dungeon generator config from template\r\n */\r\n private createDungeonConfig(template: Dungeon): {\r\n dungeonId: string;\r\n name: string;\r\n description: string;\r\n continentId: string;\r\n nearestTownId: string;\r\n difficulty: import('./types.js').DungeonDifficulty;\r\n recommendedLevel: number;\r\n numberOfLevels: number;\r\n roomsPerLevel: { min: number; max: number };\r\n hasBoss: boolean;\r\n bossName?: string;\r\n seed?: number;\r\n } {\r\n // Determine number of levels based on difficulty\r\n const levelsByDifficulty: Record<string, number> = {\r\n easy: 3,\r\n normal: 5,\r\n hard: 7,\r\n nightmare: 10,\r\n legendary: 15,\r\n };\r\n\r\n const roomsByDifficulty: Record<string, { min: number; max: number }> = {\r\n easy: { min: 4, max: 6 },\r\n normal: { min: 5, max: 8 },\r\n hard: { min: 6, max: 10 },\r\n nightmare: { min: 8, max: 12 },\r\n legendary: { min: 10, max: 15 },\r\n };\r\n\r\n return {\r\n dungeonId: template.id,\r\n name: template.name,\r\n description: template.description,\r\n continentId: template.continentId,\r\n nearestTownId: template.nearestTownId,\r\n difficulty: template.difficulty,\r\n recommendedLevel: template.recommendedLevel,\r\n numberOfLevels: levelsByDifficulty[template.difficulty] || 5,\r\n roomsPerLevel: roomsByDifficulty[template.difficulty] || { min: 5, max: 8 },\r\n hasBoss: template.hasBoss,\r\n bossName: template.bossName,\r\n seed: Date.now(),\r\n };\r\n }\r\n\r\n /**\r\n * Log an event\r\n */\r\n private log(message: string): void {\r\n if (!this.state) return;\r\n\r\n const timestamp = new Date().toLocaleTimeString('en-US', { hour12: false });\r\n const logMessage = `[${timestamp}] ${message}`;\r\n\r\n this.state.eventLog.push(logMessage);\r\n if (this.state.eventLog.length > 100) {\r\n this.state.eventLog.shift();\r\n }\r\n\r\n this.callbacks.onEventLog?.(logMessage);\r\n }\r\n\r\n /**\r\n * Get current state\r\n */\r\n getState(): IdleGameState | null {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Get available dungeons from current town\r\n */\r\n getAvailableDungeons(): Dungeon[] {\r\n if (!this.state) return [];\r\n return this.continentManager.getDungeonsFromTown(this.state.currentTown.id);\r\n }\r\n\r\n /**\r\n * Get dungeon runner for UI updates\r\n */\r\n getDungeonRunner(): DungeonRunner | null {\r\n return this.state?.dungeonRunner ?? null;\r\n }\r\n\r\n /**\r\n * Destroy manager\r\n */\r\n destroy(): void {\r\n this.stopTick();\r\n this.state?.dungeonRunner?.abort();\r\n this.state = null;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Singleton\r\n// ============================================================================\r\n\r\nlet managerInstance: IdleGameManager | null = null;\r\n\r\nexport function getIdleGameManager(): IdleGameManager {\r\n if (!managerInstance) {\r\n managerInstance = new IdleGameManager();\r\n }\r\n return managerInstance;\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"327a0b71-de3f-5f09-80ce-527e701e88ac"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idle Save Manager - Extended save system for IdleRPG
|
|
3
|
+
*
|
|
4
|
+
* Extends base SaveManager with:
|
|
5
|
+
* - IdleRPG-specific state (location, dungeon, strategy)
|
|
6
|
+
* - World progress tracking
|
|
7
|
+
* - Statistics persistence
|
|
8
|
+
* - Team system support (v2.0.0+)
|
|
9
|
+
*/
|
|
10
|
+
import { type FullSaveData, type SaveSlotInfo } from './SaveManager.js';
|
|
11
|
+
import type { SaveData, CurrentLocation, ActiveDungeonState, StrategyStateMachine, WorldState, GameStatistics } from './types.js';
|
|
12
|
+
import type { NPCSaveData } from '../npc/types.js';
|
|
13
|
+
import type { QuestSaveData } from '../quest/types.js';
|
|
14
|
+
import { type TeamSaveData } from './SaveMigration.js';
|
|
15
|
+
/**
|
|
16
|
+
* Extended save data for IdleRPG
|
|
17
|
+
* Supports both legacy single-player and new team system
|
|
18
|
+
*/
|
|
19
|
+
export interface IdleFullSaveData extends FullSaveData {
|
|
20
|
+
idle?: {
|
|
21
|
+
currentLocation: CurrentLocation;
|
|
22
|
+
activeDungeon?: ActiveDungeonState;
|
|
23
|
+
strategy: StrategyStateMachine;
|
|
24
|
+
worldState: WorldState;
|
|
25
|
+
statistics: GameStatistics;
|
|
26
|
+
};
|
|
27
|
+
teamData?: TeamSaveData;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extended save slot info
|
|
31
|
+
*/
|
|
32
|
+
export interface IdleSaveSlotInfo extends SaveSlotInfo {
|
|
33
|
+
locationName?: string;
|
|
34
|
+
dungeonName?: string;
|
|
35
|
+
totalPlayTime?: number;
|
|
36
|
+
teamName?: string;
|
|
37
|
+
activeMembers?: number;
|
|
38
|
+
hasTeamData?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Save IdleRPG game state
|
|
42
|
+
*/
|
|
43
|
+
export declare function saveIdleGame(slot: number, game: SaveData, npcs: NPCSaveData, quests: QuestSaveData, idleState: {
|
|
44
|
+
currentLocation: CurrentLocation;
|
|
45
|
+
activeDungeon?: ActiveDungeonState;
|
|
46
|
+
strategy: StrategyStateMachine;
|
|
47
|
+
worldState: WorldState;
|
|
48
|
+
statistics: GameStatistics;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
success: boolean;
|
|
51
|
+
error?: string;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Load IdleRPG game state
|
|
55
|
+
* Automatically migrates old save formats to current
|
|
56
|
+
*/
|
|
57
|
+
export declare function loadIdleGame(slot: number): Promise<{
|
|
58
|
+
success: boolean;
|
|
59
|
+
data?: IdleFullSaveData;
|
|
60
|
+
error?: string;
|
|
61
|
+
wasMigrated?: boolean;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Auto-save IdleRPG game state
|
|
65
|
+
*/
|
|
66
|
+
export declare function autoSaveIdleGame(game: SaveData, npcs: NPCSaveData, quests: QuestSaveData, idleState: {
|
|
67
|
+
currentLocation: CurrentLocation;
|
|
68
|
+
activeDungeon?: ActiveDungeonState;
|
|
69
|
+
strategy: StrategyStateMachine;
|
|
70
|
+
worldState: WorldState;
|
|
71
|
+
statistics: GameStatistics;
|
|
72
|
+
}): Promise<{
|
|
73
|
+
success: boolean;
|
|
74
|
+
error?: string;
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Load IdleRPG autosave
|
|
78
|
+
* Automatically migrates old save formats to current
|
|
79
|
+
*/
|
|
80
|
+
export declare function loadIdleAutoSave(): Promise<{
|
|
81
|
+
success: boolean;
|
|
82
|
+
data?: IdleFullSaveData;
|
|
83
|
+
error?: string;
|
|
84
|
+
wasMigrated?: boolean;
|
|
85
|
+
}>;
|
|
86
|
+
/**
|
|
87
|
+
* Create default idle state for new game
|
|
88
|
+
*/
|
|
89
|
+
export declare function createDefaultIdleState(): {
|
|
90
|
+
currentLocation: CurrentLocation;
|
|
91
|
+
strategy: StrategyStateMachine;
|
|
92
|
+
worldState: WorldState;
|
|
93
|
+
statistics: GameStatistics;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Migrate old save to IdleRPG format
|
|
97
|
+
*/
|
|
98
|
+
export declare function migrateToIdleSave(oldSave: FullSaveData): IdleFullSaveData;
|
|
99
|
+
/**
|
|
100
|
+
* Update statistics after dungeon completion
|
|
101
|
+
*/
|
|
102
|
+
export declare function updateDungeonStatistics(statistics: GameStatistics, dungeonId: string, success: boolean, bossKilled: boolean, runTime: number, enemiesKilled: number, goldEarned: number, itemsCollected: number): GameStatistics;
|
|
103
|
+
/**
|
|
104
|
+
* Update world state when dungeon is cleared
|
|
105
|
+
*/
|
|
106
|
+
export declare function updateWorldStateOnDungeonClear(worldState: WorldState, dungeonId: string): WorldState;
|
|
107
|
+
export { listSaveSlots, formatPlayTime, formatTimestamp, } from './SaveManager.js';
|
|
108
|
+
export { needsMigration, migrateSaveData, createNewTeamSave, getActiveTeamFromSave, getActorsFromSave, getAccountFromSave, getLegacyPlayerFromSave, CURRENT_SAVE_VERSION, type MigratableSaveData, type TeamSaveData, } from './SaveMigration.js';
|
|
109
|
+
//# sourceMappingURL=IdleSaveManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdleSaveManager.d.ts","sourceRoot":"/","sources":["core/IdleSaveManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idle Save Manager - Extended save system for IdleRPG
|
|
3
|
+
*
|
|
4
|
+
* Extends base SaveManager with:
|
|
5
|
+
* - IdleRPG-specific state (location, dungeon, strategy)
|
|
6
|
+
* - World progress tracking
|
|
7
|
+
* - Statistics persistence
|
|
8
|
+
* - Team system support (v2.0.0+)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="93274ce2-4083-52c7-865b-12dd0263c550")}catch(e){}}();
|
|
12
|
+
import { saveGame as baseSaveGame, loadGame as baseLoadGame, autoSave as baseAutoSave, loadAutoSave as baseLoadAutoSave, } from './SaveManager.js';
|
|
13
|
+
import { DEFAULT_STRATEGY } from '../strategy/defaultStrategy.js';
|
|
14
|
+
import { Sentry } from '../instrument.js';
|
|
15
|
+
import { needsMigration, migrateSaveData, } from './SaveMigration.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Default Values
|
|
18
|
+
// ============================================================================
|
|
19
|
+
const DEFAULT_LOCATION = {
|
|
20
|
+
type: 'town',
|
|
21
|
+
continentId: 'verdantia',
|
|
22
|
+
townId: 'willowbrook',
|
|
23
|
+
};
|
|
24
|
+
const DEFAULT_WORLD_STATE = {
|
|
25
|
+
unlockedContinents: ['verdantia'],
|
|
26
|
+
unlockedTowns: ['willowbrook'],
|
|
27
|
+
unlockedDungeons: ['goblin_cave'],
|
|
28
|
+
clearedDungeons: [],
|
|
29
|
+
completedQuests: [],
|
|
30
|
+
discoveredNPCs: [],
|
|
31
|
+
reputations: {},
|
|
32
|
+
};
|
|
33
|
+
const DEFAULT_STATISTICS = {
|
|
34
|
+
totalPlayTime: 0,
|
|
35
|
+
dungeonsCleared: 0,
|
|
36
|
+
dungeonsAttempted: 0,
|
|
37
|
+
enemiesKilled: 0,
|
|
38
|
+
bossesKilled: 0,
|
|
39
|
+
totalGoldEarned: 0,
|
|
40
|
+
totalGoldSpent: 0,
|
|
41
|
+
itemsCollected: 0,
|
|
42
|
+
questsCompleted: 0,
|
|
43
|
+
deathCount: 0,
|
|
44
|
+
longestDungeonRun: 0,
|
|
45
|
+
fastestBossClear: {},
|
|
46
|
+
};
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// Save Functions
|
|
49
|
+
// ============================================================================
|
|
50
|
+
/**
|
|
51
|
+
* Save IdleRPG game state
|
|
52
|
+
*/
|
|
53
|
+
export async function saveIdleGame(slot, game, npcs, quests, idleState) {
|
|
54
|
+
// First save base game data
|
|
55
|
+
const result = await baseSaveGame(slot, game, npcs, quests);
|
|
56
|
+
if (!result.success) {
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
// Load the saved data and add idle state
|
|
60
|
+
const loadResult = await baseLoadGame(slot);
|
|
61
|
+
if (!loadResult.success || !loadResult.data) {
|
|
62
|
+
return { success: false, error: 'Failed to update save with idle data' };
|
|
63
|
+
}
|
|
64
|
+
// Add idle-specific data
|
|
65
|
+
const idleSaveData = {
|
|
66
|
+
...loadResult.data,
|
|
67
|
+
idle: {
|
|
68
|
+
currentLocation: idleState.currentLocation,
|
|
69
|
+
activeDungeon: idleState.activeDungeon,
|
|
70
|
+
strategy: idleState.strategy,
|
|
71
|
+
worldState: idleState.worldState,
|
|
72
|
+
statistics: idleState.statistics,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
// Re-save with idle data
|
|
76
|
+
// Note: This is a workaround; ideally we'd modify baseSaveGame to accept idle data
|
|
77
|
+
try {
|
|
78
|
+
const { writeFile, mkdir } = await import('fs/promises');
|
|
79
|
+
const { join } = await import('path');
|
|
80
|
+
const { homedir } = await import('os');
|
|
81
|
+
const saveDir = join(homedir(), '.idlerpg-terminal', 'saves');
|
|
82
|
+
await mkdir(saveDir, { recursive: true });
|
|
83
|
+
const savePath = join(saveDir, `save_${slot}.json`);
|
|
84
|
+
await writeFile(savePath, JSON.stringify(idleSaveData, null, 2), 'utf-8');
|
|
85
|
+
return { success: true };
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
89
|
+
// Report idle save failure to Sentry
|
|
90
|
+
Sentry.captureException(error, {
|
|
91
|
+
tags: { operation: 'idle_save_game', slot },
|
|
92
|
+
extra: { playerName: game.player.name },
|
|
93
|
+
});
|
|
94
|
+
return { success: false, error: message };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Load IdleRPG game state
|
|
99
|
+
* Automatically migrates old save formats to current
|
|
100
|
+
*/
|
|
101
|
+
export async function loadIdleGame(slot) {
|
|
102
|
+
const result = await baseLoadGame(slot);
|
|
103
|
+
if (!result.success) {
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
let saveData = result.data;
|
|
107
|
+
let wasMigrated = false;
|
|
108
|
+
// Check if migration is needed
|
|
109
|
+
if (needsMigration(saveData)) {
|
|
110
|
+
try {
|
|
111
|
+
saveData = migrateSaveData(saveData);
|
|
112
|
+
wasMigrated = true;
|
|
113
|
+
Sentry.captureMessage('Save data migrated successfully', {
|
|
114
|
+
level: 'info',
|
|
115
|
+
tags: { operation: 'load_idle_game', slot, migrated: true },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
Sentry.captureException(error, {
|
|
120
|
+
tags: { operation: 'save_migration_failed', slot },
|
|
121
|
+
});
|
|
122
|
+
return { success: false, error: 'Failed to migrate save data' };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Ensure idle state exists with defaults
|
|
126
|
+
if (!saveData.idle) {
|
|
127
|
+
saveData.idle = {
|
|
128
|
+
currentLocation: DEFAULT_LOCATION,
|
|
129
|
+
strategy: DEFAULT_STRATEGY,
|
|
130
|
+
worldState: DEFAULT_WORLD_STATE,
|
|
131
|
+
statistics: DEFAULT_STATISTICS,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return { success: true, data: saveData, wasMigrated };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Auto-save IdleRPG game state
|
|
138
|
+
*/
|
|
139
|
+
export async function autoSaveIdleGame(game, npcs, quests, idleState) {
|
|
140
|
+
// First do base auto-save
|
|
141
|
+
const result = await baseAutoSave(game, npcs, quests);
|
|
142
|
+
if (!result.success) {
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
// Load and update with idle data
|
|
146
|
+
const loadResult = await baseLoadAutoSave();
|
|
147
|
+
if (!loadResult.success || !loadResult.data) {
|
|
148
|
+
return { success: false, error: 'Failed to update autosave with idle data' };
|
|
149
|
+
}
|
|
150
|
+
const idleSaveData = {
|
|
151
|
+
...loadResult.data,
|
|
152
|
+
idle: {
|
|
153
|
+
currentLocation: idleState.currentLocation,
|
|
154
|
+
activeDungeon: idleState.activeDungeon,
|
|
155
|
+
strategy: idleState.strategy,
|
|
156
|
+
worldState: idleState.worldState,
|
|
157
|
+
statistics: idleState.statistics,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
try {
|
|
161
|
+
const { writeFile, mkdir } = await import('fs/promises');
|
|
162
|
+
const { join } = await import('path');
|
|
163
|
+
const { homedir } = await import('os');
|
|
164
|
+
const saveDir = join(homedir(), '.idlerpg-terminal', 'saves');
|
|
165
|
+
await mkdir(saveDir, { recursive: true });
|
|
166
|
+
const savePath = join(saveDir, 'autosave.json');
|
|
167
|
+
await writeFile(savePath, JSON.stringify(idleSaveData, null, 2), 'utf-8');
|
|
168
|
+
return { success: true };
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
172
|
+
// Report idle autosave failure to Sentry
|
|
173
|
+
Sentry.captureException(error, {
|
|
174
|
+
tags: { operation: 'idle_auto_save' },
|
|
175
|
+
extra: { playerName: game.player.name },
|
|
176
|
+
});
|
|
177
|
+
return { success: false, error: message };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Load IdleRPG autosave
|
|
182
|
+
* Automatically migrates old save formats to current
|
|
183
|
+
*/
|
|
184
|
+
export async function loadIdleAutoSave() {
|
|
185
|
+
const result = await baseLoadAutoSave();
|
|
186
|
+
if (!result.success) {
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
let saveData = result.data;
|
|
190
|
+
let wasMigrated = false;
|
|
191
|
+
// Check if migration is needed
|
|
192
|
+
if (needsMigration(saveData)) {
|
|
193
|
+
try {
|
|
194
|
+
saveData = migrateSaveData(saveData);
|
|
195
|
+
wasMigrated = true;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
Sentry.captureException(error, {
|
|
199
|
+
tags: { operation: 'autosave_migration_failed' },
|
|
200
|
+
});
|
|
201
|
+
return { success: false, error: 'Failed to migrate autosave data' };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Ensure idle state exists with defaults
|
|
205
|
+
if (!saveData.idle) {
|
|
206
|
+
saveData.idle = {
|
|
207
|
+
currentLocation: DEFAULT_LOCATION,
|
|
208
|
+
strategy: DEFAULT_STRATEGY,
|
|
209
|
+
worldState: DEFAULT_WORLD_STATE,
|
|
210
|
+
statistics: DEFAULT_STATISTICS,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
return { success: true, data: saveData, wasMigrated };
|
|
214
|
+
}
|
|
215
|
+
// ============================================================================
|
|
216
|
+
// Utility Functions
|
|
217
|
+
// ============================================================================
|
|
218
|
+
/**
|
|
219
|
+
* Create default idle state for new game
|
|
220
|
+
*/
|
|
221
|
+
export function createDefaultIdleState() {
|
|
222
|
+
return {
|
|
223
|
+
currentLocation: { ...DEFAULT_LOCATION },
|
|
224
|
+
strategy: { ...DEFAULT_STRATEGY },
|
|
225
|
+
worldState: { ...DEFAULT_WORLD_STATE },
|
|
226
|
+
statistics: { ...DEFAULT_STATISTICS },
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Migrate old save to IdleRPG format
|
|
231
|
+
*/
|
|
232
|
+
export function migrateToIdleSave(oldSave) {
|
|
233
|
+
return {
|
|
234
|
+
...oldSave,
|
|
235
|
+
idle: {
|
|
236
|
+
currentLocation: DEFAULT_LOCATION,
|
|
237
|
+
strategy: DEFAULT_STRATEGY,
|
|
238
|
+
worldState: DEFAULT_WORLD_STATE,
|
|
239
|
+
statistics: {
|
|
240
|
+
...DEFAULT_STATISTICS,
|
|
241
|
+
totalPlayTime: oldSave.game.gameTime || 0,
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Update statistics after dungeon completion
|
|
248
|
+
*/
|
|
249
|
+
export function updateDungeonStatistics(statistics, dungeonId, success, bossKilled, runTime, enemiesKilled, goldEarned, itemsCollected) {
|
|
250
|
+
const updated = { ...statistics };
|
|
251
|
+
updated.dungeonsAttempted++;
|
|
252
|
+
if (success) {
|
|
253
|
+
updated.dungeonsCleared++;
|
|
254
|
+
if (runTime > updated.longestDungeonRun) {
|
|
255
|
+
updated.longestDungeonRun = runTime;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (bossKilled) {
|
|
259
|
+
updated.bossesKilled++;
|
|
260
|
+
// Track fastest boss clear
|
|
261
|
+
const currentFastest = updated.fastestBossClear[dungeonId];
|
|
262
|
+
if (!currentFastest || runTime < currentFastest) {
|
|
263
|
+
updated.fastestBossClear[dungeonId] = runTime;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
updated.enemiesKilled += enemiesKilled;
|
|
267
|
+
updated.totalGoldEarned += goldEarned;
|
|
268
|
+
updated.itemsCollected += itemsCollected;
|
|
269
|
+
return updated;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Update world state when dungeon is cleared
|
|
273
|
+
*/
|
|
274
|
+
export function updateWorldStateOnDungeonClear(worldState, dungeonId) {
|
|
275
|
+
const updated = { ...worldState };
|
|
276
|
+
if (!updated.clearedDungeons.includes(dungeonId)) {
|
|
277
|
+
updated.clearedDungeons = [...updated.clearedDungeons, dungeonId];
|
|
278
|
+
}
|
|
279
|
+
// Unlock new content based on cleared dungeons
|
|
280
|
+
// This can be expanded with more complex unlock logic
|
|
281
|
+
if (dungeonId === 'goblin_cave' && !updated.unlockedDungeons.includes('forest_ruins')) {
|
|
282
|
+
updated.unlockedDungeons = [...updated.unlockedDungeons, 'forest_ruins'];
|
|
283
|
+
}
|
|
284
|
+
if (dungeonId === 'forest_ruins' && !updated.unlockedTowns.includes('millford')) {
|
|
285
|
+
updated.unlockedTowns = [...updated.unlockedTowns, 'millford'];
|
|
286
|
+
updated.unlockedDungeons = [...updated.unlockedDungeons, 'abandoned_mine'];
|
|
287
|
+
}
|
|
288
|
+
return updated;
|
|
289
|
+
}
|
|
290
|
+
// ============================================================================
|
|
291
|
+
// Re-exports
|
|
292
|
+
// ============================================================================
|
|
293
|
+
export { listSaveSlots, formatPlayTime, formatTimestamp, } from './SaveManager.js';
|
|
294
|
+
export { needsMigration, migrateSaveData, createNewTeamSave, getActiveTeamFromSave, getActorsFromSave, getAccountFromSave, getLegacyPlayerFromSave, CURRENT_SAVE_VERSION, } from './SaveMigration.js';
|
|
295
|
+
//# sourceMappingURL=IdleSaveManager.js.map
|
|
296
|
+
//# debugId=93274ce2-4083-52c7-865b-12dd0263c550
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdleSaveManager.js","sources":["core/IdleSaveManager.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * Idle Save Manager - Extended save system for IdleRPG\r\n *\r\n * Extends base SaveManager with:\r\n * - IdleRPG-specific state (location, dungeon, strategy)\r\n * - World progress tracking\r\n * - Statistics persistence\r\n * - Team system support (v2.0.0+)\r\n */\r\n\r\nimport {\r\n saveGame as baseSaveGame,\r\n loadGame as baseLoadGame,\r\n autoSave as baseAutoSave,\r\n loadAutoSave as baseLoadAutoSave,\r\n listSaveSlots,\r\n type FullSaveData,\r\n type SaveSlotInfo,\r\n} from './SaveManager.js';\r\nimport type {\r\n SaveData,\r\n IdleSaveData,\r\n CurrentLocation,\r\n ActiveDungeonState,\r\n StrategyStateMachine,\r\n WorldState,\r\n GameStatistics,\r\n Actor,\r\n Team,\r\n PlayerAccount,\r\n} from './types.js';\r\nimport type { NPCSaveData } from '../npc/types.js';\r\nimport type { QuestSaveData } from '../quest/types.js';\r\nimport { DEFAULT_STRATEGY } from '../strategy/defaultStrategy.js';\r\nimport { Sentry } from '../instrument.js';\r\nimport {\r\n needsMigration,\r\n migrateSaveData,\r\n type MigratableSaveData,\r\n type TeamSaveData,\r\n getLegacyPlayerFromSave,\r\n} from './SaveMigration.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Extended save data for IdleRPG\r\n * Supports both legacy single-player and new team system\r\n */\r\nexport interface IdleFullSaveData extends FullSaveData {\r\n idle?: {\r\n currentLocation: CurrentLocation;\r\n activeDungeon?: ActiveDungeonState;\r\n strategy: StrategyStateMachine;\r\n worldState: WorldState;\r\n statistics: GameStatistics;\r\n };\r\n // Team system data (v2.0.0+)\r\n teamData?: TeamSaveData;\r\n}\r\n\r\n/**\r\n * Extended save slot info\r\n */\r\nexport interface IdleSaveSlotInfo extends SaveSlotInfo {\r\n locationName?: string;\r\n dungeonName?: string;\r\n totalPlayTime?: number;\r\n // Team system info\r\n teamName?: string;\r\n activeMembers?: number;\r\n hasTeamData?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Default Values\r\n// ============================================================================\r\n\r\nconst DEFAULT_LOCATION: CurrentLocation = {\r\n type: 'town',\r\n continentId: 'verdantia',\r\n townId: 'willowbrook',\r\n};\r\n\r\nconst DEFAULT_WORLD_STATE: WorldState = {\r\n unlockedContinents: ['verdantia'],\r\n unlockedTowns: ['willowbrook'],\r\n unlockedDungeons: ['goblin_cave'],\r\n clearedDungeons: [],\r\n completedQuests: [],\r\n discoveredNPCs: [],\r\n reputations: {},\r\n};\r\n\r\nconst DEFAULT_STATISTICS: GameStatistics = {\r\n totalPlayTime: 0,\r\n dungeonsCleared: 0,\r\n dungeonsAttempted: 0,\r\n enemiesKilled: 0,\r\n bossesKilled: 0,\r\n totalGoldEarned: 0,\r\n totalGoldSpent: 0,\r\n itemsCollected: 0,\r\n questsCompleted: 0,\r\n deathCount: 0,\r\n longestDungeonRun: 0,\r\n fastestBossClear: {},\r\n};\r\n\r\n// ============================================================================\r\n// Save Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Save IdleRPG game state\r\n */\r\nexport async function saveIdleGame(\r\n slot: number,\r\n game: SaveData,\r\n npcs: NPCSaveData,\r\n quests: QuestSaveData,\r\n idleState: {\r\n currentLocation: CurrentLocation;\r\n activeDungeon?: ActiveDungeonState;\r\n strategy: StrategyStateMachine;\r\n worldState: WorldState;\r\n statistics: GameStatistics;\r\n }\r\n): Promise<{ success: boolean; error?: string }> {\r\n // First save base game data\r\n const result = await baseSaveGame(slot, game, npcs, quests);\r\n\r\n if (!result.success) {\r\n return result;\r\n }\r\n\r\n // Load the saved data and add idle state\r\n const loadResult = await baseLoadGame(slot);\r\n if (!loadResult.success || !loadResult.data) {\r\n return { success: false, error: 'Failed to update save with idle data' };\r\n }\r\n\r\n // Add idle-specific data\r\n const idleSaveData: IdleFullSaveData = {\r\n ...loadResult.data,\r\n idle: {\r\n currentLocation: idleState.currentLocation,\r\n activeDungeon: idleState.activeDungeon,\r\n strategy: idleState.strategy,\r\n worldState: idleState.worldState,\r\n statistics: idleState.statistics,\r\n },\r\n };\r\n\r\n // Re-save with idle data\r\n // Note: This is a workaround; ideally we'd modify baseSaveGame to accept idle data\r\n try {\r\n const { writeFile, mkdir } = await import('fs/promises');\r\n const { join } = await import('path');\r\n const { homedir } = await import('os');\r\n\r\n const saveDir = join(homedir(), '.idlerpg-terminal', 'saves');\r\n await mkdir(saveDir, { recursive: true });\r\n\r\n const savePath = join(saveDir, `save_${slot}.json`);\r\n await writeFile(savePath, JSON.stringify(idleSaveData, null, 2), 'utf-8');\r\n\r\n return { success: true };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n // Report idle save failure to Sentry\r\n Sentry.captureException(error, {\r\n tags: { operation: 'idle_save_game', slot },\r\n extra: { playerName: game.player.name },\r\n });\r\n return { success: false, error: message };\r\n }\r\n}\r\n\r\n/**\r\n * Load IdleRPG game state\r\n * Automatically migrates old save formats to current\r\n */\r\nexport async function loadIdleGame(slot: number): Promise<{\r\n success: boolean;\r\n data?: IdleFullSaveData;\r\n error?: string;\r\n wasMigrated?: boolean;\r\n}> {\r\n const result = await baseLoadGame(slot);\r\n\r\n if (!result.success) {\r\n return result;\r\n }\r\n\r\n let saveData = result.data as MigratableSaveData;\r\n let wasMigrated = false;\r\n\r\n // Check if migration is needed\r\n if (needsMigration(saveData)) {\r\n try {\r\n saveData = migrateSaveData(saveData);\r\n wasMigrated = true;\r\n Sentry.captureMessage('Save data migrated successfully', {\r\n level: 'info',\r\n tags: { operation: 'load_idle_game', slot, migrated: true },\r\n });\r\n } catch (error) {\r\n Sentry.captureException(error, {\r\n tags: { operation: 'save_migration_failed', slot },\r\n });\r\n return { success: false, error: 'Failed to migrate save data' };\r\n }\r\n }\r\n\r\n // Ensure idle state exists with defaults\r\n if (!saveData.idle) {\r\n saveData.idle = {\r\n currentLocation: DEFAULT_LOCATION,\r\n strategy: DEFAULT_STRATEGY,\r\n worldState: DEFAULT_WORLD_STATE,\r\n statistics: DEFAULT_STATISTICS,\r\n };\r\n }\r\n\r\n return { success: true, data: saveData as IdleFullSaveData, wasMigrated };\r\n}\r\n\r\n/**\r\n * Auto-save IdleRPG game state\r\n */\r\nexport async function autoSaveIdleGame(\r\n game: SaveData,\r\n npcs: NPCSaveData,\r\n quests: QuestSaveData,\r\n idleState: {\r\n currentLocation: CurrentLocation;\r\n activeDungeon?: ActiveDungeonState;\r\n strategy: StrategyStateMachine;\r\n worldState: WorldState;\r\n statistics: GameStatistics;\r\n }\r\n): Promise<{ success: boolean; error?: string }> {\r\n // First do base auto-save\r\n const result = await baseAutoSave(game, npcs, quests);\r\n\r\n if (!result.success) {\r\n return result;\r\n }\r\n\r\n // Load and update with idle data\r\n const loadResult = await baseLoadAutoSave();\r\n if (!loadResult.success || !loadResult.data) {\r\n return { success: false, error: 'Failed to update autosave with idle data' };\r\n }\r\n\r\n const idleSaveData: IdleFullSaveData = {\r\n ...loadResult.data,\r\n idle: {\r\n currentLocation: idleState.currentLocation,\r\n activeDungeon: idleState.activeDungeon,\r\n strategy: idleState.strategy,\r\n worldState: idleState.worldState,\r\n statistics: idleState.statistics,\r\n },\r\n };\r\n\r\n try {\r\n const { writeFile, mkdir } = await import('fs/promises');\r\n const { join } = await import('path');\r\n const { homedir } = await import('os');\r\n\r\n const saveDir = join(homedir(), '.idlerpg-terminal', 'saves');\r\n await mkdir(saveDir, { recursive: true });\r\n\r\n const savePath = join(saveDir, 'autosave.json');\r\n await writeFile(savePath, JSON.stringify(idleSaveData, null, 2), 'utf-8');\r\n\r\n return { success: true };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n // Report idle autosave failure to Sentry\r\n Sentry.captureException(error, {\r\n tags: { operation: 'idle_auto_save' },\r\n extra: { playerName: game.player.name },\r\n });\r\n return { success: false, error: message };\r\n }\r\n}\r\n\r\n/**\r\n * Load IdleRPG autosave\r\n * Automatically migrates old save formats to current\r\n */\r\nexport async function loadIdleAutoSave(): Promise<{\r\n success: boolean;\r\n data?: IdleFullSaveData;\r\n error?: string;\r\n wasMigrated?: boolean;\r\n}> {\r\n const result = await baseLoadAutoSave();\r\n\r\n if (!result.success) {\r\n return result;\r\n }\r\n\r\n let saveData = result.data as MigratableSaveData;\r\n let wasMigrated = false;\r\n\r\n // Check if migration is needed\r\n if (needsMigration(saveData)) {\r\n try {\r\n saveData = migrateSaveData(saveData);\r\n wasMigrated = true;\r\n } catch (error) {\r\n Sentry.captureException(error, {\r\n tags: { operation: 'autosave_migration_failed' },\r\n });\r\n return { success: false, error: 'Failed to migrate autosave data' };\r\n }\r\n }\r\n\r\n // Ensure idle state exists with defaults\r\n if (!saveData.idle) {\r\n saveData.idle = {\r\n currentLocation: DEFAULT_LOCATION,\r\n strategy: DEFAULT_STRATEGY,\r\n worldState: DEFAULT_WORLD_STATE,\r\n statistics: DEFAULT_STATISTICS,\r\n };\r\n }\r\n\r\n return { success: true, data: saveData as IdleFullSaveData, wasMigrated };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create default idle state for new game\r\n */\r\nexport function createDefaultIdleState(): {\r\n currentLocation: CurrentLocation;\r\n strategy: StrategyStateMachine;\r\n worldState: WorldState;\r\n statistics: GameStatistics;\r\n} {\r\n return {\r\n currentLocation: { ...DEFAULT_LOCATION },\r\n strategy: { ...DEFAULT_STRATEGY },\r\n worldState: { ...DEFAULT_WORLD_STATE },\r\n statistics: { ...DEFAULT_STATISTICS },\r\n };\r\n}\r\n\r\n/**\r\n * Migrate old save to IdleRPG format\r\n */\r\nexport function migrateToIdleSave(oldSave: FullSaveData): IdleFullSaveData {\r\n return {\r\n ...oldSave,\r\n idle: {\r\n currentLocation: DEFAULT_LOCATION,\r\n strategy: DEFAULT_STRATEGY,\r\n worldState: DEFAULT_WORLD_STATE,\r\n statistics: {\r\n ...DEFAULT_STATISTICS,\r\n totalPlayTime: oldSave.game.gameTime || 0,\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Update statistics after dungeon completion\r\n */\r\nexport function updateDungeonStatistics(\r\n statistics: GameStatistics,\r\n dungeonId: string,\r\n success: boolean,\r\n bossKilled: boolean,\r\n runTime: number,\r\n enemiesKilled: number,\r\n goldEarned: number,\r\n itemsCollected: number\r\n): GameStatistics {\r\n const updated = { ...statistics };\r\n\r\n updated.dungeonsAttempted++;\r\n\r\n if (success) {\r\n updated.dungeonsCleared++;\r\n\r\n if (runTime > updated.longestDungeonRun) {\r\n updated.longestDungeonRun = runTime;\r\n }\r\n }\r\n\r\n if (bossKilled) {\r\n updated.bossesKilled++;\r\n\r\n // Track fastest boss clear\r\n const currentFastest = updated.fastestBossClear[dungeonId];\r\n if (!currentFastest || runTime < currentFastest) {\r\n updated.fastestBossClear[dungeonId] = runTime;\r\n }\r\n }\r\n\r\n updated.enemiesKilled += enemiesKilled;\r\n updated.totalGoldEarned += goldEarned;\r\n updated.itemsCollected += itemsCollected;\r\n\r\n return updated;\r\n}\r\n\r\n/**\r\n * Update world state when dungeon is cleared\r\n */\r\nexport function updateWorldStateOnDungeonClear(\r\n worldState: WorldState,\r\n dungeonId: string\r\n): WorldState {\r\n const updated = { ...worldState };\r\n\r\n if (!updated.clearedDungeons.includes(dungeonId)) {\r\n updated.clearedDungeons = [...updated.clearedDungeons, dungeonId];\r\n }\r\n\r\n // Unlock new content based on cleared dungeons\r\n // This can be expanded with more complex unlock logic\r\n if (dungeonId === 'goblin_cave' && !updated.unlockedDungeons.includes('forest_ruins')) {\r\n updated.unlockedDungeons = [...updated.unlockedDungeons, 'forest_ruins'];\r\n }\r\n\r\n if (dungeonId === 'forest_ruins' && !updated.unlockedTowns.includes('millford')) {\r\n updated.unlockedTowns = [...updated.unlockedTowns, 'millford'];\r\n updated.unlockedDungeons = [...updated.unlockedDungeons, 'abandoned_mine'];\r\n }\r\n\r\n return updated;\r\n}\r\n\r\n// ============================================================================\r\n// Re-exports\r\n// ============================================================================\r\n\r\nexport {\r\n listSaveSlots,\r\n formatPlayTime,\r\n formatTimestamp,\r\n} from './SaveManager.js';\r\n\r\nexport {\r\n needsMigration,\r\n migrateSaveData,\r\n createNewTeamSave,\r\n getActiveTeamFromSave,\r\n getActorsFromSave,\r\n getAccountFromSave,\r\n getLegacyPlayerFromSave,\r\n CURRENT_SAVE_VERSION,\r\n type MigratableSaveData,\r\n type TeamSaveData,\r\n} from './SaveMigration.js';\r\n"],"names":[],"mappings":"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","debug_id":"93274ce2-4083-52c7-865b-12dd0263c550"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NewGameFlowManager - Manages the new game creation flow
|
|
3
|
+
*
|
|
4
|
+
* This class encapsulates the entire New Game flow, ensuring consistency
|
|
5
|
+
* regardless of entry point (first launch, menu "New Game", etc.)
|
|
6
|
+
*
|
|
7
|
+
* Flow: Prologue -> Character Creation -> Success
|
|
8
|
+
*
|
|
9
|
+
* Uses Router for screen navigation tracking.
|
|
10
|
+
* Uses InputManager's focus stack for exclusive input during full-screen overlays.
|
|
11
|
+
*/
|
|
12
|
+
import type { Screen } from '../tui/Screen.js';
|
|
13
|
+
import type { InputManager } from '../tui/Input.js';
|
|
14
|
+
import type { Actor } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Result of the New Game flow
|
|
17
|
+
*/
|
|
18
|
+
export interface NewGameFlowResult {
|
|
19
|
+
/** Whether the flow completed successfully */
|
|
20
|
+
success: boolean;
|
|
21
|
+
/** The created actor (if successful) */
|
|
22
|
+
actor?: Actor;
|
|
23
|
+
/** Whether the flow was cancelled by the user */
|
|
24
|
+
cancelled?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Options for running the New Game flow
|
|
28
|
+
*/
|
|
29
|
+
export interface NewGameFlowOptions {
|
|
30
|
+
/** Skip the prologue (for returning players who've seen it) */
|
|
31
|
+
skipPrologue?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Manages the New Game creation flow
|
|
35
|
+
*/
|
|
36
|
+
export declare class NewGameFlowManager {
|
|
37
|
+
private screen;
|
|
38
|
+
private input;
|
|
39
|
+
private router;
|
|
40
|
+
private currentKeyHandler;
|
|
41
|
+
constructor(screen: Screen, input: InputManager);
|
|
42
|
+
/**
|
|
43
|
+
* Run the complete New Game flow
|
|
44
|
+
*
|
|
45
|
+
* @param options - Flow options
|
|
46
|
+
* @returns Promise<NewGameFlowResult> - The result of the flow
|
|
47
|
+
*/
|
|
48
|
+
run(options?: NewGameFlowOptions): Promise<NewGameFlowResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Run the prologue screen
|
|
51
|
+
* @returns true if completed, false if cancelled
|
|
52
|
+
*/
|
|
53
|
+
private runPrologue;
|
|
54
|
+
/**
|
|
55
|
+
* Run the character creation screen
|
|
56
|
+
* @returns The created Actor, or null if cancelled
|
|
57
|
+
*/
|
|
58
|
+
private runCharacterCreation;
|
|
59
|
+
/**
|
|
60
|
+
* Clean up the current key handler by popping it from the focus stack
|
|
61
|
+
*/
|
|
62
|
+
private cleanupKeyHandler;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=NewGameFlowManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewGameFlowManager.d.ts","sourceRoot":"/","sources":["core/NewGameFlowManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKxC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,iBAAiB,CAA2B;gBAExC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY;IAK/C;;;;;OAKG;IACG,GAAG,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgCvE;;;OAGG;YACW,WAAW;IA0CzB;;;OAGG;YACW,oBAAoB;IAuClC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAQ1B"}
|