@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,1021 @@
1
+ /**
2
+ * Player registries, ported from the gamedata binding semantics in
3
+ * reference/src/init.c and reference/src/player-timed.c (Angband 4.2.6).
4
+ *
5
+ * bindPlayer() takes parsed pack JSON records (no fs here) and produces a
6
+ * PlayerRegistry. Binding follows the upstream parser actions exactly; the
7
+ * important subtleties are noted inline:
8
+ *
9
+ * - Skills bind by directive name, not position: the SKILL_ enum orders SEARCH
10
+ * before STEALTH, but p_race.txt / class.txt list stealth before search.
11
+ * - Class skills carry a base (c_skills) and a per-10-levels increment
12
+ * (x_skills); race skills are a single racial bonus.
13
+ * - Magic realms are resolved by name (lookup_realm). Class spells get a
14
+ * class-wide sidx assigned in declaration order and a bidx pointing at their
15
+ * book; the spell effect chain is preserved raw (compilation deferred).
16
+ * - Timed effects prepend an implicit "off" grade (grade 0, max 0), matching
17
+ * parse_player_timed_grade's zero-grade; FOOD grade maxima are scaled by
18
+ * z_info->food_value (100 in the stock pack).
19
+ * - History charts form a graph: entries are grouped by chart id in file order
20
+ * and each entry's successor chart (isucc) is resolved in a second pass.
21
+ *
22
+ * Moddability: every bind* function accepts plain record arrays of the pack
23
+ * shapes, so a mod extends the game by concatenating its records onto the
24
+ * pack's before binding (see the extension test).
25
+ */
26
+
27
+ import { FlagSet } from "../bitflag.js";
28
+ import { colorCharToAttr, colorTextToAttr } from "../color.js";
29
+ import {
30
+ ELEMENT_ENTRIES,
31
+ OBJECT_MODIFIER_ENTRIES,
32
+ STAT_ENTRIES,
33
+ EF,
34
+ ELEM,
35
+ OF,
36
+ PF,
37
+ STAT,
38
+ TMD,
39
+ } from "../generated/index.js";
40
+ import { effectSubtype } from "../effects/effect.js";
41
+ import {
42
+ OF_SIZE,
43
+ PF_SIZE,
44
+ SKILL,
45
+ SKILL_MAX,
46
+ STAT_MAX,
47
+ } from "./types.js";
48
+ import type {
49
+ ClassBook,
50
+ ClassMagic,
51
+ ClassSpell,
52
+ PlayerElementInfo,
53
+ HistoryChart,
54
+ HistoryEntry,
55
+ MagicRealm,
56
+ PlayerBody,
57
+ PlayerClass,
58
+ PlayerProperty,
59
+ PlayerRace,
60
+ Shape,
61
+ StartItem,
62
+ TimedEffect,
63
+ TimedEffectStep,
64
+ TimedFail,
65
+ TimedGrade,
66
+ } from "./types.js";
67
+
68
+ /* re-export sizes for consumers that reach the domain through bind. */
69
+ export { OF_SIZE, PF_SIZE };
70
+
71
+ /** z_info->food_value: FOOD timed-grade maxima scale by this (constants.txt). */
72
+ export const FOOD_VALUE = 100;
73
+
74
+ /**
75
+ * N_ELEMENTS(struct player_class.title): `const char *title[10]`
76
+ * (player.h L313), one title per five of PY_MAX_LEVEL's 50 levels.
77
+ */
78
+ const CLASS_MAX_TITLES = 10;
79
+
80
+ /** ELEM_ names indexed by element value (for RES_ value lines). */
81
+ const ELEMENT_NAMES = ELEMENT_ENTRIES.map((e) => e.name);
82
+
83
+ /** Number of elements (ELEM_MAX). */
84
+ export const ELEM_MAX = ELEMENT_ENTRIES.length;
85
+
86
+ /* ------------------------------------------------------------------ */
87
+ /* Pack record shapes (compiled JSON) */
88
+ /* ------------------------------------------------------------------ */
89
+
90
+ /** stats block shared by p_race.json and class.json records. */
91
+ interface StatsJson {
92
+ str: number;
93
+ int: number;
94
+ wis: number;
95
+ dex: number;
96
+ con: number;
97
+ }
98
+
99
+ /** p_race.json record. */
100
+ export interface PRaceRecordJson {
101
+ name: string;
102
+ stats: StatsJson;
103
+ "skill-disarm-phys": number;
104
+ "skill-disarm-magic": number;
105
+ "skill-device": number;
106
+ "skill-save": number;
107
+ "skill-stealth": number;
108
+ "skill-search": number;
109
+ "skill-melee": number;
110
+ "skill-shoot": number;
111
+ "skill-throw": number;
112
+ "skill-dig": number;
113
+ hitdie: number;
114
+ exp: number;
115
+ infravision: number;
116
+ history: number;
117
+ age: { base_age: number; mod_age: number };
118
+ height: { base_hgt: number; mod_hgt: number };
119
+ weight: { base_wgt: number; mod_wgt: number };
120
+ "obj-flags"?: string[];
121
+ "player-flags"?: string[];
122
+ values?: string[];
123
+ }
124
+
125
+ /** A class skill directive: base value plus per-level increment. */
126
+ interface ClassSkillJson {
127
+ base: number;
128
+ incr: number;
129
+ }
130
+
131
+ /** class.json spell record (effect chain preserved raw). */
132
+ export interface ClassSpellJson {
133
+ name: string;
134
+ level: number;
135
+ mana: number;
136
+ fail: number;
137
+ exp: number;
138
+ effect?: unknown[];
139
+ /** desc: lines (player-spell.c spell->text), joined verbatim by joinLines. */
140
+ desc?: string[];
141
+ }
142
+
143
+ /** class.json book record. */
144
+ export interface ClassBookJson {
145
+ tval: string;
146
+ quality: string;
147
+ name: string;
148
+ spells: number;
149
+ realm: string;
150
+ "book-graphics"?: unknown;
151
+ "book-properties"?: unknown;
152
+ spell?: ClassSpellJson[];
153
+ }
154
+
155
+ /** class.json equip (start item) record. */
156
+ export interface ClassEquipJson {
157
+ tval: string;
158
+ sval: string;
159
+ min: number;
160
+ max: number;
161
+ eopts: string;
162
+ }
163
+
164
+ /** class.json magic block. */
165
+ export interface ClassMagicJson {
166
+ first: number;
167
+ weight: number;
168
+ books: number;
169
+ }
170
+
171
+ /** class.json record. */
172
+ export interface ClassRecordJson {
173
+ name: string;
174
+ stats: StatsJson;
175
+ "skill-disarm-phys": ClassSkillJson;
176
+ "skill-disarm-magic": ClassSkillJson;
177
+ "skill-device": ClassSkillJson;
178
+ "skill-save": ClassSkillJson;
179
+ "skill-stealth": ClassSkillJson;
180
+ "skill-search": ClassSkillJson;
181
+ "skill-melee": ClassSkillJson;
182
+ "skill-shoot": ClassSkillJson;
183
+ "skill-throw": ClassSkillJson;
184
+ "skill-dig": ClassSkillJson;
185
+ hitdie: number;
186
+ exp?: number;
187
+ "max-attacks": number;
188
+ "min-weight": number;
189
+ "strength-multiplier": number;
190
+ title?: string[];
191
+ equip?: ClassEquipJson[];
192
+ "obj-flags"?: string[];
193
+ "player-flags"?: string[];
194
+ magic?: ClassMagicJson;
195
+ book?: ClassBookJson[];
196
+ desc?: string[];
197
+ }
198
+
199
+ /** player_property.json record. */
200
+ export interface PlayerPropertyRecordJson {
201
+ type: string;
202
+ code?: string;
203
+ name: string;
204
+ desc?: string[];
205
+ bindui?: boolean;
206
+ value?: number;
207
+ }
208
+
209
+ /** player_timed.json grade record. */
210
+ export interface TimedGradeJson {
211
+ color: string;
212
+ max: number;
213
+ name: string;
214
+ up_msg?: string;
215
+ down_msg?: string;
216
+ }
217
+
218
+ /** player_timed.json fail record. */
219
+ export interface TimedFailJson {
220
+ code: number;
221
+ flag: string;
222
+ }
223
+
224
+ /** player_timed.json flag-synonym record ("flag-synonym code exact"). */
225
+ export interface TimedFlagSynonymJson {
226
+ code: string;
227
+ exact: number;
228
+ }
229
+
230
+ /** player_timed.json on-begin-effect / on-end-effect chain step. */
231
+ export interface TimedEffectChainJson {
232
+ /** EF_ effect name. */
233
+ eff: string;
234
+ /** subtype/type name (the `type:` directive), or absent. */
235
+ type?: string;
236
+ /** effect dice string (the `effect-dice:` directive), or absent. */
237
+ "effect-dice"?: string;
238
+ }
239
+
240
+ /** player_timed.json record. */
241
+ export interface PlayerTimedRecordJson {
242
+ name: string;
243
+ desc?: string[];
244
+ "on-end"?: string[];
245
+ "on-increase"?: string[];
246
+ "on-decrease"?: string[];
247
+ msgt?: string;
248
+ flags?: string[];
249
+ "lower-bound"?: number;
250
+ fail?: TimedFailJson[];
251
+ grade?: TimedGradeJson[];
252
+ /** Temporary elemental resist granted while active (ELEM_ name). */
253
+ resist?: string;
254
+ /** Object flag(s) duplicated while active; only the first is bound. */
255
+ "flag-synonym"?: TimedFlagSynonymJson[];
256
+ /** Effect chain dispatched when the effect starts (0 -> positive). */
257
+ "on-begin-effect"?: TimedEffectChainJson[];
258
+ /** Effect chain dispatched when the effect lapses (positive -> 0). */
259
+ "on-end-effect"?: TimedEffectChainJson[];
260
+ }
261
+
262
+ /** shape.json record (bound raw beyond name; see Shape). */
263
+ export interface ShapeRecordJson {
264
+ name: string;
265
+ [key: string]: unknown;
266
+ }
267
+
268
+ /** body.json slot record. */
269
+ export interface BodySlotJson {
270
+ slot: string;
271
+ name: string;
272
+ }
273
+
274
+ /** body.json record. */
275
+ export interface BodyRecordJson {
276
+ body: string;
277
+ slot: BodySlotJson[];
278
+ }
279
+
280
+ /** history.json record: one entry, tagged with its chart. */
281
+ export interface HistoryRecordJson {
282
+ chart: { chart: number; next: number; roll: number };
283
+ phrase?: string[];
284
+ }
285
+
286
+ /** realm.json record. */
287
+ export interface RealmRecordJson {
288
+ name: string;
289
+ stat: string;
290
+ verb: string;
291
+ "spell-noun": string;
292
+ "book-noun": string;
293
+ }
294
+
295
+ /** All pack inputs bindPlayer needs; each is the file's records array. */
296
+ export interface PlayerPackRecords {
297
+ races: PRaceRecordJson[];
298
+ classes: ClassRecordJson[];
299
+ properties: PlayerPropertyRecordJson[];
300
+ timed: PlayerTimedRecordJson[];
301
+ shapes: ShapeRecordJson[];
302
+ bodies: BodyRecordJson[];
303
+ history: HistoryRecordJson[];
304
+ realms: RealmRecordJson[];
305
+ }
306
+
307
+ /* ------------------------------------------------------------------ */
308
+ /* Binding helpers */
309
+ /* ------------------------------------------------------------------ */
310
+
311
+ /** string_append semantics: multi-line text concatenates without separator. */
312
+ function joinLines(lines: string[] | undefined): string {
313
+ return lines ? lines.join("") : "";
314
+ }
315
+
316
+ /** grab_flag over a NAME -> value table for "A | B" segments; throws on error. */
317
+ function grabFlags(
318
+ flags: FlagSet,
319
+ table: Record<string, number>,
320
+ lines: string[] | undefined,
321
+ what: string,
322
+ ): void {
323
+ if (!lines) return;
324
+ for (const line of lines) {
325
+ /* A non-string entry is the compiler's presence marker for a flags
326
+ * directive written with no value. parse_class_obj_flags /
327
+ * parse_class_play_flags (init.c L3672, L3692) check parser_hasval()
328
+ * first and return PARSE_ERROR_NONE with the set untouched
329
+ * (c-info.c test_obj_flags0 / test_player_flags0). */
330
+ if (typeof line !== "string") continue;
331
+ for (const raw of line.split("|")) {
332
+ const name = raw.trim();
333
+ if (!name) continue;
334
+ const value = table[name];
335
+ if (value === undefined || value === 0) {
336
+ throw new Error(`player: bad ${what} flag: ${name}`);
337
+ }
338
+ flags.on(value);
339
+ }
340
+ }
341
+ }
342
+
343
+ /** stat_name_to_idx: STAT name ("STR"..) -> index; throws on unknown. */
344
+ function statNameToIdx(name: string): number {
345
+ const idx = (STAT as Record<string, number>)[name];
346
+ if (idx === undefined) {
347
+ throw new Error(`player: unknown stat name: ${name}`);
348
+ }
349
+ return idx;
350
+ }
351
+
352
+ /** findValueArg: "RES_LIGHT[1]" -> { name: "RES_LIGHT", arg: "1" }, or null. */
353
+ function findValueArg(token: string): { name: string; arg: string } | null {
354
+ const open = token.indexOf("[");
355
+ if (open < 0 || !token.endsWith("]")) return null;
356
+ return { name: token.slice(0, open), arg: token.slice(open + 1, -1) };
357
+ }
358
+
359
+ /** newElemInfo: fresh el_info array of resLevel 0, length ELEM_MAX. */
360
+ function newElemInfo(): PlayerElementInfo[] {
361
+ const out: PlayerElementInfo[] = [];
362
+ for (let i = 0; i < ELEM_MAX; i++) out.push({ resLevel: 0 });
363
+ return out;
364
+ }
365
+
366
+ /**
367
+ * parse_p_race_values: apply "RES_<ELEM>[n]" tokens, setting el_info[i].res_level
368
+ * = n (grab_index_and_int with the "RES_" prefix over element names).
369
+ */
370
+ function applyRaceValues(elInfo: PlayerElementInfo[], lines: string[] | undefined): void {
371
+ if (!lines) return;
372
+ for (const line of lines) {
373
+ for (const raw of line.split("|")) {
374
+ const token = raw.trim();
375
+ if (!token) continue;
376
+ const parsed = findValueArg(token);
377
+ if (!parsed) {
378
+ throw new Error(`player: invalid race value: ${token}`);
379
+ }
380
+ const m = /^\s*([-+]?\d+)\s*$/.exec(parsed.arg);
381
+ if (!m) throw new Error(`player: invalid race value int: ${token}`);
382
+ let matched = false;
383
+ for (let i = 0; i < ELEMENT_NAMES.length; i++) {
384
+ if ("RES_" + (ELEMENT_NAMES[i] as string) === parsed.name) {
385
+ (elInfo[i] as PlayerElementInfo).resLevel = Number(m[1]);
386
+ matched = true;
387
+ break;
388
+ }
389
+ }
390
+ if (!matched) throw new Error(`player: unknown race value: ${token}`);
391
+ }
392
+ }
393
+ }
394
+
395
+ /** obj_mods[]: the five stats then the object modifiers, index = value. */
396
+ const SHAPE_MOD_NAMES: readonly string[] = [
397
+ ...STAT_ENTRIES.map((e) => e.name),
398
+ ...OBJECT_MODIFIER_ENTRIES.map((e) => e.name),
399
+ ];
400
+
401
+ /** shape.txt skill-<name> keys -> SKILL indices (parse_shape_skill_*). */
402
+ const SHAPE_SKILL_KEYS: ReadonlyArray<[string, number]> = [
403
+ ["skill-disarm-phys", SKILL.DISARM_PHYS],
404
+ ["skill-disarm-magic", SKILL.DISARM_MAGIC],
405
+ ["skill-save", SKILL.SAVE],
406
+ ["skill-stealth", SKILL.STEALTH],
407
+ ["skill-search", SKILL.SEARCH],
408
+ ["skill-melee", SKILL.TO_HIT_MELEE],
409
+ ["skill-throw", SKILL.TO_HIT_THROW],
410
+ ["skill-dig", SKILL.DIGGING],
411
+ ];
412
+
413
+ /**
414
+ * parse_shape_* (init.c L3013): bind one shape.json record - the combat
415
+ * bonuses, skills, object/player flags, the modifier/resist values
416
+ * ("STR[-3] | STEALTH[5]" over obj_mods, "RES_<ELEM>[n]" over elements)
417
+ * and the raw assume-shape effect records.
418
+ */
419
+ function bindShape(rec: ShapeRecordJson, sidx: number): Shape {
420
+ const combat = (rec["combat"] ?? {}) as Record<string, number>;
421
+ const skills = new Array<number>(SKILL_MAX).fill(0);
422
+ for (const [key, skill] of SHAPE_SKILL_KEYS) {
423
+ if (typeof rec[key] === "number") skills[skill] = rec[key] as number;
424
+ }
425
+
426
+ const flags = new FlagSet(OF_SIZE);
427
+ for (const line of (rec["obj-flags"] as string[] | undefined) ?? []) {
428
+ for (const raw of line.split("|")) {
429
+ const name = raw.trim();
430
+ if (!name) continue;
431
+ const value = OF[name as keyof typeof OF];
432
+ if (typeof value !== "number") {
433
+ throw new Error(`player: unknown shape obj-flag: ${name}`);
434
+ }
435
+ flags.on(value);
436
+ }
437
+ }
438
+ const pflags = new FlagSet(PF_SIZE);
439
+ for (const line of (rec["player-flags"] as string[] | undefined) ?? []) {
440
+ for (const raw of line.split("|")) {
441
+ const name = raw.trim();
442
+ if (!name) continue;
443
+ const value = PF[name as keyof typeof PF];
444
+ if (typeof value !== "number") {
445
+ throw new Error(`player: unknown shape player-flag: ${name}`);
446
+ }
447
+ pflags.on(value);
448
+ }
449
+ }
450
+
451
+ const modifiers = new Array<number>(SHAPE_MOD_NAMES.length).fill(0);
452
+ const elInfo = newElemInfo();
453
+ for (const line of (rec["values"] as string[] | undefined) ?? []) {
454
+ for (const raw of line.split("|")) {
455
+ const token = raw.trim();
456
+ if (!token) continue;
457
+ const parsed = findValueArg(token);
458
+ if (!parsed) throw new Error(`player: invalid shape value: ${token}`);
459
+ const m = /^\s*([-+]?\d+)\s*$/.exec(parsed.arg);
460
+ if (!m) throw new Error(`player: invalid shape value int: ${token}`);
461
+ const mod = SHAPE_MOD_NAMES.indexOf(parsed.name);
462
+ if (mod >= 0) {
463
+ modifiers[mod] = Number(m[1]);
464
+ continue;
465
+ }
466
+ let matched = false;
467
+ for (let i = 0; i < ELEMENT_ENTRIES.length; i++) {
468
+ if ("RES_" + ELEMENT_ENTRIES[i]!.name === parsed.name) {
469
+ (elInfo[i] as PlayerElementInfo).resLevel = Number(m[1]);
470
+ matched = true;
471
+ break;
472
+ }
473
+ }
474
+ if (!matched) throw new Error(`player: unknown shape value: ${token}`);
475
+ }
476
+ }
477
+
478
+ return {
479
+ sidx,
480
+ name: rec.name,
481
+ toA: combat["to-a"] ?? 0,
482
+ toH: combat["to-h"] ?? 0,
483
+ toD: combat["to-d"] ?? 0,
484
+ skills,
485
+ flags,
486
+ pflags,
487
+ modifiers,
488
+ elInfo,
489
+ effects: (rec["effect"] as Shape["effects"] | undefined) ?? [],
490
+ effectMsg: (rec["effect-msg"] as string | undefined) ?? null,
491
+ blows: (rec["blow"] as string[] | undefined) ?? [],
492
+ };
493
+ }
494
+
495
+ /** Resolve a colour token (single char or full name) to an attr. */
496
+ function colorToAttr(color: string): number {
497
+ return color.length > 1 ? colorTextToAttr(color) : colorCharToAttr(color);
498
+ }
499
+
500
+ /** Split an eopts field like "birth_no_recall" or "none" into codes. */
501
+ function parseEopts(eopts: string): string[] {
502
+ const out: string[] = [];
503
+ for (const raw of eopts.split(/[ |]+/)) {
504
+ const tok = raw.trim();
505
+ if (tok.length > 0 && tok !== "none") out.push(tok);
506
+ }
507
+ return out;
508
+ }
509
+
510
+ /* ------------------------------------------------------------------ */
511
+ /* Registry */
512
+ /* ------------------------------------------------------------------ */
513
+
514
+ /** Everything the player domain binds from the pack. */
515
+ export class PlayerRegistry {
516
+ /** Record order mirrors p_race.txt; ridx is the array index. */
517
+ readonly races: PlayerRace[];
518
+ /** Record order mirrors class.txt; cidx is the array index. */
519
+ readonly classes: PlayerClass[];
520
+ readonly properties: PlayerProperty[];
521
+ /** TMD index -> timed effect. */
522
+ readonly timed: TimedEffect[];
523
+ readonly shapes: Shape[];
524
+ readonly bodies: PlayerBody[];
525
+ /** chart idx -> chart. */
526
+ readonly histories: Map<number, HistoryChart>;
527
+ /** realm name -> realm. */
528
+ readonly realms: Map<string, MagicRealm>;
529
+
530
+ private readonly racesByName: Map<string, PlayerRace>;
531
+ private readonly classesByName: Map<string, PlayerClass>;
532
+
533
+ constructor(pack: PlayerPackRecords) {
534
+ this.realms = bindRealms(pack.realms);
535
+ this.histories = bindHistories(pack.history);
536
+ this.bodies = bindBodies(pack.bodies);
537
+ this.properties = bindProperties(pack.properties);
538
+ this.timed = bindTimed(pack.timed);
539
+ this.shapes = pack.shapes.map((rec, sidx) => bindShape(rec, sidx));
540
+
541
+ this.races = pack.races.map((rec, ridx) => bindRace(rec, ridx));
542
+ this.classes = pack.classes.map((rec, cidx) =>
543
+ bindClass(rec, cidx, this.realms),
544
+ );
545
+
546
+ this.racesByName = new Map();
547
+ for (const r of this.races) this.racesByName.set(r.name.toLowerCase(), r);
548
+ this.classesByName = new Map();
549
+ for (const c of this.classes) this.classesByName.set(c.name.toLowerCase(), c);
550
+ }
551
+
552
+ /** player_id2race by name (case-insensitive), or null. */
553
+ raceByName(name: string): PlayerRace | null {
554
+ return this.racesByName.get(name.toLowerCase()) ?? null;
555
+ }
556
+
557
+ /** player_id2class by name (case-insensitive), or null. */
558
+ classByName(name: string): PlayerClass | null {
559
+ return this.classesByName.get(name.toLowerCase()) ?? null;
560
+ }
561
+
562
+ /** Starting chart for a race, resolved from its historyChart index. */
563
+ historyChart(race: PlayerRace): HistoryChart | null {
564
+ return this.histories.get(race.historyChart) ?? null;
565
+ }
566
+ }
567
+
568
+ /** Bind all player-domain pack records into a registry. */
569
+ export function bindPlayer(pack: PlayerPackRecords): PlayerRegistry {
570
+ return new PlayerRegistry(pack);
571
+ }
572
+
573
+ /* ------------------------------------------------------------------ */
574
+ /* Per-file binders */
575
+ /* ------------------------------------------------------------------ */
576
+
577
+ function bindRealms(records: RealmRecordJson[]): Map<string, MagicRealm> {
578
+ const map = new Map<string, MagicRealm>();
579
+ for (const rec of records) {
580
+ map.set(rec.name, {
581
+ name: rec.name,
582
+ stat: statNameToIdx(rec.stat),
583
+ verb: rec.verb,
584
+ spellNoun: rec["spell-noun"],
585
+ bookNoun: rec["book-noun"],
586
+ });
587
+ }
588
+ return map;
589
+ }
590
+
591
+ function bindHistories(records: HistoryRecordJson[]): Map<number, HistoryChart> {
592
+ const map = new Map<number, HistoryChart>();
593
+ /* Group entries by chart id, preserving file order within a chart. */
594
+ for (const rec of records) {
595
+ const id = rec.chart.chart;
596
+ let chart = map.get(id);
597
+ if (!chart) {
598
+ chart = { idx: id, entries: [] };
599
+ map.set(id, chart);
600
+ }
601
+ chart.entries.push({
602
+ roll: rec.chart.roll,
603
+ isucc: rec.chart.next,
604
+ succ: null,
605
+ text: joinLines(rec.phrase),
606
+ });
607
+ }
608
+ /* finish_parse_history: resolve successor charts. */
609
+ for (const chart of map.values()) {
610
+ for (const entry of chart.entries) {
611
+ if (entry.isucc === 0) continue;
612
+ const succ = map.get(entry.isucc);
613
+ if (!succ) {
614
+ throw new Error(
615
+ `player: history entry references missing chart ${entry.isucc}`,
616
+ );
617
+ }
618
+ entry.succ = succ;
619
+ }
620
+ }
621
+ return map;
622
+ }
623
+
624
+ function bindBodies(records: BodyRecordJson[]): PlayerBody[] {
625
+ return records.map((rec) => ({
626
+ name: rec.body,
627
+ count: rec.slot.length,
628
+ slots: rec.slot.map((s) => ({ type: s.slot, name: s.name })),
629
+ }));
630
+ }
631
+
632
+ function bindProperties(records: PlayerPropertyRecordJson[]): PlayerProperty[] {
633
+ return records.map((rec) => ({
634
+ type: rec.type,
635
+ code: rec.code ?? null,
636
+ name: rec.name,
637
+ desc: joinLines(rec.desc),
638
+ bindui: rec.bindui ?? false,
639
+ value: rec.value ?? null,
640
+ }));
641
+ }
642
+
643
+ /**
644
+ * flags: for a timed effect. parse_player_timed_effect_flags
645
+ * (player-timed.c L562-590) accepts an empty line, accepts NONSTACKING, and
646
+ * returns PARSE_ERROR_INVALID_FLAG for anything else. Asserted by ptimed.c
647
+ * test_flags0 and test_badflags0.
648
+ */
649
+ function timedNonStacking(rec: PlayerTimedRecordJson): boolean {
650
+ let nonStacking = false;
651
+ for (const line of rec.flags ?? []) {
652
+ /* A non-string entry is the compiler's marker for a bare "flags:". */
653
+ if (typeof line !== "string") continue;
654
+ for (const raw of line.split(/[ |]+/)) {
655
+ const name = raw.trim();
656
+ if (!name) continue;
657
+ if (name !== "NONSTACKING") {
658
+ throw new Error(
659
+ `player_timed ${rec.name}: unknown flag ${name} ` +
660
+ `(PARSE_ERROR_INVALID_FLAG)`,
661
+ );
662
+ }
663
+ nonStacking = true;
664
+ }
665
+ }
666
+ return nonStacking;
667
+ }
668
+
669
+ /**
670
+ * lower-bound:. parse_player_timed_effect_lower_bound (player-timed.c
671
+ * L599-604) refuses anything outside 0..32767, because the duration it is
672
+ * compared against is an int16_t (ptimed.c test_badlowerbound0).
673
+ */
674
+ function timedLowerBound(rec: PlayerTimedRecordJson): number {
675
+ const bound = rec["lower-bound"];
676
+ if (bound === undefined) return 0;
677
+ if (bound < 0 || bound > 32767) {
678
+ throw new Error(
679
+ `player_timed ${rec.name}: lower-bound ${String(bound)} out of range ` +
680
+ `(PARSE_ERROR_INVALID_VALUE)`,
681
+ );
682
+ }
683
+ return bound;
684
+ }
685
+
686
+ function bindTimed(records: PlayerTimedRecordJson[]): TimedEffect[] {
687
+ const out: TimedEffect[] = [];
688
+ for (const rec of records) {
689
+ const index = (TMD as Record<string, number>)[rec.name];
690
+ if (index === undefined) {
691
+ throw new Error(`player: unknown timed effect name: ${rec.name}`);
692
+ }
693
+ const foodScale = rec.name === "FOOD" ? FOOD_VALUE : 1;
694
+
695
+ /* Implicit "off" grade (parse_player_timed_grade's zero grade). */
696
+ const grades: TimedGrade[] = [
697
+ { grade: 0, color: 0, max: 0, name: null, upMsg: null, downMsg: null },
698
+ ];
699
+ for (const g of rec.grade ?? []) {
700
+ /*
701
+ * parse_player_timed_grade (player-timed.c L262-265) rejects a maximum
702
+ * that would collide with the implicit zero grade or overflow the
703
+ * int16_t a duration is stored in, and (L273-280) rejects grades that
704
+ * do not ascend. ptimed.c test_badgrade0 asserts all three as
705
+ * PARSE_ERROR_INVALID_VALUE.
706
+ */
707
+ if (g.max <= 0 || g.max > Math.trunc(32767 / foodScale)) {
708
+ throw new Error(
709
+ `player_timed ${rec.name}: grade maximum ${String(g.max)} out of ` +
710
+ `range (PARSE_ERROR_INVALID_VALUE)`,
711
+ );
712
+ }
713
+ const highest = grades[grades.length - 1] as TimedGrade;
714
+ if (g.max * foodScale <= highest.max) {
715
+ throw new Error(
716
+ `player_timed ${rec.name}: grade maximum ${String(g.max)} does not ` +
717
+ `ascend (PARSE_ERROR_INVALID_VALUE)`,
718
+ );
719
+ }
720
+ /* Single-char names/messages are upstream dummies -> null. */
721
+ const name = g.name.length === 1 ? null : g.name;
722
+ const upMsg = g.up_msg !== undefined && g.up_msg.length > 1 ? g.up_msg : null;
723
+ const grade: TimedGrade = {
724
+ grade: grades.length,
725
+ color: colorToAttr(g.color),
726
+ max: g.max * foodScale,
727
+ name,
728
+ upMsg,
729
+ downMsg: g.down_msg ?? null,
730
+ };
731
+ grades.push(grade);
732
+ }
733
+
734
+ const fail: TimedFail[] = (rec.fail ?? []).map((f) => ({
735
+ code: f.code,
736
+ flag: f.flag,
737
+ }));
738
+
739
+ /*
740
+ * temp_resist (parse_player_timed_resist): the pack `resist` name maps to
741
+ * an element index via proj_name_to_idx upstream. For the five OPP_*
742
+ * effects the resist name is one of ACID/ELEC/FIRE/COLD/POIS, whose ELEM_
743
+ * indices (0..4) coincide with the PROJ_ indices proj_name_to_idx returns,
744
+ * so ELEM[name] is the faithful equivalent. Absent -> -1 (no resist).
745
+ */
746
+ let tempResist = -1;
747
+ if (rec.resist !== undefined) {
748
+ const elem = (ELEM as Record<string, number>)[rec.resist];
749
+ if (elem === undefined) {
750
+ /* player-timed.c L347-349: idx < 0 || idx >= ELEM_MAX is
751
+ * PARSE_ERROR_INVALID_VALUE (ptimed.c test_badresist0). */
752
+ throw new Error(
753
+ `player_timed ${rec.name}: unknown resist element ${rec.resist} ` +
754
+ `(PARSE_ERROR_INVALID_VALUE)`,
755
+ );
756
+ }
757
+ tempResist = elem;
758
+ }
759
+
760
+ /*
761
+ * oflag_dup / oflag_syn (parse_player_timed_flag_synonym): the first
762
+ * flag-synonym's code maps to an OF_ index (code_index_in_array); a valid
763
+ * synonym is always > OF_NONE(0). Absent -> 0 (OF_NONE, no synonym).
764
+ */
765
+ const synonym = rec["flag-synonym"]?.[0];
766
+ let oflagDup = 0;
767
+ if (synonym !== undefined) {
768
+ const code = (OF as Record<string, number>)[synonym.code] ?? 0;
769
+ if (code <= 0) {
770
+ /* player-timed.c L419-421: idx <= OF_NONE is
771
+ * PARSE_ERROR_INVALID_OBJ_PROP_CODE (ptimed.c test_badflagsyn0). */
772
+ throw new Error(
773
+ `player_timed ${rec.name}: unknown flag-synonym code ${synonym.code} ` +
774
+ `(PARSE_ERROR_INVALID_OBJ_PROP_CODE)`,
775
+ );
776
+ }
777
+ oflagDup = code;
778
+ }
779
+ const oflagSyn = synonym !== undefined && synonym.exact !== 0;
780
+
781
+ /*
782
+ * on_begin_effect / on_end_effect (parse_player_timed_effect): resolve each
783
+ * chain step's EF_ code and its subtype (effect_subtype) at bind time, and
784
+ * keep any effect-dice override. Only SPRINT (on-end TIMED_INC_NO_RES:SLOW)
785
+ * and SCRAMBLE (SCRAMBLE_STATS / UNSCRAMBLE_STATS) use these in stock data.
786
+ */
787
+ const parseChain = (
788
+ recs: TimedEffectChainJson[] | undefined,
789
+ ): TimedEffectStep[] | undefined => {
790
+ if (!recs || recs.length === 0) return undefined;
791
+ return recs.map((r) => {
792
+ const effect = (EF as Record<string, number>)[r.eff];
793
+ if (effect === undefined) {
794
+ throw new Error(`player_timed ${rec.name}: unknown effect ${r.eff}`);
795
+ }
796
+ const subtype = r.type !== undefined ? effectSubtype(effect, r.type) : 0;
797
+ if (subtype < 0) {
798
+ /* grab_effect_data (init.c L192-194) returns
799
+ * PARSE_ERROR_INVALID_VALUE when effect_subtype() cannot resolve the
800
+ * type (ptimed.c test_badbegineffect0 / test_badendeffect0). */
801
+ throw new Error(
802
+ `player_timed ${rec.name}: invalid subtype ${r.type ?? ""} for ` +
803
+ `effect ${r.eff} (PARSE_ERROR_INVALID_VALUE)`,
804
+ );
805
+ }
806
+ const step: TimedEffectStep = { effect, subtype };
807
+ if (r["effect-dice"] !== undefined) step.dice = r["effect-dice"];
808
+ return step;
809
+ });
810
+ };
811
+ const onBeginEffect = parseChain(rec["on-begin-effect"]);
812
+ const onEndEffect = parseChain(rec["on-end-effect"]);
813
+
814
+ out.push({
815
+ index,
816
+ name: rec.name,
817
+ desc: joinLines(rec.desc),
818
+ onEnd: joinLines(rec["on-end"]),
819
+ onIncrease: joinLines(rec["on-increase"]),
820
+ onDecrease: joinLines(rec["on-decrease"]),
821
+ msgt: rec.msgt ?? "GENERIC",
822
+ nonStacking: timedNonStacking(rec),
823
+ lowerBound: timedLowerBound(rec),
824
+ tempResist,
825
+ oflagDup,
826
+ oflagSyn,
827
+ grades,
828
+ fail,
829
+ ...(onBeginEffect ? { onBeginEffect } : {}),
830
+ ...(onEndEffect ? { onEndEffect } : {}),
831
+ });
832
+ }
833
+ return out;
834
+ }
835
+
836
+ /** Read the ten skill-* directives (race form: plain ints) into a skills array. */
837
+ function raceSkills(rec: PRaceRecordJson): number[] {
838
+ const skills = new Array<number>(SKILL_MAX).fill(0);
839
+ skills[SKILL.DISARM_PHYS] = rec["skill-disarm-phys"];
840
+ skills[SKILL.DISARM_MAGIC] = rec["skill-disarm-magic"];
841
+ skills[SKILL.DEVICE] = rec["skill-device"];
842
+ skills[SKILL.SAVE] = rec["skill-save"];
843
+ skills[SKILL.STEALTH] = rec["skill-stealth"];
844
+ skills[SKILL.SEARCH] = rec["skill-search"];
845
+ skills[SKILL.TO_HIT_MELEE] = rec["skill-melee"];
846
+ skills[SKILL.TO_HIT_BOW] = rec["skill-shoot"];
847
+ skills[SKILL.TO_HIT_THROW] = rec["skill-throw"];
848
+ skills[SKILL.DIGGING] = rec["skill-dig"];
849
+ return skills;
850
+ }
851
+
852
+ /** statAdj array in STAT order from a stats block. */
853
+ function statAdj(stats: StatsJson): number[] {
854
+ const adj = new Array<number>(STAT_MAX).fill(0);
855
+ adj[STAT.STR] = stats.str;
856
+ adj[STAT.INT] = stats.int;
857
+ adj[STAT.WIS] = stats.wis;
858
+ adj[STAT.DEX] = stats.dex;
859
+ adj[STAT.CON] = stats.con;
860
+ return adj;
861
+ }
862
+
863
+ function bindRace(rec: PRaceRecordJson, ridx: number): PlayerRace {
864
+ const flags = new FlagSet(OF_SIZE);
865
+ grabFlags(flags, OF as unknown as Record<string, number>, rec["obj-flags"], "race object");
866
+ const pflags = new FlagSet(PF_SIZE);
867
+ grabFlags(pflags, PF as unknown as Record<string, number>, rec["player-flags"], "race player");
868
+ const elInfo = newElemInfo();
869
+ applyRaceValues(elInfo, rec.values);
870
+
871
+ return {
872
+ ridx,
873
+ name: rec.name,
874
+ hitdie: rec.hitdie,
875
+ expFactor: rec.exp,
876
+ baseAge: rec.age.base_age,
877
+ modAge: rec.age.mod_age,
878
+ baseHeight: rec.height.base_hgt,
879
+ modHeight: rec.height.mod_hgt,
880
+ baseWeight: rec.weight.base_wgt,
881
+ modWeight: rec.weight.mod_wgt,
882
+ infravision: rec.infravision,
883
+ body: 0,
884
+ statAdj: statAdj(rec.stats),
885
+ skills: raceSkills(rec),
886
+ flags,
887
+ pflags,
888
+ historyChart: rec.history,
889
+ elInfo,
890
+ };
891
+ }
892
+
893
+ /** Read the ten skill-* directives (class form: base + incr). */
894
+ function classSkills(rec: ClassRecordJson): {
895
+ skills: number[];
896
+ extra: number[];
897
+ } {
898
+ const skills = new Array<number>(SKILL_MAX).fill(0);
899
+ const extra = new Array<number>(SKILL_MAX).fill(0);
900
+ const put = (idx: number, s: ClassSkillJson): void => {
901
+ skills[idx] = s.base;
902
+ extra[idx] = s.incr;
903
+ };
904
+ put(SKILL.DISARM_PHYS, rec["skill-disarm-phys"]);
905
+ put(SKILL.DISARM_MAGIC, rec["skill-disarm-magic"]);
906
+ put(SKILL.DEVICE, rec["skill-device"]);
907
+ put(SKILL.SAVE, rec["skill-save"]);
908
+ put(SKILL.STEALTH, rec["skill-stealth"]);
909
+ put(SKILL.SEARCH, rec["skill-search"]);
910
+ put(SKILL.TO_HIT_MELEE, rec["skill-melee"]);
911
+ put(SKILL.TO_HIT_BOW, rec["skill-shoot"]);
912
+ put(SKILL.TO_HIT_THROW, rec["skill-throw"]);
913
+ put(SKILL.DIGGING, rec["skill-dig"]);
914
+ return { skills, extra };
915
+ }
916
+
917
+ function bindClassMagic(
918
+ rec: ClassRecordJson,
919
+ realms: Map<string, MagicRealm>,
920
+ ): ClassMagic {
921
+ const magic = rec.magic;
922
+ if (!magic) {
923
+ return { spellFirst: 0, spellWeight: 0, numBooks: 0, totalSpells: 0, books: [] };
924
+ }
925
+ const books: ClassBook[] = [];
926
+ let sidx = 0;
927
+ const bookRecs = rec.book ?? [];
928
+ for (let bidx = 0; bidx < bookRecs.length; bidx++) {
929
+ const b = bookRecs[bidx] as ClassBookJson;
930
+ const realm = realms.get(b.realm);
931
+ if (!realm) {
932
+ throw new Error(`player: class ${rec.name}: unknown realm ${b.realm}`);
933
+ }
934
+ const spells: ClassSpell[] = [];
935
+ for (const s of b.spell ?? []) {
936
+ spells.push({
937
+ name: s.name,
938
+ sidx: sidx++,
939
+ bidx,
940
+ level: s.level,
941
+ mana: s.mana,
942
+ fail: s.fail,
943
+ exp: s.exp,
944
+ realm,
945
+ effectsRaw: s.effect ? [...s.effect] : [],
946
+ text: joinLines(s.desc),
947
+ });
948
+ }
949
+ books.push({
950
+ tval: b.tval,
951
+ tvalIdx: 0,
952
+ sval: 0,
953
+ dungeon: b.quality === "dungeon",
954
+ name: b.name,
955
+ realm,
956
+ numSpells: b.spells,
957
+ spells,
958
+ graphics: b["book-graphics"] ?? null,
959
+ properties: b["book-properties"] ?? null,
960
+ });
961
+ }
962
+ return {
963
+ spellFirst: magic.first,
964
+ spellWeight: magic.weight,
965
+ numBooks: magic.books,
966
+ totalSpells: sidx,
967
+ books,
968
+ };
969
+ }
970
+
971
+ function bindClass(
972
+ rec: ClassRecordJson,
973
+ cidx: number,
974
+ realms: Map<string, MagicRealm>,
975
+ ): PlayerClass {
976
+ const flags = new FlagSet(OF_SIZE);
977
+ grabFlags(flags, OF as unknown as Record<string, number>, rec["obj-flags"], "class object");
978
+ const pflags = new FlagSet(PF_SIZE);
979
+ grabFlags(pflags, PF as unknown as Record<string, number>, rec["player-flags"], "class player");
980
+
981
+ const { skills, extra } = classSkills(rec);
982
+
983
+ const startItems: StartItem[] = (rec.equip ?? []).map((e) => ({
984
+ tval: e.tval,
985
+ sval: e.sval,
986
+ min: e.min,
987
+ max: e.max,
988
+ eopts: parseEopts(e.eopts),
989
+ }));
990
+
991
+ /*
992
+ * parse_class_title (init.c L3564-3572) fills the fixed-size
993
+ * `const char *title[10]` and returns
994
+ * PARSE_ERROR_TOO_MANY_ENTRIES once it is full (c-info.c test_title_bad0).
995
+ */
996
+ const titles = rec.title ? [...rec.title] : [];
997
+ if (titles.length > CLASS_MAX_TITLES) {
998
+ throw new Error(
999
+ `player: class ${rec.name} has ${String(titles.length)} titles, ` +
1000
+ `max ${String(CLASS_MAX_TITLES)} (PARSE_ERROR_TOO_MANY_ENTRIES)`,
1001
+ );
1002
+ }
1003
+
1004
+ return {
1005
+ cidx,
1006
+ name: rec.name,
1007
+ titles,
1008
+ statAdj: statAdj(rec.stats),
1009
+ skills,
1010
+ extraSkills: extra,
1011
+ hitdie: rec.hitdie,
1012
+ expFactor: rec.exp ?? 0,
1013
+ flags,
1014
+ pflags,
1015
+ maxAttacks: rec["max-attacks"],
1016
+ minWeight: rec["min-weight"],
1017
+ attMultiply: rec["strength-multiplier"],
1018
+ startItems,
1019
+ magic: bindClassMagic(rec, realms),
1020
+ };
1021
+ }