@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,787 @@
1
+ /**
2
+ * Namespaced save blocks: the mod-lifecycle tiers layered over the flat JSON
3
+ * save (MOD_LIFECYCLE.md section 1, P7 phase 2).
4
+ *
5
+ * Phase 1 (mod/ids.ts) made every content cross-reference a namespaced string
6
+ * id. Phase 2 adds the three tiers the lifecycle design calls for on top of
7
+ * that:
8
+ *
9
+ * - The MANIFEST block (SaveManifest): the exact pack set that produced the
10
+ * save - each pack's id/version (+ optional hash/source) and the resolved
11
+ * load order - plus the core-owned determinism mode. This is the save's
12
+ * profile fingerprint, and it travels WITH the save so a load can tell which
13
+ * content is missing and whether the run is still reproducible.
14
+ * - Per-mod BAGS (mod:<id>): one opaque JSON bag per mod, versioned by the
15
+ * mod's saveSchema. The engine never interprets a bag; a scripted plugin
16
+ * persists whatever it likes and is the only thing that reads it back. A mod
17
+ * update migrates its OWN bag (migrateModBag); core never participates.
18
+ * - The ORPHANS store (orphans:<id>@<version>): entities whose defining pack is
19
+ * missing or shadowed are QUARANTINED here - frozen, inert, removed from
20
+ * active play, but preserved verbatim - instead of being deleted or crashing
21
+ * the load. Reinstall the pack (same major) and rehydrateSave puts them back.
22
+ *
23
+ * The determinism mode is a core-owned one-way ratchet (MOD_LIFECYCLE section
24
+ * 4, PORT_PLAN decision 22): a save starts "deterministic"; the first time a
25
+ * nondeterministic mod is enabled on it, core flips it to "nondeterministic"
26
+ * IRREVERSIBLY. Removing the mod never restores deterministic mode. Mods can
27
+ * trip the flip but can never reverse or prevent it.
28
+ *
29
+ * Everything here is pure and deterministic over the plain-JSON save: quarantine
30
+ * and rehydrate are read-time transforms of the SavedGame, so the on-disk
31
+ * FORMAT (the optional blocks below) is the load-bearing part that lands now,
32
+ * while the quarantine ALGORITHM can be refined later without a format change.
33
+ *
34
+ * SCOPE (documented, not silent): quarantine operates at whole-entity
35
+ * granularity keyed on each entity's PRIMARY definition id - a monster's race,
36
+ * an object's kind, a trap's kind, a lore record's race, a created-artifact id -
37
+ * which is the "a whole frost:frost-wyrm on the level" / "an item whose
38
+ * definition came from the missing mod" case the design centres on. This sweep
39
+ * covers every id-bearing collection a real SavedGame can carry that entity in:
40
+ * the live level (monsters + held objects, gear store / pack / equipment, floor
41
+ * piles, traps, lore, created artifacts) AND the birth_levels_persist
42
+ * frozen-level cache (save.levelCache), whose stored levels carry the same
43
+ * monster / held-object / floor / trap collections - a mod entity frozen there
44
+ * would otherwise reach deserializeLevelCache on load and throw (D1). Terrain
45
+ * features (the chunk feat grid / legend) are deliberately NOT quarantined:
46
+ * removing a terrain cell would tear a hole in the map, so a mod feature is a
47
+ * separate hard-incompatibility concern, not a quarantine case. Finer
48
+ * sub-property granularity (a mod ego or brand on an otherwise-core object, a
49
+ * mod origin-race on a core object) degrades to the base entity and is a
50
+ * documented follow-up. The player-facing recoveries built ON TOP of this store
51
+ * (stranded characters returning to town, mod items surfaced in the home, the
52
+ * stash view) are P-UI work per MOD_LIFECYCLE section 6 step 2.
53
+ */
54
+
55
+ import { parseId } from "./ids.js";
56
+ import { ENGINE_VERSION } from "../version.js";
57
+ import type { SavedGame } from "../session/save.js";
58
+
59
+ /* ------------------------------------------------------------------ *
60
+ * Value shapes.
61
+ * ------------------------------------------------------------------ */
62
+
63
+ /** A plain JSON value - the shape of an opaque mod bag and an orphan payload. */
64
+ export type JsonValue =
65
+ | null
66
+ | boolean
67
+ | number
68
+ | string
69
+ | JsonValue[]
70
+ | { [key: string]: JsonValue };
71
+
72
+ /**
73
+ * The core-owned determinism mode carried by every save. A one-way ratchet:
74
+ * "deterministic" -> "nondeterministic" only, never back (see advanceDeterminism).
75
+ */
76
+ export type DeterminismMode = "deterministic" | "nondeterministic";
77
+
78
+ /** One pack in the manifest: its identity and where it came from. */
79
+ export interface SavePackRef {
80
+ /** Namespace / pack id, e.g. "core", "frost". */
81
+ id: string;
82
+ /** Semver version string, e.g. "1.2.0". */
83
+ version: string;
84
+ /** Content hash of the pack that produced the save (optional). */
85
+ hash?: string;
86
+ /** Source (git URL + ref, or marketplace id) the pack was installed from. */
87
+ source?: string;
88
+ }
89
+
90
+ /**
91
+ * The manifest block: the exact pack set + resolved load order + determinism
92
+ * mode that produced the save. The save's profile fingerprint.
93
+ */
94
+ export interface SaveManifest {
95
+ /** Every pack that contributed, keyed by id (order not significant here). */
96
+ packs: SavePackRef[];
97
+ /** The resolved load order (last-in-wins), pack ids in application order. */
98
+ loadOrder: string[];
99
+ /** The core-owned determinism mode (one-way ratchet). */
100
+ determinism: DeterminismMode;
101
+ /** True once a gameplay-affecting mod has made this save permanently non-scoring. */
102
+ modNoscore: boolean;
103
+ }
104
+
105
+ /**
106
+ * One mod's private save bag: opaque data the engine never interprets, tagged
107
+ * with the saveSchema version that wrote it so the mod can migrate its own bag.
108
+ */
109
+ export interface ModBag {
110
+ /** The mod's saveSchema number when this bag was written. */
111
+ schema: number;
112
+ /** Whatever the mod chose to persist. Never read by core. */
113
+ data: JsonValue;
114
+ }
115
+
116
+ /** The kind of entity an orphan payload holds (drives rehydration placement). */
117
+ export type OrphanKind =
118
+ | "monster"
119
+ | "heldObject"
120
+ | "gearObject"
121
+ | "floorObject"
122
+ | "trap"
123
+ | "lore"
124
+ | "artifactCreated"
125
+ /* The birth_levels_persist frozen-level cache mirrors the live level's
126
+ * id-bearing collections (a mod entity can hide there too), so it gets its
127
+ * own quarantine/rehydrate. These carry the cache DEPTH in their locus. */
128
+ | "cacheMonster"
129
+ | "cacheHeldObject"
130
+ | "cacheFloorObject"
131
+ | "cacheTrap";
132
+
133
+ /** One quarantined entity: frozen verbatim, tagged for the stash view + rehydrate. */
134
+ export interface OrphanEntry {
135
+ /** Which collection it came from (drives where rehydrateSave puts it back). */
136
+ kind: OrphanKind;
137
+ /** The content id that could not resolve ("what it is" in the stash view). */
138
+ ref: string;
139
+ /** The original serialized payload, verbatim, for exact rehydration. */
140
+ data: JsonValue;
141
+ /** Where it lived, so rehydrate can restore its position. */
142
+ locus: JsonValue;
143
+ }
144
+
145
+ /**
146
+ * The orphans store, keyed "<namespace>@<version>" - the pack (at the version
147
+ * that produced the save) whose absence quarantined these entities. Reinstalling
148
+ * that pack (same major) is what rehydrates them.
149
+ */
150
+ export type OrphanStore = Record<string, OrphanEntry[]>;
151
+
152
+ /* ------------------------------------------------------------------ *
153
+ * The base game as pack zero.
154
+ * ------------------------------------------------------------------ */
155
+
156
+ /**
157
+ * The base game's pack version: pack zero's version in the save manifest.
158
+ *
159
+ * It used to be its own string literal, "kept in sync with
160
+ * packages/core/package.json" by hand, and was not - core moved to 0.9.0 while
161
+ * every new save went on recording core as 0.1.0. Core DOES have a runtime
162
+ * version constant (version.ts, deliberately outside the barrel so citing it
163
+ * makes no cycle), so it cites that instead.
164
+ *
165
+ * Changing it does not invalidate an older save: orphanedNamespaces skips the
166
+ * core pack outright, and versionMap's versions are only ever used to key
167
+ * quarantined MOD entities. An existing save keeps whatever it recorded.
168
+ */
169
+ export const CORE_PACK_VERSION = ENGINE_VERSION;
170
+
171
+ /** A core-only manifest: the base game with no mods, deterministic. */
172
+ export function coreOnlyManifest(): SaveManifest {
173
+ return {
174
+ packs: [{ id: "core", version: CORE_PACK_VERSION }],
175
+ loadOrder: ["core"],
176
+ determinism: "deterministic",
177
+ modNoscore: false,
178
+ };
179
+ }
180
+
181
+ /* ------------------------------------------------------------------ *
182
+ * Determinism ratchet (core-owned, one-way).
183
+ * ------------------------------------------------------------------ */
184
+
185
+ /**
186
+ * Advance the determinism mode (MOD_LIFECYCLE section 4). The flip to
187
+ * "nondeterministic" is irreversible: once a save is nondeterministic it stays
188
+ * so regardless of the argument, so removing a mod can never "cleanse" a save
189
+ * back to deterministic. Enabling a nondeterministic mod on a still-deterministic
190
+ * save flips it once, seamlessly.
191
+ */
192
+ export function advanceDeterminism(
193
+ current: DeterminismMode,
194
+ enablingNondeterministicMod: boolean,
195
+ ): DeterminismMode {
196
+ if (current === "nondeterministic") return "nondeterministic";
197
+ return enablingNondeterministicMod ? "nondeterministic" : "deterministic";
198
+ }
199
+
200
+ /** Advance the permanent scoring ratchet for gameplay-affecting mods. */
201
+ export function advanceModNoscore(
202
+ current: boolean,
203
+ enablingGameplayMod: boolean,
204
+ ): boolean {
205
+ return current || enablingGameplayMod;
206
+ }
207
+
208
+ /* ------------------------------------------------------------------ *
209
+ * Mod-bag migration seam.
210
+ * ------------------------------------------------------------------ */
211
+
212
+ /** A mod's own bag migrator: old data + the schema it was written at -> new data. */
213
+ export type BagMigrator = (data: JsonValue, fromSchema: number) => JsonValue;
214
+
215
+ /**
216
+ * Migrate one mod bag to a target saveSchema (called at mod-load time when the
217
+ * mod's schema has advanced past the bag's). A no-op when the bag is already at
218
+ * or beyond the target; otherwise the mod's migrator rewrites its own data and
219
+ * the schema is stamped forward. Core never inspects `data`.
220
+ */
221
+ export function migrateModBag(
222
+ bag: ModBag,
223
+ targetSchema: number,
224
+ migrate: BagMigrator,
225
+ ): ModBag {
226
+ if (bag.schema >= targetSchema) return bag;
227
+ return { schema: targetSchema, data: migrate(bag.data, bag.schema) };
228
+ }
229
+
230
+ /* ------------------------------------------------------------------ *
231
+ * Compatibility assessment (which namespaces are orphaned).
232
+ * ------------------------------------------------------------------ */
233
+
234
+ /**
235
+ * Compare the pack set that produced a save against the packs present now, and
236
+ * return the namespaces whose content is orphaned (present in the save's
237
+ * manifest but not currently loaded). "core" is never orphaned - a save whose
238
+ * core is absent is an engine-incompatibility that the load rejects outright,
239
+ * not a quarantine case.
240
+ *
241
+ * The harder REFUSE-to-load gate (a still-enabled mod's REQUIRED dependency is
242
+ * missing) is the load-order resolver's job (mod-sdk resolveLoadOrder, phase 4);
243
+ * this function is only the save-side "what did this save use that is gone now".
244
+ */
245
+ export function orphanedNamespaces(
246
+ manifest: SaveManifest,
247
+ present: ReadonlySet<string>,
248
+ ): string[] {
249
+ const out: string[] = [];
250
+ for (const pack of manifest.packs) {
251
+ if (pack.id === "core") continue;
252
+ if (!present.has(pack.id)) out.push(pack.id);
253
+ }
254
+ return out;
255
+ }
256
+
257
+ /** The version each pack was at when the save was written (for orphan keys). */
258
+ function versionMap(manifest: SaveManifest): Map<string, string> {
259
+ const m = new Map<string, string>();
260
+ for (const pack of manifest.packs) m.set(pack.id, pack.version);
261
+ return m;
262
+ }
263
+
264
+ /* ------------------------------------------------------------------ *
265
+ * Orphan store helpers.
266
+ * ------------------------------------------------------------------ */
267
+
268
+ /** The total number of quarantined entities across the store (decision-8 count). */
269
+ export function orphanCount(store: OrphanStore | undefined): number {
270
+ if (!store) return 0;
271
+ let n = 0;
272
+ for (const entries of Object.values(store)) n += entries.length;
273
+ return n;
274
+ }
275
+
276
+ function orphanKey(namespace: string, version: string): string {
277
+ return `${namespace}@${version}`;
278
+ }
279
+
280
+ function stash(
281
+ store: OrphanStore,
282
+ namespace: string,
283
+ version: string,
284
+ entry: OrphanEntry,
285
+ ): void {
286
+ const key = orphanKey(namespace, version);
287
+ (store[key] ??= []).push(entry);
288
+ }
289
+
290
+ /** Merge two orphan stores (append, preserving order), returning a new store. */
291
+ function mergeOrphans(a: OrphanStore, b: OrphanStore): OrphanStore {
292
+ const out: OrphanStore = {};
293
+ for (const [k, v] of Object.entries(a)) out[k] = [...v];
294
+ for (const [k, v] of Object.entries(b)) out[k] = [...(out[k] ?? []), ...v];
295
+ return out;
296
+ }
297
+
298
+ /** The namespace of a content id, or null when it has none (malformed / bare). */
299
+ export function namespaceOf(id: string): string | null {
300
+ const parsed = parseId(id);
301
+ return parsed ? parsed.namespace : null;
302
+ }
303
+
304
+ function jsonClone<T>(value: T): T {
305
+ return JSON.parse(JSON.stringify(value)) as T;
306
+ }
307
+
308
+ /* ------------------------------------------------------------------ *
309
+ * Quarantine (prune a save's mod-owned entities into the orphans store).
310
+ * ------------------------------------------------------------------ */
311
+
312
+ /** The outcome of a quarantine pass. */
313
+ export interface QuarantineResult {
314
+ /** The save with orphaned entities removed and folded into `orphans`. */
315
+ save: SavedGame;
316
+ /** The merged orphan store (any pre-existing orphans + the newly quarantined). */
317
+ orphans: OrphanStore;
318
+ /** How many entities were newly quarantined THIS pass. */
319
+ quarantined: number;
320
+ }
321
+
322
+ /** Split an object list by whether each object's kind namespace is present. */
323
+ function partitionObjects<T extends { kindId: string }>(
324
+ objs: readonly T[],
325
+ present: (namespace: string) => boolean,
326
+ ): { kept: T[]; orphaned: Array<{ obj: T; ns: string }> } {
327
+ const kept: T[] = [];
328
+ const orphaned: Array<{ obj: T; ns: string }> = [];
329
+ for (const o of objs) {
330
+ const ns = namespaceOf(o.kindId);
331
+ if (ns !== null && !present(ns)) orphaned.push({ obj: o, ns });
332
+ else kept.push(o);
333
+ }
334
+ return { kept, orphaned };
335
+ }
336
+
337
+ /**
338
+ * Move every entity whose defining pack is absent into the orphans store,
339
+ * returning a pruned save whose remaining content all resolves against the
340
+ * present packs (so the normal deserializers never see a missing-mod id). Pure:
341
+ * the input save is not mutated. Any orphans already carried by the save are
342
+ * preserved and merged with the newly quarantined set.
343
+ *
344
+ * `present(namespace)` decides membership; `orphanedNamespaces` computes the
345
+ * missing set from the manifest, and the manifest supplies each pack's version
346
+ * for the orphan-store key.
347
+ */
348
+ export function quarantineSave(
349
+ save: SavedGame,
350
+ manifest: SaveManifest,
351
+ present: (namespace: string) => boolean,
352
+ ): QuarantineResult {
353
+ const out = jsonClone(save);
354
+ const versions = versionMap(manifest);
355
+ const versionOf = (ns: string): string => versions.get(ns) ?? "0.0.0";
356
+ const orphans: OrphanStore = {};
357
+ let quarantined = 0;
358
+
359
+ /* --- Monsters (whole instances) + their held objects + group repair. --- */
360
+ const removedMidx = new Set<number>();
361
+ const monsters = out.monsters;
362
+ for (const [i, m] of (monsters ?? []).entries()) {
363
+ if (!m) continue;
364
+ const rns = namespaceOf(m.raceId);
365
+ const ons = m.originalRaceId ? namespaceOf(m.originalRaceId) : null;
366
+ const missing =
367
+ rns !== null && !present(rns)
368
+ ? rns
369
+ : ons !== null && !present(ons)
370
+ ? ons
371
+ : null;
372
+ if (missing !== null) {
373
+ stash(orphans, missing, versionOf(missing), {
374
+ kind: "monster",
375
+ ref: m.raceId,
376
+ data: m as unknown as JsonValue,
377
+ locus: i,
378
+ });
379
+ monsters![i] = null;
380
+ removedMidx.add(m.midx);
381
+ quarantined++;
382
+ continue;
383
+ }
384
+ /* Kept monster (core race): prune any mod-owned held objects so a later
385
+ * deserialize does not hit a missing-mod kind. */
386
+ const { kept, orphaned } = partitionObjects(m.heldObj, present);
387
+ if (orphaned.length > 0) {
388
+ m.heldObj = kept;
389
+ for (const { obj, ns } of orphaned) {
390
+ stash(orphans, ns, versionOf(ns), {
391
+ kind: "heldObject",
392
+ ref: obj.kindId,
393
+ data: obj as unknown as JsonValue,
394
+ locus: { midx: m.midx },
395
+ });
396
+ quarantined++;
397
+ }
398
+ }
399
+ }
400
+ /* Repair groups: drop quarantined members; null a group whose leader left. */
401
+ if (removedMidx.size > 0 && out.groups) {
402
+ out.groups = out.groups.map((g) => {
403
+ if (!g) return g;
404
+ if (removedMidx.has(g.leader)) return null;
405
+ return { ...g, members: g.members.filter((mi) => !removedMidx.has(mi)) };
406
+ });
407
+ }
408
+
409
+ /* --- Gear objects (+ handle cleanup in pack and equipment). --- */
410
+ const removedHandles = new Set<number>();
411
+ const keptStore: SavedGame["gear"]["store"] = [];
412
+ for (const [h, o] of out.gear.store) {
413
+ const ns = namespaceOf(o.kindId);
414
+ if (ns !== null && !present(ns)) {
415
+ stash(orphans, ns, versionOf(ns), {
416
+ kind: "gearObject",
417
+ ref: o.kindId,
418
+ data: o as unknown as JsonValue,
419
+ locus: h,
420
+ });
421
+ removedHandles.add(h);
422
+ quarantined++;
423
+ } else {
424
+ keptStore.push([h, o]);
425
+ }
426
+ }
427
+ if (removedHandles.size > 0) {
428
+ out.gear = {
429
+ ...out.gear,
430
+ store: keptStore,
431
+ pack: out.gear.pack.filter((h) => !removedHandles.has(h)),
432
+ };
433
+ out.player = {
434
+ ...out.player,
435
+ equipment: out.player.equipment.map((h) =>
436
+ removedHandles.has(h) ? 0 : h,
437
+ ),
438
+ };
439
+ }
440
+
441
+ /* --- Floor piles (prune mod objects; drop emptied piles). --- */
442
+ if (out.floor) {
443
+ out.floor = out.floor
444
+ .map((pile) => {
445
+ const { kept, orphaned } = partitionObjects(pile.objs, present);
446
+ for (const { obj, ns } of orphaned) {
447
+ stash(orphans, ns, versionOf(ns), {
448
+ kind: "floorObject",
449
+ ref: obj.kindId,
450
+ data: obj as unknown as JsonValue,
451
+ locus: { x: pile.x, y: pile.y },
452
+ });
453
+ quarantined++;
454
+ }
455
+ return { ...pile, objs: kept };
456
+ })
457
+ .filter((pile) => pile.objs.length > 0);
458
+ }
459
+
460
+ /* --- Traps (prune mod trap kinds; drop emptied cells). --- */
461
+ if (out.traps) {
462
+ out.traps = out.traps
463
+ .map((cell) => {
464
+ const keptTraps: typeof cell.traps = [];
465
+ for (const t of cell.traps) {
466
+ const ns = namespaceOf(t.trapId);
467
+ if (ns !== null && !present(ns)) {
468
+ stash(orphans, ns, versionOf(ns), {
469
+ kind: "trap",
470
+ ref: t.trapId,
471
+ data: t as unknown as JsonValue,
472
+ locus: { x: cell.x, y: cell.y },
473
+ });
474
+ quarantined++;
475
+ } else {
476
+ keptTraps.push(t);
477
+ }
478
+ }
479
+ return { ...cell, traps: keptTraps };
480
+ })
481
+ .filter((cell) => cell.traps.length > 0);
482
+ }
483
+
484
+ /* --- Lore (keyed by race id). --- */
485
+ if (out.lore) {
486
+ const keptLore: NonNullable<SavedGame["lore"]> = [];
487
+ for (const [raceId, l] of out.lore) {
488
+ const ns = namespaceOf(raceId);
489
+ if (ns !== null && !present(ns)) {
490
+ stash(orphans, ns, versionOf(ns), {
491
+ kind: "lore",
492
+ ref: raceId,
493
+ data: l as unknown as JsonValue,
494
+ locus: raceId,
495
+ });
496
+ quarantined++;
497
+ } else {
498
+ keptLore.push([raceId, l]);
499
+ }
500
+ }
501
+ out.lore = keptLore;
502
+ }
503
+
504
+ /* --- Created-artifact ids. --- */
505
+ if (out.artifactsCreated) {
506
+ const keptArts: string[] = [];
507
+ for (const aid of out.artifactsCreated) {
508
+ const ns = namespaceOf(aid);
509
+ if (ns !== null && !present(ns)) {
510
+ stash(orphans, ns, versionOf(ns), {
511
+ kind: "artifactCreated",
512
+ ref: aid,
513
+ data: aid,
514
+ locus: aid,
515
+ });
516
+ quarantined++;
517
+ } else {
518
+ keptArts.push(aid);
519
+ }
520
+ }
521
+ out.artifactsCreated = keptArts;
522
+ }
523
+
524
+ /* --- Frozen-level cache (birth_levels_persist, #30). Each cached level
525
+ * carries the same id-bearing collections as the live level, so a mod entity
526
+ * can hide there exactly as on the live level. Quarantine each cached level
527
+ * the same way, tagging every orphan's locus with the cache DEPTH so rehydrate
528
+ * restores it to the right frozen level. Without this pass a mod monster /
529
+ * held object / floor object / trap frozen in the cache would survive
530
+ * quarantine and reach deserializeLevelCache on load, throwing on its
531
+ * unresolvable id (PORT_PLAN decision 19, MOD_LIFECYCLE section 6). --- */
532
+ if (out.levelCache) {
533
+ for (const level of out.levelCache) {
534
+ const depth = level.depth;
535
+ const cacheRemovedMidx = new Set<number>();
536
+ for (let i = 0; i < level.monsters.length; i++) {
537
+ const m = level.monsters[i];
538
+ if (!m) continue;
539
+ const rns = namespaceOf(m.raceId);
540
+ const ons = m.originalRaceId ? namespaceOf(m.originalRaceId) : null;
541
+ const missing =
542
+ rns !== null && !present(rns)
543
+ ? rns
544
+ : ons !== null && !present(ons)
545
+ ? ons
546
+ : null;
547
+ if (missing !== null) {
548
+ stash(orphans, missing, versionOf(missing), {
549
+ kind: "cacheMonster",
550
+ ref: m.raceId,
551
+ data: m as unknown as JsonValue,
552
+ locus: { depth, index: i },
553
+ });
554
+ level.monsters[i] = null;
555
+ cacheRemovedMidx.add(m.midx);
556
+ quarantined++;
557
+ continue;
558
+ }
559
+ const { kept, orphaned } = partitionObjects(m.heldObj, present);
560
+ if (orphaned.length > 0) {
561
+ m.heldObj = kept;
562
+ for (const { obj, ns } of orphaned) {
563
+ stash(orphans, ns, versionOf(ns), {
564
+ kind: "cacheHeldObject",
565
+ ref: obj.kindId,
566
+ data: obj as unknown as JsonValue,
567
+ locus: { depth, midx: m.midx },
568
+ });
569
+ quarantined++;
570
+ }
571
+ }
572
+ }
573
+ /* Same group repair as the live level: drop quarantined members, null a
574
+ * group whose leader left. (The rehydrate degradation - a restored cache
575
+ * monster does not rebuild its group - is the documented live-level one.) */
576
+ if (cacheRemovedMidx.size > 0) {
577
+ level.groups = level.groups.map((g) => {
578
+ if (!g) return g;
579
+ if (cacheRemovedMidx.has(g.leader)) return null;
580
+ return {
581
+ ...g,
582
+ members: g.members.filter((mi) => !cacheRemovedMidx.has(mi)),
583
+ };
584
+ });
585
+ }
586
+ level.floor = level.floor
587
+ .map((pile) => {
588
+ const { kept, orphaned } = partitionObjects(pile.objs, present);
589
+ for (const { obj, ns } of orphaned) {
590
+ stash(orphans, ns, versionOf(ns), {
591
+ kind: "cacheFloorObject",
592
+ ref: obj.kindId,
593
+ data: obj as unknown as JsonValue,
594
+ locus: { depth, x: pile.x, y: pile.y },
595
+ });
596
+ quarantined++;
597
+ }
598
+ return { ...pile, objs: kept };
599
+ })
600
+ .filter((pile) => pile.objs.length > 0);
601
+ level.traps = level.traps
602
+ .map((cell) => {
603
+ const keptTraps: typeof cell.traps = [];
604
+ for (const t of cell.traps) {
605
+ const ns = namespaceOf(t.trapId);
606
+ if (ns !== null && !present(ns)) {
607
+ stash(orphans, ns, versionOf(ns), {
608
+ kind: "cacheTrap",
609
+ ref: t.trapId,
610
+ data: t as unknown as JsonValue,
611
+ locus: { depth, x: cell.x, y: cell.y },
612
+ });
613
+ quarantined++;
614
+ } else {
615
+ keptTraps.push(t);
616
+ }
617
+ }
618
+ return { ...cell, traps: keptTraps };
619
+ })
620
+ .filter((cell) => cell.traps.length > 0);
621
+ }
622
+ }
623
+
624
+ const merged = mergeOrphans(out.orphans ?? {}, orphans);
625
+ if (orphanCount(merged) > 0) out.orphans = merged;
626
+ return { save: out, orphans: merged, quarantined };
627
+ }
628
+
629
+ /* ------------------------------------------------------------------ *
630
+ * Rehydrate (restore orphans whose pack is present again).
631
+ * ------------------------------------------------------------------ */
632
+
633
+ function reinsert(save: SavedGame, entry: OrphanEntry): boolean {
634
+ switch (entry.kind) {
635
+ case "monster": {
636
+ if (!save.monsters) return false;
637
+ const mon = entry.data as unknown as NonNullable<
638
+ NonNullable<SavedGame["monsters"]>[number]
639
+ >;
640
+ const idx = entry.locus as number;
641
+ /* Restore to its old slot when free, else append (a fresh slot). */
642
+ if (idx >= 0 && idx < save.monsters.length && save.monsters[idx] === null) {
643
+ save.monsters[idx] = mon;
644
+ } else {
645
+ save.monsters.push(mon);
646
+ }
647
+ return true;
648
+ }
649
+ case "heldObject": {
650
+ if (!save.monsters) return false;
651
+ const midx = (entry.locus as { midx: number }).midx;
652
+ const host = save.monsters.find((m) => m !== null && m.midx === midx);
653
+ if (!host) return false;
654
+ host.heldObj.push(entry.data as unknown as (typeof host.heldObj)[number]);
655
+ return true;
656
+ }
657
+ case "gearObject": {
658
+ const handle = entry.locus as number;
659
+ const obj = entry.data as unknown as SavedGame["gear"]["store"][number][1];
660
+ save.gear.store.push([handle, obj]);
661
+ /* Return to the pack: an inert re-equip is not attempted (the slot was
662
+ * cleared on quarantine), so a reinstalled item comes back carried. */
663
+ if (!save.gear.pack.includes(handle)) save.gear.pack.push(handle);
664
+ return true;
665
+ }
666
+ case "floorObject": {
667
+ if (!save.floor) return false;
668
+ const { x, y } = entry.locus as { x: number; y: number };
669
+ const obj = entry.data as unknown as NonNullable<
670
+ SavedGame["floor"]
671
+ >[number]["objs"][number];
672
+ const pile = save.floor.find((p) => p.x === x && p.y === y);
673
+ if (pile) pile.objs.push(obj);
674
+ else save.floor.push({ x, y, objs: [obj] });
675
+ return true;
676
+ }
677
+ case "trap": {
678
+ if (!save.traps) return false;
679
+ const { x, y } = entry.locus as { x: number; y: number };
680
+ const trap = entry.data as unknown as NonNullable<
681
+ SavedGame["traps"]
682
+ >[number]["traps"][number];
683
+ const cell = save.traps.find((c) => c.x === x && c.y === y);
684
+ if (cell) cell.traps.push(trap);
685
+ else save.traps.push({ x, y, traps: [trap] });
686
+ return true;
687
+ }
688
+ case "lore": {
689
+ const raceId = entry.locus as string;
690
+ const rec = entry.data as unknown as NonNullable<SavedGame["lore"]>[number][1];
691
+ (save.lore ??= []).push([raceId, rec]);
692
+ return true;
693
+ }
694
+ case "artifactCreated": {
695
+ const id = entry.locus as string;
696
+ (save.artifactsCreated ??= []).push(id);
697
+ return true;
698
+ }
699
+ case "cacheMonster": {
700
+ const { depth, index } = entry.locus as { depth: number; index: number };
701
+ const level = save.levelCache?.find((l) => l.depth === depth);
702
+ if (!level) return false;
703
+ const mon = entry.data as unknown as NonNullable<
704
+ NonNullable<SavedGame["levelCache"]>[number]["monsters"][number]
705
+ >;
706
+ if (
707
+ index >= 0 &&
708
+ index < level.monsters.length &&
709
+ level.monsters[index] === null
710
+ ) {
711
+ level.monsters[index] = mon;
712
+ } else {
713
+ level.monsters.push(mon);
714
+ }
715
+ return true;
716
+ }
717
+ case "cacheHeldObject": {
718
+ const { depth, midx } = entry.locus as { depth: number; midx: number };
719
+ const level = save.levelCache?.find((l) => l.depth === depth);
720
+ if (!level) return false;
721
+ const host = level.monsters.find((m) => m !== null && m.midx === midx);
722
+ if (!host) return false;
723
+ host.heldObj.push(entry.data as unknown as (typeof host.heldObj)[number]);
724
+ return true;
725
+ }
726
+ case "cacheFloorObject": {
727
+ const { depth, x, y } = entry.locus as {
728
+ depth: number;
729
+ x: number;
730
+ y: number;
731
+ };
732
+ const level = save.levelCache?.find((l) => l.depth === depth);
733
+ if (!level) return false;
734
+ const obj = entry.data as unknown as (typeof level.floor)[number]["objs"][number];
735
+ const pile = level.floor.find((p) => p.x === x && p.y === y);
736
+ if (pile) pile.objs.push(obj);
737
+ else level.floor.push({ x, y, objs: [obj] });
738
+ return true;
739
+ }
740
+ case "cacheTrap": {
741
+ const { depth, x, y } = entry.locus as {
742
+ depth: number;
743
+ x: number;
744
+ y: number;
745
+ };
746
+ const level = save.levelCache?.find((l) => l.depth === depth);
747
+ if (!level) return false;
748
+ const trap = entry.data as unknown as (typeof level.traps)[number]["traps"][number];
749
+ const cell = level.traps.find((c) => c.x === x && c.y === y);
750
+ if (cell) cell.traps.push(trap);
751
+ else level.traps.push({ x, y, traps: [trap] });
752
+ return true;
753
+ }
754
+ }
755
+ }
756
+
757
+ /**
758
+ * Restore quarantined entities whose pack is present again, returning a save
759
+ * with those orphans reinserted and dropped from the store; orphans whose pack
760
+ * is still absent stay quarantined. Pure: the input save is not mutated.
761
+ *
762
+ * The inverse of quarantineSave for the common "reinstall the mod" path. Two
763
+ * documented, deliberate degradations: a rehydrated monster does not rebuild its
764
+ * old group cohesion (its group entry may have been dissolved on quarantine),
765
+ * and a rehydrated equipped item returns to the pack rather than auto-re-equipping.
766
+ */
767
+ export function rehydrateSave(
768
+ save: SavedGame,
769
+ present: (namespace: string) => boolean,
770
+ ): SavedGame {
771
+ if (!save.orphans) return save;
772
+ const out = jsonClone(save);
773
+ const remaining: OrphanStore = {};
774
+ for (const [key, entries] of Object.entries(out.orphans!)) {
775
+ const ns = key.split("@")[0] ?? key;
776
+ if (!present(ns)) {
777
+ remaining[key] = entries;
778
+ continue;
779
+ }
780
+ for (const entry of entries) {
781
+ if (!reinsert(out, entry)) (remaining[key] ??= []).push(entry);
782
+ }
783
+ }
784
+ if (orphanCount(remaining) > 0) out.orphans = remaining;
785
+ else delete out.orphans;
786
+ return out;
787
+ }