@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,1344 @@
1
+ /**
2
+ * Random artifact generation: the data model and power-measurement half,
3
+ * ported from reference/src/obj-randart.c (Angband 4.2.6) lines 1-1332 plus
4
+ * the struct artifact_set_data allocator (obj-randart.c L2993) and the
5
+ * struct definition in obj-randart.h.
6
+ *
7
+ * This module ports the parts of the randart generator that measure the
8
+ * standard artifact set: it evaluates each artifact's power (artifactPower,
9
+ * upstream artifact_power), records the baseline power statistics
10
+ * (storeBasePower), tallies how often each ability appears (collectArtifactData
11
+ * and the count_* helpers), and rescales those tallies into generation
12
+ * frequencies (parseFrequencies / rescaleFreqs / adjustFreqs). The actual
13
+ * generation of new artifacts (do_randart and its helpers, obj-randart.c
14
+ * L1332+) is a separate, later port.
15
+ *
16
+ * Faithful notes / approximations:
17
+ * - The upstream file_putf(log_file, ...) logging is dropped throughout; it
18
+ * never affects any returned value (same convention as power.ts).
19
+ * - artifact_power (obj-randart.c L186) builds a "fake" object with
20
+ * make_fake_artifact (obj-make.c L728), which is object_prep(kind, 0,
21
+ * MAXIMISE) (obj-make.c L817) followed by copy_artifact_data (obj-make.c
22
+ * L520). artifactPower reproduces that field mapping directly into a
23
+ * PowerObject; the MAXIMISE and MINIMISE aspects it uses consume no RNG, so
24
+ * the two are inlined as pure rvMaximise/rvMinimise helpers and artifactPower
25
+ * needs no Rng.
26
+ * - The fake object's curse timeouts (copy_curses, obj-curse.c) are set from a
27
+ * RANDOMISE dice roll upstream. Timeouts never enter object_power (cursePower
28
+ * reads only curse power), so artifactPower maps curse powers with timeout 0
29
+ * and consumes no RNG. Standard artifacts carry no curses, so RNG order in
30
+ * storeBasePower is unaffected either way.
31
+ * - Upstream mean()/variance() (z-util.c L1389/L1516) are exact-rational
32
+ * multi-precision routines; store_base_power calls them with a non-NULL frac,
33
+ * which is the "round the result down" path. Both are now ported for real in
34
+ * ../rational (saturation and all) and called through meanFloored /
35
+ * varianceFloored below, rather than reimplemented here.
36
+ */
37
+
38
+ import { ELEM, KF, OBJ_MOD, OF, TV } from "../generated/index.js";
39
+ import { ART_IDX } from "../generated/randart-properties.js";
40
+ import type { Rng } from "../rng.js";
41
+ import type { ObjRegistry } from "./bind.js";
42
+ import type { CurseData, CurseTimedFoil } from "./object.js";
43
+ import type { ActivationSummarizer } from "./randart-build.js";
44
+ import {
45
+ copyBrands,
46
+ copySlays,
47
+ tvalCanHaveCharges,
48
+ tvalIsEdible,
49
+ tvalIsFuel,
50
+ tvalIsLauncher,
51
+ tvalIsPotion,
52
+ } from "./object.js";
53
+ import { mean, variance } from "../rational.js";
54
+ import { objectPower } from "./power.js";
55
+ import type { PowerObject } from "./power.js";
56
+ import type { Artifact, ElementInfo, ObjectKind } from "./types.js";
57
+ import { ELEM_MAX, newOfFlags, OBJ_MOD_MAX, TV_MAX } from "./types.js";
58
+ import type { RandomValue } from "../rng.js";
59
+
60
+ /** ART_IDX_TOTAL: number of learned-probability slots (obj-randart.h). */
61
+ const ART_IDX_TOTAL = ART_IDX.TOTAL;
62
+
63
+ /* ------------------------------------------------------------------ */
64
+ /* struct artifact_set_data (obj-randart.h L59) */
65
+ /* ------------------------------------------------------------------ */
66
+
67
+ /**
68
+ * struct artifact_set_data: everything the generator learns from the standard
69
+ * artifact set. Field names mirror the upstream struct (snake_case -> camelCase).
70
+ */
71
+ export interface ArtifactSetData {
72
+ /* Mean start and increment values for to_hit, to_dam and AC. */
73
+ hitIncrement: number;
74
+ damIncrement: number;
75
+ hitStartval: number;
76
+ damStartval: number;
77
+ acStartval: number;
78
+ acIncrement: number;
79
+
80
+ /* Data structures for learned probabilities. */
81
+ artProbs: number[];
82
+ tvProbs: number[];
83
+ tvNum: number[];
84
+ bowTotal: number;
85
+ meleeTotal: number;
86
+ bootTotal: number;
87
+ gloveTotal: number;
88
+ headgearTotal: number;
89
+ shieldTotal: number;
90
+ cloakTotal: number;
91
+ armorTotal: number;
92
+ otherTotal: number;
93
+ total: number;
94
+ negPowerTotal: number;
95
+
96
+ /* Tval frequency values. */
97
+ tvFreq: number[];
98
+
99
+ /* Artifact power ratings. */
100
+ basePower: number[];
101
+ maxPower: number;
102
+ minPower: number;
103
+ avgPower: number;
104
+ varPower: number;
105
+ avgTvPower: number[];
106
+ minTvPower: number[];
107
+ maxTvPower: number[];
108
+
109
+ /* Base item levels. */
110
+ baseItemLevel: number[];
111
+
112
+ /* Base item rarities. */
113
+ baseItemProb: number[];
114
+
115
+ /* Artifact rarities. */
116
+ baseArtAlloc: number[];
117
+
118
+ /**
119
+ * The player-timed failure tables (timed effect NAME -> fail directives) for
120
+ * artifact_curse_conflicts' TIMED_INC foil rejection (obj-curse.c L267-296).
121
+ * Built by the game from the bound TimedEffect[]; absent => the foil branch
122
+ * is skipped (curses still filtered by explicit conflict flags). See gap 3.3.
123
+ */
124
+ timedFoil?: CurseTimedFoil | undefined;
125
+ /**
126
+ * effect_summarize_properties (effects-info.c) for
127
+ * remove_contradictory_activation's redundancy check (obj-randart.c L2420,
128
+ * gap 3.8). Lives in the effects domain; injected here. Absent => a redundant
129
+ * activation is never stripped (conservative). Wired from the effects layer.
130
+ */
131
+ activationSummarize?: ActivationSummarizer | undefined;
132
+ }
133
+
134
+ /* ------------------------------------------------------------------ */
135
+ /* Arrays of indices by item type, used in frequency generation */
136
+ /* (obj-randart.c L52) */
137
+ /* ------------------------------------------------------------------ */
138
+
139
+ const artIdxBow: readonly number[] = [
140
+ ART_IDX.BOW_SHOTS,
141
+ ART_IDX.BOW_MIGHT,
142
+ ART_IDX.BOW_BRAND,
143
+ ART_IDX.BOW_SLAY,
144
+ ];
145
+ const artIdxWeapon: readonly number[] = [
146
+ ART_IDX.WEAPON_HIT,
147
+ ART_IDX.WEAPON_DAM,
148
+ ART_IDX.WEAPON_AGGR,
149
+ ];
150
+ const artIdxNonweapon: readonly number[] = [
151
+ ART_IDX.NONWEAPON_HIT,
152
+ ART_IDX.NONWEAPON_DAM,
153
+ ART_IDX.NONWEAPON_HIT_DAM,
154
+ ART_IDX.NONWEAPON_AGGR,
155
+ ART_IDX.NONWEAPON_BRAND,
156
+ ART_IDX.NONWEAPON_SLAY,
157
+ ART_IDX.NONWEAPON_BLOWS,
158
+ ART_IDX.NONWEAPON_SHOTS,
159
+ ];
160
+ const artIdxMelee: readonly number[] = [
161
+ ART_IDX.MELEE_BLESS,
162
+ ART_IDX.MELEE_SINV,
163
+ ART_IDX.MELEE_BRAND,
164
+ ART_IDX.MELEE_SLAY,
165
+ ART_IDX.MELEE_BLOWS,
166
+ ART_IDX.MELEE_AC,
167
+ ART_IDX.MELEE_DICE,
168
+ ART_IDX.MELEE_WEIGHT,
169
+ ART_IDX.MELEE_TUNN,
170
+ ];
171
+ const artIdxAllarmor: readonly number[] = [ART_IDX.ALLARMOR_WEIGHT];
172
+ const artIdxBoot: readonly number[] = [
173
+ ART_IDX.BOOT_AC,
174
+ ART_IDX.BOOT_FEATHER,
175
+ ART_IDX.BOOT_STEALTH,
176
+ ART_IDX.BOOT_TRAP_IMM,
177
+ ART_IDX.BOOT_SPEED,
178
+ ART_IDX.BOOT_MOVES,
179
+ ];
180
+ const artIdxGlove: readonly number[] = [
181
+ ART_IDX.GLOVE_AC,
182
+ ART_IDX.GLOVE_HIT_DAM,
183
+ ART_IDX.GLOVE_FA,
184
+ ART_IDX.GLOVE_DEX,
185
+ ];
186
+ const artIdxHeadgear: readonly number[] = [
187
+ ART_IDX.HELM_AC,
188
+ ART_IDX.HELM_RBLIND,
189
+ ART_IDX.HELM_ESP,
190
+ ART_IDX.HELM_SINV,
191
+ ART_IDX.HELM_WIS,
192
+ ART_IDX.HELM_INT,
193
+ ];
194
+ const artIdxShield: readonly number[] = [
195
+ ART_IDX.SHIELD_AC,
196
+ ART_IDX.SHIELD_LRES,
197
+ ];
198
+ const artIdxCloak: readonly number[] = [
199
+ ART_IDX.CLOAK_AC,
200
+ ART_IDX.CLOAK_STEALTH,
201
+ ];
202
+ const artIdxArmor: readonly number[] = [
203
+ ART_IDX.ARMOR_AC,
204
+ ART_IDX.ARMOR_STEALTH,
205
+ ART_IDX.ARMOR_HLIFE,
206
+ ART_IDX.ARMOR_CON,
207
+ ART_IDX.ARMOR_LRES,
208
+ ART_IDX.ARMOR_ALLRES,
209
+ ART_IDX.ARMOR_HRES,
210
+ ];
211
+
212
+ /* ------------------------------------------------------------------ */
213
+ /* Aspect helpers (pure; MAXIMISE/MINIMISE consume no RNG) */
214
+ /* ------------------------------------------------------------------ */
215
+
216
+ /** randcalc(v, 0, MINIMISE): base + dice (see rng.ts damcalc/mBonusCalc). */
217
+ function rvMinimise(v: RandomValue): number {
218
+ return v.base + v.dice;
219
+ }
220
+
221
+ /** randcalc(v, 0, MAXIMISE): base + dice*sides + mBonus. */
222
+ function rvMaximise(v: RandomValue): number {
223
+ return v.base + v.dice * v.sides + v.mBonus;
224
+ }
225
+
226
+ /** Number of set entries in a 1-based boolean slay/brand array, or 0. */
227
+ function countTrue(arr: readonly boolean[] | null): number {
228
+ if (!arr) return 0;
229
+ let n = 0;
230
+ for (let i = 1; i < arr.length; i++) {
231
+ if (arr[i]) n++;
232
+ }
233
+ return n;
234
+ }
235
+
236
+ /**
237
+ * store_base_power's two statistics, at the call shape obj-randart.c L278-L282
238
+ * uses: mean(a, n, &frac) and variance(a, n, false, false, &frac), i.e. the
239
+ * FLOORED variants. The scratch fraction upstream passes is written and then
240
+ * ignored, so one shared throwaway stands in for it.
241
+ *
242
+ * These used to be local reimplementations here (plain floor division and
243
+ * (sum(x^2)*size - sum(x)^2) / size^2). They agreed with the C for artifact
244
+ * powers, but not at the rails: upstream's variance saturates at INT_MAX and
245
+ * upstream's mean floors toward negative infinity via a magnitude-and-fraction
246
+ * dance. ../rational is the real port, so the statistics now go through it.
247
+ */
248
+ const SCRATCH_FRAC = { n: 0, d: 1 };
249
+
250
+ function meanFloored(nums: readonly number[]): number {
251
+ return mean(nums, nums.length, SCRATCH_FRAC);
252
+ }
253
+
254
+ function varianceFloored(nums: readonly number[]): number {
255
+ return variance(nums, nums.length, false, false, SCRATCH_FRAC);
256
+ }
257
+
258
+ /* ------------------------------------------------------------------ */
259
+ /* artifact_power (obj-randart.c L186) */
260
+ /* ------------------------------------------------------------------ */
261
+
262
+ /**
263
+ * Build the "fake" object object_power evaluates for an artifact, reproducing
264
+ * make_fake_artifact (obj-make.c L728) = object_prep(kind, 0, MAXIMISE)
265
+ * followed by copy_artifact_data (obj-make.c L520). Returns null when the
266
+ * artifact has no tval or no base kind (make_fake_artifact would return false).
267
+ */
268
+ function makeFakeArtifactPower(
269
+ reg: ObjRegistry,
270
+ art: Artifact,
271
+ ): PowerObject | null {
272
+ if (!art.tval) return null;
273
+ const kind = reg.lookupKind(art.tval, art.sval);
274
+ if (!kind) return null;
275
+
276
+ /* Flags: object_prep copies base then kind flags (the second copy
277
+ * overwrites the first, upstream quirk kept in objectPrep), then
278
+ * copy_artifact_data clears the light-fuel flags and unions art flags. */
279
+ const flags = newOfFlags();
280
+ flags.copy(kind.base.flags);
281
+ flags.copy(kind.flags);
282
+ flags.off(OF.TAKES_FUEL);
283
+ flags.off(OF.BURNS_OUT);
284
+ flags.union(art.flags);
285
+
286
+ /* Modifiers: object_prep fills from the kind (MAXIMISE), then
287
+ * copy_artifact_data overwrites every entry with the artifact's. */
288
+ const modifiers: number[] = new Array<number>(OBJ_MOD_MAX).fill(0);
289
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
290
+ modifiers[i] = art.modifiers[i] ?? 0;
291
+ }
292
+
293
+ /* pval: object_prep assigns charges then food/oil/launcher pval; the
294
+ * artifact copy does not touch pval. */
295
+ let pval = 0;
296
+ if (tvalCanHaveCharges(art.tval)) {
297
+ pval = rvMaximise(kind.charge);
298
+ }
299
+ if (
300
+ tvalIsEdible(art.tval) ||
301
+ tvalIsPotion(art.tval) ||
302
+ tvalIsFuel(art.tval) ||
303
+ tvalIsLauncher(art.tval)
304
+ ) {
305
+ pval = rvMaximise(kind.pval);
306
+ }
307
+
308
+ /* Slays/brands: object_prep copies the kind's, copy_artifact_data unions
309
+ * the artifact's on top. */
310
+ let slays = copySlays(null, kind.slays, reg.slays);
311
+ slays = copySlays(slays, art.slays, reg.slays);
312
+ let brands = copyBrands(null, kind.brands, reg.brands);
313
+ brands = copyBrands(brands, art.brands, reg.brands);
314
+
315
+ /* Element info: object_prep sets res_level and flags from kind (+ base
316
+ * flags); copy_artifact_data overrides res_level with any non-zero
317
+ * artifact level and unions the artifact ignore flags. */
318
+ const elInfo: ElementInfo[] = [];
319
+ for (let i = 0; i < ELEM_MAX; i++) {
320
+ const ke = kind.elInfo[i] as ElementInfo;
321
+ const be = kind.base.elInfo[i] as ElementInfo;
322
+ const ae = art.elInfo[i] as ElementInfo;
323
+ let resLevel = ke.resLevel;
324
+ let elFlags = ke.flags | be.flags;
325
+ if (ae.resLevel !== 0) resLevel = ae.resLevel;
326
+ elFlags |= ae.flags;
327
+ elInfo.push({ resLevel, flags: elFlags });
328
+ }
329
+
330
+ /* Curses: copy_curses copies the kind's then the artifact's powers.
331
+ * Timeouts (a RANDOMISE roll upstream) never affect power, so they are
332
+ * left at 0 and no RNG is consumed. */
333
+ let curses: CurseData[] | null = null;
334
+ if (kind.curses || art.curses) {
335
+ curses = [];
336
+ for (let i = 0; i < reg.curses.length; i++) {
337
+ curses.push({ power: 0, timeout: 0 });
338
+ }
339
+ if (kind.curses) {
340
+ for (let i = 0; i < reg.curses.length; i++) {
341
+ const power = kind.curses[i] ?? 0;
342
+ if (power) (curses[i] as CurseData).power = power;
343
+ }
344
+ }
345
+ if (art.curses) {
346
+ for (let i = 0; i < reg.curses.length; i++) {
347
+ const power = art.curses[i] ?? 0;
348
+ if (power) (curses[i] as CurseData).power = power;
349
+ }
350
+ }
351
+ }
352
+
353
+ /* Activation comes from the artifact or, failing that, the kind. */
354
+ const act = art.activation ?? kind.activation;
355
+ const activation = act ? { power: act.power } : null;
356
+
357
+ return {
358
+ tval: art.tval,
359
+ toH: art.toH,
360
+ toD: art.toD,
361
+ toA: art.toA,
362
+ ac: art.ac,
363
+ dd: art.dd,
364
+ ds: art.ds,
365
+ weight: art.weight,
366
+ pval,
367
+ modifiers,
368
+ brands,
369
+ slays,
370
+ flags,
371
+ elInfo,
372
+ curses,
373
+ activation,
374
+ kind: { power: kind.power, kindFlags: kind.kindFlags },
375
+ ego: null,
376
+ };
377
+ }
378
+
379
+ /**
380
+ * artifact_power (obj-randart.c L186): the artifact's power, by generating a
381
+ * fake object from the artifact and calling the common object_power.
382
+ */
383
+ export function artifactPower(reg: ObjRegistry, art: Artifact): number {
384
+ const obj = makeFakeArtifactPower(reg, art);
385
+ if (!obj) return 0;
386
+ return objectPower(reg, obj);
387
+ }
388
+
389
+ /* ------------------------------------------------------------------ */
390
+ /* store_base_power (obj-randart.c L219) */
391
+ /* ------------------------------------------------------------------ */
392
+
393
+ /**
394
+ * store_base_power (obj-randart.c L219): store the original artifact power
395
+ * ratings as a baseline, and capture the per-set and per-tval power statistics
396
+ * and base-item info.
397
+ */
398
+ export function storeBasePower(reg: ObjRegistry, data: ArtifactSetData): void {
399
+ const aMax = reg.artifacts.length;
400
+
401
+ data.maxPower = 0;
402
+ data.minPower = INHIBIT_POWER + 1;
403
+ data.varPower = 0;
404
+
405
+ const fakeTotalPower: number[] = [];
406
+ const fakeTvPower: number[][] = [];
407
+ for (let i = 0; i < TV_MAX; i++) {
408
+ fakeTvPower.push([]);
409
+ data.minTvPower[i] = INHIBIT_POWER + 1;
410
+ data.maxTvPower[i] = 0;
411
+ }
412
+
413
+ for (let i = 0; i < aMax; i++) {
414
+ const art = reg.artifacts[i] ?? null;
415
+ const power = art ? artifactPower(reg, art) : 0;
416
+ data.basePower[i] = power;
417
+
418
+ /* Capture power stats, ignoring cursed and uber arts. */
419
+ if (power > data.maxPower && power < INHIBIT_POWER) {
420
+ data.maxPower = power;
421
+ }
422
+ if (power < data.minPower && power > 0) {
423
+ data.minPower = power;
424
+ }
425
+ if (power > 0 && power < INHIBIT_POWER && art) {
426
+ const tval = art.tval;
427
+ fakeTotalPower.push(power);
428
+ fakeTvPower[tval]!.push(power);
429
+ data.tvNum[tval] = (data.tvNum[tval] ?? 0) + 1;
430
+ if (power < (data.minTvPower[tval] ?? 0)) data.minTvPower[tval] = power;
431
+ if (power > (data.maxTvPower[tval] ?? 0)) data.maxTvPower[tval] = power;
432
+ }
433
+ if (power < 0) {
434
+ data.negPowerTotal++;
435
+ }
436
+
437
+ if (!power || !art) continue;
438
+ const kind = reg.lookupKind(art.tval, art.sval);
439
+ if (!kind) continue;
440
+ data.baseItemLevel[i] = kind.level;
441
+ data.baseItemProb[i] = kind.allocProb;
442
+ data.baseArtAlloc[i] = art.allocProb;
443
+ }
444
+
445
+ /* Round the result down (upstream passes frac but ignores it). */
446
+ data.avgPower = meanFloored(fakeTotalPower);
447
+ data.varPower = varianceFloored(fakeTotalPower);
448
+ for (let i = 0; i < TV_MAX; i++) {
449
+ if (data.tvNum[i]) {
450
+ data.avgTvPower[i] = meanFloored(fakeTvPower[i]!);
451
+ }
452
+ }
453
+
454
+ /* Store the number of different types, for use later. */
455
+ for (let i = 0; i < aMax; i++) {
456
+ const art = reg.artifacts[i] ?? null;
457
+ const tval = art ? art.tval : TV.NULL;
458
+ switch (tval) {
459
+ case TV.SWORD:
460
+ case TV.POLEARM:
461
+ case TV.HAFTED:
462
+ data.meleeTotal++;
463
+ break;
464
+ case TV.BOW:
465
+ data.bowTotal++;
466
+ break;
467
+ case TV.SOFT_ARMOR:
468
+ case TV.HARD_ARMOR:
469
+ case TV.DRAG_ARMOR:
470
+ data.armorTotal++;
471
+ break;
472
+ case TV.SHIELD:
473
+ data.shieldTotal++;
474
+ break;
475
+ case TV.CLOAK:
476
+ data.cloakTotal++;
477
+ break;
478
+ case TV.HELM:
479
+ case TV.CROWN:
480
+ data.headgearTotal++;
481
+ break;
482
+ case TV.GLOVES:
483
+ data.gloveTotal++;
484
+ break;
485
+ case TV.BOOTS:
486
+ data.bootTotal++;
487
+ break;
488
+ case TV.NULL:
489
+ break;
490
+ default:
491
+ data.otherTotal++;
492
+ }
493
+ data.total++;
494
+ }
495
+ }
496
+
497
+ /* ------------------------------------------------------------------ */
498
+ /* Ability counters (obj-randart.c L342-L1053) */
499
+ /* ------------------------------------------------------------------ */
500
+
501
+ /**
502
+ * count_weapon_abilities (obj-randart.c L342): handle weapon combat abilities.
503
+ */
504
+ export function countWeaponAbilities(
505
+ reg: ObjRegistry,
506
+ art: Artifact,
507
+ data: ArtifactSetData,
508
+ ): void {
509
+ const kind = reg.lookupKind(art.tval, art.sval);
510
+ if (!kind) return;
511
+ const minToH = rvMinimise(kind.toH);
512
+ const minToD = rvMinimise(kind.toD);
513
+ const minToA = rvMinimise(kind.toA);
514
+
515
+ /* To-hit and to-dam. */
516
+ let bonus = Math.trunc(
517
+ (art.toH - minToH - data.hitStartval) / data.hitIncrement,
518
+ );
519
+ data.artProbs[ART_IDX.WEAPON_HIT]! += bonus;
520
+
521
+ bonus = Math.trunc((art.toD - minToD - data.damStartval) / data.damIncrement);
522
+ data.artProbs[ART_IDX.WEAPON_DAM]! += bonus;
523
+
524
+ /* Does this weapon have an unusual bonus to AC? */
525
+ bonus = Math.trunc((art.toA - minToA) / data.acIncrement);
526
+ if (art.toA > 20) {
527
+ data.artProbs[ART_IDX.MELEE_AC_SUPER]!++;
528
+ } else if (bonus > 0) {
529
+ data.artProbs[ART_IDX.MELEE_AC]! += bonus;
530
+ }
531
+
532
+ /* Check damage dice - are they more than normal? */
533
+ if (art.dd > kind.dd) {
534
+ if (art.dd - kind.dd > 2) {
535
+ data.artProbs[ART_IDX.MELEE_DICE_SUPER]!++;
536
+ } else {
537
+ data.artProbs[ART_IDX.MELEE_DICE]!++;
538
+ }
539
+ }
540
+
541
+ /* Check weight - is it different from normal? */
542
+ if (art.weight !== kind.weight) {
543
+ data.artProbs[ART_IDX.MELEE_WEIGHT]!++;
544
+ }
545
+
546
+ /* Do we have 3 or more extra blows? */
547
+ const blows = art.modifiers[OBJ_MOD.BLOWS] ?? 0;
548
+ if (blows > 2) {
549
+ data.artProbs[ART_IDX.MELEE_BLOWS_SUPER]!++;
550
+ } else if (blows > 0) {
551
+ data.artProbs[ART_IDX.MELEE_BLOWS]!++;
552
+ }
553
+
554
+ /* Aggravation. */
555
+ if (art.flags.has(OF.AGGRAVATE)) {
556
+ data.artProbs[ART_IDX.WEAPON_AGGR]!++;
557
+ }
558
+
559
+ /* Blessed weapon? */
560
+ if (art.flags.has(OF.BLESSED)) {
561
+ data.artProbs[ART_IDX.MELEE_BLESS]!++;
562
+ }
563
+
564
+ /* See invisible? */
565
+ if (art.flags.has(OF.SEE_INVIS)) {
566
+ data.artProbs[ART_IDX.MELEE_SINV]!++;
567
+ }
568
+
569
+ /* Tunnelling ability. */
570
+ if ((art.modifiers[OBJ_MOD.TUNNEL] ?? 0) > 0) {
571
+ data.artProbs[ART_IDX.MELEE_TUNN]!++;
572
+ }
573
+
574
+ /* Count brands and slays. */
575
+ if (art.slays) {
576
+ data.artProbs[ART_IDX.MELEE_SLAY]! += countTrue(art.slays);
577
+ }
578
+ if (art.brands) {
579
+ data.artProbs[ART_IDX.MELEE_BRAND]! += countTrue(art.brands);
580
+ }
581
+ }
582
+
583
+ /**
584
+ * count_bow_abilities (obj-randart.c L444): count combat abilities on bows.
585
+ */
586
+ export function countBowAbilities(
587
+ reg: ObjRegistry,
588
+ art: Artifact,
589
+ data: ArtifactSetData,
590
+ ): void {
591
+ const kind = reg.lookupKind(art.tval, art.sval);
592
+ if (!kind) return;
593
+ const minToH = rvMinimise(kind.toH);
594
+ const minToD = rvMinimise(kind.toD);
595
+ const minToA = rvMinimise(kind.toA);
596
+
597
+ /* To-hit. */
598
+ let bonus = Math.trunc(
599
+ (art.toH - minToH - data.hitStartval) / data.hitIncrement,
600
+ );
601
+ data.artProbs[ART_IDX.WEAPON_HIT]! += bonus;
602
+
603
+ /* To-dam. */
604
+ bonus = Math.trunc((art.toD - minToD - data.damStartval) / data.damIncrement);
605
+ data.artProbs[ART_IDX.WEAPON_DAM]! += bonus;
606
+
607
+ /* Armor class. */
608
+ bonus = Math.trunc((art.toA - minToA - data.acStartval) / data.acIncrement);
609
+ if (bonus > 0) {
610
+ data.artProbs[ART_IDX.GEN_AC]! += bonus;
611
+ }
612
+
613
+ /* Aggravation. */
614
+ if (art.flags.has(OF.AGGRAVATE)) {
615
+ data.artProbs[ART_IDX.WEAPON_AGGR]!++;
616
+ }
617
+
618
+ /* Do we have more than 1 extra shot? */
619
+ const shots = art.modifiers[OBJ_MOD.SHOTS] ?? 0;
620
+ if (shots > 10) {
621
+ data.artProbs[ART_IDX.BOW_SHOTS_SUPER]!++;
622
+ } else if (shots > 0) {
623
+ data.artProbs[ART_IDX.BOW_SHOTS]!++;
624
+ }
625
+
626
+ /* Do we have 3 or more extra might? */
627
+ const might = art.modifiers[OBJ_MOD.MIGHT] ?? 0;
628
+ if (might > 2) {
629
+ data.artProbs[ART_IDX.BOW_MIGHT_SUPER]!++;
630
+ } else if (might > 0) {
631
+ data.artProbs[ART_IDX.BOW_MIGHT]!++;
632
+ }
633
+
634
+ /* Count brands and slays. */
635
+ if (art.slays) {
636
+ data.artProbs[ART_IDX.BOW_SLAY]! += countTrue(art.slays);
637
+ }
638
+ if (art.brands) {
639
+ data.artProbs[ART_IDX.BOW_BRAND]! += countTrue(art.brands);
640
+ }
641
+ }
642
+
643
+ /**
644
+ * count_nonweapon_abilities (obj-randart.c L516): handle nonweapon combat
645
+ * abilities.
646
+ */
647
+ export function countNonweaponAbilities(
648
+ reg: ObjRegistry,
649
+ art: Artifact,
650
+ data: ArtifactSetData,
651
+ ): void {
652
+ const kind = reg.lookupKind(art.tval, art.sval);
653
+ if (!kind) return;
654
+ const toHit = art.toH - rvMinimise(kind.toH);
655
+ const toDam = art.toD - rvMinimise(kind.toD);
656
+ const toA = art.toA - rvMinimise(kind.toA) - data.acStartval;
657
+ let bonus = Math.trunc(toA / data.acIncrement);
658
+
659
+ /* Armor class. */
660
+ if (bonus > 0) {
661
+ if (art.toA > 20) {
662
+ data.artProbs[ART_IDX.GEN_AC_SUPER]!++;
663
+ } else if (art.tval === TV.BOOTS) {
664
+ data.artProbs[ART_IDX.BOOT_AC]! += bonus;
665
+ } else if (art.tval === TV.GLOVES) {
666
+ data.artProbs[ART_IDX.GLOVE_AC]! += bonus;
667
+ } else if (art.tval === TV.HELM || art.tval === TV.CROWN) {
668
+ data.artProbs[ART_IDX.HELM_AC]! += bonus;
669
+ } else if (art.tval === TV.SHIELD) {
670
+ data.artProbs[ART_IDX.SHIELD_AC]! += bonus;
671
+ } else if (art.tval === TV.CLOAK) {
672
+ data.artProbs[ART_IDX.CLOAK_AC]! += bonus;
673
+ } else if (
674
+ art.tval === TV.SOFT_ARMOR ||
675
+ art.tval === TV.HARD_ARMOR ||
676
+ art.tval === TV.DRAG_ARMOR
677
+ ) {
678
+ data.artProbs[ART_IDX.ARMOR_AC]! += bonus;
679
+ } else {
680
+ data.artProbs[ART_IDX.GEN_AC]! += bonus;
681
+ }
682
+ }
683
+
684
+ /* To hit and dam bonuses. */
685
+ if (toHit > 0 && toDam > 0) {
686
+ bonus = Math.trunc(
687
+ (toHit + toDam) / (data.hitIncrement + data.damIncrement),
688
+ );
689
+ if (bonus > 0) {
690
+ if (art.tval === TV.GLOVES) {
691
+ data.artProbs[ART_IDX.GLOVE_HIT_DAM]! += bonus;
692
+ } else {
693
+ data.artProbs[ART_IDX.NONWEAPON_HIT_DAM]! += bonus;
694
+ }
695
+ }
696
+ } else if (toHit > 0) {
697
+ bonus = Math.trunc(toHit / data.hitIncrement);
698
+ if (bonus > 0) {
699
+ data.artProbs[ART_IDX.NONWEAPON_HIT]! += bonus;
700
+ }
701
+ } else if (toDam > 0) {
702
+ bonus = Math.trunc(toDam / data.damIncrement);
703
+ if (bonus > 0) {
704
+ data.artProbs[ART_IDX.NONWEAPON_DAM]! += bonus;
705
+ }
706
+ }
707
+
708
+ /* Check weight - is it different from normal? */
709
+ if (art.weight !== kind.weight) {
710
+ data.artProbs[ART_IDX.ALLARMOR_WEIGHT]!++;
711
+ }
712
+
713
+ /* Aggravation. */
714
+ if (art.flags.has(OF.AGGRAVATE)) {
715
+ data.artProbs[ART_IDX.NONWEAPON_AGGR]!++;
716
+ }
717
+
718
+ /* Count brands and slays. */
719
+ if (art.slays) {
720
+ data.artProbs[ART_IDX.NONWEAPON_SLAY]! += countTrue(art.slays);
721
+ }
722
+ if (art.brands) {
723
+ data.artProbs[ART_IDX.NONWEAPON_BRAND]! += countTrue(art.brands);
724
+ }
725
+
726
+ /* Blows. */
727
+ if ((art.modifiers[OBJ_MOD.BLOWS] ?? 0) > 0) {
728
+ data.artProbs[ART_IDX.NONWEAPON_BLOWS]!++;
729
+ }
730
+
731
+ /* Shots. */
732
+ if ((art.modifiers[OBJ_MOD.SHOTS] ?? 0) > 0) {
733
+ data.artProbs[ART_IDX.NONWEAPON_SHOTS]!++;
734
+ }
735
+
736
+ /* Tunnelling ability. */
737
+ if ((art.modifiers[OBJ_MOD.TUNNEL] ?? 0) > 0) {
738
+ data.artProbs[ART_IDX.GEN_TUNN]!++;
739
+ }
740
+ }
741
+
742
+ /**
743
+ * count_modifiers (obj-randart.c L630): count stat and other modifier bonuses.
744
+ */
745
+ export function countModifiers(art: Artifact, data: ArtifactSetData): void {
746
+ let num = 0;
747
+
748
+ /* Stat bonuses. Add up the number of individual bonuses. */
749
+ if ((art.modifiers[OBJ_MOD.STR] ?? 0) > 0) num++;
750
+ if ((art.modifiers[OBJ_MOD.INT] ?? 0) > 0) num++;
751
+ if ((art.modifiers[OBJ_MOD.WIS] ?? 0) > 0) num++;
752
+ if ((art.modifiers[OBJ_MOD.DEX] ?? 0) > 0) num++;
753
+ if ((art.modifiers[OBJ_MOD.CON] ?? 0) > 0) num++;
754
+
755
+ /* Handle a few special cases separately. */
756
+ if (
757
+ (art.tval === TV.HELM || art.tval === TV.CROWN) &&
758
+ ((art.modifiers[OBJ_MOD.WIS] ?? 0) > 0 ||
759
+ (art.modifiers[OBJ_MOD.INT] ?? 0) > 0)
760
+ ) {
761
+ if ((art.modifiers[OBJ_MOD.WIS] ?? 0) > 0) {
762
+ data.artProbs[ART_IDX.HELM_WIS]!++;
763
+ num--;
764
+ }
765
+ if ((art.modifiers[OBJ_MOD.INT] ?? 0) > 0) {
766
+ data.artProbs[ART_IDX.HELM_INT]!++;
767
+ num--;
768
+ }
769
+ } else if (
770
+ (art.tval === TV.SOFT_ARMOR ||
771
+ art.tval === TV.HARD_ARMOR ||
772
+ art.tval === TV.DRAG_ARMOR) &&
773
+ (art.modifiers[OBJ_MOD.CON] ?? 0) > 0
774
+ ) {
775
+ data.artProbs[ART_IDX.ARMOR_CON]!++;
776
+ num--;
777
+ } else if (art.tval === TV.GLOVES && (art.modifiers[OBJ_MOD.DEX] ?? 0) > 0) {
778
+ data.artProbs[ART_IDX.GLOVE_DEX]!++;
779
+ num--;
780
+ }
781
+
782
+ /* Now the general case. */
783
+ if (num > 0) {
784
+ data.artProbs[ART_IDX.GEN_STAT]! += num;
785
+ }
786
+
787
+ /* Handle stealth, including a couple of special cases. */
788
+ if ((art.modifiers[OBJ_MOD.STEALTH] ?? 0) > 0) {
789
+ if (art.tval === TV.BOOTS) {
790
+ data.artProbs[ART_IDX.BOOT_STEALTH]!++;
791
+ } else if (art.tval === TV.CLOAK) {
792
+ data.artProbs[ART_IDX.CLOAK_STEALTH]!++;
793
+ } else if (
794
+ art.tval === TV.SOFT_ARMOR ||
795
+ art.tval === TV.HARD_ARMOR ||
796
+ art.tval === TV.DRAG_ARMOR
797
+ ) {
798
+ data.artProbs[ART_IDX.ARMOR_STEALTH]!++;
799
+ } else {
800
+ data.artProbs[ART_IDX.GEN_STEALTH]!++;
801
+ }
802
+ }
803
+
804
+ /* Searching bonus - fully generic. */
805
+ if ((art.modifiers[OBJ_MOD.SEARCH] ?? 0) > 0) {
806
+ data.artProbs[ART_IDX.GEN_SEARCH]!++;
807
+ }
808
+
809
+ /* Infravision bonus - fully generic. */
810
+ if ((art.modifiers[OBJ_MOD.INFRA] ?? 0) > 0) {
811
+ data.artProbs[ART_IDX.GEN_INFRA]!++;
812
+ }
813
+
814
+ /* Damage reduction bonus - fully generic. */
815
+ if ((art.modifiers[OBJ_MOD.DAM_RED] ?? 0) > 0) {
816
+ data.artProbs[ART_IDX.GEN_DAM_RED]!++;
817
+ }
818
+
819
+ /* Moves bonus. */
820
+ if ((art.modifiers[OBJ_MOD.MOVES] ?? 0) > 0) {
821
+ if (art.tval === TV.BOOTS) {
822
+ data.artProbs[ART_IDX.BOOT_MOVES]!++;
823
+ } else {
824
+ data.artProbs[ART_IDX.GEN_MOVES]!++;
825
+ }
826
+ }
827
+
828
+ /* Speed - boots handled separately, supercharge shares its frequency. */
829
+ const speed = art.modifiers[OBJ_MOD.SPEED] ?? 0;
830
+ if (speed > 0) {
831
+ if (speed > 7) {
832
+ data.artProbs[ART_IDX.GEN_SPEED_SUPER]!++;
833
+ } else if (art.tval === TV.BOOTS) {
834
+ data.artProbs[ART_IDX.BOOT_SPEED]!++;
835
+ } else {
836
+ data.artProbs[ART_IDX.GEN_SPEED]!++;
837
+ }
838
+ }
839
+
840
+ /* Permanent light. */
841
+ if ((art.modifiers[OBJ_MOD.LIGHT] ?? 0) > 0) {
842
+ data.artProbs[ART_IDX.GEN_LIGHT]!++;
843
+ }
844
+ }
845
+
846
+ /**
847
+ * count_low_resists (obj-randart.c L764): count low resists and immunities.
848
+ */
849
+ export function countLowResists(art: Artifact, data: ArtifactSetData): void {
850
+ let num = 0;
851
+
852
+ /* Count up immunities for this item, if any. */
853
+ if ((art.elInfo[ELEM.ACID] as ElementInfo).resLevel === 3) num++;
854
+ if ((art.elInfo[ELEM.ELEC] as ElementInfo).resLevel === 3) num++;
855
+ if ((art.elInfo[ELEM.FIRE] as ElementInfo).resLevel === 3) num++;
856
+ if ((art.elInfo[ELEM.COLD] as ElementInfo).resLevel === 3) num++;
857
+
858
+ data.artProbs[ART_IDX.GEN_IMMUNE]! += num;
859
+
860
+ /* Count up low resists (not the type, just the number). */
861
+ num = 0;
862
+ if ((art.elInfo[ELEM.ACID] as ElementInfo).resLevel === 1) num++;
863
+ if ((art.elInfo[ELEM.ELEC] as ElementInfo).resLevel === 1) num++;
864
+ if ((art.elInfo[ELEM.FIRE] as ElementInfo).resLevel === 1) num++;
865
+ if ((art.elInfo[ELEM.COLD] as ElementInfo).resLevel === 1) num++;
866
+
867
+ if (num) {
868
+ if (art.tval === TV.SHIELD) {
869
+ data.artProbs[ART_IDX.SHIELD_LRES]! += num;
870
+ } else if (
871
+ art.tval === TV.SOFT_ARMOR ||
872
+ art.tval === TV.HARD_ARMOR ||
873
+ art.tval === TV.DRAG_ARMOR
874
+ ) {
875
+ if (num === 4) {
876
+ data.artProbs[ART_IDX.ARMOR_ALLRES]!++;
877
+ } else {
878
+ data.artProbs[ART_IDX.ARMOR_LRES]! += num;
879
+ }
880
+ } else {
881
+ data.artProbs[ART_IDX.GEN_LRES]! += num;
882
+ }
883
+ }
884
+ }
885
+
886
+ /**
887
+ * count_high_resists (obj-randart.c L816): count high resists and protections.
888
+ */
889
+ export function countHighResists(art: Artifact, data: ArtifactSetData): void {
890
+ let num = 0;
891
+
892
+ /* Body armor: count all high resists as an aggregate first. */
893
+ if (
894
+ art.tval === TV.SOFT_ARMOR ||
895
+ art.tval === TV.HARD_ARMOR ||
896
+ art.tval === TV.DRAG_ARMOR
897
+ ) {
898
+ if ((art.elInfo[ELEM.POIS] as ElementInfo).resLevel === 1) num++;
899
+ if (art.flags.has(OF.PROT_FEAR)) num++;
900
+ if ((art.elInfo[ELEM.LIGHT] as ElementInfo).resLevel === 1) num++;
901
+ if ((art.elInfo[ELEM.DARK] as ElementInfo).resLevel === 1) num++;
902
+ if (art.flags.has(OF.PROT_BLIND)) num++;
903
+ if (art.flags.has(OF.PROT_CONF)) num++;
904
+ if ((art.elInfo[ELEM.SOUND] as ElementInfo).resLevel === 1) num++;
905
+ if ((art.elInfo[ELEM.SHARD] as ElementInfo).resLevel === 1) num++;
906
+ if ((art.elInfo[ELEM.NEXUS] as ElementInfo).resLevel === 1) num++;
907
+ if ((art.elInfo[ELEM.NETHER] as ElementInfo).resLevel === 1) num++;
908
+ if ((art.elInfo[ELEM.CHAOS] as ElementInfo).resLevel === 1) num++;
909
+ if ((art.elInfo[ELEM.DISEN] as ElementInfo).resLevel === 1) num++;
910
+ if (art.flags.has(OF.PROT_STUN)) num++;
911
+ data.artProbs[ART_IDX.ARMOR_HRES]! += num;
912
+ }
913
+
914
+ /* Now do the high resists individually. */
915
+ if ((art.elInfo[ELEM.POIS] as ElementInfo).resLevel === 1) {
916
+ data.artProbs[ART_IDX.GEN_RPOIS]!++;
917
+ }
918
+ if (art.flags.has(OF.PROT_FEAR)) {
919
+ data.artProbs[ART_IDX.GEN_RFEAR]!++;
920
+ }
921
+ if ((art.elInfo[ELEM.LIGHT] as ElementInfo).resLevel === 1) {
922
+ data.artProbs[ART_IDX.GEN_RLIGHT]!++;
923
+ }
924
+ if ((art.elInfo[ELEM.DARK] as ElementInfo).resLevel === 1) {
925
+ data.artProbs[ART_IDX.GEN_RDARK]!++;
926
+ }
927
+ if (art.flags.has(OF.PROT_BLIND)) {
928
+ if (art.tval === TV.HELM || art.tval === TV.CROWN) {
929
+ data.artProbs[ART_IDX.HELM_RBLIND]!++;
930
+ } else {
931
+ data.artProbs[ART_IDX.GEN_RBLIND]!++;
932
+ }
933
+ }
934
+ if (art.flags.has(OF.PROT_CONF)) {
935
+ data.artProbs[ART_IDX.GEN_RCONF]!++;
936
+ }
937
+ if ((art.elInfo[ELEM.SOUND] as ElementInfo).resLevel === 1) {
938
+ data.artProbs[ART_IDX.GEN_RSOUND]!++;
939
+ }
940
+ if ((art.elInfo[ELEM.SHARD] as ElementInfo).resLevel === 1) {
941
+ data.artProbs[ART_IDX.GEN_RSHARD]!++;
942
+ }
943
+ if ((art.elInfo[ELEM.NEXUS] as ElementInfo).resLevel === 1) {
944
+ data.artProbs[ART_IDX.GEN_RNEXUS]!++;
945
+ }
946
+ if ((art.elInfo[ELEM.NETHER] as ElementInfo).resLevel === 1) {
947
+ data.artProbs[ART_IDX.GEN_RNETHER]!++;
948
+ }
949
+ if ((art.elInfo[ELEM.CHAOS] as ElementInfo).resLevel === 1) {
950
+ data.artProbs[ART_IDX.GEN_RCHAOS]!++;
951
+ }
952
+ if ((art.elInfo[ELEM.DISEN] as ElementInfo).resLevel === 1) {
953
+ data.artProbs[ART_IDX.GEN_RDISEN]!++;
954
+ }
955
+ if (art.flags.has(OF.PROT_STUN)) {
956
+ data.artProbs[ART_IDX.GEN_PSTUN]!++;
957
+ }
958
+ }
959
+
960
+ /**
961
+ * count_abilities (obj-randart.c L943): general abilities, adding some to a
962
+ * specific item-type tally depending on the base item.
963
+ */
964
+ export function countAbilities(
965
+ reg: ObjRegistry,
966
+ art: Artifact,
967
+ data: ArtifactSetData,
968
+ ): void {
969
+ const kind = reg.lookupKind(art.tval, art.sval);
970
+
971
+ /* Sustains. */
972
+ if (
973
+ art.flags.has(OF.SUST_STR) ||
974
+ art.flags.has(OF.SUST_INT) ||
975
+ art.flags.has(OF.SUST_WIS) ||
976
+ art.flags.has(OF.SUST_DEX) ||
977
+ art.flags.has(OF.SUST_CON)
978
+ ) {
979
+ let num = 0;
980
+ if (art.flags.has(OF.SUST_STR)) num++;
981
+ if (art.flags.has(OF.SUST_INT)) num++;
982
+ if (art.flags.has(OF.SUST_WIS)) num++;
983
+ if (art.flags.has(OF.SUST_DEX)) num++;
984
+ if (art.flags.has(OF.SUST_CON)) num++;
985
+ data.artProbs[ART_IDX.GEN_SUST]! += num;
986
+ }
987
+
988
+ /* Free action - handle gloves separately. */
989
+ if (art.flags.has(OF.FREE_ACT)) {
990
+ if (art.tval === TV.GLOVES) {
991
+ data.artProbs[ART_IDX.GLOVE_FA]!++;
992
+ } else {
993
+ data.artProbs[ART_IDX.GEN_FA]!++;
994
+ }
995
+ }
996
+
997
+ /* Hold life - do body armor separately. */
998
+ if (art.flags.has(OF.HOLD_LIFE)) {
999
+ if (
1000
+ art.tval === TV.SOFT_ARMOR ||
1001
+ art.tval === TV.HARD_ARMOR ||
1002
+ art.tval === TV.DRAG_ARMOR
1003
+ ) {
1004
+ data.artProbs[ART_IDX.ARMOR_HLIFE]!++;
1005
+ } else {
1006
+ data.artProbs[ART_IDX.GEN_HLIFE]!++;
1007
+ }
1008
+ }
1009
+
1010
+ /* Feather fall - handle boots separately. */
1011
+ if (art.flags.has(OF.FEATHER)) {
1012
+ if (art.tval === TV.BOOTS) {
1013
+ data.artProbs[ART_IDX.BOOT_FEATHER]!++;
1014
+ } else {
1015
+ data.artProbs[ART_IDX.GEN_FEATHER]!++;
1016
+ }
1017
+ }
1018
+
1019
+ /* See invisible - do helms/crowns separately (weapons already handled). */
1020
+ if (art.flags.has(OF.SEE_INVIS)) {
1021
+ if (
1022
+ !(
1023
+ art.tval === TV.DIGGING ||
1024
+ art.tval === TV.HAFTED ||
1025
+ art.tval === TV.POLEARM ||
1026
+ art.tval === TV.SWORD
1027
+ )
1028
+ ) {
1029
+ if (art.tval === TV.HELM || art.tval === TV.CROWN) {
1030
+ data.artProbs[ART_IDX.HELM_SINV]!++;
1031
+ } else {
1032
+ data.artProbs[ART_IDX.GEN_SINV]!++;
1033
+ }
1034
+ }
1035
+ }
1036
+
1037
+ /* ESP - handle helms/crowns separately. */
1038
+ if (art.flags.has(OF.TELEPATHY)) {
1039
+ if (art.tval === TV.HELM || art.tval === TV.CROWN) {
1040
+ data.artProbs[ART_IDX.HELM_ESP]!++;
1041
+ } else {
1042
+ data.artProbs[ART_IDX.GEN_ESP]!++;
1043
+ }
1044
+ }
1045
+
1046
+ /* Slow digestion - generic. */
1047
+ if (art.flags.has(OF.SLOW_DIGEST)) {
1048
+ data.artProbs[ART_IDX.GEN_SDIG]!++;
1049
+ }
1050
+
1051
+ /* Regeneration - generic. */
1052
+ if (art.flags.has(OF.REGEN)) {
1053
+ data.artProbs[ART_IDX.GEN_REGEN]!++;
1054
+ }
1055
+
1056
+ /* Trap immunity - handle boots separately. */
1057
+ if (art.flags.has(OF.TRAP_IMMUNE)) {
1058
+ if (art.tval === TV.BOOTS) {
1059
+ data.artProbs[ART_IDX.BOOT_TRAP_IMM]!++;
1060
+ } else {
1061
+ data.artProbs[ART_IDX.GEN_TRAP_IMM]!++;
1062
+ }
1063
+ }
1064
+
1065
+ /* Activation. */
1066
+ if (art.activation || kind?.activation) {
1067
+ data.artProbs[ART_IDX.GEN_ACTIV]!++;
1068
+ }
1069
+ }
1070
+
1071
+ /* ------------------------------------------------------------------ */
1072
+ /* collect_artifact_data (obj-randart.c L1059) */
1073
+ /* ------------------------------------------------------------------ */
1074
+
1075
+ /**
1076
+ * collect_artifact_data (obj-randart.c L1059): parse the standard artifacts and
1077
+ * count up the frequencies of the various abilities.
1078
+ */
1079
+ export function collectArtifactCounts(
1080
+ reg: ObjRegistry,
1081
+ data: ArtifactSetData,
1082
+ ): void {
1083
+ const aMax = reg.artifacts.length;
1084
+
1085
+ for (let i = 0; i < aMax; i++) {
1086
+ const art = reg.artifacts[i] ?? null;
1087
+ if (!art) continue;
1088
+
1089
+ /* Don't parse cursed or null items. */
1090
+ if ((data.basePower[i] ?? 0) < 0 || art.tval === 0) continue;
1091
+
1092
+ const kind = reg.lookupKind(art.tval, art.sval);
1093
+ if (!kind) continue;
1094
+
1095
+ /* Special cases -- don't parse these! */
1096
+ if (art.name.includes("The One Ring") || kind.kindFlags.has(KF.QUEST_ART)) {
1097
+ continue;
1098
+ }
1099
+
1100
+ /* Add the base item tval to the tv_probs array. */
1101
+ data.tvProbs[kind.tval] = (data.tvProbs[kind.tval] ?? 0) + 1;
1102
+
1103
+ /* Count combat abilities broken up by type. */
1104
+ if (
1105
+ art.tval === TV.DIGGING ||
1106
+ art.tval === TV.HAFTED ||
1107
+ art.tval === TV.POLEARM ||
1108
+ art.tval === TV.SWORD
1109
+ ) {
1110
+ countWeaponAbilities(reg, art, data);
1111
+ } else if (art.tval === TV.BOW) {
1112
+ countBowAbilities(reg, art, data);
1113
+ } else {
1114
+ countNonweaponAbilities(reg, art, data);
1115
+ }
1116
+
1117
+ /* Count other properties. */
1118
+ countModifiers(art, data);
1119
+ countLowResists(art, data);
1120
+ countHighResists(art, data);
1121
+ countAbilities(reg, art, data);
1122
+ }
1123
+ }
1124
+
1125
+ /* ------------------------------------------------------------------ */
1126
+ /* Frequency rescaling (obj-randart.c L1124-L1265) */
1127
+ /* ------------------------------------------------------------------ */
1128
+
1129
+ /** Rescale one index group by total / denom (integer division, in place). */
1130
+ function rescaleGroup(
1131
+ data: ArtifactSetData,
1132
+ group: readonly number[],
1133
+ denom: number,
1134
+ ): void {
1135
+ for (const idx of group) {
1136
+ data.artProbs[idx] = Math.trunc((data.artProbs[idx]! * data.total) / denom);
1137
+ }
1138
+ }
1139
+
1140
+ /**
1141
+ * rescale_freqs (obj-randart.c L1124): rescale item-dependent ability
1142
+ * frequencies as though the whole set were made of that item type, so
1143
+ * dependent and independent abilities become comparable.
1144
+ */
1145
+ export function rescaleFreqs(data: ArtifactSetData): void {
1146
+ /* Bow-only abilities. */
1147
+ rescaleGroup(data, artIdxBow, data.bowTotal);
1148
+
1149
+ /* All weapon abilities. */
1150
+ rescaleGroup(data, artIdxWeapon, data.bowTotal + data.meleeTotal);
1151
+
1152
+ /* Corresponding non-weapon abilities. */
1153
+ const nonweaponDenom = data.total - data.meleeTotal - data.bowTotal;
1154
+ rescaleGroup(data, artIdxNonweapon, nonweaponDenom);
1155
+
1156
+ /* All melee weapon abilities. */
1157
+ rescaleGroup(data, artIdxMelee, data.meleeTotal);
1158
+
1159
+ /* All general armor abilities. */
1160
+ const allArmorDenom =
1161
+ data.armorTotal +
1162
+ data.bootTotal +
1163
+ data.shieldTotal +
1164
+ data.headgearTotal +
1165
+ data.cloakTotal +
1166
+ data.gloveTotal;
1167
+ rescaleGroup(data, artIdxAllarmor, allArmorDenom);
1168
+
1169
+ /* Boots. */
1170
+ rescaleGroup(data, artIdxBoot, data.bootTotal);
1171
+ /* Gloves. */
1172
+ rescaleGroup(data, artIdxGlove, data.gloveTotal);
1173
+ /* Headgear. */
1174
+ rescaleGroup(data, artIdxHeadgear, data.headgearTotal);
1175
+ /* Shields. */
1176
+ rescaleGroup(data, artIdxShield, data.shieldTotal);
1177
+ /* Cloaks. */
1178
+ rescaleGroup(data, artIdxCloak, data.cloakTotal);
1179
+ /* Body armor. */
1180
+ rescaleGroup(data, artIdxArmor, data.armorTotal);
1181
+ }
1182
+
1183
+ /**
1184
+ * adjust_freqs (obj-randart.c L1214): enforce minimum frequencies for
1185
+ * abilities that might be missing from the standard set, and halve the
1186
+ * aggravation frequencies (which are counted twice).
1187
+ */
1188
+ export function adjustFreqs(data: ArtifactSetData): void {
1189
+ const atLeast = (idx: number, min: number): void => {
1190
+ if (data.artProbs[idx]! < min) data.artProbs[idx] = min;
1191
+ };
1192
+
1193
+ atLeast(ART_IDX.GEN_RFEAR, 5);
1194
+ atLeast(ART_IDX.MELEE_DICE_SUPER, 5);
1195
+ atLeast(ART_IDX.BOW_SHOTS_SUPER, 5);
1196
+ atLeast(ART_IDX.BOW_MIGHT_SUPER, 5);
1197
+ atLeast(ART_IDX.MELEE_BLOWS_SUPER, 5);
1198
+ atLeast(ART_IDX.GEN_SPEED_SUPER, 5);
1199
+ atLeast(ART_IDX.GEN_AC, 5);
1200
+ atLeast(ART_IDX.GEN_TUNN, 5);
1201
+ atLeast(ART_IDX.NONWEAPON_BRAND, 2);
1202
+ atLeast(ART_IDX.NONWEAPON_SLAY, 1);
1203
+ atLeast(ART_IDX.BOW_BRAND, 2);
1204
+ atLeast(ART_IDX.BOW_SLAY, 2);
1205
+ atLeast(ART_IDX.NONWEAPON_BLOWS, 1);
1206
+ atLeast(ART_IDX.NONWEAPON_SHOTS, 1);
1207
+ atLeast(ART_IDX.GEN_AC_SUPER, 5);
1208
+ atLeast(ART_IDX.MELEE_AC, 5);
1209
+ atLeast(ART_IDX.GEN_PSTUN, 3);
1210
+
1211
+ /* Cut aggravation frequencies in half since they're used twice. */
1212
+ data.artProbs[ART_IDX.NONWEAPON_AGGR] = Math.trunc(
1213
+ data.artProbs[ART_IDX.NONWEAPON_AGGR]! / 2,
1214
+ );
1215
+ data.artProbs[ART_IDX.WEAPON_AGGR] = Math.trunc(
1216
+ data.artProbs[ART_IDX.WEAPON_AGGR]! / 2,
1217
+ );
1218
+ }
1219
+
1220
+ /**
1221
+ * parse_frequencies (obj-randart.c L1273): parse the artifacts and write
1222
+ * frequencies of their abilities and base object kinds, building the dynamic
1223
+ * generation probabilities.
1224
+ */
1225
+ export function parseFrequencies(reg: ObjRegistry, data: ArtifactSetData): void {
1226
+ /* Zero the frequencies for artifact attributes. */
1227
+ for (let i = 0; i < ART_IDX_TOTAL; i++) data.artProbs[i] = 0;
1228
+
1229
+ collectArtifactCounts(reg, data);
1230
+
1231
+ /* Big hack, reduce frequencies of sharp weapons. */
1232
+ for (let i = 0; i < TV_MAX; i++) {
1233
+ if (i === TV.SWORD || i === TV.POLEARM) {
1234
+ data.tvProbs[i] = Math.trunc((data.tvProbs[i]! * 2) / 3);
1235
+ }
1236
+ }
1237
+
1238
+ /* Rescale frequencies. */
1239
+ rescaleFreqs(data);
1240
+
1241
+ /* Perform any additional rescaling and adjustment. */
1242
+ adjustFreqs(data);
1243
+
1244
+ /* Build a cumulative frequency table for tvals. */
1245
+ for (let i = 0; i < TV_MAX; i++) {
1246
+ for (let j = i; j < TV_MAX; j++) {
1247
+ data.tvFreq[j] = (data.tvFreq[j] ?? 0) + (data.tvProbs[i] ?? 0);
1248
+ }
1249
+ }
1250
+ }
1251
+
1252
+ /* ------------------------------------------------------------------ */
1253
+ /* Generation of a random artifact (header) */
1254
+ /* ------------------------------------------------------------------ */
1255
+
1256
+ /**
1257
+ * get_base_item_tval (obj-randart.c L1332): pick a random base item tval from
1258
+ * the original artifact tval frequencies.
1259
+ */
1260
+ export function getBaseItemTval(data: ArtifactSetData, rng: Rng): number {
1261
+ let tval = 0;
1262
+ const r = rng.randint1(data.tvFreq[TV_MAX - 1]!);
1263
+ while (r > (data.tvFreq[tval] ?? 0)) {
1264
+ tval++;
1265
+ }
1266
+ return tval;
1267
+ }
1268
+
1269
+ /* ------------------------------------------------------------------ */
1270
+ /* artifact_set_data allocation (obj-randart.c L2993) */
1271
+ /* ------------------------------------------------------------------ */
1272
+
1273
+ /** INHIBIT_POWER: the power ceiling above which arts are treated as uber. */
1274
+ const INHIBIT_POWER = 20000;
1275
+
1276
+ /**
1277
+ * artifact_set_data_new (obj-randart.c L2993): allocate and initialize a new
1278
+ * artifact set data structure. Power/level/prob arrays are sized by the number
1279
+ * of artifact slots (a_max, i.e. reg.artifacts.length); the tval arrays by
1280
+ * TV_MAX and the ability array by ART_IDX_TOTAL.
1281
+ */
1282
+ export function artifactSetDataNew(reg: ObjRegistry): ArtifactSetData {
1283
+ const aMax = reg.artifacts.length;
1284
+ const zeros = (n: number): number[] => new Array<number>(n).fill(0);
1285
+
1286
+ return {
1287
+ /* Mean start and increment values for to_hit, to_dam and AC. */
1288
+ hitIncrement: 4,
1289
+ damIncrement: 4,
1290
+ hitStartval: 10,
1291
+ damStartval: 10,
1292
+ acStartval: 15,
1293
+ acIncrement: 5,
1294
+
1295
+ artProbs: zeros(ART_IDX_TOTAL),
1296
+ tvProbs: zeros(TV_MAX),
1297
+ tvNum: zeros(TV_MAX),
1298
+ bowTotal: 0,
1299
+ meleeTotal: 0,
1300
+ bootTotal: 0,
1301
+ gloveTotal: 0,
1302
+ headgearTotal: 0,
1303
+ shieldTotal: 0,
1304
+ cloakTotal: 0,
1305
+ armorTotal: 0,
1306
+ otherTotal: 0,
1307
+ total: 0,
1308
+ negPowerTotal: 0,
1309
+
1310
+ tvFreq: zeros(TV_MAX),
1311
+
1312
+ basePower: zeros(aMax),
1313
+ maxPower: 0,
1314
+ minPower: 0,
1315
+ avgPower: 0,
1316
+ varPower: 0,
1317
+ avgTvPower: zeros(TV_MAX),
1318
+ minTvPower: zeros(TV_MAX),
1319
+ maxTvPower: zeros(TV_MAX),
1320
+
1321
+ baseItemLevel: zeros(aMax),
1322
+ baseItemProb: zeros(aMax),
1323
+ baseArtAlloc: zeros(aMax),
1324
+ };
1325
+ }
1326
+
1327
+ /**
1328
+ * Allocate an ArtifactSetData and run the measurement pipeline over the
1329
+ * registry's standard artifacts: store_base_power, then parse_frequencies
1330
+ * (which runs collect_artifact_data, rescale_freqs and adjust_freqs). Returns
1331
+ * the populated data. `rng` is threaded through for parity with upstream
1332
+ * do_randart (store_base_power's fake-object build consumes no RNG for the
1333
+ * standard, curse-free artifact set).
1334
+ */
1335
+ export function collectArtifactData(
1336
+ reg: ObjRegistry,
1337
+ rng: Rng,
1338
+ ): ArtifactSetData {
1339
+ void rng;
1340
+ const data = artifactSetDataNew(reg);
1341
+ storeBasePower(reg, data);
1342
+ parseFrequencies(reg, data);
1343
+ return data;
1344
+ }