@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,1705 @@
1
+ /**
2
+ * Random artifact generation: the artifact-building primitives, ported from
3
+ * reference/src/obj-randart.c (Angband 4.2.6) lines 1332-2670. These are the
4
+ * routines do_randart uses to construct a single random artifact: pick a base
5
+ * item (get_base_item), seed it with its base stats (artifact_prep), build its
6
+ * per-item ability frequency table (build_freq_table), optionally supercharge
7
+ * it (try_supercharge), and then add individual abilities/curses via the many
8
+ * add_* helpers, choose_ability, add_ability(_aux), remove_contradictory and
9
+ * make_bad.
10
+ *
11
+ * Every routine that needs randomness takes an Rng explicitly (no globals) and
12
+ * draws in the exact upstream order so a randart_seed remains reproducible. The
13
+ * two inhibiting macros are, per upstream obj-randart.h:
14
+ * INHIBIT_STRONG => rng.oneIn(6) (one_in_(6))
15
+ * INHIBIT_WEAK => rng.oneIn(2) (one_in_(2))
16
+ * Each textual occurrence of these macros consumes one draw, and C's
17
+ * short-circuit evaluation of && / || is reproduced exactly so no draw is
18
+ * added or dropped.
19
+ *
20
+ * Faithful notes / approximations:
21
+ * - The upstream file_putf(log_file, ...) logging is dropped throughout; it
22
+ * never affects any returned value or RNG draw (same convention as power.ts
23
+ * and randart-data.ts). Where a routine's only use of a value was logging
24
+ * (e.g. lookup_obj_property in add_flag / add_mod), that lookup is dropped.
25
+ * - add_brand adds the resist matching the picked brand by comparing the
26
+ * brand's name to projections[element].name for the four base elements.
27
+ * Projections are not bound in ObjRegistry, so the base-element projection
28
+ * names are held in a small local table (BASE_ELEMENT_PROJ_NAMES) mirroring
29
+ * projection.txt / projection.json; noted as an approximation.
30
+ * - remove_contradictory_activation depends on effect_summarize_properties
31
+ * (effects-info.c). That summarizer lives in the effects domain, so it is
32
+ * ported in ./effects-info.ts (makeActivationSummarizer) and injected here as
33
+ * the ActivationSummarizer seam. It consumes no RNG and only ever nulls an
34
+ * activation when it is fully redundant with the artifact's other properties.
35
+ * When no summarizer is supplied this stays a conservative no-op (activations
36
+ * are never treated as redundant).
37
+ * - artifact_curse_conflicts's TIMED_INC "effect foiled by an existing
38
+ * property" branch depends on the timed-effects failure tables (not ported);
39
+ * only the explicit conflict-flags branch is ported. This affects only the
40
+ * cursed-artifact path (make_bad) and consumes no RNG. Noted as an
41
+ * approximation.
42
+ * - add_curse computes power as randint1(9) + 10 * m_bonus(9, level); C leaves
43
+ * the evaluation order of the two calls unspecified, so this port draws
44
+ * randint1 then m_bonus (left-to-right textual order).
45
+ */
46
+
47
+ import { ELEM, KF, OBJ_MOD, OF, STAT_ENTRIES, TV } from "../generated/index.js";
48
+ import { ART_IDX } from "../generated/randart-properties.js";
49
+ import type { Rng } from "../rng.js";
50
+ import type { ObjRegistry } from "./bind.js";
51
+ import type { CurseTimedFoil } from "./object.js";
52
+ import { copyBrands, copySlays, curseTimedIncFoiled } from "./object.js";
53
+ import { INHIBIT_POWER } from "./power.js";
54
+ import type { ArtifactSetData } from "./randart-data.js";
55
+ import type {
56
+ Artifact,
57
+ EffectRecordJson,
58
+ ElementInfo,
59
+ ObjectKind,
60
+ } from "./types.js";
61
+ import {
62
+ EL_INFO_IGNORE,
63
+ ELEM_BASE_MIN,
64
+ ELEM_HIGH_MIN,
65
+ OBJ_MOD_MAX,
66
+ } from "./types.js";
67
+
68
+ /* ------------------------------------------------------------------ */
69
+ /* Constants (obj-randart.h, obj-power.h) */
70
+ /* ------------------------------------------------------------------ */
71
+
72
+ /** MAX_TRIES (obj-randart.h L28). */
73
+ const MAX_TRIES = 200;
74
+
75
+ /**
76
+ * AGGR_POWER (obj-randart.h L47): power below which uncursed randarts cannot
77
+ * aggravate.
78
+ */
79
+ const AGGR_POWER = 300;
80
+
81
+ /** STAT_MAX (list-stats.h): the number of player stats. */
82
+ const STAT_MAX = STAT_ENTRIES.length;
83
+
84
+ /** Inhibiting thresholds (obj-power.h L67-L76). */
85
+ const INHIBIT_BLOWS = 3;
86
+ const INHIBIT_MIGHT = 4;
87
+ const INHIBIT_SHOTS = 21;
88
+ const HIGH_TO_HIT = 16;
89
+ const VERYHIGH_TO_HIT = 26;
90
+ const HIGH_TO_DAM = 16;
91
+ const VERYHIGH_TO_DAM = 26;
92
+ const HIGH_TO_AC = 26;
93
+ const VERYHIGH_TO_AC = 36;
94
+
95
+ /** ART_IDX_TOTAL (obj-randart.h): number of learned-probability slots. */
96
+ const ART_IDX_TOTAL = ART_IDX.TOTAL;
97
+
98
+ /**
99
+ * projections[element].name for the four base elements (projection.txt), used
100
+ * by add_brand to add the resist that matches the brand it just added.
101
+ * Projections are not bound in ObjRegistry, so the names are held here.
102
+ * Indexed by ELEM value (ACID..COLD).
103
+ */
104
+ const BASE_ELEMENT_PROJ_NAMES: readonly string[] = [
105
+ "acid", // ELEM_ACID
106
+ "lightning", // ELEM_ELEC
107
+ "fire", // ELEM_FIRE
108
+ "cold", // ELEM_COLD
109
+ ];
110
+
111
+ /* ------------------------------------------------------------------ */
112
+ /* Arrays of indices by item type (obj-randart.c L52) */
113
+ /* ------------------------------------------------------------------ */
114
+
115
+ const artIdxBow: readonly number[] = [
116
+ ART_IDX.BOW_SHOTS,
117
+ ART_IDX.BOW_MIGHT,
118
+ ART_IDX.BOW_BRAND,
119
+ ART_IDX.BOW_SLAY,
120
+ ];
121
+ const artIdxWeapon: readonly number[] = [
122
+ ART_IDX.WEAPON_HIT,
123
+ ART_IDX.WEAPON_DAM,
124
+ ART_IDX.WEAPON_AGGR,
125
+ ];
126
+ const artIdxNonweapon: readonly number[] = [
127
+ ART_IDX.NONWEAPON_HIT,
128
+ ART_IDX.NONWEAPON_DAM,
129
+ ART_IDX.NONWEAPON_HIT_DAM,
130
+ ART_IDX.NONWEAPON_AGGR,
131
+ ART_IDX.NONWEAPON_BRAND,
132
+ ART_IDX.NONWEAPON_SLAY,
133
+ ART_IDX.NONWEAPON_BLOWS,
134
+ ART_IDX.NONWEAPON_SHOTS,
135
+ ];
136
+ const artIdxMelee: readonly number[] = [
137
+ ART_IDX.MELEE_BLESS,
138
+ ART_IDX.MELEE_SINV,
139
+ ART_IDX.MELEE_BRAND,
140
+ ART_IDX.MELEE_SLAY,
141
+ ART_IDX.MELEE_BLOWS,
142
+ ART_IDX.MELEE_AC,
143
+ ART_IDX.MELEE_DICE,
144
+ ART_IDX.MELEE_WEIGHT,
145
+ ART_IDX.MELEE_TUNN,
146
+ ];
147
+ const artIdxAllarmor: readonly number[] = [ART_IDX.ALLARMOR_WEIGHT];
148
+ const artIdxBoot: readonly number[] = [
149
+ ART_IDX.BOOT_AC,
150
+ ART_IDX.BOOT_FEATHER,
151
+ ART_IDX.BOOT_STEALTH,
152
+ ART_IDX.BOOT_TRAP_IMM,
153
+ ART_IDX.BOOT_SPEED,
154
+ ART_IDX.BOOT_MOVES,
155
+ ];
156
+ const artIdxGlove: readonly number[] = [
157
+ ART_IDX.GLOVE_AC,
158
+ ART_IDX.GLOVE_HIT_DAM,
159
+ ART_IDX.GLOVE_FA,
160
+ ART_IDX.GLOVE_DEX,
161
+ ];
162
+ const artIdxHeadgear: readonly number[] = [
163
+ ART_IDX.HELM_AC,
164
+ ART_IDX.HELM_RBLIND,
165
+ ART_IDX.HELM_ESP,
166
+ ART_IDX.HELM_SINV,
167
+ ART_IDX.HELM_WIS,
168
+ ART_IDX.HELM_INT,
169
+ ];
170
+ const artIdxShield: readonly number[] = [
171
+ ART_IDX.SHIELD_AC,
172
+ ART_IDX.SHIELD_LRES,
173
+ ];
174
+ const artIdxCloak: readonly number[] = [
175
+ ART_IDX.CLOAK_AC,
176
+ ART_IDX.CLOAK_STEALTH,
177
+ ];
178
+ const artIdxArmor: readonly number[] = [
179
+ ART_IDX.ARMOR_AC,
180
+ ART_IDX.ARMOR_STEALTH,
181
+ ART_IDX.ARMOR_HLIFE,
182
+ ART_IDX.ARMOR_CON,
183
+ ART_IDX.ARMOR_LRES,
184
+ ART_IDX.ARMOR_ALLRES,
185
+ ART_IDX.ARMOR_HRES,
186
+ ];
187
+ const artIdxGen: readonly number[] = [
188
+ ART_IDX.GEN_STAT,
189
+ ART_IDX.GEN_SUST,
190
+ ART_IDX.GEN_STEALTH,
191
+ ART_IDX.GEN_SEARCH,
192
+ ART_IDX.GEN_INFRA,
193
+ ART_IDX.GEN_SPEED,
194
+ ART_IDX.GEN_IMMUNE,
195
+ ART_IDX.GEN_FA,
196
+ ART_IDX.GEN_HLIFE,
197
+ ART_IDX.GEN_FEATHER,
198
+ ART_IDX.GEN_LIGHT,
199
+ ART_IDX.GEN_SINV,
200
+ ART_IDX.GEN_ESP,
201
+ ART_IDX.GEN_SDIG,
202
+ ART_IDX.GEN_REGEN,
203
+ ART_IDX.GEN_LRES,
204
+ ART_IDX.GEN_RPOIS,
205
+ ART_IDX.GEN_RFEAR,
206
+ ART_IDX.GEN_RLIGHT,
207
+ ART_IDX.GEN_RDARK,
208
+ ART_IDX.GEN_RBLIND,
209
+ ART_IDX.GEN_RCONF,
210
+ ART_IDX.GEN_RSOUND,
211
+ ART_IDX.GEN_RSHARD,
212
+ ART_IDX.GEN_RNEXUS,
213
+ ART_IDX.GEN_RNETHER,
214
+ ART_IDX.GEN_RCHAOS,
215
+ ART_IDX.GEN_RDISEN,
216
+ ART_IDX.GEN_AC,
217
+ ART_IDX.GEN_TUNN,
218
+ ART_IDX.GEN_ACTIV,
219
+ ART_IDX.GEN_PSTUN,
220
+ ART_IDX.GEN_DAM_RED,
221
+ ART_IDX.GEN_MOVES,
222
+ ART_IDX.GEN_TRAP_IMM,
223
+ ];
224
+ const artIdxHighResist: readonly number[] = [
225
+ ART_IDX.GEN_RPOIS,
226
+ ART_IDX.GEN_RFEAR,
227
+ ART_IDX.GEN_RLIGHT,
228
+ ART_IDX.GEN_RDARK,
229
+ ART_IDX.GEN_RBLIND,
230
+ ART_IDX.GEN_RCONF,
231
+ ART_IDX.GEN_RSOUND,
232
+ ART_IDX.GEN_RSHARD,
233
+ ART_IDX.GEN_RNEXUS,
234
+ ART_IDX.GEN_RNETHER,
235
+ ART_IDX.GEN_RCHAOS,
236
+ ART_IDX.GEN_RDISEN,
237
+ ART_IDX.GEN_PSTUN,
238
+ ];
239
+
240
+ /* ------------------------------------------------------------------ */
241
+ /* Helpers */
242
+ /* ------------------------------------------------------------------ */
243
+
244
+ /** randcalc(v, 0, MINIMISE): base + dice (consumes no RNG). */
245
+ function rvMinimise(v: { base: number; dice: number }): number {
246
+ return v.base + v.dice;
247
+ }
248
+
249
+ /* ------------------------------------------------------------------ */
250
+ /* get_base_item (obj-randart.c L1348) */
251
+ /* ------------------------------------------------------------------ */
252
+
253
+ /**
254
+ * get_base_item (obj-randart.c L1348): pick a random base item kind for a given
255
+ * tval, drawn uniformly across the tval's svals; rejects elven Rings-of and
256
+ * quest-artifact kinds. For rings/amulets the search starts past the ordinary
257
+ * kinds (so only special jewellery bases are used).
258
+ */
259
+ export function getBaseItem(
260
+ reg: ObjRegistry,
261
+ tval: number,
262
+ rng: Rng,
263
+ ): ObjectKind {
264
+ let kind: ObjectKind | null = null;
265
+ let start = 1;
266
+
267
+ /* Restrict to appropriate kinds if jewellery. */
268
+ if (tval === TV.RING || tval === TV.AMULET) {
269
+ let testKind = reg.lookupKind(tval, start);
270
+ while (testKind && testKind.kidx < reg.ordinaryKindCount) {
271
+ start++;
272
+ testKind = reg.lookupKind(tval, start);
273
+ }
274
+ }
275
+
276
+ const numSvals = reg.bases[tval]?.numSvals ?? 0;
277
+
278
+ /* Pick an sval for that tval at random. */
279
+ while (!kind) {
280
+ const r = start + rng.randint0(numSvals - start + 1);
281
+ kind = reg.lookupKind(tval, r);
282
+
283
+ /* No items based on quest artifacts or elven rings. */
284
+ if (
285
+ kind &&
286
+ (kind.name.includes("Ring of") || kind.kindFlags.has(KF.QUEST_ART))
287
+ ) {
288
+ kind = null;
289
+ }
290
+ }
291
+
292
+ return kind;
293
+ }
294
+
295
+ /* ------------------------------------------------------------------ */
296
+ /* artifact_prep (obj-randart.c L1383) */
297
+ /* ------------------------------------------------------------------ */
298
+
299
+ /**
300
+ * artifact_prep (obj-randart.c L1383): add basic data to an artifact of a given
301
+ * object kind, then assign basic combat stats based on the item type. Draws
302
+ * randint0 for the weapon to-hit/to-dam or armour to-AC starting bonus.
303
+ */
304
+ export function artifactPrep(
305
+ reg: ObjRegistry,
306
+ art: Artifact,
307
+ kind: ObjectKind,
308
+ data: ArtifactSetData,
309
+ rng: Rng,
310
+ ): void {
311
+ art.tval = kind.tval;
312
+ art.sval = kind.sval;
313
+ art.toH = rvMinimise(kind.toH);
314
+ art.toD = rvMinimise(kind.toD);
315
+ art.toA = rvMinimise(kind.toA);
316
+ art.ac = kind.ac;
317
+ art.dd = kind.dd;
318
+ art.ds = kind.ds;
319
+ art.weight = kind.weight;
320
+ art.flags.copy(kind.flags);
321
+ art.slays = copySlays(null, kind.slays, reg.slays);
322
+ art.brands = copyBrands(null, kind.brands, reg.brands);
323
+ art.curses = kind.curses ? kind.curses.slice() : null;
324
+ art.activation = null;
325
+ art.altMsg = "";
326
+
327
+ /* Inherit an activation's level, else the kind's level (if it has an
328
+ * effect), else 0. */
329
+ if (kind.activation) {
330
+ art.level = kind.activation.level;
331
+ } else if (kind.effect) {
332
+ art.level = kind.level;
333
+ } else {
334
+ art.level = 0;
335
+ }
336
+ art.time = { base: 0, dice: 0, sides: 0, mBonus: 0 };
337
+
338
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
339
+ art.modifiers[i] = rvMinimise(kind.modifiers[i]!);
340
+ }
341
+ for (let i = 0; i < art.elInfo.length; i++) {
342
+ const ke = kind.elInfo[i] as ElementInfo;
343
+ art.elInfo[i] = { resLevel: ke.resLevel, flags: ke.flags };
344
+ }
345
+
346
+ /* Artifacts ignore everything (base elements). */
347
+ for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
348
+ (art.elInfo[i] as ElementInfo).flags |= EL_INFO_IGNORE;
349
+ }
350
+
351
+ /* Assign basic stats to the artifact based on its type. */
352
+ switch (kind.tval) {
353
+ case TV.BOW:
354
+ case TV.DIGGING:
355
+ case TV.HAFTED:
356
+ case TV.SWORD:
357
+ case TV.POLEARM:
358
+ art.toH += Math.trunc(data.hitStartval / 2) + rng.randint0(data.hitStartval);
359
+ art.toD += Math.trunc(data.damStartval / 2) + rng.randint0(data.damStartval);
360
+ break;
361
+ case TV.BOOTS:
362
+ case TV.GLOVES:
363
+ case TV.HELM:
364
+ case TV.CROWN:
365
+ case TV.SHIELD:
366
+ case TV.CLOAK:
367
+ case TV.SOFT_ARMOR:
368
+ case TV.HARD_ARMOR:
369
+ case TV.DRAG_ARMOR:
370
+ art.toA += Math.trunc(data.acStartval / 2) + rng.randint0(data.acStartval);
371
+ break;
372
+ case TV.LIGHT:
373
+ art.flags.off(OF.TAKES_FUEL);
374
+ art.flags.off(OF.BURNS_OUT);
375
+ art.flags.on(OF.NO_FUEL);
376
+ if (kind.kidx >= reg.ordinaryKindCount) {
377
+ art.modifiers[OBJ_MOD.LIGHT] = 3;
378
+ }
379
+ break;
380
+ default:
381
+ break;
382
+ }
383
+ }
384
+
385
+ /* ------------------------------------------------------------------ */
386
+ /* build_freq_table (obj-randart.c L1505) */
387
+ /* ------------------------------------------------------------------ */
388
+
389
+ /**
390
+ * build_freq_table (obj-randart.c L1505): build a cumulative ability-frequency
391
+ * table for the given artifact's item type, zeroing frequencies for abilities
392
+ * that do not apply. Returns the cumulative table (length ART_IDX_TOTAL).
393
+ */
394
+ export function buildFreqTable(
395
+ art: Artifact,
396
+ data: ArtifactSetData,
397
+ ): number[] {
398
+ const fTemp = new Array<number>(ART_IDX_TOTAL).fill(0);
399
+ const freq = new Array<number>(ART_IDX_TOTAL).fill(0);
400
+
401
+ const copyGroup = (group: readonly number[]): void => {
402
+ for (const idx of group) fTemp[idx] = data.artProbs[idx]!;
403
+ };
404
+
405
+ /* Bow abilities. */
406
+ if (art.tval === TV.BOW) copyGroup(artIdxBow);
407
+
408
+ /* General weapon abilities. */
409
+ if (
410
+ art.tval === TV.BOW ||
411
+ art.tval === TV.DIGGING ||
412
+ art.tval === TV.HAFTED ||
413
+ art.tval === TV.POLEARM ||
414
+ art.tval === TV.SWORD
415
+ ) {
416
+ copyGroup(artIdxWeapon);
417
+ } else {
418
+ /* General non-weapon abilities. */
419
+ copyGroup(artIdxNonweapon);
420
+ }
421
+
422
+ /* General melee abilities. */
423
+ if (
424
+ art.tval === TV.DIGGING ||
425
+ art.tval === TV.HAFTED ||
426
+ art.tval === TV.POLEARM ||
427
+ art.tval === TV.SWORD
428
+ ) {
429
+ copyGroup(artIdxMelee);
430
+ }
431
+
432
+ /* General armor abilities. */
433
+ if (
434
+ art.tval === TV.BOOTS ||
435
+ art.tval === TV.GLOVES ||
436
+ art.tval === TV.HELM ||
437
+ art.tval === TV.CROWN ||
438
+ art.tval === TV.SHIELD ||
439
+ art.tval === TV.CLOAK ||
440
+ art.tval === TV.SOFT_ARMOR ||
441
+ art.tval === TV.HARD_ARMOR ||
442
+ art.tval === TV.DRAG_ARMOR
443
+ ) {
444
+ copyGroup(artIdxAllarmor);
445
+ }
446
+
447
+ /* Boot abilities. */
448
+ if (art.tval === TV.BOOTS) copyGroup(artIdxBoot);
449
+ /* Glove abilities. */
450
+ if (art.tval === TV.GLOVES) copyGroup(artIdxGlove);
451
+ /* Headgear abilities. */
452
+ if (art.tval === TV.HELM || art.tval === TV.CROWN) copyGroup(artIdxHeadgear);
453
+ /* Shield abilities. */
454
+ if (art.tval === TV.SHIELD) copyGroup(artIdxShield);
455
+ /* Cloak abilities. */
456
+ if (art.tval === TV.CLOAK) copyGroup(artIdxCloak);
457
+ /* Armor abilities. */
458
+ if (
459
+ art.tval === TV.SOFT_ARMOR ||
460
+ art.tval === TV.HARD_ARMOR ||
461
+ art.tval === TV.DRAG_ARMOR
462
+ ) {
463
+ copyGroup(artIdxArmor);
464
+ }
465
+
466
+ /* General abilities - no constraint. */
467
+ copyGroup(artIdxGen);
468
+
469
+ /* Build the cumulative frequency table. */
470
+ for (let i = 0; i < ART_IDX_TOTAL; i++) {
471
+ for (let j = i; j < ART_IDX_TOTAL; j++) {
472
+ freq[j]! += fTemp[i]!;
473
+ }
474
+ }
475
+
476
+ return freq;
477
+ }
478
+
479
+ /* ------------------------------------------------------------------ */
480
+ /* try_supercharge (obj-randart.c L1627) */
481
+ /* ------------------------------------------------------------------ */
482
+
483
+ /**
484
+ * try_supercharge (obj-randart.c L1627): give the artifact one up-front chance
485
+ * at each supercharge ability (huge dice/blows, max shots/might, big speed, big
486
+ * AC, aggravation), weighted by the learned supercharge frequencies. The
487
+ * randint0(a_max) rolls use reg.artifacts.length (z_info->a_max).
488
+ */
489
+ export function trySupercharge(
490
+ reg: ObjRegistry,
491
+ art: Artifact,
492
+ targetPower: number,
493
+ data: ArtifactSetData,
494
+ rng: Rng,
495
+ ): void {
496
+ const aMax = reg.artifacts.length;
497
+
498
+ /* Huge damage dice or max blows - melee weapon only. */
499
+ if (
500
+ art.tval === TV.DIGGING ||
501
+ art.tval === TV.HAFTED ||
502
+ art.tval === TV.POLEARM ||
503
+ art.tval === TV.SWORD
504
+ ) {
505
+ if (rng.randint0(aMax) < data.artProbs[ART_IDX.MELEE_DICE_SUPER]!) {
506
+ art.dd += 3 + rng.randint0(4);
507
+ } else if (rng.randint0(aMax) < data.artProbs[ART_IDX.MELEE_BLOWS_SUPER]!) {
508
+ art.modifiers[OBJ_MOD.BLOWS] = INHIBIT_BLOWS - 1;
509
+ }
510
+ }
511
+
512
+ /* Bows - max might or shots. */
513
+ if (art.tval === TV.BOW) {
514
+ if (rng.randint0(aMax) < data.artProbs[ART_IDX.BOW_SHOTS_SUPER]!) {
515
+ art.modifiers[OBJ_MOD.SHOTS] = INHIBIT_SHOTS - 1;
516
+ } else if (rng.randint0(aMax) < data.artProbs[ART_IDX.BOW_MIGHT_SUPER]!) {
517
+ art.modifiers[OBJ_MOD.MIGHT] = INHIBIT_MIGHT - 1;
518
+ }
519
+ }
520
+
521
+ /* Big speed bonus - any item but more likely on boots. C short-circuits the
522
+ * || so the second randint0 only rolls when the first test fails and the
523
+ * item is boots. */
524
+ if (
525
+ rng.randint0(aMax) < data.artProbs[ART_IDX.GEN_SPEED_SUPER]! ||
526
+ (art.tval === TV.BOOTS &&
527
+ rng.randint0(aMax) < data.artProbs[ART_IDX.BOOT_SPEED]!)
528
+ ) {
529
+ art.modifiers[OBJ_MOD.SPEED] = 5 + rng.randint0(6);
530
+ if (rng.oneIn(2)) art.modifiers[OBJ_MOD.SPEED]! += rng.randint1(3);
531
+ if (rng.oneIn(6)) art.modifiers[OBJ_MOD.SPEED]! += 1 + rng.randint1(6);
532
+ }
533
+
534
+ /* Big AC bonus. */
535
+ if (
536
+ art.tval === TV.DIGGING ||
537
+ art.tval === TV.HAFTED ||
538
+ art.tval === TV.POLEARM ||
539
+ art.tval === TV.SWORD
540
+ ) {
541
+ if (rng.randint0(aMax) < data.artProbs[ART_IDX.MELEE_AC_SUPER]!) {
542
+ art.toA += 19 + rng.randint1(11);
543
+ if (rng.oneIn(2)) art.toA += rng.randint1(10);
544
+ if (rng.oneIn(6)) art.toA += rng.randint1(20);
545
+ }
546
+ } else if (
547
+ art.tval !== TV.BOW &&
548
+ rng.randint0(aMax) < data.artProbs[ART_IDX.GEN_AC_SUPER]!
549
+ ) {
550
+ art.toA += 19 + rng.randint1(11);
551
+ if (rng.oneIn(2)) art.toA += rng.randint1(10);
552
+ if (rng.oneIn(6)) art.toA += rng.randint1(20);
553
+ }
554
+
555
+ /* Aggravation. C short-circuits the && so target_power is only tested when
556
+ * the randint0 roll succeeds. */
557
+ if (
558
+ art.tval === TV.BOW ||
559
+ art.tval === TV.DIGGING ||
560
+ art.tval === TV.HAFTED ||
561
+ art.tval === TV.POLEARM ||
562
+ art.tval === TV.SWORD
563
+ ) {
564
+ if (
565
+ rng.randint0(aMax) < data.artProbs[ART_IDX.WEAPON_AGGR]! &&
566
+ targetPower > AGGR_POWER
567
+ ) {
568
+ art.flags.on(OF.AGGRAVATE);
569
+ }
570
+ } else {
571
+ if (
572
+ rng.randint0(aMax) < data.artProbs[ART_IDX.NONWEAPON_AGGR]! &&
573
+ targetPower > AGGR_POWER
574
+ ) {
575
+ art.flags.on(OF.AGGRAVATE);
576
+ }
577
+ }
578
+ }
579
+
580
+ /* ------------------------------------------------------------------ */
581
+ /* add_flag (obj-randart.c L1721) */
582
+ /* ------------------------------------------------------------------ */
583
+
584
+ /** add_flag (obj-randart.c L1721): add a flag; returns true when it changed. */
585
+ export function addFlag(art: Artifact, flag: number): boolean {
586
+ if (art.flags.has(flag)) return false;
587
+ art.flags.on(flag);
588
+ return true;
589
+ }
590
+
591
+ /* ------------------------------------------------------------------ */
592
+ /* add_resist (obj-randart.c L1736) */
593
+ /* ------------------------------------------------------------------ */
594
+
595
+ /** add_resist (obj-randart.c L1736): add a resist; true when it changed. */
596
+ export function addResist(art: Artifact, element: number): boolean {
597
+ const info = art.elInfo[element] as ElementInfo;
598
+ if (info.resLevel > 0) return false;
599
+ info.resLevel = 1;
600
+ return true;
601
+ }
602
+
603
+ /* ------------------------------------------------------------------ */
604
+ /* add_immunity (obj-randart.c L1750) */
605
+ /* ------------------------------------------------------------------ */
606
+
607
+ /** add_immunity (obj-randart.c L1750): grant immunity to a random base element. */
608
+ export function addImmunity(art: Artifact, rng: Rng): void {
609
+ const r = rng.randint0(4);
610
+ (art.elInfo[r] as ElementInfo).resLevel = 3;
611
+ }
612
+
613
+ /* ------------------------------------------------------------------ */
614
+ /* add_mod (obj-randart.c L1761) */
615
+ /* ------------------------------------------------------------------ */
616
+
617
+ /**
618
+ * add_mod (obj-randart.c L1761): add, increase (or worsen a negative) a
619
+ * modifier, favouring a few large bonuses over many small ones. Blows, might
620
+ * and moves are "powerful" and applied sparingly. Returns true when changed.
621
+ */
622
+ export function addMod(art: Artifact, mod: number, rng: Rng): boolean {
623
+ const powerful =
624
+ mod === OBJ_MOD.BLOWS || mod === OBJ_MOD.MIGHT || mod === OBJ_MOD.MOVES;
625
+ let success = false;
626
+
627
+ if (art.modifiers[mod]! < 0) {
628
+ /* Negative mods just get a bit worse. */
629
+ if (rng.oneIn(2)) {
630
+ art.modifiers[mod]!--;
631
+ success = true;
632
+ }
633
+ } else if (powerful) {
634
+ /* Powerful mods need to be applied sparingly. */
635
+ if (art.modifiers[mod] === 0) {
636
+ art.modifiers[mod] = rng.randint1(2);
637
+ success = true;
638
+ } else if (rng.oneIn(20 * art.modifiers[mod]!)) {
639
+ art.modifiers[mod]!++;
640
+ success = true;
641
+ }
642
+ } else {
643
+ /* Hard cap of 6 on non-speed mods. */
644
+ if (mod !== OBJ_MOD.SPEED && art.modifiers[mod]! >= 6) {
645
+ return false;
646
+ }
647
+
648
+ /* New mods average 3, old ones are incremented by 1 or 2. */
649
+ if (art.modifiers[mod] === 0) {
650
+ art.modifiers[mod] = rng.randint0(3) + rng.randint1(3);
651
+ success = true;
652
+ } else {
653
+ art.modifiers[mod]! += rng.randint1(2);
654
+ success = true;
655
+ }
656
+
657
+ /* Enforce cap. */
658
+ if (mod !== OBJ_MOD.SPEED && art.modifiers[mod]! >= 6) {
659
+ art.modifiers[mod] = 6;
660
+ }
661
+ }
662
+
663
+ return success;
664
+ }
665
+
666
+ /* ------------------------------------------------------------------ */
667
+ /* add_stat (obj-randart.c L1823) */
668
+ /* ------------------------------------------------------------------ */
669
+
670
+ /** add_stat (obj-randart.c L1823): add or increase a random stat modifier. */
671
+ export function addStat(art: Artifact, rng: Rng): void {
672
+ addMod(art, OBJ_MOD.STR + rng.randint0(STAT_MAX), rng);
673
+ }
674
+
675
+ /* ------------------------------------------------------------------ */
676
+ /* add_sustain (obj-randart.c L1831) */
677
+ /* ------------------------------------------------------------------ */
678
+
679
+ /** add_sustain (obj-randart.c L1831): add a random sustain, if any are free. */
680
+ export function addSustain(art: Artifact, rng: Rng): void {
681
+ /* Break out if all stats are sustained to avoid an infinite loop. */
682
+ if (
683
+ art.flags.testAll(
684
+ OF.SUST_STR,
685
+ OF.SUST_INT,
686
+ OF.SUST_WIS,
687
+ OF.SUST_DEX,
688
+ OF.SUST_CON,
689
+ )
690
+ ) {
691
+ return;
692
+ }
693
+
694
+ let success = false;
695
+ while (!success) {
696
+ const r = rng.randint0(5);
697
+ if (r === 0) success = addFlag(art, OF.SUST_STR);
698
+ else if (r === 1) success = addFlag(art, OF.SUST_INT);
699
+ else if (r === 2) success = addFlag(art, OF.SUST_WIS);
700
+ else if (r === 3) success = addFlag(art, OF.SUST_DEX);
701
+ else if (r === 4) success = addFlag(art, OF.SUST_CON);
702
+ }
703
+ }
704
+
705
+ /* ------------------------------------------------------------------ */
706
+ /* add_low_resist (obj-randart.c L1854) */
707
+ /* ------------------------------------------------------------------ */
708
+
709
+ /** add_low_resist (obj-randart.c L1854): add a random unheld low resist. */
710
+ export function addLowResist(art: Artifact, rng: Rng): void {
711
+ let count = 0;
712
+ for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
713
+ if ((art.elInfo[i] as ElementInfo).resLevel <= 0) count++;
714
+ }
715
+
716
+ if (!count) return;
717
+
718
+ const r = rng.randint0(count);
719
+ count = 0;
720
+
721
+ for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
722
+ if ((art.elInfo[i] as ElementInfo).resLevel > 0) continue;
723
+ if (r === count++) {
724
+ addResist(art, i);
725
+ return;
726
+ }
727
+ }
728
+ }
729
+
730
+ /* ------------------------------------------------------------------ */
731
+ /* add_high_resist (obj-randart.c L1879) */
732
+ /* ------------------------------------------------------------------ */
733
+
734
+ /**
735
+ * add_high_resist (obj-randart.c L1879): add a high resist chosen from the
736
+ * learned high-resist frequency distribution. Faithfully preserves the
737
+ * upstream weighting quirk in which the running `temp` accumulator is left in
738
+ * a partial-sum state between retry iterations (it is not reset to the total).
739
+ */
740
+ export function addHighResist(
741
+ art: Artifact,
742
+ data: ArtifactSetData,
743
+ rng: Rng,
744
+ ): void {
745
+ const n = artIdxHighResist.length;
746
+ let temp = 0;
747
+ for (let k = 0; k < n; k++) temp += data.artProbs[artIdxHighResist[k]!]!;
748
+
749
+ let success = false;
750
+ let count = 0;
751
+ while (!success && count < MAX_TRIES) {
752
+ /* Randomize from 1 to the current total amount. */
753
+ const r = rng.randint1(temp);
754
+
755
+ /* Determine which (weighted) resist this number corresponds to. */
756
+ temp = data.artProbs[artIdxHighResist[0]!]!;
757
+ let i = 0;
758
+ while (r > temp && i < n) {
759
+ temp += data.artProbs[artIdxHighResist[i]!]!;
760
+ i++;
761
+ }
762
+
763
+ /* i is the index of the correct high resist. */
764
+ if (i === 0) success = addResist(art, ELEM.POIS);
765
+ else if (i === 1) success = addFlag(art, OF.PROT_FEAR);
766
+ else if (i === 2) success = addResist(art, ELEM.LIGHT);
767
+ else if (i === 3) success = addResist(art, ELEM.DARK);
768
+ else if (i === 4) success = addFlag(art, OF.PROT_BLIND);
769
+ else if (i === 5) success = addFlag(art, OF.PROT_CONF);
770
+ else if (i === 6) success = addResist(art, ELEM.SOUND);
771
+ else if (i === 7) success = addResist(art, ELEM.SHARD);
772
+ else if (i === 8) success = addResist(art, ELEM.NEXUS);
773
+ else if (i === 9) success = addResist(art, ELEM.NETHER);
774
+ else if (i === 10) success = addResist(art, ELEM.CHAOS);
775
+ else if (i === 11) success = addResist(art, ELEM.DISEN);
776
+ else if (i === 12) success = addFlag(art, OF.PROT_STUN);
777
+
778
+ count++;
779
+ }
780
+ }
781
+
782
+ /* ------------------------------------------------------------------ */
783
+ /* append_brand / append_slay (obj-slays.c) */
784
+ /* ------------------------------------------------------------------ */
785
+
786
+ /**
787
+ * append_brand (obj-slays.c): try to add brand `pick`, replacing a same-named
788
+ * lower-multiplier brand if present. Returns false when a same-or-greater
789
+ * multiplier brand of the same name already exists.
790
+ */
791
+ function appendBrand(art: Artifact, pick: number, reg: ObjRegistry): boolean {
792
+ const brand = reg.brands[pick]!;
793
+ if (!art.brands) {
794
+ art.brands = new Array<boolean>(reg.brands.length).fill(false);
795
+ art.brands[pick] = true;
796
+ return true;
797
+ }
798
+ for (let i = 1; i < reg.brands.length; i++) {
799
+ if (art.brands[i]) {
800
+ if (reg.brands[i]!.name === brand.name) {
801
+ if (brand.multiplier <= reg.brands[i]!.multiplier) return false;
802
+ art.brands[i] = false;
803
+ art.brands[pick] = true;
804
+ return true;
805
+ }
806
+ }
807
+ }
808
+ art.brands[pick] = true;
809
+ return true;
810
+ }
811
+
812
+ /**
813
+ * same_monsters_slain (obj-slays.c): whether two slays affect the same
814
+ * monsters (same race flag and same base).
815
+ */
816
+ function sameMonstersSlain(reg: ObjRegistry, i: number, j: number): boolean {
817
+ const a = reg.slays[i]!;
818
+ const b = reg.slays[j]!;
819
+ if (a.raceFlag !== b.raceFlag) return false;
820
+ if (!a.base && !b.base) return true;
821
+ if ((a.base && !b.base) || (!a.base && b.base)) return false;
822
+ return a.base === b.base;
823
+ }
824
+
825
+ /**
826
+ * append_slay (obj-slays.c): try to add slay `pick`, replacing a
827
+ * same-monsters lower-multiplier slay if present. Returns false when a
828
+ * same-or-greater multiplier slay of the same monsters already exists.
829
+ */
830
+ function appendSlay(art: Artifact, pick: number, reg: ObjRegistry): boolean {
831
+ const slay = reg.slays[pick]!;
832
+ if (!art.slays) {
833
+ art.slays = new Array<boolean>(reg.slays.length).fill(false);
834
+ art.slays[pick] = true;
835
+ return true;
836
+ }
837
+ for (let i = 1; i < reg.slays.length; i++) {
838
+ if (art.slays[i]) {
839
+ if (sameMonstersSlain(reg, i, pick)) {
840
+ if (slay.multiplier <= reg.slays[i]!.multiplier) return false;
841
+ art.slays[i] = false;
842
+ art.slays[pick] = true;
843
+ return true;
844
+ }
845
+ }
846
+ }
847
+ art.slays[pick] = true;
848
+ return true;
849
+ }
850
+
851
+ /* ------------------------------------------------------------------ */
852
+ /* add_brand (obj-randart.c L1928) */
853
+ /* ------------------------------------------------------------------ */
854
+
855
+ /**
856
+ * add_brand (obj-randart.c L1928): add a brand (mostly only one), then
857
+ * frequently add the resist matching the brand's element.
858
+ */
859
+ export function addBrand(reg: ObjRegistry, art: Artifact, rng: Rng): void {
860
+ /* Mostly only one brand. C short-circuits so randint0(4) is only rolled
861
+ * when the artifact already has brands. */
862
+ if (art.brands && rng.randint0(4)) return;
863
+
864
+ /* Get a random brand. */
865
+ let brandIdx = 0;
866
+ for (let count = 0; count < MAX_TRIES; count++) {
867
+ const pick = rng.randint1(reg.brands.length - 1);
868
+ if (!appendBrand(art, pick, reg)) continue;
869
+ brandIdx = pick;
870
+ break;
871
+ }
872
+
873
+ /* Frequently add the corresponding resist. randint0(4) only rolls when a
874
+ * brand was actually added. */
875
+ if (brandIdx && rng.randint0(4)) {
876
+ const brand = reg.brands[brandIdx]!;
877
+ for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
878
+ if (
879
+ brand.name === BASE_ELEMENT_PROJ_NAMES[i] &&
880
+ (art.elInfo[i] as ElementInfo).resLevel <= 0
881
+ ) {
882
+ addResist(art, i);
883
+ }
884
+ }
885
+ }
886
+ }
887
+
888
+ /* ------------------------------------------------------------------ */
889
+ /* add_slay (obj-randart.c L1962) */
890
+ /* ------------------------------------------------------------------ */
891
+
892
+ /**
893
+ * add_slay (obj-randart.c L1962): add a slay, then frequently add more slays
894
+ * if the first choice was weak (power < 105).
895
+ */
896
+ export function addSlay(reg: ObjRegistry, art: Artifact, rng: Rng): void {
897
+ let slayIdx = 0;
898
+ for (let count = 0; count < MAX_TRIES; count++) {
899
+ const pick = rng.randint1(reg.slays.length - 1);
900
+ if (!appendSlay(art, pick, reg)) continue;
901
+ slayIdx = pick;
902
+ break;
903
+ }
904
+
905
+ /* Frequently add more slays if the first choice is weak. randint0(4) only
906
+ * rolls when a slay was actually added. */
907
+ if (slayIdx && rng.randint0(4) && reg.slays[slayIdx]!.power < 105) {
908
+ addSlay(reg, art, rng);
909
+ }
910
+ }
911
+
912
+ /* ------------------------------------------------------------------ */
913
+ /* add_damage_dice (obj-randart.c L1986) */
914
+ /* ------------------------------------------------------------------ */
915
+
916
+ /** add_damage_dice (obj-randart.c L1986): add one or two damage dice. */
917
+ export function addDamageDice(art: Artifact, rng: Rng): void {
918
+ art.dd += rng.randint1(2);
919
+ }
920
+
921
+ /* ------------------------------------------------------------------ */
922
+ /* add_to_hit (obj-randart.c L1997) */
923
+ /* ------------------------------------------------------------------ */
924
+
925
+ /**
926
+ * add_to_hit (obj-randart.c L1997): add to-hit unless already too high (the
927
+ * high thresholds are only bypassed by the inhibiting rolls).
928
+ */
929
+ export function addToHit(
930
+ art: Artifact,
931
+ fixed: number,
932
+ random: number,
933
+ rng: Rng,
934
+ ): void {
935
+ if (art.toH > VERYHIGH_TO_HIT) {
936
+ if (!rng.oneIn(6)) return;
937
+ } else if (art.toH > HIGH_TO_HIT) {
938
+ if (!rng.oneIn(2)) return;
939
+ }
940
+ art.toH += fixed + rng.randint0(random);
941
+ }
942
+
943
+ /* ------------------------------------------------------------------ */
944
+ /* add_to_dam (obj-randart.c L2020) */
945
+ /* ------------------------------------------------------------------ */
946
+
947
+ /**
948
+ * add_to_dam (obj-randart.c L2020): add to-dam unless already too high. Note
949
+ * the upstream quirk kept faithfully: the HIGH threshold branch tests to_h,
950
+ * not to_d.
951
+ */
952
+ export function addToDam(
953
+ art: Artifact,
954
+ fixed: number,
955
+ random: number,
956
+ rng: Rng,
957
+ ): void {
958
+ if (art.toD > VERYHIGH_TO_DAM) {
959
+ if (!rng.oneIn(6)) return;
960
+ } else if (art.toH > HIGH_TO_DAM) {
961
+ if (!rng.oneIn(2)) return;
962
+ }
963
+ art.toD += fixed + rng.randint0(random);
964
+ }
965
+
966
+ /* ------------------------------------------------------------------ */
967
+ /* add_to_AC (obj-randart.c L2044) */
968
+ /* ------------------------------------------------------------------ */
969
+
970
+ /**
971
+ * add_to_AC (obj-randart.c L2044): add to-AC unless already too high. Note the
972
+ * upstream quirk kept faithfully: the HIGH threshold branch tests to_h, not
973
+ * to_a.
974
+ */
975
+ export function addToAC(
976
+ art: Artifact,
977
+ fixed: number,
978
+ random: number,
979
+ rng: Rng,
980
+ ): void {
981
+ if (art.toA > VERYHIGH_TO_AC) {
982
+ if (!rng.oneIn(6)) return;
983
+ } else if (art.toH > HIGH_TO_AC) {
984
+ if (!rng.oneIn(2)) return;
985
+ }
986
+ art.toA += fixed + rng.randint0(random);
987
+ }
988
+
989
+ /* ------------------------------------------------------------------ */
990
+ /* add_weight_mod (obj-randart.c L2068) */
991
+ /* ------------------------------------------------------------------ */
992
+
993
+ /** add_weight_mod (obj-randart.c L2068): lower the artifact's weight by 10%. */
994
+ export function addWeightMod(art: Artifact): void {
995
+ art.weight = Math.trunc((art.weight * 9) / 10);
996
+ }
997
+
998
+ /* ------------------------------------------------------------------ */
999
+ /* add_activation (obj-randart.c L2078) */
1000
+ /* ------------------------------------------------------------------ */
1001
+
1002
+ /**
1003
+ * add_activation (obj-randart.c L2078): give the artifact a random activation
1004
+ * that is useful but not exploitable and roughly proportionate to its power.
1005
+ * z_info->act_max is reg.activations.length (index 0 is the null/zeroed slot,
1006
+ * mirroring the zeroed activations[0] upstream).
1007
+ */
1008
+ export function addActivation(
1009
+ reg: ObjRegistry,
1010
+ art: Artifact,
1011
+ targetPower: number,
1012
+ maxPower: number,
1013
+ rng: Rng,
1014
+ ): void {
1015
+ const actMax = reg.activations.length;
1016
+
1017
+ /* Work out the maximum allowed activation power. */
1018
+ let maxEffect = 0;
1019
+ for (let i = 0; i < actMax; i++) {
1020
+ const act = reg.activations[i];
1021
+ const power = act ? act.power : 0;
1022
+ if (power > maxEffect && power < INHIBIT_POWER) maxEffect = power;
1023
+ }
1024
+
1025
+ /* Select an activation at random. */
1026
+ let count = 0;
1027
+ while (count < MAX_TRIES) {
1028
+ const x = rng.randint0(actMax);
1029
+ const act = reg.activations[x];
1030
+ const p = act ? act.power : 0;
1031
+
1032
+ if (
1033
+ p < INHIBIT_POWER &&
1034
+ Math.trunc((100 * p) / maxEffect) >
1035
+ Math.trunc((50 * targetPower) / maxPower) &&
1036
+ Math.trunc((100 * p) / maxEffect) <
1037
+ Math.trunc((200 * targetPower) / maxPower)
1038
+ ) {
1039
+ art.activation = act!;
1040
+ art.level = act!.level;
1041
+ art.time.base = p * 8;
1042
+ art.time.dice = p > 5 ? Math.trunc(p / 5) : 1;
1043
+ art.time.sides = p;
1044
+ return;
1045
+ }
1046
+ count++;
1047
+ }
1048
+ }
1049
+
1050
+ /* ------------------------------------------------------------------ */
1051
+ /* choose_ability (obj-randart.c L2121) */
1052
+ /* ------------------------------------------------------------------ */
1053
+
1054
+ /**
1055
+ * choose_ability (obj-randart.c L2121): choose an ability index weighted by the
1056
+ * given cumulative frequency table (length ART_IDX_TOTAL).
1057
+ */
1058
+ export function chooseAbility(freqTable: readonly number[], rng: Rng): number {
1059
+ const r = rng.randint1(freqTable[ART_IDX_TOTAL - 1]!);
1060
+ let ability = 0;
1061
+ while (r > freqTable[ability]!) ability++;
1062
+ return ability;
1063
+ }
1064
+
1065
+ /* ------------------------------------------------------------------ */
1066
+ /* add_ability_aux (obj-randart.c L2150) */
1067
+ /* ------------------------------------------------------------------ */
1068
+
1069
+ /**
1070
+ * add_ability_aux (obj-randart.c L2150): add the ability given by index r. A
1071
+ * general dispatch that imposes no item-type restriction (that is handled by
1072
+ * the frequency table).
1073
+ */
1074
+ export function addAbilityAux(
1075
+ reg: ObjRegistry,
1076
+ art: Artifact,
1077
+ r: number,
1078
+ targetPower: number,
1079
+ data: ArtifactSetData,
1080
+ rng: Rng,
1081
+ ): void {
1082
+ const kind = reg.lookupKind(art.tval, art.sval);
1083
+
1084
+ switch (r) {
1085
+ case ART_IDX.BOW_SHOTS:
1086
+ case ART_IDX.NONWEAPON_SHOTS:
1087
+ addMod(art, OBJ_MOD.SHOTS, rng);
1088
+ break;
1089
+
1090
+ case ART_IDX.BOW_MIGHT:
1091
+ addMod(art, OBJ_MOD.MIGHT, rng);
1092
+ break;
1093
+
1094
+ case ART_IDX.WEAPON_HIT:
1095
+ case ART_IDX.NONWEAPON_HIT:
1096
+ addToHit(art, 1, 2 * data.hitIncrement, rng);
1097
+ break;
1098
+
1099
+ case ART_IDX.WEAPON_DAM:
1100
+ case ART_IDX.NONWEAPON_DAM:
1101
+ addToDam(art, 1, 2 * data.damIncrement, rng);
1102
+ break;
1103
+
1104
+ case ART_IDX.NONWEAPON_HIT_DAM:
1105
+ case ART_IDX.GLOVE_HIT_DAM:
1106
+ addToHit(art, 1, 2 * data.hitIncrement, rng);
1107
+ addToDam(art, 1, 2 * data.damIncrement, rng);
1108
+ break;
1109
+
1110
+ case ART_IDX.WEAPON_AGGR:
1111
+ case ART_IDX.NONWEAPON_AGGR:
1112
+ if (targetPower > AGGR_POWER) addFlag(art, OF.AGGRAVATE);
1113
+ break;
1114
+
1115
+ case ART_IDX.MELEE_BLESS:
1116
+ addFlag(art, OF.BLESSED);
1117
+ break;
1118
+
1119
+ case ART_IDX.BOW_BRAND:
1120
+ case ART_IDX.MELEE_BRAND:
1121
+ case ART_IDX.NONWEAPON_BRAND:
1122
+ addBrand(reg, art, rng);
1123
+ break;
1124
+
1125
+ case ART_IDX.BOW_SLAY:
1126
+ case ART_IDX.MELEE_SLAY:
1127
+ case ART_IDX.NONWEAPON_SLAY:
1128
+ addSlay(reg, art, rng);
1129
+ break;
1130
+
1131
+ case ART_IDX.MELEE_SINV:
1132
+ case ART_IDX.HELM_SINV:
1133
+ case ART_IDX.GEN_SINV:
1134
+ addFlag(art, OF.SEE_INVIS);
1135
+ break;
1136
+
1137
+ case ART_IDX.MELEE_BLOWS:
1138
+ case ART_IDX.NONWEAPON_BLOWS:
1139
+ addMod(art, OBJ_MOD.BLOWS, rng);
1140
+ break;
1141
+
1142
+ case ART_IDX.MELEE_AC:
1143
+ case ART_IDX.BOOT_AC:
1144
+ case ART_IDX.GLOVE_AC:
1145
+ case ART_IDX.HELM_AC:
1146
+ case ART_IDX.SHIELD_AC:
1147
+ case ART_IDX.CLOAK_AC:
1148
+ case ART_IDX.ARMOR_AC:
1149
+ case ART_IDX.GEN_AC:
1150
+ addToAC(art, 1, 2 * data.acIncrement, rng);
1151
+ break;
1152
+
1153
+ case ART_IDX.MELEE_DICE:
1154
+ addDamageDice(art, rng);
1155
+ break;
1156
+
1157
+ case ART_IDX.MELEE_WEIGHT:
1158
+ case ART_IDX.ALLARMOR_WEIGHT:
1159
+ addWeightMod(art);
1160
+ break;
1161
+
1162
+ case ART_IDX.MELEE_TUNN:
1163
+ case ART_IDX.GEN_TUNN:
1164
+ addMod(art, OBJ_MOD.TUNNEL, rng);
1165
+ break;
1166
+
1167
+ case ART_IDX.BOOT_FEATHER:
1168
+ case ART_IDX.GEN_FEATHER:
1169
+ addFlag(art, OF.FEATHER);
1170
+ break;
1171
+
1172
+ case ART_IDX.BOOT_STEALTH:
1173
+ case ART_IDX.CLOAK_STEALTH:
1174
+ case ART_IDX.ARMOR_STEALTH:
1175
+ case ART_IDX.GEN_STEALTH:
1176
+ addMod(art, OBJ_MOD.STEALTH, rng);
1177
+ break;
1178
+
1179
+ case ART_IDX.BOOT_SPEED:
1180
+ case ART_IDX.GEN_SPEED:
1181
+ addMod(art, OBJ_MOD.SPEED, rng);
1182
+ break;
1183
+
1184
+ case ART_IDX.GLOVE_FA:
1185
+ case ART_IDX.GEN_FA:
1186
+ addFlag(art, OF.FREE_ACT);
1187
+ break;
1188
+
1189
+ case ART_IDX.GLOVE_DEX:
1190
+ addMod(art, OBJ_MOD.DEX, rng);
1191
+ break;
1192
+
1193
+ case ART_IDX.HELM_RBLIND:
1194
+ case ART_IDX.GEN_RBLIND:
1195
+ addFlag(art, OF.PROT_BLIND);
1196
+ break;
1197
+
1198
+ case ART_IDX.HELM_ESP:
1199
+ case ART_IDX.GEN_ESP:
1200
+ addFlag(art, OF.TELEPATHY);
1201
+ break;
1202
+
1203
+ case ART_IDX.HELM_WIS:
1204
+ addMod(art, OBJ_MOD.WIS, rng);
1205
+ break;
1206
+
1207
+ case ART_IDX.HELM_INT:
1208
+ addMod(art, OBJ_MOD.INT, rng);
1209
+ break;
1210
+
1211
+ case ART_IDX.SHIELD_LRES:
1212
+ case ART_IDX.ARMOR_LRES:
1213
+ case ART_IDX.GEN_LRES:
1214
+ addLowResist(art, rng);
1215
+ break;
1216
+
1217
+ case ART_IDX.ARMOR_HLIFE:
1218
+ case ART_IDX.GEN_HLIFE:
1219
+ addFlag(art, OF.HOLD_LIFE);
1220
+ break;
1221
+
1222
+ case ART_IDX.ARMOR_CON:
1223
+ addMod(art, OBJ_MOD.CON, rng);
1224
+ break;
1225
+
1226
+ case ART_IDX.ARMOR_ALLRES:
1227
+ addResist(art, ELEM.ACID);
1228
+ addResist(art, ELEM.ELEC);
1229
+ addResist(art, ELEM.FIRE);
1230
+ addResist(art, ELEM.COLD);
1231
+ break;
1232
+
1233
+ case ART_IDX.ARMOR_HRES:
1234
+ addHighResist(art, data, rng);
1235
+ break;
1236
+
1237
+ case ART_IDX.GEN_STAT:
1238
+ addStat(art, rng);
1239
+ break;
1240
+
1241
+ case ART_IDX.GEN_SUST:
1242
+ addSustain(art, rng);
1243
+ break;
1244
+
1245
+ case ART_IDX.GEN_SEARCH:
1246
+ addMod(art, OBJ_MOD.SEARCH, rng);
1247
+ break;
1248
+
1249
+ case ART_IDX.GEN_INFRA:
1250
+ addMod(art, OBJ_MOD.INFRA, rng);
1251
+ break;
1252
+
1253
+ case ART_IDX.GEN_IMMUNE:
1254
+ addImmunity(art, rng);
1255
+ break;
1256
+
1257
+ case ART_IDX.GEN_LIGHT:
1258
+ if (art.tval !== TV.LIGHT) art.modifiers[OBJ_MOD.LIGHT] = 1;
1259
+ break;
1260
+
1261
+ case ART_IDX.GEN_SDIG:
1262
+ addFlag(art, OF.SLOW_DIGEST);
1263
+ break;
1264
+
1265
+ case ART_IDX.GEN_REGEN:
1266
+ addFlag(art, OF.REGEN);
1267
+ break;
1268
+
1269
+ case ART_IDX.GEN_RPOIS:
1270
+ addResist(art, ELEM.POIS);
1271
+ break;
1272
+
1273
+ case ART_IDX.GEN_RFEAR:
1274
+ addFlag(art, OF.PROT_FEAR);
1275
+ break;
1276
+
1277
+ case ART_IDX.GEN_RLIGHT:
1278
+ addResist(art, ELEM.LIGHT);
1279
+ break;
1280
+
1281
+ case ART_IDX.GEN_RDARK:
1282
+ addResist(art, ELEM.DARK);
1283
+ break;
1284
+
1285
+ case ART_IDX.GEN_RCONF:
1286
+ addFlag(art, OF.PROT_CONF);
1287
+ break;
1288
+
1289
+ case ART_IDX.GEN_RSOUND:
1290
+ addResist(art, ELEM.SOUND);
1291
+ break;
1292
+
1293
+ case ART_IDX.GEN_RSHARD:
1294
+ addResist(art, ELEM.SHARD);
1295
+ break;
1296
+
1297
+ case ART_IDX.GEN_RNEXUS:
1298
+ addResist(art, ELEM.NEXUS);
1299
+ break;
1300
+
1301
+ case ART_IDX.GEN_RNETHER:
1302
+ addResist(art, ELEM.NETHER);
1303
+ break;
1304
+
1305
+ case ART_IDX.GEN_RCHAOS:
1306
+ addResist(art, ELEM.CHAOS);
1307
+ break;
1308
+
1309
+ case ART_IDX.GEN_RDISEN:
1310
+ addResist(art, ELEM.DISEN);
1311
+ break;
1312
+
1313
+ case ART_IDX.GEN_PSTUN:
1314
+ addFlag(art, OF.PROT_STUN);
1315
+ break;
1316
+
1317
+ case ART_IDX.BOOT_TRAP_IMM:
1318
+ case ART_IDX.GEN_TRAP_IMM:
1319
+ addFlag(art, OF.TRAP_IMMUNE);
1320
+ break;
1321
+
1322
+ case ART_IDX.GEN_DAM_RED:
1323
+ addMod(art, OBJ_MOD.DAM_RED, rng);
1324
+ break;
1325
+
1326
+ case ART_IDX.GEN_MOVES:
1327
+ case ART_IDX.BOOT_MOVES:
1328
+ addMod(art, OBJ_MOD.MOVES, rng);
1329
+ break;
1330
+
1331
+ case ART_IDX.GEN_ACTIV:
1332
+ if (!art.activation && !kind?.activation) {
1333
+ addActivation(reg, art, targetPower, data.maxPower, rng);
1334
+ }
1335
+ break;
1336
+
1337
+ default:
1338
+ break;
1339
+ }
1340
+ }
1341
+
1342
+ /* ------------------------------------------------------------------ */
1343
+ /* Curse conflict helpers (obj-curse.c) */
1344
+ /* ------------------------------------------------------------------ */
1345
+
1346
+ /**
1347
+ * check_artifact_curses (obj-curse.c L243): drop the curses field if no active
1348
+ * curse remains.
1349
+ */
1350
+ function checkArtifactCurses(art: Artifact): void {
1351
+ if (!art.curses) return;
1352
+ for (let i = 0; i < art.curses.length; i++) {
1353
+ if (art.curses[i]) return;
1354
+ }
1355
+ art.curses = null;
1356
+ }
1357
+
1358
+ /**
1359
+ * curses_conflict (obj-curse.c L95): whether curse `second` is in curse
1360
+ * `first`'s conflict list.
1361
+ */
1362
+ function cursesConflict(
1363
+ reg: ObjRegistry,
1364
+ first: number,
1365
+ second: number,
1366
+ ): boolean {
1367
+ const c = reg.curses[first]!;
1368
+ if (!c.conflict) return false;
1369
+ const needle = "|" + reg.curses[second]!.name + "|";
1370
+ return c.conflict.includes(needle);
1371
+ }
1372
+
1373
+ /**
1374
+ * artifact_curse_conflicts (obj-curse.c L262): whether curse `pick` is foiled
1375
+ * by an existing artifact property - its TIMED_INC effect fails against a
1376
+ * flag/resist/vulnerability the artifact already has (obj-curse.c L267-296,
1377
+ * consulted only when `timedFoil` is supplied), or it explicitly conflicts with
1378
+ * an artifact flag. Draws no RNG.
1379
+ */
1380
+ function artifactCurseConflicts(
1381
+ reg: ObjRegistry,
1382
+ art: Artifact,
1383
+ pick: number,
1384
+ timedFoil?: CurseTimedFoil,
1385
+ ): boolean {
1386
+ const c = reg.curses[pick]!;
1387
+
1388
+ /* Reject curses with effects foiled by an existing artifact property. */
1389
+ if (timedFoil && curseTimedIncFoiled(c, art.flags, art.elInfo, timedFoil)) {
1390
+ checkArtifactCurses(art);
1391
+ return true;
1392
+ }
1393
+
1394
+ for (const flag of c.conflictFlags) {
1395
+ if (art.flags.has(flag)) {
1396
+ checkArtifactCurses(art);
1397
+ return true;
1398
+ }
1399
+ }
1400
+ return false;
1401
+ }
1402
+
1403
+ /**
1404
+ * append_artifact_curse (obj-curse.c L317): add curse `pick` at the given
1405
+ * power, rejecting conflicts. Returns true when the curse was applied.
1406
+ */
1407
+ function appendArtifactCurse(
1408
+ reg: ObjRegistry,
1409
+ art: Artifact,
1410
+ pick: number,
1411
+ power: number,
1412
+ timedFoil?: CurseTimedFoil,
1413
+ ): boolean {
1414
+ if (!art.curses) art.curses = new Array<number>(reg.curses.length).fill(0);
1415
+
1416
+ /* Reject conflicting curses. */
1417
+ for (let i = 0; i < reg.curses.length; i++) {
1418
+ if (art.curses[i] && cursesConflict(reg, i, pick)) {
1419
+ checkArtifactCurses(art);
1420
+ return false;
1421
+ }
1422
+ }
1423
+
1424
+ /* Reject curses foiled by an existing artifact property. */
1425
+ if (artifactCurseConflicts(reg, art, pick, timedFoil)) {
1426
+ checkArtifactCurses(art);
1427
+ return false;
1428
+ }
1429
+
1430
+ /* Adjust power if our pick is a duplicate. */
1431
+ if (power > art.curses[pick]!) art.curses[pick] = power;
1432
+
1433
+ checkArtifactCurses(art);
1434
+ return true;
1435
+ }
1436
+
1437
+ /* ------------------------------------------------------------------ */
1438
+ /* remove_contradictory_activation (obj-randart.c L2420) */
1439
+ /* ------------------------------------------------------------------ */
1440
+
1441
+ /**
1442
+ * enum effect_object_property_kind (effects-info.h L40): the kind of object
1443
+ * property an activation effect grants, as summarized for redundancy checks.
1444
+ */
1445
+ export const EFPROP = {
1446
+ OBJECT_FLAG_EXACT: 0,
1447
+ OBJECT_FLAG: 1,
1448
+ RESIST: 2,
1449
+ CURE_FLAG: 3,
1450
+ CURE_RESIST: 4,
1451
+ CONFLICT_FLAG: 5,
1452
+ CONFLICT_RESIST: 6,
1453
+ CONFLICT_VULN: 7,
1454
+ BRAND: 8,
1455
+ SLAY: 9,
1456
+ } as const;
1457
+
1458
+ /** struct effect_object_property (effects-info.h L53): one summarized property. */
1459
+ export interface EffectObjectProperty {
1460
+ /** EFPROP_* kind. */
1461
+ kind: number;
1462
+ /** OF_ / ELEM_ / brand / slay index, per `kind`. */
1463
+ idx: number;
1464
+ /** For the resist/vuln kinds: the res_level window that makes it redundant. */
1465
+ reslevelMin: number;
1466
+ reslevelMax: number;
1467
+ }
1468
+
1469
+ /**
1470
+ * effect_summarize_properties (effects-info.c L898): summarize the object
1471
+ * properties an activation's effect chain grants, plus a count of sub-effects
1472
+ * that map to no object property. This lives in the effects domain (out of this
1473
+ * work package's lock) and is injected so remove_contradictory_activation can
1474
+ * measure redundancy. When no summarizer is supplied the activation is never
1475
+ * treated as redundant (a conservative no-op).
1476
+ */
1477
+ export type ActivationSummarizer = (
1478
+ effect: readonly EffectRecordJson[],
1479
+ ) => { props: EffectObjectProperty[]; unsummarizedCount: number };
1480
+
1481
+ /**
1482
+ * remove_contradictory_activation (obj-randart.c L2420): drop the activation
1483
+ * when everything it does is already provided by (or in conflict with) the
1484
+ * artifact's other properties. Upstream summarizes the activation via
1485
+ * effect_summarize_properties; the port injects that summarizer (see
1486
+ * ActivationSummarizer / gap 3.8 WIRING-NEEDED). The redundancy switch below is
1487
+ * a faithful transcription; it draws no RNG.
1488
+ */
1489
+ export function removeContradictoryActivation(
1490
+ reg: ObjRegistry,
1491
+ art: Artifact,
1492
+ summarize?: ActivationSummarizer,
1493
+ ): void {
1494
+ if (!art.activation || !art.activation.effect) return;
1495
+
1496
+ /* Without the effects-domain summarizer we cannot prove redundancy; keep the
1497
+ * activation (conservative). */
1498
+ if (!summarize) return;
1499
+
1500
+ const { props, unsummarizedCount } = summarize(art.activation.effect);
1501
+ let redundant = true;
1502
+
1503
+ if (unsummarizedCount > 0) {
1504
+ /* The activation does at least one thing with no object-property twin. */
1505
+ redundant = false;
1506
+ } else {
1507
+ for (const p of props) {
1508
+ if (!redundant) break;
1509
+ switch (p.kind) {
1510
+ case EFPROP.BRAND: {
1511
+ let maxmult = 1;
1512
+ for (let i = 1; i < reg.brands.length; i++) {
1513
+ if (!art.brands?.[i]) continue;
1514
+ if (reg.brands[i]!.resistFlag !== reg.brands[p.idx]!.resistFlag) {
1515
+ continue;
1516
+ }
1517
+ maxmult = Math.max(reg.brands[i]!.multiplier, maxmult);
1518
+ }
1519
+ if (maxmult < reg.brands[p.idx]!.multiplier) redundant = false;
1520
+ break;
1521
+ }
1522
+ case EFPROP.SLAY: {
1523
+ let maxmult = 1;
1524
+ for (let i = 1; i < reg.slays.length; i++) {
1525
+ if (!art.slays?.[i]) continue;
1526
+ if (!sameMonstersSlain(reg, i, p.idx)) continue;
1527
+ maxmult = Math.max(reg.slays[i]!.multiplier, maxmult);
1528
+ }
1529
+ if (maxmult < reg.slays[p.idx]!.multiplier) redundant = false;
1530
+ break;
1531
+ }
1532
+ case EFPROP.RESIST:
1533
+ case EFPROP.CONFLICT_RESIST:
1534
+ case EFPROP.CONFLICT_VULN: {
1535
+ const res = art.elInfo[p.idx]?.resLevel ?? 0;
1536
+ if (res >= p.reslevelMin && res <= p.reslevelMax) redundant = false;
1537
+ break;
1538
+ }
1539
+ case EFPROP.OBJECT_FLAG:
1540
+ /* Does more than the flag; keep it (also screens HERO/SHERO). */
1541
+ redundant = false;
1542
+ break;
1543
+ case EFPROP.OBJECT_FLAG_EXACT:
1544
+ case EFPROP.CURE_FLAG:
1545
+ case EFPROP.CONFLICT_FLAG:
1546
+ if (!art.flags.has(p.idx)) redundant = false;
1547
+ break;
1548
+ default:
1549
+ /* Something unexpected; assume the effect is useful. */
1550
+ redundant = false;
1551
+ break;
1552
+ }
1553
+ }
1554
+ }
1555
+
1556
+ if (redundant) art.activation = null;
1557
+ }
1558
+
1559
+ /* ------------------------------------------------------------------ */
1560
+ /* remove_contradictory (obj-randart.c L2530) */
1561
+ /* ------------------------------------------------------------------ */
1562
+
1563
+ /**
1564
+ * remove_contradictory (obj-randart.c L2530): clean up illogical combinations
1565
+ * of powers (aggravation vs stealth, negative stats vs their sustains,
1566
+ * drain-exp vs hold-life), remove conflicting curses, and drop a redundant
1567
+ * activation.
1568
+ */
1569
+ export function removeContradictory(
1570
+ reg: ObjRegistry,
1571
+ art: Artifact,
1572
+ timedFoil?: CurseTimedFoil,
1573
+ activationSummarize?: ActivationSummarizer,
1574
+ ): void {
1575
+ if (art.flags.has(OF.AGGRAVATE)) art.modifiers[OBJ_MOD.STEALTH] = 0;
1576
+
1577
+ if (art.modifiers[OBJ_MOD.STR]! < 0) art.flags.off(OF.SUST_STR);
1578
+ if (art.modifiers[OBJ_MOD.INT]! < 0) art.flags.off(OF.SUST_INT);
1579
+ if (art.modifiers[OBJ_MOD.WIS]! < 0) art.flags.off(OF.SUST_WIS);
1580
+ if (art.modifiers[OBJ_MOD.DEX]! < 0) art.flags.off(OF.SUST_DEX);
1581
+ if (art.modifiers[OBJ_MOD.CON]! < 0) art.flags.off(OF.SUST_CON);
1582
+
1583
+ if (art.flags.has(OF.DRAIN_EXP)) art.flags.off(OF.HOLD_LIFE);
1584
+
1585
+ /* Remove any conflicting curses. */
1586
+ if (art.curses) {
1587
+ for (let i = 1; i < reg.curses.length; i++) {
1588
+ if (artifactCurseConflicts(reg, art, i, timedFoil)) {
1589
+ if (art.curses) art.curses[i] = 0;
1590
+ checkArtifactCurses(art);
1591
+ }
1592
+ if (!art.curses) break;
1593
+ }
1594
+ }
1595
+
1596
+ removeContradictoryActivation(reg, art, activationSummarize);
1597
+ }
1598
+
1599
+ /* ------------------------------------------------------------------ */
1600
+ /* add_ability (obj-randart.c L2567) */
1601
+ /* ------------------------------------------------------------------ */
1602
+
1603
+ /**
1604
+ * add_ability (obj-randart.c L2567): choose a random ability from the frequency
1605
+ * table, add it, remove contradictions, and bless WIS-bearing sharp weapons.
1606
+ */
1607
+ export function addAbility(
1608
+ reg: ObjRegistry,
1609
+ art: Artifact,
1610
+ targetPower: number,
1611
+ freq: readonly number[],
1612
+ data: ArtifactSetData,
1613
+ rng: Rng,
1614
+ ): void {
1615
+ /* Choose a random ability using the frequency table. */
1616
+ const r = chooseAbility(freq, rng);
1617
+
1618
+ /* Add the appropriate ability. */
1619
+ addAbilityAux(reg, art, r, targetPower, data, rng);
1620
+
1621
+ /* Remove contradictory or redundant powers. */
1622
+ removeContradictory(reg, art, data.timedFoil, data.activationSummarize);
1623
+
1624
+ /* Adding WIS to sharp weapons always blesses them. */
1625
+ if (
1626
+ art.modifiers[OBJ_MOD.WIS] &&
1627
+ (art.tval === TV.SWORD || art.tval === TV.POLEARM)
1628
+ ) {
1629
+ addFlag(art, OF.BLESSED);
1630
+ }
1631
+ }
1632
+
1633
+ /* ------------------------------------------------------------------ */
1634
+ /* add_curse (obj-randart.c L2591) */
1635
+ /* ------------------------------------------------------------------ */
1636
+
1637
+ /**
1638
+ * add_curse (obj-randart.c L2591): randomly select a curse and apply it, unless
1639
+ * the artifact is blessed. Each attempt draws pick then power regardless of
1640
+ * whether the curse is possible on this tval. See the module note on the
1641
+ * randint1(9) + 10 * m_bonus(9, level) evaluation order.
1642
+ */
1643
+ export function addCurse(
1644
+ reg: ObjRegistry,
1645
+ art: Artifact,
1646
+ level: number,
1647
+ rng: Rng,
1648
+ timedFoil?: CurseTimedFoil,
1649
+ ): boolean {
1650
+ if (art.flags.has(OF.BLESSED)) return false;
1651
+
1652
+ let maxTries = 5;
1653
+ while (maxTries) {
1654
+ const pick = rng.randint1(reg.curses.length - 1);
1655
+ const rand9 = rng.randint1(9);
1656
+ const bonus = rng.mBonus(9, level);
1657
+ const power = rand9 + 10 * bonus;
1658
+ if (!reg.curses[pick]!.poss[art.tval]) {
1659
+ maxTries--;
1660
+ continue;
1661
+ }
1662
+ return appendArtifactCurse(reg, art, pick, power, timedFoil);
1663
+ }
1664
+ return false;
1665
+ }
1666
+
1667
+ /* ------------------------------------------------------------------ */
1668
+ /* make_bad (obj-randart.c L2613) */
1669
+ /* ------------------------------------------------------------------ */
1670
+
1671
+ /**
1672
+ * make_bad (obj-randart.c L2613): make an artifact bad, or worse: possibly add
1673
+ * aggravation / drain-exp / no-teleport, flip some positive modifiers and
1674
+ * combat bonuses to negative, and apply one or two curses.
1675
+ */
1676
+ export function makeBad(
1677
+ reg: ObjRegistry,
1678
+ art: Artifact,
1679
+ level: number,
1680
+ rng: Rng,
1681
+ timedFoil?: CurseTimedFoil,
1682
+ ): void {
1683
+ let num = rng.randint1(2);
1684
+
1685
+ if (rng.oneIn(7)) art.flags.on(OF.AGGRAVATE);
1686
+ if (rng.oneIn(4)) art.flags.on(OF.DRAIN_EXP);
1687
+ if (rng.oneIn(7)) art.flags.on(OF.NO_TELEPORT);
1688
+
1689
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
1690
+ if (art.modifiers[i]! > 0) {
1691
+ if (rng.oneIn(2) && i !== OBJ_MOD.MIGHT) {
1692
+ art.modifiers[i] = -art.modifiers[i]!;
1693
+ }
1694
+ }
1695
+ }
1696
+
1697
+ if (art.toA > 0 && rng.oneIn(2)) art.toA = -art.toA;
1698
+ if (art.toH > 0 && rng.oneIn(2)) art.toH = -art.toH;
1699
+ if (art.toD > 0 && rng.oneIn(4)) art.toD = -art.toD;
1700
+
1701
+ while (num) {
1702
+ addCurse(reg, art, level, rng, timedFoil);
1703
+ num--;
1704
+ }
1705
+ }