@rpgm-tools/neo-angband-core 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1183) hide show
  1. package/LICENSE.md +43 -0
  2. package/README.md +80 -0
  3. package/dist/agent/act.d.ts +22 -0
  4. package/dist/agent/act.d.ts.map +1 -0
  5. package/dist/agent/act.js +88 -0
  6. package/dist/agent/act.js.map +1 -0
  7. package/dist/agent/controller.d.ts +34 -0
  8. package/dist/agent/controller.d.ts.map +1 -0
  9. package/dist/agent/controller.js +90 -0
  10. package/dist/agent/controller.js.map +1 -0
  11. package/dist/agent/events.d.ts +27 -0
  12. package/dist/agent/events.d.ts.map +1 -0
  13. package/dist/agent/events.js +31 -0
  14. package/dist/agent/events.js.map +1 -0
  15. package/dist/agent/index.d.ts +17 -0
  16. package/dist/agent/index.d.ts.map +1 -0
  17. package/dist/agent/index.js +15 -0
  18. package/dist/agent/index.js.map +1 -0
  19. package/dist/agent/perceive.d.ts +21 -0
  20. package/dist/agent/perceive.d.ts.map +1 -0
  21. package/dist/agent/perceive.js +386 -0
  22. package/dist/agent/perceive.js.map +1 -0
  23. package/dist/agent/types.d.ts +436 -0
  24. package/dist/agent/types.d.ts.map +1 -0
  25. package/dist/agent/types.js +63 -0
  26. package/dist/agent/types.js.map +1 -0
  27. package/dist/bitflag.d.ts +199 -0
  28. package/dist/bitflag.d.ts.map +1 -0
  29. package/dist/bitflag.js +478 -0
  30. package/dist/bitflag.js.map +1 -0
  31. package/dist/cmd.d.ts +164 -0
  32. package/dist/cmd.d.ts.map +1 -0
  33. package/dist/cmd.js +350 -0
  34. package/dist/cmd.js.map +1 -0
  35. package/dist/color.d.ts +104 -0
  36. package/dist/color.d.ts.map +1 -0
  37. package/dist/color.js +240 -0
  38. package/dist/color.js.map +1 -0
  39. package/dist/combat/brand-slay.d.ts +119 -0
  40. package/dist/combat/brand-slay.d.ts.map +1 -0
  41. package/dist/combat/brand-slay.js +264 -0
  42. package/dist/combat/brand-slay.js.map +1 -0
  43. package/dist/combat/hit.d.ts +198 -0
  44. package/dist/combat/hit.d.ts.map +1 -0
  45. package/dist/combat/hit.js +310 -0
  46. package/dist/combat/hit.js.map +1 -0
  47. package/dist/combat/index.d.ts +15 -0
  48. package/dist/combat/index.d.ts.map +1 -0
  49. package/dist/combat/index.js +15 -0
  50. package/dist/combat/index.js.map +1 -0
  51. package/dist/combat/melee.d.ts +261 -0
  52. package/dist/combat/melee.d.ts.map +1 -0
  53. package/dist/combat/melee.js +402 -0
  54. package/dist/combat/melee.js.map +1 -0
  55. package/dist/combat/mon-melee.d.ts +233 -0
  56. package/dist/combat/mon-melee.d.ts.map +1 -0
  57. package/dist/combat/mon-melee.js +883 -0
  58. package/dist/combat/mon-melee.js.map +1 -0
  59. package/dist/combat/ranged.d.ts +89 -0
  60. package/dist/combat/ranged.d.ts.map +1 -0
  61. package/dist/combat/ranged.js +253 -0
  62. package/dist/combat/ranged.js.map +1 -0
  63. package/dist/constants.d.ts +134 -0
  64. package/dist/constants.d.ts.map +1 -0
  65. package/dist/constants.js +171 -0
  66. package/dist/constants.js.map +1 -0
  67. package/dist/dice.d.ts +91 -0
  68. package/dist/dice.d.ts.map +1 -0
  69. package/dist/dice.js +424 -0
  70. package/dist/dice.js.map +1 -0
  71. package/dist/effects/effect-choice.d.ts +15 -0
  72. package/dist/effects/effect-choice.d.ts.map +1 -0
  73. package/dist/effects/effect-choice.js +18 -0
  74. package/dist/effects/effect-choice.js.map +1 -0
  75. package/dist/effects/effect-info.d.ts +124 -0
  76. package/dist/effects/effect-info.d.ts.map +1 -0
  77. package/dist/effects/effect-info.js +706 -0
  78. package/dist/effects/effect-info.js.map +1 -0
  79. package/dist/effects/effect.d.ts +165 -0
  80. package/dist/effects/effect.d.ts.map +1 -0
  81. package/dist/effects/effect.js +452 -0
  82. package/dist/effects/effect.js.map +1 -0
  83. package/dist/effects/handlers.d.ts +70 -0
  84. package/dist/effects/handlers.d.ts.map +1 -0
  85. package/dist/effects/handlers.js +394 -0
  86. package/dist/effects/handlers.js.map +1 -0
  87. package/dist/effects/interpreter.d.ts +291 -0
  88. package/dist/effects/interpreter.d.ts.map +1 -0
  89. package/dist/effects/interpreter.js +325 -0
  90. package/dist/effects/interpreter.js.map +1 -0
  91. package/dist/events.d.ts +188 -0
  92. package/dist/events.d.ts.map +1 -0
  93. package/dist/events.js +138 -0
  94. package/dist/events.js.map +1 -0
  95. package/dist/expression.d.ts +83 -0
  96. package/dist/expression.d.ts.map +1 -0
  97. package/dist/expression.js +333 -0
  98. package/dist/expression.js.map +1 -0
  99. package/dist/game/cave-cmd.d.ts +195 -0
  100. package/dist/game/cave-cmd.d.ts.map +1 -0
  101. package/dist/game/cave-cmd.js +968 -0
  102. package/dist/game/cave-cmd.js.map +1 -0
  103. package/dist/game/char-sheet.d.ts +189 -0
  104. package/dist/game/char-sheet.d.ts.map +1 -0
  105. package/dist/game/char-sheet.js +381 -0
  106. package/dist/game/char-sheet.js.map +1 -0
  107. package/dist/game/chest.d.ts +94 -0
  108. package/dist/game/chest.d.ts.map +1 -0
  109. package/dist/game/chest.js +267 -0
  110. package/dist/game/chest.js.map +1 -0
  111. package/dist/game/context.d.ts +970 -0
  112. package/dist/game/context.d.ts.map +1 -0
  113. package/dist/game/context.js +353 -0
  114. package/dist/game/context.js.map +1 -0
  115. package/dist/game/curse-tick.d.ts +35 -0
  116. package/dist/game/curse-tick.d.ts.map +1 -0
  117. package/dist/game/curse-tick.js +100 -0
  118. package/dist/game/curse-tick.js.map +1 -0
  119. package/dist/game/describe.d.ts +20 -0
  120. package/dist/game/describe.d.ts.map +1 -0
  121. package/dist/game/describe.js +45 -0
  122. package/dist/game/describe.js.map +1 -0
  123. package/dist/game/display.d.ts +196 -0
  124. package/dist/game/display.d.ts.map +1 -0
  125. package/dist/game/display.js +684 -0
  126. package/dist/game/display.js.map +1 -0
  127. package/dist/game/dump-level.d.ts +37 -0
  128. package/dist/game/dump-level.d.ts.map +1 -0
  129. package/dist/game/dump-level.js +110 -0
  130. package/dist/game/dump-level.js.map +1 -0
  131. package/dist/game/effect-attack.d.ts +36 -0
  132. package/dist/game/effect-attack.d.ts.map +1 -0
  133. package/dist/game/effect-attack.js +694 -0
  134. package/dist/game/effect-attack.js.map +1 -0
  135. package/dist/game/effect-detect.d.ts +34 -0
  136. package/dist/game/effect-detect.d.ts.map +1 -0
  137. package/dist/game/effect-detect.js +456 -0
  138. package/dist/game/effect-detect.js.map +1 -0
  139. package/dist/game/effect-env.d.ts +77 -0
  140. package/dist/game/effect-env.d.ts.map +1 -0
  141. package/dist/game/effect-env.js +166 -0
  142. package/dist/game/effect-env.js.map +1 -0
  143. package/dist/game/effect-game-env.d.ts +76 -0
  144. package/dist/game/effect-game-env.d.ts.map +1 -0
  145. package/dist/game/effect-game-env.js +23 -0
  146. package/dist/game/effect-game-env.js.map +1 -0
  147. package/dist/game/effect-general.d.ts +98 -0
  148. package/dist/game/effect-general.d.ts.map +1 -0
  149. package/dist/game/effect-general.js +914 -0
  150. package/dist/game/effect-general.js.map +1 -0
  151. package/dist/game/effect-item.d.ts +124 -0
  152. package/dist/game/effect-item.d.ts.map +1 -0
  153. package/dist/game/effect-item.js +789 -0
  154. package/dist/game/effect-item.js.map +1 -0
  155. package/dist/game/effect-melee.d.ts +43 -0
  156. package/dist/game/effect-melee.d.ts.map +1 -0
  157. package/dist/game/effect-melee.js +477 -0
  158. package/dist/game/effect-melee.js.map +1 -0
  159. package/dist/game/effect-mon-origin.d.ts +67 -0
  160. package/dist/game/effect-mon-origin.d.ts.map +1 -0
  161. package/dist/game/effect-mon-origin.js +164 -0
  162. package/dist/game/effect-mon-origin.js.map +1 -0
  163. package/dist/game/effect-monster.d.ts +29 -0
  164. package/dist/game/effect-monster.d.ts.map +1 -0
  165. package/dist/game/effect-monster.js +281 -0
  166. package/dist/game/effect-monster.js.map +1 -0
  167. package/dist/game/effect-summon.d.ts +37 -0
  168. package/dist/game/effect-summon.d.ts.map +1 -0
  169. package/dist/game/effect-summon.js +113 -0
  170. package/dist/game/effect-summon.js.map +1 -0
  171. package/dist/game/effect-teleport.d.ts +130 -0
  172. package/dist/game/effect-teleport.d.ts.map +1 -0
  173. package/dist/game/effect-teleport.js +529 -0
  174. package/dist/game/effect-teleport.js.map +1 -0
  175. package/dist/game/effect-terrain.d.ts +91 -0
  176. package/dist/game/effect-terrain.d.ts.map +1 -0
  177. package/dist/game/effect-terrain.js +812 -0
  178. package/dist/game/effect-terrain.js.map +1 -0
  179. package/dist/game/energy.d.ts +45 -0
  180. package/dist/game/energy.d.ts.map +1 -0
  181. package/dist/game/energy.js +51 -0
  182. package/dist/game/energy.js.map +1 -0
  183. package/dist/game/equip-cmp.d.ts +138 -0
  184. package/dist/game/equip-cmp.d.ts.map +1 -0
  185. package/dist/game/equip-cmp.js +363 -0
  186. package/dist/game/equip-cmp.js.map +1 -0
  187. package/dist/game/floor.d.ts +182 -0
  188. package/dist/game/floor.d.ts.map +1 -0
  189. package/dist/game/floor.js +435 -0
  190. package/dist/game/floor.js.map +1 -0
  191. package/dist/game/gear.d.ts +408 -0
  192. package/dist/game/gear.d.ts.map +1 -0
  193. package/dist/game/gear.js +1037 -0
  194. package/dist/game/gear.js.map +1 -0
  195. package/dist/game/harness.d.ts +61 -0
  196. package/dist/game/harness.d.ts.map +1 -0
  197. package/dist/game/harness.js +198 -0
  198. package/dist/game/harness.js.map +1 -0
  199. package/dist/game/history.d.ts +49 -0
  200. package/dist/game/history.d.ts.map +1 -0
  201. package/dist/game/history.js +55 -0
  202. package/dist/game/history.js.map +1 -0
  203. package/dist/game/ignore-cmd.d.ts +42 -0
  204. package/dist/game/ignore-cmd.d.ts.map +1 -0
  205. package/dist/game/ignore-cmd.js +59 -0
  206. package/dist/game/ignore-cmd.js.map +1 -0
  207. package/dist/game/inscription-confirm.d.ts +80 -0
  208. package/dist/game/inscription-confirm.d.ts.map +1 -0
  209. package/dist/game/inscription-confirm.js +95 -0
  210. package/dist/game/inscription-confirm.js.map +1 -0
  211. package/dist/game/known.d.ts +297 -0
  212. package/dist/game/known.d.ts.map +1 -0
  213. package/dist/game/known.js +849 -0
  214. package/dist/game/known.js.map +1 -0
  215. package/dist/game/loop.d.ts +139 -0
  216. package/dist/game/loop.d.ts.map +1 -0
  217. package/dist/game/loop.js +631 -0
  218. package/dist/game/loop.js.map +1 -0
  219. package/dist/game/lore-color.d.ts +25 -0
  220. package/dist/game/lore-color.d.ts.map +1 -0
  221. package/dist/game/lore-color.js +95 -0
  222. package/dist/game/lore-color.js.map +1 -0
  223. package/dist/game/mon-cast.d.ts +150 -0
  224. package/dist/game/mon-cast.d.ts.map +1 -0
  225. package/dist/game/mon-cast.js +301 -0
  226. package/dist/game/mon-cast.js.map +1 -0
  227. package/dist/game/mon-cmd.d.ts +51 -0
  228. package/dist/game/mon-cmd.d.ts.map +1 -0
  229. package/dist/game/mon-cmd.js +670 -0
  230. package/dist/game/mon-cmd.js.map +1 -0
  231. package/dist/game/mon-death.d.ts +143 -0
  232. package/dist/game/mon-death.d.ts.map +1 -0
  233. package/dist/game/mon-death.js +328 -0
  234. package/dist/game/mon-death.js.map +1 -0
  235. package/dist/game/mon-group.d.ts +81 -0
  236. package/dist/game/mon-group.d.ts.map +1 -0
  237. package/dist/game/mon-group.js +323 -0
  238. package/dist/game/mon-group.js.map +1 -0
  239. package/dist/game/mon-list.d.ts +85 -0
  240. package/dist/game/mon-list.d.ts.map +1 -0
  241. package/dist/game/mon-list.js +154 -0
  242. package/dist/game/mon-list.js.map +1 -0
  243. package/dist/game/mon-message.d.ts +100 -0
  244. package/dist/game/mon-message.d.ts.map +1 -0
  245. package/dist/game/mon-message.js +336 -0
  246. package/dist/game/mon-message.js.map +1 -0
  247. package/dist/game/mon-place.d.ts +226 -0
  248. package/dist/game/mon-place.d.ts.map +1 -0
  249. package/dist/game/mon-place.js +642 -0
  250. package/dist/game/mon-place.js.map +1 -0
  251. package/dist/game/mon-ranged.d.ts +87 -0
  252. package/dist/game/mon-ranged.d.ts.map +1 -0
  253. package/dist/game/mon-ranged.js +353 -0
  254. package/dist/game/mon-ranged.js.map +1 -0
  255. package/dist/game/mon-shape.d.ts +43 -0
  256. package/dist/game/mon-shape.d.ts.map +1 -0
  257. package/dist/game/mon-shape.js +115 -0
  258. package/dist/game/mon-shape.js.map +1 -0
  259. package/dist/game/mon-side.d.ts +63 -0
  260. package/dist/game/mon-side.d.ts.map +1 -0
  261. package/dist/game/mon-side.js +403 -0
  262. package/dist/game/mon-side.js.map +1 -0
  263. package/dist/game/monster-turn.d.ts +195 -0
  264. package/dist/game/monster-turn.d.ts.map +1 -0
  265. package/dist/game/monster-turn.js +1560 -0
  266. package/dist/game/monster-turn.js.map +1 -0
  267. package/dist/game/obj-cmd.d.ts +453 -0
  268. package/dist/game/obj-cmd.d.ts.map +1 -0
  269. package/dist/game/obj-cmd.js +1530 -0
  270. package/dist/game/obj-cmd.js.map +1 -0
  271. package/dist/game/obj-list.d.ts +92 -0
  272. package/dist/game/obj-list.d.ts.map +1 -0
  273. package/dist/game/obj-list.js +251 -0
  274. package/dist/game/obj-list.js.map +1 -0
  275. package/dist/game/object-inspect.d.ts +37 -0
  276. package/dist/game/object-inspect.d.ts.map +1 -0
  277. package/dist/game/object-inspect.js +106 -0
  278. package/dist/game/object-inspect.js.map +1 -0
  279. package/dist/game/pickup.d.ts +126 -0
  280. package/dist/game/pickup.d.ts.map +1 -0
  281. package/dist/game/pickup.js +367 -0
  282. package/dist/game/pickup.js.map +1 -0
  283. package/dist/game/player-path.d.ts +133 -0
  284. package/dist/game/player-path.d.ts.map +1 -0
  285. package/dist/game/player-path.js +1268 -0
  286. package/dist/game/player-path.js.map +1 -0
  287. package/dist/game/player-side.d.ts +59 -0
  288. package/dist/game/player-side.d.ts.map +1 -0
  289. package/dist/game/player-side.js +506 -0
  290. package/dist/game/player-side.js.map +1 -0
  291. package/dist/game/player-turn.d.ts +161 -0
  292. package/dist/game/player-turn.d.ts.map +1 -0
  293. package/dist/game/player-turn.js +739 -0
  294. package/dist/game/player-turn.js.map +1 -0
  295. package/dist/game/project-cast.d.ts +268 -0
  296. package/dist/game/project-cast.d.ts.map +1 -0
  297. package/dist/game/project-cast.js +496 -0
  298. package/dist/game/project-cast.js.map +1 -0
  299. package/dist/game/project-feat.d.ts +47 -0
  300. package/dist/game/project-feat.d.ts.map +1 -0
  301. package/dist/game/project-feat.js +350 -0
  302. package/dist/game/project-feat.js.map +1 -0
  303. package/dist/game/project-monster.d.ts +106 -0
  304. package/dist/game/project-monster.d.ts.map +1 -0
  305. package/dist/game/project-monster.js +272 -0
  306. package/dist/game/project-monster.js.map +1 -0
  307. package/dist/game/project-obj.d.ts +60 -0
  308. package/dist/game/project-obj.d.ts.map +1 -0
  309. package/dist/game/project-obj.js +245 -0
  310. package/dist/game/project-obj.js.map +1 -0
  311. package/dist/game/project-player.d.ts +120 -0
  312. package/dist/game/project-player.d.ts.map +1 -0
  313. package/dist/game/project-player.js +108 -0
  314. package/dist/game/project-player.js.map +1 -0
  315. package/dist/game/quest.d.ts +101 -0
  316. package/dist/game/quest.d.ts.map +1 -0
  317. package/dist/game/quest.js +192 -0
  318. package/dist/game/quest.js.map +1 -0
  319. package/dist/game/ranged-cmd.d.ts +32 -0
  320. package/dist/game/ranged-cmd.d.ts.map +1 -0
  321. package/dist/game/ranged-cmd.js +372 -0
  322. package/dist/game/ranged-cmd.js.map +1 -0
  323. package/dist/game/scheduler.d.ts +47 -0
  324. package/dist/game/scheduler.d.ts.map +1 -0
  325. package/dist/game/scheduler.js +141 -0
  326. package/dist/game/scheduler.js.map +1 -0
  327. package/dist/game/spell-cmd.d.ts +104 -0
  328. package/dist/game/spell-cmd.d.ts.map +1 -0
  329. package/dist/game/spell-cmd.js +320 -0
  330. package/dist/game/spell-cmd.js.map +1 -0
  331. package/dist/game/spoil.d.ts +28 -0
  332. package/dist/game/spoil.d.ts.map +1 -0
  333. package/dist/game/spoil.js +435 -0
  334. package/dist/game/spoil.js.map +1 -0
  335. package/dist/game/steal.d.ts +35 -0
  336. package/dist/game/steal.d.ts.map +1 -0
  337. package/dist/game/steal.js +145 -0
  338. package/dist/game/steal.js.map +1 -0
  339. package/dist/game/take-hit-hooks.d.ts +52 -0
  340. package/dist/game/take-hit-hooks.d.ts.map +1 -0
  341. package/dist/game/take-hit-hooks.js +127 -0
  342. package/dist/game/take-hit-hooks.js.map +1 -0
  343. package/dist/game/target-loop.d.ts +119 -0
  344. package/dist/game/target-loop.d.ts.map +1 -0
  345. package/dist/game/target-loop.js +408 -0
  346. package/dist/game/target-loop.js.map +1 -0
  347. package/dist/game/target.d.ts +133 -0
  348. package/dist/game/target.d.ts.map +1 -0
  349. package/dist/game/target.js +353 -0
  350. package/dist/game/target.js.map +1 -0
  351. package/dist/game/thrust.d.ts +37 -0
  352. package/dist/game/thrust.d.ts.map +1 -0
  353. package/dist/game/thrust.js +155 -0
  354. package/dist/game/thrust.js.map +1 -0
  355. package/dist/game/trap.d.ts +218 -0
  356. package/dist/game/trap.d.ts.map +1 -0
  357. package/dist/game/trap.js +618 -0
  358. package/dist/game/trap.js.map +1 -0
  359. package/dist/game/ui-entry.d.ts +282 -0
  360. package/dist/game/ui-entry.d.ts.map +1 -0
  361. package/dist/game/ui-entry.js +1838 -0
  362. package/dist/game/ui-entry.js.map +1 -0
  363. package/dist/game/wizard.d.ts +654 -0
  364. package/dist/game/wizard.d.ts.map +1 -0
  365. package/dist/game/wizard.js +1323 -0
  366. package/dist/game/wizard.js.map +1 -0
  367. package/dist/game/world.d.ts +183 -0
  368. package/dist/game/world.d.ts.map +1 -0
  369. package/dist/game/world.js +685 -0
  370. package/dist/game/world.js.map +1 -0
  371. package/dist/gen/cave.d.ts +247 -0
  372. package/dist/gen/cave.d.ts.map +1 -0
  373. package/dist/gen/cave.js +2406 -0
  374. package/dist/gen/cave.js.map +1 -0
  375. package/dist/gen/gen-monster.d.ts +151 -0
  376. package/dist/gen/gen-monster.d.ts.map +1 -0
  377. package/dist/gen/gen-monster.js +473 -0
  378. package/dist/gen/gen-monster.js.map +1 -0
  379. package/dist/gen/generate.d.ts +240 -0
  380. package/dist/gen/generate.d.ts.map +1 -0
  381. package/dist/gen/generate.js +358 -0
  382. package/dist/gen/generate.js.map +1 -0
  383. package/dist/gen/room.d.ts +160 -0
  384. package/dist/gen/room.d.ts.map +1 -0
  385. package/dist/gen/room.js +1910 -0
  386. package/dist/gen/room.js.map +1 -0
  387. package/dist/gen/util.d.ts +466 -0
  388. package/dist/gen/util.d.ts.map +1 -0
  389. package/dist/gen/util.js +1553 -0
  390. package/dist/gen/util.js.map +1 -0
  391. package/dist/generated/dun-profiles.d.ts +44 -0
  392. package/dist/generated/dun-profiles.d.ts.map +1 -0
  393. package/dist/generated/dun-profiles.js +28 -0
  394. package/dist/generated/dun-profiles.js.map +1 -0
  395. package/dist/generated/effects.d.ts +1021 -0
  396. package/dist/generated/effects.d.ts.map +1 -0
  397. package/dist/generated/effects.js +239 -0
  398. package/dist/generated/effects.js.map +1 -0
  399. package/dist/generated/elements.d.ts +83 -0
  400. package/dist/generated/elements.d.ts.map +1 -0
  401. package/dist/generated/elements.js +60 -0
  402. package/dist/generated/elements.js.map +1 -0
  403. package/dist/generated/equip-slots.d.ts +104 -0
  404. package/dist/generated/equip-slots.d.ts.map +1 -0
  405. package/dist/generated/equip-slots.js +34 -0
  406. package/dist/generated/equip-slots.js.map +1 -0
  407. package/dist/generated/history-types.d.ts +52 -0
  408. package/dist/generated/history-types.d.ts.map +1 -0
  409. package/dist/generated/history-types.js +32 -0
  410. package/dist/generated/history-types.js.map +1 -0
  411. package/dist/generated/ignore-types.d.ts +116 -0
  412. package/dist/generated/ignore-types.d.ts.map +1 -0
  413. package/dist/generated/ignore-types.js +64 -0
  414. package/dist/generated/ignore-types.js.map +1 -0
  415. package/dist/generated/index.d.ts +32 -0
  416. package/dist/generated/index.d.ts.map +1 -0
  417. package/dist/generated/index.js +33 -0
  418. package/dist/generated/index.js.map +1 -0
  419. package/dist/generated/kind-flags.d.ts +72 -0
  420. package/dist/generated/kind-flags.d.ts.map +1 -0
  421. package/dist/generated/kind-flags.js +42 -0
  422. package/dist/generated/kind-flags.js.map +1 -0
  423. package/dist/generated/message.d.ts +624 -0
  424. package/dist/generated/message.d.ts.map +1 -0
  425. package/dist/generated/message.js +318 -0
  426. package/dist/generated/message.js.map +1 -0
  427. package/dist/generated/mon-message.d.ts +386 -0
  428. package/dist/generated/mon-message.d.ts.map +1 -0
  429. package/dist/generated/mon-message.js +136 -0
  430. package/dist/generated/mon-message.js.map +1 -0
  431. package/dist/generated/mon-race-flags.d.ts +433 -0
  432. package/dist/generated/mon-race-flags.d.ts.map +1 -0
  433. package/dist/generated/mon-race-flags.js +180 -0
  434. package/dist/generated/mon-race-flags.js.map +1 -0
  435. package/dist/generated/mon-spells.d.ts +380 -0
  436. package/dist/generated/mon-spells.d.ts.map +1 -0
  437. package/dist/generated/mon-spells.js +196 -0
  438. package/dist/generated/mon-spells.js.map +1 -0
  439. package/dist/generated/mon-temp-flags.d.ts +52 -0
  440. package/dist/generated/mon-temp-flags.d.ts.map +1 -0
  441. package/dist/generated/mon-temp-flags.js +32 -0
  442. package/dist/generated/mon-temp-flags.js.map +1 -0
  443. package/dist/generated/mon-timed.d.ts +118 -0
  444. package/dist/generated/mon-timed.d.ts.map +1 -0
  445. package/dist/generated/mon-timed.js +32 -0
  446. package/dist/generated/mon-timed.js.map +1 -0
  447. package/dist/generated/object-flags.d.ts +169 -0
  448. package/dist/generated/object-flags.d.ts.map +1 -0
  449. package/dist/generated/object-flags.js +93 -0
  450. package/dist/generated/object-flags.js.map +1 -0
  451. package/dist/generated/object-modifiers.d.ts +50 -0
  452. package/dist/generated/object-modifiers.d.ts.map +1 -0
  453. package/dist/generated/object-modifiers.js +41 -0
  454. package/dist/generated/object-modifiers.js.map +1 -0
  455. package/dist/generated/options.d.ts +284 -0
  456. package/dist/generated/options.d.ts.map +1 -0
  457. package/dist/generated/options.js +102 -0
  458. package/dist/generated/options.js.map +1 -0
  459. package/dist/generated/origins.d.ts +138 -0
  460. package/dist/generated/origins.d.ts.map +1 -0
  461. package/dist/generated/origins.js +62 -0
  462. package/dist/generated/origins.js.map +1 -0
  463. package/dist/generated/parser-errors.d.ts +264 -0
  464. package/dist/generated/parser-errors.d.ts.map +1 -0
  465. package/dist/generated/parser-errors.js +138 -0
  466. package/dist/generated/parser-errors.js.map +1 -0
  467. package/dist/generated/player-flags.d.ts +62 -0
  468. package/dist/generated/player-flags.d.ts.map +1 -0
  469. package/dist/generated/player-flags.js +46 -0
  470. package/dist/generated/player-flags.js.map +1 -0
  471. package/dist/generated/player-timed.d.ts +273 -0
  472. package/dist/generated/player-timed.d.ts.map +1 -0
  473. package/dist/generated/player-timed.js +116 -0
  474. package/dist/generated/player-timed.js.map +1 -0
  475. package/dist/generated/projections.d.ts +130 -0
  476. package/dist/generated/projections.d.ts.map +1 -0
  477. package/dist/generated/projections.js +101 -0
  478. package/dist/generated/projections.js.map +1 -0
  479. package/dist/generated/randart-properties.d.ts +388 -0
  480. package/dist/generated/randart-properties.d.ts.map +1 -0
  481. package/dist/generated/randart-properties.js +200 -0
  482. package/dist/generated/randart-properties.js.map +1 -0
  483. package/dist/generated/room-flags.d.ts +21 -0
  484. package/dist/generated/room-flags.d.ts.map +1 -0
  485. package/dist/generated/room-flags.js +19 -0
  486. package/dist/generated/room-flags.js.map +1 -0
  487. package/dist/generated/rooms.d.ts +122 -0
  488. package/dist/generated/rooms.d.ts.map +1 -0
  489. package/dist/generated/rooms.js +48 -0
  490. package/dist/generated/rooms.js.map +1 -0
  491. package/dist/generated/square-flags.d.ts +96 -0
  492. package/dist/generated/square-flags.d.ts.map +1 -0
  493. package/dist/generated/square-flags.js +54 -0
  494. package/dist/generated/square-flags.js.map +1 -0
  495. package/dist/generated/stats.d.ts +23 -0
  496. package/dist/generated/stats.d.ts.map +1 -0
  497. package/dist/generated/stats.js +20 -0
  498. package/dist/generated/stats.js.map +1 -0
  499. package/dist/generated/terrain-flags.d.ts +136 -0
  500. package/dist/generated/terrain-flags.d.ts.map +1 -0
  501. package/dist/generated/terrain-flags.js +74 -0
  502. package/dist/generated/terrain-flags.js.map +1 -0
  503. package/dist/generated/terrain.d.ts +83 -0
  504. package/dist/generated/terrain.d.ts.map +1 -0
  505. package/dist/generated/terrain.js +60 -0
  506. package/dist/generated/terrain.js.map +1 -0
  507. package/dist/generated/trap-flags.d.ts +68 -0
  508. package/dist/generated/trap-flags.d.ts.map +1 -0
  509. package/dist/generated/trap-flags.js +40 -0
  510. package/dist/generated/trap-flags.js.map +1 -0
  511. package/dist/generated/tvals.d.ts +152 -0
  512. package/dist/generated/tvals.d.ts.map +1 -0
  513. package/dist/generated/tvals.js +82 -0
  514. package/dist/generated/tvals.js.map +1 -0
  515. package/dist/generated/ui-entry-renderers.d.ts +62 -0
  516. package/dist/generated/ui-entry-renderers.d.ts.map +1 -0
  517. package/dist/generated/ui-entry-renderers.js +22 -0
  518. package/dist/generated/ui-entry-renderers.js.map +1 -0
  519. package/dist/guard.d.ts +43 -0
  520. package/dist/guard.d.ts.map +1 -0
  521. package/dist/guard.js +65 -0
  522. package/dist/guard.js.map +1 -0
  523. package/dist/host/args.d.ts +129 -0
  524. package/dist/host/args.d.ts.map +1 -0
  525. package/dist/host/args.js +251 -0
  526. package/dist/host/args.js.map +1 -0
  527. package/dist/host/bridge.d.ts +61 -0
  528. package/dist/host/bridge.d.ts.map +1 -0
  529. package/dist/host/bridge.js +176 -0
  530. package/dist/host/bridge.js.map +1 -0
  531. package/dist/host/index.d.ts +18 -0
  532. package/dist/host/index.d.ts.map +1 -0
  533. package/dist/host/index.js +18 -0
  534. package/dist/host/index.js.map +1 -0
  535. package/dist/host/io.d.ts +169 -0
  536. package/dist/host/io.d.ts.map +1 -0
  537. package/dist/host/io.js +137 -0
  538. package/dist/host/io.js.map +1 -0
  539. package/dist/host/memory.d.ts +56 -0
  540. package/dist/host/memory.d.ts.map +1 -0
  541. package/dist/host/memory.js +105 -0
  542. package/dist/host/memory.js.map +1 -0
  543. package/dist/host/raw.d.ts +114 -0
  544. package/dist/host/raw.d.ts.map +1 -0
  545. package/dist/host/raw.js +107 -0
  546. package/dist/host/raw.js.map +1 -0
  547. package/dist/index.d.ts +180 -0
  548. package/dist/index.d.ts.map +1 -0
  549. package/dist/index.js +222 -0
  550. package/dist/index.js.map +1 -0
  551. package/dist/loc.d.ts +63 -0
  552. package/dist/loc.d.ts.map +1 -0
  553. package/dist/loc.js +128 -0
  554. package/dist/loc.js.map +1 -0
  555. package/dist/mod/hooks.d.ts +204 -0
  556. package/dist/mod/hooks.d.ts.map +1 -0
  557. package/dist/mod/hooks.js +161 -0
  558. package/dist/mod/hooks.js.map +1 -0
  559. package/dist/mod/ids.d.ts +160 -0
  560. package/dist/mod/ids.d.ts.map +1 -0
  561. package/dist/mod/ids.js +343 -0
  562. package/dist/mod/ids.js.map +1 -0
  563. package/dist/mod/registry-host.d.ts +156 -0
  564. package/dist/mod/registry-host.d.ts.map +1 -0
  565. package/dist/mod/registry-host.js +142 -0
  566. package/dist/mod/registry-host.js.map +1 -0
  567. package/dist/mod/save-blocks.d.ts +201 -0
  568. package/dist/mod/save-blocks.d.ts.map +1 -0
  569. package/dist/mod/save-blocks.js +640 -0
  570. package/dist/mod/save-blocks.js.map +1 -0
  571. package/dist/mod/vocabulary.d.ts +104 -0
  572. package/dist/mod/vocabulary.d.ts.map +1 -0
  573. package/dist/mod/vocabulary.js +0 -0
  574. package/dist/mod/vocabulary.js.map +1 -0
  575. package/dist/mon/bind.d.ts +266 -0
  576. package/dist/mon/bind.d.ts.map +1 -0
  577. package/dist/mon/bind.js +610 -0
  578. package/dist/mon/bind.js.map +1 -0
  579. package/dist/mon/desc.d.ts +72 -0
  580. package/dist/mon/desc.d.ts.map +1 -0
  581. package/dist/mon/desc.js +237 -0
  582. package/dist/mon/desc.js.map +1 -0
  583. package/dist/mon/knowledge-groups.d.ts +61 -0
  584. package/dist/mon/knowledge-groups.d.ts.map +1 -0
  585. package/dist/mon/knowledge-groups.js +121 -0
  586. package/dist/mon/knowledge-groups.js.map +1 -0
  587. package/dist/mon/lore-describe.d.ts +216 -0
  588. package/dist/mon/lore-describe.d.ts.map +1 -0
  589. package/dist/mon/lore-describe.js +1105 -0
  590. package/dist/mon/lore-describe.js.map +1 -0
  591. package/dist/mon/lore.d.ts +117 -0
  592. package/dist/mon/lore.d.ts.map +1 -0
  593. package/dist/mon/lore.js +221 -0
  594. package/dist/mon/lore.js.map +1 -0
  595. package/dist/mon/make.d.ts +147 -0
  596. package/dist/mon/make.d.ts.map +1 -0
  597. package/dist/mon/make.js +353 -0
  598. package/dist/mon/make.js.map +1 -0
  599. package/dist/mon/monster.d.ts +94 -0
  600. package/dist/mon/monster.d.ts.map +1 -0
  601. package/dist/mon/monster.js +90 -0
  602. package/dist/mon/monster.js.map +1 -0
  603. package/dist/mon/predicate.d.ts +87 -0
  604. package/dist/mon/predicate.d.ts.map +1 -0
  605. package/dist/mon/predicate.js +190 -0
  606. package/dist/mon/predicate.js.map +1 -0
  607. package/dist/mon/project-mon.d.ts +129 -0
  608. package/dist/mon/project-mon.d.ts.map +1 -0
  609. package/dist/mon/project-mon.js +652 -0
  610. package/dist/mon/project-mon.js.map +1 -0
  611. package/dist/mon/spell.d.ts +155 -0
  612. package/dist/mon/spell.d.ts.map +1 -0
  613. package/dist/mon/spell.js +355 -0
  614. package/dist/mon/spell.js.map +1 -0
  615. package/dist/mon/steal.d.ts +112 -0
  616. package/dist/mon/steal.d.ts.map +1 -0
  617. package/dist/mon/steal.js +163 -0
  618. package/dist/mon/steal.js.map +1 -0
  619. package/dist/mon/summon.d.ts +62 -0
  620. package/dist/mon/summon.d.ts.map +1 -0
  621. package/dist/mon/summon.js +111 -0
  622. package/dist/mon/summon.js.map +1 -0
  623. package/dist/mon/take-hit.d.ts +75 -0
  624. package/dist/mon/take-hit.d.ts.map +1 -0
  625. package/dist/mon/take-hit.js +122 -0
  626. package/dist/mon/take-hit.js.map +1 -0
  627. package/dist/mon/timed.d.ts +74 -0
  628. package/dist/mon/timed.d.ts.map +1 -0
  629. package/dist/mon/timed.js +219 -0
  630. package/dist/mon/timed.js.map +1 -0
  631. package/dist/mon/types.d.ts +252 -0
  632. package/dist/mon/types.d.ts.map +1 -0
  633. package/dist/mon/types.js +46 -0
  634. package/dist/mon/types.js.map +1 -0
  635. package/dist/msg.d.ts +71 -0
  636. package/dist/msg.d.ts.map +1 -0
  637. package/dist/msg.js +126 -0
  638. package/dist/msg.js.map +1 -0
  639. package/dist/obj/artifact-fake.d.ts +39 -0
  640. package/dist/obj/artifact-fake.d.ts.map +1 -0
  641. package/dist/obj/artifact-fake.js +52 -0
  642. package/dist/obj/artifact-fake.js.map +1 -0
  643. package/dist/obj/artifact-known.d.ts +50 -0
  644. package/dist/obj/artifact-known.d.ts.map +1 -0
  645. package/dist/obj/artifact-known.js +55 -0
  646. package/dist/obj/artifact-known.js.map +1 -0
  647. package/dist/obj/bind.d.ts +219 -0
  648. package/dist/obj/bind.d.ts.map +1 -0
  649. package/dist/obj/bind.js +1239 -0
  650. package/dist/obj/bind.js.map +1 -0
  651. package/dist/obj/chest.d.ts +91 -0
  652. package/dist/obj/chest.d.ts.map +1 -0
  653. package/dist/obj/chest.js +220 -0
  654. package/dist/obj/chest.js.map +1 -0
  655. package/dist/obj/desc.d.ts +79 -0
  656. package/dist/obj/desc.d.ts.map +1 -0
  657. package/dist/obj/desc.js +602 -0
  658. package/dist/obj/desc.js.map +1 -0
  659. package/dist/obj/effects-info.d.ts +78 -0
  660. package/dist/obj/effects-info.d.ts.map +1 -0
  661. package/dist/obj/effects-info.js +240 -0
  662. package/dist/obj/effects-info.js.map +1 -0
  663. package/dist/obj/flavor.d.ts +68 -0
  664. package/dist/obj/flavor.d.ts.map +1 -0
  665. package/dist/obj/flavor.js +201 -0
  666. package/dist/obj/flavor.js.map +1 -0
  667. package/dist/obj/ignore.d.ts +143 -0
  668. package/dist/obj/ignore.d.ts.map +1 -0
  669. package/dist/obj/ignore.js +345 -0
  670. package/dist/obj/ignore.js.map +1 -0
  671. package/dist/obj/knowledge.d.ts +520 -0
  672. package/dist/obj/knowledge.d.ts.map +1 -0
  673. package/dist/obj/knowledge.js +1364 -0
  674. package/dist/obj/knowledge.js.map +1 -0
  675. package/dist/obj/known-object.d.ts +293 -0
  676. package/dist/obj/known-object.d.ts.map +1 -0
  677. package/dist/obj/known-object.js +532 -0
  678. package/dist/obj/known-object.js.map +1 -0
  679. package/dist/obj/make.d.ts +292 -0
  680. package/dist/obj/make.d.ts.map +1 -0
  681. package/dist/obj/make.js +1055 -0
  682. package/dist/obj/make.js.map +1 -0
  683. package/dist/obj/object-info.d.ts +188 -0
  684. package/dist/obj/object-info.d.ts.map +1 -0
  685. package/dist/obj/object-info.js +1407 -0
  686. package/dist/obj/object-info.js.map +1 -0
  687. package/dist/obj/object.d.ts +335 -0
  688. package/dist/obj/object.d.ts.map +1 -0
  689. package/dist/obj/object.js +1051 -0
  690. package/dist/obj/object.js.map +1 -0
  691. package/dist/obj/power.d.ts +65 -0
  692. package/dist/obj/power.d.ts.map +1 -0
  693. package/dist/obj/power.js +580 -0
  694. package/dist/obj/power.js.map +1 -0
  695. package/dist/obj/randart-build.d.ts +223 -0
  696. package/dist/obj/randart-build.d.ts.map +1 -0
  697. package/dist/obj/randart-build.js +1444 -0
  698. package/dist/obj/randart-build.js.map +1 -0
  699. package/dist/obj/randart-data.d.ts +179 -0
  700. package/dist/obj/randart-data.d.ts.map +1 -0
  701. package/dist/obj/randart-data.js +1153 -0
  702. package/dist/obj/randart-data.js.map +1 -0
  703. package/dist/obj/randart.d.ts +128 -0
  704. package/dist/obj/randart.d.ts.map +1 -0
  705. package/dist/obj/randart.js +458 -0
  706. package/dist/obj/randart.js.map +1 -0
  707. package/dist/obj/randname.d.ts +33 -0
  708. package/dist/obj/randname.d.ts.map +1 -0
  709. package/dist/obj/randname.js +116 -0
  710. package/dist/obj/randname.js.map +1 -0
  711. package/dist/obj/recharge.d.ts +28 -0
  712. package/dist/obj/recharge.d.ts.map +1 -0
  713. package/dist/obj/recharge.js +52 -0
  714. package/dist/obj/recharge.js.map +1 -0
  715. package/dist/obj/types.d.ts +584 -0
  716. package/dist/obj/types.d.ts.map +1 -0
  717. package/dist/obj/types.js +104 -0
  718. package/dist/obj/types.js.map +1 -0
  719. package/dist/obj/value.d.ts +64 -0
  720. package/dist/obj/value.d.ts.map +1 -0
  721. package/dist/obj/value.js +176 -0
  722. package/dist/obj/value.js.map +1 -0
  723. package/dist/player/abilities.d.ts +57 -0
  724. package/dist/player/abilities.d.ts.map +1 -0
  725. package/dist/player/abilities.js +118 -0
  726. package/dist/player/abilities.js.map +1 -0
  727. package/dist/player/best-digger.d.ts +42 -0
  728. package/dist/player/best-digger.d.ts.map +1 -0
  729. package/dist/player/best-digger.js +89 -0
  730. package/dist/player/best-digger.js.map +1 -0
  731. package/dist/player/bind.d.ts +270 -0
  732. package/dist/player/bind.d.ts.map +1 -0
  733. package/dist/player/bind.js +698 -0
  734. package/dist/player/bind.js.map +1 -0
  735. package/dist/player/birth.d.ts +258 -0
  736. package/dist/player/birth.d.ts.map +1 -0
  737. package/dist/player/birth.js +639 -0
  738. package/dist/player/birth.js.map +1 -0
  739. package/dist/player/calcs.d.ts +403 -0
  740. package/dist/player/calcs.d.ts.map +1 -0
  741. package/dist/player/calcs.js +1189 -0
  742. package/dist/player/calcs.js.map +1 -0
  743. package/dist/player/combat-regen.d.ts +14 -0
  744. package/dist/player/combat-regen.d.ts.map +1 -0
  745. package/dist/player/combat-regen.js +29 -0
  746. package/dist/player/combat-regen.js.map +1 -0
  747. package/dist/player/exp.d.ts +96 -0
  748. package/dist/player/exp.d.ts.map +1 -0
  749. package/dist/player/exp.js +229 -0
  750. package/dist/player/exp.js.map +1 -0
  751. package/dist/player/history.d.ts +91 -0
  752. package/dist/player/history.d.ts.map +1 -0
  753. package/dist/player/history.js +145 -0
  754. package/dist/player/history.js.map +1 -0
  755. package/dist/player/options.d.ts +123 -0
  756. package/dist/player/options.d.ts.map +1 -0
  757. package/dist/player/options.js +199 -0
  758. package/dist/player/options.js.map +1 -0
  759. package/dist/player/player.d.ts +242 -0
  760. package/dist/player/player.d.ts.map +1 -0
  761. package/dist/player/player.js +119 -0
  762. package/dist/player/player.js.map +1 -0
  763. package/dist/player/shape-lore.d.ts +56 -0
  764. package/dist/player/shape-lore.d.ts.map +1 -0
  765. package/dist/player/shape-lore.js +221 -0
  766. package/dist/player/shape-lore.js.map +1 -0
  767. package/dist/player/spell.d.ts +146 -0
  768. package/dist/player/spell.d.ts.map +1 -0
  769. package/dist/player/spell.js +519 -0
  770. package/dist/player/spell.js.map +1 -0
  771. package/dist/player/take-hit.d.ts +87 -0
  772. package/dist/player/take-hit.d.ts.map +1 -0
  773. package/dist/player/take-hit.js +99 -0
  774. package/dist/player/take-hit.js.map +1 -0
  775. package/dist/player/timed.d.ts +205 -0
  776. package/dist/player/timed.d.ts.map +1 -0
  777. package/dist/player/timed.js +310 -0
  778. package/dist/player/timed.js.map +1 -0
  779. package/dist/player/types.d.ts +390 -0
  780. package/dist/player/types.d.ts.map +1 -0
  781. package/dist/player/types.js +51 -0
  782. package/dist/player/types.js.map +1 -0
  783. package/dist/rational.d.ts +99 -0
  784. package/dist/rational.d.ts.map +1 -0
  785. package/dist/rational.js +345 -0
  786. package/dist/rational.js.map +1 -0
  787. package/dist/rng.d.ts +168 -0
  788. package/dist/rng.d.ts.map +1 -0
  789. package/dist/rng.js +404 -0
  790. package/dist/rng.js.map +1 -0
  791. package/dist/save/buffer.d.ts +120 -0
  792. package/dist/save/buffer.d.ts.map +1 -0
  793. package/dist/save/buffer.js +238 -0
  794. package/dist/save/buffer.js.map +1 -0
  795. package/dist/save/compress.d.ts +79 -0
  796. package/dist/save/compress.d.ts.map +1 -0
  797. package/dist/save/compress.js +97 -0
  798. package/dist/save/compress.js.map +1 -0
  799. package/dist/save/description.d.ts +61 -0
  800. package/dist/save/description.d.ts.map +1 -0
  801. package/dist/save/description.js +51 -0
  802. package/dist/save/description.js.map +1 -0
  803. package/dist/save/integrity.d.ts +59 -0
  804. package/dist/save/integrity.d.ts.map +1 -0
  805. package/dist/save/integrity.js +103 -0
  806. package/dist/save/integrity.js.map +1 -0
  807. package/dist/score/display.d.ts +40 -0
  808. package/dist/score/display.d.ts.map +1 -0
  809. package/dist/score/display.js +86 -0
  810. package/dist/score/display.js.map +1 -0
  811. package/dist/score/score.d.ts +166 -0
  812. package/dist/score/score.d.ts.map +1 -0
  813. package/dist/score/score.js +244 -0
  814. package/dist/score/score.js.map +1 -0
  815. package/dist/score/types.d.ts +98 -0
  816. package/dist/score/types.d.ts.map +1 -0
  817. package/dist/score/types.js +27 -0
  818. package/dist/score/types.js.map +1 -0
  819. package/dist/session/boot.d.ts +207 -0
  820. package/dist/session/boot.d.ts.map +1 -0
  821. package/dist/session/boot.js +151 -0
  822. package/dist/session/boot.js.map +1 -0
  823. package/dist/session/game.d.ts +257 -0
  824. package/dist/session/game.d.ts.map +1 -0
  825. package/dist/session/game.js +2880 -0
  826. package/dist/session/game.js.map +1 -0
  827. package/dist/session/save.d.ts +847 -0
  828. package/dist/session/save.d.ts.map +1 -0
  829. package/dist/session/save.js +1306 -0
  830. package/dist/session/save.js.map +1 -0
  831. package/dist/sound/engine.d.ts +146 -0
  832. package/dist/sound/engine.d.ts.map +1 -0
  833. package/dist/sound/engine.js +332 -0
  834. package/dist/sound/engine.js.map +1 -0
  835. package/dist/sound/index.d.ts +13 -0
  836. package/dist/sound/index.d.ts.map +1 -0
  837. package/dist/sound/index.js +13 -0
  838. package/dist/sound/index.js.map +1 -0
  839. package/dist/sound/sound-prefs-data.d.ts +10 -0
  840. package/dist/sound/sound-prefs-data.d.ts.map +1 -0
  841. package/dist/sound/sound-prefs-data.js +165 -0
  842. package/dist/sound/sound-prefs-data.js.map +1 -0
  843. package/dist/sound/types.d.ts +64 -0
  844. package/dist/sound/types.d.ts.map +1 -0
  845. package/dist/sound/types.js +23 -0
  846. package/dist/sound/types.js.map +1 -0
  847. package/dist/store/bind.d.ts +43 -0
  848. package/dist/store/bind.d.ts.map +1 -0
  849. package/dist/store/bind.js +130 -0
  850. package/dist/store/bind.js.map +1 -0
  851. package/dist/store/price.d.ts +27 -0
  852. package/dist/store/price.d.ts.map +1 -0
  853. package/dist/store/price.js +81 -0
  854. package/dist/store/price.js.map +1 -0
  855. package/dist/store/store-cmd.d.ts +51 -0
  856. package/dist/store/store-cmd.d.ts.map +1 -0
  857. package/dist/store/store-cmd.js +73 -0
  858. package/dist/store/store-cmd.js.map +1 -0
  859. package/dist/store/store.d.ts +156 -0
  860. package/dist/store/store.d.ts.map +1 -0
  861. package/dist/store/store.js +616 -0
  862. package/dist/store/store.js.map +1 -0
  863. package/dist/store/transact.d.ts +198 -0
  864. package/dist/store/transact.d.ts.map +1 -0
  865. package/dist/store/transact.js +383 -0
  866. package/dist/store/transact.js.map +1 -0
  867. package/dist/store/types.d.ts +101 -0
  868. package/dist/store/types.d.ts.map +1 -0
  869. package/dist/store/types.js +14 -0
  870. package/dist/store/types.js.map +1 -0
  871. package/dist/version.d.ts +25 -0
  872. package/dist/version.d.ts.map +1 -0
  873. package/dist/version.js +25 -0
  874. package/dist/version.js.map +1 -0
  875. package/dist/visuals/engine.d.ts +223 -0
  876. package/dist/visuals/engine.d.ts.map +1 -0
  877. package/dist/visuals/engine.js +357 -0
  878. package/dist/visuals/engine.js.map +1 -0
  879. package/dist/visuals/glyph-table.d.ts +112 -0
  880. package/dist/visuals/glyph-table.d.ts.map +1 -0
  881. package/dist/visuals/glyph-table.js +156 -0
  882. package/dist/visuals/glyph-table.js.map +1 -0
  883. package/dist/visuals/grafmode-data.d.ts +4 -0
  884. package/dist/visuals/grafmode-data.d.ts.map +1 -0
  885. package/dist/visuals/grafmode-data.js +88 -0
  886. package/dist/visuals/grafmode-data.js.map +1 -0
  887. package/dist/visuals/grafmode.d.ts +83 -0
  888. package/dist/visuals/grafmode.d.ts.map +1 -0
  889. package/dist/visuals/grafmode.js +82 -0
  890. package/dist/visuals/grafmode.js.map +1 -0
  891. package/dist/visuals/index.d.ts +19 -0
  892. package/dist/visuals/index.d.ts.map +1 -0
  893. package/dist/visuals/index.js +19 -0
  894. package/dist/visuals/index.js.map +1 -0
  895. package/dist/visuals/map-text.d.ts +79 -0
  896. package/dist/visuals/map-text.d.ts.map +1 -0
  897. package/dist/visuals/map-text.js +122 -0
  898. package/dist/visuals/map-text.js.map +1 -0
  899. package/dist/visuals/pref-expr.d.ts +56 -0
  900. package/dist/visuals/pref-expr.d.ts.map +1 -0
  901. package/dist/visuals/pref-expr.js +173 -0
  902. package/dist/visuals/pref-expr.js.map +1 -0
  903. package/dist/visuals/prefs.d.ts +280 -0
  904. package/dist/visuals/prefs.d.ts.map +1 -0
  905. package/dist/visuals/prefs.js +835 -0
  906. package/dist/visuals/prefs.js.map +1 -0
  907. package/dist/visuals/tile-prefs.d.ts +132 -0
  908. package/dist/visuals/tile-prefs.d.ts.map +1 -0
  909. package/dist/visuals/tile-prefs.js +105 -0
  910. package/dist/visuals/tile-prefs.js.map +1 -0
  911. package/dist/world/chunk.d.ts +195 -0
  912. package/dist/world/chunk.d.ts.map +1 -0
  913. package/dist/world/chunk.js +422 -0
  914. package/dist/world/chunk.js.map +1 -0
  915. package/dist/world/feature.d.ts +86 -0
  916. package/dist/world/feature.d.ts.map +1 -0
  917. package/dist/world/feature.js +153 -0
  918. package/dist/world/feature.js.map +1 -0
  919. package/dist/world/flow.d.ts +33 -0
  920. package/dist/world/flow.d.ts.map +1 -0
  921. package/dist/world/flow.js +115 -0
  922. package/dist/world/flow.js.map +1 -0
  923. package/dist/world/project.d.ts +176 -0
  924. package/dist/world/project.d.ts.map +1 -0
  925. package/dist/world/project.js +543 -0
  926. package/dist/world/project.js.map +1 -0
  927. package/dist/world/projection.d.ts +100 -0
  928. package/dist/world/projection.d.ts.map +1 -0
  929. package/dist/world/projection.js +152 -0
  930. package/dist/world/projection.js.map +1 -0
  931. package/dist/world/scatter.d.ts +25 -0
  932. package/dist/world/scatter.d.ts.map +1 -0
  933. package/dist/world/scatter.js +54 -0
  934. package/dist/world/scatter.js.map +1 -0
  935. package/dist/world/trap.d.ts +84 -0
  936. package/dist/world/trap.d.ts.map +1 -0
  937. package/dist/world/trap.js +106 -0
  938. package/dist/world/trap.js.map +1 -0
  939. package/dist/world/view.d.ts +60 -0
  940. package/dist/world/view.d.ts.map +1 -0
  941. package/dist/world/view.js +436 -0
  942. package/dist/world/view.js.map +1 -0
  943. package/dist/z-queue.d.ts +133 -0
  944. package/dist/z-queue.d.ts.map +1 -0
  945. package/dist/z-queue.js +283 -0
  946. package/dist/z-queue.js.map +1 -0
  947. package/package.json +75 -0
  948. package/src/agent/act.ts +114 -0
  949. package/src/agent/controller.ts +109 -0
  950. package/src/agent/events.ts +47 -0
  951. package/src/agent/index.ts +36 -0
  952. package/src/agent/perceive.ts +440 -0
  953. package/src/agent/types.ts +464 -0
  954. package/src/bitflag.ts +536 -0
  955. package/src/cmd.ts +547 -0
  956. package/src/color.ts +267 -0
  957. package/src/combat/brand-slay.ts +360 -0
  958. package/src/combat/hit.ts +471 -0
  959. package/src/combat/index.ts +15 -0
  960. package/src/combat/melee.ts +728 -0
  961. package/src/combat/mon-melee.ts +1153 -0
  962. package/src/combat/ranged.ts +397 -0
  963. package/src/constants.ts +324 -0
  964. package/src/dice.ts +467 -0
  965. package/src/effects/effect-choice.ts +32 -0
  966. package/src/effects/effect-info.ts +859 -0
  967. package/src/effects/effect.ts +560 -0
  968. package/src/effects/handlers.ts +452 -0
  969. package/src/effects/interpreter.ts +603 -0
  970. package/src/events.ts +317 -0
  971. package/src/expression.ts +360 -0
  972. package/src/game/cave-cmd.ts +1147 -0
  973. package/src/game/char-sheet.ts +557 -0
  974. package/src/game/chest.ts +348 -0
  975. package/src/game/context.ts +1218 -0
  976. package/src/game/curse-tick.ts +130 -0
  977. package/src/game/describe.ts +62 -0
  978. package/src/game/display.ts +838 -0
  979. package/src/game/dump-level.ts +114 -0
  980. package/src/game/effect-attack.ts +746 -0
  981. package/src/game/effect-detect.ts +542 -0
  982. package/src/game/effect-env.ts +252 -0
  983. package/src/game/effect-game-env.ts +86 -0
  984. package/src/game/effect-general.ts +1122 -0
  985. package/src/game/effect-item.ts +999 -0
  986. package/src/game/effect-melee.ts +557 -0
  987. package/src/game/effect-mon-origin.ts +196 -0
  988. package/src/game/effect-monster.ts +310 -0
  989. package/src/game/effect-summon.ts +161 -0
  990. package/src/game/effect-teleport.ts +645 -0
  991. package/src/game/effect-terrain.ts +881 -0
  992. package/src/game/energy.ts +61 -0
  993. package/src/game/equip-cmp.ts +476 -0
  994. package/src/game/floor.ts +524 -0
  995. package/src/game/gear.ts +1352 -0
  996. package/src/game/harness.ts +270 -0
  997. package/src/game/history.ts +78 -0
  998. package/src/game/ignore-cmd.ts +68 -0
  999. package/src/game/inscription-confirm.ts +115 -0
  1000. package/src/game/known.ts +960 -0
  1001. package/src/game/loop.ts +671 -0
  1002. package/src/game/lore-color.ts +108 -0
  1003. package/src/game/mon-cast.ts +409 -0
  1004. package/src/game/mon-cmd.ts +767 -0
  1005. package/src/game/mon-death.ts +459 -0
  1006. package/src/game/mon-group.ts +368 -0
  1007. package/src/game/mon-list.ts +213 -0
  1008. package/src/game/mon-message.ts +359 -0
  1009. package/src/game/mon-place.ts +1012 -0
  1010. package/src/game/mon-ranged.ts +405 -0
  1011. package/src/game/mon-shape.ts +161 -0
  1012. package/src/game/mon-side.ts +511 -0
  1013. package/src/game/monster-turn.ts +1750 -0
  1014. package/src/game/obj-cmd.ts +1970 -0
  1015. package/src/game/obj-list.ts +302 -0
  1016. package/src/game/object-inspect.ts +162 -0
  1017. package/src/game/pickup.ts +483 -0
  1018. package/src/game/player-path.ts +1434 -0
  1019. package/src/game/player-side.ts +555 -0
  1020. package/src/game/player-turn.ts +852 -0
  1021. package/src/game/project-cast.ts +766 -0
  1022. package/src/game/project-feat.ts +386 -0
  1023. package/src/game/project-monster.ts +407 -0
  1024. package/src/game/project-obj.ts +298 -0
  1025. package/src/game/project-player.ts +236 -0
  1026. package/src/game/quest.ts +248 -0
  1027. package/src/game/ranged-cmd.ts +417 -0
  1028. package/src/game/scheduler.ts +150 -0
  1029. package/src/game/spell-cmd.ts +404 -0
  1030. package/src/game/spoil.ts +562 -0
  1031. package/src/game/steal.ts +169 -0
  1032. package/src/game/take-hit-hooks.ts +152 -0
  1033. package/src/game/target-loop.ts +501 -0
  1034. package/src/game/target.ts +424 -0
  1035. package/src/game/thrust.ts +174 -0
  1036. package/src/game/trap.ts +791 -0
  1037. package/src/game/ui-entry.ts +2075 -0
  1038. package/src/game/wizard.ts +1760 -0
  1039. package/src/game/world.ts +786 -0
  1040. package/src/gen/cave.ts +2858 -0
  1041. package/src/gen/gen-monster.ts +592 -0
  1042. package/src/gen/generate.ts +523 -0
  1043. package/src/gen/room.ts +2213 -0
  1044. package/src/gen/util.ts +1958 -0
  1045. package/src/generated/dun-profiles.ts +30 -0
  1046. package/src/generated/effects.ts +241 -0
  1047. package/src/generated/elements.ts +62 -0
  1048. package/src/generated/equip-slots.ts +36 -0
  1049. package/src/generated/history-types.ts +34 -0
  1050. package/src/generated/ignore-types.ts +66 -0
  1051. package/src/generated/index.ts +33 -0
  1052. package/src/generated/kind-flags.ts +44 -0
  1053. package/src/generated/message.ts +320 -0
  1054. package/src/generated/mon-message.ts +138 -0
  1055. package/src/generated/mon-race-flags.ts +182 -0
  1056. package/src/generated/mon-spells.ts +198 -0
  1057. package/src/generated/mon-temp-flags.ts +34 -0
  1058. package/src/generated/mon-timed.ts +34 -0
  1059. package/src/generated/object-flags.ts +95 -0
  1060. package/src/generated/object-modifiers.ts +43 -0
  1061. package/src/generated/options.ts +104 -0
  1062. package/src/generated/origins.ts +64 -0
  1063. package/src/generated/parser-errors.ts +140 -0
  1064. package/src/generated/player-flags.ts +48 -0
  1065. package/src/generated/player-timed.ts +118 -0
  1066. package/src/generated/projections.ts +103 -0
  1067. package/src/generated/randart-properties.ts +202 -0
  1068. package/src/generated/room-flags.ts +21 -0
  1069. package/src/generated/rooms.ts +50 -0
  1070. package/src/generated/square-flags.ts +56 -0
  1071. package/src/generated/stats.ts +22 -0
  1072. package/src/generated/terrain-flags.ts +76 -0
  1073. package/src/generated/terrain.ts +62 -0
  1074. package/src/generated/trap-flags.ts +42 -0
  1075. package/src/generated/tvals.ts +84 -0
  1076. package/src/generated/ui-entry-renderers.ts +24 -0
  1077. package/src/guard.ts +70 -0
  1078. package/src/host/args.ts +334 -0
  1079. package/src/host/bridge.ts +193 -0
  1080. package/src/host/index.ts +18 -0
  1081. package/src/host/io.ts +239 -0
  1082. package/src/host/memory.ts +134 -0
  1083. package/src/host/raw.ts +190 -0
  1084. package/src/index.ts +250 -0
  1085. package/src/loc.ts +157 -0
  1086. package/src/mod/hooks.ts +278 -0
  1087. package/src/mod/ids.ts +390 -0
  1088. package/src/mod/registry-host.ts +258 -0
  1089. package/src/mod/save-blocks.ts +787 -0
  1090. package/src/mod/vocabulary.ts +0 -0
  1091. package/src/mon/bind.ts +899 -0
  1092. package/src/mon/desc.ts +212 -0
  1093. package/src/mon/knowledge-groups.ts +164 -0
  1094. package/src/mon/lore-describe.ts +1414 -0
  1095. package/src/mon/lore.ts +306 -0
  1096. package/src/mon/make.ts +422 -0
  1097. package/src/mon/monster.ts +161 -0
  1098. package/src/mon/predicate.ts +220 -0
  1099. package/src/mon/project-mon.ts +855 -0
  1100. package/src/mon/spell.ts +418 -0
  1101. package/src/mon/steal.ts +246 -0
  1102. package/src/mon/summon.ts +145 -0
  1103. package/src/mon/take-hit.ts +195 -0
  1104. package/src/mon/timed.ts +300 -0
  1105. package/src/mon/types.ts +286 -0
  1106. package/src/msg.ts +146 -0
  1107. package/src/obj/artifact-fake.ts +63 -0
  1108. package/src/obj/artifact-known.ts +69 -0
  1109. package/src/obj/bind.ts +1345 -0
  1110. package/src/obj/chest.ts +249 -0
  1111. package/src/obj/desc.ts +699 -0
  1112. package/src/obj/effects-info.ts +349 -0
  1113. package/src/obj/flavor.ts +256 -0
  1114. package/src/obj/ignore.ts +387 -0
  1115. package/src/obj/knowledge.ts +1577 -0
  1116. package/src/obj/known-object.ts +718 -0
  1117. package/src/obj/make.ts +1367 -0
  1118. package/src/obj/object-info.ts +1737 -0
  1119. package/src/obj/object.ts +1296 -0
  1120. package/src/obj/power.ts +674 -0
  1121. package/src/obj/randart-build.ts +1705 -0
  1122. package/src/obj/randart-data.ts +1344 -0
  1123. package/src/obj/randart.ts +552 -0
  1124. package/src/obj/randname.ts +128 -0
  1125. package/src/obj/recharge.ts +62 -0
  1126. package/src/obj/types.ts +559 -0
  1127. package/src/obj/value.ts +215 -0
  1128. package/src/player/abilities.ts +142 -0
  1129. package/src/player/best-digger.ts +118 -0
  1130. package/src/player/bind.ts +1021 -0
  1131. package/src/player/birth.ts +794 -0
  1132. package/src/player/calcs.ts +1522 -0
  1133. package/src/player/combat-regen.ts +33 -0
  1134. package/src/player/exp.ts +275 -0
  1135. package/src/player/history.ts +211 -0
  1136. package/src/player/options.ts +244 -0
  1137. package/src/player/player.ts +356 -0
  1138. package/src/player/shape-lore.ts +250 -0
  1139. package/src/player/spell.ts +627 -0
  1140. package/src/player/take-hit.ts +173 -0
  1141. package/src/player/timed.ts +482 -0
  1142. package/src/player/types.ts +415 -0
  1143. package/src/rational.ts +388 -0
  1144. package/src/rng.ts +476 -0
  1145. package/src/save/buffer.ts +287 -0
  1146. package/src/save/compress.ts +132 -0
  1147. package/src/save/description.ts +70 -0
  1148. package/src/save/integrity.ts +133 -0
  1149. package/src/score/display.ts +125 -0
  1150. package/src/score/score.ts +341 -0
  1151. package/src/score/types.ts +104 -0
  1152. package/src/session/boot.ts +338 -0
  1153. package/src/session/game.ts +3712 -0
  1154. package/src/session/save.ts +2074 -0
  1155. package/src/sound/engine.ts +375 -0
  1156. package/src/sound/index.ts +13 -0
  1157. package/src/sound/sound-prefs-data.ts +173 -0
  1158. package/src/sound/types.ts +68 -0
  1159. package/src/store/bind.ts +145 -0
  1160. package/src/store/price.ts +97 -0
  1161. package/src/store/store-cmd.ts +73 -0
  1162. package/src/store/store.ts +723 -0
  1163. package/src/store/transact.ts +644 -0
  1164. package/src/store/types.ts +110 -0
  1165. package/src/version.ts +26 -0
  1166. package/src/visuals/engine.ts +444 -0
  1167. package/src/visuals/glyph-table.ts +191 -0
  1168. package/src/visuals/grafmode-data.ts +90 -0
  1169. package/src/visuals/grafmode.ts +123 -0
  1170. package/src/visuals/index.ts +19 -0
  1171. package/src/visuals/map-text.ts +152 -0
  1172. package/src/visuals/pref-expr.ts +182 -0
  1173. package/src/visuals/prefs.ts +981 -0
  1174. package/src/visuals/tile-prefs.ts +183 -0
  1175. package/src/world/chunk.ts +531 -0
  1176. package/src/world/feature.ts +215 -0
  1177. package/src/world/flow.ts +128 -0
  1178. package/src/world/project.ts +687 -0
  1179. package/src/world/projection.ts +228 -0
  1180. package/src/world/scatter.ts +72 -0
  1181. package/src/world/trap.ts +155 -0
  1182. package/src/world/view.ts +513 -0
  1183. package/src/z-queue.ts +300 -0
@@ -0,0 +1,981 @@
1
+ /**
2
+ * The pref-file subsystem, ported from reference/src/ui-prefs.c (Angband
3
+ * 4.2.6): the writer half (`prefs_save`, `remove_old_dump`, `pref_header` /
4
+ * `pref_footer` and the eight `dump_*` functions) and the reader half
5
+ * (`init_parse_prefs`'s line grammar, `process_pref_file_named`'s loop and
6
+ * `print_error`).
7
+ *
8
+ * ONE grammar, TWO consumers. Upstream has a single set of x_attr/x_char arrays
9
+ * and a single parser that writes into them; whether a value means "colour +
10
+ * glyph" or "atlas row + column" depends only on whether graphics are on. The
11
+ * port splits the STORAGE (GlyphTable for ASCII, TileMap for tiles - see
12
+ * glyph-table.ts for why) but must not split the GRAMMAR, so this module owns
13
+ * the decoders and drives an injected `PrefSink`; tile-prefs.ts is one sink over
14
+ * it and glyphTableSink() is the other. That keeps the `object:tval:*` wildcard,
15
+ * the `feat`/`trap` `*` lighting field, the `GF` `|` type list and the base-0
16
+ * integer rules in exactly one place.
17
+ *
18
+ * Values stay NUMERIC through the sink, as upstream's wchar_t does: the pref
19
+ * grammar writes the glyph as an integer (`0x%02X` for monsters, `%d` for
20
+ * feat/object/flavor) and a graphics pack's "char" is an atlas column, not text.
21
+ * The GlyphTable sink is what turns a code point into a string.
22
+ *
23
+ * Determinism: no RNG. Parsing and dumping are pure functions of their inputs.
24
+ */
25
+
26
+ import { colorCharToAttr, colorChannel, colorTextToAttr, COLOR_TABLE, BASIC_COLORS, MAX_COLORS } from "../color.js";
27
+ import { projNameToIdx } from "../effects/effect.js";
28
+ import { PARSE_ERROR, PARSER_ERROR_ENTRIES } from "../generated/index.js";
29
+ import { tvalFindIdx, tvalFindName } from "../obj/bind.js";
30
+ import type { ObjRegistry } from "../obj/bind.js";
31
+ import { messageLookupByName } from "../sound/engine.js";
32
+ import { lookupTrap } from "../world/trap.js";
33
+ import type { TrapKind } from "../world/trap.js";
34
+ import type { FeatureRegistry } from "../world/feature.js";
35
+ import { GlyphTable } from "./glyph-table.js";
36
+ import { prefExprBypasses } from "./pref-expr.js";
37
+ import type { PrefExprVars } from "./pref-expr.js";
38
+ import { BOLT, LIGHTING, TileMap } from "./tile-prefs.js";
39
+ import type { TileAtlas, TilePrefsDeps } from "./tile-prefs.js";
40
+
41
+ /* ------------------------------------------------------------------------
42
+ * Shared grammar
43
+ * ------------------------------------------------------------------------ */
44
+
45
+ /** The registries a pref line resolves names/tvals against. */
46
+ export interface PrefDeps {
47
+ features: FeatureRegistry;
48
+ objects: ObjRegistry;
49
+ /** MonsterRegistry: lookup_monster plus lookup_monster_base. */
50
+ monsters: {
51
+ raceByName(name: string): { ridx: number } | null;
52
+ races?: readonly { ridx: number; base: { name: string } }[];
53
+ };
54
+ /** Bound trap kinds (t_idx order), or null when the pack has none. */
55
+ traps: readonly TrapKind[] | null;
56
+ }
57
+
58
+ /**
59
+ * One `parser_error`, as print_error formats it (ui-prefs.c L1195-1202).
60
+ * `msg` is the offending token (parser_state.msg) and `error` the enum_parser
61
+ * error CODE, resolved to parser_error_str[]'s text by prefErrorMessage.
62
+ */
63
+ export interface PrefError {
64
+ line: number;
65
+ col: number;
66
+ msg: string;
67
+ error: number;
68
+ }
69
+
70
+ /**
71
+ * parser_error_str[] (parser.c L36-100), generated straight from
72
+ * list-parser-errors.h - the codegen'd table, NOT a hand-typed copy. Upstream
73
+ * spells several of these differently from the handler names ("invalid colour",
74
+ * "unrecognized tval"), which is exactly the sort of thing a transcription gets
75
+ * wrong.
76
+ */
77
+ export function parserErrorText(code: number): string {
78
+ return PARSER_ERROR_ENTRIES[code]?.description ?? "generic error";
79
+ }
80
+
81
+ /**
82
+ * Everything a parsed pref line can change. The six glyph directives are
83
+ * required (they are the reason both consumers exist); the rest are optional so
84
+ * a graphics-only sink can ignore them exactly as a graf-*.prf never uses them.
85
+ */
86
+ export interface PrefSink {
87
+ setFeat(lighting: number, fidx: number, attr: number, char: number): void;
88
+ setTrap(lighting: number, tidx: number, attr: number, char: number): void;
89
+ setMonster(ridx: number, attr: number, char: number): void;
90
+ setKind(kidx: number, attr: number, char: number): void;
91
+ setFlavor(fidx: number, attr: number, char: number): void;
92
+ setProjection(proj: number, motion: number, attr: number, char: number): void;
93
+
94
+ /** parse_prefs_inscribe -> add_autoinscription(kidx, text, true). */
95
+ addAutoinscription?(kidx: number, text: string): void;
96
+ /** parse_prefs_keymap_action: stash the action text for the next input line. */
97
+ keymapAct?(text: string): void;
98
+ /** parse_prefs_keymap_input -> keymap_add(mode, key, buffer, user). */
99
+ keymapInput?(mode: number, key: string, act: string): void;
100
+ /** parse_prefs_message -> message_color_define(msg_index, attr). */
101
+ messageColor?(msgIndex: number, attr: number): void;
102
+ /** parse_prefs_color -> angband_color_table[idx] = {k,r,g,b}. */
103
+ colorTable?(idx: number, k: number, r: number, g: number, b: number): void;
104
+ /** parse_prefs_window: the subwindow flag set finish_parse_prefs applies. */
105
+ windowFlag?(window: number, flag: number, value: number): void;
106
+ /** parse_prefs_entry_renderer -> ui_entry_renderer_customize. */
107
+ entryRenderer?(
108
+ name: string,
109
+ colors: string | null,
110
+ labelColors: string | null,
111
+ symbols: string | null,
112
+ ): void;
113
+ /** `%` include (parse_prefs_load): the referenced file's text, or null. */
114
+ loadFile?(name: string): string | null;
115
+ }
116
+
117
+ /**
118
+ * parse_int / parse_uint (parser.c L313-320: `strtol(tok, &z, 0)`), including
119
+ * strtol's LENIENCY, which is load-bearing: it skips leading whitespace, takes
120
+ * an optional sign, reads the longest valid base-0 digit run (0x/0X hex, a
121
+ * leading 0 as octal, otherwise decimal) and simply STOPS at the first
122
+ * character it cannot use. The parser reports NOT_NUMBER only when nothing at
123
+ * all was consumed (`z == tok`) - trailing text is discarded in silence.
124
+ *
125
+ * Requiring a clean token instead - which this did until 2026-07-31 - throws
126
+ * away every pref line with a trailing comment. Measured across the five
127
+ * bundled packs' 16 pref files: 132 such lines, ALL of them in
128
+ * shockbolt/xtra-shb.prf, and all 132 of them are the `monster:<player>` lines
129
+ * that end `0x83:0x87 # `. So Shockbolt's special player pictures never reached
130
+ * the tile map at all, whatever the character was.
131
+ *
132
+ * "0x" with no hex digits reads as the plain 0 that precedes it, and "08" as 0,
133
+ * both exactly as strtol does.
134
+ */
135
+ export function parsePrefNum(tok: string): number | null {
136
+ const m = /^\s*([-+]?)(?:0[xX]([0-9a-fA-F]+)|0([0-7]*)|([0-9]+))/.exec(tok);
137
+ if (!m) return null;
138
+ const sign = m[1] === "-" ? -1 : 1;
139
+ const mag =
140
+ m[2] !== undefined
141
+ ? parseInt(m[2], 16)
142
+ : m[3] !== undefined
143
+ ? m[3] === ""
144
+ ? 0
145
+ : parseInt(m[3], 8)
146
+ : parseInt(m[4]!, 10);
147
+ return sign * mag;
148
+ }
149
+
150
+ /**
151
+ * The lighting keyword -> LIGHTING index, LIGHTING.MAX for `*` ("all
152
+ * variants"), or -1 for an invalid keyword (ui-prefs.c L824-836).
153
+ */
154
+ export function prefLightingIdx(kw: string): number {
155
+ switch (kw) {
156
+ case "torch":
157
+ return LIGHTING.TORCH;
158
+ case "los":
159
+ return LIGHTING.LOS;
160
+ case "lit":
161
+ return LIGHTING.LIT;
162
+ case "dark":
163
+ return LIGHTING.DARK;
164
+ case "*":
165
+ return LIGHTING.MAX;
166
+ default:
167
+ return -1;
168
+ }
169
+ }
170
+
171
+ /** proj_name_to_idx("MAX") is PROJ_MAX, the projection table length. */
172
+ const PROJ_MAX = projNameToIdx("MAX");
173
+
174
+ /* ------------------------------------------------------------------------
175
+ * The line handlers
176
+ * ------------------------------------------------------------------------ */
177
+
178
+ /** A handler returns null on success, or an enum parser_error code. */
179
+ type Handler = (fields: string[], sink: PrefSink, deps: PrefDeps) => number | null;
180
+
181
+ /** Read the trailing `int attr int char` pair every glyph directive ends with. */
182
+ function attrChar(
183
+ fields: string[],
184
+ at: number,
185
+ ): { attr: number; char: number } | number {
186
+ const a = parsePrefNum(fields[at] ?? "");
187
+ const c = parsePrefNum(fields[at + 1] ?? "");
188
+ if (fields[at] === undefined || fields[at + 1] === undefined) {
189
+ return PARSE_ERROR.MISSING_FIELD;
190
+ }
191
+ if (a === null || c === null) return PARSE_ERROR.NOT_NUMBER;
192
+ return { attr: a, char: c };
193
+ }
194
+
195
+ /** parse_prefs_feat (ui-prefs.c L798-849). */
196
+ const parseFeat: Handler = (fields, sink, deps) => {
197
+ const [sym, lighting] = fields;
198
+ if (sym === undefined || lighting === undefined) return PARSE_ERROR.MISSING_FIELD;
199
+ const ac = attrChar(fields, 2);
200
+ if (typeof ac === "number") return ac;
201
+ /* lookup_feat_code, falling back to the printable name for pref files
202
+ * written before the post-4.2.4 terrain codes (L809-819). */
203
+ const feature = deps.features.lookupByCode(sym) ?? deps.features.lookupByName(sym);
204
+ if (!feature) return PARSE_ERROR.OUT_OF_BOUNDS;
205
+ const light = prefLightingIdx(lighting);
206
+ if (light < 0) return PARSE_ERROR.INVALID_LIGHTING;
207
+ sink.setFeat(light, feature.fidx, ac.attr, ac.char);
208
+ return null;
209
+ };
210
+
211
+ /** parse_prefs_trap (ui-prefs.c L745-796). */
212
+ const parseTrap: Handler = (fields, sink, deps) => {
213
+ const [idxSym, lighting] = fields;
214
+ if (idxSym === undefined || lighting === undefined) return PARSE_ERROR.MISSING_FIELD;
215
+ const ac = attrChar(fields, 2);
216
+ if (typeof ac === "number") return ac;
217
+ /* Upstream resolves the trap BEFORE the lighting keyword (L757-767). */
218
+ let tidx = -1;
219
+ if (idxSym !== "*") {
220
+ const trap = deps.traps ? lookupTrap(deps.traps, idxSym) : null;
221
+ if (!trap) return PARSE_ERROR.UNRECOGNISED_TRAP;
222
+ tidx = trap.tidx;
223
+ }
224
+ const light = prefLightingIdx(lighting);
225
+ if (light < 0) return PARSE_ERROR.INVALID_LIGHTING;
226
+ if (tidx < 0) {
227
+ /* trap:*: every trap kind (L784-789). */
228
+ for (let i = 0; i < (deps.traps?.length ?? 0); i++) {
229
+ sink.setTrap(light, i, ac.attr, ac.char);
230
+ }
231
+ } else {
232
+ sink.setTrap(light, tidx, ac.attr, ac.char);
233
+ }
234
+ return null;
235
+ };
236
+
237
+ /** parse_prefs_monster (ui-prefs.c L682-700). */
238
+ const parseMonster: Handler = (fields, sink, deps) => {
239
+ const name = fields[0];
240
+ if (name === undefined) return PARSE_ERROR.MISSING_FIELD;
241
+ const ac = attrChar(fields, 1);
242
+ if (typeof ac === "number") return ac;
243
+ const race = deps.monsters.raceByName(name);
244
+ if (!race) return PARSE_ERROR.NO_KIND_FOUND;
245
+ sink.setMonster(race.ridx, ac.attr, ac.char);
246
+ return null;
247
+ };
248
+
249
+ /**
250
+ * parse_prefs_monster_base (ui-prefs.c L702-731): re-glyph every race sharing
251
+ * a monster base. Never used by the bundled packs, but a user pref file can.
252
+ */
253
+ const parseMonsterBase: Handler = (fields, sink, deps) => {
254
+ const name = fields[0];
255
+ if (name === undefined) return PARSE_ERROR.MISSING_FIELD;
256
+ const ac = attrChar(fields, 1);
257
+ if (typeof ac === "number") return ac;
258
+ const races = deps.monsters.races;
259
+ if (!races) return PARSE_ERROR.NO_KIND_FOUND;
260
+ let found = false;
261
+ for (const race of races) {
262
+ if (race.base.name !== name) continue;
263
+ found = true;
264
+ sink.setMonster(race.ridx, ac.attr, ac.char);
265
+ }
266
+ /* lookup_monster_base misses -> NO_KIND_FOUND (L713-714). A base with no
267
+ * races cannot occur in bound gamedata, so "no race matched" IS the miss. */
268
+ return found ? null : PARSE_ERROR.NO_KIND_FOUND;
269
+ };
270
+
271
+ /** parse_prefs_object (ui-prefs.c L602-680), including both `*` wildcards. */
272
+ const parseObject: Handler = (fields, sink, deps) => {
273
+ const [tval, sval] = fields;
274
+ if (tval === undefined || sval === undefined) return PARSE_ERROR.MISSING_FIELD;
275
+ const ac = attrChar(fields, 2);
276
+ if (typeof ac === "number") return ac;
277
+
278
+ if (tval === "*") {
279
+ /* object:*:* - every kind AND every flavor (L614-634). */
280
+ if (sval !== "*") return PARSE_ERROR.UNRECOGNISED_SVAL;
281
+ for (const kind of deps.objects.kinds) sink.setKind(kind.kidx, ac.attr, ac.char);
282
+ for (const flavor of deps.objects.flavors) {
283
+ sink.setFlavor(flavor.fidx, ac.attr, ac.char);
284
+ }
285
+ return null;
286
+ }
287
+
288
+ const tvi = tvalFindIdx(tval);
289
+ if (tvi < 0) return PARSE_ERROR.UNRECOGNISED_TVAL;
290
+
291
+ if (sval === "*") {
292
+ /* object:tval:* - every kind and flavor of that tval (L640-661). */
293
+ for (const kind of deps.objects.kinds) {
294
+ if (kind.tval === tvi) sink.setKind(kind.kidx, ac.attr, ac.char);
295
+ }
296
+ for (const flavor of deps.objects.flavors) {
297
+ if (flavor.tval === tvi) sink.setFlavor(flavor.fidx, ac.attr, ac.char);
298
+ }
299
+ return null;
300
+ }
301
+
302
+ /* WART KEPT: an unknown sval is NOT an error here, deliberately - "no error
303
+ * at incorrect sval to stop failure due to outdated pref files" (L663-665),
304
+ * unlike parse_prefs_inscribe, which does report it. */
305
+ const svi = deps.objects.lookupSval(tvi, sval);
306
+ if (svi < 0) return null;
307
+ const kind = deps.objects.lookupKind(tvi, svi);
308
+ if (!kind) return null;
309
+ sink.setKind(kind.kidx, ac.attr, ac.char);
310
+ return null;
311
+ };
312
+
313
+ /** parse_prefs_flavor (ui-prefs.c L908-928): by flavour index. */
314
+ const parseFlavor: Handler = (fields, sink, deps) => {
315
+ const idx = parsePrefNum(fields[0] ?? "");
316
+ if (fields[0] === undefined) return PARSE_ERROR.MISSING_FIELD;
317
+ if (idx === null) return PARSE_ERROR.NOT_NUMBER;
318
+ const ac = attrChar(fields, 1);
319
+ if (typeof ac === "number") return ac;
320
+ /* The C walks the flavor list and stores only when the fidx exists; an
321
+ * unknown fidx is silently dropped, not reported (L921-926). */
322
+ if (!deps.objects.flavors.some((f) => f.fidx === idx)) return null;
323
+ sink.setFlavor(idx, ac.attr, ac.char);
324
+ return null;
325
+ };
326
+
327
+ /** parse_prefs_gf (ui-prefs.c L851-906). */
328
+ const parseGf: Handler = (fields, sink) => {
329
+ const [type, direction] = fields;
330
+ if (type === undefined || direction === undefined) return PARSE_ERROR.MISSING_FIELD;
331
+ const ac = attrChar(fields, 2);
332
+ if (typeof ac === "number") return ac;
333
+
334
+ /* A `|`- (or space-) separated list of PROJ_ names, or `*` for all. */
335
+ const projIdxs: number[] = [];
336
+ let all = false;
337
+ for (const t of type.split(/[| ]+/)) {
338
+ if (t.length === 0) continue;
339
+ if (t === "*") {
340
+ all = true;
341
+ break;
342
+ }
343
+ const idx = projNameToIdx(t);
344
+ if (idx === -1) return PARSE_ERROR.INVALID_VALUE;
345
+ projIdxs.push(idx);
346
+ }
347
+
348
+ let motion: number;
349
+ switch (direction) {
350
+ case "static":
351
+ motion = BOLT.NO_MOTION;
352
+ break;
353
+ case "0":
354
+ motion = BOLT.D0;
355
+ break;
356
+ case "45":
357
+ motion = BOLT.D45;
358
+ break;
359
+ case "90":
360
+ motion = BOLT.D90;
361
+ break;
362
+ case "135":
363
+ motion = BOLT.D135;
364
+ break;
365
+ default:
366
+ return PARSE_ERROR.INVALID_VALUE;
367
+ }
368
+
369
+ if (all) {
370
+ for (let i = 0; i < PROJ_MAX; i++) sink.setProjection(i, motion, ac.attr, ac.char);
371
+ } else {
372
+ for (const i of projIdxs) sink.setProjection(i, motion, ac.attr, ac.char);
373
+ }
374
+ return null;
375
+ };
376
+
377
+ /** parse_prefs_inscribe (ui-prefs.c L930-954). */
378
+ const parseInscribe: Handler = (fields, sink, deps) => {
379
+ const [tval, sval] = fields;
380
+ if (tval === undefined || sval === undefined) return PARSE_ERROR.MISSING_FIELD;
381
+ /* `str text` swallows the rest of the line, colons included. */
382
+ const text = fields.slice(2).join(":");
383
+ const tvi = tvalFindIdx(tval);
384
+ if (tvi < 0) return PARSE_ERROR.UNRECOGNISED_TVAL;
385
+ const svi = deps.objects.lookupSval(tvi, sval);
386
+ if (svi < 0) return PARSE_ERROR.UNRECOGNISED_SVAL;
387
+ const kind = deps.objects.lookupKind(tvi, svi);
388
+ if (!kind) return PARSE_ERROR.UNRECOGNISED_SVAL;
389
+ sink.addAutoinscription?.(kind.kidx, text);
390
+ return null;
391
+ };
392
+
393
+ /** parse_prefs_message (ui-prefs.c L994-1023). */
394
+ const parseMessage: Handler = (fields, sink) => {
395
+ const [type, attr] = fields;
396
+ if (type === undefined || attr === undefined) return PARSE_ERROR.MISSING_FIELD;
397
+ const msgIndex = messageLookupByName(type);
398
+ if (msgIndex < 0) return PARSE_ERROR.INVALID_MESSAGE;
399
+ /* A multi-character token is a colour NAME, one character a colour CHAR. */
400
+ const a = attr.length > 1 ? colorTextToAttr(attr) : colorCharToAttr(attr[0] ?? "");
401
+ if (a < 0) return PARSE_ERROR.INVALID_COLOR;
402
+ sink.messageColor?.(msgIndex, a);
403
+ return null;
404
+ };
405
+
406
+ /** parse_prefs_color (ui-prefs.c L1025-1052). */
407
+ const parseColor: Handler = (fields, sink) => {
408
+ const idx = parsePrefNum(fields[0] ?? "");
409
+ if (fields[0] === undefined) return PARSE_ERROR.MISSING_FIELD;
410
+ if (idx === null) return PARSE_ERROR.NOT_NUMBER;
411
+ if (idx >= MAX_COLORS) {
412
+ /* Indices that were in bounds for 4.2.4's 256-entry table are silently
413
+ * ignored for backwards compatibility; anything larger is reported. */
414
+ return idx < 256 ? null : PARSE_ERROR.OUT_OF_BOUNDS;
415
+ }
416
+ const nums: number[] = [];
417
+ for (let i = 1; i <= 4; i++) {
418
+ if (fields[i] === undefined) return PARSE_ERROR.MISSING_FIELD;
419
+ const n = parsePrefNum(fields[i] ?? "");
420
+ if (n === null) return PARSE_ERROR.NOT_NUMBER;
421
+ nums.push(n);
422
+ }
423
+ sink.colorTable?.(idx, nums[0]!, nums[1]!, nums[2]!, nums[3]!);
424
+ return null;
425
+ };
426
+
427
+ /**
428
+ * parse_prefs_window (ui-prefs.c L1054-1083). The port has ONE terminal, so the
429
+ * bound is ANGBAND_TERM_MAX purely to keep the grammar's error behaviour; the
430
+ * sink is what decides whether a subwindow flag means anything.
431
+ */
432
+ const ANGBAND_TERM_MAX = 8;
433
+ /** window_flag_desc[] length (ui-prefs.h / ui-display.c window_flag_desc). */
434
+ const WINDOW_FLAG_MAX = 32;
435
+
436
+ const parseWindow: Handler = (fields, sink) => {
437
+ const win = parsePrefNum(fields[0] ?? "");
438
+ const flag = parsePrefNum(fields[1] ?? "");
439
+ const value = parsePrefNum(fields[2] ?? "");
440
+ if (fields[0] === undefined || fields[1] === undefined || fields[2] === undefined) {
441
+ return PARSE_ERROR.MISSING_FIELD;
442
+ }
443
+ if (win === null || flag === null || value === null) return PARSE_ERROR.NOT_NUMBER;
444
+ if (win <= 0 || win >= ANGBAND_TERM_MAX) return PARSE_ERROR.OUT_OF_BOUNDS;
445
+ if (flag >= WINDOW_FLAG_MAX) return PARSE_ERROR.OUT_OF_BOUNDS;
446
+ sink.windowFlag?.(win, flag, value);
447
+ return null;
448
+ };
449
+
450
+ /** parse_prefs_entry_renderer (ui-prefs.c L1085-1122). */
451
+ const parseEntryRenderer: Handler = (fields, sink) => {
452
+ const name = fields[0];
453
+ if (name === undefined) return PARSE_ERROR.MISSING_FIELD;
454
+ const star = (v: string | undefined): string | null =>
455
+ v === undefined || v === "*" ? null : v;
456
+ sink.entryRenderer?.(name, star(fields[1]), star(fields[2]), fields[3] ?? null);
457
+ return null;
458
+ };
459
+
460
+ /* ------------------------------------------------------------------------
461
+ * process_pref_file
462
+ * ------------------------------------------------------------------------ */
463
+
464
+ const HANDLERS: Readonly<Record<string, Handler>> = {
465
+ object: parseObject,
466
+ monster: parseMonster,
467
+ "monster-base": parseMonsterBase,
468
+ feat: parseFeat,
469
+ trap: parseTrap,
470
+ GF: parseGf,
471
+ flavor: parseFlavor,
472
+ inscribe: parseInscribe,
473
+ message: parseMessage,
474
+ color: parseColor,
475
+ window: parseWindow,
476
+ "entry-renderer": parseEntryRenderer,
477
+ };
478
+
479
+ /** Options process_pref_file_named's caller controls. */
480
+ export interface ProcessPrefOptions {
481
+ /**
482
+ * The $VAR values `?` expression lines test. Upstream has exactly three -
483
+ * SYS, RACE and CLASS (ui-prefs.c L553-560) - and the graphics packs' player
484
+ * pictures are selected entirely by RACE and CLASS, so a caller that omits
485
+ * them gets whatever the pack's unconditional lines set.
486
+ */
487
+ vars?: PrefExprVars;
488
+ /**
489
+ * get_parser_error_limit(): stop after this many bad lines (0 = no limit).
490
+ * Upstream's default is 0 (ui-init.c / z-util), so every error is reported.
491
+ */
492
+ errorLimit?: number;
493
+ /** Recursion guard for `%` includes; upstream relies on the filesystem. */
494
+ depth?: number;
495
+ }
496
+
497
+ /**
498
+ * process_pref_file_named's parse loop (ui-prefs.c L1212-1262) over already-read
499
+ * text. Returns every parse error in order, so the caller can print each one
500
+ * through `print_error` and decide the boolean result (upstream: false if ANY
501
+ * line failed).
502
+ *
503
+ * A `#` line is a comment, a blank line is skipped, `%` includes another file
504
+ * through sink.loadFile, and `?` sets the bypass flag that makes every
505
+ * following handler a no-op until the next `?`.
506
+ */
507
+ export function processPrefText(
508
+ text: string,
509
+ deps: PrefDeps,
510
+ sink: PrefSink,
511
+ opts: ProcessPrefOptions = {},
512
+ ): PrefError[] {
513
+ const errors: PrefError[] = [];
514
+ const limit = opts.errorLimit ?? 0;
515
+ const depth = opts.depth ?? 0;
516
+ let bypass = false;
517
+ let keymapAct = "";
518
+ let lineNo = 0;
519
+
520
+ for (const raw of text.split("\n")) {
521
+ lineNo++;
522
+ const line = raw.replace(/\r$/, "");
523
+ if (line.length === 0 || line.startsWith("#")) continue;
524
+ const parts = line.split(":");
525
+ const dir = parts[0] ?? "";
526
+ const fields = parts.slice(1);
527
+ if (dir.length === 0) continue;
528
+
529
+ /* `?` is evaluated even inside a bypassed block - that is how a block ends
530
+ * (parse_prefs_expr has no bypass guard, ui-prefs.c L577). */
531
+ if (dir === "?") {
532
+ bypass = prefExprBypasses(fields.join(":"), opts.vars ?? {});
533
+ continue;
534
+ }
535
+ if (bypass) continue;
536
+
537
+ if (dir === "%") {
538
+ if (depth < 8) {
539
+ const nested = sink.loadFile?.(fields.join(":"));
540
+ if (nested !== null && nested !== undefined) {
541
+ errors.push(
542
+ ...processPrefText(nested, deps, sink, { ...opts, depth: depth + 1 }),
543
+ );
544
+ }
545
+ }
546
+ continue;
547
+ }
548
+ /* keymap-act stores into the parser's buffer; keymap-input consumes it. */
549
+ if (dir === "keymap-act") {
550
+ keymapAct = fields.join(":");
551
+ sink.keymapAct?.(keymapAct);
552
+ continue;
553
+ }
554
+ if (dir === "keymap-input") {
555
+ const mode = parsePrefNum(fields[0] ?? "");
556
+ if (fields[0] === undefined || fields[1] === undefined) {
557
+ errors.push(err(lineNo, dir, PARSE_ERROR.MISSING_FIELD));
558
+ } else if (mode === null) {
559
+ errors.push(err(lineNo, dir, PARSE_ERROR.NOT_NUMBER));
560
+ } else if (mode < 0 || mode >= 2) {
561
+ /* KEYMAP_MODE_MAX is 2 (ui-keymap.h). */
562
+ errors.push(err(lineNo, dir, PARSE_ERROR.OUT_OF_BOUNDS));
563
+ } else {
564
+ sink.keymapInput?.(mode, fields.slice(1).join(":"), keymapAct);
565
+ }
566
+ if (limit && errors.length >= limit) break;
567
+ continue;
568
+ }
569
+
570
+ const handler = HANDLERS[dir];
571
+ /* An unknown directive is upstream's PARSE_ERROR_UNDEFINED_DIRECTIVE; the
572
+ * sound parser registers its own, so an unhandled one is only an error when
573
+ * it is not a sound line. Keep it quiet, as the bundled prf files carry
574
+ * `sound:` lines this port has no mixer for. */
575
+ if (!handler) continue;
576
+ const e = handler(fields, sink, deps);
577
+ if (e !== null) {
578
+ errors.push(err(lineNo, dir, e));
579
+ if (limit && errors.length >= limit) break;
580
+ }
581
+ }
582
+ return errors;
583
+ }
584
+
585
+ /**
586
+ * parser_state's line/col/msg: upstream reports the column of the failing
587
+ * token, which its tokeniser tracks. This port reports the directive as `msg`
588
+ * and column 1, since it splits the whole line at once - the line number and
589
+ * the error text, which are what identify the bad line, are exact.
590
+ */
591
+ function err(line: number, directive: string, error: number): PrefError {
592
+ return { line, col: 1, msg: directive, error };
593
+ }
594
+
595
+ /** print_error's exact text (ui-prefs.c L1195-1202). */
596
+ export function prefErrorMessage(name: string, e: PrefError): string {
597
+ return `Parse error in ${name} line ${e.line} column ${e.col}: ${e.msg}: ${parserErrorText(
598
+ e.error,
599
+ )}`;
600
+ }
601
+
602
+ /* ------------------------------------------------------------------------
603
+ * The GlyphTable sink
604
+ * ------------------------------------------------------------------------ */
605
+
606
+ /**
607
+ * A PrefSink that writes the six glyph directives into a GlyphTable, turning
608
+ * each numeric char field into the string the table stores. The non-glyph
609
+ * directives are the caller's to supply (spread `...extra` over the result).
610
+ */
611
+ export function glyphTableSink(table: GlyphTable, extra: Partial<PrefSink> = {}): PrefSink {
612
+ const ch = (code: number): string => {
613
+ /* A pref file may write 0 for "leave blank"; String.fromCodePoint(0) is a
614
+ * NUL that no terminal draws, so keep it as a space, which is what a
615
+ * zeroed wchar_t renders as in the C's terminals. */
616
+ if (code <= 0) return " ";
617
+ try {
618
+ return String.fromCodePoint(code);
619
+ } catch {
620
+ return " ";
621
+ }
622
+ };
623
+ return {
624
+ setFeat: (lighting, fidx, attr, char) =>
625
+ table.setFeatGlyph(lighting, fidx, { attr, char: ch(char) }),
626
+ setTrap: (lighting, tidx, attr, char) =>
627
+ table.setTrapGlyph(lighting, tidx, { attr, char: ch(char) }),
628
+ setMonster: (ridx, attr, char) =>
629
+ table.setMonsterGlyph(ridx, { attr, char: ch(char) }),
630
+ setKind: (kidx, attr, char) => table.setKindGlyph(kidx, { attr, char: ch(char) }),
631
+ setFlavor: (fidx, attr, char) =>
632
+ table.setFlavorGlyph(fidx, { attr, char: ch(char) }),
633
+ /* The port keeps projection graphics in the TileMap only (there is no ASCII
634
+ * projection glyph table - the bolt animation draws its own character), so
635
+ * a GF line has nothing to write here. */
636
+ setProjection: () => {},
637
+ ...extra,
638
+ };
639
+ }
640
+
641
+ /* ------------------------------------------------------------------------
642
+ * The writer half
643
+ * ------------------------------------------------------------------------ */
644
+
645
+ /** dump_separator (ui-prefs.c L66). */
646
+ export const DUMP_SEPARATOR = "#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#";
647
+
648
+ /** pref_header (ui-prefs.c L153-163). */
649
+ export function prefHeader(mark: string): string {
650
+ return (
651
+ `${DUMP_SEPARATOR} begin ${mark}\n` +
652
+ "# *Warning!* The lines below are an automatic dump.\n" +
653
+ "# Don't edit them; changes will be deleted and replaced automatically.\n"
654
+ );
655
+ }
656
+
657
+ /** pref_footer (ui-prefs.c L165-176). */
658
+ export function prefFooter(mark: string): string {
659
+ return (
660
+ "# *Warning!* The lines above are an automatic dump.\n" +
661
+ "# Don't edit them; changes will be deleted and replaced automatically.\n" +
662
+ `${DUMP_SEPARATOR} end ${mark}\n`
663
+ );
664
+ }
665
+
666
+ /**
667
+ * remove_old_dump (ui-prefs.c L75-146) over text rather than two file handles:
668
+ * strip the lines between `<sep> begin <mark>` and `<sep> end <mark>`, the end
669
+ * marker included (`skip_one`). Returns null when nothing was between marks, so
670
+ * the caller can skip the file rotation exactly as the C destroys its temp file
671
+ * when `changed` stayed false.
672
+ */
673
+ export function removeOldDump(text: string, mark: string): string | null {
674
+ const startLine = `${DUMP_SEPARATOR} begin ${mark}`;
675
+ const endLine = `${DUMP_SEPARATOR} end ${mark}`;
676
+ let betweenMarks = false;
677
+ let changed = false;
678
+ const out: string[] = [];
679
+ for (const raw of text.split("\n")) {
680
+ const line = raw.replace(/\r$/, "");
681
+ let skipOne = false;
682
+ if (line === startLine) {
683
+ betweenMarks = true;
684
+ } else if (line === endLine) {
685
+ betweenMarks = false;
686
+ skipOne = true;
687
+ changed = true;
688
+ }
689
+ if (!betweenMarks && !skipOne) out.push(line);
690
+ }
691
+ if (!changed) return null;
692
+ /* file_getl drops the final newline, and the C writes each kept line back
693
+ * with file_putf("%s\n"), so a trailing empty element must not become a
694
+ * doubled blank line. */
695
+ if (out[out.length - 1] === "") out.pop();
696
+ return out.length > 0 ? `${out.join("\n")}\n` : "";
697
+ }
698
+
699
+ /**
700
+ * prefs_save (ui-prefs.c L391-421) against an injected file layer: strip any
701
+ * previous dump with the same title, then APPEND header + body + footer.
702
+ * Returns false when the file cannot be opened for append, exactly as the C
703
+ * does - which is what makes the caller print "Failed to save %s.".
704
+ */
705
+ export interface PrefsFileIO {
706
+ /** file_exists + a full read, or null when there is no such file. */
707
+ read(path: string): string | null;
708
+ /** file_open(MODE_WRITE) + write + close; false on any failure. */
709
+ write(path: string, text: string): boolean;
710
+ }
711
+
712
+ export function prefsSave(
713
+ io: PrefsFileIO,
714
+ path: string,
715
+ dump: () => string,
716
+ title: string,
717
+ ): boolean {
718
+ const existing = io.read(path);
719
+ let base = existing ?? "";
720
+ if (existing !== null) {
721
+ const stripped = removeOldDump(existing, title);
722
+ if (stripped !== null) base = stripped;
723
+ }
724
+ const body = `${prefHeader(title)}\n${dump()}\n${prefFooter(title)}`;
725
+ return io.write(path, base + body);
726
+ }
727
+
728
+ /* ----- the dump_* writers ----- */
729
+
730
+ /** The gamedata + live table a dump writer walks. */
731
+ export interface DumpDeps {
732
+ table: GlyphTable;
733
+ objects: ObjRegistry;
734
+ features: FeatureRegistry;
735
+ monsters: { races: readonly { ridx: number; name: string }[] };
736
+ /** get_autoinscription(kind, true): the AWARE note, or null. */
737
+ autoinscription?: (kidx: number) => string | null;
738
+ /** ui_entry_renderer_* enumeration, in index order. */
739
+ entryRenderers?: readonly {
740
+ name: string;
741
+ colors: string;
742
+ labelColors: string;
743
+ symbols: string;
744
+ }[];
745
+ }
746
+
747
+ /** The code point the pref grammar writes for a stored glyph string. */
748
+ function charCode(s: string): number {
749
+ return s.length > 0 ? (s.codePointAt(0) ?? 0) : 0;
750
+ }
751
+
752
+ /** dump_monsters (ui-prefs.c L178-192): `monster:%s:0x%02X:0x%02X`. */
753
+ export function dumpMonsters(deps: DumpDeps): string {
754
+ let out = "";
755
+ for (const race of deps.monsters.races) {
756
+ if (!race.name) continue;
757
+ const g = deps.table.monsterGlyph(race.ridx);
758
+ const attr = g?.attr ?? 0;
759
+ const chr = charCode(g?.char ?? "");
760
+ out += `monster:${race.name}:${hex2(attr)}:${hex2(chr)}\n`;
761
+ }
762
+ return out;
763
+ }
764
+
765
+ function hex2(n: number): string {
766
+ return `0x${n.toString(16).toUpperCase().padStart(2, "0")}`;
767
+ }
768
+
769
+ /**
770
+ * dump_objects (ui-prefs.c L197-215): a `# Objects` header then one line per
771
+ * named kind with a real tval, naming the kind by object_short_name.
772
+ */
773
+ export function dumpObjects(deps: DumpDeps): string {
774
+ let out = "# Objects\n";
775
+ for (const kind of deps.objects.kinds) {
776
+ if (!kind.name || !kind.tval) continue;
777
+ const g = deps.table.kindGlyph(kind.kidx);
778
+ out += `object:${tvalFindName(kind.tval)}:${objectShortName(kind.name)}:${
779
+ g?.attr ?? 0
780
+ }:${charCode(g?.char ?? "")}\n`;
781
+ }
782
+ return out;
783
+ }
784
+
785
+ /**
786
+ * object_short_name (obj-util.c L233-249): strip a leading `& ` article and
787
+ * every `~` pluralisation marker - the form a pref file's `object:` and
788
+ * `inscribe:` lines name a kind by, and the form parse_prefs_object's
789
+ * lookup_sval matches against.
790
+ */
791
+ export function objectShortName(name: string): string {
792
+ const body = name.startsWith("& ") ? name.slice(2) : name;
793
+ return body.replace(/~/g, "");
794
+ }
795
+
796
+ /** dump_autoinscriptions (ui-prefs.c L218-236): only AWARE notes are dumped. */
797
+ export function dumpAutoinscriptions(deps: DumpDeps): string {
798
+ let out = "";
799
+ for (const kind of deps.objects.kinds) {
800
+ if (!kind.name || !kind.tval) continue;
801
+ const note = deps.autoinscription?.(kind.kidx) ?? null;
802
+ if (note === null) continue;
803
+ out += `inscribe:${tvalFindName(kind.tval)}:${objectShortName(kind.name)}:${note}\n`;
804
+ }
805
+ return out;
806
+ }
807
+
808
+ /**
809
+ * dump_features (ui-prefs.c L239-276): a `# Terrain:` comment then one `feat:`
810
+ * line per lighting variant, skipping nameless and MIMIC features. The name in
811
+ * the line is the terrain CODE (get_feat_code_name), not the printable name.
812
+ *
813
+ * The C's keyword chain reads oddly - `if (TORCH) light="torch"; if (LOS)
814
+ * light="los"; else if (LIT) ... else if (DARK) ...` - the second `if` is not
815
+ * an `else if`. Re-derived: it is nonetheless correct, because none of LOS /
816
+ * LIT / DARK can equal TORCH, so the else-chain never runs on the pass that
817
+ * set "torch". Transcribed in the same shape rather than tidied, so the next
818
+ * reader can check the same thing against the same lines.
819
+ */
820
+ export function dumpFeatures(deps: DumpDeps): string {
821
+ const keyword = (j: number): string => {
822
+ let light = "";
823
+ if (j === LIGHTING.TORCH) light = "torch";
824
+ if (j === LIGHTING.LOS) light = "los";
825
+ else if (j === LIGHTING.LIT) light = "lit";
826
+ else if (j === LIGHTING.DARK) light = "dark";
827
+ return light;
828
+ };
829
+ let out = "";
830
+ for (const feat of deps.features.allFeatures()) {
831
+ if (!feat.name) continue;
832
+ if (feat.mimic !== null) continue;
833
+ out += `# Terrain: ${feat.name}\n`;
834
+ for (let j = 0; j < LIGHTING.MAX; j++) {
835
+ const g = deps.table.featGlyph(j, feat.fidx);
836
+ out += `feat:${feat.code}:${keyword(j)}:${g?.attr ?? 0}:${charCode(
837
+ g?.char ?? "",
838
+ )}\n`;
839
+ }
840
+ }
841
+ return out;
842
+ }
843
+
844
+ /** dump_flavors (ui-prefs.c L279-292): a comment plus a blank line per flavour. */
845
+ export function dumpFlavors(deps: DumpDeps): string {
846
+ let out = "";
847
+ for (const flavor of deps.objects.flavors) {
848
+ const g = deps.table.flavorGlyph(flavor.fidx);
849
+ out += `# Item flavor: ${flavor.text}\n`;
850
+ out += `flavor:${flavor.fidx}:${g?.attr ?? 0}:${charCode(g?.char ?? "")}\n\n`;
851
+ }
852
+ return out;
853
+ }
854
+
855
+ /**
856
+ * dump_colors (ui-prefs.c L295-320): every colour row, skipping all-zero rows
857
+ * at or past BASIC_COLORS. Only basic colours get their table name.
858
+ */
859
+ export function dumpColors(): string {
860
+ let out = "";
861
+ for (let i = 0; i < MAX_COLORS; i++) {
862
+ const kv = colorChannel(i, 0);
863
+ const rv = colorChannel(i, 1);
864
+ const gv = colorChannel(i, 2);
865
+ const bv = colorChannel(i, 3);
866
+ if (!kv && !rv && !gv && !bv && i >= BASIC_COLORS) continue;
867
+ const name = i < BASIC_COLORS ? COLOR_TABLE[i]?.name ?? "unknown" : "unknown";
868
+ out += `# Color: ${name}\n`;
869
+ out += `color:${i}:${kv}:${rv}:${gv}:${bv}\n\n`;
870
+ }
871
+ return out;
872
+ }
873
+
874
+ /** dump_ui_entry_renderers (ui-prefs.c L323-349). */
875
+ export function dumpUiEntryRenderers(deps: DumpDeps): string {
876
+ let out =
877
+ "# Renderers for parts of the character screen.\n" +
878
+ "# Format entry-renderer:name:colors:label_colors:symbols\n" +
879
+ "# Use * for colors or label_colors to leave those unchanged\n" +
880
+ "# Leave off symbols and the colon before it to leave those unchanged\n" +
881
+ "# Look at lib/gamedata/ui_entry_renderers.txt for more information\n" +
882
+ "# about how colors, label_colors, and symbols are used\n";
883
+ for (const r of deps.entryRenderers ?? []) {
884
+ out += `entry-renderer:${r.name}:${r.colors}:${r.labelColors}:${r.symbols}\n`;
885
+ }
886
+ return out;
887
+ }
888
+
889
+ /**
890
+ * option_dump (ui-prefs.c L352-386): the SUBWINDOW flag set, not the game
891
+ * options - the row that drives it is labelled "Save subwindow setup to pref
892
+ * file". The port is one terminal with no subwindows, so there is nothing to
893
+ * enumerate and the dump is its header alone, which is exactly what upstream
894
+ * writes when no angband_term[i>0] exists (a single-window build).
895
+ */
896
+ export function optionDump(): string {
897
+ return "# Options\n\n";
898
+ }
899
+
900
+ /* ------------------------------------------------------------------------
901
+ * The TileMap sink (the graphics interpretation of the same grammar)
902
+ * ------------------------------------------------------------------------ */
903
+
904
+ /**
905
+ * A PrefSink (prefs.ts) that writes into a TileMap: the graphics-mode
906
+ * interpretation of the very same x_attr/x_char slots the ASCII GlyphTable
907
+ * sink fills. The grammar - the `object:tval:*` wildcards, the `*` lighting
908
+ * field, the `GF` `|` type list, base-0 integers, `%` includes - lives in
909
+ * prefs.ts and is shared, because upstream has exactly one parser for it.
910
+ * Values stay raw here (high bit and all): decoding attr/char to an atlas
911
+ * (row, col) is the front end's job, exactly as upstream keeps the raw bytes.
912
+ *
913
+ * setProjection is the one slot the ASCII sink has nothing to write to, since
914
+ * the port's bolt animation draws its own character rather than reading a
915
+ * proj_to_char table.
916
+ */
917
+ export function tileMapSink(map: TileMap, deps: TilePrefsDeps): PrefSink {
918
+ const setPerLighting = (
919
+ table: (TileAtlas | undefined)[][],
920
+ lightIdx: number,
921
+ idx: number,
922
+ atlas: TileAtlas,
923
+ ): void => {
924
+ if (lightIdx < LIGHTING.MAX) {
925
+ (table[lightIdx] as (TileAtlas | undefined)[])[idx] = atlas;
926
+ } else {
927
+ for (let j = 0; j < LIGHTING.MAX; j++) {
928
+ (table[j] as (TileAtlas | undefined)[])[idx] = atlas;
929
+ }
930
+ }
931
+ };
932
+ return {
933
+ setFeat: (lighting, fidx, attr, char) =>
934
+ setPerLighting(map.feat, lighting, fidx, { attr, char }),
935
+ setTrap: (lighting, tidx, attr, char) =>
936
+ setPerLighting(map.trap, lighting, tidx, { attr, char }),
937
+ setMonster: (ridx, attr, char) => {
938
+ map.monster[ridx] = { attr, char };
939
+ },
940
+ setKind: (kidx, attr, char) => {
941
+ map.object[kidx] = { attr, char };
942
+ },
943
+ setFlavor: (fidx, attr, char) => {
944
+ map.flavor[fidx] = { attr, char };
945
+ },
946
+ setProjection: (proj, motion, attr, char) => {
947
+ (map.gf[proj] as (TileAtlas | undefined)[])[motion] = { attr, char };
948
+ },
949
+ ...(deps.loadFile ? { loadFile: deps.loadFile } : {}),
950
+ };
951
+ }
952
+
953
+ /**
954
+ * Parse a graf-*.prf or flvr-*.prf text INTO an existing TileMap (so a graf
955
+ * file and its flvr file layer into one map). Later lines overwrite earlier
956
+ * ones for the same entity, exactly as the C reassigns the x_attr/x_char slot.
957
+ *
958
+ * Parse errors are dropped rather than reported: a graphics pref is loaded by
959
+ * reset_visuals(true) with `quiet` semantics, and an entity this build does not
960
+ * know simply keeps its ASCII glyph. `processPrefText` returns them for the
961
+ * user-pref path, which does print them.
962
+ */
963
+ export function parseTilePrefsInto(
964
+ map: TileMap,
965
+ text: string,
966
+ deps: TilePrefsDeps,
967
+ ): void {
968
+ /* deps.vars is what selects the pack's player picture: the `?:` blocks in
969
+ * xtra-*.prf test $RACE and $CLASS, and with neither supplied only the pack's
970
+ * unconditional monster:<player> line survives. */
971
+ processPrefText(text, deps as PrefDeps, tileMapSink(map, deps), {
972
+ ...(deps.vars ? { vars: deps.vars } : {}),
973
+ });
974
+ }
975
+
976
+ /** Parse pref text into a fresh TileMap. */
977
+ export function parseTilePrefs(text: string, deps: TilePrefsDeps): TileMap {
978
+ const map = new TileMap();
979
+ parseTilePrefsInto(map, text, deps);
980
+ return map;
981
+ }