@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
|
@@ -0,0 +1,1364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The player's object-knowledge (the "rune" learning system), ported from
|
|
3
|
+
* reference/src/obj-knowledge.c (Angband 4.2.6).
|
|
4
|
+
*
|
|
5
|
+
* The learn-by-use half is fully ported: runes are learned on wield
|
|
6
|
+
* (object_learn_on_wield), on attack and defend (equip_learn_on_melee_attack /
|
|
7
|
+
* _ranged_attack / _on_defend, missile_learn_on_ranged_attack), when a flag or
|
|
8
|
+
* element fires in play (equip_learn_flag / equip_learn_element), over time
|
|
9
|
+
* (equip_learn_after_time), from brands/slays biting a monster
|
|
10
|
+
* (player_learn_brand/slay via combat/brand-slay.ts), plus the racial innates
|
|
11
|
+
* at birth (player_learn_innate) and the learn-everything wizard ramp
|
|
12
|
+
* (player_learn_all_runes).
|
|
13
|
+
*
|
|
14
|
+
* The modifier runes gate REAL play: calc_bonuses (player-calcs.c L1942-1981)
|
|
15
|
+
* multiplies every equipped item's modifier by p->obj_k->modifiers, so an
|
|
16
|
+
* unlearned modifier is INERT. Flags, resists, and the to_a/to_h/to_d combat
|
|
17
|
+
* bonuses always apply for the real state and their runes feed the DISPLAYED
|
|
18
|
+
* known_state (character sheet / inspect), which lands with the display task;
|
|
19
|
+
* the knowledge itself is tracked here exactly as upstream so the display
|
|
20
|
+
* work is pure presentation.
|
|
21
|
+
*
|
|
22
|
+
* DEFERRED (ledgered in parity/ledger/obj-knowledge.yaml): the per-object
|
|
23
|
+
* obj->known twin (display-only shadow copies: "had a chance to notice"
|
|
24
|
+
* markers, object_fully_known short-circuits, update_player_object_knowledge's
|
|
25
|
+
* gear/store sweep), rune inscriptions (rune_note), monster-lore learning from
|
|
26
|
+
* brands/slays (lore is #24), and shapechange learning (shapes are bound raw).
|
|
27
|
+
*/
|
|
28
|
+
import { FLAG_START, FlagSet, NO_FLAG } from "../bitflag.js";
|
|
29
|
+
import { sameMonstersSlain, tvalIsBodyArmor, tvalIsJewelry } from "./object.js";
|
|
30
|
+
import { ELEM_HIGH_MAX, ELEM_MAX, OBJ_MOD_MAX, OBJ_PROPERTY, OF_SIZE, OFID, OFT, } from "./types.js";
|
|
31
|
+
import { OF } from "../generated/index.js";
|
|
32
|
+
import { OBJECT_FLAG_ENTRIES } from "../generated/object-flags.js";
|
|
33
|
+
import { OBJ_MOD } from "../generated/object-modifiers.js";
|
|
34
|
+
import { STAT_MAX } from "../player/types.js";
|
|
35
|
+
/** obj->notice bits (object.h). */
|
|
36
|
+
export const OBJ_NOTICE = {
|
|
37
|
+
WORN: 0x01,
|
|
38
|
+
ASSESSED: 0x02,
|
|
39
|
+
IGNORE: 0x04,
|
|
40
|
+
IMAGINED: 0x08,
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Assemble a RuneEnv from equipment access plus whatever registry tables the
|
|
44
|
+
* caller has; missing tables default to empty (learning against them is a
|
|
45
|
+
* no-op), which keeps worldless harness tests total.
|
|
46
|
+
*/
|
|
47
|
+
export function makeRuneEnv(slotObject, randcalcVaries, tables = {}) {
|
|
48
|
+
return {
|
|
49
|
+
brands: tables.brands ?? [null],
|
|
50
|
+
slays: tables.slays ?? [null],
|
|
51
|
+
curses: tables.curses ?? [null],
|
|
52
|
+
properties: tables.properties ?? [null],
|
|
53
|
+
elementNames: tables.elementNames ?? [],
|
|
54
|
+
slotObject,
|
|
55
|
+
randcalcVaries,
|
|
56
|
+
...(tables.flavor ? { flavor: tables.flavor } : {}),
|
|
57
|
+
...(tables.msg ? { msg: tables.msg } : {}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function lookupProp(env, type, propIndex) {
|
|
61
|
+
for (const p of env.properties) {
|
|
62
|
+
if (p && p.type === type && p.propIndex === propIndex)
|
|
63
|
+
return p;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/** "You have learned the rune of %s." (player_learn_rune's msgt). */
|
|
68
|
+
function runeMsg(env, name) {
|
|
69
|
+
if (name)
|
|
70
|
+
env.msg?.(`You have learned the rune of ${name}.`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Expand the `{tag}` forms in an obj_property message (obj-properties.c
|
|
74
|
+
* L111-136).
|
|
75
|
+
*
|
|
76
|
+
* Ported as the C parses rather than as a pair of regex replacements, because the
|
|
77
|
+
* two disagree on three points and every one of them is reachable from a mod's own
|
|
78
|
+
* `msg:` line (a content mod may contribute object_property records):
|
|
79
|
+
*
|
|
80
|
+
* - Only `name` is substituted. Any OTHER well-formed tag - `{level}`, `{foo}` -
|
|
81
|
+
* is consumed and replaced with NOTHING (L121-127 substitutes nothing unless the
|
|
82
|
+
* tag matches), where a `{name}`-only replace would leave it in the message.
|
|
83
|
+
* - An UNCLOSED brace loses the brace and keeps the rest (L129-132 advances past
|
|
84
|
+
* the `{` alone), where a replace would print it.
|
|
85
|
+
* - `%s` is NOT a substitution here. The C builds `buf` and then calls
|
|
86
|
+
* `msg("%s", buf)` (L138), so a literal `%s` in a property message stays
|
|
87
|
+
* literal. The port used to swap the object name in for it, which is an invented
|
|
88
|
+
* behaviour - no shipped record contains `%s`, so it was latent, and a mod's
|
|
89
|
+
* message is exactly where it would have surfaced.
|
|
90
|
+
*
|
|
91
|
+
* The tag test is upstream's `strncmp(tag, "name", 4)` (L125), a PREFIX compare on
|
|
92
|
+
* the live string, so `{names}` matches too. Kept, wart and all.
|
|
93
|
+
*/
|
|
94
|
+
function expandPropertyTags(msg, name) {
|
|
95
|
+
let out = "";
|
|
96
|
+
let cursor = 0;
|
|
97
|
+
for (;;) {
|
|
98
|
+
const next = msg.indexOf("{", cursor);
|
|
99
|
+
if (next < 0)
|
|
100
|
+
break;
|
|
101
|
+
/* The text leading up to this { (L114-115). */
|
|
102
|
+
out += msg.slice(cursor, next);
|
|
103
|
+
let s = next + 1;
|
|
104
|
+
/* isalpha() under the C locale: ASCII letters only (L118). */
|
|
105
|
+
while (s < msg.length && /[A-Za-z]/.test(msg[s]))
|
|
106
|
+
s++;
|
|
107
|
+
if (msg[s] === "}") {
|
|
108
|
+
if (msg.slice(next + 1, s).startsWith("name"))
|
|
109
|
+
out += name;
|
|
110
|
+
cursor = s + 1;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
cursor = next + 1; /* an invalid tag: skip it */
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return out + msg.slice(cursor);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* flag_message (obj-properties.c:86-139): the property's message for a flag the
|
|
120
|
+
* player has just noticed, with the object's base name substituted for `{name}`.
|
|
121
|
+
*
|
|
122
|
+
* Takes no player, exactly as the C does. The `p->upkeep->playing` gate belongs to
|
|
123
|
+
* TWO of the four call sites (obj-knowledge.c:1664 and :1857) and NOT to the other
|
|
124
|
+
* two (:2110 equip_learn_flag, :2202 equip_learn_after_time). The port used to hold
|
|
125
|
+
* the gate inside this function, which silently applied it to all four and
|
|
126
|
+
* suppressed messages upstream sends - so the gate now lives at the call sites that
|
|
127
|
+
* have it, and the shape of that decision is visible where the C makes it.
|
|
128
|
+
*/
|
|
129
|
+
function flagMessage(env, flag, oName) {
|
|
130
|
+
const prop = lookupProp(env, OBJ_PROPERTY.FLAG, flag);
|
|
131
|
+
/* No property record at all: upstream reports the bug rather than falling
|
|
132
|
+
* silent, and distinguishes an out-of-range index from a flag that simply has
|
|
133
|
+
* no object_property.txt entry (L97-107). Both are reachable through a mod that
|
|
134
|
+
* removes or mistypes a record. */
|
|
135
|
+
if (!prop) {
|
|
136
|
+
if (flag < 0 || flag >= OF.MAX) {
|
|
137
|
+
env.msg?.(`Bug: invalid flag index, ${flag}, passed to flag_message().`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
env.msg?.(`Bug: flag '${objectFlagName(flag)}' (index ${flag}) noticed but has no entry in object_property.txt.`);
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (!prop.msg)
|
|
145
|
+
return;
|
|
146
|
+
env.msg?.(expandPropertyTags(prop.msg, oName));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* list_obj_flag_names[flag] (init.c:110-116), whose element 0 is "NONE" and whose
|
|
150
|
+
* rest comes from list-object-flags.h - so OF_<name> indexes it directly and the
|
|
151
|
+
* generated entries tuple is one behind.
|
|
152
|
+
*/
|
|
153
|
+
function objectFlagName(flag) {
|
|
154
|
+
return OBJECT_FLAG_ENTRIES[flag - 1]?.name ?? "NONE";
|
|
155
|
+
}
|
|
156
|
+
/** ODESC_BASE approximation until object_desc lands: the kind's plain name. */
|
|
157
|
+
export function objBaseName(obj) {
|
|
158
|
+
return obj.kind.name.replace(/[~&]/g, "").trim();
|
|
159
|
+
}
|
|
160
|
+
const baseName = objBaseName;
|
|
161
|
+
/* ------------------------------------------------------------------ *
|
|
162
|
+
* player_knows_* accessors.
|
|
163
|
+
* ------------------------------------------------------------------ */
|
|
164
|
+
/** player_knows_brand. */
|
|
165
|
+
export function playerKnowsBrand(p, i) {
|
|
166
|
+
return p.objKnown.brands[i] ?? false;
|
|
167
|
+
}
|
|
168
|
+
/** player_knows_slay. */
|
|
169
|
+
export function playerKnowsSlay(p, i) {
|
|
170
|
+
return p.objKnown.slays[i] ?? false;
|
|
171
|
+
}
|
|
172
|
+
/** player_knows_curse. */
|
|
173
|
+
export function playerKnowsCurse(p, i) {
|
|
174
|
+
return (p.objKnown.curses[i] ?? 0) > 0;
|
|
175
|
+
}
|
|
176
|
+
/* ------------------------------------------------------------------ *
|
|
177
|
+
* player_learn_rune, split by variety (the port has no flat rune list;
|
|
178
|
+
* each case of the upstream switch is a typed function).
|
|
179
|
+
* ------------------------------------------------------------------ */
|
|
180
|
+
const COMBAT_RUNE_NAMES = {
|
|
181
|
+
toA: "enchantment to armor",
|
|
182
|
+
toH: "enchantment to hit",
|
|
183
|
+
toD: "enchantment to damage",
|
|
184
|
+
};
|
|
185
|
+
/** RUNE_VAR_COMBAT: learn one of the three combat runes. */
|
|
186
|
+
export function playerLearnCombat(p, env, which, message = true) {
|
|
187
|
+
if (p.objKnown[which])
|
|
188
|
+
return false;
|
|
189
|
+
p.objKnown[which] = 1;
|
|
190
|
+
if (message)
|
|
191
|
+
runeMsg(env, COMBAT_RUNE_NAMES[which]);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
/** RUNE_VAR_MOD: learn a modifier rune. */
|
|
195
|
+
export function playerLearnMod(p, env, i, message = true) {
|
|
196
|
+
if (p.objKnown.modifiers[i])
|
|
197
|
+
return false;
|
|
198
|
+
p.objKnown.modifiers[i] = 1;
|
|
199
|
+
if (message) {
|
|
200
|
+
runeMsg(env, lookupProp(env, OBJ_PROPERTY.MOD, i)?.name ??
|
|
201
|
+
lookupProp(env, OBJ_PROPERTY.STAT, i)?.name ?? null);
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
/** RUNE_VAR_RESIST: learn an element rune (high elements only, as the list). */
|
|
206
|
+
export function playerLearnResist(p, env, elem, message = true) {
|
|
207
|
+
if (elem < 0 || elem >= ELEM_HIGH_MAX)
|
|
208
|
+
return false;
|
|
209
|
+
const el = p.objKnown.elInfo[elem];
|
|
210
|
+
if (!el || el.resLevel)
|
|
211
|
+
return false;
|
|
212
|
+
el.resLevel = 1;
|
|
213
|
+
if (message)
|
|
214
|
+
runeMsg(env, env.elementNames[elem] ?? null);
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
/** RUNE_VAR_FLAG: learn an object-flag rune. */
|
|
218
|
+
export function playerLearnFlagRune(p, env, flag, message = true) {
|
|
219
|
+
if (p.objKnown.flags.has(flag))
|
|
220
|
+
return false;
|
|
221
|
+
p.objKnown.flags.on(flag);
|
|
222
|
+
if (message) {
|
|
223
|
+
runeMsg(env, lookupProp(env, OBJ_PROPERTY.FLAG, flag)?.name ?? null);
|
|
224
|
+
}
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* RUNE_VAR_BRAND: learn a brand rune; all brands sharing the name are learned
|
|
229
|
+
* together (a rune covers "fire" whatever the multiplier).
|
|
230
|
+
*/
|
|
231
|
+
export function playerLearnBrand(p, env, index, message = true) {
|
|
232
|
+
if (playerKnowsBrand(p, index))
|
|
233
|
+
return false;
|
|
234
|
+
const name = env.brands[index]?.name;
|
|
235
|
+
if (!name)
|
|
236
|
+
return false;
|
|
237
|
+
for (let j = 1; j < env.brands.length; j++) {
|
|
238
|
+
if (env.brands[j]?.name === name)
|
|
239
|
+
p.objKnown.brands[j] = true;
|
|
240
|
+
}
|
|
241
|
+
if (message)
|
|
242
|
+
runeMsg(env, name);
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* RUNE_VAR_SLAY: learn a slay rune; all slays hitting the same monsters
|
|
247
|
+
* (same_monsters_slain) are learned together.
|
|
248
|
+
*/
|
|
249
|
+
export function playerLearnSlay(p, env, index, message = true) {
|
|
250
|
+
if (playerKnowsSlay(p, index))
|
|
251
|
+
return false;
|
|
252
|
+
const s = env.slays[index];
|
|
253
|
+
if (!s)
|
|
254
|
+
return false;
|
|
255
|
+
for (let j = 1; j < env.slays.length; j++) {
|
|
256
|
+
if (sameMonstersSlain(env.slays, index, j))
|
|
257
|
+
p.objKnown.slays[j] = true;
|
|
258
|
+
}
|
|
259
|
+
if (message)
|
|
260
|
+
runeMsg(env, s.name);
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
/** RUNE_VAR_CURSE: learn a curse rune. */
|
|
264
|
+
export function playerLearnCurse(p, env, index, message = true) {
|
|
265
|
+
if (playerKnowsCurse(p, index))
|
|
266
|
+
return false;
|
|
267
|
+
if (!env.curses[index])
|
|
268
|
+
return false;
|
|
269
|
+
p.objKnown.curses[index] = 1;
|
|
270
|
+
if (message)
|
|
271
|
+
runeMsg(env, env.curses[index]?.name ?? null);
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
/* ------------------------------------------------------------------ *
|
|
275
|
+
* Masks and object predicates.
|
|
276
|
+
* ------------------------------------------------------------------ */
|
|
277
|
+
/**
|
|
278
|
+
* create_obj_flag_mask(f, true, id, OFT_MAX): every OF_* flag whose property
|
|
279
|
+
* has the given OFID_* identify type.
|
|
280
|
+
*/
|
|
281
|
+
export function objFlagMaskById(env, id) {
|
|
282
|
+
const mask = new FlagSet(OF_SIZE);
|
|
283
|
+
for (const prop of env.properties) {
|
|
284
|
+
if (prop && prop.type === OBJ_PROPERTY.FLAG && prop.idType === id) {
|
|
285
|
+
mask.on(prop.propIndex);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return mask;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* player_outfit's obvious-flag knowledge (player-birth.c L597-602): at birth the
|
|
292
|
+
* player knows every LIGHT / DIG / THROW / CURSE_ONLY subtype object flag. These
|
|
293
|
+
* are the non-rune "on wield" flags (init_rune skips their subtypes), so without
|
|
294
|
+
* this a mundane torch / digger / thrown item would read as not-fully-known and
|
|
295
|
+
* show a spurious "{??}" in stores and lists. Marking them known here makes such
|
|
296
|
+
* items fully known the moment they are seen, exactly as upstream. Mutates the
|
|
297
|
+
* passed flag set in place.
|
|
298
|
+
*/
|
|
299
|
+
export function learnBirthObviousFlags(known, properties) {
|
|
300
|
+
for (const prop of properties) {
|
|
301
|
+
if (!prop || prop.type !== OBJ_PROPERTY.FLAG)
|
|
302
|
+
continue;
|
|
303
|
+
if (prop.subtype === OFT.LIGHT ||
|
|
304
|
+
prop.subtype === OFT.DIG ||
|
|
305
|
+
prop.subtype === OFT.THROW ||
|
|
306
|
+
prop.subtype === OFT.CURSE_ONLY) {
|
|
307
|
+
known.on(prop.propIndex);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/** sustain_flag(stat): the OF_SUST_* flag for a stat (contiguous block). */
|
|
312
|
+
export function sustainFlag(stat) {
|
|
313
|
+
if (stat < 0 || stat >= STAT_MAX)
|
|
314
|
+
return -1;
|
|
315
|
+
return OF.SUST_STR + stat;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* object_has_standard_to_h: body armor with a fixed kind to_h matches the
|
|
319
|
+
* kind's base; anything else is standard only at to_h == 0.
|
|
320
|
+
*/
|
|
321
|
+
export function objectHasStandardToH(env, obj) {
|
|
322
|
+
if (tvalIsBodyArmor(obj.tval) && !env.randcalcVaries(obj.kind.toH)) {
|
|
323
|
+
return obj.toH === obj.kind.toH.base;
|
|
324
|
+
}
|
|
325
|
+
return obj.toH === 0;
|
|
326
|
+
}
|
|
327
|
+
/* ------------------------------------------------------------------ *
|
|
328
|
+
* object_curses_find_*: notice properties supplied by an object's curses,
|
|
329
|
+
* learning both the property rune and the curse rune.
|
|
330
|
+
* ------------------------------------------------------------------ */
|
|
331
|
+
function curseLearnCombat(p, env, obj, which) {
|
|
332
|
+
if (!obj.curses)
|
|
333
|
+
return;
|
|
334
|
+
for (let i = 1; i < env.curses.length; i++) {
|
|
335
|
+
const c = env.curses[i];
|
|
336
|
+
if (!obj.curses[i]?.power || !c)
|
|
337
|
+
continue;
|
|
338
|
+
if (c.obj[which] !== 0) {
|
|
339
|
+
playerLearnCombat(p, env, which);
|
|
340
|
+
playerLearnCurse(p, env, i);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
export function objectCursesFindToA(p, env, obj) {
|
|
345
|
+
curseLearnCombat(p, env, obj, "toA");
|
|
346
|
+
}
|
|
347
|
+
export function objectCursesFindToH(p, env, obj) {
|
|
348
|
+
curseLearnCombat(p, env, obj, "toH");
|
|
349
|
+
}
|
|
350
|
+
export function objectCursesFindToD(p, env, obj) {
|
|
351
|
+
curseLearnCombat(p, env, obj, "toD");
|
|
352
|
+
}
|
|
353
|
+
/** object_curses_find_flags: learn test-mask flags carried by curses. */
|
|
354
|
+
export function objectCursesFindFlags(p, env, obj, testFlags) {
|
|
355
|
+
if (!obj.curses)
|
|
356
|
+
return false;
|
|
357
|
+
let found = false;
|
|
358
|
+
const oName = baseName(obj);
|
|
359
|
+
for (let i = 1; i < env.curses.length; i++) {
|
|
360
|
+
const c = env.curses[i];
|
|
361
|
+
if (!obj.curses[i]?.power || !c)
|
|
362
|
+
continue;
|
|
363
|
+
for (let flag = 1; flag < OF.MAX; flag++) {
|
|
364
|
+
if (!c.obj.flags.has(flag) || !testFlags.has(flag))
|
|
365
|
+
continue;
|
|
366
|
+
if (!p.objKnown.flags.has(flag)) {
|
|
367
|
+
found = true;
|
|
368
|
+
playerLearnFlagRune(p, env, flag);
|
|
369
|
+
/* p->upkeep->playing (obj-knowledge.c:1664): this call site gates, and
|
|
370
|
+
* two of the four do not. */
|
|
371
|
+
if (p.upkeep.playing)
|
|
372
|
+
flagMessage(env, flag, oName);
|
|
373
|
+
}
|
|
374
|
+
playerLearnCurse(p, env, i);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return found;
|
|
378
|
+
}
|
|
379
|
+
/** object_curses_find_modifiers: learn modifier runes carried by curses. */
|
|
380
|
+
export function objectCursesFindModifiers(p, env, obj) {
|
|
381
|
+
if (!obj.curses)
|
|
382
|
+
return;
|
|
383
|
+
for (let i = 1; i < env.curses.length; i++) {
|
|
384
|
+
const c = env.curses[i];
|
|
385
|
+
if (!obj.curses[i]?.power || !c)
|
|
386
|
+
continue;
|
|
387
|
+
for (let j = 0; j < OBJ_MOD_MAX; j++) {
|
|
388
|
+
if (c.obj.modifiers[j]) {
|
|
389
|
+
if (!p.objKnown.modifiers[j]) {
|
|
390
|
+
playerLearnMod(p, env, j);
|
|
391
|
+
if (p.upkeep.playing)
|
|
392
|
+
modMessage(env, obj, j);
|
|
393
|
+
}
|
|
394
|
+
playerLearnCurse(p, env, i);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/** object_curses_find_element: learn an element rune carried by curses. */
|
|
400
|
+
export function objectCursesFindElement(p, env, obj, elem) {
|
|
401
|
+
if (!obj.curses)
|
|
402
|
+
return false;
|
|
403
|
+
let found = false;
|
|
404
|
+
const oName = baseName(obj);
|
|
405
|
+
for (let i = 1; i < env.curses.length; i++) {
|
|
406
|
+
const c = env.curses[i];
|
|
407
|
+
if (!obj.curses[i]?.power || !c)
|
|
408
|
+
continue;
|
|
409
|
+
if ((c.obj.elInfo[elem]?.resLevel ?? 0) !== 0) {
|
|
410
|
+
if (!(p.objKnown.elInfo[elem]?.resLevel ?? 0)) {
|
|
411
|
+
env.msg?.(`Your ${oName} glows.`);
|
|
412
|
+
playerLearnResist(p, env, elem);
|
|
413
|
+
}
|
|
414
|
+
playerLearnCurse(p, env, i);
|
|
415
|
+
found = true;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return found;
|
|
419
|
+
}
|
|
420
|
+
/* ------------------------------------------------------------------ *
|
|
421
|
+
* Learning from individual objects.
|
|
422
|
+
* ------------------------------------------------------------------ */
|
|
423
|
+
/** mod_message (obj-knowledge.c L1492): "You feel..." on noticing a modifier. */
|
|
424
|
+
function modMessage(env, obj, mod) {
|
|
425
|
+
if (!env.msg)
|
|
426
|
+
return;
|
|
427
|
+
const v = obj.modifiers[mod] ?? 0;
|
|
428
|
+
const both = (pos, neg) => v > 0 ? pos : v < 0 ? neg : null;
|
|
429
|
+
let text = null;
|
|
430
|
+
switch (mod) {
|
|
431
|
+
case OBJ_MOD.STR:
|
|
432
|
+
text = both("You feel stronger!", "You feel weaker!");
|
|
433
|
+
break;
|
|
434
|
+
case OBJ_MOD.INT:
|
|
435
|
+
text = both("You feel smarter!", "You feel more stupid!");
|
|
436
|
+
break;
|
|
437
|
+
case OBJ_MOD.WIS:
|
|
438
|
+
text = both("You feel wiser!", "You feel more naive!");
|
|
439
|
+
break;
|
|
440
|
+
case OBJ_MOD.DEX:
|
|
441
|
+
text = both("You feel more dextrous!", "You feel clumsier!");
|
|
442
|
+
break;
|
|
443
|
+
case OBJ_MOD.CON:
|
|
444
|
+
text = both("You feel healthier!", "You feel sicklier!");
|
|
445
|
+
break;
|
|
446
|
+
case OBJ_MOD.STEALTH:
|
|
447
|
+
text = both("You feel stealthier.", "You feel noisier.");
|
|
448
|
+
break;
|
|
449
|
+
case OBJ_MOD.SPEED:
|
|
450
|
+
text = both("You feel strangely quick.", "You feel strangely sluggish.");
|
|
451
|
+
break;
|
|
452
|
+
case OBJ_MOD.BLOWS:
|
|
453
|
+
text = both("Your weapon tingles in your hands.", "Your weapon aches in your hands.");
|
|
454
|
+
break;
|
|
455
|
+
case OBJ_MOD.SHOTS:
|
|
456
|
+
text = both("Your missile weapon tingles in your hands.", "Your missile weapon aches in your hands.");
|
|
457
|
+
break;
|
|
458
|
+
case OBJ_MOD.INFRA:
|
|
459
|
+
text = "Your eyes tingle.";
|
|
460
|
+
break;
|
|
461
|
+
case OBJ_MOD.LIGHT:
|
|
462
|
+
text = "It glows!";
|
|
463
|
+
break;
|
|
464
|
+
default: break;
|
|
465
|
+
}
|
|
466
|
+
if (text)
|
|
467
|
+
env.msg(text);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* object_learn_on_wield (obj-knowledge.c L1820): learn the properties that
|
|
471
|
+
* become obvious the moment an item is worn or wielded - the obvious
|
|
472
|
+
* (OFID_WIELD) flags with sustains promoted to obvious on stat items, every
|
|
473
|
+
* modifier, and anything the item's curses supply. Guarded by the
|
|
474
|
+
* OBJ_NOTICE_WORN bit and marks flavored wearables tried.
|
|
475
|
+
*
|
|
476
|
+
* Without an env (worldless callers, e.g. unit tests that only exercise the
|
|
477
|
+
* calc_bonuses gate) only the modifier runes are learned, which is the whole
|
|
478
|
+
* real-play effect.
|
|
479
|
+
*/
|
|
480
|
+
export function objectLearnOnWield(player, obj, env) {
|
|
481
|
+
if (!env) {
|
|
482
|
+
const known = player.objKnown.modifiers;
|
|
483
|
+
for (let i = 0; i < OBJ_MOD_MAX; i++) {
|
|
484
|
+
if ((obj.modifiers[i] ?? 0) !== 0 && (known[i] ?? 0) === 0)
|
|
485
|
+
known[i] = 1;
|
|
486
|
+
}
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
/* Check the worn flag. */
|
|
490
|
+
if (obj.notice & OBJ_NOTICE.WORN)
|
|
491
|
+
return;
|
|
492
|
+
obj.notice |= OBJ_NOTICE.WORN;
|
|
493
|
+
/* Worn means tried (for flavored wearables). */
|
|
494
|
+
env.flavor?.setTried(obj.kind);
|
|
495
|
+
/* The obvious object flags, plus sustains on items with a stat bonus. */
|
|
496
|
+
const obviousMask = objFlagMaskById(env, OFID.WIELD);
|
|
497
|
+
for (let i = 0; i < STAT_MAX; i++) {
|
|
498
|
+
if (obj.modifiers[i])
|
|
499
|
+
obviousMask.on(sustainFlag(i));
|
|
500
|
+
}
|
|
501
|
+
/* Learn about obvious, previously unknown flags. */
|
|
502
|
+
const oName = baseName(obj);
|
|
503
|
+
for (let flag = 1; flag < OF.MAX; flag++) {
|
|
504
|
+
if (!obj.flags.has(flag) || !obviousMask.has(flag))
|
|
505
|
+
continue;
|
|
506
|
+
if (!player.objKnown.flags.has(flag)) {
|
|
507
|
+
playerLearnFlagRune(player, env, flag);
|
|
508
|
+
/* p->upkeep->playing (obj-knowledge.c:1857). */
|
|
509
|
+
if (player.upkeep.playing)
|
|
510
|
+
flagMessage(env, flag, oName);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
/* Learn all modifiers. */
|
|
514
|
+
for (let i = 0; i < OBJ_MOD_MAX; i++) {
|
|
515
|
+
if ((obj.modifiers[i] ?? 0) !== 0 && !player.objKnown.modifiers[i]) {
|
|
516
|
+
playerLearnMod(player, env, i);
|
|
517
|
+
if (player.upkeep.playing)
|
|
518
|
+
modMessage(env, obj, i);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
/* Learn curses. */
|
|
522
|
+
objectCursesFindToA(player, env, obj);
|
|
523
|
+
objectCursesFindToH(player, env, obj);
|
|
524
|
+
objectCursesFindToD(player, env, obj);
|
|
525
|
+
objectCursesFindFlags(player, env, obj, obviousMask);
|
|
526
|
+
objectCursesFindModifiers(player, env, obj);
|
|
527
|
+
for (let i = 0; i < ELEM_MAX; i++) {
|
|
528
|
+
if (player.objKnown.elInfo[i]?.resLevel) {
|
|
529
|
+
objectCursesFindElement(player, env, obj, i);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* missile_learn_on_ranged_attack: firing teaches the to-hit rune (when the
|
|
535
|
+
* missile or launcher is off-standard) and the to-dam rune.
|
|
536
|
+
*/
|
|
537
|
+
export function missileLearnOnRangedAttack(p, env, obj) {
|
|
538
|
+
if (p.objKnown.toH && p.objKnown.toD)
|
|
539
|
+
return;
|
|
540
|
+
if (!objectHasStandardToH(env, obj))
|
|
541
|
+
playerLearnCombat(p, env, "toH");
|
|
542
|
+
if (obj.toD)
|
|
543
|
+
playerLearnCombat(p, env, "toD");
|
|
544
|
+
objectCursesFindToH(p, env, obj);
|
|
545
|
+
objectCursesFindToD(p, env, obj);
|
|
546
|
+
}
|
|
547
|
+
/* ------------------------------------------------------------------ *
|
|
548
|
+
* Learning from the equipment's behaviour.
|
|
549
|
+
* ------------------------------------------------------------------ */
|
|
550
|
+
/** equip_learn_on_defend: being hit teaches the to-armor rune. */
|
|
551
|
+
export function equipLearnOnDefend(p, env) {
|
|
552
|
+
if (p.objKnown.toA)
|
|
553
|
+
return;
|
|
554
|
+
for (let i = 0; i < p.body.count; i++) {
|
|
555
|
+
const obj = env.slotObject(i);
|
|
556
|
+
if (!obj)
|
|
557
|
+
continue;
|
|
558
|
+
if (obj.toA)
|
|
559
|
+
playerLearnCombat(p, env, "toA");
|
|
560
|
+
objectCursesFindToA(p, env, obj);
|
|
561
|
+
if (p.objKnown.toA)
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
/* Shape to_a: shapes are bound raw; DEFERRED with the shapechange system. */
|
|
565
|
+
}
|
|
566
|
+
function slotIndexByType(p, type) {
|
|
567
|
+
for (let i = 0; i < p.body.count; i++) {
|
|
568
|
+
if (p.body.slots[i]?.type === type)
|
|
569
|
+
return i;
|
|
570
|
+
}
|
|
571
|
+
return -1;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* equip_learn_on_ranged_attack: firing teaches the to-hit rune from any
|
|
575
|
+
* off-standard equipment except the weapon and launcher.
|
|
576
|
+
*/
|
|
577
|
+
export function equipLearnOnRangedAttack(p, env) {
|
|
578
|
+
if (p.objKnown.toH)
|
|
579
|
+
return;
|
|
580
|
+
const weaponSlot = slotIndexByType(p, "WEAPON");
|
|
581
|
+
const bowSlot = slotIndexByType(p, "BOW");
|
|
582
|
+
for (let i = 0; i < p.body.count; i++) {
|
|
583
|
+
if (i === weaponSlot || i === bowSlot)
|
|
584
|
+
continue;
|
|
585
|
+
const obj = env.slotObject(i);
|
|
586
|
+
if (!obj)
|
|
587
|
+
continue;
|
|
588
|
+
if (!objectHasStandardToH(env, obj))
|
|
589
|
+
playerLearnCombat(p, env, "toH");
|
|
590
|
+
objectCursesFindToH(p, env, obj);
|
|
591
|
+
if (p.objKnown.toH)
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* equip_learn_on_melee_attack: attacking teaches the to-hit and to-dam runes
|
|
597
|
+
* from any off-standard equipment except the launcher.
|
|
598
|
+
*/
|
|
599
|
+
export function equipLearnOnMeleeAttack(p, env) {
|
|
600
|
+
if (p.objKnown.toH && p.objKnown.toD)
|
|
601
|
+
return;
|
|
602
|
+
const bowSlot = slotIndexByType(p, "BOW");
|
|
603
|
+
for (let i = 0; i < p.body.count; i++) {
|
|
604
|
+
if (i === bowSlot)
|
|
605
|
+
continue;
|
|
606
|
+
const obj = env.slotObject(i);
|
|
607
|
+
if (!obj)
|
|
608
|
+
continue;
|
|
609
|
+
if (!objectHasStandardToH(env, obj))
|
|
610
|
+
playerLearnCombat(p, env, "toH");
|
|
611
|
+
if (obj.toD)
|
|
612
|
+
playerLearnCombat(p, env, "toD");
|
|
613
|
+
objectCursesFindToH(p, env, obj);
|
|
614
|
+
objectCursesFindToD(p, env, obj);
|
|
615
|
+
if (p.objKnown.toH && p.objKnown.toD)
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* equip_learn_flag: a flag fired in play; learn its rune from any equipped
|
|
621
|
+
* item carrying it (with the flag_message), including via curses.
|
|
622
|
+
*/
|
|
623
|
+
export function equipLearnFlag(p, env, flag) {
|
|
624
|
+
if (!flag || flag < 0)
|
|
625
|
+
return;
|
|
626
|
+
const mask = new FlagSet(OF_SIZE);
|
|
627
|
+
mask.on(flag);
|
|
628
|
+
for (let i = 0; i < p.body.count; i++) {
|
|
629
|
+
const obj = env.slotObject(i);
|
|
630
|
+
if (!obj)
|
|
631
|
+
continue;
|
|
632
|
+
if (obj.flags.has(flag)) {
|
|
633
|
+
if (!p.objKnown.flags.has(flag)) {
|
|
634
|
+
flagMessage(env, flag, baseName(obj));
|
|
635
|
+
playerLearnFlagRune(p, env, flag);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
/* obj->known "had a chance to display" marking: DEFERRED (display). */
|
|
639
|
+
objectCursesFindFlags(p, env, obj, mask);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* equip_learn_element: an element hit the player; learn its rune from any
|
|
644
|
+
* equipped item affecting it (with the glow message), including via curses.
|
|
645
|
+
*/
|
|
646
|
+
export function equipLearnElement(p, env, element) {
|
|
647
|
+
if (element < 0 || element >= ELEM_MAX)
|
|
648
|
+
return;
|
|
649
|
+
if ((p.objKnown.elInfo[element]?.resLevel ?? 0) === 1)
|
|
650
|
+
return;
|
|
651
|
+
for (let i = 0; i < p.body.count; i++) {
|
|
652
|
+
const obj = env.slotObject(i);
|
|
653
|
+
if (!obj)
|
|
654
|
+
continue;
|
|
655
|
+
if ((obj.elInfo[element]?.resLevel ?? 0) !== 0) {
|
|
656
|
+
if (p.upkeep.playing)
|
|
657
|
+
env.msg?.(`Your ${baseName(obj)} glows.`);
|
|
658
|
+
playerLearnResist(p, env, element);
|
|
659
|
+
}
|
|
660
|
+
/* obj->known element marking: DEFERRED (display). */
|
|
661
|
+
objectCursesFindElement(p, env, obj, element);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* shape_learn_on_assume (L1892): on taking a shape, learn its obvious
|
|
666
|
+
* (OFID_WIELD) flags and its resists, through the same equipment learn
|
|
667
|
+
* calls upstream uses.
|
|
668
|
+
*/
|
|
669
|
+
export function shapeLearnOnAssume(p, env, shape) {
|
|
670
|
+
/* Get the shape's obvious flags. */
|
|
671
|
+
const f = shape.flags.clone();
|
|
672
|
+
f.inter(objFlagMaskById(env, OFID.WIELD));
|
|
673
|
+
/* Learn flags. */
|
|
674
|
+
for (let flag = f.next(FLAG_START); flag !== NO_FLAG; flag = f.next(flag + 1)) {
|
|
675
|
+
equipLearnFlag(p, env, flag);
|
|
676
|
+
}
|
|
677
|
+
/* Learn elements. */
|
|
678
|
+
for (let element = 0; element < ELEM_MAX; element++) {
|
|
679
|
+
if ((shape.elInfo[element]?.resLevel ?? 0) !== 0 &&
|
|
680
|
+
(p.objKnown.elInfo[element]?.resLevel ?? 0) === 0) {
|
|
681
|
+
equipLearnElement(p, env, element);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* equip_learn_after_time: learn the timed (OFID_TIMED) flags the equipment
|
|
687
|
+
* carries; called every 100 game turns from process_world.
|
|
688
|
+
*/
|
|
689
|
+
export function equipLearnAfterTime(p, env) {
|
|
690
|
+
const timedMask = objFlagMaskById(env, OFID.TIMED);
|
|
691
|
+
/* Drop already-known flags; bail if nothing is left to notice. */
|
|
692
|
+
let any = false;
|
|
693
|
+
for (let flag = 1; flag < OF.MAX; flag++) {
|
|
694
|
+
if (!timedMask.has(flag))
|
|
695
|
+
continue;
|
|
696
|
+
if (p.objKnown.flags.has(flag))
|
|
697
|
+
timedMask.off(flag);
|
|
698
|
+
else
|
|
699
|
+
any = true;
|
|
700
|
+
}
|
|
701
|
+
if (!any)
|
|
702
|
+
return;
|
|
703
|
+
for (let i = 0; i < p.body.count; i++) {
|
|
704
|
+
const obj = env.slotObject(i);
|
|
705
|
+
if (!obj)
|
|
706
|
+
continue;
|
|
707
|
+
const oName = baseName(obj);
|
|
708
|
+
for (let flag = 1; flag < OF.MAX; flag++) {
|
|
709
|
+
if (!obj.flags.has(flag) || !timedMask.has(flag))
|
|
710
|
+
continue;
|
|
711
|
+
if (!p.objKnown.flags.has(flag))
|
|
712
|
+
flagMessage(env, flag, oName);
|
|
713
|
+
playerLearnFlagRune(p, env, flag);
|
|
714
|
+
}
|
|
715
|
+
objectCursesFindFlags(p, env, obj, timedMask);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
/* ------------------------------------------------------------------ *
|
|
719
|
+
* Bulk learning.
|
|
720
|
+
* ------------------------------------------------------------------ */
|
|
721
|
+
/** player_learn_innate: know the racial element and flag runes at birth. */
|
|
722
|
+
export function playerLearnInnate(p, env) {
|
|
723
|
+
for (let elem = 0; elem < ELEM_MAX; elem++) {
|
|
724
|
+
if ((p.race.elInfo[elem]?.resLevel ?? 0) !== 0) {
|
|
725
|
+
playerLearnResist(p, env, elem, false);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
for (let flag = 1; flag < OF.MAX; flag++) {
|
|
729
|
+
if (p.race.flags.has(flag))
|
|
730
|
+
playerLearnFlagRune(p, env, flag, false);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
/** player_learn_all_runes: learn absolutely everything (wizard mode). */
|
|
734
|
+
export function playerLearnAllRunes(p, env) {
|
|
735
|
+
playerLearnCombat(p, env, "toA", false);
|
|
736
|
+
playerLearnCombat(p, env, "toH", false);
|
|
737
|
+
playerLearnCombat(p, env, "toD", false);
|
|
738
|
+
for (let i = 0; i < OBJ_MOD_MAX; i++)
|
|
739
|
+
playerLearnMod(p, env, i, false);
|
|
740
|
+
for (let i = 0; i < ELEM_HIGH_MAX; i++)
|
|
741
|
+
playerLearnResist(p, env, i, false);
|
|
742
|
+
for (let i = 1; i < OF.MAX; i++)
|
|
743
|
+
playerLearnFlagRune(p, env, i, false);
|
|
744
|
+
for (let i = 1; i < env.brands.length; i++)
|
|
745
|
+
playerLearnBrand(p, env, i, false);
|
|
746
|
+
for (let i = 1; i < env.slays.length; i++)
|
|
747
|
+
playerLearnSlay(p, env, i, false);
|
|
748
|
+
for (let i = 1; i < env.curses.length; i++)
|
|
749
|
+
playerLearnCurse(p, env, i, false);
|
|
750
|
+
}
|
|
751
|
+
/** COMBAT_RUNE_TO_A / TO_H / TO_D. */
|
|
752
|
+
const COMBAT_RUNE = ["toA", "toH", "toD"];
|
|
753
|
+
/**
|
|
754
|
+
* init_rune: build the rune list in the exact upstream order - combat,
|
|
755
|
+
* modifiers, high elements, brands (first of each name), slays (first of
|
|
756
|
+
* each same-monsters group), named curses, then the identifiable flags
|
|
757
|
+
* (subtypes NONE / LIGHT / DIG / THROW / CURSE_ONLY excluded).
|
|
758
|
+
*/
|
|
759
|
+
export function buildRuneList(env) {
|
|
760
|
+
const runes = [];
|
|
761
|
+
const combatNames = [
|
|
762
|
+
COMBAT_RUNE_NAMES.toA,
|
|
763
|
+
COMBAT_RUNE_NAMES.toH,
|
|
764
|
+
COMBAT_RUNE_NAMES.toD,
|
|
765
|
+
];
|
|
766
|
+
for (let i = 0; i < 3; i++) {
|
|
767
|
+
runes.push({ variety: "combat", index: i, name: combatNames[i] });
|
|
768
|
+
}
|
|
769
|
+
for (let i = 0; i < OBJ_MOD_MAX; i++) {
|
|
770
|
+
const name = lookupProp(env, OBJ_PROPERTY.MOD, i)?.name ??
|
|
771
|
+
lookupProp(env, OBJ_PROPERTY.STAT, i)?.name ??
|
|
772
|
+
"";
|
|
773
|
+
runes.push({ variety: "mod", index: i, name });
|
|
774
|
+
}
|
|
775
|
+
for (let i = 0; i < ELEM_HIGH_MAX; i++) {
|
|
776
|
+
runes.push({ variety: "resist", index: i, name: env.elementNames[i] ?? "" });
|
|
777
|
+
}
|
|
778
|
+
for (let i = 1; i < env.brands.length; i++) {
|
|
779
|
+
const name = env.brands[i]?.name;
|
|
780
|
+
if (!name)
|
|
781
|
+
continue;
|
|
782
|
+
let counted = false;
|
|
783
|
+
for (let j = 1; j < i; j++) {
|
|
784
|
+
if (env.brands[j]?.name === name) {
|
|
785
|
+
counted = true;
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
if (!counted)
|
|
790
|
+
runes.push({ variety: "brand", index: i, name });
|
|
791
|
+
}
|
|
792
|
+
for (let i = 1; i < env.slays.length; i++) {
|
|
793
|
+
const s = env.slays[i];
|
|
794
|
+
if (!s?.name)
|
|
795
|
+
continue;
|
|
796
|
+
let counted = false;
|
|
797
|
+
for (let j = 1; j < i; j++) {
|
|
798
|
+
if (sameMonstersSlain(env.slays, i, j))
|
|
799
|
+
counted = true;
|
|
800
|
+
}
|
|
801
|
+
if (!counted)
|
|
802
|
+
runes.push({ variety: "slay", index: i, name: s.name });
|
|
803
|
+
}
|
|
804
|
+
for (let i = 1; i < env.curses.length; i++) {
|
|
805
|
+
const name = env.curses[i]?.name;
|
|
806
|
+
if (name)
|
|
807
|
+
runes.push({ variety: "curse", index: i, name });
|
|
808
|
+
}
|
|
809
|
+
for (let i = 1; i < OF.MAX; i++) {
|
|
810
|
+
const prop = lookupProp(env, OBJ_PROPERTY.FLAG, i);
|
|
811
|
+
if (!prop)
|
|
812
|
+
continue;
|
|
813
|
+
if (prop.subtype === OFT.NONE ||
|
|
814
|
+
prop.subtype === OFT.LIGHT ||
|
|
815
|
+
prop.subtype === OFT.DIG ||
|
|
816
|
+
prop.subtype === OFT.THROW ||
|
|
817
|
+
prop.subtype === OFT.CURSE_ONLY) {
|
|
818
|
+
continue;
|
|
819
|
+
}
|
|
820
|
+
runes.push({ variety: "flag", index: i, name: prop.name });
|
|
821
|
+
}
|
|
822
|
+
return runes;
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* rune_desc (obj-knowledge.c L344-403): the recall description of a rune. The
|
|
826
|
+
* text is computed per variety (no per-rune desc field in the data pack), so
|
|
827
|
+
* this ports the C switch verbatim. Combat runes have fixed strings keyed by
|
|
828
|
+
* COMBAT_RUNE_TO_A/H/D (obj-knowledge.h L35-37); curse runes read the curse's
|
|
829
|
+
* own desc (curses[index].desc) formatted as "Object %s."; every other variety
|
|
830
|
+
* substitutes the rune's name into its template. Returns "" for an out-of-range
|
|
831
|
+
* curse (the C default falls through to NULL).
|
|
832
|
+
*/
|
|
833
|
+
export function runeDesc(env, rune) {
|
|
834
|
+
switch (rune.variety) {
|
|
835
|
+
case "combat":
|
|
836
|
+
if (rune.index === 0)
|
|
837
|
+
return "Object magically increases the player's armor class";
|
|
838
|
+
if (rune.index === 1)
|
|
839
|
+
return "Object magically increases the player's chance to hit";
|
|
840
|
+
if (rune.index === 2)
|
|
841
|
+
return "Object magically increases the player's damage";
|
|
842
|
+
return "";
|
|
843
|
+
case "mod":
|
|
844
|
+
return `Object gives the player a magical bonus to ${rune.name}.`;
|
|
845
|
+
case "resist":
|
|
846
|
+
return `Object affects the player's resistance to ${rune.name}.`;
|
|
847
|
+
case "brand":
|
|
848
|
+
return `Object brands the player's attacks with ${rune.name}.`;
|
|
849
|
+
case "slay":
|
|
850
|
+
return `Object makes the player's attacks against ${rune.name} more powerful.`;
|
|
851
|
+
case "curse": {
|
|
852
|
+
const desc = env.curses[rune.index]?.desc;
|
|
853
|
+
return desc ? `Object ${desc}.` : "";
|
|
854
|
+
}
|
|
855
|
+
case "flag":
|
|
856
|
+
return `Object gives the player the property of ${rune.name}.`;
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
/** player_knows_rune over the typed knowledge stores. */
|
|
860
|
+
export function playerKnowsRune(p, rune) {
|
|
861
|
+
switch (rune.variety) {
|
|
862
|
+
case "combat":
|
|
863
|
+
return !!p.objKnown[COMBAT_RUNE[rune.index]];
|
|
864
|
+
case "mod":
|
|
865
|
+
return !!p.objKnown.modifiers[rune.index];
|
|
866
|
+
case "resist":
|
|
867
|
+
return !!p.objKnown.elInfo[rune.index]?.resLevel;
|
|
868
|
+
case "brand":
|
|
869
|
+
return playerKnowsBrand(p, rune.index);
|
|
870
|
+
case "slay":
|
|
871
|
+
return playerKnowsSlay(p, rune.index);
|
|
872
|
+
case "curse":
|
|
873
|
+
return playerKnowsCurse(p, rune.index);
|
|
874
|
+
case "flag":
|
|
875
|
+
return p.objKnown.flags.has(rune.index);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
/** object_has_rune. */
|
|
879
|
+
export function objectHasRune(env, obj, rune) {
|
|
880
|
+
switch (rune.variety) {
|
|
881
|
+
case "combat":
|
|
882
|
+
if (rune.index === 0)
|
|
883
|
+
return obj.toA !== 0;
|
|
884
|
+
if (rune.index === 1)
|
|
885
|
+
return !objectHasStandardToH(env, obj);
|
|
886
|
+
return obj.toD !== 0;
|
|
887
|
+
case "mod":
|
|
888
|
+
return (obj.modifiers[rune.index] ?? 0) !== 0;
|
|
889
|
+
case "resist":
|
|
890
|
+
return (obj.elInfo[rune.index]?.resLevel ?? 0) !== 0;
|
|
891
|
+
case "brand": {
|
|
892
|
+
if (!obj.brands)
|
|
893
|
+
return false;
|
|
894
|
+
for (let i = 0; i < obj.brands.length; i++) {
|
|
895
|
+
if (obj.brands[i] && env.brands[i]?.name === rune.name)
|
|
896
|
+
return true;
|
|
897
|
+
}
|
|
898
|
+
return false;
|
|
899
|
+
}
|
|
900
|
+
case "slay": {
|
|
901
|
+
if (!obj.slays)
|
|
902
|
+
return false;
|
|
903
|
+
for (let i = 0; i < obj.slays.length; i++) {
|
|
904
|
+
if (obj.slays[i] && sameMonstersSlain(env.slays, rune.index, i)) {
|
|
905
|
+
return true;
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
return false;
|
|
909
|
+
}
|
|
910
|
+
case "curse":
|
|
911
|
+
return (obj.curses?.[rune.index]?.power ?? 0) !== 0;
|
|
912
|
+
case "flag":
|
|
913
|
+
return obj.flags.has(rune.index);
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* object_runes_known, reduced to the port's player-rune knowledge model:
|
|
918
|
+
* every rune the object carries is known to the player. (Upstream compares
|
|
919
|
+
* the obj->known twin, which is filled from the same rune knowledge.)
|
|
920
|
+
*/
|
|
921
|
+
export function objectRunesKnown(p, env, obj, runes) {
|
|
922
|
+
for (const rune of runes) {
|
|
923
|
+
if (objectHasRune(env, obj, rune) && !playerKnowsRune(p, rune)) {
|
|
924
|
+
return false;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
return true;
|
|
928
|
+
}
|
|
929
|
+
/** player_learn_rune dispatched by variety. */
|
|
930
|
+
export function playerLearnRune(p, env, rune, message) {
|
|
931
|
+
switch (rune.variety) {
|
|
932
|
+
case "combat":
|
|
933
|
+
return playerLearnCombat(p, env, COMBAT_RUNE[rune.index], message);
|
|
934
|
+
case "mod":
|
|
935
|
+
return playerLearnMod(p, env, rune.index, message);
|
|
936
|
+
case "resist":
|
|
937
|
+
return playerLearnResist(p, env, rune.index, message);
|
|
938
|
+
case "brand":
|
|
939
|
+
return playerLearnBrand(p, env, rune.index, message);
|
|
940
|
+
case "slay":
|
|
941
|
+
return playerLearnSlay(p, env, rune.index, message);
|
|
942
|
+
case "curse":
|
|
943
|
+
return playerLearnCurse(p, env, rune.index, message);
|
|
944
|
+
case "flag":
|
|
945
|
+
return playerLearnFlagRune(p, env, rune.index, message);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* object_find_unknown_rune: a random unknown rune carried by the object
|
|
950
|
+
* (upstream RNG: candidates gathered in list order, then randint0), or -1.
|
|
951
|
+
*/
|
|
952
|
+
export function objectFindUnknownRune(rng, p, env, obj, runes) {
|
|
953
|
+
if (objectRunesKnown(p, env, obj, runes))
|
|
954
|
+
return -1;
|
|
955
|
+
const poss = [];
|
|
956
|
+
for (let i = 0; i < runes.length; i++) {
|
|
957
|
+
if (objectHasRune(env, obj, runes[i]) && !playerKnowsRune(p, runes[i])) {
|
|
958
|
+
poss.push(i);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
if (poss.length === 0)
|
|
962
|
+
return -1;
|
|
963
|
+
return poss[rng.randint0(poss.length)];
|
|
964
|
+
}
|
|
965
|
+
/**
|
|
966
|
+
* object_learn_unknown_rune (obj-knowledge.c L1798): learn a random unknown
|
|
967
|
+
* rune from the object; with none left the object is marked assessed. Returns
|
|
968
|
+
* whether a rune was learned.
|
|
969
|
+
*
|
|
970
|
+
* Upstream both branches end in player_know_object (directly at L1806, or via
|
|
971
|
+
* player_learn_rune -> update_player_object_knowledge at L1811), which fires the
|
|
972
|
+
* object_flavor_aware side effect for the object. The port synthesises the
|
|
973
|
+
* known shadow on demand for display, so that awareness half is fired here (a
|
|
974
|
+
* knowledge-UPDATE site) via playerKnowObjectAwareness. `flavor` is optional so
|
|
975
|
+
* callers with no flavor environment (older tests) keep the bare rune-learn.
|
|
976
|
+
*/
|
|
977
|
+
export function objectLearnUnknownRune(rng, p, env, obj, runes, flavor, flavorDeps = NOOP_FLAVOR_AWARE_DEPS) {
|
|
978
|
+
const i = objectFindUnknownRune(rng, p, env, obj, runes);
|
|
979
|
+
let learned;
|
|
980
|
+
if (i < 0) {
|
|
981
|
+
/* No unknown runes: assessed (player_know_object rides the known
|
|
982
|
+
* twin, which the port's rune model replaces). */
|
|
983
|
+
obj.notice |= OBJ_NOTICE.ASSESSED;
|
|
984
|
+
learned = false;
|
|
985
|
+
}
|
|
986
|
+
else {
|
|
987
|
+
learned = playerLearnRune(p, env, runes[i], true);
|
|
988
|
+
}
|
|
989
|
+
/* player_know_object's awareness side effect (L1163-1175), fired for this
|
|
990
|
+
* object at the knowledge-update site (never in the display-only shadow). */
|
|
991
|
+
if (flavor)
|
|
992
|
+
playerKnowObjectAwareness(p, env, obj, runes, flavor, flavorDeps);
|
|
993
|
+
return learned;
|
|
994
|
+
}
|
|
995
|
+
/**
|
|
996
|
+
* An inert FlavorAwareDeps for callers that have a FlavorKnowledge but no
|
|
997
|
+
* live ignore/notice environment (birth-time scripting, tests, or a caller
|
|
998
|
+
* that intentionally wants the bare aware-bit flip with none of the L2276-79
|
|
999
|
+
* side effects). Equivalent to the old bare setAware() call.
|
|
1000
|
+
*/
|
|
1001
|
+
export const NOOP_FLAVOR_AWARE_DEPS = {
|
|
1002
|
+
isIgnoredUnaware: () => false,
|
|
1003
|
+
ignoreWhenAware: () => { },
|
|
1004
|
+
requestIgnoreNotice: () => { },
|
|
1005
|
+
};
|
|
1006
|
+
export class FlavorKnowledge {
|
|
1007
|
+
ordinaryKindCount;
|
|
1008
|
+
awareKidx = new Set();
|
|
1009
|
+
triedKidx = new Set();
|
|
1010
|
+
/**
|
|
1011
|
+
* @param ordinaryKindCount z_info->ordinary_kind_max: kinds at or above this
|
|
1012
|
+
* index are INSTA_ART dummies and are never marked tried.
|
|
1013
|
+
*/
|
|
1014
|
+
constructor(ordinaryKindCount) {
|
|
1015
|
+
this.ordinaryKindCount = ordinaryKindCount;
|
|
1016
|
+
}
|
|
1017
|
+
/**
|
|
1018
|
+
* z_info->ordinary_kind_max: kinds at or above this index are special-artifact
|
|
1019
|
+
* dummies (see obj-knowledge.c L1168's kidx >= ordinary_kind_max test).
|
|
1020
|
+
*/
|
|
1021
|
+
get ordinaryKindMax() {
|
|
1022
|
+
return this.ordinaryKindCount;
|
|
1023
|
+
}
|
|
1024
|
+
/** object_flavor_is_aware(obj): is the player aware of this kind's flavor? */
|
|
1025
|
+
isAware(kind) {
|
|
1026
|
+
return this.awareKidx.has(kind.kidx);
|
|
1027
|
+
}
|
|
1028
|
+
/** object_flavor_was_tried(obj): has a kind of this flavor been tried? */
|
|
1029
|
+
wasTried(kind) {
|
|
1030
|
+
return this.triedKidx.has(kind.kidx);
|
|
1031
|
+
}
|
|
1032
|
+
/**
|
|
1033
|
+
* The aware-bit half of object_flavor_aware (L2272-2273): mark a kind's
|
|
1034
|
+
* flavor known; returns true when this made a change. This is the pure
|
|
1035
|
+
* primitive - it flips the bit and nothing else, so it is safe for birth
|
|
1036
|
+
* aware-marking (flavor.ts) and savefile restore, which must NOT trigger the
|
|
1037
|
+
* ignore re-check. Callers that are the player becoming aware in play should
|
|
1038
|
+
* use objectFlavorAware() below, which layers on the awareness side effects.
|
|
1039
|
+
*/
|
|
1040
|
+
setAware(kind) {
|
|
1041
|
+
if (this.awareKidx.has(kind.kidx))
|
|
1042
|
+
return false;
|
|
1043
|
+
this.awareKidx.add(kind.kidx);
|
|
1044
|
+
return true;
|
|
1045
|
+
}
|
|
1046
|
+
/**
|
|
1047
|
+
* object_flavor_aware (obj-knowledge.c L2266): the player becomes aware of a
|
|
1048
|
+
* flavoured kind AND the awareness side effects fire. Returns true when
|
|
1049
|
+
* awareness newly changed (upstream is void; the port surfaces the change so
|
|
1050
|
+
* callers can gate a message / redraw).
|
|
1051
|
+
*
|
|
1052
|
+
* What each upstream step maps to in the port's on-demand-shadow model:
|
|
1053
|
+
* - kind->aware = true (L2272-2273): setAware below.
|
|
1054
|
+
* - obj->known->effect = obj->effect (L2274): the port keeps NO persistent
|
|
1055
|
+
* obj->known twin; the known shadow is synthesised on demand and
|
|
1056
|
+
* objectSetBaseKnown (known-object.ts L157-170) already fills shadow.effect
|
|
1057
|
+
* from deps.isAware(kind). Once the bit above flips, every later synthesis
|
|
1058
|
+
* reveals the effect automatically - there is nothing to write here.
|
|
1059
|
+
* - ignore/autoinscribe fix (L2276-2279): ported below via `deps`.
|
|
1060
|
+
* - object_set_base_known over p->gear and every store's stock (L2281-2290):
|
|
1061
|
+
* a NO-OP in the port. Those are exactly the twins that are synthesised on
|
|
1062
|
+
* demand and re-read the freshly-flipped aware bit, so there is no stored
|
|
1063
|
+
* copy to re-sweep. (Building a persistent twin to sweep is the separate
|
|
1064
|
+
* DEFERRED obj->known item, out of scope here.)
|
|
1065
|
+
* - floor-tile re-light for kinds that change glyph on awareness
|
|
1066
|
+
* (L2293-2312): a cave/display concern, outside packages/core/src/obj.
|
|
1067
|
+
*
|
|
1068
|
+
* @returns true iff the kind was not already aware.
|
|
1069
|
+
*/
|
|
1070
|
+
objectFlavorAware(kind, deps) {
|
|
1071
|
+
/* if (obj->kind->aware) return; obj->kind->aware = true; (L2272-2273). The
|
|
1072
|
+
* obj->known->effect reveal (L2274) is covered by the on-demand shadow. */
|
|
1073
|
+
if (!this.setAware(kind))
|
|
1074
|
+
return false;
|
|
1075
|
+
/* Fix ignore/autoinscribe (L2276-2279): an item ignored while unaware keeps
|
|
1076
|
+
* being ignored now that it is aware, then flag an ignore re-check. */
|
|
1077
|
+
if (deps.isIgnoredUnaware(kind.kidx))
|
|
1078
|
+
deps.ignoreWhenAware(kind.kidx);
|
|
1079
|
+
deps.requestIgnoreNotice();
|
|
1080
|
+
/* Gear/store base_known sweep (L2281-2290) and floor re-light (L2293-2312)
|
|
1081
|
+
* are on-demand-covered / display-layer respectively; see the doc above. */
|
|
1082
|
+
return true;
|
|
1083
|
+
}
|
|
1084
|
+
/** object_flavor_tried (L2320): mark a kind tried; artifacts are skipped. */
|
|
1085
|
+
setTried(kind) {
|
|
1086
|
+
if (kind.kidx >= this.ordinaryKindCount)
|
|
1087
|
+
return;
|
|
1088
|
+
this.triedKidx.add(kind.kidx);
|
|
1089
|
+
}
|
|
1090
|
+
/** A JSON-safe snapshot of the aware/tried kidx sets, for savefiles. */
|
|
1091
|
+
snapshot() {
|
|
1092
|
+
return {
|
|
1093
|
+
aware: Array.from(this.awareKidx),
|
|
1094
|
+
tried: Array.from(this.triedKidx),
|
|
1095
|
+
};
|
|
1096
|
+
}
|
|
1097
|
+
/** Restore a snapshot() payload (replacing the current knowledge). */
|
|
1098
|
+
restore(data) {
|
|
1099
|
+
this.awareKidx.clear();
|
|
1100
|
+
this.triedKidx.clear();
|
|
1101
|
+
for (const k of data.aware)
|
|
1102
|
+
this.awareKidx.add(k);
|
|
1103
|
+
for (const k of data.tried)
|
|
1104
|
+
this.triedKidx.add(k);
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* The per-game "everseen" knowledge (object.h struct object_kind.everseen and
|
|
1109
|
+
* struct ego_item.everseen). Upstream these bits live on the shared kind/ego
|
|
1110
|
+
* templates and are global to the running game; this port keeps them out of the
|
|
1111
|
+
* immutable bound registry - exactly like FlavorKnowledge - in a per-game store
|
|
1112
|
+
* keyed by kind index (kidx) and ego index (eidx), so a bound ObjRegistry stays
|
|
1113
|
+
* reusable across games and the flags ride the save (save.c L397, L533).
|
|
1114
|
+
*
|
|
1115
|
+
* A kind or ego is marked everseen the first time the player sees an item whose
|
|
1116
|
+
* name they know: object_desc sets obj->kind->everseen once the flavour is
|
|
1117
|
+
* aware, and obj->ego->everseen once the ego is identified (obj-desc.c
|
|
1118
|
+
* L633-637), plus player-birth.c L658 marks each bought start-item's kind. The
|
|
1119
|
+
* object-knowledge browser lists a kind when it is everseen OR flavoured
|
|
1120
|
+
* (ui-knowledge.c L2157); the ego browser lists an ego when it is everseen
|
|
1121
|
+
* (L1847).
|
|
1122
|
+
*
|
|
1123
|
+
* Marking is a pure Set insert: it draws no RNG and does not depend on draw
|
|
1124
|
+
* order, so wiring it into object_desc/generation cannot perturb determinism.
|
|
1125
|
+
*/
|
|
1126
|
+
export class EverseenKnowledge {
|
|
1127
|
+
seenKidx = new Set();
|
|
1128
|
+
seenEidx = new Set();
|
|
1129
|
+
/** obj->kind->everseen: has the player ever seen this kind (name known)? */
|
|
1130
|
+
kindSeen(kind) {
|
|
1131
|
+
return this.seenKidx.has(kind.kidx);
|
|
1132
|
+
}
|
|
1133
|
+
/** obj->ego->everseen: has the player ever seen this ego (identified)? */
|
|
1134
|
+
egoSeen(ego) {
|
|
1135
|
+
return this.seenEidx.has(ego.eidx);
|
|
1136
|
+
}
|
|
1137
|
+
/** obj->kind->everseen = true (obj-desc.c L637 / player-birth.c L658). */
|
|
1138
|
+
markKind(kind) {
|
|
1139
|
+
this.seenKidx.add(kind.kidx);
|
|
1140
|
+
}
|
|
1141
|
+
/** obj->ego->everseen = true (obj-desc.c L634). */
|
|
1142
|
+
markEgo(ego) {
|
|
1143
|
+
this.seenEidx.add(ego.eidx);
|
|
1144
|
+
}
|
|
1145
|
+
/** A JSON-safe snapshot of the seen kidx/eidx sets, for savefiles. */
|
|
1146
|
+
snapshot() {
|
|
1147
|
+
return {
|
|
1148
|
+
kinds: Array.from(this.seenKidx),
|
|
1149
|
+
egos: Array.from(this.seenEidx),
|
|
1150
|
+
};
|
|
1151
|
+
}
|
|
1152
|
+
/** Restore a snapshot() payload (replacing the current knowledge). */
|
|
1153
|
+
restore(data) {
|
|
1154
|
+
this.seenKidx.clear();
|
|
1155
|
+
this.seenEidx.clear();
|
|
1156
|
+
for (const k of data.kinds)
|
|
1157
|
+
this.seenKidx.add(k);
|
|
1158
|
+
for (const e of data.egos)
|
|
1159
|
+
this.seenEidx.add(e);
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
/**
|
|
1163
|
+
* The per-kind autoinscription registry (object.h L241-242's
|
|
1164
|
+
* kind->note_aware / kind->note_unaware). Upstream these two quark strings
|
|
1165
|
+
* live on the shared object_kind template and are global to the running game;
|
|
1166
|
+
* this port keeps them out of the immutable bound registry - like
|
|
1167
|
+
* FlavorKnowledge and IgnoreSettings - in a per-game store keyed by kind index
|
|
1168
|
+
* (kidx), so a bound ObjRegistry stays reusable across games and the notes ride
|
|
1169
|
+
* the save.
|
|
1170
|
+
*
|
|
1171
|
+
* get(kidx, aware) is get_autoinscription (obj-ignore.c L229): the aware note
|
|
1172
|
+
* when the kind is aware, else the unaware note. set() is
|
|
1173
|
+
* add_autoinscription / remove_autoinscription (obj-ignore.c L322 / L294): a
|
|
1174
|
+
* non-empty note registers that slot, an empty note clears it (upstream's
|
|
1175
|
+
* NULL-inscription -> remove_autoinscription path).
|
|
1176
|
+
*
|
|
1177
|
+
* This is the KIND-note half only. The separate rune-based autoinscription
|
|
1178
|
+
* (runes_autoinscribe, obj-ignore.c L217) rides the rune-knowledge system and
|
|
1179
|
+
* stays ledger-deferred (#24).
|
|
1180
|
+
*/
|
|
1181
|
+
export class AutoinscriptionRegistry {
|
|
1182
|
+
/** kind->note_aware / note_unaware, keyed by kidx. Absent slot == no note. */
|
|
1183
|
+
notes = new Map();
|
|
1184
|
+
/** get_autoinscription(kind, aware) (obj-ignore.c L229). */
|
|
1185
|
+
get(kidx, aware) {
|
|
1186
|
+
const rec = this.notes.get(kidx);
|
|
1187
|
+
if (!rec)
|
|
1188
|
+
return undefined;
|
|
1189
|
+
return aware ? rec.aware : rec.unaware;
|
|
1190
|
+
}
|
|
1191
|
+
/**
|
|
1192
|
+
* add_autoinscription (obj-ignore.c L322) / remove_autoinscription (L294):
|
|
1193
|
+
* register the aware or unaware note for a kind. An empty note clears that
|
|
1194
|
+
* slot (upstream's null-inscription branch); a kind with neither slot set is
|
|
1195
|
+
* dropped from the map entirely.
|
|
1196
|
+
*/
|
|
1197
|
+
set(kidx, note, aware) {
|
|
1198
|
+
const rec = this.notes.get(kidx) ?? {};
|
|
1199
|
+
if (note.length > 0) {
|
|
1200
|
+
if (aware)
|
|
1201
|
+
rec.aware = note;
|
|
1202
|
+
else
|
|
1203
|
+
rec.unaware = note;
|
|
1204
|
+
}
|
|
1205
|
+
else if (aware) {
|
|
1206
|
+
delete rec.aware;
|
|
1207
|
+
}
|
|
1208
|
+
else {
|
|
1209
|
+
delete rec.unaware;
|
|
1210
|
+
}
|
|
1211
|
+
if (rec.aware === undefined && rec.unaware === undefined) {
|
|
1212
|
+
this.notes.delete(kidx);
|
|
1213
|
+
}
|
|
1214
|
+
else {
|
|
1215
|
+
this.notes.set(kidx, rec);
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
/** remove_autoinscription (obj-ignore.c L294): clear both slots for a kind. */
|
|
1219
|
+
clear(kidx) {
|
|
1220
|
+
this.notes.delete(kidx);
|
|
1221
|
+
}
|
|
1222
|
+
/** Every kind with a registered note (either slot), for the management UI. */
|
|
1223
|
+
entries() {
|
|
1224
|
+
return Array.from(this.notes.entries()).map(([kidx, rec]) => [
|
|
1225
|
+
kidx,
|
|
1226
|
+
{ ...rec },
|
|
1227
|
+
]);
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
/**
|
|
1231
|
+
* rune_list[i].note (object.h struct rune): the player's per-rune
|
|
1232
|
+
* autoinscription. Upstream this is a quark on the file-static rune_list, set
|
|
1233
|
+
* from the rune knowledge screen (ui-knowledge.c rune_xtra_act, L2246-2280) and
|
|
1234
|
+
* saved/loaded by wr_ignore (save.c:586-605) / rd_ignore (load.c:937-945).
|
|
1235
|
+
* Like AutoinscriptionRegistry it lives per-game here so the bound registries
|
|
1236
|
+
* stay immutable, keyed by the rune's index in buildRuneList - the same key
|
|
1237
|
+
* upstream uses to address rune_list at runtime. (The SAVEFILE keys by runeKey
|
|
1238
|
+
* instead; see runeKey below for why.)
|
|
1239
|
+
*
|
|
1240
|
+
* WART preserved: upstream `rune_set_note(i, "")` goes through quark_add(""),
|
|
1241
|
+
* which returns a NONZERO quark (z-quark.c:31-49 never returns 0 for a new
|
|
1242
|
+
* string), so an empty inscription is a LIVE note that appends nothing - it is
|
|
1243
|
+
* written to the savefile and shows the '}' uninscribe prompt. Only
|
|
1244
|
+
* rune_set_note(i, NULL) clears the slot. Hence set(i, "") stores, set(i, null)
|
|
1245
|
+
* deletes.
|
|
1246
|
+
*/
|
|
1247
|
+
export class RuneNoteRegistry {
|
|
1248
|
+
notes = new Map();
|
|
1249
|
+
/** rune_note(i) (obj-knowledge.c:406). undefined == quark 0 == no note. */
|
|
1250
|
+
get(i) {
|
|
1251
|
+
return this.notes.get(i);
|
|
1252
|
+
}
|
|
1253
|
+
/** rune_set_note(i, inscription) (obj-knowledge.c:414). */
|
|
1254
|
+
set(i, note) {
|
|
1255
|
+
if (note === null)
|
|
1256
|
+
this.notes.delete(i);
|
|
1257
|
+
else
|
|
1258
|
+
this.notes.set(i, note);
|
|
1259
|
+
}
|
|
1260
|
+
/** Every rune index carrying a note, for the save block and the UI. */
|
|
1261
|
+
entries() {
|
|
1262
|
+
return Array.from(this.notes.entries());
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
/** rune_note (obj-knowledge.c:406) as a free function over the registry. */
|
|
1266
|
+
export function runeNote(registry, i) {
|
|
1267
|
+
return registry.get(i);
|
|
1268
|
+
}
|
|
1269
|
+
/** rune_set_note (obj-knowledge.c:414) as a free function over the registry. */
|
|
1270
|
+
export function runeSetNote(registry, i, note) {
|
|
1271
|
+
registry.set(i, note);
|
|
1272
|
+
}
|
|
1273
|
+
/**
|
|
1274
|
+
* A pack-stable identity for a rune, for the savefile only.
|
|
1275
|
+
*
|
|
1276
|
+
* Upstream writes the raw rune-list index (`wr_s16b(k)`, save.c:600) and reads
|
|
1277
|
+
* it straight back (`rune_set_note(runeid, tmp)`, load.c:944), which mis-targets
|
|
1278
|
+
* if the loaded data changes the rune list's shape - the same positional-index
|
|
1279
|
+
* fragility wr_object_memory has. That fragility is a property of the C
|
|
1280
|
+
* SAVEFILE FORMAT, and the port's format is the ratified JSON document whose
|
|
1281
|
+
* load-bearing rule is that every content reference is a stable id
|
|
1282
|
+
* (MOD_LIFECYCLE decision 1, session/save.ts SAVE_VERSION). Runtime behaviour
|
|
1283
|
+
* is untouched: in play a rune is still addressed by its buildRuneList index,
|
|
1284
|
+
* exactly as upstream addresses rune_list.
|
|
1285
|
+
*
|
|
1286
|
+
* `variety:name` is unique across the whole list: buildRuneList already
|
|
1287
|
+
* de-duplicates brands and slays by name, and the remaining varieties draw one
|
|
1288
|
+
* rune per distinct property name.
|
|
1289
|
+
*/
|
|
1290
|
+
export function runeKey(rune) {
|
|
1291
|
+
return `${rune.variety}:${rune.name}`;
|
|
1292
|
+
}
|
|
1293
|
+
/**
|
|
1294
|
+
* rune_name (obj-knowledge.c:325): the display name of a rune, with the
|
|
1295
|
+
* variety-specific decoration - "<x> brand", "slay <x>", "<x> curse",
|
|
1296
|
+
* "resist <x>", and the bare name for combat / modifier / flag runes.
|
|
1297
|
+
*/
|
|
1298
|
+
export function runeName(rune) {
|
|
1299
|
+
switch (rune.variety) {
|
|
1300
|
+
case "brand":
|
|
1301
|
+
return `${rune.name} brand`;
|
|
1302
|
+
case "slay":
|
|
1303
|
+
return `slay ${rune.name}`;
|
|
1304
|
+
case "curse":
|
|
1305
|
+
return `${rune.name} curse`;
|
|
1306
|
+
case "resist":
|
|
1307
|
+
return `resist ${rune.name}`;
|
|
1308
|
+
default:
|
|
1309
|
+
return rune.name;
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
/**
|
|
1313
|
+
* get_autoinscription (obj-ignore.c L229) as a free function over the registry,
|
|
1314
|
+
* mirroring the upstream signature: the aware note when the kind is aware, else
|
|
1315
|
+
* the unaware note; undefined when the kind has no note for that awareness.
|
|
1316
|
+
*/
|
|
1317
|
+
export function getAutoinscription(registry, kidx, aware) {
|
|
1318
|
+
return registry.get(kidx, aware);
|
|
1319
|
+
}
|
|
1320
|
+
/**
|
|
1321
|
+
* add_autoinscription / remove_autoinscription (obj-ignore.c L322 / L294) as a
|
|
1322
|
+
* free function over the registry: register `note` for the aware or unaware
|
|
1323
|
+
* slot; an empty note clears it.
|
|
1324
|
+
*/
|
|
1325
|
+
export function setAutoinscription(registry, kidx, note, aware) {
|
|
1326
|
+
registry.set(kidx, note, aware);
|
|
1327
|
+
}
|
|
1328
|
+
/**
|
|
1329
|
+
* The object_flavor_aware side effect of player_know_object (obj-knowledge.c
|
|
1330
|
+
* L1163-1175). This is the awareness-UPDATE half of player_know_object, split
|
|
1331
|
+
* out so it can be fired at the port's knowledge-update sites - upstream the
|
|
1332
|
+
* whole of player_know_object writes the obj->known twin AND fires this; the
|
|
1333
|
+
* port synthesises the twin on demand for display, so ONLY this awareness half
|
|
1334
|
+
* needs a home, and it must never live on the display path (describing an item
|
|
1335
|
+
* must not mutate the player's knowledge).
|
|
1336
|
+
*
|
|
1337
|
+
* player_know_object early-returns for a not-yet-assessed object (L1033) before
|
|
1338
|
+
* ever reaching these branches, so this mirrors that gate: awareness fires only
|
|
1339
|
+
* once the object is ASSESSED. Then:
|
|
1340
|
+
* - jewellery whose non-curse runes are all known becomes aware (L1163-1167);
|
|
1341
|
+
* - a special artifact that isn't jewellery (kidx >= ordinary_kind_max) becomes
|
|
1342
|
+
* aware outright (L1168-1175).
|
|
1343
|
+
*
|
|
1344
|
+
* object_flavor_aware itself early-returns when the kind is already aware, so
|
|
1345
|
+
* re-firing across repeated rune-learns is a no-op.
|
|
1346
|
+
*/
|
|
1347
|
+
export function playerKnowObjectAwareness(p, env, obj, runes, flavor, flavorDeps) {
|
|
1348
|
+
/* player_know_object's early return at L1033: no awareness for the unassessed. */
|
|
1349
|
+
if ((obj.notice & OBJ_NOTICE.ASSESSED) === 0)
|
|
1350
|
+
return;
|
|
1351
|
+
if (tvalIsJewelry(obj.tval)) {
|
|
1352
|
+
/* object_non_curse_runes_known(obj) (L678): every non-curse rune the object
|
|
1353
|
+
* carries is known to the player. */
|
|
1354
|
+
const nonCurse = runes.filter((r) => r.variety !== "curse");
|
|
1355
|
+
if (objectRunesKnown(p, env, obj, nonCurse)) {
|
|
1356
|
+
flavor.objectFlavorAware(obj.kind, flavorDeps); // L1166
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
else if (obj.kind.kidx >= flavor.ordinaryKindMax) {
|
|
1360
|
+
/* Special artifact that isn't jewelry (L1168-1175). */
|
|
1361
|
+
flavor.objectFlavorAware(obj.kind, flavorDeps); // L1174
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
//# sourceMappingURL=knowledge.js.map
|