@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,1352 @@
1
+ /**
2
+ * The player's gear store: the world/UI-owned side of carried objects.
3
+ *
4
+ * The parity Player (player/player.ts) deliberately omits struct player's
5
+ * gear list, keeping only equipment[] as per-body-slot object HANDLES
6
+ * (0 = empty). This module owns the objects those handles point at: a
7
+ * handle -> GameObject store plus an ordered pack of non-equipped handles.
8
+ * It ports the equipment/carry substrate and the birth starting-kit from
9
+ * reference/src/obj-gear.c (slot_by_type, wield_slot, inven_carry) and
10
+ * reference/src/player-birth.c (wield_all, player_outfit) (Angband 4.2.6).
11
+ *
12
+ * LIVE vs DEFERRED (ledgered in parity/ledger/game-gear.yaml):
13
+ * - LIVE: slot_by_type (empty-preferring), wield_slot (full tval switch),
14
+ * inven_carry's merge-or-add with quiver stack-mode routing, wield_all's
15
+ * split-and-wear, player_outfit's start-item roll + prep + carry + wield
16
+ * (birth_start_kit + eopts exclusion honoured), the real quiver subsystem
17
+ * (object_is_in_quiver, preferred_quiver_slot, quiver_absorb_num,
18
+ * calc_inventory's quiver assignment, pack_slots_used quiver accounting),
19
+ * combine_pack + inven_can_stack_partial, and minus_ac armour damage,
20
+ * pack_is_full / pack_is_overfull (the pack_size overflow enforcement itself,
21
+ * pack_overflow, needs drop_near and so lives in game/obj-cmd.ts next to the
22
+ * other obj-gear.c verbs that touch the floor).
23
+ * - DEFERRED: the display knowledge twin (obj->known) and equip_cnt UI
24
+ * counter. The pack-side inven[] listing is a derived view rather than the
25
+ * source of truth: gear.pack keeps master-gear insertion order while
26
+ * gear.inven reproduces calc_inventory's earlier_object ordering. Wielding DOES learn modifier runes
27
+ * (obj-knowledge.c object_learn_on_wield); see obj/knowledge.ts.
28
+ */
29
+
30
+ import type { Constants } from "../constants.js";
31
+ import { ELEM, OF, ORIGIN, TV } from "../generated/index.js";
32
+ import type { Rng } from "../rng.js";
33
+ import type { ObjRegistry } from "../obj/bind.js";
34
+ import { tvalFindIdx } from "../obj/bind.js";
35
+ import type { GameObject } from "../obj/object.js";
36
+ import { learnBirthObviousFlags, objectLearnOnWield, OBJ_NOTICE } from "../obj/knowledge.js";
37
+ import {
38
+ distributeCharges,
39
+ objectAbsorb,
40
+ objectAbsorbPartial,
41
+ objectMergeable,
42
+ objectStackable,
43
+ OSTACK_PACK,
44
+ OSTACK_QUIVER,
45
+ tvalCanHaveCharges,
46
+ tvalCanHaveTimeout,
47
+ tvalIsAmmo,
48
+ tvalIsBodyArmor,
49
+ tvalIsFood,
50
+ tvalIsHeadArmor,
51
+ tvalIsLight,
52
+ tvalIsMeleeWeapon,
53
+ tvalIsMoney,
54
+ tvalIsRing,
55
+ tvalIsRod,
56
+ } from "../obj/object.js";
57
+ import type { PackTotalGear, StackLimits } from "../obj/object.js";
58
+ import { EL_INFO_IGNORE } from "../obj/types.js";
59
+ import type { ObjectKind } from "../obj/types.js";
60
+ import { objectPrep } from "../obj/make.js";
61
+ import { objectValueReal } from "../obj/value.js";
62
+ import { earlierObject } from "../player/calcs.js";
63
+ import type { EarlierObjectOpts } from "../player/calcs.js";
64
+ import type { Player } from "../player/player.js";
65
+ import type { PlayerBody } from "../player/types.js";
66
+
67
+ /* ------------------------------------------------------------------ */
68
+ /* The gear store */
69
+ /* ------------------------------------------------------------------ */
70
+
71
+ /**
72
+ * The player's live gear: every carried object by numeric handle, plus the
73
+ * ordered list of pack (non-equipped) handles. Equipped objects stay in
74
+ * `store` and are referenced by player.equipment[slot]; they are not in
75
+ * `pack`. Handles start at 1 so 0 can mean "empty" in equipment[].
76
+ */
77
+ export interface Gear {
78
+ /** handle -> live object (both pack and equipped objects). */
79
+ store: Map<number, GameObject>;
80
+ /** The next handle to assign (always >= 1). */
81
+ next: number;
82
+ /**
83
+ * Ordered non-equipped handles: the port's stand-in for upstream's master
84
+ * gear list minus the equipment (upstream p->gear minus body slots). This is
85
+ * the raw storage ordering AND the pack listing; ammo/throwing handles that
86
+ * calc_inventory has routed into the quiver stay in this list (exactly as an
87
+ * upstream quiver object stays on p->gear) and are additionally referenced by
88
+ * `quiver` below - use objectIsInQuiver to tell them apart.
89
+ */
90
+ pack: number[];
91
+ /**
92
+ * upkeep->inven[]: computed, earlier_object-sorted non-quiver pack view.
93
+ * This is deliberately separate from `pack`, whose order is the master-gear
94
+ * ordering used by combine/split logic. It is rebuilt, never persisted.
95
+ */
96
+ inven?: number[];
97
+ /**
98
+ * upkeep->quiver[z_info->quiver_size]: the COMPUTED quiver view, one handle
99
+ * per slot (0 = empty), filled by calcInventory. Optional so that a Gear built
100
+ * without it (e.g. a save-load reconstruction, before calcInventory runs)
101
+ * type-checks; it is a derived view and is rebuilt by calcInventory rather
102
+ * than persisted. Empty/absent means the pre-quiver behaviour (ammo behaves
103
+ * as a plain pack stack). Kept on Gear alongside `pack` (the inven view's
104
+ * home) rather than on Player, mirroring how the port already keeps the pack
105
+ * listing here while Player holds only equipment[] handles.
106
+ */
107
+ quiver?: number[];
108
+ }
109
+
110
+ /** A fresh, empty gear store (empty quiver; calcInventory sizes it). */
111
+ export function newGear(): Gear {
112
+ return { store: new Map<number, GameObject>(), next: 1, pack: [], inven: [], quiver: [] };
113
+ }
114
+
115
+ /** Store an object under a fresh handle and return it (no pack insertion). */
116
+ export function gearAdd(gear: Gear, obj: GameObject): number {
117
+ const handle = gear.next;
118
+ gear.next += 1;
119
+ gear.store.set(handle, obj);
120
+ return handle;
121
+ }
122
+
123
+ /** The object for a handle, or null (0 / unknown handle -> null). */
124
+ export function gearGet(gear: Gear, handle: number): GameObject | null {
125
+ return gear.store.get(handle) ?? null;
126
+ }
127
+
128
+ /* ------------------------------------------------------------------ */
129
+ /* obj-util.c object copy / split */
130
+ /* ------------------------------------------------------------------ */
131
+
132
+ /**
133
+ * object_copy (obj-util.c): a faithful deep copy of the live struct. The
134
+ * known twin and pile links are not part of GameObject (deferred), and
135
+ * kind/ego/artifact/activation/effect stay shared references exactly as
136
+ * upstream's memcpy leaves them.
137
+ */
138
+ function objectCopy(src: GameObject): GameObject {
139
+ return {
140
+ ...src,
141
+ flags: src.flags.clone(),
142
+ modifiers: [...src.modifiers],
143
+ elInfo: src.elInfo.map((e) => ({ resLevel: e.resLevel, flags: e.flags })),
144
+ brands: src.brands ? [...src.brands] : null,
145
+ slays: src.slays ? [...src.slays] : null,
146
+ curses: src.curses
147
+ ? src.curses.map((c) => ({ power: c.power, timeout: c.timeout }))
148
+ : null,
149
+ time: { ...src.time },
150
+ };
151
+ }
152
+
153
+ /**
154
+ * object_split (obj-util.c): split `amt` items off `src` into a fresh copy,
155
+ * distributing wand/staff/rod charges, and reduce src by amt. Requires
156
+ * src.number > amt (upstream assert). Exported for the floor-pile module
157
+ * (floor_object_for_use splits floor stacks the same way).
158
+ */
159
+ export function objectSplit(src: GameObject, amt: number): GameObject {
160
+ const dest = objectCopy(src);
161
+ /* Distribute charges of wands, staves, or rods (dest is a new stack). */
162
+ distributeCharges(src, dest, amt, true);
163
+ dest.number = amt;
164
+ src.number -= amt;
165
+ if (src.note) dest.note = src.note;
166
+ return dest;
167
+ }
168
+
169
+ /* ------------------------------------------------------------------ */
170
+ /* obj-gear.c slot logic */
171
+ /* ------------------------------------------------------------------ */
172
+
173
+ /**
174
+ * slot_by_type (obj-gear.c L71-93): the index of a slot of the given type,
175
+ * preferring an empty one (full = false) or a full one (full = true), else
176
+ * any matching-type slot, else body.count when none exists.
177
+ *
178
+ * Upstream reads body.slots[i].obj to decide full/empty; here a slot is
179
+ * "filled" when equipment[i] !== 0, so the equipment array is passed in.
180
+ */
181
+ function slotByType(
182
+ body: PlayerBody,
183
+ equipment: readonly number[],
184
+ type: string,
185
+ full: boolean,
186
+ ): number {
187
+ let fallback = body.count;
188
+ let i = 0;
189
+ for (; i < body.count; i++) {
190
+ if (type === body.slots[i]!.type) {
191
+ const filled = (equipment[i] ?? 0) !== 0;
192
+ if (full) {
193
+ /* Found a full slot */
194
+ if (filled) break;
195
+ } else {
196
+ /* Found an empty slot */
197
+ if (!filled) break;
198
+ }
199
+ /* Not right for full/empty, but still the right type */
200
+ if (fallback === body.count) fallback = i;
201
+ }
202
+ }
203
+ /* Index for the best slot we found, or body.count if none found. */
204
+ return i !== body.count ? i : fallback;
205
+ }
206
+
207
+ /**
208
+ * wield_slot (obj-gear.c L341-367): the equipment slot an object of the
209
+ * given tval likes (an open slot preferred for rings), or -1 for a
210
+ * non-wearable tval.
211
+ *
212
+ * `equipment` (optional, defaults to all-empty) lets the empty-slot
213
+ * preference work; wieldObject/wieldAll pass the player's real equipment
214
+ * so a second ring lands in the free hand, matching upstream.
215
+ */
216
+ export function wieldSlot(
217
+ body: PlayerBody,
218
+ tval: number,
219
+ equipment?: readonly number[],
220
+ ): number {
221
+ const eq = equipment ?? new Array<number>(body.count).fill(0);
222
+
223
+ switch (tval) {
224
+ case TV.BOW:
225
+ return slotByType(body, eq, "BOW", false);
226
+ case TV.AMULET:
227
+ return slotByType(body, eq, "AMULET", false);
228
+ case TV.CLOAK:
229
+ return slotByType(body, eq, "CLOAK", false);
230
+ case TV.SHIELD:
231
+ return slotByType(body, eq, "SHIELD", false);
232
+ case TV.GLOVES:
233
+ return slotByType(body, eq, "GLOVES", false);
234
+ case TV.BOOTS:
235
+ return slotByType(body, eq, "BOOTS", false);
236
+ default:
237
+ break;
238
+ }
239
+
240
+ if (tvalIsMeleeWeapon(tval)) return slotByType(body, eq, "WEAPON", false);
241
+ if (tvalIsRing(tval)) return slotByType(body, eq, "RING", false);
242
+ if (tvalIsLight(tval)) return slotByType(body, eq, "LIGHT", false);
243
+ if (tvalIsBodyArmor(tval)) return slotByType(body, eq, "BODY_ARMOR", false);
244
+ if (tvalIsHeadArmor(tval)) return slotByType(body, eq, "HAT", false);
245
+
246
+ /* No slot available */
247
+ return -1;
248
+ }
249
+
250
+ /* ------------------------------------------------------------------ */
251
+ /* Quiver membership and slot preference (obj-gear.c) */
252
+ /* ------------------------------------------------------------------ */
253
+
254
+ /**
255
+ * object_is_in_quiver (obj-gear.c L163-174): is the object referenced by
256
+ * `handle` currently held in one of the computed quiver slots? A zero handle
257
+ * (empty slot / no object) is never in the quiver.
258
+ */
259
+ export function objectIsInQuiver(gear: Gear, handle: number): boolean {
260
+ if (handle === 0) return false;
261
+ return (gear.quiver ?? []).includes(handle);
262
+ }
263
+
264
+ /**
265
+ * preferred_quiver_slot (obj-gear.c L1396-1427): the quiver slot an object's
266
+ * inscription asks for, or -1 when it is not quiver-appropriate or not
267
+ * inscribed with a matching @f/@v (fire / throw) key. The fire key depends on
268
+ * the keyset: 't' under rogue-like commands, else 'f'; the throw key is always
269
+ * 'v' (upstream hardwires these because cmd_lookup_key is in the UI layer).
270
+ */
271
+ export function preferredQuiverSlot(obj: GameObject, rogueLike = false): number {
272
+ let desiredSlot = -1;
273
+ if (obj.note && (tvalIsAmmo(obj.tval) || obj.flags.has(OF.THROWING))) {
274
+ const fireKey = rogueLike ? "t" : "f";
275
+ const throwKey = "v";
276
+ let s = obj.note.indexOf("@");
277
+ while (s !== -1) {
278
+ const k = obj.note[s + 1];
279
+ if (k === fireKey || k === throwKey) {
280
+ /* s[2] - '0': the single digit slot after the key. */
281
+ desiredSlot = (obj.note.charCodeAt(s + 2) || 0) - "0".charCodeAt(0);
282
+ break;
283
+ }
284
+ s = obj.note.indexOf("@", s + 1);
285
+ }
286
+ }
287
+ return desiredSlot;
288
+ }
289
+
290
+ /* ------------------------------------------------------------------ */
291
+ /* minus_ac (obj-gear.c L376-438) */
292
+ /* ------------------------------------------------------------------ */
293
+
294
+ /** The non-armour equipment slot types minus_ac skips (obj-gear.c L387-391). */
295
+ function slotIsArmour(type: string | undefined): boolean {
296
+ return (
297
+ type !== undefined &&
298
+ type !== "WEAPON" &&
299
+ type !== "BOW" &&
300
+ type !== "RING" &&
301
+ type !== "AMULET" &&
302
+ type !== "LIGHT"
303
+ );
304
+ }
305
+
306
+ /** Optional message / naming hooks for minusAc. */
307
+ export interface MinusAcEnv {
308
+ /** msg(): the "Your %s is damaged!" / "is unaffected!" lines. */
309
+ msg?: (text: string) => void;
310
+ /** object_desc(ODESC_BASE): the bare armour name; defaults to kind.name. */
311
+ describe?: (obj: GameObject) => string;
312
+ /** PU_BONUS trigger fired after a to_a decrement (calc_bonuses refresh). */
313
+ updateBonuses?: () => void;
314
+ }
315
+
316
+ /**
317
+ * minus_ac (obj-gear.c L376-438): acid has hit the player, so attempt to
318
+ * damage a piece of worn armour. Counts the armour slots, draws one at random
319
+ * with the exact upstream reverse one_in_(count--) scan, and (if that item can
320
+ * still lose armour) either reports it resists (EL_INFO_IGNORE on ELEM_ACID)
321
+ * or decrements its to_a and prints the damage message. Returns whether there
322
+ * was any effect (a piece was picked and had ac + to_a > 0), matching upstream
323
+ * so the caller can halve the elemental damage.
324
+ *
325
+ * The RNG draw order is preserved bit-for-bit: the forward count loop, then
326
+ * the reverse pick loop consuming one_in_(count--) per armour slot until it
327
+ * breaks. `obj->known->to_a = obj->to_a` (L425-426) is DEFERRED - the port has
328
+ * no per-object known twin (obj-knowledge #4.8); obj_k->to_a is 1 at birth so
329
+ * the real to_a is already the shown value.
330
+ */
331
+ export function minusAc(
332
+ player: Player,
333
+ gear: Gear,
334
+ rng: Rng,
335
+ env: MinusAcEnv = {},
336
+ ): boolean {
337
+ const body = player.body;
338
+
339
+ /* Avoid crash during monster power calculations (L382): no gear, no effect. */
340
+ if (gear.pack.length === 0 && player.equipment.every((h) => h === 0)) {
341
+ return false;
342
+ }
343
+
344
+ /* Count the armour slots (L384-395). */
345
+ let count = 0;
346
+ for (let i = 0; i < body.count; i++) {
347
+ if (slotIsArmour(body.slots[i]?.type)) count++;
348
+ }
349
+
350
+ /* Pick one at random with the reverse one_in_(count--) scan (L397-407). */
351
+ let picked = body.count;
352
+ for (let i = body.count - 1; i >= 0; i--) {
353
+ if (!slotIsArmour(body.slots[i]?.type)) continue;
354
+ if (rng.oneIn(count--)) {
355
+ picked = i;
356
+ break;
357
+ }
358
+ }
359
+
360
+ /* Get the item in the picked slot (L410). */
361
+ const handle = picked < body.count ? (player.equipment[picked] ?? 0) : 0;
362
+ const obj = handle !== 0 ? (gear.store.get(handle) ?? null) : null;
363
+
364
+ /* If we can still damage the item (L412-433). */
365
+ if (obj && obj.ac + obj.toA > 0) {
366
+ const name = env.describe ? env.describe(obj) : obj.kind.name;
367
+ const acidEl = obj.elInfo[ELEM.ACID];
368
+ if (acidEl && (acidEl.flags & EL_INFO_IGNORE) !== 0) {
369
+ env.msg?.(`Your ${name} is unaffected!`);
370
+ } else {
371
+ env.msg?.(`Your ${name} is damaged!`);
372
+ obj.toA--;
373
+ /* DEFERRED: obj->known->to_a = obj->to_a (no known twin, #4.8). */
374
+ env.updateBonuses?.(); /* PU_BONUS */
375
+ }
376
+ /* There was an effect. */
377
+ return true;
378
+ }
379
+
380
+ /* No damage or effect (L435-436). */
381
+ return false;
382
+ }
383
+
384
+ /* ------------------------------------------------------------------ */
385
+ /* inven_carry */
386
+ /* ------------------------------------------------------------------ */
387
+
388
+ /**
389
+ * inven_carry (obj-gear.c L821-925): add an object to the gear. If a
390
+ * non-equipped stack is object_mergeable with the incoming object, object_absorb
391
+ * into it and return that stack's handle; otherwise store the object under a
392
+ * fresh gear handle and return it. The merge test uses OSTACK_QUIVER when the
393
+ * candidate stack is currently in the quiver (obj-gear.c L832-834) and
394
+ * OSTACK_PACK otherwise, so a quiver stack honours the stricter quiver caps.
395
+ *
396
+ * The subsequent calc_inventory (upstream's update_stuff after PU_INVEN) is a
397
+ * SEPARATE step here - callers run calcInventory when they want the quiver
398
+ * re-derived. inven_carry does not itself enforce pack_size upstream either:
399
+ * the command layer does (packOverflow, game/obj-cmd.ts).
400
+ */
401
+ export interface InvenCarryResult {
402
+ handle: number;
403
+ /** true when the incoming object was absorbed into an existing stack. */
404
+ combining: boolean;
405
+ }
406
+
407
+ /** inven_carry plus the C `combining` bit needed by pickup awareness. */
408
+ export function invenCarryResult(
409
+ gear: Gear,
410
+ obj: GameObject,
411
+ limits: StackLimits,
412
+ ): InvenCarryResult {
413
+ /* Check for combining with an existing non-equipped stack. */
414
+ for (const handle of gear.pack) {
415
+ const stack = gear.store.get(handle);
416
+ const mode = objectIsInQuiver(gear, handle) ? OSTACK_QUIVER : OSTACK_PACK;
417
+ if (stack && objectMergeable(stack, obj, mode, limits)) {
418
+ objectAbsorb(stack, obj, ORIGIN.MIXED);
419
+ return { handle, combining: true };
420
+ }
421
+ }
422
+
423
+ /* We did not find an object to combine with: add a new pack handle. */
424
+ const handle = gearAdd(gear, obj);
425
+ gear.pack.push(handle);
426
+ return { handle, combining: false };
427
+ }
428
+
429
+ export function invenCarry(
430
+ gear: Gear,
431
+ obj: GameObject,
432
+ limits: StackLimits,
433
+ ): number {
434
+ return invenCarryResult(gear, obj, limits).handle;
435
+ }
436
+
437
+ /* ------------------------------------------------------------------ */
438
+ /* inven_carry_num / object_copy_amt / gear_object_for_use */
439
+ /* ------------------------------------------------------------------ */
440
+
441
+ /**
442
+ * pack_slots_used (obj-gear.c L257-296): the number of pack slots occupied.
443
+ * Equipped items don't count (they are absent from `pack`); ammo / throwing
444
+ * items assigned to the quiver aggregate by weighted count into quiver slots
445
+ * of quiver_slot_size, so a non-empty quiver frees up whole pack slots. When
446
+ * the quiver is empty this equals pack.length (every item is a pack slot).
447
+ */
448
+ export function packSlotsUsed(gear: Gear, constants: Constants): number {
449
+ let packSlots = 0;
450
+ let quiverAmmo = 0;
451
+
452
+ for (const handle of gear.pack) {
453
+ const obj = gear.store.get(handle);
454
+ if (!obj) continue;
455
+ let found = false;
456
+ if (tvalIsAmmo(obj.tval) || obj.flags.has(OF.THROWING)) {
457
+ if (objectIsInQuiver(gear, handle)) {
458
+ quiverAmmo +=
459
+ obj.number * (tvalIsAmmo(obj.tval) ? 1 : constants.thrownQuiverMult);
460
+ found = true;
461
+ }
462
+ }
463
+ /* Count regular slots. */
464
+ if (!found) packSlots++;
465
+ }
466
+
467
+ /* Full slots, plus one for any remainder. */
468
+ packSlots += Math.trunc(quiverAmmo / constants.quiverSlotSize);
469
+ if (quiverAmmo % constants.quiverSlotSize) packSlots++;
470
+
471
+ return packSlots;
472
+ }
473
+
474
+ /**
475
+ * pack_is_full (obj-gear.c L1328-1331): the pack holds exactly the maximum
476
+ * number of items.
477
+ */
478
+ export function packIsFull(gear: Gear, constants: Constants): boolean {
479
+ return packSlotsUsed(gear, constants) === constants.packSize;
480
+ }
481
+
482
+ /**
483
+ * pack_is_overfull (obj-gear.c L1337-1340): the pack holds MORE than the
484
+ * maximum, so pack_overflow (game/obj-cmd.ts) will shed an item.
485
+ */
486
+ export function packIsOverfull(gear: Gear, constants: Constants): boolean {
487
+ return packSlotsUsed(gear, constants) > constants.packSize;
488
+ }
489
+
490
+ /**
491
+ * quiver_absorb_num (obj-gear.c L649-744): how many of `obj` the quiver can
492
+ * take, and how many additional pack slots that costs. Reads the current
493
+ * computed quiver (gear.quiver) exactly as upstream reads p->upkeep->quiver.
494
+ * `nAddPack` is the number of extra pack slots the quiver may claim; the return
495
+ * carries the leftover (nAddPack minus the slots consumed) alongside nToQuiver.
496
+ */
497
+ export function quiverAbsorbNum(
498
+ gear: Gear,
499
+ obj: GameObject,
500
+ constants: Constants,
501
+ nAddPack: number,
502
+ rogueLike = false,
503
+ ): { nToQuiver: number; nAddPack: number } {
504
+ const ammo = tvalIsAmmo(obj.tval);
505
+
506
+ /* Must be ammo or good for throwing (L655). */
507
+ if (ammo || obj.flags.has(OF.THROWING)) {
508
+ let quiverCount = 0;
509
+ let spaceFree = 0;
510
+ let nEmpty = 0;
511
+ const desiredSlot = preferredQuiverSlot(obj, rogueLike);
512
+ let displaces = false;
513
+ const qSize = constants.quiverSize;
514
+ const qSlot = constants.quiverSlotSize;
515
+ const quiver = gear.quiver ?? [];
516
+
517
+ /* Count the current space this object could go into (L660-710). */
518
+ for (let i = 0; i < qSize; i++) {
519
+ const qHandle = quiver[i] ?? 0;
520
+ const quiverObj = qHandle !== 0 ? gear.store.get(qHandle) : undefined;
521
+ if (quiverObj) {
522
+ const mult = tvalIsAmmo(quiverObj.tval) ? 1 : constants.thrownQuiverMult;
523
+ quiverCount += quiverObj.number * mult;
524
+ if (objectStackable(quiverObj, obj, OSTACK_PACK)) {
525
+ spaceFree += qSlot - quiverObj.number * mult;
526
+ } else if (
527
+ desiredSlot === i &&
528
+ preferredQuiverSlot(quiverObj, rogueLike) !== i
529
+ ) {
530
+ /* The added object prefers this slot, but it is occupied by a stack
531
+ * that could be displaced elsewhere if a slot is available. */
532
+ displaces = true;
533
+ if (ammo) {
534
+ spaceFree += qSlot - quiverObj.number * mult;
535
+ } else {
536
+ spaceFree += qSlot;
537
+ }
538
+ }
539
+ } else {
540
+ nEmpty++;
541
+ /* Ammo fits any empty slot; a non-ammo throwing item only its
542
+ * preferred slot (L699-708). */
543
+ if (ammo || desiredSlot === i) {
544
+ spaceFree += qSlot;
545
+ }
546
+ }
547
+ }
548
+
549
+ /* Only addable if there is free space and we either displace a pile with an
550
+ * empty slot available or don't displace at all (L712-738). */
551
+ if (spaceFree && ((displaces && nEmpty) || !displaces)) {
552
+ const mult = ammo ? 1 : constants.thrownQuiverMult;
553
+ const remainder = quiverCount % qSlot;
554
+ let limitFromPack = remainder ? qSlot - remainder : 0;
555
+ if (nAddPack > 0) limitFromPack += nAddPack * qSlot;
556
+
557
+ spaceFree = Math.min(spaceFree, limitFromPack);
558
+ const nToQuiver = Math.min(obj.number, Math.trunc(spaceFree / mult));
559
+ const usedPack =
560
+ nAddPack -
561
+ Math.trunc((nToQuiver * mult + qSlot - 1 - remainder) / qSlot);
562
+ return { nToQuiver, nAddPack: usedPack };
563
+ }
564
+ }
565
+
566
+ /* Not suitable for the quiver or no space (L742-743). */
567
+ return { nToQuiver: 0, nAddPack };
568
+ }
569
+
570
+ /**
571
+ * inven_carry_num (obj-gear.c L749-780): how many of `obj` the gear can accept
572
+ * across quiver and pack. The quiver absorbs what it can first; then a free
573
+ * pack slot takes the rest, or the remainder squeezes into partially-full
574
+ * stackable pack slots.
575
+ */
576
+ export function invenCarryNum(
577
+ gear: Gear,
578
+ obj: GameObject,
579
+ constants: Constants,
580
+ ): number {
581
+ /* Treasure can always be picked up (never reached via a store). */
582
+ if (tvalIsMoney(obj.tval)) return obj.number;
583
+
584
+ const nFreeSlot = constants.packSize - packSlotsUsed(gear, constants);
585
+
586
+ /* Absorb as many as we can in the quiver (L760). quiver_absorb_num DECREMENTS
587
+ * the free-slot count by the pack slots the quiver expands into (via
588
+ * &n_free_slot); the port returns that decremented value as nAddPack. GR-01:
589
+ * the >0 test must use the decremented nAddPack, not the pre-call nFreeSlot,
590
+ * or capacity is over-reported when the quiver eats free pack slots but still
591
+ * cannot hold the whole stack. */
592
+ const { nToQuiver, nAddPack } = quiverAbsorbNum(gear, obj, constants, nFreeSlot);
593
+
594
+ /* The quiver will get everything, or the pack can hold what's left (L763). */
595
+ if (nToQuiver === obj.number || nAddPack > 0) return obj.number;
596
+
597
+ /* See if we can add to partially-full inventory slots (L767-776). GR-02:
598
+ * upstream iterates p->upkeep->inven[], which EXCLUDES ammo already sitting
599
+ * in the quiver; gear.pack still carries those handles, so a stackable
600
+ * quiver ammo stack would be double-counted as pack free space. Skip any
601
+ * handle that is in the quiver. */
602
+ let numLeft = obj.number - nToQuiver;
603
+ for (const handle of gear.pack) {
604
+ if (objectIsInQuiver(gear, handle)) continue;
605
+ const stack = gear.store.get(handle);
606
+ if (stack && objectStackable(stack, obj, OSTACK_PACK)) {
607
+ numLeft -= stack.kind.base.maxStack - stack.number;
608
+ if (numLeft <= 0) break;
609
+ }
610
+ }
611
+
612
+ return obj.number - Math.max(numLeft, 0);
613
+ }
614
+
615
+ /* ------------------------------------------------------------------ */
616
+ /* calc_inventory (player-calcs.c) and combine_pack (obj-gear.c) */
617
+ /* ------------------------------------------------------------------ */
618
+
619
+ /**
620
+ * Hooks calc_inventory / combine_pack need beyond the gear: the keyset (for
621
+ * preferred_quiver_slot), the earlier_object tiebreak inputs (ammo_tval /
622
+ * object_value / awareness / browsability), and the reorder messages.
623
+ */
624
+ export interface CalcInventoryOpts extends EarlierObjectOpts {
625
+ /** rogue_like_commands: the fire key preferred_quiver_slot looks for. */
626
+ rogueLike?: boolean;
627
+ /**
628
+ * character_dungeon: gates the "You re-arrange your quiver." / "You
629
+ * re-arrange your pack." notices (player-calcs.c:1174, :1224).
630
+ */
631
+ characterDungeon?: boolean;
632
+ /**
633
+ * object_is_equipped(p->body, old_pack[i]) (player-calcs.c:1227): an old pack
634
+ * entry that the player has since WORN must not count as a re-arrangement.
635
+ * calc_inventory has no player, so the caller supplies the predicate. Omit it
636
+ * and no old entry is treated as equipped, which can only over-report.
637
+ */
638
+ isEquipped?: (handle: number) => boolean;
639
+ /** msg(): the re-arrange / combine notices. */
640
+ msg?: (text: string) => void;
641
+ }
642
+
643
+ /** Build EarlierObjectOpts (ammo tiebreak) from the calc-inventory opts. */
644
+ function earlierOpts(opts: CalcInventoryOpts): EarlierObjectOpts {
645
+ const e: EarlierObjectOpts = { store: false };
646
+ if (opts.ammoTval !== undefined) e.ammoTval = opts.ammoTval;
647
+ if (opts.objectValue) e.objectValue = opts.objectValue;
648
+ if (opts.isAware) e.isAware = opts.isAware;
649
+ if (opts.canBrowse) e.canBrowse = opts.canBrowse;
650
+ return e;
651
+ }
652
+
653
+ /**
654
+ * calc_inventory (player-calcs.c:1023-1238): rebuild gear.quiver and the
655
+ * separate sorted gear.inven listing. `gear.pack` remains the raw master-gear
656
+ * order, so changing this derived view cannot destabilize combine/split logic.
657
+ * from the current non-equipped gear. First place inscribed items in their
658
+ * preferred slots (splitting a stack that overflows quiver_slot_size, with the
659
+ * excess going back to the pack), then fill the remaining slots in earlier_object
660
+ * order with ammo. Then select each remaining non-quiver handle in
661
+ * earlier_object order, exactly as upstream fills upkeep->inven[].
662
+ *
663
+ * Split remainders are appended to gear.pack via object_split, exactly as
664
+ * upstream's gear_insert_end. `n_stack_split <= n_pack_remaining` guards splits
665
+ * so the pack can overflow by at most one slot, matching upstream.
666
+ */
667
+ export function calcInventory(
668
+ gear: Gear,
669
+ constants: Constants,
670
+ opts: CalcInventoryOpts = {},
671
+ ): void {
672
+ const qSize = constants.quiverSize;
673
+ const qSlot = constants.quiverSlotSize;
674
+ const rogueLike = opts.rogueLike ?? false;
675
+ let nStackSplit = 0;
676
+ const nPackRemaining = constants.packSize - packSlotsUsed(gear, constants);
677
+
678
+ /* Copy the current quiver, then empty it (L1053-1061). */
679
+ const oldQuiver: number[] = [];
680
+ for (let i = 0; i < qSize; i++) oldQuiver[i] = gear.quiver?.[i] ?? 0;
681
+ const quiver = new Array<number>(qSize).fill(0);
682
+ gear.quiver = quiver;
683
+
684
+ const assigned = new Set<number>();
685
+
686
+ /* Fill quiver. First, allocate inscribed items (L1063-1117). */
687
+ for (const handle of [...gear.pack]) {
688
+ const current = gear.store.get(handle);
689
+ if (!current) continue;
690
+ const prefslot = preferredQuiverSlot(current, rogueLike);
691
+ if (prefslot >= 0 && prefslot < qSize && (quiver[prefslot] ?? 0) === 0) {
692
+ const mult = tvalIsAmmo(current.tval) ? 1 : constants.thrownQuiverMult;
693
+ let toQuiver = false;
694
+ if (current.number * mult <= qSlot) {
695
+ toQuiver = true;
696
+ } else {
697
+ const nsplit = Math.trunc(qSlot / mult);
698
+ if (nsplit > 0 && nStackSplit <= nPackRemaining) {
699
+ /* Split off the portion that goes to the pack; the quiver stack is
700
+ * earlier in the gear list so it stays preferred (L1091-1102). */
701
+ const rem = objectSplit(current, current.number - nsplit);
702
+ gear.pack.push(gearAdd(gear, rem));
703
+ nStackSplit++;
704
+ toQuiver = true;
705
+ }
706
+ }
707
+ if (toQuiver) {
708
+ quiver[prefslot] = handle;
709
+ assigned.add(handle);
710
+ }
711
+ }
712
+ }
713
+
714
+ /* Now fill the rest of the slots in order (L1119-1172). */
715
+ for (let i = 0; i < qSize; i++) {
716
+ if ((quiver[i] ?? 0) !== 0) continue;
717
+
718
+ let first: GameObject | null = null;
719
+ let firstHandle = 0;
720
+ for (const handle of gear.pack) {
721
+ if (assigned.has(handle)) continue;
722
+ const current = gear.store.get(handle);
723
+ if (!current || !tvalIsAmmo(current.tval)) continue;
724
+ /* Only assign if, when a split is needed, there is room for it. */
725
+ if (
726
+ current.number <= qSlot ||
727
+ (qSlot > 0 && nStackSplit <= nPackRemaining)
728
+ ) {
729
+ if (earlierObject(first, current, earlierOpts(opts))) {
730
+ first = current;
731
+ firstHandle = handle;
732
+ }
733
+ }
734
+ }
735
+
736
+ /* Nothing left in the gear. */
737
+ if (!first) break;
738
+
739
+ /* Put it in the slot, splitting (if needed) to fit (L1159-1168). */
740
+ if (first.number > qSlot) {
741
+ const rem = objectSplit(first, first.number - qSlot);
742
+ gear.pack.push(gearAdd(gear, rem));
743
+ nStackSplit++;
744
+ }
745
+ quiver[i] = firstHandle;
746
+ assigned.add(firstHandle);
747
+ }
748
+
749
+ /* Note reordering (L1174-1182). */
750
+ if (opts.characterDungeon) {
751
+ for (let i = 0; i < qSize; i++) {
752
+ if ((oldQuiver[i] ?? 0) !== 0 && quiver[i] !== oldQuiver[i]) {
753
+ opts.msg?.("You re-arrange your quiver.");
754
+ break;
755
+ }
756
+ }
757
+ }
758
+
759
+ /* Copy the current pack (L1183-1186) and remember how full it was (L1025),
760
+ * both read only by the re-arrange notice below. */
761
+ const oldInvenCnt = (gear.inven ?? []).length;
762
+ const oldPack: number[] = [...(gear.inven ?? [])];
763
+
764
+ /* Fill upkeep->inven[] (player-calcs.c:1191-1222). Do not sort pack in
765
+ * place: C's p->gear remains its own linked-list order and inven[] is only
766
+ * a listing. Repeated first-selection (rather than Array.sort()) faithfully
767
+ * preserves master-gear order when earlier_object has no preference. */
768
+ const inven: number[] = [];
769
+ const invenAssigned = new Set<number>(quiver.filter((h) => h !== 0));
770
+ for (;;) {
771
+ let first: GameObject | null = null;
772
+ let firstHandle = 0;
773
+ for (const handle of gear.pack) {
774
+ if (invenAssigned.has(handle)) continue;
775
+ const current = gear.store.get(handle);
776
+ if (current && earlierObject(first, current, earlierOpts(opts))) {
777
+ first = current;
778
+ firstHandle = handle;
779
+ }
780
+ }
781
+ if (!first) break;
782
+ inven.push(firstHandle);
783
+ invenAssigned.add(firstHandle);
784
+ }
785
+ gear.inven = inven;
786
+
787
+ /* Note reordering (L1224-1233). The quiver half of this notice was ported;
788
+ * the pack half was not, so shuffling the pack was silent. Only fires when
789
+ * the pack holds the SAME number of items as before (L1225) - a pickup or a
790
+ * drop reorders it too, and upstream does not call that a re-arrangement. */
791
+ if (opts.characterDungeon && inven.length === oldInvenCnt) {
792
+ for (let i = 0; i < constants.packSize; i++) {
793
+ const was = oldPack[i] ?? 0;
794
+ if (was === 0) continue;
795
+ if (inven[i] === was) continue;
796
+ if (opts.isEquipped?.(was)) continue;
797
+ opts.msg?.("You re-arrange your pack.");
798
+ break;
799
+ }
800
+ }
801
+ }
802
+
803
+ /**
804
+ * inven_can_stack_partial (obj-gear.c L1183-1236): can obj1 and obj2 be merged
805
+ * into two uneven stacks, with obj1 the (maximised) leading stack? Refuses when
806
+ * obj1 is already at its per-stack limit, and (for a quiver->pack move) when the
807
+ * quiver has no room, to avoid combining then re-splitting in calc_inventory.
808
+ */
809
+ function invenCanStackPartial(
810
+ gear: Gear,
811
+ obj1: GameObject,
812
+ obj2: GameObject,
813
+ mode1: number,
814
+ mode2: number,
815
+ constants: Constants,
816
+ ): boolean {
817
+ const cmode = mode1 | mode2;
818
+ if (!objectStackable(obj1, obj2, cmode)) return false;
819
+
820
+ /* Verify the numbers suit uneven stacks (L1196-1233). OSTACK_STORE absorbs
821
+ * without limit; the port's combine_pack never passes it. */
822
+ if (mode1 & OSTACK_QUIVER) {
823
+ const qlimit = Math.trunc(
824
+ constants.quiverSlotSize /
825
+ (tvalIsAmmo(obj1.tval) ? 1 : constants.thrownQuiverMult),
826
+ );
827
+ if (obj1.number === qlimit) return false;
828
+ /* Moving items INTO the quiver: also check the overall quiver limits. */
829
+ if (mode2 & ~OSTACK_QUIVER) {
830
+ const nFreeSlot = constants.packSize - packSlotsUsed(gear, constants);
831
+ const { nToQuiver } = quiverAbsorbNum(gear, obj2, constants, nFreeSlot);
832
+ if (nToQuiver <= 0) return false;
833
+ }
834
+ } else if (obj1.number === obj1.kind.base.maxStack) {
835
+ return false;
836
+ }
837
+
838
+ return true;
839
+ }
840
+
841
+ /**
842
+ * combine_pack (obj-gear.c L1242-1323): sweep the gear from the back, merging
843
+ * each stack fully into an earlier compatible stack where possible, else moving
844
+ * items between stacks into two uneven stacks (inven_can_stack_partial). Runs
845
+ * calc_inventory afterward. Returns whether any full combine happened (upstream
846
+ * shows "You combine some items in your pack." and disables command repeat).
847
+ */
848
+ export function combinePack(
849
+ gear: Gear,
850
+ constants: Constants,
851
+ opts: CalcInventoryOpts = {},
852
+ ): boolean {
853
+ const limits: StackLimits = {
854
+ quiverSlotSize: constants.quiverSlotSize,
855
+ thrownQuiverMult: constants.thrownQuiverMult,
856
+ };
857
+ let displayMessage = false;
858
+
859
+ /* Combine the pack (backwards) over a snapshot; removals mutate gear.pack. */
860
+ for (const h1 of [...gear.pack].reverse()) {
861
+ const obj1 = gear.store.get(h1);
862
+ if (!obj1) continue;
863
+ const idx1 = gear.pack.indexOf(h1);
864
+ if (idx1 < 0) continue;
865
+
866
+ /* Scan the items above obj1 (L1256). */
867
+ for (let k = 0; k < idx1; k++) {
868
+ const h2 = gear.pack[k]!;
869
+ const obj2 = gear.store.get(h2);
870
+ if (!obj2) continue;
871
+ const mode2 = objectIsInQuiver(gear, h2) ? OSTACK_QUIVER : OSTACK_PACK;
872
+
873
+ if (objectMergeable(obj2, obj1, mode2, limits)) {
874
+ objectAbsorb(obj2, obj1, ORIGIN.MIXED);
875
+ gear.pack.splice(idx1, 1);
876
+ gear.store.delete(h1);
877
+ displayMessage = true;
878
+ break;
879
+ }
880
+
881
+ const mode1 = objectIsInQuiver(gear, h1) ? OSTACK_QUIVER : OSTACK_PACK;
882
+ if (invenCanStackPartial(gear, obj2, obj1, mode2, mode1, constants)) {
883
+ /* Shuffling items between stacks - no message (L1282-1287). */
884
+ objectAbsorbPartial(obj2, obj1, mode2, mode1, limits, ORIGIN.MIXED);
885
+ break;
886
+ }
887
+ }
888
+ }
889
+
890
+ calcInventory(gear, constants, opts);
891
+
892
+ if (displayMessage) opts.msg?.("You combine some items in your pack.");
893
+ return displayMessage;
894
+ }
895
+
896
+ /**
897
+ * object_copy_amt (obj-pile.c L743): a fresh copy of `src` holding `amt`
898
+ * items, with wand/staff charges and rod/activation timeouts scaled to the
899
+ * split (source unchanged). The AVERAGE charge time is deterministic.
900
+ */
901
+ export function objectCopyAmt(src: GameObject, amt: number): GameObject {
902
+ const dest = objectCopy(src);
903
+ dest.number = amt;
904
+
905
+ if (tvalCanHaveCharges(src.tval)) {
906
+ dest.pval = Math.trunc((src.pval * amt) / src.number);
907
+ }
908
+
909
+ if (tvalCanHaveTimeout(src.tval)) {
910
+ /* randcalc(src->time, 0, AVERAGE). */
911
+ const t = src.time;
912
+ const chargeTime = t.base + Math.trunc((t.dice * (t.sides + 1)) / 2);
913
+ const maxTime = chargeTime * amt;
914
+ dest.timeout = src.timeout > maxTime ? maxTime : src.timeout;
915
+ }
916
+
917
+ return dest;
918
+ }
919
+
920
+ /**
921
+ * gear_to_label's label alphabet (obj-gear.c:446): a-z minus the roguelike
922
+ * cardinal-movement keys h/j/k/l, then A-Z. An equipment slot index and a pack
923
+ * LISTING index both index straight into it (L452, L465).
924
+ */
925
+ export const GEAR_LABELS = "abcdefgimnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
926
+
927
+ /**
928
+ * gear_to_label (obj-gear.c:443-469): the one-character label for a held object -
929
+ * an equipment slot letter, a quiver slot digit (I2D), or a pack listing letter.
930
+ * "" when the handle is not currently held, upstream's '\0'.
931
+ *
932
+ * THE LISTING, NOT THE STORAGE ORDER. Upstream's pack arm reads
933
+ * `p->upkeep->inven[]` (L462-466) - the earlier_object-sorted view calc_inventory
934
+ * builds and every inventory display walks - NOT the master gear list. The port
935
+ * had three copies of this function (game/project-obj.ts, game/obj-cmd.ts,
936
+ * game/known.ts) and all three read `gear.pack`, the raw storage order, because
937
+ * they were written while `gear.inven` was still an unbuilt stand-in. calcInventory
938
+ * has filled `inven` for some time, so every one of them was quoting a letter the
939
+ * pack listing disagreed with: pick up a scroll into raw slot 8 of a pack that
940
+ * sorts it fourth and the message says (i) while the item is at (e) and (i) holds
941
+ * whatever sorted eighth. Same defect class as #92, one layer further in - the
942
+ * listings were fixed and the MESSAGES about them were not.
943
+ *
944
+ * Deliberately reads `inven` with no fallback to `pack`. A wrong letter is worse
945
+ * than a missing one: it sends the player to another item, and no census can see
946
+ * it because the slot is filled (paraphrase-is-a-deviation). If `inven` is stale
947
+ * the caller has skipped upstream's PU_INVEN/update_stuff, which is a bug to fix
948
+ * at that caller - gear-label-freshness.test.ts asserts the invariant holds after
949
+ * every gear mutation the live session performs.
950
+ *
951
+ * `equipment` is optional because most callers hold a Gear and no Player; a pack
952
+ * or quiver handle is never in equipment[], so omitting it cannot mislabel one.
953
+ */
954
+ export function gearToLabel(
955
+ gear: Gear,
956
+ handle: number,
957
+ equipment?: readonly number[],
958
+ ): string {
959
+ /* Equipment is easy (L450-453). */
960
+ if (equipment) {
961
+ const eq = equipment.indexOf(handle);
962
+ if (eq >= 0) return GEAR_LABELS[eq] ?? "";
963
+ }
964
+
965
+ /* Check the quiver (L455-460). */
966
+ const qi = gear.quiver?.indexOf(handle) ?? -1;
967
+ if (qi >= 0) return String(qi);
968
+
969
+ /* Check the inventory (L462-466). */
970
+ const pi = (gear.inven ?? []).indexOf(handle);
971
+ if (pi >= 0 && pi < GEAR_LABELS.length) return GEAR_LABELS[pi]!;
972
+
973
+ return "";
974
+ }
975
+
976
+ /**
977
+ * The p->gear view object_pack_total walks, built from the live gear.
978
+ *
979
+ * Upstream iterates all of p->gear and lets object_similar reject the equipped
980
+ * entries; the port's objectSimilar has the equipped test deferred (obj/object.ts
981
+ * module docs), so the view is built from the non-equipped handles instead. The
982
+ * resulting SET is the same, which is all object_pack_total reads.
983
+ */
984
+ export function packTotalView(gear: Gear): PackTotalGear {
985
+ const objs: GameObject[] = [];
986
+ const labels = new Map<GameObject, string>();
987
+ for (const handle of gear.pack) {
988
+ const obj = gear.store.get(handle);
989
+ if (!obj) continue;
990
+ objs.push(obj);
991
+ labels.set(obj, gearToLabel(gear, handle));
992
+ }
993
+ return {
994
+ gear: objs,
995
+ /* Never: the view holds only non-equipped handles (see above). */
996
+ isEquipped: () => false,
997
+ gearToLabel: (obj) => labels.get(obj) ?? "",
998
+ };
999
+ }
1000
+
1001
+ /**
1002
+ * Whether upstream suppresses the split-stack aggregate for this object.
1003
+ *
1004
+ * A charges count or "recharging" notice in the description belongs to ONE
1005
+ * stack, so aggregating the number across stacks would contradict the notice
1006
+ * printed beside it. Upstream repeats this test verbatim at every aggregate
1007
+ * site - gear_object_for_use (obj-gear.c L550-556, L583-589), inven_carry
1008
+ * (L899-901) and inven_drop (L1138-1140) - the last two of which also test
1009
+ * object_is_equipped, which the callers here add because inven_carry does not.
1010
+ */
1011
+ export function packTotalSuppressed(obj: GameObject): boolean {
1012
+ return tvalCanHaveCharges(obj.tval) || tvalIsRod(obj.tval) || obj.timeout > 0;
1013
+ }
1014
+
1015
+ /** The detached result of gear_object_for_use. */
1016
+ export interface GearForUse {
1017
+ /** The removed object (a split copy, or the excised original stack). */
1018
+ obj: GameObject;
1019
+ /** True when the whole stack was taken and its slot is now empty. */
1020
+ noneLeft: boolean;
1021
+ }
1022
+
1023
+ /**
1024
+ * Detach `handle` (or the free equipment/pack slot holding it) from the
1025
+ * gear. A pack handle is removed from the ordered pack; an equipped handle
1026
+ * clears its body slot. Either way the handle leaves the store map.
1027
+ */
1028
+ function gearExcise(gear: Gear, player: Player, handle: number): void {
1029
+ /* Clear any stale quiver reference (calc_inventory rebuilds it). */
1030
+ if (gear.quiver) {
1031
+ const qi = gear.quiver.indexOf(handle);
1032
+ if (qi >= 0) gear.quiver[qi] = 0;
1033
+ }
1034
+
1035
+ const pi = gear.pack.indexOf(handle);
1036
+ if (pi >= 0) {
1037
+ gear.pack.splice(pi, 1);
1038
+ gear.store.delete(handle);
1039
+ return;
1040
+ }
1041
+ const si = player.equipment.indexOf(handle);
1042
+ if (si >= 0) {
1043
+ player.equipment[si] = 0;
1044
+ gear.store.delete(handle);
1045
+ }
1046
+ }
1047
+
1048
+ /**
1049
+ * gear_object_for_use (obj-gear.c L524): remove `amt` items of the gear
1050
+ * object referenced by `handle`, returning a detached object to hand off.
1051
+ * When part of a stack is taken, the remainder stays under `handle` and a
1052
+ * fresh split is returned (noneLeft=false); when the whole stack is taken,
1053
+ * the original is excised (noneLeft=true). The total_weight upkeep and the
1054
+ * knowledge twin are DEFERRED (see the module ledger).
1055
+ */
1056
+ export function gearObjectForUse(
1057
+ gear: Gear,
1058
+ player: Player,
1059
+ handle: number,
1060
+ amt: number,
1061
+ ): GearForUse {
1062
+ const obj = gear.store.get(handle);
1063
+ if (!obj) throw new Error(`gearObjectForUse: no object for handle ${handle}`);
1064
+
1065
+ const num = Math.min(amt, obj.number);
1066
+
1067
+ /* Split off a usable object if we are not taking the whole stack. */
1068
+ if (obj.number > num) {
1069
+ const usable = objectSplit(obj, num);
1070
+ return { obj: usable, noneLeft: false };
1071
+ }
1072
+
1073
+ /* Using the entire stack. */
1074
+ gearExcise(gear, player, handle);
1075
+ return { obj, noneLeft: true };
1076
+ }
1077
+
1078
+ /* ------------------------------------------------------------------ */
1079
+ /* wield_all */
1080
+ /* ------------------------------------------------------------------ */
1081
+
1082
+ /**
1083
+ * Which upstream split a wield of a multi-item stack performs. The two C
1084
+ * callers do OPPOSITE things and the difference is observable in the pack
1085
+ * listing, so the caller must say which one it is:
1086
+ *
1087
+ * - "inven_wield" (obj-gear.c L947-968): `gear_object_for_use(p, obj, 1, ...)`
1088
+ * splits ONE item off; the split is linked into p->gear immediately after
1089
+ * the original (L961-963) and IT is what gets equipped. The original keeps
1090
+ * `number - 1` and stays in the pack AT ITS EXISTING LISTING POSITION.
1091
+ * - "wield_all" (player-birth.c L484-491): `object_split(obj, number - 1)`
1092
+ * sends the remainder to a new object collected in `new_pile` and appended
1093
+ * to the END of the gear (pile_insert_end, L503); the ORIGINAL is equipped.
1094
+ */
1095
+ export type WieldSplit = "inven_wield" | "wield_all";
1096
+
1097
+ /**
1098
+ * Wield the pack object with the given handle into its liked slot. If the
1099
+ * stack has more than one item it is split, following `split` (see
1100
+ * WieldSplit - the two upstream callers differ). Returns the filled slot, or
1101
+ * -1 if the object cannot be wielded or the slot is already occupied. Read
1102
+ * `player.equipment[slot]` for the handle that ended up worn: under
1103
+ * "inven_wield" a split stack equips a FRESH handle, not `handle`.
1104
+ *
1105
+ * object_learn_on_wield runs the instant the item is worn (as in wield_all
1106
+ * and inven_wield), so a worn item's modifier runes become known and its
1107
+ * pval bonuses go live at once. The equip_cnt UI counter is DEFERRED.
1108
+ *
1109
+ * `intoSlot` is the slot ARGUMENT upstream's inven_wield takes
1110
+ * (`void inven_wield(struct object *obj, int slot)`, obj-gear.c:931): the caller
1111
+ * decides the destination and inven_wield never recomputes it. That matters for
1112
+ * rings - do_cmd_wield asks "Replace which ring? " and then overwrites slot with
1113
+ * `equipped_item_slot(player->body, equip_obj)` (cmd-obj.c:309), so re-deriving
1114
+ * it here would silently discard the hand the player picked. Omit it to keep the
1115
+ * wield_slot default (wield_all and every non-choosing caller).
1116
+ */
1117
+ export function wieldObject(
1118
+ gear: Gear,
1119
+ player: Player,
1120
+ handle: number,
1121
+ env?: import("../obj/knowledge.js").RuneEnv,
1122
+ split: WieldSplit = "wield_all",
1123
+ intoSlot?: number,
1124
+ ): number {
1125
+ const obj = gear.store.get(handle);
1126
+ if (!obj) return -1;
1127
+
1128
+ const slot =
1129
+ intoSlot !== undefined
1130
+ ? intoSlot
1131
+ : wieldSlot(player.body, obj.tval, player.equipment);
1132
+ if (slot < 0 || slot >= player.body.count) return -1;
1133
+ if ((player.equipment[slot] ?? 0) !== 0) return -1;
1134
+
1135
+ /* Split if necessary. */
1136
+ let wieldedHandle = handle;
1137
+ let wielded = obj;
1138
+ if (obj.number > 1) {
1139
+ if (split === "inven_wield") {
1140
+ /* One item off the stack becomes the worn object; the original stays
1141
+ * put in the pack holding number - 1 (obj-gear.c L947-968). */
1142
+ wielded = objectSplit(obj, 1);
1143
+ wieldedHandle = gearAdd(gear, wielded);
1144
+ } else {
1145
+ /* All but one go back to the pack as a new stack at the END
1146
+ * (player-birth.c L484-491 + L502-505). */
1147
+ const remainder = objectSplit(obj, obj.number - 1);
1148
+ gear.pack.push(gearAdd(gear, remainder));
1149
+ }
1150
+ }
1151
+
1152
+ /* Remove the wielded handle from the pack and wear it. A fresh
1153
+ * "inven_wield" split was never in the pack, so the splice no-ops and the
1154
+ * original keeps its listing position. */
1155
+ const idx = gear.pack.indexOf(wieldedHandle);
1156
+ if (idx >= 0) gear.pack.splice(idx, 1);
1157
+ player.equipment[slot] = wieldedHandle;
1158
+
1159
+ /* Learn the runes that wearing makes obvious (obj-knowledge.c wield_all
1160
+ * L494-495). With an env the full obvious-flag/curse learning runs; the
1161
+ * env-less path (birth outfit, worldless tests) learns the modifier
1162
+ * runes, so worn pval bonuses apply immediately either way. */
1163
+ objectLearnOnWield(player, wielded, env);
1164
+
1165
+ return slot;
1166
+ }
1167
+
1168
+ /**
1169
+ * wield_all (player-birth.c L462-507): try to wield everything wieldable in
1170
+ * the pack. Scans a snapshot of the current pack handles (so the split-off
1171
+ * remainders added during the pass are not re-scanned, matching upstream's
1172
+ * deferred pile_insert_end), wielding each object whose liked slot is empty.
1173
+ */
1174
+ export function wieldAll(gear: Gear, player: Player): void {
1175
+ const handles = [...gear.pack];
1176
+ for (const handle of handles) {
1177
+ const obj = gear.store.get(handle);
1178
+ if (!obj) continue;
1179
+
1180
+ /* Make sure we can wield it into an empty slot. */
1181
+ const slot = wieldSlot(player.body, obj.tval, player.equipment);
1182
+ if (slot < 0 || slot >= player.body.count) continue;
1183
+ if ((player.equipment[slot] ?? 0) !== 0) continue;
1184
+
1185
+ wieldObject(gear, player, handle);
1186
+ }
1187
+ }
1188
+
1189
+ /* ------------------------------------------------------------------ */
1190
+ /* player_outfit */
1191
+ /* ------------------------------------------------------------------ */
1192
+
1193
+ /** Options for the birth starting kit. */
1194
+ export interface OutfitOptions {
1195
+ /**
1196
+ * birth_start_kit: with the full kit every start_item is granted; without it
1197
+ * only a single food and a single light source. An explicit value overrides
1198
+ * the option lookup; when omitted, it is read from `opt("birth_start_kit")`
1199
+ * if `opt` is supplied, else defaults to true (player-birth.c L612).
1200
+ */
1201
+ startKit?: boolean;
1202
+ /**
1203
+ * OPT(p, name): the player's birth-option accessor, used to honour
1204
+ * birth_start_kit (gap 1.6) and the per-start-item eopts birth-option
1205
+ * exclusion (gap 1.8, player-birth.c L619-637). Absent = no options set,
1206
+ * i.e. full kit and no exclusions (equivalent to upstream's defaults).
1207
+ */
1208
+ opt?: (name: string) => boolean;
1209
+ /**
1210
+ * object_flavor_aware(p, obj) (player-birth.c:650): the player starts AWARE of
1211
+ * every kind in their own starting kit - a Warrior knows their Flask of Oil by
1212
+ * name, not as "a Clear Flask".
1213
+ *
1214
+ * It is a callback rather than a direct call because awareness lives in the
1215
+ * per-game FlavorKnowledge, which the session layer does not create until
1216
+ * wireGame - and player_outfit runs before that (it has to: the starting gold
1217
+ * deduction feeds the birth screens). The caller collects the kinds here and
1218
+ * marks them aware the moment the store exists; see startGame.
1219
+ */
1220
+ onStartKind?: (kind: ObjectKind) => void;
1221
+ }
1222
+
1223
+ /**
1224
+ * Evaluate a start_item's eopts birth-option exclusion (player-birth.c
1225
+ * L619-637): each token is an option name, optionally "NOT-" prefixed
1226
+ * (init.c L3619-3634 stores +ind / -ind). A plain option excludes the item
1227
+ * when it is SET; a NOT- option excludes it when it is UNSET. Returns true if
1228
+ * the item should be included. With no accessor, nothing is excluded.
1229
+ */
1230
+ function startItemIncluded(
1231
+ eopts: readonly string[],
1232
+ opt: ((name: string) => boolean) | undefined,
1233
+ ): boolean {
1234
+ if (eopts.length === 0 || !opt) return true;
1235
+ for (const token of eopts) {
1236
+ const negated = token.startsWith("NOT-");
1237
+ const name = negated ? token.slice(4) : token;
1238
+ if (negated) {
1239
+ if (!opt(name)) return false;
1240
+ } else {
1241
+ if (opt(name)) return false;
1242
+ }
1243
+ }
1244
+ return true;
1245
+ }
1246
+
1247
+ /**
1248
+ * player_outfit (player-birth.c L584-666): give the player their class
1249
+ * starting equipment and wield everything wieldable.
1250
+ *
1251
+ * For each class start_item: roll the count in [min, max] via the project
1252
+ * Rng (rand_range), look the kind up by tval/sval name, honour birth_start_kit
1253
+ * (gap 1.6) and the eopts birth-option exclusion (gap 1.8), prep it with
1254
+ * MINIMISE at level 0 (object_prep), set number and ORIGIN_BIRTH, carry it
1255
+ * (invenCarry), and finally wield_all.
1256
+ *
1257
+ * wield_all learns each worn item's modifier runes (object_learn_on_wield);
1258
+ * for a default class kit those items carry no modifiers, so obj_k stays
1259
+ * empty at birth exactly as upstream.
1260
+ *
1261
+ * Each item is marked OBJ_NOTICE_ASSESSED (L652), the per-object half of the
1262
+ * knowledge block that the port models on the live object, and reported through
1263
+ * opts.onStartKind for object_flavor_aware (L650) - which the caller applies
1264
+ * once the per-game awareness store exists (see OutfitOptions.onStartKind).
1265
+ */
1266
+ export function outfitPlayer(
1267
+ gear: Gear,
1268
+ player: Player,
1269
+ reg: ObjRegistry,
1270
+ rng: Rng,
1271
+ constants: Constants,
1272
+ opts: OutfitOptions = {},
1273
+ ): void {
1274
+ const startKit =
1275
+ opts.startKit ?? (opts.opt ? opts.opt("birth_start_kit") : true);
1276
+ const limits: StackLimits = {
1277
+ quiverSlotSize: constants.quiverSlotSize,
1278
+ thrownQuiverMult: constants.thrownQuiverMult,
1279
+ };
1280
+
1281
+ /* Currently carrying nothing (running total is owned by the calc/inventory
1282
+ * side, which is DEFERRED; we mirror only the reset upstream performs). */
1283
+ player.upkeep.totalWeight = 0;
1284
+
1285
+ /* Give the player obvious object knowledge (player-birth.c L597-602): the
1286
+ * LIGHT / DIG / THROW / CURSE_ONLY subtype flags are known from birth. Without
1287
+ * this a mundane torch / digger / thrown item would read as not-fully-known
1288
+ * and show a spurious "{??}" in stores and lists. (The dd/ds/ac and combat
1289
+ * runes from the same upstream block are set in blankObjKnowledge.) */
1290
+ learnBirthObviousFlags(player.objKnown.flags, reg.properties);
1291
+
1292
+ /* Modifier runes are learned per item at wield_all (below); the display
1293
+ * half of the knowledge block (flavor_aware / base_known) is DEFERRED. */
1294
+
1295
+ /* Give the player starting equipment. */
1296
+ for (const si of player.cls.startItems) {
1297
+ let num = rng.randRange(si.min, si.max);
1298
+
1299
+ const tval = tvalFindIdx(si.tval);
1300
+ if (tval < 0) throw new Error(`outfit: unknown tval ${si.tval}`);
1301
+ const sval = reg.lookupSval(tval, si.sval);
1302
+ if (sval < 0) throw new Error(`outfit: unknown sval ${si.tval}:${si.sval}`);
1303
+ const kind = reg.lookupKind(tval, sval);
1304
+ if (!kind) throw new Error(`outfit: no kind ${si.tval}:${si.sval}`);
1305
+
1306
+ /* Without start_kit, only start with 1 food and 1 light. (Upstream
1307
+ * tval_is_food_k / tval_is_light_k are TV_FOOD / TV_LIGHT only.) */
1308
+ if (!startKit) {
1309
+ if (!tvalIsFood(tval) && !tvalIsLight(tval)) continue;
1310
+ num = 1;
1311
+ }
1312
+
1313
+ /* Exclude if configured to do so based on birth options (player-birth.c
1314
+ * L619-637). RNG order is preserved: rand_range(num) is drawn above, before
1315
+ * any continue, exactly as upstream. */
1316
+ if (!startItemIncluded(si.eopts, opts.opt)) continue;
1317
+
1318
+ /* Prepare a new item. */
1319
+ const obj = objectPrep(rng, reg, constants, kind, 0, "minimise");
1320
+ obj.number = num;
1321
+ obj.origin = ORIGIN.BIRTH;
1322
+
1323
+ /* Deduct the cost of the item from starting cash (player-birth.c L654).
1324
+ * object_value_real draws no RNG. Upstream prices from obj->known; the
1325
+ * port has no known twin, so it prices the real object - the same
1326
+ * approximation the store path uses (obj/value.ts). */
1327
+ player.au -= objectValueReal(reg, obj, obj.number);
1328
+
1329
+ /* obj->known->notice |= OBJ_NOTICE_ASSESSED (player-birth.c L652): a start
1330
+ * item has been handled, so it is assessed from birth. The port keeps that
1331
+ * per-object bit on the live object (objectKnownShadow mirrors it), and
1332
+ * without it the synthesised shadow returned before the flag/element
1333
+ * intersection - so a Wooden Torch's own BURNS_OUT / LIGHT_2 flags read as
1334
+ * UNKNOWN and the character sheet printed '?' down the torch's column even
1335
+ * though those flags are known from birth (learnBirthObviousFlags above). */
1336
+ obj.notice |= OBJ_NOTICE.ASSESSED;
1337
+
1338
+ /* object_flavor_aware(p, obj) (player-birth.c:650). Deferred to the caller
1339
+ * because the awareness store does not exist yet - see onStartKind. */
1340
+ opts.onStartKind?.(kind);
1341
+
1342
+ /* Carry the item. */
1343
+ invenCarry(gear, obj, limits);
1344
+ }
1345
+
1346
+ /* Sanity check: never let the outfit drive starting gold negative
1347
+ * (player-birth.c L662). */
1348
+ if (player.au < 0) player.au = 0;
1349
+
1350
+ /* Now try wielding everything. */
1351
+ wieldAll(gear, player);
1352
+ }