@rpgm-tools/neo-angband-core 0.18.0 → 0.19.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 (848) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/perceive.d.ts.map +1 -1
  3. package/dist/agent/perceive.js +2 -2
  4. package/dist/agent/perceive.js.map +1 -1
  5. package/dist/combat/blow-vectors.d.ts +78 -0
  6. package/dist/combat/blow-vectors.d.ts.map +1 -0
  7. package/dist/combat/blow-vectors.fixtures.d.ts +19 -0
  8. package/dist/combat/blow-vectors.fixtures.d.ts.map +1 -0
  9. package/dist/combat/blow-vectors.fixtures.js +81 -0
  10. package/dist/combat/blow-vectors.fixtures.js.map +1 -0
  11. package/dist/combat/blow-vectors.js +195 -0
  12. package/dist/combat/blow-vectors.js.map +1 -0
  13. package/dist/combat/brand-slay.d.ts +22 -9
  14. package/dist/combat/brand-slay.d.ts.map +1 -1
  15. package/dist/combat/brand-slay.js +37 -10
  16. package/dist/combat/brand-slay.js.map +1 -1
  17. package/dist/combat/index.d.ts +1 -1
  18. package/dist/combat/index.js +1 -1
  19. package/dist/combat/melee.d.ts +25 -13
  20. package/dist/combat/melee.d.ts.map +1 -1
  21. package/dist/combat/melee.js +23 -19
  22. package/dist/combat/melee.js.map +1 -1
  23. package/dist/combat/mon-melee.d.ts +166 -7
  24. package/dist/combat/mon-melee.d.ts.map +1 -1
  25. package/dist/combat/mon-melee.js +469 -338
  26. package/dist/combat/mon-melee.js.map +1 -1
  27. package/dist/combat/ranged.d.ts +15 -13
  28. package/dist/combat/ranged.d.ts.map +1 -1
  29. package/dist/combat/ranged.js +31 -29
  30. package/dist/combat/ranged.js.map +1 -1
  31. package/dist/constants.d.ts +14 -0
  32. package/dist/constants.d.ts.map +1 -1
  33. package/dist/constants.js +14 -0
  34. package/dist/constants.js.map +1 -1
  35. package/dist/datafile.d.ts +48 -0
  36. package/dist/datafile.d.ts.map +1 -0
  37. package/dist/datafile.js +102 -0
  38. package/dist/datafile.js.map +1 -0
  39. package/dist/effects/effect-info-registry.d.ts +237 -0
  40. package/dist/effects/effect-info-registry.d.ts.map +1 -0
  41. package/dist/effects/effect-info-registry.js +138 -0
  42. package/dist/effects/effect-info-registry.js.map +1 -0
  43. package/dist/effects/effect-info-vectors.d.ts +92 -0
  44. package/dist/effects/effect-info-vectors.d.ts.map +1 -0
  45. package/dist/effects/effect-info-vectors.fixtures.d.ts +18 -0
  46. package/dist/effects/effect-info-vectors.fixtures.d.ts.map +1 -0
  47. package/dist/effects/effect-info-vectors.fixtures.js +51 -0
  48. package/dist/effects/effect-info-vectors.fixtures.js.map +1 -0
  49. package/dist/effects/effect-info-vectors.js +315 -0
  50. package/dist/effects/effect-info-vectors.js.map +1 -0
  51. package/dist/effects/effect-info.d.ts +5 -1
  52. package/dist/effects/effect-info.d.ts.map +1 -1
  53. package/dist/effects/effect-info.js +245 -143
  54. package/dist/effects/effect-info.js.map +1 -1
  55. package/dist/effects/effect.d.ts +4 -3
  56. package/dist/effects/effect.d.ts.map +1 -1
  57. package/dist/effects/effect.js +88 -70
  58. package/dist/effects/effect.js.map +1 -1
  59. package/dist/effects/handlers.d.ts +1 -1
  60. package/dist/effects/handlers.d.ts.map +1 -1
  61. package/dist/effects/handlers.js +5 -2
  62. package/dist/effects/handlers.js.map +1 -1
  63. package/dist/effects/interpreter.d.ts +11 -0
  64. package/dist/effects/interpreter.d.ts.map +1 -1
  65. package/dist/effects/interpreter.js +13 -0
  66. package/dist/effects/interpreter.js.map +1 -1
  67. package/dist/game/cave-cmd.d.ts +9 -5
  68. package/dist/game/cave-cmd.d.ts.map +1 -1
  69. package/dist/game/cave-cmd.js +56 -11
  70. package/dist/game/cave-cmd.js.map +1 -1
  71. package/dist/game/cave-square.d.ts +42 -0
  72. package/dist/game/cave-square.d.ts.map +1 -0
  73. package/dist/game/cave-square.js +73 -0
  74. package/dist/game/cave-square.js.map +1 -0
  75. package/dist/game/char-sheet.d.ts +12 -8
  76. package/dist/game/char-sheet.d.ts.map +1 -1
  77. package/dist/game/char-sheet.js +41 -8
  78. package/dist/game/char-sheet.js.map +1 -1
  79. package/dist/game/chest.d.ts +2 -3
  80. package/dist/game/chest.d.ts.map +1 -1
  81. package/dist/game/chest.js +17 -6
  82. package/dist/game/chest.js.map +1 -1
  83. package/dist/game/context.d.ts +213 -22
  84. package/dist/game/context.d.ts.map +1 -1
  85. package/dist/game/context.js +109 -17
  86. package/dist/game/context.js.map +1 -1
  87. package/dist/game/describe.d.ts +13 -0
  88. package/dist/game/describe.d.ts.map +1 -1
  89. package/dist/game/describe.js +32 -4
  90. package/dist/game/describe.js.map +1 -1
  91. package/dist/game/display.d.ts +97 -8
  92. package/dist/game/display.d.ts.map +1 -1
  93. package/dist/game/display.js +157 -13
  94. package/dist/game/display.js.map +1 -1
  95. package/dist/game/dump-level.d.ts.map +1 -1
  96. package/dist/game/dump-level.js +3 -2
  97. package/dist/game/dump-level.js.map +1 -1
  98. package/dist/game/effect-attack.d.ts.map +1 -1
  99. package/dist/game/effect-attack.js +36 -27
  100. package/dist/game/effect-attack.js.map +1 -1
  101. package/dist/game/effect-detect.d.ts +4 -4
  102. package/dist/game/effect-detect.d.ts.map +1 -1
  103. package/dist/game/effect-detect.js +42 -9
  104. package/dist/game/effect-detect.js.map +1 -1
  105. package/dist/game/effect-env.d.ts +7 -1
  106. package/dist/game/effect-env.d.ts.map +1 -1
  107. package/dist/game/effect-env.js +1 -0
  108. package/dist/game/effect-env.js.map +1 -1
  109. package/dist/game/effect-general.d.ts +5 -3
  110. package/dist/game/effect-general.d.ts.map +1 -1
  111. package/dist/game/effect-general.js +94 -43
  112. package/dist/game/effect-general.js.map +1 -1
  113. package/dist/game/effect-item.d.ts +2 -1
  114. package/dist/game/effect-item.d.ts.map +1 -1
  115. package/dist/game/effect-item.js +136 -82
  116. package/dist/game/effect-item.js.map +1 -1
  117. package/dist/game/effect-melee.d.ts +10 -4
  118. package/dist/game/effect-melee.d.ts.map +1 -1
  119. package/dist/game/effect-melee.js +44 -19
  120. package/dist/game/effect-melee.js.map +1 -1
  121. package/dist/game/effect-monster.d.ts +26 -4
  122. package/dist/game/effect-monster.d.ts.map +1 -1
  123. package/dist/game/effect-monster.js +52 -9
  124. package/dist/game/effect-monster.js.map +1 -1
  125. package/dist/game/effect-teleport.d.ts +58 -19
  126. package/dist/game/effect-teleport.d.ts.map +1 -1
  127. package/dist/game/effect-teleport.js +143 -27
  128. package/dist/game/effect-teleport.js.map +1 -1
  129. package/dist/game/effect-terrain.d.ts +1 -3
  130. package/dist/game/effect-terrain.d.ts.map +1 -1
  131. package/dist/game/effect-terrain.js +38 -22
  132. package/dist/game/effect-terrain.js.map +1 -1
  133. package/dist/game/equip-cmp.d.ts.map +1 -1
  134. package/dist/game/equip-cmp.js +10 -7
  135. package/dist/game/equip-cmp.js.map +1 -1
  136. package/dist/game/floor.d.ts +16 -4
  137. package/dist/game/floor.d.ts.map +1 -1
  138. package/dist/game/floor.js +22 -4
  139. package/dist/game/floor.js.map +1 -1
  140. package/dist/game/gear.d.ts +101 -13
  141. package/dist/game/gear.d.ts.map +1 -1
  142. package/dist/game/gear.js +183 -24
  143. package/dist/game/gear.js.map +1 -1
  144. package/dist/game/harness.d.ts +2 -1
  145. package/dist/game/harness.d.ts.map +1 -1
  146. package/dist/game/harness.js +12 -1
  147. package/dist/game/harness.js.map +1 -1
  148. package/dist/game/ignore-cmd.d.ts +47 -8
  149. package/dist/game/ignore-cmd.d.ts.map +1 -1
  150. package/dist/game/ignore-cmd.js +76 -8
  151. package/dist/game/ignore-cmd.js.map +1 -1
  152. package/dist/game/known.d.ts +223 -34
  153. package/dist/game/known.d.ts.map +1 -1
  154. package/dist/game/known.js +301 -67
  155. package/dist/game/known.js.map +1 -1
  156. package/dist/game/loop.d.ts +4 -3
  157. package/dist/game/loop.d.ts.map +1 -1
  158. package/dist/game/loop.js +49 -29
  159. package/dist/game/loop.js.map +1 -1
  160. package/dist/game/lore-color.d.ts.map +1 -1
  161. package/dist/game/lore-color.js +13 -1
  162. package/dist/game/lore-color.js.map +1 -1
  163. package/dist/game/mon-cast.d.ts +3 -4
  164. package/dist/game/mon-cast.d.ts.map +1 -1
  165. package/dist/game/mon-cast.js +30 -2
  166. package/dist/game/mon-cast.js.map +1 -1
  167. package/dist/game/mon-cmd.d.ts +4 -5
  168. package/dist/game/mon-cmd.d.ts.map +1 -1
  169. package/dist/game/mon-cmd.js +80 -27
  170. package/dist/game/mon-cmd.js.map +1 -1
  171. package/dist/game/mon-death.d.ts +8 -4
  172. package/dist/game/mon-death.d.ts.map +1 -1
  173. package/dist/game/mon-death.js +6 -9
  174. package/dist/game/mon-death.js.map +1 -1
  175. package/dist/game/mon-group.d.ts +9 -5
  176. package/dist/game/mon-group.d.ts.map +1 -1
  177. package/dist/game/mon-group.js +9 -5
  178. package/dist/game/mon-group.js.map +1 -1
  179. package/dist/game/mon-message.d.ts +90 -40
  180. package/dist/game/mon-message.d.ts.map +1 -1
  181. package/dist/game/mon-message.js +267 -59
  182. package/dist/game/mon-message.js.map +1 -1
  183. package/dist/game/mon-place.d.ts +11 -1
  184. package/dist/game/mon-place.d.ts.map +1 -1
  185. package/dist/game/mon-place.js +15 -3
  186. package/dist/game/mon-place.js.map +1 -1
  187. package/dist/game/mon-ranged.d.ts +2 -1
  188. package/dist/game/mon-ranged.d.ts.map +1 -1
  189. package/dist/game/mon-ranged.js +11 -5
  190. package/dist/game/mon-ranged.js.map +1 -1
  191. package/dist/game/mon-side.d.ts +3 -2
  192. package/dist/game/mon-side.d.ts.map +1 -1
  193. package/dist/game/mon-side.js +15 -14
  194. package/dist/game/mon-side.js.map +1 -1
  195. package/dist/game/monster-turn.d.ts +20 -10
  196. package/dist/game/monster-turn.d.ts.map +1 -1
  197. package/dist/game/monster-turn.js +110 -83
  198. package/dist/game/monster-turn.js.map +1 -1
  199. package/dist/game/notice.d.ts +36 -0
  200. package/dist/game/notice.d.ts.map +1 -0
  201. package/dist/game/notice.js +79 -0
  202. package/dist/game/notice.js.map +1 -0
  203. package/dist/game/obj-cmd.d.ts +14 -3
  204. package/dist/game/obj-cmd.d.ts.map +1 -1
  205. package/dist/game/obj-cmd.js +109 -35
  206. package/dist/game/obj-cmd.js.map +1 -1
  207. package/dist/game/obj-list.d.ts +13 -2
  208. package/dist/game/obj-list.d.ts.map +1 -1
  209. package/dist/game/obj-list.js +42 -27
  210. package/dist/game/obj-list.js.map +1 -1
  211. package/dist/game/object-inspect.d.ts +9 -0
  212. package/dist/game/object-inspect.d.ts.map +1 -1
  213. package/dist/game/object-inspect.js +4 -0
  214. package/dist/game/object-inspect.js.map +1 -1
  215. package/dist/game/pickup.d.ts +0 -2
  216. package/dist/game/pickup.d.ts.map +1 -1
  217. package/dist/game/pickup.js +18 -3
  218. package/dist/game/pickup.js.map +1 -1
  219. package/dist/game/player-side-vectors.d.ts +174 -0
  220. package/dist/game/player-side-vectors.d.ts.map +1 -0
  221. package/dist/game/player-side-vectors.fixtures.d.ts +33 -0
  222. package/dist/game/player-side-vectors.fixtures.d.ts.map +1 -0
  223. package/dist/game/player-side-vectors.fixtures.js +191 -0
  224. package/dist/game/player-side-vectors.fixtures.js.map +1 -0
  225. package/dist/game/player-side-vectors.js +292 -0
  226. package/dist/game/player-side-vectors.js.map +1 -0
  227. package/dist/game/player-side.d.ts +129 -1
  228. package/dist/game/player-side.d.ts.map +1 -1
  229. package/dist/game/player-side.js +520 -338
  230. package/dist/game/player-side.js.map +1 -1
  231. package/dist/game/player-turn.d.ts +26 -7
  232. package/dist/game/player-turn.d.ts.map +1 -1
  233. package/dist/game/player-turn.js +180 -33
  234. package/dist/game/player-turn.js.map +1 -1
  235. package/dist/game/poly.d.ts +38 -0
  236. package/dist/game/poly.d.ts.map +1 -0
  237. package/dist/game/poly.js +82 -0
  238. package/dist/game/poly.js.map +1 -0
  239. package/dist/game/project-cast.d.ts +20 -3
  240. package/dist/game/project-cast.d.ts.map +1 -1
  241. package/dist/game/project-cast.js +49 -6
  242. package/dist/game/project-cast.js.map +1 -1
  243. package/dist/game/project-feat-vectors.d.ts +124 -0
  244. package/dist/game/project-feat-vectors.d.ts.map +1 -0
  245. package/dist/game/project-feat-vectors.fixtures.d.ts +13 -0
  246. package/dist/game/project-feat-vectors.fixtures.d.ts.map +1 -0
  247. package/dist/game/project-feat-vectors.fixtures.js +94 -0
  248. package/dist/game/project-feat-vectors.fixtures.js.map +1 -0
  249. package/dist/game/project-feat-vectors.js +229 -0
  250. package/dist/game/project-feat-vectors.js.map +1 -0
  251. package/dist/game/project-feat.d.ts +53 -1
  252. package/dist/game/project-feat.d.ts.map +1 -1
  253. package/dist/game/project-feat.js +374 -247
  254. package/dist/game/project-feat.js.map +1 -1
  255. package/dist/game/project-monster.d.ts +21 -8
  256. package/dist/game/project-monster.d.ts.map +1 -1
  257. package/dist/game/project-monster.js +45 -21
  258. package/dist/game/project-monster.js.map +1 -1
  259. package/dist/game/project-obj.d.ts +62 -0
  260. package/dist/game/project-obj.d.ts.map +1 -1
  261. package/dist/game/project-obj.js +72 -41
  262. package/dist/game/project-obj.js.map +1 -1
  263. package/dist/game/project-player.d.ts +8 -0
  264. package/dist/game/project-player.d.ts.map +1 -1
  265. package/dist/game/project-player.js.map +1 -1
  266. package/dist/game/projection-handlers.d.ts +81 -0
  267. package/dist/game/projection-handlers.d.ts.map +1 -0
  268. package/dist/game/projection-handlers.js +93 -0
  269. package/dist/game/projection-handlers.js.map +1 -0
  270. package/dist/game/quest.d.ts +23 -0
  271. package/dist/game/quest.d.ts.map +1 -1
  272. package/dist/game/quest.js +42 -0
  273. package/dist/game/quest.js.map +1 -1
  274. package/dist/game/ranged-cmd.d.ts +13 -2
  275. package/dist/game/ranged-cmd.d.ts.map +1 -1
  276. package/dist/game/ranged-cmd.js +32 -15
  277. package/dist/game/ranged-cmd.js.map +1 -1
  278. package/dist/game/repeat.d.ts +78 -0
  279. package/dist/game/repeat.d.ts.map +1 -0
  280. package/dist/game/repeat.js +88 -0
  281. package/dist/game/repeat.js.map +1 -0
  282. package/dist/game/shape-inspect.d.ts +74 -0
  283. package/dist/game/shape-inspect.d.ts.map +1 -0
  284. package/dist/game/shape-inspect.js +114 -0
  285. package/dist/game/shape-inspect.js.map +1 -0
  286. package/dist/game/spell-cmd.d.ts +15 -4
  287. package/dist/game/spell-cmd.d.ts.map +1 -1
  288. package/dist/game/spell-cmd.js +35 -6
  289. package/dist/game/spell-cmd.js.map +1 -1
  290. package/dist/game/spoil.d.ts.map +1 -1
  291. package/dist/game/spoil.js +89 -40
  292. package/dist/game/spoil.js.map +1 -1
  293. package/dist/game/steal.d.ts +3 -3
  294. package/dist/game/steal.d.ts.map +1 -1
  295. package/dist/game/steal.js +9 -4
  296. package/dist/game/steal.js.map +1 -1
  297. package/dist/game/target-loop.d.ts +10 -4
  298. package/dist/game/target-loop.d.ts.map +1 -1
  299. package/dist/game/target-loop.js +14 -8
  300. package/dist/game/target-loop.js.map +1 -1
  301. package/dist/game/target.d.ts +4 -4
  302. package/dist/game/target.d.ts.map +1 -1
  303. package/dist/game/target.js +19 -8
  304. package/dist/game/target.js.map +1 -1
  305. package/dist/game/ui-entry.d.ts +63 -4
  306. package/dist/game/ui-entry.d.ts.map +1 -1
  307. package/dist/game/ui-entry.js +151 -23
  308. package/dist/game/ui-entry.js.map +1 -1
  309. package/dist/game/wizard.d.ts +23 -5
  310. package/dist/game/wizard.d.ts.map +1 -1
  311. package/dist/game/wizard.js +93 -11
  312. package/dist/game/wizard.js.map +1 -1
  313. package/dist/game/world.d.ts.map +1 -1
  314. package/dist/game/world.js +6 -0
  315. package/dist/game/world.js.map +1 -1
  316. package/dist/gen/cave.d.ts +49 -8
  317. package/dist/gen/cave.d.ts.map +1 -1
  318. package/dist/gen/cave.js +200 -28
  319. package/dist/gen/cave.js.map +1 -1
  320. package/dist/gen/generate.d.ts +54 -9
  321. package/dist/gen/generate.d.ts.map +1 -1
  322. package/dist/gen/generate.js +55 -8
  323. package/dist/gen/generate.js.map +1 -1
  324. package/dist/gen/glyph-vectors.d.ts +109 -0
  325. package/dist/gen/glyph-vectors.d.ts.map +1 -0
  326. package/dist/gen/glyph-vectors.fixtures.d.ts +18 -0
  327. package/dist/gen/glyph-vectors.fixtures.d.ts.map +1 -0
  328. package/dist/gen/glyph-vectors.fixtures.js +94 -0
  329. package/dist/gen/glyph-vectors.fixtures.js.map +1 -0
  330. package/dist/gen/glyph-vectors.js +218 -0
  331. package/dist/gen/glyph-vectors.js.map +1 -0
  332. package/dist/gen/glyph.d.ts +104 -0
  333. package/dist/gen/glyph.d.ts.map +1 -0
  334. package/dist/gen/glyph.js +72 -0
  335. package/dist/gen/glyph.js.map +1 -0
  336. package/dist/gen/room.d.ts +26 -2
  337. package/dist/gen/room.d.ts.map +1 -1
  338. package/dist/gen/room.js +414 -264
  339. package/dist/gen/room.js.map +1 -1
  340. package/dist/gen/util.d.ts +11 -2
  341. package/dist/gen/util.d.ts.map +1 -1
  342. package/dist/gen/util.js +31 -9
  343. package/dist/gen/util.js.map +1 -1
  344. package/dist/i18n/i18n.d.ts +207 -0
  345. package/dist/i18n/i18n.d.ts.map +1 -0
  346. package/dist/i18n/i18n.js +405 -0
  347. package/dist/i18n/i18n.js.map +1 -0
  348. package/dist/i18n/text.d.ts +62 -0
  349. package/dist/i18n/text.d.ts.map +1 -0
  350. package/dist/i18n/text.js +120 -0
  351. package/dist/i18n/text.js.map +1 -0
  352. package/dist/index.d.ts +25 -0
  353. package/dist/index.d.ts.map +1 -1
  354. package/dist/index.js +38 -0
  355. package/dist/index.js.map +1 -1
  356. package/dist/mod/extension.d.ts +115 -0
  357. package/dist/mod/extension.d.ts.map +1 -0
  358. package/dist/mod/extension.js +85 -0
  359. package/dist/mod/extension.js.map +1 -0
  360. package/dist/mod/ids.d.ts +10 -0
  361. package/dist/mod/ids.d.ts.map +1 -1
  362. package/dist/mod/ids.js +90 -21
  363. package/dist/mod/ids.js.map +1 -1
  364. package/dist/mod/record-keys.d.ts +43 -0
  365. package/dist/mod/record-keys.d.ts.map +1 -0
  366. package/dist/mod/record-keys.js +100 -0
  367. package/dist/mod/record-keys.js.map +1 -0
  368. package/dist/mod/registry-host.d.ts +472 -0
  369. package/dist/mod/registry-host.d.ts.map +1 -1
  370. package/dist/mod/registry-host.js +313 -0
  371. package/dist/mod/registry-host.js.map +1 -1
  372. package/dist/mod/save-blocks.d.ts +1 -1
  373. package/dist/mon/bind.d.ts.map +1 -1
  374. package/dist/mon/bind.js +6 -3
  375. package/dist/mon/bind.js.map +1 -1
  376. package/dist/mon/knowledge-groups.d.ts +0 -6
  377. package/dist/mon/knowledge-groups.d.ts.map +1 -1
  378. package/dist/mon/knowledge-groups.js +12 -8
  379. package/dist/mon/knowledge-groups.js.map +1 -1
  380. package/dist/mon/lore-describe.d.ts +46 -10
  381. package/dist/mon/lore-describe.d.ts.map +1 -1
  382. package/dist/mon/lore-describe.js +74 -22
  383. package/dist/mon/lore-describe.js.map +1 -1
  384. package/dist/mon/lore-file.d.ts +126 -0
  385. package/dist/mon/lore-file.d.ts.map +1 -0
  386. package/dist/mon/lore-file.js +291 -0
  387. package/dist/mon/lore-file.js.map +1 -0
  388. package/dist/mon/lore.d.ts +9 -3
  389. package/dist/mon/lore.d.ts.map +1 -1
  390. package/dist/mon/lore.js +9 -3
  391. package/dist/mon/lore.js.map +1 -1
  392. package/dist/mon/make.d.ts +4 -2
  393. package/dist/mon/make.d.ts.map +1 -1
  394. package/dist/mon/make.js +4 -2
  395. package/dist/mon/make.js.map +1 -1
  396. package/dist/mon/monster.d.ts +1 -1
  397. package/dist/mon/monster.js +1 -1
  398. package/dist/mon/predicate.d.ts +14 -9
  399. package/dist/mon/predicate.d.ts.map +1 -1
  400. package/dist/mon/predicate.js +14 -9
  401. package/dist/mon/predicate.js.map +1 -1
  402. package/dist/mon/project-mon.d.ts +16 -3
  403. package/dist/mon/project-mon.d.ts.map +1 -1
  404. package/dist/mon/project-mon.js +14 -5
  405. package/dist/mon/project-mon.js.map +1 -1
  406. package/dist/mon/steal.d.ts +31 -4
  407. package/dist/mon/steal.d.ts.map +1 -1
  408. package/dist/mon/steal.js +20 -7
  409. package/dist/mon/steal.js.map +1 -1
  410. package/dist/mon/take-hit.d.ts +8 -3
  411. package/dist/mon/take-hit.d.ts.map +1 -1
  412. package/dist/mon/take-hit.js +8 -3
  413. package/dist/mon/take-hit.js.map +1 -1
  414. package/dist/mon/timed.d.ts +15 -9
  415. package/dist/mon/timed.d.ts.map +1 -1
  416. package/dist/mon/timed.js +13 -8
  417. package/dist/mon/timed.js.map +1 -1
  418. package/dist/mon/types.d.ts +11 -4
  419. package/dist/mon/types.d.ts.map +1 -1
  420. package/dist/mon/types.js.map +1 -1
  421. package/dist/msg.d.ts +40 -1
  422. package/dist/msg.d.ts.map +1 -1
  423. package/dist/msg.js +42 -1
  424. package/dist/msg.js.map +1 -1
  425. package/dist/obj/artifact-fake.d.ts +46 -14
  426. package/dist/obj/artifact-fake.d.ts.map +1 -1
  427. package/dist/obj/artifact-fake.js +46 -17
  428. package/dist/obj/artifact-fake.js.map +1 -1
  429. package/dist/obj/bind.d.ts +23 -0
  430. package/dist/obj/bind.d.ts.map +1 -1
  431. package/dist/obj/bind.js +49 -9
  432. package/dist/obj/bind.js.map +1 -1
  433. package/dist/obj/desc-vectors.d.ts +68 -0
  434. package/dist/obj/desc-vectors.d.ts.map +1 -0
  435. package/dist/obj/desc-vectors.fixtures.d.ts +12 -0
  436. package/dist/obj/desc-vectors.fixtures.d.ts.map +1 -0
  437. package/dist/obj/desc-vectors.fixtures.js +95 -0
  438. package/dist/obj/desc-vectors.fixtures.js.map +1 -0
  439. package/dist/obj/desc-vectors.js +86 -0
  440. package/dist/obj/desc-vectors.js.map +1 -0
  441. package/dist/obj/desc.d.ts +17 -2
  442. package/dist/obj/desc.d.ts.map +1 -1
  443. package/dist/obj/desc.js +129 -54
  444. package/dist/obj/desc.js.map +1 -1
  445. package/dist/obj/effects-info.d.ts.map +1 -1
  446. package/dist/obj/effects-info.js +87 -58
  447. package/dist/obj/effects-info.js.map +1 -1
  448. package/dist/obj/fake-object.d.ts +70 -0
  449. package/dist/obj/fake-object.d.ts.map +1 -0
  450. package/dist/obj/fake-object.js +104 -0
  451. package/dist/obj/fake-object.js.map +1 -0
  452. package/dist/obj/ignore.d.ts +55 -12
  453. package/dist/obj/ignore.d.ts.map +1 -1
  454. package/dist/obj/ignore.js +68 -31
  455. package/dist/obj/ignore.js.map +1 -1
  456. package/dist/obj/knowledge.d.ts +46 -3
  457. package/dist/obj/knowledge.d.ts.map +1 -1
  458. package/dist/obj/knowledge.js +169 -151
  459. package/dist/obj/knowledge.js.map +1 -1
  460. package/dist/obj/known-object.d.ts +68 -8
  461. package/dist/obj/known-object.d.ts.map +1 -1
  462. package/dist/obj/known-object.js +90 -10
  463. package/dist/obj/known-object.js.map +1 -1
  464. package/dist/obj/make.d.ts +15 -4
  465. package/dist/obj/make.d.ts.map +1 -1
  466. package/dist/obj/make.js +49 -27
  467. package/dist/obj/make.js.map +1 -1
  468. package/dist/obj/object-info.d.ts +10 -0
  469. package/dist/obj/object-info.d.ts.map +1 -1
  470. package/dist/obj/object-info.js +93 -7
  471. package/dist/obj/object-info.js.map +1 -1
  472. package/dist/obj/object.d.ts +42 -4
  473. package/dist/obj/object.d.ts.map +1 -1
  474. package/dist/obj/object.js +362 -147
  475. package/dist/obj/object.js.map +1 -1
  476. package/dist/obj/power.d.ts +23 -4
  477. package/dist/obj/power.d.ts.map +1 -1
  478. package/dist/obj/power.js +231 -65
  479. package/dist/obj/power.js.map +1 -1
  480. package/dist/obj/randart-build.d.ts +27 -22
  481. package/dist/obj/randart-build.d.ts.map +1 -1
  482. package/dist/obj/randart-build.js +435 -357
  483. package/dist/obj/randart-build.js.map +1 -1
  484. package/dist/obj/randart-data.d.ts +62 -24
  485. package/dist/obj/randart-data.d.ts.map +1 -1
  486. package/dist/obj/randart-data.js +333 -189
  487. package/dist/obj/randart-data.js.map +1 -1
  488. package/dist/obj/randart-file.d.ts +21 -0
  489. package/dist/obj/randart-file.d.ts.map +1 -0
  490. package/dist/obj/randart-file.js +119 -0
  491. package/dist/obj/randart-file.js.map +1 -0
  492. package/dist/obj/randart-log.d.ts +63 -0
  493. package/dist/obj/randart-log.d.ts.map +1 -0
  494. package/dist/obj/randart-log.js +72 -0
  495. package/dist/obj/randart-log.js.map +1 -0
  496. package/dist/obj/randart-registry.d.ts +178 -0
  497. package/dist/obj/randart-registry.d.ts.map +1 -0
  498. package/dist/obj/randart-registry.js +140 -0
  499. package/dist/obj/randart-registry.js.map +1 -0
  500. package/dist/obj/randart-vectors.d.ts +97 -0
  501. package/dist/obj/randart-vectors.d.ts.map +1 -0
  502. package/dist/obj/randart-vectors.fixtures.d.ts +18 -0
  503. package/dist/obj/randart-vectors.fixtures.d.ts.map +1 -0
  504. package/dist/obj/randart-vectors.fixtures.js +50 -0
  505. package/dist/obj/randart-vectors.fixtures.js.map +1 -0
  506. package/dist/obj/randart-vectors.js +311 -0
  507. package/dist/obj/randart-vectors.js.map +1 -0
  508. package/dist/obj/randart.d.ts +53 -15
  509. package/dist/obj/randart.d.ts.map +1 -1
  510. package/dist/obj/randart.js +166 -44
  511. package/dist/obj/randart.js.map +1 -1
  512. package/dist/obj/rune-registry.d.ts +180 -0
  513. package/dist/obj/rune-registry.d.ts.map +1 -0
  514. package/dist/obj/rune-registry.js +161 -0
  515. package/dist/obj/rune-registry.js.map +1 -0
  516. package/dist/obj/rune-vectors.d.ts +99 -0
  517. package/dist/obj/rune-vectors.d.ts.map +1 -0
  518. package/dist/obj/rune-vectors.fixtures.d.ts +44 -0
  519. package/dist/obj/rune-vectors.fixtures.d.ts.map +1 -0
  520. package/dist/obj/rune-vectors.fixtures.js +125 -0
  521. package/dist/obj/rune-vectors.fixtures.js.map +1 -0
  522. package/dist/obj/rune-vectors.js +159 -0
  523. package/dist/obj/rune-vectors.js.map +1 -0
  524. package/dist/obj/tval-registry.d.ts +174 -0
  525. package/dist/obj/tval-registry.d.ts.map +1 -0
  526. package/dist/obj/tval-registry.js +151 -0
  527. package/dist/obj/tval-registry.js.map +1 -0
  528. package/dist/obj/tval-vectors.d.ts +85 -0
  529. package/dist/obj/tval-vectors.d.ts.map +1 -0
  530. package/dist/obj/tval-vectors.fixtures.d.ts +24 -0
  531. package/dist/obj/tval-vectors.fixtures.d.ts.map +1 -0
  532. package/dist/obj/tval-vectors.fixtures.js +41 -0
  533. package/dist/obj/tval-vectors.fixtures.js.map +1 -0
  534. package/dist/obj/tval-vectors.js +76 -0
  535. package/dist/obj/tval-vectors.js.map +1 -0
  536. package/dist/obj/types.d.ts +18 -7
  537. package/dist/obj/types.d.ts.map +1 -1
  538. package/dist/obj/types.js.map +1 -1
  539. package/dist/obj/value.d.ts.map +1 -1
  540. package/dist/obj/value.js +23 -20
  541. package/dist/obj/value.js.map +1 -1
  542. package/dist/parser.d.ts +116 -0
  543. package/dist/parser.d.ts.map +1 -0
  544. package/dist/parser.js +205 -0
  545. package/dist/parser.js.map +1 -0
  546. package/dist/player/bind.d.ts.map +1 -1
  547. package/dist/player/bind.js +3 -2
  548. package/dist/player/bind.js.map +1 -1
  549. package/dist/player/birth.d.ts +2 -1
  550. package/dist/player/birth.d.ts.map +1 -1
  551. package/dist/player/birth.js +2 -1
  552. package/dist/player/birth.js.map +1 -1
  553. package/dist/player/calcs.d.ts +58 -23
  554. package/dist/player/calcs.d.ts.map +1 -1
  555. package/dist/player/calcs.js +93 -36
  556. package/dist/player/calcs.js.map +1 -1
  557. package/dist/player/death.d.ts +50 -0
  558. package/dist/player/death.d.ts.map +1 -0
  559. package/dist/player/death.js +46 -0
  560. package/dist/player/death.js.map +1 -0
  561. package/dist/player/options-file.d.ts +129 -0
  562. package/dist/player/options-file.d.ts.map +1 -0
  563. package/dist/player/options-file.js +309 -0
  564. package/dist/player/options-file.js.map +1 -0
  565. package/dist/player/options.d.ts +2 -1
  566. package/dist/player/options.d.ts.map +1 -1
  567. package/dist/player/options.js +2 -1
  568. package/dist/player/options.js.map +1 -1
  569. package/dist/player/player.d.ts +50 -3
  570. package/dist/player/player.d.ts.map +1 -1
  571. package/dist/player/player.js +10 -1
  572. package/dist/player/player.js.map +1 -1
  573. package/dist/player/shape-lore.d.ts +11 -7
  574. package/dist/player/shape-lore.d.ts.map +1 -1
  575. package/dist/player/shape-lore.js +24 -11
  576. package/dist/player/shape-lore.js.map +1 -1
  577. package/dist/player/timed.d.ts +5 -3
  578. package/dist/player/timed.d.ts.map +1 -1
  579. package/dist/player/timed.js +11 -2
  580. package/dist/player/timed.js.map +1 -1
  581. package/dist/player/types.d.ts +29 -4
  582. package/dist/player/types.d.ts.map +1 -1
  583. package/dist/player/types.js +24 -1
  584. package/dist/player/types.js.map +1 -1
  585. package/dist/session/boot.d.ts +26 -2
  586. package/dist/session/boot.d.ts.map +1 -1
  587. package/dist/session/boot.js +21 -2
  588. package/dist/session/boot.js.map +1 -1
  589. package/dist/session/game.d.ts +15 -0
  590. package/dist/session/game.d.ts.map +1 -1
  591. package/dist/session/game.js +616 -140
  592. package/dist/session/game.js.map +1 -1
  593. package/dist/session/save-migrate.d.ts.map +1 -1
  594. package/dist/session/save-migrate.js +76 -1
  595. package/dist/session/save-migrate.js.map +1 -1
  596. package/dist/session/save.d.ts +75 -12
  597. package/dist/session/save.d.ts.map +1 -1
  598. package/dist/session/save.js +177 -18
  599. package/dist/session/save.js.map +1 -1
  600. package/dist/store/bind.d.ts +1 -1
  601. package/dist/store/bind.d.ts.map +1 -1
  602. package/dist/store/bind.js +4 -3
  603. package/dist/store/bind.js.map +1 -1
  604. package/dist/store/mass-produce-vectors.d.ts +40 -0
  605. package/dist/store/mass-produce-vectors.d.ts.map +1 -0
  606. package/dist/store/mass-produce-vectors.fixtures.d.ts +13 -0
  607. package/dist/store/mass-produce-vectors.fixtures.d.ts.map +1 -0
  608. package/dist/store/mass-produce-vectors.fixtures.js +52 -0
  609. package/dist/store/mass-produce-vectors.fixtures.js.map +1 -0
  610. package/dist/store/mass-produce-vectors.js +44 -0
  611. package/dist/store/mass-produce-vectors.js.map +1 -0
  612. package/dist/store/store.d.ts +104 -7
  613. package/dist/store/store.d.ts.map +1 -1
  614. package/dist/store/store.js +199 -77
  615. package/dist/store/store.js.map +1 -1
  616. package/dist/store/transact.d.ts +14 -5
  617. package/dist/store/transact.d.ts.map +1 -1
  618. package/dist/store/transact.js +17 -16
  619. package/dist/store/transact.js.map +1 -1
  620. package/dist/store/types.d.ts +3 -2
  621. package/dist/store/types.d.ts.map +1 -1
  622. package/dist/store/types.js +1 -1
  623. package/dist/version.d.ts +1 -1
  624. package/dist/version.js +1 -1
  625. package/dist/visuals/index.d.ts +1 -0
  626. package/dist/visuals/index.d.ts.map +1 -1
  627. package/dist/visuals/index.js +1 -0
  628. package/dist/visuals/index.js.map +1 -1
  629. package/dist/visuals/map-text.d.ts +8 -0
  630. package/dist/visuals/map-text.d.ts.map +1 -1
  631. package/dist/visuals/map-text.js +1 -1
  632. package/dist/visuals/map-text.js.map +1 -1
  633. package/dist/visuals/object-glyph.d.ts +56 -0
  634. package/dist/visuals/object-glyph.d.ts.map +1 -0
  635. package/dist/visuals/object-glyph.js +52 -0
  636. package/dist/visuals/object-glyph.js.map +1 -0
  637. package/dist/visuals/prefs.d.ts +14 -22
  638. package/dist/visuals/prefs.d.ts.map +1 -1
  639. package/dist/visuals/prefs.js +4 -23
  640. package/dist/visuals/prefs.js.map +1 -1
  641. package/dist/visuals/tile-prefs.d.ts +26 -0
  642. package/dist/visuals/tile-prefs.d.ts.map +1 -1
  643. package/dist/visuals/tile-prefs.js +28 -0
  644. package/dist/visuals/tile-prefs.js.map +1 -1
  645. package/dist/world/feature.d.ts +2 -1
  646. package/dist/world/feature.d.ts.map +1 -1
  647. package/dist/world/feature.js +2 -0
  648. package/dist/world/feature.js.map +1 -1
  649. package/dist/world/project.d.ts +10 -2
  650. package/dist/world/project.d.ts.map +1 -1
  651. package/dist/world/project.js +18 -6
  652. package/dist/world/project.js.map +1 -1
  653. package/dist/world/projection.d.ts +37 -3
  654. package/dist/world/projection.d.ts.map +1 -1
  655. package/dist/world/projection.js +69 -7
  656. package/dist/world/projection.js.map +1 -1
  657. package/dist/world/trap.d.ts +2 -1
  658. package/dist/world/trap.d.ts.map +1 -1
  659. package/dist/world/trap.js +2 -1
  660. package/dist/world/trap.js.map +1 -1
  661. package/dist/world/view.d.ts +1 -1
  662. package/dist/world/view.d.ts.map +1 -1
  663. package/dist/world/view.js +11 -3
  664. package/dist/world/view.js.map +1 -1
  665. package/package.json +1 -1
  666. package/src/agent/perceive.ts +2 -3
  667. package/src/combat/blow-vectors.fixtures.ts +99 -0
  668. package/src/combat/blow-vectors.json +482 -0
  669. package/src/combat/blow-vectors.ts +280 -0
  670. package/src/combat/brand-slay.ts +42 -11
  671. package/src/combat/index.ts +1 -1
  672. package/src/combat/melee.ts +37 -19
  673. package/src/combat/mon-melee.ts +611 -364
  674. package/src/combat/ranged.ts +43 -26
  675. package/src/constants.ts +15 -0
  676. package/src/datafile.ts +148 -0
  677. package/src/effects/effect-info-registry.ts +313 -0
  678. package/src/effects/effect-info-vectors.fixtures.ts +61 -0
  679. package/src/effects/effect-info-vectors.json +11532 -0
  680. package/src/effects/effect-info-vectors.ts +376 -0
  681. package/src/effects/effect-info.ts +1005 -859
  682. package/src/effects/effect.ts +96 -62
  683. package/src/effects/handlers.ts +5 -2
  684. package/src/effects/interpreter.ts +14 -0
  685. package/src/game/cave-cmd.ts +54 -11
  686. package/src/game/cave-square.ts +80 -0
  687. package/src/game/char-sheet.ts +59 -16
  688. package/src/game/chest.ts +25 -8
  689. package/src/game/context.ts +293 -27
  690. package/src/game/describe.ts +34 -4
  691. package/src/game/display.ts +215 -19
  692. package/src/game/dump-level.ts +3 -2
  693. package/src/game/effect-attack.ts +41 -28
  694. package/src/game/effect-detect.ts +45 -8
  695. package/src/game/effect-env.ts +8 -0
  696. package/src/game/effect-general.ts +110 -47
  697. package/src/game/effect-item.ts +1075 -999
  698. package/src/game/effect-melee.ts +51 -18
  699. package/src/game/effect-monster.ts +55 -9
  700. package/src/game/effect-teleport.ts +173 -38
  701. package/src/game/effect-terrain.ts +38 -22
  702. package/src/game/equip-cmp.ts +483 -480
  703. package/src/game/floor.ts +22 -4
  704. package/src/game/gear.ts +210 -21
  705. package/src/game/harness.ts +12 -1
  706. package/src/game/ignore-cmd.ts +96 -8
  707. package/src/game/known.ts +392 -73
  708. package/src/game/loop.ts +52 -27
  709. package/src/game/lore-color.ts +13 -1
  710. package/src/game/mon-cast.ts +31 -6
  711. package/src/game/mon-cmd.ts +95 -30
  712. package/src/game/mon-death.ts +14 -12
  713. package/src/game/mon-group.ts +9 -5
  714. package/src/game/mon-message.ts +363 -65
  715. package/src/game/mon-place.ts +15 -3
  716. package/src/game/mon-ranged.ts +14 -5
  717. package/src/game/mon-side.ts +16 -12
  718. package/src/game/monster-turn.ts +120 -87
  719. package/src/game/notice.ts +85 -0
  720. package/src/game/obj-cmd.ts +126 -37
  721. package/src/game/obj-list.ts +44 -26
  722. package/src/game/object-inspect.ts +13 -0
  723. package/src/game/pickup.ts +29 -5
  724. package/src/game/player-side-vectors.fixtures.ts +215 -0
  725. package/src/game/player-side-vectors.json +6914 -0
  726. package/src/game/player-side-vectors.ts +420 -0
  727. package/src/game/player-side.ts +622 -340
  728. package/src/game/player-turn.ts +228 -31
  729. package/src/game/poly.ts +107 -0
  730. package/src/game/project-cast.ts +63 -6
  731. package/src/game/project-feat-vectors.fixtures.ts +106 -0
  732. package/src/game/project-feat-vectors.json +6554 -0
  733. package/src/game/project-feat-vectors.ts +323 -0
  734. package/src/game/project-feat.ts +417 -248
  735. package/src/game/project-monster.ts +69 -30
  736. package/src/game/project-obj-vectors.json +1 -0
  737. package/src/game/project-obj.ts +115 -47
  738. package/src/game/project-player.ts +8 -0
  739. package/src/game/projection-handlers.ts +110 -0
  740. package/src/game/quest.ts +48 -0
  741. package/src/game/ranged-cmd.ts +45 -11
  742. package/src/game/repeat.ts +92 -0
  743. package/src/game/shape-inspect.ts +166 -0
  744. package/src/game/spell-cmd.ts +39 -6
  745. package/src/game/spoil.ts +92 -39
  746. package/src/game/steal.ts +9 -4
  747. package/src/game/target-loop.ts +14 -7
  748. package/src/game/target.ts +18 -7
  749. package/src/game/ui-entry.ts +172 -22
  750. package/src/game/wizard.ts +97 -10
  751. package/src/game/world.ts +6 -0
  752. package/src/gen/cave.ts +225 -26
  753. package/src/gen/generate.ts +62 -9
  754. package/src/gen/glyph-vectors.fixtures.ts +122 -0
  755. package/src/gen/glyph-vectors.json +5996 -0
  756. package/src/gen/glyph-vectors.ts +280 -0
  757. package/src/gen/glyph.ts +132 -0
  758. package/src/gen/room.ts +446 -265
  759. package/src/gen/util.ts +32 -9
  760. package/src/i18n/i18n.ts +492 -0
  761. package/src/i18n/text.ts +117 -0
  762. package/src/index.ts +307 -254
  763. package/src/mod/extension.ts +136 -0
  764. package/src/mod/ids.ts +92 -21
  765. package/src/mod/record-keys.ts +102 -0
  766. package/src/mod/registry-host.ts +1063 -234
  767. package/src/mon/bind.ts +14 -8
  768. package/src/mon/knowledge-groups.ts +12 -12
  769. package/src/mon/lore-describe.ts +93 -26
  770. package/src/mon/lore-file.ts +365 -0
  771. package/src/mon/lore.ts +9 -3
  772. package/src/mon/make.ts +4 -2
  773. package/src/mon/monster.ts +1 -1
  774. package/src/mon/predicate.ts +14 -9
  775. package/src/mon/project-mon.ts +23 -5
  776. package/src/mon/steal.ts +39 -7
  777. package/src/mon/take-hit.ts +8 -3
  778. package/src/mon/timed.ts +15 -9
  779. package/src/mon/types.ts +11 -4
  780. package/src/msg.ts +55 -1
  781. package/src/obj/artifact-fake.ts +47 -17
  782. package/src/obj/bind.ts +52 -9
  783. package/src/obj/desc-vectors.fixtures.ts +119 -0
  784. package/src/obj/desc-vectors.json +2360 -0
  785. package/src/obj/desc-vectors.ts +128 -0
  786. package/src/obj/desc.ts +159 -55
  787. package/src/obj/effects-info.ts +90 -59
  788. package/src/obj/fake-object.ts +135 -0
  789. package/src/obj/ignore.ts +95 -28
  790. package/src/obj/knowledge.ts +291 -139
  791. package/src/obj/known-object.ts +126 -11
  792. package/src/obj/make.ts +53 -29
  793. package/src/obj/object-info.ts +103 -6
  794. package/src/obj/object.ts +392 -151
  795. package/src/obj/power.ts +297 -59
  796. package/src/obj/randart-build.ts +1875 -1705
  797. package/src/obj/randart-data.ts +1547 -1344
  798. package/src/obj/randart-file.ts +130 -0
  799. package/src/obj/randart-log.ts +78 -0
  800. package/src/obj/randart-registry.ts +247 -0
  801. package/src/obj/randart-vectors.fixtures.ts +61 -0
  802. package/src/obj/randart-vectors.json +836 -0
  803. package/src/obj/randart-vectors.ts +369 -0
  804. package/src/obj/randart.ts +722 -552
  805. package/src/obj/rune-registry.ts +270 -0
  806. package/src/obj/rune-vectors.fixtures.ts +164 -0
  807. package/src/obj/rune-vectors.json +121 -0
  808. package/src/obj/rune-vectors.ts +229 -0
  809. package/src/obj/tval-kind-vectors.json +391 -0
  810. package/src/obj/tval-registry.ts +243 -0
  811. package/src/obj/tval-vectors.fixtures.ts +50 -0
  812. package/src/obj/tval-vectors.json +38 -0
  813. package/src/obj/tval-vectors.ts +126 -0
  814. package/src/obj/types.ts +18 -7
  815. package/src/obj/value.ts +26 -20
  816. package/src/parser.ts +214 -0
  817. package/src/player/bind.ts +5 -2
  818. package/src/player/birth.ts +2 -1
  819. package/src/player/calcs.ts +123 -42
  820. package/src/player/death.ts +78 -0
  821. package/src/player/options-file.ts +387 -0
  822. package/src/player/options.ts +2 -1
  823. package/src/player/player.ts +60 -4
  824. package/src/player/shape-lore.ts +33 -14
  825. package/src/player/timed.ts +14 -4
  826. package/src/player/types.ts +30 -4
  827. package/src/session/boot.ts +51 -1
  828. package/src/session/game.ts +720 -163
  829. package/src/session/save-migrate.ts +81 -1
  830. package/src/session/save.ts +264 -22
  831. package/src/store/bind.ts +4 -3
  832. package/src/store/mass-produce-vectors.fixtures.ts +64 -0
  833. package/src/store/mass-produce-vectors.json +1169 -0
  834. package/src/store/mass-produce-vectors.ts +67 -0
  835. package/src/store/store.ts +266 -63
  836. package/src/store/transact.ts +39 -16
  837. package/src/store/types.ts +3 -2
  838. package/src/version.ts +1 -1
  839. package/src/visuals/index.ts +1 -0
  840. package/src/visuals/map-text.ts +1 -1
  841. package/src/visuals/object-glyph.ts +76 -0
  842. package/src/visuals/prefs.ts +22 -32
  843. package/src/visuals/tile-prefs.ts +32 -0
  844. package/src/world/feature.ts +4 -1
  845. package/src/world/project.ts +19 -4
  846. package/src/world/projection.ts +79 -8
  847. package/src/world/trap.ts +25 -21
  848. package/src/world/view.ts +11 -1
@@ -14,32 +14,44 @@
14
14
  * L1332+) is a separate, later port.
15
15
  *
16
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).
17
+ * - The upstream file_putf(log_file, ...) logging is PORTED (PORT_TODO 5.5),
18
+ * through the randartLog sink in ./randart-log.js. It never affects any
19
+ * returned value, so a run with no log open behaves identically.
19
20
  * - 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.
21
+ * make_fake_artifact (obj-make.c L728) and calls object_power on it. It calls
22
+ * the REAL one: obj/artifact-fake.ts, the same builder the knowledge browser
23
+ * and the spoiler dump use, which is object_prep(kind, 0, MAXIMISE)
24
+ * (obj-make.c L817) followed by copy_artifact_data (obj-make.c L520).
25
+ * This file used to carry its own hand-written copy of that field mapping,
26
+ * flattened into a PowerObject because object_power reads only a few fields.
27
+ * Two hand-written copies of one C function agree until they do not, and the
28
+ * divergence would have been silent and total (artifact_power drives the
29
+ * whole design loop). It also cost the object_desc log line, which needs the
30
+ * whole object. Both are gone: one builder, one field mapping.
26
31
  * - 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.
32
+ * RANDOMISE roll upstream, and that roll DRAWS. The timeout never enters
33
+ * object_power, so this file used to skip it and say no RNG was consumed;
34
+ * that was measured on the standard artifact set (one curse in the whole
35
+ * file) and was wrong during generation, where design_artifact re-powers an
36
+ * artifact make_bad has just cursed. The rolls are made, in upstream's order,
37
+ * by copyArtifactData itself now that the real builder does the work.
31
38
  * - Upstream mean()/variance() (z-util.c L1389/L1516) are exact-rational
32
39
  * multi-precision routines; store_base_power calls them with a non-NULL frac,
33
40
  * which is the "round the result down" path. Both are now ported for real in
34
41
  * ../rational (saturation and all) and called through meanFloored /
35
42
  * varianceFloored below, rather than reimplemented here.
36
43
  */
44
+ import { randartLog, randartLogf } from "./randart-log.js";
45
+ import { randartRegistry, seedRandart } from "./randart-registry.js";
37
46
  import { ELEM, KF, OBJ_MOD, OF, TV } from "../generated/index.js";
38
47
  import { ART_IDX } from "../generated/randart-properties.js";
39
- import { copyBrands, copySlays, tvalCanHaveCharges, tvalIsEdible, tvalIsFuel, tvalIsLauncher, tvalIsPotion, } from "./object.js";
48
+ import { tvalFindName } from "./bind.js";
49
+ import { makeFakeArtifact } from "./artifact-fake.js";
50
+ import { ODESC, objectDesc } from "./desc.js";
51
+ import { makeRuneEnv } from "./knowledge.js";
40
52
  import { mean, variance } from "../rational.js";
41
53
  import { objectPower } from "./power.js";
42
- import { ELEM_MAX, newOfFlags, OBJ_MOD_MAX, TV_MAX } from "./types.js";
54
+ import { TV_MAX } from "./types.js";
43
55
  /** ART_IDX_TOTAL: number of learned-probability slots (obj-randart.h). */
44
56
  const ART_IDX_TOTAL = ART_IDX.TOTAL;
45
57
  /* ------------------------------------------------------------------ */
@@ -125,10 +137,6 @@ const artIdxArmor = [
125
137
  function rvMinimise(v) {
126
138
  return v.base + v.dice;
127
139
  }
128
- /** randcalc(v, 0, MAXIMISE): base + dice*sides + mBonus. */
129
- function rvMaximise(v) {
130
- return v.base + v.dice * v.sides + v.mBonus;
131
- }
132
140
  /** Number of set entries in a 1-based boolean slay/brand array, or 0. */
133
141
  function countTrue(arr) {
134
142
  if (!arr)
@@ -162,122 +170,72 @@ function varianceFloored(nums) {
162
170
  /* ------------------------------------------------------------------ */
163
171
  /* artifact_power (obj-randart.c L186) */
164
172
  /* ------------------------------------------------------------------ */
165
- /**
166
- * Build the "fake" object object_power evaluates for an artifact, reproducing
167
- * make_fake_artifact (obj-make.c L728) = object_prep(kind, 0, MAXIMISE)
168
- * followed by copy_artifact_data (obj-make.c L520). Returns null when the
169
- * artifact has no tval or no base kind (make_fake_artifact would return false).
170
- */
171
- function makeFakeArtifactPower(reg, art) {
172
- if (!art.tval)
173
- return null;
174
- const kind = reg.lookupKind(art.tval, art.sval);
175
- if (!kind)
176
- return null;
177
- /* Flags: object_prep copies base then kind flags (the second copy
178
- * overwrites the first, upstream quirk kept in objectPrep), then
179
- * copy_artifact_data clears the light-fuel flags and unions art flags. */
180
- const flags = newOfFlags();
181
- flags.copy(kind.base.flags);
182
- flags.copy(kind.flags);
183
- flags.off(OF.TAKES_FUEL);
184
- flags.off(OF.BURNS_OUT);
185
- flags.union(art.flags);
186
- /* Modifiers: object_prep fills from the kind (MAXIMISE), then
187
- * copy_artifact_data overwrites every entry with the artifact's. */
188
- const modifiers = new Array(OBJ_MOD_MAX).fill(0);
189
- for (let i = 0; i < OBJ_MOD_MAX; i++) {
190
- modifiers[i] = art.modifiers[i] ?? 0;
191
- }
192
- /* pval: object_prep assigns charges then food/oil/launcher pval; the
193
- * artifact copy does not touch pval. */
194
- let pval = 0;
195
- if (tvalCanHaveCharges(art.tval)) {
196
- pval = rvMaximise(kind.charge);
197
- }
198
- if (tvalIsEdible(art.tval) ||
199
- tvalIsPotion(art.tval) ||
200
- tvalIsFuel(art.tval) ||
201
- tvalIsLauncher(art.tval)) {
202
- pval = rvMaximise(kind.pval);
203
- }
204
- /* Slays/brands: object_prep copies the kind's, copy_artifact_data unions
205
- * the artifact's on top. */
206
- let slays = copySlays(null, kind.slays, reg.slays);
207
- slays = copySlays(slays, art.slays, reg.slays);
208
- let brands = copyBrands(null, kind.brands, reg.brands);
209
- brands = copyBrands(brands, art.brands, reg.brands);
210
- /* Element info: object_prep sets res_level and flags from kind (+ base
211
- * flags); copy_artifact_data overrides res_level with any non-zero
212
- * artifact level and unions the artifact ignore flags. */
213
- const elInfo = [];
214
- for (let i = 0; i < ELEM_MAX; i++) {
215
- const ke = kind.elInfo[i];
216
- const be = kind.base.elInfo[i];
217
- const ae = art.elInfo[i];
218
- let resLevel = ke.resLevel;
219
- let elFlags = ke.flags | be.flags;
220
- if (ae.resLevel !== 0)
221
- resLevel = ae.resLevel;
222
- elFlags |= ae.flags;
223
- elInfo.push({ resLevel, flags: elFlags });
224
- }
225
- /* Curses: copy_curses copies the kind's then the artifact's powers.
226
- * Timeouts (a RANDOMISE roll upstream) never affect power, so they are
227
- * left at 0 and no RNG is consumed. */
228
- let curses = null;
229
- if (kind.curses || art.curses) {
230
- curses = [];
231
- for (let i = 0; i < reg.curses.length; i++) {
232
- curses.push({ power: 0, timeout: 0 });
233
- }
234
- if (kind.curses) {
235
- for (let i = 0; i < reg.curses.length; i++) {
236
- const power = kind.curses[i] ?? 0;
237
- if (power)
238
- curses[i].power = power;
239
- }
240
- }
241
- if (art.curses) {
242
- for (let i = 0; i < reg.curses.length; i++) {
243
- const power = art.curses[i] ?? 0;
244
- if (power)
245
- curses[i].power = power;
246
- }
247
- }
248
- }
249
- /* Activation comes from the artifact or, failing that, the kind. */
250
- const act = art.activation ?? kind.activation;
251
- const activation = act ? { power: act.power } : null;
252
- return {
253
- tval: art.tval,
254
- toH: art.toH,
255
- toD: art.toD,
256
- toA: art.toA,
257
- ac: art.ac,
258
- dd: art.dd,
259
- ds: art.ds,
260
- weight: art.weight,
261
- pval,
262
- modifiers,
263
- brands,
264
- slays,
265
- flags,
266
- elInfo,
267
- curses,
268
- activation,
269
- kind: { power: kind.power, kindFlags: kind.kindFlags },
270
- ego: null,
271
- };
272
- }
273
173
  /**
274
174
  * artifact_power (obj-randart.c L186): the artifact's power, by generating a
275
175
  * fake object from the artifact and calling the common object_power.
276
176
  */
277
- export function artifactPower(reg, art) {
278
- const obj = makeFakeArtifactPower(reg, art);
177
+ export function artifactPower(reg,
178
+ /**
179
+ * object_prep's z_info / player constants, reached upstream as globals. Only
180
+ * the real make_fake_artifact needs them, which is why this argument appears
181
+ * here at all: the flattened builder that used to live in this file could
182
+ * skip object_prep, and skipping object_prep is what let the two copies of
183
+ * one C function drift.
184
+ */
185
+ constants, art,
186
+ /**
187
+ * artifact_power's `reason` (obj-randart.c:186), which exists only to head
188
+ * the log block. REQUIRED rather than optional: upstream writes it out at
189
+ * every one of its four call sites, and a default here would silently label
190
+ * one evaluation as another in the log the argument exists to produce.
191
+ */
192
+ reason,
193
+ /**
194
+ * make_fake_artifact's copy_curses rolls a timeout per cursed slot and those
195
+ * rolls DRAW. Required, because a default would hand back a private Rng and
196
+ * silently restore the divergence this argument exists to close.
197
+ */
198
+ rng) {
199
+ randartLogf(() => `********** Evaluating ${reason} ********\n`);
200
+ randartLogf(() => `Artifact index is ${art.aidx}\n`);
201
+ const obj = makeFakeArtifact(reg, constants, art, rng);
279
202
  if (!obj)
280
203
  return 0;
204
+ /*
205
+ * object_desc of the fake artifact (obj-randart.c L205-L206), with
206
+ * ODESC_PREFIX | ODESC_FULL | ODESC_SPOIL and a NULL player - upstream's own
207
+ * argument, and the reason this needs no knowledge state. A null player is
208
+ * an omniscient observer: objectDesc uses the object as its own known shadow
209
+ * and every gate opens, so the RuneEnv below is never asked a knowledge
210
+ * question. It supplies the registries and nothing else, and slot_object is
211
+ * null for every slot because there is no player to have equipment.
212
+ *
213
+ * The KnownDesc is equally thin, and deliberately says the honest thing
214
+ * rather than the convenient one: isAware/isTried are FALSE, exactly as
215
+ * upstream's kind->aware at this point in birth. It does not matter -- SPOIL
216
+ * forces `aware` true a line later, and obj_desc_get_basename returns
217
+ * kind->name for an artifact regardless -- but a KnownDesc that lied here
218
+ * would be a claim about the player, and this code has no player.
219
+ *
220
+ * Its format string is "%s\n", which has no literal span for the census in
221
+ * randart-log.census.test.ts to match, so this line was carried there as
222
+ * UNWRITTEN_SPANLESS = 1 for as long as it went unwritten. That count is now
223
+ * zero, which is the only reason the reassuring EXPECTED_MISSING_RANDART = 0
224
+ * can be read as "nothing left".
225
+ */
226
+ randartLogf(() => {
227
+ const env = makeRuneEnv(() => null, (v) => rng.randcalcVaries(v), {
228
+ brands: reg.brands,
229
+ slays: reg.slays,
230
+ curses: reg.curses,
231
+ properties: reg.properties,
232
+ elementNames: (reg.projections ?? []).map((p) => p.name),
233
+ });
234
+ const deps = { isAware: () => false, isTried: () => false };
235
+ const name = objectDesc(obj, ODESC.PREFIX | ODESC.FULL | ODESC.SPOIL, null, env, deps);
236
+ return `${name}
237
+ `;
238
+ });
281
239
  return objectPower(reg, obj);
282
240
  }
283
241
  /* ------------------------------------------------------------------ */
@@ -288,8 +246,8 @@ export function artifactPower(reg, art) {
288
246
  * ratings as a baseline, and capture the per-set and per-tval power statistics
289
247
  * and base-item info.
290
248
  */
291
- export function storeBasePower(reg, data) {
292
- const aMax = reg.artifacts.length;
249
+ export function storeBasePower(reg, constants, arts, data, rng) {
250
+ const aMax = arts.length;
293
251
  data.maxPower = 0;
294
252
  data.minPower = INHIBIT_POWER + 1;
295
253
  data.varPower = 0;
@@ -301,8 +259,10 @@ export function storeBasePower(reg, data) {
301
259
  data.maxTvPower[i] = 0;
302
260
  }
303
261
  for (let i = 0; i < aMax; i++) {
304
- const art = reg.artifacts[i] ?? null;
305
- const power = art ? artifactPower(reg, art) : 0;
262
+ const art = arts[i] ?? null;
263
+ const power = art
264
+ ? artifactPower(reg, constants, art, "for original power", rng)
265
+ : 0;
306
266
  data.basePower[i] = power;
307
267
  /* Capture power stats, ignoring cursed and uber arts. */
308
268
  if (power > data.maxPower && power < INHIBIT_POWER) {
@@ -341,48 +301,70 @@ export function storeBasePower(reg, data) {
341
301
  data.avgTvPower[i] = meanFloored(fakeTvPower[i]);
342
302
  }
343
303
  }
304
+ randartLogf(() => `Max power is ${String(data.maxPower)}, min is ${String(data.minPower)}\n`);
305
+ randartLogf(() => `Mean is ${String(data.avgPower)}, variance is ${String(data.varPower)}\n`);
306
+ for (let i = 0; i < TV_MAX; i++) {
307
+ if (data.avgTvPower[i]) {
308
+ randartLogf(() => `Power for tval ${tvalFindName(i)}: min ${String(data.minTvPower[i])}, max ${String(data.maxTvPower[i])}, avg ${String(data.avgTvPower[i])}\n`);
309
+ }
310
+ }
344
311
  /* Store the number of different types, for use later. */
345
312
  for (let i = 0; i < aMax; i++) {
346
- const art = reg.artifacts[i] ?? null;
313
+ const art = arts[i] ?? null;
347
314
  const tval = art ? art.tval : TV.NULL;
348
- switch (tval) {
349
- case TV.SWORD:
350
- case TV.POLEARM:
351
- case TV.HAFTED:
352
- data.meleeTotal++;
353
- break;
354
- case TV.BOW:
355
- data.bowTotal++;
356
- break;
357
- case TV.SOFT_ARMOR:
358
- case TV.HARD_ARMOR:
359
- case TV.DRAG_ARMOR:
360
- data.armorTotal++;
361
- break;
362
- case TV.SHIELD:
363
- data.shieldTotal++;
364
- break;
365
- case TV.CLOAK:
366
- data.cloakTotal++;
367
- break;
368
- case TV.HELM:
369
- case TV.CROWN:
370
- data.headgearTotal++;
371
- break;
372
- case TV.GLOVES:
373
- data.gloveTotal++;
374
- break;
375
- case TV.BOOTS:
376
- data.bootTotal++;
377
- break;
378
- case TV.NULL:
379
- break;
380
- default:
381
- data.otherTotal++;
382
- }
315
+ /* The upstream switch on tval is now the randart registry's `census`
316
+ * table. This is not bookkeeping: the totals feed the frequency table the
317
+ * design loop SPENDS, so a mod's item class landing in `otherTotal` skews
318
+ * what every randart in the game becomes. An unregistered tval counts
319
+ * toward `otherTotal`, which is upstream's own default arm. */
320
+ const bucket = randartRegistry().census.handlerFor(tval);
321
+ if (bucket)
322
+ bucket(data);
323
+ else
324
+ data.otherTotal++;
383
325
  data.total++;
384
326
  }
385
327
  }
328
+ /* ------------------------------------------------------------------ *
329
+ * Core's item-class census buckets, lifted case by case.
330
+ * ------------------------------------------------------------------ */
331
+ seedRandart((registry) => {
332
+ const bucket = (tvals, count) => {
333
+ for (const tval of tvals)
334
+ registry.census.set(tval, count);
335
+ };
336
+ bucket([TV.SWORD, TV.POLEARM, TV.HAFTED], (d) => {
337
+ d.meleeTotal++;
338
+ });
339
+ bucket([TV.BOW], (d) => {
340
+ d.bowTotal++;
341
+ });
342
+ bucket([TV.SOFT_ARMOR, TV.HARD_ARMOR, TV.DRAG_ARMOR], (d) => {
343
+ d.armorTotal++;
344
+ });
345
+ bucket([TV.SHIELD], (d) => {
346
+ d.shieldTotal++;
347
+ });
348
+ bucket([TV.CLOAK], (d) => {
349
+ d.cloakTotal++;
350
+ });
351
+ bucket([TV.HELM, TV.CROWN], (d) => {
352
+ d.headgearTotal++;
353
+ });
354
+ bucket([TV.GLOVES], (d) => {
355
+ d.gloveTotal++;
356
+ });
357
+ bucket([TV.BOOTS], (d) => {
358
+ d.bootTotal++;
359
+ });
360
+ /* An EMPTY artifact slot, registered explicitly rather than left to the
361
+ * default: upstream distinguishes "no artifact here" (counts toward nothing)
362
+ * from "an item class I have no bucket for" (counts toward otherTotal), and
363
+ * the default arm can only express the second. */
364
+ bucket([TV.NULL], () => {
365
+ /* deliberately nothing */
366
+ });
367
+ });
386
368
  /* ------------------------------------------------------------------ */
387
369
  /* Ability counters (obj-randart.c L342-L1053) */
388
370
  /* ------------------------------------------------------------------ */
@@ -398,60 +380,89 @@ export function countWeaponAbilities(reg, art, data) {
398
380
  const minToA = rvMinimise(kind.toA);
399
381
  /* To-hit and to-dam. */
400
382
  let bonus = Math.trunc((art.toH - minToH - data.hitStartval) / data.hitIncrement);
383
+ if (bonus > 0) {
384
+ randartLogf(() => `Adding ${bonus} instances of extra to-hit bonus for weapon\n`);
385
+ }
386
+ else if (bonus < 0) {
387
+ randartLogf(() => `Subtracting ${bonus} instances of extra to-hit bonus for weapon\n`);
388
+ }
401
389
  data.artProbs[ART_IDX.WEAPON_HIT] += bonus;
402
390
  bonus = Math.trunc((art.toD - minToD - data.damStartval) / data.damIncrement);
391
+ /* Asymmetric with to-hit ON PURPOSE: the to-dam arm has no `< 0` test, so a
392
+ * bonus of exactly 0 logs "Subtracting 0" (obj-randart.c L359-363). */
393
+ if (bonus > 0) {
394
+ randartLogf(() => `Adding ${bonus} instances of extra to-dam bonus for weapon\n`);
395
+ }
396
+ else {
397
+ randartLogf(() => `Subtracting ${bonus} instances of extra to-dam bonus for weapon\n`);
398
+ }
403
399
  data.artProbs[ART_IDX.WEAPON_DAM] += bonus;
404
400
  /* Does this weapon have an unusual bonus to AC? */
405
401
  bonus = Math.trunc((art.toA - minToA) / data.acIncrement);
406
402
  if (art.toA > 20) {
403
+ randartLogf(() => `Adding ${bonus} for supercharged AC\n`);
407
404
  data.artProbs[ART_IDX.MELEE_AC_SUPER]++;
408
405
  }
409
406
  else if (bonus > 0) {
407
+ randartLogf(() => `Adding ${bonus} instances of extra AC bonus for weapon\n`);
410
408
  data.artProbs[ART_IDX.MELEE_AC] += bonus;
411
409
  }
412
410
  /* Check damage dice - are they more than normal? */
413
411
  if (art.dd > kind.dd) {
414
412
  if (art.dd - kind.dd > 2) {
413
+ randartLog(`Adding 1 for super-charged damage dice!\n`);
415
414
  data.artProbs[ART_IDX.MELEE_DICE_SUPER]++;
416
415
  }
417
416
  else {
417
+ randartLog(`Adding 1 for extra damage dice.\n`);
418
418
  data.artProbs[ART_IDX.MELEE_DICE]++;
419
419
  }
420
420
  }
421
421
  /* Check weight - is it different from normal? */
422
422
  if (art.weight !== kind.weight) {
423
+ randartLog(`Adding 1 for unusual weight.\n`);
423
424
  data.artProbs[ART_IDX.MELEE_WEIGHT]++;
424
425
  }
425
426
  /* Do we have 3 or more extra blows? */
426
427
  const blows = art.modifiers[OBJ_MOD.BLOWS] ?? 0;
427
428
  if (blows > 2) {
429
+ randartLog(`Adding 1 for supercharged blows (3 or more!)\n`);
428
430
  data.artProbs[ART_IDX.MELEE_BLOWS_SUPER]++;
429
431
  }
430
432
  else if (blows > 0) {
433
+ randartLog(`Adding 1 for extra blows\n`);
431
434
  data.artProbs[ART_IDX.MELEE_BLOWS]++;
432
435
  }
433
436
  /* Aggravation. */
434
437
  if (art.flags.has(OF.AGGRAVATE)) {
438
+ randartLog(`Adding 1 for aggravation - weapon\n`);
435
439
  data.artProbs[ART_IDX.WEAPON_AGGR]++;
436
440
  }
437
441
  /* Blessed weapon? */
438
442
  if (art.flags.has(OF.BLESSED)) {
443
+ randartLog(`Adding 1 for blessed weapon\n`);
439
444
  data.artProbs[ART_IDX.MELEE_BLESS]++;
440
445
  }
441
446
  /* See invisible? */
442
447
  if (art.flags.has(OF.SEE_INVIS)) {
448
+ randartLog(`Adding 1 for see invisible (weapon case)\n`);
443
449
  data.artProbs[ART_IDX.MELEE_SINV]++;
444
450
  }
445
451
  /* Tunnelling ability. */
446
452
  if ((art.modifiers[OBJ_MOD.TUNNEL] ?? 0) > 0) {
453
+ randartLog(`Adding 1 for tunnelling bonus.\n`);
447
454
  data.artProbs[ART_IDX.MELEE_TUNN]++;
448
455
  }
449
456
  /* Count brands and slays. */
450
457
  if (art.slays) {
451
- data.artProbs[ART_IDX.MELEE_SLAY] += countTrue(art.slays);
458
+ const n = countTrue(art.slays);
459
+ data.artProbs[ART_IDX.MELEE_SLAY] += n;
460
+ randartLogf(() => `Adding ${n} for slays\n`);
452
461
  }
453
462
  if (art.brands) {
454
- data.artProbs[ART_IDX.MELEE_BRAND] += countTrue(art.brands);
463
+ const n = countTrue(art.brands);
464
+ data.artProbs[ART_IDX.MELEE_BRAND] += n;
465
+ randartLogf(() => `Adding ${n} for brands\n`);
455
466
  }
456
467
  }
457
468
  /**
@@ -466,41 +477,66 @@ export function countBowAbilities(reg, art, data) {
466
477
  const minToA = rvMinimise(kind.toA);
467
478
  /* To-hit. */
468
479
  let bonus = Math.trunc((art.toH - minToH - data.hitStartval) / data.hitIncrement);
480
+ if (bonus > 0) {
481
+ randartLogf(() => `Adding ${bonus} instances of extra to-hit bonus for weapon\n`);
482
+ }
483
+ else if (bonus < 0) {
484
+ randartLogf(() => `Subtracting ${bonus} instances of extra to-hit bonus for weapon\n`);
485
+ }
469
486
  data.artProbs[ART_IDX.WEAPON_HIT] += bonus;
470
487
  /* To-dam. */
471
488
  bonus = Math.trunc((art.toD - minToD - data.damStartval) / data.damIncrement);
489
+ /* Plain `else`, as in count_weapon_abilities: the to-dam arm has no `< 0`
490
+ * test either here (obj-randart.c L461-466), so a bonus of exactly 0 logs
491
+ * "Subtracting 0". The to-hit arm above DOES have one. */
492
+ if (bonus > 0) {
493
+ randartLogf(() => `Adding ${bonus} instances of extra to-dam bonus for weapon\n`);
494
+ }
495
+ else {
496
+ randartLogf(() => `Subtracting ${bonus} instances of extra to-dam bonus for weapon\n`);
497
+ }
472
498
  data.artProbs[ART_IDX.WEAPON_DAM] += bonus;
473
499
  /* Armor class. */
474
500
  bonus = Math.trunc((art.toA - minToA - data.acStartval) / data.acIncrement);
475
501
  if (bonus > 0) {
502
+ randartLogf(() => `Adding ${bonus} for AC bonus - general\n`);
476
503
  data.artProbs[ART_IDX.GEN_AC] += bonus;
477
504
  }
478
505
  /* Aggravation. */
479
506
  if (art.flags.has(OF.AGGRAVATE)) {
507
+ randartLog(`Adding 1 for aggravation - weapon\n`);
480
508
  data.artProbs[ART_IDX.WEAPON_AGGR]++;
481
509
  }
482
510
  /* Do we have more than 1 extra shot? */
483
511
  const shots = art.modifiers[OBJ_MOD.SHOTS] ?? 0;
484
512
  if (shots > 10) {
513
+ randartLog(`Adding 1 for supercharged shots (more than 1!)\n`);
485
514
  data.artProbs[ART_IDX.BOW_SHOTS_SUPER]++;
486
515
  }
487
516
  else if (shots > 0) {
517
+ randartLog(`Adding 1 for extra shots\n`);
488
518
  data.artProbs[ART_IDX.BOW_SHOTS]++;
489
519
  }
490
520
  /* Do we have 3 or more extra might? */
491
521
  const might = art.modifiers[OBJ_MOD.MIGHT] ?? 0;
492
522
  if (might > 2) {
523
+ randartLog(`Adding 1 for supercharged might (3 or more!)\n`);
493
524
  data.artProbs[ART_IDX.BOW_MIGHT_SUPER]++;
494
525
  }
495
526
  else if (might > 0) {
527
+ randartLog(`Adding 1 for extra might\n`);
496
528
  data.artProbs[ART_IDX.BOW_MIGHT]++;
497
529
  }
498
530
  /* Count brands and slays. */
499
531
  if (art.slays) {
500
- data.artProbs[ART_IDX.BOW_SLAY] += countTrue(art.slays);
532
+ const n = countTrue(art.slays);
533
+ data.artProbs[ART_IDX.BOW_SLAY] += n;
534
+ randartLogf(() => `Adding ${n} for slays\n`);
501
535
  }
502
536
  if (art.brands) {
503
- data.artProbs[ART_IDX.BOW_BRAND] += countTrue(art.brands);
537
+ const n = countTrue(art.brands);
538
+ data.artProbs[ART_IDX.BOW_BRAND] += n;
539
+ randartLogf(() => `Adding ${n} for brands\n`);
504
540
  }
505
541
  }
506
542
  /**
@@ -518,29 +554,37 @@ export function countNonweaponAbilities(reg, art, data) {
518
554
  /* Armor class. */
519
555
  if (bonus > 0) {
520
556
  if (art.toA > 20) {
557
+ randartLogf(() => `Adding ${bonus} for supercharged AC\n`);
521
558
  data.artProbs[ART_IDX.GEN_AC_SUPER]++;
522
559
  }
523
560
  else if (art.tval === TV.BOOTS) {
561
+ randartLogf(() => `Adding ${bonus} for AC bonus - boots\n`);
524
562
  data.artProbs[ART_IDX.BOOT_AC] += bonus;
525
563
  }
526
564
  else if (art.tval === TV.GLOVES) {
565
+ randartLogf(() => `Adding ${bonus} for AC bonus - gloves\n`);
527
566
  data.artProbs[ART_IDX.GLOVE_AC] += bonus;
528
567
  }
529
568
  else if (art.tval === TV.HELM || art.tval === TV.CROWN) {
569
+ randartLogf(() => `Adding ${bonus} for AC bonus - hat\n`);
530
570
  data.artProbs[ART_IDX.HELM_AC] += bonus;
531
571
  }
532
572
  else if (art.tval === TV.SHIELD) {
573
+ randartLogf(() => `Adding ${bonus} for AC bonus - shield\n`);
533
574
  data.artProbs[ART_IDX.SHIELD_AC] += bonus;
534
575
  }
535
576
  else if (art.tval === TV.CLOAK) {
577
+ randartLogf(() => `Adding ${bonus} for AC bonus - cloak\n`);
536
578
  data.artProbs[ART_IDX.CLOAK_AC] += bonus;
537
579
  }
538
580
  else if (art.tval === TV.SOFT_ARMOR ||
539
581
  art.tval === TV.HARD_ARMOR ||
540
582
  art.tval === TV.DRAG_ARMOR) {
583
+ randartLogf(() => `Adding ${bonus} for AC bonus - body armor\n`);
541
584
  data.artProbs[ART_IDX.ARMOR_AC] += bonus;
542
585
  }
543
586
  else {
587
+ randartLogf(() => `Adding ${bonus} for AC bonus - general\n`);
544
588
  data.artProbs[ART_IDX.GEN_AC] += bonus;
545
589
  }
546
590
  }
@@ -549,9 +593,11 @@ export function countNonweaponAbilities(reg, art, data) {
549
593
  bonus = Math.trunc((toHit + toDam) / (data.hitIncrement + data.damIncrement));
550
594
  if (bonus > 0) {
551
595
  if (art.tval === TV.GLOVES) {
596
+ randartLogf(() => `Adding ${bonus} instances of extra to-hit and to-dam bonus for gloves\n`);
552
597
  data.artProbs[ART_IDX.GLOVE_HIT_DAM] += bonus;
553
598
  }
554
599
  else {
600
+ randartLogf(() => `Adding ${bonus} instances of extra to-hit and to-dam bonus for non-weapon\n`);
555
601
  data.artProbs[ART_IDX.NONWEAPON_HIT_DAM] += bonus;
556
602
  }
557
603
  }
@@ -559,40 +605,51 @@ export function countNonweaponAbilities(reg, art, data) {
559
605
  else if (toHit > 0) {
560
606
  bonus = Math.trunc(toHit / data.hitIncrement);
561
607
  if (bonus > 0) {
608
+ randartLogf(() => `Adding ${bonus} instances of extra to-hit bonus for non-weapon\n`);
562
609
  data.artProbs[ART_IDX.NONWEAPON_HIT] += bonus;
563
610
  }
564
611
  }
565
612
  else if (toDam > 0) {
566
613
  bonus = Math.trunc(toDam / data.damIncrement);
567
614
  if (bonus > 0) {
615
+ randartLogf(() => `Adding ${bonus} instances of extra to-dam bonus for non-weapon\n`);
568
616
  data.artProbs[ART_IDX.NONWEAPON_DAM] += bonus;
569
617
  }
570
618
  }
571
619
  /* Check weight - is it different from normal? */
572
620
  if (art.weight !== kind.weight) {
621
+ randartLog(`Adding 1 for unusual weight.\n`);
573
622
  data.artProbs[ART_IDX.ALLARMOR_WEIGHT]++;
574
623
  }
575
624
  /* Aggravation. */
576
625
  if (art.flags.has(OF.AGGRAVATE)) {
626
+ randartLog(`Adding 1 for aggravation - nonweapon\n`);
577
627
  data.artProbs[ART_IDX.NONWEAPON_AGGR]++;
578
628
  }
579
629
  /* Count brands and slays. */
580
630
  if (art.slays) {
581
- data.artProbs[ART_IDX.NONWEAPON_SLAY] += countTrue(art.slays);
631
+ const n = countTrue(art.slays);
632
+ data.artProbs[ART_IDX.NONWEAPON_SLAY] += n;
633
+ randartLogf(() => `Adding ${n} for slays\n`);
582
634
  }
583
635
  if (art.brands) {
584
- data.artProbs[ART_IDX.NONWEAPON_BRAND] += countTrue(art.brands);
636
+ const n = countTrue(art.brands);
637
+ data.artProbs[ART_IDX.NONWEAPON_BRAND] += n;
638
+ randartLogf(() => `Adding ${n} for brands\n`);
585
639
  }
586
640
  /* Blows. */
587
641
  if ((art.modifiers[OBJ_MOD.BLOWS] ?? 0) > 0) {
642
+ randartLog(`Adding 1 for extra blows on nonweapon\n`);
588
643
  data.artProbs[ART_IDX.NONWEAPON_BLOWS]++;
589
644
  }
590
645
  /* Shots. */
591
646
  if ((art.modifiers[OBJ_MOD.SHOTS] ?? 0) > 0) {
647
+ randartLog(`Adding 1 for extra shots on nonweapon\n`);
592
648
  data.artProbs[ART_IDX.NONWEAPON_SHOTS]++;
593
649
  }
594
650
  /* Tunnelling ability. */
595
651
  if ((art.modifiers[OBJ_MOD.TUNNEL] ?? 0) > 0) {
652
+ randartLog(`Adding 1 for tunnelling bonus - general.\n`);
596
653
  data.artProbs[ART_IDX.GEN_TUNN]++;
597
654
  }
598
655
  }
@@ -617,10 +674,12 @@ export function countModifiers(art, data) {
617
674
  ((art.modifiers[OBJ_MOD.WIS] ?? 0) > 0 ||
618
675
  (art.modifiers[OBJ_MOD.INT] ?? 0) > 0)) {
619
676
  if ((art.modifiers[OBJ_MOD.WIS] ?? 0) > 0) {
677
+ randartLog("Adding 1 for WIS bonus on headgear.\n");
620
678
  data.artProbs[ART_IDX.HELM_WIS]++;
621
679
  num--;
622
680
  }
623
681
  if ((art.modifiers[OBJ_MOD.INT] ?? 0) > 0) {
682
+ randartLog("Adding 1 for INT bonus on headgear.\n");
624
683
  data.artProbs[ART_IDX.HELM_INT]++;
625
684
  num--;
626
685
  }
@@ -629,52 +688,64 @@ export function countModifiers(art, data) {
629
688
  art.tval === TV.HARD_ARMOR ||
630
689
  art.tval === TV.DRAG_ARMOR) &&
631
690
  (art.modifiers[OBJ_MOD.CON] ?? 0) > 0) {
691
+ randartLog("Adding 1 for CON bonus on body armor.\n");
632
692
  data.artProbs[ART_IDX.ARMOR_CON]++;
633
693
  num--;
634
694
  }
635
695
  else if (art.tval === TV.GLOVES && (art.modifiers[OBJ_MOD.DEX] ?? 0) > 0) {
696
+ randartLog("Adding 1 for DEX bonus on gloves.\n");
636
697
  data.artProbs[ART_IDX.GLOVE_DEX]++;
637
698
  num--;
638
699
  }
639
700
  /* Now the general case. */
640
701
  if (num > 0) {
702
+ randartLogf(() => `Adding ${num} for stat bonuses - general.\n`);
641
703
  data.artProbs[ART_IDX.GEN_STAT] += num;
642
704
  }
643
705
  /* Handle stealth, including a couple of special cases. */
644
706
  if ((art.modifiers[OBJ_MOD.STEALTH] ?? 0) > 0) {
645
707
  if (art.tval === TV.BOOTS) {
708
+ randartLog("Adding 1 for stealth bonus on boots.\n");
646
709
  data.artProbs[ART_IDX.BOOT_STEALTH]++;
647
710
  }
648
711
  else if (art.tval === TV.CLOAK) {
712
+ randartLog("Adding 1 for stealth bonus on cloak.\n");
649
713
  data.artProbs[ART_IDX.CLOAK_STEALTH]++;
650
714
  }
651
715
  else if (art.tval === TV.SOFT_ARMOR ||
652
716
  art.tval === TV.HARD_ARMOR ||
653
717
  art.tval === TV.DRAG_ARMOR) {
718
+ randartLog("Adding 1 for stealth bonus on armor.\n");
654
719
  data.artProbs[ART_IDX.ARMOR_STEALTH]++;
655
720
  }
656
721
  else {
722
+ randartLog("Adding 1 for stealth bonus - general.\n");
657
723
  data.artProbs[ART_IDX.GEN_STEALTH]++;
658
724
  }
659
725
  }
660
726
  /* Searching bonus - fully generic. */
661
727
  if ((art.modifiers[OBJ_MOD.SEARCH] ?? 0) > 0) {
728
+ randartLog("Adding 1 for search bonus - general.\n");
662
729
  data.artProbs[ART_IDX.GEN_SEARCH]++;
663
730
  }
664
731
  /* Infravision bonus - fully generic. */
665
732
  if ((art.modifiers[OBJ_MOD.INFRA] ?? 0) > 0) {
733
+ randartLog("Adding 1 for infravision bonus - general.\n");
666
734
  data.artProbs[ART_IDX.GEN_INFRA]++;
667
735
  }
668
736
  /* Damage reduction bonus - fully generic. */
669
737
  if ((art.modifiers[OBJ_MOD.DAM_RED] ?? 0) > 0) {
738
+ randartLog("Adding 1 for damage reduction bonus - general.\n");
670
739
  data.artProbs[ART_IDX.GEN_DAM_RED]++;
671
740
  }
672
741
  /* Moves bonus. */
673
742
  if ((art.modifiers[OBJ_MOD.MOVES] ?? 0) > 0) {
674
743
  if (art.tval === TV.BOOTS) {
744
+ randartLog("Adding 1 for moves bonus on boots.\n");
675
745
  data.artProbs[ART_IDX.BOOT_MOVES]++;
676
746
  }
677
747
  else {
748
+ randartLog("Adding 1 for moves bonus - general.\n");
678
749
  data.artProbs[ART_IDX.GEN_MOVES]++;
679
750
  }
680
751
  }
@@ -682,17 +753,21 @@ export function countModifiers(art, data) {
682
753
  const speed = art.modifiers[OBJ_MOD.SPEED] ?? 0;
683
754
  if (speed > 0) {
684
755
  if (speed > 7) {
756
+ randartLog("Adding 1 for supercharged speed bonus!\n");
685
757
  data.artProbs[ART_IDX.GEN_SPEED_SUPER]++;
686
758
  }
687
759
  else if (art.tval === TV.BOOTS) {
760
+ randartLog("Adding 1 for normal speed bonus on boots.\n");
688
761
  data.artProbs[ART_IDX.BOOT_SPEED]++;
689
762
  }
690
763
  else {
764
+ randartLog("Adding 1 for normal speed bonus - general.\n");
691
765
  data.artProbs[ART_IDX.GEN_SPEED]++;
692
766
  }
693
767
  }
694
768
  /* Permanent light. */
695
769
  if ((art.modifiers[OBJ_MOD.LIGHT] ?? 0) > 0) {
770
+ randartLog("Adding 1 for light radius - general.\n");
696
771
  data.artProbs[ART_IDX.GEN_LIGHT]++;
697
772
  }
698
773
  }
@@ -710,6 +785,7 @@ export function countLowResists(art, data) {
710
785
  num++;
711
786
  if (art.elInfo[ELEM.COLD].resLevel === 3)
712
787
  num++;
788
+ randartLogf(() => `Adding ${num} for immunities.\n`);
713
789
  data.artProbs[ART_IDX.GEN_IMMUNE] += num;
714
790
  /* Count up low resists (not the type, just the number). */
715
791
  num = 0;
@@ -723,19 +799,23 @@ export function countLowResists(art, data) {
723
799
  num++;
724
800
  if (num) {
725
801
  if (art.tval === TV.SHIELD) {
802
+ randartLogf(() => `Adding ${num} for low resists on shield.\n`);
726
803
  data.artProbs[ART_IDX.SHIELD_LRES] += num;
727
804
  }
728
805
  else if (art.tval === TV.SOFT_ARMOR ||
729
806
  art.tval === TV.HARD_ARMOR ||
730
807
  art.tval === TV.DRAG_ARMOR) {
731
808
  if (num === 4) {
809
+ randartLog("Adding 1 for ALL LOW RESISTS on body armor.\n");
732
810
  data.artProbs[ART_IDX.ARMOR_ALLRES]++;
733
811
  }
734
812
  else {
813
+ randartLogf(() => `Adding ${num} for low resists on body armor.\n`);
735
814
  data.artProbs[ART_IDX.ARMOR_LRES] += num;
736
815
  }
737
816
  }
738
817
  else {
818
+ randartLogf(() => `Adding ${num} for low resists - general.\n`);
739
819
  data.artProbs[ART_IDX.GEN_LRES] += num;
740
820
  }
741
821
  }
@@ -775,51 +855,66 @@ export function countHighResists(art, data) {
775
855
  num++;
776
856
  if (art.flags.has(OF.PROT_STUN))
777
857
  num++;
858
+ randartLogf(() => `Adding ${num} for high resists on body armor.\n`);
778
859
  data.artProbs[ART_IDX.ARMOR_HRES] += num;
779
860
  }
780
861
  /* Now do the high resists individually. */
781
862
  if (art.elInfo[ELEM.POIS].resLevel === 1) {
863
+ randartLog("Adding 1 for resist poison - general.\n");
782
864
  data.artProbs[ART_IDX.GEN_RPOIS]++;
783
865
  }
784
866
  if (art.flags.has(OF.PROT_FEAR)) {
867
+ randartLog("Adding 1 for resist fear - general.\n");
785
868
  data.artProbs[ART_IDX.GEN_RFEAR]++;
786
869
  }
787
870
  if (art.elInfo[ELEM.LIGHT].resLevel === 1) {
871
+ randartLog("Adding 1 for resist light - general.\n");
788
872
  data.artProbs[ART_IDX.GEN_RLIGHT]++;
789
873
  }
790
874
  if (art.elInfo[ELEM.DARK].resLevel === 1) {
875
+ randartLog("Adding 1 for resist dark - general.\n");
791
876
  data.artProbs[ART_IDX.GEN_RDARK]++;
792
877
  }
793
878
  if (art.flags.has(OF.PROT_BLIND)) {
794
879
  if (art.tval === TV.HELM || art.tval === TV.CROWN) {
880
+ randartLog("Adding 1 for resist blindness - headgear.\n");
795
881
  data.artProbs[ART_IDX.HELM_RBLIND]++;
796
882
  }
797
883
  else {
884
+ randartLog("Adding 1 for resist blindness - general.\n");
798
885
  data.artProbs[ART_IDX.GEN_RBLIND]++;
799
886
  }
800
887
  }
801
888
  if (art.flags.has(OF.PROT_CONF)) {
889
+ randartLog("Adding 1 for resist confusion - general.\n");
802
890
  data.artProbs[ART_IDX.GEN_RCONF]++;
803
891
  }
804
892
  if (art.elInfo[ELEM.SOUND].resLevel === 1) {
893
+ randartLog("Adding 1 for resist sound - general.\n");
805
894
  data.artProbs[ART_IDX.GEN_RSOUND]++;
806
895
  }
807
896
  if (art.elInfo[ELEM.SHARD].resLevel === 1) {
897
+ randartLog("Adding 1 for resist shards - general.\n");
808
898
  data.artProbs[ART_IDX.GEN_RSHARD]++;
809
899
  }
810
900
  if (art.elInfo[ELEM.NEXUS].resLevel === 1) {
901
+ randartLog("Adding 1 for resist nexus - general.\n");
811
902
  data.artProbs[ART_IDX.GEN_RNEXUS]++;
812
903
  }
813
904
  if (art.elInfo[ELEM.NETHER].resLevel === 1) {
905
+ randartLog("Adding 1 for resist nether - general.\n");
814
906
  data.artProbs[ART_IDX.GEN_RNETHER]++;
815
907
  }
816
908
  if (art.elInfo[ELEM.CHAOS].resLevel === 1) {
909
+ randartLog("Adding 1 for resist chaos - general.\n");
817
910
  data.artProbs[ART_IDX.GEN_RCHAOS]++;
818
911
  }
819
912
  if (art.elInfo[ELEM.DISEN].resLevel === 1) {
913
+ randartLog("Adding 1 for resist disenchantment - general.\n");
820
914
  data.artProbs[ART_IDX.GEN_RDISEN]++;
821
915
  }
822
916
  if (art.flags.has(OF.PROT_STUN)) {
917
+ randartLog("Adding 1 for res_stun - general.\n");
823
918
  data.artProbs[ART_IDX.GEN_PSTUN]++;
824
919
  }
825
920
  }
@@ -846,14 +941,17 @@ export function countAbilities(reg, art, data) {
846
941
  num++;
847
942
  if (art.flags.has(OF.SUST_CON))
848
943
  num++;
944
+ randartLogf(() => `Adding ${num} for stat sustains.\n`);
849
945
  data.artProbs[ART_IDX.GEN_SUST] += num;
850
946
  }
851
947
  /* Free action - handle gloves separately. */
852
948
  if (art.flags.has(OF.FREE_ACT)) {
853
949
  if (art.tval === TV.GLOVES) {
950
+ randartLog("Adding 1 for free action on gloves.\n");
854
951
  data.artProbs[ART_IDX.GLOVE_FA]++;
855
952
  }
856
953
  else {
954
+ randartLog("Adding 1 for free action - general.\n");
857
955
  data.artProbs[ART_IDX.GEN_FA]++;
858
956
  }
859
957
  }
@@ -862,18 +960,22 @@ export function countAbilities(reg, art, data) {
862
960
  if (art.tval === TV.SOFT_ARMOR ||
863
961
  art.tval === TV.HARD_ARMOR ||
864
962
  art.tval === TV.DRAG_ARMOR) {
963
+ randartLog("Adding 1 for hold life on armor.\n");
865
964
  data.artProbs[ART_IDX.ARMOR_HLIFE]++;
866
965
  }
867
966
  else {
967
+ randartLog("Adding 1 for hold life - general.\n");
868
968
  data.artProbs[ART_IDX.GEN_HLIFE]++;
869
969
  }
870
970
  }
871
971
  /* Feather fall - handle boots separately. */
872
972
  if (art.flags.has(OF.FEATHER)) {
873
973
  if (art.tval === TV.BOOTS) {
974
+ randartLog("Adding 1 for feather fall on boots.\n");
874
975
  data.artProbs[ART_IDX.BOOT_FEATHER]++;
875
976
  }
876
977
  else {
978
+ randartLog("Adding 1 for feather fall - general.\n");
877
979
  data.artProbs[ART_IDX.GEN_FEATHER]++;
878
980
  }
879
981
  }
@@ -884,9 +986,11 @@ export function countAbilities(reg, art, data) {
884
986
  art.tval === TV.POLEARM ||
885
987
  art.tval === TV.SWORD)) {
886
988
  if (art.tval === TV.HELM || art.tval === TV.CROWN) {
989
+ randartLog("Adding 1 for see invisible - headgear.\n");
887
990
  data.artProbs[ART_IDX.HELM_SINV]++;
888
991
  }
889
992
  else {
993
+ randartLog("Adding 1 for see invisible - general.\n");
890
994
  data.artProbs[ART_IDX.GEN_SINV]++;
891
995
  }
892
996
  }
@@ -894,31 +998,38 @@ export function countAbilities(reg, art, data) {
894
998
  /* ESP - handle helms/crowns separately. */
895
999
  if (art.flags.has(OF.TELEPATHY)) {
896
1000
  if (art.tval === TV.HELM || art.tval === TV.CROWN) {
1001
+ randartLog("Adding 1 for ESP on headgear.\n");
897
1002
  data.artProbs[ART_IDX.HELM_ESP]++;
898
1003
  }
899
1004
  else {
1005
+ randartLog("Adding 1 for ESP - general.\n");
900
1006
  data.artProbs[ART_IDX.GEN_ESP]++;
901
1007
  }
902
1008
  }
903
1009
  /* Slow digestion - generic. */
904
1010
  if (art.flags.has(OF.SLOW_DIGEST)) {
1011
+ randartLog("Adding 1 for slow digestion - general.\n");
905
1012
  data.artProbs[ART_IDX.GEN_SDIG]++;
906
1013
  }
907
1014
  /* Regeneration - generic. */
908
1015
  if (art.flags.has(OF.REGEN)) {
1016
+ randartLog("Adding 1 for regeneration - general.\n");
909
1017
  data.artProbs[ART_IDX.GEN_REGEN]++;
910
1018
  }
911
1019
  /* Trap immunity - handle boots separately. */
912
1020
  if (art.flags.has(OF.TRAP_IMMUNE)) {
913
1021
  if (art.tval === TV.BOOTS) {
1022
+ randartLog("Adding 1 for trap immunity on boots.\n");
914
1023
  data.artProbs[ART_IDX.BOOT_TRAP_IMM]++;
915
1024
  }
916
1025
  else {
1026
+ randartLog("Adding 1 for trap immunity - general.\n");
917
1027
  data.artProbs[ART_IDX.GEN_TRAP_IMM]++;
918
1028
  }
919
1029
  }
920
1030
  /* Activation. */
921
1031
  if (art.activation || kind?.activation) {
1032
+ randartLog("Adding 1 for activation.\n");
922
1033
  data.artProbs[ART_IDX.GEN_ACTIV]++;
923
1034
  }
924
1035
  }
@@ -929,10 +1040,15 @@ export function countAbilities(reg, art, data) {
929
1040
  * collect_artifact_data (obj-randart.c L1059): parse the standard artifacts and
930
1041
  * count up the frequencies of the various abilities.
931
1042
  */
932
- export function collectArtifactCounts(reg, data) {
933
- const aMax = reg.artifacts.length;
1043
+ export function collectArtifactCounts(reg, arts, data) {
1044
+ const aMax = arts.length;
934
1045
  for (let i = 0; i < aMax; i++) {
935
- const art = reg.artifacts[i] ?? null;
1046
+ const art = arts[i] ?? null;
1047
+ /* obj-randart.c:1066-1067 logs the index BEFORE any skip, so a cursed,
1048
+ * tval-0 or absent entry still prints its line. Upstream reads a_info[i]
1049
+ * out of a dense array and never has a null to guard, so the port's own
1050
+ * null check has to come after this to keep the counts aligned. */
1051
+ randartLogf(() => `Current artifact index is ${i}\n`);
936
1052
  if (!art)
937
1053
  continue;
938
1054
  /* Don't parse cursed or null items. */
@@ -947,6 +1063,7 @@ export function collectArtifactCounts(reg, data) {
947
1063
  }
948
1064
  /* Add the base item tval to the tv_probs array. */
949
1065
  data.tvProbs[kind.tval] = (data.tvProbs[kind.tval] ?? 0) + 1;
1066
+ randartLogf(() => `Base item is ${kind.kidx}\n`);
950
1067
  /* Count combat abilities broken up by type. */
951
1068
  if (art.tval === TV.DIGGING ||
952
1069
  art.tval === TV.HAFTED ||
@@ -1048,27 +1165,46 @@ export function adjustFreqs(data) {
1048
1165
  * frequencies of their abilities and base object kinds, building the dynamic
1049
1166
  * generation probabilities.
1050
1167
  */
1051
- export function parseFrequencies(reg, data) {
1168
+ export function parseFrequencies(reg, arts, data) {
1169
+ randartLog("\n****** BEGINNING GENERATION OF FREQUENCIES\n\n");
1052
1170
  /* Zero the frequencies for artifact attributes. */
1053
1171
  for (let i = 0; i < ART_IDX_TOTAL; i++)
1054
1172
  data.artProbs[i] = 0;
1055
- collectArtifactCounts(reg, data);
1173
+ collectArtifactCounts(reg, arts, data);
1056
1174
  /* Big hack, reduce frequencies of sharp weapons. */
1057
1175
  for (let i = 0; i < TV_MAX; i++) {
1058
1176
  if (i === TV.SWORD || i === TV.POLEARM) {
1059
1177
  data.tvProbs[i] = Math.trunc((data.tvProbs[i] * 2) / 3);
1060
1178
  }
1061
1179
  }
1180
+ /* "Print out some of the abilities, to make sure that everything's fine"
1181
+ * (obj-randart.c:1295-1301). Both loops run to their FULL extent, before any
1182
+ * rescaling - the pre- and post-rescale dumps are what make the log usable
1183
+ * for comparing two runs. */
1184
+ for (let i = 0; i < ART_IDX_TOTAL; i++) {
1185
+ randartLogf(() => `Frequency of ability ${i}: ${data.artProbs[i]}\n`);
1186
+ }
1187
+ for (let i = 0; i < TV_MAX; i++) {
1188
+ randartLogf(() => `Frequency of ${tvalFindName(i)}: ${data.tvProbs[i]}\n`);
1189
+ }
1062
1190
  /* Rescale frequencies. */
1063
1191
  rescaleFreqs(data);
1064
1192
  /* Perform any additional rescaling and adjustment. */
1065
1193
  adjustFreqs(data);
1194
+ /* "Log the final frequencies to check that everything's correct" (:1309). */
1195
+ for (let i = 0; i < ART_IDX_TOTAL; i++) {
1196
+ randartLogf(() => `Rescaled frequency of ability ${i}: ${data.artProbs[i]}\n`);
1197
+ }
1066
1198
  /* Build a cumulative frequency table for tvals. */
1067
1199
  for (let i = 0; i < TV_MAX; i++) {
1068
1200
  for (let j = i; j < TV_MAX; j++) {
1069
1201
  data.tvFreq[j] = (data.tvFreq[j] ?? 0) + (data.tvProbs[i] ?? 0);
1070
1202
  }
1071
1203
  }
1204
+ /* "Print out the frequency table, for verification" (:1319). */
1205
+ for (let i = 0; i < TV_MAX; i++) {
1206
+ randartLogf(() => `Cumulative frequency of ${tvalFindName(i)} is: ${data.tvFreq[i]}\n`);
1207
+ }
1072
1208
  }
1073
1209
  /* ------------------------------------------------------------------ */
1074
1210
  /* Generation of a random artifact (header) */
@@ -1136,18 +1272,26 @@ export function artifactSetDataNew(reg) {
1136
1272
  };
1137
1273
  }
1138
1274
  /**
1139
- * Allocate an ArtifactSetData and run the measurement pipeline over the
1140
- * registry's standard artifacts: store_base_power, then parse_frequencies
1141
- * (which runs collect_artifact_data, rescale_freqs and adjust_freqs). Returns
1142
- * the populated data. `rng` is threaded through for parity with upstream
1143
- * do_randart (store_base_power's fake-object build consumes no RNG for the
1144
- * standard, curse-free artifact set).
1275
+ * Allocate an ArtifactSetData and run the measurement pipeline over `arts`:
1276
+ * store_base_power, then parse_frequencies (which runs collect_artifact_data,
1277
+ * rescale_freqs and adjust_freqs). Returns the populated data. `rng` is drawn
1278
+ * from, not merely threaded: store_base_power powers every artifact, and
1279
+ * make_fake_artifact rolls a timeout per cursed slot (see
1280
+ * makeFakeArtifactPower). Over the standard set that is a handful of draws;
1281
+ * over a generated set it is one per curse the design loop added.
1282
+ *
1283
+ * WHICH SET is a parameter because do_randart measures TWICE (obj-randart.c
1284
+ * L3175-L3186): once over the standard artifacts, and once more over the
1285
+ * finished ones. Upstream can leave it implicit because create_artifact_set
1286
+ * overwrites the a_info global in place, so "the artifacts" means a different
1287
+ * set the second time round without anything being passed. This port generates
1288
+ * into a fresh array and leaves reg.artifacts alone, so the set being measured
1289
+ * has to be handed in.
1145
1290
  */
1146
- export function collectArtifactData(reg, rng) {
1147
- void rng;
1291
+ export function collectArtifactData(reg, constants, arts, rng) {
1148
1292
  const data = artifactSetDataNew(reg);
1149
- storeBasePower(reg, data);
1150
- parseFrequencies(reg, data);
1293
+ storeBasePower(reg, constants, arts, data, rng);
1294
+ parseFrequencies(reg, arts, data);
1151
1295
  return data;
1152
1296
  }
1153
1297
  //# sourceMappingURL=randart-data.js.map