@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,1268 @@
1
+ /**
2
+ * The running engine, ported from reference/src/player-path.c (Angband 4.2.6):
3
+ * the Christopher J Stuart corridor/open-area running code - run_init,
4
+ * run_test, run_step and see_wall.
5
+ *
6
+ * Once running begins you keep moving until something interesting happens. In
7
+ * a hallway you follow corners; in the open you run straight but stop before
8
+ * entering an enclosed space; alongside a wall you stop before it opens or
9
+ * closes. Every decision is made from the player's memory of the cave (an
10
+ * unknown wall reads like floor), matching upstream exactly.
11
+ *
12
+ * CONTINUATION SEAM: upstream re-queues CMD_RUN after every step via
13
+ * cmdq_push. This port has no blocking input - process_player reads through
14
+ * the injected provider - so run_step pushes the follow-up onto GameState's
15
+ * internal cmdQueue (the cmdq twin), which processPlayer drains before asking
16
+ * the provider. One keypress therefore drives a whole run, and runGameLoop
17
+ * interleaves it with monster and world turns exactly as upstream does.
18
+ *
19
+ * EXTERNAL disturb(): disturb() (below) is exported and called from the upstream
20
+ * disturb() sites outside the per-step run_test checks - a monster becoming
21
+ * easily visible / leaving view (update_mon, game/known.ts), a visible monster
22
+ * acting in view or bursting a door (monster_turn / monster_turn_can_move,
23
+ * game/monster-turn.ts), and the player taking a melee blow (take_hit, wired
24
+ * through game/mon-side.ts; world DoTs and projections wire it in session/game.ts
25
+ * and game/project-player.ts). All are deterministic (no RNG).
26
+ *
27
+ * path_nearest_known / path_nearest_unknown and the pathfinding branch of
28
+ * run_step are wired (W2-003 navigate-up/down, explore, pathfind). DEFERRED
29
+ * (ledgered in game-player-path.yaml): the automatic open-door / tunnel-rubble
30
+ * command pushes on the pathfind branch; the running torch-radius
31
+ * recalculation (PU_TORCH) and the run-into-trap-disarms nuance ride the
32
+ * light / trap layers.
33
+ */
34
+ import { TF, TRF, TMD } from "../generated/index.js";
35
+ import { DDD, DDGRID, DDGRID_DDD, loc, locEq, locSum } from "../loc.js";
36
+ import { qpNew } from "../z-queue.js";
37
+ import { SKILL } from "../player/types.js";
38
+ import { monsterIsInView, monsterIsObvious, monsterIsVisible, } from "../mon/predicate.js";
39
+ import { squareMonster } from "./context.js";
40
+ import { squareIsKnown } from "./known.js";
41
+ import { calcUnlockingChance, playerIsTrapsafe, squareIsVisibleTrap, squareDestroyTrap, squareIsWebbed, squareRemoveTrap, squareTrap, } from "./trap.js";
42
+ import { DIGGING, calcDiggingChances } from "./cave-cmd.js";
43
+ import { playerConfuseDir } from "./obj-cmd.js";
44
+ import { energyPerMove, walkAction } from "./player-turn.js";
45
+ /** Quick "cycling" through the eight legal directions (player-path.c cycle[]). */
46
+ const CYCLE = [
47
+ 1, 2, 3, 6, 9, 8, 7, 4, 1, 2, 3, 6, 9, 8, 7, 4, 1,
48
+ ];
49
+ /** Map each direction into the middle of cycle[] (player-path.c chome[]). */
50
+ const CHOME = [0, 8, 9, 10, 7, 0, 11, 6, 5, 4];
51
+ /** Ensure the run state exists (created lazily on the first run). */
52
+ function ensureRun(state) {
53
+ if (!state.run) {
54
+ state.run = {
55
+ curDir: 0,
56
+ oldDir: 0,
57
+ openArea: true,
58
+ breakRight: false,
59
+ breakLeft: false,
60
+ running: 0,
61
+ firstStep: false,
62
+ stepCount: 0,
63
+ };
64
+ }
65
+ return state.run;
66
+ }
67
+ /** Push a command onto the internal queue (cmdq_push). */
68
+ function queueCommand(state, cmd) {
69
+ if (!state.cmdQueue)
70
+ state.cmdQueue = [];
71
+ state.cmdQueue.push(cmd);
72
+ }
73
+ /**
74
+ * disturb(): stop running / pathfinding, cancel any rest, free the path steps
75
+ * and flush the queued continuations. path_dest is deliberately kept so the
76
+ * pathfinding auto-open / auto-tunnel branch can re-issue the travel. The
77
+ * sound and redraw halves ride their subsystems (deferred).
78
+ */
79
+ export function disturb(state) {
80
+ if (state.run) {
81
+ state.run.running = 0;
82
+ delete state.run.steps;
83
+ state.run.stepCount = 0;
84
+ }
85
+ /* disturb() clears player->upkeep->resting (player-util.c:1560). The web
86
+ * rest command owns the live lifecycle, but any engine-side disturb during a
87
+ * queue-driven rest must also cancel it. */
88
+ if (state.resting)
89
+ delete state.resting;
90
+ if (state.cmdQueue)
91
+ state.cmdQueue.length = 0;
92
+ }
93
+ /**
94
+ * see_wall: a "known wall" in the given direction from grid. Webs count as
95
+ * walls; unknown rock does not (running treats the unseen like open floor).
96
+ */
97
+ function seeWall(state, dir, grid) {
98
+ const g = locSum(grid, DDGRID[dir]);
99
+ /* Illegal grids are not known walls. */
100
+ if (!state.chunk.inBounds(g))
101
+ return false;
102
+ /* Webs are enough like walls. */
103
+ if (squareIsWebbed(state, g))
104
+ return true;
105
+ /* Non-wall grids are not known walls (square_seemslikewall = TF_ROCK). */
106
+ if (!state.chunk.feature(g).flags.has(TF.ROCK))
107
+ return false;
108
+ /* Unknown walls are not known walls. */
109
+ if (!squareIsKnown(state, g))
110
+ return false;
111
+ return true;
112
+ }
113
+ /**
114
+ * run_init: initialize the running algorithm for a new direction, examining
115
+ * the two grids on each side of the destination to decide whether we are in a
116
+ * hallway (both sides closed), the open, or alongside a single wall, and to
117
+ * pick the diagonal / blunt-corridor entry direction.
118
+ */
119
+ function runInit(state, dir) {
120
+ const run = ensureRun(state);
121
+ const here = state.actor.grid;
122
+ run.firstStep = true;
123
+ run.curDir = dir;
124
+ run.oldDir = dir;
125
+ run.openArea = true;
126
+ run.breakRight = false;
127
+ run.breakLeft = false;
128
+ let deepLeft = false;
129
+ let deepRight = false;
130
+ let shortLeft = false;
131
+ let shortRight = false;
132
+ const grid = locSum(here, DDGRID[dir]);
133
+ const i = CHOME[dir];
134
+ /* Check for a nearby or distant wall on the left. */
135
+ if (seeWall(state, CYCLE[i + 1], here)) {
136
+ run.breakLeft = true;
137
+ shortLeft = true;
138
+ }
139
+ else if (seeWall(state, CYCLE[i + 1], grid)) {
140
+ run.breakLeft = true;
141
+ deepLeft = true;
142
+ }
143
+ /* Check for a nearby or distant wall on the right. */
144
+ if (seeWall(state, CYCLE[i - 1], here)) {
145
+ run.breakRight = true;
146
+ shortRight = true;
147
+ }
148
+ else if (seeWall(state, CYCLE[i - 1], grid)) {
149
+ run.breakRight = true;
150
+ deepRight = true;
151
+ }
152
+ /* Looking for a break: a hallway. */
153
+ if (run.breakLeft && run.breakRight) {
154
+ run.openArea = false;
155
+ /* Angled or blunt corridor entry. */
156
+ if (dir & 0x01) {
157
+ if (deepLeft && !deepRight)
158
+ run.oldDir = CYCLE[i - 1];
159
+ else if (deepRight && !deepLeft)
160
+ run.oldDir = CYCLE[i + 1];
161
+ }
162
+ else if (seeWall(state, CYCLE[i], here)) {
163
+ if (shortLeft && !shortRight)
164
+ run.oldDir = CYCLE[i - 2];
165
+ else if (shortRight && !shortLeft)
166
+ run.oldDir = CYCLE[i + 2];
167
+ }
168
+ }
169
+ }
170
+ /** square_ispassable, but false (rather than asserting) out of bounds. */
171
+ function passable(state, grid) {
172
+ return state.chunk.inBounds(grid) && state.chunk.isPassable(grid);
173
+ }
174
+ /**
175
+ * A visible floor object here that running should stop for: any object in the
176
+ * pile that is not ignored (obj->known && !ignore_item_ok). Everything is
177
+ * known in the port, so the live pile is the player's knowledge.
178
+ */
179
+ function hasBlockingObject(state, grid) {
180
+ const pile = state.floor.get(grid.y * state.chunk.width + grid.x);
181
+ if (!pile)
182
+ return false;
183
+ for (const obj of pile) {
184
+ if (!state.isIgnored || !state.isIgnored(obj))
185
+ return true;
186
+ }
187
+ return false;
188
+ }
189
+ /**
190
+ * run_test: examine the surroundings after a step to decide whether running
191
+ * should stop, and to steer the current direction when following a corridor.
192
+ * Returns true if the running should be stopped.
193
+ */
194
+ function runTest(state) {
195
+ const run = state.run;
196
+ const here = state.actor.grid;
197
+ const prevDir = run.oldDir;
198
+ let option = 0;
199
+ let option2 = 0;
200
+ /* Range of newly adjacent grids - 5 for diagonals, 3 for cardinals. */
201
+ const max = (prevDir & 0x01) + 1;
202
+ /* Look at every newly adjacent square. */
203
+ for (let i = -max; i <= max; i++) {
204
+ const newDir = CYCLE[CHOME[prevDir] + i];
205
+ const grid = locSum(here, DDGRID[newDir]);
206
+ /* Visible monsters abort running. */
207
+ const mon = squareMonster(state, grid);
208
+ if (mon && monsterIsVisible(mon))
209
+ return true;
210
+ /* Visible traps abort running (unless trapsafe). */
211
+ if (squareIsVisibleTrap(state, grid) && !playerIsTrapsafe(state)) {
212
+ return true;
213
+ }
214
+ /* Visible, non-ignored floor objects abort running. */
215
+ if (hasBlockingObject(state, grid))
216
+ return true;
217
+ /* Assume unknown. */
218
+ let inv = true;
219
+ /* Check memorized grids. */
220
+ if (squareIsKnown(state, grid)) {
221
+ /* Interesting feature. */
222
+ if (state.chunk.feature(grid).flags.has(TF.INTERESTING))
223
+ return true;
224
+ /* The grid is "visible". */
225
+ inv = false;
226
+ }
227
+ /* Analyze unknown grids and floors. */
228
+ if (inv || passable(state, grid)) {
229
+ if (run.openArea) {
230
+ /* Nothing. */
231
+ }
232
+ else if (!option) {
233
+ /* The first new direction. */
234
+ option = newDir;
235
+ }
236
+ else if (option2) {
237
+ /* Three new directions. Stop running. */
238
+ return true;
239
+ }
240
+ else if (option !== CYCLE[CHOME[prevDir] + i - 1]) {
241
+ /* Two non-adjacent new directions. Stop running. */
242
+ return true;
243
+ }
244
+ else if (newDir & 0x01) {
245
+ /* Two new (adjacent) directions (case 1). */
246
+ option2 = newDir;
247
+ }
248
+ else {
249
+ /* Two new (adjacent) directions (case 2). */
250
+ option2 = option;
251
+ option = newDir;
252
+ }
253
+ }
254
+ else if (run.openArea) {
255
+ /* Obstacle, while looking for open area. */
256
+ if (i < 0)
257
+ run.breakRight = true;
258
+ else if (i > 0)
259
+ run.breakLeft = true;
260
+ }
261
+ }
262
+ /* Look at every soon-to-be newly adjacent square. */
263
+ for (let i = -max; i <= max; i++) {
264
+ const newDir = CYCLE[CHOME[prevDir] + i];
265
+ const grid = locSum(here, locSum(DDGRID[prevDir], DDGRID[newDir]));
266
+ /* Sometimes we come up with illegal bounds. */
267
+ if (!state.chunk.inBounds(grid))
268
+ continue;
269
+ /* Obvious monsters abort running. */
270
+ const mon = squareMonster(state, grid);
271
+ if (mon && monsterIsObvious(mon))
272
+ return true;
273
+ }
274
+ if (run.openArea) {
275
+ /* Looking for open area: look again. */
276
+ for (let i = -max; i < 0; i++) {
277
+ const newDir = CYCLE[CHOME[prevDir] + i];
278
+ const grid = locSum(here, DDGRID[newDir]);
279
+ if (!squareIsKnown(state, grid) || passable(state, grid)) {
280
+ /* Unknown grid or non-wall: looking to break right. */
281
+ if (run.breakRight)
282
+ return true;
283
+ }
284
+ else if (run.breakLeft) {
285
+ /* Obstacle: looking to break left. */
286
+ return true;
287
+ }
288
+ }
289
+ for (let i = max; i > 0; i--) {
290
+ const newDir = CYCLE[CHOME[prevDir] + i];
291
+ const grid = locSum(here, DDGRID[newDir]);
292
+ if (!squareIsKnown(state, grid) || passable(state, grid)) {
293
+ /* Unknown grid or non-wall: looking to break left. */
294
+ if (run.breakLeft)
295
+ return true;
296
+ }
297
+ else if (run.breakRight) {
298
+ /* Obstacle: looking to break right. */
299
+ return true;
300
+ }
301
+ }
302
+ }
303
+ else if (!option) {
304
+ /* Not looking for open area: no options. */
305
+ return true;
306
+ }
307
+ else if (!option2) {
308
+ /* One option. */
309
+ run.curDir = option;
310
+ run.oldDir = option;
311
+ }
312
+ else {
313
+ /* Two options, examining corners: allow curving. */
314
+ run.curDir = option;
315
+ run.oldDir = option2;
316
+ }
317
+ /* About to hit a known wall: stop. */
318
+ if (seeWall(state, run.curDir, here))
319
+ return true;
320
+ return false;
321
+ }
322
+ /* ================================================================== *
323
+ * Pathfinding (player-path.c L36-L1377).
324
+ * ================================================================== */
325
+ /** Scale factor for distances (fractional turns); PF_SCL in player-path.c. */
326
+ const PF_SCL = 16;
327
+ /** A large sentinel standing in for INT_MAX in the distance array. */
328
+ const PF_INF = 0x3fffffff;
329
+ /**
330
+ * is_valid_pf: is a grid OK for the pathfinder to consider? Uses the player's
331
+ * memory: unremembered grids are acceptable unless only_known; damaging
332
+ * terrain and (when forbidding) visible traps are rejected; passable terrain
333
+ * and traversable-with-effort closed doors / rubble are accepted.
334
+ */
335
+ function isValidPf(state, grid, onlyKnown, forbidTraps) {
336
+ if (!squareIsKnown(state, grid))
337
+ return !onlyKnown;
338
+ /* square_isdamaging reduced to fiery terrain (lava); the fuller set
339
+ * rides later batches. */
340
+ if (state.chunk.isFiery(grid))
341
+ return false;
342
+ if (forbidTraps &&
343
+ squareIsVisibleTrap(state, grid) &&
344
+ !playerIsTrapsafe(state)) {
345
+ return false;
346
+ }
347
+ if (state.chunk.isPassable(grid))
348
+ return true;
349
+ if (state.chunk.isClosedDoor(grid) || state.chunk.isRubble(grid))
350
+ return true;
351
+ return false;
352
+ }
353
+ /**
354
+ * compute_unlocked_penalty: expected movement turns to open a known closed door
355
+ * that is unlocked - one turn.
356
+ *
357
+ * player-path.c:125-153 converts standard-turn penalties to movement-turn
358
+ * penalties whenever energyPerMove() differs from moveEnergy. Keep that
359
+ * conversion here: the port's energyPerMove() is player-util.c:323-328.
360
+ */
361
+ function convertTurnPenalty(penalty, state) {
362
+ const movingEnergy = energyPerMove(state);
363
+ if (movingEnergy === state.z.moveEnergy)
364
+ return penalty;
365
+ if (movingEnergy <= 0)
366
+ return PF_INF;
367
+ return Math.round((state.z.moveEnergy * penalty) / movingEnergy);
368
+ }
369
+ function unlockedPenalty(state) {
370
+ return convertTurnPenalty(PF_SCL, state);
371
+ }
372
+ /** compute_locked_penalty: expected movement turns to open a locked door. */
373
+ function lockedPenalty(state) {
374
+ /* Treat the lock power as the maximum in use (7), as upstream does. */
375
+ const chance = calcUnlockingChance(state, 7);
376
+ if (chance <= 0)
377
+ return PF_INF;
378
+ if (chance >= 100)
379
+ return convertTurnPenalty(PF_SCL, state);
380
+ return convertTurnPenalty(Math.round((PF_SCL * 100) / chance), state);
381
+ }
382
+ /** compute_rubble_penalty: expected movement turns to dig through rubble. */
383
+ function rubblePenalty(state) {
384
+ /* player_best_digger (player-path.c L219-256): the swap-to-best-digger DIGGING
385
+ * (RNG-free), matching do_cmd_tunnel_aux. Absent the hook (worldless harness),
386
+ * the wielded DIGGING skill decides. */
387
+ const chances = calcDiggingChances(state.bestDiggerDigging?.() ?? (state.actor.combat.skills[SKILL.DIGGING] ?? 0));
388
+ const r = chances[DIGGING.RUBBLE];
389
+ if (r <= 0)
390
+ return PF_INF;
391
+ if (r >= 1600)
392
+ return convertTurnPenalty(PF_SCL, state);
393
+ return convertTurnPenalty(Math.round((PF_SCL * 1600) / r), state);
394
+ }
395
+ /**
396
+ * prepare_pfdistances: the distances, in movement turns * PF_SCL, from `start`
397
+ * to every grid, using the player's memory. The outer edge is marked
398
+ * unreachable; some hard-to-traverse known terrain is penalized.
399
+ */
400
+ function preparePfdistances(state, start, onlyKnown, forbidTraps) {
401
+ const w = state.chunk.width;
402
+ const h = state.chunk.height;
403
+ const rows = new Int32Array(w * h);
404
+ /* Border unreachable; interior valid grids start at "infinity". */
405
+ for (let x = 0; x < w; x++)
406
+ rows[x] = -1;
407
+ for (let y = 1; y < h - 1; y++) {
408
+ rows[y * w] = -1;
409
+ for (let x = 1; x < w - 1; x++) {
410
+ rows[y * w + x] = isValidPf(state, loc(x, y), onlyKnown, forbidTraps)
411
+ ? PF_INF
412
+ : -1;
413
+ }
414
+ rows[y * w + w - 1] = -1;
415
+ }
416
+ for (let x = 0; x < w; x++)
417
+ rows[(h - 1) * w + x] = -1;
418
+ rows[start.y * w + start.x] = 0;
419
+ const unlocked = unlockedPenalty(state);
420
+ const locked = lockedPenalty(state);
421
+ const rubble = rubblePenalty(state);
422
+ const pending = [start.y * w + start.x];
423
+ while (pending.length > 0) {
424
+ const i = pending.shift();
425
+ const gy = Math.trunc(i / w);
426
+ const gx = i - gy * w;
427
+ let cur = rows[i];
428
+ if (cur >= PF_INF - PF_SCL)
429
+ continue;
430
+ cur += PF_SCL;
431
+ for (let d = 0; d < 8; d++) {
432
+ const off = DDGRID_DDD[d];
433
+ const nx = gx + off.x;
434
+ const ny = gy + off.y;
435
+ const ni = ny * w + nx;
436
+ if (rows[ni] <= cur)
437
+ continue;
438
+ const ngrid = loc(nx, ny);
439
+ if (!squareIsKnown(state, ngrid) || state.chunk.isPassable(ngrid)) {
440
+ rows[ni] = cur;
441
+ }
442
+ else {
443
+ let penalty;
444
+ if (state.chunk.isClosedDoor(ngrid)) {
445
+ penalty = env_isLockedDoor(state, ngrid) ? locked : unlocked;
446
+ }
447
+ else if (state.chunk.isRubble(ngrid)) {
448
+ penalty = rubble;
449
+ }
450
+ else {
451
+ continue;
452
+ }
453
+ if (cur >= PF_INF - penalty)
454
+ continue;
455
+ const penalized = cur + penalty;
456
+ if (rows[ni] <= penalized)
457
+ continue;
458
+ rows[ni] = penalized;
459
+ }
460
+ pending.push(ni);
461
+ }
462
+ }
463
+ return { rows, width: w, height: h, start };
464
+ }
465
+ /**
466
+ * A locked-door test for the pathfinder's penalty choice. Door locks are traps
467
+ * (#21); without the trap deps wired here we treat every closed door as
468
+ * unlocked (the common case), which only under-penalizes locked doors.
469
+ */
470
+ function env_isLockedDoor(state, grid) {
471
+ return state.chunk.feature(grid).flags.has(TF.DOOR_LOCKED);
472
+ }
473
+ /** pfdistances_to_turncount: expected movement turns to a grid, or -1. */
474
+ function pfTurncount(a, grid) {
475
+ if (grid.y < 0 ||
476
+ grid.y >= a.height ||
477
+ grid.x < 0 ||
478
+ grid.x >= a.width) {
479
+ return -1;
480
+ }
481
+ const d = a.rows[grid.y * a.width + grid.x];
482
+ if (d < 0 || d >= PF_INF)
483
+ return -1;
484
+ return Math.trunc(d / PF_SCL) + (d % PF_SCL >= (PF_SCL + 1) >> 1 ? 1 : 0);
485
+ }
486
+ /**
487
+ * pfdistances_to_path: the path to a destination as forward keypad directions
488
+ * in reverse order (index length-1 is the first step). Returns [] with a
489
+ * length of -1 when unreachable, 0 when already at the destination.
490
+ */
491
+ function pfToPath(a, dest) {
492
+ if (dest.y < 0 ||
493
+ dest.y >= a.height ||
494
+ dest.x < 0 ||
495
+ dest.x >= a.width ||
496
+ a.rows[dest.y * a.width + dest.x] < 0) {
497
+ return { length: -1, steps: [] };
498
+ }
499
+ if (locEq(dest, a.start))
500
+ return { length: 0, steps: [] };
501
+ const steps = [];
502
+ let grid = dest;
503
+ while (!locEq(grid, a.start)) {
504
+ let bestK = -1;
505
+ let bestDistance = a.rows[grid.y * a.width + grid.x];
506
+ for (let k = 0; k < 8; k++) {
507
+ const off = DDGRID_DDD[k];
508
+ const next = loc(grid.x + off.x, grid.y + off.y);
509
+ if (next.y < 0 || next.y >= a.height || next.x < 0 || next.x >= a.width) {
510
+ continue;
511
+ }
512
+ const tryD = a.rows[next.y * a.width + next.x];
513
+ if (tryD >= 0 && bestDistance > tryD) {
514
+ bestDistance = tryD;
515
+ bestK = k;
516
+ }
517
+ }
518
+ if (bestK < 0)
519
+ return { length: -1, steps: [] };
520
+ /* Record the opposite of the backward direction. */
521
+ steps.push(10 - DDD[bestK]);
522
+ const off = DDGRID_DDD[bestK];
523
+ grid = loc(grid.x + off.x, grid.y + off.y);
524
+ }
525
+ return { length: steps.length, steps };
526
+ }
527
+ /** initialize_patched_distances (L604): 16x16 patches over a height x width cave. */
528
+ function initializePatchedDistances(height, width) {
529
+ const patchShift = 4;
530
+ const patchSize = 1 << patchShift;
531
+ const patchMask = patchSize - 1;
532
+ let npatchy = height >> patchShift;
533
+ if (height & patchMask)
534
+ ++npatchy;
535
+ let npatchx = width >> patchShift;
536
+ if (width & patchMask)
537
+ ++npatchx;
538
+ const patches = [];
539
+ for (let i = 0; i < npatchy; ++i) {
540
+ patches.push(new Array(npatchx).fill(null));
541
+ }
542
+ return {
543
+ patches,
544
+ patchSize,
545
+ patchShift,
546
+ patchMask,
547
+ npatchy,
548
+ npatchx,
549
+ height,
550
+ width,
551
+ };
552
+ }
553
+ /**
554
+ * clear_patched_distances (L649): drop every patch, so the next pass re-derives
555
+ * them under looser constraints. find_path calls this on each retry.
556
+ */
557
+ function clearPatchedDistances(d) {
558
+ for (let i = 0; i < d.npatchy; ++i) {
559
+ d.patches[i].fill(null);
560
+ }
561
+ }
562
+ /**
563
+ * initialize_patch (L666): allocate the patch containing `grid` and seed every
564
+ * cell in it with either the maximum distance (a grid the pathfinder may use)
565
+ * or -1 (one it may not). Cells where the patch overhangs the cave fail
566
+ * square_in_bounds_fully and become -1, which is what keeps the walk in bounds.
567
+ */
568
+ function initializePatch(d, grid, state, onlyKnown, forbidTraps) {
569
+ const patchy = grid.y >> d.patchShift;
570
+ const patchx = grid.x >> d.patchShift;
571
+ const block = new Int32Array(d.patchSize * d.patchSize);
572
+ d.patches[patchy][patchx] = block;
573
+ const cornerY = patchy << d.patchShift;
574
+ const cornerX = patchx << d.patchShift;
575
+ let i = 0;
576
+ for (let y = cornerY; y < cornerY + d.patchSize; ++y) {
577
+ for (let x = cornerX; x < cornerX + d.patchSize; ++x, ++i) {
578
+ const cursor = loc(x, y);
579
+ block[i] =
580
+ state.chunk.inBoundsFully(cursor) &&
581
+ isValidPf(state, cursor, onlyKnown, forbidTraps)
582
+ ? PF_INF
583
+ : -1;
584
+ }
585
+ }
586
+ }
587
+ /**
588
+ * has_patched_distance (L698): is the patch containing `grid` allocated?
589
+ *
590
+ * Upstream asserts the grid is inside the cave; out of bounds is returned as
591
+ * "no patch" here, the same guard pfdistances_to_path uses above where the C
592
+ * asserts. It is unreachable in play: a grid only enters the walk once it has a
593
+ * non-negative distance, which requires square_in_bounds_fully.
594
+ */
595
+ function hasPatchedDistance(d, grid) {
596
+ if (grid.y < 0 || grid.y >= d.height || grid.x < 0 || grid.x >= d.width) {
597
+ return false;
598
+ }
599
+ return d.patches[grid.y >> d.patchShift][grid.x >> d.patchShift] !== null;
600
+ }
601
+ /** get_patched_distance (L712): the stored distance for an allocated patch. */
602
+ function getPatchedDistance(d, grid) {
603
+ const block = d.patches[grid.y >> d.patchShift][grid.x >> d.patchShift];
604
+ return block[((grid.y & d.patchMask) << d.patchShift) + (grid.x & d.patchMask)];
605
+ }
606
+ /** set_patched_distance (L731). */
607
+ function setPatchedDistance(d, grid, distance) {
608
+ const block = d.patches[grid.y >> d.patchShift][grid.x >> d.patchShift];
609
+ block[((grid.y & d.patchMask) << d.patchShift) + (grid.x & d.patchMask)] =
610
+ distance;
611
+ }
612
+ /**
613
+ * patched_distances_to_path (L750): walk backwards from dest to start, taking
614
+ * at each grid the first neighbour (in ddd order) that strictly improves on the
615
+ * best distance seen so far, and recording the forward direction.
616
+ *
617
+ * Two things separate it from pfdistances_to_path even though they look alike.
618
+ * `lastDistance` is seeded ONCE with the maximum and then carries across
619
+ * iterations (L761), where pfdistances_to_path re-reads the current grid's own
620
+ * distance every iteration (L531) - the destination itself never gets a
621
+ * distance here, because find_path returns the moment dest turns up as a
622
+ * neighbour. And grids in patches that were never allocated are skipped
623
+ * outright, so the walk can only pass through what the A* actually touched.
624
+ */
625
+ function patchedDistancesToPath(d, start, dest) {
626
+ const steps = [];
627
+ let lastDistance = PF_INF;
628
+ let grid = dest;
629
+ while (!locEq(grid, start)) {
630
+ let bestGrid = loc(-1, -1);
631
+ let bestK = -1;
632
+ /* Find the next step. */
633
+ for (let k = 0; k < 8; ++k) {
634
+ const off = DDGRID_DDD[k];
635
+ const next = loc(grid.x + off.x, grid.y + off.y);
636
+ if (!hasPatchedDistance(d, next))
637
+ continue;
638
+ const tryDistance = getPatchedDistance(d, next);
639
+ if (tryDistance >= 0 && lastDistance > tryDistance) {
640
+ lastDistance = tryDistance;
641
+ bestK = k;
642
+ bestGrid = next;
643
+ }
644
+ }
645
+ /* Upstream asserts best_k >= 0 (L782): the walk started from a grid the A*
646
+ * reached, so a strictly better neighbour always exists. Bail out the way
647
+ * pfdistances_to_path does (L554) rather than trusting that. */
648
+ if (bestK < 0)
649
+ return { length: -1, steps: [] };
650
+ grid = bestGrid;
651
+ /* Record the opposite of the backward direction. */
652
+ steps.push(10 - DDD[bestK]);
653
+ }
654
+ return { length: steps.length, steps };
655
+ }
656
+ /**
657
+ * find_path (player-path.c L1069), the routine do_cmd_pathfind (cmd-cave.c
658
+ * L1563) calls to travel to a clicked grid: A* from start to dest over the
659
+ * player's memory of the cave, with a Chebyshev heuristic (scaled by PF_SCL, so
660
+ * it is admissible - no step can cost less than one move) on a min-heap
661
+ * priority queue and a lazily patched distance array. Returns the steps as
662
+ * forward keypad directions in reverse order, a length of 0 when already at the
663
+ * destination and -1 when it is unreachable.
664
+ *
665
+ * WHY THE A* AND NOT prepare_pfdistances + pfdistances_to_path. Upstream ships
666
+ * both, and its own comment at L1063-L1067 says the two disagree: "the path
667
+ * returned by find_path() may be different than that returned by
668
+ * pfdistances_to_path()" when several paths tie on expected turncount. Both are
669
+ * minimum-cost, so the turncount, the destination and reachability always
670
+ * agree; what differs is WHICH of the equal-cost step sequences comes back, and
671
+ * do_cmd_pathfind gets its answer from this one. So this is a transcription of
672
+ * the A*, down to the comparisons that settle the ties: the sift order inside
673
+ * the heap (z-queue.ts), qp_pushpop_int handing the incoming grid back on a tie
674
+ * with the head (L1281), the ddd iteration order over the eight neighbours, and
675
+ * the "only the LAST feasible neighbour skips the heap" structure below.
676
+ * prepare_pfdistances and pfdistances_to_path stay as they are - they are
677
+ * faithful ports of upstream's other pair and still serve
678
+ * pfdistances_to_turncount, path_nearest_known and path_nearest_unknown.
679
+ *
680
+ * The retry structure is upstream's: try remembered grids only, then any; and
681
+ * within that, forbid known visible traps, then allow them - but the trap retry
682
+ * only happens if a trap actually blocked something (`hitTrap`, L1289), which is
683
+ * why it is tracked rather than inferred.
684
+ */
685
+ export function findPath(state, start, dest) {
686
+ if (!state.chunk.inBounds(start) || !state.chunk.inBounds(dest)) {
687
+ return { length: -1, steps: [] };
688
+ }
689
+ if (locEq(start, dest))
690
+ return { length: 0, steps: [] };
691
+ /* If both ends are remembered, first try paths that only cross remembered
692
+ * grids; then try ones that may include grids that are not. */
693
+ let onlyKnown = squareIsKnown(state, start) && squareIsKnown(state, dest);
694
+ /* First try paths that avoid known visible traps, then ones that include
695
+ * them. A destination the pathfinder cannot stand on at all is unreachable. */
696
+ let forbidTraps;
697
+ if (isValidPf(state, dest, onlyKnown, true))
698
+ forbidTraps = true;
699
+ else if (isValidPf(state, dest, onlyKnown, false))
700
+ forbidTraps = false;
701
+ else
702
+ return { length: -1, steps: [] };
703
+ /* Remember whether the pathfinding would change because of a known trap. */
704
+ let hitTrap = false;
705
+ /* Precompute quantities to penalize traversing some terrain. */
706
+ const unlocked = unlockedPenalty(state);
707
+ const locked = lockedPenalty(state);
708
+ const rubble = rubblePenalty(state);
709
+ const w = state.chunk.width;
710
+ const distances = initializePatchedDistances(state.chunk.height, w);
711
+ /* Set up the priority queue of feasible paths to consider. */
712
+ const pending = qpNew(4 * (2 + Math.max(Math.abs(start.y - dest.y), Math.abs(start.x - dest.x))));
713
+ initializePatch(distances, start, state, onlyKnown, forbidTraps);
714
+ setPatchedDistance(distances, start, 0);
715
+ let next = start;
716
+ let distNext = 0;
717
+ for (;;) {
718
+ let addGrid = -1;
719
+ let addPriority = -1;
720
+ /* This is the base distance to any neighbor. */
721
+ const distThis = distNext + PF_SCL;
722
+ /* Try the neighbors. */
723
+ for (let i = 0; i < 8; ++i) {
724
+ const off = DDGRID_DDD[i];
725
+ const thisGrid = loc(next.x + off.x, next.y + off.y);
726
+ if (locEq(thisGrid, dest)) {
727
+ /* Reached the destination. */
728
+ return patchedDistancesToPath(distances, start, dest);
729
+ }
730
+ /* Upstream's initialize_patch asserts the grid is in the cave (L674);
731
+ * guarded here for the same reason hasPatchedDistance is. Placed after
732
+ * the destination test so it cannot change the answer: dest is in
733
+ * bounds, so an out-of-bounds neighbour can never be it. */
734
+ if (!state.chunk.inBounds(thisGrid))
735
+ continue;
736
+ if (!hasPatchedDistance(distances, thisGrid)) {
737
+ initializePatch(distances, thisGrid, state, onlyKnown, forbidTraps);
738
+ }
739
+ const distStored = getPatchedDistance(distances, thisGrid);
740
+ if (distStored <= distThis) {
741
+ /* Unreachable, or already reached by a path that is no longer than
742
+ * this one. If a known visible trap is what put it out of reach,
743
+ * remember that allowing traps could change the answer. */
744
+ if (forbidTraps &&
745
+ squareIsKnown(state, thisGrid) &&
746
+ squareIsVisibleTrap(state, thisGrid)) {
747
+ hitTrap = true;
748
+ }
749
+ continue;
750
+ }
751
+ /* A*: add an estimate - the Chebyshev distance - of what is left to get
752
+ * from thisGrid to the destination. */
753
+ let distRemaining = Math.max(Math.abs(dest.x - thisGrid.x), Math.abs(dest.y - thisGrid.y));
754
+ if (distRemaining > Math.trunc(PF_INF / PF_SCL) ||
755
+ distThis >= PF_INF - PF_SCL * distRemaining) {
756
+ /* The destination is not reachable from thisGrid in a reasonable
757
+ * number of turns, so skip it. */
758
+ continue;
759
+ }
760
+ distRemaining *= PF_SCL;
761
+ let penalty;
762
+ if (squareIsKnown(state, thisGrid) &&
763
+ !state.chunk.isPassable(thisGrid)) {
764
+ /* Penalize known but impassable terrain that can still be got through. */
765
+ if (state.chunk.isClosedDoor(thisGrid)) {
766
+ penalty = env_isLockedDoor(state, thisGrid) ? locked : unlocked;
767
+ }
768
+ else if (state.chunk.isRubble(thisGrid)) {
769
+ penalty = rubble;
770
+ }
771
+ else {
772
+ /* Should not happen; treat it as completely impassable. */
773
+ penalty = PF_INF;
774
+ }
775
+ if (distThis >= distStored - penalty ||
776
+ distThis >= PF_INF - penalty - distRemaining) {
777
+ /* The penalty makes this path no shorter than what has already
778
+ * reached the grid, or puts the destination out of reach. */
779
+ continue;
780
+ }
781
+ }
782
+ else {
783
+ penalty = 0;
784
+ }
785
+ /* Push what is pending onto the queue. One feasible neighbour is always
786
+ * held back and handed to pushpop below instead, which is how upstream
787
+ * dives straight into it when it ties with the head of the heap.
788
+ *
789
+ * WART KEPT: upstream's guard is `add_grid > 0` (L1252), not `>= 0`, so a
790
+ * pending grid with index 0 would be silently dropped - while the
791
+ * matching test at L1280 does use `>= 0`. Index 0 is grid (0, 0), on the
792
+ * cave's boundary, which initialize_patch always marks -1; that fails the
793
+ * distStored test above, so it never becomes addGrid and the two guards
794
+ * can never disagree. */
795
+ if (addGrid > 0) {
796
+ if (pending.len() === pending.size()) {
797
+ /* Upstream doubles and gives up if the reallocation fails
798
+ * (L1253-L1270); resizing cannot fail here. */
799
+ pending.resize(2 * pending.size());
800
+ }
801
+ pending.push(addPriority, addGrid);
802
+ }
803
+ addGrid = thisGrid.y * w + thisGrid.x;
804
+ addPriority = distThis + penalty + distRemaining;
805
+ setPatchedDistance(distances, thisGrid, distThis + penalty);
806
+ }
807
+ let nextIndex;
808
+ if (addGrid >= 0) {
809
+ nextIndex = pending.pushpop(addPriority, addGrid);
810
+ }
811
+ else {
812
+ if (pending.len() === 0) {
813
+ /* Exhausted possible paths without reaching the destination. */
814
+ if (forbidTraps && !playerIsTrapsafe(state) && hitTrap) {
815
+ /* Retry, but allow grids that hold known visible traps. */
816
+ forbidTraps = false;
817
+ clearPatchedDistances(distances);
818
+ initializePatch(distances, start, state, onlyKnown, forbidTraps);
819
+ setPatchedDistance(distances, start, 0);
820
+ next = start;
821
+ distNext = 0;
822
+ continue;
823
+ }
824
+ if (onlyKnown) {
825
+ /* Retry, but allow grids that are not in the player's memory. */
826
+ onlyKnown = false;
827
+ forbidTraps = isValidPf(state, dest, false, true);
828
+ hitTrap = false;
829
+ clearPatchedDistances(distances);
830
+ initializePatch(distances, start, state, onlyKnown, forbidTraps);
831
+ setPatchedDistance(distances, start, 0);
832
+ next = start;
833
+ distNext = 0;
834
+ continue;
835
+ }
836
+ /* Nothing to retry, so give up. */
837
+ return { length: -1, steps: [] };
838
+ }
839
+ nextIndex = pending.pop();
840
+ }
841
+ next = loc(nextIndex % w, Math.trunc(nextIndex / w));
842
+ /* The relevant patch should already have been initialized. */
843
+ distNext = getPatchedDistance(distances, next);
844
+ }
845
+ }
846
+ /**
847
+ * path_nearest_known: the path to the nearest remembered grid (other than the
848
+ * start) satisfying `pred`, with the same constraint-loosening as find_path.
849
+ * Returns the path and the chosen destination.
850
+ */
851
+ export function pathNearestKnown(state, start, pred) {
852
+ let onlyKnown = true;
853
+ let forbidTraps = true;
854
+ for (;;) {
855
+ const dist = preparePfdistances(state, start, onlyKnown, forbidTraps);
856
+ let minGrid = loc(-1, -1);
857
+ let minTurns = PF_INF;
858
+ for (let y = 0; y < state.chunk.height; y++) {
859
+ for (let x = 0; x < state.chunk.width; x++) {
860
+ const grid = loc(x, y);
861
+ if (locEq(grid, start))
862
+ continue;
863
+ if (squareIsKnown(state, grid) && pred(state, grid)) {
864
+ const turns = pfTurncount(dist, grid);
865
+ if (turns > 0 && minTurns > turns) {
866
+ minTurns = turns;
867
+ minGrid = grid;
868
+ }
869
+ }
870
+ }
871
+ }
872
+ if (minTurns < PF_INF) {
873
+ return { ...pfToPath(dist, minGrid), dest: minGrid };
874
+ }
875
+ if (forbidTraps && !playerIsTrapsafe(state)) {
876
+ forbidTraps = false;
877
+ continue;
878
+ }
879
+ if (onlyKnown) {
880
+ onlyKnown = false;
881
+ forbidTraps = true;
882
+ continue;
883
+ }
884
+ return { length: -1, steps: [], dest: loc(-1, -1) };
885
+ }
886
+ }
887
+ /** count_neighbors(square_isknown, under=true): all 9 grids remembered? */
888
+ function allNeighborsKnown(state, grid) {
889
+ for (let d = 0; d < 9; d++) {
890
+ const off = DDGRID_DDD[d];
891
+ const g = loc(grid.x + off.x, grid.y + off.y);
892
+ if (!state.chunk.inBounds(g) || !squareIsKnown(state, g))
893
+ return false;
894
+ }
895
+ return true;
896
+ }
897
+ /** count_neighbors over an arbitrary predicate (under=false: the 8 around). */
898
+ function countNeighbors(state, grid, pred) {
899
+ let count = 0;
900
+ let last = loc(-1, -1);
901
+ for (let d = 0; d < 8; d++) {
902
+ const off = DDGRID_DDD[d];
903
+ const g = loc(grid.x + off.x, grid.y + off.y);
904
+ if (!state.chunk.inBounds(g))
905
+ continue;
906
+ if (pred(state, g)) {
907
+ count++;
908
+ last = g;
909
+ }
910
+ }
911
+ return { count, last };
912
+ }
913
+ /** square_isknownpassable: remembered and passable. */
914
+ function squareIsKnownPassable(state, grid) {
915
+ return squareIsKnown(state, grid) && state.chunk.isPassable(grid);
916
+ }
917
+ /**
918
+ * path_nearest_unknown: the path to the nearest remembered passable grid with
919
+ * an unknown neighbor, or (failing that) the nearest remembered closed door /
920
+ * rubble with an unknown neighbor and a known-passable neighbor to stand on.
921
+ * This is the explore command's target.
922
+ */
923
+ export function pathNearestUnknown(state, start) {
924
+ let onlyKnown = true;
925
+ let forbidTraps = true;
926
+ let passableMode = true;
927
+ for (;;) {
928
+ const dist = preparePfdistances(state, start, onlyKnown, forbidTraps);
929
+ let minGrid = loc(-1, -1);
930
+ let minTurns = PF_INF;
931
+ for (let y = 0; y < state.chunk.height; y++) {
932
+ for (let x = 0; x < state.chunk.width; x++) {
933
+ const grid = loc(x, y);
934
+ if (locEq(grid, start) || !squareIsKnown(state, grid))
935
+ continue;
936
+ let testGrid;
937
+ if (passableMode) {
938
+ if (!state.chunk.isPassable(grid) ||
939
+ countNeighbors(state, grid, squareIsKnown).count === 8) {
940
+ continue;
941
+ }
942
+ testGrid = grid;
943
+ }
944
+ else {
945
+ if ((!state.chunk.isClosedDoor(grid) && !state.chunk.isRubble(grid)) ||
946
+ countNeighbors(state, grid, squareIsKnown).count === 8) {
947
+ continue;
948
+ }
949
+ const near = countNeighbors(state, grid, squareIsKnownPassable);
950
+ if (near.count === 0 || locEq(near.last, start))
951
+ continue;
952
+ testGrid = near.last;
953
+ }
954
+ const turns = pfTurncount(dist, testGrid);
955
+ if (turns > 0 && minTurns > turns) {
956
+ minTurns = turns;
957
+ minGrid = testGrid;
958
+ }
959
+ }
960
+ }
961
+ if (minTurns < PF_INF) {
962
+ return { ...pfToPath(dist, minGrid), dest: minGrid };
963
+ }
964
+ if (forbidTraps && !playerIsTrapsafe(state)) {
965
+ forbidTraps = false;
966
+ continue;
967
+ }
968
+ if (onlyKnown) {
969
+ onlyKnown = false;
970
+ forbidTraps = true;
971
+ continue;
972
+ }
973
+ if (passableMode) {
974
+ passableMode = false;
975
+ onlyKnown = true;
976
+ forbidTraps = true;
977
+ continue;
978
+ }
979
+ return { length: -1, steps: [], dest: loc(-1, -1) };
980
+ }
981
+ }
982
+ /**
983
+ * pathfind_direction_to: the keypad direction from one point to another,
984
+ * preferring diagonals when dx and dy are within a factor of two.
985
+ */
986
+ export function pathfindDirectionTo(from, to) {
987
+ const adx = Math.abs(to.x - from.x);
988
+ const ady = Math.abs(to.y - from.y);
989
+ const dx = to.x - from.x;
990
+ const dy = to.y - from.y;
991
+ if (dx === 0 && dy === 0)
992
+ return 5; /* DIR_NONE */
993
+ const diag = adx < ady * 2 && ady < adx * 2;
994
+ if (dx >= 0 && dy >= 0)
995
+ return diag ? 3 : adx > ady ? 6 : 2;
996
+ if (dx > 0 && dy < 0)
997
+ return diag ? 9 : adx > ady ? 6 : 8;
998
+ if (dx < 0 && dy > 0)
999
+ return diag ? 1 : adx > ady ? 4 : 2;
1000
+ return diag ? 7 : adx > ady ? 4 : 8;
1001
+ }
1002
+ /* ================================================================== *
1003
+ * run_step: the shared move engine for running and pathfinding.
1004
+ * ================================================================== */
1005
+ /**
1006
+ * The pathfinding branch of run_step: decide the next step from the stored
1007
+ * path, auto-opening a fully-surrounded closed door or digging fully-known
1008
+ * rubble (by re-issuing the command then re-pathfinding), stopping on a block,
1009
+ * a visible monster or object, or converting to a plain run if the path would
1010
+ * end in a wall. Returns false to stop (already disturbed), true to take the
1011
+ * chosen step.
1012
+ */
1013
+ function pathfindStep(state, run) {
1014
+ const nextInd = run.stepCount - 1;
1015
+ const nextDir = run.steps[nextInd];
1016
+ const here = state.actor.grid;
1017
+ const grid = locSum(here, DDGRID[nextDir]);
1018
+ /* Auto-open a closed door whose surroundings are fully known. */
1019
+ if (state.chunk.isClosedDoor(grid)) {
1020
+ if (allNeighborsKnown(state, grid)) {
1021
+ const dest = run.pathDest;
1022
+ disturb(state);
1023
+ queueCommand(state, { code: "open", dir: nextDir });
1024
+ if (dest)
1025
+ queueCommand(state, { code: "pathfind", args: { dest } });
1026
+ return false;
1027
+ }
1028
+ }
1029
+ else if (state.chunk.isRubble(grid) && !state.chunk.isPassable(grid)) {
1030
+ if (allNeighborsKnown(state, grid)) {
1031
+ const dest = run.pathDest;
1032
+ disturb(state);
1033
+ queueCommand(state, { code: "tunnel", dir: nextDir });
1034
+ if (dest)
1035
+ queueCommand(state, { code: "pathfind", args: { dest } });
1036
+ return false;
1037
+ }
1038
+ }
1039
+ /* Known impassable terrain that is not automatically handled: stop. */
1040
+ if (squareIsKnown(state, grid) && !state.chunk.isPassable(grid)) {
1041
+ disturb(state);
1042
+ return false;
1043
+ }
1044
+ /* Visible monsters or remembered objects abort. */
1045
+ const mon = squareMonster(state, grid);
1046
+ if (mon && monsterIsVisible(mon)) {
1047
+ disturb(state);
1048
+ return false;
1049
+ }
1050
+ if (hasBlockingObject(state, grid)) {
1051
+ disturb(state);
1052
+ return false;
1053
+ }
1054
+ /* If the path would end up in a wall, convert to a normal run so a click on
1055
+ * an unknown area still explores. Look ahead two to init the run properly. */
1056
+ if (nextInd > 0) {
1057
+ const after = locSum(grid, DDGRID[run.steps[nextInd - 1]]);
1058
+ if (squareIsKnown(state, after) &&
1059
+ !state.chunk.isPassable(after) &&
1060
+ ((!state.chunk.isClosedDoor(after) && !state.chunk.isRubble(after)) ||
1061
+ !allNeighborsKnown(state, after))) {
1062
+ delete run.steps;
1063
+ runInit(state, nextDir);
1064
+ }
1065
+ }
1066
+ if (run.steps) {
1067
+ run.curDir = nextDir;
1068
+ run.stepCount = nextInd;
1069
+ }
1070
+ return true;
1071
+ }
1072
+ /**
1073
+ * run_step: begin a run (real direction), or continue a run / pathfind (dir
1074
+ * 0). Moves one grid in the current direction via walkAction (move / FOV /
1075
+ * autopickup / trap consequences), decrements the counter and re-queues itself
1076
+ * while steps remain. Returns the energy spent (0 stops).
1077
+ */
1078
+ export function runStep(state, dir) {
1079
+ const run = ensureRun(state);
1080
+ if (dir >= 1 && dir <= 9 && dir !== 5) {
1081
+ /* Start a new plain run. */
1082
+ runInit(state, dir);
1083
+ if (run.running === 0)
1084
+ run.running = 9999;
1085
+ }
1086
+ else if (!run.steps) {
1087
+ /* Continue a plain run: an interesting change stops us. */
1088
+ if (runTest(state)) {
1089
+ disturb(state);
1090
+ return 0;
1091
+ }
1092
+ }
1093
+ else if (run.stepCount <= 0) {
1094
+ /* Pathfinding finished. */
1095
+ disturb(state);
1096
+ return 0;
1097
+ }
1098
+ else if (!pathfindStep(state, run)) {
1099
+ /* Pathfinding branch chose to stop (already disturbed / re-queued). */
1100
+ return 0;
1101
+ }
1102
+ /* Take one step in the current direction. Running while confused is not
1103
+ * allowed, so a zero-energy result is an unseen wall - stop. */
1104
+ /* run_step calls move_player DIRECTLY (player-path.c:2042), not do_cmd_walk.
1105
+ * fromRun tells the merged walkAction which of the two it is standing in for -
1106
+ * the blocked-grid wording differs. */
1107
+ const used = walkAction(state, {
1108
+ code: "walk",
1109
+ dir: run.curDir,
1110
+ args: { fromRun: true },
1111
+ });
1112
+ if (used === 0) {
1113
+ disturb(state);
1114
+ return 0;
1115
+ }
1116
+ run.firstStep = false;
1117
+ /* Decrease the counter (after the move, so running works as a flag), then
1118
+ * queue the next step while we are still running. */
1119
+ if (run.running > 0)
1120
+ run.running--;
1121
+ else if (!run.steps)
1122
+ return used;
1123
+ if (run.running > 0 && !state.isDead && !state.generateLevel) {
1124
+ queueCommand(state, { code: "run", dir: 0 });
1125
+ }
1126
+ else if (run.steps) {
1127
+ delete run.steps;
1128
+ run.stepCount = 0;
1129
+ }
1130
+ return used;
1131
+ }
1132
+ /** The run command: start (a real direction) or continue (dir 0) a run. */
1133
+ export function runAction(state, cmd) {
1134
+ /* do_cmd_run clears a web and spends a full turn before checking confusion
1135
+ * (cmd-cave.c:1368-1381). */
1136
+ /* square_iswebbed then square_destroy_trap (cmd-cave.c:1374-1379), which is
1137
+ * square_remove_all_traps - NOT just the web. Filtering to TRF.WEB left any
1138
+ * other trap on the grid armed where upstream clears the lot. */
1139
+ if (squareIsWebbed(state, state.actor.grid)) {
1140
+ state.msg?.("You clear the web.");
1141
+ squareDestroyTrap(state, state.actor.grid);
1142
+ return state.z.moveEnergy;
1143
+ }
1144
+ /* Confused run refusal follows the web branch, preserving its confusion RNG
1145
+ * draw and message (cmd-cave.c:1359-1366). */
1146
+ if ((state.actor.player.timed[TMD.CONFUSED] ?? 0) > 0) {
1147
+ playerConfuseDir(state, cmd.dir ?? 0, true);
1148
+ return 0;
1149
+ }
1150
+ return runStep(state, cmd.dir ?? 0);
1151
+ }
1152
+ /** Begin travelling along a freshly computed path (do_cmd_* setup + run_step). */
1153
+ function beginPath(state, path, dest) {
1154
+ const run = ensureRun(state);
1155
+ if (path.length > 0) {
1156
+ run.steps = path.steps;
1157
+ run.stepCount = path.length;
1158
+ run.pathDest = dest;
1159
+ run.firstStep = true;
1160
+ run.running = path.length;
1161
+ return runStep(state, 0);
1162
+ }
1163
+ return 0;
1164
+ }
1165
+ /**
1166
+ * do_cmd_pathfind: travel to cmd.args.dest (a Loc). Computes the path and
1167
+ * walks it, self-continuing through the command queue.
1168
+ */
1169
+ export function pathfindAction(state, cmd) {
1170
+ const dest = cmd.args?.dest;
1171
+ if (!dest || !state.chunk.inBounds(dest))
1172
+ return 0;
1173
+ return beginPath(state, findPath(state, state.actor.grid, dest), dest);
1174
+ }
1175
+ /**
1176
+ * do_cmd_explore (cmd-cave.c:1500): travel toward the nearest unexplored area.
1177
+ *
1178
+ * The port had only the pathfinding half. Every one of upstream's four gates
1179
+ * was missing, so explore ran while confused, ran out of a web for free, and
1180
+ * ran with monsters in view - and said nothing when there was nowhere to go.
1181
+ * The navigate-stair commands next door already share this preamble; upstream
1182
+ * repeats it verbatim in all three (do_cmd_navigate_down L1408, _up L1454).
1183
+ */
1184
+ export function exploreAction(state, _cmd) {
1185
+ /* Do nothing if autoexplore commands are disabled (L1502-1505). */
1186
+ if (!(state.options?.get("autoexplore_commands") ?? false))
1187
+ return 0;
1188
+ if ((state.actor.player.timed[TMD.CONFUSED] ?? 0) > 0) {
1189
+ state.msg?.("You cannot explore while confused.");
1190
+ return 0;
1191
+ }
1192
+ /* In a web: clear it and finish the turn (L1515-1521). */
1193
+ if (squareIsWebbed(state, state.actor.grid)) {
1194
+ state.msg?.("You clear the web.");
1195
+ squareDestroyTrap(state, state.actor.grid);
1196
+ return state.z.moveEnergy;
1197
+ }
1198
+ if (playerHasMonsterInView(state)) {
1199
+ state.msg?.("Something is here.");
1200
+ return 0;
1201
+ }
1202
+ const found = pathNearestUnknown(state, state.actor.grid);
1203
+ if (found.length > 0)
1204
+ return beginPath(state, found, found.dest);
1205
+ state.msg?.("No apparent path for exploration.");
1206
+ return 0;
1207
+ }
1208
+ /**
1209
+ * player_has_monster_in_view (player-util.c:1721): any obvious monster currently
1210
+ * in the player's view. Gates auto-navigate/explore (cmd-cave.c).
1211
+ */
1212
+ function playerHasMonsterInView(state) {
1213
+ for (let i = 1; i < state.monsters.length; i++) {
1214
+ const mon = state.monsters[i];
1215
+ if (!mon)
1216
+ continue;
1217
+ if (monsterIsObvious(mon) && monsterIsInView(mon))
1218
+ return true;
1219
+ }
1220
+ return false;
1221
+ }
1222
+ /**
1223
+ * Shared setup for navigate up/down (cmd-cave.c:1408 / 1454): refuse while
1224
+ * confused, clear a web (full turn), refuse with a visible monster, else path
1225
+ * to the nearest known stair of the given kind via pathNearestKnown (W2-003).
1226
+ * No RNG on the success path; a failed path prints the C message and returns 0.
1227
+ */
1228
+ function navigateStairAction(state, pred, noneMsg) {
1229
+ if ((state.actor.player.timed[TMD.CONFUSED] ?? 0) > 0) {
1230
+ state.msg?.("You cannot explore while confused.");
1231
+ return 0;
1232
+ }
1233
+ /* square_iswebbed then square_destroy_trap (cmd-cave.c:1374-1379), which is
1234
+ * square_remove_all_traps - NOT just the web. Filtering to TRF.WEB left any
1235
+ * other trap on the grid armed where upstream clears the lot. */
1236
+ if (squareIsWebbed(state, state.actor.grid)) {
1237
+ state.msg?.("You clear the web.");
1238
+ squareDestroyTrap(state, state.actor.grid);
1239
+ return state.z.moveEnergy;
1240
+ }
1241
+ if (playerHasMonsterInView(state)) {
1242
+ state.msg?.("Something is here.");
1243
+ return 0;
1244
+ }
1245
+ const found = pathNearestKnown(state, state.actor.grid, pred);
1246
+ if (found.length > 0) {
1247
+ return beginPath(state, found, found.dest);
1248
+ }
1249
+ state.msg?.(noneMsg);
1250
+ return 0;
1251
+ }
1252
+ /** do_cmd_navigate_down (cmd-cave.c:1408): path to nearest known downstairs. */
1253
+ export function navigateDownAction(state, _cmd) {
1254
+ return navigateStairAction(state, (s, g) => s.chunk.isDownstairs(g), "No known path to downstairs.");
1255
+ }
1256
+ /** do_cmd_navigate_up (cmd-cave.c:1454): path to nearest known upstairs. */
1257
+ export function navigateUpAction(state, _cmd) {
1258
+ return navigateStairAction(state, (s, g) => s.chunk.isUpstairs(g), "No known path to upstairs.");
1259
+ }
1260
+ /** Register the run / pathfind / explore / navigate actions over their stubs. */
1261
+ export function installRunning(registry) {
1262
+ registry.register("run", runAction);
1263
+ registry.register("pathfind", pathfindAction);
1264
+ registry.register("explore", exploreAction);
1265
+ registry.register("navigate-down", navigateDownAction);
1266
+ registry.register("navigate-up", navigateUpAction);
1267
+ }
1268
+ //# sourceMappingURL=player-path.js.map