@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,1189 @@
1
+ /**
2
+ * Player calculation tables and helpers, ported VERBATIM from
3
+ * reference/src/player-calcs.c and player-util.c (Angband 4.2.6).
4
+ *
5
+ * The adj_* arrays are the stat-adjustment tables indexed by state->stat_ind
6
+ * (0..STAT_RANGE-1). Each has exactly STAT_RANGE (38) entries. blows_table is
7
+ * the 12x12 blow-energy table; player_exp is the experience needed per level.
8
+ *
9
+ * This module also ports the innate (race/class/stat/level) portion of
10
+ * calc_bonuses as calcBonuses, calc_blows as the pure calcBlows, plus
11
+ * player_flags (player.c), adjust_skill_scale and weight_limit, and the
12
+ * level-1 hitpoint math. The equipment analysis loop and the launcher /
13
+ * weapon analysis ARE ported: pass the worn objects via
14
+ * CalcBonusesOptions.equipment and calc_bonuses applies their stat, skill,
15
+ * combat and resist contributions and derives blows from the wielded weapon.
16
+ * calc_light and the timed effects (food, stun, bless, hero, shero,
17
+ * fast/slow, temp resists, etc.) are now ported (calcLight + the
18
+ * timedEffects-gated blocks in calcBonuses). The per-object curse-object
19
+ * traversal inside the equipment loop (2009-2023) is now ported: a worn item's
20
+ * active curses fold their template objects into the state (pass the bound
21
+ * Curse registry via CalcBonusesOptions.curses). Still DEFERRED (see the
22
+ * calcBonuses notes and parity/ledger/player-calcs-bonuses.yaml):
23
+ * - the learn-by-use rune system that populates obj_k (equipment modifiers
24
+ * are rune-gated and inert at birth)
25
+ * calc_mana (player-calcs.c:2322) is ported (player/spell.ts calcMana) and
26
+ * invoked by the session layer (session/game.ts) right after this pass, split
27
+ * across the calc/session seam; msp is populated there.
28
+ * calc_shapechange is now ported (a non-normal player.shape stacks its
29
+ * combat/skill/flag/modifier/resist package on the state).
30
+ */
31
+ import { OF_SIZE, PF_SIZE, PY_MAX_LEVEL, SKILL, SKILL_MAX, STAT_MAX, STAT_RANGE, TMD_MAX, } from "./types.js";
32
+ import { ELEM, KF, OBJ_MOD, OF, PF, STAT, TMD, TV } from "../generated/index.js";
33
+ import { COLOUR_L_GREEN, COLOUR_RED, COLOUR_YELLOW } from "../color.js";
34
+ import { FlagSet } from "../bitflag.js";
35
+ import { tvalCanHaveFlavor, tvalIsAmmo, tvalIsDigger, tvalIsLight, } from "../obj/object.js";
36
+ import { playerTimedGradeEq } from "./timed.js";
37
+ /* ------------------------------------------------------------------ */
38
+ /* Stat adjustment tables (player-calcs.c), each STAT_RANGE entries */
39
+ /* ------------------------------------------------------------------ */
40
+ /** Stat Table (INT) -- Magic devices. */
41
+ export const adj_int_dev = [
42
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6,
43
+ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13,
44
+ ];
45
+ /** Stat Table (WIS) -- Saving throw. */
46
+ export const adj_wis_sav = [
47
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 7,
48
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
49
+ ];
50
+ /** Stat Table (DEX) -- disarming. */
51
+ export const adj_dex_dis = [
52
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10,
53
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19,
54
+ ];
55
+ /** Stat Table (INT) -- disarming. */
56
+ export const adj_int_dis = [
57
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10,
58
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19,
59
+ ];
60
+ /** Stat Table (DEX) -- bonus to ac. */
61
+ export const adj_dex_ta = [
62
+ -4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5,
63
+ 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 15, 15,
64
+ ];
65
+ /** Stat Table (STR) -- bonus to dam. */
66
+ export const adj_str_td = [
67
+ -2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5,
68
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20,
69
+ ];
70
+ /** Stat Table (DEX) -- bonus to hit. */
71
+ export const adj_dex_th = [
72
+ -3, -2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5,
73
+ 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 15, 15,
74
+ ];
75
+ /** Stat Table (STR) -- bonus to hit. */
76
+ export const adj_str_th = [
77
+ -3, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4,
78
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15,
79
+ ];
80
+ /** Stat Table (STR) -- weight limit in deca-pounds. */
81
+ export const adj_str_wgt = [
82
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 30,
83
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
84
+ ];
85
+ /** Stat Table (STR) -- weapon weight limit in pounds. */
86
+ export const adj_str_hold = [
87
+ 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 35, 40, 45, 50,
88
+ 55, 60, 65, 70, 80, 80, 80, 80, 80, 90, 90, 90, 90, 90, 100, 100, 100,
89
+ ];
90
+ /** Stat Table (STR) -- digging value. */
91
+ export const adj_str_dig = [
92
+ 0, 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 12, 15, 20, 25, 30, 35, 40,
93
+ 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 100, 100,
94
+ ];
95
+ /** Stat Table (STR) -- index into the "blow" table. */
96
+ export const adj_str_blow = [
97
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 30, 40, 50, 60, 70,
98
+ 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230,
99
+ 240,
100
+ ];
101
+ /** Stat Table (DEX) -- index into the "blow" table. */
102
+ export const adj_dex_blow = [
103
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
104
+ 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11,
105
+ ];
106
+ /** Stat Table (DEX) -- chance of avoiding "theft" and "falling". */
107
+ export const adj_dex_safe = [
108
+ 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 15, 15, 20, 25, 30, 35,
109
+ 40, 45, 50, 60, 70, 80, 90, 100, 100, 100, 100, 100, 100, 100, 100,
110
+ ];
111
+ /** Stat Table (CON) -- base regeneration rate. */
112
+ export const adj_con_fix = [
113
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4,
114
+ 4, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9,
115
+ ];
116
+ /** Stat Table (CON) -- extra 1/100th hitpoints per level. */
117
+ export const adj_con_mhp = [
118
+ -250, -150, -100, -75, -50, -25, -10, -5, 0, 5, 10, 25, 50, 75, 100, 150, 175,
119
+ 200, 225, 250, 275, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800,
120
+ 900, 1000, 1100, 1250, 1250, 1250,
121
+ ];
122
+ /** Stat Table (INT/WIS) -- spell study rate. */
123
+ export const adj_mag_study = [
124
+ 0, 0, 10, 20, 30, 40, 50, 60, 70, 80, 85, 90, 95, 100, 105, 110, 115, 120, 130,
125
+ 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 250, 250, 250, 250,
126
+ 250, 250, 250,
127
+ ];
128
+ /** Stat Table (INT/WIS) -- extra 1/100 mana-points per level. */
129
+ export const adj_mag_mana = [
130
+ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170,
131
+ 180, 190, 200, 225, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800,
132
+ 800, 800, 800, 800,
133
+ ];
134
+ /**
135
+ * blows_table[P][D] (player-calcs.c): energy per blow indexed by the STR blow
136
+ * index P (adj_str_blow bucketed) and the DEX blow index D (adj_dex_blow).
137
+ */
138
+ export const blows_table = [
139
+ [100, 100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23],
140
+ [100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23, 21],
141
+ [95, 85, 75, 60, 50, 42, 35, 30, 26, 23, 21, 20],
142
+ [85, 75, 60, 50, 42, 36, 32, 28, 25, 22, 20, 19],
143
+ [75, 60, 50, 42, 36, 33, 28, 25, 23, 21, 19, 18],
144
+ [60, 50, 42, 36, 33, 30, 27, 24, 22, 21, 19, 17],
145
+ [50, 42, 36, 33, 30, 27, 25, 23, 21, 20, 18, 17],
146
+ [42, 36, 33, 30, 28, 26, 24, 22, 20, 19, 18, 17],
147
+ [36, 33, 30, 28, 26, 24, 22, 21, 20, 19, 17, 16],
148
+ [35, 32, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16],
149
+ [34, 30, 27, 25, 23, 22, 21, 20, 19, 18, 17, 16],
150
+ [33, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16, 15],
151
+ ];
152
+ /**
153
+ * Experience needed to reach each level (player.c player_exp[PY_MAX_LEVEL]).
154
+ * player_exp[lev-1] is the base threshold for level lev+1; multiplied by the
155
+ * player's expfact/100.
156
+ */
157
+ export const player_exp = [
158
+ 10, 25, 45, 70, 100, 140, 200, 280, 380, 500, 650, 850, 1100, 1400, 1800, 2300,
159
+ 2900, 3600, 4400, 5400, 6800, 8400, 10200, 12500, 17500, 25000, 35000, 50000,
160
+ 75000, 100000, 150000, 200000, 275000, 350000, 450000, 550000, 700000, 850000,
161
+ 1000000, 1250000, 1500000, 1800000, 2100000, 2400000, 2700000, 3000000, 3500000,
162
+ 4000000, 4500000, 5000000,
163
+ ];
164
+ /* ------------------------------------------------------------------ */
165
+ /* Helpers */
166
+ /* ------------------------------------------------------------------ */
167
+ /** Bounds-checked table read; throws on an out-of-range index. */
168
+ function at(table, i) {
169
+ const v = table[i];
170
+ if (v === undefined) {
171
+ throw new Error(`player: adj table index out of range: ${i}`);
172
+ }
173
+ return v;
174
+ }
175
+ /**
176
+ * modify_stat_value (player-util.c): apply a racial/class stat modifier to a
177
+ * base stat value, using the 3..18/220 encoding (each point below 18 is +1,
178
+ * each point at/above 18 is +10; symmetric on the way down).
179
+ */
180
+ export function modifyStatValue(value, amount) {
181
+ let v = value;
182
+ if (amount > 0) {
183
+ for (let i = 0; i < amount; i++) {
184
+ if (v < 18)
185
+ v++;
186
+ else
187
+ v += 10;
188
+ }
189
+ }
190
+ else if (amount < 0) {
191
+ for (let i = 0; i < -amount; i++) {
192
+ if (v >= 18 + 10)
193
+ v -= 10;
194
+ else if (v > 18)
195
+ v = 18;
196
+ else if (v > 3)
197
+ v--;
198
+ }
199
+ }
200
+ return v;
201
+ }
202
+ /**
203
+ * The stat_ind computation from calc_bonuses: map a modified stat "use" value
204
+ * to its index into the adj_* tables (0..STAT_RANGE-1).
205
+ */
206
+ export function statUseToIndex(use) {
207
+ let ind;
208
+ if (use <= 3)
209
+ ind = 0;
210
+ else if (use <= 18)
211
+ ind = use - 3;
212
+ else if (use <= 18 + 219)
213
+ ind = 15 + Math.trunc((use - 18) / 10);
214
+ else
215
+ ind = 37;
216
+ if (ind < 0 || ind >= STAT_RANGE) {
217
+ throw new Error(`player: stat index out of range: ${ind}`);
218
+ }
219
+ return ind;
220
+ }
221
+ /**
222
+ * Compute the stat_ind array (indices into adj_* tables) for a race/class at a
223
+ * given set of base stat values (state->stat_ind in calc_bonuses, without the
224
+ * hypothetical-blow hack). stat_add (equipment) is DEFERRED and treated as 0.
225
+ */
226
+ export function calcStatIndices(race, cls, statCur) {
227
+ const out = new Array(STAT_MAX).fill(0);
228
+ for (let i = 0; i < STAT_MAX; i++) {
229
+ const add = (race.statAdj[i] ?? 0) + (cls.statAdj[i] ?? 0);
230
+ const use = modifyStatValue(statCur[i] ?? 0, add);
231
+ out[i] = statUseToIndex(use);
232
+ }
233
+ return out;
234
+ }
235
+ /**
236
+ * calc_hitpoints (player-calcs.c): maximum hitpoints at a level, given the
237
+ * accumulated player_hp roll for that level and the CON stat index.
238
+ * mhp = player_hp[lev-1] + adj_con_mhp[con_ind] * lev / 100, floored at lev+1.
239
+ */
240
+ export function calcHitpoints(playerHpAtLevel, lev, conInd) {
241
+ const bonus = at(adj_con_mhp, conInd);
242
+ let mhp = playerHpAtLevel + Math.trunc((bonus * lev) / 100);
243
+ if (mhp < lev + 1)
244
+ mhp = lev + 1;
245
+ return mhp;
246
+ }
247
+ /**
248
+ * The "Modify skills" tail of calc_bonuses (player-calcs.c:2239-2250),
249
+ * applied in the exact upstream statement order:
250
+ * DISARM_PHYS += adj_dex_dis[stat_ind[DEX]] (2240)
251
+ * DISARM_MAGIC += adj_int_dis[stat_ind[INT]] (2241)
252
+ * DEVICE += adj_int_dev[stat_ind[INT]] (2242)
253
+ * SAVE += adj_wis_sav[stat_ind[WIS]] (2243)
254
+ * DIGGING += adj_str_dig[stat_ind[STR]] (2244)
255
+ * skills[i] += x_skills[i] * lev / 10 (2245-2246)
256
+ * then DIGGING is floored at 1 and STEALTH clamped to [0, 30] (2248-2250).
257
+ */
258
+ function applySkillStatAndLevel(skills, cls, lev, statInd) {
259
+ skills[SKILL.DISARM_PHYS] =
260
+ (skills[SKILL.DISARM_PHYS] ?? 0) + at(adj_dex_dis, statInd[STAT.DEX] ?? 0);
261
+ skills[SKILL.DISARM_MAGIC] =
262
+ (skills[SKILL.DISARM_MAGIC] ?? 0) + at(adj_int_dis, statInd[STAT.INT] ?? 0);
263
+ skills[SKILL.DEVICE] =
264
+ (skills[SKILL.DEVICE] ?? 0) + at(adj_int_dev, statInd[STAT.INT] ?? 0);
265
+ skills[SKILL.SAVE] =
266
+ (skills[SKILL.SAVE] ?? 0) + at(adj_wis_sav, statInd[STAT.WIS] ?? 0);
267
+ skills[SKILL.DIGGING] =
268
+ (skills[SKILL.DIGGING] ?? 0) + at(adj_str_dig, statInd[STAT.STR] ?? 0);
269
+ for (let i = 0; i < SKILL_MAX; i++) {
270
+ skills[i] = (skills[i] ?? 0) + Math.trunc(((cls.extraSkills[i] ?? 0) * lev) / 10);
271
+ }
272
+ if ((skills[SKILL.DIGGING] ?? 0) < 1)
273
+ skills[SKILL.DIGGING] = 1;
274
+ if ((skills[SKILL.STEALTH] ?? 0) > 30)
275
+ skills[SKILL.STEALTH] = 30;
276
+ if ((skills[SKILL.STEALTH] ?? 0) < 0)
277
+ skills[SKILL.STEALTH] = 0;
278
+ }
279
+ /**
280
+ * The non-equipment portion of calc_bonuses skill computation: base
281
+ * skills[i] = r_skills[i] + c_skills[i] (player-calcs.c:1904-1906) followed
282
+ * by the stat and level adjustments (2239-2250, see applySkillStatAndLevel).
283
+ * For a player with no equipment, no timed effects and the normal shape this
284
+ * equals calcBonuses(player).skills.
285
+ */
286
+ export function calcSkills(race, cls, lev, statInd) {
287
+ const skills = new Array(SKILL_MAX).fill(0);
288
+ for (let i = 0; i < SKILL_MAX; i++) {
289
+ skills[i] = (race.skills[i] ?? 0) + (cls.skills[i] ?? 0);
290
+ }
291
+ applySkillStatAndLevel(skills, cls, lev, statInd);
292
+ return skills;
293
+ }
294
+ /**
295
+ * player_flags (player.c:290-300): the player's innate object flags -- racial
296
+ * flags unioned with class flags, plus OF_PROT_FEAR for PF_BRAVERY_30
297
+ * classes at level 30+. Returns a fresh OF-sized flag set (upstream fills a
298
+ * caller buffer).
299
+ */
300
+ export function playerFlags(player) {
301
+ const f = new FlagSet(OF_SIZE);
302
+ f.copy(player.race.flags);
303
+ f.union(player.cls.flags);
304
+ if ((player.race.pflags.has(PF.BRAVERY_30) ||
305
+ player.cls.pflags.has(PF.BRAVERY_30)) &&
306
+ player.lev >= 30) {
307
+ f.on(OF.PROT_FEAR);
308
+ }
309
+ return f;
310
+ }
311
+ /**
312
+ * player_hp_attr (player.c:323): the colour the current hitpoints are drawn
313
+ * in - COLOUR_L_GREEN at full health, COLOUR_YELLOW while above the
314
+ * hitpoint-warning fraction (mhp * hitpoint_warn / 10), else COLOUR_RED.
315
+ * `hitpointWarn` is op_ptr->hitpoint_warn (0..9); the options store is
316
+ * deferred, so the caller supplies it.
317
+ */
318
+ export function playerHpAttr(p, hitpointWarn) {
319
+ if (p.chp >= p.mhp)
320
+ return COLOUR_L_GREEN;
321
+ if (p.chp > Math.trunc((p.mhp * hitpointWarn) / 10))
322
+ return COLOUR_YELLOW;
323
+ return COLOUR_RED;
324
+ }
325
+ /**
326
+ * player_sp_attr (player.c:337): the spell-point colour, identical thresholds
327
+ * to player_hp_attr but on csp / msp.
328
+ */
329
+ export function playerSpAttr(p, hitpointWarn) {
330
+ if (p.csp >= p.msp)
331
+ return COLOUR_L_GREEN;
332
+ if (p.csp > Math.trunc((p.msp * hitpointWarn) / 10))
333
+ return COLOUR_YELLOW;
334
+ return COLOUR_RED;
335
+ }
336
+ /**
337
+ * adjust_skill_scale (player-calcs.c:1781-1792): adjust a value by a
338
+ * relative factor of its absolute value, mimicking value * (den + num) / den
339
+ * for positive values (negative num rounds the adjustment up). Returns the
340
+ * adjusted value instead of mutating through a pointer.
341
+ */
342
+ export function adjustSkillScale(v, num, den, minv) {
343
+ if (num >= 0) {
344
+ return v + Math.trunc((Math.max(minv, Math.abs(v)) * num) / den);
345
+ }
346
+ /* To mimic (value * (den + num)) / den for positive value, round up. */
347
+ return v - Math.trunc((Math.max(minv, Math.abs(v)) * -num + den - 1) / den);
348
+ }
349
+ /**
350
+ * weight_limit (player-calcs.c:1741-1750): the carrying capacity in tenth
351
+ * pounds, based only on strength.
352
+ */
353
+ export function weightLimit(state) {
354
+ return at(adj_str_wgt, state.statInd[STAT.STR] ?? 0) * 100;
355
+ }
356
+ /**
357
+ * weight_remaining (player-calcs.c:1752-1765): tenth-pounds of carry capacity
358
+ * left before becoming burdened - `60 * adj_str_wgt[STR] - total_weight - 1`,
359
+ * which is NEGATIVE while there is room to spare (the character sheet prints
360
+ * `-diff/10`, so spare capacity shows as a negative "Overweight" figure, and
361
+ * real encumbrance shows as a positive one).
362
+ */
363
+ export function weightRemaining(state, totalWeight) {
364
+ return 60 * at(adj_str_wgt, state.statInd[STAT.STR] ?? 0) - totalWeight - 1;
365
+ }
366
+ /**
367
+ * calc_blows (player-calcs.c:1703-1735): the blows a player would get with a
368
+ * weapon of the given weight, as a pure function of the class blow
369
+ * parameters and the STR/DEX stat indices (state->stat_ind upstream).
370
+ *
371
+ * \param cls supplies min_weight, att_multiply and max_attacks.
372
+ * \param weaponWeight is object_weight_one(obj) in tenth pounds, or null for
373
+ * no weapon (upstream passes obj == NULL and uses weight 0, so the class
374
+ * min_weight becomes the divisor).
375
+ * \param strInd / dexInd are stat_ind[STAT_STR] / stat_ind[STAT_DEX].
376
+ * \param extraBlows is the +blows total from gear and state (innately 0).
377
+ * \param percentDamage is OPT(p, birth_percent_damage): O-combat requires
378
+ * two blows minimum instead of one.
379
+ * \returns 100x the number of blows.
380
+ */
381
+ export function calcBlows(cls, weaponWeight, strInd, dexInd, extraBlows = 0, percentDamage = false) {
382
+ const weight = weaponWeight === null ? 0 : weaponWeight;
383
+ const minWeight = cls.minWeight;
384
+ /* Enforce a minimum "weight" (tenth pounds) (1715). */
385
+ const div = weight < minWeight ? minWeight : weight;
386
+ /* Get the strength vs weight (1717-1722). */
387
+ let strIndex = Math.trunc((at(adj_str_blow, strInd) * cls.attMultiply) / div);
388
+ if (strIndex > 11)
389
+ strIndex = 11;
390
+ /* Index by dexterity (1724-1725). */
391
+ const dexIndex = Math.min(at(adj_dex_blow, dexInd), 11);
392
+ /* Use the blows table to get energy per blow (1727-1730). */
393
+ const blowEnergy = blows_table[strIndex]?.[dexIndex];
394
+ if (blowEnergy === undefined) {
395
+ throw new Error(`player: blows_table index out of range: ${strIndex},${dexIndex}`);
396
+ }
397
+ const blows = Math.min(Math.trunc(10000 / blowEnergy), 100 * cls.maxAttacks);
398
+ /* Require at least one blow, two for O-combat (1732-1734). */
399
+ return Math.max(blows + 100 * extraBlows, percentDamage ? 200 : 100);
400
+ }
401
+ /**
402
+ * calc_light (player-calcs.c:1598-1645): set state.curLight to the sum of the
403
+ * light radii of every wielded light source. Each slot contributes OF_LIGHT_2
404
+ * (2) or OF_LIGHT_3 (3) plus its OBJ_MOD_LIGHT modifier, an UNLIGHT player
405
+ * loses 1 from any positive +LIGHT item, and a tval-light item with fuel that
406
+ * has run out (timeout == 0, no NO_FUEL) contributes nothing.
407
+ *
408
+ * FAITHFULNESS: obj->modifiers[OBJ_MOD_LIGHT] is read RAW here (1629), NOT
409
+ * multiplied by the learned-rune mask obj_k like the pval modifiers in the
410
+ * equipment loop -- upstream calc_light does not rune-gate light. Do not
411
+ * "consistency-fix" this into a knownMods multiply; that would diverge.
412
+ */
413
+ function calcLight(player, state, options) {
414
+ /* Assume no light (1604). */
415
+ state.curLight = 0;
416
+ /* Ascertain lightness if in the town (1606-1613). is_daytime() comes from
417
+ the world clock (deferred), so isDaytime defaults false and this branch
418
+ is dormant in the dungeon-only build.
419
+ TODO(world-clock): when isDaytime becomes real, also reinstate the
420
+ upstream visual refresh here -- calc_light sets p->upkeep->update |=
421
+ (PU_UPDATE_VIEW | PU_MONSTERS) when the town light changes (1608-1611)
422
+ before returning. The port must trigger the equivalent view/monster
423
+ refresh on the town daytime path once the town/world clock lands. */
424
+ const depth = options.depth;
425
+ const update = options.update ?? true;
426
+ if (depth === 0 && (options.isDaytime ?? false) && update) {
427
+ return;
428
+ }
429
+ const equipment = options.equipment ?? [];
430
+ /* Examine all wielded objects, use the brightest (1615-1644). */
431
+ for (let i = 0; i < player.body.count; i++) {
432
+ let amt = 0;
433
+ const obj = equipment[i] ?? null;
434
+ /* Skip empty slots (1621). */
435
+ if (!obj)
436
+ continue;
437
+ /* Light radius - innate plus modifier (1623-1629). */
438
+ if (obj.flags.has(OF.LIGHT_2)) {
439
+ amt = 2;
440
+ }
441
+ else if (obj.flags.has(OF.LIGHT_3)) {
442
+ amt = 3;
443
+ }
444
+ amt += obj.modifiers[OBJ_MOD.LIGHT] ?? 0;
445
+ /* Adjustment to allow UNLIGHT players to use +1 LIGHT gear (1631-1634). */
446
+ if ((obj.modifiers[OBJ_MOD.LIGHT] ?? 0) > 0 && state.pflags.has(PF.UNLIGHT)) {
447
+ amt--;
448
+ }
449
+ /* Examine actual lights: no fuel means no light (1636-1640). */
450
+ if (tvalIsLight(obj.tval) && !obj.flags.has(OF.NO_FUEL) && obj.timeout === 0) {
451
+ amt = 0;
452
+ }
453
+ /* Alter cur_light if reasonable (1643). */
454
+ state.curLight += amt;
455
+ }
456
+ }
457
+ /**
458
+ * calc_bonuses (player-calcs.c:1877-2331), innate portion: derives the
459
+ * player's state from race/class intrinsics, stats, level, the worn
460
+ * equipment (options.equipment) and the timed effects (options.timedEffects
461
+ * + player.timed). With no equipment supplied the player is unarmed and
462
+ * unarmored (the just-born default); with no timed table supplied the timed
463
+ * model is inert (see CalcBonusesOptions.timedEffects).
464
+ *
465
+ * Ported statement-for-statement in upstream order; each block cites its
466
+ * lines. DEFERRED blocks (see parity/ledger/player-calcs-bonuses.yaml), all
467
+ * of which are no-ops for the innate state:
468
+ * - the learn-by-use rune system that populates obj_k: equipment modifiers
469
+ * are rune-gated (obj->modifiers * obj_k->modifiers) and UNKNOWN at birth
470
+ * (decision 25), so they contribute nothing until a rune is learned. The
471
+ * per-object curse-object traversal in the equipment loop (2009-2023) is
472
+ * now ported (see options.curses)
473
+ * - calc_light (2040-2041), the food-grade block (2094-2132) and the timed
474
+ * block (2134-2213) are now ported (calcLight + the timedEffects-gated
475
+ * blocks below); the launcher analysis (2254-2288) and weapon analysis
476
+ * (2291-2319) are ported and the wielded weapon drives num_blows/digging
477
+ * - calc_mana (2322): ported (player/spell.ts calcMana) but called by the
478
+ * session layer just after this pass, not inline; the PF_NO_MANA check
479
+ * (2323-2325) is ported here and reads p->msp populated by that call
480
+ * - the known_only object-knowledge variant and the !update hypothetical
481
+ * blows index shift (1891-1893, 2077-2088): birth-UI only
482
+ */
483
+ export function calcBonuses(player, options = {}) {
484
+ const race = player.race;
485
+ const cls = player.cls;
486
+ const elemCount = race.elInfo.length;
487
+ /* extra_blows/shots/might/moves accumulate from equipment modifiers and
488
+ feed the launcher / weapon / movement analysis below (0 when unarmed). */
489
+ let extraBlows = 0;
490
+ let extraShots = 0;
491
+ let extraMight = 0;
492
+ let extraMoves = 0;
493
+ /* The wielded weapon and launcher, captured during the equipment loop. */
494
+ let weapon = null;
495
+ let launcher = null;
496
+ /* Reset (1896) and set various defaults (1898-1900). */
497
+ const state = {
498
+ statAdd: new Array(STAT_MAX).fill(0),
499
+ statInd: new Array(STAT_MAX).fill(0),
500
+ statUse: new Array(STAT_MAX).fill(0),
501
+ statTop: new Array(STAT_MAX).fill(0),
502
+ skills: new Array(SKILL_MAX).fill(0),
503
+ speed: 110,
504
+ numBlows: 100,
505
+ numShots: 0,
506
+ numMoves: 0,
507
+ ammoMult: 0,
508
+ ammoTval: 0,
509
+ ac: 0,
510
+ damRed: 0,
511
+ percDamRed: 0,
512
+ toA: 0,
513
+ toH: 0,
514
+ toD: 0,
515
+ seeInfra: 0,
516
+ curLight: 0,
517
+ heavyWield: false,
518
+ heavyShoot: false,
519
+ blessWield: false,
520
+ cumberArmor: false,
521
+ flags: new FlagSet(OF_SIZE),
522
+ pflags: new FlagSet(PF_SIZE),
523
+ elInfo: [],
524
+ hold: 0,
525
+ };
526
+ /* Extract race/class info (1902-1914). */
527
+ state.seeInfra = race.infravision;
528
+ for (let i = 0; i < SKILL_MAX; i++) {
529
+ state.skills[i] = (race.skills[i] ?? 0) + (cls.skills[i] ?? 0);
530
+ }
531
+ const vuln = new Array(elemCount).fill(false);
532
+ for (let i = 0; i < elemCount; i++) {
533
+ const raceRes = race.elInfo[i]?.resLevel ?? 0;
534
+ if (raceRes === -1) {
535
+ vuln[i] = true;
536
+ state.elInfo.push({ resLevel: 0 });
537
+ }
538
+ else {
539
+ state.elInfo.push({ resLevel: raceRes });
540
+ }
541
+ }
542
+ /* Base pflags (1916-1919). */
543
+ state.pflags.wipe();
544
+ state.pflags.copy(race.pflags);
545
+ state.pflags.union(cls.pflags);
546
+ /* Extract the player flags (1921-1922; player.c:290-300). */
547
+ const collectF = playerFlags(player);
548
+ /* Analyze equipment (1924-2025). Equipped objects arrive from the caller
549
+ (options.equipment, indexed by body slot). Each item's pval MODIFIERS are
550
+ gated by the player's learned-rune mask (p->obj_k->modifiers): upstream
551
+ multiplies every modifier by obj_k, so a bonus is inert until its rune is
552
+ known, and runes are UNKNOWN by default (PORT_PLAN.md decision 25) -- at
553
+ birth, item modifiers contribute nothing until learned. The el_info and
554
+ combat bonuses (to_a/to_h/to_d) are NOT rune-gated for the real state
555
+ (upstream gates those only for the displayed known_state), so they apply
556
+ unconditionally here.
557
+
558
+ Per-object curse traversal (2009-2023) IS ported: the inner while walks
559
+ from the worn item to each of its active curse objects, folding each
560
+ one's own template object (modifiers/flags/toH/toD/toA/elInfo) into the
561
+ state through the SAME loop body (applySource), in the exact upstream
562
+ accumulation order (worn item first, then its curses in ascending index
563
+ order). The curse template objects come from the bound registry
564
+ (options.curses == upstream's global curses[]); a curse object carries no
565
+ ac and no tval, matching the zeroed fields of the upstream curse struct
566
+ (curse ac is a guaranteed no-op, tval 0 makes tval_is_digger false).
567
+ Still DEFERRED (parity ledger): the learn-by-use rune system that
568
+ populates obj_k (obj-knowledge.c), pending its own increment. */
569
+ const equipment = options.equipment ?? [];
570
+ const curseTable = options.curses ?? [];
571
+ const knownMods = player.objKnown.modifiers;
572
+ const applySource = (src, isWeaponSlot, isBowSlot) => {
573
+ /* Extract the item flags (1933-1939). */
574
+ collectF.union(src.flags);
575
+ /* Apply modifiers (1941-1981), each multiplied by the learned-rune mask
576
+ (obj->modifiers[X] * p->obj_k->modifiers[X]). The five stat modifiers
577
+ share indices with STAT_* (OBJ_MOD_STR == STAT_STR == 0). */
578
+ for (let s = 0; s < STAT_MAX; s++) {
579
+ state.statAdd[s] =
580
+ (state.statAdd[s] ?? 0) + (src.modifiers[s] ?? 0) * (knownMods[s] ?? 0);
581
+ }
582
+ state.skills[SKILL.STEALTH] =
583
+ (state.skills[SKILL.STEALTH] ?? 0) +
584
+ (src.modifiers[OBJ_MOD.STEALTH] ?? 0) * (knownMods[OBJ_MOD.STEALTH] ?? 0);
585
+ state.skills[SKILL.SEARCH] =
586
+ (state.skills[SKILL.SEARCH] ?? 0) +
587
+ (src.modifiers[OBJ_MOD.SEARCH] ?? 0) * 5 * (knownMods[OBJ_MOD.SEARCH] ?? 0);
588
+ state.seeInfra +=
589
+ (src.modifiers[OBJ_MOD.INFRA] ?? 0) * (knownMods[OBJ_MOD.INFRA] ?? 0);
590
+ let dig = 0;
591
+ if (tvalIsDigger(src.tval)) {
592
+ if (src.flags.has(OF.DIG_1))
593
+ dig = 1;
594
+ else if (src.flags.has(OF.DIG_2))
595
+ dig = 2;
596
+ else if (src.flags.has(OF.DIG_3))
597
+ dig = 3;
598
+ }
599
+ dig += (src.modifiers[OBJ_MOD.TUNNEL] ?? 0) * (knownMods[OBJ_MOD.TUNNEL] ?? 0);
600
+ state.skills[SKILL.DIGGING] = (state.skills[SKILL.DIGGING] ?? 0) + dig * 20;
601
+ state.speed +=
602
+ (src.modifiers[OBJ_MOD.SPEED] ?? 0) * (knownMods[OBJ_MOD.SPEED] ?? 0);
603
+ state.damRed +=
604
+ (src.modifiers[OBJ_MOD.DAM_RED] ?? 0) * (knownMods[OBJ_MOD.DAM_RED] ?? 0);
605
+ extraBlows += (src.modifiers[OBJ_MOD.BLOWS] ?? 0) * (knownMods[OBJ_MOD.BLOWS] ?? 0);
606
+ extraShots += (src.modifiers[OBJ_MOD.SHOTS] ?? 0) * (knownMods[OBJ_MOD.SHOTS] ?? 0);
607
+ extraMight += (src.modifiers[OBJ_MOD.MIGHT] ?? 0) * (knownMods[OBJ_MOD.MIGHT] ?? 0);
608
+ extraMoves += (src.modifiers[OBJ_MOD.MOVES] ?? 0) * (knownMods[OBJ_MOD.MOVES] ?? 0);
609
+ /* Apply element info, noting vulnerabilities for later (1983-1993). */
610
+ for (let jj = 0; jj < elemCount; jj++) {
611
+ const oel = src.elInfo[jj];
612
+ const sel = state.elInfo[jj];
613
+ if (!oel)
614
+ continue;
615
+ if (oel.resLevel === -1)
616
+ vuln[jj] = true;
617
+ if (oel.resLevel > sel.resLevel)
618
+ sel.resLevel = oel.resLevel;
619
+ }
620
+ /* Apply combat bonuses (1995-2007). The wielded weapon's and launcher's
621
+ own to_h/to_d are applied at attack time, not here. A curse object's ac
622
+ is 0 (curse struct carries none). */
623
+ state.ac += src.ac;
624
+ state.toA += src.toA;
625
+ if (!isWeaponSlot && !isBowSlot) {
626
+ state.toH += src.toH;
627
+ state.toD += src.toD;
628
+ }
629
+ };
630
+ for (let i = 0; i < player.body.count; i++) {
631
+ const worn = equipment[i] ?? null;
632
+ if (!worn)
633
+ continue;
634
+ const slotType = player.body.slots[i]?.type;
635
+ const isWeaponSlot = slotType === "WEAPON";
636
+ const isBowSlot = slotType === "BOW";
637
+ /* weapon/launcher are the WORN items (upstream reads them by slot name
638
+ before the loop, 1885-1886); a curse object never becomes the weapon. */
639
+ if (isWeaponSlot)
640
+ weapon = worn;
641
+ if (isBowSlot)
642
+ launcher = worn;
643
+ /* curse := obj->curses, the worn item's curse_data array, held fixed while
644
+ we walk the item and its curse objects (1928, 2009-2023). */
645
+ const curse = worn.curses;
646
+ let obj = worn;
647
+ let index = 0;
648
+ while (obj) {
649
+ applySource(obj, isWeaponSlot, isBowSlot);
650
+ /* Move to any unprocessed curse object (2009-2023). Scan the worn item's
651
+ curse_data for the next active (power != 0) curse, resolving its
652
+ template object from the bound registry (curses[index].obj). The scan
653
+ bound is z_info->curse_max == curseTable.length. */
654
+ if (curse) {
655
+ index++;
656
+ obj = null;
657
+ while (index < curseTable.length) {
658
+ if (curse[index]?.power) {
659
+ const template = curseTable[index]?.obj;
660
+ obj = template
661
+ ? {
662
+ flags: template.flags,
663
+ modifiers: template.modifiers,
664
+ elInfo: template.elInfo,
665
+ ac: 0,
666
+ toA: template.toA,
667
+ toH: template.toH,
668
+ toD: template.toD,
669
+ tval: 0,
670
+ }
671
+ : null;
672
+ break;
673
+ }
674
+ else {
675
+ index++;
676
+ }
677
+ }
678
+ }
679
+ else {
680
+ obj = null;
681
+ }
682
+ }
683
+ }
684
+ /* Apply the collected flags (2027-2028). */
685
+ state.flags.union(collectF);
686
+ /* Add shapechange info (calc_shapechange, 1798/2030): a non-normal
687
+ shape's combat bonuses, skills, flags and modifiers stack on top of
688
+ the equipment, and its resists apply when better (vulnerabilities
689
+ join the vuln pass below). The normal shape is null (all zeros). */
690
+ const shape = player.shape;
691
+ if (shape) {
692
+ state.toA += shape.toA;
693
+ state.toH += shape.toH;
694
+ state.toD += shape.toD;
695
+ for (let i = 0; i < SKILL_MAX; i++) {
696
+ state.skills[i] = (state.skills[i] ?? 0) + (shape.skills[i] ?? 0);
697
+ }
698
+ state.flags.union(shape.flags);
699
+ state.pflags.union(shape.pflags);
700
+ for (let s = 0; s < STAT_MAX; s++) {
701
+ state.statAdd[s] = (state.statAdd[s] ?? 0) + (shape.modifiers[s] ?? 0);
702
+ }
703
+ state.skills[SKILL.STEALTH] =
704
+ (state.skills[SKILL.STEALTH] ?? 0) +
705
+ (shape.modifiers[OBJ_MOD.STEALTH] ?? 0);
706
+ state.skills[SKILL.SEARCH] =
707
+ (state.skills[SKILL.SEARCH] ?? 0) +
708
+ (shape.modifiers[OBJ_MOD.SEARCH] ?? 0) * 5;
709
+ state.seeInfra += shape.modifiers[OBJ_MOD.INFRA] ?? 0;
710
+ state.skills[SKILL.DIGGING] =
711
+ (state.skills[SKILL.DIGGING] ?? 0) +
712
+ (shape.modifiers[OBJ_MOD.TUNNEL] ?? 0) * 20;
713
+ state.speed += shape.modifiers[OBJ_MOD.SPEED] ?? 0;
714
+ state.damRed += shape.modifiers[OBJ_MOD.DAM_RED] ?? 0;
715
+ extraBlows += shape.modifiers[OBJ_MOD.BLOWS] ?? 0;
716
+ extraShots += shape.modifiers[OBJ_MOD.SHOTS] ?? 0;
717
+ extraMight += shape.modifiers[OBJ_MOD.MIGHT] ?? 0;
718
+ extraMoves += shape.modifiers[OBJ_MOD.MOVES] ?? 0;
719
+ /* Resists and vulnerabilities. */
720
+ for (let i = 0; i < elemCount; i++) {
721
+ const sel = state.elInfo[i];
722
+ const res = shape.elInfo[i]?.resLevel ?? 0;
723
+ if (res === -1)
724
+ vuln[i] = true;
725
+ else if (res > sel.resLevel)
726
+ sel.resLevel = res;
727
+ }
728
+ }
729
+ /* Now deal with vulnerabilities (2034-2038). */
730
+ for (let i = 0; i < elemCount; i++) {
731
+ const el = state.elInfo[i];
732
+ if (vuln[i] && el.resLevel < 3)
733
+ el.resLevel--;
734
+ }
735
+ /* Calculate light (2040-2041). */
736
+ calcLight(player, state, options);
737
+ /* Unlight (2043-2046). */
738
+ const characterDungeon = options.characterDungeon ?? false;
739
+ if (state.pflags.has(PF.UNLIGHT) && characterDungeon) {
740
+ const el = state.elInfo[ELEM.DARK];
741
+ if (el)
742
+ el.resLevel = 1;
743
+ }
744
+ /* Evil (2048-2052). */
745
+ if (state.pflags.has(PF.EVIL) && characterDungeon) {
746
+ const nether = state.elInfo[ELEM.NETHER];
747
+ if (nether)
748
+ nether.resLevel = 1;
749
+ const holy = state.elInfo[ELEM.HOLY_ORB];
750
+ if (holy)
751
+ holy.resLevel = -1;
752
+ }
753
+ /* Calculate the various stat values (2054-2092). */
754
+ for (let i = 0; i < STAT_MAX; i++) {
755
+ let add = state.statAdd[i] ?? 0;
756
+ add += (race.statAdj[i] ?? 0) + (cls.statAdj[i] ?? 0);
757
+ state.statTop[i] = modifyStatValue(player.statMax[i] ?? 0, add);
758
+ const use = modifyStatValue(player.statCur[i] ?? 0, add);
759
+ state.statUse[i] = use;
760
+ let ind = statUseToIndex(use);
761
+ /* The !update hypothetical-blows index shift (2077-2088): applied only
762
+ when a caller supplies statIndBoost (obj-info's hypothetical re-derive);
763
+ the live refresh path leaves it undefined and takes the update=true
764
+ branch (no shift). */
765
+ const boost = options.statIndBoost;
766
+ if (boost) {
767
+ if (i === STAT.STR)
768
+ ind = Math.max(3, Math.min(37, ind + boost.str));
769
+ else if (i === STAT.DEX)
770
+ ind = Math.max(3, Math.min(37, ind + boost.dex));
771
+ }
772
+ state.statInd[i] = ind;
773
+ }
774
+ /* The timed model (FOOD 2094-2132 + the timed block 2134-2213) is gated on
775
+ the bound table being supplied. An empty table disables BOTH halves -- the
776
+ table-driven grade / flag / temp_resist logic AND the per-timer combat
777
+ branches -- so a caller that omits the table gets a consistent "no timed
778
+ effects" derive rather than a partial one (see CalcBonusesOptions). */
779
+ const timedEffects = options.timedEffects ?? [];
780
+ const update = options.update ?? true;
781
+ if (timedEffects.length > 0) {
782
+ /* Effects of food outside the "Fed" range (2094-2132). PY_FOOD_* are the
783
+ FOOD grade maxes (player-timed.c:320-338), already FOOD_VALUE-scaled in
784
+ the bound table: Fed.max = PY_FOOD_FULL, Full.max = PY_FOOD_MAX,
785
+ Hungry.max = PY_FOOD_HUNGRY. */
786
+ const foodEffect = timedEffects[TMD.FOOD];
787
+ if (foodEffect && !playerTimedGradeEq(player, foodEffect, "Fed")) {
788
+ const foodMax = (name) => foodEffect.grades.find((g) => g.name === name)?.max ?? 0;
789
+ const pyFoodFull = foodMax("Fed");
790
+ const pyFoodMax = foodMax("Full");
791
+ const pyFoodHungry = foodMax("Hungry");
792
+ const food = player.timed[TMD.FOOD] ?? 0;
793
+ const excess = food - pyFoodFull;
794
+ const lack = pyFoodHungry - food;
795
+ if (excess > 0 && !player.timed[TMD.ATT_VAMP]) {
796
+ /* Scale to units 1/10 of the range and subtract from speed. */
797
+ state.speed -= Math.trunc((excess * 10) / (pyFoodMax - pyFoodFull));
798
+ }
799
+ else if (lack > 0) {
800
+ /* Scale to units 1/20 of the range. */
801
+ const l = Math.trunc((lack * 20) / pyFoodHungry);
802
+ state.toH -= l;
803
+ state.toD -= l;
804
+ if (l > 10 && l <= 15) {
805
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 10, 0);
806
+ }
807
+ else if (l > 15 && l <= 18) {
808
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
809
+ state.skills[SKILL.DISARM_PHYS] =
810
+ Math.trunc(((state.skills[SKILL.DISARM_PHYS] ?? 0) * 9) / 10);
811
+ state.skills[SKILL.DISARM_MAGIC] =
812
+ Math.trunc(((state.skills[SKILL.DISARM_MAGIC] ?? 0) * 9) / 10);
813
+ }
814
+ else if (l > 18) {
815
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -3, 10, 0);
816
+ state.skills[SKILL.DISARM_PHYS] =
817
+ Math.trunc(((state.skills[SKILL.DISARM_PHYS] ?? 0) * 8) / 10);
818
+ state.skills[SKILL.DISARM_MAGIC] =
819
+ Math.trunc(((state.skills[SKILL.DISARM_MAGIC] ?? 0) * 8) / 10);
820
+ state.skills[SKILL.SAVE] =
821
+ Math.trunc(((state.skills[SKILL.SAVE] ?? 0) * 9) / 10);
822
+ state.skills[SKILL.SEARCH] =
823
+ Math.trunc(((state.skills[SKILL.SEARCH] ?? 0) * 9) / 10);
824
+ }
825
+ }
826
+ }
827
+ /* Other timed effects (2134-2213). */
828
+ /* player_flags_timed (2135; player.c:310-320): OR each active effect's
829
+ oflag_dup into state.flags, except TMD_TRAPSAFE (excluded so the
830
+ OF_TRAP_IMMUNE learning hack can tell timed from innate). */
831
+ for (let i = 0; i < TMD_MAX; i++) {
832
+ const eff = timedEffects[i];
833
+ if (player.timed[i] &&
834
+ eff &&
835
+ eff.oflagDup !== 0 &&
836
+ i !== TMD.TRAPSAFE) {
837
+ state.flags.on(eff.oflagDup);
838
+ }
839
+ }
840
+ /* STUN grade (2137-2151): the FASTCAST-zeroing is the one faithful
841
+ player.timed mutation this derive makes, gated on `update`. */
842
+ const stunEffect = timedEffects[TMD.STUN];
843
+ if (stunEffect && playerTimedGradeEq(player, stunEffect, "Heavy Stun")) {
844
+ state.toH -= 20;
845
+ state.toD -= 20;
846
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
847
+ if (update)
848
+ player.timed[TMD.FASTCAST] = 0;
849
+ }
850
+ else if (stunEffect && playerTimedGradeEq(player, stunEffect, "Stun")) {
851
+ state.toH -= 5;
852
+ state.toD -= 5;
853
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 10, 0);
854
+ if (update)
855
+ player.timed[TMD.FASTCAST] = 0;
856
+ }
857
+ if (player.timed[TMD.INVULN]) {
858
+ state.toA += 100;
859
+ }
860
+ if (player.timed[TMD.BLESSED]) {
861
+ state.toA += 5;
862
+ state.toH += 10;
863
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, 1, 20, 0);
864
+ }
865
+ if (player.timed[TMD.SHIELD]) {
866
+ state.toA += 50;
867
+ }
868
+ if (player.timed[TMD.STONESKIN]) {
869
+ state.toA += 40;
870
+ state.speed -= 5;
871
+ }
872
+ if (player.timed[TMD.HERO]) {
873
+ state.toH += 12;
874
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, 1, 20, 0);
875
+ }
876
+ if (player.timed[TMD.SHERO]) {
877
+ state.skills[SKILL.TO_HIT_MELEE] =
878
+ (state.skills[SKILL.TO_HIT_MELEE] ?? 0) + 75;
879
+ state.toA -= 10;
880
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 10, 0);
881
+ }
882
+ if (player.timed[TMD.FAST] || player.timed[TMD.SPRINT]) {
883
+ state.speed += 10;
884
+ }
885
+ if (player.timed[TMD.SLOW]) {
886
+ state.speed -= 10;
887
+ }
888
+ if (player.timed[TMD.SINFRA]) {
889
+ state.seeInfra += 5;
890
+ }
891
+ if (player.timed[TMD.TERROR]) {
892
+ state.speed += 10;
893
+ }
894
+ /* Temporary elemental resists (2188-2194): each active temp_resist effect
895
+ bumps its element's res_level by one, capped at 2 through this path. */
896
+ for (let i = 0; i < TMD_MAX; i++) {
897
+ const eff = timedEffects[i];
898
+ if (!player.timed[i] || !eff || eff.tempResist === -1)
899
+ continue;
900
+ const el = state.elInfo[eff.tempResist];
901
+ if (el && el.resLevel < 2)
902
+ el.resLevel++;
903
+ }
904
+ if (player.timed[TMD.CONFUSED]) {
905
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 4, 0);
906
+ }
907
+ if (player.timed[TMD.AMNESIA]) {
908
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
909
+ }
910
+ if (player.timed[TMD.POISONED]) {
911
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 20, 0);
912
+ }
913
+ if (player.timed[TMD.IMAGE]) {
914
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
915
+ }
916
+ if (player.timed[TMD.BLOODLUST]) {
917
+ const bl = player.timed[TMD.BLOODLUST] ?? 0;
918
+ state.toD += Math.trunc(bl / 2);
919
+ extraBlows += Math.trunc(bl / 20);
920
+ }
921
+ if (player.timed[TMD.STEALTH]) {
922
+ state.skills[SKILL.STEALTH] = (state.skills[SKILL.STEALTH] ?? 0) + 10;
923
+ }
924
+ }
925
+ /* Analyze flags - check for fear (2215-2220). Innate flags can in
926
+ principle carry OF_AFRAID (mods), so the check is ported. */
927
+ if (state.flags.has(OF.AFRAID)) {
928
+ state.toH -= 20;
929
+ state.toA += 8;
930
+ state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 20, 0);
931
+ }
932
+ /* Analyze weight (2222-2230). */
933
+ const j = player.upkeep.totalWeight;
934
+ const limit = weightLimit(state);
935
+ if (j > Math.trunc(limit / 2)) {
936
+ state.speed -=
937
+ Math.trunc((j - Math.trunc(limit / 2)) / Math.trunc(limit / 10));
938
+ }
939
+ if (state.speed < 0)
940
+ state.speed = 0;
941
+ if (state.speed > 199)
942
+ state.speed = 199;
943
+ /* Apply modifier bonuses (2232-2236). */
944
+ state.toA += at(adj_dex_ta, state.statInd[STAT.DEX] ?? 0);
945
+ state.toD += at(adj_str_td, state.statInd[STAT.STR] ?? 0);
946
+ state.toH += at(adj_dex_th, state.statInd[STAT.DEX] ?? 0);
947
+ state.toH += at(adj_str_th, state.statInd[STAT.STR] ?? 0);
948
+ /* Modify skills (2239-2250). */
949
+ applySkillStatAndLevel(state.skills, cls, player.lev, state.statInd);
950
+ state.hold = at(adj_str_hold, state.statInd[STAT.STR] ?? 0);
951
+ /* Analyze launcher (2254-2288). object_weight_one is per-item weight; a
952
+ wielded launcher has number 1. */
953
+ state.heavyShoot = false;
954
+ if (launcher) {
955
+ const launcherWeight = launcher.weight;
956
+ if (state.hold < Math.trunc(launcherWeight / 10)) {
957
+ state.toH += 2 * (state.hold - Math.trunc(launcherWeight / 10));
958
+ state.heavyShoot = true;
959
+ }
960
+ state.numShots = 10;
961
+ if (launcher.kind.kindFlags.has(KF.SHOOTS_SHOTS))
962
+ state.ammoTval = TV.SHOT;
963
+ else if (launcher.kind.kindFlags.has(KF.SHOOTS_ARROWS))
964
+ state.ammoTval = TV.ARROW;
965
+ else if (launcher.kind.kindFlags.has(KF.SHOOTS_BOLTS))
966
+ state.ammoTval = TV.BOLT;
967
+ state.ammoMult = launcher.pval;
968
+ if (!state.heavyShoot) {
969
+ state.numShots += extraShots;
970
+ state.ammoMult += extraMight;
971
+ if (state.pflags.has(PF.FAST_SHOT)) {
972
+ state.numShots += Math.trunc(player.lev / 3);
973
+ }
974
+ }
975
+ if (state.numShots < 10)
976
+ state.numShots = 10;
977
+ }
978
+ /* Analyze weapon (2291-2319). An empty weapon slot uses the unarmed branch
979
+ (2316-2319); a too-heavy weapon keeps num_blows at its 1-blow default. */
980
+ state.heavyWield = false;
981
+ state.blessWield = false;
982
+ if (weapon) {
983
+ const weaponWeight = weapon.weight;
984
+ if (state.hold < Math.trunc(weaponWeight / 10)) {
985
+ state.toH += 2 * (state.hold - Math.trunc(weaponWeight / 10));
986
+ state.heavyWield = true;
987
+ }
988
+ if (!state.heavyWield) {
989
+ state.numBlows = calcBlows(cls, weaponWeight, state.statInd[STAT.STR] ?? 0, state.statInd[STAT.DEX] ?? 0, extraBlows);
990
+ state.skills[SKILL.DIGGING] =
991
+ (state.skills[SKILL.DIGGING] ?? 0) + Math.trunc(weaponWeight / 10);
992
+ }
993
+ if (state.pflags.has(PF.BLESS_WEAPON) &&
994
+ (weapon.tval === TV.HAFTED || state.flags.has(OF.BLESSED))) {
995
+ state.toD += 2;
996
+ state.blessWield = true;
997
+ }
998
+ }
999
+ else {
1000
+ /* Unarmed (2316-2319). */
1001
+ state.numBlows = calcBlows(cls, null, state.statInd[STAT.STR] ?? 0, state.statInd[STAT.DEX] ?? 0, extraBlows);
1002
+ }
1003
+ /* Mana (2321-2325): calc_mana DEFERRED. The PF_NO_MANA check reads
1004
+ p->msp, which is 0 until calc_mana is ported (correct for warriors;
1005
+ see the ledger for the caster caveat). */
1006
+ if (!player.msp) {
1007
+ state.pflags.on(PF.NO_MANA);
1008
+ }
1009
+ /* Movement speed (2327-2328): num_moves = extra_moves. */
1010
+ state.numMoves = extraMoves;
1011
+ return state;
1012
+ }
1013
+ /**
1014
+ * earlier_object (player-calcs.c:934-1003): decide whether `next` should
1015
+ * replace `orig` as the object that comes earlier in the standard inventory
1016
+ * listing (returns true to replace). Ported statement-for-statement; the
1017
+ * globals earlier_object reads (player->state.ammo_tval, object_value,
1018
+ * object_flavor_is_aware, obj_can_browse) arrive through EarlierObjectOpts.
1019
+ * `pval` (light fuel) is read straight off the object.
1020
+ */
1021
+ export function earlierObject(orig, next, opts = {}) {
1022
+ /* Check we have actual objects (938-940). */
1023
+ if (!next)
1024
+ return false;
1025
+ if (!orig)
1026
+ return true;
1027
+ const store = opts.store ?? false;
1028
+ const ammoTval = opts.ammoTval ?? 0;
1029
+ const value = opts.objectValue ?? (() => 0);
1030
+ const aware = opts.isAware ?? (() => true);
1031
+ const canBrowse = opts.canBrowse ?? (() => false);
1032
+ if (!store) {
1033
+ /* Readable books always come first (943-945). */
1034
+ if (canBrowse(orig) && !canBrowse(next))
1035
+ return false;
1036
+ if (!canBrowse(orig) && canBrowse(next))
1037
+ return true;
1038
+ }
1039
+ /* Usable ammo is before other ammo (948-956). */
1040
+ if (tvalIsAmmo(orig.tval) && tvalIsAmmo(next.tval)) {
1041
+ if (ammoTval === orig.tval && ammoTval !== next.tval)
1042
+ return false;
1043
+ if (ammoTval !== orig.tval && ammoTval === next.tval)
1044
+ return true;
1045
+ }
1046
+ /* Objects sort by decreasing type (959-961). */
1047
+ if (orig.tval > next.tval)
1048
+ return false;
1049
+ if (orig.tval < next.tval)
1050
+ return true;
1051
+ if (!store) {
1052
+ /* Non-aware (flavored) items always come last (966-969). */
1053
+ if (!aware(next))
1054
+ return false;
1055
+ if (!aware(orig))
1056
+ return true;
1057
+ }
1058
+ /* Objects sort by increasing sval (972-974). */
1059
+ if (orig.sval < next.sval)
1060
+ return false;
1061
+ if (orig.sval > next.sval)
1062
+ return true;
1063
+ if (!store) {
1064
+ /* Unaware objects always come last (977-979). The port marks a kind as
1065
+ * flavored by tval (tvalCanHaveFlavor), the same convention obj/value.ts and
1066
+ * obj/desc.ts use, since bound ObjectKind carries no flavor pointer. */
1067
+ if (tvalCanHaveFlavor(next.tval) && !aware(next))
1068
+ return false;
1069
+ if (tvalCanHaveFlavor(orig.tval) && !aware(orig))
1070
+ return true;
1071
+ /* Lights sort by decreasing fuel (982-985). */
1072
+ if (tvalIsLight(orig.tval)) {
1073
+ if (orig.pval > next.pval)
1074
+ return false;
1075
+ if (orig.pval < next.pval)
1076
+ return true;
1077
+ }
1078
+ }
1079
+ /* Objects sort by decreasing value, except ammo which sorts increasing
1080
+ * (988-999). */
1081
+ if (tvalIsAmmo(orig.tval)) {
1082
+ if (value(orig) < value(next))
1083
+ return false;
1084
+ if (value(orig) > value(next))
1085
+ return true;
1086
+ }
1087
+ else {
1088
+ if (value(orig) > value(next))
1089
+ return false;
1090
+ if (value(orig) < value(next))
1091
+ return true;
1092
+ }
1093
+ /* No preference (1002). */
1094
+ return false;
1095
+ }
1096
+ /* ------------------------------------------------------------------ */
1097
+ /* Adapters for the combat and turn-loop consumers */
1098
+ /* ------------------------------------------------------------------ */
1099
+ /**
1100
+ * The player_state fields player-attack.c reads as p->state, shaped as
1101
+ * combat/melee.ts PlayerCombatState. The skills array is shared, not
1102
+ * copied: recompute the state rather than mutating it.
1103
+ */
1104
+ export function toCombatState(state) {
1105
+ return {
1106
+ toH: state.toH,
1107
+ toD: state.toD,
1108
+ ac: state.ac,
1109
+ toA: state.toA,
1110
+ skills: state.skills,
1111
+ numBlows: state.numBlows,
1112
+ ammoMult: state.ammoMult,
1113
+ numShots: state.numShots,
1114
+ ammoTval: state.ammoTval,
1115
+ blessWield: state.blessWield,
1116
+ };
1117
+ }
1118
+ /**
1119
+ * The player_state fields mon-attack.c reads (p->state.ac + p->state.to_a),
1120
+ * shaped as combat/mon-melee.ts DefenderState.
1121
+ */
1122
+ export function toDefenderState(state) {
1123
+ return { ac: state.ac, toA: state.toA };
1124
+ }
1125
+ /**
1126
+ * calc_bonuses' state-change notices (player-calcs.c:2412-2453): the messages
1127
+ * upstream emits when heavy_shoot / heavy_wield / bless_wield / cumber_armor
1128
+ * flip between the OLD p->state and the NEWLY derived state, in upstream's
1129
+ * order. Returns the lines to emit, so the diff stays pure and testable and the
1130
+ * session layer owns the message sink.
1131
+ *
1132
+ * calcBonuses itself cannot do this: it is a pure derive that never sees the
1133
+ * previous state (upstream reads p->state, messages, and only then memcpy's the
1134
+ * new one over it). That is why every one of these ten messages was missing -
1135
+ * the derive was ported and the diff at the end of the same function was not, so
1136
+ * wielding a weapon far too heavy for your STR said nothing at all.
1137
+ *
1138
+ * Upstream gates the whole block on !p->upkeep->only_partial. The port has no
1139
+ * partial-update mode - the hypothetical derives (best-digger, item inspection)
1140
+ * pass update:false and simply never reach this - so there is no flag to test.
1141
+ */
1142
+ export function bonusChangeMessages(prev, next, gear) {
1143
+ const out = [];
1144
+ /* "heavy bow" (2413-2422). */
1145
+ if (prev.heavyShoot !== next.heavyShoot) {
1146
+ if (next.heavyShoot) {
1147
+ out.push("You have trouble wielding such a heavy bow.");
1148
+ }
1149
+ else if (gear.hasLauncher) {
1150
+ out.push("You have no trouble wielding your bow.");
1151
+ }
1152
+ else {
1153
+ out.push("You feel relieved to put down your heavy bow.");
1154
+ }
1155
+ }
1156
+ /* "heavy weapon" (2424-2433). */
1157
+ if (prev.heavyWield !== next.heavyWield) {
1158
+ if (next.heavyWield) {
1159
+ out.push("You have trouble wielding such a heavy weapon.");
1160
+ }
1161
+ else if (gear.hasWeapon) {
1162
+ out.push("You have no trouble wielding your weapon.");
1163
+ }
1164
+ else {
1165
+ out.push("You feel relieved to put down your heavy weapon.");
1166
+ }
1167
+ }
1168
+ /* "illegal weapon" - a priest wielding an unblessed edged weapon
1169
+ * (2435-2443). Note the asymmetry: upstream emits nothing when the offending
1170
+ * weapon is simply removed, so there is no third branch here. */
1171
+ if (prev.blessWield !== next.blessWield) {
1172
+ if (next.blessWield) {
1173
+ out.push("You feel attuned to your weapon.");
1174
+ }
1175
+ else if (gear.hasWeapon) {
1176
+ out.push("You feel less attuned to your weapon.");
1177
+ }
1178
+ }
1179
+ /* "armor state" (2445-2452). */
1180
+ if (prev.cumberArmor !== next.cumberArmor) {
1181
+ out.push(next.cumberArmor
1182
+ ? "The weight of your armor reduces your maximum SP."
1183
+ : "Your maximum SP is no longer reduced by armor weight.");
1184
+ }
1185
+ return out;
1186
+ }
1187
+ /** Re-export for callers computing HP arrays over all levels. */
1188
+ export { PY_MAX_LEVEL };
1189
+ //# sourceMappingURL=calcs.js.map