@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,1367 @@
1
+ /**
2
+ * Object generation, ported from reference/src/obj-make.c
3
+ * (Angband 4.2.6): object_prep, the object/ego allocation tables
4
+ * (alloc_init_objects / alloc_init_egos), kind_is_good, get_obj_num,
5
+ * ego_find_random, ego_apply_magic, ego_apply_minima, make_ego_item,
6
+ * apply_magic (with its weapon/armour enchant helpers and apply_curse),
7
+ * make_object, money_kind, and make_gold.
8
+ *
9
+ * LIVE vs DEFERRED (ledgered in parity/ledger/obj-make.yaml):
10
+ * - LIVE: object_prep; the cumulative allocation tables and both
11
+ * get_obj_num paths (any-tval binary search, per-tval linear scan)
12
+ * including the great_obj level boost; ego allocation (table sorted by
13
+ * alloc_min, ego_find_random with the out-of-depth chance),
14
+ * ego_apply_magic (random sustain/power/resist picks, ego bonuses,
15
+ * modifiers, flags, slays/brands/curses, resists, activation),
16
+ * ego_apply_minima, make_ego_item (great_ego boost); apply_magic's
17
+ * good/great power rolls, weapon and armour enchantment (including the
18
+ * melee dice supercharge and ammo dice boosts), the Ring of Speed
19
+ * supercharge, apply_curse (see object.ts for the one deferred check
20
+ * inside append_object_curse); make_object's kind selection, prep,
21
+ * magic, and stack-size generation; make_gold/money_kind.
22
+ * - LIVE: artifact creation. make_artifact (apply_magic promotion) and
23
+ * make_artifact_special (make_object's special-artifact roll) scan the
24
+ * artifact list consuming RNG in upstream's per-candidate order
25
+ * (out-of-depth roll then rarity roll, aidx ascending), copy the
26
+ * artifact's fixed data, and mark it created in the shared ArtifactState
27
+ * (aup_info[]). copy_artifact_data was already ported.
28
+ * - LIVE: pick_chest_traps for chests (obj/chest.ts), wired into apply_magic's
29
+ * chest branch so generated chests carry a real lock/trap pval; the rest
30
+ * of the chest domain (chest_check, chest_trap, chest_death, the open/
31
+ * disarm commands) lives in game/chest.ts (gap #49).
32
+ * - LIVE: make_object's *value out-parameter (obj-power.c object_value_real)
33
+ * and its 20%-per-level-OOD boost, exposed as the optional `outValue`
34
+ * parameter (a faithful transcription of the C out-parameter). Feeds
35
+ * gen/util.ts placeObject's obj_rating accumulation (gen-util.c L509-540).
36
+ * - LIVE (opt-in via MakeDeps): make_object's unreadable-book rejection
37
+ * (obj_kind_can_browse) via deps.canBrowseBook, append_object_curse's
38
+ * TIMED_INC foil via deps.timedFoil, and make_gold's birth_no_selling 5x
39
+ * inflation via deps.noSelling. Each is faithful 4.2.6 when its dep is
40
+ * supplied and a no-op (the prior behaviour) when it is absent.
41
+ */
42
+
43
+ import type { Constants } from "../constants.js";
44
+ import { KF, OBJ_MOD, OF, TV } from "../generated/index.js";
45
+ import { INT_MAX } from "../guard.js";
46
+ import type { Aspect, Rng } from "../rng.js";
47
+ import type { ObjRegistry } from "./bind.js";
48
+ import type { CurseTimedFoil, GameObject } from "./object.js";
49
+ import { pickChestTraps } from "./chest.js";
50
+ import { objectValueReal } from "./value.js";
51
+ import {
52
+ appendObjectCurse,
53
+ copyBrands,
54
+ copyCurses,
55
+ copySlays,
56
+ objectNew,
57
+ tvalCanHaveCharges,
58
+ tvalIsBook,
59
+ tvalIsAmmo,
60
+ tvalIsArmor,
61
+ tvalIsChest,
62
+ tvalIsEdible,
63
+ tvalIsFuel,
64
+ tvalIsLauncher,
65
+ tvalIsLight,
66
+ tvalIsMeleeWeapon,
67
+ tvalIsPotion,
68
+ tvalIsRing,
69
+ tvalIsWeapon,
70
+ tvalIsWearable,
71
+ } from "./object.js";
72
+ import type { Artifact, ElementInfo, ObjectKind, ObjectProperty } from "./types.js";
73
+ import type { EgoItem } from "./types.js";
74
+ import { FlagSet } from "../bitflag.js";
75
+ import {
76
+ EL_INFO_IGNORE,
77
+ EL_INFO_RANDOM,
78
+ ELEM_BASE_MIN,
79
+ ELEM_HIGH_MAX,
80
+ ELEM_HIGH_MIN,
81
+ ELEM_MAX,
82
+ NO_MINIMUM,
83
+ OBJ_MOD_MAX,
84
+ OBJ_PROPERTY,
85
+ OF_SIZE,
86
+ OFT,
87
+ TV_MAX,
88
+ } from "./types.js";
89
+ import type { RandomValue } from "../rng.js";
90
+
91
+ /** randcalc(v, 0, MINIMISE) without an Rng (consumes no randomness). */
92
+ function randcalcMin(v: RandomValue): number {
93
+ /* damcalc minimise returns the dice count; m_bonus minimise is 0. */
94
+ return v.base + v.dice;
95
+ }
96
+
97
+ /* ------------------------------------------------------------------ */
98
+ /* object_prep */
99
+ /* ------------------------------------------------------------------ */
100
+
101
+ /**
102
+ * object_prep: wipe an object clean and make it a standard object of
103
+ * the given kind.
104
+ *
105
+ * Upstream quirk kept: of_copy(obj, base->flags) then
106
+ * of_copy(obj, kind->flags) -- the second copy overwrites the first, so
107
+ * base flags do NOT reach the object here (they were already folded
108
+ * into nothing; only kind flags apply).
109
+ */
110
+ export function objectPrep(
111
+ rng: Rng,
112
+ reg: ObjRegistry,
113
+ constants: Constants,
114
+ kind: ObjectKind,
115
+ lev: number,
116
+ randAspect: Aspect,
117
+ ): GameObject {
118
+ const obj = objectNew(kind);
119
+
120
+ obj.tval = kind.tval;
121
+ obj.sval = kind.sval;
122
+ obj.ac = kind.ac;
123
+ obj.dd = kind.dd;
124
+ obj.ds = kind.ds;
125
+ obj.weight = kind.weight;
126
+ obj.effect = kind.effect;
127
+ obj.time = { ...kind.time };
128
+
129
+ /* Default number */
130
+ obj.number = 1;
131
+
132
+ /* Copy flags (see quirk note above). */
133
+ obj.flags.copy(kind.base.flags);
134
+ obj.flags.copy(kind.flags);
135
+
136
+ /* Assign modifiers */
137
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
138
+ obj.modifiers[i] = rng.randcalc(
139
+ kind.modifiers[i] as RandomValue,
140
+ lev,
141
+ randAspect,
142
+ );
143
+ }
144
+
145
+ /* Assign charges (wands/staves only) */
146
+ if (tvalCanHaveCharges(obj.tval)) {
147
+ obj.pval = rng.randcalc(kind.charge, lev, randAspect);
148
+ }
149
+
150
+ /* Assign pval for food, oil and launchers */
151
+ if (
152
+ tvalIsEdible(obj.tval) ||
153
+ tvalIsPotion(obj.tval) ||
154
+ tvalIsFuel(obj.tval) ||
155
+ tvalIsLauncher(obj.tval)
156
+ ) {
157
+ obj.pval = rng.randcalc(kind.pval, lev, randAspect);
158
+ }
159
+
160
+ /* Default fuel */
161
+ if (tvalIsLight(obj.tval)) {
162
+ if (obj.flags.has(OF.BURNS_OUT)) obj.timeout = constants.fuelTorch;
163
+ else if (obj.flags.has(OF.TAKES_FUEL)) obj.timeout = constants.defaultLamp;
164
+ }
165
+
166
+ /* Default magic */
167
+ obj.toH = rng.randcalc(kind.toH, lev, randAspect);
168
+ obj.toD = rng.randcalc(kind.toD, lev, randAspect);
169
+ obj.toA = rng.randcalc(kind.toA, lev, randAspect);
170
+
171
+ /* Default slays, brands and curses */
172
+ obj.slays = copySlays(obj.slays, kind.slays, reg.slays);
173
+ obj.brands = copyBrands(obj.brands, kind.brands, reg.brands);
174
+ copyCurses(rng, obj, kind.curses, reg.curses);
175
+
176
+ /* Default resists */
177
+ for (let i = 0; i < ELEM_MAX; i++) {
178
+ const dst = obj.elInfo[i] as ElementInfo;
179
+ const src = kind.elInfo[i] as ElementInfo;
180
+ dst.resLevel = src.resLevel;
181
+ dst.flags = src.flags;
182
+ dst.flags |= (kind.base.elInfo[i] as ElementInfo).flags;
183
+ }
184
+
185
+ return obj;
186
+ }
187
+
188
+ /* ------------------------------------------------------------------ */
189
+ /* Allocation tables */
190
+ /* ------------------------------------------------------------------ */
191
+
192
+ /** alloc_entry for the ego table. */
193
+ interface EgoAllocEntry {
194
+ /** eidx. */
195
+ index: number;
196
+ level: number;
197
+ prob2: number;
198
+ prob3: number;
199
+ }
200
+
201
+ interface MoneyType {
202
+ name: string;
203
+ type: number;
204
+ }
205
+
206
+ /**
207
+ * kind_is_good: whether a template is "good" (kind-level test only).
208
+ */
209
+ export function kindIsGood(kind: ObjectKind): boolean {
210
+ switch (kind.tval) {
211
+ case TV.HARD_ARMOR:
212
+ case TV.SOFT_ARMOR:
213
+ case TV.DRAG_ARMOR:
214
+ case TV.SHIELD:
215
+ case TV.CLOAK:
216
+ case TV.BOOTS:
217
+ case TV.GLOVES:
218
+ case TV.HELM:
219
+ case TV.CROWN:
220
+ return randcalcMin(kind.toA) >= 0;
221
+
222
+ case TV.BOW:
223
+ case TV.SWORD:
224
+ case TV.HAFTED:
225
+ case TV.POLEARM:
226
+ case TV.DIGGING:
227
+ return randcalcMin(kind.toH) >= 0 && randcalcMin(kind.toD) >= 0;
228
+
229
+ case TV.BOLT:
230
+ case TV.ARROW:
231
+ return true;
232
+ default:
233
+ break;
234
+ }
235
+
236
+ return kind.kindFlags.has(KF.GOOD);
237
+ }
238
+
239
+ /**
240
+ * The allocation state built by init_obj_make: cumulative kind
241
+ * probability tables per level, per-tval totals, the ego allocation
242
+ * table, and the money kinds.
243
+ */
244
+ export class ObjAllocState {
245
+ private readonly reg: ObjRegistry;
246
+ private readonly kMax: number;
247
+ private readonly maxObjDepth: number;
248
+ /** Cumulative prob table: (maxObjDepth+1) rows of (kMax+1). */
249
+ private readonly objAlloc: Uint32Array;
250
+ private readonly objAllocGreat: Uint32Array;
251
+ /** Per-tval totals: (maxObjDepth+1) rows of TV_MAX. */
252
+ private readonly objTotalTval: Uint32Array;
253
+ private readonly objTotalTvalGreat: Uint32Array;
254
+ /** alloc_ego_table, sorted by ego alloc_min. */
255
+ readonly egoTable: EgoAllocEntry[] = [];
256
+ private readonly moneyTypes: MoneyType[] = [];
257
+
258
+ constructor(reg: ObjRegistry, constants: Constants) {
259
+ this.reg = reg;
260
+ this.kMax = reg.kinds.length;
261
+ this.maxObjDepth = constants.maxObjDepth;
262
+
263
+ const rows = this.maxObjDepth + 1;
264
+ this.objAlloc = new Uint32Array(rows * (this.kMax + 1));
265
+ this.objAllocGreat = new Uint32Array(rows * (this.kMax + 1));
266
+ this.objTotalTval = new Uint32Array(rows * TV_MAX);
267
+ this.objTotalTvalGreat = new Uint32Array(rows * TV_MAX);
268
+
269
+ /* alloc_init_objects: fill the cumulative probability tables. */
270
+ for (let item = 0; item < this.kMax; item++) {
271
+ const kind = reg.kinds[item] as ObjectKind;
272
+ const min = kind.allocMin;
273
+ const max = kind.allocMax;
274
+ const good = kindIsGood(kind);
275
+ for (let lev = 0; lev <= this.maxObjDepth; lev++) {
276
+ let rarity = kind.allocProb;
277
+ if (lev < min || lev > max) rarity = 0;
278
+ const row = lev * (this.kMax + 1);
279
+ this.objAlloc[row + item + 1] =
280
+ (this.objAlloc[row + item] as number) + rarity;
281
+ this.objTotalTval[lev * TV_MAX + kind.tval] =
282
+ (this.objTotalTval[lev * TV_MAX + kind.tval] as number) + rarity;
283
+
284
+ if (!good) rarity = 0;
285
+ this.objAllocGreat[row + item + 1] =
286
+ (this.objAllocGreat[row + item] as number) + rarity;
287
+ this.objTotalTvalGreat[lev * TV_MAX + kind.tval] =
288
+ (this.objTotalTvalGreat[lev * TV_MAX + kind.tval] as number) +
289
+ rarity;
290
+ }
291
+ }
292
+
293
+ /* alloc_init_egos: table sorted (grouped) by minimum depth. */
294
+ const num = new Array<number>(this.maxObjDepth + 1).fill(0);
295
+ const levelTotal = new Array<number>(this.maxObjDepth + 1).fill(0);
296
+ let egoSize = 0;
297
+ for (const ego of reg.egos) {
298
+ if (ego.allocProb) {
299
+ egoSize++;
300
+ num[ego.allocMin] = (num[ego.allocMin] as number) + 1;
301
+ }
302
+ }
303
+ for (let i = 1; i < this.maxObjDepth; i++) {
304
+ num[i] = (num[i] as number) + (num[i - 1] as number);
305
+ }
306
+ for (let i = 0; i < egoSize; i++) {
307
+ this.egoTable.push({ index: 0, level: 0, prob2: 0, prob3: 0 });
308
+ }
309
+ for (const ego of reg.egos) {
310
+ if (!ego.allocProb) continue;
311
+ const minLevel = ego.allocMin;
312
+ const y = minLevel > 0 ? (num[minLevel - 1] as number) : 0;
313
+ const z = y + (levelTotal[minLevel] as number);
314
+ const entry = this.egoTable[z] as EgoAllocEntry;
315
+ entry.index = ego.eidx;
316
+ entry.level = minLevel;
317
+ entry.prob2 = ego.allocProb;
318
+ entry.prob3 = ego.allocProb;
319
+ levelTotal[minLevel] = (levelTotal[minLevel] as number) + 1;
320
+ }
321
+
322
+ /* init_money_svals. */
323
+ for (const kind of reg.kinds) {
324
+ if (kind.tval === TV.GOLD) {
325
+ this.moneyTypes.push({ name: kind.name, type: kind.sval });
326
+ }
327
+ }
328
+ }
329
+
330
+ /**
331
+ * binary_search_probtable: index i with tbl[i] <= p < tbl[i + 1].
332
+ */
333
+ private static binarySearchProbtable(
334
+ tbl: Uint32Array,
335
+ offset: number,
336
+ n: number,
337
+ p: number,
338
+ ): number {
339
+ let ilow = 0;
340
+ let ihigh = n;
341
+ for (;;) {
342
+ if (ilow === ihigh - 1) return ilow;
343
+ const imid = ilow + Math.trunc((ihigh - ilow) / 2);
344
+ if ((tbl[offset + imid] as number) <= p) {
345
+ ilow = imid;
346
+ } else {
347
+ ihigh = imid;
348
+ }
349
+ }
350
+ }
351
+
352
+ /** get_obj_num_by_kind: choose a kind of the given tval at a level. */
353
+ private getObjNumByKind(
354
+ rng: Rng,
355
+ level: number,
356
+ good: boolean,
357
+ tval: number,
358
+ ): ObjectKind | null {
359
+ const objects = good ? this.objAllocGreat : this.objAlloc;
360
+ const totals = good ? this.objTotalTvalGreat : this.objTotalTval;
361
+ const total = totals[level * TV_MAX + tval] as number;
362
+ if (!total) return null;
363
+
364
+ let value = rng.randint0(total);
365
+ const row = level * (this.kMax + 1);
366
+ let item = 0;
367
+ for (; item < this.kMax; item++) {
368
+ if ((this.reg.kinds[item] as ObjectKind).tval === tval) {
369
+ const prob =
370
+ (objects[row + item + 1] as number) - (objects[row + item] as number);
371
+ if (value < prob) break;
372
+ value -= prob;
373
+ }
374
+ }
375
+ return this.reg.kinds[item] ?? null;
376
+ }
377
+
378
+ /**
379
+ * get_obj_num: choose an object kind for a dungeon level; tval 0
380
+ * allows any type. Includes the occasional great_obj level boost.
381
+ */
382
+ getObjNum(
383
+ rng: Rng,
384
+ constants: Constants,
385
+ level: number,
386
+ good: boolean,
387
+ tval: number,
388
+ ): ObjectKind | null {
389
+ /* Occasional level boost */
390
+ if (level > 0 && rng.oneIn(constants.greatObj)) {
391
+ /* What a bizarre calculation */
392
+ level =
393
+ 1 +
394
+ Math.trunc(
395
+ (level * this.maxObjDepth) / rng.randint1(this.maxObjDepth),
396
+ );
397
+ }
398
+
399
+ /* Paranoia */
400
+ level = Math.min(level, this.maxObjDepth);
401
+ level = Math.max(level, 0);
402
+
403
+ if (tval) return this.getObjNumByKind(rng, level, good, tval);
404
+
405
+ const objects = good ? this.objAllocGreat : this.objAlloc;
406
+ const row = level * (this.kMax + 1);
407
+
408
+ if (!(objects[row + this.kMax] as number)) return null;
409
+ const value = rng.randint0(objects[row + this.kMax] as number);
410
+
411
+ const item = ObjAllocState.binarySearchProbtable(
412
+ objects,
413
+ row,
414
+ this.kMax + 1,
415
+ value,
416
+ );
417
+ return this.reg.kinds[item] ?? null;
418
+ }
419
+
420
+ /**
421
+ * ego_find_random: select an ego that fits the object's kind. Mutates
422
+ * prob3 per entry exactly as upstream does.
423
+ */
424
+ egoFindRandom(rng: Rng, obj: GameObject, level: number): EgoItem | null {
425
+ let total = 0;
426
+ for (const entry of this.egoTable) {
427
+ const ego = this.reg.egos[entry.index] as EgoItem;
428
+ entry.prob3 = 0;
429
+ if (level <= ego.allocMax) {
430
+ const oodChance = Math.max(2, Math.trunc((ego.allocMin - level) / 3));
431
+ if (level >= ego.allocMin || rng.oneIn(oodChance)) {
432
+ if (ego.possItems.has(obj.kind.kidx)) {
433
+ entry.prob3 = entry.prob2;
434
+ }
435
+ total += entry.prob3;
436
+ }
437
+ }
438
+ }
439
+
440
+ if (total) {
441
+ let value = rng.randint0(total);
442
+ for (const entry of this.egoTable) {
443
+ if (value < entry.prob3) {
444
+ return this.reg.egos[entry.index] as EgoItem;
445
+ }
446
+ value -= entry.prob3;
447
+ }
448
+ }
449
+ return null;
450
+ }
451
+
452
+ /** money_kind: a money kind by name, or level-appropriate. */
453
+ moneyKind(constants: Constants, name: string, value: number): ObjectKind {
454
+ /* (Roughly) the largest possible gold drop at max depth. */
455
+ const maxGoldDrop = 3 * constants.maxDepth + 30;
456
+
457
+ let rank = 0;
458
+ for (; rank < this.moneyTypes.length; rank++) {
459
+ if ((this.moneyTypes[rank] as MoneyType).name === name) break;
460
+ }
461
+
462
+ if (rank === this.moneyTypes.length) {
463
+ rank = Math.trunc(
464
+ (Math.trunc((value * 100) / maxGoldDrop) * this.moneyTypes.length) /
465
+ 100,
466
+ );
467
+ }
468
+ if (rank >= this.moneyTypes.length) rank = this.moneyTypes.length - 1;
469
+
470
+ const kind = this.reg.lookupKind(
471
+ TV.GOLD,
472
+ (this.moneyTypes[rank] as MoneyType).type,
473
+ );
474
+ if (!kind) throw new Error("make: no gold kinds bound");
475
+ return kind;
476
+ }
477
+ }
478
+
479
+ /* ------------------------------------------------------------------ */
480
+ /* Ego magic */
481
+ /* ------------------------------------------------------------------ */
482
+
483
+ /**
484
+ * get_new_attr: choose a random flag from newf not already in flags
485
+ * (reservoir sampling), or 0 when none is available.
486
+ */
487
+ export function getNewAttr(rng: Rng, flags: FlagSet, newf: FlagSet): number {
488
+ let options = 0;
489
+ let flag = 0;
490
+ for (const f of newf) {
491
+ if (flags.has(f)) continue;
492
+ if (rng.oneIn(++options)) flag = f;
493
+ }
494
+ return flag;
495
+ }
496
+
497
+ /** random_base_resist: a random unresisted base element, or -1. */
498
+ function randomBaseResist(rng: Rng, obj: GameObject): number {
499
+ let count = 0;
500
+ for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
501
+ if ((obj.elInfo[i] as ElementInfo).resLevel === 0) count++;
502
+ }
503
+ if (count === 0) return -1;
504
+ let r = rng.randint0(count);
505
+ for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
506
+ if ((obj.elInfo[i] as ElementInfo).resLevel !== 0) continue;
507
+ if (r === 0) return i;
508
+ r--;
509
+ }
510
+ return -1;
511
+ }
512
+
513
+ /** random_high_resist: a random unresisted high element, or -1. */
514
+ function randomHighResist(rng: Rng, obj: GameObject): number {
515
+ let count = 0;
516
+ for (let i = ELEM_HIGH_MIN; i < ELEM_HIGH_MAX; i++) {
517
+ if ((obj.elInfo[i] as ElementInfo).resLevel === 0) count++;
518
+ }
519
+ if (count === 0) return -1;
520
+ let r = rng.randint0(count);
521
+ for (let i = ELEM_HIGH_MIN; i < ELEM_HIGH_MAX; i++) {
522
+ if ((obj.elInfo[i] as ElementInfo).resLevel !== 0) continue;
523
+ if (r === 0) return i;
524
+ r--;
525
+ }
526
+ return -1;
527
+ }
528
+
529
+ /**
530
+ * create_obj_flag_mask (obj-properties.c): a flag set of all FLAG
531
+ * properties whose subtype (id=false) or id_type (id=true) is in the
532
+ * given list.
533
+ */
534
+ export function createObjFlagMask(
535
+ properties: readonly (ObjectProperty | null)[],
536
+ id: boolean,
537
+ ...types: number[]
538
+ ): FlagSet {
539
+ const f = new FlagSet(OF_SIZE);
540
+ for (const t of types) {
541
+ for (let j = 1; j < properties.length; j++) {
542
+ const prop = properties[j] as ObjectProperty;
543
+ if (prop.type !== OBJ_PROPERTY.FLAG) continue;
544
+ if ((id && prop.idType === t) || (!id && prop.subtype === t)) {
545
+ f.on(prop.propIndex);
546
+ }
547
+ }
548
+ }
549
+ return f;
550
+ }
551
+
552
+ /**
553
+ * ego_apply_magic: apply generation magic to an ego item.
554
+ */
555
+ export function egoApplyMagic(
556
+ rng: Rng,
557
+ reg: ObjRegistry,
558
+ obj: GameObject,
559
+ level: number,
560
+ ): void {
561
+ const ego = obj.ego;
562
+ if (!ego) return;
563
+ let pick = 0;
564
+ let resist = -1;
565
+
566
+ /* Resist or power? */
567
+ if (ego.kindFlags.has(KF.RAND_RES_POWER)) pick = rng.randint1(3);
568
+
569
+ /* Extra powers */
570
+ if (ego.kindFlags.has(KF.RAND_SUSTAIN)) {
571
+ const newf = createObjFlagMask(reg.properties, false, OFT.SUST);
572
+ const flag = getNewAttr(rng, obj.flags, newf);
573
+ /* Upstream of_on with flag 0 is UB; guard (never happens live). */
574
+ if (flag !== 0) obj.flags.on(flag);
575
+ } else if (ego.kindFlags.has(KF.RAND_POWER) || pick === 1) {
576
+ const newf = createObjFlagMask(reg.properties, false, OFT.PROT, OFT.MISC);
577
+ const flag = getNewAttr(rng, obj.flags, newf);
578
+ if (flag !== 0) obj.flags.on(flag);
579
+ } else if (ego.kindFlags.has(KF.RAND_BASE_RES) || pick > 1) {
580
+ /* Get a base resist if available, mark it as random */
581
+ resist = randomBaseResist(rng, obj);
582
+ if (resist >= 0) {
583
+ const info = obj.elInfo[resist] as ElementInfo;
584
+ info.resLevel = 1;
585
+ info.flags |= EL_INFO_RANDOM | EL_INFO_IGNORE;
586
+ }
587
+ } else if (ego.kindFlags.has(KF.RAND_HI_RES)) {
588
+ /* Get a high resist if available, mark it as random */
589
+ resist = randomHighResist(rng, obj);
590
+ if (resist >= 0) {
591
+ const info = obj.elInfo[resist] as ElementInfo;
592
+ info.resLevel = 1;
593
+ info.flags |= EL_INFO_RANDOM | EL_INFO_IGNORE;
594
+ }
595
+ }
596
+
597
+ /* Apply extra ego bonuses */
598
+ obj.toH += rng.randcalc(ego.toH, level, "randomise");
599
+ obj.toD += rng.randcalc(ego.toD, level, "randomise");
600
+ obj.toA += rng.randcalc(ego.toA, level, "randomise");
601
+
602
+ /* Apply modifiers */
603
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
604
+ const x = rng.randcalc(ego.modifiers[i] as RandomValue, level, "randomise");
605
+ obj.modifiers[i] = (obj.modifiers[i] as number) + x;
606
+ }
607
+
608
+ /* Apply flags */
609
+ obj.flags.union(ego.flags);
610
+ obj.flags.diff(ego.flagsOff);
611
+
612
+ /* Add slays, brands and curses */
613
+ obj.slays = copySlays(obj.slays, ego.slays, reg.slays);
614
+ obj.brands = copyBrands(obj.brands, ego.brands, reg.brands);
615
+ copyCurses(rng, obj, ego.curses, reg.curses);
616
+
617
+ /* Add resists */
618
+ for (let i = 0; i < ELEM_MAX; i++) {
619
+ const dst = obj.elInfo[i] as ElementInfo;
620
+ const src = ego.elInfo[i] as ElementInfo;
621
+ dst.resLevel = Math.max(src.resLevel, dst.resLevel);
622
+ dst.flags |= src.flags;
623
+ }
624
+
625
+ /* Add activation (ego's activation will trump object's, if any). */
626
+ if (ego.activation) {
627
+ obj.activation = ego.activation;
628
+ obj.time = { ...ego.time };
629
+ }
630
+ }
631
+
632
+ /** ego_apply_minima: apply minimum standards for ego items. */
633
+ export function egoApplyMinima(obj: GameObject): void {
634
+ const ego = obj.ego;
635
+ if (!ego) return;
636
+
637
+ if (ego.minToH !== NO_MINIMUM && obj.toH < ego.minToH) obj.toH = ego.minToH;
638
+ if (ego.minToD !== NO_MINIMUM && obj.toD < ego.minToD) obj.toD = ego.minToD;
639
+ if (ego.minToA !== NO_MINIMUM && obj.toA < ego.minToA) obj.toA = ego.minToA;
640
+
641
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
642
+ if ((obj.modifiers[i] as number) < (ego.minModifiers[i] as number)) {
643
+ obj.modifiers[i] = ego.minModifiers[i] as number;
644
+ }
645
+ }
646
+ }
647
+
648
+ /**
649
+ * make_ego_item: try to find an ego for the object and apply it.
650
+ */
651
+ export function makeEgoItem(
652
+ rng: Rng,
653
+ reg: ObjRegistry,
654
+ alloc: ObjAllocState,
655
+ constants: Constants,
656
+ obj: GameObject,
657
+ level: number,
658
+ ): void {
659
+ /* Cannot further improve artifacts or ego items */
660
+ if (obj.artifact || obj.ego) return;
661
+
662
+ /* Occasionally boost the generation level of an item */
663
+ if (level > 0 && rng.oneIn(constants.greatEgo)) {
664
+ level =
665
+ 1 +
666
+ Math.trunc((level * constants.maxDepth) / rng.randint1(constants.maxDepth));
667
+ if (level >= constants.maxDepth) level = constants.maxDepth - 1;
668
+ }
669
+
670
+ obj.ego = alloc.egoFindRandom(rng, obj, level);
671
+ if (obj.ego) egoApplyMagic(rng, reg, obj, level);
672
+ }
673
+
674
+ /* ------------------------------------------------------------------ */
675
+ /* Artifacts */
676
+ /* ------------------------------------------------------------------ */
677
+
678
+ /**
679
+ * copy_artifact_data: copy artifact data onto a prepped object.
680
+ */
681
+ export function copyArtifactData(
682
+ rng: Rng,
683
+ reg: ObjRegistry,
684
+ obj: GameObject,
685
+ art: Artifact,
686
+ ): void {
687
+ const kind = reg.lookupKind(art.tval, art.sval);
688
+
689
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
690
+ obj.modifiers[i] = art.modifiers[i] as number;
691
+ }
692
+ obj.ac = art.ac;
693
+ obj.dd = art.dd;
694
+ obj.ds = art.ds;
695
+ obj.toA = art.toA;
696
+ obj.toH = art.toH;
697
+ obj.toD = art.toD;
698
+ obj.weight = art.weight;
699
+
700
+ /* Activations can come from the artifact or the kind */
701
+ if (art.activation) {
702
+ obj.activation = art.activation;
703
+ obj.time = { ...art.time };
704
+ } else if (kind?.activation) {
705
+ obj.activation = kind.activation;
706
+ obj.time = { ...kind.time };
707
+ }
708
+
709
+ /* Fix for artifact lights */
710
+ obj.flags.off(OF.TAKES_FUEL);
711
+ obj.flags.off(OF.BURNS_OUT);
712
+
713
+ /* Timeouts are always 0 */
714
+ obj.timeout = 0;
715
+
716
+ obj.flags.union(art.flags);
717
+ obj.slays = copySlays(obj.slays, art.slays, reg.slays);
718
+ obj.brands = copyBrands(obj.brands, art.brands, reg.brands);
719
+ copyCurses(rng, obj, art.curses, reg.curses);
720
+ for (let i = 0; i < ELEM_MAX; i++) {
721
+ const dst = obj.elInfo[i] as ElementInfo;
722
+ const src = art.elInfo[i] as ElementInfo;
723
+ if (src.resLevel !== 0) dst.resLevel = src.resLevel;
724
+ dst.flags |= src.flags;
725
+ }
726
+ }
727
+
728
+ /**
729
+ * aup_info[] (object.h struct artifact_upkeep; obj-util.c
730
+ * is_artifact_created / mark_artifact_created): the per-artifact
731
+ * "created" flags, indexed by aidx (1-based; index 0 unused, matching the
732
+ * null placeholder in ObjRegistry.artifacts). One shared instance per
733
+ * game, serialized in the save (save.c/load.c) and reset to all-false at
734
+ * birth (player-birth.c reset_artifacts).
735
+ */
736
+ export class ArtifactState {
737
+ private readonly created: boolean[];
738
+ private readonly seen: boolean[];
739
+ private readonly everseen: boolean[];
740
+
741
+ constructor(count: number) {
742
+ this.created = new Array<boolean>(count).fill(false);
743
+ this.seen = new Array<boolean>(count).fill(false);
744
+ this.everseen = new Array<boolean>(count).fill(false);
745
+ }
746
+
747
+ /** is_artifact_created(art). */
748
+ isCreated(aidx: number): boolean {
749
+ return this.created[aidx] ?? false;
750
+ }
751
+
752
+ /** mark_artifact_created(art, created). */
753
+ markCreated(aidx: number, created: boolean): void {
754
+ this.created[aidx] = created;
755
+ }
756
+
757
+ /** is_artifact_seen / mark_artifact_seen (obj-util.c:1197-1229). */
758
+ isSeen(aidx: number): boolean {
759
+ return this.seen[aidx] ?? false;
760
+ }
761
+
762
+ markSeen(aidx: number, seen: boolean): void {
763
+ this.seen[aidx] = seen;
764
+ }
765
+
766
+ /** is_artifact_everseen / mark_artifact_everseen (obj-util.c:1206-1238). */
767
+ isEverseen(aidx: number): boolean {
768
+ return this.everseen[aidx] ?? false;
769
+ }
770
+
771
+ markEverseen(aidx: number, everseen: boolean): void {
772
+ this.everseen[aidx] = everseen;
773
+ }
774
+
775
+ /** A copy of the flags for serialization. */
776
+ snapshot(): boolean[] {
777
+ return [...this.created];
778
+ }
779
+
780
+ /** The complete aup_info[] field set written by save.c:674-688. */
781
+ snapshotState(): {
782
+ created: boolean[];
783
+ seen: boolean[];
784
+ everseen: boolean[];
785
+ } {
786
+ return {
787
+ created: [...this.created],
788
+ seen: [...this.seen],
789
+ everseen: [...this.everseen],
790
+ };
791
+ }
792
+
793
+ /** Rebuild from serialized flags (load.c). */
794
+ static restore(
795
+ data:
796
+ | readonly boolean[]
797
+ | {
798
+ created: readonly boolean[];
799
+ seen?: readonly boolean[];
800
+ everseen?: readonly boolean[];
801
+ },
802
+ ): ArtifactState {
803
+ const state = Array.isArray(data)
804
+ ? null
805
+ : (data as {
806
+ created: readonly boolean[];
807
+ seen?: readonly boolean[];
808
+ everseen?: readonly boolean[];
809
+ });
810
+ const created: readonly boolean[] = state
811
+ ? state.created
812
+ : (data as readonly boolean[]);
813
+ const s = new ArtifactState(created.length);
814
+ for (let i = 0; i < created.length; i++) {
815
+ s.markCreated(i, created[i] ?? false);
816
+ if (state) {
817
+ s.markSeen(i, state.seen?.[i] ?? false);
818
+ s.markEverseen(i, state.everseen?.[i] ?? false);
819
+ }
820
+ }
821
+ return s;
822
+ }
823
+
824
+ /** reset_artifacts at birth: clear every created flag. */
825
+ reset(): void {
826
+ this.created.fill(false);
827
+ this.seen.fill(false);
828
+ }
829
+ }
830
+
831
+ /**
832
+ * make_artifact_special (obj-make.c:578): try to create one of the
833
+ * special (KF_INSTA_ART) artifacts. Scans the artifact list in aidx
834
+ * ascending order; the first candidate that survives the birth/depth/
835
+ * created/tval/rarity filters is prepped from its base kind, stamped with
836
+ * the artifact's fixed data, marked created, and returned.
837
+ *
838
+ * The C `level` parameter is vestigial (the body uses player->depth and
839
+ * art->alloc_min instead), so the port takes `depth` and drops it.
840
+ *
841
+ * RNG order per surviving candidate: randint0((alloc_min-depth)*2) only
842
+ * when alloc_min > depth, then randint1(100) for the rarity roll, then on
843
+ * success object_prep(RANDOMISE) followed by copy_artifact_data's
844
+ * curse-timeout draws.
845
+ */
846
+ export function makeArtifactSpecial(
847
+ rng: Rng,
848
+ deps: MakeDeps,
849
+ depth: number,
850
+ tval: number,
851
+ ): GameObject | null {
852
+ const { reg, constants } = deps;
853
+
854
+ /* No artifacts, do nothing */
855
+ if (deps.noArtifacts) return null;
856
+
857
+ /* No artifacts in the town */
858
+ if (depth <= 0) return null;
859
+
860
+ /* Check the special artifacts */
861
+ for (let i = 1; i < reg.artifacts.length; i++) {
862
+ const art = reg.artifacts[i];
863
+ if (!art) continue;
864
+ const kind = reg.lookupKind(art.tval, art.sval);
865
+
866
+ /* Skip "empty" artifacts */
867
+ if (!art.name) continue;
868
+
869
+ /* Make sure the kind was found */
870
+ if (!kind) continue;
871
+
872
+ /* Make sure it's the right tval (if given) */
873
+ if (tval && tval !== art.tval) continue;
874
+
875
+ /* Skip non-special artifacts */
876
+ if (!kind.kindFlags.has(KF.INSTA_ART)) continue;
877
+
878
+ /* Cannot make an artifact twice */
879
+ if (deps.artifacts.isCreated(art.aidx)) continue;
880
+
881
+ /* Enforce minimum "depth" (loosely) */
882
+ if (art.allocMin > depth) {
883
+ const d = (art.allocMin - depth) * 2;
884
+ if (rng.randint0(d) !== 0) continue;
885
+ }
886
+
887
+ /* Enforce maximum depth (strictly) */
888
+ if (art.allocMax < depth) continue;
889
+
890
+ /* Artifact "rarity roll" */
891
+ if (rng.randint1(100) > art.allocProb) continue;
892
+
893
+ /* Assign the template */
894
+ const obj = objectPrep(rng, reg, constants, kind, art.allocMin, "randomise");
895
+
896
+ /* Mark the item as an artifact */
897
+ obj.artifact = art;
898
+
899
+ /* Copy across all the data from the artifact struct */
900
+ copyArtifactData(rng, reg, obj, art);
901
+
902
+ /* Mark the artifact as "created" */
903
+ deps.artifacts.markCreated(art.aidx, true);
904
+
905
+ return obj;
906
+ }
907
+
908
+ return null;
909
+ }
910
+
911
+ /**
912
+ * make_artifact (obj-make.c:655): try to promote an already-prepped
913
+ * object into a matching non-special artifact (tval AND sval match).
914
+ * Only apply_magic calls this. The scan halts on the first match (the C
915
+ * for-loop condition `!obj->artifact`); the object is NOT re-prepped
916
+ * (make_object already prepped it before apply_magic ran).
917
+ *
918
+ * RNG order per surviving candidate matches make_artifact_special: the
919
+ * out-of-depth roll (only when alloc_min > depth) then the rarity roll;
920
+ * on success copy_artifact_data draws the artifact's curse timeouts.
921
+ */
922
+ export function makeArtifact(
923
+ rng: Rng,
924
+ deps: MakeDeps,
925
+ obj: GameObject,
926
+ depth: number,
927
+ ): boolean {
928
+ const { reg } = deps;
929
+
930
+ /* Make sure birth no artifacts isn't set */
931
+ if (deps.noArtifacts) return false;
932
+
933
+ /* No artifacts in the town */
934
+ if (depth <= 0) return false;
935
+
936
+ /* Paranoia -- no "plural" artifacts */
937
+ if (obj.number !== 1) return false;
938
+
939
+ /* Check the artifact list (skip the "specials") */
940
+ for (let i = 1; !obj.artifact && i < reg.artifacts.length; i++) {
941
+ const art = reg.artifacts[i];
942
+ if (!art) continue;
943
+ const kind = reg.lookupKind(art.tval, art.sval);
944
+
945
+ /* Skip "empty" items */
946
+ if (!art.name) continue;
947
+
948
+ /* Make sure the kind was found */
949
+ if (!kind) continue;
950
+
951
+ /* Skip special artifacts */
952
+ if (kind.kindFlags.has(KF.INSTA_ART)) continue;
953
+
954
+ /* Cannot make an artifact twice */
955
+ if (deps.artifacts.isCreated(art.aidx)) continue;
956
+
957
+ /* Must have the correct fields */
958
+ if (art.tval !== obj.tval) continue;
959
+ if (art.sval !== obj.sval) continue;
960
+
961
+ /* Enforce minimum "depth" (loosely) */
962
+ if (art.allocMin > depth) {
963
+ const d = (art.allocMin - depth) * 2;
964
+ if (rng.randint0(d) !== 0) continue;
965
+ }
966
+
967
+ /* Enforce maximum depth (strictly) */
968
+ if (art.allocMax < depth) continue;
969
+
970
+ /* We must make the "rarity roll" */
971
+ if (rng.randint1(100) > art.allocProb) continue;
972
+
973
+ /* Mark the item as an artifact */
974
+ obj.artifact = art;
975
+ }
976
+
977
+ if (obj.artifact) {
978
+ /* The artifact-commit seam (mod/hooks.ts artifactCommit). An object handed to
979
+ * make_artifact that ALREADY carries an artifact skips the selection loop's
980
+ * `!obj->artifact` scan, so this is the one point where a caller could commit
981
+ * the same artifact twice. Faithful 4.2.6 commits it unconditionally and that
982
+ * is what core does; a mod may refuse, and refusing clears the artifact and
983
+ * reports failure.
984
+ *
985
+ * RNG-FREE by contract - this runs on the main object stream. */
986
+ if (
987
+ deps.hooks?.artifactCommit?.(
988
+ obj.artifact.aidx,
989
+ deps.artifacts.isCreated(obj.artifact.aidx),
990
+ ) === false
991
+ ) {
992
+ obj.artifact = null;
993
+ return false;
994
+ }
995
+ copyArtifactData(rng, reg, obj, obj.artifact);
996
+ deps.artifacts.markCreated(obj.artifact.aidx, true);
997
+ return true;
998
+ }
999
+
1000
+ return false;
1001
+ }
1002
+
1003
+ /* ------------------------------------------------------------------ */
1004
+ /* apply_magic */
1005
+ /* ------------------------------------------------------------------ */
1006
+
1007
+ /** apply_magic_weapon. */
1008
+ export function applyMagicWeapon(
1009
+ rng: Rng,
1010
+ obj: GameObject,
1011
+ level: number,
1012
+ power: number,
1013
+ ): void {
1014
+ if (power <= 0) return;
1015
+
1016
+ obj.toH += rng.randint1(5) + rng.mBonus(5, level);
1017
+ obj.toD += rng.randint1(5) + rng.mBonus(5, level);
1018
+
1019
+ if (power > 1) {
1020
+ obj.toH += rng.mBonus(10, level);
1021
+ obj.toD += rng.mBonus(10, level);
1022
+
1023
+ if (tvalIsMeleeWeapon(obj.tval)) {
1024
+ /* Super-charge the damage dice */
1025
+ while (obj.dd * obj.ds > 0 && rng.oneIn(4 * obj.dd * obj.ds)) {
1026
+ /* More dice or sides means more likely to get still more */
1027
+ if (rng.randint0(obj.dd + obj.ds) < obj.dd) {
1028
+ let newdice = rng.randint1(2 + Math.trunc(obj.dd / obj.ds));
1029
+ while ((obj.dd + 1) * obj.ds <= 40 && newdice) {
1030
+ if (!rng.oneIn(3)) obj.dd++;
1031
+ newdice--;
1032
+ }
1033
+ } else {
1034
+ let newsides = rng.randint1(2 + Math.trunc(obj.ds / obj.dd));
1035
+ while (obj.dd * (obj.ds + 1) <= 40 && newsides) {
1036
+ if (!rng.oneIn(3)) obj.ds++;
1037
+ newsides--;
1038
+ }
1039
+ }
1040
+ }
1041
+ } else if (tvalIsAmmo(obj.tval)) {
1042
+ /* Up to two chances to enhance damage dice. */
1043
+ if (rng.oneIn(6)) {
1044
+ obj.ds++;
1045
+ if (rng.oneIn(10)) {
1046
+ obj.ds++;
1047
+ }
1048
+ }
1049
+ }
1050
+ }
1051
+ }
1052
+
1053
+ /** apply_magic_armour. */
1054
+ export function applyMagicArmour(
1055
+ rng: Rng,
1056
+ obj: GameObject,
1057
+ level: number,
1058
+ power: number,
1059
+ ): void {
1060
+ if (power <= 0) return;
1061
+ obj.toA += rng.randint1(5) + rng.mBonus(5, level);
1062
+ if (power > 1) obj.toA += rng.mBonus(10, level);
1063
+ }
1064
+
1065
+ /**
1066
+ * apply_curse (obj-make.c): try to curse an object, increasing its
1067
+ * effective generation level in exchange.
1068
+ */
1069
+ export function applyCurse(
1070
+ rng: Rng,
1071
+ reg: ObjRegistry,
1072
+ obj: GameObject,
1073
+ lev: number,
1074
+ timedFoil?: CurseTimedFoil,
1075
+ ): number {
1076
+ let maxCurses = rng.randint1(4);
1077
+ const power = rng.randint1(9) + 10 * rng.mBonus(9, lev);
1078
+ let newLev = lev;
1079
+
1080
+ if (obj.flags.has(OF.BLESSED)) return lev;
1081
+
1082
+ while (maxCurses--) {
1083
+ /* Try to curse it */
1084
+ let tries = 3;
1085
+ while (tries--) {
1086
+ const pick = rng.randint1(reg.curseMax - 1);
1087
+ const curse = reg.curses[pick];
1088
+ if (curse && curse.poss[obj.tval]) {
1089
+ if (appendObjectCurse(rng, obj, pick, power, reg.curses, timedFoil)) {
1090
+ newLev += rng.randint1(1 + Math.trunc(power / 10));
1091
+ }
1092
+ break;
1093
+ }
1094
+ }
1095
+ }
1096
+
1097
+ return newLev;
1098
+ }
1099
+
1100
+ /** Everything applyMagic/makeObject need, bundled. */
1101
+ export interface MakeDeps {
1102
+ reg: ObjRegistry;
1103
+ alloc: ObjAllocState;
1104
+ constants: Constants;
1105
+ /**
1106
+ * aup_info[]: the shared per-artifact created flags. MUST be the single
1107
+ * instance owned by the game so every generation path (dungeon levels,
1108
+ * loot, effects, stores) marks the same flags and no artifact spawns
1109
+ * twice.
1110
+ */
1111
+ artifacts: ArtifactState;
1112
+ /** OPT(player, birth_no_artifacts): suppress all artifact creation. */
1113
+ noArtifacts: boolean;
1114
+ /**
1115
+ * The mod behaviour seam (mod/hooks.ts), threaded so the pure obj layer can
1116
+ * offer its extension point without a GameState. Only `artifactCommit` is
1117
+ * consulted here. Absent => creation is faithful 4.2.6.
1118
+ */
1119
+ hooks?: import("../mod/hooks.js").ModHooks | undefined;
1120
+ /**
1121
+ * The player-timed failure tables (timed effect NAME -> fail directives),
1122
+ * for append_object_curse's TIMED_INC foil rejection (obj-curse.c L159-188).
1123
+ * Built by the game from the bound TimedEffect[] (name -> fail). Absent =>
1124
+ * the foil branch is skipped (faithful pre-4.8 behaviour). See gap 3.2.
1125
+ */
1126
+ timedFoil?: CurseTimedFoil | undefined;
1127
+ /**
1128
+ * obj_kind_can_browse(kind) for the current player (obj-tval.c): whether the
1129
+ * player's class can read/browse the spellbook kind. make_object rejects most
1130
+ * books the player cannot read (obj-make.c L1187-1194). Absent => every book
1131
+ * is browsable (faithful when no class is bound). See gap 3.5.
1132
+ */
1133
+ canBrowseBook?: ((kind: ObjectKind) => boolean) | undefined;
1134
+ /**
1135
+ * OPT(player, birth_no_selling): with no-selling on, make_gold inflates the
1136
+ * value 5x in the dungeon (obj-make.c L1310-1312). Absent/false => faithful
1137
+ * default. See gap 3.7.
1138
+ */
1139
+ noSelling?: boolean | undefined;
1140
+ }
1141
+
1142
+ /**
1143
+ * apply_magic: ego creation and random bonuses. Returns 0 for a normal
1144
+ * object, 1 good, 2 ego, 3 artifact.
1145
+ *
1146
+ * `depth` is the player/chunk depth make_artifact tests against (0 in
1147
+ * town); it is distinct from the object creation level `lev`.
1148
+ */
1149
+ export function applyMagic(
1150
+ rng: Rng,
1151
+ deps: MakeDeps,
1152
+ obj: GameObject,
1153
+ lev: number,
1154
+ allowArtifacts: boolean,
1155
+ good: boolean,
1156
+ great: boolean,
1157
+ extraRoll: boolean,
1158
+ depth: number,
1159
+ ): number {
1160
+ const { reg, alloc, constants } = deps;
1161
+ let power = 0;
1162
+ const goodChance = 33 + lev;
1163
+ const greatChance = 30;
1164
+
1165
+ /* Roll for "good" */
1166
+ if (good || rng.randint0(100) < goodChance) {
1167
+ power = 1;
1168
+ /* Roll for "great" */
1169
+ if (great || rng.randint0(100) < greatChance) power = 2;
1170
+ }
1171
+
1172
+ /* Roll for artifact creation */
1173
+ if (allowArtifacts) {
1174
+ let rolls = 0;
1175
+ if (power >= 2) rolls = 1;
1176
+ if (great) rolls = 2;
1177
+ if (extraRoll) rolls += 2;
1178
+ for (let i = 0; i < rolls; i++) {
1179
+ if (makeArtifact(rng, deps, obj, depth)) return 3;
1180
+ }
1181
+ }
1182
+
1183
+ /* Try to make an ego item */
1184
+ if (power === 2) makeEgoItem(rng, reg, alloc, constants, obj, lev);
1185
+
1186
+ /* Give it a chance to be cursed */
1187
+ if (rng.oneIn(20) && tvalIsWearable(obj.tval)) {
1188
+ lev = applyCurse(rng, reg, obj, lev, deps.timedFoil);
1189
+ }
1190
+
1191
+ /* Apply magic */
1192
+ if (tvalIsWeapon(obj.tval)) {
1193
+ applyMagicWeapon(rng, obj, lev, power);
1194
+ } else if (tvalIsArmor(obj.tval)) {
1195
+ applyMagicArmour(rng, obj, lev, power);
1196
+ } else if (tvalIsRing(obj.tval)) {
1197
+ if (obj.sval === reg.lookupSval(obj.tval, "Speed")) {
1198
+ /* Super-charge the ring */
1199
+ while (rng.oneIn(2)) {
1200
+ obj.modifiers[OBJ_MOD_SPEED] = (obj.modifiers[OBJ_MOD_SPEED] as number) + 1;
1201
+ }
1202
+ }
1203
+ } else if (tvalIsChest(obj.tval)) {
1204
+ obj.pval = pickChestTraps(rng, obj);
1205
+ }
1206
+
1207
+ /* Apply minima from ego items if necessary */
1208
+ egoApplyMinima(obj);
1209
+
1210
+ return power;
1211
+ }
1212
+
1213
+ /** OBJ_MOD_SPEED index (STR..CON are 0..4, then the modifier list). */
1214
+ const OBJ_MOD_SPEED = OBJ_MOD.SPEED;
1215
+
1216
+ /**
1217
+ * make_object's `int32_t *value` out-parameter: the object's real value
1218
+ * (object_value_real), boosted 20% per level out-of-depth for uncursed
1219
+ * objects. A faithful transcription of the C out-parameter (mutated in
1220
+ * place; omitted entirely when the caller passes nothing, drawing no extra
1221
+ * work). gen-util.c place_object reads this as the level-feeling `rating`.
1222
+ */
1223
+ export interface MakeObjectRating {
1224
+ value: number;
1225
+ }
1226
+
1227
+ /* ------------------------------------------------------------------ */
1228
+ /* make_object / make_gold */
1229
+ /* ------------------------------------------------------------------ */
1230
+
1231
+ /**
1232
+ * make_object: attempt to make an object at a creation level.
1233
+ *
1234
+ * Live: the special-artifact chance roll (the attempt itself is the
1235
+ * deferred stub, so failing it upgrades the drop to `good` exactly as
1236
+ * upstream does when no special artifact can be made), kind selection,
1237
+ * prep, apply_magic, stack generation, and (when `outValue` is supplied)
1238
+ * the *value out-parameter with its out-of-depth boost. DEFERRED: book
1239
+ * rejection (needs the player class).
1240
+ */
1241
+ export function makeObject(
1242
+ rng: Rng,
1243
+ deps: MakeDeps,
1244
+ lev: number,
1245
+ good: boolean,
1246
+ great: boolean,
1247
+ extraRoll: boolean,
1248
+ tval: number,
1249
+ depth: number,
1250
+ outValue?: MakeObjectRating,
1251
+ ): GameObject | null {
1252
+ const { reg, alloc, constants } = deps;
1253
+
1254
+ /* Try to make a special artifact */
1255
+ if (rng.oneIn(good ? 10 : 1000)) {
1256
+ const special = makeArtifactSpecial(rng, deps, depth, tval);
1257
+ if (special) {
1258
+ if (outValue) outValue.value = objectValueReal(reg, special, 1);
1259
+ return special;
1260
+ }
1261
+ /* If we failed to make an artifact, the player gets a good item */
1262
+ good = true;
1263
+ }
1264
+
1265
+ /* Base level for the object */
1266
+ const base = good ? lev + 10 : lev;
1267
+
1268
+ /* Try to choose an object kind; reject most books the player can't read
1269
+ * (obj-make.c L1185-1195). Each rejected book costs a get_obj_num draw and,
1270
+ * one time in five, is accepted anyway. Without a class predicate
1271
+ * (deps.canBrowseBook) every book is browsable and the loop takes its first
1272
+ * pick, matching a class-less caller. */
1273
+ let kind: ObjectKind | null = null;
1274
+ let tries = 3;
1275
+ while (tries) {
1276
+ kind = alloc.getObjNum(rng, constants, base, good || great, tval);
1277
+ if (
1278
+ kind &&
1279
+ deps.canBrowseBook &&
1280
+ tvalIsBook(kind.tval) &&
1281
+ !deps.canBrowseBook(kind)
1282
+ ) {
1283
+ if (rng.oneIn(5)) break;
1284
+ kind = null;
1285
+ tries--;
1286
+ continue;
1287
+ } else {
1288
+ break;
1289
+ }
1290
+ }
1291
+ if (!kind) return null;
1292
+
1293
+ /* Make the object, prep it and apply magic */
1294
+ const obj = objectPrep(rng, reg, constants, kind, lev, "randomise");
1295
+ applyMagic(rng, deps, obj, lev, true, good, great, extraRoll, depth);
1296
+
1297
+ /* Generate multiple items */
1298
+ if (!obj.artifact && kind.genMultProb >= rng.randint1(100)) {
1299
+ obj.number = rng.randcalc(kind.stackSize, lev, "randomise");
1300
+ }
1301
+ if (obj.number > obj.kind.base.maxStack) {
1302
+ obj.number = obj.kind.base.maxStack;
1303
+ }
1304
+
1305
+ /* Get the value, and boost 20% per level OOD for uncursed objects
1306
+ * (obj-make.c make_object L1211-1231). Draws no RNG. */
1307
+ if (outValue) {
1308
+ outValue.value = objectValueReal(reg, obj, obj.number);
1309
+
1310
+ if (!obj.curses && kind.allocMin > depth) {
1311
+ const ood = kind.allocMin - depth;
1312
+ const frac = Math.trunc(Math.max(outValue.value, 0) / 5);
1313
+ const adj =
1314
+ frac <= Math.trunc(INT_MAX / ood) ? ood * frac : INT_MAX;
1315
+ outValue.value =
1316
+ outValue.value <= INT_MAX - adj ? outValue.value + adj : INT_MAX;
1317
+ }
1318
+ }
1319
+
1320
+ return obj;
1321
+ }
1322
+
1323
+ /** C SHRT_MAX, the gold pval cap. */
1324
+ const SHRT_MAX = 32767;
1325
+
1326
+ /**
1327
+ * make_gold: make a money object.
1328
+ *
1329
+ * `playerDepth` is upstream's player->depth (0 in town), used only for the
1330
+ * birth_no_selling inflation (obj-make.c L1310-1312: value *= 5 when no-selling
1331
+ * is on and the player is in the dungeon). It is distinct from `lev` (the
1332
+ * generation level driving the value roll); when omitted it defaults to `lev`,
1333
+ * which equals the current level's depth at every real call site.
1334
+ */
1335
+ export function makeGold(
1336
+ rng: Rng,
1337
+ deps: MakeDeps,
1338
+ lev: number,
1339
+ coinType: string,
1340
+ playerDepth?: number,
1341
+ ): GameObject {
1342
+ const { reg, alloc, constants } = deps;
1343
+
1344
+ /* This average is 16 at dlev0, 80 at dlev40, 176 at dlev100. */
1345
+ const avg = Math.trunc((16 * lev) / 10) + 16;
1346
+ const spread = lev + 10;
1347
+ let value = rng.randSpread(avg, spread);
1348
+
1349
+ /* Increase the range to infinite, moving the average to 110% */
1350
+ while (rng.oneIn(100) && value * 10 <= SHRT_MAX) value *= 10;
1351
+
1352
+ const kind = alloc.moneyKind(constants, coinType, value);
1353
+ const newGold = objectPrep(rng, reg, constants, kind, lev, "randomise");
1354
+
1355
+ /* If we're playing with no_selling, increase the value (obj-make.c
1356
+ * L1310-1312). money_kind above is chosen on the pre-inflation value. */
1357
+ const depth = playerDepth ?? lev;
1358
+ if (deps.noSelling && depth) value *= 5;
1359
+
1360
+ /* Cap gold at max short */
1361
+ if (value >= SHRT_MAX) {
1362
+ value = SHRT_MAX - rng.randint0(200);
1363
+ }
1364
+ newGold.pval = value;
1365
+
1366
+ return newGold;
1367
+ }