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 @@
1
+ {"version":3,"file":"Game.js","sources":["core/Game.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * Main Game class - orchestrates the game loop and state management\r\n */\r\n\r\nimport type {\r\n GameState,\r\n GamePhase,\r\n Player,\r\n GameMap,\r\n Room,\r\n GameEvent,\r\n GameSettings,\r\n SaveData,\r\n} from './types.js';\r\nimport { getLanguage, getStrings } from '../i18n/index.js';\r\nimport { generateMap } from '../map/MapGenerator.js';\r\nimport { initCombat, processCombatTurn, calculateCombatRewards } from './Combat.js';\r\nimport { addExperience, addGold, damagePlayer, healPlayer, isPlayerAlive } from './Player.js';\r\n\r\nconst DEFAULT_SETTINGS: GameSettings = {\r\n language: 'en',\r\n autoSave: true,\r\n autoSaveInterval: 60,\r\n combatSpeed: 1,\r\n soundEnabled: false,\r\n};\r\n\r\nexport class Game {\r\n private state: GameState | null = null;\r\n private settings: GameSettings;\r\n private tickInterval: NodeJS.Timeout | null = null;\r\n private lastTickTime: number = 0;\r\n private eventListeners: Map<string, Set<(data: unknown) => void>> = new Map();\r\n \r\n // Event cooldown system - minimum 30 seconds between random events\r\n private lastRandomEventTime: number = 0;\r\n private readonly MIN_EVENT_COOLDOWN_MS = 30000; // 30 seconds\r\n\r\n constructor(settings: Partial<GameSettings> = {}) {\r\n this.settings = { ...DEFAULT_SETTINGS, ...settings };\r\n }\r\n\r\n /**\r\n * Initialize a new game\r\n */\r\n async initialize(playerName: string): Promise<void> {\r\n const player = this.createNewPlayer(playerName);\r\n const startMap = this.createStartingMap();\r\n const startRoom = startMap.rooms.get(startMap.startRoomId)!;\r\n\r\n this.state = {\r\n phase: 'exploring',\r\n player,\r\n currentMap: startMap,\r\n currentRoom: startRoom,\r\n pendingEvents: [],\r\n gameTime: 0,\r\n lastUpdateTime: Date.now(),\r\n isPaused: false,\r\n };\r\n\r\n // Start the game loop\r\n this.startGameLoop();\r\n\r\n this.emit('game:initialized', { player, map: startMap });\r\n }\r\n\r\n /**\r\n * Start the real-time game loop\r\n */\r\n private startGameLoop(): void {\r\n const TICK_RATE = 1000; // 1 second per tick (real-time sync)\r\n this.lastTickTime = Date.now();\r\n\r\n this.tickInterval = setInterval(() => {\r\n this.tick();\r\n }, TICK_RATE);\r\n }\r\n\r\n /**\r\n * Stop the game loop\r\n */\r\n private stopGameLoop(): void {\r\n if (this.tickInterval) {\r\n clearInterval(this.tickInterval);\r\n this.tickInterval = null;\r\n }\r\n }\r\n\r\n /**\r\n * Main game tick - called every second\r\n */\r\n private tick(): void {\r\n if (!this.state || this.state.isPaused) return;\r\n\r\n const now = Date.now();\r\n const deltaTime = (now - this.lastTickTime) / 1000; // Seconds\r\n this.lastTickTime = now;\r\n\r\n // Update game time (synced with real time)\r\n this.state.gameTime += deltaTime;\r\n this.state.lastUpdateTime = now;\r\n\r\n // Process based on current phase\r\n switch (this.state.phase) {\r\n case 'traveling':\r\n this.processTravelTick(deltaTime);\r\n break;\r\n case 'combat':\r\n this.processCombatTick(deltaTime);\r\n break;\r\n case 'exploring':\r\n this.processExploringTick(deltaTime);\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // Process pending events\r\n this.processPendingEvents();\r\n\r\n // Auto-save check\r\n if (this.settings.autoSave && \r\n this.state.gameTime % this.settings.autoSaveInterval < deltaTime) {\r\n this.save();\r\n }\r\n\r\n this.emit('game:tick', { gameTime: this.state.gameTime, deltaTime });\r\n }\r\n\r\n /**\r\n * Process travel state\r\n */\r\n private processTravelTick(deltaTime: number): void {\r\n if (!this.state?.travelState) return;\r\n\r\n const travel = this.state.travelState;\r\n const elapsed = (Date.now() - travel.startTime) / 1000;\r\n travel.progress = Math.min(elapsed / travel.duration, 1);\r\n\r\n // Check for random events during travel\r\n if (Math.random() < 0.1 * deltaTime) { // 10% chance per second\r\n this.generateTravelEvent();\r\n }\r\n\r\n // Check if travel is complete\r\n if (travel.progress >= 1) {\r\n this.completeTravelArrival();\r\n }\r\n\r\n this.emit('travel:progress', travel);\r\n }\r\n\r\n /**\r\n * Process combat state (auto-combat based on strategy)\r\n */\r\n private processCombatTick(deltaTime: number): void {\r\n if (!this.state?.combat) return;\r\n\r\n // Combat processes one turn every 2 seconds (modified by speed setting)\r\n const combatDelta = deltaTime * this.settings.combatSpeed;\r\n this.combatAccumulator = (this.combatAccumulator || 0) + combatDelta;\r\n\r\n const turnDuration = 2; // 2 seconds per turn\r\n if (this.combatAccumulator >= turnDuration) {\r\n this.combatAccumulator = 0;\r\n\r\n // Process combat turn\r\n const result = processCombatTurn(this.state.combat, this.state.player);\r\n this.state.combat = result.combat;\r\n\r\n if (result.finished) {\r\n if (result.victory) {\r\n // Calculate rewards\r\n const rewards = calculateCombatRewards(this.state.combat.enemies);\r\n this.state.player = addExperience(this.state.player, rewards.exp);\r\n this.state.player = addGold(this.state.player, rewards.gold);\r\n \r\n // Mark room as cleared\r\n this.state.currentRoom.isCleared = true;\r\n \r\n this.emit('combat:victory', { rewards });\r\n } else {\r\n // Player defeated - respawn at start room\r\n this.respawnPlayer();\r\n this.emit('combat:defeat', {});\r\n }\r\n\r\n this.state.combat = undefined;\r\n this.state.phase = 'exploring';\r\n }\r\n }\r\n\r\n this.emit('combat:tick', { deltaTime: combatDelta, combat: this.state.combat });\r\n }\r\n\r\n private combatAccumulator: number = 0;\r\n\r\n /**\r\n * Process exploring state\r\n */\r\n private processExploringTick(deltaTime: number): void {\r\n // Check for timed quests\r\n this.checkQuestTimers();\r\n \r\n // Random events while exploring (with cooldown to prevent spam)\r\n const now = Date.now();\r\n const timeSinceLastEvent = now - this.lastRandomEventTime;\r\n \r\n // Only allow random events if cooldown has passed\r\n if (timeSinceLastEvent >= this.MIN_EVENT_COOLDOWN_MS) {\r\n if (Math.random() < 0.02 * deltaTime) { // 2% chance per second\r\n this.generateRandomEvent();\r\n this.lastRandomEventTime = now;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generate a random travel event\r\n */\r\n private generateTravelEvent(): void {\r\n const eventTypes = ['resource_found', 'enemy_encounter', 'npc_sighting', 'nothing'];\r\n const weights = [0.3, 0.2, 0.1, 0.4];\r\n const roll = Math.random();\r\n let cumulative = 0;\r\n let selectedType = 'nothing';\r\n\r\n for (let i = 0; i < eventTypes.length; i++) {\r\n cumulative += weights[i];\r\n if (roll < cumulative) {\r\n selectedType = eventTypes[i];\r\n break;\r\n }\r\n }\r\n\r\n if (selectedType !== 'nothing') {\r\n const event: GameEvent = {\r\n id: `event_${Date.now()}`,\r\n type: 'travel_event',\r\n title: this.getTravelEventTitle(selectedType),\r\n description: this.getTravelEventDescription(selectedType),\r\n timestamp: Date.now(),\r\n processed: false,\r\n };\r\n this.state!.pendingEvents.push(event);\r\n }\r\n }\r\n\r\n /**\r\n * Complete travel and arrive at destination\r\n */\r\n private completeTravelArrival(): void {\r\n if (!this.state?.travelState) return;\r\n\r\n const destRoom = this.state.currentMap.rooms.get(this.state.travelState.toRoomId);\r\n if (destRoom) {\r\n this.state.currentRoom = destRoom;\r\n this.state.player.position = { ...destRoom.position };\r\n \r\n if (!destRoom.isExplored) {\r\n destRoom.isExplored = true;\r\n if (!this.state.player.discoveredLocations.includes(destRoom.id)) {\r\n this.state.player.discoveredLocations.push(destRoom.id);\r\n }\r\n }\r\n\r\n this.emit('travel:arrived', { room: destRoom });\r\n\r\n // Check for room encounters\r\n if (destRoom.enemies && destRoom.enemies.length > 0 && !destRoom.isCleared) {\r\n this.startCombat(destRoom.enemies);\r\n }\r\n }\r\n\r\n this.state.travelState = undefined;\r\n this.state.phase = 'exploring';\r\n }\r\n\r\n /**\r\n * Start traveling to a room\r\n */\r\n travelTo(roomId: string): boolean {\r\n if (!this.state) return false;\r\n\r\n const targetRoom = this.state.currentMap.rooms.get(roomId);\r\n if (!targetRoom) return false;\r\n\r\n // Check if connected\r\n if (!this.state.currentRoom.connections.includes(roomId)) {\r\n return false;\r\n }\r\n\r\n // Calculate travel time based on distance\r\n const distance = this.calculateDistance(\r\n this.state.currentRoom.position,\r\n targetRoom.position\r\n );\r\n const baseDuration = distance * 30; // 30 seconds per unit distance\r\n\r\n this.state.travelState = {\r\n fromRoomId: this.state.currentRoom.id,\r\n toRoomId: roomId,\r\n startTime: Date.now(),\r\n duration: baseDuration,\r\n progress: 0,\r\n events: [],\r\n };\r\n\r\n this.state.phase = 'traveling';\r\n this.emit('travel:started', this.state.travelState);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Cancel current travel and return to origin room\r\n */\r\n cancelTravel(): boolean {\r\n if (!this.state?.travelState) return false;\r\n\r\n // Stay at origin room (don't change currentRoom)\r\n this.state.travelState = undefined;\r\n this.state.phase = 'exploring';\r\n this.emit('travel:cancelled', {});\r\n return true;\r\n }\r\n\r\n /**\r\n * Start combat with enemies\r\n */\r\n private startCombat(enemies: import('./types.js').Enemy[]): void {\r\n if (!this.state) return;\r\n\r\n // Initialize combat using the Combat module\r\n this.state.combat = initCombat(this.state.player, enemies);\r\n this.state.phase = 'combat';\r\n this.combatAccumulator = 0;\r\n \r\n this.emit('combat:started', this.state.combat);\r\n }\r\n\r\n /**\r\n * Set combat strategy\r\n */\r\n setCombatStrategy(strategy: import('./types.js').CombatStrategy): void {\r\n if (this.state?.combat) {\r\n this.state.combat.strategy = strategy;\r\n this.emit('combat:strategy_changed', { strategy });\r\n }\r\n }\r\n\r\n /**\r\n * Respawn player at start room with full HP\r\n */\r\n private respawnPlayer(): void {\r\n if (!this.state) return;\r\n\r\n // Heal player to full HP\r\n this.state.player = healPlayer(this.state.player, this.state.player.stats.maxHp);\r\n\r\n // Move to start room\r\n const startRoom = this.state.currentMap.rooms.get('start_room');\r\n if (startRoom) {\r\n this.state.currentRoom = startRoom;\r\n this.state.player.position = { ...startRoom.position };\r\n }\r\n\r\n this.emit('player:respawn', { room: this.state.currentRoom });\r\n }\r\n\r\n /**\r\n * Process pending events\r\n */\r\n private processPendingEvents(): void {\r\n if (!this.state) return;\r\n\r\n const unprocessed = this.state.pendingEvents.filter(e => !e.processed);\r\n for (const event of unprocessed) {\r\n this.emit('event:new', event);\r\n event.processed = true;\r\n }\r\n\r\n // Clean up old processed events to prevent memory leak (keep last 50)\r\n if (this.state.pendingEvents.length > 50) {\r\n this.state.pendingEvents = this.state.pendingEvents.slice(-50);\r\n }\r\n }\r\n\r\n /**\r\n * Check quest timers\r\n */\r\n private checkQuestTimers(): void {\r\n if (!this.state) return;\r\n\r\n for (const quest of this.state.player.activeQuests) {\r\n if (quest.timeLimit && quest.startTime) {\r\n const elapsed = (Date.now() - quest.startTime) / 1000;\r\n if (elapsed >= quest.timeLimit) {\r\n quest.status = 'failed';\r\n this.emit('quest:failed', { quest });\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generate a random exploration event\r\n */\r\n private generateRandomEvent(): void {\r\n if (!this.state) return;\r\n\r\n const eventTypes = [\r\n { type: 'item_found', weight: 30 },\r\n { type: 'random_encounter', weight: 20 },\r\n { type: 'npc_encounter', weight: 15 },\r\n { type: 'quest_hint', weight: 15 },\r\n { type: 'nothing', weight: 20 },\r\n ];\r\n\r\n const totalWeight = eventTypes.reduce((sum, e) => sum + e.weight, 0);\r\n let roll = Math.random() * totalWeight;\r\n let selectedType = 'nothing';\r\n\r\n for (const et of eventTypes) {\r\n roll -= et.weight;\r\n if (roll <= 0) {\r\n selectedType = et.type;\r\n break;\r\n }\r\n }\r\n\r\n if (selectedType === 'nothing') return;\r\n\r\n const eventData: Record<string, { title: string; description: string }> = {\r\n item_found: {\r\n title: 'Discovery!',\r\n description: 'You found a small cache of supplies hidden nearby.',\r\n },\r\n random_encounter: {\r\n title: 'Danger!',\r\n description: 'Something stirs in the shadows...',\r\n },\r\n npc_encounter: {\r\n title: 'A Stranger Appears',\r\n description: 'A mysterious figure approaches you.',\r\n },\r\n quest_hint: {\r\n title: 'Clue Found',\r\n description: 'You notice something that might be useful for your quest.',\r\n },\r\n };\r\n\r\n const data = eventData[selectedType];\r\n if (data) {\r\n const event: GameEvent = {\r\n id: `event_${Date.now()}`,\r\n type: selectedType as import('./types.js').EventType,\r\n title: data.title,\r\n description: data.description,\r\n timestamp: Date.now(),\r\n processed: false,\r\n };\r\n // Add to pending events - processPendingEvents() will emit and mark as processed\r\n this.state.pendingEvents.push(event);\r\n }\r\n }\r\n\r\n /**\r\n * Create a new player\r\n */\r\n private createNewPlayer(name: string): Player {\r\n return {\r\n id: `player_${Date.now()}`,\r\n name,\r\n stats: {\r\n level: 1,\r\n hp: 100,\r\n maxHp: 100,\r\n mp: 50,\r\n maxMp: 50,\r\n attack: 10,\r\n defense: 5,\r\n speed: 10,\r\n exp: 0,\r\n expToNextLevel: 100,\r\n gold: 50,\r\n },\r\n position: { x: 0, y: 0, floor: 1 },\r\n equipment: {\r\n weapon: null,\r\n armor: null,\r\n accessory: null,\r\n },\r\n inventory: [],\r\n activeQuests: [],\r\n completedQuests: [],\r\n discoveredLocations: [],\r\n unlockedAffixes: [],\r\n createdAt: Date.now(),\r\n playTime: 0,\r\n // Character customization (can be filled in by player)\r\n character: {\r\n backstory: '',\r\n appearance: '',\r\n personality: '',\r\n motivation: '',\r\n origin: '',\r\n traits: [],\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Create the starting map using BSP algorithm\r\n */\r\n private createStartingMap(): GameMap {\r\n // Generate a procedural dungeon with BSP\r\n const map = generateMap({\r\n width: 40,\r\n height: 40,\r\n floor: 1,\r\n minRoomSize: 8,\r\n maxRoomSize: 15,\r\n roomTypes: [\r\n { type: 'combat', weight: 40 },\r\n { type: 'shop', weight: 15 },\r\n { type: 'treasure', weight: 20 },\r\n { type: 'event', weight: 15 },\r\n { type: 'rest', weight: 5 },\r\n { type: 'boss', weight: 5 },\r\n ],\r\n });\r\n\r\n return map;\r\n }\r\n\r\n /**\r\n * Calculate distance between two positions\r\n */\r\n private calculateDistance(a: import('./types.js').Position, b: import('./types.js').Position): number {\r\n const dx = Math.abs(a.x - b.x);\r\n const dy = Math.abs(a.y - b.y);\r\n const df = Math.abs(a.floor - b.floor);\r\n return dx + dy + df * 2; // Floor changes take longer\r\n }\r\n\r\n /**\r\n * Get travel event title\r\n */\r\n private getTravelEventTitle(type: string): string {\r\n const titles: Record<string, string> = {\r\n resource_found: 'Discovery!',\r\n enemy_encounter: 'Ambush!',\r\n npc_sighting: 'A Fellow Traveler',\r\n };\r\n return titles[type] || 'Something happened...';\r\n }\r\n\r\n /**\r\n * Get travel event description\r\n */\r\n private getTravelEventDescription(type: string): string {\r\n const descriptions: Record<string, string> = {\r\n resource_found: 'You found something interesting along the way.',\r\n enemy_encounter: 'Enemies block your path!',\r\n npc_sighting: 'You notice someone in the distance.',\r\n };\r\n return descriptions[type] || '';\r\n }\r\n\r\n // =========================================================================\r\n // Event System\r\n // =========================================================================\r\n\r\n on(event: string, callback: (data: unknown) => void): void {\r\n if (!this.eventListeners.has(event)) {\r\n this.eventListeners.set(event, new Set());\r\n }\r\n this.eventListeners.get(event)!.add(callback);\r\n }\r\n\r\n off(event: string, callback: (data: unknown) => void): void {\r\n this.eventListeners.get(event)?.delete(callback);\r\n }\r\n\r\n private emit(event: string, data: unknown): void {\r\n this.eventListeners.get(event)?.forEach(cb => cb(data));\r\n }\r\n\r\n // =========================================================================\r\n // Save/Load\r\n // =========================================================================\r\n\r\n save(): SaveData | null {\r\n if (!this.state) return null;\r\n\r\n const saveData: SaveData = {\r\n version: '0.1.0',\r\n timestamp: Date.now(),\r\n player: this.state.player,\r\n currentMapId: this.state.currentMap.id,\r\n currentRoomId: this.state.currentRoom.id,\r\n discoveredMaps: [this.state.currentMap.id],\r\n gameTime: this.state.gameTime,\r\n settings: this.settings,\r\n };\r\n\r\n this.emit('game:saved', saveData);\r\n return saveData;\r\n }\r\n\r\n // =========================================================================\r\n // Getters\r\n // =========================================================================\r\n\r\n getState(): GameState | null {\r\n return this.state;\r\n }\r\n\r\n getSettings(): GameSettings {\r\n return this.settings;\r\n }\r\n\r\n getPhase(): GamePhase | null {\r\n return this.state?.phase ?? null;\r\n }\r\n\r\n getPlayer(): Player | null {\r\n return this.state?.player ?? null;\r\n }\r\n\r\n getCurrentRoom(): Room | null {\r\n return this.state?.currentRoom ?? null;\r\n }\r\n\r\n getGameTime(): number {\r\n return this.state?.gameTime ?? 0;\r\n }\r\n\r\n /**\r\n * Update player name\r\n */\r\n setPlayerName(name: string): boolean {\r\n if (!this.state?.player) return false;\r\n this.state.player.name = name;\r\n this.emit('player:name_changed', { name });\r\n return true;\r\n }\r\n\r\n /**\r\n * Update player character customization\r\n */\r\n setPlayerCharacter(character: Partial<import('./types.js').PlayerCharacter>): boolean {\r\n if (!this.state?.player) return false;\r\n \r\n // Initialize character if not exists\r\n if (!this.state.player.character) {\r\n this.state.player.character = {\r\n backstory: '',\r\n appearance: '',\r\n personality: '',\r\n motivation: '',\r\n origin: '',\r\n traits: [],\r\n };\r\n }\r\n \r\n // Merge provided fields\r\n this.state.player.character = {\r\n ...this.state.player.character,\r\n ...character,\r\n };\r\n \r\n this.emit('player:character_updated', { character: this.state.player.character });\r\n return true;\r\n }\r\n\r\n /**\r\n * Get player character customization\r\n */\r\n getPlayerCharacter(): import('./types.js').PlayerCharacter | undefined {\r\n return this.state?.player?.character;\r\n }\r\n\r\n // =========================================================================\r\n // Lifecycle\r\n // =========================================================================\r\n\r\n pause(): void {\r\n if (this.state) {\r\n this.state.isPaused = true;\r\n this.emit('game:paused', null);\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (this.state) {\r\n this.state.isPaused = false;\r\n this.lastTickTime = Date.now();\r\n this.emit('game:resumed', null);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.stopGameLoop();\r\n this.state = null;\r\n this.eventListeners.clear();\r\n this.emit('game:destroyed', null);\r\n }\r\n\r\n /**\r\n * Load game state from save data\r\n */\r\n loadState(saveData: SaveData): boolean {\r\n if (!this.state) return false;\r\n\r\n try {\r\n // Restore player\r\n this.state.player = saveData.player;\r\n \r\n // Restore game time\r\n this.state.gameTime = saveData.gameTime;\r\n \r\n // Try to restore current room (need to regenerate map with same seed)\r\n // For now, just use the current map\r\n const room = this.state.currentMap.rooms.get(saveData.currentRoomId);\r\n if (room) {\r\n this.state.currentRoom = room;\r\n this.state.player.position = { ...room.position };\r\n }\r\n\r\n // Reset to exploring state\r\n this.state.phase = 'exploring';\r\n this.state.combat = undefined;\r\n this.state.travelState = undefined;\r\n this.state.isPaused = false;\r\n this.state.lastUpdateTime = Date.now();\r\n\r\n this.emit('game:loaded', saveData);\r\n return true;\r\n } catch (error) {\r\n console.error('[Game] Failed to load state:', error);\r\n return false;\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"2cabfb3c-6dcf-5bd3-9b23-de27057ab179"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Idle Combat System
3
+ * AI-driven combat using StrategyStateMachine
4
+ *
5
+ * This module extends the base Combat system with:
6
+ * - Strategy-based target selection
7
+ * - Automatic item usage
8
+ * - Retreat detection
9
+ * - Integration with TimeManager
10
+ */
11
+ import type { Player, Enemy, CombatState, StrategyStateMachine } from './types.js';
12
+ import { StrategyExecutor, type CombatDecision } from '../strategy/index.js';
13
+ export interface IdleCombatState extends CombatState {
14
+ strategyExecutor: StrategyExecutor;
15
+ retreatRequested: boolean;
16
+ combatType: 'mob' | 'elite' | 'boss' | 'ambush';
17
+ itemsUsed: string[];
18
+ autoProgress: boolean;
19
+ }
20
+ export interface CombatTurnResult {
21
+ combat: IdleCombatState;
22
+ finished: boolean;
23
+ victory: boolean;
24
+ retreated: boolean;
25
+ decision: CombatDecision;
26
+ }
27
+ export interface CombatInitOptions {
28
+ strategy: StrategyStateMachine;
29
+ combatType?: 'mob' | 'elite' | 'boss' | 'ambush';
30
+ isAmbush?: boolean;
31
+ }
32
+ /**
33
+ * Initialize an AI-driven combat encounter
34
+ */
35
+ export declare function initIdleCombat(player: Player, enemies: Enemy[], options: CombatInitOptions): IdleCombatState;
36
+ /**
37
+ * Process a single combat turn using AI strategy
38
+ */
39
+ export declare function processIdleCombatTurn(combat: IdleCombatState, player: Player): CombatTurnResult;
40
+ /**
41
+ * Calculate combat rewards
42
+ */
43
+ export declare function calculateIdleCombatRewards(enemies: Enemy[], retreated: boolean): {
44
+ exp: number;
45
+ gold: number;
46
+ items: string[];
47
+ };
48
+ /**
49
+ * Get combat progress (0-1)
50
+ */
51
+ export declare function getIdleCombatProgress(combat: IdleCombatState): number;
52
+ /**
53
+ * Format combat log for display
54
+ */
55
+ export declare function formatIdleCombatLog(combat: IdleCombatState, maxLines?: number): string[];
56
+ /**
57
+ * Run full auto-combat until completion
58
+ * Returns result after all turns are processed
59
+ */
60
+ export declare function runFullAutoCombat(player: Player, enemies: Enemy[], strategy: StrategyStateMachine, maxTurns?: number): CombatTurnResult;
61
+ //# sourceMappingURL=IdleCombat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdleCombat.d.ts","sourceRoot":"/","sources":["core/IdleCombat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,KAAK,EACL,WAAW,EAIX,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAGhB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAc9B,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,UAAU,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,KAAK,EAAE,EAChB,OAAO,EAAE,iBAAiB,GACzB,eAAe,CA+BjB;AA2BD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,gBAAgB,CAmGlB;AA2SD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,KAAK,EAAE,EAChB,SAAS,EAAE,OAAO,GACjB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAqBhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAIrE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,EAAE,CAO5F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,KAAK,EAAE,EAChB,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,GAAE,MAAY,GACrB,gBAAgB,CAgBlB"}
@@ -0,0 +1,461 @@
1
+ /**
2
+ * Idle Combat System
3
+ * AI-driven combat using StrategyStateMachine
4
+ *
5
+ * This module extends the base Combat system with:
6
+ * - Strategy-based target selection
7
+ * - Automatic item usage
8
+ * - Retreat detection
9
+ * - Integration with TimeManager
10
+ */
11
+
12
+ !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]="0e7267ed-2d1b-527e-8f89-b87d0cb40a96")}catch(e){}}();
13
+ import { t } from '../i18n/index.js';
14
+ import { createStrategyExecutor, } from '../strategy/index.js';
15
+ import { COMBAT_TURN_DURATION, COMBAT_MOB_BASE, COMBAT_ELITE_BASE, COMBAT_BOSS_BASE, COMBAT_AMBUSH_BASE, } from './timeConstants.js';
16
+ // ============================================================================
17
+ // Combat Initialization
18
+ // ============================================================================
19
+ /**
20
+ * Initialize an AI-driven combat encounter
21
+ */
22
+ export function initIdleCombat(player, enemies, options) {
23
+ const combatType = options.combatType || determineCombatType(enemies);
24
+ const baseDuration = getBaseCombatDuration(combatType);
25
+ // Calculate estimated duration based on enemy strength
26
+ const totalEnemyHp = enemies.reduce((sum, e) => sum + e.maxHp, 0);
27
+ const avgPlayerDamage = Math.max(1, player.stats.attack * 0.8);
28
+ const estimatedTurns = Math.ceil(totalEnemyHp / avgPlayerDamage);
29
+ const estimatedDuration = Math.max(baseDuration, estimatedTurns * COMBAT_TURN_DURATION);
30
+ const executor = createStrategyExecutor(options.strategy);
31
+ return {
32
+ isActive: true,
33
+ turn: 0,
34
+ playerHp: player.stats.hp,
35
+ enemies: enemies.map(e => ({ ...e })),
36
+ log: [{
37
+ timestamp: Date.now(),
38
+ message: options.isAmbush ? t('combat.ambush') || 'Ambush!' : t('combat.battleStart'),
39
+ type: 'system',
40
+ }],
41
+ strategy: 'balanced', // Legacy field, ignored
42
+ startTime: Date.now(),
43
+ estimatedEndTime: Date.now() + estimatedDuration * 1000,
44
+ strategyExecutor: executor,
45
+ retreatRequested: false,
46
+ combatType,
47
+ itemsUsed: [],
48
+ autoProgress: true,
49
+ };
50
+ }
51
+ /**
52
+ * Determine combat type from enemies
53
+ */
54
+ function determineCombatType(enemies) {
55
+ if (enemies.some(e => e.isBoss))
56
+ return 'boss';
57
+ if (enemies.length === 1 && enemies[0].level >= 5)
58
+ return 'elite';
59
+ return 'mob';
60
+ }
61
+ /**
62
+ * Get base combat duration by type
63
+ */
64
+ function getBaseCombatDuration(type) {
65
+ switch (type) {
66
+ case 'mob': return COMBAT_MOB_BASE;
67
+ case 'elite': return COMBAT_ELITE_BASE;
68
+ case 'boss': return COMBAT_BOSS_BASE;
69
+ case 'ambush': return COMBAT_AMBUSH_BASE;
70
+ }
71
+ }
72
+ // ============================================================================
73
+ // Combat Processing
74
+ // ============================================================================
75
+ /**
76
+ * Process a single combat turn using AI strategy
77
+ */
78
+ export function processIdleCombatTurn(combat, player) {
79
+ if (!combat.isActive) {
80
+ return {
81
+ combat,
82
+ finished: true,
83
+ victory: false,
84
+ retreated: combat.retreatRequested,
85
+ decision: { action: 'attack', reason: 'Combat ended' },
86
+ };
87
+ }
88
+ combat.turn++;
89
+ const log = [];
90
+ // Get living enemies
91
+ const livingEnemies = combat.enemies.filter(e => e.hp > 0);
92
+ if (livingEnemies.length === 0) {
93
+ return finishCombat(combat, true);
94
+ }
95
+ // Build combat context for strategy
96
+ const context = {
97
+ player: {
98
+ hp: combat.playerHp,
99
+ maxHp: player.stats.maxHp,
100
+ mp: player.stats.mp,
101
+ maxMp: player.stats.maxMp,
102
+ },
103
+ enemies: livingEnemies,
104
+ turn: combat.turn,
105
+ isBossFight: combat.combatType === 'boss',
106
+ inventory: player.inventory,
107
+ };
108
+ // Get strategy decision
109
+ const decision = combat.strategyExecutor.decideCombatAction(context);
110
+ // Execute decision
111
+ switch (decision.action) {
112
+ case 'retreat':
113
+ combat.retreatRequested = true;
114
+ log.push({
115
+ timestamp: Date.now(),
116
+ message: `${player.name} is retreating! (${decision.reason})`,
117
+ type: 'system',
118
+ });
119
+ return finishCombat(combat, false, true, decision);
120
+ case 'item':
121
+ if (decision.itemId) {
122
+ const itemUsed = useItemInCombat(player, combat, decision.itemId, log);
123
+ if (itemUsed) {
124
+ combat.itemsUsed.push(decision.itemId);
125
+ }
126
+ }
127
+ // After using item, still attack
128
+ executeAttack(player, combat, livingEnemies, decision.targetId, log);
129
+ break;
130
+ case 'defend':
131
+ log.push({
132
+ timestamp: Date.now(),
133
+ message: `${player.name} defends! (${decision.reason})`,
134
+ type: 'system',
135
+ });
136
+ // Defending reduces incoming damage this turn (handled in enemy attack)
137
+ break;
138
+ case 'attack':
139
+ default:
140
+ executeAttack(player, combat, livingEnemies, decision.targetId, log);
141
+ break;
142
+ }
143
+ // Enemies attack (unless player retreated or defended)
144
+ if (!combat.retreatRequested) {
145
+ const isDefending = decision.action === 'defend';
146
+ executeEnemyAttacks(player, combat, livingEnemies, log, isDefending);
147
+ }
148
+ // Check for defeat
149
+ if (combat.playerHp <= 0) {
150
+ return finishCombat(combat, false, false, decision);
151
+ }
152
+ // Check all enemies defeated
153
+ if (combat.enemies.every(e => e.hp <= 0)) {
154
+ return finishCombat(combat, true, false, decision);
155
+ }
156
+ combat.log.push(...log);
157
+ return {
158
+ combat,
159
+ finished: false,
160
+ victory: false,
161
+ retreated: false,
162
+ decision,
163
+ };
164
+ }
165
+ /**
166
+ * Execute player attack
167
+ */
168
+ function executeAttack(player, combat, enemies, targetId, log) {
169
+ // Find target
170
+ let target = enemies.find(e => e.id === targetId);
171
+ if (!target || target.hp <= 0) {
172
+ target = enemies[0];
173
+ }
174
+ // Calculate damage
175
+ const baseDamage = calculatePlayerDamage(player);
176
+ const actualDamage = applyDamage(target, baseDamage);
177
+ log.push({
178
+ timestamp: Date.now(),
179
+ message: `${player.name} ${t('combat.damage', { amount: actualDamage })} → ${target.name}`,
180
+ type: 'damage',
181
+ });
182
+ // Check for critical hit (10% base chance)
183
+ if (Math.random() < 0.1) {
184
+ const critDamage = Math.floor(actualDamage * 0.5);
185
+ target.hp = Math.max(0, target.hp - critDamage);
186
+ log.push({
187
+ timestamp: Date.now(),
188
+ message: `${t('combat.critical')} +${critDamage}`,
189
+ type: 'damage',
190
+ });
191
+ }
192
+ // Apply weapon effects
193
+ if (player.equipment.weapon) {
194
+ applyWeaponEffects(player.equipment.weapon, target, log);
195
+ }
196
+ // Check if enemy defeated
197
+ if (target.hp <= 0) {
198
+ log.push({
199
+ timestamp: Date.now(),
200
+ message: `${target.name} defeated!`,
201
+ type: 'system',
202
+ });
203
+ }
204
+ }
205
+ /**
206
+ * Execute enemy attacks
207
+ */
208
+ function executeEnemyAttacks(player, combat, enemies, log, isDefending) {
209
+ for (const enemy of enemies.filter(e => e.hp > 0)) {
210
+ let damage = calculateEnemyDamage(enemy, player);
211
+ // Reduce damage if defending
212
+ if (isDefending) {
213
+ damage = Math.floor(damage * 0.5);
214
+ }
215
+ combat.playerHp = Math.max(0, combat.playerHp - damage);
216
+ log.push({
217
+ timestamp: Date.now(),
218
+ message: `${enemy.name} ${t('combat.damage', { amount: damage })} → ${player.name}`,
219
+ type: 'damage',
220
+ });
221
+ // Boss special abilities
222
+ if (enemy.isBoss && enemy.abilities) {
223
+ for (const ability of enemy.abilities) {
224
+ if (ability.currentCooldown === 0) {
225
+ const abilityDamage = Math.floor(ability.damage * (isDefending ? 0.7 : 1));
226
+ combat.playerHp = Math.max(0, combat.playerHp - abilityDamage);
227
+ ability.currentCooldown = ability.cooldown;
228
+ log.push({
229
+ timestamp: Date.now(),
230
+ message: `${enemy.name} uses ${ability.name}! ${abilityDamage} damage`,
231
+ type: 'damage',
232
+ });
233
+ }
234
+ else {
235
+ ability.currentCooldown--;
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ /**
242
+ * Use an item in combat
243
+ */
244
+ function useItemInCombat(player, combat, itemId, log) {
245
+ const itemIndex = player.inventory.findIndex(i => i.id === itemId && i.quantity > 0);
246
+ if (itemIndex === -1) {
247
+ return false;
248
+ }
249
+ const item = player.inventory[itemIndex];
250
+ const itemName = item.name.toLowerCase();
251
+ // Apply item effect
252
+ if (itemName.includes('health') || itemName.includes('healing') || itemName.includes('hp')) {
253
+ const healAmount = 50; // Base heal amount
254
+ combat.playerHp = Math.min(player.stats.maxHp, combat.playerHp + healAmount);
255
+ log.push({
256
+ timestamp: Date.now(),
257
+ message: `${player.name} uses ${item.name}! ${t('combat.heal', { amount: healAmount })}`,
258
+ type: 'heal',
259
+ });
260
+ }
261
+ else if (itemName.includes('mana') || itemName.includes('mp')) {
262
+ const manaAmount = 30;
263
+ player.stats.mp = Math.min(player.stats.maxMp, player.stats.mp + manaAmount);
264
+ log.push({
265
+ timestamp: Date.now(),
266
+ message: `${player.name} uses ${item.name}! +${manaAmount} MP`,
267
+ type: 'heal',
268
+ });
269
+ }
270
+ else {
271
+ log.push({
272
+ timestamp: Date.now(),
273
+ message: `${player.name} uses ${item.name}!`,
274
+ type: 'system',
275
+ });
276
+ }
277
+ // Consume item
278
+ item.quantity--;
279
+ if (item.quantity <= 0) {
280
+ player.inventory.splice(itemIndex, 1);
281
+ }
282
+ return true;
283
+ }
284
+ // ============================================================================
285
+ // Damage Calculation
286
+ // ============================================================================
287
+ /**
288
+ * Calculate player damage
289
+ */
290
+ function calculatePlayerDamage(player) {
291
+ let baseDamage = player.stats.attack;
292
+ if (player.equipment.weapon) {
293
+ baseDamage += player.equipment.weapon.baseAttack;
294
+ }
295
+ // Add variance (±20%)
296
+ const variance = 0.2;
297
+ const multiplier = 1 + (Math.random() * variance * 2 - variance);
298
+ return Math.floor(baseDamage * multiplier);
299
+ }
300
+ /**
301
+ * Calculate enemy damage against player
302
+ */
303
+ function calculateEnemyDamage(enemy, player) {
304
+ let defense = player.stats.defense;
305
+ if (player.equipment.armor) {
306
+ defense += player.equipment.armor.baseDefense;
307
+ }
308
+ const baseDamage = Math.max(1, enemy.attack - Math.floor(defense / 2));
309
+ // Add variance (±15%)
310
+ const variance = 0.15;
311
+ const multiplier = 1 + (Math.random() * variance * 2 - variance);
312
+ return Math.floor(baseDamage * multiplier);
313
+ }
314
+ /**
315
+ * Apply damage to enemy
316
+ */
317
+ function applyDamage(enemy, damage) {
318
+ const actualDamage = Math.max(1, damage - Math.floor(enemy.defense / 3));
319
+ enemy.hp = Math.max(0, enemy.hp - actualDamage);
320
+ return actualDamage;
321
+ }
322
+ /**
323
+ * Apply weapon affix effects
324
+ */
325
+ function applyWeaponEffects(weapon, target, log) {
326
+ const elementEffects = {
327
+ 'of_flames': { element: 'fire', baseDamage: 8, statusChance: 0.3 },
328
+ 'of_frost': { element: 'ice', baseDamage: 6, statusChance: 0.25 },
329
+ 'of_thunder': { element: 'lightning', baseDamage: 12, statusChance: 0.15 },
330
+ 'of_venom': { element: 'poison', baseDamage: 4, statusChance: 0.5 },
331
+ 'of_the_night': { element: 'dark', baseDamage: 15, statusChance: 0.2 },
332
+ 'of_light': { element: 'holy', baseDamage: 10, statusChance: 0.3 },
333
+ };
334
+ for (const affix of weapon.affixes) {
335
+ const effect = elementEffects[affix.definitionId];
336
+ if (effect) {
337
+ target.hp = Math.max(0, target.hp - effect.baseDamage);
338
+ log.push({
339
+ timestamp: Date.now(),
340
+ message: `${effect.element} +${effect.baseDamage}`,
341
+ type: 'damage',
342
+ });
343
+ if (Math.random() < effect.statusChance) {
344
+ log.push({
345
+ timestamp: Date.now(),
346
+ message: t('combat.statusEffect', { target: target.name, effect: effect.element }),
347
+ type: 'status',
348
+ });
349
+ }
350
+ }
351
+ if (affix.definitionId === 'vampiric') {
352
+ const healAmount = Math.floor(weapon.baseAttack * 0.1);
353
+ log.push({
354
+ timestamp: Date.now(),
355
+ message: t('combat.heal', { amount: healAmount }),
356
+ type: 'heal',
357
+ });
358
+ }
359
+ }
360
+ }
361
+ // ============================================================================
362
+ // Combat Completion
363
+ // ============================================================================
364
+ /**
365
+ * Finish combat
366
+ */
367
+ function finishCombat(combat, victory, retreated = false, decision) {
368
+ combat.isActive = false;
369
+ combat.retreatRequested = retreated;
370
+ if (victory) {
371
+ combat.log.push({
372
+ timestamp: Date.now(),
373
+ message: t('combat.victory'),
374
+ type: 'system',
375
+ });
376
+ }
377
+ else if (retreated) {
378
+ combat.log.push({
379
+ timestamp: Date.now(),
380
+ message: 'Retreated from battle!',
381
+ type: 'system',
382
+ });
383
+ }
384
+ else {
385
+ combat.log.push({
386
+ timestamp: Date.now(),
387
+ message: t('combat.defeat'),
388
+ type: 'system',
389
+ });
390
+ }
391
+ return {
392
+ combat,
393
+ finished: true,
394
+ victory,
395
+ retreated,
396
+ decision: decision || { action: 'attack', reason: 'Combat finished' },
397
+ };
398
+ }
399
+ // ============================================================================
400
+ // Combat Utilities
401
+ // ============================================================================
402
+ /**
403
+ * Calculate combat rewards
404
+ */
405
+ export function calculateIdleCombatRewards(enemies, retreated) {
406
+ if (retreated) {
407
+ return { exp: 0, gold: 0, items: [] };
408
+ }
409
+ let exp = 0;
410
+ let gold = 0;
411
+ const items = [];
412
+ for (const enemy of enemies) {
413
+ exp += enemy.expReward;
414
+ gold += enemy.goldReward;
415
+ for (const drop of enemy.dropTable) {
416
+ if (Math.random() < drop.chance) {
417
+ items.push(drop.itemId);
418
+ }
419
+ }
420
+ }
421
+ return { exp, gold, items };
422
+ }
423
+ /**
424
+ * Get combat progress (0-1)
425
+ */
426
+ export function getIdleCombatProgress(combat) {
427
+ const totalMaxHp = combat.enemies.reduce((sum, e) => sum + e.maxHp, 0);
428
+ const totalCurrentHp = combat.enemies.reduce((sum, e) => sum + Math.max(0, e.hp), 0);
429
+ return 1 - (totalCurrentHp / totalMaxHp);
430
+ }
431
+ /**
432
+ * Format combat log for display
433
+ */
434
+ export function formatIdleCombatLog(combat, maxLines = 10) {
435
+ return combat.log
436
+ .slice(-maxLines)
437
+ .map(entry => {
438
+ const time = new Date(entry.timestamp).toLocaleTimeString();
439
+ return `[${time}] ${entry.message}`;
440
+ });
441
+ }
442
+ /**
443
+ * Run full auto-combat until completion
444
+ * Returns result after all turns are processed
445
+ */
446
+ export function runFullAutoCombat(player, enemies, strategy, maxTurns = 100) {
447
+ const combat = initIdleCombat(player, enemies, { strategy });
448
+ let result = {
449
+ combat,
450
+ finished: false,
451
+ victory: false,
452
+ retreated: false,
453
+ decision: { action: 'attack', reason: 'Starting combat' },
454
+ };
455
+ for (let turn = 0; turn < maxTurns && !result.finished; turn++) {
456
+ result = processIdleCombatTurn(result.combat, player);
457
+ }
458
+ return result;
459
+ }
460
+ //# sourceMappingURL=IdleCombat.js.map
461
+ //# debugId=0e7267ed-2d1b-527e-8f89-b87d0cb40a96