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