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,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save Manager - Handles game save/load with file persistence
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
!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]="2b45322b-7fb0-5a44-8878-a2424da296aa")}catch(e){}}();
|
|
6
|
+
import { readFile, writeFile, mkdir, unlink } from 'fs/promises';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
import { Sentry } from '../instrument.js';
|
|
10
|
+
const SAVE_VERSION = '0.1.0';
|
|
11
|
+
const MAX_SAVE_SLOTS = 5;
|
|
12
|
+
/**
|
|
13
|
+
* Get the save directory path
|
|
14
|
+
*/
|
|
15
|
+
function getSaveDir() {
|
|
16
|
+
// Use ~/.idlerpg-terminal/saves/
|
|
17
|
+
return join(homedir(), '.idlerpg-terminal', 'saves');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get path for a specific save slot
|
|
21
|
+
*/
|
|
22
|
+
function getSavePath(slot) {
|
|
23
|
+
return join(getSaveDir(), `save_${slot}.json`);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generate a simple checksum for save data integrity
|
|
27
|
+
*/
|
|
28
|
+
function generateChecksum(data) {
|
|
29
|
+
let hash = 0;
|
|
30
|
+
for (let i = 0; i < data.length; i++) {
|
|
31
|
+
const char = data.charCodeAt(i);
|
|
32
|
+
hash = ((hash << 5) - hash) + char;
|
|
33
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
34
|
+
}
|
|
35
|
+
return Math.abs(hash).toString(16);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Verify save data checksum
|
|
39
|
+
*/
|
|
40
|
+
function verifyChecksum(save, rawData) {
|
|
41
|
+
const expectedChecksum = save.checksum;
|
|
42
|
+
// Remove checksum from data for verification
|
|
43
|
+
const dataWithoutChecksum = rawData.replace(/"checksum":"[^"]*"/, '"checksum":""');
|
|
44
|
+
const actualChecksum = generateChecksum(dataWithoutChecksum);
|
|
45
|
+
return expectedChecksum === actualChecksum;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Save game to a slot
|
|
49
|
+
*/
|
|
50
|
+
export async function saveGame(slot, game, npcs, quests) {
|
|
51
|
+
if (slot < 1 || slot > MAX_SAVE_SLOTS) {
|
|
52
|
+
return { success: false, error: `Invalid slot. Use 1-${MAX_SAVE_SLOTS}` };
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
// Ensure save directory exists
|
|
56
|
+
const saveDir = getSaveDir();
|
|
57
|
+
await mkdir(saveDir, { recursive: true });
|
|
58
|
+
// Create save data structure
|
|
59
|
+
const saveData = {
|
|
60
|
+
game: {
|
|
61
|
+
...game,
|
|
62
|
+
version: SAVE_VERSION,
|
|
63
|
+
timestamp: Date.now(),
|
|
64
|
+
},
|
|
65
|
+
npcs,
|
|
66
|
+
quests,
|
|
67
|
+
checksum: '', // Will be set after
|
|
68
|
+
};
|
|
69
|
+
// Generate checksum
|
|
70
|
+
const jsonWithoutChecksum = JSON.stringify(saveData, null, 2);
|
|
71
|
+
saveData.checksum = generateChecksum(jsonWithoutChecksum);
|
|
72
|
+
// Write to file
|
|
73
|
+
const savePath = getSavePath(slot);
|
|
74
|
+
await writeFile(savePath, JSON.stringify(saveData, null, 2), 'utf-8');
|
|
75
|
+
return { success: true };
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
79
|
+
// Report save failure to Sentry
|
|
80
|
+
Sentry.captureException(error, {
|
|
81
|
+
tags: { operation: 'save_game', slot },
|
|
82
|
+
extra: { playerName: game.player.name },
|
|
83
|
+
});
|
|
84
|
+
return { success: false, error: message };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Load game from a slot
|
|
89
|
+
*/
|
|
90
|
+
export async function loadGame(slot) {
|
|
91
|
+
if (slot < 1 || slot > MAX_SAVE_SLOTS) {
|
|
92
|
+
return { success: false, error: `Invalid slot. Use 1-${MAX_SAVE_SLOTS}` };
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const savePath = getSavePath(slot);
|
|
96
|
+
const rawData = await readFile(savePath, 'utf-8');
|
|
97
|
+
const saveData = JSON.parse(rawData);
|
|
98
|
+
// Verify version compatibility
|
|
99
|
+
if (saveData.game.version !== SAVE_VERSION) {
|
|
100
|
+
console.warn(`[SaveManager] Save version mismatch: ${saveData.game.version} vs ${SAVE_VERSION}`);
|
|
101
|
+
// For now, allow loading older saves
|
|
102
|
+
}
|
|
103
|
+
// Verify checksum
|
|
104
|
+
if (!verifyChecksum(saveData, rawData)) {
|
|
105
|
+
// Report checksum mismatch to Sentry
|
|
106
|
+
Sentry.captureMessage('Save file corrupted: checksum mismatch', {
|
|
107
|
+
level: 'error',
|
|
108
|
+
tags: { operation: 'load_game', slot, corruption: true },
|
|
109
|
+
});
|
|
110
|
+
return { success: false, error: 'Save file corrupted (checksum mismatch)' };
|
|
111
|
+
}
|
|
112
|
+
return { success: true, data: saveData };
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (error.code === 'ENOENT') {
|
|
116
|
+
return { success: false, error: 'Save slot is empty' };
|
|
117
|
+
}
|
|
118
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
119
|
+
// Report load failure to Sentry (excluding ENOENT which is expected)
|
|
120
|
+
Sentry.captureException(error, {
|
|
121
|
+
tags: { operation: 'load_game', slot },
|
|
122
|
+
});
|
|
123
|
+
return { success: false, error: message };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* List all save slots with info
|
|
128
|
+
*/
|
|
129
|
+
export async function listSaveSlots() {
|
|
130
|
+
const slots = [];
|
|
131
|
+
for (let slot = 1; slot <= MAX_SAVE_SLOTS; slot++) {
|
|
132
|
+
try {
|
|
133
|
+
const savePath = getSavePath(slot);
|
|
134
|
+
const rawData = await readFile(savePath, 'utf-8');
|
|
135
|
+
const saveData = JSON.parse(rawData);
|
|
136
|
+
slots.push({
|
|
137
|
+
slot,
|
|
138
|
+
playerName: saveData.game.player.name,
|
|
139
|
+
level: saveData.game.player.stats.level,
|
|
140
|
+
gameTime: saveData.game.gameTime,
|
|
141
|
+
timestamp: saveData.game.timestamp,
|
|
142
|
+
exists: true,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
slots.push({
|
|
147
|
+
slot,
|
|
148
|
+
playerName: '',
|
|
149
|
+
level: 0,
|
|
150
|
+
gameTime: 0,
|
|
151
|
+
timestamp: 0,
|
|
152
|
+
exists: false,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return slots;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Delete a save slot
|
|
160
|
+
*/
|
|
161
|
+
export async function deleteSave(slot) {
|
|
162
|
+
if (slot < 1 || slot > MAX_SAVE_SLOTS) {
|
|
163
|
+
return { success: false, error: `Invalid slot. Use 1-${MAX_SAVE_SLOTS}` };
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
const savePath = getSavePath(slot);
|
|
167
|
+
await unlink(savePath);
|
|
168
|
+
return { success: true };
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
if (error.code === 'ENOENT') {
|
|
172
|
+
return { success: true }; // Already doesn't exist
|
|
173
|
+
}
|
|
174
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
175
|
+
return { success: false, error: message };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if a save slot exists
|
|
180
|
+
*/
|
|
181
|
+
export async function saveExists(slot) {
|
|
182
|
+
try {
|
|
183
|
+
const savePath = getSavePath(slot);
|
|
184
|
+
await readFile(savePath, 'utf-8');
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Get the most recent save slot
|
|
193
|
+
*/
|
|
194
|
+
export async function getMostRecentSave() {
|
|
195
|
+
const slots = await listSaveSlots();
|
|
196
|
+
const existingSlots = slots.filter(s => s.exists);
|
|
197
|
+
if (existingSlots.length === 0)
|
|
198
|
+
return null;
|
|
199
|
+
existingSlots.sort((a, b) => b.timestamp - a.timestamp);
|
|
200
|
+
return existingSlots[0].slot;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Auto-save to a dedicated auto-save slot (slot 0)
|
|
204
|
+
*/
|
|
205
|
+
export async function autoSave(game, npcs, quests) {
|
|
206
|
+
try {
|
|
207
|
+
const saveDir = getSaveDir();
|
|
208
|
+
await mkdir(saveDir, { recursive: true });
|
|
209
|
+
const saveData = {
|
|
210
|
+
game: {
|
|
211
|
+
...game,
|
|
212
|
+
version: SAVE_VERSION,
|
|
213
|
+
timestamp: Date.now(),
|
|
214
|
+
},
|
|
215
|
+
npcs,
|
|
216
|
+
quests,
|
|
217
|
+
checksum: '',
|
|
218
|
+
};
|
|
219
|
+
const jsonWithoutChecksum = JSON.stringify(saveData, null, 2);
|
|
220
|
+
saveData.checksum = generateChecksum(jsonWithoutChecksum);
|
|
221
|
+
const savePath = join(getSaveDir(), 'autosave.json');
|
|
222
|
+
await writeFile(savePath, JSON.stringify(saveData, null, 2), 'utf-8');
|
|
223
|
+
return { success: true };
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
227
|
+
// Report autosave failure to Sentry
|
|
228
|
+
Sentry.captureException(error, {
|
|
229
|
+
tags: { operation: 'auto_save' },
|
|
230
|
+
extra: { playerName: game.player.name },
|
|
231
|
+
});
|
|
232
|
+
return { success: false, error: message };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Load auto-save
|
|
237
|
+
*/
|
|
238
|
+
export async function loadAutoSave() {
|
|
239
|
+
try {
|
|
240
|
+
const savePath = join(getSaveDir(), 'autosave.json');
|
|
241
|
+
const rawData = await readFile(savePath, 'utf-8');
|
|
242
|
+
const saveData = JSON.parse(rawData);
|
|
243
|
+
return { success: true, data: saveData };
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
if (error.code === 'ENOENT') {
|
|
247
|
+
return { success: false, error: 'No autosave found' };
|
|
248
|
+
}
|
|
249
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
250
|
+
// Report autosave load failure to Sentry (excluding ENOENT which is expected)
|
|
251
|
+
Sentry.captureException(error, {
|
|
252
|
+
tags: { operation: 'load_auto_save' },
|
|
253
|
+
});
|
|
254
|
+
return { success: false, error: message };
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Format time for display
|
|
259
|
+
*/
|
|
260
|
+
export function formatPlayTime(seconds) {
|
|
261
|
+
const hours = Math.floor(seconds / 3600);
|
|
262
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
263
|
+
if (hours > 0) {
|
|
264
|
+
return `${hours}h ${minutes}m`;
|
|
265
|
+
}
|
|
266
|
+
return `${minutes}m`;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Format timestamp for display
|
|
270
|
+
*/
|
|
271
|
+
export function formatTimestamp(timestamp) {
|
|
272
|
+
const date = new Date(timestamp);
|
|
273
|
+
return date.toLocaleDateString('en-US', {
|
|
274
|
+
month: 'short',
|
|
275
|
+
day: 'numeric',
|
|
276
|
+
hour: '2-digit',
|
|
277
|
+
minute: '2-digit',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=SaveManager.js.map
|
|
281
|
+
//# debugId=2b45322b-7fb0-5a44-8878-a2424da296aa
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveManager.js","sources":["core/SaveManager.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * Save Manager - Handles game save/load with file persistence\r\n */\r\n\r\nimport { readFile, writeFile, mkdir, readdir, unlink } from 'fs/promises';\r\nimport { join, dirname } from 'path';\r\nimport { homedir } from 'os';\r\nimport type { SaveData, GameSettings } from './types.js';\r\nimport type { NPCSaveData } from '../npc/types.js';\r\nimport type { QuestSaveData } from '../quest/types.js';\r\nimport { Sentry } from '../instrument.js';\r\n\r\n/**\r\n * Complete save file structure\r\n */\r\nexport interface FullSaveData {\r\n game: SaveData;\r\n npcs: NPCSaveData;\r\n quests: QuestSaveData;\r\n checksum: string;\r\n}\r\n\r\n/**\r\n * Save slot info for listing saves\r\n */\r\nexport interface SaveSlotInfo {\r\n slot: number;\r\n playerName: string;\r\n level: number;\r\n gameTime: number;\r\n timestamp: number;\r\n exists: boolean;\r\n}\r\n\r\nconst SAVE_VERSION = '0.1.0';\r\nconst MAX_SAVE_SLOTS = 5;\r\n\r\n/**\r\n * Get the save directory path\r\n */\r\nfunction getSaveDir(): string {\r\n // Use ~/.idlerpg-terminal/saves/\r\n return join(homedir(), '.idlerpg-terminal', 'saves');\r\n}\r\n\r\n/**\r\n * Get path for a specific save slot\r\n */\r\nfunction getSavePath(slot: number): string {\r\n return join(getSaveDir(), `save_${slot}.json`);\r\n}\r\n\r\n/**\r\n * Generate a simple checksum for save data integrity\r\n */\r\nfunction generateChecksum(data: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < data.length; i++) {\r\n const char = data.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return Math.abs(hash).toString(16);\r\n}\r\n\r\n/**\r\n * Verify save data checksum\r\n */\r\nfunction verifyChecksum(save: FullSaveData, rawData: string): boolean {\r\n const expectedChecksum = save.checksum;\r\n // Remove checksum from data for verification\r\n const dataWithoutChecksum = rawData.replace(/\"checksum\":\"[^\"]*\"/, '\"checksum\":\"\"');\r\n const actualChecksum = generateChecksum(dataWithoutChecksum);\r\n return expectedChecksum === actualChecksum;\r\n}\r\n\r\n/**\r\n * Save game to a slot\r\n */\r\nexport async function saveGame(\r\n slot: number,\r\n game: SaveData,\r\n npcs: NPCSaveData,\r\n quests: QuestSaveData\r\n): Promise<{ success: boolean; error?: string }> {\r\n if (slot < 1 || slot > MAX_SAVE_SLOTS) {\r\n return { success: false, error: `Invalid slot. Use 1-${MAX_SAVE_SLOTS}` };\r\n }\r\n\r\n try {\r\n // Ensure save directory exists\r\n const saveDir = getSaveDir();\r\n await mkdir(saveDir, { recursive: true });\r\n\r\n // Create save data structure\r\n const saveData: FullSaveData = {\r\n game: {\r\n ...game,\r\n version: SAVE_VERSION,\r\n timestamp: Date.now(),\r\n },\r\n npcs,\r\n quests,\r\n checksum: '', // Will be set after\r\n };\r\n\r\n // Generate checksum\r\n const jsonWithoutChecksum = JSON.stringify(saveData, null, 2);\r\n saveData.checksum = generateChecksum(jsonWithoutChecksum);\r\n\r\n // Write to file\r\n const savePath = getSavePath(slot);\r\n await writeFile(savePath, JSON.stringify(saveData, 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 save failure to Sentry\r\n Sentry.captureException(error, {\r\n tags: { operation: '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 game from a slot\r\n */\r\nexport async function loadGame(slot: number): Promise<{\r\n success: boolean;\r\n data?: FullSaveData;\r\n error?: string;\r\n}> {\r\n if (slot < 1 || slot > MAX_SAVE_SLOTS) {\r\n return { success: false, error: `Invalid slot. Use 1-${MAX_SAVE_SLOTS}` };\r\n }\r\n\r\n try {\r\n const savePath = getSavePath(slot);\r\n const rawData = await readFile(savePath, 'utf-8');\r\n const saveData = JSON.parse(rawData) as FullSaveData;\r\n\r\n // Verify version compatibility\r\n if (saveData.game.version !== SAVE_VERSION) {\r\n console.warn(`[SaveManager] Save version mismatch: ${saveData.game.version} vs ${SAVE_VERSION}`);\r\n // For now, allow loading older saves\r\n }\r\n\r\n // Verify checksum\r\n if (!verifyChecksum(saveData, rawData)) {\r\n // Report checksum mismatch to Sentry\r\n Sentry.captureMessage('Save file corrupted: checksum mismatch', {\r\n level: 'error',\r\n tags: { operation: 'load_game', slot, corruption: true },\r\n });\r\n return { success: false, error: 'Save file corrupted (checksum mismatch)' };\r\n }\r\n\r\n return { success: true, data: saveData };\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n return { success: false, error: 'Save slot is empty' };\r\n }\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n // Report load failure to Sentry (excluding ENOENT which is expected)\r\n Sentry.captureException(error, {\r\n tags: { operation: 'load_game', slot },\r\n });\r\n return { success: false, error: message };\r\n }\r\n}\r\n\r\n/**\r\n * List all save slots with info\r\n */\r\nexport async function listSaveSlots(): Promise<SaveSlotInfo[]> {\r\n const slots: SaveSlotInfo[] = [];\r\n\r\n for (let slot = 1; slot <= MAX_SAVE_SLOTS; slot++) {\r\n try {\r\n const savePath = getSavePath(slot);\r\n const rawData = await readFile(savePath, 'utf-8');\r\n const saveData = JSON.parse(rawData) as FullSaveData;\r\n\r\n slots.push({\r\n slot,\r\n playerName: saveData.game.player.name,\r\n level: saveData.game.player.stats.level,\r\n gameTime: saveData.game.gameTime,\r\n timestamp: saveData.game.timestamp,\r\n exists: true,\r\n });\r\n } catch {\r\n slots.push({\r\n slot,\r\n playerName: '',\r\n level: 0,\r\n gameTime: 0,\r\n timestamp: 0,\r\n exists: false,\r\n });\r\n }\r\n }\r\n\r\n return slots;\r\n}\r\n\r\n/**\r\n * Delete a save slot\r\n */\r\nexport async function deleteSave(slot: number): Promise<{ success: boolean; error?: string }> {\r\n if (slot < 1 || slot > MAX_SAVE_SLOTS) {\r\n return { success: false, error: `Invalid slot. Use 1-${MAX_SAVE_SLOTS}` };\r\n }\r\n\r\n try {\r\n const savePath = getSavePath(slot);\r\n await unlink(savePath);\r\n return { success: true };\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n return { success: true }; // Already doesn't exist\r\n }\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n return { success: false, error: message };\r\n }\r\n}\r\n\r\n/**\r\n * Check if a save slot exists\r\n */\r\nexport async function saveExists(slot: number): Promise<boolean> {\r\n try {\r\n const savePath = getSavePath(slot);\r\n await readFile(savePath, 'utf-8');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get the most recent save slot\r\n */\r\nexport async function getMostRecentSave(): Promise<number | null> {\r\n const slots = await listSaveSlots();\r\n const existingSlots = slots.filter(s => s.exists);\r\n \r\n if (existingSlots.length === 0) return null;\r\n \r\n existingSlots.sort((a, b) => b.timestamp - a.timestamp);\r\n return existingSlots[0].slot;\r\n}\r\n\r\n/**\r\n * Auto-save to a dedicated auto-save slot (slot 0)\r\n */\r\nexport async function autoSave(\r\n game: SaveData,\r\n npcs: NPCSaveData,\r\n quests: QuestSaveData\r\n): Promise<{ success: boolean; error?: string }> {\r\n try {\r\n const saveDir = getSaveDir();\r\n await mkdir(saveDir, { recursive: true });\r\n\r\n const saveData: FullSaveData = {\r\n game: {\r\n ...game,\r\n version: SAVE_VERSION,\r\n timestamp: Date.now(),\r\n },\r\n npcs,\r\n quests,\r\n checksum: '',\r\n };\r\n\r\n const jsonWithoutChecksum = JSON.stringify(saveData, null, 2);\r\n saveData.checksum = generateChecksum(jsonWithoutChecksum);\r\n\r\n const savePath = join(getSaveDir(), 'autosave.json');\r\n await writeFile(savePath, JSON.stringify(saveData, 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 autosave failure to Sentry\r\n Sentry.captureException(error, {\r\n tags: { operation: '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 auto-save\r\n */\r\nexport async function loadAutoSave(): Promise<{\r\n success: boolean;\r\n data?: FullSaveData;\r\n error?: string;\r\n}> {\r\n try {\r\n const savePath = join(getSaveDir(), 'autosave.json');\r\n const rawData = await readFile(savePath, 'utf-8');\r\n const saveData = JSON.parse(rawData) as FullSaveData;\r\n return { success: true, data: saveData };\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n return { success: false, error: 'No autosave found' };\r\n }\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n // Report autosave load failure to Sentry (excluding ENOENT which is expected)\r\n Sentry.captureException(error, {\r\n tags: { operation: 'load_auto_save' },\r\n });\r\n return { success: false, error: message };\r\n }\r\n}\r\n\r\n/**\r\n * Format time for display\r\n */\r\nexport function formatPlayTime(seconds: number): string {\r\n const hours = Math.floor(seconds / 3600);\r\n const minutes = Math.floor((seconds % 3600) / 60);\r\n \r\n if (hours > 0) {\r\n return `${hours}h ${minutes}m`;\r\n }\r\n return `${minutes}m`;\r\n}\r\n\r\n/**\r\n * Format timestamp for display\r\n */\r\nexport function formatTimestamp(timestamp: number): string {\r\n const date = new Date(timestamp);\r\n return date.toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n });\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"2b45322b-7fb0-5a44-8878-a2424da296aa"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveMigration - Handles migration of save data from older formats to current
|
|
3
|
+
*
|
|
4
|
+
* Version History:
|
|
5
|
+
* - 0.1.0: Original single-player format
|
|
6
|
+
* - 2.0.0: Team system introduction (Actor, Team, PlayerAccount)
|
|
7
|
+
*/
|
|
8
|
+
import type { Player, Actor, Team, PlayerAccount, CurrentLocation, GameStatistics, WorldState } from './types.js';
|
|
9
|
+
import type { IdleFullSaveData } from './IdleSaveManager.js';
|
|
10
|
+
/**
|
|
11
|
+
* Current save format version
|
|
12
|
+
*/
|
|
13
|
+
export declare const CURRENT_SAVE_VERSION = "2.0.0";
|
|
14
|
+
/**
|
|
15
|
+
* Minimum version that doesn't need migration
|
|
16
|
+
*/
|
|
17
|
+
export declare const MIN_COMPATIBLE_VERSION = "2.0.0";
|
|
18
|
+
/**
|
|
19
|
+
* Extended save data with team system
|
|
20
|
+
*/
|
|
21
|
+
export interface TeamSaveData {
|
|
22
|
+
version: string;
|
|
23
|
+
timestamp: number;
|
|
24
|
+
account: PlayerAccount;
|
|
25
|
+
worldState: WorldState;
|
|
26
|
+
statistics: GameStatistics;
|
|
27
|
+
currentLocation: CurrentLocation;
|
|
28
|
+
activeDungeon?: unknown;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Combined save format (supports both old and new)
|
|
32
|
+
*/
|
|
33
|
+
export interface MigratableSaveData extends IdleFullSaveData {
|
|
34
|
+
teamData?: TeamSaveData;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if save data needs migration
|
|
38
|
+
*/
|
|
39
|
+
export declare function needsMigration(saveData: MigratableSaveData): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get the version of save data
|
|
42
|
+
*/
|
|
43
|
+
export declare function getSaveVersion(saveData: MigratableSaveData): string;
|
|
44
|
+
/**
|
|
45
|
+
* Migrate save data from any older format to current
|
|
46
|
+
*/
|
|
47
|
+
export declare function migrateSaveData(saveData: MigratableSaveData): MigratableSaveData;
|
|
48
|
+
/**
|
|
49
|
+
* Create a new save with the team system format
|
|
50
|
+
*/
|
|
51
|
+
export declare function createNewTeamSave(playerName: string, actorName?: string): MigratableSaveData;
|
|
52
|
+
/**
|
|
53
|
+
* Extract the active team from save data
|
|
54
|
+
*/
|
|
55
|
+
export declare function getActiveTeamFromSave(saveData: MigratableSaveData): Team | null;
|
|
56
|
+
/**
|
|
57
|
+
* Extract all actors from save data
|
|
58
|
+
*/
|
|
59
|
+
export declare function getActorsFromSave(saveData: MigratableSaveData): Record<string, Actor>;
|
|
60
|
+
/**
|
|
61
|
+
* Extract the account from save data
|
|
62
|
+
*/
|
|
63
|
+
export declare function getAccountFromSave(saveData: MigratableSaveData): PlayerAccount | null;
|
|
64
|
+
/**
|
|
65
|
+
* Get the "primary" player for backward compatibility
|
|
66
|
+
* Returns the leader of the active team as a Player object
|
|
67
|
+
*/
|
|
68
|
+
export declare function getLegacyPlayerFromSave(saveData: MigratableSaveData): Player | null;
|
|
69
|
+
//# sourceMappingURL=SaveMigration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveMigration.d.ts","sourceRoot":"/","sources":["core/SaveMigration.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,KAAK,EACL,IAAI,EACJ,aAAa,EAIb,eAAe,EACf,cAAc,EAEd,UAAU,EACX,MAAM,YAAY,CAAC;AAIpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAQ7D;;GAEG;AACH,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAM9C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAE1D,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AA2BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAQpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAKnE;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,kBAAkB,CA2BhF;AAgID;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,kBAAkB,CA8IpB;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAG/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAErF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,aAAa,GAAG,IAAI,CAErF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CA+BnF"}
|