@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,1153 @@
1
+ /**
2
+ * Monster melee attacks against the player, ported from
3
+ * reference/src/mon-attack.c (make_attack_normal, monster_critical, check_hit,
4
+ * chance_of_monster_hit, adjust_dam_armor) and the RBE_ blow-effect handlers
5
+ * in reference/src/mon-blows.c (Angband 4.2.6).
6
+ *
7
+ * The blow loop, to-hit test, monster critical, per-blow damage roll and the
8
+ * cut/stun rolls are ported faithfully. Blow EFFECTS resolve one of two ways:
9
+ *
10
+ * - When a world-touching MonBlowEnv is injected (the live game), every
11
+ * melee_effect_handler_* runs its real consequences inline in the EXACT
12
+ * upstream RNG order: adjust_dam elemental resist rolls (env.elementalDam),
13
+ * inven_damage, player_apply_damage_reduction on the HP dealt, and all the
14
+ * status / stat / exp / theft / disenchant / earthquake / knockback effects.
15
+ * This is the analog of project-player's onSideEffects seam: combat/ stays
16
+ * worldless, and game/mon-side.ts (makeMonBlowEnv) supplies the environment.
17
+ * The unreduced context->damage drives the side-effect math and the cut/stun
18
+ * critical; only the HP actually subtracted goes through damage reduction.
19
+ *
20
+ * - When no env is injected (the worldless harness / unit tests), the effects
21
+ * that need the player timed / resist / inventory / stat systems are recorded
22
+ * as structured BlowSideEffect intents (the "stub log"), exactly as before.
23
+ *
24
+ * Additional per-blow rolls now ported inside the blow loop: the protection
25
+ * from evil repel (randint0(100) drawn when PROTEVIL is up vs an evil monster),
26
+ * the PARALYZE damage=1 pre-clamp, and the "player moved" early-out (a blow that
27
+ * relocates the player via earthquake / knockback skips the remaining blows).
28
+ *
29
+ * DEFERRED (ledgered in parity/ledger/combat-melee.yaml): monster lore /
30
+ * smart-learn, monster-vs-monster melee (monster_attack_monster), react_to_slay
31
+ * blocking a theft (the item is stolen regardless; no RNG impact), and attaching
32
+ * stolen gold/items to the monster's held-object pile (monster_carry, coordinated
33
+ * with the loot-drops gap; the item/gold is still removed from the player and no
34
+ * RNG is drawn by the attach).
35
+ */
36
+
37
+ import type { Rng, RandomValue } from "../rng.js";
38
+ import type { Loc } from "../loc.js";
39
+ import { locEq } from "../loc.js";
40
+ import type { Monster } from "../mon/monster.js";
41
+ import type { BlowMethod } from "../mon/types.js";
42
+ import type { Player } from "../player/player.js";
43
+ import { ELEM, MON_TMD, PROJ, RF, STAT, TMD } from "../generated/index.js";
44
+ import { STUN_DAM_REDUCTION, STUN_HIT_REDUCTION, testHit } from "./hit.js";
45
+
46
+ /** A defender's combat AC contribution (upstream p->state.ac + p->state.to_a). */
47
+ export interface DefenderState {
48
+ /** state->ac. */
49
+ ac: number;
50
+ /** state->to_a. */
51
+ toA: number;
52
+ }
53
+
54
+ /**
55
+ * A recorded blow side effect ("stub log"): the intent a fully-modelled
56
+ * player-timed / resist / inventory system would apply. `element` and status
57
+ * `amount` durations use the exact upstream formulas.
58
+ */
59
+ export type BlowSideEffect =
60
+ | { kind: "timed"; effect: string; amount: number }
61
+ | { kind: "drainStat"; stat: string }
62
+ | { kind: "loseExp"; holdChance: number; amount: number }
63
+ | { kind: "drainCharges" }
64
+ | { kind: "eatGold" }
65
+ | { kind: "eatItem" }
66
+ | { kind: "eatFood" }
67
+ | { kind: "eatLight" }
68
+ | { kind: "disenchant" }
69
+ | { kind: "elemental"; element: string; damage: number }
70
+ | { kind: "earthquake"; radius: number }
71
+ | { kind: "knockback"; distance: number };
72
+
73
+ /** The outcome of a single monster blow. */
74
+ export interface MonBlow {
75
+ hit: boolean;
76
+ /** RBE_ effect name (e.g. "HURT", "POISON"). */
77
+ effect: string;
78
+ /** RBM_ method name (e.g. "HIT", "CLAW"). */
79
+ method: string;
80
+ /** HP damage actually dealt to the player. */
81
+ damage: number;
82
+ sideEffects: BlowSideEffect[];
83
+ obvious: boolean;
84
+ }
85
+
86
+ /** The outcome of a full monster attack (make_attack_normal). */
87
+ export interface MonMeleeAttack {
88
+ /** false only when RF_NEVER_BLOW blocked the attack entirely. */
89
+ attacked: boolean;
90
+ blows: MonBlow[];
91
+ totalDamage: number;
92
+ playerDied: boolean;
93
+ /** Aggregated side-effect intents across all blows. */
94
+ sideEffects: BlowSideEffect[];
95
+ }
96
+
97
+ /**
98
+ * The world-touching environment a monster blow needs: the analog of
99
+ * project-player's onSideEffects hook. It keeps combat/ worldless - when
100
+ * absent, monMeleeAttack falls back to the stub-log intents. Implemented by
101
+ * game/mon-side.ts (makeMonBlowEnv), bound to the attacking monster.
102
+ */
103
+ export interface MonBlowEnv {
104
+ /** p->grid, read to detect the "player moved" mid-loop break. */
105
+ playerGrid(): Loc;
106
+ /** player_apply_damage_reduction(p, dam): the HP actually taken. */
107
+ applyReduction(dam: number): number;
108
+ /** take_hit(p, reducedDam, ddesc): subtract HP, set is_dead. */
109
+ takeHit(reducedDam: number): void;
110
+ /** Flush pure-element smart-learn after the complete elemental sequence. */
111
+ finishElemental?: () => void;
112
+ /** p->is_dead after the last takeHit. */
113
+ readonly playerDied: boolean;
114
+ /** msg(): route a blow message to the game's sink. An optional msgt (the
115
+ * blow method's sound channel, e.g. MON_HIT) plays the typed sound. */
116
+ msg(text: string, msgt?: string): void;
117
+ /** monster_desc(mon, MDESC_STANDARD): "The kobold" / "Something", for the
118
+ * per-blow "m_name act." message (drawn once per attack, no RNG). */
119
+ readonly monName: string;
120
+ /** OPT(p, show_damage): append the " (N)" suffix to the blow message. */
121
+ readonly showDamage: boolean;
122
+ /** monster_is_visible(mon): gates the "%s misses you." message (a visible
123
+ * monster's missed blow is announced; an unseen one is silent). */
124
+ readonly monVisible: boolean;
125
+ /** adjust_dam(p, proj, dam, RANDOMISE): elemental damage after resists. */
126
+ elementalDam(proj: number, dam: number): number;
127
+ /** inven_damage(p, elem, cperc): pack casualties from an elemental hit. */
128
+ invenDamage(elem: number, cperc: number): void;
129
+ /** player_resists(p, elem): el_info[elem].res_level > 0. */
130
+ resists(elem: number): boolean;
131
+ /** player_inc_timed(p, tmd, amount, ..., check): returns whether noticed. */
132
+ incTimed(tmd: number, amount: number, check: boolean): boolean;
133
+ /** randint0(100) < p->state.skills[SKILL_SAVE] (the melee saving throw). */
134
+ saveVsSkill(): boolean;
135
+ /** effect_simple(EF_DRAIN_STAT): sustain check then player_stat_dec. */
136
+ drainStat(stat: number): void;
137
+ /** player_of_has(p, OF_HOLD_LIFE). */
138
+ hasHoldLife(): boolean;
139
+ /** melee_effect_experience's HOLD_LIFE gate and player_exp_lose. */
140
+ drainExp(chance: number, drainAmount: number): void;
141
+ /** DRAIN_CHARGES: drain a random charged wand/staff, healing the monster. */
142
+ drainCharges(rlev: number): void;
143
+ /** EAT_GOLD: save-or-steal the player's gold; returns context->blinked. */
144
+ eatGold(): boolean;
145
+ /** EAT_ITEM: save-or-steal a pack item; returns blinked / obvious. */
146
+ eatItem(): { blinked: boolean; obvious: boolean };
147
+ /** EAT_FOOD: eat a random edible pack item. */
148
+ eatFood(): void;
149
+ /** EAT_LIGHT: EF_DRAIN_LIGHT "250+1d250". */
150
+ eatLight(): void;
151
+ /** EF_DISENCHANT on the player's equipment. */
152
+ disenchant(): void;
153
+ /** EF_EARTHQUAKE centred on the monster, given radius. */
154
+ earthquake(radius: number): void;
155
+ /** thrust_away(monster grid, player grid, dist). */
156
+ thrust(dist: number): void;
157
+ /** Blink the monster away (EF_TELEPORT max_sight*2+5) after the blows. */
158
+ blinkAway(): void;
159
+ }
160
+
161
+ /** Options for a monster melee attack. */
162
+ export interface MonMeleeOptions {
163
+ /** monster_is_visible(mon); affects only messaging (DEFERRED). */
164
+ monVisible?: boolean;
165
+ /**
166
+ * The world-touching blow environment (game/mon-side.ts), bound to the
167
+ * attacking monster. When present, blow effects apply for real in upstream
168
+ * RNG order; the `rng` argument MUST be the same stream this env draws from
169
+ * (state.rng), because the env's reused helpers (adjust_dam, inven_damage,
170
+ * ...) draw from it and interleave with this driver's own rolls.
171
+ */
172
+ env?: MonBlowEnv;
173
+ }
174
+
175
+ /* ------------------------------------------------------------------ *
176
+ * Shared math (mon-attack.c)
177
+ * ------------------------------------------------------------------ */
178
+
179
+ /**
180
+ * chance_of_monster_hit_base: a monster's to-hit from race level and the
181
+ * blow's power.
182
+ */
183
+ export function chanceOfMonsterHitBase(level: number, effectPower: number): number {
184
+ return Math.max(level, 1) * 3 + effectPower;
185
+ }
186
+
187
+ /**
188
+ * chance_of_monster_hit: the base value, reduced if the monster is stunned.
189
+ */
190
+ export function chanceOfMonsterHit(
191
+ mon: Monster,
192
+ level: number,
193
+ effectPower: number,
194
+ ): number {
195
+ let toHit = chanceOfMonsterHitBase(level, effectPower);
196
+ if ((mon.mTimed[MON_TMD.STUN] ?? 0) > 0) {
197
+ toHit = Math.trunc((toHit * (100 - STUN_HIT_REDUCTION)) / 100);
198
+ }
199
+ return toHit;
200
+ }
201
+
202
+ /**
203
+ * check_hit: does an attack with the given to-hit land on the player? Uses the
204
+ * player's total AC (state.ac + state.to_a).
205
+ */
206
+ export function checkHit(rng: Rng, toHit: number, def: DefenderState): boolean {
207
+ return testHit(rng, toHit, def.ac + def.toA);
208
+ }
209
+
210
+ /**
211
+ * adjust_dam_armor: physical damage remaining after armor (mon-attack.c).
212
+ */
213
+ export function adjustDamArmor(damage: number, ac: number): number {
214
+ return damage - Math.trunc((damage * (ac < 240 ? ac : 240)) / 400);
215
+ }
216
+
217
+ /**
218
+ * monster_critical: the "cut/stun" critical tier of a monster blow. All hits
219
+ * doing >= 95% of the maximum possible (and >= 20, or sometimes N) qualify.
220
+ * Returns a tier 0..(6+extra) used to index the cut/stun amount tables.
221
+ */
222
+ export function monsterCritical(
223
+ rng: Rng,
224
+ dice: RandomValue,
225
+ rlev: number,
226
+ dam: number,
227
+ ): number {
228
+ let max = 0;
229
+ const total = rng.randcalc(dice, rlev, "maximise");
230
+
231
+ /* Must do at least 95% of perfect */
232
+ if (dam < Math.trunc((total * 19) / 20)) return 0;
233
+
234
+ /* Weak blows rarely work */
235
+ if (dam < 20 && rng.randint0(100) >= dam) return 0;
236
+
237
+ /* Perfect damage */
238
+ if (dam === total) max++;
239
+
240
+ /* Super-charge */
241
+ if (dam >= 20) {
242
+ while (rng.randint0(100) < 2) max++;
243
+ }
244
+
245
+ /* Critical damage */
246
+ if (dam > 45) return 6 + max;
247
+ if (dam > 33) return 5 + max;
248
+ if (dam > 25) return 4 + max;
249
+ if (dam > 18) return 3 + max;
250
+ if (dam > 11) return 2 + max;
251
+ return 1 + max;
252
+ }
253
+
254
+ /** Cut amount for a monster_critical tier (make_attack_normal cut switch). */
255
+ function cutAmount(rng: Rng, tier: number): number {
256
+ switch (tier) {
257
+ case 0:
258
+ return 0;
259
+ case 1:
260
+ return rng.randint1(5);
261
+ case 2:
262
+ return rng.randint1(5) + 5;
263
+ case 3:
264
+ return rng.randint1(20) + 20;
265
+ case 4:
266
+ return rng.randint1(50) + 50;
267
+ case 5:
268
+ return rng.randint1(100) + 100;
269
+ case 6:
270
+ return 300;
271
+ default:
272
+ return 500;
273
+ }
274
+ }
275
+
276
+ /** Stun amount for a monster_critical tier (make_attack_normal stun switch). */
277
+ function stunAmount(rng: Rng, tier: number): number {
278
+ switch (tier) {
279
+ case 0:
280
+ return 0;
281
+ case 1:
282
+ return rng.randint1(5);
283
+ case 2:
284
+ return rng.randint1(10) + 10;
285
+ case 3:
286
+ return rng.randint1(20) + 20;
287
+ case 4:
288
+ return rng.randint1(30) + 30;
289
+ case 5:
290
+ return rng.randint1(40) + 40;
291
+ case 6:
292
+ return 100;
293
+ default:
294
+ return 200;
295
+ }
296
+ }
297
+
298
+ /* ------------------------------------------------------------------ *
299
+ * Blow-effect resolution (mon-blows.c handlers)
300
+ * ------------------------------------------------------------------ */
301
+
302
+ interface BlowEffectContext {
303
+ rng: Rng;
304
+ /** damage = randcalc(dice, rlev, RANDOMISE), after stun reduction. */
305
+ baseDamage: number;
306
+ ac: number;
307
+ rlev: number;
308
+ /** method->phys: whether the blow has a physical component. */
309
+ phys: boolean;
310
+ /** The blow method, for display_blow_message_vs_player's action + msgt. */
311
+ method: BlowMethod;
312
+ /** In the worldless path HP is applied after the handler returns. */
313
+ willPlayerDie?: (damage: number) => boolean;
314
+ }
315
+
316
+ interface BlowEffectResult {
317
+ /** context->damage after the handler (HP dealt, and used by cut/stun crit). */
318
+ hpDamage: number;
319
+ obvious: boolean;
320
+ sideEffects: BlowSideEffect[];
321
+ }
322
+
323
+ const ELEMENT_OF_EFFECT: Readonly<Record<string, string>> = {
324
+ ACID: "ACID",
325
+ ELEC: "ELEC",
326
+ FIRE: "FIRE",
327
+ COLD: "COLD",
328
+ POISON: "POIS",
329
+ };
330
+
331
+ const STAT_OF_EFFECT: Readonly<Record<string, string>> = {
332
+ LOSE_STR: "STR",
333
+ LOSE_INT: "INT",
334
+ LOSE_WIS: "WIS",
335
+ LOSE_DEX: "DEX",
336
+ LOSE_CON: "CON",
337
+ };
338
+
339
+ /** Experience-drain effects: OF_HOLD_LIFE resist chance and base drain dice. */
340
+ const EXP_DRAIN: Readonly<Record<string, { holdChance: number; dice: number }>> = {
341
+ EXP_10: { holdChance: 95, dice: 10 },
342
+ EXP_20: { holdChance: 90, dice: 20 },
343
+ EXP_40: { holdChance: 75, dice: 40 },
344
+ EXP_80: { holdChance: 50, dice: 80 },
345
+ };
346
+
347
+ /**
348
+ * monster_blow_method_action (mon-blows.c L74): pick one of the blow method's
349
+ * action messages via randint0(num_messages) and substitute the player-target
350
+ * tags. Returns null when the method carries no messages (act == NULL upstream,
351
+ * which yields the "You take N damage." fallback).
352
+ *
353
+ * The randint0(num_messages) draw is ALWAYS performed so the RNG stream matches
354
+ * upstream whether or not the message is shown. randint0 (Rand_div) short-
355
+ * circuits for num_messages <= 1, so only the multi-message methods (INSULT and
356
+ * MOAN, 8 each) consume any RNG here; every other blow is byte-identical.
357
+ *
358
+ * For a blow against the player (upstream midx < 0) the tags resolve to the
359
+ * fixed second-person words, not a monster_desc: {target}->you, {oftarget}->
360
+ * your, {has}->have (mon-blows.c L116-152).
361
+ */
362
+ function monsterBlowMethodAction(method: BlowMethod, rng: Rng): string | null {
363
+ const n = method.messages.length;
364
+ if (n === 0) return null;
365
+ const choice = rng.randint0(n);
366
+ const raw = method.messages[choice] ?? method.messages[0]!;
367
+ return raw
368
+ .replace(/\{target\}/g, "you")
369
+ .replace(/\{oftarget\}/g, "your")
370
+ .replace(/\{has\}/g, "have");
371
+ }
372
+
373
+ /**
374
+ * display_blow_message_vs_player (mon-blows.c L194): show "m_name act." for a
375
+ * blow that lands on the player, with the " (N)" damage suffix when show_damage
376
+ * is on and the blow dealt HP. When `sink` is null (the worldless recording
377
+ * path) the message is drawn but not emitted, so both paths consume RNG
378
+ * identically. The fullstop is dropped when the action ends in "'" or "!".
379
+ */
380
+ function displayBlowMessageVsPlayer(
381
+ rng: Rng,
382
+ method: BlowMethod,
383
+ reduced: number,
384
+ monName: string,
385
+ showDamage: boolean,
386
+ sink: ((text: string, msgt: string) => void) | null,
387
+ ): void {
388
+ const act = monsterBlowMethodAction(method, rng);
389
+ if (!sink) return;
390
+ /* msgt(method->msgt, ...) (mon-blows.c L206-213): the blow line plays the
391
+ * method's sound channel (blow_methods.txt msg:, e.g. MON_HIT). */
392
+ if (act !== null) {
393
+ const fullstop = act.endsWith("'") || act.endsWith("!") ? "" : ".";
394
+ const tail = reduced > 0 && showDamage ? ` (${reduced})` : "";
395
+ sink(`${monName} ${act}${fullstop}${tail}`, method.msgt);
396
+ } else if (reduced > 0 && showDamage) {
397
+ sink(`You take ${reduced} damage.`, method.msgt);
398
+ }
399
+ }
400
+
401
+ /**
402
+ * Live-path blow message: emit "The kobold hits you." through the env sink
403
+ * immediately before take_hit (display_blow_message_vs_player, called from every
404
+ * damage-dealing melee_effect_handler in mon-blows.c).
405
+ */
406
+ function emitBlowMessageLive(
407
+ env: MonBlowEnv,
408
+ ctx: BlowEffectContext,
409
+ reduced: number,
410
+ ): void {
411
+ displayBlowMessageVsPlayer(
412
+ ctx.rng,
413
+ ctx.method,
414
+ reduced,
415
+ env.monName,
416
+ env.showDamage,
417
+ (text: string, msgt: string): void => env.msg(text, msgt),
418
+ );
419
+ }
420
+
421
+ /**
422
+ * Recording-path blow message: perform the randint0(num_messages) draw without
423
+ * emitting (the worldless intent-recording path has no sink or monster name).
424
+ * Keeps the two paths in RNG lock-step; for every multi-message method in the
425
+ * vanilla data (INSULT / MOAN) the draw is the effect's first RNG event, so its
426
+ * position matches upstream.
427
+ */
428
+ function drawBlowMessage(ctx: BlowEffectContext): void {
429
+ displayBlowMessageVsPlayer(ctx.rng, ctx.method, 0, "", false, null);
430
+ }
431
+
432
+ /**
433
+ * Resolve one RBE_ blow effect: compute the HP damage the effect deals to the
434
+ * player (context->damage after the handler runs) and record any timed /
435
+ * stat / inventory / elemental side-effect intents.
436
+ */
437
+ function resolveBlowEffect(
438
+ name: string,
439
+ ctx: BlowEffectContext,
440
+ ): BlowEffectResult {
441
+ const { rng, baseDamage, ac, rlev, phys } = ctx;
442
+ const side: BlowSideEffect[] = [];
443
+
444
+ /* display_blow_message_vs_player draws randint0(num_messages) before take_hit
445
+ * in every handler; hoisted here for the worldless path (no-op for the single-
446
+ * message methods, first RNG event for the INSULT / MOAN effects). */
447
+ drawBlowMessage(ctx);
448
+
449
+ /* Elemental blows: physical component to HP; elemental component deferred. */
450
+ if (name === "ACID" || name === "ELEC" || name === "FIRE" || name === "COLD") {
451
+ const physical = phys ? adjustDamArmor(baseDamage, ac + 50) : 0;
452
+ side.push({
453
+ kind: "elemental",
454
+ element: ELEMENT_OF_EFFECT[name] as string,
455
+ damage: baseDamage,
456
+ });
457
+ return { hpDamage: physical, obvious: true, sideEffects: side };
458
+ }
459
+
460
+ switch (name) {
461
+ case "NONE":
462
+ return { hpDamage: 0, obvious: true, sideEffects: side };
463
+
464
+ case "HURT":
465
+ return {
466
+ hpDamage: adjustDamArmor(baseDamage, ac),
467
+ obvious: true,
468
+ sideEffects: side,
469
+ };
470
+
471
+ case "POISON": {
472
+ const physical = phys ? adjustDamArmor(baseDamage, ac + 50) : 0;
473
+ side.push({ kind: "elemental", element: "POIS", damage: baseDamage });
474
+ side.push({
475
+ kind: "timed",
476
+ effect: "POISONED",
477
+ amount: 5 + rng.randint1(rlev),
478
+ });
479
+ return { hpDamage: physical, obvious: true, sideEffects: side };
480
+ }
481
+
482
+ case "DISENCHANT":
483
+ side.push({ kind: "disenchant" });
484
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
485
+
486
+ case "DRAIN_CHARGES":
487
+ side.push({ kind: "drainCharges" });
488
+ return { hpDamage: baseDamage, obvious: false, sideEffects: side };
489
+
490
+ case "EAT_GOLD":
491
+ side.push({ kind: "eatGold" });
492
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
493
+
494
+ case "EAT_ITEM":
495
+ side.push({ kind: "eatItem" });
496
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
497
+
498
+ case "EAT_FOOD":
499
+ side.push({ kind: "eatFood" });
500
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
501
+
502
+ case "EAT_LIGHT":
503
+ side.push({ kind: "eatLight" });
504
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
505
+
506
+ case "BLIND":
507
+ side.push({
508
+ kind: "timed",
509
+ effect: "BLIND",
510
+ amount: 10 + rng.randint1(rlev),
511
+ });
512
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
513
+
514
+ case "CONFUSE":
515
+ side.push({
516
+ kind: "timed",
517
+ effect: "CONFUSED",
518
+ amount: 3 + rng.randint1(rlev),
519
+ });
520
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
521
+
522
+ case "TERRIFY":
523
+ side.push({
524
+ kind: "timed",
525
+ effect: "AFRAID",
526
+ amount: 3 + rng.randint1(rlev),
527
+ });
528
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
529
+
530
+ case "PARALYZE":
531
+ side.push({
532
+ kind: "timed",
533
+ effect: "PARALYZED",
534
+ amount: 3 + rng.randint1(rlev),
535
+ });
536
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
537
+
538
+ case "LOSE_STR":
539
+ case "LOSE_INT":
540
+ case "LOSE_WIS":
541
+ case "LOSE_DEX":
542
+ case "LOSE_CON":
543
+ side.push({ kind: "drainStat", stat: STAT_OF_EFFECT[name] as string });
544
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
545
+
546
+ case "LOSE_ALL":
547
+ for (const stat of ["STR", "DEX", "CON", "INT", "WIS"]) {
548
+ side.push({ kind: "drainStat", stat });
549
+ }
550
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
551
+
552
+ case "SHATTER": {
553
+ const hp = adjustDamArmor(baseDamage, ac);
554
+ /* monster_damage_target() returns immediately on death (mon-blows.c
555
+ * L1095), before either SHATTER side-effect gate or its RNG draw. */
556
+ if (ctx.willPlayerDie?.(hp)) {
557
+ return { hpDamage: hp, obvious: true, sideEffects: side };
558
+ }
559
+ if (hp > 23) {
560
+ side.push({ kind: "earthquake", radius: Math.trunc(hp / 12) });
561
+ }
562
+ if (hp > 100) {
563
+ const value = hp - 100;
564
+ if (rng.randint1(value) > 40) {
565
+ side.push({ kind: "knockback", distance: 1 + Math.trunc(value / 40) });
566
+ }
567
+ }
568
+ return { hpDamage: hp, obvious: true, sideEffects: side };
569
+ }
570
+
571
+ case "EXP_10":
572
+ case "EXP_20":
573
+ case "EXP_40":
574
+ case "EXP_80": {
575
+ const spec = EXP_DRAIN[name] as { holdChance: number; dice: number };
576
+ /* damroll(N, 6) is evaluated as the handler's argument. */
577
+ const amount = rng.damroll(spec.dice, 6);
578
+ side.push({ kind: "loseExp", holdChance: spec.holdChance, amount });
579
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
580
+ }
581
+
582
+ case "HALLU":
583
+ side.push({
584
+ kind: "timed",
585
+ effect: "IMAGE",
586
+ amount: 3 + rng.randint1(Math.trunc(rlev / 2)),
587
+ });
588
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
589
+
590
+ case "BLACK_BREATH":
591
+ if (rng.oneIn(5)) {
592
+ side.push({
593
+ kind: "timed",
594
+ effect: "BLACKBREATH",
595
+ amount: Math.trunc(baseDamage / 10),
596
+ });
597
+ }
598
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
599
+
600
+ default:
601
+ /* Unknown effect: deal the base damage, as the fallthrough would. */
602
+ return { hpDamage: baseDamage, obvious: true, sideEffects: side };
603
+ }
604
+ }
605
+
606
+ /**
607
+ * melee_handler_for_blow_effect (mon-blows.c:1191): upstream's name -> handler
608
+ * table, as a list. The two switch statements in this file (resolveBlowEffect
609
+ * for the recording path, resolveBlowEffectLive for the live path) are the
610
+ * handlers themselves; this list is the table's key set, so a test can prove the
611
+ * mapping total against the pack in both directions.
612
+ *
613
+ * Upstream's table has exactly these 30 entries (mon-blows.c:1197-1226) and
614
+ * blow_effects.txt defines exactly the same 30 names, so a NULL handler (which
615
+ * upstream reports as "ERROR: Effect handler not found", mon-attack.c:650/841)
616
+ * is unreachable with vanilla data.
617
+ */
618
+ export const RESOLVED_BLOW_EFFECTS: readonly string[] = [
619
+ "NONE",
620
+ "HURT",
621
+ "POISON",
622
+ "DISENCHANT",
623
+ "DRAIN_CHARGES",
624
+ "EAT_GOLD",
625
+ "EAT_ITEM",
626
+ "EAT_FOOD",
627
+ "EAT_LIGHT",
628
+ "ACID",
629
+ "ELEC",
630
+ "FIRE",
631
+ "COLD",
632
+ "BLIND",
633
+ "CONFUSE",
634
+ "TERRIFY",
635
+ "PARALYZE",
636
+ "LOSE_STR",
637
+ "LOSE_INT",
638
+ "LOSE_WIS",
639
+ "LOSE_DEX",
640
+ "LOSE_CON",
641
+ "LOSE_ALL",
642
+ "SHATTER",
643
+ "EXP_10",
644
+ "EXP_20",
645
+ "EXP_40",
646
+ "EXP_80",
647
+ "HALLU",
648
+ "BLACK_BREATH",
649
+ ];
650
+
651
+ /* ------------------------------------------------------------------ *
652
+ * Live blow-effect resolution (mon-blows.c handlers with a MonBlowEnv)
653
+ * ------------------------------------------------------------------ */
654
+
655
+ /** effect name -> { proj: PROJ_ value, elem: ELEM_ value } for elementals. */
656
+ const ELEMENTAL_OF_EFFECT: Readonly<
657
+ Record<string, { proj: number; elem: number }>
658
+ > = {
659
+ ACID: { proj: PROJ.ACID, elem: ELEM.ACID },
660
+ ELEC: { proj: PROJ.ELEC, elem: ELEM.ELEC },
661
+ FIRE: { proj: PROJ.FIRE, elem: ELEM.FIRE },
662
+ COLD: { proj: PROJ.COLD, elem: ELEM.COLD },
663
+ POISON: { proj: PROJ.POIS, elem: ELEM.POIS },
664
+ };
665
+
666
+ /** The "You are covered in acid!" flavour lines (melee_effect_elemental). */
667
+ const ELEMENTAL_MESSAGE: Readonly<Record<string, string>> = {
668
+ ACID: "You are covered in acid!",
669
+ ELEC: "You are struck by electricity!",
670
+ FIRE: "You are enveloped in flames!",
671
+ COLD: "You are covered with frost!",
672
+ };
673
+
674
+ const STAT_OF_LIVE_EFFECT: Readonly<Record<string, number>> = {
675
+ LOSE_STR: STAT.STR,
676
+ LOSE_INT: STAT.INT,
677
+ LOSE_WIS: STAT.WIS,
678
+ LOSE_DEX: STAT.DEX,
679
+ LOSE_CON: STAT.CON,
680
+ };
681
+
682
+ /** The outcome of a live blow effect (context->damage, HP taken, blinked). */
683
+ interface LiveBlowResult {
684
+ /** context->damage after the handler (unreduced; feeds the cut/stun crit). */
685
+ contextDamage: number;
686
+ /** The HP actually subtracted (post player_apply_damage_reduction). */
687
+ reducedDamage: number;
688
+ obvious: boolean;
689
+ /** context->blinked (EAT_GOLD / EAT_ITEM theft). */
690
+ blinked: boolean;
691
+ }
692
+
693
+ /**
694
+ * melee_effect_elemental (mon-blows.c L417): physical vs elemental, the larger
695
+ * to HP, inven_damage on the elemental component. RNG order: [adjust_dam
696
+ * denominator] then [inven_damage per-item saves].
697
+ */
698
+ function applyElemental(
699
+ env: MonBlowEnv,
700
+ name: string,
701
+ ctx: BlowEffectContext,
702
+ pure: boolean,
703
+ ): { contextDamage: number; reducedDamage: number } {
704
+ if (pure) {
705
+ const line = ELEMENTAL_MESSAGE[name];
706
+ if (line) env.msg(line);
707
+ }
708
+ const map = ELEMENTAL_OF_EFFECT[name]!;
709
+ const physical = ctx.phys ? adjustDamArmor(ctx.baseDamage, ctx.ac + 50) : 0;
710
+ const elementalDam = env.elementalDam(map.proj, ctx.baseDamage);
711
+ const contextDamage = physical > elementalDam ? physical : elementalDam;
712
+ if (elementalDam > 0) {
713
+ env.invenDamage(map.elem, Math.min(elementalDam * 5, 300));
714
+ }
715
+ let reducedDamage = 0;
716
+ if (contextDamage > 0) {
717
+ reducedDamage = env.applyReduction(contextDamage);
718
+ emitBlowMessageLive(env, ctx, reducedDamage);
719
+ env.takeHit(reducedDamage);
720
+ }
721
+ env.finishElemental?.();
722
+ return { contextDamage, reducedDamage };
723
+ }
724
+
725
+ /**
726
+ * Resolve one RBE_ blow effect for real, running each mon-blows.c handler in
727
+ * the exact upstream RNG order and applying HP through the env. Returns the
728
+ * (unreduced) context->damage for the cut/stun critical, the reduced HP dealt,
729
+ * and context->blinked. The PARALYZE damage=1 pre-clamp is applied by the
730
+ * caller before this runs (mon-blows.c L1020).
731
+ */
732
+ function resolveBlowEffectLive(
733
+ name: string,
734
+ ctx: BlowEffectContext,
735
+ env: MonBlowEnv,
736
+ ): LiveBlowResult {
737
+ const { rng, baseDamage, ac, rlev } = ctx;
738
+ const done = (
739
+ contextDamage: number,
740
+ reducedDamage: number,
741
+ blinked = false,
742
+ ): LiveBlowResult => ({ contextDamage, reducedDamage, obvious: true, blinked });
743
+
744
+ /* Elemental blows (pure). */
745
+ if (name === "ACID" || name === "ELEC" || name === "FIRE" || name === "COLD") {
746
+ const r = applyElemental(env, name, ctx, true);
747
+ return done(r.contextDamage, r.reducedDamage);
748
+ }
749
+
750
+ switch (name) {
751
+ case "NONE":
752
+ /* melee_effect_handler_NONE (mon-blows.c L638): show the message (with
753
+ * its randint0(num_messages) draw) for a no-damage hit; no take_hit. */
754
+ emitBlowMessageLive(env, ctx, 0);
755
+ return done(0, 0);
756
+
757
+ case "HURT": {
758
+ const cd = adjustDamArmor(baseDamage, ac);
759
+ const reduced = env.applyReduction(cd);
760
+ emitBlowMessageLive(env, ctx, reduced);
761
+ env.takeHit(reduced);
762
+ return done(cd, reduced);
763
+ }
764
+
765
+ case "POISON": {
766
+ const r = applyElemental(env, name, ctx, false);
767
+ if (!env.playerDied) {
768
+ /* player_inc_timed(TMD_POISONED, 5 + randint1(rlev)). */
769
+ env.incTimed(TMD.POISONED, 5 + rng.randint1(rlev), true);
770
+ }
771
+ return done(r.contextDamage, r.reducedDamage);
772
+ }
773
+
774
+ case "DISENCHANT": {
775
+ const reduced = env.applyReduction(baseDamage);
776
+ emitBlowMessageLive(env, ctx, reduced);
777
+ env.takeHit(reduced);
778
+ if (!env.playerDied && !env.resists(ELEM.DISEN)) env.disenchant();
779
+ return done(baseDamage, reduced);
780
+ }
781
+
782
+ case "DRAIN_CHARGES": {
783
+ const reduced = env.applyReduction(baseDamage);
784
+ emitBlowMessageLive(env, ctx, reduced);
785
+ env.takeHit(reduced);
786
+ if (!env.playerDied) env.drainCharges(rlev);
787
+ return done(baseDamage, reduced);
788
+ }
789
+
790
+ case "EAT_GOLD": {
791
+ const reduced = env.applyReduction(baseDamage);
792
+ emitBlowMessageLive(env, ctx, reduced);
793
+ env.takeHit(reduced);
794
+ if (env.playerDied) return done(baseDamage, reduced);
795
+ const blinked = env.eatGold();
796
+ return done(baseDamage, reduced, blinked);
797
+ }
798
+
799
+ case "EAT_ITEM": {
800
+ /* monster_damage_target(context, false): returns only on death. */
801
+ const reduced = env.applyReduction(baseDamage);
802
+ emitBlowMessageLive(env, ctx, reduced);
803
+ env.takeHit(reduced);
804
+ if (env.playerDied) return done(baseDamage, reduced);
805
+ const r = env.eatItem();
806
+ return done(baseDamage, reduced, r.blinked);
807
+ }
808
+
809
+ case "EAT_FOOD": {
810
+ const reduced = env.applyReduction(baseDamage);
811
+ emitBlowMessageLive(env, ctx, reduced);
812
+ env.takeHit(reduced);
813
+ if (!env.playerDied) env.eatFood();
814
+ return done(baseDamage, reduced);
815
+ }
816
+
817
+ case "EAT_LIGHT": {
818
+ const reduced = env.applyReduction(baseDamage);
819
+ emitBlowMessageLive(env, ctx, reduced);
820
+ env.takeHit(reduced);
821
+ if (!env.playerDied) env.eatLight();
822
+ return done(baseDamage, reduced);
823
+ }
824
+
825
+ case "BLIND": {
826
+ /* melee_effect_timed: duration arg drawn first, then damage, no save. */
827
+ const amount = 10 + rng.randint1(rlev);
828
+ const reduced = env.applyReduction(baseDamage);
829
+ emitBlowMessageLive(env, ctx, reduced);
830
+ env.takeHit(reduced);
831
+ if (!env.playerDied) env.incTimed(TMD.BLIND, amount, true);
832
+ return done(baseDamage, reduced);
833
+ }
834
+
835
+ case "CONFUSE": {
836
+ const amount = 3 + rng.randint1(rlev);
837
+ const reduced = env.applyReduction(baseDamage);
838
+ emitBlowMessageLive(env, ctx, reduced);
839
+ env.takeHit(reduced);
840
+ if (!env.playerDied) env.incTimed(TMD.CONFUSED, amount, true);
841
+ return done(baseDamage, reduced);
842
+ }
843
+
844
+ case "TERRIFY": {
845
+ const amount = 3 + rng.randint1(rlev);
846
+ const reduced = env.applyReduction(baseDamage);
847
+ emitBlowMessageLive(env, ctx, reduced);
848
+ env.takeHit(reduced);
849
+ if (!env.playerDied) {
850
+ if (env.saveVsSkill()) env.msg("You stand your ground!");
851
+ else env.incTimed(TMD.AFRAID, amount, true);
852
+ }
853
+ return done(baseDamage, reduced);
854
+ }
855
+
856
+ case "PARALYZE": {
857
+ const amount = 3 + rng.randint1(rlev);
858
+ const reduced = env.applyReduction(baseDamage);
859
+ emitBlowMessageLive(env, ctx, reduced);
860
+ env.takeHit(reduced);
861
+ if (!env.playerDied) {
862
+ if (env.saveVsSkill()) env.msg("You resist the effects!");
863
+ else env.incTimed(TMD.PARALYZED, amount, true);
864
+ }
865
+ return done(baseDamage, reduced);
866
+ }
867
+
868
+ case "LOSE_STR":
869
+ case "LOSE_INT":
870
+ case "LOSE_WIS":
871
+ case "LOSE_DEX":
872
+ case "LOSE_CON": {
873
+ const reduced = env.applyReduction(baseDamage);
874
+ emitBlowMessageLive(env, ctx, reduced);
875
+ env.takeHit(reduced);
876
+ if (!env.playerDied) env.drainStat(STAT_OF_LIVE_EFFECT[name]!);
877
+ return done(baseDamage, reduced);
878
+ }
879
+
880
+ case "LOSE_ALL": {
881
+ const reduced = env.applyReduction(baseDamage);
882
+ emitBlowMessageLive(env, ctx, reduced);
883
+ env.takeHit(reduced);
884
+ if (!env.playerDied) {
885
+ env.drainStat(STAT.STR);
886
+ env.drainStat(STAT.DEX);
887
+ env.drainStat(STAT.CON);
888
+ env.drainStat(STAT.INT);
889
+ env.drainStat(STAT.WIS);
890
+ }
891
+ return done(baseDamage, reduced);
892
+ }
893
+
894
+ case "SHATTER": {
895
+ const cd = adjustDamArmor(baseDamage, ac);
896
+ const reduced = env.applyReduction(cd);
897
+ emitBlowMessageLive(env, ctx, reduced);
898
+ env.takeHit(reduced);
899
+ if (env.playerDied) return done(cd, reduced);
900
+ if (cd > 23) env.earthquake(Math.trunc(cd / 12));
901
+ if (cd > 100) {
902
+ const value = cd - 100;
903
+ if (rng.randint1(value) > 40) env.thrust(1 + Math.trunc(value / 40));
904
+ }
905
+ return done(cd, reduced);
906
+ }
907
+
908
+ case "EXP_10":
909
+ case "EXP_20":
910
+ case "EXP_40":
911
+ case "EXP_80": {
912
+ const spec = EXP_DRAIN[name]!;
913
+ /* damroll(N, 6) is evaluated as the handler's argument, before take_hit. */
914
+ const drainAmount = rng.damroll(spec.dice, 6);
915
+ const reduced = env.applyReduction(baseDamage);
916
+ emitBlowMessageLive(env, ctx, reduced);
917
+ env.takeHit(reduced);
918
+ if (!env.playerDied) env.drainExp(spec.holdChance, drainAmount);
919
+ return done(baseDamage, reduced);
920
+ }
921
+
922
+ case "HALLU": {
923
+ const reduced = env.applyReduction(baseDamage);
924
+ emitBlowMessageLive(env, ctx, reduced);
925
+ env.takeHit(reduced);
926
+ if (!env.playerDied) {
927
+ env.incTimed(TMD.IMAGE, 3 + rng.randint1(Math.trunc(rlev / 2)), true);
928
+ }
929
+ return done(baseDamage, reduced);
930
+ }
931
+
932
+ case "BLACK_BREATH": {
933
+ const reduced = env.applyReduction(baseDamage);
934
+ emitBlowMessageLive(env, ctx, reduced);
935
+ env.takeHit(reduced);
936
+ if (!env.playerDied && rng.oneIn(5)) {
937
+ env.incTimed(TMD.BLACKBREATH, Math.trunc(baseDamage / 10), false);
938
+ }
939
+ return done(baseDamage, reduced);
940
+ }
941
+
942
+ default: {
943
+ /* Unknown effect: deal the base damage, as the fallthrough would. */
944
+ const reduced = env.applyReduction(baseDamage);
945
+ emitBlowMessageLive(env, ctx, reduced);
946
+ env.takeHit(reduced);
947
+ return done(baseDamage, reduced);
948
+ }
949
+ }
950
+ }
951
+
952
+ /* ------------------------------------------------------------------ *
953
+ * make_attack_normal
954
+ * ------------------------------------------------------------------ */
955
+
956
+ /** Zero random_value, for blows that carry no damage dice. */
957
+ const ZERO_RV: RandomValue = { base: 0, dice: 0, sides: 0, mBonus: 0 };
958
+
959
+ /**
960
+ * make_attack_normal: run all of the monster's blows against the player. When
961
+ * `opts.env` is supplied the blow effects apply for real (HP through
962
+ * player_apply_damage_reduction / take_hit, plus every status / stat / theft /
963
+ * terrain consequence in the exact upstream RNG order); otherwise HP damage is
964
+ * applied to `defender.chp` and the rest is recorded as BlowSideEffect intents.
965
+ * Stops early if the player dies or a blow relocates the player.
966
+ */
967
+ export function monMeleeAttack(
968
+ rng: Rng,
969
+ mon: Monster,
970
+ defender: Player,
971
+ def: DefenderState,
972
+ opts: MonMeleeOptions = {},
973
+ ): MonMeleeAttack {
974
+ /* Not allowed to attack. */
975
+ if (mon.race.flags.has(RF.NEVER_BLOW)) {
976
+ return {
977
+ attacked: false,
978
+ blows: [],
979
+ totalDamage: 0,
980
+ playerDied: false,
981
+ sideEffects: [],
982
+ };
983
+ }
984
+
985
+ const env = opts.env;
986
+ const rlev = mon.race.level >= 1 ? mon.race.level : 1;
987
+ const stunned = (mon.mTimed[MON_TMD.STUN] ?? 0) > 0;
988
+
989
+ const blows: MonBlow[] = [];
990
+ const allSide: BlowSideEffect[] = [];
991
+ let totalDamage = 0;
992
+ let playerDied = false;
993
+ let blinked = false;
994
+
995
+ for (const blow of mon.race.blows) {
996
+ /* No more attacks. */
997
+ if (!blow.method) break;
998
+ if (playerDied) break;
999
+
1000
+ /* p->grid at the start of the blow (mon-attack.c L568). */
1001
+ const pgrid: Loc | null = env ? env.playerGrid() : null;
1002
+ const effectName = blow.effect.name;
1003
+
1004
+ /* Monster hits player (a "NONE" effect always connects, no to-hit roll). */
1005
+ const hit =
1006
+ effectName === "NONE" ||
1007
+ checkHit(rng, chanceOfMonsterHit(mon, mon.race.level, blow.effect.power), def);
1008
+
1009
+ if (!hit) {
1010
+ /* Visible monster missed the player: announce it (mon-attack.c L718). No
1011
+ * RNG is drawn; unseen monsters and no-miss methods stay silent. */
1012
+ if (env && env.monVisible && blow.method.miss) {
1013
+ env.msg(`${env.monName} misses you.`);
1014
+ }
1015
+ blows.push({
1016
+ hit: false,
1017
+ effect: effectName,
1018
+ method: blow.method.name,
1019
+ damage: 0,
1020
+ sideEffects: [],
1021
+ obvious: false,
1022
+ });
1023
+ continue;
1024
+ }
1025
+
1026
+ /* Apply "protection from evil" (mon-attack.c L597): an evil monster is
1027
+ * repelled on a high roll. The randint0(100) draw happens only when the
1028
+ * guard conditions hold, matching the C short-circuit order. */
1029
+ if (
1030
+ (defender.timed[TMD.PROTEVIL] ?? 0) > 0 &&
1031
+ mon.race.flags.has(RF.EVIL) &&
1032
+ defender.lev >= rlev &&
1033
+ rng.randint0(100) + defender.lev > 50
1034
+ ) {
1035
+ env?.msg(`${mon.race.name} is repelled.`);
1036
+ continue;
1037
+ }
1038
+
1039
+ /* Roll dice, reduce when the attacker is stunned. */
1040
+ const diceRv = blow.dice ? blow.dice.randomValue() : ZERO_RV;
1041
+ let damage = blow.dice ? rng.randcalc(diceRv, rlev, "randomise") : 0;
1042
+ if (stunned) {
1043
+ damage = Math.trunc((damage * (100 - STUN_DAM_REDUCTION)) / 100);
1044
+ }
1045
+
1046
+ /* PARALYZE pre-clamp (mon-blows.c L1020): a paralysed player always takes
1047
+ * at least 1 damage, so paralysis cannot be perma-locked at 0 damage. */
1048
+ if (
1049
+ effectName === "PARALYZE" &&
1050
+ (defender.timed[TMD.PARALYZED] ?? 0) > 0 &&
1051
+ damage < 1
1052
+ ) {
1053
+ damage = 1;
1054
+ }
1055
+
1056
+ const blowCtx: BlowEffectContext = {
1057
+ rng,
1058
+ baseDamage: damage,
1059
+ ac: def.ac + def.toA,
1060
+ rlev,
1061
+ phys: blow.method.phys,
1062
+ method: blow.method,
1063
+ /* The worldless path applies hpDamage after resolveBlowEffect(), unlike
1064
+ * C's monster_damage_target(); predict its return value for handlers
1065
+ * that must stop before later RNG draws (mon-blows.c L1095). */
1066
+ ...(env
1067
+ ? {}
1068
+ : { willPlayerDie: (pendingDamage: number) => defender.chp - pendingDamage < 0 }),
1069
+ };
1070
+
1071
+ /* context->damage after the handler (unreduced; feeds the cut/stun crit). */
1072
+ let contextDamage: number;
1073
+ /* The HP actually dealt this blow (reported / totalled). */
1074
+ let dealtDamage: number;
1075
+ let obvious: boolean;
1076
+ const blowSide: BlowSideEffect[] = [];
1077
+
1078
+ if (env) {
1079
+ const res = resolveBlowEffectLive(effectName, blowCtx, env);
1080
+ contextDamage = res.contextDamage;
1081
+ dealtDamage = res.reducedDamage;
1082
+ obvious = res.obvious;
1083
+ if (res.blinked) blinked = true;
1084
+ if (dealtDamage > 0) totalDamage += dealtDamage;
1085
+ if (env.playerDied) playerDied = true;
1086
+ } else {
1087
+ const res = resolveBlowEffect(effectName, blowCtx);
1088
+ contextDamage = res.hpDamage;
1089
+ dealtDamage = res.hpDamage;
1090
+ obvious = res.obvious;
1091
+ for (const s of res.sideEffects) blowSide.push(s);
1092
+ if (res.hpDamage > 0) {
1093
+ defender.chp -= res.hpDamage;
1094
+ totalDamage += res.hpDamage;
1095
+ if (defender.chp < 0) playerDied = true;
1096
+ }
1097
+ }
1098
+
1099
+ /* Cut and stun (only one of the two), keyed off the UNREDUCED damage. */
1100
+ let doCut = blow.method.cut;
1101
+ let doStun = blow.method.stun;
1102
+ if (playerDied) {
1103
+ doCut = false;
1104
+ doStun = false;
1105
+ }
1106
+ if (doCut && doStun) {
1107
+ if (rng.randint0(100) < 50) doCut = false;
1108
+ else doStun = false;
1109
+ }
1110
+ if (doCut) {
1111
+ const tier = monsterCritical(rng, diceRv, rlev, contextDamage);
1112
+ const amt = cutAmount(rng, tier);
1113
+ if (amt) {
1114
+ if (env) env.incTimed(TMD.CUT, amt, true);
1115
+ else blowSide.push({ kind: "timed", effect: "CUT", amount: amt });
1116
+ }
1117
+ }
1118
+ if (doStun) {
1119
+ const tier = monsterCritical(rng, diceRv, rlev, contextDamage);
1120
+ const amt = stunAmount(rng, tier);
1121
+ if (amt) {
1122
+ if (env) env.incTimed(TMD.STUN, amt, true);
1123
+ else blowSide.push({ kind: "timed", effect: "STUN", amount: amt });
1124
+ }
1125
+ }
1126
+
1127
+ for (const s of blowSide) allSide.push(s);
1128
+ blows.push({
1129
+ hit: true,
1130
+ effect: effectName,
1131
+ method: blow.method.name,
1132
+ damage: dealtDamage,
1133
+ sideEffects: blowSide,
1134
+ obvious,
1135
+ });
1136
+
1137
+ /* Skip the other blows if the player has moved (mon-attack.c L736): an
1138
+ * earthquake or knockback relocated the player mid-loop. */
1139
+ if (env && pgrid && !locEq(env.playerGrid(), pgrid)) break;
1140
+ }
1141
+
1142
+ /* Blink away (mon-attack.c L740): a monster that stole gold / an item
1143
+ * teleports after all its blows resolve. */
1144
+ if (env && blinked) env.blinkAway();
1145
+
1146
+ return {
1147
+ attacked: true,
1148
+ blows,
1149
+ totalDamage,
1150
+ playerDied,
1151
+ sideEffects: allSide,
1152
+ };
1153
+ }