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,615 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dungeon Generator - Creates multi-level dungeons for IdleRPG
|
|
3
|
+
* Builds on BSP algorithm for room generation
|
|
4
|
+
*/
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Seeded Random
|
|
7
|
+
// ============================================================================
|
|
8
|
+
|
|
9
|
+
!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]="f9bf2c94-0d0f-5913-8725-ff22ce400a3b")}catch(e){}}();
|
|
10
|
+
class SeededRandom {
|
|
11
|
+
seed;
|
|
12
|
+
constructor(seed) {
|
|
13
|
+
this.seed = seed;
|
|
14
|
+
}
|
|
15
|
+
next() {
|
|
16
|
+
this.seed = (this.seed * 1103515245 + 12345) & 0x7fffffff;
|
|
17
|
+
return this.seed / 0x7fffffff;
|
|
18
|
+
}
|
|
19
|
+
nextInt(min, max) {
|
|
20
|
+
return Math.floor(this.next() * (max - min + 1)) + min;
|
|
21
|
+
}
|
|
22
|
+
pick(array) {
|
|
23
|
+
return array[Math.floor(this.next() * array.length)];
|
|
24
|
+
}
|
|
25
|
+
shuffle(array) {
|
|
26
|
+
const result = [...array];
|
|
27
|
+
for (let i = result.length - 1; i > 0; i--) {
|
|
28
|
+
const j = Math.floor(this.next() * (i + 1));
|
|
29
|
+
[result[i], result[j]] = [result[j], result[i]];
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Room Type Weights by Difficulty
|
|
36
|
+
// ============================================================================
|
|
37
|
+
const ROOM_TYPE_WEIGHTS = {
|
|
38
|
+
easy: [
|
|
39
|
+
{ type: 'combat', weight: 35 },
|
|
40
|
+
{ type: 'treasure', weight: 15 },
|
|
41
|
+
{ type: 'fountain', weight: 10 },
|
|
42
|
+
{ type: 'altar', weight: 5 },
|
|
43
|
+
{ type: 'event', weight: 10 },
|
|
44
|
+
{ type: 'safe_room', weight: 10 },
|
|
45
|
+
{ type: 'empty', weight: 10 },
|
|
46
|
+
{ type: 'dead_end', weight: 5 },
|
|
47
|
+
],
|
|
48
|
+
normal: [
|
|
49
|
+
{ type: 'combat', weight: 35 },
|
|
50
|
+
{ type: 'elite', weight: 10 },
|
|
51
|
+
{ type: 'treasure', weight: 12 },
|
|
52
|
+
{ type: 'fountain', weight: 8 },
|
|
53
|
+
{ type: 'altar', weight: 5 },
|
|
54
|
+
{ type: 'event', weight: 10 },
|
|
55
|
+
{ type: 'trap', weight: 5 },
|
|
56
|
+
{ type: 'safe_room', weight: 8 },
|
|
57
|
+
{ type: 'dead_end', weight: 7 },
|
|
58
|
+
],
|
|
59
|
+
hard: [
|
|
60
|
+
{ type: 'combat', weight: 30 },
|
|
61
|
+
{ type: 'elite', weight: 18 },
|
|
62
|
+
{ type: 'ambush', weight: 7 },
|
|
63
|
+
{ type: 'treasure', weight: 10 },
|
|
64
|
+
{ type: 'fountain', weight: 5 },
|
|
65
|
+
{ type: 'altar', weight: 5 },
|
|
66
|
+
{ type: 'event', weight: 8 },
|
|
67
|
+
{ type: 'trap', weight: 10 },
|
|
68
|
+
{ type: 'puzzle', weight: 5 },
|
|
69
|
+
{ type: 'dead_end', weight: 7 },
|
|
70
|
+
],
|
|
71
|
+
nightmare: [
|
|
72
|
+
{ type: 'combat', weight: 25 },
|
|
73
|
+
{ type: 'elite', weight: 22 },
|
|
74
|
+
{ type: 'ambush', weight: 10 },
|
|
75
|
+
{ type: 'treasure', weight: 8 },
|
|
76
|
+
{ type: 'fountain', weight: 3 },
|
|
77
|
+
{ type: 'trap', weight: 15 },
|
|
78
|
+
{ type: 'puzzle', weight: 7 },
|
|
79
|
+
{ type: 'event', weight: 5 },
|
|
80
|
+
{ type: 'dead_end', weight: 5 },
|
|
81
|
+
],
|
|
82
|
+
legendary: [
|
|
83
|
+
{ type: 'elite', weight: 30 },
|
|
84
|
+
{ type: 'combat', weight: 20 },
|
|
85
|
+
{ type: 'ambush', weight: 12 },
|
|
86
|
+
{ type: 'trap', weight: 15 },
|
|
87
|
+
{ type: 'puzzle', weight: 10 },
|
|
88
|
+
{ type: 'treasure', weight: 8 },
|
|
89
|
+
{ type: 'dead_end', weight: 5 },
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Time Constants (in real seconds)
|
|
94
|
+
// Import from centralized time constants
|
|
95
|
+
// ============================================================================
|
|
96
|
+
import { ROOM_TIMES } from '../core/timeConstants.js';
|
|
97
|
+
const ROOM_TRAVERSE_TIMES = {
|
|
98
|
+
// Special navigation rooms
|
|
99
|
+
entrance: ROOM_TIMES.entrance,
|
|
100
|
+
exit: ROOM_TIMES.exit,
|
|
101
|
+
dead_end: ROOM_TIMES.dead_end,
|
|
102
|
+
safe_room: ROOM_TIMES.safe_room,
|
|
103
|
+
// Combat rooms
|
|
104
|
+
combat: ROOM_TIMES.combat,
|
|
105
|
+
elite: ROOM_TIMES.elite,
|
|
106
|
+
boss: ROOM_TIMES.boss,
|
|
107
|
+
ambush: ROOM_TIMES.ambush,
|
|
108
|
+
// Reward rooms
|
|
109
|
+
treasure: ROOM_TIMES.treasure,
|
|
110
|
+
fountain: ROOM_TIMES.fountain,
|
|
111
|
+
altar: ROOM_TIMES.altar,
|
|
112
|
+
shop: ROOM_TIMES.shop,
|
|
113
|
+
// Event rooms
|
|
114
|
+
event: ROOM_TIMES.event,
|
|
115
|
+
encounter: ROOM_TIMES.encounter,
|
|
116
|
+
trap: ROOM_TIMES.trap,
|
|
117
|
+
puzzle: ROOM_TIMES.puzzle,
|
|
118
|
+
// Generic rooms
|
|
119
|
+
rest: ROOM_TIMES.rest,
|
|
120
|
+
empty: ROOM_TIMES.empty,
|
|
121
|
+
};
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Generator Functions
|
|
124
|
+
// ============================================================================
|
|
125
|
+
/**
|
|
126
|
+
* Generate a complete dungeon with multiple levels
|
|
127
|
+
*/
|
|
128
|
+
export function generateDungeon(config) {
|
|
129
|
+
const rng = new SeededRandom(config.seed ?? Date.now());
|
|
130
|
+
const levels = [];
|
|
131
|
+
// Generate each level
|
|
132
|
+
for (let levelNum = 1; levelNum <= config.numberOfLevels; levelNum++) {
|
|
133
|
+
const isLastLevel = levelNum === config.numberOfLevels;
|
|
134
|
+
const level = generateDungeonLevel(levelNum, config, rng, isLastLevel && config.hasBoss);
|
|
135
|
+
levels.push(level);
|
|
136
|
+
}
|
|
137
|
+
// Calculate estimated clear time
|
|
138
|
+
const estimatedTime = levels.reduce((total, level) => {
|
|
139
|
+
return total + level.rooms.reduce((levelTotal, room) => {
|
|
140
|
+
return levelTotal + room.timeToTraverse;
|
|
141
|
+
}, 0);
|
|
142
|
+
}, 0);
|
|
143
|
+
return {
|
|
144
|
+
id: config.dungeonId,
|
|
145
|
+
name: config.name,
|
|
146
|
+
description: config.description,
|
|
147
|
+
continentId: config.continentId,
|
|
148
|
+
nearestTownId: config.nearestTownId,
|
|
149
|
+
difficulty: config.difficulty,
|
|
150
|
+
recommendedLevel: config.recommendedLevel,
|
|
151
|
+
levels,
|
|
152
|
+
hasBoss: config.hasBoss,
|
|
153
|
+
bossName: config.bossName,
|
|
154
|
+
estimatedTime,
|
|
155
|
+
rewards: generateDungeonRewards(config.difficulty, config.recommendedLevel, rng),
|
|
156
|
+
travelTimeFromTown: 120, // 2 minutes to reach dungeon
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Generate a single dungeon level
|
|
161
|
+
*/
|
|
162
|
+
function generateDungeonLevel(levelNumber, config, rng, hasBoss) {
|
|
163
|
+
const roomCount = rng.nextInt(config.roomsPerLevel.min, config.roomsPerLevel.max);
|
|
164
|
+
const rooms = [];
|
|
165
|
+
// Generate entrance room
|
|
166
|
+
const entranceRoom = createRoom(`${config.dungeonId}_L${levelNumber}_entrance`, 'entrance', levelNumber, config, rng, { x: 0, y: 0 });
|
|
167
|
+
rooms.push(entranceRoom);
|
|
168
|
+
// Generate middle rooms
|
|
169
|
+
const middleRoomCount = roomCount - 2 - (hasBoss ? 1 : 0);
|
|
170
|
+
const roomTypes = selectRoomTypes(middleRoomCount, config.difficulty, rng);
|
|
171
|
+
let x = 1;
|
|
172
|
+
let y = 0;
|
|
173
|
+
for (let i = 0; i < middleRoomCount; i++) {
|
|
174
|
+
const roomId = `${config.dungeonId}_L${levelNumber}_R${i}`;
|
|
175
|
+
const room = createRoom(roomId, roomTypes[i], levelNumber, config, rng, { x, y });
|
|
176
|
+
rooms.push(room);
|
|
177
|
+
// Simple branching layout
|
|
178
|
+
if (rng.next() < 0.3 && i < middleRoomCount - 1) {
|
|
179
|
+
y += rng.next() < 0.5 ? 1 : -1;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
x++;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Generate boss room if needed
|
|
186
|
+
let bossRoomId;
|
|
187
|
+
if (hasBoss) {
|
|
188
|
+
bossRoomId = `${config.dungeonId}_L${levelNumber}_boss`;
|
|
189
|
+
const bossRoom = createRoom(bossRoomId, 'boss', levelNumber, config, rng, { x: x + 1, y: 0 });
|
|
190
|
+
bossRoom.content.enemies = generateBossEnemy(config, rng);
|
|
191
|
+
rooms.push(bossRoom);
|
|
192
|
+
x++;
|
|
193
|
+
}
|
|
194
|
+
// Generate exit room
|
|
195
|
+
const exitRoom = createRoom(`${config.dungeonId}_L${levelNumber}_exit`, 'exit', levelNumber, config, rng, { x: x + 1, y: 0 });
|
|
196
|
+
rooms.push(exitRoom);
|
|
197
|
+
// Connect rooms
|
|
198
|
+
connectRooms(rooms, rng);
|
|
199
|
+
return {
|
|
200
|
+
levelNumber,
|
|
201
|
+
name: `${config.name} - Level ${levelNumber}`,
|
|
202
|
+
rooms,
|
|
203
|
+
entranceRoomId: entranceRoom.id,
|
|
204
|
+
exitRoomId: exitRoom.id,
|
|
205
|
+
bossRoomId,
|
|
206
|
+
minEnemyLevel: config.recommendedLevel + levelNumber - 1,
|
|
207
|
+
maxEnemyLevel: config.recommendedLevel + levelNumber + 1,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Select room types based on difficulty
|
|
212
|
+
*/
|
|
213
|
+
function selectRoomTypes(count, difficulty, rng) {
|
|
214
|
+
const weights = ROOM_TYPE_WEIGHTS[difficulty];
|
|
215
|
+
const totalWeight = weights.reduce((sum, w) => sum + w.weight, 0);
|
|
216
|
+
const types = [];
|
|
217
|
+
for (let i = 0; i < count; i++) {
|
|
218
|
+
let roll = rng.next() * totalWeight;
|
|
219
|
+
for (const { type, weight } of weights) {
|
|
220
|
+
roll -= weight;
|
|
221
|
+
if (roll <= 0) {
|
|
222
|
+
types.push(type);
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return rng.shuffle(types);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Create a dungeon room
|
|
231
|
+
*/
|
|
232
|
+
function createRoom(id, type, levelNumber, config, rng, position) {
|
|
233
|
+
const content = generateRoomContent(type, levelNumber, config, rng);
|
|
234
|
+
return {
|
|
235
|
+
id,
|
|
236
|
+
type,
|
|
237
|
+
name: generateRoomName(type, rng),
|
|
238
|
+
description: generateRoomDescription(type, rng),
|
|
239
|
+
connections: [],
|
|
240
|
+
content,
|
|
241
|
+
timeToTraverse: ROOM_TRAVERSE_TIMES[type],
|
|
242
|
+
isExplored: false,
|
|
243
|
+
isCleared: type === 'entrance' || type === 'exit' || type === 'empty',
|
|
244
|
+
position,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Generate room content based on type
|
|
249
|
+
*/
|
|
250
|
+
function generateRoomContent(type, levelNumber, config, rng) {
|
|
251
|
+
const content = {};
|
|
252
|
+
switch (type) {
|
|
253
|
+
// Combat rooms
|
|
254
|
+
case 'combat':
|
|
255
|
+
content.enemies = generateEnemies(config.recommendedLevel + levelNumber - 1, 1, 3, rng);
|
|
256
|
+
break;
|
|
257
|
+
case 'elite':
|
|
258
|
+
content.enemies = generateEliteEnemies(config.recommendedLevel + levelNumber, rng);
|
|
259
|
+
break;
|
|
260
|
+
case 'ambush':
|
|
261
|
+
// Ambush: enemies attack first, player cannot use items initially
|
|
262
|
+
content.enemies = generateEnemies(config.recommendedLevel + levelNumber - 1, 2, 4, rng);
|
|
263
|
+
break;
|
|
264
|
+
// Reward rooms
|
|
265
|
+
case 'treasure':
|
|
266
|
+
content.treasureChest = generateTreasureChest(config.difficulty, rng);
|
|
267
|
+
break;
|
|
268
|
+
case 'fountain':
|
|
269
|
+
// Fountain: heals HP/MP (handled by game logic, no content needed)
|
|
270
|
+
break;
|
|
271
|
+
case 'altar':
|
|
272
|
+
// Altar: provides temporary buff (handled by game logic, no content needed)
|
|
273
|
+
break;
|
|
274
|
+
// Event rooms
|
|
275
|
+
case 'trap':
|
|
276
|
+
content.trap = generateTrap(config.difficulty, rng);
|
|
277
|
+
break;
|
|
278
|
+
case 'event':
|
|
279
|
+
content.items = rng.next() < 0.5 ? generateRandomItems(1, rng) : undefined;
|
|
280
|
+
break;
|
|
281
|
+
// Special rooms
|
|
282
|
+
case 'dead_end':
|
|
283
|
+
// Dead ends may have hidden treasure
|
|
284
|
+
if (rng.next() < 0.3) {
|
|
285
|
+
content.treasureChest = generateTreasureChest(config.difficulty, rng);
|
|
286
|
+
content.treasureChest.isLocked = false; // Hidden treasure is unlocked
|
|
287
|
+
}
|
|
288
|
+
break;
|
|
289
|
+
case 'safe_room':
|
|
290
|
+
// Safe rooms may have a merchant
|
|
291
|
+
if (rng.next() < 0.2) {
|
|
292
|
+
content.items = generateRandomItems(2, rng);
|
|
293
|
+
}
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
return content;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Generate regular enemies
|
|
300
|
+
*/
|
|
301
|
+
function generateEnemies(baseLevel, minCount, maxCount, rng) {
|
|
302
|
+
const count = rng.nextInt(minCount, maxCount);
|
|
303
|
+
const enemies = [];
|
|
304
|
+
const enemyTypes = [
|
|
305
|
+
{ name: 'Goblin', hpMult: 1, atkMult: 1, defMult: 0.8 },
|
|
306
|
+
{ name: 'Skeleton', hpMult: 0.8, atkMult: 1.1, defMult: 0.9 },
|
|
307
|
+
{ name: 'Slime', hpMult: 1.2, atkMult: 0.8, defMult: 0.5 },
|
|
308
|
+
{ name: 'Orc', hpMult: 1.5, atkMult: 1.2, defMult: 1 },
|
|
309
|
+
{ name: 'Bat Swarm', hpMult: 0.6, atkMult: 0.7, defMult: 0.3 },
|
|
310
|
+
{ name: 'Spider', hpMult: 0.9, atkMult: 1, defMult: 0.6 },
|
|
311
|
+
];
|
|
312
|
+
for (let i = 0; i < count; i++) {
|
|
313
|
+
const type = rng.pick(enemyTypes);
|
|
314
|
+
const level = baseLevel + rng.nextInt(-1, 1);
|
|
315
|
+
enemies.push({
|
|
316
|
+
id: `enemy_${Date.now()}_${i}_${rng.nextInt(1000, 9999)}`,
|
|
317
|
+
name: type.name,
|
|
318
|
+
level,
|
|
319
|
+
hp: Math.floor(20 * level * type.hpMult),
|
|
320
|
+
maxHp: Math.floor(20 * level * type.hpMult),
|
|
321
|
+
attack: Math.floor(5 * level * type.atkMult),
|
|
322
|
+
defense: Math.floor(3 * level * type.defMult),
|
|
323
|
+
speed: 5 + level,
|
|
324
|
+
expReward: 10 * level,
|
|
325
|
+
goldReward: rng.nextInt(5, 20) * level,
|
|
326
|
+
dropTable: [
|
|
327
|
+
{ itemId: 'health_potion', chance: 0.2, quantity: { min: 1, max: 1 } },
|
|
328
|
+
],
|
|
329
|
+
isBoss: false,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
return enemies;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Generate elite enemies
|
|
336
|
+
*/
|
|
337
|
+
function generateEliteEnemies(baseLevel, rng) {
|
|
338
|
+
const eliteTypes = [
|
|
339
|
+
{ name: 'Orc Warlord', hpMult: 2.5, atkMult: 1.5, defMult: 1.3 },
|
|
340
|
+
{ name: 'Dark Mage', hpMult: 1.5, atkMult: 2, defMult: 0.8 },
|
|
341
|
+
{ name: 'Stone Golem', hpMult: 3, atkMult: 1, defMult: 2 },
|
|
342
|
+
{ name: 'Shadow Assassin', hpMult: 1.2, atkMult: 2.5, defMult: 0.5 },
|
|
343
|
+
];
|
|
344
|
+
const type = rng.pick(eliteTypes);
|
|
345
|
+
const level = baseLevel + 2;
|
|
346
|
+
return [{
|
|
347
|
+
id: `elite_${Date.now()}_${rng.nextInt(1000, 9999)}`,
|
|
348
|
+
name: type.name,
|
|
349
|
+
level,
|
|
350
|
+
hp: Math.floor(30 * level * type.hpMult),
|
|
351
|
+
maxHp: Math.floor(30 * level * type.hpMult),
|
|
352
|
+
attack: Math.floor(7 * level * type.atkMult),
|
|
353
|
+
defense: Math.floor(4 * level * type.defMult),
|
|
354
|
+
speed: 8 + level,
|
|
355
|
+
expReward: 30 * level,
|
|
356
|
+
goldReward: rng.nextInt(20, 50) * level,
|
|
357
|
+
dropTable: [
|
|
358
|
+
{ itemId: 'health_potion', chance: 0.5, quantity: { min: 1, max: 2 } },
|
|
359
|
+
{ itemId: 'affix_fragment', chance: 0.3, quantity: { min: 1, max: 1 } },
|
|
360
|
+
],
|
|
361
|
+
isBoss: false,
|
|
362
|
+
}];
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Generate boss enemy
|
|
366
|
+
*/
|
|
367
|
+
function generateBossEnemy(config, rng) {
|
|
368
|
+
const bossTypes = [
|
|
369
|
+
{ name: 'Goblin King', hpMult: 4, atkMult: 1.8, defMult: 1.5 },
|
|
370
|
+
{ name: 'Ancient Lich', hpMult: 3.5, atkMult: 2.5, defMult: 1 },
|
|
371
|
+
{ name: 'Dragon Whelp', hpMult: 5, atkMult: 2, defMult: 2 },
|
|
372
|
+
{ name: 'Demon Lord', hpMult: 4.5, atkMult: 2.2, defMult: 1.8 },
|
|
373
|
+
];
|
|
374
|
+
const type = config.bossName
|
|
375
|
+
? { name: config.bossName, hpMult: 4, atkMult: 2, defMult: 1.5 }
|
|
376
|
+
: rng.pick(bossTypes);
|
|
377
|
+
const level = config.recommendedLevel + config.numberOfLevels + 2;
|
|
378
|
+
return [{
|
|
379
|
+
id: `boss_${config.dungeonId}_${Date.now()}`,
|
|
380
|
+
name: type.name,
|
|
381
|
+
level,
|
|
382
|
+
hp: Math.floor(50 * level * type.hpMult),
|
|
383
|
+
maxHp: Math.floor(50 * level * type.hpMult),
|
|
384
|
+
attack: Math.floor(10 * level * type.atkMult),
|
|
385
|
+
defense: Math.floor(5 * level * type.defMult),
|
|
386
|
+
speed: 10 + level,
|
|
387
|
+
expReward: 100 * level,
|
|
388
|
+
goldReward: rng.nextInt(100, 300) * level,
|
|
389
|
+
dropTable: [
|
|
390
|
+
{ itemId: 'health_potion', chance: 1, quantity: { min: 2, max: 3 } },
|
|
391
|
+
{ itemId: 'affix_fragment', chance: 0.8, quantity: { min: 1, max: 2 } },
|
|
392
|
+
{ itemId: 'rare_material', chance: 0.5, quantity: { min: 1, max: 1 } },
|
|
393
|
+
],
|
|
394
|
+
isBoss: true,
|
|
395
|
+
}];
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Generate treasure chest
|
|
399
|
+
*/
|
|
400
|
+
function generateTreasureChest(difficulty, rng) {
|
|
401
|
+
const rarityByDifficulty = {
|
|
402
|
+
easy: ['common', 'common', 'uncommon'],
|
|
403
|
+
normal: ['common', 'uncommon', 'uncommon', 'rare'],
|
|
404
|
+
hard: ['uncommon', 'rare', 'rare', 'epic'],
|
|
405
|
+
nightmare: ['rare', 'epic', 'epic', 'legendary'],
|
|
406
|
+
legendary: ['epic', 'legendary', 'legendary'],
|
|
407
|
+
};
|
|
408
|
+
const rarity = rng.pick(rarityByDifficulty[difficulty]);
|
|
409
|
+
const goldMultiplier = { common: 1, uncommon: 2, rare: 4, epic: 8, legendary: 20 };
|
|
410
|
+
return {
|
|
411
|
+
id: `chest_${Date.now()}_${rng.nextInt(1000, 9999)}`,
|
|
412
|
+
rarity,
|
|
413
|
+
isOpened: false,
|
|
414
|
+
isLocked: rng.next() < 0.3,
|
|
415
|
+
contents: generateRandomItems(rng.nextInt(1, 3), rng),
|
|
416
|
+
goldAmount: rng.nextInt(10, 50) * goldMultiplier[rarity],
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Generate trap
|
|
421
|
+
*/
|
|
422
|
+
function generateTrap(difficulty, rng) {
|
|
423
|
+
const traps = [
|
|
424
|
+
{ name: 'Spike Trap', damage: 20, effect: 'bleeding' },
|
|
425
|
+
{ name: 'Poison Dart', damage: 10, effect: 'poisoned' },
|
|
426
|
+
{ name: 'Fire Geyser', damage: 30, effect: 'burning' },
|
|
427
|
+
{ name: 'Ice Blast', damage: 15, effect: 'frozen' },
|
|
428
|
+
{ name: 'Pitfall', damage: 25 },
|
|
429
|
+
];
|
|
430
|
+
const trap = rng.pick(traps);
|
|
431
|
+
const difficultyMod = { easy: 0.5, normal: 1, hard: 1.5, nightmare: 2, legendary: 3 };
|
|
432
|
+
return {
|
|
433
|
+
id: `trap_${Date.now()}_${rng.nextInt(1000, 9999)}`,
|
|
434
|
+
name: trap.name,
|
|
435
|
+
damage: Math.floor(trap.damage * difficultyMod[difficulty]),
|
|
436
|
+
effect: trap.effect,
|
|
437
|
+
disarmDifficulty: rng.nextInt(3, 8),
|
|
438
|
+
isTriggered: false,
|
|
439
|
+
isDisarmed: false,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Generate random items
|
|
444
|
+
*/
|
|
445
|
+
function generateRandomItems(count, rng) {
|
|
446
|
+
const items = [];
|
|
447
|
+
const itemTypes = [
|
|
448
|
+
{ id: 'health_potion', name: 'Health Potion', type: 'consumable' },
|
|
449
|
+
{ id: 'mana_potion', name: 'Mana Potion', type: 'consumable' },
|
|
450
|
+
{ id: 'antidote', name: 'Antidote', type: 'consumable' },
|
|
451
|
+
{ id: 'iron_ore', name: 'Iron Ore', type: 'material' },
|
|
452
|
+
{ id: 'magic_crystal', name: 'Magic Crystal', type: 'material' },
|
|
453
|
+
];
|
|
454
|
+
for (let i = 0; i < count; i++) {
|
|
455
|
+
const item = rng.pick(itemTypes);
|
|
456
|
+
items.push({
|
|
457
|
+
id: `${item.id}_${Date.now()}_${i}`,
|
|
458
|
+
type: item.type,
|
|
459
|
+
name: item.name,
|
|
460
|
+
description: `A ${item.name.toLowerCase()}`,
|
|
461
|
+
quantity: rng.nextInt(1, 3),
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
return items;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Generate dungeon rewards
|
|
468
|
+
*/
|
|
469
|
+
function generateDungeonRewards(difficulty, level, rng) {
|
|
470
|
+
const baseExp = level * 100;
|
|
471
|
+
const baseGold = level * 50;
|
|
472
|
+
const diffMod = { easy: 1, normal: 1.5, hard: 2, nightmare: 3, legendary: 5 };
|
|
473
|
+
return [
|
|
474
|
+
{ type: 'exp', value: Math.floor(baseExp * diffMod[difficulty]), chance: 1 },
|
|
475
|
+
{ type: 'gold', value: Math.floor(baseGold * diffMod[difficulty]), chance: 1 },
|
|
476
|
+
{ type: 'item', value: 'affix_fragment', chance: 0.5 },
|
|
477
|
+
];
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Connect rooms in a level
|
|
481
|
+
*/
|
|
482
|
+
function connectRooms(rooms, rng) {
|
|
483
|
+
// Connect rooms linearly first
|
|
484
|
+
for (let i = 0; i < rooms.length - 1; i++) {
|
|
485
|
+
const currentRoom = rooms[i];
|
|
486
|
+
const nextRoom = rooms[i + 1];
|
|
487
|
+
// Determine direction
|
|
488
|
+
const dx = nextRoom.position.x - currentRoom.position.x;
|
|
489
|
+
const dy = nextRoom.position.y - currentRoom.position.y;
|
|
490
|
+
let direction = 'east';
|
|
491
|
+
let reverseDir = 'west';
|
|
492
|
+
if (Math.abs(dy) > Math.abs(dx)) {
|
|
493
|
+
direction = dy > 0 ? 'south' : 'north';
|
|
494
|
+
reverseDir = dy > 0 ? 'north' : 'south';
|
|
495
|
+
}
|
|
496
|
+
currentRoom.connections.push({
|
|
497
|
+
targetRoomId: nextRoom.id,
|
|
498
|
+
direction,
|
|
499
|
+
isLocked: false,
|
|
500
|
+
isHidden: false,
|
|
501
|
+
});
|
|
502
|
+
nextRoom.connections.push({
|
|
503
|
+
targetRoomId: currentRoom.id,
|
|
504
|
+
direction: reverseDir,
|
|
505
|
+
isLocked: false,
|
|
506
|
+
isHidden: false,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
// Add some random connections for variety
|
|
510
|
+
for (let i = 0; i < rooms.length - 2; i++) {
|
|
511
|
+
if (rng.next() < 0.2) {
|
|
512
|
+
const j = rng.nextInt(i + 2, Math.min(i + 4, rooms.length - 1));
|
|
513
|
+
const roomA = rooms[i];
|
|
514
|
+
const roomB = rooms[j];
|
|
515
|
+
// Check if already connected
|
|
516
|
+
if (!roomA.connections.some(c => c.targetRoomId === roomB.id)) {
|
|
517
|
+
roomA.connections.push({
|
|
518
|
+
targetRoomId: roomB.id,
|
|
519
|
+
direction: 'east',
|
|
520
|
+
isLocked: false,
|
|
521
|
+
isHidden: rng.next() < 0.3,
|
|
522
|
+
});
|
|
523
|
+
roomB.connections.push({
|
|
524
|
+
targetRoomId: roomA.id,
|
|
525
|
+
direction: 'west',
|
|
526
|
+
isLocked: false,
|
|
527
|
+
isHidden: rng.next() < 0.3,
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Generate room name
|
|
535
|
+
*/
|
|
536
|
+
function generateRoomName(type, rng) {
|
|
537
|
+
const names = {
|
|
538
|
+
// Special navigation rooms
|
|
539
|
+
entrance: ['Dungeon Entrance', 'Gateway', 'Entry Hall'],
|
|
540
|
+
exit: ['Stairway Down', 'Exit Passage', 'Descent'],
|
|
541
|
+
dead_end: ['Dead End', 'Blocked Passage', 'Collapsed Tunnel'],
|
|
542
|
+
safe_room: ['Safe Haven', 'Sanctuary', 'Hidden Refuge'],
|
|
543
|
+
// Combat rooms
|
|
544
|
+
combat: ['Monster Den', 'Dark Corridor', 'Infested Hall'],
|
|
545
|
+
elite: ['Champion\'s Arena', 'Elite Guard Post', 'Proving Grounds'],
|
|
546
|
+
boss: ['Throne Room', 'Lair of Darkness', 'Final Chamber'],
|
|
547
|
+
ambush: ['Shadow Corner', 'Ambush Point', 'Treacherous Path'],
|
|
548
|
+
// Reward rooms
|
|
549
|
+
treasure: ['Treasure Vault', 'Golden Chamber', 'Loot Room'],
|
|
550
|
+
fountain: ['Healing Spring', 'Crystal Fountain', 'Sacred Waters'],
|
|
551
|
+
altar: ['Ancient Altar', 'Blessing Shrine', 'Power Nexus'],
|
|
552
|
+
shop: ['Merchant\'s Corner', 'Trading Post', 'Hidden Shop'],
|
|
553
|
+
// Event rooms
|
|
554
|
+
event: ['Mysterious Shrine', 'Strange Chamber', 'Enigma Room'],
|
|
555
|
+
encounter: ['Traveler\'s Rest', 'Hidden Camp', 'Meeting Point'],
|
|
556
|
+
trap: ['Danger Zone', 'Trapped Corridor', 'Perilous Path'],
|
|
557
|
+
puzzle: ['Riddle Room', 'Puzzle Chamber', 'Mind Trial'],
|
|
558
|
+
// Generic rooms
|
|
559
|
+
rest: ['Resting Spot', 'Quiet Corner', 'Peaceful Alcove'],
|
|
560
|
+
empty: ['Empty Corridor', 'Silent Hall', 'Abandoned Room'],
|
|
561
|
+
};
|
|
562
|
+
return rng.pick(names[type]);
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Generate room description
|
|
566
|
+
*/
|
|
567
|
+
function generateRoomDescription(type, rng) {
|
|
568
|
+
const descriptions = {
|
|
569
|
+
// Special navigation rooms
|
|
570
|
+
entrance: ['The entrance to the dungeon. Darkness awaits.'],
|
|
571
|
+
exit: ['A passage leading deeper into the dungeon.'],
|
|
572
|
+
dead_end: ['The path ends here. Perhaps there is something hidden...'],
|
|
573
|
+
safe_room: ['A protected area where you can rest safely.'],
|
|
574
|
+
// Combat rooms
|
|
575
|
+
combat: ['Shadows move in the darkness. Enemies lurk here.'],
|
|
576
|
+
elite: ['A powerful foe guards this area.'],
|
|
577
|
+
boss: ['An oppressive presence fills the room. The boss awaits.'],
|
|
578
|
+
ambush: ['Something doesn\'t feel right... Watch your back!'],
|
|
579
|
+
// Reward rooms
|
|
580
|
+
treasure: ['Glittering treasures catch your eye.'],
|
|
581
|
+
fountain: ['Clear water flows from an ancient spring. It looks refreshing.'],
|
|
582
|
+
altar: ['A mystical altar radiates power. Touch it for a blessing.'],
|
|
583
|
+
shop: ['A merchant has set up shop here.'],
|
|
584
|
+
// Event rooms
|
|
585
|
+
event: ['Strange energy pulses from within.'],
|
|
586
|
+
encounter: ['Someone has made camp here.'],
|
|
587
|
+
trap: ['Something feels wrong about this place. Proceed with caution.'],
|
|
588
|
+
puzzle: ['Ancient mechanisms line the walls. A puzzle awaits.'],
|
|
589
|
+
// Generic rooms
|
|
590
|
+
rest: ['A peaceful respite from danger.'],
|
|
591
|
+
empty: ['An empty room. Nothing of immediate interest.'],
|
|
592
|
+
};
|
|
593
|
+
return rng.pick(descriptions[type]);
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Regenerate a dungeon with a new seed
|
|
597
|
+
*/
|
|
598
|
+
export function regenerateDungeon(dungeon, newSeed) {
|
|
599
|
+
return generateDungeon({
|
|
600
|
+
dungeonId: dungeon.id,
|
|
601
|
+
name: dungeon.name,
|
|
602
|
+
description: dungeon.description,
|
|
603
|
+
continentId: dungeon.continentId,
|
|
604
|
+
nearestTownId: dungeon.nearestTownId,
|
|
605
|
+
difficulty: dungeon.difficulty,
|
|
606
|
+
recommendedLevel: dungeon.recommendedLevel,
|
|
607
|
+
numberOfLevels: dungeon.levels.length,
|
|
608
|
+
roomsPerLevel: { min: 6, max: 10 },
|
|
609
|
+
hasBoss: dungeon.hasBoss,
|
|
610
|
+
bossName: dungeon.bossName,
|
|
611
|
+
seed: newSeed ?? Date.now(),
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
//# sourceMappingURL=DungeonGenerator.js.map
|
|
615
|
+
//# debugId=f9bf2c94-0d0f-5913-8725-ff22ce400a3b
|