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.
Files changed (478) hide show
  1. package/README.md +171 -0
  2. package/dist/affix/AffixRegistry.d.ts +68 -0
  3. package/dist/affix/AffixRegistry.d.ts.map +1 -0
  4. package/dist/affix/AffixRegistry.js +245 -0
  5. package/dist/affix/AffixRegistry.js.map +1 -0
  6. package/dist/affix/PluginLoader.d.ts +66 -0
  7. package/dist/affix/PluginLoader.d.ts.map +1 -0
  8. package/dist/affix/PluginLoader.js +321 -0
  9. package/dist/affix/PluginLoader.js.map +1 -0
  10. package/dist/affix/builtin.d.ts +6 -0
  11. package/dist/affix/builtin.d.ts.map +1 -0
  12. package/dist/affix/builtin.js +311 -0
  13. package/dist/affix/builtin.js.map +1 -0
  14. package/dist/affix/index.d.ts +8 -0
  15. package/dist/affix/index.d.ts.map +1 -0
  16. package/dist/affix/index.js +11 -0
  17. package/dist/affix/index.js.map +1 -0
  18. package/dist/affix/types.d.ts +152 -0
  19. package/dist/affix/types.d.ts.map +1 -0
  20. package/dist/affix/types.js +8 -0
  21. package/dist/affix/types.js.map +1 -0
  22. package/dist/ai/PlayKitClient.d.ts +208 -0
  23. package/dist/ai/PlayKitClient.d.ts.map +1 -0
  24. package/dist/ai/PlayKitClient.js +721 -0
  25. package/dist/ai/PlayKitClient.js.map +1 -0
  26. package/dist/ai/index.d.ts +5 -0
  27. package/dist/ai/index.d.ts.map +1 -0
  28. package/dist/ai/index.js +8 -0
  29. package/dist/ai/index.js.map +1 -0
  30. package/dist/app/App.d.ts +85 -0
  31. package/dist/app/App.d.ts.map +1 -0
  32. package/dist/app/App.js +296 -0
  33. package/dist/app/App.js.map +1 -0
  34. package/dist/app/EventBus.d.ts +222 -0
  35. package/dist/app/EventBus.d.ts.map +1 -0
  36. package/dist/app/EventBus.js +88 -0
  37. package/dist/app/EventBus.js.map +1 -0
  38. package/dist/app/Keybind.d.ts +83 -0
  39. package/dist/app/Keybind.d.ts.map +1 -0
  40. package/dist/app/Keybind.js +184 -0
  41. package/dist/app/Keybind.js.map +1 -0
  42. package/dist/app/Router.d.ts +123 -0
  43. package/dist/app/Router.d.ts.map +1 -0
  44. package/dist/app/Router.js +142 -0
  45. package/dist/app/Router.js.map +1 -0
  46. package/dist/app/ScreenManager.d.ts +97 -0
  47. package/dist/app/ScreenManager.d.ts.map +1 -0
  48. package/dist/app/ScreenManager.js +216 -0
  49. package/dist/app/ScreenManager.js.map +1 -0
  50. package/dist/app/index.d.ts +14 -0
  51. package/dist/app/index.d.ts.map +1 -0
  52. package/dist/app/index.js +19 -0
  53. package/dist/app/index.js.map +1 -0
  54. package/dist/app/screens/BaseScreen.d.ts +101 -0
  55. package/dist/app/screens/BaseScreen.d.ts.map +1 -0
  56. package/dist/app/screens/BaseScreen.js +132 -0
  57. package/dist/app/screens/BaseScreen.js.map +1 -0
  58. package/dist/app/screens/CharacterCreationScreen.d.ts +42 -0
  59. package/dist/app/screens/CharacterCreationScreen.d.ts.map +1 -0
  60. package/dist/app/screens/CharacterCreationScreen.js +467 -0
  61. package/dist/app/screens/CharacterCreationScreen.js.map +1 -0
  62. package/dist/app/screens/CombatScreen.d.ts +30 -0
  63. package/dist/app/screens/CombatScreen.d.ts.map +1 -0
  64. package/dist/app/screens/CombatScreen.js +309 -0
  65. package/dist/app/screens/CombatScreen.js.map +1 -0
  66. package/dist/app/screens/DialogScreen.d.ts +29 -0
  67. package/dist/app/screens/DialogScreen.d.ts.map +1 -0
  68. package/dist/app/screens/DialogScreen.js +295 -0
  69. package/dist/app/screens/DialogScreen.js.map +1 -0
  70. package/dist/app/screens/ExploreScreen.d.ts +50 -0
  71. package/dist/app/screens/ExploreScreen.d.ts.map +1 -0
  72. package/dist/app/screens/ExploreScreen.js +308 -0
  73. package/dist/app/screens/ExploreScreen.js.map +1 -0
  74. package/dist/app/screens/HelpScreen.d.ts +12 -0
  75. package/dist/app/screens/HelpScreen.d.ts.map +1 -0
  76. package/dist/app/screens/HelpScreen.js +155 -0
  77. package/dist/app/screens/HelpScreen.js.map +1 -0
  78. package/dist/app/screens/InventoryScreen.d.ts +27 -0
  79. package/dist/app/screens/InventoryScreen.d.ts.map +1 -0
  80. package/dist/app/screens/InventoryScreen.js +326 -0
  81. package/dist/app/screens/InventoryScreen.js.map +1 -0
  82. package/dist/app/screens/PrologueScreen.d.ts +24 -0
  83. package/dist/app/screens/PrologueScreen.d.ts.map +1 -0
  84. package/dist/app/screens/PrologueScreen.js +176 -0
  85. package/dist/app/screens/PrologueScreen.js.map +1 -0
  86. package/dist/app/screens/TitleScreen.d.ts +42 -0
  87. package/dist/app/screens/TitleScreen.d.ts.map +1 -0
  88. package/dist/app/screens/TitleScreen.js +380 -0
  89. package/dist/app/screens/TitleScreen.js.map +1 -0
  90. package/dist/app/screens/TravelScreen.d.ts +22 -0
  91. package/dist/app/screens/TravelScreen.d.ts.map +1 -0
  92. package/dist/app/screens/TravelScreen.js +122 -0
  93. package/dist/app/screens/TravelScreen.js.map +1 -0
  94. package/dist/app/screens/index.d.ts +14 -0
  95. package/dist/app/screens/index.d.ts.map +1 -0
  96. package/dist/app/screens/index.js +17 -0
  97. package/dist/app/screens/index.js.map +1 -0
  98. package/dist/commands/CommandRegistry.d.ts +91 -0
  99. package/dist/commands/CommandRegistry.d.ts.map +1 -0
  100. package/dist/commands/CommandRegistry.js +159 -0
  101. package/dist/commands/CommandRegistry.js.map +1 -0
  102. package/dist/commands/index.d.ts +7 -0
  103. package/dist/commands/index.d.ts.map +1 -0
  104. package/dist/commands/index.js +10 -0
  105. package/dist/commands/index.js.map +1 -0
  106. package/dist/core/Actor.d.ts +103 -0
  107. package/dist/core/Actor.d.ts.map +1 -0
  108. package/dist/core/Actor.js +409 -0
  109. package/dist/core/Actor.js.map +1 -0
  110. package/dist/core/Combat.d.ts +37 -0
  111. package/dist/core/Combat.d.ts.map +1 -0
  112. package/dist/core/Combat.js +294 -0
  113. package/dist/core/Combat.js.map +1 -0
  114. package/dist/core/DungeonRunner.d.ts +169 -0
  115. package/dist/core/DungeonRunner.d.ts.map +1 -0
  116. package/dist/core/DungeonRunner.js +627 -0
  117. package/dist/core/DungeonRunner.js.map +1 -0
  118. package/dist/core/Game.d.ts +133 -0
  119. package/dist/core/Game.d.ts.map +1 -0
  120. package/dist/core/Game.js +644 -0
  121. package/dist/core/Game.js.map +1 -0
  122. package/dist/core/IdleCombat.d.ts +61 -0
  123. package/dist/core/IdleCombat.d.ts.map +1 -0
  124. package/dist/core/IdleCombat.js +461 -0
  125. package/dist/core/IdleCombat.js.map +1 -0
  126. package/dist/core/IdleGameManager.d.ts +198 -0
  127. package/dist/core/IdleGameManager.d.ts.map +1 -0
  128. package/dist/core/IdleGameManager.js +688 -0
  129. package/dist/core/IdleGameManager.js.map +1 -0
  130. package/dist/core/IdleSaveManager.d.ts +109 -0
  131. package/dist/core/IdleSaveManager.d.ts.map +1 -0
  132. package/dist/core/IdleSaveManager.js +296 -0
  133. package/dist/core/IdleSaveManager.js.map +1 -0
  134. package/dist/core/NewGameFlowManager.d.ts +64 -0
  135. package/dist/core/NewGameFlowManager.d.ts.map +1 -0
  136. package/dist/core/NewGameFlowManager.js +153 -0
  137. package/dist/core/NewGameFlowManager.js.map +1 -0
  138. package/dist/core/Player.d.ts +65 -0
  139. package/dist/core/Player.d.ts.map +1 -0
  140. package/dist/core/Player.js +261 -0
  141. package/dist/core/Player.js.map +1 -0
  142. package/dist/core/RoomHandlers.d.ts +75 -0
  143. package/dist/core/RoomHandlers.d.ts.map +1 -0
  144. package/dist/core/RoomHandlers.js +383 -0
  145. package/dist/core/RoomHandlers.js.map +1 -0
  146. package/dist/core/SaveManager.d.ts +84 -0
  147. package/dist/core/SaveManager.d.ts.map +1 -0
  148. package/dist/core/SaveManager.js +281 -0
  149. package/dist/core/SaveManager.js.map +1 -0
  150. package/dist/core/SaveMigration.d.ts +69 -0
  151. package/dist/core/SaveMigration.d.ts.map +1 -0
  152. package/dist/core/SaveMigration.js +408 -0
  153. package/dist/core/SaveMigration.js.map +1 -0
  154. package/dist/core/StateAdapter.d.ts +79 -0
  155. package/dist/core/StateAdapter.d.ts.map +1 -0
  156. package/dist/core/StateAdapter.js +397 -0
  157. package/dist/core/StateAdapter.js.map +1 -0
  158. package/dist/core/Team.d.ts +145 -0
  159. package/dist/core/Team.d.ts.map +1 -0
  160. package/dist/core/Team.js +371 -0
  161. package/dist/core/Team.js.map +1 -0
  162. package/dist/core/TeamCombat.d.ts +88 -0
  163. package/dist/core/TeamCombat.d.ts.map +1 -0
  164. package/dist/core/TeamCombat.js +405 -0
  165. package/dist/core/TeamCombat.js.map +1 -0
  166. package/dist/core/TeamDungeonRunner.d.ts +186 -0
  167. package/dist/core/TeamDungeonRunner.d.ts.map +1 -0
  168. package/dist/core/TeamDungeonRunner.js +758 -0
  169. package/dist/core/TeamDungeonRunner.js.map +1 -0
  170. package/dist/core/TimeManager.d.ts +114 -0
  171. package/dist/core/TimeManager.d.ts.map +1 -0
  172. package/dist/core/TimeManager.js +318 -0
  173. package/dist/core/TimeManager.js.map +1 -0
  174. package/dist/core/index.d.ts +9 -0
  175. package/dist/core/index.d.ts.map +1 -0
  176. package/dist/core/index.js +12 -0
  177. package/dist/core/index.js.map +1 -0
  178. package/dist/core/timeConstants.d.ts +135 -0
  179. package/dist/core/timeConstants.d.ts.map +1 -0
  180. package/dist/core/timeConstants.js +157 -0
  181. package/dist/core/timeConstants.js.map +1 -0
  182. package/dist/core/types.d.ts +780 -0
  183. package/dist/core/types.d.ts.map +1 -0
  184. package/dist/core/types.js +16 -0
  185. package/dist/core/types.js.map +1 -0
  186. package/dist/data/continents/index.d.ts +163 -0
  187. package/dist/data/continents/index.d.ts.map +1 -0
  188. package/dist/data/continents/index.js +31 -0
  189. package/dist/data/continents/index.js.map +1 -0
  190. package/dist/data/continents/verdantia.d.ts +294 -0
  191. package/dist/data/continents/verdantia.d.ts.map +1 -0
  192. package/dist/data/continents/verdantia.js +327 -0
  193. package/dist/data/continents/verdantia.js.map +1 -0
  194. package/dist/handlers/DialogHandler.d.ts +95 -0
  195. package/dist/handlers/DialogHandler.d.ts.map +1 -0
  196. package/dist/handlers/DialogHandler.js +450 -0
  197. package/dist/handlers/DialogHandler.js.map +1 -0
  198. package/dist/handlers/SaveLoadHandler.d.ts +60 -0
  199. package/dist/handlers/SaveLoadHandler.d.ts.map +1 -0
  200. package/dist/handlers/SaveLoadHandler.js +187 -0
  201. package/dist/handlers/SaveLoadHandler.js.map +1 -0
  202. package/dist/handlers/TitleScreenHandler.d.ts +43 -0
  203. package/dist/handlers/TitleScreenHandler.d.ts.map +1 -0
  204. package/dist/handlers/TitleScreenHandler.js +508 -0
  205. package/dist/handlers/TitleScreenHandler.js.map +1 -0
  206. package/dist/handlers/WorkshopHandler.d.ts +75 -0
  207. package/dist/handlers/WorkshopHandler.d.ts.map +1 -0
  208. package/dist/handlers/WorkshopHandler.js +401 -0
  209. package/dist/handlers/WorkshopHandler.js.map +1 -0
  210. package/dist/handlers/index.d.ts +12 -0
  211. package/dist/handlers/index.d.ts.map +1 -0
  212. package/dist/handlers/index.js +14 -0
  213. package/dist/handlers/index.js.map +1 -0
  214. package/dist/handlers/types.d.ts +34 -0
  215. package/dist/handlers/types.d.ts.map +1 -0
  216. package/dist/handlers/types.js +8 -0
  217. package/dist/handlers/types.js.map +1 -0
  218. package/dist/i18n/en.d.ts +3 -0
  219. package/dist/i18n/en.d.ts.map +1 -0
  220. package/dist/i18n/en.js +130 -0
  221. package/dist/i18n/en.js.map +1 -0
  222. package/dist/i18n/index.d.ts +40 -0
  223. package/dist/i18n/index.d.ts.map +1 -0
  224. package/dist/i18n/index.js +105 -0
  225. package/dist/i18n/index.js.map +1 -0
  226. package/dist/i18n/types.d.ts +133 -0
  227. package/dist/i18n/types.d.ts.map +1 -0
  228. package/dist/i18n/types.js +8 -0
  229. package/dist/i18n/types.js.map +1 -0
  230. package/dist/i18n/zh.d.ts +3 -0
  231. package/dist/i18n/zh.d.ts.map +1 -0
  232. package/dist/i18n/zh.js +130 -0
  233. package/dist/i18n/zh.js.map +1 -0
  234. package/dist/instrument.d.ts +8 -0
  235. package/dist/instrument.d.ts.map +1 -0
  236. package/dist/instrument.js +33 -0
  237. package/dist/instrument.js.map +1 -0
  238. package/dist/main-new.d.ts +12 -0
  239. package/dist/main-new.d.ts.map +1 -0
  240. package/dist/main-new.js +32 -0
  241. package/dist/main-new.js.map +1 -0
  242. package/dist/main.d.ts +7 -0
  243. package/dist/main.d.ts.map +1 -0
  244. package/dist/main.js +2816 -0
  245. package/dist/main.js.map +1 -0
  246. package/dist/map/ContinentManager.d.ts +88 -0
  247. package/dist/map/ContinentManager.d.ts.map +1 -0
  248. package/dist/map/ContinentManager.js +241 -0
  249. package/dist/map/ContinentManager.js.map +1 -0
  250. package/dist/map/DungeonGenerator.d.ts +32 -0
  251. package/dist/map/DungeonGenerator.d.ts.map +1 -0
  252. package/dist/map/DungeonGenerator.js +615 -0
  253. package/dist/map/DungeonGenerator.js.map +1 -0
  254. package/dist/map/MapGenerator.d.ts +27 -0
  255. package/dist/map/MapGenerator.d.ts.map +1 -0
  256. package/dist/map/MapGenerator.js +485 -0
  257. package/dist/map/MapGenerator.js.map +1 -0
  258. package/dist/map/index.d.ts +5 -0
  259. package/dist/map/index.d.ts.map +1 -0
  260. package/dist/map/index.js +8 -0
  261. package/dist/map/index.js.map +1 -0
  262. package/dist/npc/NPCGenerator.d.ts +68 -0
  263. package/dist/npc/NPCGenerator.d.ts.map +1 -0
  264. package/dist/npc/NPCGenerator.js +468 -0
  265. package/dist/npc/NPCGenerator.js.map +1 -0
  266. package/dist/npc/NPCManager.d.ts +86 -0
  267. package/dist/npc/NPCManager.d.ts.map +1 -0
  268. package/dist/npc/NPCManager.js +217 -0
  269. package/dist/npc/NPCManager.js.map +1 -0
  270. package/dist/npc/fixedNPCs.d.ts +7 -0
  271. package/dist/npc/fixedNPCs.d.ts.map +1 -0
  272. package/dist/npc/fixedNPCs.js +196 -0
  273. package/dist/npc/fixedNPCs.js.map +1 -0
  274. package/dist/npc/index.d.ts +9 -0
  275. package/dist/npc/index.d.ts.map +1 -0
  276. package/dist/npc/index.js +12 -0
  277. package/dist/npc/index.js.map +1 -0
  278. package/dist/npc/traits.d.ts +33 -0
  279. package/dist/npc/traits.d.ts.map +1 -0
  280. package/dist/npc/traits.js +795 -0
  281. package/dist/npc/traits.js.map +1 -0
  282. package/dist/npc/types.d.ts +193 -0
  283. package/dist/npc/types.d.ts.map +1 -0
  284. package/dist/npc/types.js +9 -0
  285. package/dist/npc/types.js.map +1 -0
  286. package/dist/quest/QuestManager.d.ts +79 -0
  287. package/dist/quest/QuestManager.d.ts.map +1 -0
  288. package/dist/quest/QuestManager.js +273 -0
  289. package/dist/quest/QuestManager.js.map +1 -0
  290. package/dist/quest/index.d.ts +6 -0
  291. package/dist/quest/index.d.ts.map +1 -0
  292. package/dist/quest/index.js +9 -0
  293. package/dist/quest/index.js.map +1 -0
  294. package/dist/quest/types.d.ts +81 -0
  295. package/dist/quest/types.d.ts.map +1 -0
  296. package/dist/quest/types.js +8 -0
  297. package/dist/quest/types.js.map +1 -0
  298. package/dist/strategy/StrategyExecutor.d.ts +159 -0
  299. package/dist/strategy/StrategyExecutor.d.ts.map +1 -0
  300. package/dist/strategy/StrategyExecutor.js +479 -0
  301. package/dist/strategy/StrategyExecutor.js.map +1 -0
  302. package/dist/strategy/StrategyParser.d.ts +48 -0
  303. package/dist/strategy/StrategyParser.d.ts.map +1 -0
  304. package/dist/strategy/StrategyParser.js +321 -0
  305. package/dist/strategy/StrategyParser.js.map +1 -0
  306. package/dist/strategy/defaultStrategy.d.ts +40 -0
  307. package/dist/strategy/defaultStrategy.d.ts.map +1 -0
  308. package/dist/strategy/defaultStrategy.js +254 -0
  309. package/dist/strategy/defaultStrategy.js.map +1 -0
  310. package/dist/strategy/index.d.ts +8 -0
  311. package/dist/strategy/index.d.ts.map +1 -0
  312. package/dist/strategy/index.js +14 -0
  313. package/dist/strategy/index.js.map +1 -0
  314. package/dist/tui/ExploreMenu.d.ts +106 -0
  315. package/dist/tui/ExploreMenu.d.ts.map +1 -0
  316. package/dist/tui/ExploreMenu.js +282 -0
  317. package/dist/tui/ExploreMenu.js.map +1 -0
  318. package/dist/tui/GameUI.d.ts +313 -0
  319. package/dist/tui/GameUI.d.ts.map +1 -0
  320. package/dist/tui/GameUI.js +2116 -0
  321. package/dist/tui/GameUI.js.map +1 -0
  322. package/dist/tui/GameUIAdapter.d.ts +207 -0
  323. package/dist/tui/GameUIAdapter.d.ts.map +1 -0
  324. package/dist/tui/GameUIAdapter.js +1342 -0
  325. package/dist/tui/GameUIAdapter.js.map +1 -0
  326. package/dist/tui/Input.d.ts +139 -0
  327. package/dist/tui/Input.d.ts.map +1 -0
  328. package/dist/tui/Input.js +278 -0
  329. package/dist/tui/Input.js.map +1 -0
  330. package/dist/tui/Menu.d.ts +110 -0
  331. package/dist/tui/Menu.d.ts.map +1 -0
  332. package/dist/tui/Menu.js +365 -0
  333. package/dist/tui/Menu.js.map +1 -0
  334. package/dist/tui/Screen.d.ts +228 -0
  335. package/dist/tui/Screen.d.ts.map +1 -0
  336. package/dist/tui/Screen.js +502 -0
  337. package/dist/tui/Screen.js.map +1 -0
  338. package/dist/tui/components/Box.d.ts +36 -0
  339. package/dist/tui/components/Box.d.ts.map +1 -0
  340. package/dist/tui/components/Box.js +43 -0
  341. package/dist/tui/components/Box.js.map +1 -0
  342. package/dist/tui/components/List.d.ts +69 -0
  343. package/dist/tui/components/List.d.ts.map +1 -0
  344. package/dist/tui/components/List.js +136 -0
  345. package/dist/tui/components/List.js.map +1 -0
  346. package/dist/tui/components/ProgressBar.d.ts +42 -0
  347. package/dist/tui/components/ProgressBar.d.ts.map +1 -0
  348. package/dist/tui/components/ProgressBar.js +75 -0
  349. package/dist/tui/components/ProgressBar.js.map +1 -0
  350. package/dist/tui/components/index.d.ts +8 -0
  351. package/dist/tui/components/index.d.ts.map +1 -0
  352. package/dist/tui/components/index.js +11 -0
  353. package/dist/tui/components/index.js.map +1 -0
  354. package/dist/tui/core/BaseSection.d.ts +98 -0
  355. package/dist/tui/core/BaseSection.d.ts.map +1 -0
  356. package/dist/tui/core/BaseSection.js +174 -0
  357. package/dist/tui/core/BaseSection.js.map +1 -0
  358. package/dist/tui/core/Component.d.ts +61 -0
  359. package/dist/tui/core/Component.d.ts.map +1 -0
  360. package/dist/tui/core/Component.js +32 -0
  361. package/dist/tui/core/Component.js.map +1 -0
  362. package/dist/tui/core/Section.d.ts +101 -0
  363. package/dist/tui/core/Section.d.ts.map +1 -0
  364. package/dist/tui/core/Section.js +24 -0
  365. package/dist/tui/core/Section.js.map +1 -0
  366. package/dist/tui/core/SectionManager.d.ts +108 -0
  367. package/dist/tui/core/SectionManager.d.ts.map +1 -0
  368. package/dist/tui/core/SectionManager.js +258 -0
  369. package/dist/tui/core/SectionManager.js.map +1 -0
  370. package/dist/tui/core/index.d.ts +9 -0
  371. package/dist/tui/core/index.d.ts.map +1 -0
  372. package/dist/tui/core/index.js +12 -0
  373. package/dist/tui/core/index.js.map +1 -0
  374. package/dist/tui/index.d.ts +15 -0
  375. package/dist/tui/index.d.ts.map +1 -0
  376. package/dist/tui/index.js +23 -0
  377. package/dist/tui/index.js.map +1 -0
  378. package/dist/tui/screens/BaseScreen.d.ts +62 -0
  379. package/dist/tui/screens/BaseScreen.d.ts.map +1 -0
  380. package/dist/tui/screens/BaseScreen.js +55 -0
  381. package/dist/tui/screens/BaseScreen.js.map +1 -0
  382. package/dist/tui/screens/CombatScreen.d.ts +43 -0
  383. package/dist/tui/screens/CombatScreen.d.ts.map +1 -0
  384. package/dist/tui/screens/CombatScreen.js +125 -0
  385. package/dist/tui/screens/CombatScreen.js.map +1 -0
  386. package/dist/tui/screens/DialogScreen.d.ts +53 -0
  387. package/dist/tui/screens/DialogScreen.d.ts.map +1 -0
  388. package/dist/tui/screens/DialogScreen.js +90 -0
  389. package/dist/tui/screens/DialogScreen.js.map +1 -0
  390. package/dist/tui/screens/DungeonScreen.d.ts +80 -0
  391. package/dist/tui/screens/DungeonScreen.d.ts.map +1 -0
  392. package/dist/tui/screens/DungeonScreen.js +317 -0
  393. package/dist/tui/screens/DungeonScreen.js.map +1 -0
  394. package/dist/tui/screens/ExploreScreen.d.ts +69 -0
  395. package/dist/tui/screens/ExploreScreen.d.ts.map +1 -0
  396. package/dist/tui/screens/ExploreScreen.js +224 -0
  397. package/dist/tui/screens/ExploreScreen.js.map +1 -0
  398. package/dist/tui/screens/SectionScreen.d.ts +84 -0
  399. package/dist/tui/screens/SectionScreen.d.ts.map +1 -0
  400. package/dist/tui/screens/SectionScreen.js +156 -0
  401. package/dist/tui/screens/SectionScreen.js.map +1 -0
  402. package/dist/tui/screens/TitleScreen.d.ts +40 -0
  403. package/dist/tui/screens/TitleScreen.d.ts.map +1 -0
  404. package/dist/tui/screens/TitleScreen.js +253 -0
  405. package/dist/tui/screens/TitleScreen.js.map +1 -0
  406. package/dist/tui/screens/TownScreen.d.ts +98 -0
  407. package/dist/tui/screens/TownScreen.d.ts.map +1 -0
  408. package/dist/tui/screens/TownScreen.js +370 -0
  409. package/dist/tui/screens/TownScreen.js.map +1 -0
  410. package/dist/tui/screens/TravelScreen.d.ts +67 -0
  411. package/dist/tui/screens/TravelScreen.d.ts.map +1 -0
  412. package/dist/tui/screens/TravelScreen.js +286 -0
  413. package/dist/tui/screens/TravelScreen.js.map +1 -0
  414. package/dist/tui/screens/index.d.ts +8 -0
  415. package/dist/tui/screens/index.d.ts.map +1 -0
  416. package/dist/tui/screens/index.js +17 -0
  417. package/dist/tui/screens/index.js.map +1 -0
  418. package/dist/tui/sections/ActionsSection.d.ts +71 -0
  419. package/dist/tui/sections/ActionsSection.d.ts.map +1 -0
  420. package/dist/tui/sections/ActionsSection.js +184 -0
  421. package/dist/tui/sections/ActionsSection.js.map +1 -0
  422. package/dist/tui/sections/DungeonSection.d.ts +65 -0
  423. package/dist/tui/sections/DungeonSection.d.ts.map +1 -0
  424. package/dist/tui/sections/DungeonSection.js +144 -0
  425. package/dist/tui/sections/DungeonSection.js.map +1 -0
  426. package/dist/tui/sections/EventsSection.d.ts +50 -0
  427. package/dist/tui/sections/EventsSection.d.ts.map +1 -0
  428. package/dist/tui/sections/EventsSection.js +134 -0
  429. package/dist/tui/sections/EventsSection.js.map +1 -0
  430. package/dist/tui/sections/MapSection.d.ts +66 -0
  431. package/dist/tui/sections/MapSection.d.ts.map +1 -0
  432. package/dist/tui/sections/MapSection.js +669 -0
  433. package/dist/tui/sections/MapSection.js.map +1 -0
  434. package/dist/tui/sections/StatusSection.d.ts +47 -0
  435. package/dist/tui/sections/StatusSection.d.ts.map +1 -0
  436. package/dist/tui/sections/StatusSection.js +133 -0
  437. package/dist/tui/sections/StatusSection.js.map +1 -0
  438. package/dist/tui/sections/TeamSection.d.ts +71 -0
  439. package/dist/tui/sections/TeamSection.d.ts.map +1 -0
  440. package/dist/tui/sections/TeamSection.js +224 -0
  441. package/dist/tui/sections/TeamSection.js.map +1 -0
  442. package/dist/tui/sections/TravelingSection.d.ts +51 -0
  443. package/dist/tui/sections/TravelingSection.d.ts.map +1 -0
  444. package/dist/tui/sections/TravelingSection.js +106 -0
  445. package/dist/tui/sections/TravelingSection.js.map +1 -0
  446. package/dist/tui/sections/index.d.ts +9 -0
  447. package/dist/tui/sections/index.d.ts.map +1 -0
  448. package/dist/tui/sections/index.js +12 -0
  449. package/dist/tui/sections/index.js.map +1 -0
  450. package/dist/ui/Terminal.d.ts +68 -0
  451. package/dist/ui/Terminal.d.ts.map +1 -0
  452. package/dist/ui/Terminal.js +297 -0
  453. package/dist/ui/Terminal.js.map +1 -0
  454. package/dist/ui/index.d.ts +5 -0
  455. package/dist/ui/index.d.ts.map +1 -0
  456. package/dist/ui/index.js +8 -0
  457. package/dist/ui/index.js.map +1 -0
  458. package/dist/utils/configMigration.d.ts +14 -0
  459. package/dist/utils/configMigration.d.ts.map +1 -0
  460. package/dist/utils/configMigration.js +92 -0
  461. package/dist/utils/configMigration.js.map +1 -0
  462. package/dist/utils/errorHandler.d.ts +86 -0
  463. package/dist/utils/errorHandler.d.ts.map +1 -0
  464. package/dist/utils/errorHandler.js +224 -0
  465. package/dist/utils/errorHandler.js.map +1 -0
  466. package/dist/utils/logger.d.ts +14 -0
  467. package/dist/utils/logger.d.ts.map +1 -0
  468. package/dist/utils/logger.js +43 -0
  469. package/dist/utils/logger.js.map +1 -0
  470. package/dist/weapon/WeaponFactory.d.ts +32 -0
  471. package/dist/weapon/WeaponFactory.d.ts.map +1 -0
  472. package/dist/weapon/WeaponFactory.js +216 -0
  473. package/dist/weapon/WeaponFactory.js.map +1 -0
  474. package/dist/weapon/index.d.ts +5 -0
  475. package/dist/weapon/index.d.ts.map +1 -0
  476. package/dist/weapon/index.js +8 -0
  477. package/dist/weapon/index.js.map +1 -0
  478. package/package.json +46 -0
@@ -0,0 +1,758 @@
1
+ /**
2
+ * Team Dungeon Runner
3
+ * Extends DungeonRunner for multi-character team exploration
4
+ *
5
+ * Key differences from single-player DungeonRunner:
6
+ * - Tracks HP/MP for each team member individually
7
+ * - Uses TeamCombat for multi-character battles
8
+ * - Experience is distributed among all active members
9
+ * - Dead actors move to reserve, can be revived in safe areas
10
+ * - Formation affects damage distribution
11
+ */
12
+
13
+ !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]="1f164094-7235-514b-baae-ac9221fc9746")}catch(e){}}();
14
+ import { getTimeManager, } from './TimeManager.js';
15
+ import { createStrategyExecutor, } from '../strategy/index.js';
16
+ import { createTeamCombatState, processCombatTurn, isCombatOver, finalizeCombat, } from './TeamCombat.js';
17
+ import { healActor, reviveActor, isActorAlive, } from './Actor.js';
18
+ import { getActiveActorsForCombat, getActiveMembers, addTeamGold, addItemToTeam, moveToReserve, } from './Team.js';
19
+ import { ROOM_TIMES, COMBAT_TURN_DURATION } from './timeConstants.js';
20
+ // ============================================================================
21
+ // Team Dungeon Runner Class
22
+ // ============================================================================
23
+ export class TeamDungeonRunner {
24
+ state = null;
25
+ team;
26
+ actors;
27
+ timeManager;
28
+ callbacks = {};
29
+ isPaused = false;
30
+ constructor(team, actors) {
31
+ this.team = team;
32
+ this.actors = actors;
33
+ this.timeManager = getTimeManager();
34
+ }
35
+ // ============================================================================
36
+ // Public API
37
+ // ============================================================================
38
+ /**
39
+ * Set callbacks for dungeon events
40
+ */
41
+ setCallbacks(callbacks) {
42
+ this.callbacks = { ...this.callbacks, ...callbacks };
43
+ }
44
+ /**
45
+ * Start a dungeon run with the team
46
+ */
47
+ startDungeon(dungeon, strategy) {
48
+ const firstLevel = dungeon.levels[0];
49
+ if (!firstLevel) {
50
+ throw new Error('Dungeon has no levels');
51
+ }
52
+ // Initialize HP/MP tracking from current actor values
53
+ const actorHp = {};
54
+ const actorMp = {};
55
+ for (const actorId of this.team.activeMembers) {
56
+ const actor = this.actors[actorId];
57
+ if (actor) {
58
+ actorHp[actorId] = actor.stats.hp;
59
+ actorMp[actorId] = actor.stats.mp;
60
+ }
61
+ }
62
+ this.state = {
63
+ phase: 'entering',
64
+ dungeon,
65
+ currentLevel: 0,
66
+ currentRoomId: firstLevel.entranceRoomId,
67
+ exploredRooms: new Set(),
68
+ clearedRooms: new Set(),
69
+ strategy,
70
+ strategyExecutor: createStrategyExecutor(strategy),
71
+ activeCombat: null,
72
+ actorHp,
73
+ actorMp,
74
+ lootCollected: [],
75
+ goldCollected: 0,
76
+ expGained: 0,
77
+ enemiesKilled: 0,
78
+ startTime: Date.now(),
79
+ eventLog: [],
80
+ };
81
+ this.log(`Team entering ${dungeon.name}...`);
82
+ this.setPhase('entering');
83
+ // Start enter dungeon action
84
+ this.timeManager.startAction('travel', `Entering ${dungeon.name}`, ROOM_TIMES.entrance, {
85
+ onComplete: 'dungeon_entered',
86
+ data: { dungeonId: dungeon.id },
87
+ });
88
+ // Set up time manager callbacks
89
+ this.timeManager.setCallbacks({
90
+ onComplete: (action) => this.handleActionComplete(action),
91
+ });
92
+ }
93
+ /**
94
+ * Get current state
95
+ */
96
+ getState() {
97
+ return this.state;
98
+ }
99
+ /**
100
+ * Get current room
101
+ */
102
+ getCurrentRoom() {
103
+ if (!this.state)
104
+ return null;
105
+ const level = this.state.dungeon.levels[this.state.currentLevel];
106
+ return level?.rooms.find(r => r.id === this.state.currentRoomId) || null;
107
+ }
108
+ /**
109
+ * Pause dungeon exploration
110
+ */
111
+ pause() {
112
+ this.isPaused = true;
113
+ this.timeManager.pause();
114
+ }
115
+ /**
116
+ * Resume dungeon exploration
117
+ */
118
+ resume() {
119
+ this.isPaused = false;
120
+ this.timeManager.resume();
121
+ }
122
+ /**
123
+ * Abort dungeon run
124
+ */
125
+ abort() {
126
+ if (!this.state)
127
+ return;
128
+ this.log('Team abandoning dungeon...');
129
+ this.setPhase('returning');
130
+ this.finishDungeon(false, 'Abandoned');
131
+ }
132
+ /**
133
+ * Get active dungeon state for saving
134
+ */
135
+ getActiveDungeonState() {
136
+ if (!this.state)
137
+ return null;
138
+ return {
139
+ dungeonId: this.state.dungeon.id,
140
+ currentLevel: this.state.currentLevel,
141
+ currentRoomId: this.state.currentRoomId,
142
+ strategy: this.state.strategy,
143
+ exploredRooms: Array.from(this.state.exploredRooms),
144
+ clearedRooms: Array.from(this.state.clearedRooms),
145
+ startTime: this.state.startTime,
146
+ elapsedTime: (Date.now() - this.state.startTime) / 1000,
147
+ lootCollected: this.state.lootCollected,
148
+ goldCollected: this.state.goldCollected,
149
+ expGained: this.state.expGained,
150
+ enemiesKilled: this.state.enemiesKilled,
151
+ floorsCleared: this.state.currentLevel,
152
+ };
153
+ }
154
+ // ============================================================================
155
+ // Internal Logic
156
+ // ============================================================================
157
+ /**
158
+ * Handle time action completion
159
+ */
160
+ handleActionComplete(action) {
161
+ if (!this.state || this.isPaused)
162
+ return;
163
+ switch (action.onComplete) {
164
+ case 'dungeon_entered':
165
+ this.enterRoom(this.state.currentRoomId);
166
+ break;
167
+ case 'room_processed':
168
+ this.afterRoomProcessed();
169
+ break;
170
+ case 'combat_turn':
171
+ this.processCombatTurn();
172
+ break;
173
+ case 'room_moved':
174
+ const targetRoomId = action.data?.targetRoomId;
175
+ if (targetRoomId) {
176
+ this.enterRoom(targetRoomId);
177
+ }
178
+ break;
179
+ case 'level_descended':
180
+ this.descendToNextLevel();
181
+ break;
182
+ }
183
+ }
184
+ /**
185
+ * Enter a room
186
+ */
187
+ enterRoom(roomId) {
188
+ if (!this.state)
189
+ return;
190
+ const level = this.state.dungeon.levels[this.state.currentLevel];
191
+ const room = level?.rooms.find(r => r.id === roomId);
192
+ if (!room) {
193
+ this.log(`Error: Room ${roomId} not found`);
194
+ return;
195
+ }
196
+ this.state.currentRoomId = roomId;
197
+ this.state.exploredRooms.add(roomId);
198
+ room.isExplored = true;
199
+ this.log(`Team entered ${room.name} (${room.type})`);
200
+ this.callbacks.onRoomEnter?.(room, this.state);
201
+ this.setPhase('processing_room');
202
+ this.processRoom(room);
203
+ }
204
+ /**
205
+ * Process current room based on type
206
+ */
207
+ processRoom(room) {
208
+ if (!this.state)
209
+ return;
210
+ const roomTime = ROOM_TIMES[room.type] || ROOM_TIMES.empty;
211
+ switch (room.type) {
212
+ case 'combat':
213
+ case 'elite':
214
+ case 'boss':
215
+ case 'ambush':
216
+ this.startCombat(room);
217
+ break;
218
+ case 'treasure':
219
+ this.processTreasureRoom(room);
220
+ break;
221
+ case 'fountain':
222
+ this.processFountainRoom(room);
223
+ break;
224
+ case 'altar':
225
+ this.processAltarRoom(room);
226
+ break;
227
+ case 'shop':
228
+ this.processShopRoom(room);
229
+ break;
230
+ case 'trap':
231
+ this.processTrapRoom(room);
232
+ break;
233
+ case 'event':
234
+ case 'encounter':
235
+ this.processEventRoom(room);
236
+ break;
237
+ case 'exit':
238
+ this.processExitRoom(room);
239
+ return; // Don't queue next action
240
+ case 'safe_room':
241
+ this.processSafeRoom(room);
242
+ break;
243
+ case 'entrance':
244
+ case 'rest':
245
+ case 'dead_end':
246
+ case 'empty':
247
+ default:
248
+ // Just traverse
249
+ this.timeManager.startAction('explore_room', `Traversing ${room.name}`, roomTime, { onComplete: 'room_processed' });
250
+ break;
251
+ }
252
+ }
253
+ /**
254
+ * Start combat in room using TeamCombat
255
+ */
256
+ startCombat(room) {
257
+ if (!this.state)
258
+ return;
259
+ const enemies = room.content.enemies || [];
260
+ if (enemies.length === 0) {
261
+ this.log('No enemies found');
262
+ this.afterRoomProcessed();
263
+ return;
264
+ }
265
+ // Check if team can fight
266
+ const activeActors = getActiveActorsForCombat(this.team, this.actors);
267
+ if (activeActors.length === 0) {
268
+ this.log('No team members able to fight!');
269
+ this.finishDungeon(false, 'Team incapacitated');
270
+ return;
271
+ }
272
+ this.setPhase('in_combat');
273
+ this.log(`Combat started! ${activeActors.length} fighters vs ${enemies.length} enemies`);
274
+ const combatType = room.type === 'boss' ? 'boss' :
275
+ room.type === 'elite' ? 'elite' :
276
+ room.type === 'ambush' ? 'ambush' : 'mob';
277
+ // Create team combat state
278
+ this.state.activeCombat = createTeamCombatState(this.team, this.actors, enemies, combatType);
279
+ this.callbacks.onCombatStart?.(enemies, this.state);
280
+ // Start first combat turn
281
+ this.queueCombatTurn();
282
+ }
283
+ /**
284
+ * Queue next combat turn
285
+ */
286
+ queueCombatTurn() {
287
+ this.timeManager.startAction('combat_turn', 'Combat turn', COMBAT_TURN_DURATION, { onComplete: 'combat_turn' });
288
+ }
289
+ /**
290
+ * Process combat turn
291
+ */
292
+ processCombatTurn() {
293
+ if (!this.state || !this.state.activeCombat)
294
+ return;
295
+ // Process the turn
296
+ processCombatTurn(this.state.activeCombat, this.team, this.actors, {
297
+ onActorDefeated: (actorId) => {
298
+ const actor = this.actors[actorId];
299
+ if (actor) {
300
+ this.log(`${actor.name} was knocked out!`);
301
+ this.callbacks.onActorDefeated?.(actorId, actor.name, this.state);
302
+ // Move to reserve
303
+ moveToReserve(this.team, actor);
304
+ }
305
+ },
306
+ onEnemyDefeated: (enemyId) => {
307
+ const enemy = this.state?.activeCombat?.enemies.find(e => e.id === enemyId);
308
+ if (enemy) {
309
+ this.log(`${enemy.name} was defeated!`);
310
+ }
311
+ },
312
+ });
313
+ // Sync HP from combat state to tracking
314
+ for (const actorId of this.team.activeMembers) {
315
+ this.state.actorHp[actorId] = this.state.activeCombat.actorHp[actorId] ?? 0;
316
+ this.state.actorMp[actorId] = this.state.activeCombat.actorMp[actorId] ?? this.state.actorMp[actorId];
317
+ }
318
+ this.callbacks.onCombatTurn?.(this.state);
319
+ // Check if combat is over
320
+ if (isCombatOver(this.state.activeCombat, this.team, this.actors)) {
321
+ this.endCombat();
322
+ }
323
+ else {
324
+ this.queueCombatTurn();
325
+ }
326
+ }
327
+ /**
328
+ * End combat and process results
329
+ */
330
+ endCombat() {
331
+ if (!this.state || !this.state.activeCombat)
332
+ return;
333
+ const result = finalizeCombat(this.state.activeCombat, this.team, this.actors);
334
+ this.state.goldCollected += result.rewards.gold;
335
+ this.state.expGained += result.rewards.exp;
336
+ this.state.enemiesKilled += this.state.activeCombat.enemies.filter(e => e.hp <= 0).length;
337
+ // Check for level ups
338
+ for (const actorId of result.levelUps) {
339
+ const actor = this.actors[actorId];
340
+ if (actor) {
341
+ this.log(`${actor.name} leveled up to Lv${actor.stats.level}!`);
342
+ this.callbacks.onActorLevelUp?.(actorId, actor.name, actor.stats.level, this.state);
343
+ }
344
+ }
345
+ if (result.victory) {
346
+ this.log(`Victory! Team gained ${result.rewards.exp} EXP, ${result.rewards.gold} Gold`);
347
+ }
348
+ else {
349
+ this.log('Team was defeated...');
350
+ this.finishDungeon(false, 'Defeated in combat');
351
+ return;
352
+ }
353
+ this.callbacks.onCombatEnd?.(result, this.state);
354
+ // Mark room as cleared
355
+ const room = this.getCurrentRoom();
356
+ if (room) {
357
+ this.state.clearedRooms.add(room.id);
358
+ room.isCleared = true;
359
+ }
360
+ this.state.activeCombat = null;
361
+ this.afterRoomProcessed();
362
+ }
363
+ /**
364
+ * Process treasure room
365
+ */
366
+ processTreasureRoom(room) {
367
+ if (!this.state)
368
+ return;
369
+ const chest = room.content.treasureChest;
370
+ if (chest && !chest.isOpened) {
371
+ chest.isOpened = true;
372
+ if (chest.goldAmount > 0) {
373
+ this.state.goldCollected += chest.goldAmount;
374
+ addTeamGold(this.team, chest.goldAmount);
375
+ this.log(`Team found ${chest.goldAmount} gold!`);
376
+ }
377
+ for (const item of chest.contents) {
378
+ this.state.lootCollected.push(item);
379
+ addItemToTeam(this.team, item);
380
+ this.log(`Team found ${item.name}!`);
381
+ }
382
+ }
383
+ this.state.clearedRooms.add(room.id);
384
+ room.isCleared = true;
385
+ this.timeManager.startAction('explore_room', 'Looting treasure', ROOM_TIMES.treasure, { onComplete: 'room_processed' });
386
+ }
387
+ /**
388
+ * Process fountain room (heal all team members)
389
+ */
390
+ processFountainRoom(room) {
391
+ if (!this.state)
392
+ return;
393
+ // Heal all active team members
394
+ for (const actorId of this.team.activeMembers) {
395
+ const actor = this.actors[actorId];
396
+ if (actor && isActorAlive(actor)) {
397
+ const healAmount = Math.floor(actor.stats.maxHp * 0.5);
398
+ const healed = healActor(actor, healAmount);
399
+ this.state.actorHp[actorId] = actor.stats.hp;
400
+ const manaRestore = Math.floor(actor.stats.maxMp * 0.3);
401
+ actor.stats.mp = Math.min(actor.stats.maxMp, actor.stats.mp + manaRestore);
402
+ this.state.actorMp[actorId] = actor.stats.mp;
403
+ }
404
+ }
405
+ this.log('Team restored at fountain');
406
+ this.state.clearedRooms.add(room.id);
407
+ room.isCleared = true;
408
+ this.timeManager.startAction('rest', 'Team resting at fountain', ROOM_TIMES.fountain, { onComplete: 'room_processed' });
409
+ }
410
+ /**
411
+ * Process safe room - can revive dead members
412
+ */
413
+ processSafeRoom(room) {
414
+ if (!this.state)
415
+ return;
416
+ // Revive any dead team members at 50% HP
417
+ for (const actorId of this.team.reserveMembers) {
418
+ const actor = this.actors[actorId];
419
+ if (actor && actor.status === 'dead') {
420
+ reviveActor(actor, 0.5);
421
+ this.state.actorHp[actorId] = actor.stats.hp;
422
+ this.log(`${actor.name} was revived!`);
423
+ }
424
+ }
425
+ this.state.clearedRooms.add(room.id);
426
+ room.isCleared = true;
427
+ this.timeManager.startAction('rest', 'Team resting in safe room', ROOM_TIMES.safe_room, { onComplete: 'room_processed' });
428
+ }
429
+ /**
430
+ * Process altar room (buff)
431
+ */
432
+ processAltarRoom(room) {
433
+ if (!this.state)
434
+ return;
435
+ // Placeholder: altar gives temporary stat boost
436
+ this.log('Team received blessing from altar');
437
+ this.state.clearedRooms.add(room.id);
438
+ room.isCleared = true;
439
+ this.timeManager.startAction('explore_room', 'Receiving blessing', ROOM_TIMES.altar, { onComplete: 'room_processed' });
440
+ }
441
+ /**
442
+ * Process shop room
443
+ */
444
+ processShopRoom(room) {
445
+ if (!this.state)
446
+ return;
447
+ const shopDecision = this.state.strategyExecutor.decideEncounterAction({
448
+ type: 'shop',
449
+ });
450
+ this.log(`Shop: ${shopDecision.action} (${shopDecision.reason})`);
451
+ this.state.clearedRooms.add(room.id);
452
+ room.isCleared = true;
453
+ this.timeManager.startAction('explore_room', 'Browsing shop', ROOM_TIMES.shop, { onComplete: 'room_processed' });
454
+ }
455
+ /**
456
+ * Process trap room (damage to frontline)
457
+ */
458
+ processTrapRoom(room) {
459
+ if (!this.state)
460
+ return;
461
+ const trap = room.content.trap;
462
+ if (trap && !trap.isTriggered && !trap.isDisarmed) {
463
+ if (this.state.strategy.exploration.avoidTraps) {
464
+ const disarmChance = 0.5;
465
+ if (Math.random() < disarmChance) {
466
+ trap.isDisarmed = true;
467
+ this.log('Team disarmed trap!');
468
+ }
469
+ else {
470
+ trap.isTriggered = true;
471
+ // Damage frontline actors
472
+ this.applyTrapDamage(trap.damage);
473
+ }
474
+ }
475
+ else {
476
+ trap.isTriggered = true;
477
+ this.applyTrapDamage(trap.damage);
478
+ }
479
+ }
480
+ this.state.clearedRooms.add(room.id);
481
+ room.isCleared = true;
482
+ this.timeManager.startAction('explore_room', 'Handling trap', ROOM_TIMES.trap, { onComplete: 'room_processed' });
483
+ }
484
+ /**
485
+ * Apply trap damage to team
486
+ */
487
+ applyTrapDamage(damage) {
488
+ if (!this.state)
489
+ return;
490
+ // Frontline actors take full damage, backline takes half
491
+ const { FORMATION_EFFECTS } = require('./types.js');
492
+ const config = FORMATION_EFFECTS[this.team.formation];
493
+ for (let i = 0; i < this.team.activeMembers.length; i++) {
494
+ const actorId = this.team.activeMembers[i];
495
+ const actor = this.actors[actorId];
496
+ if (!actor || !isActorAlive(actor))
497
+ continue;
498
+ const isFrontline = config.frontline.includes(i);
499
+ const actualDamage = isFrontline ? damage : Math.floor(damage * 0.5);
500
+ actor.stats.hp = Math.max(1, actor.stats.hp - actualDamage);
501
+ this.state.actorHp[actorId] = actor.stats.hp;
502
+ this.log(`${actor.name} took ${actualDamage} trap damage`);
503
+ }
504
+ }
505
+ /**
506
+ * Process event/encounter room
507
+ */
508
+ processEventRoom(room) {
509
+ if (!this.state)
510
+ return;
511
+ const event = room.content.event;
512
+ if (event && !event.processed) {
513
+ event.processed = true;
514
+ const encounterDecision = this.state.strategyExecutor.decideEncounterAction({
515
+ type: 'event',
516
+ event,
517
+ riskLevel: 0.5,
518
+ });
519
+ this.log(`Event: ${event.title} - ${encounterDecision.action}`);
520
+ // Placeholder: random reward
521
+ if (encounterDecision.action === 'engage' && Math.random() > 0.5) {
522
+ const bonusGold = Math.floor(Math.random() * 50) + 10;
523
+ this.state.goldCollected += bonusGold;
524
+ addTeamGold(this.team, bonusGold);
525
+ this.log(`Event reward: ${bonusGold} gold`);
526
+ }
527
+ }
528
+ this.state.clearedRooms.add(room.id);
529
+ room.isCleared = true;
530
+ this.timeManager.startAction('explore_room', 'Processing event', ROOM_TIMES.event, { onComplete: 'room_processed' });
531
+ }
532
+ /**
533
+ * Process exit room
534
+ */
535
+ processExitRoom(room) {
536
+ if (!this.state)
537
+ return;
538
+ const level = this.state.dungeon.levels[this.state.currentLevel];
539
+ // Check if this is final level
540
+ if (this.state.currentLevel >= this.state.dungeon.levels.length - 1) {
541
+ // Check if boss was defeated
542
+ if (level.bossRoomId && !this.state.clearedRooms.has(level.bossRoomId)) {
543
+ this.log('Must defeat the boss before leaving!');
544
+ this.afterRoomProcessed();
545
+ return;
546
+ }
547
+ this.log('Dungeon completed!');
548
+ this.finishDungeon(true);
549
+ }
550
+ else {
551
+ // Descend to next level
552
+ this.log(`Team descending to level ${this.state.currentLevel + 2}...`);
553
+ this.setPhase('descending');
554
+ this.callbacks.onLevelComplete?.(this.state.currentLevel + 1, this.state);
555
+ this.timeManager.startAction('travel', 'Descending stairs', ROOM_TIMES.exit, { onComplete: 'level_descended' });
556
+ }
557
+ }
558
+ /**
559
+ * Descend to next dungeon level
560
+ */
561
+ descendToNextLevel() {
562
+ if (!this.state)
563
+ return;
564
+ this.state.currentLevel++;
565
+ const nextLevel = this.state.dungeon.levels[this.state.currentLevel];
566
+ if (!nextLevel) {
567
+ this.finishDungeon(true);
568
+ return;
569
+ }
570
+ this.enterRoom(nextLevel.entranceRoomId);
571
+ }
572
+ /**
573
+ * After room is processed, decide next action
574
+ */
575
+ afterRoomProcessed() {
576
+ if (!this.state)
577
+ return;
578
+ this.setPhase('exploring');
579
+ const currentRoom = this.getCurrentRoom();
580
+ if (!currentRoom)
581
+ return;
582
+ // Check team's overall resource state
583
+ const teamHpPercent = this.getTeamHpPercent();
584
+ const teamMpPercent = this.getTeamMpPercent();
585
+ // Check if should retreat based on resources
586
+ const resourceCheck = this.state.strategyExecutor.checkResourceAction({
587
+ hp: teamHpPercent * 100, // Normalized to 0-100 for existing strategy
588
+ maxHp: 100,
589
+ mp: teamMpPercent * 100,
590
+ maxMp: 100,
591
+ gold: this.team.sharedGold,
592
+ });
593
+ if (resourceCheck.action === 'retreat_to_town') {
594
+ this.log(`Team retreating: ${resourceCheck.reason}`);
595
+ this.finishDungeon(false, 'Strategic retreat');
596
+ return;
597
+ }
598
+ // Get available rooms
599
+ const level = this.state.dungeon.levels[this.state.currentLevel];
600
+ const availableRooms = [];
601
+ for (const conn of currentRoom.connections) {
602
+ if (!conn.isLocked || conn.keyRequired === undefined) {
603
+ const room = level.rooms.find(r => r.id === conn.targetRoomId);
604
+ if (room) {
605
+ availableRooms.push(room);
606
+ }
607
+ }
608
+ }
609
+ // Get exploration decision
610
+ const context = {
611
+ currentRoom,
612
+ availableRooms,
613
+ exploredRooms: Array.from(this.state.exploredRooms),
614
+ player: {
615
+ hp: teamHpPercent * 100,
616
+ maxHp: 100,
617
+ mp: teamMpPercent * 100,
618
+ maxMp: 100,
619
+ },
620
+ };
621
+ const decision = this.state.strategyExecutor.decideExplorationAction(context);
622
+ this.executeExplorationDecision(decision, currentRoom, availableRooms);
623
+ }
624
+ /**
625
+ * Execute exploration decision
626
+ */
627
+ executeExplorationDecision(decision, currentRoom, availableRooms) {
628
+ if (!this.state)
629
+ return;
630
+ switch (decision.action) {
631
+ case 'move':
632
+ if (decision.targetRoomId) {
633
+ this.setPhase('moving');
634
+ this.log(`Team moving to ${decision.targetRoomId} (${decision.reason})`);
635
+ this.timeManager.startAction('travel', 'Moving to next room', currentRoom.timeToTraverse, {
636
+ onComplete: 'room_moved',
637
+ data: { targetRoomId: decision.targetRoomId },
638
+ });
639
+ }
640
+ break;
641
+ case 'rest':
642
+ this.log(`Team resting (${decision.reason})`);
643
+ // Heal all active members
644
+ for (const actorId of this.team.activeMembers) {
645
+ const actor = this.actors[actorId];
646
+ if (actor && isActorAlive(actor)) {
647
+ const healAmount = Math.floor(actor.stats.maxHp * 0.2);
648
+ healActor(actor, healAmount);
649
+ this.state.actorHp[actorId] = actor.stats.hp;
650
+ }
651
+ }
652
+ this.timeManager.startAction('rest', 'Team resting', ROOM_TIMES.rest, { onComplete: 'room_processed' });
653
+ break;
654
+ case 'search':
655
+ this.log(`Team searching room (${decision.reason})`);
656
+ if (Math.random() < 0.1) {
657
+ const bonusGold = 25;
658
+ this.state.goldCollected += bonusGold;
659
+ addTeamGold(this.team, bonusGold);
660
+ this.log(`Team found hidden ${bonusGold} gold!`);
661
+ }
662
+ this.timeManager.startAction('search', 'Searching', 30, { onComplete: 'room_processed' });
663
+ break;
664
+ case 'retreat':
665
+ this.log(`Team retreating (${decision.reason})`);
666
+ this.finishDungeon(false, decision.reason);
667
+ break;
668
+ }
669
+ }
670
+ // ============================================================================
671
+ // Utilities
672
+ // ============================================================================
673
+ /**
674
+ * Get team's average HP percentage
675
+ */
676
+ getTeamHpPercent() {
677
+ const activeActors = getActiveMembers(this.team, this.actors);
678
+ if (activeActors.length === 0)
679
+ return 0;
680
+ let totalHp = 0;
681
+ let totalMaxHp = 0;
682
+ for (const actor of activeActors) {
683
+ totalHp += this.state?.actorHp[actor.id] ?? actor.stats.hp;
684
+ totalMaxHp += actor.stats.maxHp;
685
+ }
686
+ return totalMaxHp > 0 ? totalHp / totalMaxHp : 0;
687
+ }
688
+ /**
689
+ * Get team's average MP percentage
690
+ */
691
+ getTeamMpPercent() {
692
+ const activeActors = getActiveMembers(this.team, this.actors);
693
+ if (activeActors.length === 0)
694
+ return 0;
695
+ let totalMp = 0;
696
+ let totalMaxMp = 0;
697
+ for (const actor of activeActors) {
698
+ totalMp += this.state?.actorMp[actor.id] ?? actor.stats.mp;
699
+ totalMaxMp += actor.stats.maxMp;
700
+ }
701
+ return totalMaxMp > 0 ? totalMp / totalMaxMp : 0;
702
+ }
703
+ /**
704
+ * Set phase and notify callback
705
+ */
706
+ setPhase(phase) {
707
+ if (!this.state)
708
+ return;
709
+ this.state.phase = phase;
710
+ this.callbacks.onPhaseChange?.(phase, this.state);
711
+ }
712
+ /**
713
+ * Add to event log
714
+ */
715
+ log(message) {
716
+ if (!this.state)
717
+ return;
718
+ const timestamp = new Date().toLocaleTimeString();
719
+ const logMessage = `[${timestamp}] ${message}`;
720
+ this.state.eventLog.push(logMessage);
721
+ this.callbacks.onEventLog?.(logMessage, this.state);
722
+ }
723
+ /**
724
+ * Finish dungeon run
725
+ */
726
+ finishDungeon(success, reason) {
727
+ if (!this.state)
728
+ return;
729
+ // Sync final HP/MP back to actors
730
+ for (const actorId of this.team.activeMembers) {
731
+ const actor = this.actors[actorId];
732
+ if (actor) {
733
+ actor.stats.hp = this.state.actorHp[actorId] ?? actor.stats.hp;
734
+ actor.stats.mp = this.state.actorMp[actorId] ?? actor.stats.mp;
735
+ }
736
+ }
737
+ this.setPhase(success ? 'completed' : 'failed');
738
+ if (success) {
739
+ this.log(`Team completed ${this.state.dungeon.name}!`);
740
+ this.log(`Total: ${this.state.expGained} EXP, ${this.state.goldCollected} Gold, ${this.state.enemiesKilled} kills`);
741
+ this.callbacks.onDungeonComplete?.(this.state);
742
+ }
743
+ else {
744
+ this.log(`Dungeon run ended: ${reason || 'Unknown'}`);
745
+ this.callbacks.onDungeonFailed?.(reason || 'Unknown', this.state);
746
+ }
747
+ this.timeManager.clearCallbacks();
748
+ this.state = null;
749
+ }
750
+ }
751
+ // ============================================================================
752
+ // Factory
753
+ // ============================================================================
754
+ export function createTeamDungeonRunner(team, actors) {
755
+ return new TeamDungeonRunner(team, actors);
756
+ }
757
+ //# sourceMappingURL=TeamDungeonRunner.js.map
758
+ //# debugId=1f164094-7235-514b-baae-ac9221fc9746