@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,1296 @@
1
+ /**
2
+ * The live object instance (struct object from reference/src/object.h)
3
+ * plus the pure pile/stacking helpers from obj-pile.c and the slay,
4
+ * brand, and curse copy helpers from obj-slays.c and obj-curse.c
5
+ * (Angband 4.2.6).
6
+ *
7
+ * DEFERRED (ledgered in parity/ledger/obj-model.yaml):
8
+ * - The known/unknown split (obj->known and the whole knowledge system,
9
+ * obj-knowledge.c). GameObject has no `known` twin yet; stacking rules
10
+ * that read player knowledge run as if everything were known:
11
+ * - object_similar's OSTACK_LIST kind-vs-known-kind checks,
12
+ * - the object_fully_known comparison for wearables in list mode,
13
+ * - object_absorb_merge's known-object bookkeeping.
14
+ * - object_is_equipped: there is no player gear yet, so the equipped
15
+ * checks at the top of object_similar are skipped.
16
+ * - origin_race unique-favouring in object_origin_combine takes an
17
+ * isUnique callback (defaults to "not unique") until the monster
18
+ * domain lands.
19
+ * - append_object_curse's "effect foiled by an existing property" check
20
+ * consumes the player-timed failure tables (timed_effects[].fail) when a
21
+ * CurseTimedFoil is supplied (see curseTimedIncFoiled); callers with no
22
+ * timed data fall back to the conflict and conflict-flag checks only.
23
+ *
24
+ * Held/holder references are numeric handles (0 = none), grids are Loc
25
+ * or null; piles are managed by the world layer, so the prev/next
26
+ * doubly-linked pile pointers of upstream are not part of GameObject.
27
+ */
28
+
29
+ import type { FlagSet } from "../bitflag.js";
30
+ import { ELEM, OF, TV } from "../generated/index.js";
31
+ import { addGuardi16 } from "../guard.js";
32
+ import type { Loc } from "../loc.js";
33
+ import type { RandomValue, Rng } from "../rng.js";
34
+ import type {
35
+ Activation,
36
+ Artifact,
37
+ Brand,
38
+ Curse,
39
+ EffectRecordJson,
40
+ EgoItem,
41
+ ElementInfo,
42
+ ObjectKind,
43
+ Slay,
44
+ } from "./types.js";
45
+ import {
46
+ EL_INFO_HATES,
47
+ EL_INFO_IGNORE,
48
+ ELEM_MAX,
49
+ MAX_PVAL,
50
+ newElemInfo,
51
+ newOfFlags,
52
+ OBJ_MOD_MAX,
53
+ zeroRv,
54
+ } from "./types.js";
55
+
56
+ /* ------------------------------------------------------------------ */
57
+ /* tval predicates (obj-tval.c), on numeric tvals */
58
+ /* ------------------------------------------------------------------ */
59
+
60
+ export function tvalIsStaff(tval: number): boolean {
61
+ return tval === TV.STAFF;
62
+ }
63
+ export function tvalIsWand(tval: number): boolean {
64
+ return tval === TV.WAND;
65
+ }
66
+ export function tvalIsRod(tval: number): boolean {
67
+ return tval === TV.ROD;
68
+ }
69
+ export function tvalIsPotion(tval: number): boolean {
70
+ return tval === TV.POTION;
71
+ }
72
+ export function tvalIsScroll(tval: number): boolean {
73
+ return tval === TV.SCROLL;
74
+ }
75
+ export function tvalIsFood(tval: number): boolean {
76
+ return tval === TV.FOOD;
77
+ }
78
+ export function tvalIsMushroom(tval: number): boolean {
79
+ return tval === TV.MUSHROOM;
80
+ }
81
+ export function tvalIsLight(tval: number): boolean {
82
+ return tval === TV.LIGHT;
83
+ }
84
+ export function tvalIsRing(tval: number): boolean {
85
+ return tval === TV.RING;
86
+ }
87
+ export function tvalIsChest(tval: number): boolean {
88
+ return tval === TV.CHEST;
89
+ }
90
+ export function tvalIsFuel(tval: number): boolean {
91
+ return tval === TV.FLASK;
92
+ }
93
+ export function tvalIsMoney(tval: number): boolean {
94
+ return tval === TV.GOLD;
95
+ }
96
+ export function tvalIsDigger(tval: number): boolean {
97
+ return tval === TV.DIGGING;
98
+ }
99
+ export function tvalCanHaveNourishment(tval: number): boolean {
100
+ return tval === TV.FOOD || tval === TV.POTION || tval === TV.MUSHROOM;
101
+ }
102
+ export function tvalCanHaveCharges(tval: number): boolean {
103
+ return tval === TV.STAFF || tval === TV.WAND;
104
+ }
105
+ export function tvalCanHaveTimeout(tval: number): boolean {
106
+ return tval === TV.ROD;
107
+ }
108
+ export function tvalIsBodyArmor(tval: number): boolean {
109
+ return (
110
+ tval === TV.SOFT_ARMOR || tval === TV.HARD_ARMOR || tval === TV.DRAG_ARMOR
111
+ );
112
+ }
113
+ export function tvalIsHeadArmor(tval: number): boolean {
114
+ return tval === TV.HELM || tval === TV.CROWN;
115
+ }
116
+ export function tvalIsAmmo(tval: number): boolean {
117
+ return tval === TV.SHOT || tval === TV.ARROW || tval === TV.BOLT;
118
+ }
119
+ export function tvalIsSharpMissile(tval: number): boolean {
120
+ return tval === TV.ARROW || tval === TV.BOLT;
121
+ }
122
+ /** tval_is_bolt (obj-tval.c L165): EF_BRAND_BOLTS' item_tester. */
123
+ export function tvalIsBolt(tval: number): boolean {
124
+ return tval === TV.BOLT;
125
+ }
126
+ export function tvalIsLauncher(tval: number): boolean {
127
+ return tval === TV.BOW;
128
+ }
129
+ export function tvalIsUseable(tval: number): boolean {
130
+ switch (tval) {
131
+ case TV.ROD:
132
+ case TV.WAND:
133
+ case TV.STAFF:
134
+ case TV.SCROLL:
135
+ case TV.POTION:
136
+ case TV.FOOD:
137
+ case TV.MUSHROOM:
138
+ return true;
139
+ default:
140
+ return false;
141
+ }
142
+ }
143
+ export function tvalCanHaveFailure(tval: number): boolean {
144
+ return tval === TV.STAFF || tval === TV.WAND || tval === TV.ROD;
145
+ }
146
+ export function tvalIsJewelry(tval: number): boolean {
147
+ return tval === TV.RING || tval === TV.AMULET;
148
+ }
149
+ /**
150
+ * tval_has_variable_power (obj-tval.c L256): items whose value/price depends on
151
+ * individual properties (weapons, launchers, ammo, armour, jewelry, lights),
152
+ * so object_value_real prices them by object_power rather than a flat cost.
153
+ */
154
+ export function tvalHasVariablePower(tval: number): boolean {
155
+ switch (tval) {
156
+ case TV.SHOT:
157
+ case TV.ARROW:
158
+ case TV.BOLT:
159
+ case TV.BOW:
160
+ case TV.DIGGING:
161
+ case TV.HAFTED:
162
+ case TV.POLEARM:
163
+ case TV.SWORD:
164
+ case TV.BOOTS:
165
+ case TV.GLOVES:
166
+ case TV.HELM:
167
+ case TV.CROWN:
168
+ case TV.SHIELD:
169
+ case TV.CLOAK:
170
+ case TV.SOFT_ARMOR:
171
+ case TV.HARD_ARMOR:
172
+ case TV.DRAG_ARMOR:
173
+ case TV.LIGHT:
174
+ case TV.AMULET:
175
+ case TV.RING:
176
+ return true;
177
+ default:
178
+ return false;
179
+ }
180
+ }
181
+ export function tvalIsWeapon(tval: number): boolean {
182
+ switch (tval) {
183
+ case TV.SWORD:
184
+ case TV.HAFTED:
185
+ case TV.POLEARM:
186
+ case TV.DIGGING:
187
+ case TV.BOW:
188
+ case TV.BOLT:
189
+ case TV.ARROW:
190
+ case TV.SHOT:
191
+ return true;
192
+ default:
193
+ return false;
194
+ }
195
+ }
196
+ export function tvalIsArmor(tval: number): boolean {
197
+ switch (tval) {
198
+ case TV.DRAG_ARMOR:
199
+ case TV.HARD_ARMOR:
200
+ case TV.SOFT_ARMOR:
201
+ case TV.SHIELD:
202
+ case TV.CLOAK:
203
+ case TV.CROWN:
204
+ case TV.HELM:
205
+ case TV.BOOTS:
206
+ case TV.GLOVES:
207
+ return true;
208
+ default:
209
+ return false;
210
+ }
211
+ }
212
+ export function tvalIsMeleeWeapon(tval: number): boolean {
213
+ return (
214
+ tval === TV.SWORD ||
215
+ tval === TV.HAFTED ||
216
+ tval === TV.POLEARM ||
217
+ tval === TV.DIGGING
218
+ );
219
+ }
220
+ export function tvalIsWearable(tval: number): boolean {
221
+ switch (tval) {
222
+ case TV.BOW:
223
+ case TV.DIGGING:
224
+ case TV.HAFTED:
225
+ case TV.POLEARM:
226
+ case TV.SWORD:
227
+ case TV.BOOTS:
228
+ case TV.GLOVES:
229
+ case TV.HELM:
230
+ case TV.CROWN:
231
+ case TV.SHIELD:
232
+ case TV.CLOAK:
233
+ case TV.SOFT_ARMOR:
234
+ case TV.HARD_ARMOR:
235
+ case TV.DRAG_ARMOR:
236
+ case TV.LIGHT:
237
+ case TV.AMULET:
238
+ case TV.RING:
239
+ return true;
240
+ default:
241
+ return false;
242
+ }
243
+ }
244
+ export function tvalIsEdible(tval: number): boolean {
245
+ return tval === TV.FOOD || tval === TV.MUSHROOM;
246
+ }
247
+ export function tvalCanHaveFlavor(tval: number): boolean {
248
+ switch (tval) {
249
+ case TV.AMULET:
250
+ case TV.RING:
251
+ case TV.STAFF:
252
+ case TV.WAND:
253
+ case TV.ROD:
254
+ case TV.POTION:
255
+ case TV.MUSHROOM:
256
+ case TV.SCROLL:
257
+ return true;
258
+ default:
259
+ return false;
260
+ }
261
+ }
262
+ export function tvalIsBook(tval: number): boolean {
263
+ switch (tval) {
264
+ case TV.MAGIC_BOOK:
265
+ case TV.PRAYER_BOOK:
266
+ case TV.NATURE_BOOK:
267
+ case TV.SHADOW_BOOK:
268
+ case TV.OTHER_BOOK:
269
+ return true;
270
+ default:
271
+ return false;
272
+ }
273
+ }
274
+ export function tvalIsZapper(tval: number): boolean {
275
+ return tval === TV.WAND || tval === TV.STAFF;
276
+ }
277
+
278
+ /* ------------------------------------------------------------------ */
279
+ /* struct object */
280
+ /* ------------------------------------------------------------------ */
281
+
282
+ /** struct curse_data: per-object curse power and timeout. */
283
+ export interface CurseData {
284
+ power: number;
285
+ timeout: number;
286
+ }
287
+
288
+ /**
289
+ * struct object. The known twin, pile links, and oidx list index are
290
+ * deferred; see module docs.
291
+ */
292
+ export interface GameObject {
293
+ kind: ObjectKind;
294
+ ego: EgoItem | null;
295
+ artifact: Artifact | null;
296
+ /** Position on the map, or null when held. */
297
+ grid: Loc | null;
298
+ tval: number;
299
+ sval: number;
300
+ pval: number;
301
+ /** obj->known->pval for a chest trap discovered by passive search. */
302
+ knownPval?: number;
303
+ weight: number;
304
+ dd: number;
305
+ ds: number;
306
+ ac: number;
307
+ toA: number;
308
+ toH: number;
309
+ toD: number;
310
+ flags: FlagSet;
311
+ modifiers: number[];
312
+ elInfo: ElementInfo[];
313
+ brands: boolean[] | null;
314
+ slays: boolean[] | null;
315
+ curses: CurseData[] | null;
316
+ /** Raw effect chain shared with the kind (effects domain binds it). */
317
+ effect: EffectRecordJson[] | null;
318
+ effectMsg: string;
319
+ activation: Activation | null;
320
+ time: RandomValue;
321
+ timeout: number;
322
+ number: number;
323
+ notice: number;
324
+ /** Monster holding us (handle, 0 = none). */
325
+ heldMIdx: number;
326
+ /** Monster mimicking us (handle, 0 = none). */
327
+ mimickingMIdx: number;
328
+ /** ORIGIN_* value. */
329
+ origin: number;
330
+ originDepth: number;
331
+ /** Monster race handle that dropped it (0 = none). */
332
+ originRace: number;
333
+ /** Inscription, or null (upstream quark). */
334
+ note: string | null;
335
+ }
336
+
337
+ /** A blank object (OBJECT_NULL / object_new); kind must be set later. */
338
+ export function objectNew(kind: ObjectKind): GameObject {
339
+ return {
340
+ kind,
341
+ ego: null,
342
+ artifact: null,
343
+ grid: null,
344
+ tval: 0,
345
+ sval: 0,
346
+ pval: 0,
347
+ weight: 0,
348
+ dd: 0,
349
+ ds: 0,
350
+ ac: 0,
351
+ toA: 0,
352
+ toH: 0,
353
+ toD: 0,
354
+ flags: newOfFlags(),
355
+ modifiers: new Array<number>(OBJ_MOD_MAX).fill(0),
356
+ elInfo: newElemInfo(),
357
+ brands: null,
358
+ slays: null,
359
+ curses: null,
360
+ effect: null,
361
+ effectMsg: "",
362
+ activation: null,
363
+ time: zeroRv(),
364
+ timeout: 0,
365
+ number: 0,
366
+ notice: 0,
367
+ heldMIdx: 0,
368
+ mimickingMIdx: 0,
369
+ origin: 0,
370
+ originDepth: 0,
371
+ originRace: 0,
372
+ note: null,
373
+ };
374
+ }
375
+
376
+ /**
377
+ * object_copy (obj-pile.c L713): prepare a fresh object as a copy of `src`.
378
+ * Upstream memcpy's the whole struct, then deep-copies the heap-allocated
379
+ * slay, brand and curse arrays and detaches the pile links (prev/next). This
380
+ * port models a pile as world-layer state (GameObject carries no prev/next),
381
+ * so the "detach" is implicit; every per-instance array C stores inline in
382
+ * struct object (flags, modifiers, el_info) or on the heap (slays, brands,
383
+ * curses) is cloned so the copy shares no mutable state with the source, while
384
+ * the content-registry pointers (kind, ego, artifact, and the kind-owned
385
+ * effect chain and activation) stay shared exactly as the memcpy'd pointers
386
+ * do. Draws no RNG.
387
+ *
388
+ * DEFERRED: the obj->known twin (obj-knowledge.c) is not modelled in this port
389
+ * (see the module docs), so the known-object half of become_aware's copy
390
+ * (mon-util.c L745-750) has nothing to copy here.
391
+ */
392
+ export function objectCopy(src: GameObject): GameObject {
393
+ return {
394
+ kind: src.kind,
395
+ ego: src.ego,
396
+ artifact: src.artifact,
397
+ grid: src.grid ? { ...src.grid } : null,
398
+ tval: src.tval,
399
+ sval: src.sval,
400
+ pval: src.pval,
401
+ ...(src.knownPval !== undefined ? { knownPval: src.knownPval } : {}),
402
+ weight: src.weight,
403
+ dd: src.dd,
404
+ ds: src.ds,
405
+ ac: src.ac,
406
+ toA: src.toA,
407
+ toH: src.toH,
408
+ toD: src.toD,
409
+ flags: src.flags.clone(),
410
+ modifiers: [...src.modifiers],
411
+ elInfo: src.elInfo.map((e) => ({ ...e })),
412
+ brands: src.brands ? [...src.brands] : null,
413
+ slays: src.slays ? [...src.slays] : null,
414
+ curses: src.curses ? src.curses.map((c) => ({ ...c })) : null,
415
+ effect: src.effect,
416
+ effectMsg: src.effectMsg,
417
+ activation: src.activation,
418
+ time: { ...src.time },
419
+ timeout: src.timeout,
420
+ number: src.number,
421
+ notice: src.notice,
422
+ heldMIdx: src.heldMIdx,
423
+ mimickingMIdx: src.mimickingMIdx,
424
+ origin: src.origin,
425
+ originDepth: src.originDepth,
426
+ originRace: src.originRace,
427
+ note: src.note,
428
+ };
429
+ }
430
+
431
+ /* ------------------------------------------------------------------ */
432
+ /* obj-slays.c copy helpers */
433
+ /* ------------------------------------------------------------------ */
434
+
435
+ /** same_monsters_slain. */
436
+ export function sameMonstersSlain(
437
+ slays: readonly (Slay | null)[],
438
+ slay1: number,
439
+ slay2: number,
440
+ ): boolean {
441
+ const a = slays[slay1] as Slay;
442
+ const b = slays[slay2] as Slay;
443
+ if (a.raceFlag !== b.raceFlag) return false;
444
+ if (!a.base && !b.base) return true;
445
+ if ((a.base && !b.base) || (!a.base && b.base)) return false;
446
+ return a.base === b.base;
447
+ }
448
+
449
+ /**
450
+ * copy_slays: union source into dest (allocating if needed), then drop
451
+ * the lower-multiplier duplicate of any pair slaying the same monsters.
452
+ */
453
+ export function copySlays(
454
+ dest: boolean[] | null,
455
+ source: boolean[] | null,
456
+ slays: readonly (Slay | null)[],
457
+ ): boolean[] | null {
458
+ if (!source) return dest;
459
+ const out = dest ?? new Array<boolean>(slays.length).fill(false);
460
+ for (let i = 0; i < slays.length; i++) {
461
+ if (source[i]) out[i] = true;
462
+ }
463
+ for (let i = 1; i < slays.length; i++) {
464
+ for (let j = 1; j < i; j++) {
465
+ if (out[i] && out[j] && sameMonstersSlain(slays, i, j)) {
466
+ if ((slays[i] as Slay).multiplier < (slays[j] as Slay).multiplier) {
467
+ out[i] = false;
468
+ } else {
469
+ out[j] = false;
470
+ }
471
+ }
472
+ }
473
+ }
474
+ return out;
475
+ }
476
+
477
+ /** copy_brands: as copySlays, deduping on brand name. */
478
+ export function copyBrands(
479
+ dest: boolean[] | null,
480
+ source: boolean[] | null,
481
+ brands: readonly (Brand | null)[],
482
+ ): boolean[] | null {
483
+ if (!source) return dest;
484
+ const out = dest ?? new Array<boolean>(brands.length).fill(false);
485
+ for (let i = 0; i < brands.length; i++) {
486
+ if (source[i]) out[i] = true;
487
+ }
488
+ for (let i = 1; i < brands.length; i++) {
489
+ for (let j = 1; j < i; j++) {
490
+ if (
491
+ out[i] &&
492
+ out[j] &&
493
+ (brands[i] as Brand).name === (brands[j] as Brand).name
494
+ ) {
495
+ if ((brands[i] as Brand).multiplier < (brands[j] as Brand).multiplier) {
496
+ out[i] = false;
497
+ } else {
498
+ out[j] = false;
499
+ }
500
+ }
501
+ }
502
+ }
503
+ return out;
504
+ }
505
+
506
+ /* ------------------------------------------------------------------ */
507
+ /* obj-curse.c */
508
+ /* ------------------------------------------------------------------ */
509
+
510
+ /**
511
+ * copy_curses: copy template curse powers onto an object, rolling each
512
+ * new curse's timeout from the curse's time dice.
513
+ */
514
+ export function copyCurses(
515
+ rng: Rng,
516
+ obj: GameObject,
517
+ source: number[] | null,
518
+ curses: readonly (Curse | null)[],
519
+ ): void {
520
+ if (!source) return;
521
+ if (!obj.curses) {
522
+ obj.curses = newCurseData(curses.length);
523
+ }
524
+ for (let i = 0; i < curses.length; i++) {
525
+ const power = source[i];
526
+ if (!power) continue;
527
+ const data = obj.curses[i] as CurseData;
528
+ data.power = power;
529
+ data.timeout = rng.randcalc(
530
+ (curses[i] as Curse).obj.time,
531
+ 0,
532
+ "randomise",
533
+ );
534
+ }
535
+ }
536
+
537
+ function newCurseData(n: number): CurseData[] {
538
+ const out: CurseData[] = [];
539
+ for (let i = 0; i < n; i++) out.push({ power: 0, timeout: 0 });
540
+ return out;
541
+ }
542
+
543
+ /** curses_are_equal. */
544
+ export function cursesAreEqual(obj1: GameObject, obj2: GameObject): boolean {
545
+ if (!obj1.curses && !obj2.curses) return true;
546
+ if (!obj1.curses || !obj2.curses) return false;
547
+ const n = Math.max(obj1.curses.length, obj2.curses.length);
548
+ for (let i = 0; i < n; i++) {
549
+ if ((obj1.curses[i]?.power ?? 0) !== (obj2.curses[i]?.power ?? 0)) {
550
+ return false;
551
+ }
552
+ }
553
+ return true;
554
+ }
555
+
556
+ /** curses_conflict: is `second` in the conflict list of `first`? */
557
+ export function cursesConflict(
558
+ curses: readonly (Curse | null)[],
559
+ first: number,
560
+ second: number,
561
+ ): boolean {
562
+ const c = curses[first] as Curse;
563
+ if (!c.conflict) return false;
564
+ return c.conflict.includes(`|${(curses[second] as Curse).name}|`);
565
+ }
566
+
567
+ /** check_object_curses: drop the array when no curse is active. */
568
+ function checkObjectCurses(obj: GameObject): void {
569
+ if (!obj.curses) return;
570
+ for (const c of obj.curses) {
571
+ if (c.power) return;
572
+ }
573
+ obj.curses = null;
574
+ }
575
+
576
+ /** TMD_FAIL_ codes (player-timed.h) checked by the curse foil branch. */
577
+ const TMD_FAIL_FLAG_OBJECT = 1;
578
+ const TMD_FAIL_FLAG_RESIST = 2;
579
+ const TMD_FAIL_FLAG_VULN = 3;
580
+
581
+ /** One player-timed fail directive (player/types.ts TimedFail): code + flag. */
582
+ export interface TimedFailLike {
583
+ /** TMD_FAIL_FLAG_* code (only OBJECT/RESIST/VULN are consulted here). */
584
+ code: number;
585
+ /** OF_ (object flag) or ELEM_ (element) name, without the prefix. */
586
+ flag: string;
587
+ }
588
+
589
+ /**
590
+ * The player-timed failure tables the curse foil check reads, keyed by a
591
+ * timed effect's subtype NAME (the TIMED_INC effect record's `type` field,
592
+ * e.g. "POISONED"). Maps that name to the effect's `fail` directives. Built by
593
+ * the game from the bound TimedEffect[] (player/bind.ts): each entry's
594
+ * `.name -> .fail`. Kept as a plain map so the obj layer needs no player import.
595
+ */
596
+ export type CurseTimedFoil = ReadonlyMap<string, readonly TimedFailLike[]>;
597
+
598
+ /**
599
+ * Build the CurseTimedFoil map from the bound player-timed table (upstream
600
+ * timed_effects[]: the curse checks index it by the TIMED_INC subtype). Keyed
601
+ * by effect NAME because the port's curse effect records carry the subtype as
602
+ * its name string ("POISONED"). One-liner for the game wiring; draws no RNG.
603
+ */
604
+ export function buildCurseTimedFoil(
605
+ timed: readonly { name: string; fail: readonly TimedFailLike[] }[],
606
+ ): CurseTimedFoil {
607
+ const map = new Map<string, readonly TimedFailLike[]>();
608
+ for (const t of timed) map.set(t.name, t.fail);
609
+ return map;
610
+ }
611
+
612
+ /**
613
+ * curse_conflicts helper for the TIMED_INC foil branch of append_object_curse
614
+ * (obj-curse.c L159-188) and artifact_curse_conflicts (L267-296): a curse whose
615
+ * effect is TIMED_INC is rejected when an existing property of the item would
616
+ * foil that timed effect - the item already has the OF flag the effect fails
617
+ * against (TMD_FAIL_FLAG_OBJECT), resists the element it fails against
618
+ * (TMD_FAIL_FLAG_RESIST), or is vulnerable to it (TMD_FAIL_FLAG_VULN). Codes
619
+ * TMD_FAIL_FLAG_PLAYER/TIMED_EFFECT are intentionally not consulted upstream.
620
+ *
621
+ * `flags`/`elInfo` are passed separately so the same check serves a GameObject
622
+ * (append_object_curse) and an Artifact (artifact_curse_conflicts). Draws no RNG.
623
+ */
624
+ export function curseTimedIncFoiled(
625
+ c: Curse,
626
+ flags: FlagSet,
627
+ elInfo: readonly ElementInfo[],
628
+ foil: CurseTimedFoil,
629
+ ): boolean {
630
+ /* c->obj->effect && c->obj->effect->index == effect_lookup("TIMED_INC"):
631
+ * upstream inspects only the head effect of the curse's chain. */
632
+ const eff = c.obj.effect?.[0];
633
+ if (!eff || eff.eff !== "TIMED_INC") return false;
634
+ const subtype = eff.type;
635
+ if (subtype === undefined) return false;
636
+ const fails = foil.get(subtype);
637
+ if (!fails) return false;
638
+
639
+ for (const f of fails) {
640
+ if (f.code === TMD_FAIL_FLAG_OBJECT) {
641
+ const idx = OF[f.flag as keyof typeof OF];
642
+ if (idx !== undefined && flags.has(idx)) return true;
643
+ } else if (f.code === TMD_FAIL_FLAG_RESIST) {
644
+ const el = ELEM[f.flag as keyof typeof ELEM];
645
+ if (el !== undefined && (elInfo[el]?.resLevel ?? 0) > 0) return true;
646
+ } else if (f.code === TMD_FAIL_FLAG_VULN) {
647
+ const el = ELEM[f.flag as keyof typeof ELEM];
648
+ if (el !== undefined && (elInfo[el]?.resLevel ?? 0) < 0) return true;
649
+ }
650
+ }
651
+ return false;
652
+ }
653
+
654
+ /**
655
+ * append_object_curse (obj-curse.c L143): attach curse `pick` at `power`,
656
+ * rejecting a curse that conflicts with an existing curse, is foiled by a
657
+ * property of the object (its TIMED_INC effect fails against a flag/resist the
658
+ * item already has - `timedFoil`, obj-curse.c L159-188), or explicitly
659
+ * conflicts with an object flag. When `timedFoil` is omitted the foil branch is
660
+ * skipped (curse conflict + conflict-flag rejections stay live), matching a
661
+ * caller with no player-timed data.
662
+ */
663
+ export function appendObjectCurse(
664
+ rng: Rng,
665
+ obj: GameObject,
666
+ pick: number,
667
+ power: number,
668
+ curses: readonly (Curse | null)[],
669
+ timedFoil?: CurseTimedFoil,
670
+ ): boolean {
671
+ const c = curses[pick] as Curse;
672
+ if (!obj.curses) obj.curses = newCurseData(curses.length);
673
+
674
+ /* Reject conflicting curses */
675
+ for (let i = 0; i < curses.length; i++) {
676
+ if ((obj.curses[i] as CurseData | undefined)?.power &&
677
+ cursesConflict(curses, i, pick)) {
678
+ checkObjectCurses(obj);
679
+ return false;
680
+ }
681
+ }
682
+
683
+ /* Reject curses with effects foiled by an existing object property
684
+ * (obj-curse.c L159-188). */
685
+ if (timedFoil && curseTimedIncFoiled(c, obj.flags, obj.elInfo, timedFoil)) {
686
+ checkObjectCurses(obj);
687
+ return false;
688
+ }
689
+
690
+ /* Reject curses which explicitly conflict with an object property */
691
+ for (const flag of c.conflictFlags) {
692
+ if (obj.flags.has(flag)) {
693
+ checkObjectCurses(obj);
694
+ return false;
695
+ }
696
+ }
697
+
698
+ /* Adjust power if our pick is a duplicate */
699
+ const data = obj.curses[pick] as CurseData;
700
+ if (power > data.power) {
701
+ data.power = power;
702
+ data.timeout = rng.randcalc(c.obj.time, 0, "randomise");
703
+ return true;
704
+ }
705
+
706
+ checkObjectCurses(obj);
707
+ return false;
708
+ }
709
+
710
+ /**
711
+ * remove_object_curse (obj-curse.c L219): clear curse `pick` from the
712
+ * object, dropping the curse array if it was the last one. Returns whether
713
+ * the object had that curse.
714
+ *
715
+ * `message` is upstream's third parameter, and it belongs here rather than at
716
+ * the caller: the message is emitted ONLY on the branch that actually removed a
717
+ * curse, so a caller that announces on its own would announce for a curse the
718
+ * object did not have. uncurse_object (effect-handler-general.c L194-195) calls
719
+ * this twice - once on obj->known with false, once on the object with true - and
720
+ * cmd-wizard.c:1051 passes false.
721
+ *
722
+ * The name comes from the global curses[] registry upstream reads directly;
723
+ * object.ts sits below the registry, so the caller supplies the sink.
724
+ */
725
+ export function removeObjectCurse(
726
+ obj: GameObject,
727
+ pick: number,
728
+ message = false,
729
+ env?: {
730
+ readonly curses: readonly (Curse | null)[];
731
+ readonly msg: (text: string) => void;
732
+ },
733
+ ): boolean {
734
+ const c = obj.curses?.[pick];
735
+ if (!c || !c.power) return false;
736
+ c.power = 0;
737
+ c.timeout = 0;
738
+ /* Remove the curses array if that was the last curse. */
739
+ checkObjectCurses(obj);
740
+ if (message && env) {
741
+ env.msg(`The ${env.curses[pick]?.name ?? ""} curse is removed!`);
742
+ }
743
+ return true;
744
+ }
745
+
746
+ /**
747
+ * modify_weight_for_curse (obj-curse.c L382): apply curse `i`'s weight
748
+ * adjustment to `weight`. OF_MULTIPLY_WEIGHT curses scale by
749
+ * curse->obj->weight / 100 (rounded to nearest, coercing to at least 1 when
750
+ * the factor exceeds 1); the rest add curse->obj->weight as a flat delta.
751
+ * Result is clamped to [0, 32767] like the int16_t upstream.
752
+ */
753
+ export function modifyWeightForCurse(
754
+ curses: readonly (Curse | null)[],
755
+ i: number,
756
+ weight: number,
757
+ ): number {
758
+ const curseObj = (curses[i] as Curse).obj;
759
+ let result: number;
760
+ if (curseObj.flags.has(OF.MULTIPLY_WEIGHT)) {
761
+ let scaled = curseObj.weight > 100 ? Math.max(weight, 1) : Math.max(weight, 0);
762
+ scaled *= curseObj.weight;
763
+ const q = Math.trunc(scaled / 100);
764
+ if (q < 32767) {
765
+ result = q;
766
+ if (scaled % 100 >= 50) result++;
767
+ } else {
768
+ result = 32767;
769
+ }
770
+ } else {
771
+ weight = Math.max(0, weight);
772
+ if (curseObj.weight < 0) {
773
+ result = weight + curseObj.weight;
774
+ if (result < 0) result = 0;
775
+ } else {
776
+ result =
777
+ weight < 32767 - curseObj.weight ? weight + curseObj.weight : 32767;
778
+ }
779
+ }
780
+ return result;
781
+ }
782
+
783
+ /**
784
+ * object_weight_one (obj-util.c L276): the weight of a single item, including
785
+ * any active curse's weight adjustment.
786
+ *
787
+ * `curses` is the bound curse table; when it is omitted (combat callers that do
788
+ * not thread it, where objects never carry curses) the curse adjustment is
789
+ * skipped, which is exactly Math.max(weight, 0) for a curse-free object.
790
+ */
791
+ export function objectWeightOne(
792
+ obj: { weight: number; curses: CurseData[] | null },
793
+ curses?: readonly (Curse | null)[] | null,
794
+ ): number {
795
+ let result = Math.max(obj.weight, 0);
796
+ if (obj.curses && curses) {
797
+ for (let i = 1; i < curses.length; i++) {
798
+ if (obj.curses[i]?.power) {
799
+ result = modifyWeightForCurse(curses, i, result);
800
+ }
801
+ }
802
+ }
803
+ return result;
804
+ }
805
+
806
+ /** Sentinel for "vulnerability + resistance" during curse el_info merging. */
807
+ const RES_VULN_AND_RES = -32768;
808
+
809
+ /**
810
+ * apply_curse_attributes (obj-curse.c L450): merge the attributes of every
811
+ * active curse (skipping index `i` when i >= 0) into the base attributes of
812
+ * `obj`, in place. Weight, to_a/to_h/to_d, flags, modifiers and el_info are
813
+ * combined; brands and slays are never merged (the data files cannot give a
814
+ * curse a brand or slay, per upstream). The caller clears obj.curses after,
815
+ * since the curse attributes are now folded directly into the object.
816
+ *
817
+ * The struct field obj.ac would also take curse->obj->ac here, but no curse
818
+ * data directive can set a curse's base AC (it is always 0), so that merge is
819
+ * a guaranteed no-op and CurseObject omits the field.
820
+ */
821
+ export function applyCurseAttributes(
822
+ curses: readonly (Curse | null)[],
823
+ i: number,
824
+ obj: Pick<
825
+ GameObject,
826
+ "weight" | "toA" | "toH" | "toD" | "flags" | "modifiers" | "elInfo" | "curses"
827
+ >,
828
+ ): void {
829
+ if (!obj.curses) return;
830
+
831
+ for (let j = 0; j < curses.length; j++) {
832
+ /* Ignore the requested curse and any that are not active. */
833
+ if (j === i || !obj.curses[j]?.power) continue;
834
+ const curse = curses[j];
835
+ if (!curse) continue;
836
+ const curseObj = curse.obj;
837
+
838
+ /* The curse may modify the object's weight. */
839
+ obj.weight = modifyWeightForCurse(curses, j, obj.weight);
840
+
841
+ /* Curses can adjust the AC, hit and to-dam modifiers. */
842
+ obj.toA = addGuardi16(obj.toA, curseObj.toA);
843
+ obj.toH = addGuardi16(obj.toH, curseObj.toH);
844
+ obj.toD = addGuardi16(obj.toD, curseObj.toD);
845
+
846
+ /* The curse may extend the object's flags. */
847
+ obj.flags.union(curseObj.flags);
848
+
849
+ /* The curse's modifiers combine additively with the object's. */
850
+ for (let k = 0; k < OBJ_MOD_MAX; k++) {
851
+ obj.modifiers[k] = addGuardi16(
852
+ obj.modifiers[k] ?? 0,
853
+ curseObj.modifiers[k] ?? 0,
854
+ );
855
+ }
856
+
857
+ /* Resistances combine with the standard resistance-merge lattice. */
858
+ for (let k = 0; k < ELEM_MAX; k++) {
859
+ const oe = obj.elInfo[k] as ElementInfo;
860
+ const ce = curseObj.elInfo[k] as ElementInfo;
861
+ if (oe.resLevel >= 3) {
862
+ /* Already immune; the curse cannot change that. */
863
+ continue;
864
+ }
865
+ if (oe.resLevel === 1) {
866
+ if (ce.resLevel >= 3) oe.resLevel = 3;
867
+ else if (ce.resLevel < 0) oe.resLevel = RES_VULN_AND_RES;
868
+ } else if (oe.resLevel === RES_VULN_AND_RES) {
869
+ if (ce.resLevel >= 3) oe.resLevel = 3;
870
+ } else if (oe.resLevel < 0) {
871
+ if (ce.resLevel >= 3) oe.resLevel = 3;
872
+ else if (ce.resLevel === 1) oe.resLevel = RES_VULN_AND_RES;
873
+ } else {
874
+ /* No resistance in the base: take whatever the curse has. */
875
+ oe.resLevel = ce.resLevel;
876
+ }
877
+ }
878
+ }
879
+
880
+ /* Vulnerability + resistance nets out to no resistance for the caller. */
881
+ for (let j = 0; j < ELEM_MAX; j++) {
882
+ if ((obj.elInfo[j] as ElementInfo).resLevel === RES_VULN_AND_RES) {
883
+ (obj.elInfo[j] as ElementInfo).resLevel = 0;
884
+ }
885
+ }
886
+ }
887
+
888
+ /* ------------------------------------------------------------------ */
889
+ /* obj-pile.c stacking */
890
+ /* ------------------------------------------------------------------ */
891
+
892
+ /** object_stack_t modes (obj-pile.h). */
893
+ export const OSTACK_NONE = 0;
894
+ export const OSTACK_STORE = 0x01;
895
+ export const OSTACK_PACK = 0x02;
896
+ export const OSTACK_LIST = 0x04;
897
+ export const OSTACK_MONSTER = 0x08;
898
+ export const OSTACK_FLOOR = 0x10;
899
+ export const OSTACK_QUIVER = 0x20;
900
+
901
+ /** The stacking limits objectMergeable needs from z_info. */
902
+ export interface StackLimits {
903
+ quiverSlotSize: number;
904
+ thrownQuiverMult: number;
905
+ }
906
+
907
+ /**
908
+ * object_similar: can one item like obj1 stack with one like obj2,
909
+ * ignoring inscriptions? Player-knowledge inputs are deferred (module
910
+ * docs): the equipped checks are skipped and the OSTACK_LIST known-kind
911
+ * and fully-known comparisons behave as if everything were known.
912
+ */
913
+ export function objectSimilar(
914
+ obj1: GameObject,
915
+ obj2: GameObject,
916
+ _mode: number,
917
+ ): boolean {
918
+ /* DEFERRED: object_is_equipped checks (no player gear yet). */
919
+
920
+ /* Mimicked items do not stack */
921
+ if (obj1.mimickingMIdx || obj2.mimickingMIdx) return false;
922
+
923
+ /* DEFERRED: OSTACK_LIST unknown-item checks (knowledge system). */
924
+
925
+ /* Identical items cannot be stacked */
926
+ if (obj1 === obj2) return false;
927
+
928
+ /* Require identical object kinds */
929
+ if (obj1.kind !== obj2.kind) return false;
930
+
931
+ /* Different flags don't stack */
932
+ if (!obj1.flags.isEqual(obj2.flags)) return false;
933
+
934
+ /* Different elements don't stack */
935
+ for (let i = 0; i < ELEM_MAX; i++) {
936
+ const a = obj1.elInfo[i] as ElementInfo;
937
+ const b = obj2.elInfo[i] as ElementInfo;
938
+ if (a.resLevel !== b.resLevel) return false;
939
+ if (
940
+ (a.flags & (EL_INFO_HATES | EL_INFO_IGNORE)) !==
941
+ (b.flags & (EL_INFO_HATES | EL_INFO_IGNORE))
942
+ ) {
943
+ return false;
944
+ }
945
+ }
946
+
947
+ /* Artifacts never stack */
948
+ if (obj1.artifact || obj2.artifact) return false;
949
+
950
+ /* Analyze the items */
951
+ if (tvalIsChest(obj1.tval)) {
952
+ /* Chests never stack */
953
+ return false;
954
+ } else if (
955
+ tvalIsEdible(obj1.tval) ||
956
+ tvalIsPotion(obj1.tval) ||
957
+ tvalIsScroll(obj1.tval) ||
958
+ tvalIsRod(obj1.tval)
959
+ ) {
960
+ /* Food, potions, scrolls and rods all stack nicely. */
961
+ } else if (tvalCanHaveCharges(obj1.tval) || tvalIsMoney(obj1.tval)) {
962
+ /* Too much gold or too many charges */
963
+ if (obj1.pval + obj2.pval > MAX_PVAL) return false;
964
+ } else if (
965
+ tvalIsWeapon(obj1.tval) ||
966
+ tvalIsArmor(obj1.tval) ||
967
+ tvalIsJewelry(obj1.tval) ||
968
+ tvalIsLight(obj1.tval)
969
+ ) {
970
+ /* Require identical values */
971
+ if (obj1.ac !== obj2.ac) return false;
972
+ if (obj1.dd !== obj2.dd) return false;
973
+ if (obj1.ds !== obj2.ds) return false;
974
+
975
+ /* Require identical bonuses */
976
+ if (obj1.toH !== obj2.toH) return false;
977
+ if (obj1.toD !== obj2.toD) return false;
978
+ if (obj1.toA !== obj2.toA) return false;
979
+
980
+ /* Require all identical modifiers */
981
+ for (let i = 0; i < OBJ_MOD_MAX; i++) {
982
+ if (obj1.modifiers[i] !== obj2.modifiers[i]) return false;
983
+ }
984
+
985
+ /* Require identical ego-item types */
986
+ if (obj1.ego !== obj2.ego) return false;
987
+
988
+ /* Require identical curses */
989
+ if (!cursesAreEqual(obj1, obj2)) return false;
990
+
991
+ /* Hack - Never stack recharging wearables ... */
992
+ if ((obj1.timeout || obj2.timeout) && !tvalIsLight(obj1.tval)) {
993
+ return false;
994
+ }
995
+ /* ... and lights must have same amount of fuel */
996
+ else if (obj1.timeout !== obj2.timeout && tvalIsLight(obj1.tval)) {
997
+ return false;
998
+ }
999
+
1000
+ /* DEFERRED: OSTACK_LIST fully-known mismatch check. */
1001
+ } else {
1002
+ /* Anything else probably okay */
1003
+ }
1004
+
1005
+ return true;
1006
+ }
1007
+
1008
+ /**
1009
+ * The gear view object_pack_total needs, injected so this pure helper stays
1010
+ * free of the player/gear domain (obj-gear.c owns the live gear list).
1011
+ */
1012
+ export interface PackTotalGear {
1013
+ /** p->gear in upstream list order. */
1014
+ gear: readonly GameObject[];
1015
+ /** object_is_equipped(p->body, obj). */
1016
+ isEquipped(obj: GameObject): boolean;
1017
+ /**
1018
+ * gear_to_label(p, obj): 'a'-'z' for pack, '0'-'9' for quiver, equip labels
1019
+ * otherwise; return "" for an unlabelled object (upstream '\0').
1020
+ */
1021
+ gearToLabel(obj: GameObject): string;
1022
+ }
1023
+
1024
+ /**
1025
+ * object_pack_total (obj-gear.c L189): the total number of items in the
1026
+ * player's non-equipped gear that are like `obj`, and the first such stack
1027
+ * (quiver digits taking precedence over pack letters, lowest label first).
1028
+ * `ignoreInscrip` selects object_similar (inscriptions ignored) over
1029
+ * object_stackable. Draws no RNG.
1030
+ */
1031
+ export function objectPackTotal(
1032
+ view: PackTotalGear,
1033
+ obj: GameObject,
1034
+ ignoreInscrip: boolean,
1035
+ ): { total: number; first: GameObject | null } {
1036
+ let total = 0;
1037
+ let first: GameObject | null = null;
1038
+ let firstLabel = "";
1039
+
1040
+ for (const cursor of view.gear) {
1041
+ let like: boolean;
1042
+ if (cursor === obj) {
1043
+ /* object_similar() excludes cursor == obj so if obj is not equipped,
1044
+ * account for it here (L202-207). */
1045
+ like = !view.isEquipped(obj);
1046
+ } else if (ignoreInscrip) {
1047
+ like = objectSimilar(obj, cursor, OSTACK_PACK);
1048
+ } else {
1049
+ like = objectStackable(obj, cursor, OSTACK_PACK);
1050
+ }
1051
+ if (!like) continue;
1052
+
1053
+ total += cursor.number;
1054
+
1055
+ /* Track the first stack (L215-244): quiver digits beat pack letters,
1056
+ * then lowest label wins within each class. */
1057
+ const testLabel = view.gearToLabel(cursor);
1058
+ if (!first) {
1059
+ first = cursor;
1060
+ firstLabel = testLabel;
1061
+ } else if (testLabel >= "a" && testLabel <= "z") {
1062
+ if (
1063
+ firstLabel === "" ||
1064
+ (firstLabel >= "a" && firstLabel <= "z" && testLabel < firstLabel)
1065
+ ) {
1066
+ first = cursor;
1067
+ firstLabel = testLabel;
1068
+ }
1069
+ } else if (testLabel >= "0" && testLabel <= "9") {
1070
+ if (
1071
+ firstLabel === "" ||
1072
+ (firstLabel >= "a" && firstLabel <= "z") ||
1073
+ (firstLabel >= "0" && firstLabel <= "9" && testLabel < firstLabel)
1074
+ ) {
1075
+ first = cursor;
1076
+ firstLabel = testLabel;
1077
+ }
1078
+ }
1079
+ }
1080
+
1081
+ return { total, first };
1082
+ }
1083
+
1084
+ /** object_stackable: object_similar plus compatible inscriptions. */
1085
+ export function objectStackable(
1086
+ obj1: GameObject,
1087
+ obj2: GameObject,
1088
+ mode: number,
1089
+ ): boolean {
1090
+ if (objectSimilar(obj1, obj2, mode)) {
1091
+ return !obj1.note || !obj2.note || obj1.note === obj2.note;
1092
+ }
1093
+ return false;
1094
+ }
1095
+
1096
+ /** object_mergeable: whole stacks can merge into one. */
1097
+ export function objectMergeable(
1098
+ obj1: GameObject,
1099
+ obj2: GameObject,
1100
+ mode: number,
1101
+ limits: StackLimits,
1102
+ ): boolean {
1103
+ const total = obj1.number + obj2.number;
1104
+
1105
+ /* Check against stacking limit - except in stores which absorb anyway */
1106
+ if (!(mode & OSTACK_STORE)) {
1107
+ if (total > obj1.kind.base.maxStack) return false;
1108
+ /* The quiver can impose stricter limits. */
1109
+ if (mode & OSTACK_QUIVER) {
1110
+ if (tvalIsAmmo(obj1.tval)) {
1111
+ if (total > limits.quiverSlotSize) return false;
1112
+ } else {
1113
+ if (
1114
+ total >
1115
+ Math.trunc(limits.quiverSlotSize / limits.thrownQuiverMult)
1116
+ ) {
1117
+ return false;
1118
+ }
1119
+ }
1120
+ }
1121
+ }
1122
+
1123
+ return objectStackable(obj1, obj2, mode);
1124
+ }
1125
+
1126
+ /**
1127
+ * object_origin_combine. The unique-monster favouring needs monster
1128
+ * race data; pass isUnique to supply it (defaults to never-unique).
1129
+ */
1130
+ export function objectOriginCombine(
1131
+ obj1: GameObject,
1132
+ obj2: GameObject,
1133
+ originMixed: number,
1134
+ isUnique: (raceHandle: number) => boolean = () => false,
1135
+ ): void {
1136
+ if (obj1.originRace !== obj2.originRace) {
1137
+ const uniq1 = obj1.originRace !== 0 && isUnique(obj1.originRace);
1138
+ const uniq2 = obj2.originRace !== 0 && isUnique(obj2.originRace);
1139
+ if (uniq1 && !uniq2) {
1140
+ /* Favour keeping record for a unique */
1141
+ } else if (uniq2 && !uniq1) {
1142
+ obj1.origin = obj2.origin;
1143
+ obj1.originDepth = obj2.originDepth;
1144
+ obj1.originRace = obj2.originRace;
1145
+ } else {
1146
+ obj1.origin = originMixed;
1147
+ }
1148
+ } else if (
1149
+ obj1.origin !== obj2.origin ||
1150
+ obj1.originDepth !== obj2.originDepth
1151
+ ) {
1152
+ obj1.origin = originMixed;
1153
+ }
1154
+ }
1155
+
1156
+ /**
1157
+ * object_absorb_merge, minus the known-object bookkeeping (knowledge
1158
+ * system deferred).
1159
+ */
1160
+ function objectAbsorbMerge(
1161
+ obj1: GameObject,
1162
+ obj2: GameObject,
1163
+ originMixed: number,
1164
+ combineChargesTimeouts: boolean,
1165
+ ): void {
1166
+ /* Merge inscriptions */
1167
+ if (obj2.note) obj1.note = obj2.note;
1168
+
1169
+ if (combineChargesTimeouts) {
1170
+ /* Combine timeouts for rod stacking */
1171
+ if (tvalCanHaveTimeout(obj1.tval)) obj1.timeout += obj2.timeout;
1172
+
1173
+ /* Combine pvals for wands and staves */
1174
+ if (tvalCanHaveCharges(obj1.tval) || tvalIsMoney(obj1.tval)) {
1175
+ const total = obj1.pval + obj2.pval;
1176
+ obj1.pval = total >= MAX_PVAL ? MAX_PVAL : total;
1177
+ }
1178
+ }
1179
+
1180
+ objectOriginCombine(obj1, obj2, originMixed);
1181
+ }
1182
+
1183
+ /**
1184
+ * object_absorb: merge two stacks into one, capping at the base's max
1185
+ * stack size. The caller deletes obj2 (upstream frees it and its known
1186
+ * twin here; pile management is the world layer's job in this port).
1187
+ */
1188
+ export function objectAbsorb(
1189
+ obj1: GameObject,
1190
+ obj2: GameObject,
1191
+ originMixed: number,
1192
+ ): void {
1193
+ const total = obj1.number + obj2.number;
1194
+ obj1.number = Math.min(total, obj1.kind.base.maxStack);
1195
+ objectAbsorbMerge(obj1, obj2, originMixed, true);
1196
+ }
1197
+
1198
+ /**
1199
+ * object_absorb_partial: merge a smaller stack into a larger one,
1200
+ * leaving two uneven stacks. Charges distribute in proportion to the
1201
+ * number moved (distribute_charges).
1202
+ */
1203
+ export function objectAbsorbPartial(
1204
+ obj1: GameObject,
1205
+ obj2: GameObject,
1206
+ mode1: number,
1207
+ mode2: number,
1208
+ limits: StackLimits,
1209
+ originMixed: number,
1210
+ ): void {
1211
+ const smallest = Math.min(obj1.number, obj2.number);
1212
+ const largest = Math.max(obj1.number, obj2.number);
1213
+ let newsz1: number;
1214
+ let newsz2: number;
1215
+
1216
+ if (mode1 & OSTACK_QUIVER) {
1217
+ const limit = Math.trunc(
1218
+ limits.quiverSlotSize /
1219
+ (tvalIsAmmo(obj1.tval) ? 1 : limits.thrownQuiverMult),
1220
+ );
1221
+ if (mode2 & OSTACK_QUIVER) {
1222
+ const difference = limit - largest;
1223
+ newsz1 = largest + difference;
1224
+ newsz2 = smallest - difference;
1225
+ } else {
1226
+ newsz1 = limit;
1227
+ newsz2 = largest + smallest - limit;
1228
+ }
1229
+ } else if (mode2 & OSTACK_QUIVER) {
1230
+ const limit = Math.trunc(
1231
+ limits.quiverSlotSize /
1232
+ (tvalIsAmmo(obj2.tval) ? 1 : limits.thrownQuiverMult),
1233
+ );
1234
+ newsz1 = largest + smallest - limit;
1235
+ newsz2 = limit;
1236
+ } else {
1237
+ const difference = obj1.kind.base.maxStack - largest;
1238
+ newsz1 = largest + difference;
1239
+ newsz2 = smallest - difference;
1240
+ }
1241
+
1242
+ distributeCharges(obj2, obj1, obj2.number - newsz2, false);
1243
+ obj1.number = newsz1;
1244
+ obj2.number = newsz2;
1245
+ objectAbsorbMerge(obj1, obj2, originMixed, tvalIsMoney(obj1.tval));
1246
+ }
1247
+
1248
+ /**
1249
+ * distribute_charges (obj-util.c): when amt of source's items move to
1250
+ * dest, allocate charges/timeouts between the two stacks. Rod charge
1251
+ * time uses randcalc AVERAGE on source.time (deterministic).
1252
+ */
1253
+ export function distributeCharges(
1254
+ source: GameObject,
1255
+ dest: GameObject,
1256
+ amt: number,
1257
+ destNew: boolean,
1258
+ ): void {
1259
+ if (tvalCanHaveCharges(source.tval)) {
1260
+ const change = Math.trunc((source.pval * amt) / source.number);
1261
+ if (destNew) {
1262
+ dest.pval = change;
1263
+ } else {
1264
+ dest.pval += change;
1265
+ }
1266
+ if (amt < source.number) {
1267
+ source.pval -= change;
1268
+ }
1269
+ }
1270
+
1271
+ if (tvalCanHaveTimeout(source.tval)) {
1272
+ /* randcalc(source->time, 0, AVERAGE). */
1273
+ const t = source.time;
1274
+ const chargeTime =
1275
+ t.base + Math.trunc((t.dice * (t.sides + 1)) / 2);
1276
+ let maxTime = chargeTime * amt;
1277
+ if (destNew) {
1278
+ dest.timeout = source.timeout > maxTime ? maxTime : source.timeout;
1279
+ if (amt < source.number) {
1280
+ source.timeout -= dest.timeout;
1281
+ }
1282
+ } else {
1283
+ let change = source.timeout > maxTime ? maxTime : source.timeout;
1284
+ maxTime = chargeTime * (dest.number + amt);
1285
+ if (dest.timeout < maxTime) {
1286
+ if (change > maxTime - dest.timeout) {
1287
+ change = maxTime - dest.timeout;
1288
+ }
1289
+ dest.timeout += change;
1290
+ if (amt < source.number) {
1291
+ source.timeout -= change;
1292
+ }
1293
+ }
1294
+ }
1295
+ }
1296
+ }