@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,1760 @@
1
+ /**
2
+ * The WIZARD / DEBUG command surface, ported from Angband 4.2.6:
3
+ * - reference/src/cmd-wizard.c (the do_cmd_wiz_* command actions)
4
+ * - reference/src/wiz-debug.c (wiz_cheat_death)
5
+ *
6
+ * UPSTREAM HAS TWO SEPARATE CONCEPTS HERE, and this module gates on the second.
7
+ * The port originally collapsed them into one `wizard` boolean, which silently
8
+ * made every debug command unreachable unless wizard mode was also on - a gate
9
+ * upstream does not have:
10
+ *
11
+ * - DEBUG consent (player_can_debug_prereq, reference/src/player-util.c
12
+ * L1296-1307) gates all 41 debug-menu commands. It consults ONLY
13
+ * `player->noscore & NOSCORE_DEBUG`; on the first use it asks confirm_debug()
14
+ * and, if accepted, ORs the bit in permanently. It never reads
15
+ * player->wizard. Every row of every cmd_debug_* table in
16
+ * reference/src/ui-game.c L247-322 uses this prereq and nothing else.
17
+ * - WIZARD mode (player->wizard, toggled by ^W / do_cmd_wizard,
18
+ * reference/src/cmd-misc.c L40-67) is a separate, much smaller thing: it
19
+ * changes six display / knowledge behaviours and nothing in this module.
20
+ * Its 15 upstream call sites are the toggle itself, cheat death
21
+ * (player-util.c L246), the "[=-WIZARD-=]" title (ui-display.c L178,
22
+ * ui-player.c L628), all-artifacts-known (ui-knowledge.c L1695), the seven
23
+ * look/target coordinate+noise+scent lines (ui-target.c), the headless
24
+ * stats build (main-stats.c L435) and the borg's cheat-death check.
25
+ *
26
+ * So WizardDeps carries BOTH flags: `debug` (the player_can_debug_prereq result)
27
+ * gates the commands here, and `wizard` gates only wizCheatDeath, whose upstream
28
+ * path is `player->wizard || OPT(player, cheat_live)`. A normal, faithful game
29
+ * (design decision 16: no save-scumming, faithful play) reaches neither without
30
+ * the player accepting an explicit, savefile-marking warning first.
31
+ *
32
+ * MOST of these commands are thin wrappers that drive already-ported engine
33
+ * systems with debug parameters, so this module wires to the existing port and
34
+ * does not re-implement the engine:
35
+ * - object / gold / artifact creation -> obj/make.ts (objectPrep, applyMagic,
36
+ * makeGold, copyArtifactData) through the shared MakeDeps bundle;
37
+ * - detection / mapping / teleport / summon-random / project-los / restore
38
+ * stat+exp -> the effect interpreter's effect_simple (effects/interpreter.ts
39
+ * effectSimple) over a game effect context (game/effect-env.ts +
40
+ * game/effect-game-env.ts), the same stack items and spells run through;
41
+ * - banish -> deleteMonster (game/context.ts);
42
+ * - create_trap -> placeTrap (game/trap.ts);
43
+ * - summon_named -> scatterExt + placeNewMonster (world/scatter.ts,
44
+ * game/mon-place.ts);
45
+ * - curse_item -> appendObjectCurse / removeObjectCurse (obj/object.ts);
46
+ * - exp / level / stat edits -> player/exp.ts (playerExpGain / playerExpLose);
47
+ * - learn_object_kinds -> the per-game FlavorKnowledge (obj/knowledge.ts);
48
+ * - recall / wipe monster -> cheatMonsterLore / wipeMonsterLore (mon/lore.ts);
49
+ * - wizard_light -> wizLightLevel (game/effect-terrain.ts);
50
+ * - push_object -> pushObject (game/project-feat.ts).
51
+ *
52
+ * The Term / prompt UI halves stay with the shell (the "which item / which
53
+ * monster / how many" menus and the map-highlight redraws): where a command
54
+ * needs a selection or count, this module takes it as a parameter. The map
55
+ * QUERY commands (query_feature / query_square_flag / peek_noise_scent) and
56
+ * dump_level_map port their DATA half only - they return the grids or map the
57
+ * shell would highlight or write, not the drawing.
58
+ *
59
+ * The item / player debug shells whose non-UI halves are engine data or state
60
+ * changes are ported here too (their Term rendering and menu loops stay with the
61
+ * shell, WP-14): wizDisplayItem (wiz_display_item DATA), wizPlayItemBegin /
62
+ * wizPlayItemReject / wizPlayItemAccept (the do_cmd_wiz_play_item session
63
+ * snapshot / restore / commit), wizStatItem (do_cmd_wiz_stat_item's make_object
64
+ * rarity sampler) and wizEditPlayerStart (do_cmd_wiz_edit_player_start's batch
65
+ * stat/gold/exp apply). The NOSCORE_* cheat-flag model and the markNoscore seam
66
+ * (15.3) live here as well.
67
+ *
68
+ * DEFERRED (see parity/ledger/wizard-debug.yaml): the wiz-spoil.c spoiler
69
+ * generators and the three Monte-Carlo collectors (do_cmd_wiz_collect_*) are
70
+ * dev-tooling ports that live in packages/cli (spoilers.ts, stats.ts,
71
+ * wiz-stats.ts) alongside the other headless generation harnesses, not in this
72
+ * engine module.
73
+ */
74
+
75
+ import { EF, KF, ORIGIN, PROJ, TMD } from "../generated/index.js";
76
+ import type { Loc } from "../loc.js";
77
+ import { PLAYER_EXP, PY_MAX_EXP, playerExpGain, playerExpLose } from "../player/exp.js";
78
+ import type { ExpDeps } from "../player/exp.js";
79
+ import { PY_MAX_LEVEL } from "../player/calcs.js";
80
+ import { STAT_MAX } from "../player/types.js";
81
+ import {
82
+ applyMagic,
83
+ copyArtifactData,
84
+ egoApplyMagic,
85
+ makeGold,
86
+ makeObject,
87
+ objectPrep,
88
+ } from "../obj/make.js";
89
+ import type { MakeDeps } from "../obj/make.js";
90
+ import {
91
+ appendObjectCurse,
92
+ objectCopy,
93
+ objectWeightOne,
94
+ removeObjectCurse,
95
+ tvalCanHaveCharges,
96
+ tvalCanHaveTimeout,
97
+ tvalIsAmmo,
98
+ tvalIsMoney,
99
+ } from "../obj/object.js";
100
+ import type { GameObject } from "../obj/object.js";
101
+ import { objectValue } from "../obj/value.js";
102
+ import { OBJ_NOTICE, objectLearnOnWield } from "../obj/knowledge.js";
103
+ import { MAX_PVAL, OBJ_MOD_MAX } from "../obj/types.js";
104
+ import type { FlagSet } from "../bitflag.js";
105
+ import type { Artifact, Curse, EgoItem, ObjectKind } from "../obj/types.js";
106
+ import type { FlavorKnowledge } from "../obj/knowledge.js";
107
+ import { MON_GROUP } from "../mon/types.js";
108
+ import type { MonsterRace } from "../mon/types.js";
109
+ import { PY_FOOD_FULL_DEFAULT as PY_FOOD_FULL } from "../player/birth.js";
110
+ import { cheatMonsterLore, getLore, wipeMonsterLore } from "../mon/lore.js";
111
+ import { sourceNone, sourcePlayer } from "../effects/interpreter.js";
112
+ import type { EffectContext } from "../effects/interpreter.js";
113
+ import { scatterExt } from "../world/scatter.js";
114
+ import { deleteMonster, monsterMax, squareIsEmpty } from "./context.js";
115
+ import type { GameState } from "./context.js";
116
+ import { dropNear, floorPile } from "./floor.js";
117
+ import { objectIsInQuiver } from "./gear.js";
118
+ import { placeNewMonster } from "./mon-place.js";
119
+ import type { MonPlaceDeps } from "./mon-place.js";
120
+ import { placeTrap, squareIsTrap, squareIsWebbed } from "./trap.js";
121
+ import type { TrapDeps } from "./trap.js";
122
+ import { pushObject } from "./project-feat.js";
123
+ import { wizLightLevel } from "./effect-terrain.js";
124
+ import { squareIsKnown, updatePlayerObjectKnowledge } from "./known.js";
125
+ import { buildEffectContext } from "./effect-env.js";
126
+ import type { EffectEnvDeps } from "./effect-env.js";
127
+ import { attachGameEnv } from "./effect-game-env.js";
128
+ import type { CastContext } from "./project-cast.js";
129
+ import type { ObjCmdDeps } from "./obj-cmd.js";
130
+
131
+ /* ------------------------------------------------------------------ *
132
+ * Deps and the wizard gate.
133
+ * ------------------------------------------------------------------ */
134
+
135
+ /**
136
+ * The effect-interpreter bundle needed to run effect_simple from a wizard
137
+ * command (identical to SpellCmdDeps.effects): the registry with the game
138
+ * handlers plus everything attachGameEnv wires onto the context.
139
+ */
140
+ export type WizEffectDeps = Pick<
141
+ ObjCmdDeps,
142
+ | "registry"
143
+ | "cast"
144
+ | "envDeps"
145
+ | "inject"
146
+ | "teleport"
147
+ | "general"
148
+ | "item"
149
+ | "summon"
150
+ >;
151
+
152
+ /**
153
+ * WizardDeps: the wizard/debug gate plus the already-ported engine bundles the
154
+ * commands wire to. Every bundle is optional so a caller can expose only the
155
+ * subset of wizard commands it needs; an action whose bundle is absent is a
156
+ * no-op (it behaves as gated).
157
+ */
158
+ export interface WizardDeps {
159
+ /**
160
+ * player_can_debug_prereq's result (player-util.c L1296-1307): has this
161
+ * character already consented to debug commands, i.e. is NOSCORE_DEBUG set?
162
+ * This is the gate on all 41 debug commands in this module. It is NOT wizard
163
+ * mode: upstream's prereq never reads player->wizard, so a non-wizard player
164
+ * who accepts the debug warning gets the whole debug surface.
165
+ *
166
+ * The consent itself lives on player->noscore, so a caller computes this as
167
+ * `(player.noscore & NOSCORE.DEBUG) !== 0` and asks the player via the shell's
168
+ * confirm_debug equivalent before setting the bit through markNoscore.
169
+ */
170
+ debug: boolean;
171
+ /**
172
+ * player->wizard (cmd-misc.c L40-67). Gates ONLY wizCheatDeath here, whose
173
+ * upstream condition is `player->wizard || OPT(player, cheat_live)`
174
+ * (player-util.c L246). The other five wizard-mode behaviours are display and
175
+ * knowledge concerns and live with their own modules (game/display.ts,
176
+ * game/char-sheet.ts, obj/artifact-known.ts, game/target-loop.ts), each with
177
+ * its own `wizard` flag - none of them route through this seam.
178
+ */
179
+ wizard: boolean;
180
+ /** obj/make.ts bundle (reg / alloc / constants) for object creation. */
181
+ makeDeps?: MakeDeps;
182
+ /** player/exp.ts hooks (rng + level-change ripple) for exp / stat edits. */
183
+ expDeps?: ExpDeps;
184
+ /** The effect_simple bundle for detection / teleport / summon / restore. */
185
+ effect?: WizEffectDeps;
186
+ /** game/trap.ts deps for create_trap. */
187
+ trapDeps?: TrapDeps;
188
+ /** game/mon-place.ts deps for summon_named. */
189
+ monPlace?: MonPlaceDeps;
190
+ /** Per-game flavor knowledge for learn_object_kinds. */
191
+ flavor?: FlavorKnowledge;
192
+ /** The full monster race list, for the "all monsters" recall / wipe. */
193
+ races?: readonly MonsterRace[];
194
+ /** The full artifact list (reg.artifacts), for create_all_artifact. */
195
+ artifacts?: readonly (Artifact | null)[];
196
+ /** The full ego list (reg.egos), for wiz_tweak_item. */
197
+ egos?: readonly EgoItem[];
198
+ /** The full curse list (reg.curses), for curse_item. */
199
+ curses?: readonly (Curse | null)[];
200
+ /**
201
+ * Mark the character's savefile-invalidating cheat flags (player->noscore).
202
+ * Optional seam: player.ts does not yet carry a noscore field (owned by the
203
+ * gear/player work package) and save.ts persists it (owned by the save/load
204
+ * work package), so this module cannot write the flag directly. When a caller
205
+ * supplies the hook, the noscore actions here call it with the NOSCORE_* bits
206
+ * upstream would OR in; when it is absent the marking is a no-op (see the
207
+ * WIRING-NEEDED items in the ledger). Bits come from the NOSCORE constants.
208
+ */
209
+ markNoscore?: (bits: number) => void;
210
+ /** msg(): command feedback. */
211
+ msg?: (text: string) => void;
212
+ }
213
+
214
+ /**
215
+ * player_can_debug_prereq (player-util.c L1296-1307): the gate on every debug
216
+ * command. Returns false (and the command no-ops) until the character has
217
+ * consented to debug mode. Deliberately independent of wizard mode.
218
+ */
219
+ export function debugEnabled(deps: WizardDeps): boolean {
220
+ return deps.debug === true;
221
+ }
222
+
223
+ /**
224
+ * player->wizard (cmd-misc.c L40-67). Only wizCheatDeath gates on this here; see
225
+ * WizardDeps.wizard for where the other wizard-mode behaviours live.
226
+ */
227
+ export function wizardEnabled(deps: WizardDeps): boolean {
228
+ return deps.wizard === true;
229
+ }
230
+
231
+ /* ------------------------------------------------------------------ *
232
+ * NOSCORE cheat flags (player.h L92-100).
233
+ * ------------------------------------------------------------------ */
234
+
235
+ /**
236
+ * NOSCORE_*: the "ways in which players can be marked as cheaters" bit model
237
+ * (player.h L92-100). Stored on player->noscore (a uint16), persisted in the
238
+ * savefile (save.c L622 wr_u16b / load.c L965 rd_u16b) and re-asserted from the
239
+ * savefile's own wizard flag on load (savefile.c L650). A set cheat bit
240
+ * invalidates the high-score entry (score.c L289). The bit values match
241
+ * upstream exactly so a loaded uint16 is interpreted identically.
242
+ */
243
+ export const NOSCORE = {
244
+ /** Character used wizard mode (wiz-debug.c L32, cmd-misc.c L51). */
245
+ WIZARD: 0x0002,
246
+ /** Character used a debug command / debug options (player-util.c L1303). */
247
+ DEBUG: 0x0008,
248
+ /** Character jumped levels (cmd-wizard.c L1366); transient, cleared after
249
+ * the jump completes (generate.c L824-828). Does NOT invalidate the score. */
250
+ JUMPING: 0x0010,
251
+ /** Character was played by the Borg (cmd-misc.c L140, main-win.c L3396). */
252
+ BORG: 0x0020,
253
+ } as const;
254
+
255
+ /**
256
+ * The two upstream build switches that decide whether NOSCORE_BORG exists and
257
+ * whether it disqualifies a score. Upstream expresses these as #ifdefs
258
+ * (player.h L97-99 wraps the bit in ALLOW_BORG; score.c L292-297 skips the borg
259
+ * branch when SCORE_BORGS is defined), so the port records the configuration it
260
+ * builds under as named constants instead of leaving the choice implicit.
261
+ *
262
+ * ALLOW_BORG: true. The Borg ships as a bundled mod (decision 31), so the bit
263
+ * exists and can be set.
264
+ * SCORE_BORGS: false, matching upstream's default - a borg-played character is
265
+ * not eligible for the high-score table.
266
+ */
267
+ export const ALLOW_BORG = true;
268
+ export const SCORE_BORGS = false;
269
+
270
+ /**
271
+ * The cheat bits that invalidate a high-score entry (score.c L289-298).
272
+ * NOSCORE_WIZARD | NOSCORE_DEBUG always disqualify; NOSCORE_BORG additionally
273
+ * does so only under ALLOW_BORG && !SCORE_BORGS, which is this port's
274
+ * configuration. NOSCORE_JUMPING is deliberately absent: it is a transient
275
+ * generation marker, not a scoring disqualifier.
276
+ */
277
+ export const NOSCORE_SCORE_INVALIDATING =
278
+ NOSCORE.WIZARD |
279
+ NOSCORE.DEBUG |
280
+ (ALLOW_BORG && !SCORE_BORGS ? NOSCORE.BORG : 0);
281
+
282
+ /** markNoscore (obj-mark analogue): OR cheat bits into a noscore value. Pure. */
283
+ export function markNoscore(current: number, bits: number): number {
284
+ return (current | bits) & 0xffff;
285
+ }
286
+
287
+ /**
288
+ * noscoreInvalidatesScore (score.c L289): true when the character's cheat flags
289
+ * disqualify it from the high-score table.
290
+ */
291
+ export function noscoreInvalidatesScore(noscore: number): boolean {
292
+ return (noscore & NOSCORE_SCORE_INVALIDATING) !== 0;
293
+ }
294
+
295
+ /* ------------------------------------------------------------------ *
296
+ * effect_simple plumbing.
297
+ * ------------------------------------------------------------------ */
298
+
299
+ /** Parameters passed straight through to registry.effectSimple. */
300
+ interface SimpleParams {
301
+ diceString?: string;
302
+ subtype?: number;
303
+ radius?: number;
304
+ other?: number;
305
+ y?: number;
306
+ x?: number;
307
+ none?: boolean;
308
+ }
309
+
310
+ /** Build a game effect context (the same shape spellCast / useAux build). */
311
+ function effContext(state: GameState, eff: WizEffectDeps): EffectContext {
312
+ const base = buildEffectContext(state, eff.envDeps as EffectEnvDeps);
313
+ return attachGameEnv(base, {
314
+ state,
315
+ cast: eff.cast as CastContext,
316
+ ...(eff.teleport ? { teleport: eff.teleport } : {}),
317
+ ...(eff.general ? { general: eff.general } : {}),
318
+ ...(eff.item ? { item: eff.item } : {}),
319
+ ...(eff.summon ? { summon: eff.summon } : {}),
320
+ });
321
+ }
322
+
323
+ /** Run one effect_simple with a player (or none) source; false if no bundle. */
324
+ function runSimple(
325
+ state: GameState,
326
+ eff: WizEffectDeps | undefined,
327
+ index: number,
328
+ params: SimpleParams,
329
+ ): boolean {
330
+ if (!eff) return false;
331
+ const ctx = effContext(state, eff);
332
+ return eff.registry.effectSimple(index, ctx, {
333
+ origin: params.none ? sourceNone() : sourcePlayer(),
334
+ diceString: params.diceString ?? "0",
335
+ subtype: params.subtype ?? 0,
336
+ radius: params.radius ?? 0,
337
+ other: params.other ?? 0,
338
+ y: params.y ?? 0,
339
+ x: params.x ?? 0,
340
+ });
341
+ }
342
+
343
+ /* ------------------------------------------------------------------ *
344
+ * Shared object-creation building blocks (cmd-wizard.c L139-L302).
345
+ * ------------------------------------------------------------------ */
346
+
347
+ /**
348
+ * wiz_create_object_from_kind (cmd-wizard.c L169): a fresh instance of a kind,
349
+ * money made as gold, everything else prepped and given plain magic (no
350
+ * messages, no artifacts).
351
+ */
352
+ export function wizCreateObjectFromKind(
353
+ state: GameState,
354
+ kind: ObjectKind,
355
+ makeDeps: MakeDeps,
356
+ ): GameObject {
357
+ if (tvalIsMoney(kind.tval)) {
358
+ return makeGold(state.rng, makeDeps, state.chunk.depth, kind.name);
359
+ }
360
+ const obj = objectPrep(
361
+ state.rng,
362
+ makeDeps.reg,
363
+ makeDeps.constants,
364
+ kind,
365
+ state.chunk.depth,
366
+ "randomise",
367
+ );
368
+ /* apply_magic(obj, depth, allow_artifacts=false, good=false, great=false,
369
+ * extra=false). */
370
+ applyMagic(state.rng, makeDeps, obj, state.chunk.depth, false, false, false, false, state.chunk.depth);
371
+ return obj;
372
+ }
373
+
374
+ /**
375
+ * wiz_create_object_from_artifact (cmd-wizard.c L139): instantiate an artifact
376
+ * on its base kind and mark it created in the shared registry (L157), so the
377
+ * normal generation paths will not spawn it again.
378
+ */
379
+ export function wizCreateObjectFromArtifact(
380
+ state: GameState,
381
+ art: Artifact,
382
+ makeDeps: MakeDeps,
383
+ ): GameObject | null {
384
+ if (!art.name) return null;
385
+ const kind = makeDeps.reg.lookupKind(art.tval, art.sval);
386
+ if (!kind) return null;
387
+ const obj = objectPrep(
388
+ state.rng,
389
+ makeDeps.reg,
390
+ makeDeps.constants,
391
+ kind,
392
+ art.allocMin,
393
+ "randomise",
394
+ );
395
+ obj.artifact = art;
396
+ copyArtifactData(state.rng, makeDeps.reg, obj, art);
397
+ makeDeps.artifacts.markCreated(art.aidx, true);
398
+ return obj;
399
+ }
400
+
401
+ /**
402
+ * wiz_drop_object (cmd-wizard.c L292): mark the object as a cheat and drop it
403
+ * from heaven near the player.
404
+ */
405
+ export function wizDropObject(state: GameState, obj: GameObject | null): void {
406
+ if (!obj) return;
407
+ obj.origin = ORIGIN.CHEAT;
408
+ obj.originDepth = state.chunk.depth;
409
+ dropNear(state, obj, 0, state.actor.grid, true, true);
410
+ }
411
+
412
+ /* ------------------------------------------------------------------ *
413
+ * The command actions.
414
+ * ------------------------------------------------------------------ */
415
+
416
+ /**
417
+ * do_cmd_wiz_acquire (L389): acquire `quantity` good (or great) objects and
418
+ * drop them near the player. Wires to make_object (the acquirement() loop).
419
+ */
420
+ export function wizAcquire(
421
+ state: GameState,
422
+ params: { quantity: number; great?: boolean },
423
+ deps: WizardDeps,
424
+ ): boolean {
425
+ if (!debugEnabled(deps) || !deps.makeDeps) return false;
426
+ const great = params.great ?? false;
427
+ for (let i = 0; i < params.quantity; i++) {
428
+ /* acquirement: make_object(cave, level, good=true, great, extra=true). */
429
+ const obj = makeObject(
430
+ state.rng,
431
+ deps.makeDeps,
432
+ state.chunk.depth,
433
+ true,
434
+ great,
435
+ true,
436
+ 0,
437
+ state.chunk.depth,
438
+ );
439
+ if (!obj) continue;
440
+ obj.origin = ORIGIN.ACQUIRE;
441
+ obj.originDepth = state.chunk.depth;
442
+ dropNear(state, obj, 0, state.actor.grid, true, true);
443
+ }
444
+ return true;
445
+ }
446
+
447
+ /**
448
+ * do_cmd_wiz_advance (L414): max stats, a heap of gold, level 50, full HP/SP.
449
+ */
450
+ export function wizAdvance(state: GameState, deps: WizardDeps): boolean {
451
+ if (!debugEnabled(deps) || !deps.expDeps) return false;
452
+ const p = state.actor.player;
453
+ for (let i = 0; i < STAT_MAX; i++) {
454
+ p.statCur[i] = 118;
455
+ p.statMax[i] = 118;
456
+ }
457
+ p.au = 1000000;
458
+ playerExpGain(p, PY_MAX_EXP, deps.expDeps);
459
+ p.chp = p.mhp;
460
+ p.chpFrac = 0;
461
+ p.csp = p.msp;
462
+ p.cspFrac = 0;
463
+ return true;
464
+ }
465
+
466
+ /**
467
+ * do_cmd_wiz_banish (L449): delete every monster within `range` grids
468
+ * (measured by mon->cdis, as upstream).
469
+ */
470
+ export function wizBanish(
471
+ state: GameState,
472
+ params: { range: number },
473
+ deps: WizardDeps,
474
+ ): boolean {
475
+ if (!debugEnabled(deps)) return false;
476
+ for (let i = 1; i < monsterMax(state); i++) {
477
+ const mon = state.monsters[i];
478
+ if (!mon) continue;
479
+ if (mon.cdis > params.range) continue;
480
+ deleteMonster(state, i);
481
+ }
482
+ return true;
483
+ }
484
+
485
+ /**
486
+ * do_cmd_wiz_create_all_artifact (L728): create every artifact and drop them.
487
+ */
488
+ export function wizCreateAllArtifact(state: GameState, deps: WizardDeps): boolean {
489
+ if (!debugEnabled(deps) || !deps.makeDeps || !deps.artifacts) return false;
490
+ for (let i = 1; i < deps.artifacts.length; i++) {
491
+ const art = deps.artifacts[i];
492
+ if (!art) continue;
493
+ wizDropObject(state, wizCreateObjectFromArtifact(state, art, deps.makeDeps));
494
+ }
495
+ return true;
496
+ }
497
+
498
+ /**
499
+ * do_cmd_wiz_create_all_artifact_from_tval (L746): create every artifact of a
500
+ * given tval.
501
+ */
502
+ export function wizCreateAllArtifactFromTval(
503
+ state: GameState,
504
+ params: { tval: number },
505
+ deps: WizardDeps,
506
+ ): boolean {
507
+ if (!debugEnabled(deps) || !deps.makeDeps || !deps.artifacts) return false;
508
+ for (let i = 1; i < deps.artifacts.length; i++) {
509
+ const art = deps.artifacts[i];
510
+ if (!art || art.tval !== params.tval) continue;
511
+ wizDropObject(state, wizCreateObjectFromArtifact(state, art, deps.makeDeps));
512
+ }
513
+ return true;
514
+ }
515
+
516
+ /**
517
+ * do_cmd_wiz_create_all_obj (L780): create one of every ordinary kind (skip
518
+ * instant-artifact kinds) and drop them.
519
+ */
520
+ export function wizCreateAllObj(state: GameState, deps: WizardDeps): boolean {
521
+ if (!debugEnabled(deps) || !deps.makeDeps) return false;
522
+ const kinds = deps.makeDeps.reg.kinds;
523
+ for (const kind of kinds) {
524
+ if (!kind || !kind.base || !kind.base.name) continue;
525
+ if (kind.kindFlags.has(KF_INSTA_ART)) continue;
526
+ wizDropObject(state, wizCreateObjectFromKind(state, kind, deps.makeDeps));
527
+ }
528
+ return true;
529
+ }
530
+
531
+ /**
532
+ * do_cmd_wiz_create_all_obj_from_tval (L803): create one of every kind with a
533
+ * given tval; `art` selects whether instant-artifact kinds are included.
534
+ */
535
+ export function wizCreateAllObjFromTval(
536
+ state: GameState,
537
+ params: { tval: number; art?: boolean },
538
+ deps: WizardDeps,
539
+ ): boolean {
540
+ if (!debugEnabled(deps) || !deps.makeDeps) return false;
541
+ const art = params.art ?? false;
542
+ for (const kind of deps.makeDeps.reg.kinds) {
543
+ if (!kind || kind.tval !== params.tval) continue;
544
+ if (!art && kind.kindFlags.has(KF_INSTA_ART)) continue;
545
+ wizDropObject(state, wizCreateObjectFromKind(state, kind, deps.makeDeps));
546
+ }
547
+ return true;
548
+ }
549
+
550
+ /**
551
+ * do_cmd_wiz_create_artifact (L842): create one artifact by index.
552
+ */
553
+ export function wizCreateArtifact(
554
+ state: GameState,
555
+ params: { index: number },
556
+ deps: WizardDeps,
557
+ ): boolean {
558
+ if (!debugEnabled(deps) || !deps.makeDeps || !deps.artifacts) return false;
559
+ const ind = params.index;
560
+ if (ind < 1 || ind >= deps.artifacts.length) {
561
+ deps.msg?.("That's not a valid artifact.");
562
+ return false;
563
+ }
564
+ const art = deps.artifacts[ind];
565
+ if (!art) {
566
+ deps.msg?.("That's not a valid artifact.");
567
+ return false;
568
+ }
569
+ wizDropObject(state, wizCreateObjectFromArtifact(state, art, deps.makeDeps));
570
+ return true;
571
+ }
572
+
573
+ /**
574
+ * do_cmd_wiz_create_obj (L873): create one object of a kind by index.
575
+ */
576
+ export function wizCreateObj(
577
+ state: GameState,
578
+ params: { index: number },
579
+ deps: WizardDeps,
580
+ ): boolean {
581
+ if (!debugEnabled(deps) || !deps.makeDeps) return false;
582
+ const kinds = deps.makeDeps.reg.kinds;
583
+ const ind = params.index;
584
+ if (ind < 0 || ind >= kinds.length) {
585
+ deps.msg?.("That's not a valid kind of object.");
586
+ return false;
587
+ }
588
+ const kind = kinds[ind];
589
+ if (!kind) {
590
+ deps.msg?.("That's not a valid kind of object.");
591
+ return false;
592
+ }
593
+ wizDropObject(state, wizCreateObjectFromKind(state, kind, deps.makeDeps));
594
+ return true;
595
+ }
596
+
597
+ /**
598
+ * do_cmd_wiz_create_trap (L904): place a trap of type `index` under the player
599
+ * when the grid permits it.
600
+ */
601
+ export function wizCreateTrap(
602
+ state: GameState,
603
+ params: { index: number },
604
+ deps: WizardDeps,
605
+ ): boolean {
606
+ if (!debugEnabled(deps) || !deps.trapDeps) return false;
607
+ const grid = state.actor.grid;
608
+ const tidx = params.index;
609
+ if (
610
+ !state.chunk.isFloor(grid) ||
611
+ squareIsTrap(state, grid) ||
612
+ squareIsWebbed(state, grid) ||
613
+ floorPile(state, grid).length > 0
614
+ ) {
615
+ deps.msg?.("You can't place a trap there!");
616
+ return false;
617
+ }
618
+ if (state.chunk.depth === 0) {
619
+ deps.msg?.("You can't place a trap in the town!");
620
+ return false;
621
+ }
622
+ if (tidx < 1 || tidx >= deps.trapDeps.kinds.length) {
623
+ deps.msg?.("Trap not found.");
624
+ return false;
625
+ }
626
+ placeTrap(state, grid, tidx, 0, deps.trapDeps);
627
+ return true;
628
+ }
629
+
630
+ /**
631
+ * do_cmd_wiz_cure_all (L941): remove equipment curses, restore every stat and
632
+ * lost experience, top HP/SP, clear the affliction timers and feed the player.
633
+ */
634
+ export function wizCureAll(state: GameState, deps: WizardDeps): boolean {
635
+ if (!debugEnabled(deps) || !deps.effect) return false;
636
+ const p = state.actor.player;
637
+
638
+ /* Remove curses from equipped items. */
639
+ for (const handle of p.equipment) {
640
+ if (!handle) continue;
641
+ const obj = state.gear.store.get(handle);
642
+ if (obj && obj.curses) obj.curses = null;
643
+ }
644
+
645
+ const ctx = effContext(state, deps.effect);
646
+
647
+ /* Restore stats (EF_RESTORE_STAT, one per stat) and lost experience. */
648
+ for (let i = 0; i < STAT_MAX; i++) {
649
+ deps.effect.registry.effectSimple(EF.RESTORE_STAT, ctx, {
650
+ origin: sourcePlayer(),
651
+ diceString: "0",
652
+ subtype: i,
653
+ });
654
+ }
655
+ deps.effect.registry.effectSimple(EF.RESTORE_EXP, ctx, {
656
+ origin: sourceNone(),
657
+ diceString: "0",
658
+ });
659
+
660
+ /* Heal and restore mana. */
661
+ p.chp = p.mhp;
662
+ p.chpFrac = 0;
663
+ p.csp = p.msp;
664
+ p.cspFrac = 0;
665
+
666
+ /* Cure the affliction timers (player_clear_timed). */
667
+ const timed = ctx.player?.timed;
668
+ if (timed) {
669
+ for (const idx of CURE_ALL_TIMED) timed.clearTimed(idx, true, false);
670
+ /* No longer hungry (player_set_timed FOOD). */
671
+ timed.setTimed(TMD.FOOD, PY_FOOD_FULL - 1, false, false);
672
+ }
673
+
674
+ deps.msg?.("You feel *much* better!");
675
+ return true;
676
+ }
677
+
678
+ /** The affliction timers cure_all clears (cmd-wizard.c L972-981). */
679
+ const CURE_ALL_TIMED: readonly number[] = [
680
+ TMD.BLIND,
681
+ TMD.CONFUSED,
682
+ TMD.POISONED,
683
+ TMD.AFRAID,
684
+ TMD.PARALYZED,
685
+ TMD.IMAGE,
686
+ TMD.STUN,
687
+ TMD.CUT,
688
+ TMD.SLOW,
689
+ TMD.AMNESIA,
690
+ ];
691
+
692
+ /**
693
+ * do_cmd_wiz_curse_item (L1004): add a curse (power > 0) or remove one
694
+ * (power == 0) on an item. The "which item / which curse" prompts are the
695
+ * shell's; the object, curse index and power arrive as parameters.
696
+ */
697
+ export function wizCurseItem(
698
+ state: GameState,
699
+ params: { obj: GameObject; index: number; power: number },
700
+ deps: WizardDeps,
701
+ ): boolean {
702
+ if (!debugEnabled(deps) || !deps.curses) return false;
703
+ const { obj, index, power } = params;
704
+ if (index <= 0 || index >= deps.curses.length) return false;
705
+ if (power < 0) return false;
706
+ if (power) {
707
+ appendObjectCurse(state.rng, obj, index, power, deps.curses);
708
+ } else if (!removeObjectCurse(obj, index)) {
709
+ return false;
710
+ }
711
+ return true;
712
+ }
713
+
714
+ /**
715
+ * do_cmd_wiz_detect_all_local (L1068): detect traps / doors / stairs / gold /
716
+ * objects / visible + invisible monsters in a 22x40 rectangle.
717
+ */
718
+ export function wizDetectAllLocal(state: GameState, deps: WizardDeps): boolean {
719
+ if (!debugEnabled(deps) || !deps.effect) return false;
720
+ const local: SimpleParams = { y: 22, x: 40 };
721
+ runSimple(state, deps.effect, EF.DETECT_TRAPS, local);
722
+ runSimple(state, deps.effect, EF.DETECT_DOORS, local);
723
+ runSimple(state, deps.effect, EF.DETECT_STAIRS, local);
724
+ runSimple(state, deps.effect, EF.DETECT_GOLD, local);
725
+ runSimple(state, deps.effect, EF.DETECT_OBJECTS, local);
726
+ runSimple(state, deps.effect, EF.DETECT_VISIBLE_MONSTERS, local);
727
+ runSimple(state, deps.effect, EF.DETECT_INVISIBLE_MONSTERS, local);
728
+ return true;
729
+ }
730
+
731
+ /**
732
+ * do_cmd_wiz_detect_all_monsters (L1091): detect all monsters in a 500x500
733
+ * rectangle (i.e. the whole level).
734
+ */
735
+ export function wizDetectAllMonsters(state: GameState, deps: WizardDeps): boolean {
736
+ if (!debugEnabled(deps) || !deps.effect) return false;
737
+ const whole: SimpleParams = { y: 500, x: 500 };
738
+ runSimple(state, deps.effect, EF.DETECT_VISIBLE_MONSTERS, whole);
739
+ runSimple(state, deps.effect, EF.DETECT_INVISIBLE_MONSTERS, whole);
740
+ return true;
741
+ }
742
+
743
+ /**
744
+ * do_cmd_wiz_magic_map (L1418): map the area around the player (22x40).
745
+ */
746
+ export function wizMagicMap(state: GameState, deps: WizardDeps): boolean {
747
+ if (!debugEnabled(deps) || !deps.effect) return false;
748
+ return runSimple(state, deps.effect, EF.MAP_AREA, { y: 22, x: 40 });
749
+ }
750
+
751
+ /**
752
+ * do_cmd_wiz_hit_all_los (L1303): PROJECT_LOS 10000 damage as PROJ_DISP_ALL
753
+ * (dispel every monster in line of sight).
754
+ */
755
+ export function wizHitAllLos(state: GameState, deps: WizardDeps): boolean {
756
+ if (!debugEnabled(deps) || !deps.effect) return false;
757
+ return runSimple(state, deps.effect, EF.PROJECT_LOS, {
758
+ diceString: "10000",
759
+ subtype: PROJ.DISP_ALL,
760
+ });
761
+ }
762
+
763
+ /**
764
+ * do_cmd_wiz_edit_player_exp (L1137): set the player's experience to `value`,
765
+ * clamped to [0, PY_MAX_EXP], gaining or losing to reach it.
766
+ */
767
+ export function wizEditPlayerExp(
768
+ state: GameState,
769
+ params: { value: number },
770
+ deps: WizardDeps,
771
+ ): boolean {
772
+ if (!debugEnabled(deps) || !deps.expDeps) return false;
773
+ const p = state.actor.player;
774
+ const newv = Math.min(PY_MAX_EXP, Math.max(0, params.value));
775
+ if (newv > p.exp) {
776
+ playerExpGain(p, newv - p.exp, deps.expDeps);
777
+ } else {
778
+ playerExpLose(p, p.exp - newv, false, deps.expDeps);
779
+ }
780
+ return true;
781
+ }
782
+
783
+ /**
784
+ * do_cmd_wiz_edit_player_gold (L1169): set the player's gold to `value`,
785
+ * clamped to [0, INT32_MAX].
786
+ */
787
+ export function wizEditPlayerGold(
788
+ state: GameState,
789
+ params: { value: number },
790
+ deps: WizardDeps,
791
+ ): boolean {
792
+ if (!debugEnabled(deps)) return false;
793
+ state.actor.player.au = Math.min(2147483647, Math.max(0, params.value));
794
+ return true;
795
+ }
796
+
797
+ /**
798
+ * do_cmd_wiz_edit_player_stat (L1247): set one stat to `value`, clamped to
799
+ * [3, 118].
800
+ */
801
+ export function wizEditPlayerStat(
802
+ state: GameState,
803
+ params: { stat: number; value: number },
804
+ deps: WizardDeps,
805
+ ): boolean {
806
+ if (!debugEnabled(deps)) return false;
807
+ const { stat } = params;
808
+ if (stat < 0 || stat >= STAT_MAX) return false;
809
+ const newv = Math.min(118, Math.max(3, params.value));
810
+ const p = state.actor.player;
811
+ p.statCur[stat] = newv;
812
+ p.statMax[stat] = newv;
813
+ return true;
814
+ }
815
+
816
+ /**
817
+ * do_cmd_wiz_increase_exp (L1314): gain `quantity` (>= 1) experience.
818
+ */
819
+ export function wizIncreaseExp(
820
+ state: GameState,
821
+ params: { quantity: number },
822
+ deps: WizardDeps,
823
+ ): boolean {
824
+ if (!debugEnabled(deps) || !deps.expDeps) return false;
825
+ const n = params.quantity < 1 ? 1 : params.quantity;
826
+ playerExpGain(state.actor.player, n, deps.expDeps);
827
+ return true;
828
+ }
829
+
830
+ /**
831
+ * do_cmd_wiz_jump_level (L1339): jump to dungeon level `level` (dungeon_change_
832
+ * level - the port signals a pending level change). Out-of-range is a no-op.
833
+ *
834
+ * `chooseGen` is the answer to "Choose cave profile? " (L1360-1363). It is the
835
+ * ONLY thing that sets NOSCORE_JUMPING (L1365-1367), and that bit is not really
836
+ * a cheat marker: choose_profile consumes it as the one-shot signal to ask which
837
+ * profile to build (generate.c:824). Marking it unconditionally - which this
838
+ * function used to do - both mis-flags the savefile and would make every jump
839
+ * ask for a profile name.
840
+ */
841
+ export function wizJumpLevel(
842
+ state: GameState,
843
+ params: { level: number; chooseGen?: boolean },
844
+ deps: WizardDeps,
845
+ ): boolean {
846
+ if (!debugEnabled(deps)) return false;
847
+ const level = params.level;
848
+ if (level < 0 || level >= state.z.maxDepth) return false;
849
+ /* player->noscore |= NOSCORE_JUMPING (cmd-wizard.c L1366). */
850
+ if (params.chooseGen) deps.markNoscore?.(NOSCORE.JUMPING);
851
+ deps.msg?.(`You jump to dungeon level ${level}.`);
852
+ state.targetDepth = level;
853
+ state.generateLevel = true;
854
+ return true;
855
+ }
856
+
857
+ /**
858
+ * do_cmd_wiz_learn_object_kinds (L1386): make the player aware of every kind up
859
+ * to `level`. Awareness lives in the per-game FlavorKnowledge in the port.
860
+ */
861
+ export function wizLearnObjectKinds(
862
+ state: GameState,
863
+ params: { level: number },
864
+ deps: WizardDeps,
865
+ ): boolean {
866
+ if (!debugEnabled(deps) || !deps.makeDeps || !deps.flavor) return false;
867
+ for (const kind of deps.makeDeps.reg.kinds) {
868
+ if (!kind || !kind.name) continue;
869
+ if (kind.level <= params.level) deps.flavor.setAware(kind);
870
+ }
871
+ deps.msg?.("You now know about many items!");
872
+ return true;
873
+ }
874
+
875
+ /**
876
+ * do_cmd_wiz_recall_monster (L2161): fully learn a monster race's lore, or all
877
+ * races when `all` is set.
878
+ */
879
+ export function wizRecallMonster(
880
+ state: GameState,
881
+ params: { race?: MonsterRace; all?: boolean },
882
+ deps: WizardDeps,
883
+ ): boolean {
884
+ if (!debugEnabled(deps)) return false;
885
+ if (params.all) {
886
+ if (!deps.races) return false;
887
+ for (const race of deps.races) {
888
+ if (race) cheatMonsterLore(race, getLore(state.lore, race));
889
+ }
890
+ return true;
891
+ }
892
+ if (!params.race) return false;
893
+ cheatMonsterLore(params.race, getLore(state.lore, params.race));
894
+ return true;
895
+ }
896
+
897
+ /**
898
+ * do_cmd_wiz_wipe_recall (L2860): forget a monster race's lore, or all races.
899
+ */
900
+ export function wizWipeRecall(
901
+ state: GameState,
902
+ params: { race?: MonsterRace; all?: boolean },
903
+ deps: WizardDeps,
904
+ ): boolean {
905
+ if (!debugEnabled(deps)) return false;
906
+ if (params.all) {
907
+ if (!deps.races) return false;
908
+ for (const race of deps.races) {
909
+ if (race) wipeMonsterLore(race, getLore(state.lore, race));
910
+ }
911
+ return true;
912
+ }
913
+ if (!params.race) return false;
914
+ wipeMonsterLore(params.race, getLore(state.lore, params.race));
915
+ return true;
916
+ }
917
+
918
+ /**
919
+ * do_cmd_wiz_rerate (L2209): reroll the player's per-level hitpoint table until
920
+ * it lands in the legal band, and report the life rating. Returns the rating.
921
+ */
922
+ export function wizRerate(state: GameState, deps: WizardDeps): number | null {
923
+ if (!debugEnabled(deps)) return null;
924
+ const p = state.actor.player;
925
+ let minValue = Math.trunc((PY_MAX_LEVEL * 3 * (p.hitdie - 1)) / 8);
926
+ minValue += PY_MAX_LEVEL;
927
+ let maxValue = Math.trunc((PY_MAX_LEVEL * 5 * (p.hitdie - 1)) / 8);
928
+ maxValue += PY_MAX_LEVEL;
929
+
930
+ p.playerHp[0] = p.hitdie;
931
+
932
+ for (;;) {
933
+ for (let i = 1; i < PY_MAX_LEVEL; i++) {
934
+ p.playerHp[i] = state.rng.randint1(p.hitdie) + (p.playerHp[i - 1] as number);
935
+ }
936
+ const top = p.playerHp[PY_MAX_LEVEL - 1] as number;
937
+ if (top >= minValue && top <= maxValue) break;
938
+ }
939
+
940
+ const percent = Math.trunc(
941
+ ((p.playerHp[PY_MAX_LEVEL - 1] as number) * 200) /
942
+ (p.hitdie + (PY_MAX_LEVEL - 1) * p.hitdie),
943
+ );
944
+ deps.msg?.(`Current Life Rating is ${percent}/100.`);
945
+ return percent;
946
+ }
947
+
948
+ /**
949
+ * do_cmd_wiz_reroll_item (L2254): reroll a non-artifact item on its kind at the
950
+ * player's depth. `roll` is 0 normal, 1 good, 2 excellent (good + great). The
951
+ * rerolled properties are written back onto the object in place.
952
+ */
953
+ export function wizRerollItem(
954
+ state: GameState,
955
+ params: { obj: GameObject; roll: number },
956
+ deps: WizardDeps,
957
+ ): boolean {
958
+ if (!debugEnabled(deps) || !deps.makeDeps) return false;
959
+ const { obj } = params;
960
+ if (obj.artifact) return false;
961
+ const good = params.roll >= 1;
962
+ const great = params.roll >= 2;
963
+
964
+ const fresh = objectPrep(
965
+ state.rng,
966
+ deps.makeDeps.reg,
967
+ deps.makeDeps.constants,
968
+ obj.kind,
969
+ state.chunk.depth,
970
+ "randomise",
971
+ );
972
+ applyMagic(state.rng, deps.makeDeps, fresh, state.chunk.depth, false, good, great, false, state.chunk.depth);
973
+
974
+ /* Copy the rolled combat / property values back onto the target object,
975
+ * keeping its identity and pile position (obj is not a fresh allocation
976
+ * here, so pile links stay intact). */
977
+ obj.ego = fresh.ego;
978
+ obj.dd = fresh.dd;
979
+ obj.ds = fresh.ds;
980
+ obj.ac = fresh.ac;
981
+ obj.toA = fresh.toA;
982
+ obj.toH = fresh.toH;
983
+ obj.toD = fresh.toD;
984
+ obj.weight = fresh.weight;
985
+ for (let i = 0; i < obj.modifiers.length; i++) {
986
+ obj.modifiers[i] = fresh.modifiers[i] as number;
987
+ }
988
+ obj.flags.copy(fresh.flags);
989
+ obj.slays = fresh.slays;
990
+ obj.brands = fresh.brands;
991
+ obj.curses = fresh.curses;
992
+ for (let i = 0; i < obj.elInfo.length; i++) {
993
+ const dst = obj.elInfo[i]!;
994
+ const src = fresh.elInfo[i]!;
995
+ dst.resLevel = src.resLevel;
996
+ dst.flags = src.flags;
997
+ }
998
+ obj.origin = ORIGIN.CHEAT;
999
+ return true;
1000
+ }
1001
+
1002
+ /**
1003
+ * do_cmd_wiz_tweak_item (L2698): apply the complete DATA command. The shell
1004
+ * owns the prompts; the values arrive as parameters. Every field is optional;
1005
+ * only supplied fields are changed. Selecting an ego or artifact follows C's
1006
+ * object_prep + ego_apply_magic / copy_artifact_data sequence, including its
1007
+ * RNG draws, before the scalar modifier prompts are applied.
1008
+ */
1009
+ export function wizTweakItem(
1010
+ state: GameState,
1011
+ params: {
1012
+ obj: GameObject;
1013
+ ego?: EgoItem | null;
1014
+ artifact?: Artifact | null;
1015
+ modifiers?: readonly number[];
1016
+ toA?: number;
1017
+ toH?: number;
1018
+ toD?: number;
1019
+ },
1020
+ deps: WizardDeps,
1021
+ ): boolean {
1022
+ if (!debugEnabled(deps)) return false;
1023
+ const { obj } = params;
1024
+ if (obj.artifact) return false;
1025
+
1026
+ const copyPreparedFields = (fresh: GameObject): void => {
1027
+ /* object_prep mutates the existing C object while preserving its pile /
1028
+ * identity fields. Copy the generated fields back while retaining those
1029
+ * live carrier fields in the port's object model. */
1030
+ obj.ego = fresh.ego;
1031
+ obj.artifact = fresh.artifact;
1032
+ obj.tval = fresh.tval;
1033
+ obj.sval = fresh.sval;
1034
+ obj.pval = fresh.pval;
1035
+ obj.weight = fresh.weight;
1036
+ obj.dd = fresh.dd;
1037
+ obj.ds = fresh.ds;
1038
+ obj.ac = fresh.ac;
1039
+ obj.toA = fresh.toA;
1040
+ obj.toH = fresh.toH;
1041
+ obj.toD = fresh.toD;
1042
+ obj.flags.copy(fresh.flags);
1043
+ for (let i = 0; i < obj.modifiers.length; i++) {
1044
+ obj.modifiers[i] = fresh.modifiers[i] as number;
1045
+ }
1046
+ for (let i = 0; i < obj.elInfo.length; i++) {
1047
+ obj.elInfo[i]!.resLevel = fresh.elInfo[i]!.resLevel;
1048
+ obj.elInfo[i]!.flags = fresh.elInfo[i]!.flags;
1049
+ }
1050
+ obj.brands = fresh.brands ? [...fresh.brands] : null;
1051
+ obj.slays = fresh.slays ? [...fresh.slays] : null;
1052
+ obj.curses = fresh.curses ? fresh.curses.map((c) => ({ ...c })) : null;
1053
+ obj.effect = fresh.effect;
1054
+ obj.effectMsg = fresh.effectMsg;
1055
+ obj.activation = fresh.activation;
1056
+ obj.time = { ...fresh.time };
1057
+ obj.timeout = fresh.timeout;
1058
+ };
1059
+
1060
+ if (params.ego !== undefined) {
1061
+ if (params.ego && !deps.makeDeps) return false;
1062
+ if (params.ego && deps.makeDeps) {
1063
+ const fresh = objectPrep(
1064
+ state.rng,
1065
+ deps.makeDeps.reg,
1066
+ deps.makeDeps.constants,
1067
+ obj.kind,
1068
+ state.chunk.depth,
1069
+ "randomise",
1070
+ );
1071
+ fresh.ego = params.ego;
1072
+ egoApplyMagic(state.rng, deps.makeDeps.reg, fresh, state.chunk.depth);
1073
+ copyPreparedFields(fresh);
1074
+ } else {
1075
+ obj.ego = null;
1076
+ }
1077
+ }
1078
+
1079
+ if (params.artifact !== undefined) {
1080
+ if (params.artifact && !deps.makeDeps) return false;
1081
+ if (params.artifact && deps.makeDeps) {
1082
+ const fresh = objectPrep(
1083
+ state.rng,
1084
+ deps.makeDeps.reg,
1085
+ deps.makeDeps.constants,
1086
+ obj.kind,
1087
+ params.artifact.allocMin,
1088
+ "randomise",
1089
+ );
1090
+ fresh.ego = null;
1091
+ fresh.artifact = params.artifact;
1092
+ copyArtifactData(state.rng, deps.makeDeps.reg, fresh, params.artifact);
1093
+ copyPreparedFields(fresh);
1094
+ } else {
1095
+ obj.artifact = null;
1096
+ }
1097
+ }
1098
+ if (params.modifiers) {
1099
+ for (let i = 0; i < obj.modifiers.length && i < params.modifiers.length; i++) {
1100
+ obj.modifiers[i] = params.modifiers[i] as number;
1101
+ }
1102
+ }
1103
+ if (params.toA !== undefined) obj.toA = params.toA;
1104
+ if (params.toH !== undefined) obj.toH = params.toH;
1105
+ if (params.toD !== undefined) obj.toD = params.toD;
1106
+ return true;
1107
+ }
1108
+
1109
+ /**
1110
+ * do_cmd_wiz_summon_named (L2569): summon a specific monster near the player.
1111
+ * Wires to scatter_ext + place_new_monster, trying up to 10 empty grids.
1112
+ */
1113
+ export function wizSummonNamed(
1114
+ state: GameState,
1115
+ params: { race: MonsterRace },
1116
+ deps: WizardDeps,
1117
+ ): boolean {
1118
+ if (!debugEnabled(deps) || !deps.monPlace) return false;
1119
+ const info = { index: 0, role: MON_GROUP.LEADER };
1120
+ for (let i = 0; i < 10; i++) {
1121
+ const spots = scatterExt(state.chunk, state.rng, 1, state.actor.grid, 1, true, (_c, g) =>
1122
+ squareIsEmpty(state, g),
1123
+ );
1124
+ if (spots.length === 0) {
1125
+ deps.msg?.("Could not place monster.");
1126
+ return false;
1127
+ }
1128
+ /* wiz_create_monster (cmd-wizard.c L2614-2615): ORIGIN_DROP_WIZARD. */
1129
+ if (
1130
+ placeNewMonster(
1131
+ state,
1132
+ spots[0]!,
1133
+ params.race,
1134
+ true,
1135
+ true,
1136
+ info,
1137
+ deps.monPlace,
1138
+ ORIGIN.DROP_WIZARD,
1139
+ )
1140
+ ) {
1141
+ return true;
1142
+ }
1143
+ }
1144
+ deps.msg?.("Could not place monster.");
1145
+ return false;
1146
+ }
1147
+
1148
+ /**
1149
+ * do_cmd_wiz_summon_random (L2629): summon `quantity` random monsters near the
1150
+ * player (one EF_SUMMON per monster, value 1).
1151
+ */
1152
+ export function wizSummonRandom(
1153
+ state: GameState,
1154
+ params: { quantity: number },
1155
+ deps: WizardDeps,
1156
+ ): boolean {
1157
+ if (!debugEnabled(deps) || !deps.effect) return false;
1158
+ const n = params.quantity < 1 ? 1 : params.quantity;
1159
+ for (let i = 0; i < n; i++) {
1160
+ runSimple(state, deps.effect, EF.SUMMON, { diceString: "1" });
1161
+ }
1162
+ return true;
1163
+ }
1164
+
1165
+ /**
1166
+ * do_cmd_wiz_teleport_random (L2651): teleport the player a given range.
1167
+ */
1168
+ export function wizTeleportRandom(
1169
+ state: GameState,
1170
+ params: { range: number },
1171
+ deps: WizardDeps,
1172
+ ): boolean {
1173
+ if (!debugEnabled(deps) || !deps.effect || params.range < 1) return false;
1174
+ return runSimple(state, deps.effect, EF.TELEPORT, {
1175
+ diceString: String(params.range),
1176
+ });
1177
+ }
1178
+
1179
+ /**
1180
+ * do_cmd_wiz_teleport_to (L2673): teleport the player onto a target grid, if it
1181
+ * is passable.
1182
+ */
1183
+ export function wizTeleportTo(
1184
+ state: GameState,
1185
+ params: { grid: Loc },
1186
+ deps: WizardDeps,
1187
+ ): boolean {
1188
+ if (!debugEnabled(deps) || !deps.effect) return false;
1189
+ if (!state.chunk.isPassable(params.grid)) {
1190
+ deps.msg?.("The square you are aiming for is impassable.");
1191
+ return false;
1192
+ }
1193
+ return runSimple(state, deps.effect, EF.TELEPORT_TO, {
1194
+ y: params.grid.y,
1195
+ x: params.grid.x,
1196
+ });
1197
+ }
1198
+
1199
+ /**
1200
+ * do_cmd_wiz_push_object (L1871): push the pile off a chosen grid.
1201
+ */
1202
+ export function wizPushObject(
1203
+ state: GameState,
1204
+ params: { grid: Loc },
1205
+ deps: WizardDeps,
1206
+ ): boolean {
1207
+ if (!debugEnabled(deps)) return false;
1208
+ pushObject(state, params.grid);
1209
+ return true;
1210
+ }
1211
+
1212
+ /**
1213
+ * do_cmd_wiz_wizard_light (L2907): permanently light and know the whole level.
1214
+ */
1215
+ export function wizWizardLight(state: GameState, deps: WizardDeps): boolean {
1216
+ if (!debugEnabled(deps)) return false;
1217
+ /* wiz_light(cave, player, true) (cmd-wizard.c:2909): the wizard command is
1218
+ * always the `full` form, so it square_know_piles rather than sense_piles. */
1219
+ wizLightLevel(state, true, true);
1220
+ return true;
1221
+ }
1222
+
1223
+ /**
1224
+ * wiz_cheat_death (wiz-debug.c L28): survive a lethal blow - reset age, refill
1225
+ * HP/SP, cure the afflictions, feed, cancel recall / deep descent and return to
1226
+ * town. The recall / deep-descent counters are player upkeep the port carries
1227
+ * on the player; word_recall / deep_descent live there.
1228
+ */
1229
+ export function wizCheatDeath(state: GameState, deps: WizardDeps): boolean {
1230
+ /* player->wizard || OPT(player, cheat_live) (player-util.c L246); the caller
1231
+ * (game/take-hit-hooks.ts) enforces the cheat_live half. */
1232
+ if (!wizardEnabled(deps)) return false;
1233
+ const p = state.actor.player;
1234
+ /* player->noscore |= NOSCORE_WIZARD (wiz-debug.c L32). */
1235
+ deps.markNoscore?.(NOSCORE.WIZARD);
1236
+ p.age = 1;
1237
+ state.isDead = false;
1238
+ p.chp = p.mhp;
1239
+ p.chpFrac = 0;
1240
+ p.csp = p.msp;
1241
+ p.cspFrac = 0;
1242
+
1243
+ /* Timed clear + food need the effect/timed bundle (wiz-debug.c L43-53). When
1244
+ * the shell has not assembled it yet, HP/SP/age still revive (W2-009). */
1245
+ if (deps.effect) {
1246
+ const ctx = effContext(state, deps.effect);
1247
+ const timed = ctx.player?.timed;
1248
+ if (timed) {
1249
+ for (const idx of CHEAT_DEATH_TIMED) timed.clearTimed(idx, true, false);
1250
+ timed.setTimed(TMD.FOOD, PY_FOOD_FULL - 1, false, false);
1251
+ }
1252
+ }
1253
+
1254
+ /* Cancel recall (wiz-debug.c L56-64) and deep descent (L67-74). Both are
1255
+ * counters on the player, so zeroing them is state, not UI - and without this
1256
+ * a cheated death left a pending recall or descent still counting down in
1257
+ * process_world, which would fire from the town you were just returned to. */
1258
+ if (p.wordRecall) {
1259
+ deps.msg?.("A tension leaves the air around you...");
1260
+ p.wordRecall = 0;
1261
+ }
1262
+ if (p.deepDescent) {
1263
+ deps.msg?.("The air around you stops swirling...");
1264
+ p.deepDescent = 0;
1265
+ }
1266
+
1267
+ /* Back to the town. */
1268
+ state.targetDepth = 0;
1269
+ state.generateLevel = true;
1270
+ return true;
1271
+ }
1272
+
1273
+ /** The affliction timers cheat_death clears (wiz-debug.c L43-50). */
1274
+ const CHEAT_DEATH_TIMED: readonly number[] = [
1275
+ TMD.BLIND,
1276
+ TMD.CONFUSED,
1277
+ TMD.POISONED,
1278
+ TMD.AFRAID,
1279
+ TMD.PARALYZED,
1280
+ TMD.IMAGE,
1281
+ TMD.STUN,
1282
+ TMD.CUT,
1283
+ ];
1284
+
1285
+ /* ------------------------------------------------------------------ *
1286
+ * Item debug shells (cmd-wizard.c): the non-UI engine / data halves.
1287
+ * The Term rendering (wiz_display_item's prt / prt_binary flag grid) and the
1288
+ * command-queue menu loops stay with the shell (WP-14); these return the data
1289
+ * the shell needs or perform the concrete state change it drives.
1290
+ * ------------------------------------------------------------------ */
1291
+
1292
+ /**
1293
+ * The DATA half of wiz_display_item (cmd-wizard.c L190-283): the scalar item
1294
+ * facts the debug panel prints. The Term_clear / prt line layout and the
1295
+ * vertical prt_binary flag grid are the shell's; this returns the values.
1296
+ *
1297
+ * `all` chooses whether the combat-plus fields (to-hit / to-dam / to-ac) and
1298
+ * the flag set come from the fully-real object or from what is known: upstream
1299
+ * reads object_to_hit(all ? obj : obj->known) and object_flags[_known](obj).
1300
+ * The port's known twin is a GameObject, supplied as `known`; when `all` is
1301
+ * false and `known` is given, the "+" fields and flagsKnown read from it.
1302
+ * object_flags(obj) is just a copy of obj.flags (obj-util.c L353); the "known"
1303
+ * flag set is the twin's flags (obj.flags when no twin is threaded).
1304
+ */
1305
+ export interface WizItemDisplay {
1306
+ /** obj->dd (always from the real object). */
1307
+ dd: number;
1308
+ /** obj->ds. */
1309
+ ds: number;
1310
+ /** object_to_hit(all ? obj : obj->known). */
1311
+ toH: number;
1312
+ /** object_to_dam(all ? obj : obj->known). */
1313
+ toD: number;
1314
+ /** obj->ac. */
1315
+ ac: number;
1316
+ /** object_to_ac(all ? obj : obj->known). */
1317
+ toA: number;
1318
+ /** obj->kind->kidx. */
1319
+ kidx: number;
1320
+ tval: number;
1321
+ sval: number;
1322
+ /** object_weight_one(obj). */
1323
+ weight: number;
1324
+ /** obj->timeout. */
1325
+ timeout: number;
1326
+ /** obj->number. */
1327
+ number: number;
1328
+ /** obj->pval. */
1329
+ pval: number;
1330
+ /** obj->artifact ? aidx : 0 (upstream "name1"). */
1331
+ name1: number;
1332
+ /** obj->ego ? eidx : -1 (upstream "egoidx"). */
1333
+ egoidx: number;
1334
+ /** object_value(obj, 1). */
1335
+ cost: number;
1336
+ /** object_flags(obj): the full flag set (== obj.flags). */
1337
+ flags: FlagSet;
1338
+ /** object_flags_known(obj): the known flag set (the twin's, or obj's). */
1339
+ flagsKnown: FlagSet;
1340
+ }
1341
+
1342
+ export function wizDisplayItem(
1343
+ obj: GameObject,
1344
+ deps: WizardDeps,
1345
+ opts: { all?: boolean; known?: GameObject | null } = {},
1346
+ ): WizItemDisplay | null {
1347
+ if (!debugEnabled(deps) || !deps.makeDeps) return null;
1348
+ const all = opts.all ?? true;
1349
+ const known = opts.known ?? null;
1350
+ /* The object the "+" combat fields and the known flag set are read from. */
1351
+ const view = all ? obj : known ?? obj;
1352
+ return {
1353
+ dd: obj.dd,
1354
+ ds: obj.ds,
1355
+ toH: view.toH,
1356
+ toD: view.toD,
1357
+ ac: obj.ac,
1358
+ toA: view.toA,
1359
+ kidx: obj.kind.kidx,
1360
+ tval: obj.tval,
1361
+ sval: obj.sval,
1362
+ weight: objectWeightOne(obj, deps.curses),
1363
+ timeout: obj.timeout,
1364
+ number: obj.number,
1365
+ pval: obj.pval,
1366
+ name1: obj.artifact ? obj.artifact.aidx : 0,
1367
+ egoidx: obj.ego ? obj.ego.eidx : -1,
1368
+ cost: objectValue(deps.makeDeps.reg, obj, 1, true),
1369
+ flags: obj.flags,
1370
+ flagsKnown: (known ?? obj).flags,
1371
+ };
1372
+ }
1373
+
1374
+ /** The outcome of wizChangeItemQuantity, for the shell's feedback. */
1375
+ export interface WizQuantityResult {
1376
+ /** The number the stack ended up at (unchanged when the edit was refused). */
1377
+ number: number;
1378
+ /** The ceiling MIN(max_stack, charge limit, quiver limit) that was applied. */
1379
+ max: number;
1380
+ /** Whether obj.number actually changed. */
1381
+ changed: boolean;
1382
+ }
1383
+
1384
+ /**
1385
+ * do_cmd_wiz_change_item_quantity (CMD_WIZ_CHANGE_ITEM_QUANTITY, cmd-wizard.c
1386
+ * L484-575), the [q] entry of the do_cmd_wiz_play_item session (L1771-1789).
1387
+ *
1388
+ * Refuses an equipped item ("Can not change the quantity of an equipped item.",
1389
+ * L495) and any artifact ("Can not modify the quantity of an artifact.", L501),
1390
+ * then computes the ceiling nmax the same three ways upstream does (L505-517):
1391
+ * - obj->kind->base->max_stack, always;
1392
+ * - for a charge-carrying device with pval > 0, (MAX_PVAL * number) / pval, so
1393
+ * the scaled-up charges cannot overflow MAX_PVAL;
1394
+ * - for a quiver item, quiver_slot_size / (ammo ? 1 : thrown_quiver_mult).
1395
+ * The requested count is then clamped to [1, nmax] (L520 MAX(1, MIN(nmax, n))).
1396
+ *
1397
+ * Upstream warts preserved: charges and timeouts are rescaled by INTEGER
1398
+ * division `(pval * n) / number` BEFORE obj->number is assigned (L524-530), so
1399
+ * both reads use the OLD number; and the whole body is skipped when n equals the
1400
+ * current number, leaving charges untouched. `update` false suppresses only the
1401
+ * weight/upkeep refresh (L551-570), never the number change itself.
1402
+ *
1403
+ * The PU_BONUS / PU_INVEN / PN_COMBINE / PR_* upkeep bits are UI (the shell's);
1404
+ * the carried-weight arithmetic upstream does alongside them IS state and is
1405
+ * applied here.
1406
+ */
1407
+ export function wizChangeItemQuantity(
1408
+ state: GameState,
1409
+ params: {
1410
+ obj: GameObject;
1411
+ /** The gear handle, when the item is carried (absent for a floor item). */
1412
+ handle?: number;
1413
+ /** cmd_get_arg_number "quantity". */
1414
+ quantity: number;
1415
+ /** cmd_get_arg_choice "update"; absent behaves as upstream's !CMD_OK. */
1416
+ update?: boolean;
1417
+ },
1418
+ deps: WizardDeps,
1419
+ ): WizQuantityResult | null {
1420
+ if (!debugEnabled(deps) || !deps.makeDeps) return null;
1421
+ const { obj, handle } = params;
1422
+ const p = state.actor.player;
1423
+
1424
+ /* cmd-wizard.c L494-497: an explicitly supplied equipped item is refused. */
1425
+ if (handle !== undefined && p.equipment.includes(handle)) {
1426
+ deps.msg?.("Can not change the quantity of an equipped item.");
1427
+ return null;
1428
+ }
1429
+ /* L499-503: artifacts are one of a kind. */
1430
+ if (obj.artifact) {
1431
+ deps.msg?.("Can not modify the quantity of an artifact.");
1432
+ return null;
1433
+ }
1434
+
1435
+ const z = deps.makeDeps.constants;
1436
+ let nmax = obj.kind.base.maxStack;
1437
+ if (tvalCanHaveCharges(obj.tval) && obj.pval > 0 && obj.number > 0) {
1438
+ nmax = Math.min(Math.trunc((MAX_PVAL * obj.number) / obj.pval), nmax);
1439
+ }
1440
+ if (handle !== undefined && objectIsInQuiver(state.gear, handle)) {
1441
+ nmax = Math.min(
1442
+ Math.trunc(
1443
+ z.quiverSlotSize / (tvalIsAmmo(obj.tval) ? 1 : z.thrownQuiverMult),
1444
+ ),
1445
+ nmax,
1446
+ );
1447
+ }
1448
+
1449
+ const n = Math.max(1, Math.min(nmax, params.quantity));
1450
+ if (n === obj.number) return { number: obj.number, max: nmax, changed: false };
1451
+
1452
+ /* L523-530: rescale charges / timeouts against the OLD number. */
1453
+ if (tvalCanHaveCharges(obj.tval) && obj.number > 0) {
1454
+ obj.pval = Math.trunc((obj.pval * n) / obj.number);
1455
+ }
1456
+ if (tvalCanHaveTimeout(obj.tval) && obj.number > 0) {
1457
+ obj.timeout = Math.trunc((obj.timeout * n) / obj.number);
1458
+ }
1459
+
1460
+ /* L532-570: with "update" absent or true, restate the carried weight. */
1461
+ if ((params.update ?? true) && handle !== undefined) {
1462
+ const one = objectWeightOne(obj, deps.curses);
1463
+ p.upkeep.totalWeight -= obj.number * one;
1464
+ p.upkeep.totalWeight += n * one;
1465
+ }
1466
+
1467
+ obj.number = n;
1468
+ return { number: n, max: nmax, changed: true };
1469
+ }
1470
+
1471
+ /**
1472
+ * wizPlayItemBegin (do_cmd_wiz_play_item, cmd-wizard.c L1642-1645): snapshot the
1473
+ * object so the [t]weak / [r]eroll / [c]urse edits can be rejected. Upstream
1474
+ * allocates a fresh object and object_copy()s the working item into it; the port
1475
+ * uses objectCopy (obj/object.ts) which produces the same value snapshot.
1476
+ * Returns the preserved copy the shell hands back to Accept / Reject.
1477
+ */
1478
+ export function wizPlayItemBegin(
1479
+ obj: GameObject,
1480
+ deps: WizardDeps,
1481
+ ): GameObject | null {
1482
+ if (!debugEnabled(deps)) return null;
1483
+ return objectCopy(obj);
1484
+ }
1485
+
1486
+ /** The mutable item properties wiz_play_item's reject restores (object_copy). */
1487
+ function restoreItemFields(dst: GameObject, src: GameObject): void {
1488
+ dst.kind = src.kind;
1489
+ dst.ego = src.ego;
1490
+ dst.artifact = src.artifact;
1491
+ dst.tval = src.tval;
1492
+ dst.sval = src.sval;
1493
+ dst.pval = src.pval;
1494
+ dst.weight = src.weight;
1495
+ dst.dd = src.dd;
1496
+ dst.ds = src.ds;
1497
+ dst.ac = src.ac;
1498
+ dst.toA = src.toA;
1499
+ dst.toH = src.toH;
1500
+ dst.toD = src.toD;
1501
+ dst.flags.copy(src.flags);
1502
+ for (let i = 0; i < dst.modifiers.length; i++) {
1503
+ dst.modifiers[i] = src.modifiers[i] as number;
1504
+ }
1505
+ for (let i = 0; i < dst.elInfo.length; i++) {
1506
+ const d = dst.elInfo[i]!;
1507
+ const s = src.elInfo[i]!;
1508
+ d.resLevel = s.resLevel;
1509
+ d.flags = s.flags;
1510
+ }
1511
+ dst.brands = src.brands ? [...src.brands] : null;
1512
+ dst.slays = src.slays ? [...src.slays] : null;
1513
+ dst.curses = src.curses ? src.curses.map((c) => ({ ...c })) : null;
1514
+ dst.effect = src.effect;
1515
+ dst.effectMsg = src.effectMsg;
1516
+ dst.activation = src.activation;
1517
+ dst.time = { ...src.time };
1518
+ dst.timeout = src.timeout;
1519
+ dst.number = src.number;
1520
+ dst.notice = src.notice;
1521
+ dst.origin = src.origin;
1522
+ dst.originDepth = src.originDepth;
1523
+ dst.originRace = src.originRace;
1524
+ }
1525
+
1526
+ /**
1527
+ * wizPlayItemReject (do_cmd_wiz_play_item, cmd-wizard.c L1822-1843): the play
1528
+ * session was abandoned with changes; copy the preserved original back onto the
1529
+ * working object in place. Upstream restores the pile links after object_copy;
1530
+ * the port mutates the existing object (its pile membership is by array position
1531
+ * in floor/gear, not per-object links), so no link fix-up is needed.
1532
+ */
1533
+ export function wizPlayItemReject(
1534
+ obj: GameObject,
1535
+ original: GameObject,
1536
+ deps: WizardDeps,
1537
+ ): boolean {
1538
+ if (!debugEnabled(deps)) return false;
1539
+ restoreItemFields(obj, original);
1540
+ return true;
1541
+ }
1542
+
1543
+ /**
1544
+ * wizPlayItemAccept (do_cmd_wiz_play_item, cmd-wizard.c L1679-1718): commit the
1545
+ * changes. When the item actually changed and is equipped, upstream clears the
1546
+ * known WORN notice and re-runs object_learn_on_wield so the panel reflects the
1547
+ * edited properties. The total_weight / redraw upkeep is UI (the shell's). The
1548
+ * caller supplies whether the item is worn (the slot it was picked from).
1549
+ */
1550
+ export function wizPlayItemAccept(
1551
+ state: GameState,
1552
+ obj: GameObject,
1553
+ params: { changed: boolean; equipped: boolean },
1554
+ deps: WizardDeps,
1555
+ ): boolean {
1556
+ if (!debugEnabled(deps)) return false;
1557
+ if (params.changed && params.equipped) {
1558
+ obj.notice &= ~OBJ_NOTICE_WORN;
1559
+ objectLearnOnWield(state.actor.player, obj, state.runeEnv);
1560
+ updatePlayerObjectKnowledge(state); /* player_learn_rune sweep (L1373). */
1561
+ }
1562
+ return true;
1563
+ }
1564
+
1565
+ /** OBJ_NOTICE_WORN: the "has been worn" learn gate cleared on accept. */
1566
+ const OBJ_NOTICE_WORN = OBJ_NOTICE.WORN;
1567
+
1568
+ /** The classification of one make_object roll against the target (stat_item). */
1569
+ export interface WizStatItemResult {
1570
+ /** Rolls actually performed. */
1571
+ rolls: number;
1572
+ /** Same tval/sval, all modifiers and to_a/to_h/to_d equal. */
1573
+ matches: number;
1574
+ /** Same or better across every tested property, and strictly better once. */
1575
+ better: number;
1576
+ /** Same or worse across every tested property, and strictly worse once. */
1577
+ worse: number;
1578
+ /** Same tval/sval but neither strictly better nor worse (a mix). */
1579
+ other: number;
1580
+ }
1581
+
1582
+ /**
1583
+ * do_cmd_wiz_stat_item (cmd-wizard.c L2386-2562): roll `nRolls` items with
1584
+ * make_object at `level` and classify each as match / better / worse / other
1585
+ * against the target object. `roll` is 0 normal, 1 good, 2 excellent (good +
1586
+ * great). The interrupt polling and the running Term readout are UI and are
1587
+ * omitted; the classification math, RNG draw order and the artifact-preserve
1588
+ * quirk are faithful.
1589
+ *
1590
+ * Upstream quirk preserved (L2504-2506, L2559-2561): it marks the TARGET
1591
+ * object's artifact uncreated before each roll (so make_object may regenerate
1592
+ * it) and re-marks it created at the end - note it tests obj->artifact, the
1593
+ * target's, not the rolled test object's, exactly as upstream does.
1594
+ */
1595
+ export function wizStatItem(
1596
+ state: GameState,
1597
+ params: { obj: GameObject; roll: number; level: number; nRolls?: number },
1598
+ deps: WizardDeps,
1599
+ ): WizStatItemResult | null {
1600
+ if (!debugEnabled(deps) || !deps.makeDeps) return null;
1601
+ const { obj } = params;
1602
+ const good = params.roll >= 1;
1603
+ const great = params.roll >= 2;
1604
+ const level = params.level;
1605
+ const n = params.nRolls ?? TEST_ROLL;
1606
+
1607
+ let matches = 0;
1608
+ let better = 0;
1609
+ let worse = 0;
1610
+ let other = 0;
1611
+ let i = 0;
1612
+ for (; i < n; i++) {
1613
+ /* make_object(cave, level, good, great, false, NULL, 0). */
1614
+ const test = makeObject(state.rng, deps.makeDeps, level, good, great, false, 0, level);
1615
+
1616
+ /* Allow the target artifact to be regenerated (L2504-2506). */
1617
+ if (obj.artifact) deps.makeDeps.artifacts.markCreated(obj.artifact.aidx, false);
1618
+
1619
+ if (!test) continue;
1620
+
1621
+ /* Same tval and sval? (L2512-2516) */
1622
+ if (obj.tval !== test.tval || obj.sval !== test.sval) continue;
1623
+
1624
+ /* Compare modifiers (L2518-2528). */
1625
+ let isMatch = true;
1626
+ let isBetter = true;
1627
+ let isWorse = true;
1628
+ for (let j = 0; j < OBJ_MOD_MAX; j++) {
1629
+ const tm = test.modifiers[j] as number;
1630
+ const om = obj.modifiers[j] as number;
1631
+ if (tm !== om) {
1632
+ isMatch = false;
1633
+ if (tm < om) isBetter = false;
1634
+ else isWorse = false;
1635
+ }
1636
+ }
1637
+
1638
+ if (isMatch && test.toA === obj.toA && test.toH === obj.toH && test.toD === obj.toD) {
1639
+ matches++;
1640
+ } else if (isBetter && test.toA >= obj.toA && test.toH >= obj.toH && test.toD >= obj.toD) {
1641
+ better++;
1642
+ } else if (isWorse && test.toA <= obj.toA && test.toH <= obj.toH && test.toD <= obj.toD) {
1643
+ worse++;
1644
+ } else {
1645
+ other++;
1646
+ }
1647
+ }
1648
+
1649
+ /* Normally leave a single artifact created (L2559-2561). */
1650
+ if (obj.artifact) deps.makeDeps.artifacts.markCreated(obj.artifact.aidx, true);
1651
+
1652
+ return { rolls: i, matches, better, worse, other };
1653
+ }
1654
+
1655
+ /** TEST_ROLL (cmd-wizard.c L2385): the default sample size. */
1656
+ const TEST_ROLL = 100000;
1657
+
1658
+ /**
1659
+ * do_cmd_wiz_edit_player_start (cmd-wizard.c L1202-1239): the batch player
1660
+ * editor. Upstream chains a queued CMD_WIZ_EDIT_PLAYER_STAT per stat plus a
1661
+ * gold and an exp edit through the edit_player_state machine; the queue
1662
+ * plumbing is UI. The engine effect is: apply the six stat edits, the gold
1663
+ * edit, and the exp edit. Each field is optional; a supplied value is applied
1664
+ * through the already-ported per-field editor (same clamps), so an absent field
1665
+ * is left unchanged (the shell's "cancel this stage" path).
1666
+ */
1667
+ export function wizEditPlayerStart(
1668
+ state: GameState,
1669
+ params: {
1670
+ stats?: readonly (number | undefined)[];
1671
+ gold?: number;
1672
+ exp?: number;
1673
+ },
1674
+ deps: WizardDeps,
1675
+ ): boolean {
1676
+ if (!debugEnabled(deps)) return false;
1677
+ if (params.stats) {
1678
+ for (let stat = 0; stat < STAT_MAX && stat < params.stats.length; stat++) {
1679
+ const v = params.stats[stat];
1680
+ if (v !== undefined) wizEditPlayerStat(state, { stat, value: v }, deps);
1681
+ }
1682
+ }
1683
+ if (params.gold !== undefined) wizEditPlayerGold(state, { value: params.gold }, deps);
1684
+ if (params.exp !== undefined) wizEditPlayerExp(state, { value: params.exp }, deps);
1685
+ return true;
1686
+ }
1687
+
1688
+ /* ------------------------------------------------------------------ *
1689
+ * The map QUERY commands (DATA half only; the highlight redraw is the shell's).
1690
+ * ------------------------------------------------------------------ */
1691
+
1692
+ /**
1693
+ * do_cmd_wiz_query_feature (L1930, DATA half): the fully-in-bounds grids whose
1694
+ * feature is one of `features`. The shell highlights them.
1695
+ */
1696
+ export function wizQueryFeature(
1697
+ state: GameState,
1698
+ params: { features: readonly number[] },
1699
+ deps: WizardDeps,
1700
+ ): Loc[] {
1701
+ if (!debugEnabled(deps)) return [];
1702
+ const out: Loc[] = [];
1703
+ const c = state.chunk;
1704
+ for (let y = 1; y < c.height - 1; y++) {
1705
+ for (let x = 1; x < c.width - 1; x++) {
1706
+ const grid = { x, y };
1707
+ if (params.features.includes(c.feat(grid))) out.push(grid);
1708
+ }
1709
+ }
1710
+ return out;
1711
+ }
1712
+
1713
+ /**
1714
+ * do_cmd_wiz_query_square_flag (L2105, DATA half): the fully-in-bounds grids
1715
+ * carrying a SQUARE_* flag; flag 0 selects the known grids (as upstream).
1716
+ */
1717
+ export function wizQuerySquareFlag(
1718
+ state: GameState,
1719
+ params: { flag: number },
1720
+ deps: WizardDeps,
1721
+ ): Loc[] {
1722
+ if (!debugEnabled(deps)) return [];
1723
+ const out: Loc[] = [];
1724
+ const c = state.chunk;
1725
+ for (let y = 1; y < c.height - 1; y++) {
1726
+ for (let x = 1; x < c.width - 1; x++) {
1727
+ const grid = { x, y };
1728
+ const show = params.flag
1729
+ ? c.sqinfoHas(grid, params.flag)
1730
+ : squareIsKnown(state, grid);
1731
+ if (show) out.push(grid);
1732
+ }
1733
+ }
1734
+ return out;
1735
+ }
1736
+
1737
+ /**
1738
+ * do_cmd_wiz_peek_noise_scent (L1477, DATA half): the fully-in-bounds grids at
1739
+ * exactly `depth` on the chosen flow heatmap ("noise" or "scent"). The shell
1740
+ * steps depth from 0 upward and highlights each returned set.
1741
+ */
1742
+ export function wizPeekFlow(
1743
+ state: GameState,
1744
+ params: { depth: number; which: "noise" | "scent" },
1745
+ deps: WizardDeps,
1746
+ ): Loc[] {
1747
+ if (!debugEnabled(deps)) return [];
1748
+ const out: Loc[] = [];
1749
+ const c = state.chunk;
1750
+ const map = params.which === "scent" ? c.scent : c.noise;
1751
+ for (let y = 1; y < c.height - 1; y++) {
1752
+ for (let x = 1; x < c.width - 1; x++) {
1753
+ if (map[y * c.width + x] === params.depth) out.push({ x, y });
1754
+ }
1755
+ }
1756
+ return out;
1757
+ }
1758
+
1759
+ /** KF_INSTA_ART: the kind-flag marking instant-artifact base kinds. */
1760
+ const KF_INSTA_ART = KF.INSTA_ART;