@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,1012 @@
1
+ /**
2
+ * Live-cave monster placement, ported from the placement half of
3
+ * reference/src/mon-make.c (place_monster, place_new_monster_one,
4
+ * place_new_monster_group, place_friends, place_new_monster,
5
+ * pick_and_place_monster) and the world half of reference/src/mon-summon.c
6
+ * (summon_specific, call_monster, select_shape), Angband 4.2.6.
7
+ *
8
+ * The generation-time twin of this family lives in gen/util.ts and operates
9
+ * on the Gen context; this module operates on a running GameState, so
10
+ * summons, breeders and other mid-game arrivals join the live monster list,
11
+ * the group structures and the square occupancy exactly as the generated
12
+ * population did. Monster construction (RNG order: sleep, hp, speed
13
+ * variation, energy, random attr) is the shared mon/make.ts createMonster.
14
+ *
15
+ * Racial population counts (race->cur_num) are live here: placement
16
+ * increments them and deleteMonster (game/context.ts) decrements, so the
17
+ * "only one unique at a time" rule holds across summoning and death. The
18
+ * session layer keeps the counts consistent across level changes
19
+ * (wipe_mon_list decrements for every live monster).
20
+ *
21
+ * Placement-time monster drops (mon_create_drop) ARE wired here: placeMonsterLive
22
+ * calls the shared createDrop core (game/mon-death.ts) when origin != 0, exactly
23
+ * as place_monster does (mon-make.c L1044-1046), filling the monster's held pile
24
+ * so monster_death can spill it on death. Live callers thread the true origin
25
+ * (ORIGIN_DROP for ambient spawns and pickAndPlaceDistantMonster, DROP_SUMMON for
26
+ * summons, DROP_BREED for breeders, DROP_WIZARD for the debug spawn). Inert when
27
+ * the caller omits MonPlaceDeps.makeDeps (monster-only harnesses). The cheat_hear
28
+ * messages are UI-only; update_mon / monster-light view refresh rides the FOV
29
+ * consumers.
30
+ *
31
+ * Object-mimic placement (mon_create_mimicked_object) IS ported here and
32
+ * fires from placeMonsterLive for live-placed (summoned / bred) mimics when
33
+ * the caller supplies MonPlaceDeps.mimic. Generation-spawned mimics ARE built by
34
+ * gen/util.ts placeNewMonsterOne (createMimickedObject) and installed by
35
+ * session/game.ts populateFromLevel; the two paths draw at the same RNG-stream
36
+ * position because every vanilla mimic race carries no drops.
37
+ *
38
+ * add_to_monster_rating IS wired here (mon-make.c L1112-1126), matching
39
+ * upstream's single place_new_monster_one for both generation and live
40
+ * summons/breeders. Since chunk.feeling is computed once at gen-end
41
+ * (gen/generate.ts generateLevel) and never recomputed, these post-gen
42
+ * accumulations are harmless bookkeeping: they keep chunk.mon_rating byte-
43
+ * faithful to upstream but have no effect on an already-shown feeling.
44
+ */
45
+
46
+ import { MON_TMD, ORIGIN, RF } from "../generated/index.js";
47
+ import type { Rng } from "../rng.js";
48
+ import type { Loc } from "../loc.js";
49
+ import { DDGRID_DDD, distance, locEq, locSum } from "../loc.js";
50
+ import type { MonsterBase, MonsterGroupRole, MonsterRace } from "../mon/types.js";
51
+ import { MON_GROUP } from "../mon/types.js";
52
+ import type { Monster, MonsterGroupInfo } from "../mon/monster.js";
53
+ import { turnEnergy } from "../mon/monster.js";
54
+ import { createMonster, monsterCarry } from "../mon/make.js";
55
+ import type { MonAllocTable } from "../mon/make.js";
56
+ import { monsterIsCamouflaged, monsterIsShapeUnique } from "../mon/predicate.js";
57
+ import { monsterWake } from "../mon/take-hit.js";
58
+ import type { SummonTable } from "../mon/summon.js";
59
+ import { summonSpecificOkay } from "../mon/summon.js";
60
+ import { applyMagic, makeGold, objectPrep } from "../obj/make.js";
61
+ import type { MakeDeps } from "../obj/make.js";
62
+ import type { LoreStore } from "../mon/lore.js";
63
+ import { createDrop } from "./mon-death.js";
64
+ import { tvalIsMoney } from "../obj/object.js";
65
+ import type { GameObject } from "../obj/object.js";
66
+ import { tvalFindIdx } from "../obj/bind.js";
67
+ import type { ObjectKind } from "../obj/types.js";
68
+ import { scatterExt } from "../world/scatter.js";
69
+ import { los } from "../world/view.js";
70
+ import { monPop, monsterMax, monsterSwap, squareMonster } from "./context.js";
71
+ import type { GameState } from "./context.js";
72
+ import { floorCarry } from "./floor.js";
73
+ import type { FloorEnv } from "./floor.js";
74
+ import { monsterGroupAssign, summonGroup } from "./mon-group.js";
75
+
76
+ /** Everything live placement needs beyond the state. */
77
+ export interface MonPlaceDeps {
78
+ /** The live race allocation table (shared across the session). */
79
+ table: MonAllocTable;
80
+ /**
81
+ * square_isplayertrap / iswebbed / iswarded (game/trap.ts trapPredicates).
82
+ * Absent (no trap system), those tests pass vacuously.
83
+ */
84
+ preds?: {
85
+ isPlayerTrap: (grid: Loc) => boolean;
86
+ isWebbed: (grid: Loc) => boolean;
87
+ isWarded: (grid: Loc) => boolean;
88
+ };
89
+ /** z_info->monster_group_max (mon-gen:group-max, 25). */
90
+ groupMax?: number;
91
+ /** z_info->monster_group_dist (mon-gen:group-dist, 5). */
92
+ groupDist?: number;
93
+ /**
94
+ * Object-make deps for mon_create_mimicked_object (mon-make.c L899). Absent
95
+ * (worldless / monster-only harnesses, and every current caller until the
96
+ * generation-handoff seam is wired), object-mimics are placed as bare
97
+ * monsters with no fake item - exactly the pre-mimic behaviour - and
98
+ * mon.mimickedObj stays 0.
99
+ */
100
+ mimic?: MimicDeps;
101
+ /**
102
+ * Object-make deps for mon_create_drop (mon-make.c L1044). When present,
103
+ * placeMonsterLive generates the monster's held-object drops at placement, as
104
+ * upstream place_monster does when origin != 0. Absent (monster-only
105
+ * harnesses / tests that do not exercise loot), no drops are drawn and no held
106
+ * pile is populated - so those contexts stay RNG-identical to the pre-wiring
107
+ * behaviour.
108
+ */
109
+ makeDeps?: MakeDeps;
110
+ /**
111
+ * Lore store for mon_create_drop's unique theft reduction (mon-make.c L778).
112
+ * Absent => thefts treated as 0 (a never-stolen-from monster).
113
+ */
114
+ lore?: LoreStore;
115
+ }
116
+
117
+ /** Everything mon_create_mimicked_object needs beyond the state and monster. */
118
+ export interface MimicDeps {
119
+ /** Object-make deps (makeGold / objectPrep / applyMagic share the RNG). */
120
+ makeDeps: MakeDeps;
121
+ /** floor_carry env (ignore / stacking hooks); defaults to inert. */
122
+ floorEnv?: FloorEnv;
123
+ }
124
+
125
+ /**
126
+ * The minimal, GameState-free surface mon_create_mimicked_object needs so BOTH
127
+ * the live cave (this module) and level generation (gen/util.ts) can build a
128
+ * mimic's fake object off the same code. The two paths differ only in how the
129
+ * object is carried: the live path calls floor_carry on the running state; the
130
+ * generation path parks it on the Gen side-table that populateFromLevel later
131
+ * re-carries. Neither carry draws RNG, so the object's draws (reservoir sample
132
+ * + make_gold / object_prep + apply_magic) land at the same stream position on
133
+ * either path.
134
+ */
135
+ export interface MimicTarget {
136
+ /** c->depth: the depth make_gold / origin_depth read. */
137
+ depth: number;
138
+ /** The stream to draw from (live state.rng or generation g.rng). */
139
+ rng: Rng;
140
+ /** make_gold / object_prep / apply_magic dependencies. */
141
+ makeDeps: MakeDeps;
142
+ /** floor_carry(c, mon->grid, obj): put obj at grid, true iff it went. */
143
+ carry: (grid: Loc, obj: GameObject) => boolean;
144
+ }
145
+
146
+ /** square_isopen on the live cave: floor with no occupant (player counts). */
147
+ export function squareIsOpenLive(state: GameState, grid: Loc): boolean {
148
+ if (!state.chunk.inBounds(grid)) return false;
149
+ return state.chunk.isFloor(grid) && state.chunk.mon(grid) === 0;
150
+ }
151
+
152
+ /** square_isempty on the live cave: open, no objects, no player trap / web. */
153
+ export function squareIsEmptyLive(
154
+ state: GameState,
155
+ grid: Loc,
156
+ preds?: MonPlaceDeps["preds"],
157
+ ): boolean {
158
+ if (!state.chunk.inBounds(grid)) return false;
159
+ if (preds?.isPlayerTrap(grid)) return false;
160
+ if (preds?.isWebbed(grid)) return false;
161
+ if (!squareIsOpenLive(state, grid)) return false;
162
+ const pile = state.floor.get(grid.y * state.chunk.width + grid.x);
163
+ return !pile || pile.length === 0;
164
+ }
165
+
166
+ /** square_allows_summon: empty and neither warded nor decoyed. */
167
+ export function squareAllowsSummon(
168
+ state: GameState,
169
+ grid: Loc,
170
+ preds?: MonPlaceDeps["preds"],
171
+ ): boolean {
172
+ if (!squareIsEmptyLive(state, grid, preds)) return false;
173
+ if (preds?.isWarded(grid)) return false;
174
+ return !(state.decoy && locEq(state.decoy, grid));
175
+ }
176
+
177
+ /**
178
+ * The slot allocation and placement bookkeeping of place_new_monster_one
179
+ * (mon-make.c L1010 onwards): ask mon_pop for a slot, mark the square, join the
180
+ * group and count the race. Returns the midx, or 0 when the monster list is
181
+ * full - which the caller MUST propagate as a failed placement, as upstream's
182
+ * `if (!m_idx) return 0` does.
183
+ *
184
+ * The slot scan that used to live here reused the first hole; mon_pop appends
185
+ * below level_monster_max and only recycles at the cap. See monPop.
186
+ */
187
+ function placeMonsterLive(
188
+ state: GameState,
189
+ grid: Loc,
190
+ mon: Monster,
191
+ deps: MonPlaceDeps,
192
+ origin: number,
193
+ ): number {
194
+ /* `loading` (mon-make.c L1006, L1011-1014): a monster read back from a save
195
+ * keeps its stored slot rather than drawing a new one. Live callers build the
196
+ * monster with createMonster, whose midx is 0; the port's load path appends
197
+ * in stored order through addMonster, which is the same assignment. */
198
+ const loading = mon.midx > 0;
199
+ const midx = loading ? mon.midx : monPop(state);
200
+ if (!midx) return 0;
201
+ if (loading && state.monsters.length <= midx) {
202
+ state.monsters.length = midx + 1;
203
+ }
204
+ mon.midx = midx;
205
+ mon.grid = grid;
206
+ state.monsters[midx] = mon;
207
+ state.chunk.setMon(grid, midx);
208
+
209
+ /* Assign monster to its monster group. */
210
+ monsterGroupAssign(state, mon, mon.groupInfo, false);
211
+
212
+ /* update_mon's distance bookkeeping (visibility rides FOV consumers). */
213
+ mon.cdis = distance(grid, state.actor.grid);
214
+
215
+ /* Count the number of "reproducers" (mon-make.c L1038): current race flag. */
216
+ if (mon.race.flags.has(RF.MULTIPLY)) {
217
+ state.numRepro = (state.numRepro ?? 0) + 1;
218
+ }
219
+
220
+ /* Count racial occurrences. */
221
+ (mon.originalRace ?? mon.race).curNum++;
222
+
223
+ /* Create the monster's drop, if any (mon-make.c place_monster L1044-1046):
224
+ * generate the held-object pile at placement when origin != 0, exactly where
225
+ * upstream draws it - BEFORE mon_create_mimicked_object below. Inert unless
226
+ * the caller supplies object-make deps. */
227
+ if (origin !== ORIGIN.NONE && deps.makeDeps) {
228
+ createDrop(
229
+ {
230
+ rng: state.rng,
231
+ depth: state.chunk.depth,
232
+ makeDeps: deps.makeDeps,
233
+ lore: deps.lore ?? null,
234
+ },
235
+ mon,
236
+ origin,
237
+ );
238
+ }
239
+
240
+ /* Make mimics start mimicking (mon-make.c place_monster L1048-1051). The
241
+ * upstream origin gate is implicit here: every live placement carries an
242
+ * origin (ORIGIN_DROP etc.), and generated mimics ride the generation
243
+ * handoff seam. Object-mimic races carry no RF_DROP_* / drops in vanilla, so
244
+ * mon_create_drop above draws zero RNG for them - the mimic object's draws
245
+ * land at the same stream position as upstream for every mimic race. Inert
246
+ * unless the caller supplies object-make deps. */
247
+ if (deps.mimic && mon.race.mimicKinds.length > 0) {
248
+ monCreateMimickedObject(state, mon, deps.mimic);
249
+ }
250
+
251
+ return midx;
252
+ }
253
+
254
+ /**
255
+ * mon_create_mimicked_object (mon-make.c L899): create the fake floor item an
256
+ * object-mimic imitates and link it to the monster. Reservoir-samples one of
257
+ * the race's mimic_kinds (one_in_(i) over i = 1..n; the first draw, one_in_(1),
258
+ * draws no RNG and always selects the first kind), makes a gold object for a
259
+ * money kind or a prepped-and-magicked item otherwise (RNG order identical to
260
+ * upstream), links both sides of the mimicry, and drops it on the monster's
261
+ * grid via floor_carry. If the floor cannot hold it the mimicry is cleared and
262
+ * the item is either given to the monster (RF_MIMIC_INV) or discarded.
263
+ *
264
+ * The port has no object oidx registry, so mon.mimickedObj is a nonzero
265
+ * presence marker (1); the live mon<->obj link is carried by
266
+ * obj.mimickingMIdx === mon.midx, which is what become_aware reads and the save
267
+ * format persists. C's list_object (oidx bookkeeping) is DEFERRED with the
268
+ * floor object list (game/floor.ts module docs). convert_depth_to_origin(
269
+ * c->depth) is the port's direct state.chunk.depth (matching mon-death.ts /
270
+ * effect-item.ts). Draws RNG exactly as upstream.
271
+ */
272
+ export function createMimickedObject(target: MimicTarget, mon: Monster): void {
273
+ const { reg, constants } = target.makeDeps;
274
+
275
+ /* Resolve a MonsterMimic (tval/sval names) to an object kind. Upstream
276
+ * resolves these to object_kind pointers at parse time; the port stores the
277
+ * names (mon/bind.ts) and looks them up here. */
278
+ const resolveKind = (m: { tval: string; sval: string }): ObjectKind => {
279
+ const tval = tvalFindIdx(m.tval);
280
+ const sval = tval >= 0 ? reg.lookupSval(tval, m.sval) : -1;
281
+ const kind = tval >= 0 ? reg.lookupKind(tval, sval) : null;
282
+ if (!kind) throw new Error(`mon: mimic kind ${m.tval}:${m.sval} not found`);
283
+ return kind;
284
+ };
285
+
286
+ /* Pick a random object kind to mimic (reservoir sample, i starts at 1). */
287
+ const kinds = mon.race.mimicKinds;
288
+ let kind = resolveKind(kinds[0] as { tval: string; sval: string });
289
+ let i = 1;
290
+ for (const mk of kinds) {
291
+ if (target.rng.oneIn(i)) kind = resolveKind(mk);
292
+ i++;
293
+ }
294
+
295
+ let obj: GameObject;
296
+ if (tvalIsMoney(kind.tval)) {
297
+ obj = makeGold(target.rng, target.makeDeps, target.depth, kind.name);
298
+ } else {
299
+ obj = objectPrep(
300
+ target.rng,
301
+ reg,
302
+ constants,
303
+ kind,
304
+ mon.race.level,
305
+ "randomise",
306
+ );
307
+ applyMagic(
308
+ target.rng,
309
+ target.makeDeps,
310
+ obj,
311
+ mon.race.level,
312
+ true,
313
+ false,
314
+ false,
315
+ false,
316
+ target.depth,
317
+ );
318
+ obj.number = 1;
319
+ obj.origin = ORIGIN.DROP_MIMIC;
320
+ obj.originDepth = target.depth;
321
+ }
322
+
323
+ obj.mimickingMIdx = mon.midx;
324
+ mon.mimickedObj = 1;
325
+
326
+ /* Put the object on the floor if it goes, otherwise no mimicry. */
327
+ if (target.carry(mon.grid, obj)) {
328
+ /* list_object: oidx bookkeeping DEFERRED (game/floor.ts). */
329
+ } else {
330
+ /* Clear the mimicry. */
331
+ obj.mimickingMIdx = 0;
332
+ mon.mimickedObj = 0;
333
+
334
+ if (mon.race.flags.has(RF.MIMIC_INV)) {
335
+ /* Give the object to the monster if appropriate. */
336
+ monsterCarry(mon.heldObj, obj, mon.midx);
337
+ }
338
+ /* Otherwise object_delete: drop the reference (no pile to excise). */
339
+ }
340
+ }
341
+
342
+ /**
343
+ * Live-cave mon_create_mimicked_object: a thin wrapper that binds the running
344
+ * GameState to the shared, GameState-free createMimickedObject core. The carry
345
+ * is the live floor_carry (no RNG), so this stays byte- and RNG-identical to
346
+ * the pre-refactor function for every live-placed mimic.
347
+ */
348
+ export function monCreateMimickedObject(
349
+ state: GameState,
350
+ mon: Monster,
351
+ deps: MimicDeps,
352
+ ): void {
353
+ createMimickedObject(
354
+ {
355
+ depth: state.chunk.depth,
356
+ rng: state.rng,
357
+ makeDeps: deps.makeDeps,
358
+ carry: (grid, obj) => floorCarry(state, grid, obj, deps.floorEnv),
359
+ },
360
+ mon,
361
+ );
362
+ }
363
+
364
+ /**
365
+ * place_new_monster_one on the live cave: legality checks, monster
366
+ * construction (shared RNG order) and placement.
367
+ */
368
+ export function placeNewMonsterOne(
369
+ state: GameState,
370
+ grid: Loc,
371
+ race: MonsterRace,
372
+ sleep: boolean,
373
+ info: MonsterGroupInfo,
374
+ deps: MonPlaceDeps,
375
+ origin: number = ORIGIN.DROP,
376
+ ): boolean {
377
+ if (!state.chunk.inBounds(grid)) return false;
378
+
379
+ /* Not where monsters already are. */
380
+ if (squareMonster(state, grid)) return false;
381
+
382
+ /* Not where the player already is. */
383
+ if (locEq(state.actor.grid, grid)) return false;
384
+
385
+ /* Prevent monsters from being placed where they cannot walk. */
386
+ if (!state.chunk.isPassable(grid)) return false;
387
+
388
+ /* No creation on glyphs or the decoy. */
389
+ if (deps.preds?.isWarded(grid)) return false;
390
+ if (state.decoy && locEq(state.decoy, grid)) return false;
391
+
392
+ /* "unique" monsters must be "unique". */
393
+ if (race.flags.has(RF.UNIQUE) && race.curNum >= race.maxNum) return false;
394
+
395
+ /* Depth monsters may NOT be created out of depth. */
396
+ if (race.flags.has(RF.FORCE_DEPTH) && state.chunk.depth < race.level) {
397
+ return false;
398
+ }
399
+
400
+ /* Add to level feeling, note uniques for cheaters (mon-make.c
401
+ * L1112-1126). See the module docstring: harmless post-gen bookkeeping. */
402
+ state.chunk.addToMonsterRating(race.level * race.level);
403
+ /* cheat_hear (mon-make.c:1116-1128): the option is in scope per the
404
+ * exact-parity mandate, and it announces every out-of-depth spawn and every
405
+ * unique as it is placed. Nothing reported through it before. */
406
+ const cheatHear = state.options?.get("cheat_hear") ?? false;
407
+ if (race.level > state.chunk.depth) {
408
+ if (cheatHear) {
409
+ state.msg?.(
410
+ race.flags.has(RF.UNIQUE)
411
+ ? `Deep unique (${race.name}).`
412
+ : `Deep monster (${race.name}).`,
413
+ );
414
+ }
415
+ state.chunk.addToMonsterRating(
416
+ (race.level - state.chunk.depth) * race.level * race.level,
417
+ );
418
+ } else if (race.flags.has(RF.UNIQUE) && cheatHear) {
419
+ state.msg?.(`Unique (${race.name}).`);
420
+ }
421
+
422
+ const mon = createMonster(state.rng, race, {
423
+ sleep,
424
+ moveEnergy: state.z.moveEnergy,
425
+ groupIndex: info.index,
426
+ groupRole: info.role,
427
+ });
428
+ /* mon-make.c L1017-1018: no free slot means no monster. */
429
+ return placeMonsterLive(state, grid, mon, deps, origin) !== 0;
430
+ }
431
+
432
+ /**
433
+ * place_new_monster_group: puddle up to `total` monsters of one race around
434
+ * grid, breadth first over the 8 neighbours of each placed monster.
435
+ */
436
+ function placeNewMonsterGroup(
437
+ state: GameState,
438
+ grid: Loc,
439
+ race: MonsterRace,
440
+ sleep: boolean,
441
+ info: MonsterGroupInfo,
442
+ total: number,
443
+ deps: MonPlaceDeps,
444
+ origin: number,
445
+ ): boolean {
446
+ total = Math.min(total, deps.groupMax ?? 25);
447
+
448
+ /* Start on the monster. */
449
+ const locList: Loc[] = [grid];
450
+
451
+ /* Puddle monsters, breadth first, up to total. */
452
+ for (let n = 0; n < locList.length && locList.length < total; n++) {
453
+ for (let i = 0; i < 8 && locList.length < total; i++) {
454
+ const tryGrid = locSum(locList[n] as Loc, DDGRID_DDD[i] as Loc);
455
+
456
+ /* Walls and monsters block flow. */
457
+ if (!squareIsEmptyLive(state, tryGrid, deps.preds)) continue;
458
+
459
+ if (placeNewMonsterOne(state, tryGrid, race, sleep, info, deps, origin)) {
460
+ locList.push(tryGrid);
461
+ }
462
+ }
463
+ }
464
+ return true;
465
+ }
466
+
467
+ /** place_friends: place a friend or escort race near the original monster. */
468
+ function placeFriends(
469
+ state: GameState,
470
+ grid: Loc,
471
+ race: MonsterRace,
472
+ friendsRace: MonsterRace,
473
+ total: number,
474
+ sleep: boolean,
475
+ info: MonsterGroupInfo,
476
+ deps: MonPlaceDeps,
477
+ origin: number,
478
+ ): boolean {
479
+ /* Find the difference between current dungeon depth and monster level. */
480
+ const levelDifference = state.chunk.depth - friendsRace.level + 5;
481
+
482
+ /* Handle unique monsters. */
483
+ const isUnique = friendsRace.flags.has(RF.UNIQUE);
484
+
485
+ /* Make sure the unique hasn't been killed already. */
486
+ if (isUnique && friendsRace.curNum >= friendsRace.maxNum) return false;
487
+
488
+ /* More than 4 levels OoD, no groups allowed. */
489
+ if (levelDifference <= 0 && !isUnique) return false;
490
+
491
+ /* Reduce group size within 5 levels of natural depth. */
492
+ if (levelDifference < 10 && !isUnique) {
493
+ const extraChance = (total * levelDifference) % 10;
494
+ total = Math.trunc((total * levelDifference) / 10);
495
+
496
+ /* Instead of flooring the group value, we use the decimal place
497
+ * as a chance of an extra monster. */
498
+ if (state.rng.randint0(10) > extraChance) total += 1;
499
+ }
500
+
501
+ if (total > 0) {
502
+ /* Handle friends same as original monster. */
503
+ if (race.ridx === friendsRace.ridx) {
504
+ return placeNewMonsterGroup(
505
+ state,
506
+ grid,
507
+ race,
508
+ sleep,
509
+ info,
510
+ total,
511
+ deps,
512
+ origin,
513
+ );
514
+ }
515
+
516
+ /* Find a nearby place to put the other groups. */
517
+ const spots = scatterExt(
518
+ state.chunk,
519
+ state.rng,
520
+ 1,
521
+ grid,
522
+ deps.groupDist ?? 5,
523
+ false,
524
+ (_c, gr) => squareIsOpenLive(state, gr),
525
+ );
526
+ if (spots.length > 0) {
527
+ const start = spots[0] as Loc;
528
+ /* Place the monsters. */
529
+ let success = placeNewMonsterOne(
530
+ state,
531
+ start,
532
+ friendsRace,
533
+ sleep,
534
+ info,
535
+ deps,
536
+ origin,
537
+ );
538
+ if (total > 1) {
539
+ success = placeNewMonsterGroup(
540
+ state,
541
+ start,
542
+ friendsRace,
543
+ sleep,
544
+ info,
545
+ total,
546
+ deps,
547
+ origin,
548
+ );
549
+ }
550
+ return success;
551
+ }
552
+ }
553
+
554
+ return false;
555
+ }
556
+
557
+ /**
558
+ * monster_group_index_new: the next free group slot on the live state
559
+ * (mon-group.ts owns the group model; this mirrors its allocator so the
560
+ * pre-allocated index and the one monsterGroupStart picks agree).
561
+ */
562
+ function nextGroupIndex(state: GameState): number {
563
+ for (let i = 1; i < state.groups.length; i++) {
564
+ if (!state.groups[i]) return i;
565
+ }
566
+ return Math.max(state.groups.length, 1);
567
+ }
568
+
569
+ /**
570
+ * place_new_monster: place a monster of the given race at the given
571
+ * location, with its friends and escorts when `groupOk` is set. The first
572
+ * monster of a fresh group is its leader.
573
+ */
574
+ export function placeNewMonster(
575
+ state: GameState,
576
+ grid: Loc,
577
+ race: MonsterRace,
578
+ sleep: boolean,
579
+ groupOk: boolean,
580
+ groupInfo: MonsterGroupInfo,
581
+ deps: MonPlaceDeps,
582
+ origin: number = ORIGIN.DROP,
583
+ ): boolean {
584
+ const info: MonsterGroupInfo = { ...groupInfo };
585
+
586
+ /* If we don't have a group index already, make one; our first monster
587
+ * will be the leader. */
588
+ if (!info.index) info.index = nextGroupIndex(state);
589
+
590
+ /* Place one monster, or fail. */
591
+ if (!placeNewMonsterOne(state, grid, race, sleep, info, deps, origin)) {
592
+ return false;
593
+ }
594
+
595
+ /* We're done unless the group flag is set. */
596
+ if (!groupOk) return true;
597
+
598
+ /* Go through friends flags. */
599
+ for (const friends of race.friends) {
600
+ if (state.rng.randint0(100) >= friends.percentChance) continue;
601
+
602
+ /* Calculate the base number of monsters to place. */
603
+ const total = state.rng.damroll(friends.numberDice, friends.numberSide);
604
+
605
+ /* Set group role. */
606
+ info.role = friends.role;
607
+
608
+ /* Place them. */
609
+ if (friends.race) {
610
+ placeFriends(
611
+ state,
612
+ grid,
613
+ race,
614
+ friends.race,
615
+ total,
616
+ sleep,
617
+ info,
618
+ deps,
619
+ origin,
620
+ );
621
+ }
622
+ }
623
+
624
+ /* Go through the friends_base flags. */
625
+ for (const friendsBase of race.friendsBase) {
626
+ /* Check if we pass chance for the monster appearing. */
627
+ if (state.rng.randint0(100) >= friendsBase.percentChance) continue;
628
+
629
+ const total = state.rng.damroll(
630
+ friendsBase.numberDice,
631
+ friendsBase.numberSide,
632
+ );
633
+
634
+ /* Prepare allocation table for the escort base (no uniques). */
635
+ deps.table.prep(
636
+ (r) => r.base === friendsBase.base && !r.flags.has(RF.UNIQUE),
637
+ );
638
+
639
+ /* Pick a random race, then reset the allocation table. */
640
+ const friendsRace = deps.table.getMonNum(
641
+ state.rng,
642
+ race.level,
643
+ state.chunk.depth,
644
+ );
645
+ deps.table.prep(null);
646
+
647
+ /* Handle failure. */
648
+ if (!friendsRace) break;
649
+
650
+ /* Set group role. */
651
+ info.role = friendsBase.role;
652
+
653
+ /* Place them. */
654
+ placeFriends(
655
+ state,
656
+ grid,
657
+ race,
658
+ friendsRace,
659
+ total,
660
+ sleep,
661
+ info,
662
+ deps,
663
+ origin,
664
+ );
665
+ }
666
+
667
+ return true;
668
+ }
669
+
670
+ /**
671
+ * multiply_monster (mon-make.c L983): a breeder tries to spawn a copy of
672
+ * itself in a nearby empty grid. Returns true on a successful spawn.
673
+ *
674
+ * RNG order is preserved exactly: monster_is_shape_unique short-circuits
675
+ * before any draw (uniques never multiply and never touch the stream), then
676
+ * scatter_ext draws (distance 1, needs LOS, square_isempty), then
677
+ * place_new_monster (groupOk = false, so no friends/escort table draws - only
678
+ * createMonster's sleep/hp/speed/energy/attr draws). Fixing so multiplying a
679
+ * revealed camouflaged monster creates another revealed camouflaged monster
680
+ * (mon-move.c L1002-1011) draws no RNG - it just looks up the child that was
681
+ * placed a moment ago via square_monster, exactly as upstream does.
682
+ */
683
+ export function multiplyMonster(
684
+ state: GameState,
685
+ mon: Monster,
686
+ deps: MonPlaceDeps,
687
+ ): boolean {
688
+ /* Uniques can never multiply - tested before any RNG is drawn. */
689
+ if (monsterIsShapeUnique(mon)) return false;
690
+
691
+ /* Pick an empty location adjacent to the breeder. */
692
+ const spots = scatterExt(
693
+ state.chunk,
694
+ state.rng,
695
+ 1,
696
+ mon.grid,
697
+ 1,
698
+ true,
699
+ (_c, g) => squareIsEmptyLive(state, g, deps.preds),
700
+ );
701
+ if (spots.length === 0) return false;
702
+
703
+ /* Create a new monster (awake, no groups). */
704
+ const info: MonsterGroupInfo = { index: 0, role: MON_GROUP.LEADER };
705
+ const grid = spots[0] as Loc;
706
+ const result = placeNewMonster(
707
+ state,
708
+ grid,
709
+ mon.race,
710
+ false,
711
+ false,
712
+ info,
713
+ deps,
714
+ /* multiply_monster (mon-move.c L999-1000): breeder spawns carry
715
+ * ORIGIN_DROP_BREED. */
716
+ ORIGIN.DROP_BREED,
717
+ );
718
+
719
+ if (result) {
720
+ const child = squareMonster(state, grid);
721
+ if (child && monsterIsCamouflaged(child) && !monsterIsCamouflaged(mon)) {
722
+ state.becomeAware?.(child);
723
+ }
724
+ }
725
+
726
+ return result;
727
+ }
728
+
729
+ /** pick_and_place_monster: place an appropriate monster (and group) at grid. */
730
+ export function pickAndPlaceMonster(
731
+ state: GameState,
732
+ grid: Loc,
733
+ depth: number,
734
+ sleep: boolean,
735
+ groupOkay: boolean,
736
+ deps: MonPlaceDeps,
737
+ origin: number = ORIGIN.DROP,
738
+ ): boolean {
739
+ const race = deps.table.getMonNum(state.rng, depth, state.chunk.depth);
740
+ if (!race) return false;
741
+ const info: MonsterGroupInfo = { index: 0, role: MON_GROUP.LEADER };
742
+ return placeNewMonster(state, grid, race, sleep, groupOkay, info, deps, origin);
743
+ }
744
+
745
+ /**
746
+ * pick_and_place_distant_monster (mon-make.c L1483): pick a monster race and
747
+ * place it on a naked floor grid at least `dis` away from `toAvoid`, allowing
748
+ * groups. Up to 10000 attempts, each drawing randint0(width) THEN
749
+ * randint0(height) (x before y - a chosen canonical order; C leaves the two
750
+ * argument evaluations unspecified and the port targets its own save
751
+ * determinism, not binary C-save compatibility). In a running game
752
+ * character_dungeon is true, so the "no random monsters in marked rooms" test
753
+ * is skipped. Returns whether a monster was placed.
754
+ */
755
+ export function pickAndPlaceDistantMonster(
756
+ state: GameState,
757
+ toAvoid: Loc,
758
+ dis: number,
759
+ sleep: boolean,
760
+ depth: number,
761
+ deps: MonPlaceDeps,
762
+ ): boolean {
763
+ let grid: Loc = toAvoid;
764
+ let attemptsLeft = 10000;
765
+
766
+ /* Find a legal, distant, unoccupied space. */
767
+ while (--attemptsLeft) {
768
+ /* Pick a location (x drawn before y). */
769
+ const x = state.rng.randint0(state.chunk.width);
770
+ const y = state.rng.randint0(state.chunk.height);
771
+ grid = { x, y };
772
+
773
+ /* Require "naked" floor grid. */
774
+ if (!squareIsEmptyLive(state, grid, deps.preds)) continue;
775
+
776
+ /* Accept far away grids. */
777
+ if (distance(grid, toAvoid) > dis) break;
778
+ }
779
+
780
+ if (!attemptsLeft) {
781
+ /* mon-make.c:1507-1509: the cheat options report a failed allocation. */
782
+ if (
783
+ (state.options?.get("cheat_xtra") ?? false) ||
784
+ (state.options?.get("cheat_hear") ?? false)
785
+ ) {
786
+ state.msg?.("Warning! Could not allocate a new monster.");
787
+ }
788
+ return false;
789
+ }
790
+
791
+ /* Attempt to place the monster, allow groups. */
792
+ return pickAndPlaceMonster(state, grid, depth, sleep, true, deps);
793
+ }
794
+
795
+ /* ------------------------------------------------------------------ *
796
+ * mon-summon.c world half.
797
+ * ------------------------------------------------------------------ */
798
+
799
+ /** Everything summon_specific needs beyond the placement deps. */
800
+ export interface SummonDeps extends MonPlaceDeps {
801
+ /** The bound summon table (mon/summon.ts). */
802
+ summons: SummonTable;
803
+ /** cave->mon_current: the summoner, whose group summons join (0 = none). */
804
+ monCurrent?: number;
805
+ /** The kin base for S_KIN (the summoner's race base). */
806
+ kinBase?: MonsterBase | null;
807
+ }
808
+
809
+ /**
810
+ * can_call_monster: alive, eligible for the summon type, and NOT in line
811
+ * of sight of the summon point.
812
+ */
813
+ function canCallMonster(
814
+ state: GameState,
815
+ grid: Loc,
816
+ mon: Monster,
817
+ type: number,
818
+ deps: SummonDeps,
819
+ ): boolean {
820
+ if (!summonSpecificOkay(deps.summons, type, mon.race, deps.kinBase ?? null)) {
821
+ return false;
822
+ }
823
+ return !los(state.chunk, grid, mon.grid);
824
+ }
825
+
826
+ /**
827
+ * call_monster: move an eligible off-screen monster to the summon point,
828
+ * wake it and zero its energy. Returns its race level, or 0.
829
+ */
830
+ function callMonster(
831
+ state: GameState,
832
+ grid: Loc,
833
+ type: number,
834
+ deps: SummonDeps,
835
+ ): number {
836
+ const eligible: number[] = [];
837
+ const max = monsterMax(state);
838
+ for (let i = 1; i < max; i++) {
839
+ const mon = state.monsters[i];
840
+ if (!mon) continue;
841
+ if (canCallMonster(state, grid, mon, type, deps)) eligible.push(i);
842
+ }
843
+
844
+ /* There were no good monsters on the level. */
845
+ if (eligible.length === 0) return 0;
846
+
847
+ /* Pick one (upstream rolls randint0(count - 1), quirk preserved). */
848
+ const choice = state.rng.randint0(eligible.length - 1);
849
+ const mon = state.monsters[eligible[choice] as number] as Monster;
850
+
851
+ /* Swap the monster. */
852
+ monsterSwap(state, mon.grid, grid);
853
+
854
+ /* Wake it up, make it aware. */
855
+ monsterWake(state.rng, mon, false, 100);
856
+
857
+ /* Set its energy to 0. */
858
+ mon.energy = 0;
859
+
860
+ return mon.race.level;
861
+ }
862
+
863
+ /**
864
+ * summon_specific: place a monster of the given summon type near the grid,
865
+ * trying progressively wider scatters (1..4). Returns the summoned
866
+ * monster's race level iff a monster was actually summoned.
867
+ */
868
+ export function summonSpecific(
869
+ state: GameState,
870
+ grid: Loc,
871
+ lev: number,
872
+ type: number,
873
+ delay: boolean,
874
+ call: boolean,
875
+ deps: SummonDeps,
876
+ ): number {
877
+ /* Look for a location, allow up to 4 squares away. */
878
+ let near: Loc | null = null;
879
+ for (let d = 1; d < 5; d++) {
880
+ const found = scatterExt(state.chunk, state.rng, 1, grid, d, true, (_c, g) =>
881
+ squareAllowsSummon(state, g, deps.preds),
882
+ );
883
+ if (found.length > 0) {
884
+ near = found[0] as Loc;
885
+ break;
886
+ }
887
+ }
888
+
889
+ /* Failure. */
890
+ if (!near) return 0;
891
+
892
+ /* Use the new calling scheme if requested. */
893
+ if (
894
+ call &&
895
+ type !== deps.summons.nameToIdx("UNIQUE") &&
896
+ type !== deps.summons.nameToIdx("WRAITH")
897
+ ) {
898
+ return callMonster(state, near, type, deps);
899
+ }
900
+
901
+ /* Prepare allocation table. */
902
+ deps.table.prep((race) =>
903
+ summonSpecificOkay(deps.summons, type, race, deps.kinBase ?? null),
904
+ );
905
+
906
+ /* Pick a monster, using the level calculation. */
907
+ const race = deps.table.getMonNum(
908
+ state.rng,
909
+ Math.trunc((state.chunk.depth + lev) / 2) + 5,
910
+ state.chunk.depth,
911
+ );
912
+
913
+ /* Prepare allocation table. */
914
+ deps.table.prep(null);
915
+
916
+ /* Handle failure. */
917
+ if (!race) return 0;
918
+
919
+ /* Put summons in the group of any summoner. */
920
+ const info: MonsterGroupInfo = { index: 0, role: MON_GROUP.MEMBER };
921
+ if (deps.monCurrent && deps.monCurrent > 0) {
922
+ const group = summonGroup(state, deps.monCurrent);
923
+ if (group) {
924
+ info.index = group.index;
925
+ info.role = MON_GROUP.SUMMON as MonsterGroupRole;
926
+ }
927
+ }
928
+
929
+ /* Attempt to place the monster (awake, don't allow groups). Summons carry
930
+ * ORIGIN_DROP_SUMMON (mon-summon.c L449-450). */
931
+ if (!placeNewMonster(state, near, race, false, false, info, deps, ORIGIN.DROP_SUMMON)) {
932
+ return 0;
933
+ }
934
+
935
+ /* Success: the monster is on the summon grid. */
936
+ const mon = squareMonster(state, near) as Monster;
937
+
938
+ /* If delay, try to let the player act before the summoned monsters,
939
+ * including holding faster monsters for the required number of turns. */
940
+ if (delay) {
941
+ const pEPerTurn = turnEnergy(state.actor.speed, state.z.moveEnergy);
942
+ const mEPerTurn = turnEnergy(mon.mspeed, state.z.moveEnergy);
943
+ /*
944
+ * Number of turns for the player to move from zero energy is
945
+ * move_energy / p_e_per_turn; for the monster, move_energy /
946
+ * m_e_per_turn. Hold the monster for the difference, rounding up.
947
+ */
948
+ const turns = Math.trunc(
949
+ (state.z.moveEnergy * (mEPerTurn - pEPerTurn) + mEPerTurn * pEPerTurn - 1) /
950
+ (mEPerTurn * pEPerTurn),
951
+ );
952
+
953
+ mon.energy = 0;
954
+ if (turns > 0) {
955
+ /* Set timer directly to avoid resistance. */
956
+ mon.mTimed[MON_TMD.HOLD] = Math.min(turns, 32767);
957
+ }
958
+ }
959
+
960
+ return mon.race.level;
961
+ }
962
+
963
+ /**
964
+ * select_shape: a race for a monster shapechange, drawn from the summon
965
+ * type's eligible races at the current depth (+5).
966
+ */
967
+ export function selectShape(
968
+ state: GameState,
969
+ type: number,
970
+ deps: SummonDeps,
971
+ ): MonsterRace | null {
972
+ deps.table.prep((race) =>
973
+ summonSpecificOkay(deps.summons, type, race, deps.kinBase ?? null),
974
+ );
975
+ const race = deps.table.getMonNum(
976
+ state.rng,
977
+ state.chunk.depth + 5,
978
+ state.chunk.depth,
979
+ );
980
+ deps.table.prep(null);
981
+ return race;
982
+ }
983
+
984
+ /**
985
+ * wipe_mon_list's racial-count half: forget every live monster's racial
986
+ * occurrence before the level's monster list is discarded. The session's
987
+ * level change calls this so cur_num stays balanced across levels.
988
+ */
989
+ export function wipeMonsterCounts(state: GameState): void {
990
+ for (let i = 1; i < state.monsters.length; i++) {
991
+ const mon = state.monsters[i];
992
+ if (!mon) continue;
993
+ const race = mon.originalRace ?? mon.race;
994
+ if (race.curNum > 0) race.curNum--;
995
+ }
996
+ }
997
+
998
+ /**
999
+ * Re-count racial occurrences from a freshly populated monster list, and
1000
+ * rebuild cave->num_repro (mon-make.c wipe_mon_list sets it to 0 at wipe; the
1001
+ * generated / loaded breeders are counted here so the reproduction cap sees
1002
+ * every RF_MULTIPLY monster on the level, not only mid-game arrivals).
1003
+ */
1004
+ export function countMonsterRaces(state: GameState): void {
1005
+ state.numRepro = 0;
1006
+ for (let i = 1; i < state.monsters.length; i++) {
1007
+ const mon = state.monsters[i];
1008
+ if (!mon) continue;
1009
+ (mon.originalRace ?? mon.race).curNum++;
1010
+ if (mon.race.flags.has(RF.MULTIPLY)) state.numRepro++;
1011
+ }
1012
+ }