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,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Combat system - handles battles with Idle RPG mechanics
|
|
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]="22ce7d41-75c0-5801-9f33-e30a9bbae9bc")}catch(e){}}();
|
|
6
|
+
import { t } from '../i18n/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Initialize a new combat state
|
|
9
|
+
*/
|
|
10
|
+
export function initCombat(player, enemies) {
|
|
11
|
+
// Estimate combat duration based on total enemy HP and player attack
|
|
12
|
+
const totalEnemyHp = enemies.reduce((sum, e) => sum + e.maxHp, 0);
|
|
13
|
+
const avgPlayerDamage = player.stats.attack * 0.8; // Account for defense
|
|
14
|
+
const estimatedTurns = Math.ceil(totalEnemyHp / avgPlayerDamage);
|
|
15
|
+
const estimatedDuration = estimatedTurns * 2; // 2 seconds per turn
|
|
16
|
+
return {
|
|
17
|
+
isActive: true,
|
|
18
|
+
turn: 0,
|
|
19
|
+
playerHp: player.stats.hp,
|
|
20
|
+
enemies: enemies.map(e => ({ ...e })), // Clone enemies
|
|
21
|
+
log: [{
|
|
22
|
+
timestamp: Date.now(),
|
|
23
|
+
message: t('combat.battleStart'),
|
|
24
|
+
type: 'system',
|
|
25
|
+
}],
|
|
26
|
+
strategy: 'balanced',
|
|
27
|
+
startTime: Date.now(),
|
|
28
|
+
estimatedEndTime: Date.now() + estimatedDuration * 1000,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Process a single combat turn
|
|
33
|
+
*/
|
|
34
|
+
export function processCombatTurn(combat, player) {
|
|
35
|
+
if (!combat.isActive) {
|
|
36
|
+
return { combat, finished: true, victory: false };
|
|
37
|
+
}
|
|
38
|
+
combat.turn++;
|
|
39
|
+
const log = [];
|
|
40
|
+
// Get living enemies
|
|
41
|
+
const livingEnemies = combat.enemies.filter(e => e.hp > 0);
|
|
42
|
+
if (livingEnemies.length === 0) {
|
|
43
|
+
return endCombat(combat, true);
|
|
44
|
+
}
|
|
45
|
+
// Player attacks based on strategy
|
|
46
|
+
const playerDamage = calculatePlayerDamage(player, combat.strategy);
|
|
47
|
+
const targetEnemy = selectTarget(livingEnemies, combat.strategy);
|
|
48
|
+
const actualDamage = applyDamage(targetEnemy, playerDamage);
|
|
49
|
+
log.push({
|
|
50
|
+
timestamp: Date.now(),
|
|
51
|
+
message: `${player.name} ${t('combat.damage', { amount: actualDamage })} to ${targetEnemy.name}`,
|
|
52
|
+
type: 'damage',
|
|
53
|
+
});
|
|
54
|
+
// Check for critical hit
|
|
55
|
+
if (Math.random() < 0.1) {
|
|
56
|
+
log.push({
|
|
57
|
+
timestamp: Date.now(),
|
|
58
|
+
message: t('combat.critical'),
|
|
59
|
+
type: 'damage',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// Apply weapon effects (affixes)
|
|
63
|
+
if (player.equipment.weapon) {
|
|
64
|
+
applyWeaponEffects(player.equipment.weapon, targetEnemy, log);
|
|
65
|
+
}
|
|
66
|
+
// Check if enemy defeated
|
|
67
|
+
if (targetEnemy.hp <= 0) {
|
|
68
|
+
log.push({
|
|
69
|
+
timestamp: Date.now(),
|
|
70
|
+
message: `${targetEnemy.name} defeated!`,
|
|
71
|
+
type: 'system',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Enemies attack
|
|
75
|
+
for (const enemy of livingEnemies.filter(e => e.hp > 0)) {
|
|
76
|
+
const enemyDamage = calculateEnemyDamage(enemy, player, combat.strategy);
|
|
77
|
+
combat.playerHp = Math.max(0, combat.playerHp - enemyDamage);
|
|
78
|
+
log.push({
|
|
79
|
+
timestamp: Date.now(),
|
|
80
|
+
message: `${enemy.name} ${t('combat.damage', { amount: enemyDamage })} to ${player.name}`,
|
|
81
|
+
type: 'damage',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// Check player defeat
|
|
85
|
+
if (combat.playerHp <= 0) {
|
|
86
|
+
return endCombat(combat, false);
|
|
87
|
+
}
|
|
88
|
+
// Check all enemies defeated
|
|
89
|
+
if (combat.enemies.every(e => e.hp <= 0)) {
|
|
90
|
+
return endCombat(combat, true);
|
|
91
|
+
}
|
|
92
|
+
combat.log.push(...log);
|
|
93
|
+
return { combat, finished: false, victory: false };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Calculate player damage based on strategy
|
|
97
|
+
*/
|
|
98
|
+
function calculatePlayerDamage(player, strategy) {
|
|
99
|
+
let baseDamage = player.stats.attack;
|
|
100
|
+
// Apply equipment bonuses
|
|
101
|
+
if (player.equipment.weapon) {
|
|
102
|
+
baseDamage += player.equipment.weapon.baseAttack;
|
|
103
|
+
}
|
|
104
|
+
// Strategy modifiers
|
|
105
|
+
switch (strategy) {
|
|
106
|
+
case 'aggressive':
|
|
107
|
+
baseDamage *= 1.3;
|
|
108
|
+
break;
|
|
109
|
+
case 'defensive':
|
|
110
|
+
baseDamage *= 0.7;
|
|
111
|
+
break;
|
|
112
|
+
case 'skill_focus':
|
|
113
|
+
baseDamage *= 1.1;
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
// Add some randomness (±20%)
|
|
119
|
+
const variance = 0.2;
|
|
120
|
+
const multiplier = 1 + (Math.random() * variance * 2 - variance);
|
|
121
|
+
return Math.floor(baseDamage * multiplier);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Calculate enemy damage based on defense and strategy
|
|
125
|
+
*/
|
|
126
|
+
function calculateEnemyDamage(enemy, player, strategy) {
|
|
127
|
+
let baseDamage = enemy.attack;
|
|
128
|
+
let defense = player.stats.defense;
|
|
129
|
+
// Apply armor bonuses
|
|
130
|
+
if (player.equipment.armor) {
|
|
131
|
+
defense += player.equipment.armor.baseDefense;
|
|
132
|
+
}
|
|
133
|
+
// Strategy modifiers for defense
|
|
134
|
+
switch (strategy) {
|
|
135
|
+
case 'aggressive':
|
|
136
|
+
defense *= 0.7; // Take more damage
|
|
137
|
+
break;
|
|
138
|
+
case 'defensive':
|
|
139
|
+
defense *= 1.5; // Take less damage
|
|
140
|
+
break;
|
|
141
|
+
default:
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
// Damage formula: attack - defense/2, minimum 1
|
|
145
|
+
const damage = Math.max(1, baseDamage - Math.floor(defense / 2));
|
|
146
|
+
// Add some randomness
|
|
147
|
+
const variance = 0.15;
|
|
148
|
+
const multiplier = 1 + (Math.random() * variance * 2 - variance);
|
|
149
|
+
return Math.floor(damage * multiplier);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Select target enemy based on strategy
|
|
153
|
+
*/
|
|
154
|
+
function selectTarget(enemies, strategy) {
|
|
155
|
+
switch (strategy) {
|
|
156
|
+
case 'aggressive':
|
|
157
|
+
// Target lowest HP enemy for quick kills
|
|
158
|
+
return enemies.reduce((min, e) => e.hp < min.hp ? e : min, enemies[0]);
|
|
159
|
+
case 'defensive':
|
|
160
|
+
// Target highest damage enemy first
|
|
161
|
+
return enemies.reduce((max, e) => e.attack > max.attack ? e : max, enemies[0]);
|
|
162
|
+
case 'skill_focus':
|
|
163
|
+
// Target boss first if present
|
|
164
|
+
const boss = enemies.find(e => e.isBoss);
|
|
165
|
+
return boss || enemies[0];
|
|
166
|
+
default:
|
|
167
|
+
return enemies[0];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Apply damage to enemy
|
|
172
|
+
*/
|
|
173
|
+
function applyDamage(enemy, damage) {
|
|
174
|
+
const actualDamage = Math.max(1, damage - Math.floor(enemy.defense / 3));
|
|
175
|
+
enemy.hp = Math.max(0, enemy.hp - actualDamage);
|
|
176
|
+
return actualDamage;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Apply weapon effects from affixes
|
|
180
|
+
*/
|
|
181
|
+
function applyWeaponEffects(weapon, target, log) {
|
|
182
|
+
// Process each affix's on-hit effects
|
|
183
|
+
for (const affix of weapon.affixes) {
|
|
184
|
+
// Element damage effects based on affix name patterns
|
|
185
|
+
const elementEffects = {
|
|
186
|
+
'of_flames': { element: 'fire', baseDamage: 8, statusChance: 0.3 },
|
|
187
|
+
'of_frost': { element: 'ice', baseDamage: 6, statusChance: 0.25 },
|
|
188
|
+
'of_thunder': { element: 'lightning', baseDamage: 12, statusChance: 0.15 },
|
|
189
|
+
'of_venom': { element: 'poison', baseDamage: 4, statusChance: 0.5 },
|
|
190
|
+
'of_the_night': { element: 'dark', baseDamage: 15, statusChance: 0.2 },
|
|
191
|
+
'of_light': { element: 'holy', baseDamage: 10, statusChance: 0.3 },
|
|
192
|
+
};
|
|
193
|
+
const effect = elementEffects[affix.definitionId];
|
|
194
|
+
if (effect) {
|
|
195
|
+
// Apply elemental damage
|
|
196
|
+
target.hp = Math.max(0, target.hp - effect.baseDamage);
|
|
197
|
+
log.push({
|
|
198
|
+
timestamp: Date.now(),
|
|
199
|
+
message: `${effect.element} damage: ${effect.baseDamage}`,
|
|
200
|
+
type: 'damage',
|
|
201
|
+
});
|
|
202
|
+
// Chance to apply status effect
|
|
203
|
+
if (Math.random() < effect.statusChance) {
|
|
204
|
+
log.push({
|
|
205
|
+
timestamp: Date.now(),
|
|
206
|
+
message: t('combat.statusEffect', { target: target.name, effect: effect.element }),
|
|
207
|
+
type: 'status',
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Vampiric effect
|
|
212
|
+
if (affix.definitionId === 'vampiric') {
|
|
213
|
+
const healAmount = Math.floor(weapon.baseAttack * 0.1);
|
|
214
|
+
log.push({
|
|
215
|
+
timestamp: Date.now(),
|
|
216
|
+
message: t('combat.heal', { amount: healAmount }),
|
|
217
|
+
type: 'heal',
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// Critical bonuses from deadly affix are handled in damage calculation
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* End combat and calculate rewards
|
|
225
|
+
*/
|
|
226
|
+
function endCombat(combat, victory) {
|
|
227
|
+
combat.isActive = false;
|
|
228
|
+
if (victory) {
|
|
229
|
+
combat.log.push({
|
|
230
|
+
timestamp: Date.now(),
|
|
231
|
+
message: t('combat.victory'),
|
|
232
|
+
type: 'system',
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
combat.log.push({
|
|
237
|
+
timestamp: Date.now(),
|
|
238
|
+
message: t('combat.defeat'),
|
|
239
|
+
type: 'system',
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
return { combat, finished: true, victory };
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Calculate combat rewards
|
|
246
|
+
*/
|
|
247
|
+
export function calculateCombatRewards(enemies) {
|
|
248
|
+
let exp = 0;
|
|
249
|
+
let gold = 0;
|
|
250
|
+
const items = [];
|
|
251
|
+
for (const enemy of enemies) {
|
|
252
|
+
exp += enemy.expReward;
|
|
253
|
+
gold += enemy.goldReward;
|
|
254
|
+
// Roll for drops
|
|
255
|
+
for (const drop of enemy.dropTable) {
|
|
256
|
+
if (Math.random() < drop.chance) {
|
|
257
|
+
items.push(drop.itemId);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return { exp, gold, items };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Format combat log for display
|
|
265
|
+
*/
|
|
266
|
+
export function formatCombatLog(combat, maxLines = 10) {
|
|
267
|
+
return combat.log
|
|
268
|
+
.slice(-maxLines)
|
|
269
|
+
.map(entry => {
|
|
270
|
+
const time = new Date(entry.timestamp).toLocaleTimeString();
|
|
271
|
+
return `[${time}] ${entry.message}`;
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get combat progress (0-1)
|
|
276
|
+
*/
|
|
277
|
+
export function getCombatProgress(combat) {
|
|
278
|
+
const totalMaxHp = combat.enemies.reduce((sum, e) => sum + e.maxHp, 0);
|
|
279
|
+
const totalCurrentHp = combat.enemies.reduce((sum, e) => sum + Math.max(0, e.hp), 0);
|
|
280
|
+
return 1 - (totalCurrentHp / totalMaxHp);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get estimated time remaining
|
|
284
|
+
*/
|
|
285
|
+
export function getEstimatedTimeRemaining(combat) {
|
|
286
|
+
const elapsed = Date.now() - combat.startTime;
|
|
287
|
+
const progress = getCombatProgress(combat);
|
|
288
|
+
if (progress <= 0)
|
|
289
|
+
return Infinity;
|
|
290
|
+
const totalEstimated = elapsed / progress;
|
|
291
|
+
return Math.max(0, totalEstimated - elapsed);
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=Combat.js.map
|
|
294
|
+
//# debugId=22ce7d41-75c0-5801-9f33-e30a9bbae9bc
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combat.js","sources":["core/Combat.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * Combat system - handles battles with Idle RPG mechanics\r\n */\r\n\r\nimport type {\r\n Player,\r\n Enemy,\r\n CombatState,\r\n CombatStrategy,\r\n CombatLogEntry,\r\n Weapon,\r\n} from './types.js';\r\nimport { t } from '../i18n/index.js';\r\n\r\n/**\r\n * Initialize a new combat state\r\n */\r\nexport function initCombat(player: Player, enemies: Enemy[]): CombatState {\r\n // Estimate combat duration based on total enemy HP and player attack\r\n const totalEnemyHp = enemies.reduce((sum, e) => sum + e.maxHp, 0);\r\n const avgPlayerDamage = player.stats.attack * 0.8; // Account for defense\r\n const estimatedTurns = Math.ceil(totalEnemyHp / avgPlayerDamage);\r\n const estimatedDuration = estimatedTurns * 2; // 2 seconds per turn\r\n\r\n return {\r\n isActive: true,\r\n turn: 0,\r\n playerHp: player.stats.hp,\r\n enemies: enemies.map(e => ({ ...e })), // Clone enemies\r\n log: [{\r\n timestamp: Date.now(),\r\n message: t('combat.battleStart'),\r\n type: 'system',\r\n }],\r\n strategy: 'balanced',\r\n startTime: Date.now(),\r\n estimatedEndTime: Date.now() + estimatedDuration * 1000,\r\n };\r\n}\r\n\r\n/**\r\n * Process a single combat turn\r\n */\r\nexport function processCombatTurn(\r\n combat: CombatState,\r\n player: Player\r\n): { combat: CombatState; finished: boolean; victory: boolean } {\r\n if (!combat.isActive) {\r\n return { combat, finished: true, victory: false };\r\n }\r\n\r\n combat.turn++;\r\n const log: CombatLogEntry[] = [];\r\n\r\n // Get living enemies\r\n const livingEnemies = combat.enemies.filter(e => e.hp > 0);\r\n if (livingEnemies.length === 0) {\r\n return endCombat(combat, true);\r\n }\r\n\r\n // Player attacks based on strategy\r\n const playerDamage = calculatePlayerDamage(player, combat.strategy);\r\n const targetEnemy = selectTarget(livingEnemies, combat.strategy);\r\n \r\n const actualDamage = applyDamage(targetEnemy, playerDamage);\r\n log.push({\r\n timestamp: Date.now(),\r\n message: `${player.name} ${t('combat.damage', { amount: actualDamage })} to ${targetEnemy.name}`,\r\n type: 'damage',\r\n });\r\n\r\n // Check for critical hit\r\n if (Math.random() < 0.1) {\r\n log.push({\r\n timestamp: Date.now(),\r\n message: t('combat.critical'),\r\n type: 'damage',\r\n });\r\n }\r\n\r\n // Apply weapon effects (affixes)\r\n if (player.equipment.weapon) {\r\n applyWeaponEffects(player.equipment.weapon, targetEnemy, log);\r\n }\r\n\r\n // Check if enemy defeated\r\n if (targetEnemy.hp <= 0) {\r\n log.push({\r\n timestamp: Date.now(),\r\n message: `${targetEnemy.name} defeated!`,\r\n type: 'system',\r\n });\r\n }\r\n\r\n // Enemies attack\r\n for (const enemy of livingEnemies.filter(e => e.hp > 0)) {\r\n const enemyDamage = calculateEnemyDamage(enemy, player, combat.strategy);\r\n combat.playerHp = Math.max(0, combat.playerHp - enemyDamage);\r\n \r\n log.push({\r\n timestamp: Date.now(),\r\n message: `${enemy.name} ${t('combat.damage', { amount: enemyDamage })} to ${player.name}`,\r\n type: 'damage',\r\n });\r\n }\r\n\r\n // Check player defeat\r\n if (combat.playerHp <= 0) {\r\n return endCombat(combat, false);\r\n }\r\n\r\n // Check all enemies defeated\r\n if (combat.enemies.every(e => e.hp <= 0)) {\r\n return endCombat(combat, true);\r\n }\r\n\r\n combat.log.push(...log);\r\n\r\n return { combat, finished: false, victory: false };\r\n}\r\n\r\n/**\r\n * Calculate player damage based on strategy\r\n */\r\nfunction calculatePlayerDamage(player: Player, strategy: CombatStrategy): number {\r\n let baseDamage = player.stats.attack;\r\n \r\n // Apply equipment bonuses\r\n if (player.equipment.weapon) {\r\n baseDamage += player.equipment.weapon.baseAttack;\r\n }\r\n\r\n // Strategy modifiers\r\n switch (strategy) {\r\n case 'aggressive':\r\n baseDamage *= 1.3;\r\n break;\r\n case 'defensive':\r\n baseDamage *= 0.7;\r\n break;\r\n case 'skill_focus':\r\n baseDamage *= 1.1;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // Add some randomness (±20%)\r\n const variance = 0.2;\r\n const multiplier = 1 + (Math.random() * variance * 2 - variance);\r\n \r\n return Math.floor(baseDamage * multiplier);\r\n}\r\n\r\n/**\r\n * Calculate enemy damage based on defense and strategy\r\n */\r\nfunction calculateEnemyDamage(\r\n enemy: Enemy,\r\n player: Player,\r\n strategy: CombatStrategy\r\n): number {\r\n let baseDamage = enemy.attack;\r\n let defense = player.stats.defense;\r\n\r\n // Apply armor bonuses\r\n if (player.equipment.armor) {\r\n defense += player.equipment.armor.baseDefense;\r\n }\r\n\r\n // Strategy modifiers for defense\r\n switch (strategy) {\r\n case 'aggressive':\r\n defense *= 0.7; // Take more damage\r\n break;\r\n case 'defensive':\r\n defense *= 1.5; // Take less damage\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // Damage formula: attack - defense/2, minimum 1\r\n const damage = Math.max(1, baseDamage - Math.floor(defense / 2));\r\n \r\n // Add some randomness\r\n const variance = 0.15;\r\n const multiplier = 1 + (Math.random() * variance * 2 - variance);\r\n \r\n return Math.floor(damage * multiplier);\r\n}\r\n\r\n/**\r\n * Select target enemy based on strategy\r\n */\r\nfunction selectTarget(enemies: Enemy[], strategy: CombatStrategy): Enemy {\r\n switch (strategy) {\r\n case 'aggressive':\r\n // Target lowest HP enemy for quick kills\r\n return enemies.reduce((min, e) => e.hp < min.hp ? e : min, enemies[0]);\r\n case 'defensive':\r\n // Target highest damage enemy first\r\n return enemies.reduce((max, e) => e.attack > max.attack ? e : max, enemies[0]);\r\n case 'skill_focus':\r\n // Target boss first if present\r\n const boss = enemies.find(e => e.isBoss);\r\n return boss || enemies[0];\r\n default:\r\n return enemies[0];\r\n }\r\n}\r\n\r\n/**\r\n * Apply damage to enemy\r\n */\r\nfunction applyDamage(enemy: Enemy, damage: number): number {\r\n const actualDamage = Math.max(1, damage - Math.floor(enemy.defense / 3));\r\n enemy.hp = Math.max(0, enemy.hp - actualDamage);\r\n return actualDamage;\r\n}\r\n\r\n/**\r\n * Apply weapon effects from affixes\r\n */\r\nfunction applyWeaponEffects(\r\n weapon: Weapon,\r\n target: Enemy,\r\n log: CombatLogEntry[]\r\n): void {\r\n // Process each affix's on-hit effects\r\n for (const affix of weapon.affixes) {\r\n // Element damage effects based on affix name patterns\r\n const elementEffects: Record<string, { element: string; baseDamage: number; statusChance: number }> = {\r\n 'of_flames': { element: 'fire', baseDamage: 8, statusChance: 0.3 },\r\n 'of_frost': { element: 'ice', baseDamage: 6, statusChance: 0.25 },\r\n 'of_thunder': { element: 'lightning', baseDamage: 12, statusChance: 0.15 },\r\n 'of_venom': { element: 'poison', baseDamage: 4, statusChance: 0.5 },\r\n 'of_the_night': { element: 'dark', baseDamage: 15, statusChance: 0.2 },\r\n 'of_light': { element: 'holy', baseDamage: 10, statusChance: 0.3 },\r\n };\r\n\r\n const effect = elementEffects[affix.definitionId];\r\n if (effect) {\r\n // Apply elemental damage\r\n target.hp = Math.max(0, target.hp - effect.baseDamage);\r\n log.push({\r\n timestamp: Date.now(),\r\n message: `${effect.element} damage: ${effect.baseDamage}`,\r\n type: 'damage',\r\n });\r\n\r\n // Chance to apply status effect\r\n if (Math.random() < effect.statusChance) {\r\n log.push({\r\n timestamp: Date.now(),\r\n message: t('combat.statusEffect', { target: target.name, effect: effect.element }),\r\n type: 'status',\r\n });\r\n }\r\n }\r\n\r\n // Vampiric effect\r\n if (affix.definitionId === 'vampiric') {\r\n const healAmount = Math.floor(weapon.baseAttack * 0.1);\r\n log.push({\r\n timestamp: Date.now(),\r\n message: t('combat.heal', { amount: healAmount }),\r\n type: 'heal',\r\n });\r\n }\r\n\r\n // Critical bonuses from deadly affix are handled in damage calculation\r\n }\r\n}\r\n\r\n/**\r\n * End combat and calculate rewards\r\n */\r\nfunction endCombat(\r\n combat: CombatState,\r\n victory: boolean\r\n): { combat: CombatState; finished: boolean; victory: boolean } {\r\n combat.isActive = false;\r\n\r\n if (victory) {\r\n combat.log.push({\r\n timestamp: Date.now(),\r\n message: t('combat.victory'),\r\n type: 'system',\r\n });\r\n } else {\r\n combat.log.push({\r\n timestamp: Date.now(),\r\n message: t('combat.defeat'),\r\n type: 'system',\r\n });\r\n }\r\n\r\n return { combat, finished: true, victory };\r\n}\r\n\r\n/**\r\n * Calculate combat rewards\r\n */\r\nexport function calculateCombatRewards(\r\n enemies: Enemy[]\r\n): { exp: number; gold: number; items: string[] } {\r\n let exp = 0;\r\n let gold = 0;\r\n const items: string[] = [];\r\n\r\n for (const enemy of enemies) {\r\n exp += enemy.expReward;\r\n gold += enemy.goldReward;\r\n\r\n // Roll for drops\r\n for (const drop of enemy.dropTable) {\r\n if (Math.random() < drop.chance) {\r\n items.push(drop.itemId);\r\n }\r\n }\r\n }\r\n\r\n return { exp, gold, items };\r\n}\r\n\r\n/**\r\n * Format combat log for display\r\n */\r\nexport function formatCombatLog(combat: CombatState, maxLines: number = 10): string[] {\r\n return combat.log\r\n .slice(-maxLines)\r\n .map(entry => {\r\n const time = new Date(entry.timestamp).toLocaleTimeString();\r\n return `[${time}] ${entry.message}`;\r\n });\r\n}\r\n\r\n/**\r\n * Get combat progress (0-1)\r\n */\r\nexport function getCombatProgress(combat: CombatState): number {\r\n const totalMaxHp = combat.enemies.reduce((sum, e) => sum + e.maxHp, 0);\r\n const totalCurrentHp = combat.enemies.reduce((sum, e) => sum + Math.max(0, e.hp), 0);\r\n return 1 - (totalCurrentHp / totalMaxHp);\r\n}\r\n\r\n/**\r\n * Get estimated time remaining\r\n */\r\nexport function getEstimatedTimeRemaining(combat: CombatState): number {\r\n const elapsed = Date.now() - combat.startTime;\r\n const progress = getCombatProgress(combat);\r\n \r\n if (progress <= 0) return Infinity;\r\n \r\n const totalEstimated = elapsed / progress;\r\n return Math.max(0, totalEstimated - elapsed);\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"22ce7d41-75c0-5801-9f33-e30a9bbae9bc"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dungeon Runner
|
|
3
|
+
* Main exploration loop for AI-driven dungeon crawling
|
|
4
|
+
*
|
|
5
|
+
* Coordinates between:
|
|
6
|
+
* - TimeManager: Real-time action scheduling
|
|
7
|
+
* - StrategyExecutor: Decision making
|
|
8
|
+
* - IdleCombat: Battle processing
|
|
9
|
+
* - DungeonGenerator: Map data
|
|
10
|
+
*/
|
|
11
|
+
import type { Player, Dungeon, DungeonRoom, StrategyStateMachine, ActiveDungeonState, InventoryItem, Enemy } from './types.js';
|
|
12
|
+
import { StrategyExecutor } from '../strategy/index.js';
|
|
13
|
+
import { type IdleCombatState, type CombatTurnResult } from './IdleCombat.js';
|
|
14
|
+
export type DungeonRunnerPhase = 'idle' | 'entering' | 'exploring' | 'in_combat' | 'processing_room' | 'moving' | 'descending' | 'returning' | 'completed' | 'failed';
|
|
15
|
+
export interface DungeonRunnerState {
|
|
16
|
+
phase: DungeonRunnerPhase;
|
|
17
|
+
dungeon: Dungeon;
|
|
18
|
+
currentLevel: number;
|
|
19
|
+
currentRoomId: string;
|
|
20
|
+
exploredRooms: Set<string>;
|
|
21
|
+
clearedRooms: Set<string>;
|
|
22
|
+
strategy: StrategyStateMachine;
|
|
23
|
+
strategyExecutor: StrategyExecutor;
|
|
24
|
+
activeCombat: IdleCombatState | null;
|
|
25
|
+
lootCollected: InventoryItem[];
|
|
26
|
+
goldCollected: number;
|
|
27
|
+
expGained: number;
|
|
28
|
+
enemiesKilled: number;
|
|
29
|
+
startTime: number;
|
|
30
|
+
eventLog: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface DungeonRunnerCallbacks {
|
|
33
|
+
onPhaseChange: (phase: DungeonRunnerPhase, state: DungeonRunnerState) => void;
|
|
34
|
+
onRoomEnter: (room: DungeonRoom, state: DungeonRunnerState) => void;
|
|
35
|
+
onCombatStart: (enemies: Enemy[], state: DungeonRunnerState) => void;
|
|
36
|
+
onCombatTurn: (result: CombatTurnResult, state: DungeonRunnerState) => void;
|
|
37
|
+
onCombatEnd: (victory: boolean, rewards: {
|
|
38
|
+
exp: number;
|
|
39
|
+
gold: number;
|
|
40
|
+
items: string[];
|
|
41
|
+
}, state: DungeonRunnerState) => void;
|
|
42
|
+
onLevelComplete: (level: number, state: DungeonRunnerState) => void;
|
|
43
|
+
onDungeonComplete: (state: DungeonRunnerState) => void;
|
|
44
|
+
onDungeonFailed: (reason: string, state: DungeonRunnerState) => void;
|
|
45
|
+
onEventLog: (message: string, state: DungeonRunnerState) => void;
|
|
46
|
+
}
|
|
47
|
+
export declare class DungeonRunner {
|
|
48
|
+
private state;
|
|
49
|
+
private player;
|
|
50
|
+
private timeManager;
|
|
51
|
+
private callbacks;
|
|
52
|
+
private isPaused;
|
|
53
|
+
constructor(player: Player);
|
|
54
|
+
/**
|
|
55
|
+
* Set callbacks for dungeon events
|
|
56
|
+
*/
|
|
57
|
+
setCallbacks(callbacks: Partial<DungeonRunnerCallbacks>): void;
|
|
58
|
+
/**
|
|
59
|
+
* Start a dungeon run
|
|
60
|
+
*/
|
|
61
|
+
startDungeon(dungeon: Dungeon, strategy: StrategyStateMachine): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get current state
|
|
64
|
+
*/
|
|
65
|
+
getState(): DungeonRunnerState | null;
|
|
66
|
+
/**
|
|
67
|
+
* Get current room
|
|
68
|
+
*/
|
|
69
|
+
getCurrentRoom(): DungeonRoom | null;
|
|
70
|
+
/**
|
|
71
|
+
* Pause dungeon exploration
|
|
72
|
+
*/
|
|
73
|
+
pause(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Resume dungeon exploration
|
|
76
|
+
*/
|
|
77
|
+
resume(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Abort dungeon run
|
|
80
|
+
*/
|
|
81
|
+
abort(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get active dungeon state for saving
|
|
84
|
+
*/
|
|
85
|
+
getActiveDungeonState(): ActiveDungeonState | null;
|
|
86
|
+
/**
|
|
87
|
+
* Handle time action completion
|
|
88
|
+
*/
|
|
89
|
+
private handleActionComplete;
|
|
90
|
+
/**
|
|
91
|
+
* Enter a room
|
|
92
|
+
*/
|
|
93
|
+
private enterRoom;
|
|
94
|
+
/**
|
|
95
|
+
* Process current room based on type
|
|
96
|
+
*/
|
|
97
|
+
private processRoom;
|
|
98
|
+
/**
|
|
99
|
+
* Start combat in room
|
|
100
|
+
*/
|
|
101
|
+
private startCombat;
|
|
102
|
+
/**
|
|
103
|
+
* Queue next combat turn
|
|
104
|
+
*/
|
|
105
|
+
private queueCombatTurn;
|
|
106
|
+
/**
|
|
107
|
+
* Process combat turn
|
|
108
|
+
*/
|
|
109
|
+
private processCombatTurn;
|
|
110
|
+
/**
|
|
111
|
+
* End combat
|
|
112
|
+
*/
|
|
113
|
+
private endCombat;
|
|
114
|
+
/**
|
|
115
|
+
* Process treasure room
|
|
116
|
+
*/
|
|
117
|
+
private processTreasureRoom;
|
|
118
|
+
/**
|
|
119
|
+
* Process fountain room (heal)
|
|
120
|
+
*/
|
|
121
|
+
private processFountainRoom;
|
|
122
|
+
/**
|
|
123
|
+
* Process altar room (buff)
|
|
124
|
+
*/
|
|
125
|
+
private processAltarRoom;
|
|
126
|
+
/**
|
|
127
|
+
* Process shop room
|
|
128
|
+
*/
|
|
129
|
+
private processShopRoom;
|
|
130
|
+
/**
|
|
131
|
+
* Process trap room
|
|
132
|
+
*/
|
|
133
|
+
private processTrapRoom;
|
|
134
|
+
/**
|
|
135
|
+
* Process event/encounter room
|
|
136
|
+
*/
|
|
137
|
+
private processEventRoom;
|
|
138
|
+
/**
|
|
139
|
+
* Process exit room
|
|
140
|
+
*/
|
|
141
|
+
private processExitRoom;
|
|
142
|
+
/**
|
|
143
|
+
* Descend to next dungeon level
|
|
144
|
+
*/
|
|
145
|
+
private descendToNextLevel;
|
|
146
|
+
/**
|
|
147
|
+
* After room is processed, decide next action
|
|
148
|
+
*/
|
|
149
|
+
private afterRoomProcessed;
|
|
150
|
+
/**
|
|
151
|
+
* Execute exploration decision
|
|
152
|
+
*/
|
|
153
|
+
private executeExplorationDecision;
|
|
154
|
+
/**
|
|
155
|
+
* Set phase and notify callback
|
|
156
|
+
*/
|
|
157
|
+
private setPhase;
|
|
158
|
+
/**
|
|
159
|
+
* Add to event log
|
|
160
|
+
*/
|
|
161
|
+
private log;
|
|
162
|
+
/**
|
|
163
|
+
* Finish dungeon run
|
|
164
|
+
*/
|
|
165
|
+
private finishDungeon;
|
|
166
|
+
}
|
|
167
|
+
export declare function getDungeonRunner(player: Player): DungeonRunner;
|
|
168
|
+
export declare function createDungeonRunner(player: Player): DungeonRunner;
|
|
169
|
+
//# sourceMappingURL=DungeonRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DungeonRunner.d.ts","sourceRoot":"/","sources":["core/DungeonRunner.ts"],"names":[],"mappings":"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"}
|