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,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team - Functions for creating and managing character teams
|
|
3
|
+
*
|
|
4
|
+
* A Team consists of up to 4 active members and any number of reserve members.
|
|
5
|
+
* Teams share inventory, gold, and position on the map.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
!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]="a833c558-3d87-597b-90d7-ce06f9993349")}catch(e){}}();
|
|
9
|
+
import { playerToActor, canActorFight, isActorAlive } from './Actor.js';
|
|
10
|
+
import { DEFAULT_STRATEGY } from '../strategy/defaultStrategy.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Maximum number of active members in a team
|
|
16
|
+
*/
|
|
17
|
+
export const MAX_ACTIVE_MEMBERS = 4;
|
|
18
|
+
/**
|
|
19
|
+
* Default team location (starting town)
|
|
20
|
+
*/
|
|
21
|
+
export const DEFAULT_LOCATION = {
|
|
22
|
+
type: 'town',
|
|
23
|
+
continentId: 'verdantia',
|
|
24
|
+
townId: 'willowbrook',
|
|
25
|
+
};
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Team Creation
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Create a new empty team
|
|
31
|
+
*/
|
|
32
|
+
export function createTeam(name, leaderId) {
|
|
33
|
+
return {
|
|
34
|
+
id: `team_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`,
|
|
35
|
+
name,
|
|
36
|
+
activeMembers: leaderId ? [leaderId] : [],
|
|
37
|
+
reserveMembers: [],
|
|
38
|
+
sharedInventory: [],
|
|
39
|
+
sharedGold: 50, // Starting gold
|
|
40
|
+
position: { x: 0, y: 0, floor: 1 },
|
|
41
|
+
currentLocation: { ...DEFAULT_LOCATION },
|
|
42
|
+
formation: 'line',
|
|
43
|
+
strategy: { ...DEFAULT_STRATEGY },
|
|
44
|
+
createdAt: Date.now(),
|
|
45
|
+
totalPlayTime: 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a team with a single actor (for migration from single-player)
|
|
50
|
+
*/
|
|
51
|
+
export function createTeamWithActor(actor, teamName) {
|
|
52
|
+
const team = createTeam(teamName || `${actor.name}'s Team`, actor.id);
|
|
53
|
+
team.sharedGold = actor.stats.gold; // Transfer gold to team
|
|
54
|
+
actor.stats.gold = 0;
|
|
55
|
+
actor.teamId = team.id;
|
|
56
|
+
return team;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a team from a legacy Player
|
|
60
|
+
* Used for save migration
|
|
61
|
+
*/
|
|
62
|
+
export function createTeamFromPlayer(player) {
|
|
63
|
+
const actor = playerToActor(player);
|
|
64
|
+
const team = createTeamWithActor(actor, `${player.name}'s Team`);
|
|
65
|
+
return { team, actor };
|
|
66
|
+
}
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// Team Membership Management
|
|
69
|
+
// ============================================================================
|
|
70
|
+
/**
|
|
71
|
+
* Add an actor to the team's active roster
|
|
72
|
+
* Returns false if team is full
|
|
73
|
+
*/
|
|
74
|
+
export function addActiveTeamMember(team, actor) {
|
|
75
|
+
if (team.activeMembers.length >= MAX_ACTIVE_MEMBERS) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (team.activeMembers.includes(actor.id)) {
|
|
79
|
+
return true; // Already in active
|
|
80
|
+
}
|
|
81
|
+
// Remove from reserve if present
|
|
82
|
+
const reserveIndex = team.reserveMembers.indexOf(actor.id);
|
|
83
|
+
if (reserveIndex !== -1) {
|
|
84
|
+
team.reserveMembers.splice(reserveIndex, 1);
|
|
85
|
+
}
|
|
86
|
+
team.activeMembers.push(actor.id);
|
|
87
|
+
actor.teamId = team.id;
|
|
88
|
+
actor.status = 'active';
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Move an actor to the reserve roster
|
|
93
|
+
*/
|
|
94
|
+
export function moveToReserve(team, actor) {
|
|
95
|
+
const activeIndex = team.activeMembers.indexOf(actor.id);
|
|
96
|
+
if (activeIndex !== -1) {
|
|
97
|
+
team.activeMembers.splice(activeIndex, 1);
|
|
98
|
+
}
|
|
99
|
+
if (!team.reserveMembers.includes(actor.id)) {
|
|
100
|
+
team.reserveMembers.push(actor.id);
|
|
101
|
+
}
|
|
102
|
+
actor.status = 'reserve';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Remove an actor from the team entirely
|
|
106
|
+
*/
|
|
107
|
+
export function removeFromTeam(team, actor) {
|
|
108
|
+
const activeIndex = team.activeMembers.indexOf(actor.id);
|
|
109
|
+
if (activeIndex !== -1) {
|
|
110
|
+
team.activeMembers.splice(activeIndex, 1);
|
|
111
|
+
}
|
|
112
|
+
const reserveIndex = team.reserveMembers.indexOf(actor.id);
|
|
113
|
+
if (reserveIndex !== -1) {
|
|
114
|
+
team.reserveMembers.splice(reserveIndex, 1);
|
|
115
|
+
}
|
|
116
|
+
actor.teamId = undefined;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Swap positions of two active members
|
|
120
|
+
*/
|
|
121
|
+
export function swapActivePositions(team, index1, index2) {
|
|
122
|
+
if (index1 < 0 || index1 >= team.activeMembers.length ||
|
|
123
|
+
index2 < 0 || index2 >= team.activeMembers.length) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
[team.activeMembers[index1], team.activeMembers[index2]] =
|
|
127
|
+
[team.activeMembers[index2], team.activeMembers[index1]];
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Set the team leader (move to position 0)
|
|
132
|
+
*/
|
|
133
|
+
export function setTeamLeader(team, actorId) {
|
|
134
|
+
const currentIndex = team.activeMembers.indexOf(actorId);
|
|
135
|
+
if (currentIndex === -1)
|
|
136
|
+
return false;
|
|
137
|
+
if (currentIndex === 0)
|
|
138
|
+
return true; // Already leader
|
|
139
|
+
return swapActivePositions(team, 0, currentIndex);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the team leader ID
|
|
143
|
+
*/
|
|
144
|
+
export function getTeamLeaderId(team) {
|
|
145
|
+
return team.activeMembers[0] ?? null;
|
|
146
|
+
}
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// Team Combat Helpers
|
|
149
|
+
// ============================================================================
|
|
150
|
+
/**
|
|
151
|
+
* Get actors that can fight (active status, HP > 0)
|
|
152
|
+
*/
|
|
153
|
+
export function getActiveActorsForCombat(team, actors) {
|
|
154
|
+
return team.activeMembers
|
|
155
|
+
.map(id => actors[id])
|
|
156
|
+
.filter((actor) => actor !== undefined && canActorFight(actor));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get all active members regardless of combat status
|
|
160
|
+
*/
|
|
161
|
+
export function getActiveMembers(team, actors) {
|
|
162
|
+
return team.activeMembers
|
|
163
|
+
.map(id => actors[id])
|
|
164
|
+
.filter((actor) => actor !== undefined);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get reserve members
|
|
168
|
+
*/
|
|
169
|
+
export function getReserveMembers(team, actors) {
|
|
170
|
+
return team.reserveMembers
|
|
171
|
+
.map(id => actors[id])
|
|
172
|
+
.filter((actor) => actor !== undefined);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if all active members are dead
|
|
176
|
+
*/
|
|
177
|
+
export function isTeamWiped(team, actors) {
|
|
178
|
+
return team.activeMembers.every(id => {
|
|
179
|
+
const actor = actors[id];
|
|
180
|
+
return !actor || !isActorAlive(actor);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get total team level (sum of all active members)
|
|
185
|
+
*/
|
|
186
|
+
export function getTeamTotalLevel(team, actors) {
|
|
187
|
+
return team.activeMembers.reduce((sum, id) => {
|
|
188
|
+
const actor = actors[id];
|
|
189
|
+
return sum + (actor?.stats.level ?? 0);
|
|
190
|
+
}, 0);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get average team level
|
|
194
|
+
*/
|
|
195
|
+
export function getTeamAverageLevel(team, actors) {
|
|
196
|
+
if (team.activeMembers.length === 0)
|
|
197
|
+
return 0;
|
|
198
|
+
return Math.floor(getTeamTotalLevel(team, actors) / team.activeMembers.length);
|
|
199
|
+
}
|
|
200
|
+
// ============================================================================
|
|
201
|
+
// Team Formation
|
|
202
|
+
// ============================================================================
|
|
203
|
+
/**
|
|
204
|
+
* Set the team's formation
|
|
205
|
+
*/
|
|
206
|
+
export function setTeamFormation(team, formation) {
|
|
207
|
+
team.formation = formation;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get the position index for an actor in the team
|
|
211
|
+
* Returns -1 if not found
|
|
212
|
+
*/
|
|
213
|
+
export function getActorFormationPosition(team, actorId) {
|
|
214
|
+
return team.activeMembers.indexOf(actorId);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if an actor is on the frontline based on formation
|
|
218
|
+
*/
|
|
219
|
+
export function isActorOnFrontline(team, actorId) {
|
|
220
|
+
const position = getActorFormationPosition(team, actorId);
|
|
221
|
+
if (position === -1)
|
|
222
|
+
return false;
|
|
223
|
+
// Import formation effects
|
|
224
|
+
const { FORMATION_EFFECTS } = require('./types.js');
|
|
225
|
+
const config = FORMATION_EFFECTS[team.formation];
|
|
226
|
+
return config.frontline.includes(position);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get damage multiplier for an actor based on formation
|
|
230
|
+
*/
|
|
231
|
+
export function getFormationDamageMultiplier(team, actorId) {
|
|
232
|
+
const position = getActorFormationPosition(team, actorId);
|
|
233
|
+
if (position === -1)
|
|
234
|
+
return 0;
|
|
235
|
+
// Import formation effects
|
|
236
|
+
const { FORMATION_EFFECTS } = require('./types.js');
|
|
237
|
+
const config = FORMATION_EFFECTS[team.formation];
|
|
238
|
+
return config.damage[position] ?? 1.0;
|
|
239
|
+
}
|
|
240
|
+
// ============================================================================
|
|
241
|
+
// Team Inventory & Resources
|
|
242
|
+
// ============================================================================
|
|
243
|
+
/**
|
|
244
|
+
* Add gold to team's shared pool
|
|
245
|
+
*/
|
|
246
|
+
export function addTeamGold(team, amount) {
|
|
247
|
+
team.sharedGold += amount;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Spend gold from team's shared pool
|
|
251
|
+
* Returns true if successful
|
|
252
|
+
*/
|
|
253
|
+
export function spendTeamGold(team, amount) {
|
|
254
|
+
if (team.sharedGold < amount)
|
|
255
|
+
return false;
|
|
256
|
+
team.sharedGold -= amount;
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Add item to team's shared inventory
|
|
261
|
+
*/
|
|
262
|
+
export function addItemToTeam(team, item) {
|
|
263
|
+
const existing = team.sharedInventory.find(i => i.id === item.id && i.type === item.type);
|
|
264
|
+
if (existing) {
|
|
265
|
+
existing.quantity += item.quantity;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
team.sharedInventory.push({ ...item });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Remove item from team's shared inventory
|
|
273
|
+
* Returns true if successful
|
|
274
|
+
*/
|
|
275
|
+
export function removeItemFromTeam(team, itemId, quantity = 1) {
|
|
276
|
+
const index = team.sharedInventory.findIndex(i => i.id === itemId);
|
|
277
|
+
if (index === -1)
|
|
278
|
+
return false;
|
|
279
|
+
const item = team.sharedInventory[index];
|
|
280
|
+
if (item.quantity < quantity)
|
|
281
|
+
return false;
|
|
282
|
+
item.quantity -= quantity;
|
|
283
|
+
if (item.quantity <= 0) {
|
|
284
|
+
team.sharedInventory.splice(index, 1);
|
|
285
|
+
}
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
// ============================================================================
|
|
289
|
+
// Team Experience Distribution
|
|
290
|
+
// ============================================================================
|
|
291
|
+
/**
|
|
292
|
+
* Distribute experience evenly among active team members
|
|
293
|
+
* Returns actors that leveled up
|
|
294
|
+
*/
|
|
295
|
+
export function distributeTeamExperience(team, actors, totalExp, addExperienceFn) {
|
|
296
|
+
const activeActors = getActiveActorsForCombat(team, actors);
|
|
297
|
+
if (activeActors.length === 0)
|
|
298
|
+
return [];
|
|
299
|
+
const expPerActor = Math.floor(totalExp / activeActors.length);
|
|
300
|
+
const leveledUp = [];
|
|
301
|
+
for (const actor of activeActors) {
|
|
302
|
+
if (addExperienceFn(actor, expPerActor)) {
|
|
303
|
+
leveledUp.push(actor);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return leveledUp;
|
|
307
|
+
}
|
|
308
|
+
// ============================================================================
|
|
309
|
+
// Team Movement & Location
|
|
310
|
+
// ============================================================================
|
|
311
|
+
/**
|
|
312
|
+
* Update team position
|
|
313
|
+
*/
|
|
314
|
+
export function setTeamPosition(team, position) {
|
|
315
|
+
team.position = { ...position };
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Update team location
|
|
319
|
+
*/
|
|
320
|
+
export function setTeamLocation(team, location) {
|
|
321
|
+
team.currentLocation = { ...location };
|
|
322
|
+
}
|
|
323
|
+
// ============================================================================
|
|
324
|
+
// Team Strategy
|
|
325
|
+
// ============================================================================
|
|
326
|
+
/**
|
|
327
|
+
* Update team strategy
|
|
328
|
+
*/
|
|
329
|
+
export function setTeamStrategy(team, strategy) {
|
|
330
|
+
team.strategy = { ...strategy };
|
|
331
|
+
}
|
|
332
|
+
// ============================================================================
|
|
333
|
+
// Team Display Helpers
|
|
334
|
+
// ============================================================================
|
|
335
|
+
/**
|
|
336
|
+
* Get team summary for display
|
|
337
|
+
*/
|
|
338
|
+
export function getTeamSummary(team, actors) {
|
|
339
|
+
const activeCount = team.activeMembers.length;
|
|
340
|
+
const reserveCount = team.reserveMembers.length;
|
|
341
|
+
const avgLevel = getTeamAverageLevel(team, actors);
|
|
342
|
+
return `${team.name} (${activeCount}/4 active, ${reserveCount} reserve, Avg Lv${avgLevel})`;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get formation display name
|
|
346
|
+
*/
|
|
347
|
+
export function getFormationDisplayName(formation) {
|
|
348
|
+
switch (formation) {
|
|
349
|
+
case 'line': return 'Line';
|
|
350
|
+
case 'wedge': return 'Wedge';
|
|
351
|
+
case 'defensive': return 'Defensive';
|
|
352
|
+
case 'spread': return 'Spread';
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Get formation description
|
|
357
|
+
*/
|
|
358
|
+
export function getFormationDescription(formation) {
|
|
359
|
+
switch (formation) {
|
|
360
|
+
case 'line':
|
|
361
|
+
return 'Leader takes full damage, others take 50%';
|
|
362
|
+
case 'wedge':
|
|
363
|
+
return 'Front 2 take 80% damage, back 2 take 40%';
|
|
364
|
+
case 'defensive':
|
|
365
|
+
return 'Front 3 take 60% damage, last takes 20%';
|
|
366
|
+
case 'spread':
|
|
367
|
+
return 'All take 50% damage, no protection';
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=Team.js.map
|
|
371
|
+
//# debugId=a833c558-3d87-597b-90d7-ce06f9993349
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Team.js","sources":["core/Team.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * Team - Functions for creating and managing character teams\r\n *\r\n * A Team consists of up to 4 active members and any number of reserve members.\r\n * Teams share inventory, gold, and position on the map.\r\n */\r\n\r\nimport type {\r\n Team,\r\n Actor,\r\n Player,\r\n TeamFormation,\r\n StrategyStateMachine,\r\n CurrentLocation,\r\n Position,\r\n InventoryItem,\r\n FORMATION_EFFECTS,\r\n} from './types.js';\r\nimport { createActor, playerToActor, canActorFight, isActorAlive } from './Actor.js';\r\nimport { DEFAULT_STRATEGY } from '../strategy/defaultStrategy.js';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Maximum number of active members in a team\r\n */\r\nexport const MAX_ACTIVE_MEMBERS = 4;\r\n\r\n/**\r\n * Default team location (starting town)\r\n */\r\nexport const DEFAULT_LOCATION: CurrentLocation = {\r\n type: 'town',\r\n continentId: 'verdantia',\r\n townId: 'willowbrook',\r\n};\r\n\r\n// ============================================================================\r\n// Team Creation\r\n// ============================================================================\r\n\r\n/**\r\n * Create a new empty team\r\n */\r\nexport function createTeam(name: string, leaderId?: string): Team {\r\n return {\r\n id: `team_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`,\r\n name,\r\n activeMembers: leaderId ? [leaderId] : [],\r\n reserveMembers: [],\r\n sharedInventory: [],\r\n sharedGold: 50, // Starting gold\r\n position: { x: 0, y: 0, floor: 1 },\r\n currentLocation: { ...DEFAULT_LOCATION },\r\n formation: 'line',\r\n strategy: { ...DEFAULT_STRATEGY },\r\n createdAt: Date.now(),\r\n totalPlayTime: 0,\r\n };\r\n}\r\n\r\n/**\r\n * Create a team with a single actor (for migration from single-player)\r\n */\r\nexport function createTeamWithActor(actor: Actor, teamName?: string): Team {\r\n const team = createTeam(teamName || `${actor.name}'s Team`, actor.id);\r\n team.sharedGold = actor.stats.gold; // Transfer gold to team\r\n actor.stats.gold = 0;\r\n actor.teamId = team.id;\r\n return team;\r\n}\r\n\r\n/**\r\n * Create a team from a legacy Player\r\n * Used for save migration\r\n */\r\nexport function createTeamFromPlayer(player: Player): { team: Team; actor: Actor } {\r\n const actor = playerToActor(player);\r\n const team = createTeamWithActor(actor, `${player.name}'s Team`);\r\n return { team, actor };\r\n}\r\n\r\n// ============================================================================\r\n// Team Membership Management\r\n// ============================================================================\r\n\r\n/**\r\n * Add an actor to the team's active roster\r\n * Returns false if team is full\r\n */\r\nexport function addActiveTeamMember(team: Team, actor: Actor): boolean {\r\n if (team.activeMembers.length >= MAX_ACTIVE_MEMBERS) {\r\n return false;\r\n }\r\n if (team.activeMembers.includes(actor.id)) {\r\n return true; // Already in active\r\n }\r\n // Remove from reserve if present\r\n const reserveIndex = team.reserveMembers.indexOf(actor.id);\r\n if (reserveIndex !== -1) {\r\n team.reserveMembers.splice(reserveIndex, 1);\r\n }\r\n team.activeMembers.push(actor.id);\r\n actor.teamId = team.id;\r\n actor.status = 'active';\r\n return true;\r\n}\r\n\r\n/**\r\n * Move an actor to the reserve roster\r\n */\r\nexport function moveToReserve(team: Team, actor: Actor): void {\r\n const activeIndex = team.activeMembers.indexOf(actor.id);\r\n if (activeIndex !== -1) {\r\n team.activeMembers.splice(activeIndex, 1);\r\n }\r\n if (!team.reserveMembers.includes(actor.id)) {\r\n team.reserveMembers.push(actor.id);\r\n }\r\n actor.status = 'reserve';\r\n}\r\n\r\n/**\r\n * Remove an actor from the team entirely\r\n */\r\nexport function removeFromTeam(team: Team, actor: Actor): void {\r\n const activeIndex = team.activeMembers.indexOf(actor.id);\r\n if (activeIndex !== -1) {\r\n team.activeMembers.splice(activeIndex, 1);\r\n }\r\n const reserveIndex = team.reserveMembers.indexOf(actor.id);\r\n if (reserveIndex !== -1) {\r\n team.reserveMembers.splice(reserveIndex, 1);\r\n }\r\n actor.teamId = undefined;\r\n}\r\n\r\n/**\r\n * Swap positions of two active members\r\n */\r\nexport function swapActivePositions(team: Team, index1: number, index2: number): boolean {\r\n if (index1 < 0 || index1 >= team.activeMembers.length ||\r\n index2 < 0 || index2 >= team.activeMembers.length) {\r\n return false;\r\n }\r\n [team.activeMembers[index1], team.activeMembers[index2]] =\r\n [team.activeMembers[index2], team.activeMembers[index1]];\r\n return true;\r\n}\r\n\r\n/**\r\n * Set the team leader (move to position 0)\r\n */\r\nexport function setTeamLeader(team: Team, actorId: string): boolean {\r\n const currentIndex = team.activeMembers.indexOf(actorId);\r\n if (currentIndex === -1) return false;\r\n if (currentIndex === 0) return true; // Already leader\r\n return swapActivePositions(team, 0, currentIndex);\r\n}\r\n\r\n/**\r\n * Get the team leader ID\r\n */\r\nexport function getTeamLeaderId(team: Team): string | null {\r\n return team.activeMembers[0] ?? null;\r\n}\r\n\r\n// ============================================================================\r\n// Team Combat Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Get actors that can fight (active status, HP > 0)\r\n */\r\nexport function getActiveActorsForCombat(team: Team, actors: Record<string, Actor>): Actor[] {\r\n return team.activeMembers\r\n .map(id => actors[id])\r\n .filter((actor): actor is Actor => actor !== undefined && canActorFight(actor));\r\n}\r\n\r\n/**\r\n * Get all active members regardless of combat status\r\n */\r\nexport function getActiveMembers(team: Team, actors: Record<string, Actor>): Actor[] {\r\n return team.activeMembers\r\n .map(id => actors[id])\r\n .filter((actor): actor is Actor => actor !== undefined);\r\n}\r\n\r\n/**\r\n * Get reserve members\r\n */\r\nexport function getReserveMembers(team: Team, actors: Record<string, Actor>): Actor[] {\r\n return team.reserveMembers\r\n .map(id => actors[id])\r\n .filter((actor): actor is Actor => actor !== undefined);\r\n}\r\n\r\n/**\r\n * Check if all active members are dead\r\n */\r\nexport function isTeamWiped(team: Team, actors: Record<string, Actor>): boolean {\r\n return team.activeMembers.every(id => {\r\n const actor = actors[id];\r\n return !actor || !isActorAlive(actor);\r\n });\r\n}\r\n\r\n/**\r\n * Get total team level (sum of all active members)\r\n */\r\nexport function getTeamTotalLevel(team: Team, actors: Record<string, Actor>): number {\r\n return team.activeMembers.reduce((sum, id) => {\r\n const actor = actors[id];\r\n return sum + (actor?.stats.level ?? 0);\r\n }, 0);\r\n}\r\n\r\n/**\r\n * Get average team level\r\n */\r\nexport function getTeamAverageLevel(team: Team, actors: Record<string, Actor>): number {\r\n if (team.activeMembers.length === 0) return 0;\r\n return Math.floor(getTeamTotalLevel(team, actors) / team.activeMembers.length);\r\n}\r\n\r\n// ============================================================================\r\n// Team Formation\r\n// ============================================================================\r\n\r\n/**\r\n * Set the team's formation\r\n */\r\nexport function setTeamFormation(team: Team, formation: TeamFormation): void {\r\n team.formation = formation;\r\n}\r\n\r\n/**\r\n * Get the position index for an actor in the team\r\n * Returns -1 if not found\r\n */\r\nexport function getActorFormationPosition(team: Team, actorId: string): number {\r\n return team.activeMembers.indexOf(actorId);\r\n}\r\n\r\n/**\r\n * Check if an actor is on the frontline based on formation\r\n */\r\nexport function isActorOnFrontline(team: Team, actorId: string): boolean {\r\n const position = getActorFormationPosition(team, actorId);\r\n if (position === -1) return false;\r\n\r\n // Import formation effects\r\n const { FORMATION_EFFECTS } = require('./types.js');\r\n const config = FORMATION_EFFECTS[team.formation];\r\n return config.frontline.includes(position);\r\n}\r\n\r\n/**\r\n * Get damage multiplier for an actor based on formation\r\n */\r\nexport function getFormationDamageMultiplier(team: Team, actorId: string): number {\r\n const position = getActorFormationPosition(team, actorId);\r\n if (position === -1) return 0;\r\n\r\n // Import formation effects\r\n const { FORMATION_EFFECTS } = require('./types.js');\r\n const config = FORMATION_EFFECTS[team.formation];\r\n return config.damage[position] ?? 1.0;\r\n}\r\n\r\n// ============================================================================\r\n// Team Inventory & Resources\r\n// ============================================================================\r\n\r\n/**\r\n * Add gold to team's shared pool\r\n */\r\nexport function addTeamGold(team: Team, amount: number): void {\r\n team.sharedGold += amount;\r\n}\r\n\r\n/**\r\n * Spend gold from team's shared pool\r\n * Returns true if successful\r\n */\r\nexport function spendTeamGold(team: Team, amount: number): boolean {\r\n if (team.sharedGold < amount) return false;\r\n team.sharedGold -= amount;\r\n return true;\r\n}\r\n\r\n/**\r\n * Add item to team's shared inventory\r\n */\r\nexport function addItemToTeam(team: Team, item: InventoryItem): void {\r\n const existing = team.sharedInventory.find(i => i.id === item.id && i.type === item.type);\r\n if (existing) {\r\n existing.quantity += item.quantity;\r\n } else {\r\n team.sharedInventory.push({ ...item });\r\n }\r\n}\r\n\r\n/**\r\n * Remove item from team's shared inventory\r\n * Returns true if successful\r\n */\r\nexport function removeItemFromTeam(team: Team, itemId: string, quantity: number = 1): boolean {\r\n const index = team.sharedInventory.findIndex(i => i.id === itemId);\r\n if (index === -1) return false;\r\n\r\n const item = team.sharedInventory[index];\r\n if (item.quantity < quantity) return false;\r\n\r\n item.quantity -= quantity;\r\n if (item.quantity <= 0) {\r\n team.sharedInventory.splice(index, 1);\r\n }\r\n return true;\r\n}\r\n\r\n// ============================================================================\r\n// Team Experience Distribution\r\n// ============================================================================\r\n\r\n/**\r\n * Distribute experience evenly among active team members\r\n * Returns actors that leveled up\r\n */\r\nexport function distributeTeamExperience(\r\n team: Team,\r\n actors: Record<string, Actor>,\r\n totalExp: number,\r\n addExperienceFn: (actor: Actor, exp: number) => boolean\r\n): Actor[] {\r\n const activeActors = getActiveActorsForCombat(team, actors);\r\n if (activeActors.length === 0) return [];\r\n\r\n const expPerActor = Math.floor(totalExp / activeActors.length);\r\n const leveledUp: Actor[] = [];\r\n\r\n for (const actor of activeActors) {\r\n if (addExperienceFn(actor, expPerActor)) {\r\n leveledUp.push(actor);\r\n }\r\n }\r\n\r\n return leveledUp;\r\n}\r\n\r\n// ============================================================================\r\n// Team Movement & Location\r\n// ============================================================================\r\n\r\n/**\r\n * Update team position\r\n */\r\nexport function setTeamPosition(team: Team, position: Position): void {\r\n team.position = { ...position };\r\n}\r\n\r\n/**\r\n * Update team location\r\n */\r\nexport function setTeamLocation(team: Team, location: CurrentLocation): void {\r\n team.currentLocation = { ...location };\r\n}\r\n\r\n// ============================================================================\r\n// Team Strategy\r\n// ============================================================================\r\n\r\n/**\r\n * Update team strategy\r\n */\r\nexport function setTeamStrategy(team: Team, strategy: StrategyStateMachine): void {\r\n team.strategy = { ...strategy };\r\n}\r\n\r\n// ============================================================================\r\n// Team Display Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Get team summary for display\r\n */\r\nexport function getTeamSummary(team: Team, actors: Record<string, Actor>): string {\r\n const activeCount = team.activeMembers.length;\r\n const reserveCount = team.reserveMembers.length;\r\n const avgLevel = getTeamAverageLevel(team, actors);\r\n return `${team.name} (${activeCount}/4 active, ${reserveCount} reserve, Avg Lv${avgLevel})`;\r\n}\r\n\r\n/**\r\n * Get formation display name\r\n */\r\nexport function getFormationDisplayName(formation: TeamFormation): string {\r\n switch (formation) {\r\n case 'line': return 'Line';\r\n case 'wedge': return 'Wedge';\r\n case 'defensive': return 'Defensive';\r\n case 'spread': return 'Spread';\r\n }\r\n}\r\n\r\n/**\r\n * Get formation description\r\n */\r\nexport function getFormationDescription(formation: TeamFormation): string {\r\n switch (formation) {\r\n case 'line':\r\n return 'Leader takes full damage, others take 50%';\r\n case 'wedge':\r\n return 'Front 2 take 80% damage, back 2 take 40%';\r\n case 'defensive':\r\n return 'Front 3 take 60% damage, last takes 20%';\r\n case 'spread':\r\n return 'All take 50% damage, no protection';\r\n }\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"a833c558-3d87-597b-90d7-ce06f9993349"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
import type { Actor, Team, Enemy, TeamCombatState, CombatTurnEntry, CombatLogEntry, InventoryItem } from './types.js';
|
|
11
|
+
export interface TeamCombatResult {
|
|
12
|
+
victory: boolean;
|
|
13
|
+
rewards: {
|
|
14
|
+
exp: number;
|
|
15
|
+
gold: number;
|
|
16
|
+
items: InventoryItem[];
|
|
17
|
+
};
|
|
18
|
+
casualties: string[];
|
|
19
|
+
levelUps: string[];
|
|
20
|
+
turns: number;
|
|
21
|
+
combatLog: CombatLogEntry[];
|
|
22
|
+
}
|
|
23
|
+
export interface TeamCombatCallbacks {
|
|
24
|
+
onCombatStart: (state: TeamCombatState) => void;
|
|
25
|
+
onTurnStart: (entry: CombatTurnEntry, state: TeamCombatState) => void;
|
|
26
|
+
onActorAction: (actorId: string, action: string, target: string, damage: number) => void;
|
|
27
|
+
onEnemyAction: (enemyId: string, action: string, target: string, damage: number) => void;
|
|
28
|
+
onActorDefeated: (actorId: string) => void;
|
|
29
|
+
onEnemyDefeated: (enemyId: string) => void;
|
|
30
|
+
onTurnEnd: (state: TeamCombatState) => void;
|
|
31
|
+
onCombatEnd: (result: TeamCombatResult) => void;
|
|
32
|
+
onLogEntry: (entry: CombatLogEntry) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create initial combat state from team and enemies
|
|
36
|
+
*/
|
|
37
|
+
export declare function createTeamCombatState(team: Team, actors: Record<string, Actor>, enemies: Enemy[], combatType?: TeamCombatState['combatType']): TeamCombatState;
|
|
38
|
+
/**
|
|
39
|
+
* Execute an actor's attack on an enemy
|
|
40
|
+
*/
|
|
41
|
+
export declare function executeActorAttack(state: TeamCombatState, actorId: string, actor: Actor, targetIndex: number): {
|
|
42
|
+
damage: number;
|
|
43
|
+
defeated: boolean;
|
|
44
|
+
targetName: string;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Execute an enemy's attack on the team
|
|
48
|
+
*/
|
|
49
|
+
export declare function executeEnemyAttack(state: TeamCombatState, enemy: Enemy, team: Team, actors: Record<string, Actor>): {
|
|
50
|
+
damage: number;
|
|
51
|
+
targetId: string;
|
|
52
|
+
targetName: string;
|
|
53
|
+
defeated: boolean;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Process a single turn in combat
|
|
57
|
+
*/
|
|
58
|
+
export declare function processCombatTurn(state: TeamCombatState, team: Team, actors: Record<string, Actor>, callbacks?: Partial<TeamCombatCallbacks>): void;
|
|
59
|
+
/**
|
|
60
|
+
* Check if combat should end
|
|
61
|
+
*/
|
|
62
|
+
export declare function isCombatOver(state: TeamCombatState, team: Team, actors: Record<string, Actor>): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Check if combat was a victory
|
|
65
|
+
*/
|
|
66
|
+
export declare function isCombatVictory(state: TeamCombatState): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Calculate combat rewards
|
|
69
|
+
*/
|
|
70
|
+
export declare function calculateCombatRewards(state: TeamCombatState, team: Team, actors: Record<string, Actor>): TeamCombatResult['rewards'];
|
|
71
|
+
/**
|
|
72
|
+
* Finalize combat and distribute rewards
|
|
73
|
+
*/
|
|
74
|
+
export declare function finalizeCombat(state: TeamCombatState, team: Team, actors: Record<string, Actor>): TeamCombatResult;
|
|
75
|
+
/**
|
|
76
|
+
* Run combat automatically until completion
|
|
77
|
+
* Returns the result
|
|
78
|
+
*/
|
|
79
|
+
export declare function runAutoCombat(team: Team, actors: Record<string, Actor>, enemies: Enemy[], combatType?: TeamCombatState['combatType'], callbacks?: Partial<TeamCombatCallbacks>, maxTurns?: number): TeamCombatResult;
|
|
80
|
+
/**
|
|
81
|
+
* Get current HP percentages for all actors
|
|
82
|
+
*/
|
|
83
|
+
export declare function getActorHpPercentages(state: TeamCombatState, team: Team, actors: Record<string, Actor>): Record<string, number>;
|
|
84
|
+
/**
|
|
85
|
+
* Get combat status summary
|
|
86
|
+
*/
|
|
87
|
+
export declare function getCombatStatusSummary(state: TeamCombatState, team: Team, actors: Record<string, Actor>): string;
|
|
88
|
+
//# sourceMappingURL=TeamCombat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamCombat.d.ts","sourceRoot":"/","sources":["core/TeamCombat.ts"],"names":[],"mappings":"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"}
|