@rpgm-tools/neo-angband-core 0.10.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 (1183) hide show
  1. package/LICENSE.md +43 -0
  2. package/README.md +80 -0
  3. package/dist/agent/act.d.ts +22 -0
  4. package/dist/agent/act.d.ts.map +1 -0
  5. package/dist/agent/act.js +88 -0
  6. package/dist/agent/act.js.map +1 -0
  7. package/dist/agent/controller.d.ts +34 -0
  8. package/dist/agent/controller.d.ts.map +1 -0
  9. package/dist/agent/controller.js +90 -0
  10. package/dist/agent/controller.js.map +1 -0
  11. package/dist/agent/events.d.ts +27 -0
  12. package/dist/agent/events.d.ts.map +1 -0
  13. package/dist/agent/events.js +31 -0
  14. package/dist/agent/events.js.map +1 -0
  15. package/dist/agent/index.d.ts +17 -0
  16. package/dist/agent/index.d.ts.map +1 -0
  17. package/dist/agent/index.js +15 -0
  18. package/dist/agent/index.js.map +1 -0
  19. package/dist/agent/perceive.d.ts +21 -0
  20. package/dist/agent/perceive.d.ts.map +1 -0
  21. package/dist/agent/perceive.js +386 -0
  22. package/dist/agent/perceive.js.map +1 -0
  23. package/dist/agent/types.d.ts +436 -0
  24. package/dist/agent/types.d.ts.map +1 -0
  25. package/dist/agent/types.js +63 -0
  26. package/dist/agent/types.js.map +1 -0
  27. package/dist/bitflag.d.ts +199 -0
  28. package/dist/bitflag.d.ts.map +1 -0
  29. package/dist/bitflag.js +478 -0
  30. package/dist/bitflag.js.map +1 -0
  31. package/dist/cmd.d.ts +164 -0
  32. package/dist/cmd.d.ts.map +1 -0
  33. package/dist/cmd.js +350 -0
  34. package/dist/cmd.js.map +1 -0
  35. package/dist/color.d.ts +104 -0
  36. package/dist/color.d.ts.map +1 -0
  37. package/dist/color.js +240 -0
  38. package/dist/color.js.map +1 -0
  39. package/dist/combat/brand-slay.d.ts +119 -0
  40. package/dist/combat/brand-slay.d.ts.map +1 -0
  41. package/dist/combat/brand-slay.js +264 -0
  42. package/dist/combat/brand-slay.js.map +1 -0
  43. package/dist/combat/hit.d.ts +198 -0
  44. package/dist/combat/hit.d.ts.map +1 -0
  45. package/dist/combat/hit.js +310 -0
  46. package/dist/combat/hit.js.map +1 -0
  47. package/dist/combat/index.d.ts +15 -0
  48. package/dist/combat/index.d.ts.map +1 -0
  49. package/dist/combat/index.js +15 -0
  50. package/dist/combat/index.js.map +1 -0
  51. package/dist/combat/melee.d.ts +261 -0
  52. package/dist/combat/melee.d.ts.map +1 -0
  53. package/dist/combat/melee.js +402 -0
  54. package/dist/combat/melee.js.map +1 -0
  55. package/dist/combat/mon-melee.d.ts +233 -0
  56. package/dist/combat/mon-melee.d.ts.map +1 -0
  57. package/dist/combat/mon-melee.js +883 -0
  58. package/dist/combat/mon-melee.js.map +1 -0
  59. package/dist/combat/ranged.d.ts +89 -0
  60. package/dist/combat/ranged.d.ts.map +1 -0
  61. package/dist/combat/ranged.js +253 -0
  62. package/dist/combat/ranged.js.map +1 -0
  63. package/dist/constants.d.ts +134 -0
  64. package/dist/constants.d.ts.map +1 -0
  65. package/dist/constants.js +171 -0
  66. package/dist/constants.js.map +1 -0
  67. package/dist/dice.d.ts +91 -0
  68. package/dist/dice.d.ts.map +1 -0
  69. package/dist/dice.js +424 -0
  70. package/dist/dice.js.map +1 -0
  71. package/dist/effects/effect-choice.d.ts +15 -0
  72. package/dist/effects/effect-choice.d.ts.map +1 -0
  73. package/dist/effects/effect-choice.js +18 -0
  74. package/dist/effects/effect-choice.js.map +1 -0
  75. package/dist/effects/effect-info.d.ts +124 -0
  76. package/dist/effects/effect-info.d.ts.map +1 -0
  77. package/dist/effects/effect-info.js +706 -0
  78. package/dist/effects/effect-info.js.map +1 -0
  79. package/dist/effects/effect.d.ts +165 -0
  80. package/dist/effects/effect.d.ts.map +1 -0
  81. package/dist/effects/effect.js +452 -0
  82. package/dist/effects/effect.js.map +1 -0
  83. package/dist/effects/handlers.d.ts +70 -0
  84. package/dist/effects/handlers.d.ts.map +1 -0
  85. package/dist/effects/handlers.js +394 -0
  86. package/dist/effects/handlers.js.map +1 -0
  87. package/dist/effects/interpreter.d.ts +291 -0
  88. package/dist/effects/interpreter.d.ts.map +1 -0
  89. package/dist/effects/interpreter.js +325 -0
  90. package/dist/effects/interpreter.js.map +1 -0
  91. package/dist/events.d.ts +188 -0
  92. package/dist/events.d.ts.map +1 -0
  93. package/dist/events.js +138 -0
  94. package/dist/events.js.map +1 -0
  95. package/dist/expression.d.ts +83 -0
  96. package/dist/expression.d.ts.map +1 -0
  97. package/dist/expression.js +333 -0
  98. package/dist/expression.js.map +1 -0
  99. package/dist/game/cave-cmd.d.ts +195 -0
  100. package/dist/game/cave-cmd.d.ts.map +1 -0
  101. package/dist/game/cave-cmd.js +968 -0
  102. package/dist/game/cave-cmd.js.map +1 -0
  103. package/dist/game/char-sheet.d.ts +189 -0
  104. package/dist/game/char-sheet.d.ts.map +1 -0
  105. package/dist/game/char-sheet.js +381 -0
  106. package/dist/game/char-sheet.js.map +1 -0
  107. package/dist/game/chest.d.ts +94 -0
  108. package/dist/game/chest.d.ts.map +1 -0
  109. package/dist/game/chest.js +267 -0
  110. package/dist/game/chest.js.map +1 -0
  111. package/dist/game/context.d.ts +970 -0
  112. package/dist/game/context.d.ts.map +1 -0
  113. package/dist/game/context.js +353 -0
  114. package/dist/game/context.js.map +1 -0
  115. package/dist/game/curse-tick.d.ts +35 -0
  116. package/dist/game/curse-tick.d.ts.map +1 -0
  117. package/dist/game/curse-tick.js +100 -0
  118. package/dist/game/curse-tick.js.map +1 -0
  119. package/dist/game/describe.d.ts +20 -0
  120. package/dist/game/describe.d.ts.map +1 -0
  121. package/dist/game/describe.js +45 -0
  122. package/dist/game/describe.js.map +1 -0
  123. package/dist/game/display.d.ts +196 -0
  124. package/dist/game/display.d.ts.map +1 -0
  125. package/dist/game/display.js +684 -0
  126. package/dist/game/display.js.map +1 -0
  127. package/dist/game/dump-level.d.ts +37 -0
  128. package/dist/game/dump-level.d.ts.map +1 -0
  129. package/dist/game/dump-level.js +110 -0
  130. package/dist/game/dump-level.js.map +1 -0
  131. package/dist/game/effect-attack.d.ts +36 -0
  132. package/dist/game/effect-attack.d.ts.map +1 -0
  133. package/dist/game/effect-attack.js +694 -0
  134. package/dist/game/effect-attack.js.map +1 -0
  135. package/dist/game/effect-detect.d.ts +34 -0
  136. package/dist/game/effect-detect.d.ts.map +1 -0
  137. package/dist/game/effect-detect.js +456 -0
  138. package/dist/game/effect-detect.js.map +1 -0
  139. package/dist/game/effect-env.d.ts +77 -0
  140. package/dist/game/effect-env.d.ts.map +1 -0
  141. package/dist/game/effect-env.js +166 -0
  142. package/dist/game/effect-env.js.map +1 -0
  143. package/dist/game/effect-game-env.d.ts +76 -0
  144. package/dist/game/effect-game-env.d.ts.map +1 -0
  145. package/dist/game/effect-game-env.js +23 -0
  146. package/dist/game/effect-game-env.js.map +1 -0
  147. package/dist/game/effect-general.d.ts +98 -0
  148. package/dist/game/effect-general.d.ts.map +1 -0
  149. package/dist/game/effect-general.js +914 -0
  150. package/dist/game/effect-general.js.map +1 -0
  151. package/dist/game/effect-item.d.ts +124 -0
  152. package/dist/game/effect-item.d.ts.map +1 -0
  153. package/dist/game/effect-item.js +789 -0
  154. package/dist/game/effect-item.js.map +1 -0
  155. package/dist/game/effect-melee.d.ts +43 -0
  156. package/dist/game/effect-melee.d.ts.map +1 -0
  157. package/dist/game/effect-melee.js +477 -0
  158. package/dist/game/effect-melee.js.map +1 -0
  159. package/dist/game/effect-mon-origin.d.ts +67 -0
  160. package/dist/game/effect-mon-origin.d.ts.map +1 -0
  161. package/dist/game/effect-mon-origin.js +164 -0
  162. package/dist/game/effect-mon-origin.js.map +1 -0
  163. package/dist/game/effect-monster.d.ts +29 -0
  164. package/dist/game/effect-monster.d.ts.map +1 -0
  165. package/dist/game/effect-monster.js +281 -0
  166. package/dist/game/effect-monster.js.map +1 -0
  167. package/dist/game/effect-summon.d.ts +37 -0
  168. package/dist/game/effect-summon.d.ts.map +1 -0
  169. package/dist/game/effect-summon.js +113 -0
  170. package/dist/game/effect-summon.js.map +1 -0
  171. package/dist/game/effect-teleport.d.ts +130 -0
  172. package/dist/game/effect-teleport.d.ts.map +1 -0
  173. package/dist/game/effect-teleport.js +529 -0
  174. package/dist/game/effect-teleport.js.map +1 -0
  175. package/dist/game/effect-terrain.d.ts +91 -0
  176. package/dist/game/effect-terrain.d.ts.map +1 -0
  177. package/dist/game/effect-terrain.js +812 -0
  178. package/dist/game/effect-terrain.js.map +1 -0
  179. package/dist/game/energy.d.ts +45 -0
  180. package/dist/game/energy.d.ts.map +1 -0
  181. package/dist/game/energy.js +51 -0
  182. package/dist/game/energy.js.map +1 -0
  183. package/dist/game/equip-cmp.d.ts +138 -0
  184. package/dist/game/equip-cmp.d.ts.map +1 -0
  185. package/dist/game/equip-cmp.js +363 -0
  186. package/dist/game/equip-cmp.js.map +1 -0
  187. package/dist/game/floor.d.ts +182 -0
  188. package/dist/game/floor.d.ts.map +1 -0
  189. package/dist/game/floor.js +435 -0
  190. package/dist/game/floor.js.map +1 -0
  191. package/dist/game/gear.d.ts +408 -0
  192. package/dist/game/gear.d.ts.map +1 -0
  193. package/dist/game/gear.js +1037 -0
  194. package/dist/game/gear.js.map +1 -0
  195. package/dist/game/harness.d.ts +61 -0
  196. package/dist/game/harness.d.ts.map +1 -0
  197. package/dist/game/harness.js +198 -0
  198. package/dist/game/harness.js.map +1 -0
  199. package/dist/game/history.d.ts +49 -0
  200. package/dist/game/history.d.ts.map +1 -0
  201. package/dist/game/history.js +55 -0
  202. package/dist/game/history.js.map +1 -0
  203. package/dist/game/ignore-cmd.d.ts +42 -0
  204. package/dist/game/ignore-cmd.d.ts.map +1 -0
  205. package/dist/game/ignore-cmd.js +59 -0
  206. package/dist/game/ignore-cmd.js.map +1 -0
  207. package/dist/game/inscription-confirm.d.ts +80 -0
  208. package/dist/game/inscription-confirm.d.ts.map +1 -0
  209. package/dist/game/inscription-confirm.js +95 -0
  210. package/dist/game/inscription-confirm.js.map +1 -0
  211. package/dist/game/known.d.ts +297 -0
  212. package/dist/game/known.d.ts.map +1 -0
  213. package/dist/game/known.js +849 -0
  214. package/dist/game/known.js.map +1 -0
  215. package/dist/game/loop.d.ts +139 -0
  216. package/dist/game/loop.d.ts.map +1 -0
  217. package/dist/game/loop.js +631 -0
  218. package/dist/game/loop.js.map +1 -0
  219. package/dist/game/lore-color.d.ts +25 -0
  220. package/dist/game/lore-color.d.ts.map +1 -0
  221. package/dist/game/lore-color.js +95 -0
  222. package/dist/game/lore-color.js.map +1 -0
  223. package/dist/game/mon-cast.d.ts +150 -0
  224. package/dist/game/mon-cast.d.ts.map +1 -0
  225. package/dist/game/mon-cast.js +301 -0
  226. package/dist/game/mon-cast.js.map +1 -0
  227. package/dist/game/mon-cmd.d.ts +51 -0
  228. package/dist/game/mon-cmd.d.ts.map +1 -0
  229. package/dist/game/mon-cmd.js +670 -0
  230. package/dist/game/mon-cmd.js.map +1 -0
  231. package/dist/game/mon-death.d.ts +143 -0
  232. package/dist/game/mon-death.d.ts.map +1 -0
  233. package/dist/game/mon-death.js +328 -0
  234. package/dist/game/mon-death.js.map +1 -0
  235. package/dist/game/mon-group.d.ts +81 -0
  236. package/dist/game/mon-group.d.ts.map +1 -0
  237. package/dist/game/mon-group.js +323 -0
  238. package/dist/game/mon-group.js.map +1 -0
  239. package/dist/game/mon-list.d.ts +85 -0
  240. package/dist/game/mon-list.d.ts.map +1 -0
  241. package/dist/game/mon-list.js +154 -0
  242. package/dist/game/mon-list.js.map +1 -0
  243. package/dist/game/mon-message.d.ts +100 -0
  244. package/dist/game/mon-message.d.ts.map +1 -0
  245. package/dist/game/mon-message.js +336 -0
  246. package/dist/game/mon-message.js.map +1 -0
  247. package/dist/game/mon-place.d.ts +226 -0
  248. package/dist/game/mon-place.d.ts.map +1 -0
  249. package/dist/game/mon-place.js +642 -0
  250. package/dist/game/mon-place.js.map +1 -0
  251. package/dist/game/mon-ranged.d.ts +87 -0
  252. package/dist/game/mon-ranged.d.ts.map +1 -0
  253. package/dist/game/mon-ranged.js +353 -0
  254. package/dist/game/mon-ranged.js.map +1 -0
  255. package/dist/game/mon-shape.d.ts +43 -0
  256. package/dist/game/mon-shape.d.ts.map +1 -0
  257. package/dist/game/mon-shape.js +115 -0
  258. package/dist/game/mon-shape.js.map +1 -0
  259. package/dist/game/mon-side.d.ts +63 -0
  260. package/dist/game/mon-side.d.ts.map +1 -0
  261. package/dist/game/mon-side.js +403 -0
  262. package/dist/game/mon-side.js.map +1 -0
  263. package/dist/game/monster-turn.d.ts +195 -0
  264. package/dist/game/monster-turn.d.ts.map +1 -0
  265. package/dist/game/monster-turn.js +1560 -0
  266. package/dist/game/monster-turn.js.map +1 -0
  267. package/dist/game/obj-cmd.d.ts +453 -0
  268. package/dist/game/obj-cmd.d.ts.map +1 -0
  269. package/dist/game/obj-cmd.js +1530 -0
  270. package/dist/game/obj-cmd.js.map +1 -0
  271. package/dist/game/obj-list.d.ts +92 -0
  272. package/dist/game/obj-list.d.ts.map +1 -0
  273. package/dist/game/obj-list.js +251 -0
  274. package/dist/game/obj-list.js.map +1 -0
  275. package/dist/game/object-inspect.d.ts +37 -0
  276. package/dist/game/object-inspect.d.ts.map +1 -0
  277. package/dist/game/object-inspect.js +106 -0
  278. package/dist/game/object-inspect.js.map +1 -0
  279. package/dist/game/pickup.d.ts +126 -0
  280. package/dist/game/pickup.d.ts.map +1 -0
  281. package/dist/game/pickup.js +367 -0
  282. package/dist/game/pickup.js.map +1 -0
  283. package/dist/game/player-path.d.ts +133 -0
  284. package/dist/game/player-path.d.ts.map +1 -0
  285. package/dist/game/player-path.js +1268 -0
  286. package/dist/game/player-path.js.map +1 -0
  287. package/dist/game/player-side.d.ts +59 -0
  288. package/dist/game/player-side.d.ts.map +1 -0
  289. package/dist/game/player-side.js +506 -0
  290. package/dist/game/player-side.js.map +1 -0
  291. package/dist/game/player-turn.d.ts +161 -0
  292. package/dist/game/player-turn.d.ts.map +1 -0
  293. package/dist/game/player-turn.js +739 -0
  294. package/dist/game/player-turn.js.map +1 -0
  295. package/dist/game/project-cast.d.ts +268 -0
  296. package/dist/game/project-cast.d.ts.map +1 -0
  297. package/dist/game/project-cast.js +496 -0
  298. package/dist/game/project-cast.js.map +1 -0
  299. package/dist/game/project-feat.d.ts +47 -0
  300. package/dist/game/project-feat.d.ts.map +1 -0
  301. package/dist/game/project-feat.js +350 -0
  302. package/dist/game/project-feat.js.map +1 -0
  303. package/dist/game/project-monster.d.ts +106 -0
  304. package/dist/game/project-monster.d.ts.map +1 -0
  305. package/dist/game/project-monster.js +272 -0
  306. package/dist/game/project-monster.js.map +1 -0
  307. package/dist/game/project-obj.d.ts +60 -0
  308. package/dist/game/project-obj.d.ts.map +1 -0
  309. package/dist/game/project-obj.js +245 -0
  310. package/dist/game/project-obj.js.map +1 -0
  311. package/dist/game/project-player.d.ts +120 -0
  312. package/dist/game/project-player.d.ts.map +1 -0
  313. package/dist/game/project-player.js +108 -0
  314. package/dist/game/project-player.js.map +1 -0
  315. package/dist/game/quest.d.ts +101 -0
  316. package/dist/game/quest.d.ts.map +1 -0
  317. package/dist/game/quest.js +192 -0
  318. package/dist/game/quest.js.map +1 -0
  319. package/dist/game/ranged-cmd.d.ts +32 -0
  320. package/dist/game/ranged-cmd.d.ts.map +1 -0
  321. package/dist/game/ranged-cmd.js +372 -0
  322. package/dist/game/ranged-cmd.js.map +1 -0
  323. package/dist/game/scheduler.d.ts +47 -0
  324. package/dist/game/scheduler.d.ts.map +1 -0
  325. package/dist/game/scheduler.js +141 -0
  326. package/dist/game/scheduler.js.map +1 -0
  327. package/dist/game/spell-cmd.d.ts +104 -0
  328. package/dist/game/spell-cmd.d.ts.map +1 -0
  329. package/dist/game/spell-cmd.js +320 -0
  330. package/dist/game/spell-cmd.js.map +1 -0
  331. package/dist/game/spoil.d.ts +28 -0
  332. package/dist/game/spoil.d.ts.map +1 -0
  333. package/dist/game/spoil.js +435 -0
  334. package/dist/game/spoil.js.map +1 -0
  335. package/dist/game/steal.d.ts +35 -0
  336. package/dist/game/steal.d.ts.map +1 -0
  337. package/dist/game/steal.js +145 -0
  338. package/dist/game/steal.js.map +1 -0
  339. package/dist/game/take-hit-hooks.d.ts +52 -0
  340. package/dist/game/take-hit-hooks.d.ts.map +1 -0
  341. package/dist/game/take-hit-hooks.js +127 -0
  342. package/dist/game/take-hit-hooks.js.map +1 -0
  343. package/dist/game/target-loop.d.ts +119 -0
  344. package/dist/game/target-loop.d.ts.map +1 -0
  345. package/dist/game/target-loop.js +408 -0
  346. package/dist/game/target-loop.js.map +1 -0
  347. package/dist/game/target.d.ts +133 -0
  348. package/dist/game/target.d.ts.map +1 -0
  349. package/dist/game/target.js +353 -0
  350. package/dist/game/target.js.map +1 -0
  351. package/dist/game/thrust.d.ts +37 -0
  352. package/dist/game/thrust.d.ts.map +1 -0
  353. package/dist/game/thrust.js +155 -0
  354. package/dist/game/thrust.js.map +1 -0
  355. package/dist/game/trap.d.ts +218 -0
  356. package/dist/game/trap.d.ts.map +1 -0
  357. package/dist/game/trap.js +618 -0
  358. package/dist/game/trap.js.map +1 -0
  359. package/dist/game/ui-entry.d.ts +282 -0
  360. package/dist/game/ui-entry.d.ts.map +1 -0
  361. package/dist/game/ui-entry.js +1838 -0
  362. package/dist/game/ui-entry.js.map +1 -0
  363. package/dist/game/wizard.d.ts +654 -0
  364. package/dist/game/wizard.d.ts.map +1 -0
  365. package/dist/game/wizard.js +1323 -0
  366. package/dist/game/wizard.js.map +1 -0
  367. package/dist/game/world.d.ts +183 -0
  368. package/dist/game/world.d.ts.map +1 -0
  369. package/dist/game/world.js +685 -0
  370. package/dist/game/world.js.map +1 -0
  371. package/dist/gen/cave.d.ts +247 -0
  372. package/dist/gen/cave.d.ts.map +1 -0
  373. package/dist/gen/cave.js +2406 -0
  374. package/dist/gen/cave.js.map +1 -0
  375. package/dist/gen/gen-monster.d.ts +151 -0
  376. package/dist/gen/gen-monster.d.ts.map +1 -0
  377. package/dist/gen/gen-monster.js +473 -0
  378. package/dist/gen/gen-monster.js.map +1 -0
  379. package/dist/gen/generate.d.ts +240 -0
  380. package/dist/gen/generate.d.ts.map +1 -0
  381. package/dist/gen/generate.js +358 -0
  382. package/dist/gen/generate.js.map +1 -0
  383. package/dist/gen/room.d.ts +160 -0
  384. package/dist/gen/room.d.ts.map +1 -0
  385. package/dist/gen/room.js +1910 -0
  386. package/dist/gen/room.js.map +1 -0
  387. package/dist/gen/util.d.ts +466 -0
  388. package/dist/gen/util.d.ts.map +1 -0
  389. package/dist/gen/util.js +1553 -0
  390. package/dist/gen/util.js.map +1 -0
  391. package/dist/generated/dun-profiles.d.ts +44 -0
  392. package/dist/generated/dun-profiles.d.ts.map +1 -0
  393. package/dist/generated/dun-profiles.js +28 -0
  394. package/dist/generated/dun-profiles.js.map +1 -0
  395. package/dist/generated/effects.d.ts +1021 -0
  396. package/dist/generated/effects.d.ts.map +1 -0
  397. package/dist/generated/effects.js +239 -0
  398. package/dist/generated/effects.js.map +1 -0
  399. package/dist/generated/elements.d.ts +83 -0
  400. package/dist/generated/elements.d.ts.map +1 -0
  401. package/dist/generated/elements.js +60 -0
  402. package/dist/generated/elements.js.map +1 -0
  403. package/dist/generated/equip-slots.d.ts +104 -0
  404. package/dist/generated/equip-slots.d.ts.map +1 -0
  405. package/dist/generated/equip-slots.js +34 -0
  406. package/dist/generated/equip-slots.js.map +1 -0
  407. package/dist/generated/history-types.d.ts +52 -0
  408. package/dist/generated/history-types.d.ts.map +1 -0
  409. package/dist/generated/history-types.js +32 -0
  410. package/dist/generated/history-types.js.map +1 -0
  411. package/dist/generated/ignore-types.d.ts +116 -0
  412. package/dist/generated/ignore-types.d.ts.map +1 -0
  413. package/dist/generated/ignore-types.js +64 -0
  414. package/dist/generated/ignore-types.js.map +1 -0
  415. package/dist/generated/index.d.ts +32 -0
  416. package/dist/generated/index.d.ts.map +1 -0
  417. package/dist/generated/index.js +33 -0
  418. package/dist/generated/index.js.map +1 -0
  419. package/dist/generated/kind-flags.d.ts +72 -0
  420. package/dist/generated/kind-flags.d.ts.map +1 -0
  421. package/dist/generated/kind-flags.js +42 -0
  422. package/dist/generated/kind-flags.js.map +1 -0
  423. package/dist/generated/message.d.ts +624 -0
  424. package/dist/generated/message.d.ts.map +1 -0
  425. package/dist/generated/message.js +318 -0
  426. package/dist/generated/message.js.map +1 -0
  427. package/dist/generated/mon-message.d.ts +386 -0
  428. package/dist/generated/mon-message.d.ts.map +1 -0
  429. package/dist/generated/mon-message.js +136 -0
  430. package/dist/generated/mon-message.js.map +1 -0
  431. package/dist/generated/mon-race-flags.d.ts +433 -0
  432. package/dist/generated/mon-race-flags.d.ts.map +1 -0
  433. package/dist/generated/mon-race-flags.js +180 -0
  434. package/dist/generated/mon-race-flags.js.map +1 -0
  435. package/dist/generated/mon-spells.d.ts +380 -0
  436. package/dist/generated/mon-spells.d.ts.map +1 -0
  437. package/dist/generated/mon-spells.js +196 -0
  438. package/dist/generated/mon-spells.js.map +1 -0
  439. package/dist/generated/mon-temp-flags.d.ts +52 -0
  440. package/dist/generated/mon-temp-flags.d.ts.map +1 -0
  441. package/dist/generated/mon-temp-flags.js +32 -0
  442. package/dist/generated/mon-temp-flags.js.map +1 -0
  443. package/dist/generated/mon-timed.d.ts +118 -0
  444. package/dist/generated/mon-timed.d.ts.map +1 -0
  445. package/dist/generated/mon-timed.js +32 -0
  446. package/dist/generated/mon-timed.js.map +1 -0
  447. package/dist/generated/object-flags.d.ts +169 -0
  448. package/dist/generated/object-flags.d.ts.map +1 -0
  449. package/dist/generated/object-flags.js +93 -0
  450. package/dist/generated/object-flags.js.map +1 -0
  451. package/dist/generated/object-modifiers.d.ts +50 -0
  452. package/dist/generated/object-modifiers.d.ts.map +1 -0
  453. package/dist/generated/object-modifiers.js +41 -0
  454. package/dist/generated/object-modifiers.js.map +1 -0
  455. package/dist/generated/options.d.ts +284 -0
  456. package/dist/generated/options.d.ts.map +1 -0
  457. package/dist/generated/options.js +102 -0
  458. package/dist/generated/options.js.map +1 -0
  459. package/dist/generated/origins.d.ts +138 -0
  460. package/dist/generated/origins.d.ts.map +1 -0
  461. package/dist/generated/origins.js +62 -0
  462. package/dist/generated/origins.js.map +1 -0
  463. package/dist/generated/parser-errors.d.ts +264 -0
  464. package/dist/generated/parser-errors.d.ts.map +1 -0
  465. package/dist/generated/parser-errors.js +138 -0
  466. package/dist/generated/parser-errors.js.map +1 -0
  467. package/dist/generated/player-flags.d.ts +62 -0
  468. package/dist/generated/player-flags.d.ts.map +1 -0
  469. package/dist/generated/player-flags.js +46 -0
  470. package/dist/generated/player-flags.js.map +1 -0
  471. package/dist/generated/player-timed.d.ts +273 -0
  472. package/dist/generated/player-timed.d.ts.map +1 -0
  473. package/dist/generated/player-timed.js +116 -0
  474. package/dist/generated/player-timed.js.map +1 -0
  475. package/dist/generated/projections.d.ts +130 -0
  476. package/dist/generated/projections.d.ts.map +1 -0
  477. package/dist/generated/projections.js +101 -0
  478. package/dist/generated/projections.js.map +1 -0
  479. package/dist/generated/randart-properties.d.ts +388 -0
  480. package/dist/generated/randart-properties.d.ts.map +1 -0
  481. package/dist/generated/randart-properties.js +200 -0
  482. package/dist/generated/randart-properties.js.map +1 -0
  483. package/dist/generated/room-flags.d.ts +21 -0
  484. package/dist/generated/room-flags.d.ts.map +1 -0
  485. package/dist/generated/room-flags.js +19 -0
  486. package/dist/generated/room-flags.js.map +1 -0
  487. package/dist/generated/rooms.d.ts +122 -0
  488. package/dist/generated/rooms.d.ts.map +1 -0
  489. package/dist/generated/rooms.js +48 -0
  490. package/dist/generated/rooms.js.map +1 -0
  491. package/dist/generated/square-flags.d.ts +96 -0
  492. package/dist/generated/square-flags.d.ts.map +1 -0
  493. package/dist/generated/square-flags.js +54 -0
  494. package/dist/generated/square-flags.js.map +1 -0
  495. package/dist/generated/stats.d.ts +23 -0
  496. package/dist/generated/stats.d.ts.map +1 -0
  497. package/dist/generated/stats.js +20 -0
  498. package/dist/generated/stats.js.map +1 -0
  499. package/dist/generated/terrain-flags.d.ts +136 -0
  500. package/dist/generated/terrain-flags.d.ts.map +1 -0
  501. package/dist/generated/terrain-flags.js +74 -0
  502. package/dist/generated/terrain-flags.js.map +1 -0
  503. package/dist/generated/terrain.d.ts +83 -0
  504. package/dist/generated/terrain.d.ts.map +1 -0
  505. package/dist/generated/terrain.js +60 -0
  506. package/dist/generated/terrain.js.map +1 -0
  507. package/dist/generated/trap-flags.d.ts +68 -0
  508. package/dist/generated/trap-flags.d.ts.map +1 -0
  509. package/dist/generated/trap-flags.js +40 -0
  510. package/dist/generated/trap-flags.js.map +1 -0
  511. package/dist/generated/tvals.d.ts +152 -0
  512. package/dist/generated/tvals.d.ts.map +1 -0
  513. package/dist/generated/tvals.js +82 -0
  514. package/dist/generated/tvals.js.map +1 -0
  515. package/dist/generated/ui-entry-renderers.d.ts +62 -0
  516. package/dist/generated/ui-entry-renderers.d.ts.map +1 -0
  517. package/dist/generated/ui-entry-renderers.js +22 -0
  518. package/dist/generated/ui-entry-renderers.js.map +1 -0
  519. package/dist/guard.d.ts +43 -0
  520. package/dist/guard.d.ts.map +1 -0
  521. package/dist/guard.js +65 -0
  522. package/dist/guard.js.map +1 -0
  523. package/dist/host/args.d.ts +129 -0
  524. package/dist/host/args.d.ts.map +1 -0
  525. package/dist/host/args.js +251 -0
  526. package/dist/host/args.js.map +1 -0
  527. package/dist/host/bridge.d.ts +61 -0
  528. package/dist/host/bridge.d.ts.map +1 -0
  529. package/dist/host/bridge.js +176 -0
  530. package/dist/host/bridge.js.map +1 -0
  531. package/dist/host/index.d.ts +18 -0
  532. package/dist/host/index.d.ts.map +1 -0
  533. package/dist/host/index.js +18 -0
  534. package/dist/host/index.js.map +1 -0
  535. package/dist/host/io.d.ts +169 -0
  536. package/dist/host/io.d.ts.map +1 -0
  537. package/dist/host/io.js +137 -0
  538. package/dist/host/io.js.map +1 -0
  539. package/dist/host/memory.d.ts +56 -0
  540. package/dist/host/memory.d.ts.map +1 -0
  541. package/dist/host/memory.js +105 -0
  542. package/dist/host/memory.js.map +1 -0
  543. package/dist/host/raw.d.ts +114 -0
  544. package/dist/host/raw.d.ts.map +1 -0
  545. package/dist/host/raw.js +107 -0
  546. package/dist/host/raw.js.map +1 -0
  547. package/dist/index.d.ts +180 -0
  548. package/dist/index.d.ts.map +1 -0
  549. package/dist/index.js +222 -0
  550. package/dist/index.js.map +1 -0
  551. package/dist/loc.d.ts +63 -0
  552. package/dist/loc.d.ts.map +1 -0
  553. package/dist/loc.js +128 -0
  554. package/dist/loc.js.map +1 -0
  555. package/dist/mod/hooks.d.ts +204 -0
  556. package/dist/mod/hooks.d.ts.map +1 -0
  557. package/dist/mod/hooks.js +161 -0
  558. package/dist/mod/hooks.js.map +1 -0
  559. package/dist/mod/ids.d.ts +160 -0
  560. package/dist/mod/ids.d.ts.map +1 -0
  561. package/dist/mod/ids.js +343 -0
  562. package/dist/mod/ids.js.map +1 -0
  563. package/dist/mod/registry-host.d.ts +156 -0
  564. package/dist/mod/registry-host.d.ts.map +1 -0
  565. package/dist/mod/registry-host.js +142 -0
  566. package/dist/mod/registry-host.js.map +1 -0
  567. package/dist/mod/save-blocks.d.ts +201 -0
  568. package/dist/mod/save-blocks.d.ts.map +1 -0
  569. package/dist/mod/save-blocks.js +640 -0
  570. package/dist/mod/save-blocks.js.map +1 -0
  571. package/dist/mod/vocabulary.d.ts +104 -0
  572. package/dist/mod/vocabulary.d.ts.map +1 -0
  573. package/dist/mod/vocabulary.js +0 -0
  574. package/dist/mod/vocabulary.js.map +1 -0
  575. package/dist/mon/bind.d.ts +266 -0
  576. package/dist/mon/bind.d.ts.map +1 -0
  577. package/dist/mon/bind.js +610 -0
  578. package/dist/mon/bind.js.map +1 -0
  579. package/dist/mon/desc.d.ts +72 -0
  580. package/dist/mon/desc.d.ts.map +1 -0
  581. package/dist/mon/desc.js +237 -0
  582. package/dist/mon/desc.js.map +1 -0
  583. package/dist/mon/knowledge-groups.d.ts +61 -0
  584. package/dist/mon/knowledge-groups.d.ts.map +1 -0
  585. package/dist/mon/knowledge-groups.js +121 -0
  586. package/dist/mon/knowledge-groups.js.map +1 -0
  587. package/dist/mon/lore-describe.d.ts +216 -0
  588. package/dist/mon/lore-describe.d.ts.map +1 -0
  589. package/dist/mon/lore-describe.js +1105 -0
  590. package/dist/mon/lore-describe.js.map +1 -0
  591. package/dist/mon/lore.d.ts +117 -0
  592. package/dist/mon/lore.d.ts.map +1 -0
  593. package/dist/mon/lore.js +221 -0
  594. package/dist/mon/lore.js.map +1 -0
  595. package/dist/mon/make.d.ts +147 -0
  596. package/dist/mon/make.d.ts.map +1 -0
  597. package/dist/mon/make.js +353 -0
  598. package/dist/mon/make.js.map +1 -0
  599. package/dist/mon/monster.d.ts +94 -0
  600. package/dist/mon/monster.d.ts.map +1 -0
  601. package/dist/mon/monster.js +90 -0
  602. package/dist/mon/monster.js.map +1 -0
  603. package/dist/mon/predicate.d.ts +87 -0
  604. package/dist/mon/predicate.d.ts.map +1 -0
  605. package/dist/mon/predicate.js +190 -0
  606. package/dist/mon/predicate.js.map +1 -0
  607. package/dist/mon/project-mon.d.ts +129 -0
  608. package/dist/mon/project-mon.d.ts.map +1 -0
  609. package/dist/mon/project-mon.js +652 -0
  610. package/dist/mon/project-mon.js.map +1 -0
  611. package/dist/mon/spell.d.ts +155 -0
  612. package/dist/mon/spell.d.ts.map +1 -0
  613. package/dist/mon/spell.js +355 -0
  614. package/dist/mon/spell.js.map +1 -0
  615. package/dist/mon/steal.d.ts +112 -0
  616. package/dist/mon/steal.d.ts.map +1 -0
  617. package/dist/mon/steal.js +163 -0
  618. package/dist/mon/steal.js.map +1 -0
  619. package/dist/mon/summon.d.ts +62 -0
  620. package/dist/mon/summon.d.ts.map +1 -0
  621. package/dist/mon/summon.js +111 -0
  622. package/dist/mon/summon.js.map +1 -0
  623. package/dist/mon/take-hit.d.ts +75 -0
  624. package/dist/mon/take-hit.d.ts.map +1 -0
  625. package/dist/mon/take-hit.js +122 -0
  626. package/dist/mon/take-hit.js.map +1 -0
  627. package/dist/mon/timed.d.ts +74 -0
  628. package/dist/mon/timed.d.ts.map +1 -0
  629. package/dist/mon/timed.js +219 -0
  630. package/dist/mon/timed.js.map +1 -0
  631. package/dist/mon/types.d.ts +252 -0
  632. package/dist/mon/types.d.ts.map +1 -0
  633. package/dist/mon/types.js +46 -0
  634. package/dist/mon/types.js.map +1 -0
  635. package/dist/msg.d.ts +71 -0
  636. package/dist/msg.d.ts.map +1 -0
  637. package/dist/msg.js +126 -0
  638. package/dist/msg.js.map +1 -0
  639. package/dist/obj/artifact-fake.d.ts +39 -0
  640. package/dist/obj/artifact-fake.d.ts.map +1 -0
  641. package/dist/obj/artifact-fake.js +52 -0
  642. package/dist/obj/artifact-fake.js.map +1 -0
  643. package/dist/obj/artifact-known.d.ts +50 -0
  644. package/dist/obj/artifact-known.d.ts.map +1 -0
  645. package/dist/obj/artifact-known.js +55 -0
  646. package/dist/obj/artifact-known.js.map +1 -0
  647. package/dist/obj/bind.d.ts +219 -0
  648. package/dist/obj/bind.d.ts.map +1 -0
  649. package/dist/obj/bind.js +1239 -0
  650. package/dist/obj/bind.js.map +1 -0
  651. package/dist/obj/chest.d.ts +91 -0
  652. package/dist/obj/chest.d.ts.map +1 -0
  653. package/dist/obj/chest.js +220 -0
  654. package/dist/obj/chest.js.map +1 -0
  655. package/dist/obj/desc.d.ts +79 -0
  656. package/dist/obj/desc.d.ts.map +1 -0
  657. package/dist/obj/desc.js +602 -0
  658. package/dist/obj/desc.js.map +1 -0
  659. package/dist/obj/effects-info.d.ts +78 -0
  660. package/dist/obj/effects-info.d.ts.map +1 -0
  661. package/dist/obj/effects-info.js +240 -0
  662. package/dist/obj/effects-info.js.map +1 -0
  663. package/dist/obj/flavor.d.ts +68 -0
  664. package/dist/obj/flavor.d.ts.map +1 -0
  665. package/dist/obj/flavor.js +201 -0
  666. package/dist/obj/flavor.js.map +1 -0
  667. package/dist/obj/ignore.d.ts +143 -0
  668. package/dist/obj/ignore.d.ts.map +1 -0
  669. package/dist/obj/ignore.js +345 -0
  670. package/dist/obj/ignore.js.map +1 -0
  671. package/dist/obj/knowledge.d.ts +520 -0
  672. package/dist/obj/knowledge.d.ts.map +1 -0
  673. package/dist/obj/knowledge.js +1364 -0
  674. package/dist/obj/knowledge.js.map +1 -0
  675. package/dist/obj/known-object.d.ts +293 -0
  676. package/dist/obj/known-object.d.ts.map +1 -0
  677. package/dist/obj/known-object.js +532 -0
  678. package/dist/obj/known-object.js.map +1 -0
  679. package/dist/obj/make.d.ts +292 -0
  680. package/dist/obj/make.d.ts.map +1 -0
  681. package/dist/obj/make.js +1055 -0
  682. package/dist/obj/make.js.map +1 -0
  683. package/dist/obj/object-info.d.ts +188 -0
  684. package/dist/obj/object-info.d.ts.map +1 -0
  685. package/dist/obj/object-info.js +1407 -0
  686. package/dist/obj/object-info.js.map +1 -0
  687. package/dist/obj/object.d.ts +335 -0
  688. package/dist/obj/object.d.ts.map +1 -0
  689. package/dist/obj/object.js +1051 -0
  690. package/dist/obj/object.js.map +1 -0
  691. package/dist/obj/power.d.ts +65 -0
  692. package/dist/obj/power.d.ts.map +1 -0
  693. package/dist/obj/power.js +580 -0
  694. package/dist/obj/power.js.map +1 -0
  695. package/dist/obj/randart-build.d.ts +223 -0
  696. package/dist/obj/randart-build.d.ts.map +1 -0
  697. package/dist/obj/randart-build.js +1444 -0
  698. package/dist/obj/randart-build.js.map +1 -0
  699. package/dist/obj/randart-data.d.ts +179 -0
  700. package/dist/obj/randart-data.d.ts.map +1 -0
  701. package/dist/obj/randart-data.js +1153 -0
  702. package/dist/obj/randart-data.js.map +1 -0
  703. package/dist/obj/randart.d.ts +128 -0
  704. package/dist/obj/randart.d.ts.map +1 -0
  705. package/dist/obj/randart.js +458 -0
  706. package/dist/obj/randart.js.map +1 -0
  707. package/dist/obj/randname.d.ts +33 -0
  708. package/dist/obj/randname.d.ts.map +1 -0
  709. package/dist/obj/randname.js +116 -0
  710. package/dist/obj/randname.js.map +1 -0
  711. package/dist/obj/recharge.d.ts +28 -0
  712. package/dist/obj/recharge.d.ts.map +1 -0
  713. package/dist/obj/recharge.js +52 -0
  714. package/dist/obj/recharge.js.map +1 -0
  715. package/dist/obj/types.d.ts +584 -0
  716. package/dist/obj/types.d.ts.map +1 -0
  717. package/dist/obj/types.js +104 -0
  718. package/dist/obj/types.js.map +1 -0
  719. package/dist/obj/value.d.ts +64 -0
  720. package/dist/obj/value.d.ts.map +1 -0
  721. package/dist/obj/value.js +176 -0
  722. package/dist/obj/value.js.map +1 -0
  723. package/dist/player/abilities.d.ts +57 -0
  724. package/dist/player/abilities.d.ts.map +1 -0
  725. package/dist/player/abilities.js +118 -0
  726. package/dist/player/abilities.js.map +1 -0
  727. package/dist/player/best-digger.d.ts +42 -0
  728. package/dist/player/best-digger.d.ts.map +1 -0
  729. package/dist/player/best-digger.js +89 -0
  730. package/dist/player/best-digger.js.map +1 -0
  731. package/dist/player/bind.d.ts +270 -0
  732. package/dist/player/bind.d.ts.map +1 -0
  733. package/dist/player/bind.js +698 -0
  734. package/dist/player/bind.js.map +1 -0
  735. package/dist/player/birth.d.ts +258 -0
  736. package/dist/player/birth.d.ts.map +1 -0
  737. package/dist/player/birth.js +639 -0
  738. package/dist/player/birth.js.map +1 -0
  739. package/dist/player/calcs.d.ts +403 -0
  740. package/dist/player/calcs.d.ts.map +1 -0
  741. package/dist/player/calcs.js +1189 -0
  742. package/dist/player/calcs.js.map +1 -0
  743. package/dist/player/combat-regen.d.ts +14 -0
  744. package/dist/player/combat-regen.d.ts.map +1 -0
  745. package/dist/player/combat-regen.js +29 -0
  746. package/dist/player/combat-regen.js.map +1 -0
  747. package/dist/player/exp.d.ts +96 -0
  748. package/dist/player/exp.d.ts.map +1 -0
  749. package/dist/player/exp.js +229 -0
  750. package/dist/player/exp.js.map +1 -0
  751. package/dist/player/history.d.ts +91 -0
  752. package/dist/player/history.d.ts.map +1 -0
  753. package/dist/player/history.js +145 -0
  754. package/dist/player/history.js.map +1 -0
  755. package/dist/player/options.d.ts +123 -0
  756. package/dist/player/options.d.ts.map +1 -0
  757. package/dist/player/options.js +199 -0
  758. package/dist/player/options.js.map +1 -0
  759. package/dist/player/player.d.ts +242 -0
  760. package/dist/player/player.d.ts.map +1 -0
  761. package/dist/player/player.js +119 -0
  762. package/dist/player/player.js.map +1 -0
  763. package/dist/player/shape-lore.d.ts +56 -0
  764. package/dist/player/shape-lore.d.ts.map +1 -0
  765. package/dist/player/shape-lore.js +221 -0
  766. package/dist/player/shape-lore.js.map +1 -0
  767. package/dist/player/spell.d.ts +146 -0
  768. package/dist/player/spell.d.ts.map +1 -0
  769. package/dist/player/spell.js +519 -0
  770. package/dist/player/spell.js.map +1 -0
  771. package/dist/player/take-hit.d.ts +87 -0
  772. package/dist/player/take-hit.d.ts.map +1 -0
  773. package/dist/player/take-hit.js +99 -0
  774. package/dist/player/take-hit.js.map +1 -0
  775. package/dist/player/timed.d.ts +205 -0
  776. package/dist/player/timed.d.ts.map +1 -0
  777. package/dist/player/timed.js +310 -0
  778. package/dist/player/timed.js.map +1 -0
  779. package/dist/player/types.d.ts +390 -0
  780. package/dist/player/types.d.ts.map +1 -0
  781. package/dist/player/types.js +51 -0
  782. package/dist/player/types.js.map +1 -0
  783. package/dist/rational.d.ts +99 -0
  784. package/dist/rational.d.ts.map +1 -0
  785. package/dist/rational.js +345 -0
  786. package/dist/rational.js.map +1 -0
  787. package/dist/rng.d.ts +168 -0
  788. package/dist/rng.d.ts.map +1 -0
  789. package/dist/rng.js +404 -0
  790. package/dist/rng.js.map +1 -0
  791. package/dist/save/buffer.d.ts +120 -0
  792. package/dist/save/buffer.d.ts.map +1 -0
  793. package/dist/save/buffer.js +238 -0
  794. package/dist/save/buffer.js.map +1 -0
  795. package/dist/save/compress.d.ts +79 -0
  796. package/dist/save/compress.d.ts.map +1 -0
  797. package/dist/save/compress.js +97 -0
  798. package/dist/save/compress.js.map +1 -0
  799. package/dist/save/description.d.ts +61 -0
  800. package/dist/save/description.d.ts.map +1 -0
  801. package/dist/save/description.js +51 -0
  802. package/dist/save/description.js.map +1 -0
  803. package/dist/save/integrity.d.ts +59 -0
  804. package/dist/save/integrity.d.ts.map +1 -0
  805. package/dist/save/integrity.js +103 -0
  806. package/dist/save/integrity.js.map +1 -0
  807. package/dist/score/display.d.ts +40 -0
  808. package/dist/score/display.d.ts.map +1 -0
  809. package/dist/score/display.js +86 -0
  810. package/dist/score/display.js.map +1 -0
  811. package/dist/score/score.d.ts +166 -0
  812. package/dist/score/score.d.ts.map +1 -0
  813. package/dist/score/score.js +244 -0
  814. package/dist/score/score.js.map +1 -0
  815. package/dist/score/types.d.ts +98 -0
  816. package/dist/score/types.d.ts.map +1 -0
  817. package/dist/score/types.js +27 -0
  818. package/dist/score/types.js.map +1 -0
  819. package/dist/session/boot.d.ts +207 -0
  820. package/dist/session/boot.d.ts.map +1 -0
  821. package/dist/session/boot.js +151 -0
  822. package/dist/session/boot.js.map +1 -0
  823. package/dist/session/game.d.ts +257 -0
  824. package/dist/session/game.d.ts.map +1 -0
  825. package/dist/session/game.js +2880 -0
  826. package/dist/session/game.js.map +1 -0
  827. package/dist/session/save.d.ts +847 -0
  828. package/dist/session/save.d.ts.map +1 -0
  829. package/dist/session/save.js +1306 -0
  830. package/dist/session/save.js.map +1 -0
  831. package/dist/sound/engine.d.ts +146 -0
  832. package/dist/sound/engine.d.ts.map +1 -0
  833. package/dist/sound/engine.js +332 -0
  834. package/dist/sound/engine.js.map +1 -0
  835. package/dist/sound/index.d.ts +13 -0
  836. package/dist/sound/index.d.ts.map +1 -0
  837. package/dist/sound/index.js +13 -0
  838. package/dist/sound/index.js.map +1 -0
  839. package/dist/sound/sound-prefs-data.d.ts +10 -0
  840. package/dist/sound/sound-prefs-data.d.ts.map +1 -0
  841. package/dist/sound/sound-prefs-data.js +165 -0
  842. package/dist/sound/sound-prefs-data.js.map +1 -0
  843. package/dist/sound/types.d.ts +64 -0
  844. package/dist/sound/types.d.ts.map +1 -0
  845. package/dist/sound/types.js +23 -0
  846. package/dist/sound/types.js.map +1 -0
  847. package/dist/store/bind.d.ts +43 -0
  848. package/dist/store/bind.d.ts.map +1 -0
  849. package/dist/store/bind.js +130 -0
  850. package/dist/store/bind.js.map +1 -0
  851. package/dist/store/price.d.ts +27 -0
  852. package/dist/store/price.d.ts.map +1 -0
  853. package/dist/store/price.js +81 -0
  854. package/dist/store/price.js.map +1 -0
  855. package/dist/store/store-cmd.d.ts +51 -0
  856. package/dist/store/store-cmd.d.ts.map +1 -0
  857. package/dist/store/store-cmd.js +73 -0
  858. package/dist/store/store-cmd.js.map +1 -0
  859. package/dist/store/store.d.ts +156 -0
  860. package/dist/store/store.d.ts.map +1 -0
  861. package/dist/store/store.js +616 -0
  862. package/dist/store/store.js.map +1 -0
  863. package/dist/store/transact.d.ts +198 -0
  864. package/dist/store/transact.d.ts.map +1 -0
  865. package/dist/store/transact.js +383 -0
  866. package/dist/store/transact.js.map +1 -0
  867. package/dist/store/types.d.ts +101 -0
  868. package/dist/store/types.d.ts.map +1 -0
  869. package/dist/store/types.js +14 -0
  870. package/dist/store/types.js.map +1 -0
  871. package/dist/version.d.ts +25 -0
  872. package/dist/version.d.ts.map +1 -0
  873. package/dist/version.js +25 -0
  874. package/dist/version.js.map +1 -0
  875. package/dist/visuals/engine.d.ts +223 -0
  876. package/dist/visuals/engine.d.ts.map +1 -0
  877. package/dist/visuals/engine.js +357 -0
  878. package/dist/visuals/engine.js.map +1 -0
  879. package/dist/visuals/glyph-table.d.ts +112 -0
  880. package/dist/visuals/glyph-table.d.ts.map +1 -0
  881. package/dist/visuals/glyph-table.js +156 -0
  882. package/dist/visuals/glyph-table.js.map +1 -0
  883. package/dist/visuals/grafmode-data.d.ts +4 -0
  884. package/dist/visuals/grafmode-data.d.ts.map +1 -0
  885. package/dist/visuals/grafmode-data.js +88 -0
  886. package/dist/visuals/grafmode-data.js.map +1 -0
  887. package/dist/visuals/grafmode.d.ts +83 -0
  888. package/dist/visuals/grafmode.d.ts.map +1 -0
  889. package/dist/visuals/grafmode.js +82 -0
  890. package/dist/visuals/grafmode.js.map +1 -0
  891. package/dist/visuals/index.d.ts +19 -0
  892. package/dist/visuals/index.d.ts.map +1 -0
  893. package/dist/visuals/index.js +19 -0
  894. package/dist/visuals/index.js.map +1 -0
  895. package/dist/visuals/map-text.d.ts +79 -0
  896. package/dist/visuals/map-text.d.ts.map +1 -0
  897. package/dist/visuals/map-text.js +122 -0
  898. package/dist/visuals/map-text.js.map +1 -0
  899. package/dist/visuals/pref-expr.d.ts +56 -0
  900. package/dist/visuals/pref-expr.d.ts.map +1 -0
  901. package/dist/visuals/pref-expr.js +173 -0
  902. package/dist/visuals/pref-expr.js.map +1 -0
  903. package/dist/visuals/prefs.d.ts +280 -0
  904. package/dist/visuals/prefs.d.ts.map +1 -0
  905. package/dist/visuals/prefs.js +835 -0
  906. package/dist/visuals/prefs.js.map +1 -0
  907. package/dist/visuals/tile-prefs.d.ts +132 -0
  908. package/dist/visuals/tile-prefs.d.ts.map +1 -0
  909. package/dist/visuals/tile-prefs.js +105 -0
  910. package/dist/visuals/tile-prefs.js.map +1 -0
  911. package/dist/world/chunk.d.ts +195 -0
  912. package/dist/world/chunk.d.ts.map +1 -0
  913. package/dist/world/chunk.js +422 -0
  914. package/dist/world/chunk.js.map +1 -0
  915. package/dist/world/feature.d.ts +86 -0
  916. package/dist/world/feature.d.ts.map +1 -0
  917. package/dist/world/feature.js +153 -0
  918. package/dist/world/feature.js.map +1 -0
  919. package/dist/world/flow.d.ts +33 -0
  920. package/dist/world/flow.d.ts.map +1 -0
  921. package/dist/world/flow.js +115 -0
  922. package/dist/world/flow.js.map +1 -0
  923. package/dist/world/project.d.ts +176 -0
  924. package/dist/world/project.d.ts.map +1 -0
  925. package/dist/world/project.js +543 -0
  926. package/dist/world/project.js.map +1 -0
  927. package/dist/world/projection.d.ts +100 -0
  928. package/dist/world/projection.d.ts.map +1 -0
  929. package/dist/world/projection.js +152 -0
  930. package/dist/world/projection.js.map +1 -0
  931. package/dist/world/scatter.d.ts +25 -0
  932. package/dist/world/scatter.d.ts.map +1 -0
  933. package/dist/world/scatter.js +54 -0
  934. package/dist/world/scatter.js.map +1 -0
  935. package/dist/world/trap.d.ts +84 -0
  936. package/dist/world/trap.d.ts.map +1 -0
  937. package/dist/world/trap.js +106 -0
  938. package/dist/world/trap.js.map +1 -0
  939. package/dist/world/view.d.ts +60 -0
  940. package/dist/world/view.d.ts.map +1 -0
  941. package/dist/world/view.js +436 -0
  942. package/dist/world/view.js.map +1 -0
  943. package/dist/z-queue.d.ts +133 -0
  944. package/dist/z-queue.d.ts.map +1 -0
  945. package/dist/z-queue.js +283 -0
  946. package/dist/z-queue.js.map +1 -0
  947. package/package.json +75 -0
  948. package/src/agent/act.ts +114 -0
  949. package/src/agent/controller.ts +109 -0
  950. package/src/agent/events.ts +47 -0
  951. package/src/agent/index.ts +36 -0
  952. package/src/agent/perceive.ts +440 -0
  953. package/src/agent/types.ts +464 -0
  954. package/src/bitflag.ts +536 -0
  955. package/src/cmd.ts +547 -0
  956. package/src/color.ts +267 -0
  957. package/src/combat/brand-slay.ts +360 -0
  958. package/src/combat/hit.ts +471 -0
  959. package/src/combat/index.ts +15 -0
  960. package/src/combat/melee.ts +728 -0
  961. package/src/combat/mon-melee.ts +1153 -0
  962. package/src/combat/ranged.ts +397 -0
  963. package/src/constants.ts +324 -0
  964. package/src/dice.ts +467 -0
  965. package/src/effects/effect-choice.ts +32 -0
  966. package/src/effects/effect-info.ts +859 -0
  967. package/src/effects/effect.ts +560 -0
  968. package/src/effects/handlers.ts +452 -0
  969. package/src/effects/interpreter.ts +603 -0
  970. package/src/events.ts +317 -0
  971. package/src/expression.ts +360 -0
  972. package/src/game/cave-cmd.ts +1147 -0
  973. package/src/game/char-sheet.ts +557 -0
  974. package/src/game/chest.ts +348 -0
  975. package/src/game/context.ts +1218 -0
  976. package/src/game/curse-tick.ts +130 -0
  977. package/src/game/describe.ts +62 -0
  978. package/src/game/display.ts +838 -0
  979. package/src/game/dump-level.ts +114 -0
  980. package/src/game/effect-attack.ts +746 -0
  981. package/src/game/effect-detect.ts +542 -0
  982. package/src/game/effect-env.ts +252 -0
  983. package/src/game/effect-game-env.ts +86 -0
  984. package/src/game/effect-general.ts +1122 -0
  985. package/src/game/effect-item.ts +999 -0
  986. package/src/game/effect-melee.ts +557 -0
  987. package/src/game/effect-mon-origin.ts +196 -0
  988. package/src/game/effect-monster.ts +310 -0
  989. package/src/game/effect-summon.ts +161 -0
  990. package/src/game/effect-teleport.ts +645 -0
  991. package/src/game/effect-terrain.ts +881 -0
  992. package/src/game/energy.ts +61 -0
  993. package/src/game/equip-cmp.ts +476 -0
  994. package/src/game/floor.ts +524 -0
  995. package/src/game/gear.ts +1352 -0
  996. package/src/game/harness.ts +270 -0
  997. package/src/game/history.ts +78 -0
  998. package/src/game/ignore-cmd.ts +68 -0
  999. package/src/game/inscription-confirm.ts +115 -0
  1000. package/src/game/known.ts +960 -0
  1001. package/src/game/loop.ts +671 -0
  1002. package/src/game/lore-color.ts +108 -0
  1003. package/src/game/mon-cast.ts +409 -0
  1004. package/src/game/mon-cmd.ts +767 -0
  1005. package/src/game/mon-death.ts +459 -0
  1006. package/src/game/mon-group.ts +368 -0
  1007. package/src/game/mon-list.ts +213 -0
  1008. package/src/game/mon-message.ts +359 -0
  1009. package/src/game/mon-place.ts +1012 -0
  1010. package/src/game/mon-ranged.ts +405 -0
  1011. package/src/game/mon-shape.ts +161 -0
  1012. package/src/game/mon-side.ts +511 -0
  1013. package/src/game/monster-turn.ts +1750 -0
  1014. package/src/game/obj-cmd.ts +1970 -0
  1015. package/src/game/obj-list.ts +302 -0
  1016. package/src/game/object-inspect.ts +162 -0
  1017. package/src/game/pickup.ts +483 -0
  1018. package/src/game/player-path.ts +1434 -0
  1019. package/src/game/player-side.ts +555 -0
  1020. package/src/game/player-turn.ts +852 -0
  1021. package/src/game/project-cast.ts +766 -0
  1022. package/src/game/project-feat.ts +386 -0
  1023. package/src/game/project-monster.ts +407 -0
  1024. package/src/game/project-obj.ts +298 -0
  1025. package/src/game/project-player.ts +236 -0
  1026. package/src/game/quest.ts +248 -0
  1027. package/src/game/ranged-cmd.ts +417 -0
  1028. package/src/game/scheduler.ts +150 -0
  1029. package/src/game/spell-cmd.ts +404 -0
  1030. package/src/game/spoil.ts +562 -0
  1031. package/src/game/steal.ts +169 -0
  1032. package/src/game/take-hit-hooks.ts +152 -0
  1033. package/src/game/target-loop.ts +501 -0
  1034. package/src/game/target.ts +424 -0
  1035. package/src/game/thrust.ts +174 -0
  1036. package/src/game/trap.ts +791 -0
  1037. package/src/game/ui-entry.ts +2075 -0
  1038. package/src/game/wizard.ts +1760 -0
  1039. package/src/game/world.ts +786 -0
  1040. package/src/gen/cave.ts +2858 -0
  1041. package/src/gen/gen-monster.ts +592 -0
  1042. package/src/gen/generate.ts +523 -0
  1043. package/src/gen/room.ts +2213 -0
  1044. package/src/gen/util.ts +1958 -0
  1045. package/src/generated/dun-profiles.ts +30 -0
  1046. package/src/generated/effects.ts +241 -0
  1047. package/src/generated/elements.ts +62 -0
  1048. package/src/generated/equip-slots.ts +36 -0
  1049. package/src/generated/history-types.ts +34 -0
  1050. package/src/generated/ignore-types.ts +66 -0
  1051. package/src/generated/index.ts +33 -0
  1052. package/src/generated/kind-flags.ts +44 -0
  1053. package/src/generated/message.ts +320 -0
  1054. package/src/generated/mon-message.ts +138 -0
  1055. package/src/generated/mon-race-flags.ts +182 -0
  1056. package/src/generated/mon-spells.ts +198 -0
  1057. package/src/generated/mon-temp-flags.ts +34 -0
  1058. package/src/generated/mon-timed.ts +34 -0
  1059. package/src/generated/object-flags.ts +95 -0
  1060. package/src/generated/object-modifiers.ts +43 -0
  1061. package/src/generated/options.ts +104 -0
  1062. package/src/generated/origins.ts +64 -0
  1063. package/src/generated/parser-errors.ts +140 -0
  1064. package/src/generated/player-flags.ts +48 -0
  1065. package/src/generated/player-timed.ts +118 -0
  1066. package/src/generated/projections.ts +103 -0
  1067. package/src/generated/randart-properties.ts +202 -0
  1068. package/src/generated/room-flags.ts +21 -0
  1069. package/src/generated/rooms.ts +50 -0
  1070. package/src/generated/square-flags.ts +56 -0
  1071. package/src/generated/stats.ts +22 -0
  1072. package/src/generated/terrain-flags.ts +76 -0
  1073. package/src/generated/terrain.ts +62 -0
  1074. package/src/generated/trap-flags.ts +42 -0
  1075. package/src/generated/tvals.ts +84 -0
  1076. package/src/generated/ui-entry-renderers.ts +24 -0
  1077. package/src/guard.ts +70 -0
  1078. package/src/host/args.ts +334 -0
  1079. package/src/host/bridge.ts +193 -0
  1080. package/src/host/index.ts +18 -0
  1081. package/src/host/io.ts +239 -0
  1082. package/src/host/memory.ts +134 -0
  1083. package/src/host/raw.ts +190 -0
  1084. package/src/index.ts +250 -0
  1085. package/src/loc.ts +157 -0
  1086. package/src/mod/hooks.ts +278 -0
  1087. package/src/mod/ids.ts +390 -0
  1088. package/src/mod/registry-host.ts +258 -0
  1089. package/src/mod/save-blocks.ts +787 -0
  1090. package/src/mod/vocabulary.ts +0 -0
  1091. package/src/mon/bind.ts +899 -0
  1092. package/src/mon/desc.ts +212 -0
  1093. package/src/mon/knowledge-groups.ts +164 -0
  1094. package/src/mon/lore-describe.ts +1414 -0
  1095. package/src/mon/lore.ts +306 -0
  1096. package/src/mon/make.ts +422 -0
  1097. package/src/mon/monster.ts +161 -0
  1098. package/src/mon/predicate.ts +220 -0
  1099. package/src/mon/project-mon.ts +855 -0
  1100. package/src/mon/spell.ts +418 -0
  1101. package/src/mon/steal.ts +246 -0
  1102. package/src/mon/summon.ts +145 -0
  1103. package/src/mon/take-hit.ts +195 -0
  1104. package/src/mon/timed.ts +300 -0
  1105. package/src/mon/types.ts +286 -0
  1106. package/src/msg.ts +146 -0
  1107. package/src/obj/artifact-fake.ts +63 -0
  1108. package/src/obj/artifact-known.ts +69 -0
  1109. package/src/obj/bind.ts +1345 -0
  1110. package/src/obj/chest.ts +249 -0
  1111. package/src/obj/desc.ts +699 -0
  1112. package/src/obj/effects-info.ts +349 -0
  1113. package/src/obj/flavor.ts +256 -0
  1114. package/src/obj/ignore.ts +387 -0
  1115. package/src/obj/knowledge.ts +1577 -0
  1116. package/src/obj/known-object.ts +718 -0
  1117. package/src/obj/make.ts +1367 -0
  1118. package/src/obj/object-info.ts +1737 -0
  1119. package/src/obj/object.ts +1296 -0
  1120. package/src/obj/power.ts +674 -0
  1121. package/src/obj/randart-build.ts +1705 -0
  1122. package/src/obj/randart-data.ts +1344 -0
  1123. package/src/obj/randart.ts +552 -0
  1124. package/src/obj/randname.ts +128 -0
  1125. package/src/obj/recharge.ts +62 -0
  1126. package/src/obj/types.ts +559 -0
  1127. package/src/obj/value.ts +215 -0
  1128. package/src/player/abilities.ts +142 -0
  1129. package/src/player/best-digger.ts +118 -0
  1130. package/src/player/bind.ts +1021 -0
  1131. package/src/player/birth.ts +794 -0
  1132. package/src/player/calcs.ts +1522 -0
  1133. package/src/player/combat-regen.ts +33 -0
  1134. package/src/player/exp.ts +275 -0
  1135. package/src/player/history.ts +211 -0
  1136. package/src/player/options.ts +244 -0
  1137. package/src/player/player.ts +356 -0
  1138. package/src/player/shape-lore.ts +250 -0
  1139. package/src/player/spell.ts +627 -0
  1140. package/src/player/take-hit.ts +173 -0
  1141. package/src/player/timed.ts +482 -0
  1142. package/src/player/types.ts +415 -0
  1143. package/src/rational.ts +388 -0
  1144. package/src/rng.ts +476 -0
  1145. package/src/save/buffer.ts +287 -0
  1146. package/src/save/compress.ts +132 -0
  1147. package/src/save/description.ts +70 -0
  1148. package/src/save/integrity.ts +133 -0
  1149. package/src/score/display.ts +125 -0
  1150. package/src/score/score.ts +341 -0
  1151. package/src/score/types.ts +104 -0
  1152. package/src/session/boot.ts +338 -0
  1153. package/src/session/game.ts +3712 -0
  1154. package/src/session/save.ts +2074 -0
  1155. package/src/sound/engine.ts +375 -0
  1156. package/src/sound/index.ts +13 -0
  1157. package/src/sound/sound-prefs-data.ts +173 -0
  1158. package/src/sound/types.ts +68 -0
  1159. package/src/store/bind.ts +145 -0
  1160. package/src/store/price.ts +97 -0
  1161. package/src/store/store-cmd.ts +73 -0
  1162. package/src/store/store.ts +723 -0
  1163. package/src/store/transact.ts +644 -0
  1164. package/src/store/types.ts +110 -0
  1165. package/src/version.ts +26 -0
  1166. package/src/visuals/engine.ts +444 -0
  1167. package/src/visuals/glyph-table.ts +191 -0
  1168. package/src/visuals/grafmode-data.ts +90 -0
  1169. package/src/visuals/grafmode.ts +123 -0
  1170. package/src/visuals/index.ts +19 -0
  1171. package/src/visuals/map-text.ts +152 -0
  1172. package/src/visuals/pref-expr.ts +182 -0
  1173. package/src/visuals/prefs.ts +981 -0
  1174. package/src/visuals/tile-prefs.ts +183 -0
  1175. package/src/world/chunk.ts +531 -0
  1176. package/src/world/feature.ts +215 -0
  1177. package/src/world/flow.ts +128 -0
  1178. package/src/world/project.ts +687 -0
  1179. package/src/world/projection.ts +228 -0
  1180. package/src/world/scatter.ts +72 -0
  1181. package/src/world/trap.ts +155 -0
  1182. package/src/world/view.ts +513 -0
  1183. package/src/z-queue.ts +300 -0
@@ -0,0 +1,1345 @@
1
+ /**
2
+ * Object registries: binding the compiled pack JSON into typed data,
3
+ * ported from reference/src/obj-init.c (all the object-domain parsers and
4
+ * their finish steps), datafile.c (grab_flag, grab_rand_value,
5
+ * grab_int_value, grab_index_and_int, grab_int_range, grab_element_flag),
6
+ * obj-tval.c (tval_find_idx), obj-util.c (lookup_kind, lookup_sval), and
7
+ * obj-desc.c (obj_desc_name_format, used for sval name matching).
8
+ *
9
+ * Ordering follows upstream init_arrays: bases, slays, brands, curses,
10
+ * objects, activations, egos, artifacts, properties, flavors. Faithful
11
+ * index quirks are kept: kinds/egos are 0-based in file order
12
+ * (kidx/eidx), artifacts and object properties are 1-based in file
13
+ * order, while slays, brands, curses, and activations are 1-based in
14
+ * REVERSE file order (upstream walks the prepended parse list from its
15
+ * head while counting up).
16
+ *
17
+ * Sval assignment mirrors parse_object_type: each kind bumps its base's
18
+ * num_svals as its type: line is bound, in file order, and takes that
19
+ * count as its sval. Special artifacts whose base-object sval does not
20
+ * exist get a dummy kind appended (write_dummy_object_record) with
21
+ * KF_INSTA_ART, inheriting the base's flags; its level is 0 at creation
22
+ * time because upstream reads art->level before the level: line has been
23
+ * parsed.
24
+ *
25
+ * MODDABILITY (ratified pillar): every bind step is driven purely by the
26
+ * record arrays passed in; appending extra records in the same compiled
27
+ * shape (new kinds, egos, artifacts, curses, ...) binds them exactly like
28
+ * pack data.
29
+ */
30
+
31
+ import { FlagSet } from "../bitflag.js";
32
+ import { Dice } from "../dice.js";
33
+ import {
34
+ ELEMENT_ENTRIES,
35
+ KF,
36
+ OBJECT_MODIFIER_ENTRIES,
37
+ OF,
38
+ RF,
39
+ STAT_ENTRIES,
40
+ TV,
41
+ TVAL_ENTRIES,
42
+ } from "../generated/index.js";
43
+ import type { RandomValue } from "../rng.js";
44
+ import type {
45
+ Activation,
46
+ ActivationRecordJson,
47
+ Artifact,
48
+ ArtifactRecordJson,
49
+ Brand,
50
+ BrandRecordJson,
51
+ Curse,
52
+ CurseRecordJson,
53
+ EffectRecordJson,
54
+ EgoItem,
55
+ EgoRecordJson,
56
+ ElementInfo,
57
+ Flavor,
58
+ FlavorRecordJson,
59
+ ObjectBase,
60
+ ObjectBaseRecordJson,
61
+ ObjectKind,
62
+ ObjectKindRecordJson,
63
+ ObjectProperty,
64
+ ObjectPropertyRecordJson,
65
+ ObjPackJson,
66
+ Slay,
67
+ } from "./types.js";
68
+ import {
69
+ EL_INFO_HATES,
70
+ EL_INFO_IGNORE,
71
+ ELEM_BASE_MIN,
72
+ ELEM_HIGH_MIN,
73
+ newElemInfo,
74
+ newKfFlags,
75
+ newModifiersRv,
76
+ newOfFlags,
77
+ NO_MINIMUM,
78
+ OBJ_MOD_MAX,
79
+ OBJ_PROPERTY,
80
+ OFID,
81
+ OFT,
82
+ SV_UNKNOWN,
83
+ TV_MAX,
84
+ zeroRv,
85
+ } from "./types.js";
86
+
87
+ /* ------------------------------------------------------------------ */
88
+ /* Name tables (the C string arrays built from the list headers) */
89
+ /* ------------------------------------------------------------------ */
90
+
91
+ /** obj_mods[]: the five stats then the object modifiers, index = value. */
92
+ export const OBJ_MOD_NAMES: readonly string[] = [
93
+ ...STAT_ENTRIES.map((e) => e.name),
94
+ ...OBJECT_MODIFIER_ENTRIES.map((e) => e.name),
95
+ ];
96
+
97
+ /** element_names[]: index = ELEM value. */
98
+ export const ELEMENT_NAMES: readonly string[] = ELEMENT_ENTRIES.map(
99
+ (e) => e.name,
100
+ );
101
+
102
+ /* ------------------------------------------------------------------ */
103
+ /* datafile.c helpers */
104
+ /* ------------------------------------------------------------------ */
105
+
106
+ /**
107
+ * dice string or plain number -> RandomValue (parser_getrand / parse_random,
108
+ * parser.c:126-213).
109
+ *
110
+ * The negation is NOT dice negation, and getting it wrong is a live gameplay
111
+ * divergence. `parse_random` strips a leading '-', parses the remainder as a
112
+ * POSITIVE value, and only then adjusts (parser.c:207-211):
113
+ *
114
+ * base *= -1; base -= m_bonus; base -= dice * (sides + 1);
115
+ *
116
+ * with the reason stated there: "the random components are always positive, so
117
+ * the base must be adjusted as necessary". The base is shifted down far enough
118
+ * that `base + XdY` spans the NEGATION of the positive interval.
119
+ * Dice.parseString instead binds the '-' to the base token alone, which leaves
120
+ * the random part pointing the wrong way.
121
+ *
122
+ * Reachable in shipped 4.2.6 data: ego_item.txt:692, "of Backbiting", carries
123
+ * `combat:-26+d25:-26+d25:0`. Upstream yields base -52, dice 1, sides 25, i.e.
124
+ * to_h/to_d in -51..-27; binding the sign to the base alone yields -26 + 1d25,
125
+ * i.e. -25..-1, an ego roughly half as punishing as upstream's.
126
+ */
127
+ export function parseRand(value: string | number | undefined): RandomValue {
128
+ if (value === undefined) return zeroRv();
129
+ if (typeof value === "number") {
130
+ return { base: value, dice: 0, sides: 0, mBonus: 0 };
131
+ }
132
+ const negative = value.startsWith("-");
133
+ const body = negative ? value.slice(1) : value;
134
+ const dice = new Dice();
135
+ if (!dice.parseString(body)) {
136
+ throw new Error(`obj: invalid dice string "${value}"`);
137
+ }
138
+ const rv = dice.randomValue();
139
+ if (!negative) return rv;
140
+ return {
141
+ ...rv,
142
+ base: -rv.base - rv.mBonus - rv.dice * (rv.sides + 1),
143
+ };
144
+ }
145
+
146
+ /**
147
+ * grab_int_range with sep "to": "10 to 100" -> [10, 100] (datafile.c:320-372).
148
+ *
149
+ * Both endpoints are rejected at INT_MIN and INT_MAX inclusive, not merely
150
+ * outside them. That is deliberate upstream and the C says why at :328-331:
151
+ * "Reject INT_MIN and INT_MAX as well so don't have to check errno in order to
152
+ * recognize overflow when sizeof(int) == sizeof(long)". A value that saturated
153
+ * strtol is indistinguishable from one that legitimately equals the limit, so
154
+ * upstream refuses both rather than guess. Reproducing that means the port
155
+ * rejects the same three forms of k-info.c's test_alloc_bad0 that it used to
156
+ * accept (findings/W3-UNIT-TESTS-parse.md, D2).
157
+ */
158
+ const INT_MIN = -2147483648;
159
+ const INT_MAX = 2147483647;
160
+
161
+ export function grabIntRange(range: string): [number, number] {
162
+ const m = /^\s*(-?\d+)\s+to\s+(-?\d+)\s*$/.exec(range);
163
+ if (!m) throw new Error(`obj: invalid allocation range "${range}"`);
164
+ const lo = Number(m[1]);
165
+ const hi = Number(m[2]);
166
+ for (const v of [lo, hi]) {
167
+ if (v <= INT_MIN || v >= INT_MAX) {
168
+ throw new Error(
169
+ `obj: allocation range endpoint ${v} is out of range in "${range}" ` +
170
+ `(datafile.c:328-333 rejects INT_MIN and INT_MAX inclusive)`,
171
+ );
172
+ }
173
+ }
174
+ return [lo, hi];
175
+ }
176
+
177
+ /**
178
+ * find_value_arg for the "NAME[...]" syntax: returns the name and the
179
+ * raw bracket text, or null when there is no bracket.
180
+ */
181
+ function findValueArg(token: string): { name: string; arg: string } | null {
182
+ const open = token.indexOf("[");
183
+ if (open < 0) return null;
184
+ const close = token.indexOf("]", open + 1);
185
+ if (close < 0) return null;
186
+ return { name: token.slice(0, open), arg: token.slice(open + 1, close) };
187
+ }
188
+
189
+ /**
190
+ * grab_rand_value: "STR[1d2]" -> parse the bracket as dice and store its
191
+ * random value at the name's index. Returns true when the name matched.
192
+ */
193
+ export function grabRandValue(
194
+ values: RandomValue[],
195
+ names: readonly string[],
196
+ token: string,
197
+ ): boolean {
198
+ const parsed = findValueArg(token);
199
+ if (!parsed) throw new Error(`obj: invalid value "${token}"`);
200
+ const i = names.indexOf(parsed.name);
201
+ if (i < 0) return false;
202
+ const dice = new Dice();
203
+ if (!dice.parseString(parsed.arg)) {
204
+ throw new Error(`obj: value "${token}" is not random`);
205
+ }
206
+ values[i] = dice.randomValue();
207
+ return true;
208
+ }
209
+
210
+ /**
211
+ * grab_int_value: "SPEED[10]" -> store the int at the name's index.
212
+ * Returns true when the name matched.
213
+ */
214
+ export function grabIntValue(
215
+ values: number[],
216
+ names: readonly string[],
217
+ token: string,
218
+ ): boolean {
219
+ const parsed = findValueArg(token);
220
+ if (!parsed) throw new Error(`obj: invalid value "${token}"`);
221
+ const i = names.indexOf(parsed.name);
222
+ if (i < 0) return false;
223
+ const m = /^\s*([-+]?\d+)\s*$/.exec(parsed.arg);
224
+ if (!m) throw new Error(`obj: invalid int value "${token}"`);
225
+ values[i] = Number(m[1]);
226
+ return true;
227
+ }
228
+
229
+ /**
230
+ * grab_index_and_int with a prefix: "RES_ACID[1]" against element names
231
+ * and prefix "RES_" -> { index, value }, or null when no name matches.
232
+ */
233
+ export function grabIndexAndInt(
234
+ names: readonly string[],
235
+ prefix: string,
236
+ token: string,
237
+ ): { index: number; value: number } | null {
238
+ const parsed = findValueArg(token);
239
+ if (!parsed) return null;
240
+ const m = /^\s*([-+]?\d+)\s*$/.exec(parsed.arg);
241
+ if (!m) return null;
242
+ for (let i = 0; i < names.length; i++) {
243
+ if (prefix + (names[i] as string) === parsed.name) {
244
+ return { index: i, value: Number(m[1]) };
245
+ }
246
+ }
247
+ return null;
248
+ }
249
+
250
+ /**
251
+ * grab_element_flag: "IGNORE_ACID" / "HATES_FIRE" -> set the EL_INFO
252
+ * bit on the named element. Returns true when handled.
253
+ */
254
+ export function grabElementFlag(
255
+ elInfo: ElementInfo[],
256
+ flagName: string,
257
+ ): boolean {
258
+ const under = flagName.indexOf("_");
259
+ if (under < 0) return false;
260
+ const prefix = flagName.slice(0, under);
261
+ const suffix = flagName.slice(under + 1);
262
+ const i = ELEMENT_NAMES.indexOf(suffix);
263
+ if (i < 0) return false;
264
+ const info = elInfo[i] as ElementInfo;
265
+ if (prefix === "IGNORE") {
266
+ info.flags |= EL_INFO_IGNORE;
267
+ return true;
268
+ }
269
+ if (prefix === "HATES") {
270
+ info.flags |= EL_INFO_HATES;
271
+ return true;
272
+ }
273
+ return false;
274
+ }
275
+
276
+ /**
277
+ * grab_flag against a NAME -> value map; returns true when matched.
278
+ * The `table[name]` probe is lookup_flag (datafile.c:149): the generated
279
+ * name->index records replace upstream's linear scan of a `const char **`
280
+ * table, and `undefined` / 0 is its FLAG_END miss.
281
+ */
282
+ function grabFlag(
283
+ flags: FlagSet,
284
+ table: Record<string, number>,
285
+ name: string,
286
+ ): boolean {
287
+ const value = table[name];
288
+ if (value === undefined || value === 0) return false;
289
+ flags.on(value);
290
+ return true;
291
+ }
292
+
293
+ /** Tokenize a flags/values line the way strtok(s, " |") does. */
294
+ function tokens(lines: string[] | undefined): string[] {
295
+ if (!lines) return [];
296
+ const out: string[] = [];
297
+ for (const line of lines) {
298
+ for (const tok of line.split(/[ |]+/)) {
299
+ if (tok.length > 0) out.push(tok);
300
+ }
301
+ }
302
+ return out;
303
+ }
304
+
305
+ /** string_append semantics: multi-line text concatenates directly. */
306
+ function joinLines(lines: string[] | undefined): string {
307
+ return lines ? lines.join("") : "";
308
+ }
309
+
310
+ /* ------------------------------------------------------------------ */
311
+ /* obj-tval.c */
312
+ /* ------------------------------------------------------------------ */
313
+
314
+ /** de_armour: "armour" -> "armor", truncating anything after it. */
315
+ function deArmour(name: string): string {
316
+ const at = name.indexOf("armour");
317
+ if (at < 0) return name;
318
+ return name.slice(0, at + 4) + "r";
319
+ }
320
+
321
+ /**
322
+ * tval_find_idx: the numeric tval of a textual tval name (or a numeric
323
+ * string), -1 when unknown.
324
+ */
325
+ export function tvalFindIdx(name: string): number {
326
+ const num = /^\s*(\d+)\s*$/.exec(name);
327
+ if (num) {
328
+ const r = Number(num[1]);
329
+ return r < TV_MAX ? r : -1;
330
+ }
331
+ const mod = deArmour(name).toLowerCase();
332
+ for (let i = 0; i < TVAL_ENTRIES.length; i++) {
333
+ if ((TVAL_ENTRIES[i] as { textName: string }).textName === mod) return i;
334
+ }
335
+ return -1;
336
+ }
337
+
338
+ /** tval_find_name: textual name for a numeric tval. */
339
+ export function tvalFindName(tval: number): string {
340
+ const e = TVAL_ENTRIES[tval];
341
+ return e ? e.textName : "unknown";
342
+ }
343
+
344
+ /* ------------------------------------------------------------------ */
345
+ /* obj-desc.c name formatting (for lookup_sval) */
346
+ /* ------------------------------------------------------------------ */
347
+
348
+ /**
349
+ * obj_desc_name_format with a null modstr: strips '&' (and spaces after
350
+ * it), drops '~' (singular), picks the singular side of "|sing|plur|".
351
+ */
352
+ export function objDescNameFormat(fmt: string): string {
353
+ let out = "";
354
+ let i = 0;
355
+ while (i < fmt.length) {
356
+ const c = fmt[i] as string;
357
+ if (c === "&") {
358
+ while (fmt[i] === " " || fmt[i] === "&") i++;
359
+ continue;
360
+ } else if (c === "~") {
361
+ i++;
362
+ continue;
363
+ } else if (c === "|") {
364
+ const plural = fmt.indexOf("|", i + 1);
365
+ const endmark = plural >= 0 ? fmt.indexOf("|", plural + 1) : -1;
366
+ if (plural < 0 || endmark < 0) return out;
367
+ out += fmt.slice(i + 1, plural);
368
+ i = endmark + 1;
369
+ continue;
370
+ } else {
371
+ out += c;
372
+ i++;
373
+ }
374
+ }
375
+ return out;
376
+ }
377
+
378
+ /* ------------------------------------------------------------------ */
379
+ /* The registry */
380
+ /* ------------------------------------------------------------------ */
381
+
382
+ function bindEffects(
383
+ records: EffectRecordJson[] | undefined,
384
+ ): EffectRecordJson[] | null {
385
+ return records && records.length > 0 ? records : null;
386
+ }
387
+
388
+ /**
389
+ * All object-domain registries, bound from the compiled pack JSON.
390
+ *
391
+ * Arrays with 1-based upstream indexing (slays, brands, curses,
392
+ * activations, artifacts, properties) keep a null at index 0.
393
+ */
394
+ export class ObjRegistry {
395
+ /** kb_info: bases indexed by tval (missing tvals get a default base). */
396
+ readonly bases: ObjectBase[] = [];
397
+ /** k_info in kidx order; ordinary kinds then INSTA_ART dummies. */
398
+ readonly kinds: ObjectKind[] = [];
399
+ /** Count of ordinary kinds (before artifact dummy kinds). */
400
+ ordinaryKindCount = 0;
401
+ /** e_info in eidx order. */
402
+ readonly egos: EgoItem[] = [];
403
+ /** a_info, 1-based (index 0 is null). */
404
+ readonly artifacts: (Artifact | null)[] = [null];
405
+ /** curses, 1-based, reverse file order (upstream quirk). */
406
+ readonly curses: (Curse | null)[] = [null];
407
+ /** brands, 1-based, reverse file order (upstream quirk). */
408
+ readonly brands: (Brand | null)[] = [null];
409
+ /** slays, 1-based, reverse file order (upstream quirk). */
410
+ readonly slays: (Slay | null)[] = [null];
411
+ /** activations, 1-based, reverse file order (upstream quirk). */
412
+ readonly activations: (Activation | null)[] = [null];
413
+ /** obj_properties, 1-based, file order. */
414
+ readonly properties: (ObjectProperty | null)[] = [null];
415
+ /** Flat flavor list in file order. */
416
+ readonly flavors: Flavor[] = [];
417
+
418
+ /* The generic object kinds resolved by finish_parse_artifact. */
419
+ unknownItemKind: ObjectKind | null = null;
420
+ unknownGoldKind: ObjectKind | null = null;
421
+ pileKind: ObjectKind | null = null;
422
+ curseObjectKind: ObjectKind | null = null;
423
+
424
+ /** z_info->brand_max (array length including the null slot). */
425
+ get brandMax(): number {
426
+ return this.brands.length;
427
+ }
428
+
429
+ /** z_info->slay_max. */
430
+ get slayMax(): number {
431
+ return this.slays.length;
432
+ }
433
+
434
+ /** z_info->curse_max. */
435
+ get curseMax(): number {
436
+ return this.curses.length;
437
+ }
438
+
439
+ constructor(pack: ObjPackJson) {
440
+ /* Upstream init_arrays order: bases, slays, brands, curses,
441
+ * objects, activations, egos, artifacts, properties, flavors. */
442
+ this.bindBases(pack.objectBase.records, pack.objectBase.header);
443
+ this.bindSlays(pack.slay.records);
444
+ this.bindBrands(pack.brand.records);
445
+ this.bindCurses(pack.curse.records);
446
+ this.bindKinds(pack.object.records);
447
+ this.bindActivations(pack.activation.records);
448
+ this.bindEgos(pack.egoItem.records);
449
+ this.bindArtifacts(pack.artifact.records);
450
+ this.bindProperties(pack.objectProperty.records);
451
+ this.bindFlavors(pack.flavor.records);
452
+ this.finish();
453
+ }
454
+
455
+ /* -------------------------------------------------------------- */
456
+
457
+ /** lookup_kind: kind by tval and sval, or null. */
458
+ lookupKind(tval: number, sval: number): ObjectKind | null {
459
+ for (const kind of this.kinds) {
460
+ if (kind.tval === tval && kind.sval === sval) return kind;
461
+ }
462
+ return null;
463
+ }
464
+
465
+ /** objkind_byid. */
466
+ kindByIdx(kidx: number): ObjectKind | null {
467
+ return this.kinds[kidx] ?? null;
468
+ }
469
+
470
+ /**
471
+ * lookup_sval: sval of the kind whose formatted name matches (case
472
+ * insensitively), or a numeric string passed through; -1 when unknown.
473
+ */
474
+ lookupSval(tval: number, name: string): number {
475
+ const num = /^\s*(\d+)\s*$/.exec(name);
476
+ if (num) return Number(num[1]);
477
+ const wanted = name.toLowerCase();
478
+ for (const kind of this.kinds) {
479
+ if (kind.tval !== tval || !kind.name) continue;
480
+ if (objDescNameFormat(kind.name).toLowerCase() === wanted) {
481
+ return kind.sval;
482
+ }
483
+ }
484
+ return -1;
485
+ }
486
+
487
+ /** lookup_curse: 1-based curse index by name, or 0. */
488
+ lookupCurse(name: string): number {
489
+ for (let i = 1; i < this.curses.length; i++) {
490
+ if ((this.curses[i] as Curse).name === name) return i;
491
+ }
492
+ return 0;
493
+ }
494
+
495
+ /** Brand index by code, or 0. */
496
+ lookupBrand(code: string): number {
497
+ for (let i = 1; i < this.brands.length; i++) {
498
+ if ((this.brands[i] as Brand).code === code) return i;
499
+ }
500
+ return 0;
501
+ }
502
+
503
+ /** Slay index by code, or 0. */
504
+ lookupSlay(code: string): number {
505
+ for (let i = 1; i < this.slays.length; i++) {
506
+ if ((this.slays[i] as Slay).code === code) return i;
507
+ }
508
+ return 0;
509
+ }
510
+
511
+ /** findact: activation by name, or null. */
512
+ findActivation(name: string): Activation | null {
513
+ for (let i = 1; i < this.activations.length; i++) {
514
+ const act = this.activations[i] as Activation;
515
+ if (act.name === name) return act;
516
+ }
517
+ return null;
518
+ }
519
+
520
+ /** Ego by exact name, or null (test/mod convenience). */
521
+ findEgo(name: string): EgoItem | null {
522
+ for (const ego of this.egos) {
523
+ if (ego.name === name) return ego;
524
+ }
525
+ return null;
526
+ }
527
+
528
+ /** Artifact by exact name, or null (test/mod convenience). */
529
+ findArtifact(name: string): Artifact | null {
530
+ for (let i = 1; i < this.artifacts.length; i++) {
531
+ const art = this.artifacts[i] as Artifact;
532
+ if (art.name === name) return art;
533
+ }
534
+ return null;
535
+ }
536
+
537
+ /**
538
+ * lookup_artifact_name (obj-util.c L520): the artifact whose name EQUALS
539
+ * `name`, else the first artifact whose name CONTAINS `name`
540
+ * case-insensitively (only when `name` is at least 3 characters). Backs the
541
+ * wizard-mode "Enter new artifact:" prompt's name branch (cmd-wizard.c L2798),
542
+ * so `narthanc` and `hanc` both resolve.
543
+ *
544
+ * Two upstream warts are reproduced deliberately:
545
+ * - the exact-match test runs inside the same loop, so an exact match on a
546
+ * LATER artifact still wins over an earlier substring match;
547
+ * - the close-match result is returned only when `a_idx > 0` (L540), so a
548
+ * substring hit at index 0 yields NULL. Here index 0 is the reserved null
549
+ * artifact, which makes the wart inert - but the `> 0` bound is kept.
550
+ */
551
+ lookupArtifactName(name: string): Artifact | null {
552
+ const needle = name.toUpperCase();
553
+ let aIdx = -1;
554
+ for (let i = 0; i < this.artifacts.length; i++) {
555
+ const art = this.artifacts[i];
556
+ if (!art) continue;
557
+ /* Test for equality. */
558
+ if (art.name === name) return art;
559
+ /* Test for close matches. */
560
+ if (name.length >= 3 && art.name.toUpperCase().includes(needle) && aIdx === -1) {
561
+ aIdx = i;
562
+ }
563
+ }
564
+ /* Return our best match (L540: strictly > 0). */
565
+ return aIdx > 0 ? (this.artifacts[aIdx] as Artifact) : null;
566
+ }
567
+
568
+ /**
569
+ * lookup_ego_item (obj-util.c L549): the ego of exactly this `name` that can
570
+ * be applied to the kind with `tval`/`sval`. Backs the wizard-mode "Enter ego
571
+ * item:" prompt's name branch (cmd-wizard.c L2752). Unlike the artifact
572
+ * lookup this is EXACT-name only, and an ego whose poss_items list does not
573
+ * hold the kind is skipped even when the name matches.
574
+ */
575
+ lookupEgoItem(name: string, tval: number, sval: number): EgoItem | null {
576
+ const kind = this.lookupKind(tval, sval);
577
+ if (!kind) return null;
578
+ for (const ego of this.egos) {
579
+ /* Reject nameless and wrong names. */
580
+ if (!ego.name) continue;
581
+ if (ego.name !== name) continue;
582
+ /* Check tval and sval. */
583
+ if (ego.possItems.has(kind.kidx)) return ego;
584
+ }
585
+ return null;
586
+ }
587
+
588
+ /* -------------------------------------------------------------- */
589
+ /* Binding */
590
+ /* -------------------------------------------------------------- */
591
+
592
+ private bindBases(
593
+ records: ObjectBaseRecordJson[],
594
+ header: { default?: Array<{ label: string; value: number }> } | undefined,
595
+ ): void {
596
+ let defBreak = 0;
597
+ let defMaxStack = 0;
598
+ for (const { label, value } of header?.default ?? []) {
599
+ if (label === "break-chance") defBreak = value;
600
+ else if (label === "max-stack") defMaxStack = value;
601
+ else throw new Error(`object_base: unknown default ${label}`);
602
+ }
603
+ /* kb_info is mem_zalloc'd for every tval; unlisted tvals stay
604
+ * zeroed (name "", flags empty, max_stack 0). */
605
+ for (let tval = 0; tval < TV_MAX; tval++) {
606
+ this.bases.push({
607
+ name: "",
608
+ tval,
609
+ attr: "",
610
+ flags: newOfFlags(),
611
+ kindFlags: newKfFlags(),
612
+ elInfo: newElemInfo(),
613
+ breakPerc: 0,
614
+ maxStack: 0,
615
+ numSvals: 0,
616
+ });
617
+ }
618
+ for (const rec of records) {
619
+ const tval = tvalFindIdx(rec.name.tval);
620
+ if (tval < 0) {
621
+ throw new Error(`object_base: unknown tval ${rec.name.tval}`);
622
+ }
623
+ const base = this.bases[tval] as ObjectBase;
624
+ base.name = rec.name.name ?? "";
625
+ base.attr = rec.graphics ?? "";
626
+ base.breakPerc = rec.break ?? defBreak;
627
+ base.maxStack = rec["max-stack"] ?? defMaxStack;
628
+ for (const tok of tokens(rec.flags)) {
629
+ const found =
630
+ grabFlag(base.flags, OF, tok) ||
631
+ grabFlag(base.kindFlags, KF, tok) ||
632
+ grabElementFlag(base.elInfo, tok);
633
+ if (!found) throw new Error(`object_base: invalid flag ${tok}`);
634
+ }
635
+ }
636
+ }
637
+
638
+ private bindSlays(records: SlayRecordJsonArray): void {
639
+ /* finish_parse_slay walks the prepended list: index 1 is the LAST
640
+ * record in the file. */
641
+ for (let r = records.length - 1; r >= 0; r--) {
642
+ const rec = records[r] as (typeof records)[number];
643
+ const raceFlag = rec["race-flag"]
644
+ ? ((RF as Record<string, number>)[rec["race-flag"]] ?? -1)
645
+ : 0;
646
+ if (raceFlag < 0) {
647
+ throw new Error(`slay: invalid race flag ${rec["race-flag"]}`);
648
+ }
649
+ this.slays.push({
650
+ index: this.slays.length,
651
+ code: rec.code,
652
+ name: rec.name ?? "",
653
+ base: rec.base ?? null,
654
+ meleeVerb: rec["melee-verb"] ?? "",
655
+ rangeVerb: rec["range-verb"] ?? "",
656
+ raceFlag,
657
+ multiplier: rec.multiplier ?? 0,
658
+ oMultiplier: rec["o-multiplier"] ?? 0,
659
+ power: rec.power ?? 0,
660
+ });
661
+ }
662
+ }
663
+
664
+ private bindBrands(records: BrandRecordJson[]): void {
665
+ for (let r = records.length - 1; r >= 0; r--) {
666
+ const rec = records[r] as BrandRecordJson;
667
+ const resolve = (name: string | undefined): number => {
668
+ if (!name) return 0;
669
+ const value = (RF as Record<string, number>)[name];
670
+ if (value === undefined) {
671
+ throw new Error(`brand: invalid race flag ${name}`);
672
+ }
673
+ return value;
674
+ };
675
+ this.brands.push({
676
+ index: this.brands.length,
677
+ code: rec.code,
678
+ name: rec.name ?? "",
679
+ verb: rec.verb ?? "",
680
+ resistFlag: resolve(rec["resist-flag"]),
681
+ vulnFlag: resolve(rec["vuln-flag"]),
682
+ multiplier: rec.multiplier ?? 0,
683
+ oMultiplier: rec["o-multiplier"] ?? 0,
684
+ power: rec.power ?? 0,
685
+ });
686
+ }
687
+ }
688
+
689
+ /**
690
+ * parse_curse_weight (obj-init.c) refuses an adjustment that will not fit in
691
+ * the int16_t it is stored in: `< -32768 || > 32767` is
692
+ * PARSE_ERROR_INVALID_VALUE (curse.c test_weight_bad0 plants 32769 and
693
+ * -32780). Negative-with-MULTIPLY_WEIGHT is a separate finalize-time check
694
+ * upstream and is not this one.
695
+ */
696
+ private static curseWeight(name: string, weight: number | undefined): number {
697
+ if (weight === undefined) return 0;
698
+ if (weight < -32768 || weight > 32767) {
699
+ throw new Error(
700
+ `curse: ${name}: weight ${String(weight)} does not fit in an int16 ` +
701
+ `(PARSE_ERROR_INVALID_VALUE)`,
702
+ );
703
+ }
704
+ return weight;
705
+ }
706
+
707
+ private bindCurses(records: CurseRecordJson[]): void {
708
+ for (let r = records.length - 1; r >= 0; r--) {
709
+ const rec = records[r] as CurseRecordJson;
710
+ const poss: boolean[] = new Array<boolean>(TV_MAX).fill(false);
711
+ for (const tvalName of rec.type ?? []) {
712
+ const tval = tvalFindIdx(tvalName);
713
+ if (tval < 0 || tval >= TV_MAX) {
714
+ throw new Error(`curse: unknown tval ${tvalName}`);
715
+ }
716
+ poss[tval] = true;
717
+ }
718
+ const objFlags = newOfFlags();
719
+ const elInfo = newElemInfo();
720
+ for (const tok of tokens(rec.flags)) {
721
+ const found =
722
+ grabFlag(objFlags, OF, tok) || grabElementFlag(elInfo, tok);
723
+ if (!found) throw new Error(`curse: invalid flag ${tok}`);
724
+ }
725
+ const modifiers = new Array<number>(OBJ_MOD_MAX).fill(0);
726
+ for (const tok of tokens(rec.values)) {
727
+ let found = false;
728
+ const mod = grabIndexAndInt(OBJ_MOD_NAMES, "", tok);
729
+ if (mod) {
730
+ modifiers[mod.index] = mod.value;
731
+ found = true;
732
+ }
733
+ const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
734
+ if (res) {
735
+ (elInfo[res.index] as ElementInfo).resLevel = res.value;
736
+ found = true;
737
+ }
738
+ if (!found) throw new Error(`curse: invalid value ${tok}`);
739
+ }
740
+ const conflictFlags = newOfFlags();
741
+ for (const tok of tokens(rec["conflict-flags"])) {
742
+ if (!grabFlag(conflictFlags, OF, tok)) {
743
+ throw new Error(`curse: invalid conflict flag ${tok}`);
744
+ }
745
+ }
746
+ /* parse_curse_conflict wraps every name in pipes. */
747
+ let conflict: string | null = null;
748
+ for (const name of rec.conflict ?? []) {
749
+ conflict = (conflict ?? "") + "|" + name + "|";
750
+ }
751
+ this.curses.push({
752
+ index: this.curses.length,
753
+ name: rec.name,
754
+ poss,
755
+ obj: {
756
+ weight: ObjRegistry.curseWeight(rec.name, rec.weight),
757
+ toH: rec.combat?.["to-h"] ?? 0,
758
+ toD: rec.combat?.["to-d"] ?? 0,
759
+ toA: rec.combat?.["to-a"] ?? 0,
760
+ flags: objFlags,
761
+ modifiers,
762
+ elInfo,
763
+ effect: bindEffects(rec.effect),
764
+ effectMsg: joinLines(rec.msg),
765
+ time: parseRand(rec.time),
766
+ },
767
+ conflict,
768
+ conflictFlags,
769
+ desc: joinLines(rec.desc),
770
+ });
771
+ }
772
+ }
773
+
774
+ private bindKinds(records: ObjectKindRecordJson[]): void {
775
+ for (const rec of records) {
776
+ const tval = tvalFindIdx(rec.type);
777
+ if (tval < 0) throw new Error(`object: unknown tval ${rec.type}`);
778
+ const base = this.bases[tval] as ObjectBase;
779
+ base.numSvals++;
780
+ const flags = newOfFlags();
781
+ const kindFlags = newKfFlags();
782
+ const elInfo = newElemInfo();
783
+ for (const tok of tokens(rec.flags)) {
784
+ const found =
785
+ grabFlag(flags, OF, tok) ||
786
+ grabFlag(kindFlags, KF, tok) ||
787
+ grabElementFlag(elInfo, tok);
788
+ if (!found) throw new Error(`object: invalid flag ${tok}`);
789
+ }
790
+ const modifiers = newModifiersRv();
791
+ for (const tok of tokens(rec.values)) {
792
+ let found = false;
793
+ if (grabRandValue(modifiers, OBJ_MOD_NAMES, tok)) found = true;
794
+ const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
795
+ if (res) {
796
+ (elInfo[res.index] as ElementInfo).resLevel = res.value;
797
+ found = true;
798
+ }
799
+ if (!found) throw new Error(`object: invalid value ${tok}`);
800
+ }
801
+ const hd = parseRand(rec.attack?.hd);
802
+ /*
803
+ * parse_object_pile (obj-init.c L1844-1845) plainly assigns
804
+ * gen_mult_prob and stack_size, so a record with two `pile:` lines
805
+ * keeps the LAST. object.txt:3678/3680 (Potion of Dragon Breath) is
806
+ * exactly that: `pile:100:1d2` then `pile:70:1d3`. Taking the first
807
+ * made it always generate as a pile of 1-2 instead of 70% of the time
808
+ * as a pile of 1-3 (k-info.c test_pile0).
809
+ */
810
+ const pile = rec.pile?.[rec.pile.length - 1];
811
+ const kind: ObjectKind = {
812
+ name: rec.name,
813
+ text: joinLines(rec.desc),
814
+ base,
815
+ kidx: this.kinds.length,
816
+ tval,
817
+ sval: base.numSvals,
818
+ pval: parseRand(rec.pval),
819
+ toH: parseRand(rec.attack?.["to-h"]),
820
+ toD: parseRand(rec.attack?.["to-d"]),
821
+ toA: parseRand(rec.armor?.["to-a"]),
822
+ ac: rec.armor?.ac ?? 0,
823
+ dd: hd.dice,
824
+ ds: hd.sides,
825
+ weight: rec.weight ?? 0,
826
+ cost: rec.cost ?? 0,
827
+ flags,
828
+ kindFlags,
829
+ modifiers,
830
+ elInfo,
831
+ brands: this.bindBrandList(rec.brand, "object"),
832
+ slays: this.bindSlayList(rec.slay, "object"),
833
+ curses: this.bindCurseList(rec.curse, "object"),
834
+ dAttr: rec.graphics?.color ?? "",
835
+ dChar: rec.graphics?.glyph ?? "",
836
+ allocProb: rec.alloc?.common ?? 0,
837
+ allocMin: 0,
838
+ allocMax: 0,
839
+ level: rec.level ?? 0,
840
+ activation: null,
841
+ effect: bindEffects(rec.effect),
842
+ power: rec.power ?? 0,
843
+ effectMsg: joinLines(rec.msg),
844
+ visMsg: joinLines(rec["vis-msg"]),
845
+ time: parseRand(rec.time),
846
+ charge: parseRand(rec.charges),
847
+ genMultProb: pile?.prob ?? 0,
848
+ stackSize: parseRand(pile?.stack),
849
+ };
850
+ if (rec.alloc) {
851
+ const [amin, amax] = grabIntRange(rec.alloc.minmax);
852
+ kind.allocMin = amin;
853
+ kind.allocMax = amax;
854
+ }
855
+ this.kinds.push(kind);
856
+ }
857
+ this.ordinaryKindCount = this.kinds.length;
858
+ }
859
+
860
+ private bindBrandList(
861
+ codes: string[] | undefined,
862
+ what: string,
863
+ ): boolean[] | null {
864
+ if (!codes || codes.length === 0) return null;
865
+ const out = new Array<boolean>(this.brands.length).fill(false);
866
+ for (const code of codes) {
867
+ const i = this.lookupBrand(code);
868
+ if (i === 0) throw new Error(`${what}: unrecognised brand ${code}`);
869
+ out[i] = true;
870
+ }
871
+ return out;
872
+ }
873
+
874
+ private bindSlayList(
875
+ codes: string[] | undefined,
876
+ what: string,
877
+ ): boolean[] | null {
878
+ if (!codes || codes.length === 0) return null;
879
+ const out = new Array<boolean>(this.slays.length).fill(false);
880
+ for (const code of codes) {
881
+ const i = this.lookupSlay(code);
882
+ if (i === 0) throw new Error(`${what}: unrecognised slay ${code}`);
883
+ out[i] = true;
884
+ }
885
+ return out;
886
+ }
887
+
888
+ private bindCurseList(
889
+ entries: Array<{ name: string; power: number }> | undefined,
890
+ what: string,
891
+ ): number[] | null {
892
+ if (!entries || entries.length === 0) return null;
893
+ let out: number[] | null = null;
894
+ for (const { name, power } of entries) {
895
+ const i = this.lookupCurse(name);
896
+ if (i === 0) throw new Error(`${what}: unrecognised curse ${name}`);
897
+ /* Only add if it has power (upstream). */
898
+ if (power > 0) {
899
+ if (!out) out = new Array<number>(this.curses.length).fill(0);
900
+ out[i] = power;
901
+ }
902
+ }
903
+ return out;
904
+ }
905
+
906
+ private bindActivations(records: ActivationRecordJson[]): void {
907
+ /* Reverse file order, as finish_parse_act. */
908
+ for (let r = records.length - 1; r >= 0; r--) {
909
+ const rec = records[r] as ActivationRecordJson;
910
+ this.activations.push({
911
+ index: this.activations.length,
912
+ name: rec.name,
913
+ aim: (rec.aim ?? 0) !== 0,
914
+ level: rec.level ?? 0,
915
+ power: rec.power ?? 0,
916
+ effect: bindEffects(rec.effect),
917
+ message: joinLines(rec.msg),
918
+ desc: joinLines(rec.desc),
919
+ });
920
+ }
921
+ }
922
+
923
+ private bindEgos(records: EgoRecordJson[]): void {
924
+ for (const rec of records) {
925
+ const flags = newOfFlags();
926
+ const flagsOff = newOfFlags();
927
+ const kindFlags = newKfFlags();
928
+ const elInfo = newElemInfo();
929
+ for (const tok of tokens(rec.flags)) {
930
+ const found =
931
+ grabFlag(flags, OF, tok) ||
932
+ grabFlag(kindFlags, KF, tok) ||
933
+ grabElementFlag(elInfo, tok);
934
+ if (!found) throw new Error(`ego: invalid flag ${tok}`);
935
+ }
936
+ for (const tok of tokens(rec["flags-off"])) {
937
+ if (!grabFlag(flagsOff, OF, tok)) {
938
+ throw new Error(`ego: invalid flag-off ${tok}`);
939
+ }
940
+ }
941
+ const modifiers = newModifiersRv();
942
+ for (const tok of tokens(rec.values)) {
943
+ let found = false;
944
+ if (grabRandValue(modifiers, OBJ_MOD_NAMES, tok)) found = true;
945
+ const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
946
+ if (res) {
947
+ (elInfo[res.index] as ElementInfo).resLevel = res.value;
948
+ found = true;
949
+ }
950
+ if (!found) throw new Error(`ego: invalid value ${tok}`);
951
+ }
952
+ const minModifiers = new Array<number>(OBJ_MOD_MAX).fill(0);
953
+ for (const tok of tokens(rec["min-values"])) {
954
+ if (!grabIntValue(minModifiers, OBJ_MOD_NAMES, tok)) {
955
+ throw new Error(`ego: invalid min-value ${tok}`);
956
+ }
957
+ }
958
+ const possItems = new Set<number>();
959
+ for (const tvalName of rec.type ?? []) {
960
+ const tval = tvalFindIdx(tvalName);
961
+ if (tval < 0) throw new Error(`ego: unknown tval ${tvalName}`);
962
+ let foundOne = false;
963
+ for (const kind of this.kinds) {
964
+ if (kind.tval === tval) {
965
+ possItems.add(kind.kidx);
966
+ foundOne = true;
967
+ }
968
+ }
969
+ if (!foundOne) {
970
+ throw new Error(`ego: no kind for ego type ${tvalName}`);
971
+ }
972
+ }
973
+ for (const item of rec.item ?? []) {
974
+ const tval = tvalFindIdx(item.tval);
975
+ if (tval < 0) throw new Error(`ego: unknown tval ${item.tval}`);
976
+ const sval = this.lookupSval(tval, item.sval);
977
+ if (sval < 0) throw new Error(`ego: unknown sval ${item.sval}`);
978
+ const kind = this.lookupKind(tval, sval);
979
+ if (!kind || kind.kidx <= 0) {
980
+ throw new Error(`ego: invalid item ${item.tval}:${item.sval}`);
981
+ }
982
+ possItems.add(kind.kidx);
983
+ }
984
+ const ego: EgoItem = {
985
+ name: rec.name,
986
+ text: joinLines(rec.desc),
987
+ eidx: this.egos.length,
988
+ cost: rec.info?.cost ?? 0,
989
+ flags,
990
+ flagsOff,
991
+ kindFlags,
992
+ modifiers,
993
+ minModifiers,
994
+ elInfo,
995
+ brands: this.bindBrandList(rec.brand, "ego"),
996
+ slays: this.bindSlayList(rec.slay, "ego"),
997
+ curses: this.bindCurseList(rec.curse, "ego"),
998
+ rating: rec.info?.rating ?? 0,
999
+ allocProb: rec.alloc?.common ?? 0,
1000
+ allocMin: 0,
1001
+ allocMax: 0,
1002
+ possItems,
1003
+ toH: parseRand(rec.combat?.th),
1004
+ toD: parseRand(rec.combat?.td),
1005
+ toA: parseRand(rec.combat?.ta),
1006
+ minToH: rec["min-combat"]?.th ?? NO_MINIMUM,
1007
+ minToD: rec["min-combat"]?.td ?? NO_MINIMUM,
1008
+ minToA: rec["min-combat"]?.ta ?? NO_MINIMUM,
1009
+ activation: rec.act ? this.findActivation(rec.act) : null,
1010
+ time: parseRand(rec.time),
1011
+ };
1012
+ if (rec.alloc) {
1013
+ const [amin, amax] = grabIntRange(rec.alloc.minmax);
1014
+ if (amin > 255 || amax > 255 || amin < 0 || amax < 0) {
1015
+ throw new Error(`ego: allocation out of bounds ${rec.alloc.minmax}`);
1016
+ }
1017
+ ego.allocMin = amin;
1018
+ ego.allocMax = amax;
1019
+ }
1020
+ this.egos.push(ego);
1021
+ }
1022
+ }
1023
+
1024
+ /**
1025
+ * write_dummy_object_record: append an INSTA_ART kind for a special
1026
+ * artifact base object that has no ordinary kind.
1027
+ */
1028
+ private writeDummyObjectRecord(tval: number, svalName: string): ObjectKind {
1029
+ const base = this.bases[tval] as ObjectBase;
1030
+ base.numSvals++;
1031
+ const dummy: ObjectKind = {
1032
+ name: `& ${svalName}~`,
1033
+ text: "",
1034
+ base,
1035
+ kidx: this.kinds.length,
1036
+ tval,
1037
+ sval: base.numSvals,
1038
+ pval: zeroRv(),
1039
+ toH: zeroRv(),
1040
+ toD: zeroRv(),
1041
+ toA: zeroRv(),
1042
+ ac: 0,
1043
+ dd: 0,
1044
+ ds: 0,
1045
+ weight: 0,
1046
+ cost: 0,
1047
+ /* Inherit the flags and element info of the tval. */
1048
+ flags: base.flags.clone(),
1049
+ kindFlags: base.kindFlags.clone(),
1050
+ modifiers: newModifiersRv(),
1051
+ elInfo: base.elInfo.map((e) => ({ resLevel: e.resLevel, flags: e.flags })),
1052
+ brands: null,
1053
+ slays: null,
1054
+ curses: null,
1055
+ /* Default colours, meant to be overwritten by graphics:. */
1056
+ dAttr: "Red",
1057
+ dChar: "*",
1058
+ allocProb: 0,
1059
+ allocMin: 0,
1060
+ allocMax: 0,
1061
+ /* Upstream copies art->level before level: is parsed, so 0. */
1062
+ level: 0,
1063
+ activation: null,
1064
+ effect: null,
1065
+ power: 0,
1066
+ effectMsg: "",
1067
+ visMsg: "",
1068
+ time: zeroRv(),
1069
+ charge: zeroRv(),
1070
+ genMultProb: 0,
1071
+ stackSize: zeroRv(),
1072
+ };
1073
+ dummy.kindFlags.on(KF.INSTA_ART);
1074
+ this.kinds.push(dummy);
1075
+ return dummy;
1076
+ }
1077
+
1078
+ private bindArtifacts(records: ArtifactRecordJson[]): void {
1079
+ for (const rec of records) {
1080
+ const elInfo = newElemInfo();
1081
+ /* parse_artifact_name: ignore all base elements. */
1082
+ for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
1083
+ (elInfo[i] as ElementInfo).flags |= EL_INFO_IGNORE;
1084
+ }
1085
+ const tval = tvalFindIdx(rec["base-object"].tval);
1086
+ if (tval < 0) {
1087
+ throw new Error(`artifact: unknown tval ${rec["base-object"].tval}`);
1088
+ }
1089
+ let sval = this.lookupSval(tval, rec["base-object"].sval);
1090
+ if (sval < 0) {
1091
+ sval = this.writeDummyObjectRecord(tval, rec["base-object"].sval).sval;
1092
+ }
1093
+ const kind = this.lookupKind(tval, sval);
1094
+ if (!kind) {
1095
+ throw new Error(
1096
+ `artifact: no kind ${rec["base-object"].tval}:${sval}`,
1097
+ );
1098
+ }
1099
+ const flags = newOfFlags();
1100
+ for (const tok of tokens(rec.flags)) {
1101
+ const found = grabFlag(flags, OF, tok) || grabElementFlag(elInfo, tok);
1102
+ if (!found) throw new Error(`artifact: invalid flag ${tok}`);
1103
+ }
1104
+ const modifiers = new Array<number>(OBJ_MOD_MAX).fill(0);
1105
+ for (const tok of tokens(rec.values)) {
1106
+ let found = false;
1107
+ if (grabIntValue(modifiers, OBJ_MOD_NAMES, tok)) found = true;
1108
+ const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
1109
+ if (res) {
1110
+ (elInfo[res.index] as ElementInfo).resLevel = res.value;
1111
+ found = true;
1112
+ }
1113
+ if (!found) throw new Error(`artifact: invalid value ${tok}`);
1114
+ }
1115
+ const special = kind.kidx >= this.ordinaryKindCount;
1116
+ if (rec.graphics) {
1117
+ /* Only special (INSTA_ART) artifacts may set kind graphics. */
1118
+ if (!kind.kindFlags.has(KF.INSTA_ART)) {
1119
+ throw new Error(`artifact: ${rec.name} is not a special artifact`);
1120
+ }
1121
+ kind.dChar = rec.graphics.glyph;
1122
+ kind.dAttr = rec.graphics.color;
1123
+ }
1124
+ const weight = rec.weight ?? 0;
1125
+ const cost = rec.cost ?? 0;
1126
+ if (special) {
1127
+ kind.weight = weight;
1128
+ kind.cost = cost;
1129
+ }
1130
+ const hd = parseRand(rec.attack?.hd);
1131
+ let activation: Activation | null = null;
1132
+ let time = zeroRv();
1133
+ if (rec.act) {
1134
+ const act = this.findActivation(rec.act);
1135
+ /* Special light activations belong to the base object. */
1136
+ if (tval === TV.LIGHT && special) {
1137
+ kind.activation = act;
1138
+ kind.time = parseRand(rec.time);
1139
+ } else {
1140
+ activation = act;
1141
+ time = parseRand(rec.time);
1142
+ }
1143
+ }
1144
+ const art: Artifact = {
1145
+ name: rec.name,
1146
+ text: joinLines(rec.desc),
1147
+ aidx: this.artifacts.length,
1148
+ tval,
1149
+ sval,
1150
+ toH: rec.attack?.["to-h"] ?? 0,
1151
+ toD: rec.attack?.["to-d"] ?? 0,
1152
+ toA: rec.armor?.["to-a"] ?? 0,
1153
+ ac: rec.armor?.ac ?? 0,
1154
+ dd: hd.dice,
1155
+ ds: hd.sides,
1156
+ weight,
1157
+ cost,
1158
+ flags,
1159
+ modifiers,
1160
+ elInfo,
1161
+ brands: this.bindBrandList(rec.brand, "artifact"),
1162
+ slays: this.bindSlayList(rec.slay, "artifact"),
1163
+ curses: this.bindCurseList(rec.curse, "artifact"),
1164
+ level: rec.level ?? 0,
1165
+ allocProb: rec.alloc?.common ?? 0,
1166
+ allocMin: 0,
1167
+ allocMax: 0,
1168
+ activation,
1169
+ altMsg: joinLines(rec.msg),
1170
+ time,
1171
+ };
1172
+ if (rec.alloc) {
1173
+ const [amin, amax] = grabIntRange(rec.alloc.minmax);
1174
+ if (amin > 255 || amax > 255 || amin < 0 || amax < 0) {
1175
+ throw new Error(
1176
+ `artifact: allocation out of bounds ${rec.alloc.minmax}`,
1177
+ );
1178
+ }
1179
+ art.allocMin = amin;
1180
+ art.allocMax = amax;
1181
+ }
1182
+ this.artifacts.push(art);
1183
+ }
1184
+ }
1185
+
1186
+ private bindProperties(records: ObjectPropertyRecordJson[]): void {
1187
+ const TYPE_NAMES: Record<string, number> = {
1188
+ stat: OBJ_PROPERTY.STAT,
1189
+ mod: OBJ_PROPERTY.MOD,
1190
+ flag: OBJ_PROPERTY.FLAG,
1191
+ ignore: OBJ_PROPERTY.IGNORE,
1192
+ resistance: OBJ_PROPERTY.RESIST,
1193
+ vulnerability: OBJ_PROPERTY.VULN,
1194
+ immunity: OBJ_PROPERTY.IMM,
1195
+ };
1196
+ const SUBTYPE_NAMES: Record<string, number> = {
1197
+ sustain: OFT.SUST,
1198
+ protection: OFT.PROT,
1199
+ "misc ability": OFT.MISC,
1200
+ light: OFT.LIGHT,
1201
+ melee: OFT.MELEE,
1202
+ bad: OFT.BAD,
1203
+ dig: OFT.DIG,
1204
+ throw: OFT.THROW,
1205
+ "curse-only": OFT.CURSE_ONLY,
1206
+ };
1207
+ const ID_NAMES: Record<string, number> = {
1208
+ "on effect": OFID.NORMAL,
1209
+ timed: OFID.TIMED,
1210
+ "on wield": OFID.WIELD,
1211
+ };
1212
+ /* finish_parse_object_property: 1-based, file order. */
1213
+ for (const rec of records) {
1214
+ const type = rec.type !== undefined ? TYPE_NAMES[rec.type] : undefined;
1215
+ if (rec.type !== undefined && type === undefined) {
1216
+ throw new Error(`object_property: invalid type ${rec.type}`);
1217
+ }
1218
+ const subtype =
1219
+ rec.subtype !== undefined ? SUBTYPE_NAMES[rec.subtype] : undefined;
1220
+ if (rec.subtype !== undefined && subtype === undefined) {
1221
+ throw new Error(`object_property: invalid subtype ${rec.subtype}`);
1222
+ }
1223
+ const idType =
1224
+ rec["id-type"] !== undefined ? ID_NAMES[rec["id-type"]] : undefined;
1225
+ if (rec["id-type"] !== undefined && idType === undefined) {
1226
+ throw new Error(`object_property: invalid id-type ${rec["id-type"]}`);
1227
+ }
1228
+ let propIndex = 0;
1229
+ if (rec.code !== undefined) {
1230
+ /* grab_name (datafile.c:433) / lookup_flag (datafile.c:149): resolve a
1231
+ * data-file name against the generated name table, throwing on a miss
1232
+ * where upstream msg()s and returns PARSE_ERROR_GENERIC. */
1233
+ const t = type ?? OBJ_PROPERTY.NONE;
1234
+ let idx = -1;
1235
+ if (t === OBJ_PROPERTY.STAT || t === OBJ_PROPERTY.MOD) {
1236
+ idx = OBJ_MOD_NAMES.indexOf(rec.code);
1237
+ } else if (t === OBJ_PROPERTY.FLAG) {
1238
+ const v = (OF as Record<string, number>)[rec.code];
1239
+ idx = v === undefined ? -1 : v;
1240
+ } else if (
1241
+ t === OBJ_PROPERTY.IGNORE ||
1242
+ t === OBJ_PROPERTY.RESIST ||
1243
+ t === OBJ_PROPERTY.VULN ||
1244
+ t === OBJ_PROPERTY.IMM
1245
+ ) {
1246
+ idx = ELEMENT_NAMES.indexOf(rec.code);
1247
+ }
1248
+ if (idx < 0) {
1249
+ throw new Error(`object_property: invalid code ${rec.code}`);
1250
+ }
1251
+ propIndex = idx;
1252
+ }
1253
+ const typeMult = new Array<number>(TV_MAX).fill(1);
1254
+ for (const { type: tvalName, mult } of rec["type-mult"] ?? []) {
1255
+ const tval = tvalFindIdx(tvalName);
1256
+ if (tval < 0) {
1257
+ throw new Error(`object_property: unknown tval ${tvalName}`);
1258
+ }
1259
+ typeMult[tval] = mult;
1260
+ }
1261
+ this.properties.push({
1262
+ index: this.properties.length,
1263
+ type: type ?? OBJ_PROPERTY.NONE,
1264
+ subtype: subtype ?? OFT.NONE,
1265
+ idType: idType ?? OFID.NONE,
1266
+ propIndex,
1267
+ power: rec.power ?? 0,
1268
+ mult: rec.mult ?? 0,
1269
+ typeMult,
1270
+ name: rec.name,
1271
+ adjective: rec.adjective ?? "",
1272
+ negAdj: rec["neg-adjective"] ?? "",
1273
+ msg: rec.msg ?? "",
1274
+ desc: rec.desc ?? "",
1275
+ });
1276
+ }
1277
+ }
1278
+
1279
+ private bindFlavors(records: FlavorRecordJson[]): void {
1280
+ for (const rec of records) {
1281
+ const tval = tvalFindIdx(rec.kind.tval);
1282
+ if (tval <= 0) throw new Error(`flavor: unknown tval ${rec.kind.tval}`);
1283
+ const bindEntry = (entry: {
1284
+ index: number;
1285
+ sval?: string;
1286
+ attr: string;
1287
+ desc?: string;
1288
+ }): void => {
1289
+ let sval = SV_UNKNOWN;
1290
+ if (entry.sval !== undefined) {
1291
+ sval = this.lookupSval(tval, entry.sval);
1292
+ }
1293
+ this.flavors.push({
1294
+ fidx: entry.index,
1295
+ tval,
1296
+ sval,
1297
+ dAttr: entry.attr,
1298
+ dChar: rec.kind.glyph,
1299
+ text: entry.desc ?? "",
1300
+ });
1301
+ };
1302
+ for (const entry of rec.flavor ?? []) bindEntry(entry);
1303
+ for (const entry of rec.fixed ?? []) bindEntry(entry);
1304
+ }
1305
+ }
1306
+
1307
+ private finish(): void {
1308
+ /* finish_parse_object: add base kind flags to kind kind flags.
1309
+ * (Dummy artifact kinds already copied the base's kind flags.) */
1310
+ for (const kind of this.kinds) {
1311
+ kind.kindFlags.union(kind.base.kindFlags);
1312
+ }
1313
+ /* finish_parse_artifact: resolve the object-like kinds. */
1314
+ const none = tvalFindIdx("none");
1315
+ const kindOrNull = (name: string): ObjectKind | null => {
1316
+ const sval = this.lookupSval(none, name);
1317
+ return sval < 0 ? null : this.lookupKind(none, sval);
1318
+ };
1319
+ this.unknownItemKind = kindOrNull("<unknown item>");
1320
+ this.unknownGoldKind = kindOrNull("<unknown treasure>");
1321
+ this.pileKind = kindOrNull("<pile>");
1322
+ this.curseObjectKind = kindOrNull("<curse object>");
1323
+ /* write_curse_kinds: curse template objects reference the curse
1324
+ * object kind; the known-object side is part of the deferred
1325
+ * knowledge system. */
1326
+ }
1327
+ }
1328
+
1329
+ type SlayRecordJsonArray = ObjPackJson["slay"]["records"];
1330
+
1331
+ /** Assemble the ObjPackJson bundle from individually parsed pack files. */
1332
+ export function objPackFromJson(parts: {
1333
+ objectBase: unknown;
1334
+ object: unknown;
1335
+ egoItem: unknown;
1336
+ artifact: unknown;
1337
+ curse: unknown;
1338
+ brand: unknown;
1339
+ slay: unknown;
1340
+ activation: unknown;
1341
+ objectProperty: unknown;
1342
+ flavor: unknown;
1343
+ }): ObjPackJson {
1344
+ return parts as unknown as ObjPackJson;
1345
+ }