@rpgm-tools/neo-angband-core 0.18.0 → 0.19.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 (848) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/perceive.d.ts.map +1 -1
  3. package/dist/agent/perceive.js +2 -2
  4. package/dist/agent/perceive.js.map +1 -1
  5. package/dist/combat/blow-vectors.d.ts +78 -0
  6. package/dist/combat/blow-vectors.d.ts.map +1 -0
  7. package/dist/combat/blow-vectors.fixtures.d.ts +19 -0
  8. package/dist/combat/blow-vectors.fixtures.d.ts.map +1 -0
  9. package/dist/combat/blow-vectors.fixtures.js +81 -0
  10. package/dist/combat/blow-vectors.fixtures.js.map +1 -0
  11. package/dist/combat/blow-vectors.js +195 -0
  12. package/dist/combat/blow-vectors.js.map +1 -0
  13. package/dist/combat/brand-slay.d.ts +22 -9
  14. package/dist/combat/brand-slay.d.ts.map +1 -1
  15. package/dist/combat/brand-slay.js +37 -10
  16. package/dist/combat/brand-slay.js.map +1 -1
  17. package/dist/combat/index.d.ts +1 -1
  18. package/dist/combat/index.js +1 -1
  19. package/dist/combat/melee.d.ts +25 -13
  20. package/dist/combat/melee.d.ts.map +1 -1
  21. package/dist/combat/melee.js +23 -19
  22. package/dist/combat/melee.js.map +1 -1
  23. package/dist/combat/mon-melee.d.ts +166 -7
  24. package/dist/combat/mon-melee.d.ts.map +1 -1
  25. package/dist/combat/mon-melee.js +469 -338
  26. package/dist/combat/mon-melee.js.map +1 -1
  27. package/dist/combat/ranged.d.ts +15 -13
  28. package/dist/combat/ranged.d.ts.map +1 -1
  29. package/dist/combat/ranged.js +31 -29
  30. package/dist/combat/ranged.js.map +1 -1
  31. package/dist/constants.d.ts +14 -0
  32. package/dist/constants.d.ts.map +1 -1
  33. package/dist/constants.js +14 -0
  34. package/dist/constants.js.map +1 -1
  35. package/dist/datafile.d.ts +48 -0
  36. package/dist/datafile.d.ts.map +1 -0
  37. package/dist/datafile.js +102 -0
  38. package/dist/datafile.js.map +1 -0
  39. package/dist/effects/effect-info-registry.d.ts +237 -0
  40. package/dist/effects/effect-info-registry.d.ts.map +1 -0
  41. package/dist/effects/effect-info-registry.js +138 -0
  42. package/dist/effects/effect-info-registry.js.map +1 -0
  43. package/dist/effects/effect-info-vectors.d.ts +92 -0
  44. package/dist/effects/effect-info-vectors.d.ts.map +1 -0
  45. package/dist/effects/effect-info-vectors.fixtures.d.ts +18 -0
  46. package/dist/effects/effect-info-vectors.fixtures.d.ts.map +1 -0
  47. package/dist/effects/effect-info-vectors.fixtures.js +51 -0
  48. package/dist/effects/effect-info-vectors.fixtures.js.map +1 -0
  49. package/dist/effects/effect-info-vectors.js +315 -0
  50. package/dist/effects/effect-info-vectors.js.map +1 -0
  51. package/dist/effects/effect-info.d.ts +5 -1
  52. package/dist/effects/effect-info.d.ts.map +1 -1
  53. package/dist/effects/effect-info.js +245 -143
  54. package/dist/effects/effect-info.js.map +1 -1
  55. package/dist/effects/effect.d.ts +4 -3
  56. package/dist/effects/effect.d.ts.map +1 -1
  57. package/dist/effects/effect.js +88 -70
  58. package/dist/effects/effect.js.map +1 -1
  59. package/dist/effects/handlers.d.ts +1 -1
  60. package/dist/effects/handlers.d.ts.map +1 -1
  61. package/dist/effects/handlers.js +5 -2
  62. package/dist/effects/handlers.js.map +1 -1
  63. package/dist/effects/interpreter.d.ts +11 -0
  64. package/dist/effects/interpreter.d.ts.map +1 -1
  65. package/dist/effects/interpreter.js +13 -0
  66. package/dist/effects/interpreter.js.map +1 -1
  67. package/dist/game/cave-cmd.d.ts +9 -5
  68. package/dist/game/cave-cmd.d.ts.map +1 -1
  69. package/dist/game/cave-cmd.js +56 -11
  70. package/dist/game/cave-cmd.js.map +1 -1
  71. package/dist/game/cave-square.d.ts +42 -0
  72. package/dist/game/cave-square.d.ts.map +1 -0
  73. package/dist/game/cave-square.js +73 -0
  74. package/dist/game/cave-square.js.map +1 -0
  75. package/dist/game/char-sheet.d.ts +12 -8
  76. package/dist/game/char-sheet.d.ts.map +1 -1
  77. package/dist/game/char-sheet.js +41 -8
  78. package/dist/game/char-sheet.js.map +1 -1
  79. package/dist/game/chest.d.ts +2 -3
  80. package/dist/game/chest.d.ts.map +1 -1
  81. package/dist/game/chest.js +17 -6
  82. package/dist/game/chest.js.map +1 -1
  83. package/dist/game/context.d.ts +213 -22
  84. package/dist/game/context.d.ts.map +1 -1
  85. package/dist/game/context.js +109 -17
  86. package/dist/game/context.js.map +1 -1
  87. package/dist/game/describe.d.ts +13 -0
  88. package/dist/game/describe.d.ts.map +1 -1
  89. package/dist/game/describe.js +32 -4
  90. package/dist/game/describe.js.map +1 -1
  91. package/dist/game/display.d.ts +97 -8
  92. package/dist/game/display.d.ts.map +1 -1
  93. package/dist/game/display.js +157 -13
  94. package/dist/game/display.js.map +1 -1
  95. package/dist/game/dump-level.d.ts.map +1 -1
  96. package/dist/game/dump-level.js +3 -2
  97. package/dist/game/dump-level.js.map +1 -1
  98. package/dist/game/effect-attack.d.ts.map +1 -1
  99. package/dist/game/effect-attack.js +36 -27
  100. package/dist/game/effect-attack.js.map +1 -1
  101. package/dist/game/effect-detect.d.ts +4 -4
  102. package/dist/game/effect-detect.d.ts.map +1 -1
  103. package/dist/game/effect-detect.js +42 -9
  104. package/dist/game/effect-detect.js.map +1 -1
  105. package/dist/game/effect-env.d.ts +7 -1
  106. package/dist/game/effect-env.d.ts.map +1 -1
  107. package/dist/game/effect-env.js +1 -0
  108. package/dist/game/effect-env.js.map +1 -1
  109. package/dist/game/effect-general.d.ts +5 -3
  110. package/dist/game/effect-general.d.ts.map +1 -1
  111. package/dist/game/effect-general.js +94 -43
  112. package/dist/game/effect-general.js.map +1 -1
  113. package/dist/game/effect-item.d.ts +2 -1
  114. package/dist/game/effect-item.d.ts.map +1 -1
  115. package/dist/game/effect-item.js +136 -82
  116. package/dist/game/effect-item.js.map +1 -1
  117. package/dist/game/effect-melee.d.ts +10 -4
  118. package/dist/game/effect-melee.d.ts.map +1 -1
  119. package/dist/game/effect-melee.js +44 -19
  120. package/dist/game/effect-melee.js.map +1 -1
  121. package/dist/game/effect-monster.d.ts +26 -4
  122. package/dist/game/effect-monster.d.ts.map +1 -1
  123. package/dist/game/effect-monster.js +52 -9
  124. package/dist/game/effect-monster.js.map +1 -1
  125. package/dist/game/effect-teleport.d.ts +58 -19
  126. package/dist/game/effect-teleport.d.ts.map +1 -1
  127. package/dist/game/effect-teleport.js +143 -27
  128. package/dist/game/effect-teleport.js.map +1 -1
  129. package/dist/game/effect-terrain.d.ts +1 -3
  130. package/dist/game/effect-terrain.d.ts.map +1 -1
  131. package/dist/game/effect-terrain.js +38 -22
  132. package/dist/game/effect-terrain.js.map +1 -1
  133. package/dist/game/equip-cmp.d.ts.map +1 -1
  134. package/dist/game/equip-cmp.js +10 -7
  135. package/dist/game/equip-cmp.js.map +1 -1
  136. package/dist/game/floor.d.ts +16 -4
  137. package/dist/game/floor.d.ts.map +1 -1
  138. package/dist/game/floor.js +22 -4
  139. package/dist/game/floor.js.map +1 -1
  140. package/dist/game/gear.d.ts +101 -13
  141. package/dist/game/gear.d.ts.map +1 -1
  142. package/dist/game/gear.js +183 -24
  143. package/dist/game/gear.js.map +1 -1
  144. package/dist/game/harness.d.ts +2 -1
  145. package/dist/game/harness.d.ts.map +1 -1
  146. package/dist/game/harness.js +12 -1
  147. package/dist/game/harness.js.map +1 -1
  148. package/dist/game/ignore-cmd.d.ts +47 -8
  149. package/dist/game/ignore-cmd.d.ts.map +1 -1
  150. package/dist/game/ignore-cmd.js +76 -8
  151. package/dist/game/ignore-cmd.js.map +1 -1
  152. package/dist/game/known.d.ts +223 -34
  153. package/dist/game/known.d.ts.map +1 -1
  154. package/dist/game/known.js +301 -67
  155. package/dist/game/known.js.map +1 -1
  156. package/dist/game/loop.d.ts +4 -3
  157. package/dist/game/loop.d.ts.map +1 -1
  158. package/dist/game/loop.js +49 -29
  159. package/dist/game/loop.js.map +1 -1
  160. package/dist/game/lore-color.d.ts.map +1 -1
  161. package/dist/game/lore-color.js +13 -1
  162. package/dist/game/lore-color.js.map +1 -1
  163. package/dist/game/mon-cast.d.ts +3 -4
  164. package/dist/game/mon-cast.d.ts.map +1 -1
  165. package/dist/game/mon-cast.js +30 -2
  166. package/dist/game/mon-cast.js.map +1 -1
  167. package/dist/game/mon-cmd.d.ts +4 -5
  168. package/dist/game/mon-cmd.d.ts.map +1 -1
  169. package/dist/game/mon-cmd.js +80 -27
  170. package/dist/game/mon-cmd.js.map +1 -1
  171. package/dist/game/mon-death.d.ts +8 -4
  172. package/dist/game/mon-death.d.ts.map +1 -1
  173. package/dist/game/mon-death.js +6 -9
  174. package/dist/game/mon-death.js.map +1 -1
  175. package/dist/game/mon-group.d.ts +9 -5
  176. package/dist/game/mon-group.d.ts.map +1 -1
  177. package/dist/game/mon-group.js +9 -5
  178. package/dist/game/mon-group.js.map +1 -1
  179. package/dist/game/mon-message.d.ts +90 -40
  180. package/dist/game/mon-message.d.ts.map +1 -1
  181. package/dist/game/mon-message.js +267 -59
  182. package/dist/game/mon-message.js.map +1 -1
  183. package/dist/game/mon-place.d.ts +11 -1
  184. package/dist/game/mon-place.d.ts.map +1 -1
  185. package/dist/game/mon-place.js +15 -3
  186. package/dist/game/mon-place.js.map +1 -1
  187. package/dist/game/mon-ranged.d.ts +2 -1
  188. package/dist/game/mon-ranged.d.ts.map +1 -1
  189. package/dist/game/mon-ranged.js +11 -5
  190. package/dist/game/mon-ranged.js.map +1 -1
  191. package/dist/game/mon-side.d.ts +3 -2
  192. package/dist/game/mon-side.d.ts.map +1 -1
  193. package/dist/game/mon-side.js +15 -14
  194. package/dist/game/mon-side.js.map +1 -1
  195. package/dist/game/monster-turn.d.ts +20 -10
  196. package/dist/game/monster-turn.d.ts.map +1 -1
  197. package/dist/game/monster-turn.js +110 -83
  198. package/dist/game/monster-turn.js.map +1 -1
  199. package/dist/game/notice.d.ts +36 -0
  200. package/dist/game/notice.d.ts.map +1 -0
  201. package/dist/game/notice.js +79 -0
  202. package/dist/game/notice.js.map +1 -0
  203. package/dist/game/obj-cmd.d.ts +14 -3
  204. package/dist/game/obj-cmd.d.ts.map +1 -1
  205. package/dist/game/obj-cmd.js +109 -35
  206. package/dist/game/obj-cmd.js.map +1 -1
  207. package/dist/game/obj-list.d.ts +13 -2
  208. package/dist/game/obj-list.d.ts.map +1 -1
  209. package/dist/game/obj-list.js +42 -27
  210. package/dist/game/obj-list.js.map +1 -1
  211. package/dist/game/object-inspect.d.ts +9 -0
  212. package/dist/game/object-inspect.d.ts.map +1 -1
  213. package/dist/game/object-inspect.js +4 -0
  214. package/dist/game/object-inspect.js.map +1 -1
  215. package/dist/game/pickup.d.ts +0 -2
  216. package/dist/game/pickup.d.ts.map +1 -1
  217. package/dist/game/pickup.js +18 -3
  218. package/dist/game/pickup.js.map +1 -1
  219. package/dist/game/player-side-vectors.d.ts +174 -0
  220. package/dist/game/player-side-vectors.d.ts.map +1 -0
  221. package/dist/game/player-side-vectors.fixtures.d.ts +33 -0
  222. package/dist/game/player-side-vectors.fixtures.d.ts.map +1 -0
  223. package/dist/game/player-side-vectors.fixtures.js +191 -0
  224. package/dist/game/player-side-vectors.fixtures.js.map +1 -0
  225. package/dist/game/player-side-vectors.js +292 -0
  226. package/dist/game/player-side-vectors.js.map +1 -0
  227. package/dist/game/player-side.d.ts +129 -1
  228. package/dist/game/player-side.d.ts.map +1 -1
  229. package/dist/game/player-side.js +520 -338
  230. package/dist/game/player-side.js.map +1 -1
  231. package/dist/game/player-turn.d.ts +26 -7
  232. package/dist/game/player-turn.d.ts.map +1 -1
  233. package/dist/game/player-turn.js +180 -33
  234. package/dist/game/player-turn.js.map +1 -1
  235. package/dist/game/poly.d.ts +38 -0
  236. package/dist/game/poly.d.ts.map +1 -0
  237. package/dist/game/poly.js +82 -0
  238. package/dist/game/poly.js.map +1 -0
  239. package/dist/game/project-cast.d.ts +20 -3
  240. package/dist/game/project-cast.d.ts.map +1 -1
  241. package/dist/game/project-cast.js +49 -6
  242. package/dist/game/project-cast.js.map +1 -1
  243. package/dist/game/project-feat-vectors.d.ts +124 -0
  244. package/dist/game/project-feat-vectors.d.ts.map +1 -0
  245. package/dist/game/project-feat-vectors.fixtures.d.ts +13 -0
  246. package/dist/game/project-feat-vectors.fixtures.d.ts.map +1 -0
  247. package/dist/game/project-feat-vectors.fixtures.js +94 -0
  248. package/dist/game/project-feat-vectors.fixtures.js.map +1 -0
  249. package/dist/game/project-feat-vectors.js +229 -0
  250. package/dist/game/project-feat-vectors.js.map +1 -0
  251. package/dist/game/project-feat.d.ts +53 -1
  252. package/dist/game/project-feat.d.ts.map +1 -1
  253. package/dist/game/project-feat.js +374 -247
  254. package/dist/game/project-feat.js.map +1 -1
  255. package/dist/game/project-monster.d.ts +21 -8
  256. package/dist/game/project-monster.d.ts.map +1 -1
  257. package/dist/game/project-monster.js +45 -21
  258. package/dist/game/project-monster.js.map +1 -1
  259. package/dist/game/project-obj.d.ts +62 -0
  260. package/dist/game/project-obj.d.ts.map +1 -1
  261. package/dist/game/project-obj.js +72 -41
  262. package/dist/game/project-obj.js.map +1 -1
  263. package/dist/game/project-player.d.ts +8 -0
  264. package/dist/game/project-player.d.ts.map +1 -1
  265. package/dist/game/project-player.js.map +1 -1
  266. package/dist/game/projection-handlers.d.ts +81 -0
  267. package/dist/game/projection-handlers.d.ts.map +1 -0
  268. package/dist/game/projection-handlers.js +93 -0
  269. package/dist/game/projection-handlers.js.map +1 -0
  270. package/dist/game/quest.d.ts +23 -0
  271. package/dist/game/quest.d.ts.map +1 -1
  272. package/dist/game/quest.js +42 -0
  273. package/dist/game/quest.js.map +1 -1
  274. package/dist/game/ranged-cmd.d.ts +13 -2
  275. package/dist/game/ranged-cmd.d.ts.map +1 -1
  276. package/dist/game/ranged-cmd.js +32 -15
  277. package/dist/game/ranged-cmd.js.map +1 -1
  278. package/dist/game/repeat.d.ts +78 -0
  279. package/dist/game/repeat.d.ts.map +1 -0
  280. package/dist/game/repeat.js +88 -0
  281. package/dist/game/repeat.js.map +1 -0
  282. package/dist/game/shape-inspect.d.ts +74 -0
  283. package/dist/game/shape-inspect.d.ts.map +1 -0
  284. package/dist/game/shape-inspect.js +114 -0
  285. package/dist/game/shape-inspect.js.map +1 -0
  286. package/dist/game/spell-cmd.d.ts +15 -4
  287. package/dist/game/spell-cmd.d.ts.map +1 -1
  288. package/dist/game/spell-cmd.js +35 -6
  289. package/dist/game/spell-cmd.js.map +1 -1
  290. package/dist/game/spoil.d.ts.map +1 -1
  291. package/dist/game/spoil.js +89 -40
  292. package/dist/game/spoil.js.map +1 -1
  293. package/dist/game/steal.d.ts +3 -3
  294. package/dist/game/steal.d.ts.map +1 -1
  295. package/dist/game/steal.js +9 -4
  296. package/dist/game/steal.js.map +1 -1
  297. package/dist/game/target-loop.d.ts +10 -4
  298. package/dist/game/target-loop.d.ts.map +1 -1
  299. package/dist/game/target-loop.js +14 -8
  300. package/dist/game/target-loop.js.map +1 -1
  301. package/dist/game/target.d.ts +4 -4
  302. package/dist/game/target.d.ts.map +1 -1
  303. package/dist/game/target.js +19 -8
  304. package/dist/game/target.js.map +1 -1
  305. package/dist/game/ui-entry.d.ts +63 -4
  306. package/dist/game/ui-entry.d.ts.map +1 -1
  307. package/dist/game/ui-entry.js +151 -23
  308. package/dist/game/ui-entry.js.map +1 -1
  309. package/dist/game/wizard.d.ts +23 -5
  310. package/dist/game/wizard.d.ts.map +1 -1
  311. package/dist/game/wizard.js +93 -11
  312. package/dist/game/wizard.js.map +1 -1
  313. package/dist/game/world.d.ts.map +1 -1
  314. package/dist/game/world.js +6 -0
  315. package/dist/game/world.js.map +1 -1
  316. package/dist/gen/cave.d.ts +49 -8
  317. package/dist/gen/cave.d.ts.map +1 -1
  318. package/dist/gen/cave.js +200 -28
  319. package/dist/gen/cave.js.map +1 -1
  320. package/dist/gen/generate.d.ts +54 -9
  321. package/dist/gen/generate.d.ts.map +1 -1
  322. package/dist/gen/generate.js +55 -8
  323. package/dist/gen/generate.js.map +1 -1
  324. package/dist/gen/glyph-vectors.d.ts +109 -0
  325. package/dist/gen/glyph-vectors.d.ts.map +1 -0
  326. package/dist/gen/glyph-vectors.fixtures.d.ts +18 -0
  327. package/dist/gen/glyph-vectors.fixtures.d.ts.map +1 -0
  328. package/dist/gen/glyph-vectors.fixtures.js +94 -0
  329. package/dist/gen/glyph-vectors.fixtures.js.map +1 -0
  330. package/dist/gen/glyph-vectors.js +218 -0
  331. package/dist/gen/glyph-vectors.js.map +1 -0
  332. package/dist/gen/glyph.d.ts +104 -0
  333. package/dist/gen/glyph.d.ts.map +1 -0
  334. package/dist/gen/glyph.js +72 -0
  335. package/dist/gen/glyph.js.map +1 -0
  336. package/dist/gen/room.d.ts +26 -2
  337. package/dist/gen/room.d.ts.map +1 -1
  338. package/dist/gen/room.js +414 -264
  339. package/dist/gen/room.js.map +1 -1
  340. package/dist/gen/util.d.ts +11 -2
  341. package/dist/gen/util.d.ts.map +1 -1
  342. package/dist/gen/util.js +31 -9
  343. package/dist/gen/util.js.map +1 -1
  344. package/dist/i18n/i18n.d.ts +207 -0
  345. package/dist/i18n/i18n.d.ts.map +1 -0
  346. package/dist/i18n/i18n.js +405 -0
  347. package/dist/i18n/i18n.js.map +1 -0
  348. package/dist/i18n/text.d.ts +62 -0
  349. package/dist/i18n/text.d.ts.map +1 -0
  350. package/dist/i18n/text.js +120 -0
  351. package/dist/i18n/text.js.map +1 -0
  352. package/dist/index.d.ts +25 -0
  353. package/dist/index.d.ts.map +1 -1
  354. package/dist/index.js +38 -0
  355. package/dist/index.js.map +1 -1
  356. package/dist/mod/extension.d.ts +115 -0
  357. package/dist/mod/extension.d.ts.map +1 -0
  358. package/dist/mod/extension.js +85 -0
  359. package/dist/mod/extension.js.map +1 -0
  360. package/dist/mod/ids.d.ts +10 -0
  361. package/dist/mod/ids.d.ts.map +1 -1
  362. package/dist/mod/ids.js +90 -21
  363. package/dist/mod/ids.js.map +1 -1
  364. package/dist/mod/record-keys.d.ts +43 -0
  365. package/dist/mod/record-keys.d.ts.map +1 -0
  366. package/dist/mod/record-keys.js +100 -0
  367. package/dist/mod/record-keys.js.map +1 -0
  368. package/dist/mod/registry-host.d.ts +472 -0
  369. package/dist/mod/registry-host.d.ts.map +1 -1
  370. package/dist/mod/registry-host.js +313 -0
  371. package/dist/mod/registry-host.js.map +1 -1
  372. package/dist/mod/save-blocks.d.ts +1 -1
  373. package/dist/mon/bind.d.ts.map +1 -1
  374. package/dist/mon/bind.js +6 -3
  375. package/dist/mon/bind.js.map +1 -1
  376. package/dist/mon/knowledge-groups.d.ts +0 -6
  377. package/dist/mon/knowledge-groups.d.ts.map +1 -1
  378. package/dist/mon/knowledge-groups.js +12 -8
  379. package/dist/mon/knowledge-groups.js.map +1 -1
  380. package/dist/mon/lore-describe.d.ts +46 -10
  381. package/dist/mon/lore-describe.d.ts.map +1 -1
  382. package/dist/mon/lore-describe.js +74 -22
  383. package/dist/mon/lore-describe.js.map +1 -1
  384. package/dist/mon/lore-file.d.ts +126 -0
  385. package/dist/mon/lore-file.d.ts.map +1 -0
  386. package/dist/mon/lore-file.js +291 -0
  387. package/dist/mon/lore-file.js.map +1 -0
  388. package/dist/mon/lore.d.ts +9 -3
  389. package/dist/mon/lore.d.ts.map +1 -1
  390. package/dist/mon/lore.js +9 -3
  391. package/dist/mon/lore.js.map +1 -1
  392. package/dist/mon/make.d.ts +4 -2
  393. package/dist/mon/make.d.ts.map +1 -1
  394. package/dist/mon/make.js +4 -2
  395. package/dist/mon/make.js.map +1 -1
  396. package/dist/mon/monster.d.ts +1 -1
  397. package/dist/mon/monster.js +1 -1
  398. package/dist/mon/predicate.d.ts +14 -9
  399. package/dist/mon/predicate.d.ts.map +1 -1
  400. package/dist/mon/predicate.js +14 -9
  401. package/dist/mon/predicate.js.map +1 -1
  402. package/dist/mon/project-mon.d.ts +16 -3
  403. package/dist/mon/project-mon.d.ts.map +1 -1
  404. package/dist/mon/project-mon.js +14 -5
  405. package/dist/mon/project-mon.js.map +1 -1
  406. package/dist/mon/steal.d.ts +31 -4
  407. package/dist/mon/steal.d.ts.map +1 -1
  408. package/dist/mon/steal.js +20 -7
  409. package/dist/mon/steal.js.map +1 -1
  410. package/dist/mon/take-hit.d.ts +8 -3
  411. package/dist/mon/take-hit.d.ts.map +1 -1
  412. package/dist/mon/take-hit.js +8 -3
  413. package/dist/mon/take-hit.js.map +1 -1
  414. package/dist/mon/timed.d.ts +15 -9
  415. package/dist/mon/timed.d.ts.map +1 -1
  416. package/dist/mon/timed.js +13 -8
  417. package/dist/mon/timed.js.map +1 -1
  418. package/dist/mon/types.d.ts +11 -4
  419. package/dist/mon/types.d.ts.map +1 -1
  420. package/dist/mon/types.js.map +1 -1
  421. package/dist/msg.d.ts +40 -1
  422. package/dist/msg.d.ts.map +1 -1
  423. package/dist/msg.js +42 -1
  424. package/dist/msg.js.map +1 -1
  425. package/dist/obj/artifact-fake.d.ts +46 -14
  426. package/dist/obj/artifact-fake.d.ts.map +1 -1
  427. package/dist/obj/artifact-fake.js +46 -17
  428. package/dist/obj/artifact-fake.js.map +1 -1
  429. package/dist/obj/bind.d.ts +23 -0
  430. package/dist/obj/bind.d.ts.map +1 -1
  431. package/dist/obj/bind.js +49 -9
  432. package/dist/obj/bind.js.map +1 -1
  433. package/dist/obj/desc-vectors.d.ts +68 -0
  434. package/dist/obj/desc-vectors.d.ts.map +1 -0
  435. package/dist/obj/desc-vectors.fixtures.d.ts +12 -0
  436. package/dist/obj/desc-vectors.fixtures.d.ts.map +1 -0
  437. package/dist/obj/desc-vectors.fixtures.js +95 -0
  438. package/dist/obj/desc-vectors.fixtures.js.map +1 -0
  439. package/dist/obj/desc-vectors.js +86 -0
  440. package/dist/obj/desc-vectors.js.map +1 -0
  441. package/dist/obj/desc.d.ts +17 -2
  442. package/dist/obj/desc.d.ts.map +1 -1
  443. package/dist/obj/desc.js +129 -54
  444. package/dist/obj/desc.js.map +1 -1
  445. package/dist/obj/effects-info.d.ts.map +1 -1
  446. package/dist/obj/effects-info.js +87 -58
  447. package/dist/obj/effects-info.js.map +1 -1
  448. package/dist/obj/fake-object.d.ts +70 -0
  449. package/dist/obj/fake-object.d.ts.map +1 -0
  450. package/dist/obj/fake-object.js +104 -0
  451. package/dist/obj/fake-object.js.map +1 -0
  452. package/dist/obj/ignore.d.ts +55 -12
  453. package/dist/obj/ignore.d.ts.map +1 -1
  454. package/dist/obj/ignore.js +68 -31
  455. package/dist/obj/ignore.js.map +1 -1
  456. package/dist/obj/knowledge.d.ts +46 -3
  457. package/dist/obj/knowledge.d.ts.map +1 -1
  458. package/dist/obj/knowledge.js +169 -151
  459. package/dist/obj/knowledge.js.map +1 -1
  460. package/dist/obj/known-object.d.ts +68 -8
  461. package/dist/obj/known-object.d.ts.map +1 -1
  462. package/dist/obj/known-object.js +90 -10
  463. package/dist/obj/known-object.js.map +1 -1
  464. package/dist/obj/make.d.ts +15 -4
  465. package/dist/obj/make.d.ts.map +1 -1
  466. package/dist/obj/make.js +49 -27
  467. package/dist/obj/make.js.map +1 -1
  468. package/dist/obj/object-info.d.ts +10 -0
  469. package/dist/obj/object-info.d.ts.map +1 -1
  470. package/dist/obj/object-info.js +93 -7
  471. package/dist/obj/object-info.js.map +1 -1
  472. package/dist/obj/object.d.ts +42 -4
  473. package/dist/obj/object.d.ts.map +1 -1
  474. package/dist/obj/object.js +362 -147
  475. package/dist/obj/object.js.map +1 -1
  476. package/dist/obj/power.d.ts +23 -4
  477. package/dist/obj/power.d.ts.map +1 -1
  478. package/dist/obj/power.js +231 -65
  479. package/dist/obj/power.js.map +1 -1
  480. package/dist/obj/randart-build.d.ts +27 -22
  481. package/dist/obj/randart-build.d.ts.map +1 -1
  482. package/dist/obj/randart-build.js +435 -357
  483. package/dist/obj/randart-build.js.map +1 -1
  484. package/dist/obj/randart-data.d.ts +62 -24
  485. package/dist/obj/randart-data.d.ts.map +1 -1
  486. package/dist/obj/randart-data.js +333 -189
  487. package/dist/obj/randart-data.js.map +1 -1
  488. package/dist/obj/randart-file.d.ts +21 -0
  489. package/dist/obj/randart-file.d.ts.map +1 -0
  490. package/dist/obj/randart-file.js +119 -0
  491. package/dist/obj/randart-file.js.map +1 -0
  492. package/dist/obj/randart-log.d.ts +63 -0
  493. package/dist/obj/randart-log.d.ts.map +1 -0
  494. package/dist/obj/randart-log.js +72 -0
  495. package/dist/obj/randart-log.js.map +1 -0
  496. package/dist/obj/randart-registry.d.ts +178 -0
  497. package/dist/obj/randart-registry.d.ts.map +1 -0
  498. package/dist/obj/randart-registry.js +140 -0
  499. package/dist/obj/randart-registry.js.map +1 -0
  500. package/dist/obj/randart-vectors.d.ts +97 -0
  501. package/dist/obj/randart-vectors.d.ts.map +1 -0
  502. package/dist/obj/randart-vectors.fixtures.d.ts +18 -0
  503. package/dist/obj/randart-vectors.fixtures.d.ts.map +1 -0
  504. package/dist/obj/randart-vectors.fixtures.js +50 -0
  505. package/dist/obj/randart-vectors.fixtures.js.map +1 -0
  506. package/dist/obj/randart-vectors.js +311 -0
  507. package/dist/obj/randart-vectors.js.map +1 -0
  508. package/dist/obj/randart.d.ts +53 -15
  509. package/dist/obj/randart.d.ts.map +1 -1
  510. package/dist/obj/randart.js +166 -44
  511. package/dist/obj/randart.js.map +1 -1
  512. package/dist/obj/rune-registry.d.ts +180 -0
  513. package/dist/obj/rune-registry.d.ts.map +1 -0
  514. package/dist/obj/rune-registry.js +161 -0
  515. package/dist/obj/rune-registry.js.map +1 -0
  516. package/dist/obj/rune-vectors.d.ts +99 -0
  517. package/dist/obj/rune-vectors.d.ts.map +1 -0
  518. package/dist/obj/rune-vectors.fixtures.d.ts +44 -0
  519. package/dist/obj/rune-vectors.fixtures.d.ts.map +1 -0
  520. package/dist/obj/rune-vectors.fixtures.js +125 -0
  521. package/dist/obj/rune-vectors.fixtures.js.map +1 -0
  522. package/dist/obj/rune-vectors.js +159 -0
  523. package/dist/obj/rune-vectors.js.map +1 -0
  524. package/dist/obj/tval-registry.d.ts +174 -0
  525. package/dist/obj/tval-registry.d.ts.map +1 -0
  526. package/dist/obj/tval-registry.js +151 -0
  527. package/dist/obj/tval-registry.js.map +1 -0
  528. package/dist/obj/tval-vectors.d.ts +85 -0
  529. package/dist/obj/tval-vectors.d.ts.map +1 -0
  530. package/dist/obj/tval-vectors.fixtures.d.ts +24 -0
  531. package/dist/obj/tval-vectors.fixtures.d.ts.map +1 -0
  532. package/dist/obj/tval-vectors.fixtures.js +41 -0
  533. package/dist/obj/tval-vectors.fixtures.js.map +1 -0
  534. package/dist/obj/tval-vectors.js +76 -0
  535. package/dist/obj/tval-vectors.js.map +1 -0
  536. package/dist/obj/types.d.ts +18 -7
  537. package/dist/obj/types.d.ts.map +1 -1
  538. package/dist/obj/types.js.map +1 -1
  539. package/dist/obj/value.d.ts.map +1 -1
  540. package/dist/obj/value.js +23 -20
  541. package/dist/obj/value.js.map +1 -1
  542. package/dist/parser.d.ts +116 -0
  543. package/dist/parser.d.ts.map +1 -0
  544. package/dist/parser.js +205 -0
  545. package/dist/parser.js.map +1 -0
  546. package/dist/player/bind.d.ts.map +1 -1
  547. package/dist/player/bind.js +3 -2
  548. package/dist/player/bind.js.map +1 -1
  549. package/dist/player/birth.d.ts +2 -1
  550. package/dist/player/birth.d.ts.map +1 -1
  551. package/dist/player/birth.js +2 -1
  552. package/dist/player/birth.js.map +1 -1
  553. package/dist/player/calcs.d.ts +58 -23
  554. package/dist/player/calcs.d.ts.map +1 -1
  555. package/dist/player/calcs.js +93 -36
  556. package/dist/player/calcs.js.map +1 -1
  557. package/dist/player/death.d.ts +50 -0
  558. package/dist/player/death.d.ts.map +1 -0
  559. package/dist/player/death.js +46 -0
  560. package/dist/player/death.js.map +1 -0
  561. package/dist/player/options-file.d.ts +129 -0
  562. package/dist/player/options-file.d.ts.map +1 -0
  563. package/dist/player/options-file.js +309 -0
  564. package/dist/player/options-file.js.map +1 -0
  565. package/dist/player/options.d.ts +2 -1
  566. package/dist/player/options.d.ts.map +1 -1
  567. package/dist/player/options.js +2 -1
  568. package/dist/player/options.js.map +1 -1
  569. package/dist/player/player.d.ts +50 -3
  570. package/dist/player/player.d.ts.map +1 -1
  571. package/dist/player/player.js +10 -1
  572. package/dist/player/player.js.map +1 -1
  573. package/dist/player/shape-lore.d.ts +11 -7
  574. package/dist/player/shape-lore.d.ts.map +1 -1
  575. package/dist/player/shape-lore.js +24 -11
  576. package/dist/player/shape-lore.js.map +1 -1
  577. package/dist/player/timed.d.ts +5 -3
  578. package/dist/player/timed.d.ts.map +1 -1
  579. package/dist/player/timed.js +11 -2
  580. package/dist/player/timed.js.map +1 -1
  581. package/dist/player/types.d.ts +29 -4
  582. package/dist/player/types.d.ts.map +1 -1
  583. package/dist/player/types.js +24 -1
  584. package/dist/player/types.js.map +1 -1
  585. package/dist/session/boot.d.ts +26 -2
  586. package/dist/session/boot.d.ts.map +1 -1
  587. package/dist/session/boot.js +21 -2
  588. package/dist/session/boot.js.map +1 -1
  589. package/dist/session/game.d.ts +15 -0
  590. package/dist/session/game.d.ts.map +1 -1
  591. package/dist/session/game.js +616 -140
  592. package/dist/session/game.js.map +1 -1
  593. package/dist/session/save-migrate.d.ts.map +1 -1
  594. package/dist/session/save-migrate.js +76 -1
  595. package/dist/session/save-migrate.js.map +1 -1
  596. package/dist/session/save.d.ts +75 -12
  597. package/dist/session/save.d.ts.map +1 -1
  598. package/dist/session/save.js +177 -18
  599. package/dist/session/save.js.map +1 -1
  600. package/dist/store/bind.d.ts +1 -1
  601. package/dist/store/bind.d.ts.map +1 -1
  602. package/dist/store/bind.js +4 -3
  603. package/dist/store/bind.js.map +1 -1
  604. package/dist/store/mass-produce-vectors.d.ts +40 -0
  605. package/dist/store/mass-produce-vectors.d.ts.map +1 -0
  606. package/dist/store/mass-produce-vectors.fixtures.d.ts +13 -0
  607. package/dist/store/mass-produce-vectors.fixtures.d.ts.map +1 -0
  608. package/dist/store/mass-produce-vectors.fixtures.js +52 -0
  609. package/dist/store/mass-produce-vectors.fixtures.js.map +1 -0
  610. package/dist/store/mass-produce-vectors.js +44 -0
  611. package/dist/store/mass-produce-vectors.js.map +1 -0
  612. package/dist/store/store.d.ts +104 -7
  613. package/dist/store/store.d.ts.map +1 -1
  614. package/dist/store/store.js +199 -77
  615. package/dist/store/store.js.map +1 -1
  616. package/dist/store/transact.d.ts +14 -5
  617. package/dist/store/transact.d.ts.map +1 -1
  618. package/dist/store/transact.js +17 -16
  619. package/dist/store/transact.js.map +1 -1
  620. package/dist/store/types.d.ts +3 -2
  621. package/dist/store/types.d.ts.map +1 -1
  622. package/dist/store/types.js +1 -1
  623. package/dist/version.d.ts +1 -1
  624. package/dist/version.js +1 -1
  625. package/dist/visuals/index.d.ts +1 -0
  626. package/dist/visuals/index.d.ts.map +1 -1
  627. package/dist/visuals/index.js +1 -0
  628. package/dist/visuals/index.js.map +1 -1
  629. package/dist/visuals/map-text.d.ts +8 -0
  630. package/dist/visuals/map-text.d.ts.map +1 -1
  631. package/dist/visuals/map-text.js +1 -1
  632. package/dist/visuals/map-text.js.map +1 -1
  633. package/dist/visuals/object-glyph.d.ts +56 -0
  634. package/dist/visuals/object-glyph.d.ts.map +1 -0
  635. package/dist/visuals/object-glyph.js +52 -0
  636. package/dist/visuals/object-glyph.js.map +1 -0
  637. package/dist/visuals/prefs.d.ts +14 -22
  638. package/dist/visuals/prefs.d.ts.map +1 -1
  639. package/dist/visuals/prefs.js +4 -23
  640. package/dist/visuals/prefs.js.map +1 -1
  641. package/dist/visuals/tile-prefs.d.ts +26 -0
  642. package/dist/visuals/tile-prefs.d.ts.map +1 -1
  643. package/dist/visuals/tile-prefs.js +28 -0
  644. package/dist/visuals/tile-prefs.js.map +1 -1
  645. package/dist/world/feature.d.ts +2 -1
  646. package/dist/world/feature.d.ts.map +1 -1
  647. package/dist/world/feature.js +2 -0
  648. package/dist/world/feature.js.map +1 -1
  649. package/dist/world/project.d.ts +10 -2
  650. package/dist/world/project.d.ts.map +1 -1
  651. package/dist/world/project.js +18 -6
  652. package/dist/world/project.js.map +1 -1
  653. package/dist/world/projection.d.ts +37 -3
  654. package/dist/world/projection.d.ts.map +1 -1
  655. package/dist/world/projection.js +69 -7
  656. package/dist/world/projection.js.map +1 -1
  657. package/dist/world/trap.d.ts +2 -1
  658. package/dist/world/trap.d.ts.map +1 -1
  659. package/dist/world/trap.js +2 -1
  660. package/dist/world/trap.js.map +1 -1
  661. package/dist/world/view.d.ts +1 -1
  662. package/dist/world/view.d.ts.map +1 -1
  663. package/dist/world/view.js +11 -3
  664. package/dist/world/view.js.map +1 -1
  665. package/package.json +1 -1
  666. package/src/agent/perceive.ts +2 -3
  667. package/src/combat/blow-vectors.fixtures.ts +99 -0
  668. package/src/combat/blow-vectors.json +482 -0
  669. package/src/combat/blow-vectors.ts +280 -0
  670. package/src/combat/brand-slay.ts +42 -11
  671. package/src/combat/index.ts +1 -1
  672. package/src/combat/melee.ts +37 -19
  673. package/src/combat/mon-melee.ts +611 -364
  674. package/src/combat/ranged.ts +43 -26
  675. package/src/constants.ts +15 -0
  676. package/src/datafile.ts +148 -0
  677. package/src/effects/effect-info-registry.ts +313 -0
  678. package/src/effects/effect-info-vectors.fixtures.ts +61 -0
  679. package/src/effects/effect-info-vectors.json +11532 -0
  680. package/src/effects/effect-info-vectors.ts +376 -0
  681. package/src/effects/effect-info.ts +1005 -859
  682. package/src/effects/effect.ts +96 -62
  683. package/src/effects/handlers.ts +5 -2
  684. package/src/effects/interpreter.ts +14 -0
  685. package/src/game/cave-cmd.ts +54 -11
  686. package/src/game/cave-square.ts +80 -0
  687. package/src/game/char-sheet.ts +59 -16
  688. package/src/game/chest.ts +25 -8
  689. package/src/game/context.ts +293 -27
  690. package/src/game/describe.ts +34 -4
  691. package/src/game/display.ts +215 -19
  692. package/src/game/dump-level.ts +3 -2
  693. package/src/game/effect-attack.ts +41 -28
  694. package/src/game/effect-detect.ts +45 -8
  695. package/src/game/effect-env.ts +8 -0
  696. package/src/game/effect-general.ts +110 -47
  697. package/src/game/effect-item.ts +1075 -999
  698. package/src/game/effect-melee.ts +51 -18
  699. package/src/game/effect-monster.ts +55 -9
  700. package/src/game/effect-teleport.ts +173 -38
  701. package/src/game/effect-terrain.ts +38 -22
  702. package/src/game/equip-cmp.ts +483 -480
  703. package/src/game/floor.ts +22 -4
  704. package/src/game/gear.ts +210 -21
  705. package/src/game/harness.ts +12 -1
  706. package/src/game/ignore-cmd.ts +96 -8
  707. package/src/game/known.ts +392 -73
  708. package/src/game/loop.ts +52 -27
  709. package/src/game/lore-color.ts +13 -1
  710. package/src/game/mon-cast.ts +31 -6
  711. package/src/game/mon-cmd.ts +95 -30
  712. package/src/game/mon-death.ts +14 -12
  713. package/src/game/mon-group.ts +9 -5
  714. package/src/game/mon-message.ts +363 -65
  715. package/src/game/mon-place.ts +15 -3
  716. package/src/game/mon-ranged.ts +14 -5
  717. package/src/game/mon-side.ts +16 -12
  718. package/src/game/monster-turn.ts +120 -87
  719. package/src/game/notice.ts +85 -0
  720. package/src/game/obj-cmd.ts +126 -37
  721. package/src/game/obj-list.ts +44 -26
  722. package/src/game/object-inspect.ts +13 -0
  723. package/src/game/pickup.ts +29 -5
  724. package/src/game/player-side-vectors.fixtures.ts +215 -0
  725. package/src/game/player-side-vectors.json +6914 -0
  726. package/src/game/player-side-vectors.ts +420 -0
  727. package/src/game/player-side.ts +622 -340
  728. package/src/game/player-turn.ts +228 -31
  729. package/src/game/poly.ts +107 -0
  730. package/src/game/project-cast.ts +63 -6
  731. package/src/game/project-feat-vectors.fixtures.ts +106 -0
  732. package/src/game/project-feat-vectors.json +6554 -0
  733. package/src/game/project-feat-vectors.ts +323 -0
  734. package/src/game/project-feat.ts +417 -248
  735. package/src/game/project-monster.ts +69 -30
  736. package/src/game/project-obj-vectors.json +1 -0
  737. package/src/game/project-obj.ts +115 -47
  738. package/src/game/project-player.ts +8 -0
  739. package/src/game/projection-handlers.ts +110 -0
  740. package/src/game/quest.ts +48 -0
  741. package/src/game/ranged-cmd.ts +45 -11
  742. package/src/game/repeat.ts +92 -0
  743. package/src/game/shape-inspect.ts +166 -0
  744. package/src/game/spell-cmd.ts +39 -6
  745. package/src/game/spoil.ts +92 -39
  746. package/src/game/steal.ts +9 -4
  747. package/src/game/target-loop.ts +14 -7
  748. package/src/game/target.ts +18 -7
  749. package/src/game/ui-entry.ts +172 -22
  750. package/src/game/wizard.ts +97 -10
  751. package/src/game/world.ts +6 -0
  752. package/src/gen/cave.ts +225 -26
  753. package/src/gen/generate.ts +62 -9
  754. package/src/gen/glyph-vectors.fixtures.ts +122 -0
  755. package/src/gen/glyph-vectors.json +5996 -0
  756. package/src/gen/glyph-vectors.ts +280 -0
  757. package/src/gen/glyph.ts +132 -0
  758. package/src/gen/room.ts +446 -265
  759. package/src/gen/util.ts +32 -9
  760. package/src/i18n/i18n.ts +492 -0
  761. package/src/i18n/text.ts +117 -0
  762. package/src/index.ts +307 -254
  763. package/src/mod/extension.ts +136 -0
  764. package/src/mod/ids.ts +92 -21
  765. package/src/mod/record-keys.ts +102 -0
  766. package/src/mod/registry-host.ts +1063 -234
  767. package/src/mon/bind.ts +14 -8
  768. package/src/mon/knowledge-groups.ts +12 -12
  769. package/src/mon/lore-describe.ts +93 -26
  770. package/src/mon/lore-file.ts +365 -0
  771. package/src/mon/lore.ts +9 -3
  772. package/src/mon/make.ts +4 -2
  773. package/src/mon/monster.ts +1 -1
  774. package/src/mon/predicate.ts +14 -9
  775. package/src/mon/project-mon.ts +23 -5
  776. package/src/mon/steal.ts +39 -7
  777. package/src/mon/take-hit.ts +8 -3
  778. package/src/mon/timed.ts +15 -9
  779. package/src/mon/types.ts +11 -4
  780. package/src/msg.ts +55 -1
  781. package/src/obj/artifact-fake.ts +47 -17
  782. package/src/obj/bind.ts +52 -9
  783. package/src/obj/desc-vectors.fixtures.ts +119 -0
  784. package/src/obj/desc-vectors.json +2360 -0
  785. package/src/obj/desc-vectors.ts +128 -0
  786. package/src/obj/desc.ts +159 -55
  787. package/src/obj/effects-info.ts +90 -59
  788. package/src/obj/fake-object.ts +135 -0
  789. package/src/obj/ignore.ts +95 -28
  790. package/src/obj/knowledge.ts +291 -139
  791. package/src/obj/known-object.ts +126 -11
  792. package/src/obj/make.ts +53 -29
  793. package/src/obj/object-info.ts +103 -6
  794. package/src/obj/object.ts +392 -151
  795. package/src/obj/power.ts +297 -59
  796. package/src/obj/randart-build.ts +1875 -1705
  797. package/src/obj/randart-data.ts +1547 -1344
  798. package/src/obj/randart-file.ts +130 -0
  799. package/src/obj/randart-log.ts +78 -0
  800. package/src/obj/randart-registry.ts +247 -0
  801. package/src/obj/randart-vectors.fixtures.ts +61 -0
  802. package/src/obj/randart-vectors.json +836 -0
  803. package/src/obj/randart-vectors.ts +369 -0
  804. package/src/obj/randart.ts +722 -552
  805. package/src/obj/rune-registry.ts +270 -0
  806. package/src/obj/rune-vectors.fixtures.ts +164 -0
  807. package/src/obj/rune-vectors.json +121 -0
  808. package/src/obj/rune-vectors.ts +229 -0
  809. package/src/obj/tval-kind-vectors.json +391 -0
  810. package/src/obj/tval-registry.ts +243 -0
  811. package/src/obj/tval-vectors.fixtures.ts +50 -0
  812. package/src/obj/tval-vectors.json +38 -0
  813. package/src/obj/tval-vectors.ts +126 -0
  814. package/src/obj/types.ts +18 -7
  815. package/src/obj/value.ts +26 -20
  816. package/src/parser.ts +214 -0
  817. package/src/player/bind.ts +5 -2
  818. package/src/player/birth.ts +2 -1
  819. package/src/player/calcs.ts +123 -42
  820. package/src/player/death.ts +78 -0
  821. package/src/player/options-file.ts +387 -0
  822. package/src/player/options.ts +2 -1
  823. package/src/player/player.ts +60 -4
  824. package/src/player/shape-lore.ts +33 -14
  825. package/src/player/timed.ts +14 -4
  826. package/src/player/types.ts +30 -4
  827. package/src/session/boot.ts +51 -1
  828. package/src/session/game.ts +720 -163
  829. package/src/session/save-migrate.ts +81 -1
  830. package/src/session/save.ts +264 -22
  831. package/src/store/bind.ts +4 -3
  832. package/src/store/mass-produce-vectors.fixtures.ts +64 -0
  833. package/src/store/mass-produce-vectors.json +1169 -0
  834. package/src/store/mass-produce-vectors.ts +67 -0
  835. package/src/store/store.ts +266 -63
  836. package/src/store/transact.ts +39 -16
  837. package/src/store/types.ts +3 -2
  838. package/src/version.ts +1 -1
  839. package/src/visuals/index.ts +1 -0
  840. package/src/visuals/map-text.ts +1 -1
  841. package/src/visuals/object-glyph.ts +76 -0
  842. package/src/visuals/prefs.ts +22 -32
  843. package/src/visuals/tile-prefs.ts +32 -0
  844. package/src/world/feature.ts +4 -1
  845. package/src/world/project.ts +19 -4
  846. package/src/world/projection.ts +79 -8
  847. package/src/world/trap.ts +25 -21
  848. package/src/world/view.ts +11 -1
@@ -0,0 +1,161 @@
1
+ /**
2
+ * The RUNE registry: every question core asks about a rune, plus the "You feel
3
+ * stronger!" line a modifier prints on wield.
4
+ *
5
+ * WHY THIS IS A REGISTRY, and why it is a harder closure than the four before
6
+ * it. A rune is the unit of object knowledge - what the player learns, what an
7
+ * item is found to carry, what the recall screen names and describes. Six
8
+ * places in `knowledge.ts` decided all of it, and five of them dispatched on
9
+ * `rune.variety`, which was a CLOSED TYPESCRIPT UNION of seven string literals.
10
+ *
11
+ * A union is closed in a way a switch is not. A switch has a `default` arm that
12
+ * a mod's key reaches and fails at, which is at least a place to stand; a union
13
+ * refuses the key at the type level, so a mod could not coin a variety at all
14
+ * and no arm was ever reached to fail. `tools/switch-census.json` saw none of
15
+ * this - it counts `switch` statements, all five of these are under its 8-case
16
+ * threshold, and it counts neither a union type's existence nor its size. The
17
+ * census recorded ONE row for this file, `modMessage`. That is the same lesson
18
+ * gap 28 charged for in a new shape: the census measures SYNTAX, a gap is about
19
+ * REACH.
20
+ *
21
+ * The six closed decisions, and what each cost a mod-coined rune:
22
+ *
23
+ * - `runeDesc` - the recall line. No arm meant no description at all.
24
+ * - `runeName` - the display decoration ("<x> brand", "slay <x>"). Upstream's
25
+ * own `default` returns the bare name, so this one had a real fallback and
26
+ * still does; it is the only one of the six that did.
27
+ * - `playerKnowsRune` / `playerLearnRune` - the knowledge pair. A mod's rune
28
+ * was unknowable AND unlearnable, which is worse than either alone: it
29
+ * could never appear as learned, and `objectRunesKnown` therefore treated
30
+ * any object carrying one as permanently un-assessed.
31
+ * - `objectHasRune` - whether an item carries it. Always no.
32
+ * - `modMessage` - the flavour line on noticing a modifier. The only OBJ_MOD
33
+ * switch in the tree, out of 114 `OBJ_MOD.*` references. A mod-coined
34
+ * modifier was learned in silence.
35
+ *
36
+ * WHERE A MOD'S RUNE KNOWLEDGE LIVES, which is the question that made this
37
+ * conversion different from the four before it. `playerKnowsRune` reads typed
38
+ * stores on `p.objKnown` - `modifiers[]`, `elInfo[]`, `flags` - all sized from
39
+ * core's fixed-arity enums, so there is no slot for a mod's rune and growing
40
+ * that arity is exactly what `mod/vocabulary.ts` was built to avoid (see its
41
+ * header for the W2.3 architecture decision). The answer is that this registry
42
+ * needs NO new store: `knows` and `learn` are handed the player, and a mod
43
+ * keeps its own per-entity values in its own `VocabularyRegistry`, which
44
+ * already persists into that mod's opaque save bag. So the seam stays a pure
45
+ * dispatch table and there is one mechanism for mod-owned per-entity state, not
46
+ * two.
47
+ *
48
+ * THE PRODUCER IS PART OF THE SEAM, not an extra. `buildRuneList` is what every
49
+ * consumer enumerates - the knowledge screens, `objectRunesKnown`, and
50
+ * EF_IDENTIFY's random unknown rune - so six handler tables with no way to get
51
+ * a rune INTO that list would be a seam its own callers walk past, which is the
52
+ * failure three of the five previous conversions each turned up in a different
53
+ * place. `contribute` is the door: core builds its list, then every contributor
54
+ * appends.
55
+ *
56
+ * RNG: `objectFindUnknownRune` draws `randint0(poss.length)` over the list, so
57
+ * a contributor that adds runes DOES move that draw - by design, since the mod
58
+ * is adding content and its rune is now genuinely a candidate. With no mod
59
+ * loaded the list is byte-identical to before, which is what the parity claim
60
+ * needs; `rune-vectors.json` holds all 99 rows.
61
+ *
62
+ * WHY MODULE-LEVEL. The same 2026-08-09 ruling behind `EffectInfoRegistry`,
63
+ * `RandartRegistry` and `TvalRegistry`: disabling a mod always takes effect on
64
+ * the next RELOAD, so a module-level table cannot violate the mod default
65
+ * policy. `resetRuneRegistry()` restores core's arms without a fresh realm and
66
+ * has no production caller by design.
67
+ */
68
+ /* ------------------------------------------------------------------ *
69
+ * The tables.
70
+ * ------------------------------------------------------------------ */
71
+ /**
72
+ * One keyed table. The same shape as `TvalTable` and for the same reason: six
73
+ * hand-copied blocks would be six places for a capability check to go missing.
74
+ */
75
+ export class RuneTable {
76
+ table = new Map();
77
+ /** Install (or replace) the handler for one key. */
78
+ set(key, handler) {
79
+ this.table.set(key, handler);
80
+ }
81
+ /**
82
+ * The handler installed right now, or null. This is what a mod calls to WRAP
83
+ * core rather than shadow it - keep what is returned, install its own, call
84
+ * through.
85
+ */
86
+ handlerFor(key) {
87
+ return this.table.get(key) ?? null;
88
+ }
89
+ /** Whether anything handles this key. */
90
+ has(key) {
91
+ return this.table.has(key);
92
+ }
93
+ /** Every key handled, in registration order (core's first). */
94
+ keys() {
95
+ return [...this.table.keys()];
96
+ }
97
+ }
98
+ /** Everything core asks about a rune, in six tables plus one producer. */
99
+ export class RuneRegistry {
100
+ /** `rune_desc`, keyed on variety. */
101
+ desc = new RuneTable();
102
+ /** `player_knows_rune`, keyed on variety. */
103
+ knows = new RuneTable();
104
+ /** `object_has_rune`, keyed on variety. */
105
+ objectHas = new RuneTable();
106
+ /** `player_learn_rune`, keyed on variety. */
107
+ learn = new RuneTable();
108
+ /** `rune_name`'s decoration, keyed on variety. Absent means the bare name. */
109
+ name = new RuneTable();
110
+ /** `mod_message`, keyed on the OBJ_MOD index. */
111
+ modMessage = new RuneTable();
112
+ /** Extra runes for `buildRuneList`, in registration order. */
113
+ contributors = [];
114
+ /** Add a source of runes to the list every consumer enumerates. */
115
+ contribute(source) {
116
+ this.contributors.push(source);
117
+ }
118
+ /** Every contributed rune, in registration order. Core's list comes first. */
119
+ contributed(env) {
120
+ const out = [];
121
+ for (const source of this.contributors)
122
+ out.push(...source(env));
123
+ return out;
124
+ }
125
+ /** How many contributors are installed (for tests and the conflict report). */
126
+ contributorCount() {
127
+ return this.contributors.length;
128
+ }
129
+ }
130
+ /* ------------------------------------------------------------------ *
131
+ * The live registry.
132
+ * ------------------------------------------------------------------ */
133
+ /**
134
+ * Core's own seeders. `knowledge.ts` both OWNS these tables and is the only
135
+ * module that reads them, so "the module is loaded" and "core's arms are
136
+ * installed" cannot come apart - a seeder somebody has to remember to call is
137
+ * one that gets forgotten on a path, and the failure here would be silent and
138
+ * total: no rune knowable, nothing learnable, every object permanently
139
+ * un-assessed.
140
+ */
141
+ const seeders = [];
142
+ let live = new RuneRegistry();
143
+ /** Install a set of core arms, now and on every reset. A MOD never calls this. */
144
+ export function seedRune(seed) {
145
+ seeders.push(seed);
146
+ seed(live);
147
+ }
148
+ /** The live registry. Module-level; see this file's header for why that is safe. */
149
+ export function runeRegistry() {
150
+ return live;
151
+ }
152
+ /**
153
+ * Back to core's arms alone, dropping every mod registration - the same state a
154
+ * reload produces, without a fresh realm. No production caller by design.
155
+ */
156
+ export function resetRuneRegistry() {
157
+ live = new RuneRegistry();
158
+ for (const seed of seeders)
159
+ seed(live);
160
+ }
161
+ //# sourceMappingURL=rune-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rune-registry.js","sourceRoot":"","sources":["../../src/obj/rune-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AAiGH;;wEAEwE;AAExE;;;GAGG;AACH,MAAM,OAAO,SAAS;IACH,KAAK,GAAG,IAAI,GAAG,EAAQ,CAAC;IAEzC,oDAAoD;IACpD,GAAG,CAAC,GAAM,EAAE,OAAU;QACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,yCAAyC;IACzC,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,+DAA+D;IAC/D,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;CACF;AAED,0EAA0E;AAC1E,MAAM,OAAO,YAAY;IACvB,qCAAqC;IAC5B,IAAI,GAAG,IAAI,SAAS,EAAgC,CAAC;IAC9D,6CAA6C;IACpC,KAAK,GAAG,IAAI,SAAS,EAAiC,CAAC;IAChE,2CAA2C;IAClC,SAAS,GAAG,IAAI,SAAS,EAAqC,CAAC;IACxE,6CAA6C;IACpC,KAAK,GAAG,IAAI,SAAS,EAAiC,CAAC;IAChE,8EAA8E;IACrE,IAAI,GAAG,IAAI,SAAS,EAAgC,CAAC;IAC9D,iDAAiD;IACxC,UAAU,GAAG,IAAI,SAAS,EAA6B,CAAC;IAEjE,8DAA8D;IAC7C,YAAY,GAAsB,EAAE,CAAC;IAEtD,mEAAmE;IACnE,UAAU,CAAC,MAAuB;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,8EAA8E;IAC9E,WAAW,CAAC,GAAY;QACtB,MAAM,GAAG,GAAW,EAAE,CAAC;QACvB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,+EAA+E;IAC/E,gBAAgB;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAClC,CAAC;CACF;AAED;;wEAEwE;AAExE;;;;;;;GAOG;AACH,MAAM,OAAO,GAAuC,EAAE,CAAC;AAEvD,IAAI,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;AAE9B,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAC,IAAiC;IACxD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,CAAC,IAAI,CAAC,CAAC;AACb,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Golden vectors for the rune layer: what every rune in the shipped pack is
3
+ * CALLED, what it READS as, whether an object carries it, whether the player
4
+ * knows it, what learning it PRINTS, and the "You feel stronger!" line every
5
+ * modifier prints on wield.
6
+ *
7
+ * RECORDED BEFORE `RuneRegistry` EXISTED, which is the only reason they are
8
+ * evidence. A determinism test that runs the same function twice in one process
9
+ * cannot fail across a refactor - agreement is symmetric. These rows were
10
+ * produced by the six closed switches (`runeDesc`, `playerKnowsRune`,
11
+ * `objectHasRune`, `playerLearnRune`, `runeName`, `modMessage`) and replayed
12
+ * against whatever answers those questions afterwards.
13
+ *
14
+ * NO RNG ANYWHERE, measured rather than assumed: every value below is a string
15
+ * or a boolean derived from a pack record and a knowledge store. So the
16
+ * 2026-08-09 relaxation to gameplay parity buys this conversion nothing - there
17
+ * is no stream to move - and the grid can be exhaustive instead of sampled.
18
+ *
19
+ * WHAT THE GRID DELIBERATELY COVERS, because a rune grid has an easy way to
20
+ * look complete and measure nothing:
21
+ *
22
+ * - EVERY rune `buildRuneList` produces, not a sample. The list de-duplicates
23
+ * brands by name and slays by same-monsters group and skips five flag
24
+ * subtypes, so its length is a fact about the pack that a hand-written list
25
+ * would freeze wrongly.
26
+ * - Learning each rune TWICE. The second call must return false; a dispatch
27
+ * table that learned unconditionally would pass a once-only grid.
28
+ * - `objectHasRune` against an object carrying EVERY rune and against a bare
29
+ * one. One object answering `true` everywhere is not a test - the bare
30
+ * object is what makes each `true` mean something.
31
+ * - Both SIGNS of every modifier. `modMessage`'s arms differ by sign
32
+ * ("stronger" / "weaker") and two of the eleven ignore sign entirely
33
+ * (INFRA, LIGHT), which a positive-only grid could not tell apart.
34
+ */
35
+ import type { GameObject } from "./object.js";
36
+ import type { Player } from "../player/player.js";
37
+ import type { RuneEnv } from "./knowledge.js";
38
+ /** One rune's recorded answers. */
39
+ export interface RuneVectorRow {
40
+ /** `runeKey` - the save-stable identity, `variety:name`. */
41
+ key: string;
42
+ variety: string;
43
+ index: number;
44
+ name: string;
45
+ /** `runeName` - the decorated display name. */
46
+ display: string;
47
+ /** `runeDesc` - the recall line. */
48
+ desc: string;
49
+ /** `playerKnowsRune` on a fresh character. */
50
+ knowsBefore: boolean;
51
+ /** `playerLearnRune(..., message: true)` - did it learn anything. */
52
+ learned: boolean;
53
+ /** What that learn printed. */
54
+ messages: string[];
55
+ /** `playerKnowsRune` after. */
56
+ knowsAfter: boolean;
57
+ /** Learning it a second time. False for every rune upstream. */
58
+ learnedAgain: boolean;
59
+ /** `objectHasRune` against an object carrying every rune in the list. */
60
+ hasOnLoaded: boolean;
61
+ /** `objectHasRune` against an untouched object of the same kind. */
62
+ hasOnBare: boolean;
63
+ }
64
+ /** One modifier's wield messages, by sign. */
65
+ export interface ModMessageRow {
66
+ /** The OBJ_MOD index. */
67
+ mod: number;
68
+ /** The modifier's rune name in the pack, or "" when it has none. */
69
+ name: string;
70
+ /** What `objectLearnOnWield` printed for a +2 of this modifier. */
71
+ positive: string[];
72
+ /** ... and for a -2. */
73
+ negative: string[];
74
+ }
75
+ /** The whole recorded grid. */
76
+ export interface RuneVectors {
77
+ runes: RuneVectorRow[];
78
+ modMessages: ModMessageRow[];
79
+ }
80
+ /** The fixture surface the producer needs (see `rune-vectors.fixtures.ts`). */
81
+ export interface RuneVectorWorldLike {
82
+ env: RuneEnv;
83
+ player(): Player;
84
+ drain(): string[];
85
+ object(tval: number): GameObject;
86
+ blankObject(tval: number): GameObject;
87
+ }
88
+ /**
89
+ * Produce the grid. ONE implementation, called by both the generator and the
90
+ * test, so the recorded file and the replay cannot drift into measuring
91
+ * different things.
92
+ *
93
+ * `tval` picks the object every `objectHasRune` question is asked against. A
94
+ * RING is used because it is jewellery (so `objectHasStandardToH` has nothing
95
+ * to say about it) and carries no base plusses of its own, which keeps the bare
96
+ * row honestly negative.
97
+ */
98
+ export declare function recordRuneVectors(world: RuneVectorWorldLike, tval: number): RuneVectors;
99
+ //# sourceMappingURL=rune-vectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rune-vectors.d.ts","sourceRoot":"","sources":["../../src/obj/rune-vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAcH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+BAA+B;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,YAAY,EAAE,OAAO,CAAC;IACtB,yEAAyE;IACzE,WAAW,EAAE,OAAO,CAAC;IACrB,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,+BAA+B;AAC/B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,+EAA+E;AAC/E,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,IAAI,MAAM,CAAC;IACjB,KAAK,IAAI,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACjC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CACvC;AAoDD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,MAAM,GACX,WAAW,CA4Db"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The world the rune vectors are recorded against, built from the real shipped
3
+ * content pack.
4
+ *
5
+ * SEPARATE FILE, and it reads the disk: keeping `node:fs` out of
6
+ * `rune-vectors.ts` means the row producer stays importable from anywhere. ONE
7
+ * copy, shared by `rune-vectors.test.ts` and by `scripts/gen-rune-vectors.mjs`,
8
+ * so the test and the generator cannot disagree about what they are measuring.
9
+ *
10
+ * THE REAL PACK rather than synthetic tables, on purpose. `buildRuneList`
11
+ * de-duplicates brands by name and slays by same-monsters group, and skips five
12
+ * flag subtypes - a hand-built table would be an assertion about what the pack
13
+ * producer emits, and an unchecked one. `elementNames` is derived the way
14
+ * `session/game.ts:741` derives it (projections, sliced to ELEM_MAX), not
15
+ * hand-listed: two nearby test fixtures hard-code four element names, which is
16
+ * enough for a targeted test and would silently shorten this grid by ten.
17
+ */
18
+ import { ObjRegistry } from "./bind.js";
19
+ import type { Player } from "../player/player.js";
20
+ import type { GameObject } from "./object.js";
21
+ import type { RuneEnv } from "./knowledge.js";
22
+ /** Everything one rune vector run needs. */
23
+ export interface RuneVectorWorld {
24
+ /** A fresh player with empty rune knowledge, marked as playing. */
25
+ player(): Player;
26
+ /** The env every rune call is made against; `msg` pushes into `messages`. */
27
+ env: RuneEnv;
28
+ /** Messages emitted since the last `drain()`. */
29
+ drain(): string[];
30
+ /** A freshly prepared object of the first ordinary kind of a given tval. */
31
+ object(tval: number): GameObject;
32
+ /** object_new: the same kind, zeroed, carrying nothing of its own. */
33
+ blankObject(tval: number): GameObject;
34
+ }
35
+ /**
36
+ * Build the fixture world. The registry binds every object table plus the
37
+ * projections `elementNames` is derived from; nothing here needs an RNG stream,
38
+ * so the one `Rng` exists only because `makeRuneEnv` wants a `randcalcVaries`
39
+ * and is seeded fixed.
40
+ */
41
+ export declare function runeVectorWorld(): RuneVectorWorld & {
42
+ reg: ObjRegistry;
43
+ };
44
+ //# sourceMappingURL=rune-vectors.fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rune-vectors.fixtures.d.ts","sourceRoot":"","sources":["../../src/obj/rune-vectors.fixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AASxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAe9C,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,MAAM,IAAI,MAAM,CAAC;IACjB,6EAA6E;IAC7E,GAAG,EAAE,OAAO,CAAC;IACb,iDAAiD;IACjD,KAAK,IAAI,MAAM,EAAE,CAAC;IAClB,4EAA4E;IAC5E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACjC,sEAAsE;IACtE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,eAAe,GAAG;IAAE,GAAG,EAAE,WAAW,CAAA;CAAE,CAgGxE"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * The world the rune vectors are recorded against, built from the real shipped
3
+ * content pack.
4
+ *
5
+ * SEPARATE FILE, and it reads the disk: keeping `node:fs` out of
6
+ * `rune-vectors.ts` means the row producer stays importable from anywhere. ONE
7
+ * copy, shared by `rune-vectors.test.ts` and by `scripts/gen-rune-vectors.mjs`,
8
+ * so the test and the generator cannot disagree about what they are measuring.
9
+ *
10
+ * THE REAL PACK rather than synthetic tables, on purpose. `buildRuneList`
11
+ * de-duplicates brands by name and slays by same-monsters group, and skips five
12
+ * flag subtypes - a hand-built table would be an assertion about what the pack
13
+ * producer emits, and an unchecked one. `elementNames` is derived the way
14
+ * `session/game.ts:741` derives it (projections, sliced to ELEM_MAX), not
15
+ * hand-listed: two nearby test fixtures hard-code four element names, which is
16
+ * enough for a targeted test and would silently shorten this grid by ten.
17
+ */
18
+ import { readFileSync } from "node:fs";
19
+ import { ELEM_MAX } from "./types.js";
20
+ import { ObjRegistry } from "./bind.js";
21
+ import { bindPlayer } from "../player/bind.js";
22
+ import { blankPlayer } from "../player/player.js";
23
+ import { makeRuneEnv } from "./knowledge.js";
24
+ import { bindConstants } from "../constants.js";
25
+ import { objectNew } from "./object.js";
26
+ import { objectPrep } from "./make.js";
27
+ import { Rng } from "../rng.js";
28
+ function loadJson(name) {
29
+ return JSON.parse(readFileSync(new URL(`../../../content/pack/${name}.json`, import.meta.url), "utf8"));
30
+ }
31
+ function loadRecords(name) {
32
+ return loadJson(name).records;
33
+ }
34
+ /**
35
+ * Build the fixture world. The registry binds every object table plus the
36
+ * projections `elementNames` is derived from; nothing here needs an RNG stream,
37
+ * so the one `Rng` exists only because `makeRuneEnv` wants a `randcalcVaries`
38
+ * and is seeded fixed.
39
+ */
40
+ export function runeVectorWorld() {
41
+ const reg = new ObjRegistry({
42
+ objectBase: loadJson("object_base"),
43
+ object: loadJson("object"),
44
+ egoItem: loadJson("ego_item"),
45
+ artifact: loadJson("artifact"),
46
+ curse: loadJson("curse"),
47
+ brand: loadJson("brand"),
48
+ slay: loadJson("slay"),
49
+ activation: loadJson("activation"),
50
+ objectProperty: loadJson("object_property"),
51
+ flavor: loadJson("flavor"),
52
+ });
53
+ const players = bindPlayer({
54
+ races: loadRecords("p_race"),
55
+ classes: loadRecords("class"),
56
+ properties: loadRecords("player_property"),
57
+ timed: loadRecords("player_timed"),
58
+ shapes: loadRecords("shape"),
59
+ bodies: loadRecords("body"),
60
+ history: loadRecords("history"),
61
+ realms: loadRecords("realm"),
62
+ });
63
+ /* session/game.ts:741 - projections sliced to ELEM_MAX, by name. */
64
+ const elementNames = loadRecords("projection")
65
+ .slice(0, ELEM_MAX)
66
+ .map((p) => p.name);
67
+ const constants = bindConstants(loadJson("constants"));
68
+ const messages = [];
69
+ const rng = new Rng(7);
70
+ const equipment = [];
71
+ const env = makeRuneEnv((slot) => equipment[slot] ?? null, (v) => rng.randcalcVaries(v), {
72
+ brands: reg.brands,
73
+ slays: reg.slays,
74
+ curses: reg.curses,
75
+ properties: reg.properties,
76
+ elementNames,
77
+ msg: (t) => messages.push(t),
78
+ });
79
+ const race = players.raceByName("Human");
80
+ const cls = players.classByName("Warrior");
81
+ const body = players.bodies[race.body];
82
+ return {
83
+ reg,
84
+ env,
85
+ player() {
86
+ const p = blankPlayer(race, cls, body);
87
+ /* modMessage is guarded by upkeep.playing (knowledge.ts:646): a wield
88
+ * during birth or level-feeling prints nothing. Recording with it off
89
+ * would produce a grid of empty message lists that could not disagree
90
+ * with a broken dispatch table. */
91
+ p.upkeep.playing = true;
92
+ return p;
93
+ },
94
+ drain() {
95
+ const out = [...messages];
96
+ messages.length = 0;
97
+ return out;
98
+ },
99
+ object(tval) {
100
+ /* object_prep, not object_new: object_new is a zeroed allocation whose
101
+ * tval is still 0, and the point of asking `objectHasRune` about a REAL
102
+ * item is that the item's own fields are filled in. The "maximise" aspect
103
+ * draws no entropy (randcalc takes the bound rather than a roll), so the
104
+ * grid stays RNG-free. */
105
+ return objectPrep(rng, reg, constants, kindOf(tval), 0, "maximise");
106
+ },
107
+ blankObject(tval) {
108
+ /* object_new, and the modifier-message rows need exactly this. A prepared
109
+ * ring of the first ordinary sval is a Ring of STRENGTH: it carries +STR
110
+ * and SUST_STR of its own, so wielding it learns those too and every one
111
+ * of the sixteen rows would carry the same four-line prefix. Four lines of
112
+ * constant noise in a six-line row is a grid that mostly measures the
113
+ * fixture. A zeroed object has exactly one modifier set - the one under
114
+ * test. */
115
+ return objectNew(kindOf(tval));
116
+ },
117
+ };
118
+ function kindOf(tval) {
119
+ const kind = reg.kinds.find((k) => k.tval === tval && k.kidx < reg.ordinaryKindCount);
120
+ if (!kind)
121
+ throw new Error(`no ordinary kind for tval ${tval}`);
122
+ return kind;
123
+ }
124
+ }
125
+ //# sourceMappingURL=rune-vectors.fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rune-vectors.fixtures.js","sourceRoot":"","sources":["../../src/obj/rune-vectors.fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Golden vectors for the rune layer: what every rune in the shipped pack is
3
+ * CALLED, what it READS as, whether an object carries it, whether the player
4
+ * knows it, what learning it PRINTS, and the "You feel stronger!" line every
5
+ * modifier prints on wield.
6
+ *
7
+ * RECORDED BEFORE `RuneRegistry` EXISTED, which is the only reason they are
8
+ * evidence. A determinism test that runs the same function twice in one process
9
+ * cannot fail across a refactor - agreement is symmetric. These rows were
10
+ * produced by the six closed switches (`runeDesc`, `playerKnowsRune`,
11
+ * `objectHasRune`, `playerLearnRune`, `runeName`, `modMessage`) and replayed
12
+ * against whatever answers those questions afterwards.
13
+ *
14
+ * NO RNG ANYWHERE, measured rather than assumed: every value below is a string
15
+ * or a boolean derived from a pack record and a knowledge store. So the
16
+ * 2026-08-09 relaxation to gameplay parity buys this conversion nothing - there
17
+ * is no stream to move - and the grid can be exhaustive instead of sampled.
18
+ *
19
+ * WHAT THE GRID DELIBERATELY COVERS, because a rune grid has an easy way to
20
+ * look complete and measure nothing:
21
+ *
22
+ * - EVERY rune `buildRuneList` produces, not a sample. The list de-duplicates
23
+ * brands by name and slays by same-monsters group and skips five flag
24
+ * subtypes, so its length is a fact about the pack that a hand-written list
25
+ * would freeze wrongly.
26
+ * - Learning each rune TWICE. The second call must return false; a dispatch
27
+ * table that learned unconditionally would pass a once-only grid.
28
+ * - `objectHasRune` against an object carrying EVERY rune and against a bare
29
+ * one. One object answering `true` everywhere is not a test - the bare
30
+ * object is what makes each `true` mean something.
31
+ * - Both SIGNS of every modifier. `modMessage`'s arms differ by sign
32
+ * ("stronger" / "weaker") and two of the eleven ignore sign entirely
33
+ * (INFRA, LIGHT), which a positive-only grid could not tell apart.
34
+ */
35
+ import { OBJ_MOD_MAX } from "./types.js";
36
+ import { buildRuneList, objectHasRune, objectLearnOnWield, playerKnowsRune, playerLearnRune, runeDesc, runeKey, runeName, } from "./knowledge.js";
37
+ /**
38
+ * Write one rune onto an object, so `objectHasRune` has something to find.
39
+ *
40
+ * This is the one place the grid encodes per-variety knowledge, and it is
41
+ * deliberately the WRITE side rather than the read side: `objectHasRune` is
42
+ * what is being measured, so the fixture must reach the object's fields
43
+ * directly instead of asking the function under test to describe itself.
44
+ */
45
+ function applyRune(env, obj, rune) {
46
+ switch (rune.variety) {
47
+ case "combat":
48
+ if (rune.index === 0)
49
+ obj.toA = 1;
50
+ else if (rune.index === 1)
51
+ obj.toH = 1;
52
+ else
53
+ obj.toD = 1;
54
+ return;
55
+ case "mod":
56
+ obj.modifiers[rune.index] = 1;
57
+ return;
58
+ case "resist": {
59
+ const info = obj.elInfo[rune.index];
60
+ if (info)
61
+ info.resLevel = 1;
62
+ return;
63
+ }
64
+ case "brand": {
65
+ obj.brands ??= new Array(env.brands.length).fill(false);
66
+ obj.brands[rune.index] = true;
67
+ return;
68
+ }
69
+ case "slay": {
70
+ obj.slays ??= new Array(env.slays.length).fill(false);
71
+ obj.slays[rune.index] = true;
72
+ return;
73
+ }
74
+ case "curse": {
75
+ obj.curses ??= Array.from({ length: env.curses.length }, () => ({
76
+ power: 0,
77
+ timeout: 0,
78
+ }));
79
+ const c = obj.curses[rune.index];
80
+ if (c)
81
+ c.power = 1;
82
+ return;
83
+ }
84
+ case "flag":
85
+ obj.flags.on(rune.index);
86
+ return;
87
+ default:
88
+ return;
89
+ }
90
+ }
91
+ /**
92
+ * Produce the grid. ONE implementation, called by both the generator and the
93
+ * test, so the recorded file and the replay cannot drift into measuring
94
+ * different things.
95
+ *
96
+ * `tval` picks the object every `objectHasRune` question is asked against. A
97
+ * RING is used because it is jewellery (so `objectHasStandardToH` has nothing
98
+ * to say about it) and carries no base plusses of its own, which keeps the bare
99
+ * row honestly negative.
100
+ */
101
+ export function recordRuneVectors(world, tval) {
102
+ const { env } = world;
103
+ const runes = buildRuneList(env);
104
+ const loaded = world.object(tval);
105
+ for (const rune of runes)
106
+ applyRune(env, loaded, rune);
107
+ const bare = world.object(tval);
108
+ const rows = runes.map((rune) => {
109
+ const p = world.player();
110
+ world.drain();
111
+ const knowsBefore = playerKnowsRune(p, rune);
112
+ const learned = playerLearnRune(p, env, rune, true);
113
+ const messages = world.drain();
114
+ const knowsAfter = playerKnowsRune(p, rune);
115
+ const learnedAgain = playerLearnRune(p, env, rune, true);
116
+ world.drain();
117
+ return {
118
+ key: runeKey(rune),
119
+ variety: rune.variety,
120
+ index: rune.index,
121
+ name: rune.name,
122
+ display: runeName(rune),
123
+ desc: runeDesc(env, rune),
124
+ knowsBefore,
125
+ learned,
126
+ messages,
127
+ knowsAfter,
128
+ learnedAgain,
129
+ hasOnLoaded: objectHasRune(env, loaded, rune),
130
+ hasOnBare: objectHasRune(env, bare, rune),
131
+ };
132
+ });
133
+ /* The modifier names, taken from the rune list rather than looked up a
134
+ * second way: two producers of the same string is two chances to disagree. */
135
+ const modNames = new Map();
136
+ for (const rune of runes) {
137
+ if (rune.variety === "mod")
138
+ modNames.set(rune.index, rune.name);
139
+ }
140
+ const modMessages = [];
141
+ for (let mod = 0; mod < OBJ_MOD_MAX; mod++) {
142
+ const sign = (value) => {
143
+ const p = world.player();
144
+ const obj = world.blankObject(tval);
145
+ obj.modifiers[mod] = value;
146
+ world.drain();
147
+ objectLearnOnWield(p, obj, env);
148
+ return world.drain();
149
+ };
150
+ modMessages.push({
151
+ mod,
152
+ name: modNames.get(mod) ?? "",
153
+ positive: sign(2),
154
+ negative: sign(-2),
155
+ });
156
+ }
157
+ return { runes: rows, modMessages };
158
+ }
159
+ //# sourceMappingURL=rune-vectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rune-vectors.js","sourceRoot":"","sources":["../../src/obj/rune-vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,QAAQ,EACR,OAAO,EACP,QAAQ,GACT,MAAM,gBAAgB,CAAC;AA4DxB;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,GAAY,EAAE,GAAe,EAAE,IAAU;IAC1D,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;gBAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;iBAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;gBAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;;gBAClC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YACjB,OAAO;QACT,KAAK,KAAK;YACR,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO;QACT,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,IAAI;gBAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,GAAG,CAAC,MAAM,KAAK,IAAI,KAAK,CAAU,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,GAAG,CAAC,KAAK,KAAK,IAAI,KAAK,CAAU,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/D,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC9D,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,CAAC;aACX,CAAC,CAAC,CAAC;YACJ,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC;gBAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,KAAK,MAAM;YACT,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO;QACT;YACE,OAAO;IACX,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAA0B,EAC1B,IAAY;IAEZ,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACtB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAoB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/C,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACzB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC;YAClB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;YACzB,WAAW;YACX,OAAO;YACP,QAAQ;YACR,UAAU;YACV,YAAY;YACZ,WAAW,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC;YAC7C,SAAS,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;SAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH;kFAC8E;IAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,KAAa,EAAY,EAAE;YACvC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACpC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC3B,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,GAAG;YACH,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YAC7B,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YACjB,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AACtC,CAAC"}