@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.
- package/LICENSE.md +43 -0
- package/README.md +80 -0
- package/dist/agent/act.d.ts +22 -0
- package/dist/agent/act.d.ts.map +1 -0
- package/dist/agent/act.js +88 -0
- package/dist/agent/act.js.map +1 -0
- package/dist/agent/controller.d.ts +34 -0
- package/dist/agent/controller.d.ts.map +1 -0
- package/dist/agent/controller.js +90 -0
- package/dist/agent/controller.js.map +1 -0
- package/dist/agent/events.d.ts +27 -0
- package/dist/agent/events.d.ts.map +1 -0
- package/dist/agent/events.js +31 -0
- package/dist/agent/events.js.map +1 -0
- package/dist/agent/index.d.ts +17 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +15 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/perceive.d.ts +21 -0
- package/dist/agent/perceive.d.ts.map +1 -0
- package/dist/agent/perceive.js +386 -0
- package/dist/agent/perceive.js.map +1 -0
- package/dist/agent/types.d.ts +436 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +63 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/bitflag.d.ts +199 -0
- package/dist/bitflag.d.ts.map +1 -0
- package/dist/bitflag.js +478 -0
- package/dist/bitflag.js.map +1 -0
- package/dist/cmd.d.ts +164 -0
- package/dist/cmd.d.ts.map +1 -0
- package/dist/cmd.js +350 -0
- package/dist/cmd.js.map +1 -0
- package/dist/color.d.ts +104 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +240 -0
- package/dist/color.js.map +1 -0
- package/dist/combat/brand-slay.d.ts +119 -0
- package/dist/combat/brand-slay.d.ts.map +1 -0
- package/dist/combat/brand-slay.js +264 -0
- package/dist/combat/brand-slay.js.map +1 -0
- package/dist/combat/hit.d.ts +198 -0
- package/dist/combat/hit.d.ts.map +1 -0
- package/dist/combat/hit.js +310 -0
- package/dist/combat/hit.js.map +1 -0
- package/dist/combat/index.d.ts +15 -0
- package/dist/combat/index.d.ts.map +1 -0
- package/dist/combat/index.js +15 -0
- package/dist/combat/index.js.map +1 -0
- package/dist/combat/melee.d.ts +261 -0
- package/dist/combat/melee.d.ts.map +1 -0
- package/dist/combat/melee.js +402 -0
- package/dist/combat/melee.js.map +1 -0
- package/dist/combat/mon-melee.d.ts +233 -0
- package/dist/combat/mon-melee.d.ts.map +1 -0
- package/dist/combat/mon-melee.js +883 -0
- package/dist/combat/mon-melee.js.map +1 -0
- package/dist/combat/ranged.d.ts +89 -0
- package/dist/combat/ranged.d.ts.map +1 -0
- package/dist/combat/ranged.js +253 -0
- package/dist/combat/ranged.js.map +1 -0
- package/dist/constants.d.ts +134 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +171 -0
- package/dist/constants.js.map +1 -0
- package/dist/dice.d.ts +91 -0
- package/dist/dice.d.ts.map +1 -0
- package/dist/dice.js +424 -0
- package/dist/dice.js.map +1 -0
- package/dist/effects/effect-choice.d.ts +15 -0
- package/dist/effects/effect-choice.d.ts.map +1 -0
- package/dist/effects/effect-choice.js +18 -0
- package/dist/effects/effect-choice.js.map +1 -0
- package/dist/effects/effect-info.d.ts +124 -0
- package/dist/effects/effect-info.d.ts.map +1 -0
- package/dist/effects/effect-info.js +706 -0
- package/dist/effects/effect-info.js.map +1 -0
- package/dist/effects/effect.d.ts +165 -0
- package/dist/effects/effect.d.ts.map +1 -0
- package/dist/effects/effect.js +452 -0
- package/dist/effects/effect.js.map +1 -0
- package/dist/effects/handlers.d.ts +70 -0
- package/dist/effects/handlers.d.ts.map +1 -0
- package/dist/effects/handlers.js +394 -0
- package/dist/effects/handlers.js.map +1 -0
- package/dist/effects/interpreter.d.ts +291 -0
- package/dist/effects/interpreter.d.ts.map +1 -0
- package/dist/effects/interpreter.js +325 -0
- package/dist/effects/interpreter.js.map +1 -0
- package/dist/events.d.ts +188 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +138 -0
- package/dist/events.js.map +1 -0
- package/dist/expression.d.ts +83 -0
- package/dist/expression.d.ts.map +1 -0
- package/dist/expression.js +333 -0
- package/dist/expression.js.map +1 -0
- package/dist/game/cave-cmd.d.ts +195 -0
- package/dist/game/cave-cmd.d.ts.map +1 -0
- package/dist/game/cave-cmd.js +968 -0
- package/dist/game/cave-cmd.js.map +1 -0
- package/dist/game/char-sheet.d.ts +189 -0
- package/dist/game/char-sheet.d.ts.map +1 -0
- package/dist/game/char-sheet.js +381 -0
- package/dist/game/char-sheet.js.map +1 -0
- package/dist/game/chest.d.ts +94 -0
- package/dist/game/chest.d.ts.map +1 -0
- package/dist/game/chest.js +267 -0
- package/dist/game/chest.js.map +1 -0
- package/dist/game/context.d.ts +970 -0
- package/dist/game/context.d.ts.map +1 -0
- package/dist/game/context.js +353 -0
- package/dist/game/context.js.map +1 -0
- package/dist/game/curse-tick.d.ts +35 -0
- package/dist/game/curse-tick.d.ts.map +1 -0
- package/dist/game/curse-tick.js +100 -0
- package/dist/game/curse-tick.js.map +1 -0
- package/dist/game/describe.d.ts +20 -0
- package/dist/game/describe.d.ts.map +1 -0
- package/dist/game/describe.js +45 -0
- package/dist/game/describe.js.map +1 -0
- package/dist/game/display.d.ts +196 -0
- package/dist/game/display.d.ts.map +1 -0
- package/dist/game/display.js +684 -0
- package/dist/game/display.js.map +1 -0
- package/dist/game/dump-level.d.ts +37 -0
- package/dist/game/dump-level.d.ts.map +1 -0
- package/dist/game/dump-level.js +110 -0
- package/dist/game/dump-level.js.map +1 -0
- package/dist/game/effect-attack.d.ts +36 -0
- package/dist/game/effect-attack.d.ts.map +1 -0
- package/dist/game/effect-attack.js +694 -0
- package/dist/game/effect-attack.js.map +1 -0
- package/dist/game/effect-detect.d.ts +34 -0
- package/dist/game/effect-detect.d.ts.map +1 -0
- package/dist/game/effect-detect.js +456 -0
- package/dist/game/effect-detect.js.map +1 -0
- package/dist/game/effect-env.d.ts +77 -0
- package/dist/game/effect-env.d.ts.map +1 -0
- package/dist/game/effect-env.js +166 -0
- package/dist/game/effect-env.js.map +1 -0
- package/dist/game/effect-game-env.d.ts +76 -0
- package/dist/game/effect-game-env.d.ts.map +1 -0
- package/dist/game/effect-game-env.js +23 -0
- package/dist/game/effect-game-env.js.map +1 -0
- package/dist/game/effect-general.d.ts +98 -0
- package/dist/game/effect-general.d.ts.map +1 -0
- package/dist/game/effect-general.js +914 -0
- package/dist/game/effect-general.js.map +1 -0
- package/dist/game/effect-item.d.ts +124 -0
- package/dist/game/effect-item.d.ts.map +1 -0
- package/dist/game/effect-item.js +789 -0
- package/dist/game/effect-item.js.map +1 -0
- package/dist/game/effect-melee.d.ts +43 -0
- package/dist/game/effect-melee.d.ts.map +1 -0
- package/dist/game/effect-melee.js +477 -0
- package/dist/game/effect-melee.js.map +1 -0
- package/dist/game/effect-mon-origin.d.ts +67 -0
- package/dist/game/effect-mon-origin.d.ts.map +1 -0
- package/dist/game/effect-mon-origin.js +164 -0
- package/dist/game/effect-mon-origin.js.map +1 -0
- package/dist/game/effect-monster.d.ts +29 -0
- package/dist/game/effect-monster.d.ts.map +1 -0
- package/dist/game/effect-monster.js +281 -0
- package/dist/game/effect-monster.js.map +1 -0
- package/dist/game/effect-summon.d.ts +37 -0
- package/dist/game/effect-summon.d.ts.map +1 -0
- package/dist/game/effect-summon.js +113 -0
- package/dist/game/effect-summon.js.map +1 -0
- package/dist/game/effect-teleport.d.ts +130 -0
- package/dist/game/effect-teleport.d.ts.map +1 -0
- package/dist/game/effect-teleport.js +529 -0
- package/dist/game/effect-teleport.js.map +1 -0
- package/dist/game/effect-terrain.d.ts +91 -0
- package/dist/game/effect-terrain.d.ts.map +1 -0
- package/dist/game/effect-terrain.js +812 -0
- package/dist/game/effect-terrain.js.map +1 -0
- package/dist/game/energy.d.ts +45 -0
- package/dist/game/energy.d.ts.map +1 -0
- package/dist/game/energy.js +51 -0
- package/dist/game/energy.js.map +1 -0
- package/dist/game/equip-cmp.d.ts +138 -0
- package/dist/game/equip-cmp.d.ts.map +1 -0
- package/dist/game/equip-cmp.js +363 -0
- package/dist/game/equip-cmp.js.map +1 -0
- package/dist/game/floor.d.ts +182 -0
- package/dist/game/floor.d.ts.map +1 -0
- package/dist/game/floor.js +435 -0
- package/dist/game/floor.js.map +1 -0
- package/dist/game/gear.d.ts +408 -0
- package/dist/game/gear.d.ts.map +1 -0
- package/dist/game/gear.js +1037 -0
- package/dist/game/gear.js.map +1 -0
- package/dist/game/harness.d.ts +61 -0
- package/dist/game/harness.d.ts.map +1 -0
- package/dist/game/harness.js +198 -0
- package/dist/game/harness.js.map +1 -0
- package/dist/game/history.d.ts +49 -0
- package/dist/game/history.d.ts.map +1 -0
- package/dist/game/history.js +55 -0
- package/dist/game/history.js.map +1 -0
- package/dist/game/ignore-cmd.d.ts +42 -0
- package/dist/game/ignore-cmd.d.ts.map +1 -0
- package/dist/game/ignore-cmd.js +59 -0
- package/dist/game/ignore-cmd.js.map +1 -0
- package/dist/game/inscription-confirm.d.ts +80 -0
- package/dist/game/inscription-confirm.d.ts.map +1 -0
- package/dist/game/inscription-confirm.js +95 -0
- package/dist/game/inscription-confirm.js.map +1 -0
- package/dist/game/known.d.ts +297 -0
- package/dist/game/known.d.ts.map +1 -0
- package/dist/game/known.js +849 -0
- package/dist/game/known.js.map +1 -0
- package/dist/game/loop.d.ts +139 -0
- package/dist/game/loop.d.ts.map +1 -0
- package/dist/game/loop.js +631 -0
- package/dist/game/loop.js.map +1 -0
- package/dist/game/lore-color.d.ts +25 -0
- package/dist/game/lore-color.d.ts.map +1 -0
- package/dist/game/lore-color.js +95 -0
- package/dist/game/lore-color.js.map +1 -0
- package/dist/game/mon-cast.d.ts +150 -0
- package/dist/game/mon-cast.d.ts.map +1 -0
- package/dist/game/mon-cast.js +301 -0
- package/dist/game/mon-cast.js.map +1 -0
- package/dist/game/mon-cmd.d.ts +51 -0
- package/dist/game/mon-cmd.d.ts.map +1 -0
- package/dist/game/mon-cmd.js +670 -0
- package/dist/game/mon-cmd.js.map +1 -0
- package/dist/game/mon-death.d.ts +143 -0
- package/dist/game/mon-death.d.ts.map +1 -0
- package/dist/game/mon-death.js +328 -0
- package/dist/game/mon-death.js.map +1 -0
- package/dist/game/mon-group.d.ts +81 -0
- package/dist/game/mon-group.d.ts.map +1 -0
- package/dist/game/mon-group.js +323 -0
- package/dist/game/mon-group.js.map +1 -0
- package/dist/game/mon-list.d.ts +85 -0
- package/dist/game/mon-list.d.ts.map +1 -0
- package/dist/game/mon-list.js +154 -0
- package/dist/game/mon-list.js.map +1 -0
- package/dist/game/mon-message.d.ts +100 -0
- package/dist/game/mon-message.d.ts.map +1 -0
- package/dist/game/mon-message.js +336 -0
- package/dist/game/mon-message.js.map +1 -0
- package/dist/game/mon-place.d.ts +226 -0
- package/dist/game/mon-place.d.ts.map +1 -0
- package/dist/game/mon-place.js +642 -0
- package/dist/game/mon-place.js.map +1 -0
- package/dist/game/mon-ranged.d.ts +87 -0
- package/dist/game/mon-ranged.d.ts.map +1 -0
- package/dist/game/mon-ranged.js +353 -0
- package/dist/game/mon-ranged.js.map +1 -0
- package/dist/game/mon-shape.d.ts +43 -0
- package/dist/game/mon-shape.d.ts.map +1 -0
- package/dist/game/mon-shape.js +115 -0
- package/dist/game/mon-shape.js.map +1 -0
- package/dist/game/mon-side.d.ts +63 -0
- package/dist/game/mon-side.d.ts.map +1 -0
- package/dist/game/mon-side.js +403 -0
- package/dist/game/mon-side.js.map +1 -0
- package/dist/game/monster-turn.d.ts +195 -0
- package/dist/game/monster-turn.d.ts.map +1 -0
- package/dist/game/monster-turn.js +1560 -0
- package/dist/game/monster-turn.js.map +1 -0
- package/dist/game/obj-cmd.d.ts +453 -0
- package/dist/game/obj-cmd.d.ts.map +1 -0
- package/dist/game/obj-cmd.js +1530 -0
- package/dist/game/obj-cmd.js.map +1 -0
- package/dist/game/obj-list.d.ts +92 -0
- package/dist/game/obj-list.d.ts.map +1 -0
- package/dist/game/obj-list.js +251 -0
- package/dist/game/obj-list.js.map +1 -0
- package/dist/game/object-inspect.d.ts +37 -0
- package/dist/game/object-inspect.d.ts.map +1 -0
- package/dist/game/object-inspect.js +106 -0
- package/dist/game/object-inspect.js.map +1 -0
- package/dist/game/pickup.d.ts +126 -0
- package/dist/game/pickup.d.ts.map +1 -0
- package/dist/game/pickup.js +367 -0
- package/dist/game/pickup.js.map +1 -0
- package/dist/game/player-path.d.ts +133 -0
- package/dist/game/player-path.d.ts.map +1 -0
- package/dist/game/player-path.js +1268 -0
- package/dist/game/player-path.js.map +1 -0
- package/dist/game/player-side.d.ts +59 -0
- package/dist/game/player-side.d.ts.map +1 -0
- package/dist/game/player-side.js +506 -0
- package/dist/game/player-side.js.map +1 -0
- package/dist/game/player-turn.d.ts +161 -0
- package/dist/game/player-turn.d.ts.map +1 -0
- package/dist/game/player-turn.js +739 -0
- package/dist/game/player-turn.js.map +1 -0
- package/dist/game/project-cast.d.ts +268 -0
- package/dist/game/project-cast.d.ts.map +1 -0
- package/dist/game/project-cast.js +496 -0
- package/dist/game/project-cast.js.map +1 -0
- package/dist/game/project-feat.d.ts +47 -0
- package/dist/game/project-feat.d.ts.map +1 -0
- package/dist/game/project-feat.js +350 -0
- package/dist/game/project-feat.js.map +1 -0
- package/dist/game/project-monster.d.ts +106 -0
- package/dist/game/project-monster.d.ts.map +1 -0
- package/dist/game/project-monster.js +272 -0
- package/dist/game/project-monster.js.map +1 -0
- package/dist/game/project-obj.d.ts +60 -0
- package/dist/game/project-obj.d.ts.map +1 -0
- package/dist/game/project-obj.js +245 -0
- package/dist/game/project-obj.js.map +1 -0
- package/dist/game/project-player.d.ts +120 -0
- package/dist/game/project-player.d.ts.map +1 -0
- package/dist/game/project-player.js +108 -0
- package/dist/game/project-player.js.map +1 -0
- package/dist/game/quest.d.ts +101 -0
- package/dist/game/quest.d.ts.map +1 -0
- package/dist/game/quest.js +192 -0
- package/dist/game/quest.js.map +1 -0
- package/dist/game/ranged-cmd.d.ts +32 -0
- package/dist/game/ranged-cmd.d.ts.map +1 -0
- package/dist/game/ranged-cmd.js +372 -0
- package/dist/game/ranged-cmd.js.map +1 -0
- package/dist/game/scheduler.d.ts +47 -0
- package/dist/game/scheduler.d.ts.map +1 -0
- package/dist/game/scheduler.js +141 -0
- package/dist/game/scheduler.js.map +1 -0
- package/dist/game/spell-cmd.d.ts +104 -0
- package/dist/game/spell-cmd.d.ts.map +1 -0
- package/dist/game/spell-cmd.js +320 -0
- package/dist/game/spell-cmd.js.map +1 -0
- package/dist/game/spoil.d.ts +28 -0
- package/dist/game/spoil.d.ts.map +1 -0
- package/dist/game/spoil.js +435 -0
- package/dist/game/spoil.js.map +1 -0
- package/dist/game/steal.d.ts +35 -0
- package/dist/game/steal.d.ts.map +1 -0
- package/dist/game/steal.js +145 -0
- package/dist/game/steal.js.map +1 -0
- package/dist/game/take-hit-hooks.d.ts +52 -0
- package/dist/game/take-hit-hooks.d.ts.map +1 -0
- package/dist/game/take-hit-hooks.js +127 -0
- package/dist/game/take-hit-hooks.js.map +1 -0
- package/dist/game/target-loop.d.ts +119 -0
- package/dist/game/target-loop.d.ts.map +1 -0
- package/dist/game/target-loop.js +408 -0
- package/dist/game/target-loop.js.map +1 -0
- package/dist/game/target.d.ts +133 -0
- package/dist/game/target.d.ts.map +1 -0
- package/dist/game/target.js +353 -0
- package/dist/game/target.js.map +1 -0
- package/dist/game/thrust.d.ts +37 -0
- package/dist/game/thrust.d.ts.map +1 -0
- package/dist/game/thrust.js +155 -0
- package/dist/game/thrust.js.map +1 -0
- package/dist/game/trap.d.ts +218 -0
- package/dist/game/trap.d.ts.map +1 -0
- package/dist/game/trap.js +618 -0
- package/dist/game/trap.js.map +1 -0
- package/dist/game/ui-entry.d.ts +282 -0
- package/dist/game/ui-entry.d.ts.map +1 -0
- package/dist/game/ui-entry.js +1838 -0
- package/dist/game/ui-entry.js.map +1 -0
- package/dist/game/wizard.d.ts +654 -0
- package/dist/game/wizard.d.ts.map +1 -0
- package/dist/game/wizard.js +1323 -0
- package/dist/game/wizard.js.map +1 -0
- package/dist/game/world.d.ts +183 -0
- package/dist/game/world.d.ts.map +1 -0
- package/dist/game/world.js +685 -0
- package/dist/game/world.js.map +1 -0
- package/dist/gen/cave.d.ts +247 -0
- package/dist/gen/cave.d.ts.map +1 -0
- package/dist/gen/cave.js +2406 -0
- package/dist/gen/cave.js.map +1 -0
- package/dist/gen/gen-monster.d.ts +151 -0
- package/dist/gen/gen-monster.d.ts.map +1 -0
- package/dist/gen/gen-monster.js +473 -0
- package/dist/gen/gen-monster.js.map +1 -0
- package/dist/gen/generate.d.ts +240 -0
- package/dist/gen/generate.d.ts.map +1 -0
- package/dist/gen/generate.js +358 -0
- package/dist/gen/generate.js.map +1 -0
- package/dist/gen/room.d.ts +160 -0
- package/dist/gen/room.d.ts.map +1 -0
- package/dist/gen/room.js +1910 -0
- package/dist/gen/room.js.map +1 -0
- package/dist/gen/util.d.ts +466 -0
- package/dist/gen/util.d.ts.map +1 -0
- package/dist/gen/util.js +1553 -0
- package/dist/gen/util.js.map +1 -0
- package/dist/generated/dun-profiles.d.ts +44 -0
- package/dist/generated/dun-profiles.d.ts.map +1 -0
- package/dist/generated/dun-profiles.js +28 -0
- package/dist/generated/dun-profiles.js.map +1 -0
- package/dist/generated/effects.d.ts +1021 -0
- package/dist/generated/effects.d.ts.map +1 -0
- package/dist/generated/effects.js +239 -0
- package/dist/generated/effects.js.map +1 -0
- package/dist/generated/elements.d.ts +83 -0
- package/dist/generated/elements.d.ts.map +1 -0
- package/dist/generated/elements.js +60 -0
- package/dist/generated/elements.js.map +1 -0
- package/dist/generated/equip-slots.d.ts +104 -0
- package/dist/generated/equip-slots.d.ts.map +1 -0
- package/dist/generated/equip-slots.js +34 -0
- package/dist/generated/equip-slots.js.map +1 -0
- package/dist/generated/history-types.d.ts +52 -0
- package/dist/generated/history-types.d.ts.map +1 -0
- package/dist/generated/history-types.js +32 -0
- package/dist/generated/history-types.js.map +1 -0
- package/dist/generated/ignore-types.d.ts +116 -0
- package/dist/generated/ignore-types.d.ts.map +1 -0
- package/dist/generated/ignore-types.js +64 -0
- package/dist/generated/ignore-types.js.map +1 -0
- package/dist/generated/index.d.ts +32 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +33 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/generated/kind-flags.d.ts +72 -0
- package/dist/generated/kind-flags.d.ts.map +1 -0
- package/dist/generated/kind-flags.js +42 -0
- package/dist/generated/kind-flags.js.map +1 -0
- package/dist/generated/message.d.ts +624 -0
- package/dist/generated/message.d.ts.map +1 -0
- package/dist/generated/message.js +318 -0
- package/dist/generated/message.js.map +1 -0
- package/dist/generated/mon-message.d.ts +386 -0
- package/dist/generated/mon-message.d.ts.map +1 -0
- package/dist/generated/mon-message.js +136 -0
- package/dist/generated/mon-message.js.map +1 -0
- package/dist/generated/mon-race-flags.d.ts +433 -0
- package/dist/generated/mon-race-flags.d.ts.map +1 -0
- package/dist/generated/mon-race-flags.js +180 -0
- package/dist/generated/mon-race-flags.js.map +1 -0
- package/dist/generated/mon-spells.d.ts +380 -0
- package/dist/generated/mon-spells.d.ts.map +1 -0
- package/dist/generated/mon-spells.js +196 -0
- package/dist/generated/mon-spells.js.map +1 -0
- package/dist/generated/mon-temp-flags.d.ts +52 -0
- package/dist/generated/mon-temp-flags.d.ts.map +1 -0
- package/dist/generated/mon-temp-flags.js +32 -0
- package/dist/generated/mon-temp-flags.js.map +1 -0
- package/dist/generated/mon-timed.d.ts +118 -0
- package/dist/generated/mon-timed.d.ts.map +1 -0
- package/dist/generated/mon-timed.js +32 -0
- package/dist/generated/mon-timed.js.map +1 -0
- package/dist/generated/object-flags.d.ts +169 -0
- package/dist/generated/object-flags.d.ts.map +1 -0
- package/dist/generated/object-flags.js +93 -0
- package/dist/generated/object-flags.js.map +1 -0
- package/dist/generated/object-modifiers.d.ts +50 -0
- package/dist/generated/object-modifiers.d.ts.map +1 -0
- package/dist/generated/object-modifiers.js +41 -0
- package/dist/generated/object-modifiers.js.map +1 -0
- package/dist/generated/options.d.ts +284 -0
- package/dist/generated/options.d.ts.map +1 -0
- package/dist/generated/options.js +102 -0
- package/dist/generated/options.js.map +1 -0
- package/dist/generated/origins.d.ts +138 -0
- package/dist/generated/origins.d.ts.map +1 -0
- package/dist/generated/origins.js +62 -0
- package/dist/generated/origins.js.map +1 -0
- package/dist/generated/parser-errors.d.ts +264 -0
- package/dist/generated/parser-errors.d.ts.map +1 -0
- package/dist/generated/parser-errors.js +138 -0
- package/dist/generated/parser-errors.js.map +1 -0
- package/dist/generated/player-flags.d.ts +62 -0
- package/dist/generated/player-flags.d.ts.map +1 -0
- package/dist/generated/player-flags.js +46 -0
- package/dist/generated/player-flags.js.map +1 -0
- package/dist/generated/player-timed.d.ts +273 -0
- package/dist/generated/player-timed.d.ts.map +1 -0
- package/dist/generated/player-timed.js +116 -0
- package/dist/generated/player-timed.js.map +1 -0
- package/dist/generated/projections.d.ts +130 -0
- package/dist/generated/projections.d.ts.map +1 -0
- package/dist/generated/projections.js +101 -0
- package/dist/generated/projections.js.map +1 -0
- package/dist/generated/randart-properties.d.ts +388 -0
- package/dist/generated/randart-properties.d.ts.map +1 -0
- package/dist/generated/randart-properties.js +200 -0
- package/dist/generated/randart-properties.js.map +1 -0
- package/dist/generated/room-flags.d.ts +21 -0
- package/dist/generated/room-flags.d.ts.map +1 -0
- package/dist/generated/room-flags.js +19 -0
- package/dist/generated/room-flags.js.map +1 -0
- package/dist/generated/rooms.d.ts +122 -0
- package/dist/generated/rooms.d.ts.map +1 -0
- package/dist/generated/rooms.js +48 -0
- package/dist/generated/rooms.js.map +1 -0
- package/dist/generated/square-flags.d.ts +96 -0
- package/dist/generated/square-flags.d.ts.map +1 -0
- package/dist/generated/square-flags.js +54 -0
- package/dist/generated/square-flags.js.map +1 -0
- package/dist/generated/stats.d.ts +23 -0
- package/dist/generated/stats.d.ts.map +1 -0
- package/dist/generated/stats.js +20 -0
- package/dist/generated/stats.js.map +1 -0
- package/dist/generated/terrain-flags.d.ts +136 -0
- package/dist/generated/terrain-flags.d.ts.map +1 -0
- package/dist/generated/terrain-flags.js +74 -0
- package/dist/generated/terrain-flags.js.map +1 -0
- package/dist/generated/terrain.d.ts +83 -0
- package/dist/generated/terrain.d.ts.map +1 -0
- package/dist/generated/terrain.js +60 -0
- package/dist/generated/terrain.js.map +1 -0
- package/dist/generated/trap-flags.d.ts +68 -0
- package/dist/generated/trap-flags.d.ts.map +1 -0
- package/dist/generated/trap-flags.js +40 -0
- package/dist/generated/trap-flags.js.map +1 -0
- package/dist/generated/tvals.d.ts +152 -0
- package/dist/generated/tvals.d.ts.map +1 -0
- package/dist/generated/tvals.js +82 -0
- package/dist/generated/tvals.js.map +1 -0
- package/dist/generated/ui-entry-renderers.d.ts +62 -0
- package/dist/generated/ui-entry-renderers.d.ts.map +1 -0
- package/dist/generated/ui-entry-renderers.js +22 -0
- package/dist/generated/ui-entry-renderers.js.map +1 -0
- package/dist/guard.d.ts +43 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +65 -0
- package/dist/guard.js.map +1 -0
- package/dist/host/args.d.ts +129 -0
- package/dist/host/args.d.ts.map +1 -0
- package/dist/host/args.js +251 -0
- package/dist/host/args.js.map +1 -0
- package/dist/host/bridge.d.ts +61 -0
- package/dist/host/bridge.d.ts.map +1 -0
- package/dist/host/bridge.js +176 -0
- package/dist/host/bridge.js.map +1 -0
- package/dist/host/index.d.ts +18 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +18 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/io.d.ts +169 -0
- package/dist/host/io.d.ts.map +1 -0
- package/dist/host/io.js +137 -0
- package/dist/host/io.js.map +1 -0
- package/dist/host/memory.d.ts +56 -0
- package/dist/host/memory.d.ts.map +1 -0
- package/dist/host/memory.js +105 -0
- package/dist/host/memory.js.map +1 -0
- package/dist/host/raw.d.ts +114 -0
- package/dist/host/raw.d.ts.map +1 -0
- package/dist/host/raw.js +107 -0
- package/dist/host/raw.js.map +1 -0
- package/dist/index.d.ts +180 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +222 -0
- package/dist/index.js.map +1 -0
- package/dist/loc.d.ts +63 -0
- package/dist/loc.d.ts.map +1 -0
- package/dist/loc.js +128 -0
- package/dist/loc.js.map +1 -0
- package/dist/mod/hooks.d.ts +204 -0
- package/dist/mod/hooks.d.ts.map +1 -0
- package/dist/mod/hooks.js +161 -0
- package/dist/mod/hooks.js.map +1 -0
- package/dist/mod/ids.d.ts +160 -0
- package/dist/mod/ids.d.ts.map +1 -0
- package/dist/mod/ids.js +343 -0
- package/dist/mod/ids.js.map +1 -0
- package/dist/mod/registry-host.d.ts +156 -0
- package/dist/mod/registry-host.d.ts.map +1 -0
- package/dist/mod/registry-host.js +142 -0
- package/dist/mod/registry-host.js.map +1 -0
- package/dist/mod/save-blocks.d.ts +201 -0
- package/dist/mod/save-blocks.d.ts.map +1 -0
- package/dist/mod/save-blocks.js +640 -0
- package/dist/mod/save-blocks.js.map +1 -0
- package/dist/mod/vocabulary.d.ts +104 -0
- package/dist/mod/vocabulary.d.ts.map +1 -0
- package/dist/mod/vocabulary.js +0 -0
- package/dist/mod/vocabulary.js.map +1 -0
- package/dist/mon/bind.d.ts +266 -0
- package/dist/mon/bind.d.ts.map +1 -0
- package/dist/mon/bind.js +610 -0
- package/dist/mon/bind.js.map +1 -0
- package/dist/mon/desc.d.ts +72 -0
- package/dist/mon/desc.d.ts.map +1 -0
- package/dist/mon/desc.js +237 -0
- package/dist/mon/desc.js.map +1 -0
- package/dist/mon/knowledge-groups.d.ts +61 -0
- package/dist/mon/knowledge-groups.d.ts.map +1 -0
- package/dist/mon/knowledge-groups.js +121 -0
- package/dist/mon/knowledge-groups.js.map +1 -0
- package/dist/mon/lore-describe.d.ts +216 -0
- package/dist/mon/lore-describe.d.ts.map +1 -0
- package/dist/mon/lore-describe.js +1105 -0
- package/dist/mon/lore-describe.js.map +1 -0
- package/dist/mon/lore.d.ts +117 -0
- package/dist/mon/lore.d.ts.map +1 -0
- package/dist/mon/lore.js +221 -0
- package/dist/mon/lore.js.map +1 -0
- package/dist/mon/make.d.ts +147 -0
- package/dist/mon/make.d.ts.map +1 -0
- package/dist/mon/make.js +353 -0
- package/dist/mon/make.js.map +1 -0
- package/dist/mon/monster.d.ts +94 -0
- package/dist/mon/monster.d.ts.map +1 -0
- package/dist/mon/monster.js +90 -0
- package/dist/mon/monster.js.map +1 -0
- package/dist/mon/predicate.d.ts +87 -0
- package/dist/mon/predicate.d.ts.map +1 -0
- package/dist/mon/predicate.js +190 -0
- package/dist/mon/predicate.js.map +1 -0
- package/dist/mon/project-mon.d.ts +129 -0
- package/dist/mon/project-mon.d.ts.map +1 -0
- package/dist/mon/project-mon.js +652 -0
- package/dist/mon/project-mon.js.map +1 -0
- package/dist/mon/spell.d.ts +155 -0
- package/dist/mon/spell.d.ts.map +1 -0
- package/dist/mon/spell.js +355 -0
- package/dist/mon/spell.js.map +1 -0
- package/dist/mon/steal.d.ts +112 -0
- package/dist/mon/steal.d.ts.map +1 -0
- package/dist/mon/steal.js +163 -0
- package/dist/mon/steal.js.map +1 -0
- package/dist/mon/summon.d.ts +62 -0
- package/dist/mon/summon.d.ts.map +1 -0
- package/dist/mon/summon.js +111 -0
- package/dist/mon/summon.js.map +1 -0
- package/dist/mon/take-hit.d.ts +75 -0
- package/dist/mon/take-hit.d.ts.map +1 -0
- package/dist/mon/take-hit.js +122 -0
- package/dist/mon/take-hit.js.map +1 -0
- package/dist/mon/timed.d.ts +74 -0
- package/dist/mon/timed.d.ts.map +1 -0
- package/dist/mon/timed.js +219 -0
- package/dist/mon/timed.js.map +1 -0
- package/dist/mon/types.d.ts +252 -0
- package/dist/mon/types.d.ts.map +1 -0
- package/dist/mon/types.js +46 -0
- package/dist/mon/types.js.map +1 -0
- package/dist/msg.d.ts +71 -0
- package/dist/msg.d.ts.map +1 -0
- package/dist/msg.js +126 -0
- package/dist/msg.js.map +1 -0
- package/dist/obj/artifact-fake.d.ts +39 -0
- package/dist/obj/artifact-fake.d.ts.map +1 -0
- package/dist/obj/artifact-fake.js +52 -0
- package/dist/obj/artifact-fake.js.map +1 -0
- package/dist/obj/artifact-known.d.ts +50 -0
- package/dist/obj/artifact-known.d.ts.map +1 -0
- package/dist/obj/artifact-known.js +55 -0
- package/dist/obj/artifact-known.js.map +1 -0
- package/dist/obj/bind.d.ts +219 -0
- package/dist/obj/bind.d.ts.map +1 -0
- package/dist/obj/bind.js +1239 -0
- package/dist/obj/bind.js.map +1 -0
- package/dist/obj/chest.d.ts +91 -0
- package/dist/obj/chest.d.ts.map +1 -0
- package/dist/obj/chest.js +220 -0
- package/dist/obj/chest.js.map +1 -0
- package/dist/obj/desc.d.ts +79 -0
- package/dist/obj/desc.d.ts.map +1 -0
- package/dist/obj/desc.js +602 -0
- package/dist/obj/desc.js.map +1 -0
- package/dist/obj/effects-info.d.ts +78 -0
- package/dist/obj/effects-info.d.ts.map +1 -0
- package/dist/obj/effects-info.js +240 -0
- package/dist/obj/effects-info.js.map +1 -0
- package/dist/obj/flavor.d.ts +68 -0
- package/dist/obj/flavor.d.ts.map +1 -0
- package/dist/obj/flavor.js +201 -0
- package/dist/obj/flavor.js.map +1 -0
- package/dist/obj/ignore.d.ts +143 -0
- package/dist/obj/ignore.d.ts.map +1 -0
- package/dist/obj/ignore.js +345 -0
- package/dist/obj/ignore.js.map +1 -0
- package/dist/obj/knowledge.d.ts +520 -0
- package/dist/obj/knowledge.d.ts.map +1 -0
- package/dist/obj/knowledge.js +1364 -0
- package/dist/obj/knowledge.js.map +1 -0
- package/dist/obj/known-object.d.ts +293 -0
- package/dist/obj/known-object.d.ts.map +1 -0
- package/dist/obj/known-object.js +532 -0
- package/dist/obj/known-object.js.map +1 -0
- package/dist/obj/make.d.ts +292 -0
- package/dist/obj/make.d.ts.map +1 -0
- package/dist/obj/make.js +1055 -0
- package/dist/obj/make.js.map +1 -0
- package/dist/obj/object-info.d.ts +188 -0
- package/dist/obj/object-info.d.ts.map +1 -0
- package/dist/obj/object-info.js +1407 -0
- package/dist/obj/object-info.js.map +1 -0
- package/dist/obj/object.d.ts +335 -0
- package/dist/obj/object.d.ts.map +1 -0
- package/dist/obj/object.js +1051 -0
- package/dist/obj/object.js.map +1 -0
- package/dist/obj/power.d.ts +65 -0
- package/dist/obj/power.d.ts.map +1 -0
- package/dist/obj/power.js +580 -0
- package/dist/obj/power.js.map +1 -0
- package/dist/obj/randart-build.d.ts +223 -0
- package/dist/obj/randart-build.d.ts.map +1 -0
- package/dist/obj/randart-build.js +1444 -0
- package/dist/obj/randart-build.js.map +1 -0
- package/dist/obj/randart-data.d.ts +179 -0
- package/dist/obj/randart-data.d.ts.map +1 -0
- package/dist/obj/randart-data.js +1153 -0
- package/dist/obj/randart-data.js.map +1 -0
- package/dist/obj/randart.d.ts +128 -0
- package/dist/obj/randart.d.ts.map +1 -0
- package/dist/obj/randart.js +458 -0
- package/dist/obj/randart.js.map +1 -0
- package/dist/obj/randname.d.ts +33 -0
- package/dist/obj/randname.d.ts.map +1 -0
- package/dist/obj/randname.js +116 -0
- package/dist/obj/randname.js.map +1 -0
- package/dist/obj/recharge.d.ts +28 -0
- package/dist/obj/recharge.d.ts.map +1 -0
- package/dist/obj/recharge.js +52 -0
- package/dist/obj/recharge.js.map +1 -0
- package/dist/obj/types.d.ts +584 -0
- package/dist/obj/types.d.ts.map +1 -0
- package/dist/obj/types.js +104 -0
- package/dist/obj/types.js.map +1 -0
- package/dist/obj/value.d.ts +64 -0
- package/dist/obj/value.d.ts.map +1 -0
- package/dist/obj/value.js +176 -0
- package/dist/obj/value.js.map +1 -0
- package/dist/player/abilities.d.ts +57 -0
- package/dist/player/abilities.d.ts.map +1 -0
- package/dist/player/abilities.js +118 -0
- package/dist/player/abilities.js.map +1 -0
- package/dist/player/best-digger.d.ts +42 -0
- package/dist/player/best-digger.d.ts.map +1 -0
- package/dist/player/best-digger.js +89 -0
- package/dist/player/best-digger.js.map +1 -0
- package/dist/player/bind.d.ts +270 -0
- package/dist/player/bind.d.ts.map +1 -0
- package/dist/player/bind.js +698 -0
- package/dist/player/bind.js.map +1 -0
- package/dist/player/birth.d.ts +258 -0
- package/dist/player/birth.d.ts.map +1 -0
- package/dist/player/birth.js +639 -0
- package/dist/player/birth.js.map +1 -0
- package/dist/player/calcs.d.ts +403 -0
- package/dist/player/calcs.d.ts.map +1 -0
- package/dist/player/calcs.js +1189 -0
- package/dist/player/calcs.js.map +1 -0
- package/dist/player/combat-regen.d.ts +14 -0
- package/dist/player/combat-regen.d.ts.map +1 -0
- package/dist/player/combat-regen.js +29 -0
- package/dist/player/combat-regen.js.map +1 -0
- package/dist/player/exp.d.ts +96 -0
- package/dist/player/exp.d.ts.map +1 -0
- package/dist/player/exp.js +229 -0
- package/dist/player/exp.js.map +1 -0
- package/dist/player/history.d.ts +91 -0
- package/dist/player/history.d.ts.map +1 -0
- package/dist/player/history.js +145 -0
- package/dist/player/history.js.map +1 -0
- package/dist/player/options.d.ts +123 -0
- package/dist/player/options.d.ts.map +1 -0
- package/dist/player/options.js +199 -0
- package/dist/player/options.js.map +1 -0
- package/dist/player/player.d.ts +242 -0
- package/dist/player/player.d.ts.map +1 -0
- package/dist/player/player.js +119 -0
- package/dist/player/player.js.map +1 -0
- package/dist/player/shape-lore.d.ts +56 -0
- package/dist/player/shape-lore.d.ts.map +1 -0
- package/dist/player/shape-lore.js +221 -0
- package/dist/player/shape-lore.js.map +1 -0
- package/dist/player/spell.d.ts +146 -0
- package/dist/player/spell.d.ts.map +1 -0
- package/dist/player/spell.js +519 -0
- package/dist/player/spell.js.map +1 -0
- package/dist/player/take-hit.d.ts +87 -0
- package/dist/player/take-hit.d.ts.map +1 -0
- package/dist/player/take-hit.js +99 -0
- package/dist/player/take-hit.js.map +1 -0
- package/dist/player/timed.d.ts +205 -0
- package/dist/player/timed.d.ts.map +1 -0
- package/dist/player/timed.js +310 -0
- package/dist/player/timed.js.map +1 -0
- package/dist/player/types.d.ts +390 -0
- package/dist/player/types.d.ts.map +1 -0
- package/dist/player/types.js +51 -0
- package/dist/player/types.js.map +1 -0
- package/dist/rational.d.ts +99 -0
- package/dist/rational.d.ts.map +1 -0
- package/dist/rational.js +345 -0
- package/dist/rational.js.map +1 -0
- package/dist/rng.d.ts +168 -0
- package/dist/rng.d.ts.map +1 -0
- package/dist/rng.js +404 -0
- package/dist/rng.js.map +1 -0
- package/dist/save/buffer.d.ts +120 -0
- package/dist/save/buffer.d.ts.map +1 -0
- package/dist/save/buffer.js +238 -0
- package/dist/save/buffer.js.map +1 -0
- package/dist/save/compress.d.ts +79 -0
- package/dist/save/compress.d.ts.map +1 -0
- package/dist/save/compress.js +97 -0
- package/dist/save/compress.js.map +1 -0
- package/dist/save/description.d.ts +61 -0
- package/dist/save/description.d.ts.map +1 -0
- package/dist/save/description.js +51 -0
- package/dist/save/description.js.map +1 -0
- package/dist/save/integrity.d.ts +59 -0
- package/dist/save/integrity.d.ts.map +1 -0
- package/dist/save/integrity.js +103 -0
- package/dist/save/integrity.js.map +1 -0
- package/dist/score/display.d.ts +40 -0
- package/dist/score/display.d.ts.map +1 -0
- package/dist/score/display.js +86 -0
- package/dist/score/display.js.map +1 -0
- package/dist/score/score.d.ts +166 -0
- package/dist/score/score.d.ts.map +1 -0
- package/dist/score/score.js +244 -0
- package/dist/score/score.js.map +1 -0
- package/dist/score/types.d.ts +98 -0
- package/dist/score/types.d.ts.map +1 -0
- package/dist/score/types.js +27 -0
- package/dist/score/types.js.map +1 -0
- package/dist/session/boot.d.ts +207 -0
- package/dist/session/boot.d.ts.map +1 -0
- package/dist/session/boot.js +151 -0
- package/dist/session/boot.js.map +1 -0
- package/dist/session/game.d.ts +257 -0
- package/dist/session/game.d.ts.map +1 -0
- package/dist/session/game.js +2880 -0
- package/dist/session/game.js.map +1 -0
- package/dist/session/save.d.ts +847 -0
- package/dist/session/save.d.ts.map +1 -0
- package/dist/session/save.js +1306 -0
- package/dist/session/save.js.map +1 -0
- package/dist/sound/engine.d.ts +146 -0
- package/dist/sound/engine.d.ts.map +1 -0
- package/dist/sound/engine.js +332 -0
- package/dist/sound/engine.js.map +1 -0
- package/dist/sound/index.d.ts +13 -0
- package/dist/sound/index.d.ts.map +1 -0
- package/dist/sound/index.js +13 -0
- package/dist/sound/index.js.map +1 -0
- package/dist/sound/sound-prefs-data.d.ts +10 -0
- package/dist/sound/sound-prefs-data.d.ts.map +1 -0
- package/dist/sound/sound-prefs-data.js +165 -0
- package/dist/sound/sound-prefs-data.js.map +1 -0
- package/dist/sound/types.d.ts +64 -0
- package/dist/sound/types.d.ts.map +1 -0
- package/dist/sound/types.js +23 -0
- package/dist/sound/types.js.map +1 -0
- package/dist/store/bind.d.ts +43 -0
- package/dist/store/bind.d.ts.map +1 -0
- package/dist/store/bind.js +130 -0
- package/dist/store/bind.js.map +1 -0
- package/dist/store/price.d.ts +27 -0
- package/dist/store/price.d.ts.map +1 -0
- package/dist/store/price.js +81 -0
- package/dist/store/price.js.map +1 -0
- package/dist/store/store-cmd.d.ts +51 -0
- package/dist/store/store-cmd.d.ts.map +1 -0
- package/dist/store/store-cmd.js +73 -0
- package/dist/store/store-cmd.js.map +1 -0
- package/dist/store/store.d.ts +156 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +616 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/transact.d.ts +198 -0
- package/dist/store/transact.d.ts.map +1 -0
- package/dist/store/transact.js +383 -0
- package/dist/store/transact.js.map +1 -0
- package/dist/store/types.d.ts +101 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +14 -0
- package/dist/store/types.js.map +1 -0
- package/dist/version.d.ts +25 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +25 -0
- package/dist/version.js.map +1 -0
- package/dist/visuals/engine.d.ts +223 -0
- package/dist/visuals/engine.d.ts.map +1 -0
- package/dist/visuals/engine.js +357 -0
- package/dist/visuals/engine.js.map +1 -0
- package/dist/visuals/glyph-table.d.ts +112 -0
- package/dist/visuals/glyph-table.d.ts.map +1 -0
- package/dist/visuals/glyph-table.js +156 -0
- package/dist/visuals/glyph-table.js.map +1 -0
- package/dist/visuals/grafmode-data.d.ts +4 -0
- package/dist/visuals/grafmode-data.d.ts.map +1 -0
- package/dist/visuals/grafmode-data.js +88 -0
- package/dist/visuals/grafmode-data.js.map +1 -0
- package/dist/visuals/grafmode.d.ts +83 -0
- package/dist/visuals/grafmode.d.ts.map +1 -0
- package/dist/visuals/grafmode.js +82 -0
- package/dist/visuals/grafmode.js.map +1 -0
- package/dist/visuals/index.d.ts +19 -0
- package/dist/visuals/index.d.ts.map +1 -0
- package/dist/visuals/index.js +19 -0
- package/dist/visuals/index.js.map +1 -0
- package/dist/visuals/map-text.d.ts +79 -0
- package/dist/visuals/map-text.d.ts.map +1 -0
- package/dist/visuals/map-text.js +122 -0
- package/dist/visuals/map-text.js.map +1 -0
- package/dist/visuals/pref-expr.d.ts +56 -0
- package/dist/visuals/pref-expr.d.ts.map +1 -0
- package/dist/visuals/pref-expr.js +173 -0
- package/dist/visuals/pref-expr.js.map +1 -0
- package/dist/visuals/prefs.d.ts +280 -0
- package/dist/visuals/prefs.d.ts.map +1 -0
- package/dist/visuals/prefs.js +835 -0
- package/dist/visuals/prefs.js.map +1 -0
- package/dist/visuals/tile-prefs.d.ts +132 -0
- package/dist/visuals/tile-prefs.d.ts.map +1 -0
- package/dist/visuals/tile-prefs.js +105 -0
- package/dist/visuals/tile-prefs.js.map +1 -0
- package/dist/world/chunk.d.ts +195 -0
- package/dist/world/chunk.d.ts.map +1 -0
- package/dist/world/chunk.js +422 -0
- package/dist/world/chunk.js.map +1 -0
- package/dist/world/feature.d.ts +86 -0
- package/dist/world/feature.d.ts.map +1 -0
- package/dist/world/feature.js +153 -0
- package/dist/world/feature.js.map +1 -0
- package/dist/world/flow.d.ts +33 -0
- package/dist/world/flow.d.ts.map +1 -0
- package/dist/world/flow.js +115 -0
- package/dist/world/flow.js.map +1 -0
- package/dist/world/project.d.ts +176 -0
- package/dist/world/project.d.ts.map +1 -0
- package/dist/world/project.js +543 -0
- package/dist/world/project.js.map +1 -0
- package/dist/world/projection.d.ts +100 -0
- package/dist/world/projection.d.ts.map +1 -0
- package/dist/world/projection.js +152 -0
- package/dist/world/projection.js.map +1 -0
- package/dist/world/scatter.d.ts +25 -0
- package/dist/world/scatter.d.ts.map +1 -0
- package/dist/world/scatter.js +54 -0
- package/dist/world/scatter.js.map +1 -0
- package/dist/world/trap.d.ts +84 -0
- package/dist/world/trap.d.ts.map +1 -0
- package/dist/world/trap.js +106 -0
- package/dist/world/trap.js.map +1 -0
- package/dist/world/view.d.ts +60 -0
- package/dist/world/view.d.ts.map +1 -0
- package/dist/world/view.js +436 -0
- package/dist/world/view.js.map +1 -0
- package/dist/z-queue.d.ts +133 -0
- package/dist/z-queue.d.ts.map +1 -0
- package/dist/z-queue.js +283 -0
- package/dist/z-queue.js.map +1 -0
- package/package.json +75 -0
- package/src/agent/act.ts +114 -0
- package/src/agent/controller.ts +109 -0
- package/src/agent/events.ts +47 -0
- package/src/agent/index.ts +36 -0
- package/src/agent/perceive.ts +440 -0
- package/src/agent/types.ts +464 -0
- package/src/bitflag.ts +536 -0
- package/src/cmd.ts +547 -0
- package/src/color.ts +267 -0
- package/src/combat/brand-slay.ts +360 -0
- package/src/combat/hit.ts +471 -0
- package/src/combat/index.ts +15 -0
- package/src/combat/melee.ts +728 -0
- package/src/combat/mon-melee.ts +1153 -0
- package/src/combat/ranged.ts +397 -0
- package/src/constants.ts +324 -0
- package/src/dice.ts +467 -0
- package/src/effects/effect-choice.ts +32 -0
- package/src/effects/effect-info.ts +859 -0
- package/src/effects/effect.ts +560 -0
- package/src/effects/handlers.ts +452 -0
- package/src/effects/interpreter.ts +603 -0
- package/src/events.ts +317 -0
- package/src/expression.ts +360 -0
- package/src/game/cave-cmd.ts +1147 -0
- package/src/game/char-sheet.ts +557 -0
- package/src/game/chest.ts +348 -0
- package/src/game/context.ts +1218 -0
- package/src/game/curse-tick.ts +130 -0
- package/src/game/describe.ts +62 -0
- package/src/game/display.ts +838 -0
- package/src/game/dump-level.ts +114 -0
- package/src/game/effect-attack.ts +746 -0
- package/src/game/effect-detect.ts +542 -0
- package/src/game/effect-env.ts +252 -0
- package/src/game/effect-game-env.ts +86 -0
- package/src/game/effect-general.ts +1122 -0
- package/src/game/effect-item.ts +999 -0
- package/src/game/effect-melee.ts +557 -0
- package/src/game/effect-mon-origin.ts +196 -0
- package/src/game/effect-monster.ts +310 -0
- package/src/game/effect-summon.ts +161 -0
- package/src/game/effect-teleport.ts +645 -0
- package/src/game/effect-terrain.ts +881 -0
- package/src/game/energy.ts +61 -0
- package/src/game/equip-cmp.ts +476 -0
- package/src/game/floor.ts +524 -0
- package/src/game/gear.ts +1352 -0
- package/src/game/harness.ts +270 -0
- package/src/game/history.ts +78 -0
- package/src/game/ignore-cmd.ts +68 -0
- package/src/game/inscription-confirm.ts +115 -0
- package/src/game/known.ts +960 -0
- package/src/game/loop.ts +671 -0
- package/src/game/lore-color.ts +108 -0
- package/src/game/mon-cast.ts +409 -0
- package/src/game/mon-cmd.ts +767 -0
- package/src/game/mon-death.ts +459 -0
- package/src/game/mon-group.ts +368 -0
- package/src/game/mon-list.ts +213 -0
- package/src/game/mon-message.ts +359 -0
- package/src/game/mon-place.ts +1012 -0
- package/src/game/mon-ranged.ts +405 -0
- package/src/game/mon-shape.ts +161 -0
- package/src/game/mon-side.ts +511 -0
- package/src/game/monster-turn.ts +1750 -0
- package/src/game/obj-cmd.ts +1970 -0
- package/src/game/obj-list.ts +302 -0
- package/src/game/object-inspect.ts +162 -0
- package/src/game/pickup.ts +483 -0
- package/src/game/player-path.ts +1434 -0
- package/src/game/player-side.ts +555 -0
- package/src/game/player-turn.ts +852 -0
- package/src/game/project-cast.ts +766 -0
- package/src/game/project-feat.ts +386 -0
- package/src/game/project-monster.ts +407 -0
- package/src/game/project-obj.ts +298 -0
- package/src/game/project-player.ts +236 -0
- package/src/game/quest.ts +248 -0
- package/src/game/ranged-cmd.ts +417 -0
- package/src/game/scheduler.ts +150 -0
- package/src/game/spell-cmd.ts +404 -0
- package/src/game/spoil.ts +562 -0
- package/src/game/steal.ts +169 -0
- package/src/game/take-hit-hooks.ts +152 -0
- package/src/game/target-loop.ts +501 -0
- package/src/game/target.ts +424 -0
- package/src/game/thrust.ts +174 -0
- package/src/game/trap.ts +791 -0
- package/src/game/ui-entry.ts +2075 -0
- package/src/game/wizard.ts +1760 -0
- package/src/game/world.ts +786 -0
- package/src/gen/cave.ts +2858 -0
- package/src/gen/gen-monster.ts +592 -0
- package/src/gen/generate.ts +523 -0
- package/src/gen/room.ts +2213 -0
- package/src/gen/util.ts +1958 -0
- package/src/generated/dun-profiles.ts +30 -0
- package/src/generated/effects.ts +241 -0
- package/src/generated/elements.ts +62 -0
- package/src/generated/equip-slots.ts +36 -0
- package/src/generated/history-types.ts +34 -0
- package/src/generated/ignore-types.ts +66 -0
- package/src/generated/index.ts +33 -0
- package/src/generated/kind-flags.ts +44 -0
- package/src/generated/message.ts +320 -0
- package/src/generated/mon-message.ts +138 -0
- package/src/generated/mon-race-flags.ts +182 -0
- package/src/generated/mon-spells.ts +198 -0
- package/src/generated/mon-temp-flags.ts +34 -0
- package/src/generated/mon-timed.ts +34 -0
- package/src/generated/object-flags.ts +95 -0
- package/src/generated/object-modifiers.ts +43 -0
- package/src/generated/options.ts +104 -0
- package/src/generated/origins.ts +64 -0
- package/src/generated/parser-errors.ts +140 -0
- package/src/generated/player-flags.ts +48 -0
- package/src/generated/player-timed.ts +118 -0
- package/src/generated/projections.ts +103 -0
- package/src/generated/randart-properties.ts +202 -0
- package/src/generated/room-flags.ts +21 -0
- package/src/generated/rooms.ts +50 -0
- package/src/generated/square-flags.ts +56 -0
- package/src/generated/stats.ts +22 -0
- package/src/generated/terrain-flags.ts +76 -0
- package/src/generated/terrain.ts +62 -0
- package/src/generated/trap-flags.ts +42 -0
- package/src/generated/tvals.ts +84 -0
- package/src/generated/ui-entry-renderers.ts +24 -0
- package/src/guard.ts +70 -0
- package/src/host/args.ts +334 -0
- package/src/host/bridge.ts +193 -0
- package/src/host/index.ts +18 -0
- package/src/host/io.ts +239 -0
- package/src/host/memory.ts +134 -0
- package/src/host/raw.ts +190 -0
- package/src/index.ts +250 -0
- package/src/loc.ts +157 -0
- package/src/mod/hooks.ts +278 -0
- package/src/mod/ids.ts +390 -0
- package/src/mod/registry-host.ts +258 -0
- package/src/mod/save-blocks.ts +787 -0
- package/src/mod/vocabulary.ts +0 -0
- package/src/mon/bind.ts +899 -0
- package/src/mon/desc.ts +212 -0
- package/src/mon/knowledge-groups.ts +164 -0
- package/src/mon/lore-describe.ts +1414 -0
- package/src/mon/lore.ts +306 -0
- package/src/mon/make.ts +422 -0
- package/src/mon/monster.ts +161 -0
- package/src/mon/predicate.ts +220 -0
- package/src/mon/project-mon.ts +855 -0
- package/src/mon/spell.ts +418 -0
- package/src/mon/steal.ts +246 -0
- package/src/mon/summon.ts +145 -0
- package/src/mon/take-hit.ts +195 -0
- package/src/mon/timed.ts +300 -0
- package/src/mon/types.ts +286 -0
- package/src/msg.ts +146 -0
- package/src/obj/artifact-fake.ts +63 -0
- package/src/obj/artifact-known.ts +69 -0
- package/src/obj/bind.ts +1345 -0
- package/src/obj/chest.ts +249 -0
- package/src/obj/desc.ts +699 -0
- package/src/obj/effects-info.ts +349 -0
- package/src/obj/flavor.ts +256 -0
- package/src/obj/ignore.ts +387 -0
- package/src/obj/knowledge.ts +1577 -0
- package/src/obj/known-object.ts +718 -0
- package/src/obj/make.ts +1367 -0
- package/src/obj/object-info.ts +1737 -0
- package/src/obj/object.ts +1296 -0
- package/src/obj/power.ts +674 -0
- package/src/obj/randart-build.ts +1705 -0
- package/src/obj/randart-data.ts +1344 -0
- package/src/obj/randart.ts +552 -0
- package/src/obj/randname.ts +128 -0
- package/src/obj/recharge.ts +62 -0
- package/src/obj/types.ts +559 -0
- package/src/obj/value.ts +215 -0
- package/src/player/abilities.ts +142 -0
- package/src/player/best-digger.ts +118 -0
- package/src/player/bind.ts +1021 -0
- package/src/player/birth.ts +794 -0
- package/src/player/calcs.ts +1522 -0
- package/src/player/combat-regen.ts +33 -0
- package/src/player/exp.ts +275 -0
- package/src/player/history.ts +211 -0
- package/src/player/options.ts +244 -0
- package/src/player/player.ts +356 -0
- package/src/player/shape-lore.ts +250 -0
- package/src/player/spell.ts +627 -0
- package/src/player/take-hit.ts +173 -0
- package/src/player/timed.ts +482 -0
- package/src/player/types.ts +415 -0
- package/src/rational.ts +388 -0
- package/src/rng.ts +476 -0
- package/src/save/buffer.ts +287 -0
- package/src/save/compress.ts +132 -0
- package/src/save/description.ts +70 -0
- package/src/save/integrity.ts +133 -0
- package/src/score/display.ts +125 -0
- package/src/score/score.ts +341 -0
- package/src/score/types.ts +104 -0
- package/src/session/boot.ts +338 -0
- package/src/session/game.ts +3712 -0
- package/src/session/save.ts +2074 -0
- package/src/sound/engine.ts +375 -0
- package/src/sound/index.ts +13 -0
- package/src/sound/sound-prefs-data.ts +173 -0
- package/src/sound/types.ts +68 -0
- package/src/store/bind.ts +145 -0
- package/src/store/price.ts +97 -0
- package/src/store/store-cmd.ts +73 -0
- package/src/store/store.ts +723 -0
- package/src/store/transact.ts +644 -0
- package/src/store/types.ts +110 -0
- package/src/version.ts +26 -0
- package/src/visuals/engine.ts +444 -0
- package/src/visuals/glyph-table.ts +191 -0
- package/src/visuals/grafmode-data.ts +90 -0
- package/src/visuals/grafmode.ts +123 -0
- package/src/visuals/index.ts +19 -0
- package/src/visuals/map-text.ts +152 -0
- package/src/visuals/pref-expr.ts +182 -0
- package/src/visuals/prefs.ts +981 -0
- package/src/visuals/tile-prefs.ts +183 -0
- package/src/world/chunk.ts +531 -0
- package/src/world/feature.ts +215 -0
- package/src/world/flow.ts +128 -0
- package/src/world/project.ts +687 -0
- package/src/world/projection.ts +228 -0
- package/src/world/scatter.ts +72 -0
- package/src/world/trap.ts +155 -0
- package/src/world/view.ts +513 -0
- package/src/z-queue.ts +300 -0
package/src/obj/bind.ts
ADDED
|
@@ -0,0 +1,1345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object registries: binding the compiled pack JSON into typed data,
|
|
3
|
+
* ported from reference/src/obj-init.c (all the object-domain parsers and
|
|
4
|
+
* their finish steps), datafile.c (grab_flag, grab_rand_value,
|
|
5
|
+
* grab_int_value, grab_index_and_int, grab_int_range, grab_element_flag),
|
|
6
|
+
* obj-tval.c (tval_find_idx), obj-util.c (lookup_kind, lookup_sval), and
|
|
7
|
+
* obj-desc.c (obj_desc_name_format, used for sval name matching).
|
|
8
|
+
*
|
|
9
|
+
* Ordering follows upstream init_arrays: bases, slays, brands, curses,
|
|
10
|
+
* objects, activations, egos, artifacts, properties, flavors. Faithful
|
|
11
|
+
* index quirks are kept: kinds/egos are 0-based in file order
|
|
12
|
+
* (kidx/eidx), artifacts and object properties are 1-based in file
|
|
13
|
+
* order, while slays, brands, curses, and activations are 1-based in
|
|
14
|
+
* REVERSE file order (upstream walks the prepended parse list from its
|
|
15
|
+
* head while counting up).
|
|
16
|
+
*
|
|
17
|
+
* Sval assignment mirrors parse_object_type: each kind bumps its base's
|
|
18
|
+
* num_svals as its type: line is bound, in file order, and takes that
|
|
19
|
+
* count as its sval. Special artifacts whose base-object sval does not
|
|
20
|
+
* exist get a dummy kind appended (write_dummy_object_record) with
|
|
21
|
+
* KF_INSTA_ART, inheriting the base's flags; its level is 0 at creation
|
|
22
|
+
* time because upstream reads art->level before the level: line has been
|
|
23
|
+
* parsed.
|
|
24
|
+
*
|
|
25
|
+
* MODDABILITY (ratified pillar): every bind step is driven purely by the
|
|
26
|
+
* record arrays passed in; appending extra records in the same compiled
|
|
27
|
+
* shape (new kinds, egos, artifacts, curses, ...) binds them exactly like
|
|
28
|
+
* pack data.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { FlagSet } from "../bitflag.js";
|
|
32
|
+
import { Dice } from "../dice.js";
|
|
33
|
+
import {
|
|
34
|
+
ELEMENT_ENTRIES,
|
|
35
|
+
KF,
|
|
36
|
+
OBJECT_MODIFIER_ENTRIES,
|
|
37
|
+
OF,
|
|
38
|
+
RF,
|
|
39
|
+
STAT_ENTRIES,
|
|
40
|
+
TV,
|
|
41
|
+
TVAL_ENTRIES,
|
|
42
|
+
} from "../generated/index.js";
|
|
43
|
+
import type { RandomValue } from "../rng.js";
|
|
44
|
+
import type {
|
|
45
|
+
Activation,
|
|
46
|
+
ActivationRecordJson,
|
|
47
|
+
Artifact,
|
|
48
|
+
ArtifactRecordJson,
|
|
49
|
+
Brand,
|
|
50
|
+
BrandRecordJson,
|
|
51
|
+
Curse,
|
|
52
|
+
CurseRecordJson,
|
|
53
|
+
EffectRecordJson,
|
|
54
|
+
EgoItem,
|
|
55
|
+
EgoRecordJson,
|
|
56
|
+
ElementInfo,
|
|
57
|
+
Flavor,
|
|
58
|
+
FlavorRecordJson,
|
|
59
|
+
ObjectBase,
|
|
60
|
+
ObjectBaseRecordJson,
|
|
61
|
+
ObjectKind,
|
|
62
|
+
ObjectKindRecordJson,
|
|
63
|
+
ObjectProperty,
|
|
64
|
+
ObjectPropertyRecordJson,
|
|
65
|
+
ObjPackJson,
|
|
66
|
+
Slay,
|
|
67
|
+
} from "./types.js";
|
|
68
|
+
import {
|
|
69
|
+
EL_INFO_HATES,
|
|
70
|
+
EL_INFO_IGNORE,
|
|
71
|
+
ELEM_BASE_MIN,
|
|
72
|
+
ELEM_HIGH_MIN,
|
|
73
|
+
newElemInfo,
|
|
74
|
+
newKfFlags,
|
|
75
|
+
newModifiersRv,
|
|
76
|
+
newOfFlags,
|
|
77
|
+
NO_MINIMUM,
|
|
78
|
+
OBJ_MOD_MAX,
|
|
79
|
+
OBJ_PROPERTY,
|
|
80
|
+
OFID,
|
|
81
|
+
OFT,
|
|
82
|
+
SV_UNKNOWN,
|
|
83
|
+
TV_MAX,
|
|
84
|
+
zeroRv,
|
|
85
|
+
} from "./types.js";
|
|
86
|
+
|
|
87
|
+
/* ------------------------------------------------------------------ */
|
|
88
|
+
/* Name tables (the C string arrays built from the list headers) */
|
|
89
|
+
/* ------------------------------------------------------------------ */
|
|
90
|
+
|
|
91
|
+
/** obj_mods[]: the five stats then the object modifiers, index = value. */
|
|
92
|
+
export const OBJ_MOD_NAMES: readonly string[] = [
|
|
93
|
+
...STAT_ENTRIES.map((e) => e.name),
|
|
94
|
+
...OBJECT_MODIFIER_ENTRIES.map((e) => e.name),
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
/** element_names[]: index = ELEM value. */
|
|
98
|
+
export const ELEMENT_NAMES: readonly string[] = ELEMENT_ENTRIES.map(
|
|
99
|
+
(e) => e.name,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
/* ------------------------------------------------------------------ */
|
|
103
|
+
/* datafile.c helpers */
|
|
104
|
+
/* ------------------------------------------------------------------ */
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* dice string or plain number -> RandomValue (parser_getrand / parse_random,
|
|
108
|
+
* parser.c:126-213).
|
|
109
|
+
*
|
|
110
|
+
* The negation is NOT dice negation, and getting it wrong is a live gameplay
|
|
111
|
+
* divergence. `parse_random` strips a leading '-', parses the remainder as a
|
|
112
|
+
* POSITIVE value, and only then adjusts (parser.c:207-211):
|
|
113
|
+
*
|
|
114
|
+
* base *= -1; base -= m_bonus; base -= dice * (sides + 1);
|
|
115
|
+
*
|
|
116
|
+
* with the reason stated there: "the random components are always positive, so
|
|
117
|
+
* the base must be adjusted as necessary". The base is shifted down far enough
|
|
118
|
+
* that `base + XdY` spans the NEGATION of the positive interval.
|
|
119
|
+
* Dice.parseString instead binds the '-' to the base token alone, which leaves
|
|
120
|
+
* the random part pointing the wrong way.
|
|
121
|
+
*
|
|
122
|
+
* Reachable in shipped 4.2.6 data: ego_item.txt:692, "of Backbiting", carries
|
|
123
|
+
* `combat:-26+d25:-26+d25:0`. Upstream yields base -52, dice 1, sides 25, i.e.
|
|
124
|
+
* to_h/to_d in -51..-27; binding the sign to the base alone yields -26 + 1d25,
|
|
125
|
+
* i.e. -25..-1, an ego roughly half as punishing as upstream's.
|
|
126
|
+
*/
|
|
127
|
+
export function parseRand(value: string | number | undefined): RandomValue {
|
|
128
|
+
if (value === undefined) return zeroRv();
|
|
129
|
+
if (typeof value === "number") {
|
|
130
|
+
return { base: value, dice: 0, sides: 0, mBonus: 0 };
|
|
131
|
+
}
|
|
132
|
+
const negative = value.startsWith("-");
|
|
133
|
+
const body = negative ? value.slice(1) : value;
|
|
134
|
+
const dice = new Dice();
|
|
135
|
+
if (!dice.parseString(body)) {
|
|
136
|
+
throw new Error(`obj: invalid dice string "${value}"`);
|
|
137
|
+
}
|
|
138
|
+
const rv = dice.randomValue();
|
|
139
|
+
if (!negative) return rv;
|
|
140
|
+
return {
|
|
141
|
+
...rv,
|
|
142
|
+
base: -rv.base - rv.mBonus - rv.dice * (rv.sides + 1),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* grab_int_range with sep "to": "10 to 100" -> [10, 100] (datafile.c:320-372).
|
|
148
|
+
*
|
|
149
|
+
* Both endpoints are rejected at INT_MIN and INT_MAX inclusive, not merely
|
|
150
|
+
* outside them. That is deliberate upstream and the C says why at :328-331:
|
|
151
|
+
* "Reject INT_MIN and INT_MAX as well so don't have to check errno in order to
|
|
152
|
+
* recognize overflow when sizeof(int) == sizeof(long)". A value that saturated
|
|
153
|
+
* strtol is indistinguishable from one that legitimately equals the limit, so
|
|
154
|
+
* upstream refuses both rather than guess. Reproducing that means the port
|
|
155
|
+
* rejects the same three forms of k-info.c's test_alloc_bad0 that it used to
|
|
156
|
+
* accept (findings/W3-UNIT-TESTS-parse.md, D2).
|
|
157
|
+
*/
|
|
158
|
+
const INT_MIN = -2147483648;
|
|
159
|
+
const INT_MAX = 2147483647;
|
|
160
|
+
|
|
161
|
+
export function grabIntRange(range: string): [number, number] {
|
|
162
|
+
const m = /^\s*(-?\d+)\s+to\s+(-?\d+)\s*$/.exec(range);
|
|
163
|
+
if (!m) throw new Error(`obj: invalid allocation range "${range}"`);
|
|
164
|
+
const lo = Number(m[1]);
|
|
165
|
+
const hi = Number(m[2]);
|
|
166
|
+
for (const v of [lo, hi]) {
|
|
167
|
+
if (v <= INT_MIN || v >= INT_MAX) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`obj: allocation range endpoint ${v} is out of range in "${range}" ` +
|
|
170
|
+
`(datafile.c:328-333 rejects INT_MIN and INT_MAX inclusive)`,
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return [lo, hi];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* find_value_arg for the "NAME[...]" syntax: returns the name and the
|
|
179
|
+
* raw bracket text, or null when there is no bracket.
|
|
180
|
+
*/
|
|
181
|
+
function findValueArg(token: string): { name: string; arg: string } | null {
|
|
182
|
+
const open = token.indexOf("[");
|
|
183
|
+
if (open < 0) return null;
|
|
184
|
+
const close = token.indexOf("]", open + 1);
|
|
185
|
+
if (close < 0) return null;
|
|
186
|
+
return { name: token.slice(0, open), arg: token.slice(open + 1, close) };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* grab_rand_value: "STR[1d2]" -> parse the bracket as dice and store its
|
|
191
|
+
* random value at the name's index. Returns true when the name matched.
|
|
192
|
+
*/
|
|
193
|
+
export function grabRandValue(
|
|
194
|
+
values: RandomValue[],
|
|
195
|
+
names: readonly string[],
|
|
196
|
+
token: string,
|
|
197
|
+
): boolean {
|
|
198
|
+
const parsed = findValueArg(token);
|
|
199
|
+
if (!parsed) throw new Error(`obj: invalid value "${token}"`);
|
|
200
|
+
const i = names.indexOf(parsed.name);
|
|
201
|
+
if (i < 0) return false;
|
|
202
|
+
const dice = new Dice();
|
|
203
|
+
if (!dice.parseString(parsed.arg)) {
|
|
204
|
+
throw new Error(`obj: value "${token}" is not random`);
|
|
205
|
+
}
|
|
206
|
+
values[i] = dice.randomValue();
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* grab_int_value: "SPEED[10]" -> store the int at the name's index.
|
|
212
|
+
* Returns true when the name matched.
|
|
213
|
+
*/
|
|
214
|
+
export function grabIntValue(
|
|
215
|
+
values: number[],
|
|
216
|
+
names: readonly string[],
|
|
217
|
+
token: string,
|
|
218
|
+
): boolean {
|
|
219
|
+
const parsed = findValueArg(token);
|
|
220
|
+
if (!parsed) throw new Error(`obj: invalid value "${token}"`);
|
|
221
|
+
const i = names.indexOf(parsed.name);
|
|
222
|
+
if (i < 0) return false;
|
|
223
|
+
const m = /^\s*([-+]?\d+)\s*$/.exec(parsed.arg);
|
|
224
|
+
if (!m) throw new Error(`obj: invalid int value "${token}"`);
|
|
225
|
+
values[i] = Number(m[1]);
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* grab_index_and_int with a prefix: "RES_ACID[1]" against element names
|
|
231
|
+
* and prefix "RES_" -> { index, value }, or null when no name matches.
|
|
232
|
+
*/
|
|
233
|
+
export function grabIndexAndInt(
|
|
234
|
+
names: readonly string[],
|
|
235
|
+
prefix: string,
|
|
236
|
+
token: string,
|
|
237
|
+
): { index: number; value: number } | null {
|
|
238
|
+
const parsed = findValueArg(token);
|
|
239
|
+
if (!parsed) return null;
|
|
240
|
+
const m = /^\s*([-+]?\d+)\s*$/.exec(parsed.arg);
|
|
241
|
+
if (!m) return null;
|
|
242
|
+
for (let i = 0; i < names.length; i++) {
|
|
243
|
+
if (prefix + (names[i] as string) === parsed.name) {
|
|
244
|
+
return { index: i, value: Number(m[1]) };
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* grab_element_flag: "IGNORE_ACID" / "HATES_FIRE" -> set the EL_INFO
|
|
252
|
+
* bit on the named element. Returns true when handled.
|
|
253
|
+
*/
|
|
254
|
+
export function grabElementFlag(
|
|
255
|
+
elInfo: ElementInfo[],
|
|
256
|
+
flagName: string,
|
|
257
|
+
): boolean {
|
|
258
|
+
const under = flagName.indexOf("_");
|
|
259
|
+
if (under < 0) return false;
|
|
260
|
+
const prefix = flagName.slice(0, under);
|
|
261
|
+
const suffix = flagName.slice(under + 1);
|
|
262
|
+
const i = ELEMENT_NAMES.indexOf(suffix);
|
|
263
|
+
if (i < 0) return false;
|
|
264
|
+
const info = elInfo[i] as ElementInfo;
|
|
265
|
+
if (prefix === "IGNORE") {
|
|
266
|
+
info.flags |= EL_INFO_IGNORE;
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
if (prefix === "HATES") {
|
|
270
|
+
info.flags |= EL_INFO_HATES;
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* grab_flag against a NAME -> value map; returns true when matched.
|
|
278
|
+
* The `table[name]` probe is lookup_flag (datafile.c:149): the generated
|
|
279
|
+
* name->index records replace upstream's linear scan of a `const char **`
|
|
280
|
+
* table, and `undefined` / 0 is its FLAG_END miss.
|
|
281
|
+
*/
|
|
282
|
+
function grabFlag(
|
|
283
|
+
flags: FlagSet,
|
|
284
|
+
table: Record<string, number>,
|
|
285
|
+
name: string,
|
|
286
|
+
): boolean {
|
|
287
|
+
const value = table[name];
|
|
288
|
+
if (value === undefined || value === 0) return false;
|
|
289
|
+
flags.on(value);
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Tokenize a flags/values line the way strtok(s, " |") does. */
|
|
294
|
+
function tokens(lines: string[] | undefined): string[] {
|
|
295
|
+
if (!lines) return [];
|
|
296
|
+
const out: string[] = [];
|
|
297
|
+
for (const line of lines) {
|
|
298
|
+
for (const tok of line.split(/[ |]+/)) {
|
|
299
|
+
if (tok.length > 0) out.push(tok);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return out;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** string_append semantics: multi-line text concatenates directly. */
|
|
306
|
+
function joinLines(lines: string[] | undefined): string {
|
|
307
|
+
return lines ? lines.join("") : "";
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/* ------------------------------------------------------------------ */
|
|
311
|
+
/* obj-tval.c */
|
|
312
|
+
/* ------------------------------------------------------------------ */
|
|
313
|
+
|
|
314
|
+
/** de_armour: "armour" -> "armor", truncating anything after it. */
|
|
315
|
+
function deArmour(name: string): string {
|
|
316
|
+
const at = name.indexOf("armour");
|
|
317
|
+
if (at < 0) return name;
|
|
318
|
+
return name.slice(0, at + 4) + "r";
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* tval_find_idx: the numeric tval of a textual tval name (or a numeric
|
|
323
|
+
* string), -1 when unknown.
|
|
324
|
+
*/
|
|
325
|
+
export function tvalFindIdx(name: string): number {
|
|
326
|
+
const num = /^\s*(\d+)\s*$/.exec(name);
|
|
327
|
+
if (num) {
|
|
328
|
+
const r = Number(num[1]);
|
|
329
|
+
return r < TV_MAX ? r : -1;
|
|
330
|
+
}
|
|
331
|
+
const mod = deArmour(name).toLowerCase();
|
|
332
|
+
for (let i = 0; i < TVAL_ENTRIES.length; i++) {
|
|
333
|
+
if ((TVAL_ENTRIES[i] as { textName: string }).textName === mod) return i;
|
|
334
|
+
}
|
|
335
|
+
return -1;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/** tval_find_name: textual name for a numeric tval. */
|
|
339
|
+
export function tvalFindName(tval: number): string {
|
|
340
|
+
const e = TVAL_ENTRIES[tval];
|
|
341
|
+
return e ? e.textName : "unknown";
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/* ------------------------------------------------------------------ */
|
|
345
|
+
/* obj-desc.c name formatting (for lookup_sval) */
|
|
346
|
+
/* ------------------------------------------------------------------ */
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* obj_desc_name_format with a null modstr: strips '&' (and spaces after
|
|
350
|
+
* it), drops '~' (singular), picks the singular side of "|sing|plur|".
|
|
351
|
+
*/
|
|
352
|
+
export function objDescNameFormat(fmt: string): string {
|
|
353
|
+
let out = "";
|
|
354
|
+
let i = 0;
|
|
355
|
+
while (i < fmt.length) {
|
|
356
|
+
const c = fmt[i] as string;
|
|
357
|
+
if (c === "&") {
|
|
358
|
+
while (fmt[i] === " " || fmt[i] === "&") i++;
|
|
359
|
+
continue;
|
|
360
|
+
} else if (c === "~") {
|
|
361
|
+
i++;
|
|
362
|
+
continue;
|
|
363
|
+
} else if (c === "|") {
|
|
364
|
+
const plural = fmt.indexOf("|", i + 1);
|
|
365
|
+
const endmark = plural >= 0 ? fmt.indexOf("|", plural + 1) : -1;
|
|
366
|
+
if (plural < 0 || endmark < 0) return out;
|
|
367
|
+
out += fmt.slice(i + 1, plural);
|
|
368
|
+
i = endmark + 1;
|
|
369
|
+
continue;
|
|
370
|
+
} else {
|
|
371
|
+
out += c;
|
|
372
|
+
i++;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return out;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/* ------------------------------------------------------------------ */
|
|
379
|
+
/* The registry */
|
|
380
|
+
/* ------------------------------------------------------------------ */
|
|
381
|
+
|
|
382
|
+
function bindEffects(
|
|
383
|
+
records: EffectRecordJson[] | undefined,
|
|
384
|
+
): EffectRecordJson[] | null {
|
|
385
|
+
return records && records.length > 0 ? records : null;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* All object-domain registries, bound from the compiled pack JSON.
|
|
390
|
+
*
|
|
391
|
+
* Arrays with 1-based upstream indexing (slays, brands, curses,
|
|
392
|
+
* activations, artifacts, properties) keep a null at index 0.
|
|
393
|
+
*/
|
|
394
|
+
export class ObjRegistry {
|
|
395
|
+
/** kb_info: bases indexed by tval (missing tvals get a default base). */
|
|
396
|
+
readonly bases: ObjectBase[] = [];
|
|
397
|
+
/** k_info in kidx order; ordinary kinds then INSTA_ART dummies. */
|
|
398
|
+
readonly kinds: ObjectKind[] = [];
|
|
399
|
+
/** Count of ordinary kinds (before artifact dummy kinds). */
|
|
400
|
+
ordinaryKindCount = 0;
|
|
401
|
+
/** e_info in eidx order. */
|
|
402
|
+
readonly egos: EgoItem[] = [];
|
|
403
|
+
/** a_info, 1-based (index 0 is null). */
|
|
404
|
+
readonly artifacts: (Artifact | null)[] = [null];
|
|
405
|
+
/** curses, 1-based, reverse file order (upstream quirk). */
|
|
406
|
+
readonly curses: (Curse | null)[] = [null];
|
|
407
|
+
/** brands, 1-based, reverse file order (upstream quirk). */
|
|
408
|
+
readonly brands: (Brand | null)[] = [null];
|
|
409
|
+
/** slays, 1-based, reverse file order (upstream quirk). */
|
|
410
|
+
readonly slays: (Slay | null)[] = [null];
|
|
411
|
+
/** activations, 1-based, reverse file order (upstream quirk). */
|
|
412
|
+
readonly activations: (Activation | null)[] = [null];
|
|
413
|
+
/** obj_properties, 1-based, file order. */
|
|
414
|
+
readonly properties: (ObjectProperty | null)[] = [null];
|
|
415
|
+
/** Flat flavor list in file order. */
|
|
416
|
+
readonly flavors: Flavor[] = [];
|
|
417
|
+
|
|
418
|
+
/* The generic object kinds resolved by finish_parse_artifact. */
|
|
419
|
+
unknownItemKind: ObjectKind | null = null;
|
|
420
|
+
unknownGoldKind: ObjectKind | null = null;
|
|
421
|
+
pileKind: ObjectKind | null = null;
|
|
422
|
+
curseObjectKind: ObjectKind | null = null;
|
|
423
|
+
|
|
424
|
+
/** z_info->brand_max (array length including the null slot). */
|
|
425
|
+
get brandMax(): number {
|
|
426
|
+
return this.brands.length;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/** z_info->slay_max. */
|
|
430
|
+
get slayMax(): number {
|
|
431
|
+
return this.slays.length;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/** z_info->curse_max. */
|
|
435
|
+
get curseMax(): number {
|
|
436
|
+
return this.curses.length;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
constructor(pack: ObjPackJson) {
|
|
440
|
+
/* Upstream init_arrays order: bases, slays, brands, curses,
|
|
441
|
+
* objects, activations, egos, artifacts, properties, flavors. */
|
|
442
|
+
this.bindBases(pack.objectBase.records, pack.objectBase.header);
|
|
443
|
+
this.bindSlays(pack.slay.records);
|
|
444
|
+
this.bindBrands(pack.brand.records);
|
|
445
|
+
this.bindCurses(pack.curse.records);
|
|
446
|
+
this.bindKinds(pack.object.records);
|
|
447
|
+
this.bindActivations(pack.activation.records);
|
|
448
|
+
this.bindEgos(pack.egoItem.records);
|
|
449
|
+
this.bindArtifacts(pack.artifact.records);
|
|
450
|
+
this.bindProperties(pack.objectProperty.records);
|
|
451
|
+
this.bindFlavors(pack.flavor.records);
|
|
452
|
+
this.finish();
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/* -------------------------------------------------------------- */
|
|
456
|
+
|
|
457
|
+
/** lookup_kind: kind by tval and sval, or null. */
|
|
458
|
+
lookupKind(tval: number, sval: number): ObjectKind | null {
|
|
459
|
+
for (const kind of this.kinds) {
|
|
460
|
+
if (kind.tval === tval && kind.sval === sval) return kind;
|
|
461
|
+
}
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/** objkind_byid. */
|
|
466
|
+
kindByIdx(kidx: number): ObjectKind | null {
|
|
467
|
+
return this.kinds[kidx] ?? null;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* lookup_sval: sval of the kind whose formatted name matches (case
|
|
472
|
+
* insensitively), or a numeric string passed through; -1 when unknown.
|
|
473
|
+
*/
|
|
474
|
+
lookupSval(tval: number, name: string): number {
|
|
475
|
+
const num = /^\s*(\d+)\s*$/.exec(name);
|
|
476
|
+
if (num) return Number(num[1]);
|
|
477
|
+
const wanted = name.toLowerCase();
|
|
478
|
+
for (const kind of this.kinds) {
|
|
479
|
+
if (kind.tval !== tval || !kind.name) continue;
|
|
480
|
+
if (objDescNameFormat(kind.name).toLowerCase() === wanted) {
|
|
481
|
+
return kind.sval;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return -1;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/** lookup_curse: 1-based curse index by name, or 0. */
|
|
488
|
+
lookupCurse(name: string): number {
|
|
489
|
+
for (let i = 1; i < this.curses.length; i++) {
|
|
490
|
+
if ((this.curses[i] as Curse).name === name) return i;
|
|
491
|
+
}
|
|
492
|
+
return 0;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/** Brand index by code, or 0. */
|
|
496
|
+
lookupBrand(code: string): number {
|
|
497
|
+
for (let i = 1; i < this.brands.length; i++) {
|
|
498
|
+
if ((this.brands[i] as Brand).code === code) return i;
|
|
499
|
+
}
|
|
500
|
+
return 0;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/** Slay index by code, or 0. */
|
|
504
|
+
lookupSlay(code: string): number {
|
|
505
|
+
for (let i = 1; i < this.slays.length; i++) {
|
|
506
|
+
if ((this.slays[i] as Slay).code === code) return i;
|
|
507
|
+
}
|
|
508
|
+
return 0;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/** findact: activation by name, or null. */
|
|
512
|
+
findActivation(name: string): Activation | null {
|
|
513
|
+
for (let i = 1; i < this.activations.length; i++) {
|
|
514
|
+
const act = this.activations[i] as Activation;
|
|
515
|
+
if (act.name === name) return act;
|
|
516
|
+
}
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/** Ego by exact name, or null (test/mod convenience). */
|
|
521
|
+
findEgo(name: string): EgoItem | null {
|
|
522
|
+
for (const ego of this.egos) {
|
|
523
|
+
if (ego.name === name) return ego;
|
|
524
|
+
}
|
|
525
|
+
return null;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/** Artifact by exact name, or null (test/mod convenience). */
|
|
529
|
+
findArtifact(name: string): Artifact | null {
|
|
530
|
+
for (let i = 1; i < this.artifacts.length; i++) {
|
|
531
|
+
const art = this.artifacts[i] as Artifact;
|
|
532
|
+
if (art.name === name) return art;
|
|
533
|
+
}
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* lookup_artifact_name (obj-util.c L520): the artifact whose name EQUALS
|
|
539
|
+
* `name`, else the first artifact whose name CONTAINS `name`
|
|
540
|
+
* case-insensitively (only when `name` is at least 3 characters). Backs the
|
|
541
|
+
* wizard-mode "Enter new artifact:" prompt's name branch (cmd-wizard.c L2798),
|
|
542
|
+
* so `narthanc` and `hanc` both resolve.
|
|
543
|
+
*
|
|
544
|
+
* Two upstream warts are reproduced deliberately:
|
|
545
|
+
* - the exact-match test runs inside the same loop, so an exact match on a
|
|
546
|
+
* LATER artifact still wins over an earlier substring match;
|
|
547
|
+
* - the close-match result is returned only when `a_idx > 0` (L540), so a
|
|
548
|
+
* substring hit at index 0 yields NULL. Here index 0 is the reserved null
|
|
549
|
+
* artifact, which makes the wart inert - but the `> 0` bound is kept.
|
|
550
|
+
*/
|
|
551
|
+
lookupArtifactName(name: string): Artifact | null {
|
|
552
|
+
const needle = name.toUpperCase();
|
|
553
|
+
let aIdx = -1;
|
|
554
|
+
for (let i = 0; i < this.artifacts.length; i++) {
|
|
555
|
+
const art = this.artifacts[i];
|
|
556
|
+
if (!art) continue;
|
|
557
|
+
/* Test for equality. */
|
|
558
|
+
if (art.name === name) return art;
|
|
559
|
+
/* Test for close matches. */
|
|
560
|
+
if (name.length >= 3 && art.name.toUpperCase().includes(needle) && aIdx === -1) {
|
|
561
|
+
aIdx = i;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
/* Return our best match (L540: strictly > 0). */
|
|
565
|
+
return aIdx > 0 ? (this.artifacts[aIdx] as Artifact) : null;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* lookup_ego_item (obj-util.c L549): the ego of exactly this `name` that can
|
|
570
|
+
* be applied to the kind with `tval`/`sval`. Backs the wizard-mode "Enter ego
|
|
571
|
+
* item:" prompt's name branch (cmd-wizard.c L2752). Unlike the artifact
|
|
572
|
+
* lookup this is EXACT-name only, and an ego whose poss_items list does not
|
|
573
|
+
* hold the kind is skipped even when the name matches.
|
|
574
|
+
*/
|
|
575
|
+
lookupEgoItem(name: string, tval: number, sval: number): EgoItem | null {
|
|
576
|
+
const kind = this.lookupKind(tval, sval);
|
|
577
|
+
if (!kind) return null;
|
|
578
|
+
for (const ego of this.egos) {
|
|
579
|
+
/* Reject nameless and wrong names. */
|
|
580
|
+
if (!ego.name) continue;
|
|
581
|
+
if (ego.name !== name) continue;
|
|
582
|
+
/* Check tval and sval. */
|
|
583
|
+
if (ego.possItems.has(kind.kidx)) return ego;
|
|
584
|
+
}
|
|
585
|
+
return null;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/* -------------------------------------------------------------- */
|
|
589
|
+
/* Binding */
|
|
590
|
+
/* -------------------------------------------------------------- */
|
|
591
|
+
|
|
592
|
+
private bindBases(
|
|
593
|
+
records: ObjectBaseRecordJson[],
|
|
594
|
+
header: { default?: Array<{ label: string; value: number }> } | undefined,
|
|
595
|
+
): void {
|
|
596
|
+
let defBreak = 0;
|
|
597
|
+
let defMaxStack = 0;
|
|
598
|
+
for (const { label, value } of header?.default ?? []) {
|
|
599
|
+
if (label === "break-chance") defBreak = value;
|
|
600
|
+
else if (label === "max-stack") defMaxStack = value;
|
|
601
|
+
else throw new Error(`object_base: unknown default ${label}`);
|
|
602
|
+
}
|
|
603
|
+
/* kb_info is mem_zalloc'd for every tval; unlisted tvals stay
|
|
604
|
+
* zeroed (name "", flags empty, max_stack 0). */
|
|
605
|
+
for (let tval = 0; tval < TV_MAX; tval++) {
|
|
606
|
+
this.bases.push({
|
|
607
|
+
name: "",
|
|
608
|
+
tval,
|
|
609
|
+
attr: "",
|
|
610
|
+
flags: newOfFlags(),
|
|
611
|
+
kindFlags: newKfFlags(),
|
|
612
|
+
elInfo: newElemInfo(),
|
|
613
|
+
breakPerc: 0,
|
|
614
|
+
maxStack: 0,
|
|
615
|
+
numSvals: 0,
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
for (const rec of records) {
|
|
619
|
+
const tval = tvalFindIdx(rec.name.tval);
|
|
620
|
+
if (tval < 0) {
|
|
621
|
+
throw new Error(`object_base: unknown tval ${rec.name.tval}`);
|
|
622
|
+
}
|
|
623
|
+
const base = this.bases[tval] as ObjectBase;
|
|
624
|
+
base.name = rec.name.name ?? "";
|
|
625
|
+
base.attr = rec.graphics ?? "";
|
|
626
|
+
base.breakPerc = rec.break ?? defBreak;
|
|
627
|
+
base.maxStack = rec["max-stack"] ?? defMaxStack;
|
|
628
|
+
for (const tok of tokens(rec.flags)) {
|
|
629
|
+
const found =
|
|
630
|
+
grabFlag(base.flags, OF, tok) ||
|
|
631
|
+
grabFlag(base.kindFlags, KF, tok) ||
|
|
632
|
+
grabElementFlag(base.elInfo, tok);
|
|
633
|
+
if (!found) throw new Error(`object_base: invalid flag ${tok}`);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
private bindSlays(records: SlayRecordJsonArray): void {
|
|
639
|
+
/* finish_parse_slay walks the prepended list: index 1 is the LAST
|
|
640
|
+
* record in the file. */
|
|
641
|
+
for (let r = records.length - 1; r >= 0; r--) {
|
|
642
|
+
const rec = records[r] as (typeof records)[number];
|
|
643
|
+
const raceFlag = rec["race-flag"]
|
|
644
|
+
? ((RF as Record<string, number>)[rec["race-flag"]] ?? -1)
|
|
645
|
+
: 0;
|
|
646
|
+
if (raceFlag < 0) {
|
|
647
|
+
throw new Error(`slay: invalid race flag ${rec["race-flag"]}`);
|
|
648
|
+
}
|
|
649
|
+
this.slays.push({
|
|
650
|
+
index: this.slays.length,
|
|
651
|
+
code: rec.code,
|
|
652
|
+
name: rec.name ?? "",
|
|
653
|
+
base: rec.base ?? null,
|
|
654
|
+
meleeVerb: rec["melee-verb"] ?? "",
|
|
655
|
+
rangeVerb: rec["range-verb"] ?? "",
|
|
656
|
+
raceFlag,
|
|
657
|
+
multiplier: rec.multiplier ?? 0,
|
|
658
|
+
oMultiplier: rec["o-multiplier"] ?? 0,
|
|
659
|
+
power: rec.power ?? 0,
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
private bindBrands(records: BrandRecordJson[]): void {
|
|
665
|
+
for (let r = records.length - 1; r >= 0; r--) {
|
|
666
|
+
const rec = records[r] as BrandRecordJson;
|
|
667
|
+
const resolve = (name: string | undefined): number => {
|
|
668
|
+
if (!name) return 0;
|
|
669
|
+
const value = (RF as Record<string, number>)[name];
|
|
670
|
+
if (value === undefined) {
|
|
671
|
+
throw new Error(`brand: invalid race flag ${name}`);
|
|
672
|
+
}
|
|
673
|
+
return value;
|
|
674
|
+
};
|
|
675
|
+
this.brands.push({
|
|
676
|
+
index: this.brands.length,
|
|
677
|
+
code: rec.code,
|
|
678
|
+
name: rec.name ?? "",
|
|
679
|
+
verb: rec.verb ?? "",
|
|
680
|
+
resistFlag: resolve(rec["resist-flag"]),
|
|
681
|
+
vulnFlag: resolve(rec["vuln-flag"]),
|
|
682
|
+
multiplier: rec.multiplier ?? 0,
|
|
683
|
+
oMultiplier: rec["o-multiplier"] ?? 0,
|
|
684
|
+
power: rec.power ?? 0,
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* parse_curse_weight (obj-init.c) refuses an adjustment that will not fit in
|
|
691
|
+
* the int16_t it is stored in: `< -32768 || > 32767` is
|
|
692
|
+
* PARSE_ERROR_INVALID_VALUE (curse.c test_weight_bad0 plants 32769 and
|
|
693
|
+
* -32780). Negative-with-MULTIPLY_WEIGHT is a separate finalize-time check
|
|
694
|
+
* upstream and is not this one.
|
|
695
|
+
*/
|
|
696
|
+
private static curseWeight(name: string, weight: number | undefined): number {
|
|
697
|
+
if (weight === undefined) return 0;
|
|
698
|
+
if (weight < -32768 || weight > 32767) {
|
|
699
|
+
throw new Error(
|
|
700
|
+
`curse: ${name}: weight ${String(weight)} does not fit in an int16 ` +
|
|
701
|
+
`(PARSE_ERROR_INVALID_VALUE)`,
|
|
702
|
+
);
|
|
703
|
+
}
|
|
704
|
+
return weight;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
private bindCurses(records: CurseRecordJson[]): void {
|
|
708
|
+
for (let r = records.length - 1; r >= 0; r--) {
|
|
709
|
+
const rec = records[r] as CurseRecordJson;
|
|
710
|
+
const poss: boolean[] = new Array<boolean>(TV_MAX).fill(false);
|
|
711
|
+
for (const tvalName of rec.type ?? []) {
|
|
712
|
+
const tval = tvalFindIdx(tvalName);
|
|
713
|
+
if (tval < 0 || tval >= TV_MAX) {
|
|
714
|
+
throw new Error(`curse: unknown tval ${tvalName}`);
|
|
715
|
+
}
|
|
716
|
+
poss[tval] = true;
|
|
717
|
+
}
|
|
718
|
+
const objFlags = newOfFlags();
|
|
719
|
+
const elInfo = newElemInfo();
|
|
720
|
+
for (const tok of tokens(rec.flags)) {
|
|
721
|
+
const found =
|
|
722
|
+
grabFlag(objFlags, OF, tok) || grabElementFlag(elInfo, tok);
|
|
723
|
+
if (!found) throw new Error(`curse: invalid flag ${tok}`);
|
|
724
|
+
}
|
|
725
|
+
const modifiers = new Array<number>(OBJ_MOD_MAX).fill(0);
|
|
726
|
+
for (const tok of tokens(rec.values)) {
|
|
727
|
+
let found = false;
|
|
728
|
+
const mod = grabIndexAndInt(OBJ_MOD_NAMES, "", tok);
|
|
729
|
+
if (mod) {
|
|
730
|
+
modifiers[mod.index] = mod.value;
|
|
731
|
+
found = true;
|
|
732
|
+
}
|
|
733
|
+
const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
|
|
734
|
+
if (res) {
|
|
735
|
+
(elInfo[res.index] as ElementInfo).resLevel = res.value;
|
|
736
|
+
found = true;
|
|
737
|
+
}
|
|
738
|
+
if (!found) throw new Error(`curse: invalid value ${tok}`);
|
|
739
|
+
}
|
|
740
|
+
const conflictFlags = newOfFlags();
|
|
741
|
+
for (const tok of tokens(rec["conflict-flags"])) {
|
|
742
|
+
if (!grabFlag(conflictFlags, OF, tok)) {
|
|
743
|
+
throw new Error(`curse: invalid conflict flag ${tok}`);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
/* parse_curse_conflict wraps every name in pipes. */
|
|
747
|
+
let conflict: string | null = null;
|
|
748
|
+
for (const name of rec.conflict ?? []) {
|
|
749
|
+
conflict = (conflict ?? "") + "|" + name + "|";
|
|
750
|
+
}
|
|
751
|
+
this.curses.push({
|
|
752
|
+
index: this.curses.length,
|
|
753
|
+
name: rec.name,
|
|
754
|
+
poss,
|
|
755
|
+
obj: {
|
|
756
|
+
weight: ObjRegistry.curseWeight(rec.name, rec.weight),
|
|
757
|
+
toH: rec.combat?.["to-h"] ?? 0,
|
|
758
|
+
toD: rec.combat?.["to-d"] ?? 0,
|
|
759
|
+
toA: rec.combat?.["to-a"] ?? 0,
|
|
760
|
+
flags: objFlags,
|
|
761
|
+
modifiers,
|
|
762
|
+
elInfo,
|
|
763
|
+
effect: bindEffects(rec.effect),
|
|
764
|
+
effectMsg: joinLines(rec.msg),
|
|
765
|
+
time: parseRand(rec.time),
|
|
766
|
+
},
|
|
767
|
+
conflict,
|
|
768
|
+
conflictFlags,
|
|
769
|
+
desc: joinLines(rec.desc),
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
private bindKinds(records: ObjectKindRecordJson[]): void {
|
|
775
|
+
for (const rec of records) {
|
|
776
|
+
const tval = tvalFindIdx(rec.type);
|
|
777
|
+
if (tval < 0) throw new Error(`object: unknown tval ${rec.type}`);
|
|
778
|
+
const base = this.bases[tval] as ObjectBase;
|
|
779
|
+
base.numSvals++;
|
|
780
|
+
const flags = newOfFlags();
|
|
781
|
+
const kindFlags = newKfFlags();
|
|
782
|
+
const elInfo = newElemInfo();
|
|
783
|
+
for (const tok of tokens(rec.flags)) {
|
|
784
|
+
const found =
|
|
785
|
+
grabFlag(flags, OF, tok) ||
|
|
786
|
+
grabFlag(kindFlags, KF, tok) ||
|
|
787
|
+
grabElementFlag(elInfo, tok);
|
|
788
|
+
if (!found) throw new Error(`object: invalid flag ${tok}`);
|
|
789
|
+
}
|
|
790
|
+
const modifiers = newModifiersRv();
|
|
791
|
+
for (const tok of tokens(rec.values)) {
|
|
792
|
+
let found = false;
|
|
793
|
+
if (grabRandValue(modifiers, OBJ_MOD_NAMES, tok)) found = true;
|
|
794
|
+
const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
|
|
795
|
+
if (res) {
|
|
796
|
+
(elInfo[res.index] as ElementInfo).resLevel = res.value;
|
|
797
|
+
found = true;
|
|
798
|
+
}
|
|
799
|
+
if (!found) throw new Error(`object: invalid value ${tok}`);
|
|
800
|
+
}
|
|
801
|
+
const hd = parseRand(rec.attack?.hd);
|
|
802
|
+
/*
|
|
803
|
+
* parse_object_pile (obj-init.c L1844-1845) plainly assigns
|
|
804
|
+
* gen_mult_prob and stack_size, so a record with two `pile:` lines
|
|
805
|
+
* keeps the LAST. object.txt:3678/3680 (Potion of Dragon Breath) is
|
|
806
|
+
* exactly that: `pile:100:1d2` then `pile:70:1d3`. Taking the first
|
|
807
|
+
* made it always generate as a pile of 1-2 instead of 70% of the time
|
|
808
|
+
* as a pile of 1-3 (k-info.c test_pile0).
|
|
809
|
+
*/
|
|
810
|
+
const pile = rec.pile?.[rec.pile.length - 1];
|
|
811
|
+
const kind: ObjectKind = {
|
|
812
|
+
name: rec.name,
|
|
813
|
+
text: joinLines(rec.desc),
|
|
814
|
+
base,
|
|
815
|
+
kidx: this.kinds.length,
|
|
816
|
+
tval,
|
|
817
|
+
sval: base.numSvals,
|
|
818
|
+
pval: parseRand(rec.pval),
|
|
819
|
+
toH: parseRand(rec.attack?.["to-h"]),
|
|
820
|
+
toD: parseRand(rec.attack?.["to-d"]),
|
|
821
|
+
toA: parseRand(rec.armor?.["to-a"]),
|
|
822
|
+
ac: rec.armor?.ac ?? 0,
|
|
823
|
+
dd: hd.dice,
|
|
824
|
+
ds: hd.sides,
|
|
825
|
+
weight: rec.weight ?? 0,
|
|
826
|
+
cost: rec.cost ?? 0,
|
|
827
|
+
flags,
|
|
828
|
+
kindFlags,
|
|
829
|
+
modifiers,
|
|
830
|
+
elInfo,
|
|
831
|
+
brands: this.bindBrandList(rec.brand, "object"),
|
|
832
|
+
slays: this.bindSlayList(rec.slay, "object"),
|
|
833
|
+
curses: this.bindCurseList(rec.curse, "object"),
|
|
834
|
+
dAttr: rec.graphics?.color ?? "",
|
|
835
|
+
dChar: rec.graphics?.glyph ?? "",
|
|
836
|
+
allocProb: rec.alloc?.common ?? 0,
|
|
837
|
+
allocMin: 0,
|
|
838
|
+
allocMax: 0,
|
|
839
|
+
level: rec.level ?? 0,
|
|
840
|
+
activation: null,
|
|
841
|
+
effect: bindEffects(rec.effect),
|
|
842
|
+
power: rec.power ?? 0,
|
|
843
|
+
effectMsg: joinLines(rec.msg),
|
|
844
|
+
visMsg: joinLines(rec["vis-msg"]),
|
|
845
|
+
time: parseRand(rec.time),
|
|
846
|
+
charge: parseRand(rec.charges),
|
|
847
|
+
genMultProb: pile?.prob ?? 0,
|
|
848
|
+
stackSize: parseRand(pile?.stack),
|
|
849
|
+
};
|
|
850
|
+
if (rec.alloc) {
|
|
851
|
+
const [amin, amax] = grabIntRange(rec.alloc.minmax);
|
|
852
|
+
kind.allocMin = amin;
|
|
853
|
+
kind.allocMax = amax;
|
|
854
|
+
}
|
|
855
|
+
this.kinds.push(kind);
|
|
856
|
+
}
|
|
857
|
+
this.ordinaryKindCount = this.kinds.length;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
private bindBrandList(
|
|
861
|
+
codes: string[] | undefined,
|
|
862
|
+
what: string,
|
|
863
|
+
): boolean[] | null {
|
|
864
|
+
if (!codes || codes.length === 0) return null;
|
|
865
|
+
const out = new Array<boolean>(this.brands.length).fill(false);
|
|
866
|
+
for (const code of codes) {
|
|
867
|
+
const i = this.lookupBrand(code);
|
|
868
|
+
if (i === 0) throw new Error(`${what}: unrecognised brand ${code}`);
|
|
869
|
+
out[i] = true;
|
|
870
|
+
}
|
|
871
|
+
return out;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
private bindSlayList(
|
|
875
|
+
codes: string[] | undefined,
|
|
876
|
+
what: string,
|
|
877
|
+
): boolean[] | null {
|
|
878
|
+
if (!codes || codes.length === 0) return null;
|
|
879
|
+
const out = new Array<boolean>(this.slays.length).fill(false);
|
|
880
|
+
for (const code of codes) {
|
|
881
|
+
const i = this.lookupSlay(code);
|
|
882
|
+
if (i === 0) throw new Error(`${what}: unrecognised slay ${code}`);
|
|
883
|
+
out[i] = true;
|
|
884
|
+
}
|
|
885
|
+
return out;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
private bindCurseList(
|
|
889
|
+
entries: Array<{ name: string; power: number }> | undefined,
|
|
890
|
+
what: string,
|
|
891
|
+
): number[] | null {
|
|
892
|
+
if (!entries || entries.length === 0) return null;
|
|
893
|
+
let out: number[] | null = null;
|
|
894
|
+
for (const { name, power } of entries) {
|
|
895
|
+
const i = this.lookupCurse(name);
|
|
896
|
+
if (i === 0) throw new Error(`${what}: unrecognised curse ${name}`);
|
|
897
|
+
/* Only add if it has power (upstream). */
|
|
898
|
+
if (power > 0) {
|
|
899
|
+
if (!out) out = new Array<number>(this.curses.length).fill(0);
|
|
900
|
+
out[i] = power;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
return out;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
private bindActivations(records: ActivationRecordJson[]): void {
|
|
907
|
+
/* Reverse file order, as finish_parse_act. */
|
|
908
|
+
for (let r = records.length - 1; r >= 0; r--) {
|
|
909
|
+
const rec = records[r] as ActivationRecordJson;
|
|
910
|
+
this.activations.push({
|
|
911
|
+
index: this.activations.length,
|
|
912
|
+
name: rec.name,
|
|
913
|
+
aim: (rec.aim ?? 0) !== 0,
|
|
914
|
+
level: rec.level ?? 0,
|
|
915
|
+
power: rec.power ?? 0,
|
|
916
|
+
effect: bindEffects(rec.effect),
|
|
917
|
+
message: joinLines(rec.msg),
|
|
918
|
+
desc: joinLines(rec.desc),
|
|
919
|
+
});
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
private bindEgos(records: EgoRecordJson[]): void {
|
|
924
|
+
for (const rec of records) {
|
|
925
|
+
const flags = newOfFlags();
|
|
926
|
+
const flagsOff = newOfFlags();
|
|
927
|
+
const kindFlags = newKfFlags();
|
|
928
|
+
const elInfo = newElemInfo();
|
|
929
|
+
for (const tok of tokens(rec.flags)) {
|
|
930
|
+
const found =
|
|
931
|
+
grabFlag(flags, OF, tok) ||
|
|
932
|
+
grabFlag(kindFlags, KF, tok) ||
|
|
933
|
+
grabElementFlag(elInfo, tok);
|
|
934
|
+
if (!found) throw new Error(`ego: invalid flag ${tok}`);
|
|
935
|
+
}
|
|
936
|
+
for (const tok of tokens(rec["flags-off"])) {
|
|
937
|
+
if (!grabFlag(flagsOff, OF, tok)) {
|
|
938
|
+
throw new Error(`ego: invalid flag-off ${tok}`);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
const modifiers = newModifiersRv();
|
|
942
|
+
for (const tok of tokens(rec.values)) {
|
|
943
|
+
let found = false;
|
|
944
|
+
if (grabRandValue(modifiers, OBJ_MOD_NAMES, tok)) found = true;
|
|
945
|
+
const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
|
|
946
|
+
if (res) {
|
|
947
|
+
(elInfo[res.index] as ElementInfo).resLevel = res.value;
|
|
948
|
+
found = true;
|
|
949
|
+
}
|
|
950
|
+
if (!found) throw new Error(`ego: invalid value ${tok}`);
|
|
951
|
+
}
|
|
952
|
+
const minModifiers = new Array<number>(OBJ_MOD_MAX).fill(0);
|
|
953
|
+
for (const tok of tokens(rec["min-values"])) {
|
|
954
|
+
if (!grabIntValue(minModifiers, OBJ_MOD_NAMES, tok)) {
|
|
955
|
+
throw new Error(`ego: invalid min-value ${tok}`);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
const possItems = new Set<number>();
|
|
959
|
+
for (const tvalName of rec.type ?? []) {
|
|
960
|
+
const tval = tvalFindIdx(tvalName);
|
|
961
|
+
if (tval < 0) throw new Error(`ego: unknown tval ${tvalName}`);
|
|
962
|
+
let foundOne = false;
|
|
963
|
+
for (const kind of this.kinds) {
|
|
964
|
+
if (kind.tval === tval) {
|
|
965
|
+
possItems.add(kind.kidx);
|
|
966
|
+
foundOne = true;
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
if (!foundOne) {
|
|
970
|
+
throw new Error(`ego: no kind for ego type ${tvalName}`);
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
for (const item of rec.item ?? []) {
|
|
974
|
+
const tval = tvalFindIdx(item.tval);
|
|
975
|
+
if (tval < 0) throw new Error(`ego: unknown tval ${item.tval}`);
|
|
976
|
+
const sval = this.lookupSval(tval, item.sval);
|
|
977
|
+
if (sval < 0) throw new Error(`ego: unknown sval ${item.sval}`);
|
|
978
|
+
const kind = this.lookupKind(tval, sval);
|
|
979
|
+
if (!kind || kind.kidx <= 0) {
|
|
980
|
+
throw new Error(`ego: invalid item ${item.tval}:${item.sval}`);
|
|
981
|
+
}
|
|
982
|
+
possItems.add(kind.kidx);
|
|
983
|
+
}
|
|
984
|
+
const ego: EgoItem = {
|
|
985
|
+
name: rec.name,
|
|
986
|
+
text: joinLines(rec.desc),
|
|
987
|
+
eidx: this.egos.length,
|
|
988
|
+
cost: rec.info?.cost ?? 0,
|
|
989
|
+
flags,
|
|
990
|
+
flagsOff,
|
|
991
|
+
kindFlags,
|
|
992
|
+
modifiers,
|
|
993
|
+
minModifiers,
|
|
994
|
+
elInfo,
|
|
995
|
+
brands: this.bindBrandList(rec.brand, "ego"),
|
|
996
|
+
slays: this.bindSlayList(rec.slay, "ego"),
|
|
997
|
+
curses: this.bindCurseList(rec.curse, "ego"),
|
|
998
|
+
rating: rec.info?.rating ?? 0,
|
|
999
|
+
allocProb: rec.alloc?.common ?? 0,
|
|
1000
|
+
allocMin: 0,
|
|
1001
|
+
allocMax: 0,
|
|
1002
|
+
possItems,
|
|
1003
|
+
toH: parseRand(rec.combat?.th),
|
|
1004
|
+
toD: parseRand(rec.combat?.td),
|
|
1005
|
+
toA: parseRand(rec.combat?.ta),
|
|
1006
|
+
minToH: rec["min-combat"]?.th ?? NO_MINIMUM,
|
|
1007
|
+
minToD: rec["min-combat"]?.td ?? NO_MINIMUM,
|
|
1008
|
+
minToA: rec["min-combat"]?.ta ?? NO_MINIMUM,
|
|
1009
|
+
activation: rec.act ? this.findActivation(rec.act) : null,
|
|
1010
|
+
time: parseRand(rec.time),
|
|
1011
|
+
};
|
|
1012
|
+
if (rec.alloc) {
|
|
1013
|
+
const [amin, amax] = grabIntRange(rec.alloc.minmax);
|
|
1014
|
+
if (amin > 255 || amax > 255 || amin < 0 || amax < 0) {
|
|
1015
|
+
throw new Error(`ego: allocation out of bounds ${rec.alloc.minmax}`);
|
|
1016
|
+
}
|
|
1017
|
+
ego.allocMin = amin;
|
|
1018
|
+
ego.allocMax = amax;
|
|
1019
|
+
}
|
|
1020
|
+
this.egos.push(ego);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
/**
|
|
1025
|
+
* write_dummy_object_record: append an INSTA_ART kind for a special
|
|
1026
|
+
* artifact base object that has no ordinary kind.
|
|
1027
|
+
*/
|
|
1028
|
+
private writeDummyObjectRecord(tval: number, svalName: string): ObjectKind {
|
|
1029
|
+
const base = this.bases[tval] as ObjectBase;
|
|
1030
|
+
base.numSvals++;
|
|
1031
|
+
const dummy: ObjectKind = {
|
|
1032
|
+
name: `& ${svalName}~`,
|
|
1033
|
+
text: "",
|
|
1034
|
+
base,
|
|
1035
|
+
kidx: this.kinds.length,
|
|
1036
|
+
tval,
|
|
1037
|
+
sval: base.numSvals,
|
|
1038
|
+
pval: zeroRv(),
|
|
1039
|
+
toH: zeroRv(),
|
|
1040
|
+
toD: zeroRv(),
|
|
1041
|
+
toA: zeroRv(),
|
|
1042
|
+
ac: 0,
|
|
1043
|
+
dd: 0,
|
|
1044
|
+
ds: 0,
|
|
1045
|
+
weight: 0,
|
|
1046
|
+
cost: 0,
|
|
1047
|
+
/* Inherit the flags and element info of the tval. */
|
|
1048
|
+
flags: base.flags.clone(),
|
|
1049
|
+
kindFlags: base.kindFlags.clone(),
|
|
1050
|
+
modifiers: newModifiersRv(),
|
|
1051
|
+
elInfo: base.elInfo.map((e) => ({ resLevel: e.resLevel, flags: e.flags })),
|
|
1052
|
+
brands: null,
|
|
1053
|
+
slays: null,
|
|
1054
|
+
curses: null,
|
|
1055
|
+
/* Default colours, meant to be overwritten by graphics:. */
|
|
1056
|
+
dAttr: "Red",
|
|
1057
|
+
dChar: "*",
|
|
1058
|
+
allocProb: 0,
|
|
1059
|
+
allocMin: 0,
|
|
1060
|
+
allocMax: 0,
|
|
1061
|
+
/* Upstream copies art->level before level: is parsed, so 0. */
|
|
1062
|
+
level: 0,
|
|
1063
|
+
activation: null,
|
|
1064
|
+
effect: null,
|
|
1065
|
+
power: 0,
|
|
1066
|
+
effectMsg: "",
|
|
1067
|
+
visMsg: "",
|
|
1068
|
+
time: zeroRv(),
|
|
1069
|
+
charge: zeroRv(),
|
|
1070
|
+
genMultProb: 0,
|
|
1071
|
+
stackSize: zeroRv(),
|
|
1072
|
+
};
|
|
1073
|
+
dummy.kindFlags.on(KF.INSTA_ART);
|
|
1074
|
+
this.kinds.push(dummy);
|
|
1075
|
+
return dummy;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
private bindArtifacts(records: ArtifactRecordJson[]): void {
|
|
1079
|
+
for (const rec of records) {
|
|
1080
|
+
const elInfo = newElemInfo();
|
|
1081
|
+
/* parse_artifact_name: ignore all base elements. */
|
|
1082
|
+
for (let i = ELEM_BASE_MIN; i < ELEM_HIGH_MIN; i++) {
|
|
1083
|
+
(elInfo[i] as ElementInfo).flags |= EL_INFO_IGNORE;
|
|
1084
|
+
}
|
|
1085
|
+
const tval = tvalFindIdx(rec["base-object"].tval);
|
|
1086
|
+
if (tval < 0) {
|
|
1087
|
+
throw new Error(`artifact: unknown tval ${rec["base-object"].tval}`);
|
|
1088
|
+
}
|
|
1089
|
+
let sval = this.lookupSval(tval, rec["base-object"].sval);
|
|
1090
|
+
if (sval < 0) {
|
|
1091
|
+
sval = this.writeDummyObjectRecord(tval, rec["base-object"].sval).sval;
|
|
1092
|
+
}
|
|
1093
|
+
const kind = this.lookupKind(tval, sval);
|
|
1094
|
+
if (!kind) {
|
|
1095
|
+
throw new Error(
|
|
1096
|
+
`artifact: no kind ${rec["base-object"].tval}:${sval}`,
|
|
1097
|
+
);
|
|
1098
|
+
}
|
|
1099
|
+
const flags = newOfFlags();
|
|
1100
|
+
for (const tok of tokens(rec.flags)) {
|
|
1101
|
+
const found = grabFlag(flags, OF, tok) || grabElementFlag(elInfo, tok);
|
|
1102
|
+
if (!found) throw new Error(`artifact: invalid flag ${tok}`);
|
|
1103
|
+
}
|
|
1104
|
+
const modifiers = new Array<number>(OBJ_MOD_MAX).fill(0);
|
|
1105
|
+
for (const tok of tokens(rec.values)) {
|
|
1106
|
+
let found = false;
|
|
1107
|
+
if (grabIntValue(modifiers, OBJ_MOD_NAMES, tok)) found = true;
|
|
1108
|
+
const res = grabIndexAndInt(ELEMENT_NAMES, "RES_", tok);
|
|
1109
|
+
if (res) {
|
|
1110
|
+
(elInfo[res.index] as ElementInfo).resLevel = res.value;
|
|
1111
|
+
found = true;
|
|
1112
|
+
}
|
|
1113
|
+
if (!found) throw new Error(`artifact: invalid value ${tok}`);
|
|
1114
|
+
}
|
|
1115
|
+
const special = kind.kidx >= this.ordinaryKindCount;
|
|
1116
|
+
if (rec.graphics) {
|
|
1117
|
+
/* Only special (INSTA_ART) artifacts may set kind graphics. */
|
|
1118
|
+
if (!kind.kindFlags.has(KF.INSTA_ART)) {
|
|
1119
|
+
throw new Error(`artifact: ${rec.name} is not a special artifact`);
|
|
1120
|
+
}
|
|
1121
|
+
kind.dChar = rec.graphics.glyph;
|
|
1122
|
+
kind.dAttr = rec.graphics.color;
|
|
1123
|
+
}
|
|
1124
|
+
const weight = rec.weight ?? 0;
|
|
1125
|
+
const cost = rec.cost ?? 0;
|
|
1126
|
+
if (special) {
|
|
1127
|
+
kind.weight = weight;
|
|
1128
|
+
kind.cost = cost;
|
|
1129
|
+
}
|
|
1130
|
+
const hd = parseRand(rec.attack?.hd);
|
|
1131
|
+
let activation: Activation | null = null;
|
|
1132
|
+
let time = zeroRv();
|
|
1133
|
+
if (rec.act) {
|
|
1134
|
+
const act = this.findActivation(rec.act);
|
|
1135
|
+
/* Special light activations belong to the base object. */
|
|
1136
|
+
if (tval === TV.LIGHT && special) {
|
|
1137
|
+
kind.activation = act;
|
|
1138
|
+
kind.time = parseRand(rec.time);
|
|
1139
|
+
} else {
|
|
1140
|
+
activation = act;
|
|
1141
|
+
time = parseRand(rec.time);
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
const art: Artifact = {
|
|
1145
|
+
name: rec.name,
|
|
1146
|
+
text: joinLines(rec.desc),
|
|
1147
|
+
aidx: this.artifacts.length,
|
|
1148
|
+
tval,
|
|
1149
|
+
sval,
|
|
1150
|
+
toH: rec.attack?.["to-h"] ?? 0,
|
|
1151
|
+
toD: rec.attack?.["to-d"] ?? 0,
|
|
1152
|
+
toA: rec.armor?.["to-a"] ?? 0,
|
|
1153
|
+
ac: rec.armor?.ac ?? 0,
|
|
1154
|
+
dd: hd.dice,
|
|
1155
|
+
ds: hd.sides,
|
|
1156
|
+
weight,
|
|
1157
|
+
cost,
|
|
1158
|
+
flags,
|
|
1159
|
+
modifiers,
|
|
1160
|
+
elInfo,
|
|
1161
|
+
brands: this.bindBrandList(rec.brand, "artifact"),
|
|
1162
|
+
slays: this.bindSlayList(rec.slay, "artifact"),
|
|
1163
|
+
curses: this.bindCurseList(rec.curse, "artifact"),
|
|
1164
|
+
level: rec.level ?? 0,
|
|
1165
|
+
allocProb: rec.alloc?.common ?? 0,
|
|
1166
|
+
allocMin: 0,
|
|
1167
|
+
allocMax: 0,
|
|
1168
|
+
activation,
|
|
1169
|
+
altMsg: joinLines(rec.msg),
|
|
1170
|
+
time,
|
|
1171
|
+
};
|
|
1172
|
+
if (rec.alloc) {
|
|
1173
|
+
const [amin, amax] = grabIntRange(rec.alloc.minmax);
|
|
1174
|
+
if (amin > 255 || amax > 255 || amin < 0 || amax < 0) {
|
|
1175
|
+
throw new Error(
|
|
1176
|
+
`artifact: allocation out of bounds ${rec.alloc.minmax}`,
|
|
1177
|
+
);
|
|
1178
|
+
}
|
|
1179
|
+
art.allocMin = amin;
|
|
1180
|
+
art.allocMax = amax;
|
|
1181
|
+
}
|
|
1182
|
+
this.artifacts.push(art);
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
private bindProperties(records: ObjectPropertyRecordJson[]): void {
|
|
1187
|
+
const TYPE_NAMES: Record<string, number> = {
|
|
1188
|
+
stat: OBJ_PROPERTY.STAT,
|
|
1189
|
+
mod: OBJ_PROPERTY.MOD,
|
|
1190
|
+
flag: OBJ_PROPERTY.FLAG,
|
|
1191
|
+
ignore: OBJ_PROPERTY.IGNORE,
|
|
1192
|
+
resistance: OBJ_PROPERTY.RESIST,
|
|
1193
|
+
vulnerability: OBJ_PROPERTY.VULN,
|
|
1194
|
+
immunity: OBJ_PROPERTY.IMM,
|
|
1195
|
+
};
|
|
1196
|
+
const SUBTYPE_NAMES: Record<string, number> = {
|
|
1197
|
+
sustain: OFT.SUST,
|
|
1198
|
+
protection: OFT.PROT,
|
|
1199
|
+
"misc ability": OFT.MISC,
|
|
1200
|
+
light: OFT.LIGHT,
|
|
1201
|
+
melee: OFT.MELEE,
|
|
1202
|
+
bad: OFT.BAD,
|
|
1203
|
+
dig: OFT.DIG,
|
|
1204
|
+
throw: OFT.THROW,
|
|
1205
|
+
"curse-only": OFT.CURSE_ONLY,
|
|
1206
|
+
};
|
|
1207
|
+
const ID_NAMES: Record<string, number> = {
|
|
1208
|
+
"on effect": OFID.NORMAL,
|
|
1209
|
+
timed: OFID.TIMED,
|
|
1210
|
+
"on wield": OFID.WIELD,
|
|
1211
|
+
};
|
|
1212
|
+
/* finish_parse_object_property: 1-based, file order. */
|
|
1213
|
+
for (const rec of records) {
|
|
1214
|
+
const type = rec.type !== undefined ? TYPE_NAMES[rec.type] : undefined;
|
|
1215
|
+
if (rec.type !== undefined && type === undefined) {
|
|
1216
|
+
throw new Error(`object_property: invalid type ${rec.type}`);
|
|
1217
|
+
}
|
|
1218
|
+
const subtype =
|
|
1219
|
+
rec.subtype !== undefined ? SUBTYPE_NAMES[rec.subtype] : undefined;
|
|
1220
|
+
if (rec.subtype !== undefined && subtype === undefined) {
|
|
1221
|
+
throw new Error(`object_property: invalid subtype ${rec.subtype}`);
|
|
1222
|
+
}
|
|
1223
|
+
const idType =
|
|
1224
|
+
rec["id-type"] !== undefined ? ID_NAMES[rec["id-type"]] : undefined;
|
|
1225
|
+
if (rec["id-type"] !== undefined && idType === undefined) {
|
|
1226
|
+
throw new Error(`object_property: invalid id-type ${rec["id-type"]}`);
|
|
1227
|
+
}
|
|
1228
|
+
let propIndex = 0;
|
|
1229
|
+
if (rec.code !== undefined) {
|
|
1230
|
+
/* grab_name (datafile.c:433) / lookup_flag (datafile.c:149): resolve a
|
|
1231
|
+
* data-file name against the generated name table, throwing on a miss
|
|
1232
|
+
* where upstream msg()s and returns PARSE_ERROR_GENERIC. */
|
|
1233
|
+
const t = type ?? OBJ_PROPERTY.NONE;
|
|
1234
|
+
let idx = -1;
|
|
1235
|
+
if (t === OBJ_PROPERTY.STAT || t === OBJ_PROPERTY.MOD) {
|
|
1236
|
+
idx = OBJ_MOD_NAMES.indexOf(rec.code);
|
|
1237
|
+
} else if (t === OBJ_PROPERTY.FLAG) {
|
|
1238
|
+
const v = (OF as Record<string, number>)[rec.code];
|
|
1239
|
+
idx = v === undefined ? -1 : v;
|
|
1240
|
+
} else if (
|
|
1241
|
+
t === OBJ_PROPERTY.IGNORE ||
|
|
1242
|
+
t === OBJ_PROPERTY.RESIST ||
|
|
1243
|
+
t === OBJ_PROPERTY.VULN ||
|
|
1244
|
+
t === OBJ_PROPERTY.IMM
|
|
1245
|
+
) {
|
|
1246
|
+
idx = ELEMENT_NAMES.indexOf(rec.code);
|
|
1247
|
+
}
|
|
1248
|
+
if (idx < 0) {
|
|
1249
|
+
throw new Error(`object_property: invalid code ${rec.code}`);
|
|
1250
|
+
}
|
|
1251
|
+
propIndex = idx;
|
|
1252
|
+
}
|
|
1253
|
+
const typeMult = new Array<number>(TV_MAX).fill(1);
|
|
1254
|
+
for (const { type: tvalName, mult } of rec["type-mult"] ?? []) {
|
|
1255
|
+
const tval = tvalFindIdx(tvalName);
|
|
1256
|
+
if (tval < 0) {
|
|
1257
|
+
throw new Error(`object_property: unknown tval ${tvalName}`);
|
|
1258
|
+
}
|
|
1259
|
+
typeMult[tval] = mult;
|
|
1260
|
+
}
|
|
1261
|
+
this.properties.push({
|
|
1262
|
+
index: this.properties.length,
|
|
1263
|
+
type: type ?? OBJ_PROPERTY.NONE,
|
|
1264
|
+
subtype: subtype ?? OFT.NONE,
|
|
1265
|
+
idType: idType ?? OFID.NONE,
|
|
1266
|
+
propIndex,
|
|
1267
|
+
power: rec.power ?? 0,
|
|
1268
|
+
mult: rec.mult ?? 0,
|
|
1269
|
+
typeMult,
|
|
1270
|
+
name: rec.name,
|
|
1271
|
+
adjective: rec.adjective ?? "",
|
|
1272
|
+
negAdj: rec["neg-adjective"] ?? "",
|
|
1273
|
+
msg: rec.msg ?? "",
|
|
1274
|
+
desc: rec.desc ?? "",
|
|
1275
|
+
});
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
private bindFlavors(records: FlavorRecordJson[]): void {
|
|
1280
|
+
for (const rec of records) {
|
|
1281
|
+
const tval = tvalFindIdx(rec.kind.tval);
|
|
1282
|
+
if (tval <= 0) throw new Error(`flavor: unknown tval ${rec.kind.tval}`);
|
|
1283
|
+
const bindEntry = (entry: {
|
|
1284
|
+
index: number;
|
|
1285
|
+
sval?: string;
|
|
1286
|
+
attr: string;
|
|
1287
|
+
desc?: string;
|
|
1288
|
+
}): void => {
|
|
1289
|
+
let sval = SV_UNKNOWN;
|
|
1290
|
+
if (entry.sval !== undefined) {
|
|
1291
|
+
sval = this.lookupSval(tval, entry.sval);
|
|
1292
|
+
}
|
|
1293
|
+
this.flavors.push({
|
|
1294
|
+
fidx: entry.index,
|
|
1295
|
+
tval,
|
|
1296
|
+
sval,
|
|
1297
|
+
dAttr: entry.attr,
|
|
1298
|
+
dChar: rec.kind.glyph,
|
|
1299
|
+
text: entry.desc ?? "",
|
|
1300
|
+
});
|
|
1301
|
+
};
|
|
1302
|
+
for (const entry of rec.flavor ?? []) bindEntry(entry);
|
|
1303
|
+
for (const entry of rec.fixed ?? []) bindEntry(entry);
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
private finish(): void {
|
|
1308
|
+
/* finish_parse_object: add base kind flags to kind kind flags.
|
|
1309
|
+
* (Dummy artifact kinds already copied the base's kind flags.) */
|
|
1310
|
+
for (const kind of this.kinds) {
|
|
1311
|
+
kind.kindFlags.union(kind.base.kindFlags);
|
|
1312
|
+
}
|
|
1313
|
+
/* finish_parse_artifact: resolve the object-like kinds. */
|
|
1314
|
+
const none = tvalFindIdx("none");
|
|
1315
|
+
const kindOrNull = (name: string): ObjectKind | null => {
|
|
1316
|
+
const sval = this.lookupSval(none, name);
|
|
1317
|
+
return sval < 0 ? null : this.lookupKind(none, sval);
|
|
1318
|
+
};
|
|
1319
|
+
this.unknownItemKind = kindOrNull("<unknown item>");
|
|
1320
|
+
this.unknownGoldKind = kindOrNull("<unknown treasure>");
|
|
1321
|
+
this.pileKind = kindOrNull("<pile>");
|
|
1322
|
+
this.curseObjectKind = kindOrNull("<curse object>");
|
|
1323
|
+
/* write_curse_kinds: curse template objects reference the curse
|
|
1324
|
+
* object kind; the known-object side is part of the deferred
|
|
1325
|
+
* knowledge system. */
|
|
1326
|
+
}
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
type SlayRecordJsonArray = ObjPackJson["slay"]["records"];
|
|
1330
|
+
|
|
1331
|
+
/** Assemble the ObjPackJson bundle from individually parsed pack files. */
|
|
1332
|
+
export function objPackFromJson(parts: {
|
|
1333
|
+
objectBase: unknown;
|
|
1334
|
+
object: unknown;
|
|
1335
|
+
egoItem: unknown;
|
|
1336
|
+
artifact: unknown;
|
|
1337
|
+
curse: unknown;
|
|
1338
|
+
brand: unknown;
|
|
1339
|
+
slay: unknown;
|
|
1340
|
+
activation: unknown;
|
|
1341
|
+
objectProperty: unknown;
|
|
1342
|
+
flavor: unknown;
|
|
1343
|
+
}): ObjPackJson {
|
|
1344
|
+
return parts as unknown as ObjPackJson;
|
|
1345
|
+
}
|