@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,852 @@
1
+ /**
2
+ * The player-action layer: a string-keyed action registry and the
3
+ * process_player() command pump, ported from reference/src/cmd-core.c
4
+ * (cmdq_pop / the command dispatch), game-world.c (process_player and
5
+ * process_player_cleanup: player->energy -= energy_use) and the move/attack
6
+ * path of cmd-cave.c / player-util.c / player-attack.c (Angband 4.2.6).
7
+ *
8
+ * The registry is the moddability seam (decision 13): a command code maps to
9
+ * an action that mutates the game state and returns the energy it spent
10
+ * (0 = a free, non-turn-consuming command). Mods add or replace codes without
11
+ * touching the core. The built-in actions cover walk (move / melee an
12
+ * adjacent monster), hold/rest (spend a turn in place) and the stair commands
13
+ * (signal a level change). Every other command code is registered as a stub
14
+ * that spends no energy and is ledgered as deferred.
15
+ *
16
+ * process_player() reads queued commands through the injected provider
17
+ * (state.nextCommand) so the loop never blocks on real input, and drains free
18
+ * commands until one uses energy or the queue empties, exactly as the
19
+ * upstream do-while around cmdq_pop.
20
+ */
21
+
22
+ import { FEAT, MON_MSG, MON_TMD, MSG, OF, PF, STAT, TF, TMD, TRF } from "../generated/index.js";
23
+ import { DDGRID, DDGRID_DDD, locSum } from "../loc.js";
24
+ import type { Loc } from "../loc.js";
25
+ import { pyAttack } from "../combat/melee.js";
26
+ import type { MeleeAttack, MeleeEffectHooks } from "../combat/melee.js";
27
+ import { learnBrandSlayFromMelee } from "../combat/brand-slay.js";
28
+ import type { TempBrandSlay } from "../combat/brand-slay.js";
29
+ import { getLore } from "../mon/lore.js";
30
+ import type { Monster } from "../mon/monster.js";
31
+ import { MDESC, monsterDesc } from "../mon/desc.js";
32
+ import {
33
+ monsterIsCamouflaged,
34
+ monsterIsObvious,
35
+ monsterIsVisible,
36
+ } from "../mon/predicate.js";
37
+ import { monsterWake } from "../mon/take-hit.js";
38
+ import { MON_TMD_FLG_NOTIFY, monIncTimed } from "../mon/timed.js";
39
+ import { equipLearnFlag, equipLearnOnMeleeAttack } from "../obj/knowledge.js";
40
+ import { playerClearTimed, playerTimedGradeEq } from "../player/timed.js";
41
+ import type { GameState, PlayerCommand } from "./context.js";
42
+ import { arenaInterceptDeath, deleteMonster, movePlayer, squareMonster } from "./context.js";
43
+ import { gearGet } from "./gear.js";
44
+ import { floorPile } from "./floor.js";
45
+ import { isTrappedChest } from "../obj/chest.js";
46
+ import {
47
+ knownIsClosedDoor,
48
+ knownIsEnterable,
49
+ knownIsRubble,
50
+ knownObject,
51
+ squareForget,
52
+ squareIsKnown,
53
+ squareMemorize,
54
+ } from "./known.js";
55
+ import { squareIsSeen } from "../world/view.js";
56
+ import { playerConfuseDir } from "./obj-cmd.js";
57
+ import { disturb } from "./player-path.js";
58
+ import { playerAdjustManaPrecise } from "./loop.js";
59
+ import { formatMonsterMessage } from "./mon-message.js";
60
+ import { squareIsWebbed, squareRemoveAllTraps, squareTrap } from "./trap.js";
61
+ import { PY_EXERT, playerCheckTerrainDamage, playerOverExert } from "./world.js";
62
+
63
+ /**
64
+ * A player action: mutate the state for `cmd` and return the energy spent
65
+ * (player->upkeep->energy_use). Zero means the command consumed no turn.
66
+ */
67
+ export type PlayerAction = (state: GameState, cmd: PlayerCommand) => number;
68
+
69
+ /**
70
+ * The action registry (moddable command table). Built-ins can be replaced and
71
+ * new codes added; unknown codes fall back to a no-energy stub.
72
+ */
73
+ export class ActionRegistry {
74
+ private actions = new Map<string, PlayerAction>();
75
+
76
+ /** Register (or replace) the action for a command code. */
77
+ register(code: string, action: PlayerAction): void {
78
+ this.actions.set(code, action);
79
+ }
80
+
81
+ has(code: string): boolean {
82
+ return this.actions.has(code);
83
+ }
84
+
85
+ /** The action for a code, or undefined if none is registered. */
86
+ get(code: string): PlayerAction | undefined {
87
+ return this.actions.get(code);
88
+ }
89
+
90
+ codes(): string[] {
91
+ return Array.from(this.actions.keys());
92
+ }
93
+ }
94
+
95
+ /**
96
+ * The wiring-supplied dependencies for the melee blow side effects (gap 2.5):
97
+ * pieces player-turn cannot build from GameState alone. Installed by the
98
+ * session on the state object (see installMeleeSideEffects); every field is
99
+ * optional, and absent fields degrade to the pre-wiring behaviour.
100
+ */
101
+ export interface MeleeSideDeps {
102
+ /** effect_simple(EF_EARTHQUAKE, source_player(), "0", 0, 10) (L688). */
103
+ earthquake?: () => void;
104
+ /** effect_simple(EF_HEAL_HP, source_player(), drain) (L878). */
105
+ healHp?: (amount: number) => void;
106
+ /** player_has_temporary_brand/slay over the live timed effects. */
107
+ temp?: TempBrandSlay;
108
+ }
109
+
110
+ /** The state extension carrying the wiring-installed melee side deps. */
111
+ type MeleeSideHost = GameState & { meleeSideDeps?: MeleeSideDeps };
112
+
113
+ /** Install the melee side-effect dependencies on the state (session wiring). */
114
+ export function installMeleeSideEffects(
115
+ state: GameState,
116
+ deps: MeleeSideDeps,
117
+ ): void {
118
+ (state as MeleeSideHost).meleeSideDeps = deps;
119
+ }
120
+
121
+ /** player_has over the computed player state, else race/class pflags. */
122
+ function playerHasPf(state: GameState, pf: number): boolean {
123
+ const ps = state.playerState;
124
+ if (ps) return ps.pflags.has(pf);
125
+ const p = state.actor.player;
126
+ return p.race.pflags.has(pf) || p.cls.pflags.has(pf);
127
+ }
128
+
129
+ /** player_of_has over the computed player state flags (equip + innate). */
130
+ function playerOfHasFlag(state: GameState, of: number): boolean {
131
+ return state.playerState?.flags.has(of) ?? false;
132
+ }
133
+
134
+ /**
135
+ * Build the py_attack side-effect hooks (player-attack.c:669-1012) for an
136
+ * attack on `mon` at its current grid: the confusion brand, vampiric drain,
137
+ * bloodlust over-exertion, impact quake, shapechange verbs, shield bash and
138
+ * COMBAT_REGEN reward, each reading the live GameState. Wiring-dependent
139
+ * pieces (earthquake / heal effects, temporary brands) come from the
140
+ * installed MeleeSideDeps.
141
+ */
142
+ export function buildMeleeHooks(state: GameState, mon: Monster): MeleeEffectHooks {
143
+ const p = state.actor.player;
144
+ const deps = (state as MeleeSideHost).meleeSideDeps ?? {};
145
+ const grid = mon.grid;
146
+
147
+ const hooks: MeleeEffectHooks = {
148
+ takeHit: {
149
+ ...(state.becomeAware ? { becomeAware: state.becomeAware } : {}),
150
+ },
151
+ /* Confusion attack (blow_side_effects, player-attack.c:672-677). */
152
+ attConf: (p.timed[TMD.ATT_CONF] ?? 0) > 0,
153
+ clearAttConf: (): void => {
154
+ /* player_clear_timed(p, TMD_ATT_CONF, true, false): route through the
155
+ * grade machinery for the on-end message when the world env is wired. */
156
+ const eff = state.world?.timedTable?.[TMD.ATT_CONF];
157
+ if (eff) {
158
+ playerClearTimed(p, eff, true, false, state.world?.timedHooks ?? {});
159
+ } else {
160
+ p.timed[TMD.ATT_CONF] = 0;
161
+ }
162
+ },
163
+ confuseMonster: (m, dur): void => {
164
+ monIncTimed(state.rng, m, MON_TMD.CONF, dur, MON_TMD_FLG_NOTIFY);
165
+ },
166
+ /* Vampiric drain (player-attack.c:877-881). */
167
+ attVamp: (p.timed[TMD.ATT_VAMP] ?? 0) > 0,
168
+ healPlayer: (amount): void => {
169
+ if (deps.healHp) {
170
+ deps.healHp(amount);
171
+ return;
172
+ }
173
+ /* EF_HEAL_HP fallback: constant amount, no RNG. */
174
+ if (p.chp >= p.mhp || amount <= 0) return;
175
+ p.chp += amount;
176
+ if (p.chp >= p.mhp) {
177
+ p.chp = p.mhp;
178
+ p.chpFrac = 0;
179
+ }
180
+ if (amount < 5) state.msg?.("You feel a little better.");
181
+ else if (amount < 15) state.msg?.("You feel better.");
182
+ else if (amount < 35) state.msg?.("You feel much better.");
183
+ else state.msg?.("You feel very good.");
184
+ },
185
+ /* Bloodlust over-exertion (player-attack.c:770-774, 871-874). */
186
+ bloodlust: (p.timed[TMD.BLOODLUST] ?? 0) > 0,
187
+ overExertScramble: (): void => {
188
+ state.msg?.("You feel strange...");
189
+ playerOverExert(state, PY_EXERT.SCRAMBLE, 20, 20);
190
+ },
191
+ overExertCon: (): void => {
192
+ state.msg?.("You feel something give way!");
193
+ playerOverExert(state, PY_EXERT.CON, 20, 0);
194
+ },
195
+ /* Impact earthquakes (player-attack.c:816-819, blow_after_effects). */
196
+ impact: playerOfHasFlag(state, OF.IMPACT),
197
+ learnImpact: (): void => {
198
+ equipLearnFlag(p, state.runeEnv, OF.IMPACT);
199
+ },
200
+ ...(deps.earthquake
201
+ ? {
202
+ earthquake: deps.earthquake,
203
+ monsterGone: (): boolean => squareMonster(state, grid) !== mon,
204
+ }
205
+ : {}),
206
+ ...(deps.temp ? { temp: deps.temp } : {}),
207
+ };
208
+
209
+ /* Shapechange blow substitution (player-attack.c:831-838). */
210
+ if (p.shape && p.shape.name !== "normal" && p.shape.blows.length > 0) {
211
+ hooks.shapeBlows = p.shape.blows;
212
+ }
213
+
214
+ /* Reward BGs with 5% of max SPs, min 1/2 point (player-attack.c:1002). */
215
+ if (playerHasPf(state, PF.COMBAT_REGEN)) {
216
+ hooks.combatRegen = (): void => {
217
+ const spGain = Math.trunc((Math.max(p.msp, 10) * 16384) / 5);
218
+ playerAdjustManaPrecise(p, spGain);
219
+ };
220
+ }
221
+
222
+ /* Shield bash (player-attack.c:897-978, attempt_shield_bash). */
223
+ if (playerHasPf(state, PF.SHIELD_BASH)) {
224
+ const armSlot = p.body.slots.findIndex((s) => s.type === "SHIELD");
225
+ const shield =
226
+ armSlot >= 0 ? gearGet(state.gear, p.equipment[armSlot] ?? 0) : null;
227
+ hooks.shieldBash = {
228
+ shield,
229
+ dexInd: state.statInd?.[STAT.DEX] ?? 0,
230
+ strInd: state.statInd?.[STAT.STR] ?? 0,
231
+ playerWt: p.wt,
232
+ totalWeight: p.upkeep.totalWeight,
233
+ showDamage: state.options?.get("show_damage") ?? false,
234
+ msg: (text): void => state.msg?.(text),
235
+ stunMonster: (m, dur): void => {
236
+ monIncTimed(state.rng, m, MON_TMD.STUN, dur, 0);
237
+ },
238
+ confuseMonster: (m, dur): void => {
239
+ monIncTimed(state.rng, m, MON_TMD.CONF, dur, 0);
240
+ },
241
+ };
242
+ }
243
+
244
+ return hooks;
245
+ }
246
+
247
+ /**
248
+ * The shared player-melee path: learn-on-attack wrapping, py_attack with the
249
+ * full side-effect hooks, the delayed "flees in terror" message, and kill
250
+ * handling. Returns the energy used (py_attack's energy_use). Used by the walk
251
+ * command and the bloodlust random attack.
252
+ */
253
+ export function attackMonster(state: GameState, target: Monster): number {
254
+ /* Learning from the attack (player-attack.c L822 equip_learn_on_melee_
255
+ * attack; obj-slays.c learn_brand_slay_from_melee). */
256
+ const deps = (state as MeleeSideHost).meleeSideDeps ?? {};
257
+ const monVisible = monsterIsVisible(target);
258
+ /* health_track (player-attack.c:745-749): hitting something visible makes it
259
+ * the tracked monster, which is what puts it on the sidebar's health bar. This
260
+ * was absent, and melee is the commonest way a player acquires a tracked
261
+ * monster - so the bar stayed blank unless you explicitly targeted. Upstream
262
+ * does it per blow inside py_attack_real; the assignment is idempotent, so
263
+ * once before the blow loop is behaviourally identical. */
264
+ if (monVisible) state.healthWho = target;
265
+ learnBrandSlayFromMelee(
266
+ state.actor.player,
267
+ state.runeEnv,
268
+ state.actor.weapon,
269
+ {
270
+ race: target.race,
271
+ visible: monVisible,
272
+ lore: getLore(state.lore, target.race),
273
+ },
274
+ deps.temp,
275
+ );
276
+ const result: MeleeAttack = pyAttack(
277
+ state.rng,
278
+ state.actor.player,
279
+ state.actor.combat,
280
+ state.actor.weapon,
281
+ target,
282
+ state.brands,
283
+ state.slays,
284
+ {
285
+ /* chance_of_melee_hit halves unseen targets (player-attack.c:104-109),
286
+ * and py_attack's delayed fear message uses the same visibility. */
287
+ monVisible,
288
+ /* player_of_has(p, OF_AFRAID): py_attack_real refuses the blow and prints
289
+ * "You are too afraid to attack X!" (player-attack.c L752). For obvious
290
+ * monsters do_cmd_walk_test short-circuits before this; the check here
291
+ * covers the invisible-monster walk and open/close/tunnel/alter-into-a-
292
+ * monster (attackBlocker), which upstream routes straight to py_attack. */
293
+ afraid: playerOfHasFlag(state, OF.AFRAID),
294
+ percentDamage: state.options?.get("birth_percent_damage") ?? false,
295
+ /* avail_energy = MIN(p->energy, move_energy); process_player only runs
296
+ * with energy >= move_energy, so the full-turn default is upstream's
297
+ * value at every real call site. */
298
+ moveEnergy: state.z.moveEnergy,
299
+ hooks: buildMeleeHooks(state, target),
300
+ },
301
+ );
302
+ equipLearnOnMeleeAttack(state.actor.player, state.runeEnv);
303
+ /* py_attack message slice: hand the blow-by-blow result to the shell for
304
+ * faithful "You hit/miss/slay the X" text (combat returns HitType keys
305
+ * only). Before deletion so the monster name is still resolvable. */
306
+ state.onMelee?.(target, result);
307
+ /* Hack - delay fear messages (player-attack.c:1023). */
308
+ if (result.monsterFled) {
309
+ const flee = formatMonsterMessage(target, MON_MSG.FLEE_IN_TERROR);
310
+ if (flee) state.msg?.(flee);
311
+ }
312
+ if (result.monsterDied && !arenaInterceptDeath(state, target)) {
313
+ state.onPlayerKill?.(target);
314
+ deleteMonster(state, target.midx);
315
+ }
316
+ return result.energyUsed;
317
+ }
318
+
319
+ /**
320
+ * energy_per_move (player-util.c:323-328): the energy one step costs, taking
321
+ * extra moves (state->num_moves, OBJ_MOD_MOVES) into account.
322
+ */
323
+ export function energyPerMove(state: GameState): number {
324
+ const num = state.playerState?.numMoves ?? 0;
325
+ const energy = state.z.moveEnergy;
326
+ return Math.trunc((energy * (1 + Math.abs(num) - num)) / (1 + Math.abs(num)));
327
+ }
328
+
329
+ /**
330
+ * player_attack_random_monster (player-util.c:794-813): melee a random
331
+ * adjacent monster ("You angrily lash out at a nearby foe!"). Draws the
332
+ * starting direction BEFORE the confusion check, as upstream declares
333
+ * `dir = randint0(8)` in the initializer. Returns the energy used, or -1 when
334
+ * no monster was attacked (the command proceeds normally).
335
+ */
336
+ export function playerAttackRandomMonster(state: GameState): number {
337
+ const p = state.actor.player;
338
+ let dir = state.rng.randint0(8);
339
+
340
+ /* Confused players get a free pass. */
341
+ if ((p.timed[TMD.CONFUSED] ?? 0) > 0) return -1;
342
+
343
+ /* Look for a monster, attack. */
344
+ for (let i = 0; i < 8; i++, dir++) {
345
+ const grid = locSum(state.actor.grid, DDGRID_DDD[dir % 8]!);
346
+ const mon = squareMonster(state, grid);
347
+ if (mon && !monsterIsCamouflaged(mon)) {
348
+ /* Upstream sets energy_use = move_energy here, but py_attack resets it
349
+ * to zero and re-accumulates per blow (an upstream quirk preserved:
350
+ * the assignment is dead). */
351
+ state.msg?.("You angrily lash out at a nearby foe!");
352
+ return attackMonster(state, mon);
353
+ }
354
+ }
355
+ return -1;
356
+ }
357
+
358
+ /**
359
+ * walk: melee an adjacent monster (py_attack) or step onto a passable grid,
360
+ * refreshing FOV via the injected hook. Returns move_energy when the turn is
361
+ * spent, 0 when blocked by a wall (a bump uses no energy).
362
+ */
363
+ /**
364
+ * move_player's pre-step damaging-terrain check (cmd-cave.c L1156-1180), factored
365
+ * out for the web shell to run BEFORE it queues a walk so it can block on the
366
+ * yes/no confirm (the core walk action is synchronous and cannot await UI).
367
+ *
368
+ * Returns the feature's walk_msg when a deliberate (non-running) step onto fiery
369
+ * terrain (lava) would cost more than a third of current HP, so the shell prompts
370
+ * "Really step in?" and, on "no", cancels the move without spending a turn; null
371
+ * otherwise. Faithful conditions: only when the target grid is actually stepped
372
+ * onto (not a wall bump, not a monster attack) and the player is not confused
373
+ * (a confused player is never prompted). Like C, playerCheckTerrainDamage(false)
374
+ * is drawn whenever an unconfused player steps onto fiery terrain - prompt or not
375
+ * - which, with the post-turn damage draw, reproduces C's double draw; it learns
376
+ * no rune. The running-into-lava run_msg branch is a documented follow-up.
377
+ */
378
+ export function walkTerrainPrompt(
379
+ state: GameState,
380
+ rawDir: number,
381
+ ): string | null {
382
+ if (rawDir < 1 || rawDir > 9 || rawDir === 5) return null;
383
+ /* move_player only checks damaging terrain when not confused (cmd-cave.c
384
+ * L1157); a confused player is never prompted and draws no terrain-check RNG
385
+ * here (the randomised direction and any damage happen later in walkAction). */
386
+ if ((state.actor.player.timed[TMD.CONFUSED] ?? 0) > 0) return null;
387
+
388
+ const offset = DDGRID[rawDir] as Loc;
389
+ const next: Loc = {
390
+ x: state.actor.grid.x + offset.x,
391
+ y: state.actor.grid.y + offset.y,
392
+ };
393
+ if (!state.chunk.inBounds(next)) return null;
394
+ /* The confirm is on move_player's actual-step branch, after the monster-attack
395
+ * and wall branches: no prompt when attacking a monster or bumping a wall. */
396
+ if (squareMonster(state, next)) return null;
397
+ if (!state.chunk.isPassable(next)) return null;
398
+ if (!state.chunk.isFiery(next)) return null;
399
+
400
+ const dam = playerCheckTerrainDamage(state, next, false);
401
+ /* Non-running walk: prompt only when the step costs more than a third of the
402
+ * player's current HP (cmd-cave.c L1174-1177). */
403
+ if (dam > Math.trunc(state.actor.player.chp / 3)) {
404
+ return state.chunk.feature(next).walkMsg;
405
+ }
406
+ return null;
407
+ }
408
+
409
+ export function walkAction(state: GameState, cmd: PlayerCommand): number {
410
+ const rawDir = cmd.dir;
411
+ if (rawDir === undefined || rawDir < 1 || rawDir > 9 || rawDir === 5) return 0;
412
+
413
+ /*
414
+ * The port merges do_cmd_walk and move_player into one action; upstream's
415
+ * run_step (player-path.c:2042) calls move_player DIRECTLY, skipping
416
+ * do_cmd_walk's preamble. `fromRun` says which caller this is, and the one
417
+ * place it currently changes behaviour is the known-blocked-grid wording
418
+ * below. The other two preamble steps are unreachable from a run either way:
419
+ * runAction refuses to start while confused (so player_confuse_dir cannot
420
+ * redirect a run step) and clears the web underfoot before the first step (and
421
+ * run_test treats a web ahead as a wall).
422
+ */
423
+ const fromRun = cmd.args?.["fromRun"] === true;
424
+
425
+ /*
426
+ * do_cmd_walk / do_cmd_jump (cmd-cave.c:1288-1297 / 1328-1337): standing in
427
+ * a web clears the web and spends the turn in place - no movement.
428
+ */
429
+ if (!fromRun && squareIsWebbed(state, state.actor.grid)) {
430
+ state.msg?.("You clear the web.");
431
+ /* square_remove_all_traps_of_type(web->tidx) (cmd-cave.c:1294). */
432
+ const web = squareTrap(state, state.actor.grid).find(
433
+ (t) => t.kind.flags.has(TRF.WEB) || t.kind.desc === "web",
434
+ );
435
+ squareRemoveAllTraps(state, state.actor.grid, web?.tidx ?? -1);
436
+ return state.z.moveEnergy;
437
+ }
438
+
439
+ /* do_cmd_walk (cmd-cave.c L1299-1302): confusion randomises the direction.
440
+ * When it redirects ("You are confused."), the move spends a full turn even
441
+ * if it dead-ends against a wall (energy_use is set to move_energy before the
442
+ * walkability test). The bump-open wrapper (installCaveCommands) applies
443
+ * confusion up front and sets confusedApplied so the RNG is drawn once; a
444
+ * direct caller (jump, borg, tests) rolls it here. */
445
+ let dir = rawDir;
446
+ let confused = false;
447
+ if (!cmd.confusedApplied) {
448
+ dir = playerConfuseDir(state, rawDir);
449
+ confused = dir !== rawDir;
450
+ }
451
+ const offset = DDGRID[dir] as Loc;
452
+
453
+ const next: Loc = { x: state.actor.grid.x + offset.x, y: state.actor.grid.y + offset.y };
454
+ if (!state.chunk.inBounds(next)) return confused ? state.z.moveEnergy : 0;
455
+
456
+ const target = squareMonster(state, next);
457
+ if (target) {
458
+ /* move_player (cmd-cave.c L1071): a camouflaged monster in the way
459
+ * surprises the player instead of being attacked - reveal it and wake it,
460
+ * matching upstream's become_aware + monster_wake(mon, false, 100). */
461
+ if (monsterIsCamouflaged(target)) {
462
+ state.becomeAware?.(target);
463
+ monsterWake(state.rng, target, false, 100);
464
+ return state.z.moveEnergy;
465
+ }
466
+ /* do_cmd_walk_test (cmd-cave.c L1213-1226): an afraid player refuses to
467
+ * attack an obvious (visible, non-camouflaged) monster - it prints "You are
468
+ * too afraid to attack X!", learns OF_AFRAID from equipment, and makes no
469
+ * move. do_cmd_walk sets energy only AFTER the test passes, so an unconfused
470
+ * refusal costs nothing; a confused walk already spent its full turn. An
471
+ * invisible monster is not obvious, so it falls through to py_attack, whose
472
+ * own afraid branch (player-attack.c L752) fires there instead. */
473
+ if (monsterIsObvious(target) && playerOfHasFlag(state, OF.AFRAID)) {
474
+ state.msg?.(
475
+ `You are too afraid to attack ${monsterDesc(target, MDESC.DEFAULT)}!`,
476
+ "AFRAID",
477
+ );
478
+ state.sound?.(MSG.AFRAID);
479
+ equipLearnFlag(state.actor.player, state.runeEnv, OF.AFRAID);
480
+ return confused ? state.z.moveEnergy : 0;
481
+ }
482
+ /* py_attack: the shared melee path with the full blow side-effect suite.
483
+ * Energy is py_attack's own energy_use (blow_energy per blow), which may
484
+ * be less than a full turn, exactly as upstream. */
485
+ return attackMonster(state, target);
486
+ }
487
+
488
+ /* Bump into a wall: no step, no energy.
489
+ * A mod may take the walk over through the walkBlockedByDiggable hook
490
+ * (mod/hooks.ts) - the QoL mod digs here. autoDigStep returns null having drawn
491
+ * NO RNG when no mod supplied one, so faithful core still just bumps. */
492
+ if (!state.chunk.isPassable(next)) {
493
+ /* `!== null`, not `> 0`: a mod may handle the walk and charge ZERO energy
494
+ * (mod/hooks.ts), and `> 0` silently threw that case away by treating it as
495
+ * "no mod supplied one". */
496
+ const dug = state.autoDigStep?.(state, next) ?? null;
497
+ if (dug !== null) return dug;
498
+ /*
499
+ * Upstream splits this by whether the player already KNOWS the grid, and
500
+ * the port previously used the known-grid wording for both cases.
501
+ *
502
+ * Unknown: do_cmd_walk_test lets the walk proceed (cmd-cave.c:1231-1232),
503
+ * so move_player runs and takes its own !square_ispassable branch
504
+ * (:1092-1106) - "You FEEL a wall blocking your way", because the player
505
+ * cannot see it - and MEMORIZES the grid. That mapping side effect is how
506
+ * you feel your way along an unlit corridor, and it was missing entirely:
507
+ * bumping an unseen wall left it unmapped forever and announced the wall as
508
+ * though it had been in plain sight.
509
+ *
510
+ * Known: do_cmd_walk_test messages "in the way!" and refuses the move
511
+ * (:1240-1253), reconciling player memory with what is really there.
512
+ *
513
+ * A closed door is silent in the KNOWN case only - the walk override
514
+ * (installCaveCommands) opens it (move_player's alter branch, :1079-1083) -
515
+ * so the base action stays a safe fallback when the override is absent
516
+ * (borg / unit tests). An UNKNOWN closed door does get its own line.
517
+ */
518
+ disturb(state);
519
+ const rubble = state.chunk.isRubble(next);
520
+ const door = state.chunk.isClosedDoor(next);
521
+ if (!squareIsKnown(state, next)) {
522
+ state.msg?.(
523
+ rubble
524
+ ? "You feel a pile of rubble blocking your way."
525
+ : door
526
+ ? "You feel a door blocking your way."
527
+ : "You feel a wall blocking your way.",
528
+ "HITWALL",
529
+ );
530
+ /* square_memorize + square_light_spot at each of :1096, :1100, :1104. */
531
+ squareMemorize(state, next);
532
+ } else if (fromRun) {
533
+ /*
534
+ * move_player's OWN known-grid branch (cmd-cave.c:1108-1130), whose
535
+ * wording differs from do_cmd_walk_test's above: "blocking your way", not
536
+ * "in the way!". It is reached only when something other than a deliberate
537
+ * walk drives move_player, because a deliberate walk is refused by
538
+ * do_cmd_walk_test before move_player runs. In 4.2.6 that leaves exactly
539
+ * one route - run_step (player-path.c:2042). The whirlwind
540
+ * (effect-handler-attack.c:1838) is NOT a second route, contrary to the
541
+ * census note: it tests square_ispassable on every candidate grid and
542
+ * says "The way is barred." rather than moving into one.
543
+ *
544
+ * A closed door reports here too (unlike the walk case, where the walk
545
+ * override opens it), because run_step passes disarm only for a trap.
546
+ */
547
+ state.msg?.(
548
+ rubble
549
+ ? "There is a pile of rubble blocking your way."
550
+ : door
551
+ ? "There is a door blocking your way."
552
+ : "There is a wall blocking your way.",
553
+ "HITWALL",
554
+ );
555
+ /* The same memory reconciliation, per branch (:1112-1129). */
556
+ if (rubble) {
557
+ if (!knownIsRubble(state, next)) squareMemorize(state, next);
558
+ } else if (door) {
559
+ if (!knownIsClosedDoor(state, next)) squareMemorize(state, next);
560
+ } else if (knownIsEnterable(state, next)) {
561
+ squareForget(state, next);
562
+ }
563
+ } else if (!door) {
564
+ state.msg?.(
565
+ rubble
566
+ ? "There is a pile of rubble in the way!"
567
+ : "There is a wall in the way!",
568
+ "HITWALL",
569
+ );
570
+ /* The memory reconciliation upstream performs alongside each message: a
571
+ * remembered floor/rubble/door that turns out to be a wall is forgotten
572
+ * (:1252-1257), and rubble the player misremembered is re-memorized
573
+ * (:1243-1246). */
574
+ if (rubble) {
575
+ if (!knownIsRubble(state, next)) squareMemorize(state, next);
576
+ } else if (knownIsEnterable(state, next)) {
577
+ squareForget(state, next);
578
+ }
579
+ }
580
+ /* A confused redirect into a wall still spends the turn (cmd-cave.c
581
+ * L1300-1302); a deliberate bump refunds all energy. */
582
+ return confused ? state.z.moveEnergy : 0;
583
+ }
584
+
585
+ movePlayer(state, next);
586
+ if (state.updateFov) state.updateFov(state);
587
+ search(state); /* player_handle_post_move (player-util.c:1633-1634). */
588
+
589
+ /* Autopickup on the new grid (upstream queues CMD_AUTOPICKUP; its energy
590
+ * cost is folded into this step, see game/pickup.ts). */
591
+ const pickupCost = state.autoPickup ? state.autoPickup(state) : 0;
592
+
593
+ /* Trap / terrain consequences of the step (move_player -> hit_trap). */
594
+ state.onPlayerMoved?.(state, next);
595
+
596
+ /* energy_per_move (cmd-cave.c move_player L1163 via player-util.c:323):
597
+ * extra-moves items make steps cheaper (gap 2.3). */
598
+ return energyPerMove(state) + pickupCost;
599
+ }
600
+
601
+ /**
602
+ * jump (do_cmd_jump, cmd-cave.c:1319): "walk into a trap" - identical to
603
+ * do_cmd_walk except move_player is called with disarm=false (cmd-cave.c:1351),
604
+ * so a known disarmable trap is stepped onto rather than auto-disarmed. The
605
+ * cave-cmd walk wrapper only auto-disarms for code "walk"; jump falls through
606
+ * to the step path.
607
+ */
608
+ export function jumpAction(state: GameState, cmd: PlayerCommand): number {
609
+ return walkAction(state, cmd);
610
+ }
611
+
612
+ /**
613
+ * search (player-util.c:1680-1715): reveal adjacent secret doors and the
614
+ * traps on known chests. The only RNG is place_closed_door's one_in_(4), then
615
+ * randint1(7) on success, once per discovered door in y/x scan order.
616
+ */
617
+ export function search(state: GameState): void {
618
+ const p = state.actor.player;
619
+ if (
620
+ (p.timed[TMD.BLIND] ?? 0) > 0 ||
621
+ !squareIsSeen(state.chunk, state.actor.grid) ||
622
+ (p.timed[TMD.CONFUSED] ?? 0) > 0 ||
623
+ (p.timed[TMD.IMAGE] ?? 0) > 0
624
+ ) return;
625
+
626
+ for (let y = state.actor.grid.y - 1; y <= state.actor.grid.y + 1; y++) {
627
+ for (let x = state.actor.grid.x - 1; x <= state.actor.grid.x + 1; x++) {
628
+ const grid = { x, y };
629
+ if (!state.chunk.inBoundsFully(grid)) continue;
630
+
631
+ const flags = state.chunk.feature(grid).flags;
632
+ if (flags.has(TF.DOOR_ANY) && flags.has(TF.ROCK)) {
633
+ state.msg?.("You have found a secret door.");
634
+ state.chunk.setFeat(grid, FEAT.CLOSED);
635
+ if (state.rng.oneIn(4)) {
636
+ state.setDoorLock?.(grid, state.rng.randint1(7));
637
+ }
638
+ disturb(state);
639
+ }
640
+
641
+ /*
642
+ * The C tests knowledge PER OBJECT (`if (!obj->known || ...) continue;`),
643
+ * which has no exact analogue here: this port's object memory is per GRID
644
+ * (KnownObjectMemory holds the remembered pile head's glyph, not a shadow
645
+ * per object), so the closest check is "is this grid's pile remembered".
646
+ *
647
+ * For floor piles the two agree, because square_know_pile shadows the
648
+ * WHOLE pile at once -- either every object on the grid has a shadow or
649
+ * none does. They diverge only for an object added to an
650
+ * already-remembered grid since the last know_pile, e.g. a chest dropped
651
+ * onto a mapped floor: upstream will not discover its trap until the pile
652
+ * is known again, this will. Narrow, and recorded as a finding rather than
653
+ * faked, since a per-object shadow is a larger design change.
654
+ */
655
+ if (!knownObject(state, grid)) continue;
656
+ for (const obj of floorPile(state, grid)) {
657
+ if ((state.isIgnored?.(obj) ?? false) || !isTrappedChest(obj)) continue;
658
+ if (obj.knownPval !== obj.pval) {
659
+ state.msg?.("You have discovered a trap on the chest!");
660
+ obj.knownPval = obj.pval;
661
+ disturb(state);
662
+ }
663
+ }
664
+ }
665
+ }
666
+ }
667
+
668
+ /** hold / rest: stay put and spend a full turn. */
669
+ export function holdAction(state: GameState, _cmd: PlayerCommand): number {
670
+ search(state);
671
+ return state.z.moveEnergy;
672
+ }
673
+
674
+ /**
675
+ * sleep (do_cmd_sleep, cmd-cave.c:1675): spend a full turn doing nothing.
676
+ * process_player injects CMD_SLEEP when the player is paralyzed or Knocked Out
677
+ * (game-world.c:965-968).
678
+ */
679
+ export function sleepAction(state: GameState, _cmd: PlayerCommand): number {
680
+ return state.z.moveEnergy;
681
+ }
682
+
683
+ /**
684
+ * descend / ascend: signal a level change (player->upkeep->generate_level).
685
+ * The actual level generation and depth change are DEFERRED to the world
686
+ * integration; the loop observes the signal and clears it.
687
+ */
688
+ export function descendAction(state: GameState, _cmd: PlayerCommand): number {
689
+ state.generateLevel = true;
690
+ return state.z.moveEnergy;
691
+ }
692
+
693
+ export function ascendAction(state: GameState, _cmd: PlayerCommand): number {
694
+ state.generateLevel = true;
695
+ return state.z.moveEnergy;
696
+ }
697
+
698
+ /** A deferred command: consumes no turn (ledgered as not yet ported). */
699
+ export function stubAction(_state: GameState, _cmd: PlayerCommand): number {
700
+ return 0;
701
+ }
702
+
703
+ /** Command codes registered as stubs (deferred; see game-loop.yaml).
704
+ * "pickup"/"autopickup" stubs are replaced by installPickup (game/pickup.ts);
705
+ * "run" is replaced by installRunning (game/player-path.ts). */
706
+ export const STUBBED_COMMANDS: readonly string[] = [
707
+ "tunnel",
708
+ "cast",
709
+ "fire",
710
+ "throw",
711
+ "quaff",
712
+ "read",
713
+ "eat",
714
+ "use-staff",
715
+ "aim-wand",
716
+ "zap-rod",
717
+ "activate",
718
+ "pickup",
719
+ "drop",
720
+ "wield",
721
+ "takeoff",
722
+ "look",
723
+ "search",
724
+ "disarm",
725
+ "open",
726
+ "close",
727
+ ];
728
+
729
+ /** Build the default registry: the ported actions plus the deferred stubs. */
730
+ export function createDefaultRegistry(): ActionRegistry {
731
+ const reg = new ActionRegistry();
732
+ reg.register("walk", walkAction);
733
+ reg.register("jump", jumpAction);
734
+ reg.register("hold", holdAction);
735
+ reg.register("rest", holdAction);
736
+ reg.register("sleep", sleepAction);
737
+ reg.register("descend", descendAction);
738
+ reg.register("ascend", ascendAction);
739
+ for (const code of STUBBED_COMMANDS) reg.register(code, stubAction);
740
+ return reg;
741
+ }
742
+
743
+ /**
744
+ * Command codes whose upstream game_cmds entry has can_use_energy = false
745
+ * (cmd-core.c game_cmds): these skip the pre-command bloodlust coercion roll.
746
+ * Every other code maps to an energy-capable command and draws the roll.
747
+ */
748
+ const NON_COERCION_COMMANDS: ReadonlySet<string> = new Set([
749
+ "inscribe",
750
+ "uninscribe",
751
+ "autoinscribe",
752
+ "sell",
753
+ "stash",
754
+ "buy",
755
+ "retrieve",
756
+ "retire",
757
+ "help",
758
+ "repeat",
759
+ ]);
760
+
761
+ /** The result of pumping the player's command queue. */
762
+ export interface PlayerTurnResult {
763
+ /** The provider had no command ready: the loop should return for input. */
764
+ needsInput: boolean;
765
+ /** Energy spent this call (0 when a free command ran or input is needed). */
766
+ energyUsed: number;
767
+ }
768
+
769
+ /**
770
+ * process_player: drain queued commands until one spends energy, the queue
771
+ * empties (needsInput), or the player dies / a level change is requested.
772
+ * Applies the process_player_cleanup energy accounting for the spending
773
+ * command (player->energy -= energy_use; total_energy += energy_use).
774
+ */
775
+ export function processPlayer(
776
+ state: GameState,
777
+ registry: ActionRegistry,
778
+ ): PlayerTurnResult {
779
+ let energyUsed = 0;
780
+ do {
781
+ if (state.isDead || state.generateLevel) break;
782
+
783
+ /* game-world.c:941-947: after the refresh equivalent and before command
784
+ * preparation, recover an overfull/corrupt pack using calc_inventory's
785
+ * sorted inven[] view. */
786
+ state.overflowPack?.();
787
+
788
+ /* Paralyzed or Knocked Out player gets no turn (game-world.c:965-968):
789
+ * inject CMD_SLEEP so a full-energy no-op is spent and nextCommand is
790
+ * never consulted. Ordering matches C: after the detect-ore block (not
791
+ * yet in the port), before command prep / cmdq_pop. */
792
+ {
793
+ const p = state.actor.player;
794
+ const stunEff = state.world?.timedTable?.[TMD.STUN];
795
+ const knockedOut =
796
+ stunEff !== undefined &&
797
+ playerTimedGradeEq(p, stunEff, "Knocked Out");
798
+ if ((p.timed[TMD.PARALYZED] ?? 0) > 0 || knockedOut) {
799
+ if (!state.cmdQueue) state.cmdQueue = [];
800
+ state.cmdQueue.push({ code: "sleep" });
801
+ }
802
+ }
803
+
804
+ /* Drain the internal queue (cmdq) first - self-continuing commands like
805
+ * running push their follow-up there - then ask the injected provider. */
806
+ const cmd =
807
+ state.cmdQueue && state.cmdQueue.length > 0
808
+ ? state.cmdQueue.shift()!
809
+ : state.nextCommand();
810
+ if (!cmd) return { needsInput: true, energyUsed: 0 };
811
+
812
+ /* While TMD_COMMAND runs, the player's commands drive the commanded
813
+ * monster instead (cmd-core.c L333 swaps the command list). */
814
+ const commanding =
815
+ (state.actor.player.timed[TMD.COMMAND] ?? 0) > 0 && state.monCommand;
816
+ const action = commanding
817
+ ? state.monCommand!
818
+ : (registry.get(cmd.code) ?? stubAction);
819
+
820
+ /* Occasional attack instead for bloodlust-affected characters
821
+ * (cmd-core.c:373): before an energy-capable command executes, the
822
+ * coercion roll is drawn (unconditionally, even at zero bloodlust,
823
+ * matching upstream's randint0(200) < timed[TMD_BLOODLUST]); on success
824
+ * the command is dropped and a random adjacent monster is attacked.
825
+ * skip_cmd_coercion is not modelled (save gap 12.6, WP-10). */
826
+ if (!commanding && !NON_COERCION_COMMANDS.has(cmd.code)) {
827
+ if (
828
+ state.rng.randint0(200) <
829
+ (state.actor.player.timed[TMD.BLOODLUST] ?? 0)
830
+ ) {
831
+ const spent = playerAttackRandomMonster(state);
832
+ if (spent >= 0) {
833
+ if (spent > 0) {
834
+ state.actor.energy -= spent;
835
+ state.actor.totalEnergy += spent;
836
+ energyUsed = spent;
837
+ }
838
+ continue;
839
+ }
840
+ }
841
+ }
842
+
843
+ const use = action(state, cmd);
844
+ if (use > 0) {
845
+ state.actor.energy -= use;
846
+ state.actor.totalEnergy += use;
847
+ energyUsed = use;
848
+ }
849
+ } while (energyUsed === 0 && !state.isDead && !state.generateLevel);
850
+
851
+ return { needsInput: false, energyUsed };
852
+ }