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":"DungeonGenerator.js","sources":["map/DungeonGenerator.ts"],"sourceRoot":"/","sourcesContent":["/**\r\n * Dungeon Generator - Creates multi-level dungeons for IdleRPG\r\n * Builds on BSP algorithm for room generation\r\n */\r\n\r\nimport type {\r\n Dungeon,\r\n DungeonLevel,\r\n DungeonRoom,\r\n DungeonRoomType,\r\n DungeonRoomContent,\r\n RoomConnection,\r\n Enemy,\r\n InventoryItem,\r\n TreasureChest,\r\n TrapData,\r\n Rarity,\r\n DungeonDifficulty,\r\n} from '../core/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\ninterface DungeonGeneratorConfig {\r\n dungeonId: string;\r\n name: string;\r\n description: string;\r\n continentId: string;\r\n nearestTownId: string;\r\n difficulty: DungeonDifficulty;\r\n recommendedLevel: number;\r\n numberOfLevels: number;\r\n roomsPerLevel: { min: number; max: number };\r\n hasBoss: boolean;\r\n bossName?: string;\r\n seed?: number;\r\n}\r\n\r\ninterface RoomTypeWeight {\r\n type: DungeonRoomType;\r\n weight: number;\r\n}\r\n\r\n// ============================================================================\r\n// Seeded Random\r\n// ============================================================================\r\n\r\nclass SeededRandom {\r\n private seed: number;\r\n\r\n constructor(seed: number) {\r\n this.seed = seed;\r\n }\r\n\r\n next(): number {\r\n this.seed = (this.seed * 1103515245 + 12345) & 0x7fffffff;\r\n return this.seed / 0x7fffffff;\r\n }\r\n\r\n nextInt(min: number, max: number): number {\r\n return Math.floor(this.next() * (max - min + 1)) + min;\r\n }\r\n\r\n pick<T>(array: T[]): T {\r\n return array[Math.floor(this.next() * array.length)];\r\n }\r\n\r\n shuffle<T>(array: T[]): T[] {\r\n const result = [...array];\r\n for (let i = result.length - 1; i > 0; i--) {\r\n const j = Math.floor(this.next() * (i + 1));\r\n [result[i], result[j]] = [result[j], result[i]];\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Room Type Weights by Difficulty\r\n// ============================================================================\r\n\r\nconst ROOM_TYPE_WEIGHTS: Record<DungeonDifficulty, RoomTypeWeight[]> = {\r\n easy: [\r\n { type: 'combat', weight: 35 },\r\n { type: 'treasure', weight: 15 },\r\n { type: 'fountain', weight: 10 },\r\n { type: 'altar', weight: 5 },\r\n { type: 'event', weight: 10 },\r\n { type: 'safe_room', weight: 10 },\r\n { type: 'empty', weight: 10 },\r\n { type: 'dead_end', weight: 5 },\r\n ],\r\n normal: [\r\n { type: 'combat', weight: 35 },\r\n { type: 'elite', weight: 10 },\r\n { type: 'treasure', weight: 12 },\r\n { type: 'fountain', weight: 8 },\r\n { type: 'altar', weight: 5 },\r\n { type: 'event', weight: 10 },\r\n { type: 'trap', weight: 5 },\r\n { type: 'safe_room', weight: 8 },\r\n { type: 'dead_end', weight: 7 },\r\n ],\r\n hard: [\r\n { type: 'combat', weight: 30 },\r\n { type: 'elite', weight: 18 },\r\n { type: 'ambush', weight: 7 },\r\n { type: 'treasure', weight: 10 },\r\n { type: 'fountain', weight: 5 },\r\n { type: 'altar', weight: 5 },\r\n { type: 'event', weight: 8 },\r\n { type: 'trap', weight: 10 },\r\n { type: 'puzzle', weight: 5 },\r\n { type: 'dead_end', weight: 7 },\r\n ],\r\n nightmare: [\r\n { type: 'combat', weight: 25 },\r\n { type: 'elite', weight: 22 },\r\n { type: 'ambush', weight: 10 },\r\n { type: 'treasure', weight: 8 },\r\n { type: 'fountain', weight: 3 },\r\n { type: 'trap', weight: 15 },\r\n { type: 'puzzle', weight: 7 },\r\n { type: 'event', weight: 5 },\r\n { type: 'dead_end', weight: 5 },\r\n ],\r\n legendary: [\r\n { type: 'elite', weight: 30 },\r\n { type: 'combat', weight: 20 },\r\n { type: 'ambush', weight: 12 },\r\n { type: 'trap', weight: 15 },\r\n { type: 'puzzle', weight: 10 },\r\n { type: 'treasure', weight: 8 },\r\n { type: 'dead_end', weight: 5 },\r\n ],\r\n};\r\n\r\n// ============================================================================\r\n// Time Constants (in real seconds)\r\n// Import from centralized time constants\r\n// ============================================================================\r\n\r\nimport { ROOM_TIMES, TRAVEL_TIME } from '../core/timeConstants.js';\r\n\r\nconst ROOM_TRAVERSE_TIMES: Record<DungeonRoomType, number> = {\r\n // Special navigation rooms\r\n entrance: ROOM_TIMES.entrance,\r\n exit: ROOM_TIMES.exit,\r\n dead_end: ROOM_TIMES.dead_end,\r\n safe_room: ROOM_TIMES.safe_room,\r\n\r\n // Combat rooms\r\n combat: ROOM_TIMES.combat,\r\n elite: ROOM_TIMES.elite,\r\n boss: ROOM_TIMES.boss,\r\n ambush: ROOM_TIMES.ambush,\r\n\r\n // Reward rooms\r\n treasure: ROOM_TIMES.treasure,\r\n fountain: ROOM_TIMES.fountain,\r\n altar: ROOM_TIMES.altar,\r\n shop: ROOM_TIMES.shop,\r\n\r\n // Event rooms\r\n event: ROOM_TIMES.event,\r\n encounter: ROOM_TIMES.encounter,\r\n trap: ROOM_TIMES.trap,\r\n puzzle: ROOM_TIMES.puzzle,\r\n\r\n // Generic rooms\r\n rest: ROOM_TIMES.rest,\r\n empty: ROOM_TIMES.empty,\r\n};\r\n\r\n// ============================================================================\r\n// Generator Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Generate a complete dungeon with multiple levels\r\n */\r\nexport function generateDungeon(config: DungeonGeneratorConfig): Dungeon {\r\n const rng = new SeededRandom(config.seed ?? Date.now());\r\n const levels: DungeonLevel[] = [];\r\n\r\n // Generate each level\r\n for (let levelNum = 1; levelNum <= config.numberOfLevels; levelNum++) {\r\n const isLastLevel = levelNum === config.numberOfLevels;\r\n const level = generateDungeonLevel(\r\n levelNum,\r\n config,\r\n rng,\r\n isLastLevel && config.hasBoss\r\n );\r\n levels.push(level);\r\n }\r\n\r\n // Calculate estimated clear time\r\n const estimatedTime = levels.reduce((total, level) => {\r\n return total + level.rooms.reduce((levelTotal, room) => {\r\n return levelTotal + room.timeToTraverse;\r\n }, 0);\r\n }, 0);\r\n\r\n return {\r\n id: config.dungeonId,\r\n name: config.name,\r\n description: config.description,\r\n continentId: config.continentId,\r\n nearestTownId: config.nearestTownId,\r\n difficulty: config.difficulty,\r\n recommendedLevel: config.recommendedLevel,\r\n levels,\r\n hasBoss: config.hasBoss,\r\n bossName: config.bossName,\r\n estimatedTime,\r\n rewards: generateDungeonRewards(config.difficulty, config.recommendedLevel, rng),\r\n travelTimeFromTown: 120, // 2 minutes to reach dungeon\r\n };\r\n}\r\n\r\n/**\r\n * Generate a single dungeon level\r\n */\r\nfunction generateDungeonLevel(\r\n levelNumber: number,\r\n config: DungeonGeneratorConfig,\r\n rng: SeededRandom,\r\n hasBoss: boolean\r\n): DungeonLevel {\r\n const roomCount = rng.nextInt(config.roomsPerLevel.min, config.roomsPerLevel.max);\r\n const rooms: DungeonRoom[] = [];\r\n\r\n // Generate entrance room\r\n const entranceRoom = createRoom(\r\n `${config.dungeonId}_L${levelNumber}_entrance`,\r\n 'entrance',\r\n levelNumber,\r\n config,\r\n rng,\r\n { x: 0, y: 0 }\r\n );\r\n rooms.push(entranceRoom);\r\n\r\n // Generate middle rooms\r\n const middleRoomCount = roomCount - 2 - (hasBoss ? 1 : 0);\r\n const roomTypes = selectRoomTypes(middleRoomCount, config.difficulty, rng);\r\n\r\n let x = 1;\r\n let y = 0;\r\n for (let i = 0; i < middleRoomCount; i++) {\r\n const roomId = `${config.dungeonId}_L${levelNumber}_R${i}`;\r\n const room = createRoom(\r\n roomId,\r\n roomTypes[i],\r\n levelNumber,\r\n config,\r\n rng,\r\n { x, y }\r\n );\r\n rooms.push(room);\r\n\r\n // Simple branching layout\r\n if (rng.next() < 0.3 && i < middleRoomCount - 1) {\r\n y += rng.next() < 0.5 ? 1 : -1;\r\n } else {\r\n x++;\r\n }\r\n }\r\n\r\n // Generate boss room if needed\r\n let bossRoomId: string | undefined;\r\n if (hasBoss) {\r\n bossRoomId = `${config.dungeonId}_L${levelNumber}_boss`;\r\n const bossRoom = createRoom(\r\n bossRoomId,\r\n 'boss',\r\n levelNumber,\r\n config,\r\n rng,\r\n { x: x + 1, y: 0 }\r\n );\r\n bossRoom.content.enemies = generateBossEnemy(config, rng);\r\n rooms.push(bossRoom);\r\n x++;\r\n }\r\n\r\n // Generate exit room\r\n const exitRoom = createRoom(\r\n `${config.dungeonId}_L${levelNumber}_exit`,\r\n 'exit',\r\n levelNumber,\r\n config,\r\n rng,\r\n { x: x + 1, y: 0 }\r\n );\r\n rooms.push(exitRoom);\r\n\r\n // Connect rooms\r\n connectRooms(rooms, rng);\r\n\r\n return {\r\n levelNumber,\r\n name: `${config.name} - Level ${levelNumber}`,\r\n rooms,\r\n entranceRoomId: entranceRoom.id,\r\n exitRoomId: exitRoom.id,\r\n bossRoomId,\r\n minEnemyLevel: config.recommendedLevel + levelNumber - 1,\r\n maxEnemyLevel: config.recommendedLevel + levelNumber + 1,\r\n };\r\n}\r\n\r\n/**\r\n * Select room types based on difficulty\r\n */\r\nfunction selectRoomTypes(\r\n count: number,\r\n difficulty: DungeonDifficulty,\r\n rng: SeededRandom\r\n): DungeonRoomType[] {\r\n const weights = ROOM_TYPE_WEIGHTS[difficulty];\r\n const totalWeight = weights.reduce((sum, w) => sum + w.weight, 0);\r\n const types: DungeonRoomType[] = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n let roll = rng.next() * totalWeight;\r\n for (const { type, weight } of weights) {\r\n roll -= weight;\r\n if (roll <= 0) {\r\n types.push(type);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return rng.shuffle(types);\r\n}\r\n\r\n/**\r\n * Create a dungeon room\r\n */\r\nfunction createRoom(\r\n id: string,\r\n type: DungeonRoomType,\r\n levelNumber: number,\r\n config: DungeonGeneratorConfig,\r\n rng: SeededRandom,\r\n position: { x: number; y: number }\r\n): DungeonRoom {\r\n const content = generateRoomContent(type, levelNumber, config, rng);\r\n\r\n return {\r\n id,\r\n type,\r\n name: generateRoomName(type, rng),\r\n description: generateRoomDescription(type, rng),\r\n connections: [],\r\n content,\r\n timeToTraverse: ROOM_TRAVERSE_TIMES[type],\r\n isExplored: false,\r\n isCleared: type === 'entrance' || type === 'exit' || type === 'empty',\r\n position,\r\n };\r\n}\r\n\r\n/**\r\n * Generate room content based on type\r\n */\r\nfunction generateRoomContent(\r\n type: DungeonRoomType,\r\n levelNumber: number,\r\n config: DungeonGeneratorConfig,\r\n rng: SeededRandom\r\n): DungeonRoomContent {\r\n const content: DungeonRoomContent = {};\r\n\r\n switch (type) {\r\n // Combat rooms\r\n case 'combat':\r\n content.enemies = generateEnemies(config.recommendedLevel + levelNumber - 1, 1, 3, rng);\r\n break;\r\n case 'elite':\r\n content.enemies = generateEliteEnemies(config.recommendedLevel + levelNumber, rng);\r\n break;\r\n case 'ambush':\r\n // Ambush: enemies attack first, player cannot use items initially\r\n content.enemies = generateEnemies(config.recommendedLevel + levelNumber - 1, 2, 4, rng);\r\n break;\r\n\r\n // Reward rooms\r\n case 'treasure':\r\n content.treasureChest = generateTreasureChest(config.difficulty, rng);\r\n break;\r\n case 'fountain':\r\n // Fountain: heals HP/MP (handled by game logic, no content needed)\r\n break;\r\n case 'altar':\r\n // Altar: provides temporary buff (handled by game logic, no content needed)\r\n break;\r\n\r\n // Event rooms\r\n case 'trap':\r\n content.trap = generateTrap(config.difficulty, rng);\r\n break;\r\n case 'event':\r\n content.items = rng.next() < 0.5 ? generateRandomItems(1, rng) : undefined;\r\n break;\r\n\r\n // Special rooms\r\n case 'dead_end':\r\n // Dead ends may have hidden treasure\r\n if (rng.next() < 0.3) {\r\n content.treasureChest = generateTreasureChest(config.difficulty, rng);\r\n content.treasureChest.isLocked = false; // Hidden treasure is unlocked\r\n }\r\n break;\r\n case 'safe_room':\r\n // Safe rooms may have a merchant\r\n if (rng.next() < 0.2) {\r\n content.items = generateRandomItems(2, rng);\r\n }\r\n break;\r\n }\r\n\r\n return content;\r\n}\r\n\r\n/**\r\n * Generate regular enemies\r\n */\r\nfunction generateEnemies(\r\n baseLevel: number,\r\n minCount: number,\r\n maxCount: number,\r\n rng: SeededRandom\r\n): Enemy[] {\r\n const count = rng.nextInt(minCount, maxCount);\r\n const enemies: Enemy[] = [];\r\n\r\n const enemyTypes = [\r\n { name: 'Goblin', hpMult: 1, atkMult: 1, defMult: 0.8 },\r\n { name: 'Skeleton', hpMult: 0.8, atkMult: 1.1, defMult: 0.9 },\r\n { name: 'Slime', hpMult: 1.2, atkMult: 0.8, defMult: 0.5 },\r\n { name: 'Orc', hpMult: 1.5, atkMult: 1.2, defMult: 1 },\r\n { name: 'Bat Swarm', hpMult: 0.6, atkMult: 0.7, defMult: 0.3 },\r\n { name: 'Spider', hpMult: 0.9, atkMult: 1, defMult: 0.6 },\r\n ];\r\n\r\n for (let i = 0; i < count; i++) {\r\n const type = rng.pick(enemyTypes);\r\n const level = baseLevel + rng.nextInt(-1, 1);\r\n\r\n enemies.push({\r\n id: `enemy_${Date.now()}_${i}_${rng.nextInt(1000, 9999)}`,\r\n name: type.name,\r\n level,\r\n hp: Math.floor(20 * level * type.hpMult),\r\n maxHp: Math.floor(20 * level * type.hpMult),\r\n attack: Math.floor(5 * level * type.atkMult),\r\n defense: Math.floor(3 * level * type.defMult),\r\n speed: 5 + level,\r\n expReward: 10 * level,\r\n goldReward: rng.nextInt(5, 20) * level,\r\n dropTable: [\r\n { itemId: 'health_potion', chance: 0.2, quantity: { min: 1, max: 1 } },\r\n ],\r\n isBoss: false,\r\n });\r\n }\r\n\r\n return enemies;\r\n}\r\n\r\n/**\r\n * Generate elite enemies\r\n */\r\nfunction generateEliteEnemies(baseLevel: number, rng: SeededRandom): Enemy[] {\r\n const eliteTypes = [\r\n { name: 'Orc Warlord', hpMult: 2.5, atkMult: 1.5, defMult: 1.3 },\r\n { name: 'Dark Mage', hpMult: 1.5, atkMult: 2, defMult: 0.8 },\r\n { name: 'Stone Golem', hpMult: 3, atkMult: 1, defMult: 2 },\r\n { name: 'Shadow Assassin', hpMult: 1.2, atkMult: 2.5, defMult: 0.5 },\r\n ];\r\n\r\n const type = rng.pick(eliteTypes);\r\n const level = baseLevel + 2;\r\n\r\n return [{\r\n id: `elite_${Date.now()}_${rng.nextInt(1000, 9999)}`,\r\n name: type.name,\r\n level,\r\n hp: Math.floor(30 * level * type.hpMult),\r\n maxHp: Math.floor(30 * level * type.hpMult),\r\n attack: Math.floor(7 * level * type.atkMult),\r\n defense: Math.floor(4 * level * type.defMult),\r\n speed: 8 + level,\r\n expReward: 30 * level,\r\n goldReward: rng.nextInt(20, 50) * level,\r\n dropTable: [\r\n { itemId: 'health_potion', chance: 0.5, quantity: { min: 1, max: 2 } },\r\n { itemId: 'affix_fragment', chance: 0.3, quantity: { min: 1, max: 1 } },\r\n ],\r\n isBoss: false,\r\n }];\r\n}\r\n\r\n/**\r\n * Generate boss enemy\r\n */\r\nfunction generateBossEnemy(config: DungeonGeneratorConfig, rng: SeededRandom): Enemy[] {\r\n const bossTypes = [\r\n { name: 'Goblin King', hpMult: 4, atkMult: 1.8, defMult: 1.5 },\r\n { name: 'Ancient Lich', hpMult: 3.5, atkMult: 2.5, defMult: 1 },\r\n { name: 'Dragon Whelp', hpMult: 5, atkMult: 2, defMult: 2 },\r\n { name: 'Demon Lord', hpMult: 4.5, atkMult: 2.2, defMult: 1.8 },\r\n ];\r\n\r\n const type = config.bossName\r\n ? { name: config.bossName, hpMult: 4, atkMult: 2, defMult: 1.5 }\r\n : rng.pick(bossTypes);\r\n\r\n const level = config.recommendedLevel + config.numberOfLevels + 2;\r\n\r\n return [{\r\n id: `boss_${config.dungeonId}_${Date.now()}`,\r\n name: type.name,\r\n level,\r\n hp: Math.floor(50 * level * type.hpMult),\r\n maxHp: Math.floor(50 * level * type.hpMult),\r\n attack: Math.floor(10 * level * type.atkMult),\r\n defense: Math.floor(5 * level * type.defMult),\r\n speed: 10 + level,\r\n expReward: 100 * level,\r\n goldReward: rng.nextInt(100, 300) * level,\r\n dropTable: [\r\n { itemId: 'health_potion', chance: 1, quantity: { min: 2, max: 3 } },\r\n { itemId: 'affix_fragment', chance: 0.8, quantity: { min: 1, max: 2 } },\r\n { itemId: 'rare_material', chance: 0.5, quantity: { min: 1, max: 1 } },\r\n ],\r\n isBoss: true,\r\n }];\r\n}\r\n\r\n/**\r\n * Generate treasure chest\r\n */\r\nfunction generateTreasureChest(difficulty: DungeonDifficulty, rng: SeededRandom): TreasureChest {\r\n const rarityByDifficulty: Record<DungeonDifficulty, Rarity[]> = {\r\n easy: ['common', 'common', 'uncommon'],\r\n normal: ['common', 'uncommon', 'uncommon', 'rare'],\r\n hard: ['uncommon', 'rare', 'rare', 'epic'],\r\n nightmare: ['rare', 'epic', 'epic', 'legendary'],\r\n legendary: ['epic', 'legendary', 'legendary'],\r\n };\r\n\r\n const rarity = rng.pick(rarityByDifficulty[difficulty]);\r\n const goldMultiplier = { common: 1, uncommon: 2, rare: 4, epic: 8, legendary: 20 };\r\n\r\n return {\r\n id: `chest_${Date.now()}_${rng.nextInt(1000, 9999)}`,\r\n rarity,\r\n isOpened: false,\r\n isLocked: rng.next() < 0.3,\r\n contents: generateRandomItems(rng.nextInt(1, 3), rng),\r\n goldAmount: rng.nextInt(10, 50) * goldMultiplier[rarity],\r\n };\r\n}\r\n\r\n/**\r\n * Generate trap\r\n */\r\nfunction generateTrap(difficulty: DungeonDifficulty, rng: SeededRandom): TrapData {\r\n const traps = [\r\n { name: 'Spike Trap', damage: 20, effect: 'bleeding' },\r\n { name: 'Poison Dart', damage: 10, effect: 'poisoned' },\r\n { name: 'Fire Geyser', damage: 30, effect: 'burning' },\r\n { name: 'Ice Blast', damage: 15, effect: 'frozen' },\r\n { name: 'Pitfall', damage: 25 },\r\n ];\r\n\r\n const trap = rng.pick(traps);\r\n const difficultyMod = { easy: 0.5, normal: 1, hard: 1.5, nightmare: 2, legendary: 3 };\r\n\r\n return {\r\n id: `trap_${Date.now()}_${rng.nextInt(1000, 9999)}`,\r\n name: trap.name,\r\n damage: Math.floor(trap.damage * difficultyMod[difficulty]),\r\n effect: trap.effect,\r\n disarmDifficulty: rng.nextInt(3, 8),\r\n isTriggered: false,\r\n isDisarmed: false,\r\n };\r\n}\r\n\r\n/**\r\n * Generate random items\r\n */\r\nfunction generateRandomItems(count: number, rng: SeededRandom): InventoryItem[] {\r\n const items: InventoryItem[] = [];\r\n const itemTypes = [\r\n { id: 'health_potion', name: 'Health Potion', type: 'consumable' as const },\r\n { id: 'mana_potion', name: 'Mana Potion', type: 'consumable' as const },\r\n { id: 'antidote', name: 'Antidote', type: 'consumable' as const },\r\n { id: 'iron_ore', name: 'Iron Ore', type: 'material' as const },\r\n { id: 'magic_crystal', name: 'Magic Crystal', type: 'material' as const },\r\n ];\r\n\r\n for (let i = 0; i < count; i++) {\r\n const item = rng.pick(itemTypes);\r\n items.push({\r\n id: `${item.id}_${Date.now()}_${i}`,\r\n type: item.type,\r\n name: item.name,\r\n description: `A ${item.name.toLowerCase()}`,\r\n quantity: rng.nextInt(1, 3),\r\n });\r\n }\r\n\r\n return items;\r\n}\r\n\r\n/**\r\n * Generate dungeon rewards\r\n */\r\nfunction generateDungeonRewards(\r\n difficulty: DungeonDifficulty,\r\n level: number,\r\n rng: SeededRandom\r\n): Dungeon['rewards'] {\r\n const baseExp = level * 100;\r\n const baseGold = level * 50;\r\n const diffMod = { easy: 1, normal: 1.5, hard: 2, nightmare: 3, legendary: 5 };\r\n\r\n return [\r\n { type: 'exp', value: Math.floor(baseExp * diffMod[difficulty]), chance: 1 },\r\n { type: 'gold', value: Math.floor(baseGold * diffMod[difficulty]), chance: 1 },\r\n { type: 'item', value: 'affix_fragment', chance: 0.5 },\r\n ];\r\n}\r\n\r\n/**\r\n * Connect rooms in a level\r\n */\r\nfunction connectRooms(rooms: DungeonRoom[], rng: SeededRandom): void {\r\n // Connect rooms linearly first\r\n for (let i = 0; i < rooms.length - 1; i++) {\r\n const currentRoom = rooms[i];\r\n const nextRoom = rooms[i + 1];\r\n\r\n // Determine direction\r\n const dx = nextRoom.position.x - currentRoom.position.x;\r\n const dy = nextRoom.position.y - currentRoom.position.y;\r\n let direction: RoomConnection['direction'] = 'east';\r\n let reverseDir: RoomConnection['direction'] = 'west';\r\n\r\n if (Math.abs(dy) > Math.abs(dx)) {\r\n direction = dy > 0 ? 'south' : 'north';\r\n reverseDir = dy > 0 ? 'north' : 'south';\r\n }\r\n\r\n currentRoom.connections.push({\r\n targetRoomId: nextRoom.id,\r\n direction,\r\n isLocked: false,\r\n isHidden: false,\r\n });\r\n\r\n nextRoom.connections.push({\r\n targetRoomId: currentRoom.id,\r\n direction: reverseDir,\r\n isLocked: false,\r\n isHidden: false,\r\n });\r\n }\r\n\r\n // Add some random connections for variety\r\n for (let i = 0; i < rooms.length - 2; i++) {\r\n if (rng.next() < 0.2) {\r\n const j = rng.nextInt(i + 2, Math.min(i + 4, rooms.length - 1));\r\n const roomA = rooms[i];\r\n const roomB = rooms[j];\r\n\r\n // Check if already connected\r\n if (!roomA.connections.some(c => c.targetRoomId === roomB.id)) {\r\n roomA.connections.push({\r\n targetRoomId: roomB.id,\r\n direction: 'east',\r\n isLocked: false,\r\n isHidden: rng.next() < 0.3,\r\n });\r\n roomB.connections.push({\r\n targetRoomId: roomA.id,\r\n direction: 'west',\r\n isLocked: false,\r\n isHidden: rng.next() < 0.3,\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Generate room name\r\n */\r\nfunction generateRoomName(type: DungeonRoomType, rng: SeededRandom): string {\r\n const names: Record<DungeonRoomType, string[]> = {\r\n // Special navigation rooms\r\n entrance: ['Dungeon Entrance', 'Gateway', 'Entry Hall'],\r\n exit: ['Stairway Down', 'Exit Passage', 'Descent'],\r\n dead_end: ['Dead End', 'Blocked Passage', 'Collapsed Tunnel'],\r\n safe_room: ['Safe Haven', 'Sanctuary', 'Hidden Refuge'],\r\n\r\n // Combat rooms\r\n combat: ['Monster Den', 'Dark Corridor', 'Infested Hall'],\r\n elite: ['Champion\\'s Arena', 'Elite Guard Post', 'Proving Grounds'],\r\n boss: ['Throne Room', 'Lair of Darkness', 'Final Chamber'],\r\n ambush: ['Shadow Corner', 'Ambush Point', 'Treacherous Path'],\r\n\r\n // Reward rooms\r\n treasure: ['Treasure Vault', 'Golden Chamber', 'Loot Room'],\r\n fountain: ['Healing Spring', 'Crystal Fountain', 'Sacred Waters'],\r\n altar: ['Ancient Altar', 'Blessing Shrine', 'Power Nexus'],\r\n shop: ['Merchant\\'s Corner', 'Trading Post', 'Hidden Shop'],\r\n\r\n // Event rooms\r\n event: ['Mysterious Shrine', 'Strange Chamber', 'Enigma Room'],\r\n encounter: ['Traveler\\'s Rest', 'Hidden Camp', 'Meeting Point'],\r\n trap: ['Danger Zone', 'Trapped Corridor', 'Perilous Path'],\r\n puzzle: ['Riddle Room', 'Puzzle Chamber', 'Mind Trial'],\r\n\r\n // Generic rooms\r\n rest: ['Resting Spot', 'Quiet Corner', 'Peaceful Alcove'],\r\n empty: ['Empty Corridor', 'Silent Hall', 'Abandoned Room'],\r\n };\r\n\r\n return rng.pick(names[type]);\r\n}\r\n\r\n/**\r\n * Generate room description\r\n */\r\nfunction generateRoomDescription(type: DungeonRoomType, rng: SeededRandom): string {\r\n const descriptions: Record<DungeonRoomType, string[]> = {\r\n // Special navigation rooms\r\n entrance: ['The entrance to the dungeon. Darkness awaits.'],\r\n exit: ['A passage leading deeper into the dungeon.'],\r\n dead_end: ['The path ends here. Perhaps there is something hidden...'],\r\n safe_room: ['A protected area where you can rest safely.'],\r\n\r\n // Combat rooms\r\n combat: ['Shadows move in the darkness. Enemies lurk here.'],\r\n elite: ['A powerful foe guards this area.'],\r\n boss: ['An oppressive presence fills the room. The boss awaits.'],\r\n ambush: ['Something doesn\\'t feel right... Watch your back!'],\r\n\r\n // Reward rooms\r\n treasure: ['Glittering treasures catch your eye.'],\r\n fountain: ['Clear water flows from an ancient spring. It looks refreshing.'],\r\n altar: ['A mystical altar radiates power. Touch it for a blessing.'],\r\n shop: ['A merchant has set up shop here.'],\r\n\r\n // Event rooms\r\n event: ['Strange energy pulses from within.'],\r\n encounter: ['Someone has made camp here.'],\r\n trap: ['Something feels wrong about this place. Proceed with caution.'],\r\n puzzle: ['Ancient mechanisms line the walls. A puzzle awaits.'],\r\n\r\n // Generic rooms\r\n rest: ['A peaceful respite from danger.'],\r\n empty: ['An empty room. Nothing of immediate interest.'],\r\n };\r\n\r\n return rng.pick(descriptions[type]);\r\n}\r\n\r\n/**\r\n * Regenerate a dungeon with a new seed\r\n */\r\nexport function regenerateDungeon(dungeon: Dungeon, newSeed?: number): Dungeon {\r\n return generateDungeon({\r\n dungeonId: dungeon.id,\r\n name: dungeon.name,\r\n description: dungeon.description,\r\n continentId: dungeon.continentId,\r\n nearestTownId: dungeon.nearestTownId,\r\n difficulty: dungeon.difficulty,\r\n recommendedLevel: dungeon.recommendedLevel,\r\n numberOfLevels: dungeon.levels.length,\r\n roomsPerLevel: { min: 6, max: 10 },\r\n hasBoss: dungeon.hasBoss,\r\n bossName: dungeon.bossName,\r\n seed: newSeed ?? Date.now(),\r\n });\r\n}\r\n"],"names":[],"mappings":"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","debug_id":"f9bf2c94-0d0f-5913-8725-ff22ce400a3b"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Procedural Map Generator using Binary Space Partitioning (BSP)
3
+ */
4
+ import type { GameMap, RoomType } from '../core/types.js';
5
+ interface MapGeneratorConfig {
6
+ width: number;
7
+ height: number;
8
+ floor: number;
9
+ minRoomSize: number;
10
+ maxRoomSize: number;
11
+ roomTypes: RoomTypeWeight[];
12
+ seed?: number;
13
+ }
14
+ interface RoomTypeWeight {
15
+ type: RoomType;
16
+ weight: number;
17
+ }
18
+ /**
19
+ * Generate a dungeon map using BSP algorithm
20
+ */
21
+ export declare function generateMap(config?: Partial<MapGeneratorConfig>): GameMap;
22
+ /**
23
+ * Generate a simple text representation of the map
24
+ */
25
+ export declare function renderMapToString(map: GameMap, currentRoomId: string): string;
26
+ export {};
27
+ //# sourceMappingURL=MapGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapGenerator.d.ts","sourceRoot":"/","sources":["map/MapGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAQ,QAAQ,EAAwB,MAAM,kBAAkB,CAAC;AAYtF,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAuCD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAAG,OAAO,CAsE7E;AAiXD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CA4C7E"}
@@ -0,0 +1,485 @@
1
+ /**
2
+ * Procedural Map Generator using Binary Space Partitioning (BSP)
3
+ */
4
+
5
+ !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]="410f4e46-1aa6-55e2-80b7-2bc845b5aef6")}catch(e){}}();
6
+ const DEFAULT_CONFIG = {
7
+ width: 50,
8
+ height: 50,
9
+ floor: 1,
10
+ minRoomSize: 5,
11
+ maxRoomSize: 15,
12
+ roomTypes: [
13
+ { type: 'combat', weight: 50 },
14
+ { type: 'shop', weight: 15 },
15
+ { type: 'treasure', weight: 15 },
16
+ { type: 'event', weight: 15 },
17
+ { type: 'boss', weight: 5 },
18
+ ],
19
+ };
20
+ // Simple seeded random number generator
21
+ class SeededRandom {
22
+ seed;
23
+ constructor(seed) {
24
+ this.seed = seed;
25
+ }
26
+ next() {
27
+ this.seed = (this.seed * 1103515245 + 12345) & 0x7fffffff;
28
+ return this.seed / 0x7fffffff;
29
+ }
30
+ nextInt(min, max) {
31
+ return Math.floor(this.next() * (max - min + 1)) + min;
32
+ }
33
+ pick(array) {
34
+ return array[Math.floor(this.next() * array.length)];
35
+ }
36
+ }
37
+ /**
38
+ * Generate a dungeon map using BSP algorithm
39
+ */
40
+ export function generateMap(config = {}) {
41
+ const cfg = { ...DEFAULT_CONFIG, ...config };
42
+ const rng = new SeededRandom(cfg.seed ?? Date.now());
43
+ // Create BSP tree
44
+ const root = {
45
+ x: 0,
46
+ y: 0,
47
+ width: cfg.width,
48
+ height: cfg.height,
49
+ left: null,
50
+ right: null,
51
+ room: null,
52
+ };
53
+ // Split the space
54
+ splitNode(root, cfg.minRoomSize, rng);
55
+ // Create rooms in leaf nodes
56
+ const rooms = new Map();
57
+ const leafNodes = [];
58
+ collectLeafNodes(root, leafNodes);
59
+ // Generate rooms
60
+ let roomIndex = 0;
61
+ let bossRoomId;
62
+ for (const node of leafNodes) {
63
+ const roomId = `room_${cfg.floor}_${roomIndex}`;
64
+ const roomType = selectRoomType(cfg.roomTypes, rng, roomIndex === leafNodes.length - 1);
65
+ if (roomType === 'boss') {
66
+ bossRoomId = roomId;
67
+ }
68
+ const room = createRoom(roomId, node, roomType, cfg.floor, rng);
69
+ node.room = room;
70
+ rooms.set(roomId, room);
71
+ roomIndex++;
72
+ }
73
+ // Connect rooms
74
+ connectRooms(root, rooms);
75
+ // Add start room (town/safe zone)
76
+ const startRoomId = 'start_room';
77
+ const firstRoom = leafNodes[0].room;
78
+ const startRoom = {
79
+ id: startRoomId,
80
+ type: 'town',
81
+ position: { x: firstRoom.position.x - 1, y: firstRoom.position.y, floor: cfg.floor },
82
+ name: 'Town Center',
83
+ description: 'A safe haven for adventurers. Merchants and craftsmen offer their services here.',
84
+ isExplored: true,
85
+ isCleared: true,
86
+ connections: [firstRoom.id],
87
+ };
88
+ rooms.set(startRoomId, startRoom);
89
+ firstRoom.connections.push(startRoomId);
90
+ return {
91
+ id: `map_floor_${cfg.floor}`,
92
+ name: `Dungeon Floor ${cfg.floor}`,
93
+ type: 'dungeon',
94
+ floor: cfg.floor,
95
+ rooms,
96
+ startRoomId,
97
+ bossRoomId,
98
+ generatedAt: Date.now(),
99
+ };
100
+ }
101
+ /**
102
+ * Split a BSP node recursively
103
+ */
104
+ function splitNode(node, minSize, rng) {
105
+ const canSplitH = node.height >= minSize * 2;
106
+ const canSplitV = node.width >= minSize * 2;
107
+ if (!canSplitH && !canSplitV) {
108
+ return; // Leaf node
109
+ }
110
+ // Decide split direction
111
+ let splitHorizontally;
112
+ if (canSplitH && canSplitV) {
113
+ splitHorizontally = rng.next() < 0.5;
114
+ }
115
+ else {
116
+ splitHorizontally = canSplitH;
117
+ }
118
+ if (splitHorizontally) {
119
+ const splitPoint = rng.nextInt(minSize, node.height - minSize);
120
+ node.left = {
121
+ x: node.x,
122
+ y: node.y,
123
+ width: node.width,
124
+ height: splitPoint,
125
+ left: null,
126
+ right: null,
127
+ room: null,
128
+ };
129
+ node.right = {
130
+ x: node.x,
131
+ y: node.y + splitPoint,
132
+ width: node.width,
133
+ height: node.height - splitPoint,
134
+ left: null,
135
+ right: null,
136
+ room: null,
137
+ };
138
+ }
139
+ else {
140
+ const splitPoint = rng.nextInt(minSize, node.width - minSize);
141
+ node.left = {
142
+ x: node.x,
143
+ y: node.y,
144
+ width: splitPoint,
145
+ height: node.height,
146
+ left: null,
147
+ right: null,
148
+ room: null,
149
+ };
150
+ node.right = {
151
+ x: node.x + splitPoint,
152
+ y: node.y,
153
+ width: node.width - splitPoint,
154
+ height: node.height,
155
+ left: null,
156
+ right: null,
157
+ room: null,
158
+ };
159
+ }
160
+ splitNode(node.left, minSize, rng);
161
+ splitNode(node.right, minSize, rng);
162
+ }
163
+ /**
164
+ * Collect all leaf nodes
165
+ */
166
+ function collectLeafNodes(node, leaves) {
167
+ if (!node.left && !node.right) {
168
+ leaves.push(node);
169
+ }
170
+ else {
171
+ if (node.left)
172
+ collectLeafNodes(node.left, leaves);
173
+ if (node.right)
174
+ collectLeafNodes(node.right, leaves);
175
+ }
176
+ }
177
+ /**
178
+ * Select a room type based on weights
179
+ */
180
+ function selectRoomType(types, rng, forceBoss) {
181
+ if (forceBoss) {
182
+ return 'boss';
183
+ }
184
+ const totalWeight = types.reduce((sum, t) => sum + t.weight, 0);
185
+ let roll = rng.next() * totalWeight;
186
+ for (const type of types) {
187
+ roll -= type.weight;
188
+ if (roll <= 0) {
189
+ return type.type;
190
+ }
191
+ }
192
+ return 'empty';
193
+ }
194
+ /**
195
+ * Create a room from a BSP node
196
+ */
197
+ function createRoom(id, node, type, floor, rng) {
198
+ const position = {
199
+ x: node.x + Math.floor(node.width / 2),
200
+ y: node.y + Math.floor(node.height / 2),
201
+ floor,
202
+ };
203
+ const room = {
204
+ id,
205
+ type,
206
+ position,
207
+ name: generateRoomName(type, rng),
208
+ description: generateRoomDescription(type, rng),
209
+ isExplored: false,
210
+ isCleared: type === 'town' || type === 'rest',
211
+ connections: [],
212
+ };
213
+ // Add content based on room type
214
+ if (type === 'combat' || type === 'boss') {
215
+ room.enemies = generateEnemies(floor, type === 'boss', rng);
216
+ }
217
+ if (type === 'shop') {
218
+ room.npcs = [generateNPC('merchant', rng)];
219
+ }
220
+ if (type === 'treasure') {
221
+ room.items = generateTreasure(floor, rng);
222
+ }
223
+ return room;
224
+ }
225
+ /**
226
+ * Connect rooms through the BSP tree
227
+ */
228
+ function connectRooms(node, rooms) {
229
+ if (!node.left || !node.right)
230
+ return;
231
+ // Connect children first
232
+ connectRooms(node.left, rooms);
233
+ connectRooms(node.right, rooms);
234
+ // Connect a room from left subtree to a room from right subtree
235
+ const leftRoom = getRandomRoomFromNode(node.left);
236
+ const rightRoom = getRandomRoomFromNode(node.right);
237
+ if (leftRoom && rightRoom) {
238
+ if (!leftRoom.connections.includes(rightRoom.id)) {
239
+ leftRoom.connections.push(rightRoom.id);
240
+ }
241
+ if (!rightRoom.connections.includes(leftRoom.id)) {
242
+ rightRoom.connections.push(leftRoom.id);
243
+ }
244
+ }
245
+ }
246
+ /**
247
+ * Get a random room from a BSP subtree
248
+ */
249
+ function getRandomRoomFromNode(node) {
250
+ if (node.room)
251
+ return node.room;
252
+ const rooms = [];
253
+ const collectRooms = (n) => {
254
+ if (n.room)
255
+ rooms.push(n.room);
256
+ if (n.left)
257
+ collectRooms(n.left);
258
+ if (n.right)
259
+ collectRooms(n.right);
260
+ };
261
+ collectRooms(node);
262
+ return rooms.length > 0 ? rooms[Math.floor(Math.random() * rooms.length)] : null;
263
+ }
264
+ /**
265
+ * Generate a room name
266
+ */
267
+ function generateRoomName(type, rng) {
268
+ const names = {
269
+ empty: ['Empty Chamber', 'Abandoned Hall', 'Dusty Room'],
270
+ combat: ['Dark Corridor', 'Monster Den', 'Infested Hall', 'Danger Zone'],
271
+ shop: ['Merchant\'s Corner', 'Trading Post', 'Hidden Shop'],
272
+ treasure: ['Treasure Chamber', 'Golden Vault', 'Loot Room'],
273
+ event: ['Mysterious Shrine', 'Ancient Altar', 'Strange Portal'],
274
+ boss: ['Throne Room', 'Lair of Darkness', 'Final Chamber'],
275
+ rest: ['Safe Haven', 'Resting Spot', 'Sanctuary'],
276
+ town: ['Town Center', 'Village Square', 'Safe Zone'],
277
+ dungeon_entrance: ['Dungeon Gate', 'Dark Entrance', 'Ominous Doorway'],
278
+ };
279
+ return rng.pick(names[type] || names.empty);
280
+ }
281
+ /**
282
+ * Generate a room description
283
+ */
284
+ function generateRoomDescription(type, rng) {
285
+ const descriptions = {
286
+ empty: [
287
+ 'An empty room with nothing of interest.',
288
+ 'Dust covers every surface. Nothing moves.',
289
+ ],
290
+ combat: [
291
+ 'Shadows move in the darkness. Something lurks here.',
292
+ 'The air feels hostile. Enemies await.',
293
+ ],
294
+ shop: [
295
+ 'A merchant has set up shop in this unlikely place.',
296
+ 'Various goods line makeshift shelves.',
297
+ ],
298
+ treasure: [
299
+ 'Glittering treasures catch your eye.',
300
+ 'Ancient chests hold forgotten riches.',
301
+ ],
302
+ event: [
303
+ 'Strange energy pulses from within.',
304
+ 'Something unusual awaits discovery.',
305
+ ],
306
+ boss: [
307
+ 'An oppressive presence fills the room.',
308
+ 'This is where the strongest foe awaits.',
309
+ ],
310
+ rest: [
311
+ 'A peaceful respite from the dangers outside.',
312
+ 'You can rest safely here.',
313
+ ],
314
+ town: [
315
+ 'A safe haven for adventurers.',
316
+ 'Civilization amidst the chaos.',
317
+ ],
318
+ dungeon_entrance: [
319
+ 'The entrance to untold dangers and treasures.',
320
+ 'Darkness beckons from beyond the threshold.',
321
+ ],
322
+ };
323
+ return rng.pick(descriptions[type] || descriptions.empty);
324
+ }
325
+ /**
326
+ * Generate enemies for a room
327
+ */
328
+ function generateEnemies(floor, isBoss, rng) {
329
+ const enemies = [];
330
+ const baseLevel = floor;
331
+ const count = isBoss ? 1 : rng.nextInt(1, 3);
332
+ const enemyTypes = [
333
+ { name: 'Goblin', hpMult: 1, atkMult: 1, defMult: 0.8 },
334
+ { name: 'Skeleton', hpMult: 0.8, atkMult: 1.1, defMult: 0.9 },
335
+ { name: 'Slime', hpMult: 1.2, atkMult: 0.8, defMult: 0.5 },
336
+ { name: 'Orc', hpMult: 1.5, atkMult: 1.2, defMult: 1 },
337
+ { name: 'Dark Knight', hpMult: 2, atkMult: 1.5, defMult: 1.5 },
338
+ ];
339
+ const bossTypes = [
340
+ { name: 'Goblin King', hpMult: 3, atkMult: 1.5, defMult: 1.2 },
341
+ { name: 'Ancient Lich', hpMult: 2.5, atkMult: 2, defMult: 1 },
342
+ { name: 'Dragon Whelp', hpMult: 4, atkMult: 1.8, defMult: 1.5 },
343
+ ];
344
+ for (let i = 0; i < count; i++) {
345
+ const type = isBoss
346
+ ? rng.pick(bossTypes)
347
+ : rng.pick(enemyTypes);
348
+ const level = baseLevel + (isBoss ? 2 : rng.nextInt(-1, 1));
349
+ enemies.push({
350
+ id: `enemy_${Date.now()}_${i}`,
351
+ name: type.name,
352
+ level,
353
+ hp: Math.floor(20 * level * type.hpMult),
354
+ maxHp: Math.floor(20 * level * type.hpMult),
355
+ attack: Math.floor(5 * level * type.atkMult),
356
+ defense: Math.floor(3 * level * type.defMult),
357
+ speed: 5 + level,
358
+ expReward: 10 * level * (isBoss ? 5 : 1),
359
+ goldReward: rng.nextInt(5, 20) * level,
360
+ dropTable: [
361
+ { itemId: 'health_potion', chance: 0.3, quantity: { min: 1, max: 2 } },
362
+ { itemId: 'affix_fragment', chance: isBoss ? 0.8 : 0.1, quantity: { min: 1, max: 1 } },
363
+ ],
364
+ isBoss,
365
+ });
366
+ }
367
+ return enemies;
368
+ }
369
+ /**
370
+ * Generate an NPC
371
+ */
372
+ function generateNPC(type, rng) {
373
+ const names = ['Morris', 'Elena', 'Gareth', 'Lyra', 'Thorne', 'Isolde', 'Cedric', 'Rowena', 'Aldric'];
374
+ const name = rng.pick(names);
375
+ // NPC type-specific system prompts
376
+ const systemPrompts = {
377
+ merchant: `You are ${name}, a mysterious merchant in a dark dungeon. You speak in riddles and hints. You have rare affix fragments for sale, but your prices are steep. You occasionally drop cryptic warnings about dangers ahead. Keep responses concise (2-3 sentences). Speak in an enigmatic, slightly unsettling tone.`,
378
+ sage: `You are ${name}, a wise sage who has lived in the dungeon for centuries. You possess knowledge of ancient affixes and forgotten lore. You speak calmly and offer guidance to adventurers. Keep responses helpful but mysterious. 2-3 sentences maximum.`,
379
+ guard: `You are ${name}, a gruff dungeon guard who has seen many adventurers come and go. You're skeptical of newcomers but respect strength. You might offer tips about nearby dangers if persuaded. Keep responses short and gruff.`,
380
+ traveler: `You are ${name}, a fellow adventurer exploring the dungeon. You're friendly and willing to share information about areas you've explored. You might trade items or offer to team up temporarily. Keep responses casual and brief.`,
381
+ blacksmith: `You are ${name}, a master blacksmith who has set up shop in a safe zone. You can forge and enhance weapons, and you know much about affix combinations. You speak directly about your craft. Keep responses practical and to the point.`,
382
+ quest_giver: `You are ${name}, a mysterious figure with tasks for brave adventurers. You offer quests and rewards. You speak with purpose and urgency. Keep responses intriguing and motivating.`,
383
+ };
384
+ const descriptions = {
385
+ merchant: `${name} stands behind a cluttered stall, eyes gleaming with shrewd intelligence.`,
386
+ sage: `${name} sits in quiet contemplation, an aura of ancient wisdom surrounding them.`,
387
+ guard: `${name} stands at attention, armor battle-worn but well-maintained.`,
388
+ traveler: `${name} rests against the wall, gear dusty from recent travels.`,
389
+ blacksmith: `${name} works the forge, muscles glistening with sweat.`,
390
+ quest_giver: `${name} beckons you closer with an air of mystery.`,
391
+ };
392
+ return {
393
+ id: `npc_${type}_${Date.now()}_${rng.nextInt(1000, 9999)}`,
394
+ name,
395
+ type: type,
396
+ description: descriptions[type] || `A ${type} named ${name}`,
397
+ systemPrompt: systemPrompts[type] || `You are ${name}, a character in a dungeon. Respond briefly and in character.`,
398
+ dialogHistory: [],
399
+ };
400
+ }
401
+ /**
402
+ * Generate treasure items
403
+ */
404
+ function generateTreasure(floor, rng) {
405
+ const items = [];
406
+ // Gold
407
+ items.push({
408
+ id: 'gold',
409
+ type: 'material',
410
+ name: 'Gold',
411
+ description: 'Shiny coins',
412
+ quantity: rng.nextInt(10, 50) * floor,
413
+ });
414
+ // Random chance for affix fragment
415
+ if (rng.next() < 0.3) {
416
+ items.push({
417
+ id: `affix_fragment_${Date.now()}`,
418
+ type: 'affix_fragment',
419
+ name: 'Affix Fragment',
420
+ description: 'A mysterious fragment that holds power',
421
+ quantity: 1,
422
+ });
423
+ }
424
+ return items;
425
+ }
426
+ /**
427
+ * Generate a simple text representation of the map
428
+ */
429
+ export function renderMapToString(map, currentRoomId) {
430
+ const lines = [];
431
+ const visited = new Set();
432
+ lines.push('┌─── Map ───────────────────────┐');
433
+ // Simple connected node representation
434
+ const queue = [map.startRoomId];
435
+ visited.add(map.startRoomId);
436
+ let depth = 0;
437
+ while (queue.length > 0 && depth < 5) {
438
+ const levelSize = queue.length;
439
+ let line = '│ ';
440
+ for (let i = 0; i < levelSize && i < 5; i++) {
441
+ const roomId = queue.shift();
442
+ const room = map.rooms.get(roomId);
443
+ if (room) {
444
+ const symbol = roomId === currentRoomId
445
+ ? '[@]'
446
+ : getRoomSymbol(room);
447
+ line += symbol + '━';
448
+ for (const connId of room.connections) {
449
+ if (!visited.has(connId)) {
450
+ visited.add(connId);
451
+ queue.push(connId);
452
+ }
453
+ }
454
+ }
455
+ }
456
+ lines.push(line.slice(0, -1).padEnd(33) + '│');
457
+ depth++;
458
+ }
459
+ lines.push('│ │');
460
+ lines.push('│ [@]You [T]Town [D]Dungeon │');
461
+ lines.push('│ [B]Boss [S]Shop [?]Unknown │');
462
+ lines.push('└───────────────────────────────┘');
463
+ return lines.join('\n');
464
+ }
465
+ /**
466
+ * Get symbol for room type
467
+ */
468
+ function getRoomSymbol(room) {
469
+ if (!room.isExplored)
470
+ return '[?]';
471
+ const symbols = {
472
+ empty: '[·]',
473
+ combat: '[!]',
474
+ shop: '[S]',
475
+ treasure: '[T]',
476
+ event: '[E]',
477
+ boss: '[B]',
478
+ rest: '[R]',
479
+ town: '[T]',
480
+ dungeon_entrance: '[D]',
481
+ };
482
+ return symbols[room.type] || '[·]';
483
+ }
484
+ //# sourceMappingURL=MapGenerator.js.map
485
+ //# debugId=410f4e46-1aa6-55e2-80b7-2bc845b5aef6