@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
@@ -30,6 +30,8 @@ import { FLAG_START, FlagSet, NO_FLAG } from "../bitflag.js";
30
30
  import type { RandomValue } from "../rng.js";
31
31
  import type { GameObject } from "./object.js";
32
32
  import { sameMonstersSlain, tvalIsBodyArmor, tvalIsJewelry } from "./object.js";
33
+ import { runeRegistry, seedRune } from "./rune-registry.js";
34
+ import type { ModMessageHandler, RuneVariety } from "./rune-registry.js";
33
35
  import type {
34
36
  Brand,
35
37
  Curse,
@@ -81,6 +83,23 @@ export interface RuneEnv {
81
83
  flavor?: FlavorKnowledge;
82
84
  /** msg() sink for rune / flag / modifier messages. */
83
85
  msg?(text: string): void;
86
+ /**
87
+ * object_desc(o_name, ..., obj, ODESC_BASE, p) - the name the six rune /
88
+ * flag / curse messages in this file print (obj-knowledge.c L1644, L1732,
89
+ * L1827, L2108, L2147, L2192; exactly six ODESC_BASE calls upstream, exactly
90
+ * six `baseName` sites here).
91
+ *
92
+ * A seam rather than a direct call because the real `objectDesc` needs a
93
+ * `KnownDesc`, which is assembled from GameState fields (isAware, options,
94
+ * hasFlavor, flavorText, everseen) that this module cannot see. NOT a layering
95
+ * problem, contrary to the note this replaces: `objectDesc` lives in
96
+ * `obj/desc.ts`, next door - `game/describe.ts` is only a GameState wrapper
97
+ * around it. The obstacle was the knowledge bundle, not the directory.
98
+ *
99
+ * Absent (worldless callers) falls back to `objBaseName`, the plain kind name.
100
+ * PORT_TODO 3.23.
101
+ */
102
+ describeBase?(obj: GameObject): string;
84
103
  }
85
104
 
86
105
  /** Optional registry tables for makeRuneEnv (inert defaults when absent). */
@@ -92,6 +111,7 @@ export interface RuneEnvTables {
92
111
  elementNames?: readonly string[];
93
112
  flavor?: FlavorKnowledge;
94
113
  msg?(text: string): void;
114
+ describeBase?(obj: GameObject): string;
95
115
  }
96
116
 
97
117
  /**
@@ -110,6 +130,7 @@ export function makeRuneEnv(
110
130
  curses: tables.curses ?? [null],
111
131
  properties: tables.properties ?? [null],
112
132
  elementNames: tables.elementNames ?? [],
133
+ ...(tables.describeBase ? { describeBase: tables.describeBase } : {}),
113
134
  slotObject,
114
135
  randcalcVaries,
115
136
  ...(tables.flavor ? { flavor: tables.flavor } : {}),
@@ -216,11 +237,22 @@ function objectFlagName(flag: number): string {
216
237
  return OBJECT_FLAG_ENTRIES[flag - 1]?.name ?? "NONE";
217
238
  }
218
239
 
219
- /** ODESC_BASE approximation until object_desc lands: the kind's plain name. */
240
+ /**
241
+ * The plain kind name, `~` and `&` stripped. This is the FALLBACK for a caller
242
+ * with no knowledge bundle (a worldless test), not the upstream behaviour:
243
+ * `object_desc` with ODESC_BASE still routes an unaware flavoured kind through
244
+ * its flavour ("a Murky Potion", not "Potion of Cure Light Wounds"), money
245
+ * through the "N gold pieces worth of" form, and an unknown item through
246
+ * "unknown item". PORT_TODO 3.23.
247
+ */
220
248
  export function objBaseName(obj: GameObject): string {
221
249
  return obj.kind.name.replace(/[~&]/g, "").trim();
222
250
  }
223
- const baseName = objBaseName;
251
+
252
+ /** ODESC_BASE via the wired seam, or the plain-name fallback. */
253
+ function baseName(env: RuneEnv, obj: GameObject): string {
254
+ return env.describeBase?.(obj) ?? objBaseName(obj);
255
+ }
224
256
 
225
257
  /* ------------------------------------------------------------------ *
226
258
  * player_knows_* accessors.
@@ -467,7 +499,7 @@ export function objectCursesFindFlags(
467
499
  ): boolean {
468
500
  if (!obj.curses) return false;
469
501
  let found = false;
470
- const oName = baseName(obj);
502
+ const oName = baseName(env, obj);
471
503
  for (let i = 1; i < env.curses.length; i++) {
472
504
  const c = env.curses[i];
473
505
  if (!obj.curses[i]?.power || !c) continue;
@@ -517,7 +549,7 @@ export function objectCursesFindElement(
517
549
  ): boolean {
518
550
  if (!obj.curses) return false;
519
551
  let found = false;
520
- const oName = baseName(obj);
552
+ const oName = baseName(env, obj);
521
553
  for (let i = 1; i < env.curses.length; i++) {
522
554
  const c = env.curses[i];
523
555
  if (!obj.curses[i]?.power || !c) continue;
@@ -540,24 +572,9 @@ export function objectCursesFindElement(
540
572
  /** mod_message (obj-knowledge.c L1492): "You feel..." on noticing a modifier. */
541
573
  function modMessage(env: RuneEnv, obj: GameObject, mod: number): void {
542
574
  if (!env.msg) return;
543
- const v = obj.modifiers[mod] ?? 0;
544
- const both = (pos: string, neg: string): string | null =>
545
- v > 0 ? pos : v < 0 ? neg : null;
546
- let text: string | null = null;
547
- switch (mod) {
548
- case OBJ_MOD.STR: text = both("You feel stronger!", "You feel weaker!"); break;
549
- case OBJ_MOD.INT: text = both("You feel smarter!", "You feel more stupid!"); break;
550
- case OBJ_MOD.WIS: text = both("You feel wiser!", "You feel more naive!"); break;
551
- case OBJ_MOD.DEX: text = both("You feel more dextrous!", "You feel clumsier!"); break;
552
- case OBJ_MOD.CON: text = both("You feel healthier!", "You feel sicklier!"); break;
553
- case OBJ_MOD.STEALTH: text = both("You feel stealthier.", "You feel noisier."); break;
554
- case OBJ_MOD.SPEED: text = both("You feel strangely quick.", "You feel strangely sluggish."); break;
555
- case OBJ_MOD.BLOWS: text = both("Your weapon tingles in your hands.", "Your weapon aches in your hands."); break;
556
- case OBJ_MOD.SHOTS: text = both("Your missile weapon tingles in your hands.", "Your missile weapon aches in your hands."); break;
557
- case OBJ_MOD.INFRA: text = "Your eyes tingle."; break;
558
- case OBJ_MOD.LIGHT: text = "It glows!"; break;
559
- default: break;
560
- }
575
+ const text = runeRegistry().modMessage.handlerFor(mod)?.(
576
+ obj.modifiers[mod] ?? 0,
577
+ );
561
578
  if (text) env.msg(text);
562
579
  }
563
580
 
@@ -599,7 +616,7 @@ export function objectLearnOnWield(
599
616
  }
600
617
 
601
618
  /* Learn about obvious, previously unknown flags. */
602
- const oName = baseName(obj);
619
+ const oName = baseName(env, obj);
603
620
  for (let flag = 1; flag < OF.MAX; flag++) {
604
621
  if (!obj.flags.has(flag) || !obviousMask.has(flag)) continue;
605
622
  if (!player.objKnown.flags.has(flag)) {
@@ -660,7 +677,12 @@ export function equipLearnOnDefend(p: Player, env: RuneEnv): void {
660
677
  objectCursesFindToA(p, env, obj);
661
678
  if (p.objKnown.toA) return;
662
679
  }
663
- /* Shape to_a: shapes are bound raw; DEFERRED with the shapechange system. */
680
+ /* The shape's OWN to_a (obj-knowledge.c:1992-1998). Reached only when the
681
+ * gear taught nothing, because the loop returns the moment it does - so this
682
+ * is a tail, not a branch, and it is here in the same place upstream has it.
683
+ * `p.shape` is the bound record, so upstream's lookup_player_shape by name
684
+ * is a step this port does not need. */
685
+ if (p.shape && p.shape.toA !== 0) playerLearnCombat(p, env, "toA");
664
686
  }
665
687
 
666
688
  function slotIndexByType(p: Player, type: string): number {
@@ -670,6 +692,22 @@ function slotIndexByType(p: Player, type: string): number {
670
692
  return -1;
671
693
  }
672
694
 
695
+ /**
696
+ * equipped_item_by_slot_name(p, "shooting"): the wielded launcher, or null.
697
+ *
698
+ * Upstream looks the slot up by NAME; the port's body slots carry a `type`, and
699
+ * `player/calcs.c`'s own launcher analysis already equates "shooting" with type
700
+ * `BOW` (calcs.ts's equipment loop, `isBowSlot`). This is the shared accessor so
701
+ * that equation lives in exactly one place: two consumers had DEFERRED notes
702
+ * saying they could not reach the launcher (`game/ui-entry.ts`'s PF_FAST_SHOT
703
+ * push and `game/char-sheet.ts`'s launcher seam) while the reach was three lines
704
+ * of body-slot walk. PORT_TODO 3.9.
705
+ */
706
+ export function equippedLauncher(p: Player, env: RuneEnv): GameObject | null {
707
+ const slot = slotIndexByType(p, "BOW");
708
+ return slot < 0 ? null : env.slotObject(slot);
709
+ }
710
+
673
711
  /**
674
712
  * equip_learn_on_ranged_attack: firing teaches the to-hit rune from any
675
713
  * off-standard equipment except the weapon and launcher.
@@ -686,6 +724,8 @@ export function equipLearnOnRangedAttack(p: Player, env: RuneEnv): void {
686
724
  objectCursesFindToH(p, env, obj);
687
725
  if (p.objKnown.toH) return;
688
726
  }
727
+ /* The shape's own to_h (obj-knowledge.c:2026-2032). */
728
+ if (p.shape && p.shape.toH !== 0) playerLearnCombat(p, env, "toH");
689
729
  }
690
730
 
691
731
  /**
@@ -705,6 +745,12 @@ export function equipLearnOnMeleeAttack(p: Player, env: RuneEnv): void {
705
745
  objectCursesFindToD(p, env, obj);
706
746
  if (p.objKnown.toH && p.objKnown.toD) return;
707
747
  }
748
+ /* The shape's own to_h and to_d (obj-knowledge.c:2066-2078). Both, and
749
+ * independently - a shape with only a damage bonus still teaches to_d. */
750
+ if (p.shape) {
751
+ if (p.shape.toH !== 0) playerLearnCombat(p, env, "toH");
752
+ if (p.shape.toD !== 0) playerLearnCombat(p, env, "toD");
753
+ }
708
754
  }
709
755
 
710
756
  /**
@@ -720,7 +766,7 @@ export function equipLearnFlag(p: Player, env: RuneEnv, flag: number): void {
720
766
  if (!obj) continue;
721
767
  if (obj.flags.has(flag)) {
722
768
  if (!p.objKnown.flags.has(flag)) {
723
- flagMessage(env, flag, baseName(obj));
769
+ flagMessage(env, flag, baseName(env, obj));
724
770
  playerLearnFlagRune(p, env, flag);
725
771
  }
726
772
  }
@@ -740,7 +786,7 @@ export function equipLearnElement(p: Player, env: RuneEnv, element: number): voi
740
786
  const obj = env.slotObject(i);
741
787
  if (!obj) continue;
742
788
  if ((obj.elInfo[element]?.resLevel ?? 0) !== 0) {
743
- if (p.upkeep.playing) env.msg?.(`Your ${baseName(obj)} glows.`);
789
+ if (p.upkeep.playing) env.msg?.(`Your ${baseName(env, obj)} glows.`);
744
790
  playerLearnResist(p, env, element);
745
791
  }
746
792
  /* obj->known element marking: DEFERRED (display). */
@@ -796,7 +842,7 @@ export function equipLearnAfterTime(p: Player, env: RuneEnv): void {
796
842
  for (let i = 0; i < p.body.count; i++) {
797
843
  const obj = env.slotObject(i);
798
844
  if (!obj) continue;
799
- const oName = baseName(obj);
845
+ const oName = baseName(env, obj);
800
846
  for (let flag = 1; flag < OF.MAX; flag++) {
801
847
  if (!obj.flags.has(flag) || !timedMask.has(flag)) continue;
802
848
  if (!p.objKnown.flags.has(flag)) flagMessage(env, flag, oName);
@@ -844,15 +890,13 @@ export function playerLearnAllRunes(p: Player, env: RuneEnv): void {
844
890
  * knowledge screens.
845
891
  * ------------------------------------------------------------------ */
846
892
 
847
- /** enum rune_variety. */
848
- export type RuneVariety =
849
- | "combat"
850
- | "mod"
851
- | "resist"
852
- | "brand"
853
- | "slay"
854
- | "curse"
855
- | "flag";
893
+ /**
894
+ * enum rune_variety - no longer a closed union. Core's seven plus whatever a
895
+ * mod coins; defined in `rune-registry.ts`, which is also where the reason it
896
+ * had to open lives. Re-exported here because `Rune` is this module's type and
897
+ * every consumer already imports it from here.
898
+ */
899
+ export type { CoreRuneVariety, RuneVariety } from "./rune-registry.js";
856
900
 
857
901
  /** struct rune, resolved: a variety, its per-variety index, and a name. */
858
902
  export interface Rune {
@@ -929,6 +973,11 @@ export function buildRuneList(env: RuneEnv): Rune[] {
929
973
  }
930
974
  runes.push({ variety: "flag", index: i, name: prop.name });
931
975
  }
976
+ /* Every mod-contributed rune, after core's, in registration order. This is
977
+ * what makes the six handler tables reachable: nothing in core ever asks
978
+ * about a rune that is not in this list, so a registry without a producer
979
+ * would be a seam its own callers walk past. */
980
+ runes.push(...runeRegistry().contributed(env));
932
981
  return runes;
933
982
  }
934
983
 
@@ -942,50 +991,12 @@ export function buildRuneList(env: RuneEnv): Rune[] {
942
991
  * curse (the C default falls through to NULL).
943
992
  */
944
993
  export function runeDesc(env: RuneEnv, rune: Rune): string {
945
- switch (rune.variety) {
946
- case "combat":
947
- if (rune.index === 0)
948
- return "Object magically increases the player's armor class";
949
- if (rune.index === 1)
950
- return "Object magically increases the player's chance to hit";
951
- if (rune.index === 2)
952
- return "Object magically increases the player's damage";
953
- return "";
954
- case "mod":
955
- return `Object gives the player a magical bonus to ${rune.name}.`;
956
- case "resist":
957
- return `Object affects the player's resistance to ${rune.name}.`;
958
- case "brand":
959
- return `Object brands the player's attacks with ${rune.name}.`;
960
- case "slay":
961
- return `Object makes the player's attacks against ${rune.name} more powerful.`;
962
- case "curse": {
963
- const desc = env.curses[rune.index]?.desc;
964
- return desc ? `Object ${desc}.` : "";
965
- }
966
- case "flag":
967
- return `Object gives the player the property of ${rune.name}.`;
968
- }
994
+ return runeRegistry().desc.handlerFor(rune.variety)?.(env, rune) ?? "";
969
995
  }
970
996
 
971
997
  /** player_knows_rune over the typed knowledge stores. */
972
998
  export function playerKnowsRune(p: Player, rune: Rune): boolean {
973
- switch (rune.variety) {
974
- case "combat":
975
- return !!p.objKnown[COMBAT_RUNE[rune.index] as "toA" | "toH" | "toD"];
976
- case "mod":
977
- return !!p.objKnown.modifiers[rune.index];
978
- case "resist":
979
- return !!p.objKnown.elInfo[rune.index]?.resLevel;
980
- case "brand":
981
- return playerKnowsBrand(p, rune.index);
982
- case "slay":
983
- return playerKnowsSlay(p, rune.index);
984
- case "curse":
985
- return playerKnowsCurse(p, rune.index);
986
- case "flag":
987
- return p.objKnown.flags.has(rune.index);
988
- }
999
+ return runeRegistry().knows.handlerFor(rune.variety)?.(p, rune) ?? false;
989
1000
  }
990
1001
 
991
1002
  /** object_has_rune. */
@@ -994,36 +1005,9 @@ export function objectHasRune(
994
1005
  obj: GameObject,
995
1006
  rune: Rune,
996
1007
  ): boolean {
997
- switch (rune.variety) {
998
- case "combat":
999
- if (rune.index === 0) return obj.toA !== 0;
1000
- if (rune.index === 1) return !objectHasStandardToH(env, obj);
1001
- return obj.toD !== 0;
1002
- case "mod":
1003
- return (obj.modifiers[rune.index] ?? 0) !== 0;
1004
- case "resist":
1005
- return (obj.elInfo[rune.index]?.resLevel ?? 0) !== 0;
1006
- case "brand": {
1007
- if (!obj.brands) return false;
1008
- for (let i = 0; i < obj.brands.length; i++) {
1009
- if (obj.brands[i] && env.brands[i]?.name === rune.name) return true;
1010
- }
1011
- return false;
1012
- }
1013
- case "slay": {
1014
- if (!obj.slays) return false;
1015
- for (let i = 0; i < obj.slays.length; i++) {
1016
- if (obj.slays[i] && sameMonstersSlain(env.slays, rune.index, i)) {
1017
- return true;
1018
- }
1019
- }
1020
- return false;
1021
- }
1022
- case "curse":
1023
- return (obj.curses?.[rune.index]?.power ?? 0) !== 0;
1024
- case "flag":
1025
- return obj.flags.has(rune.index);
1026
- }
1008
+ return (
1009
+ runeRegistry().objectHas.handlerFor(rune.variety)?.(env, obj, rune) ?? false
1010
+ );
1027
1011
  }
1028
1012
 
1029
1013
  /**
@@ -1052,27 +1036,10 @@ export function playerLearnRune(
1052
1036
  rune: Rune,
1053
1037
  message: boolean,
1054
1038
  ): boolean {
1055
- switch (rune.variety) {
1056
- case "combat":
1057
- return playerLearnCombat(
1058
- p,
1059
- env,
1060
- COMBAT_RUNE[rune.index] as "toA" | "toH" | "toD",
1061
- message,
1062
- );
1063
- case "mod":
1064
- return playerLearnMod(p, env, rune.index, message);
1065
- case "resist":
1066
- return playerLearnResist(p, env, rune.index, message);
1067
- case "brand":
1068
- return playerLearnBrand(p, env, rune.index, message);
1069
- case "slay":
1070
- return playerLearnSlay(p, env, rune.index, message);
1071
- case "curse":
1072
- return playerLearnCurse(p, env, rune.index, message);
1073
- case "flag":
1074
- return playerLearnFlagRune(p, env, rune.index, message);
1075
- }
1039
+ return (
1040
+ runeRegistry().learn.handlerFor(rune.variety)?.(p, env, rune, message) ??
1041
+ false
1042
+ );
1076
1043
  }
1077
1044
 
1078
1045
  /**
@@ -1492,18 +1459,9 @@ export function runeKey(rune: Rune): string {
1492
1459
  * "resist <x>", and the bare name for combat / modifier / flag runes.
1493
1460
  */
1494
1461
  export function runeName(rune: Rune): string {
1495
- switch (rune.variety) {
1496
- case "brand":
1497
- return `${rune.name} brand`;
1498
- case "slay":
1499
- return `slay ${rune.name}`;
1500
- case "curse":
1501
- return `${rune.name} curse`;
1502
- case "resist":
1503
- return `resist ${rune.name}`;
1504
- default:
1505
- return rune.name;
1506
- }
1462
+ /* Upstream's `default` arm is the bare name, so an unregistered variety has a
1463
+ * real fallback here rather than a hole - three of core's own seven take it. */
1464
+ return runeRegistry().name.handlerFor(rune.variety)?.(rune) ?? rune.name;
1507
1465
  }
1508
1466
 
1509
1467
  /**
@@ -1575,3 +1533,197 @@ export function playerKnowObjectAwareness(
1575
1533
  flavor.objectFlavorAware(obj.kind, flavorDeps); // L1174
1576
1534
  }
1577
1535
  }
1536
+
1537
+ /* ------------------------------------------------------------------ *
1538
+ * Core's rune arms.
1539
+ *
1540
+ * Every body below is lifted VERBATIM from the switch it replaces - the
1541
+ * bodies did not change, only where they are installed. `rune-vectors.json`
1542
+ * (99 runes, both signs of all 16 modifiers) was recorded before this block
1543
+ * existed and is what holds that claim.
1544
+ *
1545
+ * Registered at import time by the module that also READS these tables, so
1546
+ * "knowledge.ts is loaded" and "core's arms are installed" cannot come apart.
1547
+ * ------------------------------------------------------------------ */
1548
+
1549
+ seedRune((reg) => {
1550
+ /* rune_desc (obj-knowledge.c L344-403). */
1551
+ reg.desc.set("combat", (_env, rune) => {
1552
+ if (rune.index === 0)
1553
+ return "Object magically increases the player's armor class";
1554
+ if (rune.index === 1)
1555
+ return "Object magically increases the player's chance to hit";
1556
+ if (rune.index === 2)
1557
+ return "Object magically increases the player's damage";
1558
+ return "";
1559
+ });
1560
+ reg.desc.set(
1561
+ "mod",
1562
+ (_env, rune) => `Object gives the player a magical bonus to ${rune.name}.`,
1563
+ );
1564
+ reg.desc.set(
1565
+ "resist",
1566
+ (_env, rune) => `Object affects the player's resistance to ${rune.name}.`,
1567
+ );
1568
+ reg.desc.set(
1569
+ "brand",
1570
+ (_env, rune) => `Object brands the player's attacks with ${rune.name}.`,
1571
+ );
1572
+ reg.desc.set(
1573
+ "slay",
1574
+ (_env, rune) =>
1575
+ `Object makes the player's attacks against ${rune.name} more powerful.`,
1576
+ );
1577
+ reg.desc.set("curse", (env, rune) => {
1578
+ const desc = env.curses[rune.index]?.desc;
1579
+ return desc ? `Object ${desc}.` : "";
1580
+ });
1581
+ reg.desc.set(
1582
+ "flag",
1583
+ (_env, rune) => `Object gives the player the property of ${rune.name}.`,
1584
+ );
1585
+
1586
+ /* player_knows_rune, over the port's typed knowledge stores. */
1587
+ reg.knows.set(
1588
+ "combat",
1589
+ (p, rune) =>
1590
+ !!p.objKnown[COMBAT_RUNE[rune.index] as "toA" | "toH" | "toD"],
1591
+ );
1592
+ reg.knows.set("mod", (p, rune) => !!p.objKnown.modifiers[rune.index]);
1593
+ reg.knows.set(
1594
+ "resist",
1595
+ (p, rune) => !!p.objKnown.elInfo[rune.index]?.resLevel,
1596
+ );
1597
+ reg.knows.set("brand", (p, rune) => playerKnowsBrand(p, rune.index));
1598
+ reg.knows.set("slay", (p, rune) => playerKnowsSlay(p, rune.index));
1599
+ reg.knows.set("curse", (p, rune) => playerKnowsCurse(p, rune.index));
1600
+ reg.knows.set("flag", (p, rune) => p.objKnown.flags.has(rune.index));
1601
+
1602
+ /* object_has_rune. */
1603
+ reg.objectHas.set("combat", (env, obj, rune) => {
1604
+ if (rune.index === 0) return obj.toA !== 0;
1605
+ if (rune.index === 1) return !objectHasStandardToH(env, obj);
1606
+ return obj.toD !== 0;
1607
+ });
1608
+ reg.objectHas.set(
1609
+ "mod",
1610
+ (_env, obj, rune) => (obj.modifiers[rune.index] ?? 0) !== 0,
1611
+ );
1612
+ reg.objectHas.set(
1613
+ "resist",
1614
+ (_env, obj, rune) => (obj.elInfo[rune.index]?.resLevel ?? 0) !== 0,
1615
+ );
1616
+ reg.objectHas.set("brand", (env, obj, rune) => {
1617
+ if (!obj.brands) return false;
1618
+ for (let i = 0; i < obj.brands.length; i++) {
1619
+ if (obj.brands[i] && env.brands[i]?.name === rune.name) return true;
1620
+ }
1621
+ return false;
1622
+ });
1623
+ reg.objectHas.set("slay", (env, obj, rune) => {
1624
+ if (!obj.slays) return false;
1625
+ for (let i = 0; i < obj.slays.length; i++) {
1626
+ if (obj.slays[i] && sameMonstersSlain(env.slays, rune.index, i)) {
1627
+ return true;
1628
+ }
1629
+ }
1630
+ return false;
1631
+ });
1632
+ reg.objectHas.set(
1633
+ "curse",
1634
+ (_env, obj, rune) => (obj.curses?.[rune.index]?.power ?? 0) !== 0,
1635
+ );
1636
+ reg.objectHas.set("flag", (_env, obj, rune) => obj.flags.has(rune.index));
1637
+
1638
+ /* player_learn_rune. */
1639
+ reg.learn.set("combat", (p, env, rune, message) =>
1640
+ playerLearnCombat(
1641
+ p,
1642
+ env,
1643
+ COMBAT_RUNE[rune.index] as "toA" | "toH" | "toD",
1644
+ message,
1645
+ ),
1646
+ );
1647
+ reg.learn.set("mod", (p, env, rune, message) =>
1648
+ playerLearnMod(p, env, rune.index, message),
1649
+ );
1650
+ reg.learn.set("resist", (p, env, rune, message) =>
1651
+ playerLearnResist(p, env, rune.index, message),
1652
+ );
1653
+ reg.learn.set("brand", (p, env, rune, message) =>
1654
+ playerLearnBrand(p, env, rune.index, message),
1655
+ );
1656
+ reg.learn.set("slay", (p, env, rune, message) =>
1657
+ playerLearnSlay(p, env, rune.index, message),
1658
+ );
1659
+ reg.learn.set("curse", (p, env, rune, message) =>
1660
+ playerLearnCurse(p, env, rune.index, message),
1661
+ );
1662
+ reg.learn.set("flag", (p, env, rune, message) =>
1663
+ playerLearnFlagRune(p, env, rune.index, message),
1664
+ );
1665
+
1666
+ /* rune_name's decoration. Only four varieties decorate; combat, mod and flag
1667
+ * take upstream's default arm, which is the bare name. */
1668
+ reg.name.set("brand", (rune) => `${rune.name} brand`);
1669
+ reg.name.set("slay", (rune) => `slay ${rune.name}`);
1670
+ reg.name.set("curse", (rune) => `${rune.name} curse`);
1671
+ reg.name.set("resist", (rune) => `resist ${rune.name}`);
1672
+
1673
+ /* mod_message (obj-knowledge.c L1492). Eleven of the sixteen modifiers say
1674
+ * anything at all, and two of those eleven ignore sign. */
1675
+ const both =
1676
+ (pos: string, neg: string): ModMessageHandler =>
1677
+ (v) =>
1678
+ v > 0 ? pos : v < 0 ? neg : null;
1679
+ const always =
1680
+ (text: string): ModMessageHandler =>
1681
+ () =>
1682
+ text;
1683
+ reg.modMessage.set(
1684
+ OBJ_MOD.STR,
1685
+ both("You feel stronger!", "You feel weaker!"),
1686
+ );
1687
+ reg.modMessage.set(
1688
+ OBJ_MOD.INT,
1689
+ both("You feel smarter!", "You feel more stupid!"),
1690
+ );
1691
+ reg.modMessage.set(
1692
+ OBJ_MOD.WIS,
1693
+ both("You feel wiser!", "You feel more naive!"),
1694
+ );
1695
+ reg.modMessage.set(
1696
+ OBJ_MOD.DEX,
1697
+ both("You feel more dextrous!", "You feel clumsier!"),
1698
+ );
1699
+ reg.modMessage.set(
1700
+ OBJ_MOD.CON,
1701
+ both("You feel healthier!", "You feel sicklier!"),
1702
+ );
1703
+ reg.modMessage.set(
1704
+ OBJ_MOD.STEALTH,
1705
+ both("You feel stealthier.", "You feel noisier."),
1706
+ );
1707
+ reg.modMessage.set(
1708
+ OBJ_MOD.SPEED,
1709
+ both("You feel strangely quick.", "You feel strangely sluggish."),
1710
+ );
1711
+ reg.modMessage.set(
1712
+ OBJ_MOD.BLOWS,
1713
+ both(
1714
+ "Your weapon tingles in your hands.",
1715
+ "Your weapon aches in your hands.",
1716
+ ),
1717
+ );
1718
+ reg.modMessage.set(
1719
+ OBJ_MOD.SHOTS,
1720
+ both(
1721
+ "Your missile weapon tingles in your hands.",
1722
+ "Your missile weapon aches in your hands.",
1723
+ ),
1724
+ );
1725
+ /* INFRA and LIGHT print the same line for either sign - upstream assigns the
1726
+ * text unconditionally rather than through its two-armed helper. */
1727
+ reg.modMessage.set(OBJ_MOD.INFRA, always("Your eyes tingle."));
1728
+ reg.modMessage.set(OBJ_MOD.LIGHT, always("It glows!"));
1729
+ });