@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,1147 @@
1
+ /**
2
+ * Cave commands, ported from reference/src/cmd-cave.c (Angband 4.2.6):
3
+ * opening and closing doors, tunneling (with the calc_digging_chances
4
+ * player math and rubble / gold-vein payouts onto the live floor piles),
5
+ * chest open/disarm branches (do_cmd_open / do_cmd_disarm, gap #49), the
6
+ * alter dispatcher, and the stair commands with their terrain checks.
7
+ *
8
+ * Door LOCKS are traps upstream (the "door lock" trap kind holds the
9
+ * power), so locked-door handling rides on the isLockedDoor / pickLock
10
+ * seams until trap.c lands (#21) - shipped levels place plain closed
11
+ * doors, which open exactly as upstream. square_isknown gating is
12
+ * knowledge (#24): everything is known here, matching the current FOV
13
+ * front end.
14
+ *
15
+ * Chests (game/chest.ts) plug in via the optional `chestDeps`; open gains
16
+ * a chest branch (chest_check(CHEST_OPENABLE) before the door test), and a
17
+ * new "disarm" action is registered that tries chest_check(CHEST_TRAPPED)
18
+ * first and falls through to whatever "disarm" action was already
19
+ * registered (the sibling floor-trap disarm, trap.ts #21) otherwise -
20
+ * merging rather than double-registering, since a stub or the real
21
+ * trap-disarm action is always present by the time this installs.
22
+ *
23
+ * NOW PORTED (was deferred): the swap-digger machinery (player_best_digger,
24
+ * player/best-digger.ts, temporarily wields the pack's best digger and
25
+ * recomputes DIGGING via state.bestDiggerDigging - RNG-free, input-only to the
26
+ * dig roll) feeds tunnelAux; and do_cmd_lock_door (the door-lock branch of
27
+ * do_cmd_disarm plus a dedicated "lock" action) with the exact m_bonus /
28
+ * randint0(100) / randint1(i) RNG order, riding the trap.c door-lock seams
29
+ * (state.setDoorLock / env.isLockedDoor).
30
+ *
31
+ * count_feats direction inference is NOW PORTED (countFeats below, consumed by
32
+ * the shell's open / close / disarm commands): it is unconditional in 4.2.6 --
33
+ * the old easy_open option no longer exists -- so deferring it as "UI" changed
34
+ * the keystrokes ordinary play requires on every door and trap.
35
+ *
36
+ * DEFERRED (ledgered in game-cave-cmd.yaml): do_cmd_steal (shapechange #22) and
37
+ * command repetition. Running and travel / explore (player-path #24) are ported
38
+ * in game/player-path.ts.
39
+ */
40
+
41
+ import type { Loc } from "../loc.js";
42
+ import { DDGRID, DDGRID_DDD, locSum } from "../loc.js";
43
+ import { FEAT, ORIGIN, TF, TMD, TRF } from "../generated/index.js";
44
+ import { SKILL } from "../player/types.js";
45
+ import { motionDir, squareIsSeen } from "../world/view.js";
46
+ import { monsterIsCamouflaged } from "../mon/predicate.js";
47
+ import { monsterWake } from "../mon/take-hit.js";
48
+ import { featIsTreasure } from "../world/chunk.js";
49
+ import type { MakeDeps } from "../obj/make.js";
50
+ import { makeGold, makeObject } from "../obj/make.js";
51
+ import { CHEST_QUERY } from "../obj/chest.js";
52
+ import { chestCheck, countChests, doCmdDisarmChest, doCmdOpenChest } from "./chest.js";
53
+ import type { ChestCmdDeps } from "./chest.js";
54
+ import type { GameState, PlayerCommand } from "./context.js";
55
+ import { queueCommandRepeat, squareMonster } from "./context.js";
56
+ import {
57
+ knownFeat,
58
+ knownIsBrokenDoor,
59
+ knownIsClosedDoor,
60
+ knownIsDiggable,
61
+ knownIsOpenDoor,
62
+ knownIsPerm,
63
+ squareApparentName,
64
+ squareForget,
65
+ squareIsKnown,
66
+ squareMemorize,
67
+ } from "./known.js";
68
+ import { dungeonGetNextLevel, isQuest } from "./quest.js";
69
+ import { floorCarry } from "./floor.js";
70
+ import { playerConfuseDir } from "./obj-cmd.js";
71
+ import { attackMonster } from "./player-turn.js";
72
+ import type { ActionRegistry } from "./player-turn.js";
73
+ import {
74
+ disarmAux,
75
+ squareDoorPower,
76
+ playerIsTrapsafe,
77
+ squareIsDisarmableTrap,
78
+ squareIsWebbed,
79
+ squareRemoveAllTraps,
80
+ squareTrap,
81
+ type TrapDeps,
82
+ } from "./trap.js";
83
+
84
+ /** Hooks for messages and unported subsystems; all optional. */
85
+ export interface CaveCmdEnv {
86
+ msg?: (text: string) => void;
87
+ /** square_islockeddoor: door locks are traps (#21). Default false. */
88
+ isLockedDoor?: (grid: Loc) => boolean;
89
+ /**
90
+ * The unlock attempt for a locked door (calc_unlocking_chance +
91
+ * square_open_door's lock removal, #21). Returns whether it opened.
92
+ */
93
+ pickLock?: (grid: Loc) => boolean;
94
+ /**
95
+ * player_is_trapsafe (player-util.c:1073-1077): skip disarm-on-walk when
96
+ * true (cmd-cave.c:1311-1312). Default: trap.ts playerIsTrapsafe (timed +
97
+ * derived/equipment OF_TRAP_IMMUNE). Override only for tests.
98
+ */
99
+ isTrapsafe?: (state: GameState) => boolean;
100
+ /**
101
+ * get_check: do_cmd_go_down's force_descend quest warning
102
+ * (cmd-cave.c:126). Default yes - an unprompted terminal auto-accepts, the
103
+ * same convention as effect-general.ts's confirm seam.
104
+ */
105
+ confirm?: (prompt: string) => boolean;
106
+ /**
107
+ * tunnel_aux's `with_clause` (cmd-cave.c:541, :552): "with your hands" with
108
+ * no weapon, "with your weapon" wielding one, "with your swap digger" when
109
+ * player_best_digger swapped a better tool in for the roll. Pairs with
110
+ * state.bestDiggerDigging, which supplies that roll; default "with your
111
+ * hands" only matters in the worldless harness.
112
+ */
113
+ digWithClause?: () => string;
114
+ }
115
+
116
+ /** What the cave commands need beyond the state. */
117
+ export interface CaveCmdDeps {
118
+ /** Object generation deps for rubble finds / gold veins; optional. */
119
+ makeDeps?: MakeDeps;
120
+ env?: CaveCmdEnv;
121
+ /**
122
+ * Chest deps (gap #49); absent, the open/disarm chest branches are
123
+ * skipped entirely (doors and floor traps behave exactly as before).
124
+ */
125
+ chestDeps?: ChestCmdDeps;
126
+ /**
127
+ * Live trap deps for disarm-on-walk (cmd-cave.c:1079-1083). Absent, the
128
+ * walk wrapper never auto-disarms (step triggers as before).
129
+ */
130
+ trapDeps?: TrapDeps;
131
+ }
132
+
133
+ /* ------------------------------------------------------------------ *
134
+ * Level feeling (do_cmd_feeling / display_feeling, cmd-cave.c L1687).
135
+ * ------------------------------------------------------------------ */
136
+
137
+ /** obj_feeling_text[] (cmd-cave.c L1687): the 11 object-feeling strings. */
138
+ const OBJ_FEELING_TEXT = [
139
+ "Looks like any other level.",
140
+ "you sense an item of wondrous power!",
141
+ "there are superb treasures here.",
142
+ "there are excellent treasures here.",
143
+ "there are very good treasures here.",
144
+ "there are good treasures here.",
145
+ "there may be something worthwhile here.",
146
+ "there may not be much interesting here.",
147
+ "there aren't many treasures here.",
148
+ "there are only scraps of junk here.",
149
+ "there is naught but cobwebs here.",
150
+ ] as const;
151
+
152
+ /** mon_feeling_text[] (cmd-cave.c L1707): the 10 monster-feeling strings. */
153
+ const MON_FEELING_TEXT = [
154
+ "You are still uncertain about this place",
155
+ "Omens of death haunt this place",
156
+ "This place seems murderous",
157
+ "This place seems terribly dangerous",
158
+ "You feel anxious about this place",
159
+ "You feel nervous about this place",
160
+ "This place does not seem too risky",
161
+ "This place seems reasonably safe",
162
+ "This seems a tame, sheltered place",
163
+ "This seems a quiet, peaceful place",
164
+ ] as const;
165
+
166
+ /**
167
+ * display_feeling (cmd-cave.c L1729) via do_cmd_feeling (L1777): re-emit the
168
+ * current level feeling. `objOnly` reproduces display_feeling(true), the
169
+ * object-only line shown the moment the object feeling is first discovered;
170
+ * do_cmd_feeling (^F) calls it with objOnly = false. Cold-hearted characters
171
+ * (birth_feelings off) get nothing; the town gets the fixed line; a level not
172
+ * yet explored to feeling_need grids gets only the monster feeling, otherwise
173
+ * the joined "<mon>, and/yet <obj>" line with the exact conjunction rule.
174
+ * feelingNeed defaults to the shipped constants.txt world:feeling-need (10),
175
+ * matching the display-model default (display.ts).
176
+ */
177
+ export function displayFeeling(
178
+ state: GameState,
179
+ opts: { objOnly?: boolean; feelingNeed?: number } = {},
180
+ ): void {
181
+ const chunk = state.chunk;
182
+ const objOnly = opts.objOnly ?? false;
183
+ const feelingNeed = opts.feelingNeed ?? 10;
184
+
185
+ /* Don't show feelings for cold-hearted characters (L1736). */
186
+ if (!(state.options?.get("birth_feelings") ?? true)) return;
187
+
188
+ /* No useful feeling in town (L1739). */
189
+ if (!chunk.depth) {
190
+ state.msg?.("Looks like a typical town.");
191
+ return;
192
+ }
193
+
194
+ let objFeeling = Math.trunc(chunk.feeling / 10);
195
+ let monFeeling = chunk.feeling - 10 * objFeeling;
196
+
197
+ /* Display only the object feeling when it's first discovered (L1745). The
198
+ * disturb(player) upstream pairs with the reveal path (view.ts), not ^F. */
199
+ if (objOnly) {
200
+ state.msg?.(`You feel that ${OBJ_FEELING_TEXT[objFeeling] ?? ""}`);
201
+ return;
202
+ }
203
+
204
+ /* Players automatically get a monster feeling (L1752). */
205
+ if (chunk.feelingSquares < feelingNeed) {
206
+ state.msg?.(`${MON_FEELING_TEXT[monFeeling] ?? ""}.`);
207
+ return;
208
+ }
209
+
210
+ /* Verify the feelings (L1758-1762). */
211
+ if (objFeeling >= OBJ_FEELING_TEXT.length) objFeeling = OBJ_FEELING_TEXT.length - 1;
212
+ if (monFeeling >= MON_FEELING_TEXT.length) monFeeling = MON_FEELING_TEXT.length - 1;
213
+
214
+ /* Decide the conjunction (L1765-1769). */
215
+ const join =
216
+ (monFeeling <= 5 && objFeeling > 6) || (monFeeling > 5 && objFeeling <= 6)
217
+ ? ", yet"
218
+ : ", and";
219
+
220
+ state.msg?.(`${MON_FEELING_TEXT[monFeeling]}${join} ${OBJ_FEELING_TEXT[objFeeling]}`);
221
+ }
222
+
223
+ /**
224
+ * count_feats (cave.c L644-679): how many of the nine grids around (and
225
+ * optionally under) the player match `test`, plus the last one matched.
226
+ *
227
+ * Two details of the C matter and are easy to get wrong. It requires
228
+ * `square_isknown` and then tests **the player's memory**, `player->cave`, not
229
+ * the live map -- so terrain the player has not seen never counts, and
230
+ * misremembered terrain counts as remembered. And `ddgrid_ddd[8]` is the
231
+ * player's own grid, which only participates when `under` is set.
232
+ *
233
+ * Draws no RNG. The C uses this to auto-select a direction for open, close and
234
+ * disarm when exactly one adjacent candidate exists (cmd-cave.c L250-260, L409,
235
+ * L874-876), which is unconditional in 4.2.6 -- the old `easy_open` option no
236
+ * longer exists.
237
+ */
238
+ export function countFeats(
239
+ state: GameState,
240
+ test: (state: GameState, grid: Loc) => boolean,
241
+ under: boolean,
242
+ ): { count: number; grid: Loc | null } {
243
+ let count = 0;
244
+ let last: Loc | null = null;
245
+ for (let d = 0; d < DDGRID_DDD.length; d++) {
246
+ if (d === 8 && !under) continue;
247
+ const grid = locSum(state.actor.grid, DDGRID_DDD[d] as Loc);
248
+ if (!state.chunk.inBoundsFully(grid)) continue;
249
+ if (!squareIsKnown(state, grid)) continue;
250
+ if (!test(state, grid)) continue;
251
+ count++;
252
+ last = grid;
253
+ }
254
+ return { count, grid: last };
255
+ }
256
+
257
+ /* ------------------------------------------------------------------ *
258
+ * Door predicates (cave-square.c) over the feature flags.
259
+ * ------------------------------------------------------------------ */
260
+
261
+ /**
262
+ * square_isunlockeddoor (cave-square.c L791-794): a closed door whose lock
263
+ * power is zero. Locks are traps upstream, so without live trap deps every
264
+ * closed door reads as unlocked -- which matches shipped levels, where plain
265
+ * closed doors are what generation places.
266
+ */
267
+ export function squareIsUnlockedDoor(
268
+ state: GameState,
269
+ grid: Loc,
270
+ trapDeps?: TrapDeps,
271
+ ): boolean {
272
+ if (!state.chunk.isClosedDoor(grid)) return false;
273
+ return trapDeps ? squareDoorPower(state, grid, trapDeps) === 0 : true;
274
+ }
275
+
276
+ /** square_isopendoor: a door that can be closed (TF CLOSABLE). */
277
+ export function squareIsOpenDoor(state: GameState, grid: Loc): boolean {
278
+ return state.chunk.feature(grid).flags.has(TF.CLOSABLE);
279
+ }
280
+
281
+ /** square_isbrokendoor: passable door that cannot be closed. */
282
+ export function squareIsBrokenDoor(state: GameState, grid: Loc): boolean {
283
+ const f = state.chunk.feature(grid).flags;
284
+ return f.has(TF.DOOR_ANY) && f.has(TF.PASSABLE) && !f.has(TF.CLOSABLE);
285
+ }
286
+
287
+ /** square_issecretdoor: a door still disguised as rock. */
288
+ export function squareIsSecretDoor(state: GameState, grid: Loc): boolean {
289
+ const f = state.chunk.feature(grid).flags;
290
+ return f.has(TF.DOOR_ANY) && f.has(TF.ROCK);
291
+ }
292
+
293
+ /** square_isdiggable: mineral, secret door or rubble. */
294
+ export function squareIsDiggable(state: GameState, grid: Loc): boolean {
295
+ return (
296
+ state.chunk.isMineralWall(grid) ||
297
+ squareIsSecretDoor(state, grid) ||
298
+ state.chunk.isRubble(grid)
299
+ );
300
+ }
301
+
302
+ /* ------------------------------------------------------------------ *
303
+ * Digging math (player-calcs.c calc_digging_chances).
304
+ * ------------------------------------------------------------------ */
305
+
306
+ /** enum digging (player.h): the digging-difficulty classes. */
307
+ export const DIGGING = {
308
+ RUBBLE: 0,
309
+ MAGMA: 1,
310
+ QUARTZ: 2,
311
+ GRANITE: 3,
312
+ DOORS: 4,
313
+ MAX: 5,
314
+ } as const;
315
+
316
+ /** calc_digging_chances: success chances (out of 1600) by difficulty. */
317
+ export function calcDiggingChances(diggingSkill: number): number[] {
318
+ const chances = new Array<number>(DIGGING.MAX);
319
+ chances[DIGGING.RUBBLE] = diggingSkill * 8;
320
+ chances[DIGGING.MAGMA] = (diggingSkill - 10) * 4;
321
+ chances[DIGGING.QUARTZ] = (diggingSkill - 20) * 2;
322
+ chances[DIGGING.GRANITE] = (diggingSkill - 40) * 1;
323
+ /* Approximate a 1/1200 chance per skill point over 30. */
324
+ chances[DIGGING.DOORS] = Math.trunc((diggingSkill * 4 - 119) / 3);
325
+ for (let i = 0; i < DIGGING.MAX; i++) {
326
+ chances[i] = Math.max(0, chances[i] as number);
327
+ }
328
+ return chances;
329
+ }
330
+
331
+ /** square_digging: the feature's 1..5 digging class (0 = not diggable). */
332
+ export function squareDigging(state: GameState, grid: Loc): number {
333
+ if (squareIsDiggable(state, grid) || state.chunk.isClosedDoor(grid)) {
334
+ return state.chunk.feature(grid).dig;
335
+ }
336
+ return 0;
337
+ }
338
+
339
+ /* ------------------------------------------------------------------ *
340
+ * Open / close.
341
+ * ------------------------------------------------------------------ */
342
+
343
+ /**
344
+ * do_cmd_open_test (cmd-cave.c:148-166): knowledge first, then a closed door.
345
+ *
346
+ * The knowledge gate matters because it is what stops a player opening a door
347
+ * they have never seen; and the failure arm reconciles a stale memory - if
348
+ * player->cave still remembers a closed door where the real grid has none, the
349
+ * memory is forgotten so the map stops lying.
350
+ */
351
+ function openTest(state: GameState, grid: Loc, env: CaveCmdEnv): boolean {
352
+ if (!state.chunk.inBounds(grid) || !squareIsKnown(state, grid)) {
353
+ env.msg?.("You see nothing there.");
354
+ return false;
355
+ }
356
+ if (!state.chunk.isClosedDoor(grid)) {
357
+ env.msg?.("You see nothing there to open.");
358
+ if (knownIsClosedDoor(state, grid)) squareForget(state, grid);
359
+ return false;
360
+ }
361
+ return true;
362
+ }
363
+
364
+ /** do_cmd_open_aux: open (or pick) the door. Returns "may repeat". */
365
+ function openAux(state: GameState, grid: Loc, env: CaveCmdEnv): boolean {
366
+ if (!openTest(state, grid, env)) return false;
367
+
368
+ if (env.isLockedDoor?.(grid)) {
369
+ /* Locked door: the lock is a trap (#21); the pickLock seam decides. */
370
+ if (env.pickLock?.(grid)) {
371
+ env.msg?.("You have picked the lock.");
372
+ state.chunk.setFeat(grid, FEAT.OPEN);
373
+ } else {
374
+ env.msg?.("You failed to pick the lock.");
375
+ return true; /* We may keep trying. */
376
+ }
377
+ } else {
378
+ /* Closed door. */
379
+ state.chunk.setFeat(grid, FEAT.OPEN);
380
+ }
381
+ return false;
382
+ }
383
+
384
+ /** do_cmd_close_test / _aux (cmd-cave.c:322-393). */
385
+ function closeAux(state: GameState, grid: Loc, env: CaveCmdEnv): boolean {
386
+ if (!state.chunk.inBounds(grid) || !squareIsKnown(state, grid)) {
387
+ env.msg?.("You see nothing there.");
388
+ return false;
389
+ }
390
+ if (!squareIsOpenDoor(state, grid) && !squareIsBrokenDoor(state, grid)) {
391
+ env.msg?.("You see nothing there to close.");
392
+ /* cmd-cave.c:337-341: a remembered door that is not there is forgotten. */
393
+ if (knownIsOpenDoor(state, grid) || knownIsBrokenDoor(state, grid)) {
394
+ squareForget(state, grid);
395
+ }
396
+ return false;
397
+ }
398
+ /* Don't allow if the player is in the way. */
399
+ if (state.chunk.mon(grid) < 0) {
400
+ env.msg?.("You're standing in that doorway.");
401
+ return false;
402
+ }
403
+ if (squareIsBrokenDoor(state, grid)) {
404
+ env.msg?.("The door appears to be broken.");
405
+ } else {
406
+ /* square_close_door (cave-square.c:1361): set_feat(FEAT_CLOSED). */
407
+ state.chunk.setFeat(grid, FEAT.CLOSED);
408
+ }
409
+ return false;
410
+ }
411
+
412
+ /* ------------------------------------------------------------------ *
413
+ * Door lock (do_cmd_lock_door, cmd-cave.c L732).
414
+ * ------------------------------------------------------------------ */
415
+
416
+ /** no_light (cave-view.c L913): the player's own grid is not currently seen. */
417
+ function noLight(state: GameState): boolean {
418
+ return !squareIsSeen(state.chunk, state.actor.grid);
419
+ }
420
+
421
+ /**
422
+ * do_cmd_lock_door (cmd-cave.c L732): try to lock a closed, unlocked door the
423
+ * player is adjacent to. Returns "may repeat" (a failed attempt with hope).
424
+ *
425
+ * RNG ORDER (exact, cmd-cave.c L741-777): the disarm-phys skill is penalized a
426
+ * factor of ten while blind / lightless and again while confused / hallucinating
427
+ * (drawing nothing), then in strict order:
428
+ * 1. power = m_bonus(7, depth) -- the lock's strength (draws RNG)
429
+ * 2. randint0(100) < j -- the success check
430
+ * 3. randint1(i) > 5 -- only on failure, and only when i > 5
431
+ * On success the lock is set to `power` via square_set_door_lock (state.setDoorLock,
432
+ * the "door lock" trap #21 seam); with no trap system live the set is a no-op and
433
+ * the door stays (harmlessly) unlocked, matching the RNG-free monster path.
434
+ */
435
+ function doCmdLockDoor(
436
+ state: GameState,
437
+ grid: Loc,
438
+ deps: CaveCmdDeps,
439
+ ): boolean {
440
+ const env = deps.env ?? {};
441
+
442
+ /* do_cmd_disarm_test (knowledge gate is #24, all known): a closed, unlocked
443
+ door must be there. A confusion redirect onto a non-door grid bails with
444
+ no draws, as do_cmd_disarm_test returning false does upstream. */
445
+ if (
446
+ !state.chunk.isClosedDoor(grid) ||
447
+ (env.isLockedDoor?.(grid) ?? false)
448
+ ) {
449
+ return false;
450
+ }
451
+
452
+ /* Get the "disarm" factor, penalizing some conditions (L741-747). */
453
+ let i = state.actor.combat.skills[SKILL.DISARM_PHYS] ?? 0;
454
+ const p = state.actor.player;
455
+ if ((p.timed[TMD.BLIND] ?? 0) > 0 || noLight(state)) i = Math.trunc(i / 10);
456
+ if ((p.timed[TMD.CONFUSED] ?? 0) > 0 || (p.timed[TMD.IMAGE] ?? 0) > 0) {
457
+ i = Math.trunc(i / 10);
458
+ }
459
+
460
+ /* Calculate lock "power" (L750), then the difficulty (L753-756). */
461
+ const power = state.rng.mBonus(7, state.chunk.depth);
462
+ let j = i - power;
463
+ if (j < 2) j = 2;
464
+
465
+ /* Success (L758-762). */
466
+ if (state.rng.randint0(100) < j) {
467
+ env.msg?.("You lock the door.");
468
+ state.setDoorLock?.(grid, power);
469
+ return false;
470
+ }
471
+
472
+ /* Failure -- keep trying (L764-771), else plain failure (L772-774). */
473
+ if (i > 5 && state.rng.randint1(i) > 5) {
474
+ env.msg?.("You failed to lock the door.");
475
+ return true;
476
+ }
477
+ env.msg?.("You failed to lock the door.");
478
+ return false;
479
+ }
480
+
481
+ /* ------------------------------------------------------------------ *
482
+ * Tunnel.
483
+ * ------------------------------------------------------------------ */
484
+
485
+ /** do_cmd_tunnel_test. */
486
+ function tunnelTest(state: GameState, grid: Loc, env: CaveCmdEnv): boolean {
487
+ if (!state.chunk.inBounds(grid)) return false;
488
+ if (!squareIsKnown(state, grid)) {
489
+ env.msg?.("You see nothing there.");
490
+ return false;
491
+ }
492
+ if (state.chunk.isPerm(grid)) {
493
+ env.msg?.("This seems to be permanent rock.");
494
+ /* cmd-cave.c:464-467: MEMORIZES - discovering titanium teaches it. */
495
+ if (!knownIsPerm(state, grid)) squareMemorize(state, grid);
496
+ return false;
497
+ }
498
+ if (!squareIsDiggable(state, grid) && !state.chunk.isClosedDoor(grid)) {
499
+ env.msg?.("You see nothing there to tunnel.");
500
+ /* cmd-cave.c:474-478: forgets a remembered wall/door that is not there. */
501
+ if (knownIsDiggable(state, grid) || knownIsClosedDoor(state, grid)) {
502
+ squareForget(state, grid);
503
+ }
504
+ return false;
505
+ }
506
+ return true;
507
+ }
508
+
509
+ /**
510
+ * twall (cmd-cave.c:500-515): knock the feature down to floor. The set_feat
511
+ * is square_tunnel_wall (cave-square.c:1414), called at cmd-cave.c:510.
512
+ */
513
+ function twall(state: GameState, grid: Loc): boolean {
514
+ if (!squareIsDiggable(state, grid) && !state.chunk.isClosedDoor(grid)) {
515
+ return false;
516
+ }
517
+ state.chunk.setFeat(grid, FEAT.FLOOR);
518
+ return true;
519
+ }
520
+
521
+ /**
522
+ * do_cmd_tunnel_aux: one digging attempt. player_best_digger temporarily wields
523
+ * the pack's best digger and recomputes DIGGING (via state.bestDiggerDigging,
524
+ * RNG-free) to feed the roll; absent that hook the wielded DIGGING decides.
525
+ * Returns "may repeat" (a failed dig with hope).
526
+ *
527
+ * Exported because a mod handling the walkBlockedByDiggable hook has to be able
528
+ * to make a REAL dig attempt - the same roll and payouts the tunnel command
529
+ * makes - rather than reimplement the roll and drift from it. It draws RNG, so a
530
+ * hook must only call it on a path where it has committed to handling the walk.
531
+ */
532
+ export function tunnelAux(
533
+ state: GameState,
534
+ grid: Loc,
535
+ deps: CaveCmdDeps,
536
+ ): boolean {
537
+ const env = deps.env ?? {};
538
+ if (!tunnelTest(state, grid, env)) return false;
539
+
540
+ const gold = featIsTreasure(state.chunk.features, state.chunk.feat(grid));
541
+ const rubble = state.chunk.isRubble(grid);
542
+
543
+ /* player_best_digger (player-util.c L744): temporarily wield the pack's best
544
+ * digger and recompute DIGGING (RNG-free); the resulting skill feeds the
545
+ * existing randint0(1600) draw below. Absent the hook (worldless harness),
546
+ * the wielded state's DIGGING skill decides, as before. */
547
+ const diggingSkill =
548
+ state.bestDiggerDigging?.() ?? (state.actor.combat.skills[SKILL.DIGGING] ?? 0);
549
+ const chances = calcDiggingChances(diggingSkill);
550
+ let digIdx = squareDigging(state, grid);
551
+ if (digIdx < 1 || digIdx > DIGGING.MAX) digIdx = DIGGING.GRANITE + 1;
552
+ const chance = chances[digIdx - 1] as number;
553
+ const okay = chance > state.rng.randint0(1600);
554
+
555
+ /* with_clause (cmd-cave.c:541, :552) - every tunnel message names the tool. */
556
+ const withClause = env.digWithClause?.() ?? "with your hands";
557
+
558
+ if (okay && twall(state, grid)) {
559
+ if (rubble) {
560
+ env.msg?.(`You have removed the rubble ${withClause}.`);
561
+ /* Place an object (except in town). */
562
+ if (state.rng.randint0(100) < 10 && state.chunk.depth > 0 && deps.makeDeps) {
563
+ const obj = makeObject(
564
+ state.rng,
565
+ deps.makeDeps,
566
+ state.chunk.depth,
567
+ false,
568
+ false,
569
+ false,
570
+ 0,
571
+ state.chunk.depth,
572
+ );
573
+ if (obj) {
574
+ /* cmd-cave.c L600: rubble finds carry ORIGIN_RUBBLE. */
575
+ obj.origin = ORIGIN.RUBBLE;
576
+ obj.originDepth = state.chunk.depth;
577
+ floorCarry(state, grid, obj);
578
+ /* cmd-cave.c:603-609: announced only if it is not ignored and the
579
+ * grid is seen - digging blind finds it without telling you. */
580
+ if (
581
+ !(state.isIgnored?.(obj) ?? false) &&
582
+ squareIsSeen(state.chunk, grid)
583
+ ) {
584
+ env.msg?.("You have found something!");
585
+ }
586
+ }
587
+ }
588
+ } else if (gold && deps.makeDeps) {
589
+ /* Found treasure. */
590
+ const money = makeGold(state.rng, deps.makeDeps, state.chunk.depth, "any");
591
+ /* cmd-cave.c L613: dug-out gold carries ORIGIN_FLOOR. */
592
+ money.origin = ORIGIN.FLOOR;
593
+ money.originDepth = state.chunk.depth;
594
+ floorCarry(state, grid, money);
595
+ env.msg?.(`You have found something digging ${withClause}!`);
596
+ } else {
597
+ env.msg?.(`You have finished the tunnel ${withClause}.`);
598
+ }
599
+ return false;
600
+ }
601
+ /* Failure messages name the terrain the player believes is there
602
+ * (square_apparent_name over player->cave), cmd-cave.c:624-639. */
603
+ if (chance > 0) {
604
+ env.msg?.(
605
+ rubble
606
+ ? `You dig in the rubble ${withClause}.`
607
+ : `You tunnel into the ${squareApparentName(state, grid)} ${withClause}.`,
608
+ );
609
+ return true;
610
+ }
611
+ env.msg?.(
612
+ rubble
613
+ ? `You dig in the rubble ${withClause} with little effect.`
614
+ : `You chip away futilely ${withClause} at the ${squareApparentName(state, grid)}.`,
615
+ );
616
+ return false;
617
+ }
618
+
619
+ /* ------------------------------------------------------------------ *
620
+ * The walk-into-a-wall seam, and the two primitives a mod needs to act on it.
621
+ *
622
+ * Faithful 4.2.6 bumps the wall and spends nothing, and that is all core does.
623
+ * Digging on a blocked walk is NOT in 4.2.6 - it is a feature of neostryder's
624
+ * fork (do_cmd_movement_tunnel_test / the move_player change) - so it lives in
625
+ * the QoL mod, which reaches this point through the walkBlockedByDiggable hook
626
+ * (mod/hooks.ts).
627
+ *
628
+ * What core provides here is deliberately mod-agnostic: movementTunnelTest (is
629
+ * this grid a legal dig target - RNG-free) and tunnelAux (make one real attempt,
630
+ * with the upstream roll and payouts). Both are exported so a mod uses the engine's
631
+ * own dig rather than reimplementing it and drifting. Core names no mod and reads
632
+ * no flag: it cannot tell whether a hook is installed by the bundled QoL mod or by
633
+ * something a player wrote, and that is the point.
634
+ * ------------------------------------------------------------------ */
635
+
636
+ /** do_cmd_tunnel_chance: the player's success chance (out of 1600) at `grid`. */
637
+ function tunnelChance(state: GameState, grid: Loc): number {
638
+ const diggingSkill =
639
+ state.bestDiggerDigging?.() ?? (state.actor.combat.skills[SKILL.DIGGING] ?? 0);
640
+ const chances = calcDiggingChances(diggingSkill);
641
+ let digIdx = squareDigging(state, grid);
642
+ if (digIdx < 1 || digIdx > DIGGING.MAX) digIdx = DIGGING.GRANITE + 1;
643
+ return chances[digIdx - 1] ?? 0;
644
+ }
645
+
646
+ /**
647
+ * do_cmd_movement_tunnel_test (neostryder's Angband fork): a grid the player should tunnel into
648
+ * when they try to WALK into it - known, not permanent rock, impassable,
649
+ * diggable, and diggable with a positive success chance given the current
650
+ * weapon / best pack digger. RNG-free (input only).
651
+ */
652
+ export function movementTunnelTest(state: GameState, grid: Loc): boolean {
653
+ if (!squareIsKnown(state, grid)) return false;
654
+ if (state.chunk.isPerm(grid)) return false;
655
+ if (state.chunk.isPassable(grid)) return false;
656
+ if (!squareIsDiggable(state, grid)) return false;
657
+ return tunnelChance(state, grid) > 0;
658
+ }
659
+
660
+ /**
661
+ * The walk-into-a-wall seam, installed as state.autoDigStep by the session and
662
+ * consulted by walkAction (game/player-turn.ts) when a walk is blocked.
663
+ *
664
+ * Faithful 4.2.6 bumps the wall and spends nothing, so with no mod loaded this
665
+ * returns 0 having drawn NO RNG - the walk falls through to the normal bump and
666
+ * core is byte-identical. A mod may take the walk over through the
667
+ * walkBlockedByDiggable hook (mod/hooks.ts); the digging itself is the mod's,
668
+ * and everything it needs is already public here (movementTunnelTest to decide
669
+ * whether the grid is a legal target, tunnelAux to make one attempt with the
670
+ * real dig roll and payouts).
671
+ *
672
+ * Core deliberately does not check what KIND of mod is asking or which flag it
673
+ * consulted - a hook is present or it is not.
674
+ */
675
+ export function movementAutoDig(
676
+ state: GameState,
677
+ grid: Loc,
678
+ deps: CaveCmdDeps,
679
+ ): number | null {
680
+ /* null, not 0. The hook's contract is that null means "not handled" and a NUMBER
681
+ * means "handled, charge this much energy" - including zero, which is how a mod
682
+ * consumes the keypress without costing the player a turn. Collapsing null to 0
683
+ * here made those two answers identical, so the zero-energy case documented in
684
+ * mod/hooks.ts could not actually happen: the caller's `> 0` test read it as
685
+ * "no mod supplied one" and fell through to the faithful wall-bump. */
686
+ return state.modHooks?.walkBlockedByDiggable?.(state, grid, deps) ?? null;
687
+ }
688
+
689
+ /* ------------------------------------------------------------------ *
690
+ * The command actions.
691
+ * ------------------------------------------------------------------ */
692
+
693
+ function commandGrid(state: GameState, cmd: PlayerCommand): { grid: Loc; dir: number } | null {
694
+ const dir = cmd.dir;
695
+ if (dir === undefined || dir < 1 || dir > 9 || dir === 5) return null;
696
+ return { grid: locSum(state.actor.grid, DDGRID[dir] as Loc), dir };
697
+ }
698
+
699
+ /** The direction supplied by count_feats/count_chests, or the command's one. */
700
+ function inferredDirection(
701
+ state: GameState,
702
+ cmd: PlayerCommand,
703
+ tests: readonly ((state: GameState, grid: Loc) => boolean)[],
704
+ chestQuery?: (typeof CHEST_QUERY)[keyof typeof CHEST_QUERY],
705
+ ): number | undefined {
706
+ if (cmd.dir !== undefined && cmd.dir >= 1 && cmd.dir <= 9) return cmd.dir;
707
+
708
+ let count = 0;
709
+ let grid: Loc | null = null;
710
+ for (const test of tests) {
711
+ const result = countFeats(state, test, false);
712
+ count += result.count;
713
+ if (result.grid) grid = result.grid;
714
+ }
715
+ if (chestQuery !== undefined) {
716
+ const chests = countChests(state, chestQuery);
717
+ count += chests.count;
718
+ if (chests.grid) grid = chests.grid;
719
+ }
720
+ return count === 1 ? motionDir(state.actor.grid, grid!) : undefined;
721
+ }
722
+
723
+ /** dir -> grid, but allowing 5 (the player's own grid) for a chest underfoot. */
724
+ function chestDirGrid(state: GameState, dir: number): Loc {
725
+ return dir === 5 ? state.actor.grid : (locSum(state.actor.grid, DDGRID[dir] as Loc));
726
+ }
727
+
728
+ /** Resolve a command's target grid, allowing dir 5 for chest-capable actions. */
729
+ function chestCommandGrid(state: GameState, cmd: PlayerCommand): { grid: Loc; dir: number } | null {
730
+ const dir = cmd.dir;
731
+ if (dir === undefined || dir < 1 || dir > 9) return null;
732
+ return { grid: chestDirGrid(state, dir), dir };
733
+ }
734
+
735
+ /** Attack the monster standing in the way (shared by open/close/tunnel). */
736
+ function attackBlocker(state: GameState, grid: Loc, env: CaveCmdEnv): void {
737
+ const target = squareMonster(state, grid);
738
+ if (!target) return;
739
+ env.msg?.("There is a monster in the way!");
740
+ /* Route through the full py_attack path (player-turn.ts attackMonster) so
741
+ * open/close/tunnel/alter into a monster gets the complete melee side-effect
742
+ * suite - shield bash, vampiric/confusion/impact brands, temporary
743
+ * brands/slays, fear generation and kill handling (gap 2.5b). A bare pyAttack
744
+ * here previously skipped all of it. */
745
+ attackMonster(state, target);
746
+ }
747
+
748
+ /**
749
+ * do_cmd_open / do_cmd_disarm's monster branch (cmd-cave.c L290-305 /
750
+ * L913-923): a camouflaged monster surprises the player instead of being
751
+ * attacked - become_aware reveals it, then monster_wake(mon, false, 100)
752
+ * wakes it, same as move_player. Close/tunnel/alter do not special-case
753
+ * camouflage upstream (they always py_attack), so they keep calling
754
+ * attackBlocker directly.
755
+ */
756
+ function revealOrAttackBlocker(state: GameState, grid: Loc, env: CaveCmdEnv): void {
757
+ const target = squareMonster(state, grid);
758
+ if (!target) return;
759
+ if (monsterIsCamouflaged(target)) {
760
+ state.becomeAware?.(target);
761
+ monsterWake(state.rng, target, false, 100);
762
+ return;
763
+ }
764
+ attackBlocker(state, grid, env);
765
+ }
766
+
767
+ /**
768
+ * do_cmd_disarm's tail for the lock branch (cmd-cave.c L900-930): spend the
769
+ * turn, apply confusion, then attack a monster in the way or lock the door.
770
+ * Shared by the "lock" action and the disarm command's closed-door branch.
771
+ */
772
+ function lockDoorCommand(
773
+ state: GameState,
774
+ cmd: PlayerCommand,
775
+ dir: number,
776
+ deps: CaveCmdDeps,
777
+ env: CaveCmdEnv,
778
+ ): number {
779
+ const cdir = playerConfuseDir(state, dir);
780
+ const grid = locSum(state.actor.grid, DDGRID[cdir] as Loc);
781
+ let more = false;
782
+ if (state.chunk.mon(grid) > 0) {
783
+ revealOrAttackBlocker(state, grid, env);
784
+ } else {
785
+ more = doCmdLockDoor(state, grid, deps);
786
+ }
787
+ queueCommandRepeat(state, cmd, more);
788
+ return state.z.moveEnergy;
789
+ }
790
+
791
+ /**
792
+ * Register open / close / lock / tunnel / alter and the stair-checked descend /
793
+ * ascend on the action registry.
794
+ */
795
+ export function installCaveCommands(
796
+ registry: ActionRegistry,
797
+ deps: CaveCmdDeps = {},
798
+ ): void {
799
+ const env = deps.env ?? {};
800
+ const chestDeps = deps.chestDeps;
801
+
802
+ /*
803
+ * move_player's alter branch (cmd-cave.c L1079-1083): walking (or jumping)
804
+ * into a known closed door opens it via do_cmd_alter_aux; walking onto a
805
+ * known disarmable trap (when not trapsafe) auto-disarms. Jump uses
806
+ * disarm=false so only the door half applies. Web clear is in walkAction.
807
+ */
808
+ const trapDeps = deps.trapDeps;
809
+ /* Single C player_is_trapsafe (player-util.c:1073-1077) via trap.ts. */
810
+ const isTrapsafe = env.isTrapsafe ?? playerIsTrapsafe;
811
+
812
+ const bumpOpen =
813
+ (prior: ReturnType<typeof registry.get>, allowDisarm: boolean) =>
814
+ (state: GameState, cmd: PlayerCommand): number => {
815
+ /*
816
+ * do_cmd_walk / jump web clear (cmd-cave.c:1288-1297) runs BEFORE
817
+ * confusion so a webbed player spends no confuse-dir draw.
818
+ */
819
+ if (squareIsWebbed(state, state.actor.grid)) {
820
+ env.msg?.("You clear the web.");
821
+ const web = squareTrap(state, state.actor.grid).find(
822
+ (t) => t.kind.flags.has(TRF.WEB) || t.kind.desc === "web",
823
+ );
824
+ squareRemoveAllTraps(state, state.actor.grid, web?.tidx ?? -1);
825
+ return state.z.moveEnergy;
826
+ }
827
+ /* move_player confusion (cmd-cave.c L1299-1302): apply it once, up front,
828
+ * so the bump-open branch and the delegated step both use the redirected
829
+ * direction and player_confuse_dir draws the RNG exactly once. The
830
+ * delegated action is told confusion was already applied (confusedApplied)
831
+ * so it does not re-roll. */
832
+ let dir = cmd.dir;
833
+ let confused = false;
834
+ if (dir !== undefined && dir >= 1 && dir <= 9) {
835
+ const rolled = playerConfuseDir(state, dir);
836
+ confused = rolled !== dir;
837
+ dir = rolled;
838
+ }
839
+ const cmd2: PlayerCommand = { ...cmd, confusedApplied: true };
840
+ if (dir !== undefined) cmd2.dir = dir;
841
+ const grid =
842
+ dir !== undefined && dir >= 1 && dir <= 9 && dir !== 5
843
+ ? locSum(state.actor.grid, DDGRID[dir] as Loc)
844
+ : null;
845
+ /*
846
+ * move_player (cmd-cave.c:1079-1083): ((trap && disarm) || door) &&
847
+ * square_isknown. Door and known-trap alter share the known guard; an
848
+ * unknown closed door falls through to the bump message path.
849
+ */
850
+ if (
851
+ grid &&
852
+ !squareMonster(state, grid) &&
853
+ squareIsKnown(state, grid) &&
854
+ state.chunk.isClosedDoor(grid)
855
+ ) {
856
+ /* move_player L1079-1083: walking into a known closed door sets a 99x
857
+ * repeat (cmd_set_repeat(99) when nrepeats == 0) then do_cmd_alter_aux
858
+ * opens it. A locked door that fails to pick this attempt re-queues the
859
+ * walk so the player keeps trying without pressing the key again,
860
+ * bounded at CMD_AUTO_REPEAT - the same repeat-on-failure budget the
861
+ * explicit open/tunnel/disarm commands use. Re-queue the ORIGINAL cmd
862
+ * (not the confused redirect) so each repeat re-rolls confusion, exactly
863
+ * as upstream's repeat re-runs do_cmd_walk from the top. */
864
+ const more = openAux(state, grid, env);
865
+ queueCommandRepeat(state, cmd, more);
866
+ return state.z.moveEnergy;
867
+ }
868
+ /*
869
+ * move_player L1079-1083 / do_cmd_walk L1311-1312: known disarmable trap
870
+ * + disarm (walk, not jump, not trapsafe) -> do_cmd_alter_aux disarm.
871
+ */
872
+ if (
873
+ allowDisarm &&
874
+ trapDeps &&
875
+ grid &&
876
+ !squareMonster(state, grid) &&
877
+ squareIsDisarmableTrap(state, grid) &&
878
+ squareIsKnown(state, grid) &&
879
+ !isTrapsafe(state)
880
+ ) {
881
+ const more = disarmAux(state, grid, trapDeps);
882
+ queueCommandRepeat(state, cmd, more);
883
+ return state.z.moveEnergy;
884
+ }
885
+ const used = prior ? prior(state, cmd2) : 0;
886
+ /* A confused redirect that dead-ends (bump / edge) still spends a full
887
+ * turn; walkAction returns 0 in that case since confusedApplied is set. */
888
+ return confused && used === 0 ? state.z.moveEnergy : used;
889
+ };
890
+ const priorWalk = registry.get("walk");
891
+ if (priorWalk) registry.register("walk", bumpOpen(priorWalk, true));
892
+ const priorJump = registry.get("jump");
893
+ if (priorJump) registry.register("jump", bumpOpen(priorJump, false));
894
+
895
+ registry.register("open", (state, cmd) => {
896
+ const dir0 = inferredDirection(
897
+ state,
898
+ cmd,
899
+ [(s, grid) => s.chunk.features.featHas(knownFeat(s, grid), TF.DOOR_CLOSED)],
900
+ CHEST_QUERY.OPENABLE,
901
+ );
902
+ const at = dir0 === undefined ? null : chestCommandGrid(state, { ...cmd, dir: dir0 });
903
+ if (!at) return 0;
904
+ /* do_cmd_open (L268-276): a chest there skips the door legality test. */
905
+ const preChest = chestDeps ? chestCheck(state, at.grid, CHEST_QUERY.OPENABLE) : null;
906
+ if (!preChest && !openTest(state, at.grid, env)) return 0;
907
+
908
+ /* Apply confusion after the turn is committed, then re-resolve the
909
+ * chest at the (possibly redirected) grid, as upstream does. */
910
+ const dir = playerConfuseDir(state, at.dir);
911
+ const grid = chestDirGrid(state, dir);
912
+ const chestObj = chestDeps ? chestCheck(state, grid, CHEST_QUERY.OPENABLE) : null;
913
+
914
+ let more = false;
915
+ if (squareMonster(state, grid)) {
916
+ revealOrAttackBlocker(state, grid, env);
917
+ } else if (chestObj) {
918
+ more = doCmdOpenChest(state, grid, chestObj, chestDeps!);
919
+ } else {
920
+ more = openAux(state, grid, env);
921
+ }
922
+ queueCommandRepeat(state, cmd, more);
923
+ return state.z.moveEnergy;
924
+ });
925
+
926
+ registry.register("close", (state, cmd) => {
927
+ const dir0 = inferredDirection(state, cmd, [
928
+ (s, grid) => s.chunk.features.featHas(knownFeat(s, grid), TF.CLOSABLE),
929
+ ]);
930
+ const at = dir0 === undefined ? null : commandGrid(state, { ...cmd, dir: dir0 });
931
+ if (!at) return 0;
932
+ if (
933
+ !state.chunk.inBounds(at.grid) ||
934
+ (!squareIsOpenDoor(state, at.grid) && !squareIsBrokenDoor(state, at.grid))
935
+ ) {
936
+ env.msg?.("You see nothing there to close.");
937
+ return 0;
938
+ }
939
+ const dir = playerConfuseDir(state, at.dir);
940
+ const grid = locSum(state.actor.grid, DDGRID[dir] as Loc);
941
+ let more = false;
942
+ if (state.chunk.mon(grid) > 0) attackBlocker(state, grid, env);
943
+ else more = closeAux(state, grid, env);
944
+ queueCommandRepeat(state, cmd, more);
945
+ return state.z.moveEnergy;
946
+ });
947
+
948
+ /*
949
+ * do_cmd_disarm (L858): disarm a trapped chest, or fall through to
950
+ * whatever "disarm" action is already registered (trap.ts's floor-trap
951
+ * disarm, #21 - or the deferred stub if traps are not installed). A
952
+ * trapped chest at the target grid takes priority, mirroring upstream's
953
+ * chest-before-trap dispatch; capture the prior action BEFORE overwriting
954
+ * so this merges instead of shadowing it.
955
+ */
956
+ const priorDisarm = registry.get("disarm");
957
+ registry.register("disarm", (state, cmd) => {
958
+ const dir0 = inferredDirection(
959
+ state,
960
+ cmd,
961
+ [
962
+ (s, grid) => squareIsDisarmableTrap(s, grid),
963
+ (s, grid) =>
964
+ s.chunk.features.featHas(knownFeat(s, grid), TF.DOOR_CLOSED) &&
965
+ !(env.isLockedDoor?.(grid) ?? false),
966
+ ],
967
+ CHEST_QUERY.TRAPPED,
968
+ );
969
+ const inferredCmd = dir0 === undefined ? cmd : { ...cmd, dir: dir0 };
970
+ if (chestDeps) {
971
+ const at = chestCommandGrid(state, inferredCmd);
972
+ const preChest = at ? chestCheck(state, at.grid, CHEST_QUERY.TRAPPED) : null;
973
+ if (at && preChest) {
974
+ /* Apply confusion after the turn is committed, then re-resolve the
975
+ * chest at the (possibly redirected) grid, as upstream does. */
976
+ const dir = playerConfuseDir(state, at.dir);
977
+ const grid = chestDirGrid(state, dir);
978
+ const chestObj = chestCheck(state, grid, CHEST_QUERY.TRAPPED);
979
+
980
+ if (squareMonster(state, grid)) {
981
+ revealOrAttackBlocker(state, grid, env);
982
+ } else if (chestObj) {
983
+ const more = doCmdDisarmChest(state, chestObj, chestDeps);
984
+ queueCommandRepeat(state, cmd, more);
985
+ } else if (priorDisarm) {
986
+ /* priorDisarm (trap.ts's floor-trap disarm) queues its own repeat. */
987
+ priorDisarm(state, { ...cmd, dir });
988
+ } else {
989
+ env.msg?.("You see nothing there to disarm.");
990
+ }
991
+ return state.z.moveEnergy;
992
+ }
993
+ }
994
+ /*
995
+ * do_cmd_disarm (L927-930): a closed, unlocked door is LOCKED rather than
996
+ * disarmed. Decided on the pre-confusion grid to pick the branch (as the
997
+ * chest branch and do_cmd_open do); lockDoorCommand applies confusion.
998
+ */
999
+ const doorAt = commandGrid(state, inferredCmd);
1000
+ if (
1001
+ doorAt &&
1002
+ state.chunk.isClosedDoor(doorAt.grid) &&
1003
+ !(env.isLockedDoor?.(doorAt.grid) ?? false)
1004
+ ) {
1005
+ return lockDoorCommand(state, cmd, doorAt.dir, deps, env);
1006
+ }
1007
+ return priorDisarm ? priorDisarm(state, inferredCmd) : 0;
1008
+ });
1009
+
1010
+ /*
1011
+ * do_cmd_lock_door reached directly (cmd-cave.c L732): the port also exposes
1012
+ * locking as its own "lock" action so a front end can bind a dedicated key,
1013
+ * in addition to the disarm-command dispatch above. Both share lockDoorCommand
1014
+ * and the exact do_cmd_lock_door RNG order.
1015
+ */
1016
+ registry.register("lock", (state, cmd) => {
1017
+ const at = commandGrid(state, cmd);
1018
+ if (!at) return 0;
1019
+ if (
1020
+ !state.chunk.isClosedDoor(at.grid) ||
1021
+ (env.isLockedDoor?.(at.grid) ?? false)
1022
+ ) {
1023
+ env.msg?.("You see nothing there to lock.");
1024
+ return 0;
1025
+ }
1026
+ return lockDoorCommand(state, cmd, at.dir, deps, env);
1027
+ });
1028
+
1029
+ registry.register("tunnel", (state, cmd) => {
1030
+ const at = commandGrid(state, cmd);
1031
+ if (!at) return 0;
1032
+ if (!tunnelTest(state, at.grid, env)) return 0;
1033
+ const dir = playerConfuseDir(state, at.dir);
1034
+ const grid = locSum(state.actor.grid, DDGRID[dir] as Loc);
1035
+ /* A monster in the way is attacked and the dig does not repeat (upstream
1036
+ * leaves `more` false); otherwise repeat while the aux reports hope. */
1037
+ let more = false;
1038
+ if (state.chunk.mon(grid) > 0) attackBlocker(state, grid, env);
1039
+ else more = tunnelAux(state, grid, deps);
1040
+ queueCommandRepeat(state, cmd, more);
1041
+ return state.z.moveEnergy;
1042
+ });
1043
+
1044
+ /*
1045
+ * do_cmd_alter: attack, tunnel, or open, by what is there. DEFERRED: the
1046
+ * chest and floor-trap-disarm branches upstream falls through to
1047
+ * (do_cmd_alter_aux L969-992) - "alter" is not wired to a shell key yet,
1048
+ * so this stays door/dig/attack-only until it is.
1049
+ */
1050
+ registry.register("alter", (state, cmd) => {
1051
+ const at = commandGrid(state, cmd);
1052
+ if (!at) return 0;
1053
+ const dir = playerConfuseDir(state, at.dir);
1054
+ const grid = locSum(state.actor.grid, DDGRID[dir] as Loc);
1055
+ let more = false;
1056
+ if (state.chunk.mon(grid) > 0) {
1057
+ attackBlocker(state, grid, env);
1058
+ } else if (squareIsDiggable(state, grid)) {
1059
+ more = tunnelAux(state, grid, deps);
1060
+ } else if (state.chunk.isClosedDoor(grid)) {
1061
+ more = openAux(state, grid, env);
1062
+ } else {
1063
+ env.msg?.("You spin around.");
1064
+ return 0;
1065
+ }
1066
+ queueCommandRepeat(state, cmd, more);
1067
+ return state.z.moveEnergy;
1068
+ });
1069
+
1070
+ /* do_cmd_go_down / go_up: require the matching staircase underfoot. When
1071
+ * OPT(autoexplore_commands) and the player is not on the stair, fall through
1072
+ * to do_cmd_navigate_* which uses pathNearestKnown (cmd-cave.c:62-66,107-111;
1073
+ * W2-003). navigate-* is registered by installRunning after this; the
1074
+ * registry.get at call time finds it. */
1075
+ registry.register("descend", (state) => {
1076
+ const p = state.actor.player;
1077
+ if (!state.chunk.isDownstairs(state.actor.grid)) {
1078
+ if (state.options?.get("autoexplore_commands")) {
1079
+ const nav = registry.get("navigate-down");
1080
+ if (nav) return nav(state, { code: "navigate-down" });
1081
+ }
1082
+ env.msg?.("I see no down staircase here.");
1083
+ return 0;
1084
+ }
1085
+ /* Paranoia, no descent from max_depth - 1 (cmd-cave.c:115-119). */
1086
+ if (state.chunk.depth === state.z.maxDepth - 1) {
1087
+ env.msg?.("The dungeon does not appear to extend deeper");
1088
+ return 0;
1089
+ }
1090
+ /* dungeon_get_next_level (cmd-cave.c:103): the quest scan is what keeps a
1091
+ * player on 99 while Sauron lives instead of landing them on Morgoth. */
1092
+ let descendTo = dungeonGetNextLevel(p, state.chunk.depth, 1, state.z);
1093
+ /* Warn a force_descend player about a quest level (cmd-cave.c:121-128).
1094
+ * force_descend measures from max_depth, not from here. */
1095
+ if (state.options?.get("birth_force_descend")) {
1096
+ descendTo = dungeonGetNextLevel(p, p.maxDepth, 1, state.z);
1097
+ if (
1098
+ isQuest(p, descendTo) &&
1099
+ !(env.confirm ?? ((): boolean => true))("Are you sure you want to descend? ")
1100
+ ) {
1101
+ return 0;
1102
+ }
1103
+ }
1104
+ /* Success (cmd-cave.c:134): the stair message, typed MSG_STAIRS_DOWN, goes
1105
+ * through the message log so it reaches the -more- pager and Ctrl-P. */
1106
+ env.msg?.("You enter a maze of down staircases.");
1107
+ /* create_up_stair = true (cmd-cave.c:137): arrive on an up staircase. */
1108
+ state.arrivalStair = "up";
1109
+ state.targetDepth = descendTo;
1110
+ state.generateLevel = true;
1111
+ return state.z.moveEnergy;
1112
+ });
1113
+
1114
+ registry.register("ascend", (state) => {
1115
+ if (!state.chunk.isUpstairs(state.actor.grid)) {
1116
+ if (state.options?.get("autoexplore_commands")) {
1117
+ const nav = registry.get("navigate-up");
1118
+ if (nav) return nav(state, { code: "navigate-up" });
1119
+ }
1120
+ env.msg?.("I see no up staircase here.");
1121
+ return 0;
1122
+ }
1123
+ /* Force descend (cmd-cave.c:70-74): up staircases do nothing at all. */
1124
+ if (state.options?.get("birth_force_descend")) {
1125
+ env.msg?.("Nothing happens!");
1126
+ return 0;
1127
+ }
1128
+ const ascendTo = dungeonGetNextLevel(
1129
+ state.actor.player,
1130
+ state.chunk.depth,
1131
+ -1,
1132
+ state.z,
1133
+ );
1134
+ if (ascendTo === state.chunk.depth) {
1135
+ /* do_cmd_go_up (cmd-cave.c:78-81): can't ascend past the top level. */
1136
+ env.msg?.("You can't go up from here!");
1137
+ return 0;
1138
+ }
1139
+ /* Success (cmd-cave.c:87): typed MSG_STAIRS_UP. */
1140
+ env.msg?.("You enter a maze of up staircases.");
1141
+ /* create_down_stair = true (cmd-cave.c:91): arrive on a down staircase. */
1142
+ state.arrivalStair = "down";
1143
+ state.targetDepth = ascendTo;
1144
+ state.generateLevel = true;
1145
+ return state.z.moveEnergy;
1146
+ });
1147
+ }