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,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TeamCombat - Multi-character turn-based combat system
|
|
3
|
+
*
|
|
4
|
+
* Handles combat involving multiple team members:
|
|
5
|
+
* - Turn order based on speed
|
|
6
|
+
* - Formation-based damage distribution
|
|
7
|
+
* - Individual HP/MP tracking for each actor
|
|
8
|
+
* - Experience distribution after combat
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a9c594a5-64d5-55b7-8417-3493432ed48b")}catch(e){}}();
|
|
12
|
+
import { getActorTotalAttack, getActorTotalDefense, canActorFight, addExperience, } from './Actor.js';
|
|
13
|
+
import { distributeTeamExperience, addItemToTeam, addTeamGold, getFormationDamageMultiplier, isActorOnFrontline, } from './Team.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Combat State Creation
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Create initial combat state from team and enemies
|
|
19
|
+
*/
|
|
20
|
+
export function createTeamCombatState(team, actors, enemies, combatType = 'mob') {
|
|
21
|
+
// Initialize actor HP/MP from current values
|
|
22
|
+
const actorHp = {};
|
|
23
|
+
const actorMp = {};
|
|
24
|
+
for (const actorId of team.activeMembers) {
|
|
25
|
+
const actor = actors[actorId];
|
|
26
|
+
if (actor) {
|
|
27
|
+
actorHp[actorId] = actor.stats.hp;
|
|
28
|
+
actorMp[actorId] = actor.stats.mp;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Calculate turn order based on speed
|
|
32
|
+
const turnOrder = calculateTurnOrder(team, actors, enemies);
|
|
33
|
+
return {
|
|
34
|
+
isActive: true,
|
|
35
|
+
turn: 0,
|
|
36
|
+
actorHp,
|
|
37
|
+
actorMp,
|
|
38
|
+
enemies: enemies.map(e => ({ ...e })), // Clone enemies
|
|
39
|
+
turnOrder,
|
|
40
|
+
currentTurnIndex: 0,
|
|
41
|
+
combatType,
|
|
42
|
+
log: [],
|
|
43
|
+
startTime: Date.now(),
|
|
44
|
+
estimatedEndTime: Date.now() + 60000, // Estimate 1 minute
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Calculate turn order based on speed
|
|
49
|
+
*/
|
|
50
|
+
function calculateTurnOrder(team, actors, enemies) {
|
|
51
|
+
const entries = [];
|
|
52
|
+
// Add active actors
|
|
53
|
+
for (const actorId of team.activeMembers) {
|
|
54
|
+
const actor = actors[actorId];
|
|
55
|
+
if (actor && canActorFight(actor)) {
|
|
56
|
+
entries.push({
|
|
57
|
+
type: 'actor',
|
|
58
|
+
id: actorId,
|
|
59
|
+
name: actor.name,
|
|
60
|
+
speed: actor.stats.speed,
|
|
61
|
+
isActive: true,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Add enemies
|
|
66
|
+
for (const enemy of enemies) {
|
|
67
|
+
if (enemy.hp > 0) {
|
|
68
|
+
entries.push({
|
|
69
|
+
type: 'enemy',
|
|
70
|
+
id: enemy.id,
|
|
71
|
+
name: enemy.name,
|
|
72
|
+
speed: enemy.speed,
|
|
73
|
+
isActive: true,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Sort by speed (highest first)
|
|
78
|
+
entries.sort((a, b) => b.speed - a.speed);
|
|
79
|
+
return entries;
|
|
80
|
+
}
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Combat Actions
|
|
83
|
+
// ============================================================================
|
|
84
|
+
/**
|
|
85
|
+
* Execute an actor's attack on an enemy
|
|
86
|
+
*/
|
|
87
|
+
export function executeActorAttack(state, actorId, actor, targetIndex) {
|
|
88
|
+
const target = state.enemies[targetIndex];
|
|
89
|
+
if (!target || target.hp <= 0) {
|
|
90
|
+
// Find first alive enemy
|
|
91
|
+
const aliveIndex = state.enemies.findIndex(e => e.hp > 0);
|
|
92
|
+
if (aliveIndex === -1) {
|
|
93
|
+
return { damage: 0, defeated: false, targetName: 'none' };
|
|
94
|
+
}
|
|
95
|
+
return executeActorAttack(state, actorId, actor, aliveIndex);
|
|
96
|
+
}
|
|
97
|
+
// Calculate damage
|
|
98
|
+
const attack = getActorTotalAttack(actor);
|
|
99
|
+
const defense = target.defense;
|
|
100
|
+
const baseDamage = Math.max(1, attack - defense);
|
|
101
|
+
// Add some variance (±20%)
|
|
102
|
+
const variance = 0.8 + Math.random() * 0.4;
|
|
103
|
+
const damage = Math.floor(baseDamage * variance);
|
|
104
|
+
// Apply damage
|
|
105
|
+
target.hp = Math.max(0, target.hp - damage);
|
|
106
|
+
const defeated = target.hp <= 0;
|
|
107
|
+
// Log the action
|
|
108
|
+
addCombatLog(state, `${actor.name} attacks ${target.name} for ${damage} damage!`, 'damage');
|
|
109
|
+
if (defeated) {
|
|
110
|
+
addCombatLog(state, `${target.name} was defeated!`, 'system');
|
|
111
|
+
// Mark in turn order
|
|
112
|
+
const turnEntry = state.turnOrder.find(e => e.type === 'enemy' && e.id === target.id);
|
|
113
|
+
if (turnEntry)
|
|
114
|
+
turnEntry.isActive = false;
|
|
115
|
+
}
|
|
116
|
+
return { damage, defeated, targetName: target.name };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Execute an enemy's attack on the team
|
|
120
|
+
*/
|
|
121
|
+
export function executeEnemyAttack(state, enemy, team, actors) {
|
|
122
|
+
// Select target based on formation
|
|
123
|
+
const targetId = selectTargetByFormation(state, team, actors);
|
|
124
|
+
if (!targetId) {
|
|
125
|
+
return { damage: 0, targetId: '', targetName: 'none', defeated: false };
|
|
126
|
+
}
|
|
127
|
+
const target = actors[targetId];
|
|
128
|
+
if (!target) {
|
|
129
|
+
return { damage: 0, targetId: '', targetName: 'none', defeated: false };
|
|
130
|
+
}
|
|
131
|
+
// Calculate damage with formation modifier
|
|
132
|
+
const attack = enemy.attack;
|
|
133
|
+
const defense = getActorTotalDefense(target);
|
|
134
|
+
const baseDamage = Math.max(1, attack - defense);
|
|
135
|
+
// Apply formation damage modifier
|
|
136
|
+
const formationMod = getFormationDamageMultiplier(team, targetId);
|
|
137
|
+
const modifiedDamage = Math.floor(baseDamage * formationMod);
|
|
138
|
+
// Add variance
|
|
139
|
+
const variance = 0.8 + Math.random() * 0.4;
|
|
140
|
+
const damage = Math.floor(modifiedDamage * variance);
|
|
141
|
+
// Apply damage
|
|
142
|
+
const previousHp = state.actorHp[targetId] ?? 0;
|
|
143
|
+
state.actorHp[targetId] = Math.max(0, previousHp - damage);
|
|
144
|
+
// Also update the actor's actual HP
|
|
145
|
+
target.stats.hp = state.actorHp[targetId];
|
|
146
|
+
const defeated = target.stats.hp <= 0;
|
|
147
|
+
// Log the action
|
|
148
|
+
addCombatLog(state, `${enemy.name} attacks ${target.name} for ${damage} damage!`, 'damage');
|
|
149
|
+
if (defeated) {
|
|
150
|
+
addCombatLog(state, `${target.name} was knocked out!`, 'system');
|
|
151
|
+
target.status = 'dead';
|
|
152
|
+
// Mark in turn order
|
|
153
|
+
const turnEntry = state.turnOrder.find(e => e.type === 'actor' && e.id === targetId);
|
|
154
|
+
if (turnEntry)
|
|
155
|
+
turnEntry.isActive = false;
|
|
156
|
+
}
|
|
157
|
+
return { damage, targetId, targetName: target.name, defeated };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Select target based on formation
|
|
161
|
+
* Frontline actors are more likely to be targeted
|
|
162
|
+
*/
|
|
163
|
+
function selectTargetByFormation(state, team, actors) {
|
|
164
|
+
const aliveActors = [];
|
|
165
|
+
for (const actorId of team.activeMembers) {
|
|
166
|
+
const hp = state.actorHp[actorId] ?? 0;
|
|
167
|
+
if (hp > 0) {
|
|
168
|
+
aliveActors.push({
|
|
169
|
+
id: actorId,
|
|
170
|
+
isFrontline: isActorOnFrontline(team, actorId),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (aliveActors.length === 0)
|
|
175
|
+
return null;
|
|
176
|
+
// Frontline actors have higher chance to be targeted
|
|
177
|
+
const frontlineActors = aliveActors.filter(a => a.isFrontline);
|
|
178
|
+
const backlineActors = aliveActors.filter(a => !a.isFrontline);
|
|
179
|
+
// 80% chance to target frontline if there are frontline actors
|
|
180
|
+
if (frontlineActors.length > 0 && Math.random() < 0.8) {
|
|
181
|
+
return frontlineActors[Math.floor(Math.random() * frontlineActors.length)].id;
|
|
182
|
+
}
|
|
183
|
+
// Otherwise random from all alive
|
|
184
|
+
return aliveActors[Math.floor(Math.random() * aliveActors.length)].id;
|
|
185
|
+
}
|
|
186
|
+
// ============================================================================
|
|
187
|
+
// Combat Resolution
|
|
188
|
+
// ============================================================================
|
|
189
|
+
/**
|
|
190
|
+
* Process a single turn in combat
|
|
191
|
+
*/
|
|
192
|
+
export function processCombatTurn(state, team, actors, callbacks) {
|
|
193
|
+
if (!state.isActive)
|
|
194
|
+
return;
|
|
195
|
+
// Get current turn entry
|
|
196
|
+
const currentEntry = state.turnOrder[state.currentTurnIndex];
|
|
197
|
+
if (!currentEntry || !currentEntry.isActive) {
|
|
198
|
+
// Skip to next active entry
|
|
199
|
+
advanceToNextTurn(state);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
callbacks?.onTurnStart?.(currentEntry, state);
|
|
203
|
+
if (currentEntry.type === 'actor') {
|
|
204
|
+
// Actor's turn
|
|
205
|
+
const actor = actors[currentEntry.id];
|
|
206
|
+
if (actor && canActorFight(actor)) {
|
|
207
|
+
// Simple AI: attack random enemy
|
|
208
|
+
const aliveEnemies = state.enemies.filter(e => e.hp > 0);
|
|
209
|
+
if (aliveEnemies.length > 0) {
|
|
210
|
+
const targetIndex = state.enemies.indexOf(aliveEnemies[Math.floor(Math.random() * aliveEnemies.length)]);
|
|
211
|
+
const result = executeActorAttack(state, currentEntry.id, actor, targetIndex);
|
|
212
|
+
callbacks?.onActorAction?.(currentEntry.id, 'attack', result.targetName, result.damage);
|
|
213
|
+
if (result.defeated) {
|
|
214
|
+
callbacks?.onEnemyDefeated?.(state.enemies[targetIndex].id);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// Enemy's turn
|
|
221
|
+
const enemy = state.enemies.find(e => e.id === currentEntry.id && e.hp > 0);
|
|
222
|
+
if (enemy) {
|
|
223
|
+
const result = executeEnemyAttack(state, enemy, team, actors);
|
|
224
|
+
callbacks?.onEnemyAction?.(currentEntry.id, 'attack', result.targetName, result.damage);
|
|
225
|
+
if (result.defeated) {
|
|
226
|
+
callbacks?.onActorDefeated?.(result.targetId);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
callbacks?.onTurnEnd?.(state);
|
|
231
|
+
// Advance turn
|
|
232
|
+
advanceToNextTurn(state);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Advance to the next turn
|
|
236
|
+
*/
|
|
237
|
+
function advanceToNextTurn(state) {
|
|
238
|
+
state.currentTurnIndex++;
|
|
239
|
+
// Wrap around and increment turn counter
|
|
240
|
+
if (state.currentTurnIndex >= state.turnOrder.length) {
|
|
241
|
+
state.currentTurnIndex = 0;
|
|
242
|
+
state.turn++;
|
|
243
|
+
// Recalculate turn order in case speed changed
|
|
244
|
+
// (For simplicity, we'll skip this for now)
|
|
245
|
+
}
|
|
246
|
+
// Skip inactive entries
|
|
247
|
+
let attempts = 0;
|
|
248
|
+
while (attempts < state.turnOrder.length &&
|
|
249
|
+
state.turnOrder[state.currentTurnIndex] &&
|
|
250
|
+
!state.turnOrder[state.currentTurnIndex].isActive) {
|
|
251
|
+
state.currentTurnIndex++;
|
|
252
|
+
if (state.currentTurnIndex >= state.turnOrder.length) {
|
|
253
|
+
state.currentTurnIndex = 0;
|
|
254
|
+
state.turn++;
|
|
255
|
+
}
|
|
256
|
+
attempts++;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Check if combat should end
|
|
261
|
+
*/
|
|
262
|
+
export function isCombatOver(state, team, actors) {
|
|
263
|
+
// Check if all enemies are defeated
|
|
264
|
+
const enemiesDefeated = state.enemies.every(e => e.hp <= 0);
|
|
265
|
+
// Check if team is wiped
|
|
266
|
+
const teamWiped = team.activeMembers.every(id => (state.actorHp[id] ?? 0) <= 0);
|
|
267
|
+
return enemiesDefeated || teamWiped;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Check if combat was a victory
|
|
271
|
+
*/
|
|
272
|
+
export function isCombatVictory(state) {
|
|
273
|
+
return state.enemies.every(e => e.hp <= 0);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Calculate combat rewards
|
|
277
|
+
*/
|
|
278
|
+
export function calculateCombatRewards(state, team, actors) {
|
|
279
|
+
let totalExp = 0;
|
|
280
|
+
let totalGold = 0;
|
|
281
|
+
const items = [];
|
|
282
|
+
for (const enemy of state.enemies) {
|
|
283
|
+
if (enemy.hp <= 0) {
|
|
284
|
+
totalExp += enemy.expReward;
|
|
285
|
+
totalGold += enemy.goldReward;
|
|
286
|
+
// Roll for drops
|
|
287
|
+
for (const drop of enemy.dropTable) {
|
|
288
|
+
if (Math.random() < drop.chance) {
|
|
289
|
+
const quantity = Math.floor(drop.quantity.min + Math.random() * (drop.quantity.max - drop.quantity.min + 1));
|
|
290
|
+
items.push({
|
|
291
|
+
id: drop.itemId,
|
|
292
|
+
type: 'material',
|
|
293
|
+
name: drop.itemId, // Should be looked up from item database
|
|
294
|
+
description: 'Dropped item',
|
|
295
|
+
quantity,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return { exp: totalExp, gold: totalGold, items };
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Finalize combat and distribute rewards
|
|
305
|
+
*/
|
|
306
|
+
export function finalizeCombat(state, team, actors) {
|
|
307
|
+
state.isActive = false;
|
|
308
|
+
const victory = isCombatVictory(state);
|
|
309
|
+
// Get casualties (actors that were knocked out)
|
|
310
|
+
const casualties = team.activeMembers.filter(id => (state.actorHp[id] ?? 0) <= 0);
|
|
311
|
+
// Calculate rewards
|
|
312
|
+
const rewards = victory ? calculateCombatRewards(state, team, actors) : { exp: 0, gold: 0, items: [] };
|
|
313
|
+
// Distribute experience and track level ups
|
|
314
|
+
const levelUps = [];
|
|
315
|
+
if (victory && rewards.exp > 0) {
|
|
316
|
+
const leveledActors = distributeTeamExperience(team, actors, rewards.exp, addExperience);
|
|
317
|
+
levelUps.push(...leveledActors.map(a => a.id));
|
|
318
|
+
}
|
|
319
|
+
// Add gold to team
|
|
320
|
+
if (victory) {
|
|
321
|
+
addTeamGold(team, rewards.gold);
|
|
322
|
+
}
|
|
323
|
+
// Add items to team inventory
|
|
324
|
+
for (const item of rewards.items) {
|
|
325
|
+
addItemToTeam(team, item);
|
|
326
|
+
}
|
|
327
|
+
// Sync final HP back to actors
|
|
328
|
+
for (const actorId of team.activeMembers) {
|
|
329
|
+
const actor = actors[actorId];
|
|
330
|
+
if (actor) {
|
|
331
|
+
actor.stats.hp = state.actorHp[actorId] ?? 0;
|
|
332
|
+
actor.stats.mp = state.actorMp[actorId] ?? actor.stats.mp;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
addCombatLog(state, victory ? 'Victory!' : 'Defeat...', 'system');
|
|
336
|
+
return {
|
|
337
|
+
victory,
|
|
338
|
+
rewards,
|
|
339
|
+
casualties,
|
|
340
|
+
levelUps,
|
|
341
|
+
turns: state.turn,
|
|
342
|
+
combatLog: state.log,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
// ============================================================================
|
|
346
|
+
// Auto-Combat
|
|
347
|
+
// ============================================================================
|
|
348
|
+
/**
|
|
349
|
+
* Run combat automatically until completion
|
|
350
|
+
* Returns the result
|
|
351
|
+
*/
|
|
352
|
+
export function runAutoCombat(team, actors, enemies, combatType = 'mob', callbacks, maxTurns = 100) {
|
|
353
|
+
const state = createTeamCombatState(team, actors, enemies, combatType);
|
|
354
|
+
callbacks?.onCombatStart?.(state);
|
|
355
|
+
while (state.isActive && state.turn < maxTurns) {
|
|
356
|
+
processCombatTurn(state, team, actors, callbacks);
|
|
357
|
+
if (isCombatOver(state, team, actors)) {
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const result = finalizeCombat(state, team, actors);
|
|
362
|
+
callbacks?.onCombatEnd?.(result);
|
|
363
|
+
return result;
|
|
364
|
+
}
|
|
365
|
+
// ============================================================================
|
|
366
|
+
// Helper Functions
|
|
367
|
+
// ============================================================================
|
|
368
|
+
/**
|
|
369
|
+
* Add a log entry to combat state
|
|
370
|
+
*/
|
|
371
|
+
function addCombatLog(state, message, type) {
|
|
372
|
+
state.log.push({
|
|
373
|
+
timestamp: Date.now(),
|
|
374
|
+
message,
|
|
375
|
+
type,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Get current HP percentages for all actors
|
|
380
|
+
*/
|
|
381
|
+
export function getActorHpPercentages(state, team, actors) {
|
|
382
|
+
const percentages = {};
|
|
383
|
+
for (const actorId of team.activeMembers) {
|
|
384
|
+
const actor = actors[actorId];
|
|
385
|
+
if (actor) {
|
|
386
|
+
const currentHp = state.actorHp[actorId] ?? 0;
|
|
387
|
+
percentages[actorId] = actor.stats.maxHp > 0
|
|
388
|
+
? currentHp / actor.stats.maxHp
|
|
389
|
+
: 0;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return percentages;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Get combat status summary
|
|
396
|
+
*/
|
|
397
|
+
export function getCombatStatusSummary(state, team, actors) {
|
|
398
|
+
const aliveActors = team.activeMembers.filter(id => (state.actorHp[id] ?? 0) > 0).length;
|
|
399
|
+
const totalActors = team.activeMembers.length;
|
|
400
|
+
const aliveEnemies = state.enemies.filter(e => e.hp > 0).length;
|
|
401
|
+
const totalEnemies = state.enemies.length;
|
|
402
|
+
return `Turn ${state.turn + 1} | Team: ${aliveActors}/${totalActors} | Enemies: ${aliveEnemies}/${totalEnemies}`;
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=TeamCombat.js.map
|
|
405
|
+
//# debugId=a9c594a5-64d5-55b7-8417-3493432ed48b
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamCombat.js","sources":["core/TeamCombat.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * TeamCombat - Multi-character turn-based combat system\r\n *\r\n * Handles combat involving multiple team members:\r\n * - Turn order based on speed\r\n * - Formation-based damage distribution\r\n * - Individual HP/MP tracking for each actor\r\n * - Experience distribution after combat\r\n */\r\n\r\nimport type {\r\n Actor,\r\n Team,\r\n Enemy,\r\n TeamCombatState,\r\n CombatTurnEntry,\r\n CombatLogEntry,\r\n TeamFormation,\r\n FORMATION_EFFECTS,\r\n InventoryItem,\r\n} from './types.js';\r\nimport {\r\n damageActor,\r\n healActor,\r\n getActorTotalAttack,\r\n getActorTotalDefense,\r\n canActorFight,\r\n addExperience,\r\n} from './Actor.js';\r\nimport {\r\n getActiveActorsForCombat,\r\n isTeamWiped,\r\n distributeTeamExperience,\r\n addItemToTeam,\r\n addTeamGold,\r\n getFormationDamageMultiplier,\r\n isActorOnFrontline,\r\n} from './Team.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface TeamCombatResult {\r\n victory: boolean;\r\n rewards: {\r\n exp: number;\r\n gold: number;\r\n items: InventoryItem[];\r\n };\r\n casualties: string[]; // Actor IDs that were knocked out\r\n levelUps: string[]; // Actor IDs that leveled up\r\n turns: number;\r\n combatLog: CombatLogEntry[];\r\n}\r\n\r\nexport interface TeamCombatCallbacks {\r\n onCombatStart: (state: TeamCombatState) => void;\r\n onTurnStart: (entry: CombatTurnEntry, state: TeamCombatState) => void;\r\n onActorAction: (actorId: string, action: string, target: string, damage: number) => void;\r\n onEnemyAction: (enemyId: string, action: string, target: string, damage: number) => void;\r\n onActorDefeated: (actorId: string) => void;\r\n onEnemyDefeated: (enemyId: string) => void;\r\n onTurnEnd: (state: TeamCombatState) => void;\r\n onCombatEnd: (result: TeamCombatResult) => void;\r\n onLogEntry: (entry: CombatLogEntry) => void;\r\n}\r\n\r\n// ============================================================================\r\n// Combat State Creation\r\n// ============================================================================\r\n\r\n/**\r\n * Create initial combat state from team and enemies\r\n */\r\nexport function createTeamCombatState(\r\n team: Team,\r\n actors: Record<string, Actor>,\r\n enemies: Enemy[],\r\n combatType: TeamCombatState['combatType'] = 'mob'\r\n): TeamCombatState {\r\n // Initialize actor HP/MP from current values\r\n const actorHp: Record<string, number> = {};\r\n const actorMp: Record<string, number> = {};\r\n\r\n for (const actorId of team.activeMembers) {\r\n const actor = actors[actorId];\r\n if (actor) {\r\n actorHp[actorId] = actor.stats.hp;\r\n actorMp[actorId] = actor.stats.mp;\r\n }\r\n }\r\n\r\n // Calculate turn order based on speed\r\n const turnOrder = calculateTurnOrder(team, actors, enemies);\r\n\r\n return {\r\n isActive: true,\r\n turn: 0,\r\n actorHp,\r\n actorMp,\r\n enemies: enemies.map(e => ({ ...e })), // Clone enemies\r\n turnOrder,\r\n currentTurnIndex: 0,\r\n combatType,\r\n log: [],\r\n startTime: Date.now(),\r\n estimatedEndTime: Date.now() + 60000, // Estimate 1 minute\r\n };\r\n}\r\n\r\n/**\r\n * Calculate turn order based on speed\r\n */\r\nfunction calculateTurnOrder(\r\n team: Team,\r\n actors: Record<string, Actor>,\r\n enemies: Enemy[]\r\n): CombatTurnEntry[] {\r\n const entries: CombatTurnEntry[] = [];\r\n\r\n // Add active actors\r\n for (const actorId of team.activeMembers) {\r\n const actor = actors[actorId];\r\n if (actor && canActorFight(actor)) {\r\n entries.push({\r\n type: 'actor',\r\n id: actorId,\r\n name: actor.name,\r\n speed: actor.stats.speed,\r\n isActive: true,\r\n });\r\n }\r\n }\r\n\r\n // Add enemies\r\n for (const enemy of enemies) {\r\n if (enemy.hp > 0) {\r\n entries.push({\r\n type: 'enemy',\r\n id: enemy.id,\r\n name: enemy.name,\r\n speed: enemy.speed,\r\n isActive: true,\r\n });\r\n }\r\n }\r\n\r\n // Sort by speed (highest first)\r\n entries.sort((a, b) => b.speed - a.speed);\r\n\r\n return entries;\r\n}\r\n\r\n// ============================================================================\r\n// Combat Actions\r\n// ============================================================================\r\n\r\n/**\r\n * Execute an actor's attack on an enemy\r\n */\r\nexport function executeActorAttack(\r\n state: TeamCombatState,\r\n actorId: string,\r\n actor: Actor,\r\n targetIndex: number\r\n): { damage: number; defeated: boolean; targetName: string } {\r\n const target = state.enemies[targetIndex];\r\n if (!target || target.hp <= 0) {\r\n // Find first alive enemy\r\n const aliveIndex = state.enemies.findIndex(e => e.hp > 0);\r\n if (aliveIndex === -1) {\r\n return { damage: 0, defeated: false, targetName: 'none' };\r\n }\r\n return executeActorAttack(state, actorId, actor, aliveIndex);\r\n }\r\n\r\n // Calculate damage\r\n const attack = getActorTotalAttack(actor);\r\n const defense = target.defense;\r\n const baseDamage = Math.max(1, attack - defense);\r\n\r\n // Add some variance (±20%)\r\n const variance = 0.8 + Math.random() * 0.4;\r\n const damage = Math.floor(baseDamage * variance);\r\n\r\n // Apply damage\r\n target.hp = Math.max(0, target.hp - damage);\r\n const defeated = target.hp <= 0;\r\n\r\n // Log the action\r\n addCombatLog(state, `${actor.name} attacks ${target.name} for ${damage} damage!`, 'damage');\r\n\r\n if (defeated) {\r\n addCombatLog(state, `${target.name} was defeated!`, 'system');\r\n // Mark in turn order\r\n const turnEntry = state.turnOrder.find(e => e.type === 'enemy' && e.id === target.id);\r\n if (turnEntry) turnEntry.isActive = false;\r\n }\r\n\r\n return { damage, defeated, targetName: target.name };\r\n}\r\n\r\n/**\r\n * Execute an enemy's attack on the team\r\n */\r\nexport function executeEnemyAttack(\r\n state: TeamCombatState,\r\n enemy: Enemy,\r\n team: Team,\r\n actors: Record<string, Actor>\r\n): { damage: number; targetId: string; targetName: string; defeated: boolean } {\r\n // Select target based on formation\r\n const targetId = selectTargetByFormation(state, team, actors);\r\n if (!targetId) {\r\n return { damage: 0, targetId: '', targetName: 'none', defeated: false };\r\n }\r\n\r\n const target = actors[targetId];\r\n if (!target) {\r\n return { damage: 0, targetId: '', targetName: 'none', defeated: false };\r\n }\r\n\r\n // Calculate damage with formation modifier\r\n const attack = enemy.attack;\r\n const defense = getActorTotalDefense(target);\r\n const baseDamage = Math.max(1, attack - defense);\r\n\r\n // Apply formation damage modifier\r\n const formationMod = getFormationDamageMultiplier(team, targetId);\r\n const modifiedDamage = Math.floor(baseDamage * formationMod);\r\n\r\n // Add variance\r\n const variance = 0.8 + Math.random() * 0.4;\r\n const damage = Math.floor(modifiedDamage * variance);\r\n\r\n // Apply damage\r\n const previousHp = state.actorHp[targetId] ?? 0;\r\n state.actorHp[targetId] = Math.max(0, previousHp - damage);\r\n\r\n // Also update the actor's actual HP\r\n target.stats.hp = state.actorHp[targetId];\r\n const defeated = target.stats.hp <= 0;\r\n\r\n // Log the action\r\n addCombatLog(state, `${enemy.name} attacks ${target.name} for ${damage} damage!`, 'damage');\r\n\r\n if (defeated) {\r\n addCombatLog(state, `${target.name} was knocked out!`, 'system');\r\n target.status = 'dead';\r\n // Mark in turn order\r\n const turnEntry = state.turnOrder.find(e => e.type === 'actor' && e.id === targetId);\r\n if (turnEntry) turnEntry.isActive = false;\r\n }\r\n\r\n return { damage, targetId, targetName: target.name, defeated };\r\n}\r\n\r\n/**\r\n * Select target based on formation\r\n * Frontline actors are more likely to be targeted\r\n */\r\nfunction selectTargetByFormation(\r\n state: TeamCombatState,\r\n team: Team,\r\n actors: Record<string, Actor>\r\n): string | null {\r\n const aliveActors: { id: string; isFrontline: boolean }[] = [];\r\n\r\n for (const actorId of team.activeMembers) {\r\n const hp = state.actorHp[actorId] ?? 0;\r\n if (hp > 0) {\r\n aliveActors.push({\r\n id: actorId,\r\n isFrontline: isActorOnFrontline(team, actorId),\r\n });\r\n }\r\n }\r\n\r\n if (aliveActors.length === 0) return null;\r\n\r\n // Frontline actors have higher chance to be targeted\r\n const frontlineActors = aliveActors.filter(a => a.isFrontline);\r\n const backlineActors = aliveActors.filter(a => !a.isFrontline);\r\n\r\n // 80% chance to target frontline if there are frontline actors\r\n if (frontlineActors.length > 0 && Math.random() < 0.8) {\r\n return frontlineActors[Math.floor(Math.random() * frontlineActors.length)].id;\r\n }\r\n\r\n // Otherwise random from all alive\r\n return aliveActors[Math.floor(Math.random() * aliveActors.length)].id;\r\n}\r\n\r\n// ============================================================================\r\n// Combat Resolution\r\n// ============================================================================\r\n\r\n/**\r\n * Process a single turn in combat\r\n */\r\nexport function processCombatTurn(\r\n state: TeamCombatState,\r\n team: Team,\r\n actors: Record<string, Actor>,\r\n callbacks?: Partial<TeamCombatCallbacks>\r\n): void {\r\n if (!state.isActive) return;\r\n\r\n // Get current turn entry\r\n const currentEntry = state.turnOrder[state.currentTurnIndex];\r\n if (!currentEntry || !currentEntry.isActive) {\r\n // Skip to next active entry\r\n advanceToNextTurn(state);\r\n return;\r\n }\r\n\r\n callbacks?.onTurnStart?.(currentEntry, state);\r\n\r\n if (currentEntry.type === 'actor') {\r\n // Actor's turn\r\n const actor = actors[currentEntry.id];\r\n if (actor && canActorFight(actor)) {\r\n // Simple AI: attack random enemy\r\n const aliveEnemies = state.enemies.filter(e => e.hp > 0);\r\n if (aliveEnemies.length > 0) {\r\n const targetIndex = state.enemies.indexOf(\r\n aliveEnemies[Math.floor(Math.random() * aliveEnemies.length)]\r\n );\r\n const result = executeActorAttack(state, currentEntry.id, actor, targetIndex);\r\n callbacks?.onActorAction?.(currentEntry.id, 'attack', result.targetName, result.damage);\r\n if (result.defeated) {\r\n callbacks?.onEnemyDefeated?.(state.enemies[targetIndex].id);\r\n }\r\n }\r\n }\r\n } else {\r\n // Enemy's turn\r\n const enemy = state.enemies.find(e => e.id === currentEntry.id && e.hp > 0);\r\n if (enemy) {\r\n const result = executeEnemyAttack(state, enemy, team, actors);\r\n callbacks?.onEnemyAction?.(currentEntry.id, 'attack', result.targetName, result.damage);\r\n if (result.defeated) {\r\n callbacks?.onActorDefeated?.(result.targetId);\r\n }\r\n }\r\n }\r\n\r\n callbacks?.onTurnEnd?.(state);\r\n\r\n // Advance turn\r\n advanceToNextTurn(state);\r\n}\r\n\r\n/**\r\n * Advance to the next turn\r\n */\r\nfunction advanceToNextTurn(state: TeamCombatState): void {\r\n state.currentTurnIndex++;\r\n\r\n // Wrap around and increment turn counter\r\n if (state.currentTurnIndex >= state.turnOrder.length) {\r\n state.currentTurnIndex = 0;\r\n state.turn++;\r\n\r\n // Recalculate turn order in case speed changed\r\n // (For simplicity, we'll skip this for now)\r\n }\r\n\r\n // Skip inactive entries\r\n let attempts = 0;\r\n while (\r\n attempts < state.turnOrder.length &&\r\n state.turnOrder[state.currentTurnIndex] &&\r\n !state.turnOrder[state.currentTurnIndex].isActive\r\n ) {\r\n state.currentTurnIndex++;\r\n if (state.currentTurnIndex >= state.turnOrder.length) {\r\n state.currentTurnIndex = 0;\r\n state.turn++;\r\n }\r\n attempts++;\r\n }\r\n}\r\n\r\n/**\r\n * Check if combat should end\r\n */\r\nexport function isCombatOver(state: TeamCombatState, team: Team, actors: Record<string, Actor>): boolean {\r\n // Check if all enemies are defeated\r\n const enemiesDefeated = state.enemies.every(e => e.hp <= 0);\r\n\r\n // Check if team is wiped\r\n const teamWiped = team.activeMembers.every(id => (state.actorHp[id] ?? 0) <= 0);\r\n\r\n return enemiesDefeated || teamWiped;\r\n}\r\n\r\n/**\r\n * Check if combat was a victory\r\n */\r\nexport function isCombatVictory(state: TeamCombatState): boolean {\r\n return state.enemies.every(e => e.hp <= 0);\r\n}\r\n\r\n/**\r\n * Calculate combat rewards\r\n */\r\nexport function calculateCombatRewards(\r\n state: TeamCombatState,\r\n team: Team,\r\n actors: Record<string, Actor>\r\n): TeamCombatResult['rewards'] {\r\n let totalExp = 0;\r\n let totalGold = 0;\r\n const items: InventoryItem[] = [];\r\n\r\n for (const enemy of state.enemies) {\r\n if (enemy.hp <= 0) {\r\n totalExp += enemy.expReward;\r\n totalGold += 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 const quantity = Math.floor(\r\n drop.quantity.min + Math.random() * (drop.quantity.max - drop.quantity.min + 1)\r\n );\r\n items.push({\r\n id: drop.itemId,\r\n type: 'material',\r\n name: drop.itemId, // Should be looked up from item database\r\n description: 'Dropped item',\r\n quantity,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { exp: totalExp, gold: totalGold, items };\r\n}\r\n\r\n/**\r\n * Finalize combat and distribute rewards\r\n */\r\nexport function finalizeCombat(\r\n state: TeamCombatState,\r\n team: Team,\r\n actors: Record<string, Actor>\r\n): TeamCombatResult {\r\n state.isActive = false;\r\n const victory = isCombatVictory(state);\r\n\r\n // Get casualties (actors that were knocked out)\r\n const casualties = team.activeMembers.filter(id => (state.actorHp[id] ?? 0) <= 0);\r\n\r\n // Calculate rewards\r\n const rewards = victory ? calculateCombatRewards(state, team, actors) : { exp: 0, gold: 0, items: [] };\r\n\r\n // Distribute experience and track level ups\r\n const levelUps: string[] = [];\r\n if (victory && rewards.exp > 0) {\r\n const leveledActors = distributeTeamExperience(team, actors, rewards.exp, addExperience);\r\n levelUps.push(...leveledActors.map(a => a.id));\r\n }\r\n\r\n // Add gold to team\r\n if (victory) {\r\n addTeamGold(team, rewards.gold);\r\n }\r\n\r\n // Add items to team inventory\r\n for (const item of rewards.items) {\r\n addItemToTeam(team, item);\r\n }\r\n\r\n // Sync final HP back to actors\r\n for (const actorId of team.activeMembers) {\r\n const actor = actors[actorId];\r\n if (actor) {\r\n actor.stats.hp = state.actorHp[actorId] ?? 0;\r\n actor.stats.mp = state.actorMp[actorId] ?? actor.stats.mp;\r\n }\r\n }\r\n\r\n addCombatLog(state, victory ? 'Victory!' : 'Defeat...', 'system');\r\n\r\n return {\r\n victory,\r\n rewards,\r\n casualties,\r\n levelUps,\r\n turns: state.turn,\r\n combatLog: state.log,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Auto-Combat\r\n// ============================================================================\r\n\r\n/**\r\n * Run combat automatically until completion\r\n * Returns the result\r\n */\r\nexport function runAutoCombat(\r\n team: Team,\r\n actors: Record<string, Actor>,\r\n enemies: Enemy[],\r\n combatType: TeamCombatState['combatType'] = 'mob',\r\n callbacks?: Partial<TeamCombatCallbacks>,\r\n maxTurns: number = 100\r\n): TeamCombatResult {\r\n const state = createTeamCombatState(team, actors, enemies, combatType);\r\n callbacks?.onCombatStart?.(state);\r\n\r\n while (state.isActive && state.turn < maxTurns) {\r\n processCombatTurn(state, team, actors, callbacks);\r\n\r\n if (isCombatOver(state, team, actors)) {\r\n break;\r\n }\r\n }\r\n\r\n const result = finalizeCombat(state, team, actors);\r\n callbacks?.onCombatEnd?.(result);\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Add a log entry to combat state\r\n */\r\nfunction addCombatLog(\r\n state: TeamCombatState,\r\n message: string,\r\n type: CombatLogEntry['type']\r\n): void {\r\n state.log.push({\r\n timestamp: Date.now(),\r\n message,\r\n type,\r\n });\r\n}\r\n\r\n/**\r\n * Get current HP percentages for all actors\r\n */\r\nexport function getActorHpPercentages(\r\n state: TeamCombatState,\r\n team: Team,\r\n actors: Record<string, Actor>\r\n): Record<string, number> {\r\n const percentages: Record<string, number> = {};\r\n\r\n for (const actorId of team.activeMembers) {\r\n const actor = actors[actorId];\r\n if (actor) {\r\n const currentHp = state.actorHp[actorId] ?? 0;\r\n percentages[actorId] = actor.stats.maxHp > 0\r\n ? currentHp / actor.stats.maxHp\r\n : 0;\r\n }\r\n }\r\n\r\n return percentages;\r\n}\r\n\r\n/**\r\n * Get combat status summary\r\n */\r\nexport function getCombatStatusSummary(\r\n state: TeamCombatState,\r\n team: Team,\r\n actors: Record<string, Actor>\r\n): string {\r\n const aliveActors = team.activeMembers.filter(id => (state.actorHp[id] ?? 0) > 0).length;\r\n const totalActors = team.activeMembers.length;\r\n const aliveEnemies = state.enemies.filter(e => e.hp > 0).length;\r\n const totalEnemies = state.enemies.length;\r\n\r\n return `Turn ${state.turn + 1} | Team: ${aliveActors}/${totalActors} | Enemies: ${aliveEnemies}/${totalEnemies}`;\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"a9c594a5-64d5-55b7-8417-3493432ed48b"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Dungeon Runner
|
|
3
|
+
* Extends DungeonRunner for multi-character team exploration
|
|
4
|
+
*
|
|
5
|
+
* Key differences from single-player DungeonRunner:
|
|
6
|
+
* - Tracks HP/MP for each team member individually
|
|
7
|
+
* - Uses TeamCombat for multi-character battles
|
|
8
|
+
* - Experience is distributed among all active members
|
|
9
|
+
* - Dead actors move to reserve, can be revived in safe areas
|
|
10
|
+
* - Formation affects damage distribution
|
|
11
|
+
*/
|
|
12
|
+
import type { Actor, Team, Dungeon, DungeonRoom, StrategyStateMachine, ActiveDungeonState, InventoryItem, Enemy, TeamCombatState } from './types.js';
|
|
13
|
+
import { type StrategyExecutor } from '../strategy/index.js';
|
|
14
|
+
import { type TeamCombatResult } from './TeamCombat.js';
|
|
15
|
+
export type TeamDungeonPhase = 'idle' | 'entering' | 'exploring' | 'in_combat' | 'processing_room' | 'moving' | 'descending' | 'returning' | 'completed' | 'failed';
|
|
16
|
+
export interface TeamDungeonState {
|
|
17
|
+
phase: TeamDungeonPhase;
|
|
18
|
+
dungeon: Dungeon;
|
|
19
|
+
currentLevel: number;
|
|
20
|
+
currentRoomId: string;
|
|
21
|
+
exploredRooms: Set<string>;
|
|
22
|
+
clearedRooms: Set<string>;
|
|
23
|
+
strategy: StrategyStateMachine;
|
|
24
|
+
strategyExecutor: StrategyExecutor;
|
|
25
|
+
activeCombat: TeamCombatState | null;
|
|
26
|
+
actorHp: Record<string, number>;
|
|
27
|
+
actorMp: Record<string, number>;
|
|
28
|
+
lootCollected: InventoryItem[];
|
|
29
|
+
goldCollected: number;
|
|
30
|
+
expGained: number;
|
|
31
|
+
enemiesKilled: number;
|
|
32
|
+
startTime: number;
|
|
33
|
+
eventLog: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface TeamDungeonCallbacks {
|
|
36
|
+
onPhaseChange: (phase: TeamDungeonPhase, state: TeamDungeonState) => void;
|
|
37
|
+
onRoomEnter: (room: DungeonRoom, state: TeamDungeonState) => void;
|
|
38
|
+
onCombatStart: (enemies: Enemy[], state: TeamDungeonState) => void;
|
|
39
|
+
onCombatTurn: (state: TeamDungeonState) => void;
|
|
40
|
+
onCombatEnd: (result: TeamCombatResult, state: TeamDungeonState) => void;
|
|
41
|
+
onActorDefeated: (actorId: string, actorName: string, state: TeamDungeonState) => void;
|
|
42
|
+
onActorLevelUp: (actorId: string, actorName: string, newLevel: number, state: TeamDungeonState) => void;
|
|
43
|
+
onLevelComplete: (level: number, state: TeamDungeonState) => void;
|
|
44
|
+
onDungeonComplete: (state: TeamDungeonState) => void;
|
|
45
|
+
onDungeonFailed: (reason: string, state: TeamDungeonState) => void;
|
|
46
|
+
onEventLog: (message: string, state: TeamDungeonState) => void;
|
|
47
|
+
}
|
|
48
|
+
export declare class TeamDungeonRunner {
|
|
49
|
+
private state;
|
|
50
|
+
private team;
|
|
51
|
+
private actors;
|
|
52
|
+
private timeManager;
|
|
53
|
+
private callbacks;
|
|
54
|
+
private isPaused;
|
|
55
|
+
constructor(team: Team, actors: Record<string, Actor>);
|
|
56
|
+
/**
|
|
57
|
+
* Set callbacks for dungeon events
|
|
58
|
+
*/
|
|
59
|
+
setCallbacks(callbacks: Partial<TeamDungeonCallbacks>): void;
|
|
60
|
+
/**
|
|
61
|
+
* Start a dungeon run with the team
|
|
62
|
+
*/
|
|
63
|
+
startDungeon(dungeon: Dungeon, strategy: StrategyStateMachine): void;
|
|
64
|
+
/**
|
|
65
|
+
* Get current state
|
|
66
|
+
*/
|
|
67
|
+
getState(): TeamDungeonState | null;
|
|
68
|
+
/**
|
|
69
|
+
* Get current room
|
|
70
|
+
*/
|
|
71
|
+
getCurrentRoom(): DungeonRoom | null;
|
|
72
|
+
/**
|
|
73
|
+
* Pause dungeon exploration
|
|
74
|
+
*/
|
|
75
|
+
pause(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Resume dungeon exploration
|
|
78
|
+
*/
|
|
79
|
+
resume(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Abort dungeon run
|
|
82
|
+
*/
|
|
83
|
+
abort(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Get active dungeon state for saving
|
|
86
|
+
*/
|
|
87
|
+
getActiveDungeonState(): ActiveDungeonState | null;
|
|
88
|
+
/**
|
|
89
|
+
* Handle time action completion
|
|
90
|
+
*/
|
|
91
|
+
private handleActionComplete;
|
|
92
|
+
/**
|
|
93
|
+
* Enter a room
|
|
94
|
+
*/
|
|
95
|
+
private enterRoom;
|
|
96
|
+
/**
|
|
97
|
+
* Process current room based on type
|
|
98
|
+
*/
|
|
99
|
+
private processRoom;
|
|
100
|
+
/**
|
|
101
|
+
* Start combat in room using TeamCombat
|
|
102
|
+
*/
|
|
103
|
+
private startCombat;
|
|
104
|
+
/**
|
|
105
|
+
* Queue next combat turn
|
|
106
|
+
*/
|
|
107
|
+
private queueCombatTurn;
|
|
108
|
+
/**
|
|
109
|
+
* Process combat turn
|
|
110
|
+
*/
|
|
111
|
+
private processCombatTurn;
|
|
112
|
+
/**
|
|
113
|
+
* End combat and process results
|
|
114
|
+
*/
|
|
115
|
+
private endCombat;
|
|
116
|
+
/**
|
|
117
|
+
* Process treasure room
|
|
118
|
+
*/
|
|
119
|
+
private processTreasureRoom;
|
|
120
|
+
/**
|
|
121
|
+
* Process fountain room (heal all team members)
|
|
122
|
+
*/
|
|
123
|
+
private processFountainRoom;
|
|
124
|
+
/**
|
|
125
|
+
* Process safe room - can revive dead members
|
|
126
|
+
*/
|
|
127
|
+
private processSafeRoom;
|
|
128
|
+
/**
|
|
129
|
+
* Process altar room (buff)
|
|
130
|
+
*/
|
|
131
|
+
private processAltarRoom;
|
|
132
|
+
/**
|
|
133
|
+
* Process shop room
|
|
134
|
+
*/
|
|
135
|
+
private processShopRoom;
|
|
136
|
+
/**
|
|
137
|
+
* Process trap room (damage to frontline)
|
|
138
|
+
*/
|
|
139
|
+
private processTrapRoom;
|
|
140
|
+
/**
|
|
141
|
+
* Apply trap damage to team
|
|
142
|
+
*/
|
|
143
|
+
private applyTrapDamage;
|
|
144
|
+
/**
|
|
145
|
+
* Process event/encounter room
|
|
146
|
+
*/
|
|
147
|
+
private processEventRoom;
|
|
148
|
+
/**
|
|
149
|
+
* Process exit room
|
|
150
|
+
*/
|
|
151
|
+
private processExitRoom;
|
|
152
|
+
/**
|
|
153
|
+
* Descend to next dungeon level
|
|
154
|
+
*/
|
|
155
|
+
private descendToNextLevel;
|
|
156
|
+
/**
|
|
157
|
+
* After room is processed, decide next action
|
|
158
|
+
*/
|
|
159
|
+
private afterRoomProcessed;
|
|
160
|
+
/**
|
|
161
|
+
* Execute exploration decision
|
|
162
|
+
*/
|
|
163
|
+
private executeExplorationDecision;
|
|
164
|
+
/**
|
|
165
|
+
* Get team's average HP percentage
|
|
166
|
+
*/
|
|
167
|
+
private getTeamHpPercent;
|
|
168
|
+
/**
|
|
169
|
+
* Get team's average MP percentage
|
|
170
|
+
*/
|
|
171
|
+
private getTeamMpPercent;
|
|
172
|
+
/**
|
|
173
|
+
* Set phase and notify callback
|
|
174
|
+
*/
|
|
175
|
+
private setPhase;
|
|
176
|
+
/**
|
|
177
|
+
* Add to event log
|
|
178
|
+
*/
|
|
179
|
+
private log;
|
|
180
|
+
/**
|
|
181
|
+
* Finish dungeon run
|
|
182
|
+
*/
|
|
183
|
+
private finishDungeon;
|
|
184
|
+
}
|
|
185
|
+
export declare function createTeamDungeonRunner(team: Team, actors: Record<string, Actor>): TeamDungeonRunner;
|
|
186
|
+
//# sourceMappingURL=TeamDungeonRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamDungeonRunner.d.ts","sourceRoot":"/","sources":["core/TeamDungeonRunner.ts"],"names":[],"mappings":"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"}
|