@rpgm-tools/neo-angband-core 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (848) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/perceive.d.ts.map +1 -1
  3. package/dist/agent/perceive.js +2 -2
  4. package/dist/agent/perceive.js.map +1 -1
  5. package/dist/combat/blow-vectors.d.ts +78 -0
  6. package/dist/combat/blow-vectors.d.ts.map +1 -0
  7. package/dist/combat/blow-vectors.fixtures.d.ts +19 -0
  8. package/dist/combat/blow-vectors.fixtures.d.ts.map +1 -0
  9. package/dist/combat/blow-vectors.fixtures.js +81 -0
  10. package/dist/combat/blow-vectors.fixtures.js.map +1 -0
  11. package/dist/combat/blow-vectors.js +195 -0
  12. package/dist/combat/blow-vectors.js.map +1 -0
  13. package/dist/combat/brand-slay.d.ts +22 -9
  14. package/dist/combat/brand-slay.d.ts.map +1 -1
  15. package/dist/combat/brand-slay.js +37 -10
  16. package/dist/combat/brand-slay.js.map +1 -1
  17. package/dist/combat/index.d.ts +1 -1
  18. package/dist/combat/index.js +1 -1
  19. package/dist/combat/melee.d.ts +25 -13
  20. package/dist/combat/melee.d.ts.map +1 -1
  21. package/dist/combat/melee.js +23 -19
  22. package/dist/combat/melee.js.map +1 -1
  23. package/dist/combat/mon-melee.d.ts +166 -7
  24. package/dist/combat/mon-melee.d.ts.map +1 -1
  25. package/dist/combat/mon-melee.js +469 -338
  26. package/dist/combat/mon-melee.js.map +1 -1
  27. package/dist/combat/ranged.d.ts +15 -13
  28. package/dist/combat/ranged.d.ts.map +1 -1
  29. package/dist/combat/ranged.js +31 -29
  30. package/dist/combat/ranged.js.map +1 -1
  31. package/dist/constants.d.ts +14 -0
  32. package/dist/constants.d.ts.map +1 -1
  33. package/dist/constants.js +14 -0
  34. package/dist/constants.js.map +1 -1
  35. package/dist/datafile.d.ts +48 -0
  36. package/dist/datafile.d.ts.map +1 -0
  37. package/dist/datafile.js +102 -0
  38. package/dist/datafile.js.map +1 -0
  39. package/dist/effects/effect-info-registry.d.ts +237 -0
  40. package/dist/effects/effect-info-registry.d.ts.map +1 -0
  41. package/dist/effects/effect-info-registry.js +138 -0
  42. package/dist/effects/effect-info-registry.js.map +1 -0
  43. package/dist/effects/effect-info-vectors.d.ts +92 -0
  44. package/dist/effects/effect-info-vectors.d.ts.map +1 -0
  45. package/dist/effects/effect-info-vectors.fixtures.d.ts +18 -0
  46. package/dist/effects/effect-info-vectors.fixtures.d.ts.map +1 -0
  47. package/dist/effects/effect-info-vectors.fixtures.js +51 -0
  48. package/dist/effects/effect-info-vectors.fixtures.js.map +1 -0
  49. package/dist/effects/effect-info-vectors.js +315 -0
  50. package/dist/effects/effect-info-vectors.js.map +1 -0
  51. package/dist/effects/effect-info.d.ts +5 -1
  52. package/dist/effects/effect-info.d.ts.map +1 -1
  53. package/dist/effects/effect-info.js +245 -143
  54. package/dist/effects/effect-info.js.map +1 -1
  55. package/dist/effects/effect.d.ts +4 -3
  56. package/dist/effects/effect.d.ts.map +1 -1
  57. package/dist/effects/effect.js +88 -70
  58. package/dist/effects/effect.js.map +1 -1
  59. package/dist/effects/handlers.d.ts +1 -1
  60. package/dist/effects/handlers.d.ts.map +1 -1
  61. package/dist/effects/handlers.js +5 -2
  62. package/dist/effects/handlers.js.map +1 -1
  63. package/dist/effects/interpreter.d.ts +11 -0
  64. package/dist/effects/interpreter.d.ts.map +1 -1
  65. package/dist/effects/interpreter.js +13 -0
  66. package/dist/effects/interpreter.js.map +1 -1
  67. package/dist/game/cave-cmd.d.ts +9 -5
  68. package/dist/game/cave-cmd.d.ts.map +1 -1
  69. package/dist/game/cave-cmd.js +56 -11
  70. package/dist/game/cave-cmd.js.map +1 -1
  71. package/dist/game/cave-square.d.ts +42 -0
  72. package/dist/game/cave-square.d.ts.map +1 -0
  73. package/dist/game/cave-square.js +73 -0
  74. package/dist/game/cave-square.js.map +1 -0
  75. package/dist/game/char-sheet.d.ts +12 -8
  76. package/dist/game/char-sheet.d.ts.map +1 -1
  77. package/dist/game/char-sheet.js +41 -8
  78. package/dist/game/char-sheet.js.map +1 -1
  79. package/dist/game/chest.d.ts +2 -3
  80. package/dist/game/chest.d.ts.map +1 -1
  81. package/dist/game/chest.js +17 -6
  82. package/dist/game/chest.js.map +1 -1
  83. package/dist/game/context.d.ts +213 -22
  84. package/dist/game/context.d.ts.map +1 -1
  85. package/dist/game/context.js +109 -17
  86. package/dist/game/context.js.map +1 -1
  87. package/dist/game/describe.d.ts +13 -0
  88. package/dist/game/describe.d.ts.map +1 -1
  89. package/dist/game/describe.js +32 -4
  90. package/dist/game/describe.js.map +1 -1
  91. package/dist/game/display.d.ts +97 -8
  92. package/dist/game/display.d.ts.map +1 -1
  93. package/dist/game/display.js +157 -13
  94. package/dist/game/display.js.map +1 -1
  95. package/dist/game/dump-level.d.ts.map +1 -1
  96. package/dist/game/dump-level.js +3 -2
  97. package/dist/game/dump-level.js.map +1 -1
  98. package/dist/game/effect-attack.d.ts.map +1 -1
  99. package/dist/game/effect-attack.js +36 -27
  100. package/dist/game/effect-attack.js.map +1 -1
  101. package/dist/game/effect-detect.d.ts +4 -4
  102. package/dist/game/effect-detect.d.ts.map +1 -1
  103. package/dist/game/effect-detect.js +42 -9
  104. package/dist/game/effect-detect.js.map +1 -1
  105. package/dist/game/effect-env.d.ts +7 -1
  106. package/dist/game/effect-env.d.ts.map +1 -1
  107. package/dist/game/effect-env.js +1 -0
  108. package/dist/game/effect-env.js.map +1 -1
  109. package/dist/game/effect-general.d.ts +5 -3
  110. package/dist/game/effect-general.d.ts.map +1 -1
  111. package/dist/game/effect-general.js +94 -43
  112. package/dist/game/effect-general.js.map +1 -1
  113. package/dist/game/effect-item.d.ts +2 -1
  114. package/dist/game/effect-item.d.ts.map +1 -1
  115. package/dist/game/effect-item.js +136 -82
  116. package/dist/game/effect-item.js.map +1 -1
  117. package/dist/game/effect-melee.d.ts +10 -4
  118. package/dist/game/effect-melee.d.ts.map +1 -1
  119. package/dist/game/effect-melee.js +44 -19
  120. package/dist/game/effect-melee.js.map +1 -1
  121. package/dist/game/effect-monster.d.ts +26 -4
  122. package/dist/game/effect-monster.d.ts.map +1 -1
  123. package/dist/game/effect-monster.js +52 -9
  124. package/dist/game/effect-monster.js.map +1 -1
  125. package/dist/game/effect-teleport.d.ts +58 -19
  126. package/dist/game/effect-teleport.d.ts.map +1 -1
  127. package/dist/game/effect-teleport.js +143 -27
  128. package/dist/game/effect-teleport.js.map +1 -1
  129. package/dist/game/effect-terrain.d.ts +1 -3
  130. package/dist/game/effect-terrain.d.ts.map +1 -1
  131. package/dist/game/effect-terrain.js +38 -22
  132. package/dist/game/effect-terrain.js.map +1 -1
  133. package/dist/game/equip-cmp.d.ts.map +1 -1
  134. package/dist/game/equip-cmp.js +10 -7
  135. package/dist/game/equip-cmp.js.map +1 -1
  136. package/dist/game/floor.d.ts +16 -4
  137. package/dist/game/floor.d.ts.map +1 -1
  138. package/dist/game/floor.js +22 -4
  139. package/dist/game/floor.js.map +1 -1
  140. package/dist/game/gear.d.ts +101 -13
  141. package/dist/game/gear.d.ts.map +1 -1
  142. package/dist/game/gear.js +183 -24
  143. package/dist/game/gear.js.map +1 -1
  144. package/dist/game/harness.d.ts +2 -1
  145. package/dist/game/harness.d.ts.map +1 -1
  146. package/dist/game/harness.js +12 -1
  147. package/dist/game/harness.js.map +1 -1
  148. package/dist/game/ignore-cmd.d.ts +47 -8
  149. package/dist/game/ignore-cmd.d.ts.map +1 -1
  150. package/dist/game/ignore-cmd.js +76 -8
  151. package/dist/game/ignore-cmd.js.map +1 -1
  152. package/dist/game/known.d.ts +223 -34
  153. package/dist/game/known.d.ts.map +1 -1
  154. package/dist/game/known.js +301 -67
  155. package/dist/game/known.js.map +1 -1
  156. package/dist/game/loop.d.ts +4 -3
  157. package/dist/game/loop.d.ts.map +1 -1
  158. package/dist/game/loop.js +49 -29
  159. package/dist/game/loop.js.map +1 -1
  160. package/dist/game/lore-color.d.ts.map +1 -1
  161. package/dist/game/lore-color.js +13 -1
  162. package/dist/game/lore-color.js.map +1 -1
  163. package/dist/game/mon-cast.d.ts +3 -4
  164. package/dist/game/mon-cast.d.ts.map +1 -1
  165. package/dist/game/mon-cast.js +30 -2
  166. package/dist/game/mon-cast.js.map +1 -1
  167. package/dist/game/mon-cmd.d.ts +4 -5
  168. package/dist/game/mon-cmd.d.ts.map +1 -1
  169. package/dist/game/mon-cmd.js +80 -27
  170. package/dist/game/mon-cmd.js.map +1 -1
  171. package/dist/game/mon-death.d.ts +8 -4
  172. package/dist/game/mon-death.d.ts.map +1 -1
  173. package/dist/game/mon-death.js +6 -9
  174. package/dist/game/mon-death.js.map +1 -1
  175. package/dist/game/mon-group.d.ts +9 -5
  176. package/dist/game/mon-group.d.ts.map +1 -1
  177. package/dist/game/mon-group.js +9 -5
  178. package/dist/game/mon-group.js.map +1 -1
  179. package/dist/game/mon-message.d.ts +90 -40
  180. package/dist/game/mon-message.d.ts.map +1 -1
  181. package/dist/game/mon-message.js +267 -59
  182. package/dist/game/mon-message.js.map +1 -1
  183. package/dist/game/mon-place.d.ts +11 -1
  184. package/dist/game/mon-place.d.ts.map +1 -1
  185. package/dist/game/mon-place.js +15 -3
  186. package/dist/game/mon-place.js.map +1 -1
  187. package/dist/game/mon-ranged.d.ts +2 -1
  188. package/dist/game/mon-ranged.d.ts.map +1 -1
  189. package/dist/game/mon-ranged.js +11 -5
  190. package/dist/game/mon-ranged.js.map +1 -1
  191. package/dist/game/mon-side.d.ts +3 -2
  192. package/dist/game/mon-side.d.ts.map +1 -1
  193. package/dist/game/mon-side.js +15 -14
  194. package/dist/game/mon-side.js.map +1 -1
  195. package/dist/game/monster-turn.d.ts +20 -10
  196. package/dist/game/monster-turn.d.ts.map +1 -1
  197. package/dist/game/monster-turn.js +110 -83
  198. package/dist/game/monster-turn.js.map +1 -1
  199. package/dist/game/notice.d.ts +36 -0
  200. package/dist/game/notice.d.ts.map +1 -0
  201. package/dist/game/notice.js +79 -0
  202. package/dist/game/notice.js.map +1 -0
  203. package/dist/game/obj-cmd.d.ts +14 -3
  204. package/dist/game/obj-cmd.d.ts.map +1 -1
  205. package/dist/game/obj-cmd.js +109 -35
  206. package/dist/game/obj-cmd.js.map +1 -1
  207. package/dist/game/obj-list.d.ts +13 -2
  208. package/dist/game/obj-list.d.ts.map +1 -1
  209. package/dist/game/obj-list.js +42 -27
  210. package/dist/game/obj-list.js.map +1 -1
  211. package/dist/game/object-inspect.d.ts +9 -0
  212. package/dist/game/object-inspect.d.ts.map +1 -1
  213. package/dist/game/object-inspect.js +4 -0
  214. package/dist/game/object-inspect.js.map +1 -1
  215. package/dist/game/pickup.d.ts +0 -2
  216. package/dist/game/pickup.d.ts.map +1 -1
  217. package/dist/game/pickup.js +18 -3
  218. package/dist/game/pickup.js.map +1 -1
  219. package/dist/game/player-side-vectors.d.ts +174 -0
  220. package/dist/game/player-side-vectors.d.ts.map +1 -0
  221. package/dist/game/player-side-vectors.fixtures.d.ts +33 -0
  222. package/dist/game/player-side-vectors.fixtures.d.ts.map +1 -0
  223. package/dist/game/player-side-vectors.fixtures.js +191 -0
  224. package/dist/game/player-side-vectors.fixtures.js.map +1 -0
  225. package/dist/game/player-side-vectors.js +292 -0
  226. package/dist/game/player-side-vectors.js.map +1 -0
  227. package/dist/game/player-side.d.ts +129 -1
  228. package/dist/game/player-side.d.ts.map +1 -1
  229. package/dist/game/player-side.js +520 -338
  230. package/dist/game/player-side.js.map +1 -1
  231. package/dist/game/player-turn.d.ts +26 -7
  232. package/dist/game/player-turn.d.ts.map +1 -1
  233. package/dist/game/player-turn.js +180 -33
  234. package/dist/game/player-turn.js.map +1 -1
  235. package/dist/game/poly.d.ts +38 -0
  236. package/dist/game/poly.d.ts.map +1 -0
  237. package/dist/game/poly.js +82 -0
  238. package/dist/game/poly.js.map +1 -0
  239. package/dist/game/project-cast.d.ts +20 -3
  240. package/dist/game/project-cast.d.ts.map +1 -1
  241. package/dist/game/project-cast.js +49 -6
  242. package/dist/game/project-cast.js.map +1 -1
  243. package/dist/game/project-feat-vectors.d.ts +124 -0
  244. package/dist/game/project-feat-vectors.d.ts.map +1 -0
  245. package/dist/game/project-feat-vectors.fixtures.d.ts +13 -0
  246. package/dist/game/project-feat-vectors.fixtures.d.ts.map +1 -0
  247. package/dist/game/project-feat-vectors.fixtures.js +94 -0
  248. package/dist/game/project-feat-vectors.fixtures.js.map +1 -0
  249. package/dist/game/project-feat-vectors.js +229 -0
  250. package/dist/game/project-feat-vectors.js.map +1 -0
  251. package/dist/game/project-feat.d.ts +53 -1
  252. package/dist/game/project-feat.d.ts.map +1 -1
  253. package/dist/game/project-feat.js +374 -247
  254. package/dist/game/project-feat.js.map +1 -1
  255. package/dist/game/project-monster.d.ts +21 -8
  256. package/dist/game/project-monster.d.ts.map +1 -1
  257. package/dist/game/project-monster.js +45 -21
  258. package/dist/game/project-monster.js.map +1 -1
  259. package/dist/game/project-obj.d.ts +62 -0
  260. package/dist/game/project-obj.d.ts.map +1 -1
  261. package/dist/game/project-obj.js +72 -41
  262. package/dist/game/project-obj.js.map +1 -1
  263. package/dist/game/project-player.d.ts +8 -0
  264. package/dist/game/project-player.d.ts.map +1 -1
  265. package/dist/game/project-player.js.map +1 -1
  266. package/dist/game/projection-handlers.d.ts +81 -0
  267. package/dist/game/projection-handlers.d.ts.map +1 -0
  268. package/dist/game/projection-handlers.js +93 -0
  269. package/dist/game/projection-handlers.js.map +1 -0
  270. package/dist/game/quest.d.ts +23 -0
  271. package/dist/game/quest.d.ts.map +1 -1
  272. package/dist/game/quest.js +42 -0
  273. package/dist/game/quest.js.map +1 -1
  274. package/dist/game/ranged-cmd.d.ts +13 -2
  275. package/dist/game/ranged-cmd.d.ts.map +1 -1
  276. package/dist/game/ranged-cmd.js +32 -15
  277. package/dist/game/ranged-cmd.js.map +1 -1
  278. package/dist/game/repeat.d.ts +78 -0
  279. package/dist/game/repeat.d.ts.map +1 -0
  280. package/dist/game/repeat.js +88 -0
  281. package/dist/game/repeat.js.map +1 -0
  282. package/dist/game/shape-inspect.d.ts +74 -0
  283. package/dist/game/shape-inspect.d.ts.map +1 -0
  284. package/dist/game/shape-inspect.js +114 -0
  285. package/dist/game/shape-inspect.js.map +1 -0
  286. package/dist/game/spell-cmd.d.ts +15 -4
  287. package/dist/game/spell-cmd.d.ts.map +1 -1
  288. package/dist/game/spell-cmd.js +35 -6
  289. package/dist/game/spell-cmd.js.map +1 -1
  290. package/dist/game/spoil.d.ts.map +1 -1
  291. package/dist/game/spoil.js +89 -40
  292. package/dist/game/spoil.js.map +1 -1
  293. package/dist/game/steal.d.ts +3 -3
  294. package/dist/game/steal.d.ts.map +1 -1
  295. package/dist/game/steal.js +9 -4
  296. package/dist/game/steal.js.map +1 -1
  297. package/dist/game/target-loop.d.ts +10 -4
  298. package/dist/game/target-loop.d.ts.map +1 -1
  299. package/dist/game/target-loop.js +14 -8
  300. package/dist/game/target-loop.js.map +1 -1
  301. package/dist/game/target.d.ts +4 -4
  302. package/dist/game/target.d.ts.map +1 -1
  303. package/dist/game/target.js +19 -8
  304. package/dist/game/target.js.map +1 -1
  305. package/dist/game/ui-entry.d.ts +63 -4
  306. package/dist/game/ui-entry.d.ts.map +1 -1
  307. package/dist/game/ui-entry.js +151 -23
  308. package/dist/game/ui-entry.js.map +1 -1
  309. package/dist/game/wizard.d.ts +23 -5
  310. package/dist/game/wizard.d.ts.map +1 -1
  311. package/dist/game/wizard.js +93 -11
  312. package/dist/game/wizard.js.map +1 -1
  313. package/dist/game/world.d.ts.map +1 -1
  314. package/dist/game/world.js +6 -0
  315. package/dist/game/world.js.map +1 -1
  316. package/dist/gen/cave.d.ts +49 -8
  317. package/dist/gen/cave.d.ts.map +1 -1
  318. package/dist/gen/cave.js +200 -28
  319. package/dist/gen/cave.js.map +1 -1
  320. package/dist/gen/generate.d.ts +54 -9
  321. package/dist/gen/generate.d.ts.map +1 -1
  322. package/dist/gen/generate.js +55 -8
  323. package/dist/gen/generate.js.map +1 -1
  324. package/dist/gen/glyph-vectors.d.ts +109 -0
  325. package/dist/gen/glyph-vectors.d.ts.map +1 -0
  326. package/dist/gen/glyph-vectors.fixtures.d.ts +18 -0
  327. package/dist/gen/glyph-vectors.fixtures.d.ts.map +1 -0
  328. package/dist/gen/glyph-vectors.fixtures.js +94 -0
  329. package/dist/gen/glyph-vectors.fixtures.js.map +1 -0
  330. package/dist/gen/glyph-vectors.js +218 -0
  331. package/dist/gen/glyph-vectors.js.map +1 -0
  332. package/dist/gen/glyph.d.ts +104 -0
  333. package/dist/gen/glyph.d.ts.map +1 -0
  334. package/dist/gen/glyph.js +72 -0
  335. package/dist/gen/glyph.js.map +1 -0
  336. package/dist/gen/room.d.ts +26 -2
  337. package/dist/gen/room.d.ts.map +1 -1
  338. package/dist/gen/room.js +414 -264
  339. package/dist/gen/room.js.map +1 -1
  340. package/dist/gen/util.d.ts +11 -2
  341. package/dist/gen/util.d.ts.map +1 -1
  342. package/dist/gen/util.js +31 -9
  343. package/dist/gen/util.js.map +1 -1
  344. package/dist/i18n/i18n.d.ts +207 -0
  345. package/dist/i18n/i18n.d.ts.map +1 -0
  346. package/dist/i18n/i18n.js +405 -0
  347. package/dist/i18n/i18n.js.map +1 -0
  348. package/dist/i18n/text.d.ts +62 -0
  349. package/dist/i18n/text.d.ts.map +1 -0
  350. package/dist/i18n/text.js +120 -0
  351. package/dist/i18n/text.js.map +1 -0
  352. package/dist/index.d.ts +25 -0
  353. package/dist/index.d.ts.map +1 -1
  354. package/dist/index.js +38 -0
  355. package/dist/index.js.map +1 -1
  356. package/dist/mod/extension.d.ts +115 -0
  357. package/dist/mod/extension.d.ts.map +1 -0
  358. package/dist/mod/extension.js +85 -0
  359. package/dist/mod/extension.js.map +1 -0
  360. package/dist/mod/ids.d.ts +10 -0
  361. package/dist/mod/ids.d.ts.map +1 -1
  362. package/dist/mod/ids.js +90 -21
  363. package/dist/mod/ids.js.map +1 -1
  364. package/dist/mod/record-keys.d.ts +43 -0
  365. package/dist/mod/record-keys.d.ts.map +1 -0
  366. package/dist/mod/record-keys.js +100 -0
  367. package/dist/mod/record-keys.js.map +1 -0
  368. package/dist/mod/registry-host.d.ts +472 -0
  369. package/dist/mod/registry-host.d.ts.map +1 -1
  370. package/dist/mod/registry-host.js +313 -0
  371. package/dist/mod/registry-host.js.map +1 -1
  372. package/dist/mod/save-blocks.d.ts +1 -1
  373. package/dist/mon/bind.d.ts.map +1 -1
  374. package/dist/mon/bind.js +6 -3
  375. package/dist/mon/bind.js.map +1 -1
  376. package/dist/mon/knowledge-groups.d.ts +0 -6
  377. package/dist/mon/knowledge-groups.d.ts.map +1 -1
  378. package/dist/mon/knowledge-groups.js +12 -8
  379. package/dist/mon/knowledge-groups.js.map +1 -1
  380. package/dist/mon/lore-describe.d.ts +46 -10
  381. package/dist/mon/lore-describe.d.ts.map +1 -1
  382. package/dist/mon/lore-describe.js +74 -22
  383. package/dist/mon/lore-describe.js.map +1 -1
  384. package/dist/mon/lore-file.d.ts +126 -0
  385. package/dist/mon/lore-file.d.ts.map +1 -0
  386. package/dist/mon/lore-file.js +291 -0
  387. package/dist/mon/lore-file.js.map +1 -0
  388. package/dist/mon/lore.d.ts +9 -3
  389. package/dist/mon/lore.d.ts.map +1 -1
  390. package/dist/mon/lore.js +9 -3
  391. package/dist/mon/lore.js.map +1 -1
  392. package/dist/mon/make.d.ts +4 -2
  393. package/dist/mon/make.d.ts.map +1 -1
  394. package/dist/mon/make.js +4 -2
  395. package/dist/mon/make.js.map +1 -1
  396. package/dist/mon/monster.d.ts +1 -1
  397. package/dist/mon/monster.js +1 -1
  398. package/dist/mon/predicate.d.ts +14 -9
  399. package/dist/mon/predicate.d.ts.map +1 -1
  400. package/dist/mon/predicate.js +14 -9
  401. package/dist/mon/predicate.js.map +1 -1
  402. package/dist/mon/project-mon.d.ts +16 -3
  403. package/dist/mon/project-mon.d.ts.map +1 -1
  404. package/dist/mon/project-mon.js +14 -5
  405. package/dist/mon/project-mon.js.map +1 -1
  406. package/dist/mon/steal.d.ts +31 -4
  407. package/dist/mon/steal.d.ts.map +1 -1
  408. package/dist/mon/steal.js +20 -7
  409. package/dist/mon/steal.js.map +1 -1
  410. package/dist/mon/take-hit.d.ts +8 -3
  411. package/dist/mon/take-hit.d.ts.map +1 -1
  412. package/dist/mon/take-hit.js +8 -3
  413. package/dist/mon/take-hit.js.map +1 -1
  414. package/dist/mon/timed.d.ts +15 -9
  415. package/dist/mon/timed.d.ts.map +1 -1
  416. package/dist/mon/timed.js +13 -8
  417. package/dist/mon/timed.js.map +1 -1
  418. package/dist/mon/types.d.ts +11 -4
  419. package/dist/mon/types.d.ts.map +1 -1
  420. package/dist/mon/types.js.map +1 -1
  421. package/dist/msg.d.ts +40 -1
  422. package/dist/msg.d.ts.map +1 -1
  423. package/dist/msg.js +42 -1
  424. package/dist/msg.js.map +1 -1
  425. package/dist/obj/artifact-fake.d.ts +46 -14
  426. package/dist/obj/artifact-fake.d.ts.map +1 -1
  427. package/dist/obj/artifact-fake.js +46 -17
  428. package/dist/obj/artifact-fake.js.map +1 -1
  429. package/dist/obj/bind.d.ts +23 -0
  430. package/dist/obj/bind.d.ts.map +1 -1
  431. package/dist/obj/bind.js +49 -9
  432. package/dist/obj/bind.js.map +1 -1
  433. package/dist/obj/desc-vectors.d.ts +68 -0
  434. package/dist/obj/desc-vectors.d.ts.map +1 -0
  435. package/dist/obj/desc-vectors.fixtures.d.ts +12 -0
  436. package/dist/obj/desc-vectors.fixtures.d.ts.map +1 -0
  437. package/dist/obj/desc-vectors.fixtures.js +95 -0
  438. package/dist/obj/desc-vectors.fixtures.js.map +1 -0
  439. package/dist/obj/desc-vectors.js +86 -0
  440. package/dist/obj/desc-vectors.js.map +1 -0
  441. package/dist/obj/desc.d.ts +17 -2
  442. package/dist/obj/desc.d.ts.map +1 -1
  443. package/dist/obj/desc.js +129 -54
  444. package/dist/obj/desc.js.map +1 -1
  445. package/dist/obj/effects-info.d.ts.map +1 -1
  446. package/dist/obj/effects-info.js +87 -58
  447. package/dist/obj/effects-info.js.map +1 -1
  448. package/dist/obj/fake-object.d.ts +70 -0
  449. package/dist/obj/fake-object.d.ts.map +1 -0
  450. package/dist/obj/fake-object.js +104 -0
  451. package/dist/obj/fake-object.js.map +1 -0
  452. package/dist/obj/ignore.d.ts +55 -12
  453. package/dist/obj/ignore.d.ts.map +1 -1
  454. package/dist/obj/ignore.js +68 -31
  455. package/dist/obj/ignore.js.map +1 -1
  456. package/dist/obj/knowledge.d.ts +46 -3
  457. package/dist/obj/knowledge.d.ts.map +1 -1
  458. package/dist/obj/knowledge.js +169 -151
  459. package/dist/obj/knowledge.js.map +1 -1
  460. package/dist/obj/known-object.d.ts +68 -8
  461. package/dist/obj/known-object.d.ts.map +1 -1
  462. package/dist/obj/known-object.js +90 -10
  463. package/dist/obj/known-object.js.map +1 -1
  464. package/dist/obj/make.d.ts +15 -4
  465. package/dist/obj/make.d.ts.map +1 -1
  466. package/dist/obj/make.js +49 -27
  467. package/dist/obj/make.js.map +1 -1
  468. package/dist/obj/object-info.d.ts +10 -0
  469. package/dist/obj/object-info.d.ts.map +1 -1
  470. package/dist/obj/object-info.js +93 -7
  471. package/dist/obj/object-info.js.map +1 -1
  472. package/dist/obj/object.d.ts +42 -4
  473. package/dist/obj/object.d.ts.map +1 -1
  474. package/dist/obj/object.js +362 -147
  475. package/dist/obj/object.js.map +1 -1
  476. package/dist/obj/power.d.ts +23 -4
  477. package/dist/obj/power.d.ts.map +1 -1
  478. package/dist/obj/power.js +231 -65
  479. package/dist/obj/power.js.map +1 -1
  480. package/dist/obj/randart-build.d.ts +27 -22
  481. package/dist/obj/randart-build.d.ts.map +1 -1
  482. package/dist/obj/randart-build.js +435 -357
  483. package/dist/obj/randart-build.js.map +1 -1
  484. package/dist/obj/randart-data.d.ts +62 -24
  485. package/dist/obj/randart-data.d.ts.map +1 -1
  486. package/dist/obj/randart-data.js +333 -189
  487. package/dist/obj/randart-data.js.map +1 -1
  488. package/dist/obj/randart-file.d.ts +21 -0
  489. package/dist/obj/randart-file.d.ts.map +1 -0
  490. package/dist/obj/randart-file.js +119 -0
  491. package/dist/obj/randart-file.js.map +1 -0
  492. package/dist/obj/randart-log.d.ts +63 -0
  493. package/dist/obj/randart-log.d.ts.map +1 -0
  494. package/dist/obj/randart-log.js +72 -0
  495. package/dist/obj/randart-log.js.map +1 -0
  496. package/dist/obj/randart-registry.d.ts +178 -0
  497. package/dist/obj/randart-registry.d.ts.map +1 -0
  498. package/dist/obj/randart-registry.js +140 -0
  499. package/dist/obj/randart-registry.js.map +1 -0
  500. package/dist/obj/randart-vectors.d.ts +97 -0
  501. package/dist/obj/randart-vectors.d.ts.map +1 -0
  502. package/dist/obj/randart-vectors.fixtures.d.ts +18 -0
  503. package/dist/obj/randart-vectors.fixtures.d.ts.map +1 -0
  504. package/dist/obj/randart-vectors.fixtures.js +50 -0
  505. package/dist/obj/randart-vectors.fixtures.js.map +1 -0
  506. package/dist/obj/randart-vectors.js +311 -0
  507. package/dist/obj/randart-vectors.js.map +1 -0
  508. package/dist/obj/randart.d.ts +53 -15
  509. package/dist/obj/randart.d.ts.map +1 -1
  510. package/dist/obj/randart.js +166 -44
  511. package/dist/obj/randart.js.map +1 -1
  512. package/dist/obj/rune-registry.d.ts +180 -0
  513. package/dist/obj/rune-registry.d.ts.map +1 -0
  514. package/dist/obj/rune-registry.js +161 -0
  515. package/dist/obj/rune-registry.js.map +1 -0
  516. package/dist/obj/rune-vectors.d.ts +99 -0
  517. package/dist/obj/rune-vectors.d.ts.map +1 -0
  518. package/dist/obj/rune-vectors.fixtures.d.ts +44 -0
  519. package/dist/obj/rune-vectors.fixtures.d.ts.map +1 -0
  520. package/dist/obj/rune-vectors.fixtures.js +125 -0
  521. package/dist/obj/rune-vectors.fixtures.js.map +1 -0
  522. package/dist/obj/rune-vectors.js +159 -0
  523. package/dist/obj/rune-vectors.js.map +1 -0
  524. package/dist/obj/tval-registry.d.ts +174 -0
  525. package/dist/obj/tval-registry.d.ts.map +1 -0
  526. package/dist/obj/tval-registry.js +151 -0
  527. package/dist/obj/tval-registry.js.map +1 -0
  528. package/dist/obj/tval-vectors.d.ts +85 -0
  529. package/dist/obj/tval-vectors.d.ts.map +1 -0
  530. package/dist/obj/tval-vectors.fixtures.d.ts +24 -0
  531. package/dist/obj/tval-vectors.fixtures.d.ts.map +1 -0
  532. package/dist/obj/tval-vectors.fixtures.js +41 -0
  533. package/dist/obj/tval-vectors.fixtures.js.map +1 -0
  534. package/dist/obj/tval-vectors.js +76 -0
  535. package/dist/obj/tval-vectors.js.map +1 -0
  536. package/dist/obj/types.d.ts +18 -7
  537. package/dist/obj/types.d.ts.map +1 -1
  538. package/dist/obj/types.js.map +1 -1
  539. package/dist/obj/value.d.ts.map +1 -1
  540. package/dist/obj/value.js +23 -20
  541. package/dist/obj/value.js.map +1 -1
  542. package/dist/parser.d.ts +116 -0
  543. package/dist/parser.d.ts.map +1 -0
  544. package/dist/parser.js +205 -0
  545. package/dist/parser.js.map +1 -0
  546. package/dist/player/bind.d.ts.map +1 -1
  547. package/dist/player/bind.js +3 -2
  548. package/dist/player/bind.js.map +1 -1
  549. package/dist/player/birth.d.ts +2 -1
  550. package/dist/player/birth.d.ts.map +1 -1
  551. package/dist/player/birth.js +2 -1
  552. package/dist/player/birth.js.map +1 -1
  553. package/dist/player/calcs.d.ts +58 -23
  554. package/dist/player/calcs.d.ts.map +1 -1
  555. package/dist/player/calcs.js +93 -36
  556. package/dist/player/calcs.js.map +1 -1
  557. package/dist/player/death.d.ts +50 -0
  558. package/dist/player/death.d.ts.map +1 -0
  559. package/dist/player/death.js +46 -0
  560. package/dist/player/death.js.map +1 -0
  561. package/dist/player/options-file.d.ts +129 -0
  562. package/dist/player/options-file.d.ts.map +1 -0
  563. package/dist/player/options-file.js +309 -0
  564. package/dist/player/options-file.js.map +1 -0
  565. package/dist/player/options.d.ts +2 -1
  566. package/dist/player/options.d.ts.map +1 -1
  567. package/dist/player/options.js +2 -1
  568. package/dist/player/options.js.map +1 -1
  569. package/dist/player/player.d.ts +50 -3
  570. package/dist/player/player.d.ts.map +1 -1
  571. package/dist/player/player.js +10 -1
  572. package/dist/player/player.js.map +1 -1
  573. package/dist/player/shape-lore.d.ts +11 -7
  574. package/dist/player/shape-lore.d.ts.map +1 -1
  575. package/dist/player/shape-lore.js +24 -11
  576. package/dist/player/shape-lore.js.map +1 -1
  577. package/dist/player/timed.d.ts +5 -3
  578. package/dist/player/timed.d.ts.map +1 -1
  579. package/dist/player/timed.js +11 -2
  580. package/dist/player/timed.js.map +1 -1
  581. package/dist/player/types.d.ts +29 -4
  582. package/dist/player/types.d.ts.map +1 -1
  583. package/dist/player/types.js +24 -1
  584. package/dist/player/types.js.map +1 -1
  585. package/dist/session/boot.d.ts +26 -2
  586. package/dist/session/boot.d.ts.map +1 -1
  587. package/dist/session/boot.js +21 -2
  588. package/dist/session/boot.js.map +1 -1
  589. package/dist/session/game.d.ts +15 -0
  590. package/dist/session/game.d.ts.map +1 -1
  591. package/dist/session/game.js +616 -140
  592. package/dist/session/game.js.map +1 -1
  593. package/dist/session/save-migrate.d.ts.map +1 -1
  594. package/dist/session/save-migrate.js +76 -1
  595. package/dist/session/save-migrate.js.map +1 -1
  596. package/dist/session/save.d.ts +75 -12
  597. package/dist/session/save.d.ts.map +1 -1
  598. package/dist/session/save.js +177 -18
  599. package/dist/session/save.js.map +1 -1
  600. package/dist/store/bind.d.ts +1 -1
  601. package/dist/store/bind.d.ts.map +1 -1
  602. package/dist/store/bind.js +4 -3
  603. package/dist/store/bind.js.map +1 -1
  604. package/dist/store/mass-produce-vectors.d.ts +40 -0
  605. package/dist/store/mass-produce-vectors.d.ts.map +1 -0
  606. package/dist/store/mass-produce-vectors.fixtures.d.ts +13 -0
  607. package/dist/store/mass-produce-vectors.fixtures.d.ts.map +1 -0
  608. package/dist/store/mass-produce-vectors.fixtures.js +52 -0
  609. package/dist/store/mass-produce-vectors.fixtures.js.map +1 -0
  610. package/dist/store/mass-produce-vectors.js +44 -0
  611. package/dist/store/mass-produce-vectors.js.map +1 -0
  612. package/dist/store/store.d.ts +104 -7
  613. package/dist/store/store.d.ts.map +1 -1
  614. package/dist/store/store.js +199 -77
  615. package/dist/store/store.js.map +1 -1
  616. package/dist/store/transact.d.ts +14 -5
  617. package/dist/store/transact.d.ts.map +1 -1
  618. package/dist/store/transact.js +17 -16
  619. package/dist/store/transact.js.map +1 -1
  620. package/dist/store/types.d.ts +3 -2
  621. package/dist/store/types.d.ts.map +1 -1
  622. package/dist/store/types.js +1 -1
  623. package/dist/version.d.ts +1 -1
  624. package/dist/version.js +1 -1
  625. package/dist/visuals/index.d.ts +1 -0
  626. package/dist/visuals/index.d.ts.map +1 -1
  627. package/dist/visuals/index.js +1 -0
  628. package/dist/visuals/index.js.map +1 -1
  629. package/dist/visuals/map-text.d.ts +8 -0
  630. package/dist/visuals/map-text.d.ts.map +1 -1
  631. package/dist/visuals/map-text.js +1 -1
  632. package/dist/visuals/map-text.js.map +1 -1
  633. package/dist/visuals/object-glyph.d.ts +56 -0
  634. package/dist/visuals/object-glyph.d.ts.map +1 -0
  635. package/dist/visuals/object-glyph.js +52 -0
  636. package/dist/visuals/object-glyph.js.map +1 -0
  637. package/dist/visuals/prefs.d.ts +14 -22
  638. package/dist/visuals/prefs.d.ts.map +1 -1
  639. package/dist/visuals/prefs.js +4 -23
  640. package/dist/visuals/prefs.js.map +1 -1
  641. package/dist/visuals/tile-prefs.d.ts +26 -0
  642. package/dist/visuals/tile-prefs.d.ts.map +1 -1
  643. package/dist/visuals/tile-prefs.js +28 -0
  644. package/dist/visuals/tile-prefs.js.map +1 -1
  645. package/dist/world/feature.d.ts +2 -1
  646. package/dist/world/feature.d.ts.map +1 -1
  647. package/dist/world/feature.js +2 -0
  648. package/dist/world/feature.js.map +1 -1
  649. package/dist/world/project.d.ts +10 -2
  650. package/dist/world/project.d.ts.map +1 -1
  651. package/dist/world/project.js +18 -6
  652. package/dist/world/project.js.map +1 -1
  653. package/dist/world/projection.d.ts +37 -3
  654. package/dist/world/projection.d.ts.map +1 -1
  655. package/dist/world/projection.js +69 -7
  656. package/dist/world/projection.js.map +1 -1
  657. package/dist/world/trap.d.ts +2 -1
  658. package/dist/world/trap.d.ts.map +1 -1
  659. package/dist/world/trap.js +2 -1
  660. package/dist/world/trap.js.map +1 -1
  661. package/dist/world/view.d.ts +1 -1
  662. package/dist/world/view.d.ts.map +1 -1
  663. package/dist/world/view.js +11 -3
  664. package/dist/world/view.js.map +1 -1
  665. package/package.json +1 -1
  666. package/src/agent/perceive.ts +2 -3
  667. package/src/combat/blow-vectors.fixtures.ts +99 -0
  668. package/src/combat/blow-vectors.json +482 -0
  669. package/src/combat/blow-vectors.ts +280 -0
  670. package/src/combat/brand-slay.ts +42 -11
  671. package/src/combat/index.ts +1 -1
  672. package/src/combat/melee.ts +37 -19
  673. package/src/combat/mon-melee.ts +611 -364
  674. package/src/combat/ranged.ts +43 -26
  675. package/src/constants.ts +15 -0
  676. package/src/datafile.ts +148 -0
  677. package/src/effects/effect-info-registry.ts +313 -0
  678. package/src/effects/effect-info-vectors.fixtures.ts +61 -0
  679. package/src/effects/effect-info-vectors.json +11532 -0
  680. package/src/effects/effect-info-vectors.ts +376 -0
  681. package/src/effects/effect-info.ts +1005 -859
  682. package/src/effects/effect.ts +96 -62
  683. package/src/effects/handlers.ts +5 -2
  684. package/src/effects/interpreter.ts +14 -0
  685. package/src/game/cave-cmd.ts +54 -11
  686. package/src/game/cave-square.ts +80 -0
  687. package/src/game/char-sheet.ts +59 -16
  688. package/src/game/chest.ts +25 -8
  689. package/src/game/context.ts +293 -27
  690. package/src/game/describe.ts +34 -4
  691. package/src/game/display.ts +215 -19
  692. package/src/game/dump-level.ts +3 -2
  693. package/src/game/effect-attack.ts +41 -28
  694. package/src/game/effect-detect.ts +45 -8
  695. package/src/game/effect-env.ts +8 -0
  696. package/src/game/effect-general.ts +110 -47
  697. package/src/game/effect-item.ts +1075 -999
  698. package/src/game/effect-melee.ts +51 -18
  699. package/src/game/effect-monster.ts +55 -9
  700. package/src/game/effect-teleport.ts +173 -38
  701. package/src/game/effect-terrain.ts +38 -22
  702. package/src/game/equip-cmp.ts +483 -480
  703. package/src/game/floor.ts +22 -4
  704. package/src/game/gear.ts +210 -21
  705. package/src/game/harness.ts +12 -1
  706. package/src/game/ignore-cmd.ts +96 -8
  707. package/src/game/known.ts +392 -73
  708. package/src/game/loop.ts +52 -27
  709. package/src/game/lore-color.ts +13 -1
  710. package/src/game/mon-cast.ts +31 -6
  711. package/src/game/mon-cmd.ts +95 -30
  712. package/src/game/mon-death.ts +14 -12
  713. package/src/game/mon-group.ts +9 -5
  714. package/src/game/mon-message.ts +363 -65
  715. package/src/game/mon-place.ts +15 -3
  716. package/src/game/mon-ranged.ts +14 -5
  717. package/src/game/mon-side.ts +16 -12
  718. package/src/game/monster-turn.ts +120 -87
  719. package/src/game/notice.ts +85 -0
  720. package/src/game/obj-cmd.ts +126 -37
  721. package/src/game/obj-list.ts +44 -26
  722. package/src/game/object-inspect.ts +13 -0
  723. package/src/game/pickup.ts +29 -5
  724. package/src/game/player-side-vectors.fixtures.ts +215 -0
  725. package/src/game/player-side-vectors.json +6914 -0
  726. package/src/game/player-side-vectors.ts +420 -0
  727. package/src/game/player-side.ts +622 -340
  728. package/src/game/player-turn.ts +228 -31
  729. package/src/game/poly.ts +107 -0
  730. package/src/game/project-cast.ts +63 -6
  731. package/src/game/project-feat-vectors.fixtures.ts +106 -0
  732. package/src/game/project-feat-vectors.json +6554 -0
  733. package/src/game/project-feat-vectors.ts +323 -0
  734. package/src/game/project-feat.ts +417 -248
  735. package/src/game/project-monster.ts +69 -30
  736. package/src/game/project-obj-vectors.json +1 -0
  737. package/src/game/project-obj.ts +115 -47
  738. package/src/game/project-player.ts +8 -0
  739. package/src/game/projection-handlers.ts +110 -0
  740. package/src/game/quest.ts +48 -0
  741. package/src/game/ranged-cmd.ts +45 -11
  742. package/src/game/repeat.ts +92 -0
  743. package/src/game/shape-inspect.ts +166 -0
  744. package/src/game/spell-cmd.ts +39 -6
  745. package/src/game/spoil.ts +92 -39
  746. package/src/game/steal.ts +9 -4
  747. package/src/game/target-loop.ts +14 -7
  748. package/src/game/target.ts +18 -7
  749. package/src/game/ui-entry.ts +172 -22
  750. package/src/game/wizard.ts +97 -10
  751. package/src/game/world.ts +6 -0
  752. package/src/gen/cave.ts +225 -26
  753. package/src/gen/generate.ts +62 -9
  754. package/src/gen/glyph-vectors.fixtures.ts +122 -0
  755. package/src/gen/glyph-vectors.json +5996 -0
  756. package/src/gen/glyph-vectors.ts +280 -0
  757. package/src/gen/glyph.ts +132 -0
  758. package/src/gen/room.ts +446 -265
  759. package/src/gen/util.ts +32 -9
  760. package/src/i18n/i18n.ts +492 -0
  761. package/src/i18n/text.ts +117 -0
  762. package/src/index.ts +307 -254
  763. package/src/mod/extension.ts +136 -0
  764. package/src/mod/ids.ts +92 -21
  765. package/src/mod/record-keys.ts +102 -0
  766. package/src/mod/registry-host.ts +1063 -234
  767. package/src/mon/bind.ts +14 -8
  768. package/src/mon/knowledge-groups.ts +12 -12
  769. package/src/mon/lore-describe.ts +93 -26
  770. package/src/mon/lore-file.ts +365 -0
  771. package/src/mon/lore.ts +9 -3
  772. package/src/mon/make.ts +4 -2
  773. package/src/mon/monster.ts +1 -1
  774. package/src/mon/predicate.ts +14 -9
  775. package/src/mon/project-mon.ts +23 -5
  776. package/src/mon/steal.ts +39 -7
  777. package/src/mon/take-hit.ts +8 -3
  778. package/src/mon/timed.ts +15 -9
  779. package/src/mon/types.ts +11 -4
  780. package/src/msg.ts +55 -1
  781. package/src/obj/artifact-fake.ts +47 -17
  782. package/src/obj/bind.ts +52 -9
  783. package/src/obj/desc-vectors.fixtures.ts +119 -0
  784. package/src/obj/desc-vectors.json +2360 -0
  785. package/src/obj/desc-vectors.ts +128 -0
  786. package/src/obj/desc.ts +159 -55
  787. package/src/obj/effects-info.ts +90 -59
  788. package/src/obj/fake-object.ts +135 -0
  789. package/src/obj/ignore.ts +95 -28
  790. package/src/obj/knowledge.ts +291 -139
  791. package/src/obj/known-object.ts +126 -11
  792. package/src/obj/make.ts +53 -29
  793. package/src/obj/object-info.ts +103 -6
  794. package/src/obj/object.ts +392 -151
  795. package/src/obj/power.ts +297 -59
  796. package/src/obj/randart-build.ts +1875 -1705
  797. package/src/obj/randart-data.ts +1547 -1344
  798. package/src/obj/randart-file.ts +130 -0
  799. package/src/obj/randart-log.ts +78 -0
  800. package/src/obj/randart-registry.ts +247 -0
  801. package/src/obj/randart-vectors.fixtures.ts +61 -0
  802. package/src/obj/randart-vectors.json +836 -0
  803. package/src/obj/randart-vectors.ts +369 -0
  804. package/src/obj/randart.ts +722 -552
  805. package/src/obj/rune-registry.ts +270 -0
  806. package/src/obj/rune-vectors.fixtures.ts +164 -0
  807. package/src/obj/rune-vectors.json +121 -0
  808. package/src/obj/rune-vectors.ts +229 -0
  809. package/src/obj/tval-kind-vectors.json +391 -0
  810. package/src/obj/tval-registry.ts +243 -0
  811. package/src/obj/tval-vectors.fixtures.ts +50 -0
  812. package/src/obj/tval-vectors.json +38 -0
  813. package/src/obj/tval-vectors.ts +126 -0
  814. package/src/obj/types.ts +18 -7
  815. package/src/obj/value.ts +26 -20
  816. package/src/parser.ts +214 -0
  817. package/src/player/bind.ts +5 -2
  818. package/src/player/birth.ts +2 -1
  819. package/src/player/calcs.ts +123 -42
  820. package/src/player/death.ts +78 -0
  821. package/src/player/options-file.ts +387 -0
  822. package/src/player/options.ts +2 -1
  823. package/src/player/player.ts +60 -4
  824. package/src/player/shape-lore.ts +33 -14
  825. package/src/player/timed.ts +14 -4
  826. package/src/player/types.ts +30 -4
  827. package/src/session/boot.ts +51 -1
  828. package/src/session/game.ts +720 -163
  829. package/src/session/save-migrate.ts +81 -1
  830. package/src/session/save.ts +264 -22
  831. package/src/store/bind.ts +4 -3
  832. package/src/store/mass-produce-vectors.fixtures.ts +64 -0
  833. package/src/store/mass-produce-vectors.json +1169 -0
  834. package/src/store/mass-produce-vectors.ts +67 -0
  835. package/src/store/store.ts +266 -63
  836. package/src/store/transact.ts +39 -16
  837. package/src/store/types.ts +3 -2
  838. package/src/version.ts +1 -1
  839. package/src/visuals/index.ts +1 -0
  840. package/src/visuals/map-text.ts +1 -1
  841. package/src/visuals/object-glyph.ts +76 -0
  842. package/src/visuals/prefs.ts +22 -32
  843. package/src/visuals/tile-prefs.ts +32 -0
  844. package/src/world/feature.ts +4 -1
  845. package/src/world/project.ts +19 -4
  846. package/src/world/projection.ts +79 -8
  847. package/src/world/trap.ts +25 -21
  848. package/src/world/view.ts +11 -1
@@ -0,0 +1,270 @@
1
+ /**
2
+ * The RUNE registry: every question core asks about a rune, plus the "You feel
3
+ * stronger!" line a modifier prints on wield.
4
+ *
5
+ * WHY THIS IS A REGISTRY, and why it is a harder closure than the four before
6
+ * it. A rune is the unit of object knowledge - what the player learns, what an
7
+ * item is found to carry, what the recall screen names and describes. Six
8
+ * places in `knowledge.ts` decided all of it, and five of them dispatched on
9
+ * `rune.variety`, which was a CLOSED TYPESCRIPT UNION of seven string literals.
10
+ *
11
+ * A union is closed in a way a switch is not. A switch has a `default` arm that
12
+ * a mod's key reaches and fails at, which is at least a place to stand; a union
13
+ * refuses the key at the type level, so a mod could not coin a variety at all
14
+ * and no arm was ever reached to fail. `tools/switch-census.json` saw none of
15
+ * this - it counts `switch` statements, all five of these are under its 8-case
16
+ * threshold, and it counts neither a union type's existence nor its size. The
17
+ * census recorded ONE row for this file, `modMessage`. That is the same lesson
18
+ * gap 28 charged for in a new shape: the census measures SYNTAX, a gap is about
19
+ * REACH.
20
+ *
21
+ * The six closed decisions, and what each cost a mod-coined rune:
22
+ *
23
+ * - `runeDesc` - the recall line. No arm meant no description at all.
24
+ * - `runeName` - the display decoration ("<x> brand", "slay <x>"). Upstream's
25
+ * own `default` returns the bare name, so this one had a real fallback and
26
+ * still does; it is the only one of the six that did.
27
+ * - `playerKnowsRune` / `playerLearnRune` - the knowledge pair. A mod's rune
28
+ * was unknowable AND unlearnable, which is worse than either alone: it
29
+ * could never appear as learned, and `objectRunesKnown` therefore treated
30
+ * any object carrying one as permanently un-assessed.
31
+ * - `objectHasRune` - whether an item carries it. Always no.
32
+ * - `modMessage` - the flavour line on noticing a modifier. The only OBJ_MOD
33
+ * switch in the tree, out of 114 `OBJ_MOD.*` references. A mod-coined
34
+ * modifier was learned in silence.
35
+ *
36
+ * WHERE A MOD'S RUNE KNOWLEDGE LIVES, which is the question that made this
37
+ * conversion different from the four before it. `playerKnowsRune` reads typed
38
+ * stores on `p.objKnown` - `modifiers[]`, `elInfo[]`, `flags` - all sized from
39
+ * core's fixed-arity enums, so there is no slot for a mod's rune and growing
40
+ * that arity is exactly what `mod/vocabulary.ts` was built to avoid (see its
41
+ * header for the W2.3 architecture decision). The answer is that this registry
42
+ * needs NO new store: `knows` and `learn` are handed the player, and a mod
43
+ * keeps its own per-entity values in its own `VocabularyRegistry`, which
44
+ * already persists into that mod's opaque save bag. So the seam stays a pure
45
+ * dispatch table and there is one mechanism for mod-owned per-entity state, not
46
+ * two.
47
+ *
48
+ * THE PRODUCER IS PART OF THE SEAM, not an extra. `buildRuneList` is what every
49
+ * consumer enumerates - the knowledge screens, `objectRunesKnown`, and
50
+ * EF_IDENTIFY's random unknown rune - so six handler tables with no way to get
51
+ * a rune INTO that list would be a seam its own callers walk past, which is the
52
+ * failure three of the five previous conversions each turned up in a different
53
+ * place. `contribute` is the door: core builds its list, then every contributor
54
+ * appends.
55
+ *
56
+ * RNG: `objectFindUnknownRune` draws `randint0(poss.length)` over the list, so
57
+ * a contributor that adds runes DOES move that draw - by design, since the mod
58
+ * is adding content and its rune is now genuinely a candidate. With no mod
59
+ * loaded the list is byte-identical to before, which is what the parity claim
60
+ * needs; `rune-vectors.json` holds all 99 rows.
61
+ *
62
+ * WHY MODULE-LEVEL. The same 2026-08-09 ruling behind `EffectInfoRegistry`,
63
+ * `RandartRegistry` and `TvalRegistry`: disabling a mod always takes effect on
64
+ * the next RELOAD, so a module-level table cannot violate the mod default
65
+ * policy. `resetRuneRegistry()` restores core's arms without a fresh realm and
66
+ * has no production caller by design.
67
+ */
68
+
69
+ import type { GameObject } from "./object.js";
70
+ import type { Player } from "../player/player.js";
71
+ import type { Rune, RuneEnv } from "./knowledge.js";
72
+
73
+ /* ------------------------------------------------------------------ *
74
+ * The variety key.
75
+ * ------------------------------------------------------------------ */
76
+
77
+ /**
78
+ * The seven varieties core defines (`enum rune_variety`, obj-knowledge.h).
79
+ * Named separately so core's own code keeps exhaustive checking against the
80
+ * real set, and so this file can say which seven it seeds.
81
+ */
82
+ export type CoreRuneVariety =
83
+ | "combat"
84
+ | "mod"
85
+ | "resist"
86
+ | "brand"
87
+ | "slay"
88
+ | "curse"
89
+ | "flag";
90
+
91
+ /**
92
+ * A rune variety. Core's seven, or any string a mod coins.
93
+ *
94
+ * `(string & {})` rather than a bare `string`: it keeps the seven core names as
95
+ * editor completions and as the thing a typo is checked against in core's own
96
+ * code, while admitting a mod's `"demo:attunement"`. A bare `string` would have
97
+ * silently accepted `"resiste"` everywhere in this package.
98
+ */
99
+ export type RuneVariety = CoreRuneVariety | (string & {});
100
+
101
+ /* ------------------------------------------------------------------ *
102
+ * The handler types, one per closed decision.
103
+ * ------------------------------------------------------------------ */
104
+
105
+ /**
106
+ * `rune_desc` (obj-knowledge.c L344-403): the recall description. Unregistered
107
+ * returns `""`, which is upstream's own fall-through for a rune it cannot
108
+ * describe (the C default reaches NULL).
109
+ */
110
+ export type RuneDescHandler = (env: RuneEnv, rune: Rune) => string;
111
+
112
+ /**
113
+ * `player_knows_rune`. Unregistered returns false - honest, and the reason a
114
+ * mod that adds a variety must register this one: without it the rune can never
115
+ * read as learned, and `objectRunesKnown` will hold every object carrying it
116
+ * permanently un-assessed.
117
+ */
118
+ export type RuneKnowsHandler = (p: Player, rune: Rune) => boolean;
119
+
120
+ /** `object_has_rune`: whether this item carries it. Unregistered returns false. */
121
+ export type RuneObjectHasHandler = (
122
+ env: RuneEnv,
123
+ obj: GameObject,
124
+ rune: Rune,
125
+ ) => boolean;
126
+
127
+ /**
128
+ * `player_learn_rune`: learn it, optionally printing. Returns whether anything
129
+ * was newly learned - a second learn of the same rune must return false, which
130
+ * is what the vectors' `learnedAgain` column holds core to. Unregistered
131
+ * returns false.
132
+ */
133
+ export type RuneLearnHandler = (
134
+ p: Player,
135
+ env: RuneEnv,
136
+ rune: Rune,
137
+ message: boolean,
138
+ ) => boolean;
139
+
140
+ /**
141
+ * `rune_name` (obj-knowledge.c:325): the variety's display decoration.
142
+ * Unregistered returns the bare `rune.name`, which is upstream's own `default`
143
+ * arm rather than a hole - only four of the seven varieties decorate at all.
144
+ */
145
+ export type RuneNameHandler = (rune: Rune) => string;
146
+
147
+ /**
148
+ * `mod_message` (obj-knowledge.c L1492): the line printed on noticing a
149
+ * modifier, given its signed value. Returns null for "say nothing", which is
150
+ * both upstream's `default` and what a zero value produces on an arm that has
151
+ * one. Keyed on the OBJ_MOD index.
152
+ */
153
+ export type ModMessageHandler = (value: number) => string | null;
154
+
155
+ /**
156
+ * A source of extra runes for `buildRuneList` (`init_rune`). Runs after core
157
+ * has built its own list, in registration order, and appends.
158
+ *
159
+ * Contributing is what makes the six tables above reachable: nothing in core
160
+ * ever asks about a rune that is not in this list.
161
+ */
162
+ export type RuneContributor = (env: RuneEnv) => readonly Rune[];
163
+
164
+ /* ------------------------------------------------------------------ *
165
+ * The tables.
166
+ * ------------------------------------------------------------------ */
167
+
168
+ /**
169
+ * One keyed table. The same shape as `TvalTable` and for the same reason: six
170
+ * hand-copied blocks would be six places for a capability check to go missing.
171
+ */
172
+ export class RuneTable<K, H> {
173
+ private readonly table = new Map<K, H>();
174
+
175
+ /** Install (or replace) the handler for one key. */
176
+ set(key: K, handler: H): void {
177
+ this.table.set(key, handler);
178
+ }
179
+
180
+ /**
181
+ * The handler installed right now, or null. This is what a mod calls to WRAP
182
+ * core rather than shadow it - keep what is returned, install its own, call
183
+ * through.
184
+ */
185
+ handlerFor(key: K): H | null {
186
+ return this.table.get(key) ?? null;
187
+ }
188
+
189
+ /** Whether anything handles this key. */
190
+ has(key: K): boolean {
191
+ return this.table.has(key);
192
+ }
193
+
194
+ /** Every key handled, in registration order (core's first). */
195
+ keys(): readonly K[] {
196
+ return [...this.table.keys()];
197
+ }
198
+ }
199
+
200
+ /** Everything core asks about a rune, in six tables plus one producer. */
201
+ export class RuneRegistry {
202
+ /** `rune_desc`, keyed on variety. */
203
+ readonly desc = new RuneTable<RuneVariety, RuneDescHandler>();
204
+ /** `player_knows_rune`, keyed on variety. */
205
+ readonly knows = new RuneTable<RuneVariety, RuneKnowsHandler>();
206
+ /** `object_has_rune`, keyed on variety. */
207
+ readonly objectHas = new RuneTable<RuneVariety, RuneObjectHasHandler>();
208
+ /** `player_learn_rune`, keyed on variety. */
209
+ readonly learn = new RuneTable<RuneVariety, RuneLearnHandler>();
210
+ /** `rune_name`'s decoration, keyed on variety. Absent means the bare name. */
211
+ readonly name = new RuneTable<RuneVariety, RuneNameHandler>();
212
+ /** `mod_message`, keyed on the OBJ_MOD index. */
213
+ readonly modMessage = new RuneTable<number, ModMessageHandler>();
214
+
215
+ /** Extra runes for `buildRuneList`, in registration order. */
216
+ private readonly contributors: RuneContributor[] = [];
217
+
218
+ /** Add a source of runes to the list every consumer enumerates. */
219
+ contribute(source: RuneContributor): void {
220
+ this.contributors.push(source);
221
+ }
222
+
223
+ /** Every contributed rune, in registration order. Core's list comes first. */
224
+ contributed(env: RuneEnv): Rune[] {
225
+ const out: Rune[] = [];
226
+ for (const source of this.contributors) out.push(...source(env));
227
+ return out;
228
+ }
229
+
230
+ /** How many contributors are installed (for tests and the conflict report). */
231
+ contributorCount(): number {
232
+ return this.contributors.length;
233
+ }
234
+ }
235
+
236
+ /* ------------------------------------------------------------------ *
237
+ * The live registry.
238
+ * ------------------------------------------------------------------ */
239
+
240
+ /**
241
+ * Core's own seeders. `knowledge.ts` both OWNS these tables and is the only
242
+ * module that reads them, so "the module is loaded" and "core's arms are
243
+ * installed" cannot come apart - a seeder somebody has to remember to call is
244
+ * one that gets forgotten on a path, and the failure here would be silent and
245
+ * total: no rune knowable, nothing learnable, every object permanently
246
+ * un-assessed.
247
+ */
248
+ const seeders: Array<(reg: RuneRegistry) => void> = [];
249
+
250
+ let live = new RuneRegistry();
251
+
252
+ /** Install a set of core arms, now and on every reset. A MOD never calls this. */
253
+ export function seedRune(seed: (reg: RuneRegistry) => void): void {
254
+ seeders.push(seed);
255
+ seed(live);
256
+ }
257
+
258
+ /** The live registry. Module-level; see this file's header for why that is safe. */
259
+ export function runeRegistry(): RuneRegistry {
260
+ return live;
261
+ }
262
+
263
+ /**
264
+ * Back to core's arms alone, dropping every mod registration - the same state a
265
+ * reload produces, without a fresh realm. No production caller by design.
266
+ */
267
+ export function resetRuneRegistry(): void {
268
+ live = new RuneRegistry();
269
+ for (const seed of seeders) seed(live);
270
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * The world the rune vectors are recorded against, built from the real shipped
3
+ * content pack.
4
+ *
5
+ * SEPARATE FILE, and it reads the disk: keeping `node:fs` out of
6
+ * `rune-vectors.ts` means the row producer stays importable from anywhere. ONE
7
+ * copy, shared by `rune-vectors.test.ts` and by `scripts/gen-rune-vectors.mjs`,
8
+ * so the test and the generator cannot disagree about what they are measuring.
9
+ *
10
+ * THE REAL PACK rather than synthetic tables, on purpose. `buildRuneList`
11
+ * de-duplicates brands by name and slays by same-monsters group, and skips five
12
+ * flag subtypes - a hand-built table would be an assertion about what the pack
13
+ * producer emits, and an unchecked one. `elementNames` is derived the way
14
+ * `session/game.ts:741` derives it (projections, sliced to ELEM_MAX), not
15
+ * hand-listed: two nearby test fixtures hard-code four element names, which is
16
+ * enough for a targeted test and would silently shorten this grid by ten.
17
+ */
18
+
19
+ import { readFileSync } from "node:fs";
20
+
21
+ import { ELEM_MAX } from "./types.js";
22
+ import { ObjRegistry } from "./bind.js";
23
+ import { bindPlayer } from "../player/bind.js";
24
+ import { blankPlayer } from "../player/player.js";
25
+ import { makeRuneEnv } from "./knowledge.js";
26
+ import { bindConstants } from "../constants.js";
27
+ import { objectNew } from "./object.js";
28
+ import { objectPrep } from "./make.js";
29
+ import { Rng } from "../rng.js";
30
+ import type { ObjectKind, ObjPackJson } from "./types.js";
31
+ import type { Player } from "../player/player.js";
32
+ import type { GameObject } from "./object.js";
33
+ import type { RuneEnv } from "./knowledge.js";
34
+
35
+ function loadJson<T>(name: string): T {
36
+ return JSON.parse(
37
+ readFileSync(
38
+ new URL(`../../../content/pack/${name}.json`, import.meta.url),
39
+ "utf8",
40
+ ),
41
+ ) as T;
42
+ }
43
+
44
+ function loadRecords<T>(name: string): T[] {
45
+ return loadJson<{ records: T[] }>(name).records;
46
+ }
47
+
48
+ /** Everything one rune vector run needs. */
49
+ export interface RuneVectorWorld {
50
+ /** A fresh player with empty rune knowledge, marked as playing. */
51
+ player(): Player;
52
+ /** The env every rune call is made against; `msg` pushes into `messages`. */
53
+ env: RuneEnv;
54
+ /** Messages emitted since the last `drain()`. */
55
+ drain(): string[];
56
+ /** A freshly prepared object of the first ordinary kind of a given tval. */
57
+ object(tval: number): GameObject;
58
+ /** object_new: the same kind, zeroed, carrying nothing of its own. */
59
+ blankObject(tval: number): GameObject;
60
+ }
61
+
62
+ /**
63
+ * Build the fixture world. The registry binds every object table plus the
64
+ * projections `elementNames` is derived from; nothing here needs an RNG stream,
65
+ * so the one `Rng` exists only because `makeRuneEnv` wants a `randcalcVaries`
66
+ * and is seeded fixed.
67
+ */
68
+ export function runeVectorWorld(): RuneVectorWorld & { reg: ObjRegistry } {
69
+ const reg = new ObjRegistry({
70
+ objectBase: loadJson("object_base"),
71
+ object: loadJson("object"),
72
+ egoItem: loadJson("ego_item"),
73
+ artifact: loadJson("artifact"),
74
+ curse: loadJson("curse"),
75
+ brand: loadJson("brand"),
76
+ slay: loadJson("slay"),
77
+ activation: loadJson("activation"),
78
+ objectProperty: loadJson("object_property"),
79
+ flavor: loadJson("flavor"),
80
+ } as ObjPackJson);
81
+
82
+ const players = bindPlayer({
83
+ races: loadRecords("p_race"),
84
+ classes: loadRecords("class"),
85
+ properties: loadRecords("player_property"),
86
+ timed: loadRecords("player_timed"),
87
+ shapes: loadRecords("shape"),
88
+ bodies: loadRecords("body"),
89
+ history: loadRecords("history"),
90
+ realms: loadRecords("realm"),
91
+ });
92
+
93
+ /* session/game.ts:741 - projections sliced to ELEM_MAX, by name. */
94
+ const elementNames = loadRecords<{ name: string }>("projection")
95
+ .slice(0, ELEM_MAX)
96
+ .map((p) => p.name);
97
+
98
+ const constants = bindConstants(loadJson("constants"));
99
+ const messages: string[] = [];
100
+ const rng = new Rng(7);
101
+ const equipment: (GameObject | null)[] = [];
102
+
103
+ const env = makeRuneEnv(
104
+ (slot) => equipment[slot] ?? null,
105
+ (v) => rng.randcalcVaries(v),
106
+ {
107
+ brands: reg.brands,
108
+ slays: reg.slays,
109
+ curses: reg.curses,
110
+ properties: reg.properties,
111
+ elementNames,
112
+ msg: (t) => messages.push(t),
113
+ },
114
+ );
115
+
116
+ const race = players.raceByName("Human")!;
117
+ const cls = players.classByName("Warrior")!;
118
+ const body = players.bodies[race.body]!;
119
+
120
+ return {
121
+ reg,
122
+ env,
123
+ player(): Player {
124
+ const p = blankPlayer(race, cls, body);
125
+ /* modMessage is guarded by upkeep.playing (knowledge.ts:646): a wield
126
+ * during birth or level-feeling prints nothing. Recording with it off
127
+ * would produce a grid of empty message lists that could not disagree
128
+ * with a broken dispatch table. */
129
+ p.upkeep.playing = true;
130
+ return p;
131
+ },
132
+ drain(): string[] {
133
+ const out = [...messages];
134
+ messages.length = 0;
135
+ return out;
136
+ },
137
+ object(tval: number): GameObject {
138
+ /* object_prep, not object_new: object_new is a zeroed allocation whose
139
+ * tval is still 0, and the point of asking `objectHasRune` about a REAL
140
+ * item is that the item's own fields are filled in. The "maximise" aspect
141
+ * draws no entropy (randcalc takes the bound rather than a roll), so the
142
+ * grid stays RNG-free. */
143
+ return objectPrep(rng, reg, constants, kindOf(tval), 0, "maximise");
144
+ },
145
+ blankObject(tval: number): GameObject {
146
+ /* object_new, and the modifier-message rows need exactly this. A prepared
147
+ * ring of the first ordinary sval is a Ring of STRENGTH: it carries +STR
148
+ * and SUST_STR of its own, so wielding it learns those too and every one
149
+ * of the sixteen rows would carry the same four-line prefix. Four lines of
150
+ * constant noise in a six-line row is a grid that mostly measures the
151
+ * fixture. A zeroed object has exactly one modifier set - the one under
152
+ * test. */
153
+ return objectNew(kindOf(tval));
154
+ },
155
+ };
156
+
157
+ function kindOf(tval: number): ObjectKind {
158
+ const kind = reg.kinds.find(
159
+ (k) => k.tval === tval && k.kidx < reg.ordinaryKindCount,
160
+ );
161
+ if (!kind) throw new Error(`no ordinary kind for tval ${tval}`);
162
+ return kind;
163
+ }
164
+ }
@@ -0,0 +1,121 @@
1
+ {
2
+ "runes": [
3
+ {"key":"combat:enchantment to armor","variety":"combat","index":0,"name":"enchantment to armor","display":"enchantment to armor","desc":"Object magically increases the player's armor class","knowsBefore":true,"learned":false,"messages":[],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
4
+ {"key":"combat:enchantment to hit","variety":"combat","index":1,"name":"enchantment to hit","display":"enchantment to hit","desc":"Object magically increases the player's chance to hit","knowsBefore":true,"learned":false,"messages":[],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
5
+ {"key":"combat:enchantment to damage","variety":"combat","index":2,"name":"enchantment to damage","display":"enchantment to damage","desc":"Object magically increases the player's damage","knowsBefore":true,"learned":false,"messages":[],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
6
+ {"key":"mod:strength","variety":"mod","index":0,"name":"strength","display":"strength","desc":"Object gives the player a magical bonus to strength.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of strength."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":true},
7
+ {"key":"mod:intelligence","variety":"mod","index":1,"name":"intelligence","display":"intelligence","desc":"Object gives the player a magical bonus to intelligence.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of intelligence."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
8
+ {"key":"mod:wisdom","variety":"mod","index":2,"name":"wisdom","display":"wisdom","desc":"Object gives the player a magical bonus to wisdom.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of wisdom."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
9
+ {"key":"mod:dexterity","variety":"mod","index":3,"name":"dexterity","display":"dexterity","desc":"Object gives the player a magical bonus to dexterity.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of dexterity."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
10
+ {"key":"mod:constitution","variety":"mod","index":4,"name":"constitution","display":"constitution","desc":"Object gives the player a magical bonus to constitution.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of constitution."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
11
+ {"key":"mod:stealth","variety":"mod","index":5,"name":"stealth","display":"stealth","desc":"Object gives the player a magical bonus to stealth.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of stealth."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
12
+ {"key":"mod:searching skill","variety":"mod","index":6,"name":"searching skill","display":"searching skill","desc":"Object gives the player a magical bonus to searching skill.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of searching skill."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
13
+ {"key":"mod:infravision","variety":"mod","index":7,"name":"infravision","display":"infravision","desc":"Object gives the player a magical bonus to infravision.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of infravision."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
14
+ {"key":"mod:tunneling","variety":"mod","index":8,"name":"tunneling","display":"tunneling","desc":"Object gives the player a magical bonus to tunneling.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of tunneling."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
15
+ {"key":"mod:speed","variety":"mod","index":9,"name":"speed","display":"speed","desc":"Object gives the player a magical bonus to speed.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of speed."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
16
+ {"key":"mod:extra blows","variety":"mod","index":10,"name":"extra blows","display":"extra blows","desc":"Object gives the player a magical bonus to extra blows.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of extra blows."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
17
+ {"key":"mod:shooting speed","variety":"mod","index":11,"name":"shooting speed","display":"shooting speed","desc":"Object gives the player a magical bonus to shooting speed.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of shooting speed."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
18
+ {"key":"mod:shooting power","variety":"mod","index":12,"name":"shooting power","display":"shooting power","desc":"Object gives the player a magical bonus to shooting power.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of shooting power."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
19
+ {"key":"mod:light","variety":"mod","index":13,"name":"light","display":"light","desc":"Object gives the player a magical bonus to light.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of light."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
20
+ {"key":"mod:damage reduction","variety":"mod","index":14,"name":"damage reduction","display":"damage reduction","desc":"Object gives the player a magical bonus to damage reduction.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of damage reduction."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
21
+ {"key":"mod:extra moves","variety":"mod","index":15,"name":"extra moves","display":"extra moves","desc":"Object gives the player a magical bonus to extra moves.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of extra moves."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
22
+ {"key":"resist:acid","variety":"resist","index":0,"name":"acid","display":"resist acid","desc":"Object affects the player's resistance to acid.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of acid."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
23
+ {"key":"resist:lightning","variety":"resist","index":1,"name":"lightning","display":"resist lightning","desc":"Object affects the player's resistance to lightning.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of lightning."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
24
+ {"key":"resist:fire","variety":"resist","index":2,"name":"fire","display":"resist fire","desc":"Object affects the player's resistance to fire.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of fire."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
25
+ {"key":"resist:cold","variety":"resist","index":3,"name":"cold","display":"resist cold","desc":"Object affects the player's resistance to cold.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of cold."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
26
+ {"key":"resist:poison","variety":"resist","index":4,"name":"poison","display":"resist poison","desc":"Object affects the player's resistance to poison.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of poison."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
27
+ {"key":"resist:light","variety":"resist","index":5,"name":"light","display":"resist light","desc":"Object affects the player's resistance to light.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of light."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
28
+ {"key":"resist:dark","variety":"resist","index":6,"name":"dark","display":"resist dark","desc":"Object affects the player's resistance to dark.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of dark."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
29
+ {"key":"resist:sound","variety":"resist","index":7,"name":"sound","display":"resist sound","desc":"Object affects the player's resistance to sound.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of sound."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
30
+ {"key":"resist:shards","variety":"resist","index":8,"name":"shards","display":"resist shards","desc":"Object affects the player's resistance to shards.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of shards."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
31
+ {"key":"resist:nexus","variety":"resist","index":9,"name":"nexus","display":"resist nexus","desc":"Object affects the player's resistance to nexus.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of nexus."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
32
+ {"key":"resist:nether","variety":"resist","index":10,"name":"nether","display":"resist nether","desc":"Object affects the player's resistance to nether.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of nether."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
33
+ {"key":"resist:chaos","variety":"resist","index":11,"name":"chaos","display":"resist chaos","desc":"Object affects the player's resistance to chaos.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of chaos."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
34
+ {"key":"resist:disenchantment","variety":"resist","index":12,"name":"disenchantment","display":"resist disenchantment","desc":"Object affects the player's resistance to disenchantment.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of disenchantment."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
35
+ {"key":"brand:poison","variety":"brand","index":1,"name":"poison","display":"poison brand","desc":"Object brands the player's attacks with poison.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of poison."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
36
+ {"key":"brand:cold","variety":"brand","index":2,"name":"cold","display":"cold brand","desc":"Object brands the player's attacks with cold.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of cold."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
37
+ {"key":"brand:fire","variety":"brand","index":3,"name":"fire","display":"fire brand","desc":"Object brands the player's attacks with fire.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of fire."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
38
+ {"key":"brand:lightning","variety":"brand","index":4,"name":"lightning","display":"lightning brand","desc":"Object brands the player's attacks with lightning.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of lightning."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
39
+ {"key":"brand:acid","variety":"brand","index":5,"name":"acid","display":"acid brand","desc":"Object brands the player's attacks with acid.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of acid."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
40
+ {"key":"slay:undead","variety":"slay","index":1,"name":"undead","display":"slay undead","desc":"Object makes the player's attacks against undead more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of undead."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
41
+ {"key":"slay:dragons","variety":"slay","index":2,"name":"dragons","display":"slay dragons","desc":"Object makes the player's attacks against dragons more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of dragons."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
42
+ {"key":"slay:demons","variety":"slay","index":3,"name":"demons","display":"slay demons","desc":"Object makes the player's attacks against demons more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of demons."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
43
+ {"key":"slay:giants","variety":"slay","index":7,"name":"giants","display":"slay giants","desc":"Object makes the player's attacks against giants more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of giants."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
44
+ {"key":"slay:trolls","variety":"slay","index":8,"name":"trolls","display":"slay trolls","desc":"Object makes the player's attacks against trolls more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of trolls."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
45
+ {"key":"slay:orcs","variety":"slay","index":9,"name":"orcs","display":"slay orcs","desc":"Object makes the player's attacks against orcs more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of orcs."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
46
+ {"key":"slay:animals","variety":"slay","index":10,"name":"animals","display":"slay animals","desc":"Object makes the player's attacks against animals more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of animals."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
47
+ {"key":"slay:evil creatures","variety":"slay","index":11,"name":"evil creatures","display":"slay evil creatures","desc":"Object makes the player's attacks against evil creatures more powerful.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of evil creatures."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
48
+ {"key":"curse:air swing","variety":"curse","index":1,"name":"air swing","display":"air swing curse","desc":"Object makes it hard to hit anything.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of air swing."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
49
+ {"key":"curse:steelskin","variety":"curse","index":2,"name":"steelskin","display":"steelskin curse","desc":"Object makes your skin harder to damage, but conduct electricity.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of steelskin."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
50
+ {"key":"curse:chilled to the bone","variety":"curse","index":3,"name":"chilled to the bone","display":"chilled to the bone curse","desc":"Object makes you vulnerable to cold attacks, but resistant to fire.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of chilled to the bone."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
51
+ {"key":"curse:burning up","variety":"curse","index":4,"name":"burning up","display":"burning up curse","desc":"Object makes you vulnerable to fire attacks, but resistant to cold.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of burning up."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
52
+ {"key":"curse:treacherous weapon","variety":"curse","index":5,"name":"treacherous weapon","display":"treacherous weapon curse","desc":"Object makes your weapon attack you.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of treacherous weapon."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
53
+ {"key":"curse:anti-teleportation","variety":"curse","index":6,"name":"anti-teleportation","display":"anti-teleportation curse","desc":"Object prevents you from teleporting.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of anti-teleportation."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
54
+ {"key":"curse:stone","variety":"curse","index":7,"name":"stone","display":"stone curse","desc":"Object periodically turns your skin to stone.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of stone."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
55
+ {"key":"curse:cowardice","variety":"curse","index":8,"name":"cowardice","display":"cowardice curse","desc":"Object makes you too scared to fight.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of cowardice."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
56
+ {"key":"curse:impair hitpoint recovery","variety":"curse","index":9,"name":"impair hitpoint recovery","display":"impair hitpoint recovery curse","desc":"Object makes you slow to recover hitpoints.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of impair hitpoint recovery."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
57
+ {"key":"curse:impair mana recovery","variety":"curse","index":10,"name":"impair mana recovery","display":"impair mana recovery curse","desc":"Object makes you slow to recover mana.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of impair mana recovery."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
58
+ {"key":"curse:undead summon","variety":"curse","index":11,"name":"undead summon","display":"undead summon curse","desc":"Object occasionally summons an undead.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of undead summon."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
59
+ {"key":"curse:demon summon","variety":"curse","index":12,"name":"demon summon","display":"demon summon curse","desc":"Object occasionally summons a demon.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of demon summon."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
60
+ {"key":"curse:dragon summon","variety":"curse","index":13,"name":"dragon summon","display":"dragon summon curse","desc":"Object sometimes summons a dragon.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of dragon summon."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
61
+ {"key":"curse:paralysis","variety":"curse","index":14,"name":"paralysis","display":"paralysis curse","desc":"Object paralyses you every now and then.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of paralysis."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
62
+ {"key":"curse:hallucination","variety":"curse","index":15,"name":"hallucination","display":"hallucination curse","desc":"Object makes you hallucinate sometimes.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of hallucination."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
63
+ {"key":"curse:siren","variety":"curse","index":16,"name":"siren","display":"siren curse","desc":"Object occasionally makes a loud noise.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of siren."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
64
+ {"key":"curse:poison","variety":"curse","index":17,"name":"poison","display":"poison curse","desc":"Object poisons you from time to time.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of poison."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
65
+ {"key":"curse:annoyance","variety":"curse","index":18,"name":"annoyance","display":"annoyance curse","desc":"Object wakes up and annoys nearby monsters, and delays your escape.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of annoyance."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
66
+ {"key":"curse:slowness","variety":"curse","index":19,"name":"slowness","display":"slowness curse","desc":"Object drags at your feet.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of slowness."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
67
+ {"key":"curse:clumsiness","variety":"curse","index":20,"name":"clumsiness","display":"clumsiness curse","desc":"Object gives you butterfingers.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of clumsiness."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
68
+ {"key":"curse:weakness","variety":"curse","index":21,"name":"weakness","display":"weakness curse","desc":"Object weakens your grasp.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of weakness."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
69
+ {"key":"curse:irritation","variety":"curse","index":22,"name":"irritation","display":"irritation curse","desc":"Object annoys monsters and makes it hard for you to hit them.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of irritation."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
70
+ {"key":"curse:enveloping","variety":"curse","index":23,"name":"enveloping","display":"enveloping curse","desc":"Object protects you at the expense of free movement.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of enveloping."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
71
+ {"key":"curse:sickliness","variety":"curse","index":24,"name":"sickliness","display":"sickliness curse","desc":"Object makes you frail.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of sickliness."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
72
+ {"key":"curse:dullness","variety":"curse","index":25,"name":"dullness","display":"dullness curse","desc":"Object makes you mentally slow.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of dullness."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
73
+ {"key":"curse:teleportation","variety":"curse","index":26,"name":"teleportation","display":"teleportation curse","desc":"Object randomly makes you teleport.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of teleportation."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
74
+ {"key":"curse:vulnerability","variety":"curse","index":27,"name":"vulnerability","display":"vulnerability curse","desc":"Object attracts opponents and weakens the defences.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of vulnerability."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
75
+ {"key":"flag:sustain strength","variety":"flag","index":1,"name":"sustain strength","display":"sustain strength","desc":"Object gives the player the property of sustain strength.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of sustain strength."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":true},
76
+ {"key":"flag:sustain intelligence","variety":"flag","index":2,"name":"sustain intelligence","display":"sustain intelligence","desc":"Object gives the player the property of sustain intelligence.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of sustain intelligence."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
77
+ {"key":"flag:sustain wisdom","variety":"flag","index":3,"name":"sustain wisdom","display":"sustain wisdom","desc":"Object gives the player the property of sustain wisdom.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of sustain wisdom."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
78
+ {"key":"flag:sustain dexterity","variety":"flag","index":4,"name":"sustain dexterity","display":"sustain dexterity","desc":"Object gives the player the property of sustain dexterity.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of sustain dexterity."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
79
+ {"key":"flag:sustain constitution","variety":"flag","index":5,"name":"sustain constitution","display":"sustain constitution","desc":"Object gives the player the property of sustain constitution.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of sustain constitution."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
80
+ {"key":"flag:protection from fear","variety":"flag","index":6,"name":"protection from fear","display":"protection from fear","desc":"Object gives the player the property of protection from fear.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of protection from fear."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
81
+ {"key":"flag:protection from blindness","variety":"flag","index":7,"name":"protection from blindness","display":"protection from blindness","desc":"Object gives the player the property of protection from blindness.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of protection from blindness."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
82
+ {"key":"flag:protection from confusion","variety":"flag","index":8,"name":"protection from confusion","display":"protection from confusion","desc":"Object gives the player the property of protection from confusion.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of protection from confusion."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
83
+ {"key":"flag:protection from stunning","variety":"flag","index":9,"name":"protection from stunning","display":"protection from stunning","desc":"Object gives the player the property of protection from stunning.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of protection from stunning."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
84
+ {"key":"flag:slow digestion","variety":"flag","index":10,"name":"slow digestion","display":"slow digestion","desc":"Object gives the player the property of slow digestion.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of slow digestion."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
85
+ {"key":"flag:feather falling","variety":"flag","index":11,"name":"feather falling","display":"feather falling","desc":"Object gives the player the property of feather falling.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of feather falling."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
86
+ {"key":"flag:regeneration","variety":"flag","index":12,"name":"regeneration","display":"regeneration","desc":"Object gives the player the property of regeneration.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of regeneration."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
87
+ {"key":"flag:telepathy","variety":"flag","index":13,"name":"telepathy","display":"telepathy","desc":"Object gives the player the property of telepathy.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of telepathy."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
88
+ {"key":"flag:see invisible","variety":"flag","index":14,"name":"see invisible","display":"see invisible","desc":"Object gives the player the property of see invisible.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of see invisible."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
89
+ {"key":"flag:free action","variety":"flag","index":15,"name":"free action","display":"free action","desc":"Object gives the player the property of free action.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of free action."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
90
+ {"key":"flag:hold life","variety":"flag","index":16,"name":"hold life","display":"hold life","desc":"Object gives the player the property of hold life.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of hold life."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
91
+ {"key":"flag:earthquakes","variety":"flag","index":17,"name":"earthquakes","display":"earthquakes","desc":"Object gives the player the property of earthquakes.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of earthquakes."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
92
+ {"key":"flag:blessed melee","variety":"flag","index":18,"name":"blessed melee","display":"blessed melee","desc":"Object gives the player the property of blessed melee.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of blessed melee."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
93
+ {"key":"flag:impaired hitpoint recovery","variety":"flag","index":22,"name":"impaired hitpoint recovery","display":"impaired hitpoint recovery","desc":"Object gives the player the property of impaired hitpoint recovery.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of impaired hitpoint recovery."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
94
+ {"key":"flag:impaired mana recovery","variety":"flag","index":23,"name":"impaired mana recovery","display":"impaired mana recovery","desc":"Object gives the player the property of impaired mana recovery.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of impaired mana recovery."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
95
+ {"key":"flag:constant fear","variety":"flag","index":24,"name":"constant fear","display":"constant fear","desc":"Object gives the player the property of constant fear.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of constant fear."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
96
+ {"key":"flag:teleportation ban","variety":"flag","index":25,"name":"teleportation ban","display":"teleportation ban","desc":"Object gives the player the property of teleportation ban.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of teleportation ban."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
97
+ {"key":"flag:aggravation","variety":"flag","index":26,"name":"aggravation","display":"aggravation","desc":"Object gives the player the property of aggravation.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of aggravation."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
98
+ {"key":"flag:experience drain","variety":"flag","index":27,"name":"experience drain","display":"experience drain","desc":"Object gives the player the property of experience drain.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of experience drain."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
99
+ {"key":"flag:stuck on","variety":"flag","index":28,"name":"stuck on","display":"stuck on","desc":"Object gives the player the property of stuck on.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of stuck on."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
100
+ {"key":"flag:fragile","variety":"flag","index":29,"name":"fragile","display":"fragile","desc":"Object gives the player the property of fragile.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of fragile."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false},
101
+ {"key":"flag:trap immunity","variety":"flag","index":36,"name":"trap immunity","display":"trap immunity","desc":"Object gives the player the property of trap immunity.","knowsBefore":false,"learned":true,"messages":["You have learned the rune of trap immunity."],"knowsAfter":true,"learnedAgain":false,"hasOnLoaded":true,"hasOnBare":false}
102
+ ],
103
+ "modMessages": [
104
+ {"mod":0,"name":"strength","positive":["You have learned the rune of strength.","You feel stronger!"],"negative":["You have learned the rune of strength.","You feel weaker!"]},
105
+ {"mod":1,"name":"intelligence","positive":["You have learned the rune of intelligence.","You feel smarter!"],"negative":["You have learned the rune of intelligence.","You feel more stupid!"]},
106
+ {"mod":2,"name":"wisdom","positive":["You have learned the rune of wisdom.","You feel wiser!"],"negative":["You have learned the rune of wisdom.","You feel more naive!"]},
107
+ {"mod":3,"name":"dexterity","positive":["You have learned the rune of dexterity.","You feel more dextrous!"],"negative":["You have learned the rune of dexterity.","You feel clumsier!"]},
108
+ {"mod":4,"name":"constitution","positive":["You have learned the rune of constitution.","You feel healthier!"],"negative":["You have learned the rune of constitution.","You feel sicklier!"]},
109
+ {"mod":5,"name":"stealth","positive":["You have learned the rune of stealth.","You feel stealthier."],"negative":["You have learned the rune of stealth.","You feel noisier."]},
110
+ {"mod":6,"name":"searching skill","positive":["You have learned the rune of searching skill."],"negative":["You have learned the rune of searching skill."]},
111
+ {"mod":7,"name":"infravision","positive":["You have learned the rune of infravision.","Your eyes tingle."],"negative":["You have learned the rune of infravision.","Your eyes tingle."]},
112
+ {"mod":8,"name":"tunneling","positive":["You have learned the rune of tunneling."],"negative":["You have learned the rune of tunneling."]},
113
+ {"mod":9,"name":"speed","positive":["You have learned the rune of speed.","You feel strangely quick."],"negative":["You have learned the rune of speed.","You feel strangely sluggish."]},
114
+ {"mod":10,"name":"extra blows","positive":["You have learned the rune of extra blows.","Your weapon tingles in your hands."],"negative":["You have learned the rune of extra blows.","Your weapon aches in your hands."]},
115
+ {"mod":11,"name":"shooting speed","positive":["You have learned the rune of shooting speed.","Your missile weapon tingles in your hands."],"negative":["You have learned the rune of shooting speed.","Your missile weapon aches in your hands."]},
116
+ {"mod":12,"name":"shooting power","positive":["You have learned the rune of shooting power."],"negative":["You have learned the rune of shooting power."]},
117
+ {"mod":13,"name":"light","positive":["You have learned the rune of light.","It glows!"],"negative":["You have learned the rune of light.","It glows!"]},
118
+ {"mod":14,"name":"damage reduction","positive":["You have learned the rune of damage reduction."],"negative":["You have learned the rune of damage reduction."]},
119
+ {"mod":15,"name":"extra moves","positive":["You have learned the rune of extra moves."],"negative":["You have learned the rune of extra moves."]}
120
+ ]
121
+ }