@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
@@ -7,13 +7,15 @@
7
7
  *
8
8
  * This is the attack-resolution shell: to-hit, damage, and critical. The
9
9
  * projectile path, ammo/quiver management, drop_near/breakage application,
10
- * piercing (TMD_POWERSHOT), and the do_cmd_fire/throw command front-ends live
11
- * in the world/command layer and are DEFERRED (see parity/ledger).
10
+ * piercing (TMD_POWERSHOT) and the do_cmd_fire/throw front ends live in the
11
+ * world/command layer, which is ported: game/ranged-cmd.ts and the quiver
12
+ * subsystem in game/gear.ts.
12
13
  *
13
- * DEFERRED (ledgered in parity/ledger/combat-ranged.yaml): knowledge/learning
14
- * (missile_learn_*, learn_brand_slay_from_launch/throw), OF_EXPLODE triple
15
- * damage happens in make_ranged_throw here but the projectile path/target
16
- * selection does not; temporary brands/slays.
14
+ * The knowledge/learning half is ported too: missileLearnOnRangedAttack
15
+ * (obj/knowledge.ts:637, called at ranged-cmd.ts:164-167) and
16
+ * learnBrandSlayFromLaunch / FromThrow (combat/brand-slay.ts). Temporary
17
+ * brands/slays are ported as an injected predicate (TempBrandSlay); the
18
+ * launcher/throw paths pass allow_temp = false, as upstream does.
17
19
  *
18
20
  * O-combat ranged (birth_percent_damage) IS ported: oRangedDamage /
19
21
  * o_critical_shot, gated in makeRangedShot / makeRangedThrow at the same points
@@ -22,7 +24,7 @@
22
24
  */
23
25
 
24
26
  import type { Rng } from "../rng.js";
25
- import type { Brand, Slay } from "../obj/types.js";
27
+ import type { Brand, Curse, Slay } from "../obj/types.js";
26
28
  import type { GameObject } from "../obj/object.js";
27
29
  import type { Monster } from "../mon/monster.js";
28
30
  import type { Player } from "../player/player.js";
@@ -80,8 +82,9 @@ export function chanceOfMissileHitBase(
80
82
  state: PlayerCombatState,
81
83
  missile: GameObject,
82
84
  launcher: GameObject | null,
85
+ curses?: readonly (Curse | null)[] | null,
83
86
  ): number {
84
- let bonus = objectToHit(missile);
87
+ let bonus = objectToHit(missile, curses);
85
88
  let chance: number;
86
89
 
87
90
  if (!launcher) {
@@ -94,7 +97,7 @@ export function chanceOfMissileHitBase(
94
97
  bonus * BTH_PLUS_ADJ;
95
98
  }
96
99
  } else {
97
- bonus += state.toH + objectToHit(launcher);
100
+ bonus += state.toH + objectToHit(launcher, curses);
98
101
  chance = skill(state, SKILL.TO_HIT_BOW) + bonus * BTH_PLUS_ADJ;
99
102
  }
100
103
 
@@ -111,8 +114,10 @@ export function chanceOfMissileHit(
111
114
  launcher: GameObject | null,
112
115
  distance: number,
113
116
  monObvious: boolean,
117
+ curses?: readonly (Curse | null)[] | null,
114
118
  ): number {
115
- const chance = chanceOfMissileHitBase(state, missile, launcher) - distance;
119
+ const chance =
120
+ chanceOfMissileHitBase(state, missile, launcher, curses) - distance;
116
121
  return monObvious ? chance : Math.trunc(chance / 2);
117
122
  }
118
123
 
@@ -130,6 +135,7 @@ export function rangedDamage(
130
135
  slay: number,
131
136
  brands: readonly (Brand | null)[],
132
137
  slays: readonly (Slay | null)[],
138
+ curses?: readonly (Curse | null)[] | null,
133
139
  ): number {
134
140
  let mult = launcher ? state.ammoMult : 1;
135
141
 
@@ -140,11 +146,11 @@ export function rangedDamage(
140
146
  }
141
147
 
142
148
  let dmg = rng.damroll(missile.dd, missile.ds);
143
- dmg += objectToDam(missile);
149
+ dmg += objectToDam(missile, curses);
144
150
  if (launcher) {
145
- dmg += objectToDam(launcher);
151
+ dmg += objectToDam(launcher, curses);
146
152
  } else if (missile.flags.has(OF.THROWING)) {
147
- dmg *= 2 + Math.trunc(objectWeightOne(missile) / 12);
153
+ dmg *= 2 + Math.trunc(objectWeightOne(missile, curses) / 12);
148
154
  }
149
155
  dmg *= mult;
150
156
 
@@ -179,6 +185,7 @@ export function oRangedDamage(
179
185
  slay: number,
180
186
  brands: readonly (Brand | null)[],
181
187
  slays: readonly (Slay | null)[],
188
+ curses?: readonly (Curse | null)[] | null,
182
189
  ): RangedDamageOutcome {
183
190
  const mult = launcher ? state.ammoMult : 1;
184
191
  let dice = missile.dd;
@@ -204,9 +211,9 @@ export function oRangedDamage(
204
211
 
205
212
  /* Deadliness: missile to-dam always; launcher adds launcher to-dam + to_d;
206
213
  * a thrown throwing-weapon adds to_d; a plain thrown object adds neither. */
207
- let deadliness = objectToDam(missile);
214
+ let deadliness = objectToDam(missile, curses);
208
215
  if (launcher) {
209
- deadliness += objectToDam(launcher) + state.toD;
216
+ deadliness += objectToDam(launcher, curses) + state.toD;
210
217
  } else if (missile.flags.has(OF.THROWING)) {
211
218
  deadliness += state.toD;
212
219
  }
@@ -239,7 +246,7 @@ export function oRangedDamage(
239
246
  );
240
247
  dice += crit.addDice;
241
248
  msg = crit.msg;
242
- dice *= 2 + Math.trunc(objectWeightOne(missile) / 12);
249
+ dice *= 2 + Math.trunc(objectWeightOne(missile, curses) / 12);
243
250
  }
244
251
 
245
252
  let dmg = rng.damroll(dice, sides);
@@ -264,11 +271,12 @@ export function makeRangedShot(
264
271
  distance: number,
265
272
  monObvious = true,
266
273
  percentDamage = false,
274
+ curses?: readonly (Curse | null)[] | null,
267
275
  ): RangedAttackResult {
268
276
  if (
269
277
  !testHit(
270
278
  rng,
271
- chanceOfMissileHit(state, ammo, launcher, distance, monObvious),
279
+ chanceOfMissileHit(state, ammo, launcher, distance, monObvious, curses),
272
280
  mon.race.ac,
273
281
  )
274
282
  ) {
@@ -285,20 +293,24 @@ export function makeRangedShot(
285
293
  let dmg: number;
286
294
  let msg: HitType;
287
295
  if (!percentDamage) {
288
- dmg = rangedDamage(rng, state, mon, ammo, launcher, mod.brand, mod.slay, brands, slays);
296
+ dmg = rangedDamage(
297
+ rng, state, mon, ammo, launcher, mod.brand, mod.slay, brands, slays, curses,
298
+ );
289
299
  const crit = criticalShot(
290
300
  rng,
291
301
  critActor(p, state),
292
302
  mon,
293
- objectWeightOne(ammo),
294
- objectToHit(ammo),
303
+ objectWeightOne(ammo, curses),
304
+ objectToHit(ammo, curses),
295
305
  dmg,
296
306
  true,
297
307
  );
298
308
  dmg = crit.damage;
299
309
  msg = crit.msg;
300
310
  } else {
301
- const o = oRangedDamage(rng, state, mon, ammo, launcher, mod.brand, mod.slay, brands, slays);
311
+ const o = oRangedDamage(
312
+ rng, state, mon, ammo, launcher, mod.brand, mod.slay, brands, slays, curses,
313
+ );
302
314
  dmg = o.damage;
303
315
  msg = o.msg;
304
316
  }
@@ -328,11 +340,12 @@ export function makeRangedThrow(
328
340
  distance: number,
329
341
  monObvious = true,
330
342
  percentDamage = false,
343
+ curses?: readonly (Curse | null)[] | null,
331
344
  ): RangedAttackResult {
332
345
  if (
333
346
  !testHit(
334
347
  rng,
335
- chanceOfMissileHit(state, obj, null, distance, monObvious),
348
+ chanceOfMissileHit(state, obj, null, distance, monObvious, curses),
336
349
  mon.race.ac,
337
350
  )
338
351
  ) {
@@ -346,20 +359,24 @@ export function makeRangedThrow(
346
359
  let dmg: number;
347
360
  let msg: HitType;
348
361
  if (!percentDamage) {
349
- dmg = rangedDamage(rng, state, mon, obj, null, mod.brand, mod.slay, brands, slays);
362
+ dmg = rangedDamage(
363
+ rng, state, mon, obj, null, mod.brand, mod.slay, brands, slays, curses,
364
+ );
350
365
  const crit = criticalShot(
351
366
  rng,
352
367
  critActor(p, state),
353
368
  mon,
354
- objectWeightOne(obj),
355
- objectToHit(obj),
369
+ objectWeightOne(obj, curses),
370
+ objectToHit(obj, curses),
356
371
  dmg,
357
372
  false,
358
373
  );
359
374
  dmg = crit.damage;
360
375
  msg = crit.msg;
361
376
  } else {
362
- const o = oRangedDamage(rng, state, mon, obj, null, mod.brand, mod.slay, brands, slays);
377
+ const o = oRangedDamage(
378
+ rng, state, mon, obj, null, mod.brand, mod.slay, brands, slays, curses,
379
+ );
363
380
  dmg = o.damage;
364
381
  msg = o.msg;
365
382
  }
package/src/constants.ts CHANGED
@@ -143,6 +143,21 @@ export interface Constants {
143
143
  oRangedCritical: ORangedCritical;
144
144
  }
145
145
 
146
+ /**
147
+ * `world:feeling-need` in the SHIPPED constants.txt (`:119`): how many grids of
148
+ * a level the player must have explored before the object half of the level
149
+ * feeling is revealed rather than shown as `?`.
150
+ *
151
+ * It is here, named and cited, because two display functions need a value when
152
+ * no caller hands them one - the worldless harness, mainly - and they each had
153
+ * a bare `10` written into them instead. A literal in two files is a value that
154
+ * can drift from its data and from itself; this one is checked against
155
+ * constants.txt by a test. Anything with a loaded pack must pass
156
+ * `constants.feelingNeed`, which is the whole point of the row: a pack or mod
157
+ * that changes the number has to be obeyed.
158
+ */
159
+ export const SHIPPED_FEELING_NEED = 10;
160
+
146
161
  /** section -> label -> Constants field, mirroring init.c parse_constants_*. */
147
162
  const SCALAR_MAP: Record<string, Record<string, string>> = {
148
163
  "level-max": { monsters: "levelMonsterMax" },
@@ -0,0 +1,148 @@
1
+ /**
2
+ * datafile.c's WRITERS - the half of the data-file layer that emits a record
3
+ * rather than parsing one (parser.c covers the reading side).
4
+ *
5
+ * These exist because two very different features need to round-trip game data
6
+ * back out through the same grammar the .txt files use: mon-lore.c's "dump
7
+ * monster knowledge" and obj-randart.c's optional randart.txt. Upstream shares
8
+ * one implementation between them, so the port does too - writeFlags used to
9
+ * live in mon/lore-file.ts, which made obj/ reach into mon/ for it.
10
+ *
11
+ * Each writer returns a string instead of taking a file handle: HostIo.write is
12
+ * a whole-file call, so the callers assemble their document and write once.
13
+ *
14
+ * All three reproduce the same two upstream warts, and a parser reading these
15
+ * files has to cope with them:
16
+ *
17
+ * - the " | " separator is appended BEFORE the next name is known, so a run
18
+ * that stops early leaves a trailing separator in the buffer, and that
19
+ * buffer is still written;
20
+ * - `pointer` is compared against 60 AFTER the name is appended, so a line
21
+ * can overshoot by the length of its last entry.
22
+ */
23
+ import type { FlagSet } from "./bitflag.js";
24
+ import {
25
+ ELEMENT_ENTRIES,
26
+ OBJECT_MODIFIER_ENTRIES,
27
+ STAT_ENTRIES,
28
+ } from "./generated/index.js";
29
+
30
+ /** OBJ_MOD_MAX: the stats come first, then list-object-modifiers.h. */
31
+ const OBJ_MOD_NAMES: readonly string[] = [
32
+ ...STAT_ENTRIES.map((e) => e.name),
33
+ ...OBJECT_MODIFIER_ENTRIES.map((e) => e.name),
34
+ ];
35
+
36
+ /**
37
+ * write_flags (datafile.c:482-514): `intro` followed by the set flags' names,
38
+ * " | "-separated, wrapped at ~60 characters.
39
+ */
40
+ export function writeFlags(
41
+ intro: string,
42
+ flags: FlagSet,
43
+ size: number,
44
+ names: readonly (string | undefined)[],
45
+ ): string {
46
+ const lines: string[] = [];
47
+ let buf = "";
48
+ let pointer = 0;
49
+
50
+ for (
51
+ let flag = flags.next(1);
52
+ flag > 0 && flag < size * 8;
53
+ flag = flags.next(flag + 1)
54
+ ) {
55
+ if (buf.length > 0) {
56
+ buf += " | ";
57
+ pointer += 3;
58
+ }
59
+ /* "If no name, we're past the real flags" - and the trailing " | " stays. */
60
+ const name = names[flag];
61
+ if (name === undefined) break;
62
+ buf += name;
63
+ pointer += name.length;
64
+
65
+ if (pointer >= 60) {
66
+ lines.push(`${intro}${buf}\n`);
67
+ buf = "";
68
+ pointer = 0;
69
+ }
70
+ }
71
+
72
+ /* "Print remaining flags if any", gated on pointer rather than on buf. */
73
+ if (pointer) lines.push(`${intro}${buf}\n`);
74
+ return lines.join("");
75
+ }
76
+
77
+ /**
78
+ * write_mods (datafile.c:520-563): `values:` lines for every non-zero modifier,
79
+ * as NAME[value].
80
+ *
81
+ * `pointer += 5` for the "[%d]" regardless of how many digits the value has -
82
+ * upstream's own approximation, kept because it is what decides where the line
83
+ * breaks.
84
+ */
85
+ export function writeMods(values: readonly number[]): string {
86
+ const lines: string[] = [];
87
+ let buf = "";
88
+ let pointer = 0;
89
+
90
+ for (let i = 0; i < OBJ_MOD_NAMES.length; i++) {
91
+ const v = values[i] ?? 0;
92
+ if (v === 0) continue;
93
+
94
+ if (buf.length > 0) {
95
+ buf += " | ";
96
+ pointer += 3;
97
+ }
98
+ const name = OBJ_MOD_NAMES[i]!;
99
+ buf += `${name}[${String(v)}]`;
100
+ pointer += name.length + 5;
101
+
102
+ if (pointer >= 60) {
103
+ lines.push(`values:${buf}\n`);
104
+ buf = "";
105
+ pointer = 0;
106
+ }
107
+ }
108
+
109
+ if (pointer) lines.push(`values:${buf}\n`);
110
+ return lines.join("");
111
+ }
112
+
113
+ /**
114
+ * write_elements (datafile.c:569-610): `values:` lines for every element with a
115
+ * non-zero resistance level, as RES_NAME[level].
116
+ *
117
+ * `pointer += strlen(name) + 4` counts "RES_" but the value still only counts
118
+ * as 5 - the same approximation as write_mods.
119
+ */
120
+ export function writeElements(
121
+ elInfo: readonly { readonly resLevel: number }[],
122
+ ): string {
123
+ const lines: string[] = [];
124
+ let buf = "";
125
+ let pointer = 0;
126
+
127
+ for (let i = 0; i < ELEMENT_ENTRIES.length; i++) {
128
+ const level = elInfo[i]?.resLevel ?? 0;
129
+ if (level === 0) continue;
130
+
131
+ if (buf.length > 0) {
132
+ buf += " | ";
133
+ pointer += 3;
134
+ }
135
+ const name = ELEMENT_ENTRIES[i]!.name;
136
+ buf += `RES_${name}[${String(level)}]`;
137
+ pointer += name.length + 4 + 5;
138
+
139
+ if (pointer >= 60) {
140
+ lines.push(`values:${buf}\n`);
141
+ buf = "";
142
+ pointer = 0;
143
+ }
144
+ }
145
+
146
+ if (pointer) lines.push(`values:${buf}\n`);
147
+ return lines.join("");
148
+ }
@@ -0,0 +1,313 @@
1
+ /**
2
+ * The EFFECT INFO registry: everything the game SAYS about an effect, and how a
3
+ * gamedata `type:` name becomes its integer subtype.
4
+ *
5
+ * WHY THIS IS A REGISTRY. `registry:effect` already let a mod register a handler
6
+ * for a brand-new effect code and have it DO something. What it could not do was
7
+ * let the game describe it. Four closed `switch` statements stood in the way,
8
+ * and each failed silently rather than loudly:
9
+ *
10
+ * - `effectMenuName` (effect-info.ts, keyed on the EFINFO_* flag) returned ""
11
+ * for an unknown flag, so a mod's effect showed a BLANK ROW in the "Activate
12
+ * which item?" and spell menus.
13
+ * - `formatEffectDesc` (effect-info.ts, same key) returned "" as well, so
14
+ * object recall and spell descriptions said nothing at all about it.
15
+ * - the activation summary walker (obj/effects-info.ts, keyed on the effect
16
+ * CODE) counted it "unsummarized", so a randart activation built from a mod
17
+ * effect could never be recognised as duplicating an intrinsic property.
18
+ * - `effectSubtype` (effect.ts, keyed on the EF index) returned -1 for every
19
+ * name, so a mod's effect could take NO named subtype - only a bare integer.
20
+ *
21
+ * FOUR TABLES, THREE KEYS, and they are separate because upstream's keys are.
22
+ * The EFINFO_* flag is a property of the effect's ENTRY (many effects share one
23
+ * flag: twenty flags cover a hundred and twelve effects), the summary walker
24
+ * keys on the effect's own code, and subtype decoding keys on the effect index.
25
+ * Collapsing them would force a mod to register the same behaviour three times
26
+ * under three spellings.
27
+ *
28
+ * WHY MODULE-LEVEL. Ruled 2026-08-09: disabling a mod always takes effect on the
29
+ * next RELOAD (exiting mod management prompts to save and reload). A toggle can
30
+ * therefore never need to apply to a running session, so a module-level table
31
+ * cannot violate the mod default policy.
32
+ *
33
+ * What actually clears it is the reload itself: a fresh page is a fresh module
34
+ * instance, and the host installs each plugin at most once per realm
35
+ * (`installedPluginIds` in web/main.ts is never cleared). So a disabled mod's
36
+ * registrations are gone on the next boot because the table they lived in is.
37
+ * `resetEffectInfoRegistry()` is the same restoration WITHOUT a fresh realm -
38
+ * core's arms back, every mod registration dropped - which is what a test needs
39
+ * in order to prove the mod default policy holds here rather than assert it.
40
+ * It has no production caller and is not meant to acquire one: calling it
41
+ * mid-session would strip a running mod's handlers, which is precisely the
42
+ * live-toggle behaviour the ruling says must not happen.
43
+ *
44
+ * ORDER AND RNG. Core's handlers are the case bodies lifted unchanged. Nothing
45
+ * here draws: upstream's `effect_describe` calls `dice_roll()` to populate the
46
+ * random_value it formats, and the port substitutes `Dice.randomValue()` at
47
+ * every such site precisely so that rendering a menu row cannot perturb the
48
+ * stream (see effect-info.ts's header). A mod handler receives the already
49
+ * computed value and has no Rng to reach, so that property survives the seam.
50
+ */
51
+
52
+ import type { RandomValue } from "../rng.js";
53
+ import type { ProjectionInfo } from "../world/projection.js";
54
+ import type { EffectObjectProperty } from "../obj/randart-build.js";
55
+ import type { EffectRecordJson } from "../obj/types.js";
56
+ import type { GameState } from "../game/context.js";
57
+ import type { ItemRequest } from "../game/effect-item.js";
58
+ import type { Effect, EffectCode, SubtypeInjections } from "./effect.js";
59
+
60
+ /* ------------------------------------------------------------------ *
61
+ * Table 1 and 2: the two text handlers, keyed on the EFINFO_* flag.
62
+ * ------------------------------------------------------------------ */
63
+
64
+ /** The projection strings an effect's subtype selects, "" when out of range. */
65
+ export interface EffectProjectionText {
66
+ /** projections[subtype].desc - EFINFO_SEEN / _BOLT / _BOLTD / _TOUCH. */
67
+ readonly desc: string;
68
+ /** projections[subtype].player_desc - EFINFO_BALL / _SPOT / _BREATH / _SHORT. */
69
+ readonly playerDesc: string;
70
+ /** projections[subtype].lash_desc - EFINFO_LASH. */
71
+ readonly lashDesc: string;
72
+ }
73
+
74
+ /** What a menu-name handler is given (effect_get_menu_name, effects-info.c L583). */
75
+ export interface EffectMenuContext {
76
+ /** The effect being named. */
77
+ readonly effect: Effect;
78
+ /** base_descs[index].menu_name: the raw format string. */
79
+ readonly fmt: string;
80
+ /** sprintf(fmt, ...) - the format string with its arguments filled in. */
81
+ format(...args: Array<string | number>): string;
82
+ /** The effect's dice as a random_value, zeroed when it has none. */
83
+ readonly value: RandomValue;
84
+ /** randcalc(value, level, AVERAGE) - no RNG is drawn. */
85
+ average(level?: number): number;
86
+ /** projections[subtype], with "" for an out-of-range subtype. */
87
+ readonly proj: EffectProjectionText;
88
+ /** timed_effects[subtype].desc, "" when the host supplied no lookup. */
89
+ timedDesc(): string;
90
+ /** The stat property name for the subtype, "" when unavailable. */
91
+ statName(): string;
92
+ /** summon_desc(subtype), "" when unavailable. */
93
+ summonDesc(): string;
94
+ /** z_info->food_value scaled full / hungry thresholds (EFINFO_FOOD). */
95
+ readonly foodFull: number;
96
+ readonly foodHungry: number;
97
+ }
98
+
99
+ /** What a description handler is given (effect_describe's body, L384-548). */
100
+ export interface EffectDescContext {
101
+ /** The effect being described. */
102
+ readonly effect: Effect;
103
+ /** base_descs[index].desc: the raw format string. */
104
+ readonly desc: string;
105
+ /** sprintf(desc, ...) - the format string with its arguments filled in. */
106
+ format(...args: Array<string | number>): string;
107
+ /** The random_value in force (an earlier SET_VALUE's, or the effect's own). */
108
+ readonly value: RandomValue;
109
+ /** format_dice_string(value) as the caller already computed it. */
110
+ readonly diceString: string;
111
+ /** format_dice_string(value, multiplier) - EFINFO_FOOD's turn count. */
112
+ diceStringTimes(multiplier: number): string;
113
+ /** The device-skill boost percentage in force. */
114
+ readonly devSkillBoost: number;
115
+ /** append_damage(value, boost) - defaults to the boost in force. */
116
+ appendDamage(boost?: number): string;
117
+ /** randcalc(value, level, AVERAGE) - no RNG is drawn. */
118
+ average(level?: number): number;
119
+ /** projections[subtype], with "" for an out-of-range subtype. */
120
+ readonly proj: EffectProjectionText;
121
+ /** timed_effects[subtype].desc, "" when the host supplied no lookup. */
122
+ timedDesc(): string;
123
+ /** The stat property name for the subtype, "" when unavailable. */
124
+ statName(): string;
125
+ /** summon_desc(subtype), "" when unavailable. */
126
+ summonDesc(): string;
127
+ /** player->lev, 0 when the host supplied none (EFINFO_SHORT). */
128
+ readonly playerLevel: number;
129
+ /** z_info->food_value, 100 upstream (EFINFO_FOOD). */
130
+ readonly foodValue: number;
131
+ }
132
+
133
+ /**
134
+ * What one EFINFO_* flag means. Both halves are optional, and an absent half
135
+ * is upstream's own behaviour for an unhandled flag: "" - which is why a mod
136
+ * that supplies only `describe` still gets a blank menu row, and should say so
137
+ * to itself rather than be surprised.
138
+ */
139
+ export interface EffectTextHandler {
140
+ /** The row text in the activate / cast menus. */
141
+ menuName?(ctx: EffectMenuContext): string;
142
+ /** The sentence in object recall and spell descriptions. */
143
+ describe?(ctx: EffectDescContext): string;
144
+ }
145
+
146
+ /* ------------------------------------------------------------------ *
147
+ * Table 3: the activation summary walker, keyed on the effect CODE.
148
+ * ------------------------------------------------------------------ */
149
+
150
+ /** EFPROP kinds and the resolved timed data, as the walker sees them. */
151
+ export interface ActivationSummaryContext {
152
+ /** The compiled effect record being walked. */
153
+ readonly record: EffectRecordJson;
154
+ /** Append one summarized object property. */
155
+ add(idx: number, reslevelMin: number, reslevelMax: number, kind: number): void;
156
+ /** summarize_cure for the record's `type` (a no-op for an unknown name). */
157
+ summarizeCure(name: string | undefined): void;
158
+ /** The temp-resist / brand / slay / conflict half of an increase. */
159
+ summarizeTimedInc(name: string | undefined): void;
160
+ /** dice_evaluate(dice, 0, MAXIMISE) for this record, honouring SET_VALUE. */
161
+ timedValue(): number;
162
+ /** Whether the pack has a player_timed record under this name. */
163
+ knownTimed(name: string | undefined): boolean;
164
+ /** OF_NO_TELEPORT's index, for the teleport family. */
165
+ readonly ofNoTeleport: number;
166
+ /** Remember (or forget) the dice a later timed effect reads: SET/CLEAR_VALUE. */
167
+ setRememberedDice(dice: string | undefined): void;
168
+ /** Count this record as contributing no object property. */
169
+ markUnsummarized(): void;
170
+ }
171
+
172
+ /**
173
+ * One arm of effect_summarize_properties. Returning nothing is "this effect
174
+ * relates to no object property", which the walker records as unsummarized -
175
+ * so a handler that means "deliberately nothing" must still say so by calling
176
+ * `markUnsummarized()`, exactly as the ported default arm does.
177
+ */
178
+ export type ActivationSummaryHandler = (ctx: ActivationSummaryContext) => void;
179
+
180
+ /** The shape the walker produces, re-exported so a caller need not reach in. */
181
+ export type ActivationSummaryResult = {
182
+ props: EffectObjectProperty[];
183
+ unsummarizedCount: number;
184
+ };
185
+
186
+ /* ------------------------------------------------------------------ *
187
+ * Table 4 and 5: subtype decoding and the item prompt, keyed on the index.
188
+ * ------------------------------------------------------------------ */
189
+
190
+ /**
191
+ * How one effect turns a gamedata `type:` NAME into its integer subtype.
192
+ * Return null (not -1) for "this name means nothing to me", so the caller can
193
+ * tell a handler that declined from one that resolved the name to -1.
194
+ */
195
+ export type EffectSubtypeHandler = (
196
+ type: string,
197
+ inject: SubtypeInjections,
198
+ ) => number | null;
199
+
200
+ /**
201
+ * Which item an effect prompts for, when it consumes one. Return null for
202
+ * "this effect chooses no item" - which is what BRAND_WEAPON, CURSE_ARMOR,
203
+ * CURSE_WEAPON and ACQUIRE do, because they pick their own target.
204
+ */
205
+ export type EffectRequestHandler = (
206
+ subtype: number,
207
+ state: GameState,
208
+ ) => ItemRequest | null;
209
+
210
+ /* ------------------------------------------------------------------ *
211
+ * The tables.
212
+ * ------------------------------------------------------------------ */
213
+
214
+ /**
215
+ * One keyed table. Written once and used five times, because the five differ
216
+ * only in their key and handler types - five hand-copied blocks would be five
217
+ * places for `handlerFor` to drift from `set`.
218
+ */
219
+ export class EffectInfoTable<K, H> {
220
+ private readonly table = new Map<K, H>();
221
+
222
+ /** Install (or replace) the handler for one key. */
223
+ set(key: K, handler: H): void {
224
+ this.table.set(key, handler);
225
+ }
226
+
227
+ /**
228
+ * The handler installed for a key right now, or null. This is what a mod
229
+ * calls to WRAP core - keep the returned handler, install its own, and call
230
+ * through - instead of only replacing it.
231
+ */
232
+ handlerFor(key: K): H | null {
233
+ return this.table.get(key) ?? null;
234
+ }
235
+
236
+ /** Whether anything handles this key. */
237
+ has(key: K): boolean {
238
+ return this.table.has(key);
239
+ }
240
+
241
+ /** Every key handled, in registration order (core's first). */
242
+ keys(): readonly K[] {
243
+ return [...this.table.keys()];
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Everything the game says about an effect, in five tables under three keys.
249
+ *
250
+ * `text` is keyed on the EFINFO_* flag because that is what upstream's two
251
+ * switches key on: twenty flags describe a hundred and twelve effects, and an
252
+ * effect that behaves like an existing one for display purposes reuses its
253
+ * flag rather than repeating it. `summary` is keyed on the effect CODE, and
254
+ * `subtype` / `request` on the effect INDEX (or a mod's string code).
255
+ */
256
+ export class EffectInfoRegistry {
257
+ /** The menu row and the recall sentence, keyed on the EFINFO_* flag. */
258
+ readonly text = new EffectInfoTable<string, EffectTextHandler>();
259
+ /** effect_summarize_properties' arms, keyed on the effect code. */
260
+ readonly summary = new EffectInfoTable<string, ActivationSummaryHandler>();
261
+ /** effect_subtype's arms, keyed on the effect index (or a mod code). */
262
+ readonly subtype = new EffectInfoTable<EffectCode, EffectSubtypeHandler>();
263
+ /** requestForEffect's arms, keyed on the effect index (or a mod code). */
264
+ readonly request = new EffectInfoTable<EffectCode, EffectRequestHandler>();
265
+ }
266
+
267
+ /** ProjectionInfo as the text handlers read it. */
268
+ export type ProjectionTextSource = readonly Pick<
269
+ ProjectionInfo,
270
+ "desc" | "playerDesc" | "lashDesc"
271
+ >[];
272
+
273
+ /* ------------------------------------------------------------------ *
274
+ * The live registry.
275
+ * ------------------------------------------------------------------ */
276
+
277
+ /**
278
+ * Core's own seeders. Each of the four modules that OWNS a table registers its
279
+ * arms here at import time, and each is also the only module that READS its
280
+ * table - so "the module is loaded" and "core's arms are installed" cannot come
281
+ * apart. That is the point: a seeder somebody has to remember to call is a
282
+ * seeder that gets forgotten on one path, and the failure mode here is silent
283
+ * (every effect describes itself as "").
284
+ */
285
+ const seeders: Array<(reg: EffectInfoRegistry) => void> = [];
286
+
287
+ let live = new EffectInfoRegistry();
288
+
289
+ /**
290
+ * Install a set of core arms, now and on every reset. Called at module scope by
291
+ * effect-info.ts, obj/effects-info.ts, effects/effect.ts and
292
+ * game/effect-item.ts; a MOD never calls this - it registers through the
293
+ * capability-gated facade, whose registrations a reset deliberately drops.
294
+ */
295
+ export function seedEffectInfo(seed: (reg: EffectInfoRegistry) => void): void {
296
+ seeders.push(seed);
297
+ seed(live);
298
+ }
299
+
300
+ /** The live registry. Module-level; see this file's header for why that is safe. */
301
+ export function effectInfoRegistry(): EffectInfoRegistry {
302
+ return live;
303
+ }
304
+
305
+ /**
306
+ * Back to core's arms alone, dropping every mod registration - the same state a
307
+ * reload produces, without needing a fresh realm. No production caller by
308
+ * design; see this file's header.
309
+ */
310
+ export function resetEffectInfoRegistry(): void {
311
+ live = new EffectInfoRegistry();
312
+ for (const seed of seeders) seed(live);
313
+ }