@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,899 @@
1
+ /**
2
+ * Monster registries, ported from the gamedata binding semantics in
3
+ * reference/src/mon-init.c (Angband 4.2.6).
4
+ *
5
+ * bindMonsters() takes parsed pack JSON records (no fs here) and produces
6
+ * a MonsterRegistry. Binding follows the upstream parser actions exactly;
7
+ * the important subtleties are noted inline:
8
+ *
9
+ * - Base inheritance (parse_monster_base): the race first copies the
10
+ * base's display glyph and ORs in the base's flags; the race's own
11
+ * flags: lines then OR on top and flags-off: lines remove flags (which
12
+ * may remove inherited base flags, e.g. green glutton ghost drops the
13
+ * ghost base's IM_COLD).
14
+ * - depth: sets spell_power = level as a default; a later spell-power:
15
+ * line overrides it (parse_monster_depth / parse_monster_spell_power).
16
+ * - innate-freq / spell-freq percentages are stored as 100 / pct with C
17
+ * integer division (parse_monster_innate_freq / parse_monster_spell_freq).
18
+ * - spells: after ORing the RSF flags, parse_monster_spells defaults
19
+ * freq_innate to 4 when the race has innate spells but no innate-freq,
20
+ * and freq_spell to 4 when it has non-(breath|innate) spells but no
21
+ * spell-freq. Breaths count as innate for frequency purposes.
22
+ * - Monster spells (parse_mon_spell_*): each spell starts with one level
23
+ * record at power 0; every power-cutoff: line appends a level, and lore
24
+ * and message lines always apply to the last level.
25
+ * - finish_parse_monster resolves friends names to races afterwards
26
+ * ("same", case-insensitive, binds the race to itself) and shape names
27
+ * to a base if one matches, else a race.
28
+ * - max_num is not gamedata: player-birth.c resets it to 100, or 1 for
29
+ * uniques. Binding applies that rule so allocation can use it.
30
+ *
31
+ * Moddability: registries accept any record arrays of the same shapes;
32
+ * mods extend the game by concatenating their records onto the pack's
33
+ * before binding.
34
+ */
35
+
36
+ import { FlagSet } from "../bitflag.js";
37
+ import { colorCharToAttr, colorTextToAttr } from "../color.js";
38
+ import { Dice } from "../dice.js";
39
+ import { myStristr } from "../guard.js";
40
+ import { MFLAG_SIZE, monSpellsOfTypes, MON_GROUP, RF_SIZE, RSF_SIZE } from "./types.js";
41
+ import type {
42
+ BlowEffect,
43
+ BlowMethod,
44
+ MonsterAltMsg,
45
+ MonsterBase,
46
+ MonsterBlow,
47
+ MonsterDrop,
48
+ MonsterFriends,
49
+ MonsterFriendsBase,
50
+ MonsterGroupRole,
51
+ MonsterMimic,
52
+ MonsterRace,
53
+ MonsterShape,
54
+ MonsterSpell,
55
+ MonsterSpellEffect,
56
+ MonsterSpellLevel,
57
+ Pain,
58
+ PitProfile,
59
+ SummonType,
60
+ } from "./types.js";
61
+ import { RF, RSF } from "../generated/index.js";
62
+ import { messageLookupByName } from "../sound/engine.js";
63
+
64
+ /* re-export for consumers that reach the domain through bind */
65
+ export { MFLAG_SIZE, RF_SIZE, RSF_SIZE };
66
+
67
+ /** pain.json record. */
68
+ export interface PainRecordJson {
69
+ type: number;
70
+ message: string[];
71
+ }
72
+
73
+ /** blow_methods.json record. */
74
+ export interface BlowMethodRecordJson {
75
+ name: string;
76
+ cut?: number;
77
+ stun?: number;
78
+ miss?: number;
79
+ phys?: number;
80
+ msg?: string;
81
+ act?: string[];
82
+ desc?: string[];
83
+ }
84
+
85
+ /** blow_effects.json record. */
86
+ export interface BlowEffectRecordJson {
87
+ name: string;
88
+ power?: number;
89
+ eval?: number;
90
+ desc?: string[];
91
+ "lore-color-base"?: string;
92
+ "lore-color-resist"?: string;
93
+ "lore-color-immune"?: string;
94
+ "effect-type"?: string;
95
+ resist?: string;
96
+ "lash-type"?: string;
97
+ }
98
+
99
+ /** monster_spell.json effect line. */
100
+ export interface SpellEffectJson {
101
+ eff: string;
102
+ type?: string;
103
+ radius?: number;
104
+ other?: number;
105
+ dice?: string;
106
+ expr?: Array<{ name: string; base: string; expr: string }>;
107
+ }
108
+
109
+ /** monster_spell.json power-cutoff entry (same lore/message fields). */
110
+ export interface SpellCutoffJson {
111
+ power: number;
112
+ lore?: string[];
113
+ "lore-color-base"?: string;
114
+ "lore-color-resist"?: string;
115
+ "lore-color-immune"?: string;
116
+ "message-vis"?: string[];
117
+ "message-invis"?: string[];
118
+ "message-miss"?: string[];
119
+ "message-save"?: string[];
120
+ }
121
+
122
+ /** monster_spell.json record. */
123
+ export interface MonsterSpellRecordJson {
124
+ name: string;
125
+ msgt?: string;
126
+ hit?: number;
127
+ effect?: SpellEffectJson[];
128
+ lore?: string[];
129
+ "lore-color-base"?: string;
130
+ "lore-color-resist"?: string;
131
+ "lore-color-immune"?: string;
132
+ "message-vis"?: string[];
133
+ "message-invis"?: string[];
134
+ "message-miss"?: string[];
135
+ "message-save"?: string[];
136
+ "power-cutoff"?: SpellCutoffJson[];
137
+ }
138
+
139
+ /** monster_base.json record. */
140
+ export interface MonsterBaseRecordJson {
141
+ name: string;
142
+ glyph: string;
143
+ pain: number;
144
+ flags?: string[];
145
+ desc?: string[];
146
+ }
147
+
148
+ /** monster.json blow line. */
149
+ export interface MonsterBlowJson {
150
+ method: string;
151
+ effect?: string;
152
+ damage?: string;
153
+ }
154
+
155
+ /** monster.json drop / drop-base lines. */
156
+ export interface MonsterDropJson {
157
+ tval: string;
158
+ sval?: string;
159
+ chance: number;
160
+ min: number;
161
+ max: number;
162
+ }
163
+
164
+ /** monster.json friends / friends-base lines. */
165
+ export interface MonsterFriendsJson {
166
+ chance: number;
167
+ number: string;
168
+ name: string;
169
+ role?: string;
170
+ }
171
+
172
+ /** monster.json message-vis / message-invis / message-miss lines. */
173
+ export interface MonsterAltMsgJson {
174
+ spell: string;
175
+ message?: string;
176
+ }
177
+
178
+ /** monster.json record. */
179
+ export interface MonsterRecordJson {
180
+ name: string;
181
+ plural?: string;
182
+ base: string;
183
+ glyph?: string;
184
+ color: string;
185
+ speed?: number;
186
+ "hit-points"?: number;
187
+ light?: number;
188
+ hearing?: number;
189
+ smell?: number;
190
+ "armor-class"?: number;
191
+ sleepiness?: number;
192
+ depth?: number;
193
+ rarity?: number;
194
+ experience?: number;
195
+ blow?: MonsterBlowJson[];
196
+ flags?: string[];
197
+ "flags-off"?: string[];
198
+ desc?: string[];
199
+ "innate-freq"?: number;
200
+ "spell-freq"?: number;
201
+ "spell-power"?: number;
202
+ spells?: string[];
203
+ "message-vis"?: MonsterAltMsgJson[];
204
+ "message-invis"?: MonsterAltMsgJson[];
205
+ "message-miss"?: MonsterAltMsgJson[];
206
+ drop?: MonsterDropJson[];
207
+ "drop-base"?: MonsterDropJson[];
208
+ /** Compiler-preserved encounter order for the single C drops list. */
209
+ "drop-order"?: string[];
210
+ friends?: MonsterFriendsJson[];
211
+ "friends-base"?: MonsterFriendsJson[];
212
+ mimic?: Array<{ tval: string; sval: string }>;
213
+ shape?: string[];
214
+ "color-cycle"?: { group: string; cycle: string };
215
+ }
216
+
217
+ /** summon.json record. */
218
+ export interface SummonRecordJson {
219
+ name: string;
220
+ msgt?: string;
221
+ uniques?: number;
222
+ base?: string[];
223
+ "race-flag"?: string;
224
+ fallback?: string;
225
+ desc?: string;
226
+ }
227
+
228
+ /** pit.json record. */
229
+ export interface PitRecordJson {
230
+ name: string;
231
+ room?: number;
232
+ alloc?: { rarity: number; level: number };
233
+ "obj-rarity"?: number;
234
+ "mon-base"?: string[];
235
+ color?: string[];
236
+ "flags-req"?: string[];
237
+ "flags-ban"?: string[];
238
+ "spell-req"?: string[];
239
+ "spell-ban"?: string[];
240
+ "mon-ban"?: string[];
241
+ "innate-freq"?: number;
242
+ }
243
+
244
+ /** All pack inputs bindMonsters needs; each is the file's records array. */
245
+ export interface MonsterPackRecords {
246
+ pain: PainRecordJson[];
247
+ blowMethods: BlowMethodRecordJson[];
248
+ blowEffects: BlowEffectRecordJson[];
249
+ monsterSpells: MonsterSpellRecordJson[];
250
+ monsterBases: MonsterBaseRecordJson[];
251
+ monsters: MonsterRecordJson[];
252
+ summons: SummonRecordJson[];
253
+ pits: PitRecordJson[];
254
+ }
255
+
256
+ export interface BindMonstersOptions {
257
+ /** z_info->max_sight; hearing/smell scale by maxSight / 20. */
258
+ maxSight?: number;
259
+ }
260
+
261
+ /** string_append semantics: desc lines concatenate without a separator. */
262
+ function joinLines(lines: string[] | undefined): string {
263
+ return lines ? lines.join("") : "";
264
+ }
265
+
266
+ /**
267
+ * The "A | B" segments of one flags-style directive.
268
+ *
269
+ * An entry that is not a string is the compiler's presence marker for a
270
+ * directive written with no value at all ("flags:"). Upstream's handlers
271
+ * check `parser_hasval()` first and return PARSE_ERROR_NONE with the flag
272
+ * set untouched (mon-init.c L1316-1317 parse_monster_flags and its
273
+ * siblings), so an empty line contributes no tokens rather than crashing.
274
+ * Asserted by r-info.c test_flags0 / test_flags_off0 and, for the sibling
275
+ * parsers, c-info.c test_obj_flags0 / test_player_flags0 and partrap.c
276
+ * test_flags0.
277
+ */
278
+ function flagSegments(line: unknown): string[] {
279
+ return typeof line === "string" ? line.split("|") : [];
280
+ }
281
+
282
+ /** grab_flag over RF names ("A | B" segments); throws on unknown names. */
283
+ function raceFlagsOn(flags: FlagSet, lines: string[] | undefined): void {
284
+ if (!lines) return;
285
+ for (const line of lines) {
286
+ for (const raw of flagSegments(line)) {
287
+ const name = raw.trim();
288
+ if (!name) continue;
289
+ const value = (RF as Record<string, number>)[name];
290
+ if (value === undefined || value === 0) {
291
+ throw new Error(`mon: bad monster race flag: ${name}`);
292
+ }
293
+ flags.on(value);
294
+ }
295
+ }
296
+ }
297
+
298
+ /** remove_flag over RF names (flags-off). */
299
+ function raceFlagsOff(flags: FlagSet, lines: string[] | undefined): void {
300
+ if (!lines) return;
301
+ for (const line of lines) {
302
+ for (const raw of flagSegments(line)) {
303
+ const name = raw.trim();
304
+ if (!name) continue;
305
+ const value = (RF as Record<string, number>)[name];
306
+ if (value === undefined || value === 0) {
307
+ throw new Error(`mon: bad monster race flag: ${name}`);
308
+ }
309
+ flags.off(value);
310
+ }
311
+ }
312
+ }
313
+
314
+ /** grab_flag over RSF names. */
315
+ function spellFlagsOn(flags: FlagSet, lines: string[] | undefined): void {
316
+ if (!lines) return;
317
+ for (const line of lines) {
318
+ for (const raw of flagSegments(line)) {
319
+ const name = raw.trim();
320
+ if (!name) continue;
321
+ const value = (RSF as Record<string, number>)[name];
322
+ if (value === undefined || value === 0) {
323
+ throw new Error(`mon: bad monster spell flag: ${name}`);
324
+ }
325
+ flags.on(value);
326
+ }
327
+ }
328
+ }
329
+
330
+ function parseDice(raw: string | undefined): Dice | null {
331
+ if (raw === undefined) return null;
332
+ const dice = new Dice();
333
+ if (!dice.parseString(raw)) {
334
+ throw new Error(`mon: invalid dice string: ${raw}`);
335
+ }
336
+ return dice;
337
+ }
338
+
339
+ /** friends role: servant / bodyguard, default member (parse_monster_friends). */
340
+ function friendRole(role: string | undefined): MonsterGroupRole {
341
+ if (role === undefined) return MON_GROUP.MEMBER;
342
+ if (role === "servant") return MON_GROUP.SERVANT;
343
+ if (role === "bodyguard") return MON_GROUP.BODYGUARD;
344
+ throw new Error(`mon: invalid monster role: ${role}`);
345
+ }
346
+
347
+ /** parser rand "2d1" -> dice/side pair for friends counts. */
348
+ function parseNumberPair(raw: string): { dice: number; side: number } {
349
+ const d = new Dice();
350
+ if (!d.parseString(raw)) {
351
+ throw new Error(`mon: invalid number dice: ${raw}`);
352
+ }
353
+ const rv = d.randomValue();
354
+ return { dice: rv.dice, side: rv.sides };
355
+ }
356
+
357
+ function bindPains(records: PainRecordJson[]): Map<number, Pain> {
358
+ const map = new Map<number, Pain>();
359
+ for (const rec of records) {
360
+ if (rec.message.length > 7) {
361
+ throw new Error(`mon: pain ${rec.type} has too many messages`);
362
+ }
363
+ map.set(rec.type, { painIdx: rec.type, messages: [...rec.message] });
364
+ }
365
+ return map;
366
+ }
367
+
368
+ function bindBlowMethods(
369
+ records: BlowMethodRecordJson[],
370
+ ): Map<string, BlowMethod> {
371
+ const map = new Map<string, BlowMethod>();
372
+ for (const rec of records) {
373
+ map.set(rec.name, {
374
+ name: rec.name,
375
+ cut: rec.cut !== 0,
376
+ stun: rec.stun !== 0,
377
+ miss: rec.miss !== 0,
378
+ phys: rec.phys !== 0,
379
+ msgt: checkMsgt(`blow method ${rec.name}`, rec.msg),
380
+ messages: rec.act ? [...rec.act] : [],
381
+ desc: joinLines(rec.desc),
382
+ });
383
+ }
384
+ return map;
385
+ }
386
+
387
+ function bindBlowEffects(
388
+ records: BlowEffectRecordJson[],
389
+ ): Map<string, BlowEffect> {
390
+ const map = new Map<string, BlowEffect>();
391
+ for (const rec of records) {
392
+ map.set(rec.name, {
393
+ name: rec.name,
394
+ power: rec.power ?? 0,
395
+ eval: rec.eval ?? 0,
396
+ desc: joinLines(rec.desc),
397
+ loreColorBase: rec["lore-color-base"] ?? "",
398
+ loreColorResist: rec["lore-color-resist"] ?? "",
399
+ loreColorImmune: rec["lore-color-immune"] ?? "",
400
+ effectType: rec["effect-type"] ?? "",
401
+ resist: rec.resist ?? null,
402
+ lashType: rec["lash-type"] ?? null,
403
+ });
404
+ }
405
+ return map;
406
+ }
407
+
408
+ function bindSpellLevel(
409
+ power: number,
410
+ rec: SpellCutoffJson | MonsterSpellRecordJson,
411
+ ): MonsterSpellLevel {
412
+ return {
413
+ power,
414
+ loreDesc: joinLines(rec.lore),
415
+ loreColorBase: rec["lore-color-base"] ?? "",
416
+ loreColorResist: rec["lore-color-resist"] ?? "",
417
+ loreColorImmune: rec["lore-color-immune"] ?? "",
418
+ message: joinLines(rec["message-vis"]),
419
+ blindMessage: joinLines(rec["message-invis"]),
420
+ missMessage: joinLines(rec["message-miss"]),
421
+ saveMessage: joinLines(rec["message-save"]),
422
+ };
423
+ }
424
+
425
+ function bindSpells(
426
+ records: MonsterSpellRecordJson[],
427
+ ): Map<number, MonsterSpell> {
428
+ const map = new Map<number, MonsterSpell>();
429
+ for (const rec of records) {
430
+ const index = (RSF as Record<string, number>)[rec.name];
431
+ if (index === undefined) {
432
+ throw new Error(`mon: invalid spell name: ${rec.name}`);
433
+ }
434
+ const effects: MonsterSpellEffect[] = [];
435
+ for (const e of rec.effect ?? []) {
436
+ const dice = parseDice(e.dice);
437
+ const exprs = e.expr ? e.expr.map((x) => ({ ...x })) : [];
438
+ effects.push({
439
+ eff: e.eff,
440
+ type: e.type ?? null,
441
+ radius: e.radius ?? 0,
442
+ other: e.other ?? 0,
443
+ dice,
444
+ diceRaw: e.dice ?? null,
445
+ exprs,
446
+ });
447
+ }
448
+ const levels: MonsterSpellLevel[] = [bindSpellLevel(0, rec)];
449
+ for (const cut of rec["power-cutoff"] ?? []) {
450
+ levels.push(bindSpellLevel(cut.power, cut));
451
+ }
452
+ map.set(index, {
453
+ index,
454
+ name: rec.name,
455
+ msgt: checkMsgt(`spell ${rec.name}`, rec.msgt),
456
+ hit: rec.hit ?? 0,
457
+ effects,
458
+ levels,
459
+ });
460
+ }
461
+ return map;
462
+ }
463
+
464
+ function bindBases(
465
+ records: MonsterBaseRecordJson[],
466
+ pains: Map<number, Pain>,
467
+ ): Map<string, MonsterBase> {
468
+ const map = new Map<string, MonsterBase>();
469
+ for (const rec of records) {
470
+ const pain = pains.get(rec.pain);
471
+ if (!pain) {
472
+ throw new Error(`mon: base ${rec.name}: pain ${rec.pain} out of bounds`);
473
+ }
474
+ const flags = new FlagSet(RF_SIZE);
475
+ raceFlagsOn(flags, rec.flags);
476
+ map.set(rec.name, {
477
+ name: rec.name,
478
+ text: joinLines(rec.desc),
479
+ flags,
480
+ glyph: rec.glyph,
481
+ pain,
482
+ });
483
+ }
484
+ return map;
485
+ }
486
+
487
+ /** RSF mask of innate spells (create_mon_spell_mask(RST_INNATE)). */
488
+ function innateMask(): FlagSet {
489
+ const mask = new FlagSet(RSF_SIZE);
490
+ for (const f of monSpellsOfTypes("RST_INNATE")) mask.on(f);
491
+ return mask;
492
+ }
493
+
494
+ /** RSF mask of breath or innate spells. */
495
+ function breathOrInnateMask(): FlagSet {
496
+ const mask = new FlagSet(RSF_SIZE);
497
+ for (const f of monSpellsOfTypes("RST_BREATH", "RST_INNATE")) mask.on(f);
498
+ return mask;
499
+ }
500
+
501
+ function bindAltMsgs(
502
+ out: MonsterAltMsg[],
503
+ lines: MonsterAltMsgJson[] | undefined,
504
+ msgType: MonsterAltMsg["msgType"],
505
+ ): void {
506
+ if (!lines) return;
507
+ for (const line of [...lines].reverse()) {
508
+ const index = (RSF as Record<string, number>)[line.spell];
509
+ if (index === undefined || index === 0) {
510
+ throw new Error(`mon: invalid spell name in message: ${line.spell}`);
511
+ }
512
+ const message = line.message ?? "";
513
+ out.push({
514
+ index,
515
+ msgType,
516
+ message: message.trim().length === 0 ? "" : message,
517
+ });
518
+ }
519
+ }
520
+
521
+ function bindDrop(out: MonsterDrop[], d: MonsterDropJson): void {
522
+ out.push({
523
+ tval: d.tval,
524
+ sval: d.sval ?? null,
525
+ percentChance: d.chance,
526
+ min: d.min,
527
+ max: d.max,
528
+ });
529
+ }
530
+
531
+ /** Bind C's one interleaved drops list, which the pack stores in two fields. */
532
+ function bindDrops(
533
+ out: MonsterDrop[],
534
+ lines: MonsterDropJson[] | undefined,
535
+ baseLines: MonsterDropJson[] | undefined,
536
+ order: string[] | undefined,
537
+ ): void {
538
+ const dropLines = lines ?? [];
539
+ const baseDropLines = baseLines ?? [];
540
+ if (order && order.length > 0) {
541
+ for (const token of [...order].reverse()) {
542
+ const colon = token.lastIndexOf(":");
543
+ const kind = token.slice(0, colon);
544
+ const index = Number(token.slice(colon + 1));
545
+ const source = kind === "drop" ? dropLines : kind === "drop-base" ? baseDropLines : null;
546
+ const d = source?.[index];
547
+ if (!d) throw new Error(`mon: invalid drop-order entry ${token}`);
548
+ bindDrop(out, d);
549
+ }
550
+ return;
551
+ }
552
+ /* Older/custom packs have no encounter metadata. Their two fields are
553
+ * already grouped by directive, so combine once and reverse once; do not
554
+ * reverse the two arrays independently. */
555
+ for (const d of [...dropLines, ...baseDropLines].reverse()) bindDrop(out, d);
556
+ }
557
+
558
+ function pctToFreq(pct: number, what: string): number {
559
+ if (pct < 1 || pct > 100) {
560
+ throw new Error(`mon: invalid ${what} percentage: ${pct}`);
561
+ }
562
+ return Math.trunc(100 / pct);
563
+ }
564
+
565
+ /**
566
+ * parse_pit_innate_freq (mon-init.c) rejects anything outside 1..100 with
567
+ * PARSE_ERROR_INVALID_SPELL_FREQ before storing 100/pct (pit.c
568
+ * test_innate_freq_bad0 plants 0, -1 and 101). The 100/pct conversion itself
569
+ * happens in gen/gen-monster.ts resolvePits, which is why only the range
570
+ * check lives here: without it, `innate-freq:0` silently became "no innate
571
+ * requirement" and `innate-freq:101` silently became 0, both of which change
572
+ * which monsters mon_pit_hook admits.
573
+ */
574
+ function checkPitInnateFreq(name: string, pct: number | undefined): number {
575
+ if (pct === undefined) return 0;
576
+ if (pct < 1 || pct > 100) {
577
+ throw new Error(
578
+ `mon: pit ${name}: invalid innate-freq ${String(pct)} ` +
579
+ `(PARSE_ERROR_INVALID_SPELL_FREQ; 1..100)`,
580
+ );
581
+ }
582
+ return pct;
583
+ }
584
+
585
+ /**
586
+ * message_lookup_by_name (message.c) guards `msgt:` in every parser that has
587
+ * one; an unknown name is PARSE_ERROR_INVALID_MESSAGE (mspell.c
588
+ * test_msgt_bad0). The port keeps the MSG_ name as a string and resolves it
589
+ * at message time, so without this the typo simply never matched anything.
590
+ *
591
+ * Four callers, matching the four upstream handlers that do this:
592
+ * parse_mon_spell_message_type and parse_meth_message_type (mon-init.c),
593
+ * parse_summon_message_type (mon-summon.c) and the projection one
594
+ * (obj-init.c, in ../world/projection). `msgt === undefined` is upstream's
595
+ * mem_zalloc default of 0 == MSG_GENERIC, and for the blow method
596
+ * specifically it is also parse_meth_message_type's `parser_hasval(p, "msg")`
597
+ * guard: `msg:` is registered `?str`, so a bare `msg:` omits the key here
598
+ * exactly as it leaves msgt untouched there, and is NOT an error.
599
+ */
600
+ function checkMsgt(what: string, msgt: string | undefined): string {
601
+ if (msgt === undefined) return "GENERIC";
602
+ if (messageLookupByName(msgt) < 0) {
603
+ throw new Error(
604
+ `mon: ${what}: invalid msgt ${msgt} (PARSE_ERROR_INVALID_MESSAGE)`,
605
+ );
606
+ }
607
+ return msgt;
608
+ }
609
+
610
+ /** Registry of everything the monster domain binds from the pack. */
611
+ export class MonsterRegistry {
612
+ readonly pains: Map<number, Pain>;
613
+ readonly blowMethods: Map<string, BlowMethod>;
614
+ readonly blowEffects: Map<string, BlowEffect>;
615
+ /** RSF index -> spell. */
616
+ readonly spells: Map<number, MonsterSpell>;
617
+ /**
618
+ * lookup_monster_base (mon-util.c:146): upstream walks the rb_info list
619
+ * comparing streq(name, base->name); this is that lookup as a map, so
620
+ * `bases.get(name)` IS lookup_monster_base and `bases.get(n) === race.base`
621
+ * is match_monster_bases's single-name test (mon-util.c:166 - variadic
622
+ * upstream, and unused outside its unit test; the slay/brand base check is
623
+ * react_to_specific_slay's streq on base->name, obj-slays.c:274).
624
+ */
625
+ readonly bases: Map<string, MonsterBase>;
626
+ /** Record order mirrors monster.txt; ridx is the array index. */
627
+ readonly races: MonsterRace[];
628
+ readonly summons: SummonType[];
629
+ readonly pits: PitProfile[];
630
+
631
+ private readonly racesByName: Map<string, MonsterRace>;
632
+
633
+ constructor(pack: MonsterPackRecords, options: BindMonstersOptions = {}) {
634
+ const maxSight = options.maxSight ?? 20;
635
+
636
+ this.pains = bindPains(pack.pain);
637
+ this.blowMethods = bindBlowMethods(pack.blowMethods);
638
+ this.blowEffects = bindBlowEffects(pack.blowEffects);
639
+ this.spells = bindSpells(pack.monsterSpells);
640
+ this.bases = bindBases(pack.monsterBases, this.pains);
641
+
642
+ const innate = innateMask();
643
+ const breathOrInnate = breathOrInnateMask();
644
+
645
+ this.races = [];
646
+ this.racesByName = new Map();
647
+ for (const rec of pack.monsters) {
648
+ const race = this.bindRace(rec, maxSight, innate, breathOrInnate);
649
+ this.races.push(race);
650
+ this.racesByName.set(race.name.toLowerCase(), race);
651
+ }
652
+
653
+ /* finish_parse_monster: resolve friends and shape names to races. */
654
+ for (const race of this.races) {
655
+ for (const f of race.friends) {
656
+ f.race =
657
+ f.name.toLowerCase() === "same" ? race : this.raceByName(f.name);
658
+ if (!f.race) {
659
+ throw new Error(
660
+ `mon: could not find friend named '${f.name}' for '${race.name}'`,
661
+ );
662
+ }
663
+ }
664
+ for (const s of race.shapes) {
665
+ if (s.base) continue;
666
+ s.race = this.raceByName(s.name);
667
+ if (!s.race) {
668
+ throw new Error(
669
+ `mon: could not find shape named '${s.name}' for '${race.name}'`,
670
+ );
671
+ }
672
+ }
673
+ }
674
+
675
+ this.summons = pack.summons.map((rec) => ({
676
+ name: rec.name,
677
+ msgt: checkMsgt(`summon ${rec.name}`, rec.msgt),
678
+ uniquesAllowed: rec.uniques !== 0,
679
+ baseNames: rec.base ? [...rec.base] : [],
680
+ raceFlag: rec["race-flag"] ?? null,
681
+ fallbackName: rec.fallback ?? null,
682
+ desc: rec.desc ?? "",
683
+ }));
684
+
685
+ this.pits = pack.pits.map((rec) => ({
686
+ name: rec.name,
687
+ room: rec.room ?? 0,
688
+ allocRarity: rec.alloc?.rarity ?? 0,
689
+ allocLevel: rec.alloc?.level ?? 0,
690
+ objRarity: rec["obj-rarity"] ?? 0,
691
+ baseNames: rec["mon-base"] ? [...rec["mon-base"]] : [],
692
+ colors: rec.color ? [...rec.color] : [],
693
+ flagsReq: rec["flags-req"] ? [...rec["flags-req"]] : [],
694
+ flagsBan: rec["flags-ban"] ? [...rec["flags-ban"]] : [],
695
+ spellReq: rec["spell-req"] ? [...rec["spell-req"]] : [],
696
+ spellBan: rec["spell-ban"] ? [...rec["spell-ban"]] : [],
697
+ monBan: rec["mon-ban"] ? [...rec["mon-ban"]] : [],
698
+ freqInnate: checkPitInnateFreq(rec.name, rec["innate-freq"]),
699
+ }));
700
+ }
701
+
702
+ /**
703
+ * lookup_monster (mon-util.c): exact case-insensitive match first,
704
+ * else the first race (lowest ridx) whose name contains the query as
705
+ * a case-insensitive substring. The shipped monster.txt relies on the
706
+ * substring fallback ("friends:100:4d4:spider" on ancient spider).
707
+ *
708
+ * The substring test is my_stristr (z-util.c:441), now a real counterpart in
709
+ * guard.ts rather than a second inline copy -- the third place that needed it
710
+ * (lookupTrap) had got it wrong.
711
+ */
712
+ raceByName(name: string): MonsterRace | null {
713
+ const exact = this.racesByName.get(name.toLowerCase());
714
+ if (exact) return exact;
715
+ for (const race of this.races) {
716
+ if (myStristr(race.name, name)) return race;
717
+ }
718
+ return null;
719
+ }
720
+
721
+ private bindRace(
722
+ rec: MonsterRecordJson,
723
+ maxSight: number,
724
+ innate: FlagSet,
725
+ breathOrInnate: FlagSet,
726
+ ): MonsterRace {
727
+ const base = this.bases.get(rec.base);
728
+ if (!base) {
729
+ throw new Error(`mon: race ${rec.name}: invalid base ${rec.base}`);
730
+ }
731
+
732
+ /* parse_monster_base: default glyph and ORed base flags. */
733
+ const flags = new FlagSet(RF_SIZE);
734
+ flags.union(base.flags);
735
+ let dChar = base.glyph;
736
+
737
+ /* parse_monster_glyph: explicit glyph overrides the template. */
738
+ if (rec.glyph !== undefined) dChar = rec.glyph;
739
+
740
+ /* parse_monster_color: single chars and full names both allowed. */
741
+ const dAttr =
742
+ rec.color.length > 1
743
+ ? colorTextToAttr(rec.color)
744
+ : colorCharToAttr(rec.color);
745
+ // z-color.c:183-184 / 200-201: malformed colours resolve to white.
746
+
747
+ /* flags: then flags-off:, applied after base inheritance. */
748
+ raceFlagsOn(flags, rec.flags);
749
+ raceFlagsOff(flags, rec["flags-off"]);
750
+
751
+ const blows: MonsterBlow[] = [];
752
+ for (const b of rec.blow ?? []) {
753
+ const method = this.blowMethods.get(b.method);
754
+ if (!method) {
755
+ throw new Error(`mon: race ${rec.name}: unrecognised blow ${b.method}`);
756
+ }
757
+ const effect = this.blowEffects.get(b.effect ?? "NONE");
758
+ if (!effect) {
759
+ throw new Error(
760
+ `mon: race ${rec.name}: invalid blow effect ${b.effect}`,
761
+ );
762
+ }
763
+ blows.push({
764
+ method,
765
+ effect,
766
+ dice: parseDice(b.damage),
767
+ diceRaw: b.damage ?? null,
768
+ });
769
+ }
770
+
771
+ const level = rec.depth ?? 0;
772
+
773
+ /* innate-freq / spell-freq stored as 100 / pct (C int division). */
774
+ let freqInnate =
775
+ rec["innate-freq"] !== undefined
776
+ ? pctToFreq(rec["innate-freq"], "innate frequency")
777
+ : 0;
778
+ let freqSpell =
779
+ rec["spell-freq"] !== undefined
780
+ ? pctToFreq(rec["spell-freq"], "spell frequency")
781
+ : 0;
782
+
783
+ /* depth defaults spell_power to level; spell-power overrides. */
784
+ const spellPower = rec["spell-power"] ?? level;
785
+
786
+ const spellFlags = new FlagSet(RSF_SIZE);
787
+ if (rec.spells) {
788
+ spellFlagsOn(spellFlags, rec.spells);
789
+
790
+ /* parse_monster_spells frequency defaults. */
791
+ const current = spellFlags.clone();
792
+ current.inter(innate);
793
+ if (!current.isEmpty() && freqInnate === 0) freqInnate = 4;
794
+
795
+ const nonInnate = spellFlags.clone();
796
+ nonInnate.diff(breathOrInnate);
797
+ if (!nonInnate.isEmpty() && freqSpell === 0) freqSpell = 4;
798
+ }
799
+
800
+ const spellMsgs: MonsterAltMsg[] = [];
801
+ bindAltMsgs(spellMsgs, rec["message-vis"], "seen");
802
+ bindAltMsgs(spellMsgs, rec["message-invis"], "unseen");
803
+ bindAltMsgs(spellMsgs, rec["message-miss"], "miss");
804
+
805
+ const drops: MonsterDrop[] = [];
806
+ bindDrops(drops, rec.drop, rec["drop-base"], rec["drop-order"]);
807
+
808
+ const friends: MonsterFriends[] = [];
809
+ for (const f of [...(rec.friends ?? [])].reverse()) {
810
+ const num = parseNumberPair(f.number);
811
+ friends.push({
812
+ name: f.name,
813
+ race: null,
814
+ role: friendRole(f.role),
815
+ percentChance: f.chance,
816
+ numberDice: num.dice,
817
+ numberSide: num.side,
818
+ });
819
+ }
820
+
821
+ const friendsBase: MonsterFriendsBase[] = [];
822
+ for (const f of [...(rec["friends-base"] ?? [])].reverse()) {
823
+ const fb = this.bases.get(f.name);
824
+ if (!fb) {
825
+ throw new Error(
826
+ `mon: race ${rec.name}: invalid friends base ${f.name}`,
827
+ );
828
+ }
829
+ const num = parseNumberPair(f.number);
830
+ friendsBase.push({
831
+ base: fb,
832
+ role: friendRole(f.role),
833
+ percentChance: f.chance,
834
+ numberDice: num.dice,
835
+ numberSide: num.side,
836
+ });
837
+ }
838
+
839
+ const mimicKinds: MonsterMimic[] = [...(rec.mimic ?? [])].reverse().map((m) => ({
840
+ tval: m.tval,
841
+ sval: m.sval,
842
+ }));
843
+
844
+ /* parse_monster_shape: a base name wins; races resolve second-pass. */
845
+ const shapes: MonsterShape[] = [...(rec.shape ?? [])].reverse().map((name) => ({
846
+ name,
847
+ race: null,
848
+ base: this.bases.get(name) ?? null,
849
+ }));
850
+
851
+ const unique = flags.has(RF.UNIQUE);
852
+
853
+ return {
854
+ ridx: this.races.length,
855
+ name: rec.name,
856
+ text: joinLines(rec.desc),
857
+ /* parse_monster_plural (mon-init.c L1680-1687) leaves r->plural NULL
858
+ * when the field is absent OR present but empty, so the compiler's
859
+ * bare presence marker for "plural:" must read as null too
860
+ * (r-info.c test_plural0). */
861
+ plural: typeof rec.plural === "string" && rec.plural.length > 0 ? rec.plural : null,
862
+ base,
863
+ avgHp: rec["hit-points"] ?? 0,
864
+ ac: rec["armor-class"] ?? 0,
865
+ sleep: rec.sleepiness ?? 0,
866
+ hearing: Math.trunc(((rec.hearing ?? 0) * maxSight) / 20),
867
+ smell: Math.trunc(((rec.smell ?? 0) * maxSight) / 20),
868
+ speed: rec.speed ?? 0,
869
+ light: rec.light ?? 0,
870
+ mexp: rec.experience ?? 0,
871
+ freqInnate,
872
+ freqSpell,
873
+ spellPower,
874
+ flags,
875
+ spellFlags,
876
+ blows,
877
+ level,
878
+ rarity: rec.rarity ?? 0,
879
+ dAttr,
880
+ dChar,
881
+ maxNum: unique ? 1 : 100,
882
+ curNum: 0,
883
+ spellMsgs,
884
+ drops,
885
+ friends,
886
+ friendsBase,
887
+ mimicKinds,
888
+ shapes,
889
+ };
890
+ }
891
+ }
892
+
893
+ /** Bind all monster-domain pack records into a registry. */
894
+ export function bindMonsters(
895
+ pack: MonsterPackRecords,
896
+ options: BindMonstersOptions = {},
897
+ ): MonsterRegistry {
898
+ return new MonsterRegistry(pack, options);
899
+ }