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,450 @@
1
+ /**
2
+ * DialogHandler - Handles NPC dialog interactions
3
+ *
4
+ * Extracted from main.ts to reduce file size.
5
+ * Manages NPC conversations, AI responses, quests from NPCs.
6
+ */
7
+
8
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9702a696-0205-5406-84e6-7bea9b63df9d")}catch(e){}}();
9
+ import { getAIClient } from '../ai/PlayKitClient.js';
10
+ import { Sentry } from '../instrument.js';
11
+ /**
12
+ * Handles NPC dialog interactions
13
+ */
14
+ export class DialogHandler {
15
+ ui;
16
+ npcManager;
17
+ questManager;
18
+ router;
19
+ idleGameManager;
20
+ addLog;
21
+ // Dialog state
22
+ currentDialogNPC = null;
23
+ dialogHistory = [];
24
+ pendingQuest = null;
25
+ awaitingQuestResponse = false;
26
+ // AI error handling
27
+ consecutiveAIFailures = 0;
28
+ MAX_CONSECUTIVE_FAILURES = 3;
29
+ constructor(deps) {
30
+ this.ui = deps.ui;
31
+ this.npcManager = deps.npcManager;
32
+ this.questManager = deps.questManager;
33
+ this.router = deps.router;
34
+ this.idleGameManager = deps.idleGameManager;
35
+ this.addLog = deps.addLog;
36
+ }
37
+ /**
38
+ * Get current dialog NPC
39
+ */
40
+ getCurrentNPC() {
41
+ return this.currentDialogNPC;
42
+ }
43
+ /**
44
+ * Start dialog with an NPC
45
+ */
46
+ async startDialog(npc) {
47
+ this.currentDialogNPC = npc;
48
+ this.dialogHistory = [];
49
+ // Get greeting based on relationship
50
+ const greeting = this.generateGreeting(npc);
51
+ this.dialogHistory.push({ role: 'npc', text: greeting });
52
+ // Mark player as met
53
+ npc.metPlayer = true;
54
+ // Switch to dialog mode via router
55
+ this.router.navigate({ type: 'dialog', npcId: npc.id });
56
+ // Pause dungeon if in dungeon
57
+ this.idleGameManager.pauseDungeon();
58
+ // Set up dialog input handler
59
+ this.ui.onDialogInputHandler((input) => this.handleInput(input));
60
+ // Render initial dialog screen
61
+ this.renderDialog();
62
+ }
63
+ /**
64
+ * Generate NPC greeting based on relationship and history
65
+ */
66
+ generateGreeting(npc) {
67
+ const relationship = npc.playerRelationship;
68
+ const met = npc.dialogHistory.length > 0;
69
+ if (!met) {
70
+ const greetings = {
71
+ merchant: `Welcome, traveler! I am ${npc.name}. Looking to trade?`,
72
+ sage: `Ah, a seeker of knowledge. I am ${npc.name}. What wisdom do you seek?`,
73
+ guard: `Halt. I am ${npc.name}, keeper of this area. State your business.`,
74
+ blacksmith: `*looks up from anvil* ${npc.name} here. Need something forged?`,
75
+ traveler: `Well met, fellow wanderer. I'm ${npc.name}. Strange place, isn't it?`,
76
+ quest_giver: `${npc.name} at your service. I might have work for someone like you.`,
77
+ };
78
+ return greetings[npc.role] || `Greetings. I am ${npc.name}.`;
79
+ }
80
+ else if (relationship > 50) {
81
+ return `${npc.name} smiles warmly. "Good to see you again, friend!"`;
82
+ }
83
+ else if (relationship > 0) {
84
+ return `"Ah, you're back," says ${npc.name}. "What can I do for you?"`;
85
+ }
86
+ else if (relationship < -50) {
87
+ return `${npc.name} glares at you. "What do you want now?"`;
88
+ }
89
+ else if (relationship < 0) {
90
+ return `${npc.name} regards you coldly. "Yes?"`;
91
+ }
92
+ else {
93
+ return `${npc.name} nods in greeting. "How can I help?"`;
94
+ }
95
+ }
96
+ /**
97
+ * Handle dialog input
98
+ */
99
+ async handleInput(input) {
100
+ if (!this.currentDialogNPC)
101
+ return;
102
+ const trimmed = input.trim();
103
+ const lower = trimmed.toLowerCase();
104
+ // Check for exit commands
105
+ if (lower === 'bye' || lower === 'exit' || trimmed === '') {
106
+ this.endDialog();
107
+ return;
108
+ }
109
+ // Check if awaiting quest response
110
+ if (this.awaitingQuestResponse && this.pendingQuest) {
111
+ if (lower === 'yes' || lower === 'y' || lower === 'accept') {
112
+ this.acceptQuest();
113
+ return;
114
+ }
115
+ else if (lower === 'no' || lower === 'n' || lower === 'decline') {
116
+ this.declineQuest();
117
+ return;
118
+ }
119
+ }
120
+ // Check for quick options
121
+ if (trimmed === '1') {
122
+ this.handleQuickOption('quests');
123
+ return;
124
+ }
125
+ else if (trimmed === '2') {
126
+ this.handleQuickOption('trade');
127
+ return;
128
+ }
129
+ else if (trimmed === '3') {
130
+ this.handleQuickOption('lore');
131
+ return;
132
+ }
133
+ // Add player message to history
134
+ this.dialogHistory.push({ role: 'player', text: trimmed });
135
+ this.renderDialog();
136
+ // Get AI response
137
+ const aiClient = getAIClient();
138
+ const npc = this.currentDialogNPC;
139
+ // Build context for AI
140
+ const context = this.buildContext(npc, trimmed);
141
+ // Show thinking indicator
142
+ this.ui.renderDialogScreen(npc, this.dialogHistory, this.getQuickOptions(), true);
143
+ // Get response from AI
144
+ const result = await aiClient.talkToNPC(npc.role, context);
145
+ if (result.success && result.data) {
146
+ this.consecutiveAIFailures = 0;
147
+ this.dialogHistory.push({ role: 'npc', text: result.data });
148
+ this.npcManager.recordInteraction(npc.id, trimmed, result.data);
149
+ this.updateRelationship(npc, trimmed, result.data);
150
+ }
151
+ else {
152
+ this.consecutiveAIFailures++;
153
+ console.error('[Dialog] AI failed:', result.error);
154
+ Sentry.captureMessage('Dialog AI failed, using fallback response', {
155
+ level: 'warning',
156
+ tags: { operation: 'npc_dialog', fallback: true },
157
+ extra: {
158
+ npcId: npc.id,
159
+ npcRole: npc.role,
160
+ consecutiveFailures: this.consecutiveAIFailures,
161
+ error: result.error,
162
+ },
163
+ });
164
+ const fallback = this.getFallbackResponse(this.currentDialogNPC);
165
+ this.dialogHistory.push({ role: 'npc', text: fallback });
166
+ if (result.retriesExhausted && this.consecutiveAIFailures >= this.MAX_CONSECUTIVE_FAILURES) {
167
+ // Let caller handle prompting for save load
168
+ this.addLog('⚠ Multiple AI failures detected. Consider loading a save.');
169
+ }
170
+ }
171
+ this.renderDialog();
172
+ }
173
+ /**
174
+ * Build context for AI dialog
175
+ */
176
+ buildContext(npc, playerMessage) {
177
+ const recentHistory = this.dialogHistory.slice(-6);
178
+ const historyText = recentHistory
179
+ .map(h => `${h.role === 'player' ? 'Player' : npc.name}: ${h.text}`)
180
+ .join('\n');
181
+ return `${historyText}\nPlayer: ${playerMessage}`;
182
+ }
183
+ /**
184
+ * Update relationship based on dialog
185
+ */
186
+ updateRelationship(npc, playerMessage, npcResponse) {
187
+ const lower = playerMessage.toLowerCase();
188
+ if (lower.includes('thank') || lower.includes('please') || lower.includes('help')) {
189
+ this.npcManager.updateRelationship(npc.id, 1);
190
+ }
191
+ if (lower.includes('stupid') || lower.includes('idiot') || lower.includes('hate')) {
192
+ this.npcManager.updateRelationship(npc.id, -5);
193
+ }
194
+ }
195
+ /**
196
+ * Handle quick dialog options
197
+ */
198
+ async handleQuickOption(option) {
199
+ if (!this.currentDialogNPC)
200
+ return;
201
+ const npc = this.currentDialogNPC;
202
+ let playerText = '';
203
+ let npcResponse = '';
204
+ switch (option) {
205
+ case 'quests':
206
+ playerText = 'Do you have any tasks for me?';
207
+ const availableQuest = this.getQuestFromNPC(npc);
208
+ if (availableQuest) {
209
+ npcResponse = `Yes, I have a task. ${availableQuest.description} Will you accept? (Type 'yes' or 'no')`;
210
+ this.pendingQuest = availableQuest;
211
+ this.awaitingQuestResponse = true;
212
+ }
213
+ else {
214
+ npcResponse = "I don't have anything for you right now. Check back later.";
215
+ }
216
+ break;
217
+ case 'trade':
218
+ playerText = 'What do you have for trade?';
219
+ if (npc.role === 'merchant' || npc.role === 'blacksmith') {
220
+ npcResponse = "Take a look at my wares. (Trade system coming soon)";
221
+ }
222
+ else {
223
+ npcResponse = "I'm not a merchant, but perhaps someone else can help you.";
224
+ }
225
+ break;
226
+ case 'lore':
227
+ playerText = 'Tell me about this place.';
228
+ npcResponse = this.getLocationLore();
229
+ break;
230
+ }
231
+ this.dialogHistory.push({ role: 'player', text: playerText });
232
+ this.dialogHistory.push({ role: 'npc', text: npcResponse });
233
+ this.npcManager.recordInteraction(npc.id, playerText, npcResponse);
234
+ this.renderDialog();
235
+ }
236
+ /**
237
+ * Accept a pending quest
238
+ */
239
+ acceptQuest() {
240
+ if (!this.pendingQuest || !this.currentDialogNPC)
241
+ return;
242
+ const npc = this.currentDialogNPC;
243
+ const quest = this.pendingQuest;
244
+ const success = this.questManager.acceptQuest(quest);
245
+ if (success) {
246
+ if (!npc.givenQuests)
247
+ npc.givenQuests = [];
248
+ npc.givenQuests.push(quest.id);
249
+ this.npcManager.updateRelationship(npc.id, 5);
250
+ const responses = [
251
+ `"Excellent! I knew I could count on you," says ${npc.name}.`,
252
+ `${npc.name} nods approvingly. "Good luck out there."`,
253
+ `"May the gods watch over you," ${npc.name} says with a smile.`,
254
+ ];
255
+ const response = responses[Math.floor(Math.random() * responses.length)];
256
+ this.dialogHistory.push({ role: 'player', text: 'I accept.' });
257
+ this.dialogHistory.push({ role: 'npc', text: response });
258
+ this.addLog(`✓ Quest accepted: ${quest.name}`);
259
+ }
260
+ else {
261
+ this.dialogHistory.push({ role: 'npc', text: `"It seems you already have too many tasks. Come back when you're ready."` });
262
+ }
263
+ this.pendingQuest = null;
264
+ this.awaitingQuestResponse = false;
265
+ this.renderDialog();
266
+ }
267
+ /**
268
+ * Decline a pending quest
269
+ */
270
+ declineQuest() {
271
+ if (!this.pendingQuest || !this.currentDialogNPC)
272
+ return;
273
+ const npc = this.currentDialogNPC;
274
+ this.npcManager.updateRelationship(npc.id, -2);
275
+ const responses = [
276
+ `${npc.name} looks disappointed. "I understand. Perhaps another time."`,
277
+ `"Very well," ${npc.name} sighs. "The offer stands if you change your mind."`,
278
+ `${npc.name} shrugs. "Your choice. Others may be willing."`,
279
+ ];
280
+ const response = responses[Math.floor(Math.random() * responses.length)];
281
+ this.dialogHistory.push({ role: 'player', text: 'I must decline.' });
282
+ this.dialogHistory.push({ role: 'npc', text: response });
283
+ this.pendingQuest = null;
284
+ this.awaitingQuestResponse = false;
285
+ this.renderDialog();
286
+ }
287
+ /**
288
+ * Get quest from NPC if available
289
+ */
290
+ getQuestFromNPC(npc) {
291
+ const baseQuest = {
292
+ giverNPCId: npc.id,
293
+ giverNPCName: npc.name,
294
+ giveDialog: `Will you help me with this task?`,
295
+ progressDialog: `How is the task going?`,
296
+ completeDialog: `Excellent work! Here is your reward.`,
297
+ failDialog: `A shame you couldn't complete it.`,
298
+ difficulty: 'medium',
299
+ repeatable: false,
300
+ timesCompleted: 0,
301
+ };
302
+ const questTemplates = {
303
+ guard: () => ({
304
+ ...baseQuest,
305
+ id: `quest_${Date.now()}`,
306
+ name: 'Clear the Threat',
307
+ description: 'Eliminate the monsters lurking in the nearby rooms.',
308
+ type: 'kill',
309
+ status: 'available',
310
+ objectives: [{
311
+ id: 'kill_monsters',
312
+ type: 'kill',
313
+ target: 'enemy_*',
314
+ targetName: 'enemies',
315
+ description: 'Defeat 3 enemies',
316
+ required: 3,
317
+ current: 0,
318
+ isComplete: false,
319
+ }],
320
+ rewards: [
321
+ { type: 'exp', value: 50 },
322
+ { type: 'gold', value: 25 },
323
+ ],
324
+ timeLimit: 30 * 60,
325
+ }),
326
+ sage: () => ({
327
+ ...baseQuest,
328
+ id: `quest_${Date.now()}`,
329
+ name: 'Seek Knowledge',
330
+ description: 'Explore the dungeon and discover hidden secrets.',
331
+ type: 'explore',
332
+ status: 'available',
333
+ objectives: [{
334
+ id: 'explore_rooms',
335
+ type: 'reach',
336
+ target: 'room_*',
337
+ targetName: 'rooms',
338
+ description: 'Explore 5 rooms',
339
+ required: 5,
340
+ current: 0,
341
+ isComplete: false,
342
+ }],
343
+ rewards: [
344
+ { type: 'exp', value: 75 },
345
+ { type: 'gold', value: 10 },
346
+ ],
347
+ }),
348
+ merchant: () => ({
349
+ ...baseQuest,
350
+ id: `quest_${Date.now()}`,
351
+ name: 'Trade Route',
352
+ description: 'Help me retrieve some valuable goods.',
353
+ type: 'collect',
354
+ status: 'available',
355
+ objectives: [{
356
+ id: 'collect_items',
357
+ type: 'collect',
358
+ target: 'treasure_*',
359
+ targetName: 'treasure',
360
+ description: 'Find treasure',
361
+ required: 1,
362
+ current: 0,
363
+ isComplete: false,
364
+ }],
365
+ rewards: [
366
+ { type: 'exp', value: 30 },
367
+ { type: 'gold', value: 50 },
368
+ ],
369
+ }),
370
+ };
371
+ const template = questTemplates[npc.role];
372
+ return template ? template() : null;
373
+ }
374
+ /**
375
+ * Get location lore
376
+ */
377
+ getLocationLore() {
378
+ const loreOptions = [
379
+ "This dungeon has stood for centuries. Many have entered, few have left.",
380
+ "They say a great evil lurks in the depths below. Be careful if you venture there.",
381
+ "The walls whisper secrets to those who listen. Ancient magic permeates this place.",
382
+ "Long ago, this was a temple. Now it's home to creatures of darkness.",
383
+ "I've heard rumors of powerful artifacts hidden in the boss rooms.",
384
+ ];
385
+ return loreOptions[Math.floor(Math.random() * loreOptions.length)];
386
+ }
387
+ /**
388
+ * Get fallback response when AI fails
389
+ */
390
+ getFallbackResponse(npc) {
391
+ const fallbacks = [
392
+ `${npc.name} seems distracted. "Hmm? Sorry, I was thinking about something else."`,
393
+ `"Interesting..." ${npc.name} strokes their chin thoughtfully.`,
394
+ `${npc.name} nods slowly. "I see what you mean."`,
395
+ `"That's... quite something," ${npc.name} responds carefully.`,
396
+ ];
397
+ return fallbacks[Math.floor(Math.random() * fallbacks.length)];
398
+ }
399
+ /**
400
+ * Get quick dialog options
401
+ */
402
+ getQuickOptions() {
403
+ return [
404
+ { key: '1', text: 'Ask about quests', action: 'quests' },
405
+ { key: '2', text: 'Trade', action: 'trade' },
406
+ { key: '3', text: 'Ask about this place', action: 'lore' },
407
+ ];
408
+ }
409
+ /**
410
+ * Render dialog screen
411
+ */
412
+ renderDialog() {
413
+ if (!this.currentDialogNPC)
414
+ return;
415
+ this.ui.renderDialogScreen(this.currentDialogNPC, this.dialogHistory, this.getQuickOptions(), false);
416
+ }
417
+ /**
418
+ * End dialog with NPC
419
+ */
420
+ endDialog() {
421
+ if (this.currentDialogNPC) {
422
+ const farewell = this.generateFarewell(this.currentDialogNPC);
423
+ this.addLog(farewell);
424
+ }
425
+ this.currentDialogNPC = null;
426
+ this.dialogHistory = [];
427
+ this.pendingQuest = null;
428
+ if (!this.router.back()) {
429
+ this.router.navigate({ type: 'explore' });
430
+ }
431
+ this.idleGameManager.resumeDungeon();
432
+ }
433
+ /**
434
+ * Generate farewell message
435
+ */
436
+ generateFarewell(npc) {
437
+ const relationship = npc.playerRelationship;
438
+ if (relationship > 30) {
439
+ return `${npc.name}: "Take care, friend. Come back anytime!"`;
440
+ }
441
+ else if (relationship < -30) {
442
+ return `${npc.name} turns away without a word.`;
443
+ }
444
+ else {
445
+ return `${npc.name}: "Farewell, traveler."`;
446
+ }
447
+ }
448
+ }
449
+ //# sourceMappingURL=DialogHandler.js.map
450
+ //# debugId=9702a696-0205-5406-84e6-7bea9b63df9d
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogHandler.js","sources":["handlers/DialogHandler.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * DialogHandler - Handles NPC dialog interactions\r\n *\r\n * Extracted from main.ts to reduce file size.\r\n * Manages NPC conversations, AI responses, quests from NPCs.\r\n */\r\n\r\nimport { getAIClient } from '../ai/PlayKitClient.js';\r\nimport { Sentry } from '../instrument.js';\r\nimport type { HandlerDeps } from './types.js';\r\nimport type { ExtendedNPC } from '../npc/types.js';\r\nimport type { Quest } from '../quest/types.js';\r\nimport type { GameUI } from '../tui/GameUIAdapter.js';\r\nimport type { NPCManager } from '../npc/NPCManager.js';\r\nimport type { QuestManager } from '../quest/QuestManager.js';\r\nimport type { Router } from '../app/Router.js';\r\nimport type { IdleGameManager } from '../core/IdleGameManager.js';\r\n\r\n/**\r\n * Dialog history entry\r\n */\r\ninterface DialogEntry {\r\n role: 'player' | 'npc';\r\n text: string;\r\n}\r\n\r\n/**\r\n * Handles NPC dialog interactions\r\n */\r\nexport class DialogHandler {\r\n private ui: GameUI;\r\n private npcManager: NPCManager;\r\n private questManager: QuestManager;\r\n private router: Router;\r\n private idleGameManager: IdleGameManager;\r\n private addLog: (message: string) => void;\r\n\r\n // Dialog state\r\n private currentDialogNPC: ExtendedNPC | null = null;\r\n private dialogHistory: DialogEntry[] = [];\r\n private pendingQuest: Quest | null = null;\r\n private awaitingQuestResponse = false;\r\n\r\n // AI error handling\r\n private consecutiveAIFailures = 0;\r\n private readonly MAX_CONSECUTIVE_FAILURES = 3;\r\n\r\n constructor(deps: HandlerDeps) {\r\n this.ui = deps.ui;\r\n this.npcManager = deps.npcManager;\r\n this.questManager = deps.questManager;\r\n this.router = deps.router;\r\n this.idleGameManager = deps.idleGameManager;\r\n this.addLog = deps.addLog;\r\n }\r\n\r\n /**\r\n * Get current dialog NPC\r\n */\r\n getCurrentNPC(): ExtendedNPC | null {\r\n return this.currentDialogNPC;\r\n }\r\n\r\n /**\r\n * Start dialog with an NPC\r\n */\r\n async startDialog(npc: ExtendedNPC): Promise<void> {\r\n this.currentDialogNPC = npc;\r\n this.dialogHistory = [];\r\n\r\n // Get greeting based on relationship\r\n const greeting = this.generateGreeting(npc);\r\n this.dialogHistory.push({ role: 'npc', text: greeting });\r\n\r\n // Mark player as met\r\n npc.metPlayer = true;\r\n\r\n // Switch to dialog mode via router\r\n this.router.navigate({ type: 'dialog', npcId: npc.id });\r\n // Pause dungeon if in dungeon\r\n this.idleGameManager.pauseDungeon();\r\n\r\n // Set up dialog input handler\r\n this.ui.onDialogInputHandler((input) => this.handleInput(input));\r\n\r\n // Render initial dialog screen\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Generate NPC greeting based on relationship and history\r\n */\r\n private generateGreeting(npc: ExtendedNPC): string {\r\n const relationship = npc.playerRelationship;\r\n const met = npc.dialogHistory.length > 0;\r\n\r\n if (!met) {\r\n const greetings: Record<string, string> = {\r\n merchant: `Welcome, traveler! I am ${npc.name}. Looking to trade?`,\r\n sage: `Ah, a seeker of knowledge. I am ${npc.name}. What wisdom do you seek?`,\r\n guard: `Halt. I am ${npc.name}, keeper of this area. State your business.`,\r\n blacksmith: `*looks up from anvil* ${npc.name} here. Need something forged?`,\r\n traveler: `Well met, fellow wanderer. I'm ${npc.name}. Strange place, isn't it?`,\r\n quest_giver: `${npc.name} at your service. I might have work for someone like you.`,\r\n };\r\n return greetings[npc.role] || `Greetings. I am ${npc.name}.`;\r\n } else if (relationship > 50) {\r\n return `${npc.name} smiles warmly. \"Good to see you again, friend!\"`;\r\n } else if (relationship > 0) {\r\n return `\"Ah, you're back,\" says ${npc.name}. \"What can I do for you?\"`;\r\n } else if (relationship < -50) {\r\n return `${npc.name} glares at you. \"What do you want now?\"`;\r\n } else if (relationship < 0) {\r\n return `${npc.name} regards you coldly. \"Yes?\"`;\r\n } else {\r\n return `${npc.name} nods in greeting. \"How can I help?\"`;\r\n }\r\n }\r\n\r\n /**\r\n * Handle dialog input\r\n */\r\n async handleInput(input: string): Promise<void> {\r\n if (!this.currentDialogNPC) return;\r\n\r\n const trimmed = input.trim();\r\n const lower = trimmed.toLowerCase();\r\n\r\n // Check for exit commands\r\n if (lower === 'bye' || lower === 'exit' || trimmed === '') {\r\n this.endDialog();\r\n return;\r\n }\r\n\r\n // Check if awaiting quest response\r\n if (this.awaitingQuestResponse && this.pendingQuest) {\r\n if (lower === 'yes' || lower === 'y' || lower === 'accept') {\r\n this.acceptQuest();\r\n return;\r\n } else if (lower === 'no' || lower === 'n' || lower === 'decline') {\r\n this.declineQuest();\r\n return;\r\n }\r\n }\r\n\r\n // Check for quick options\r\n if (trimmed === '1') {\r\n this.handleQuickOption('quests');\r\n return;\r\n } else if (trimmed === '2') {\r\n this.handleQuickOption('trade');\r\n return;\r\n } else if (trimmed === '3') {\r\n this.handleQuickOption('lore');\r\n return;\r\n }\r\n\r\n // Add player message to history\r\n this.dialogHistory.push({ role: 'player', text: trimmed });\r\n this.renderDialog();\r\n\r\n // Get AI response\r\n const aiClient = getAIClient();\r\n const npc = this.currentDialogNPC;\r\n\r\n // Build context for AI\r\n const context = this.buildContext(npc, trimmed);\r\n\r\n // Show thinking indicator\r\n this.ui.renderDialogScreen(npc, this.dialogHistory, this.getQuickOptions(), true);\r\n\r\n // Get response from AI\r\n const result = await aiClient.talkToNPC(\r\n npc.role as import('../core/types.js').NPCType,\r\n context\r\n );\r\n\r\n if (result.success && result.data) {\r\n this.consecutiveAIFailures = 0;\r\n\r\n this.dialogHistory.push({ role: 'npc', text: result.data });\r\n this.npcManager.recordInteraction(npc.id, trimmed, result.data);\r\n this.updateRelationship(npc, trimmed, result.data);\r\n } else {\r\n this.consecutiveAIFailures++;\r\n\r\n console.error('[Dialog] AI failed:', result.error);\r\n Sentry.captureMessage('Dialog AI failed, using fallback response', {\r\n level: 'warning',\r\n tags: { operation: 'npc_dialog', fallback: true },\r\n extra: {\r\n npcId: npc.id,\r\n npcRole: npc.role,\r\n consecutiveFailures: this.consecutiveAIFailures,\r\n error: result.error,\r\n },\r\n });\r\n\r\n const fallback = this.getFallbackResponse(this.currentDialogNPC);\r\n this.dialogHistory.push({ role: 'npc', text: fallback });\r\n\r\n if (result.retriesExhausted && this.consecutiveAIFailures >= this.MAX_CONSECUTIVE_FAILURES) {\r\n // Let caller handle prompting for save load\r\n this.addLog('⚠ Multiple AI failures detected. Consider loading a save.');\r\n }\r\n }\r\n\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Build context for AI dialog\r\n */\r\n private buildContext(npc: ExtendedNPC, playerMessage: string): string {\r\n const recentHistory = this.dialogHistory.slice(-6);\r\n const historyText = recentHistory\r\n .map(h => `${h.role === 'player' ? 'Player' : npc.name}: ${h.text}`)\r\n .join('\\n');\r\n\r\n return `${historyText}\\nPlayer: ${playerMessage}`;\r\n }\r\n\r\n /**\r\n * Update relationship based on dialog\r\n */\r\n private updateRelationship(npc: ExtendedNPC, playerMessage: string, npcResponse: string): void {\r\n const lower = playerMessage.toLowerCase();\r\n\r\n if (lower.includes('thank') || lower.includes('please') || lower.includes('help')) {\r\n this.npcManager.updateRelationship(npc.id, 1);\r\n }\r\n\r\n if (lower.includes('stupid') || lower.includes('idiot') || lower.includes('hate')) {\r\n this.npcManager.updateRelationship(npc.id, -5);\r\n }\r\n }\r\n\r\n /**\r\n * Handle quick dialog options\r\n */\r\n async handleQuickOption(option: string): Promise<void> {\r\n if (!this.currentDialogNPC) return;\r\n\r\n const npc = this.currentDialogNPC;\r\n let playerText = '';\r\n let npcResponse = '';\r\n\r\n switch (option) {\r\n case 'quests':\r\n playerText = 'Do you have any tasks for me?';\r\n const availableQuest = this.getQuestFromNPC(npc);\r\n if (availableQuest) {\r\n npcResponse = `Yes, I have a task. ${availableQuest.description} Will you accept? (Type 'yes' or 'no')`;\r\n this.pendingQuest = availableQuest;\r\n this.awaitingQuestResponse = true;\r\n } else {\r\n npcResponse = \"I don't have anything for you right now. Check back later.\";\r\n }\r\n break;\r\n\r\n case 'trade':\r\n playerText = 'What do you have for trade?';\r\n if (npc.role === 'merchant' || npc.role === 'blacksmith') {\r\n npcResponse = \"Take a look at my wares. (Trade system coming soon)\";\r\n } else {\r\n npcResponse = \"I'm not a merchant, but perhaps someone else can help you.\";\r\n }\r\n break;\r\n\r\n case 'lore':\r\n playerText = 'Tell me about this place.';\r\n npcResponse = this.getLocationLore();\r\n break;\r\n }\r\n\r\n this.dialogHistory.push({ role: 'player', text: playerText });\r\n this.dialogHistory.push({ role: 'npc', text: npcResponse });\r\n this.npcManager.recordInteraction(npc.id, playerText, npcResponse);\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Accept a pending quest\r\n */\r\n private acceptQuest(): void {\r\n if (!this.pendingQuest || !this.currentDialogNPC) return;\r\n\r\n const npc = this.currentDialogNPC;\r\n const quest = this.pendingQuest;\r\n\r\n const success = this.questManager.acceptQuest(quest);\r\n\r\n if (success) {\r\n if (!npc.givenQuests) npc.givenQuests = [];\r\n npc.givenQuests.push(quest.id);\r\n this.npcManager.updateRelationship(npc.id, 5);\r\n\r\n const responses = [\r\n `\"Excellent! I knew I could count on you,\" says ${npc.name}.`,\r\n `${npc.name} nods approvingly. \"Good luck out there.\"`,\r\n `\"May the gods watch over you,\" ${npc.name} says with a smile.`,\r\n ];\r\n const response = responses[Math.floor(Math.random() * responses.length)];\r\n\r\n this.dialogHistory.push({ role: 'player', text: 'I accept.' });\r\n this.dialogHistory.push({ role: 'npc', text: response });\r\n\r\n this.addLog(`✓ Quest accepted: ${quest.name}`);\r\n } else {\r\n this.dialogHistory.push({ role: 'npc', text: `\"It seems you already have too many tasks. Come back when you're ready.\"` });\r\n }\r\n\r\n this.pendingQuest = null;\r\n this.awaitingQuestResponse = false;\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Decline a pending quest\r\n */\r\n private declineQuest(): void {\r\n if (!this.pendingQuest || !this.currentDialogNPC) return;\r\n\r\n const npc = this.currentDialogNPC;\r\n this.npcManager.updateRelationship(npc.id, -2);\r\n\r\n const responses = [\r\n `${npc.name} looks disappointed. \"I understand. Perhaps another time.\"`,\r\n `\"Very well,\" ${npc.name} sighs. \"The offer stands if you change your mind.\"`,\r\n `${npc.name} shrugs. \"Your choice. Others may be willing.\"`,\r\n ];\r\n const response = responses[Math.floor(Math.random() * responses.length)];\r\n\r\n this.dialogHistory.push({ role: 'player', text: 'I must decline.' });\r\n this.dialogHistory.push({ role: 'npc', text: response });\r\n\r\n this.pendingQuest = null;\r\n this.awaitingQuestResponse = false;\r\n this.renderDialog();\r\n }\r\n\r\n /**\r\n * Get quest from NPC if available\r\n */\r\n private getQuestFromNPC(npc: ExtendedNPC): Quest | null {\r\n const baseQuest = {\r\n giverNPCId: npc.id,\r\n giverNPCName: npc.name,\r\n giveDialog: `Will you help me with this task?`,\r\n progressDialog: `How is the task going?`,\r\n completeDialog: `Excellent work! Here is your reward.`,\r\n failDialog: `A shame you couldn't complete it.`,\r\n difficulty: 'medium' as const,\r\n repeatable: false,\r\n timesCompleted: 0,\r\n };\r\n\r\n const questTemplates: Record<string, () => Quest> = {\r\n guard: () => ({\r\n ...baseQuest,\r\n id: `quest_${Date.now()}`,\r\n name: 'Clear the Threat',\r\n description: 'Eliminate the monsters lurking in the nearby rooms.',\r\n type: 'kill',\r\n status: 'available',\r\n objectives: [{\r\n id: 'kill_monsters',\r\n type: 'kill',\r\n target: 'enemy_*',\r\n targetName: 'enemies',\r\n description: 'Defeat 3 enemies',\r\n required: 3,\r\n current: 0,\r\n isComplete: false,\r\n }],\r\n rewards: [\r\n { type: 'exp', value: 50 },\r\n { type: 'gold', value: 25 },\r\n ],\r\n timeLimit: 30 * 60,\r\n }),\r\n sage: () => ({\r\n ...baseQuest,\r\n id: `quest_${Date.now()}`,\r\n name: 'Seek Knowledge',\r\n description: 'Explore the dungeon and discover hidden secrets.',\r\n type: 'explore',\r\n status: 'available',\r\n objectives: [{\r\n id: 'explore_rooms',\r\n type: 'reach',\r\n target: 'room_*',\r\n targetName: 'rooms',\r\n description: 'Explore 5 rooms',\r\n required: 5,\r\n current: 0,\r\n isComplete: false,\r\n }],\r\n rewards: [\r\n { type: 'exp', value: 75 },\r\n { type: 'gold', value: 10 },\r\n ],\r\n }),\r\n merchant: () => ({\r\n ...baseQuest,\r\n id: `quest_${Date.now()}`,\r\n name: 'Trade Route',\r\n description: 'Help me retrieve some valuable goods.',\r\n type: 'collect',\r\n status: 'available',\r\n objectives: [{\r\n id: 'collect_items',\r\n type: 'collect',\r\n target: 'treasure_*',\r\n targetName: 'treasure',\r\n description: 'Find treasure',\r\n required: 1,\r\n current: 0,\r\n isComplete: false,\r\n }],\r\n rewards: [\r\n { type: 'exp', value: 30 },\r\n { type: 'gold', value: 50 },\r\n ],\r\n }),\r\n };\r\n\r\n const template = questTemplates[npc.role];\r\n return template ? template() : null;\r\n }\r\n\r\n /**\r\n * Get location lore\r\n */\r\n private getLocationLore(): string {\r\n const loreOptions = [\r\n \"This dungeon has stood for centuries. Many have entered, few have left.\",\r\n \"They say a great evil lurks in the depths below. Be careful if you venture there.\",\r\n \"The walls whisper secrets to those who listen. Ancient magic permeates this place.\",\r\n \"Long ago, this was a temple. Now it's home to creatures of darkness.\",\r\n \"I've heard rumors of powerful artifacts hidden in the boss rooms.\",\r\n ];\r\n return loreOptions[Math.floor(Math.random() * loreOptions.length)];\r\n }\r\n\r\n /**\r\n * Get fallback response when AI fails\r\n */\r\n private getFallbackResponse(npc: ExtendedNPC): string {\r\n const fallbacks = [\r\n `${npc.name} seems distracted. \"Hmm? Sorry, I was thinking about something else.\"`,\r\n `\"Interesting...\" ${npc.name} strokes their chin thoughtfully.`,\r\n `${npc.name} nods slowly. \"I see what you mean.\"`,\r\n `\"That's... quite something,\" ${npc.name} responds carefully.`,\r\n ];\r\n return fallbacks[Math.floor(Math.random() * fallbacks.length)];\r\n }\r\n\r\n /**\r\n * Get quick dialog options\r\n */\r\n getQuickOptions(): Array<{ key: string; text: string; action: string }> {\r\n return [\r\n { key: '1', text: 'Ask about quests', action: 'quests' },\r\n { key: '2', text: 'Trade', action: 'trade' },\r\n { key: '3', text: 'Ask about this place', action: 'lore' },\r\n ];\r\n }\r\n\r\n /**\r\n * Render dialog screen\r\n */\r\n renderDialog(): void {\r\n if (!this.currentDialogNPC) return;\r\n this.ui.renderDialogScreen(\r\n this.currentDialogNPC,\r\n this.dialogHistory,\r\n this.getQuickOptions(),\r\n false\r\n );\r\n }\r\n\r\n /**\r\n * End dialog with NPC\r\n */\r\n endDialog(): void {\r\n if (this.currentDialogNPC) {\r\n const farewell = this.generateFarewell(this.currentDialogNPC);\r\n this.addLog(farewell);\r\n }\r\n\r\n this.currentDialogNPC = null;\r\n this.dialogHistory = [];\r\n this.pendingQuest = null;\r\n\r\n if (!this.router.back()) {\r\n this.router.navigate({ type: 'explore' });\r\n }\r\n this.idleGameManager.resumeDungeon();\r\n }\r\n\r\n /**\r\n * Generate farewell message\r\n */\r\n private generateFarewell(npc: ExtendedNPC): string {\r\n const relationship = npc.playerRelationship;\r\n if (relationship > 30) {\r\n return `${npc.name}: \"Take care, friend. Come back anytime!\"`;\r\n } else if (relationship < -30) {\r\n return `${npc.name} turns away without a word.`;\r\n } else {\r\n return `${npc.name}: \"Farewell, traveler.\"`;\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"9702a696-0205-5406-84e6-7bea9b63df9d"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * SaveLoadHandler - Handles save/load functionality
3
+ *
4
+ * Extracted from main.ts to reduce file size.
5
+ * Manages game saving, loading, and slot management.
6
+ */
7
+ import type { IdleGameManager } from '../core/IdleGameManager.js';
8
+ import type { NPCManager } from '../npc/NPCManager.js';
9
+ import type { QuestManager } from '../quest/QuestManager.js';
10
+ /**
11
+ * Handles save/load functionality
12
+ */
13
+ export declare class SaveLoadHandler {
14
+ private idleGameManager;
15
+ private npcManager;
16
+ private questManager;
17
+ private addLog;
18
+ private pendingSaveData;
19
+ private _saveMode;
20
+ private _loadMode;
21
+ constructor(idleGameManager: IdleGameManager, npcManager: NPCManager, questManager: QuestManager, addLog: (message: string) => void);
22
+ /**
23
+ * Check if in save mode
24
+ */
25
+ get saveMode(): boolean;
26
+ /**
27
+ * Check if in load mode
28
+ */
29
+ get loadMode(): boolean;
30
+ /**
31
+ * Cancel save mode
32
+ */
33
+ cancelSave(): void;
34
+ /**
35
+ * Cancel load mode
36
+ */
37
+ cancelLoad(): void;
38
+ /**
39
+ * Handle save command - shows save slots
40
+ */
41
+ handleSaveCommand(): Promise<void>;
42
+ /**
43
+ * Complete save to slot
44
+ */
45
+ completeSave(slot: number): Promise<void>;
46
+ /**
47
+ * Handle load command - shows available saves
48
+ */
49
+ handleLoadCommand(): Promise<void>;
50
+ /**
51
+ * Complete load from slot
52
+ */
53
+ completeLoad(slot: number): Promise<void>;
54
+ /**
55
+ * Handle numeric input when in save/load mode
56
+ * @returns true if handled, false otherwise
57
+ */
58
+ handleNumericInput(num: number): boolean;
59
+ }
60
+ //# sourceMappingURL=SaveLoadHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SaveLoadHandler.d.ts","sourceRoot":"/","sources":["handlers/SaveLoadHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAc7D;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAA4B;IAG1C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAGxB,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAQnC;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgDxC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBxC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C;;;OAGG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAqBzC"}