@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,852 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The player-action layer: a string-keyed action registry and the
|
|
3
|
+
* process_player() command pump, ported from reference/src/cmd-core.c
|
|
4
|
+
* (cmdq_pop / the command dispatch), game-world.c (process_player and
|
|
5
|
+
* process_player_cleanup: player->energy -= energy_use) and the move/attack
|
|
6
|
+
* path of cmd-cave.c / player-util.c / player-attack.c (Angband 4.2.6).
|
|
7
|
+
*
|
|
8
|
+
* The registry is the moddability seam (decision 13): a command code maps to
|
|
9
|
+
* an action that mutates the game state and returns the energy it spent
|
|
10
|
+
* (0 = a free, non-turn-consuming command). Mods add or replace codes without
|
|
11
|
+
* touching the core. The built-in actions cover walk (move / melee an
|
|
12
|
+
* adjacent monster), hold/rest (spend a turn in place) and the stair commands
|
|
13
|
+
* (signal a level change). Every other command code is registered as a stub
|
|
14
|
+
* that spends no energy and is ledgered as deferred.
|
|
15
|
+
*
|
|
16
|
+
* process_player() reads queued commands through the injected provider
|
|
17
|
+
* (state.nextCommand) so the loop never blocks on real input, and drains free
|
|
18
|
+
* commands until one uses energy or the queue empties, exactly as the
|
|
19
|
+
* upstream do-while around cmdq_pop.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { FEAT, MON_MSG, MON_TMD, MSG, OF, PF, STAT, TF, TMD, TRF } from "../generated/index.js";
|
|
23
|
+
import { DDGRID, DDGRID_DDD, locSum } from "../loc.js";
|
|
24
|
+
import type { Loc } from "../loc.js";
|
|
25
|
+
import { pyAttack } from "../combat/melee.js";
|
|
26
|
+
import type { MeleeAttack, MeleeEffectHooks } from "../combat/melee.js";
|
|
27
|
+
import { learnBrandSlayFromMelee } from "../combat/brand-slay.js";
|
|
28
|
+
import type { TempBrandSlay } from "../combat/brand-slay.js";
|
|
29
|
+
import { getLore } from "../mon/lore.js";
|
|
30
|
+
import type { Monster } from "../mon/monster.js";
|
|
31
|
+
import { MDESC, monsterDesc } from "../mon/desc.js";
|
|
32
|
+
import {
|
|
33
|
+
monsterIsCamouflaged,
|
|
34
|
+
monsterIsObvious,
|
|
35
|
+
monsterIsVisible,
|
|
36
|
+
} from "../mon/predicate.js";
|
|
37
|
+
import { monsterWake } from "../mon/take-hit.js";
|
|
38
|
+
import { MON_TMD_FLG_NOTIFY, monIncTimed } from "../mon/timed.js";
|
|
39
|
+
import { equipLearnFlag, equipLearnOnMeleeAttack } from "../obj/knowledge.js";
|
|
40
|
+
import { playerClearTimed, playerTimedGradeEq } from "../player/timed.js";
|
|
41
|
+
import type { GameState, PlayerCommand } from "./context.js";
|
|
42
|
+
import { arenaInterceptDeath, deleteMonster, movePlayer, squareMonster } from "./context.js";
|
|
43
|
+
import { gearGet } from "./gear.js";
|
|
44
|
+
import { floorPile } from "./floor.js";
|
|
45
|
+
import { isTrappedChest } from "../obj/chest.js";
|
|
46
|
+
import {
|
|
47
|
+
knownIsClosedDoor,
|
|
48
|
+
knownIsEnterable,
|
|
49
|
+
knownIsRubble,
|
|
50
|
+
knownObject,
|
|
51
|
+
squareForget,
|
|
52
|
+
squareIsKnown,
|
|
53
|
+
squareMemorize,
|
|
54
|
+
} from "./known.js";
|
|
55
|
+
import { squareIsSeen } from "../world/view.js";
|
|
56
|
+
import { playerConfuseDir } from "./obj-cmd.js";
|
|
57
|
+
import { disturb } from "./player-path.js";
|
|
58
|
+
import { playerAdjustManaPrecise } from "./loop.js";
|
|
59
|
+
import { formatMonsterMessage } from "./mon-message.js";
|
|
60
|
+
import { squareIsWebbed, squareRemoveAllTraps, squareTrap } from "./trap.js";
|
|
61
|
+
import { PY_EXERT, playerCheckTerrainDamage, playerOverExert } from "./world.js";
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* A player action: mutate the state for `cmd` and return the energy spent
|
|
65
|
+
* (player->upkeep->energy_use). Zero means the command consumed no turn.
|
|
66
|
+
*/
|
|
67
|
+
export type PlayerAction = (state: GameState, cmd: PlayerCommand) => number;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The action registry (moddable command table). Built-ins can be replaced and
|
|
71
|
+
* new codes added; unknown codes fall back to a no-energy stub.
|
|
72
|
+
*/
|
|
73
|
+
export class ActionRegistry {
|
|
74
|
+
private actions = new Map<string, PlayerAction>();
|
|
75
|
+
|
|
76
|
+
/** Register (or replace) the action for a command code. */
|
|
77
|
+
register(code: string, action: PlayerAction): void {
|
|
78
|
+
this.actions.set(code, action);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
has(code: string): boolean {
|
|
82
|
+
return this.actions.has(code);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** The action for a code, or undefined if none is registered. */
|
|
86
|
+
get(code: string): PlayerAction | undefined {
|
|
87
|
+
return this.actions.get(code);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
codes(): string[] {
|
|
91
|
+
return Array.from(this.actions.keys());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The wiring-supplied dependencies for the melee blow side effects (gap 2.5):
|
|
97
|
+
* pieces player-turn cannot build from GameState alone. Installed by the
|
|
98
|
+
* session on the state object (see installMeleeSideEffects); every field is
|
|
99
|
+
* optional, and absent fields degrade to the pre-wiring behaviour.
|
|
100
|
+
*/
|
|
101
|
+
export interface MeleeSideDeps {
|
|
102
|
+
/** effect_simple(EF_EARTHQUAKE, source_player(), "0", 0, 10) (L688). */
|
|
103
|
+
earthquake?: () => void;
|
|
104
|
+
/** effect_simple(EF_HEAL_HP, source_player(), drain) (L878). */
|
|
105
|
+
healHp?: (amount: number) => void;
|
|
106
|
+
/** player_has_temporary_brand/slay over the live timed effects. */
|
|
107
|
+
temp?: TempBrandSlay;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The state extension carrying the wiring-installed melee side deps. */
|
|
111
|
+
type MeleeSideHost = GameState & { meleeSideDeps?: MeleeSideDeps };
|
|
112
|
+
|
|
113
|
+
/** Install the melee side-effect dependencies on the state (session wiring). */
|
|
114
|
+
export function installMeleeSideEffects(
|
|
115
|
+
state: GameState,
|
|
116
|
+
deps: MeleeSideDeps,
|
|
117
|
+
): void {
|
|
118
|
+
(state as MeleeSideHost).meleeSideDeps = deps;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** player_has over the computed player state, else race/class pflags. */
|
|
122
|
+
function playerHasPf(state: GameState, pf: number): boolean {
|
|
123
|
+
const ps = state.playerState;
|
|
124
|
+
if (ps) return ps.pflags.has(pf);
|
|
125
|
+
const p = state.actor.player;
|
|
126
|
+
return p.race.pflags.has(pf) || p.cls.pflags.has(pf);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** player_of_has over the computed player state flags (equip + innate). */
|
|
130
|
+
function playerOfHasFlag(state: GameState, of: number): boolean {
|
|
131
|
+
return state.playerState?.flags.has(of) ?? false;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Build the py_attack side-effect hooks (player-attack.c:669-1012) for an
|
|
136
|
+
* attack on `mon` at its current grid: the confusion brand, vampiric drain,
|
|
137
|
+
* bloodlust over-exertion, impact quake, shapechange verbs, shield bash and
|
|
138
|
+
* COMBAT_REGEN reward, each reading the live GameState. Wiring-dependent
|
|
139
|
+
* pieces (earthquake / heal effects, temporary brands) come from the
|
|
140
|
+
* installed MeleeSideDeps.
|
|
141
|
+
*/
|
|
142
|
+
export function buildMeleeHooks(state: GameState, mon: Monster): MeleeEffectHooks {
|
|
143
|
+
const p = state.actor.player;
|
|
144
|
+
const deps = (state as MeleeSideHost).meleeSideDeps ?? {};
|
|
145
|
+
const grid = mon.grid;
|
|
146
|
+
|
|
147
|
+
const hooks: MeleeEffectHooks = {
|
|
148
|
+
takeHit: {
|
|
149
|
+
...(state.becomeAware ? { becomeAware: state.becomeAware } : {}),
|
|
150
|
+
},
|
|
151
|
+
/* Confusion attack (blow_side_effects, player-attack.c:672-677). */
|
|
152
|
+
attConf: (p.timed[TMD.ATT_CONF] ?? 0) > 0,
|
|
153
|
+
clearAttConf: (): void => {
|
|
154
|
+
/* player_clear_timed(p, TMD_ATT_CONF, true, false): route through the
|
|
155
|
+
* grade machinery for the on-end message when the world env is wired. */
|
|
156
|
+
const eff = state.world?.timedTable?.[TMD.ATT_CONF];
|
|
157
|
+
if (eff) {
|
|
158
|
+
playerClearTimed(p, eff, true, false, state.world?.timedHooks ?? {});
|
|
159
|
+
} else {
|
|
160
|
+
p.timed[TMD.ATT_CONF] = 0;
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
confuseMonster: (m, dur): void => {
|
|
164
|
+
monIncTimed(state.rng, m, MON_TMD.CONF, dur, MON_TMD_FLG_NOTIFY);
|
|
165
|
+
},
|
|
166
|
+
/* Vampiric drain (player-attack.c:877-881). */
|
|
167
|
+
attVamp: (p.timed[TMD.ATT_VAMP] ?? 0) > 0,
|
|
168
|
+
healPlayer: (amount): void => {
|
|
169
|
+
if (deps.healHp) {
|
|
170
|
+
deps.healHp(amount);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
/* EF_HEAL_HP fallback: constant amount, no RNG. */
|
|
174
|
+
if (p.chp >= p.mhp || amount <= 0) return;
|
|
175
|
+
p.chp += amount;
|
|
176
|
+
if (p.chp >= p.mhp) {
|
|
177
|
+
p.chp = p.mhp;
|
|
178
|
+
p.chpFrac = 0;
|
|
179
|
+
}
|
|
180
|
+
if (amount < 5) state.msg?.("You feel a little better.");
|
|
181
|
+
else if (amount < 15) state.msg?.("You feel better.");
|
|
182
|
+
else if (amount < 35) state.msg?.("You feel much better.");
|
|
183
|
+
else state.msg?.("You feel very good.");
|
|
184
|
+
},
|
|
185
|
+
/* Bloodlust over-exertion (player-attack.c:770-774, 871-874). */
|
|
186
|
+
bloodlust: (p.timed[TMD.BLOODLUST] ?? 0) > 0,
|
|
187
|
+
overExertScramble: (): void => {
|
|
188
|
+
state.msg?.("You feel strange...");
|
|
189
|
+
playerOverExert(state, PY_EXERT.SCRAMBLE, 20, 20);
|
|
190
|
+
},
|
|
191
|
+
overExertCon: (): void => {
|
|
192
|
+
state.msg?.("You feel something give way!");
|
|
193
|
+
playerOverExert(state, PY_EXERT.CON, 20, 0);
|
|
194
|
+
},
|
|
195
|
+
/* Impact earthquakes (player-attack.c:816-819, blow_after_effects). */
|
|
196
|
+
impact: playerOfHasFlag(state, OF.IMPACT),
|
|
197
|
+
learnImpact: (): void => {
|
|
198
|
+
equipLearnFlag(p, state.runeEnv, OF.IMPACT);
|
|
199
|
+
},
|
|
200
|
+
...(deps.earthquake
|
|
201
|
+
? {
|
|
202
|
+
earthquake: deps.earthquake,
|
|
203
|
+
monsterGone: (): boolean => squareMonster(state, grid) !== mon,
|
|
204
|
+
}
|
|
205
|
+
: {}),
|
|
206
|
+
...(deps.temp ? { temp: deps.temp } : {}),
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
/* Shapechange blow substitution (player-attack.c:831-838). */
|
|
210
|
+
if (p.shape && p.shape.name !== "normal" && p.shape.blows.length > 0) {
|
|
211
|
+
hooks.shapeBlows = p.shape.blows;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/* Reward BGs with 5% of max SPs, min 1/2 point (player-attack.c:1002). */
|
|
215
|
+
if (playerHasPf(state, PF.COMBAT_REGEN)) {
|
|
216
|
+
hooks.combatRegen = (): void => {
|
|
217
|
+
const spGain = Math.trunc((Math.max(p.msp, 10) * 16384) / 5);
|
|
218
|
+
playerAdjustManaPrecise(p, spGain);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* Shield bash (player-attack.c:897-978, attempt_shield_bash). */
|
|
223
|
+
if (playerHasPf(state, PF.SHIELD_BASH)) {
|
|
224
|
+
const armSlot = p.body.slots.findIndex((s) => s.type === "SHIELD");
|
|
225
|
+
const shield =
|
|
226
|
+
armSlot >= 0 ? gearGet(state.gear, p.equipment[armSlot] ?? 0) : null;
|
|
227
|
+
hooks.shieldBash = {
|
|
228
|
+
shield,
|
|
229
|
+
dexInd: state.statInd?.[STAT.DEX] ?? 0,
|
|
230
|
+
strInd: state.statInd?.[STAT.STR] ?? 0,
|
|
231
|
+
playerWt: p.wt,
|
|
232
|
+
totalWeight: p.upkeep.totalWeight,
|
|
233
|
+
showDamage: state.options?.get("show_damage") ?? false,
|
|
234
|
+
msg: (text): void => state.msg?.(text),
|
|
235
|
+
stunMonster: (m, dur): void => {
|
|
236
|
+
monIncTimed(state.rng, m, MON_TMD.STUN, dur, 0);
|
|
237
|
+
},
|
|
238
|
+
confuseMonster: (m, dur): void => {
|
|
239
|
+
monIncTimed(state.rng, m, MON_TMD.CONF, dur, 0);
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return hooks;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The shared player-melee path: learn-on-attack wrapping, py_attack with the
|
|
249
|
+
* full side-effect hooks, the delayed "flees in terror" message, and kill
|
|
250
|
+
* handling. Returns the energy used (py_attack's energy_use). Used by the walk
|
|
251
|
+
* command and the bloodlust random attack.
|
|
252
|
+
*/
|
|
253
|
+
export function attackMonster(state: GameState, target: Monster): number {
|
|
254
|
+
/* Learning from the attack (player-attack.c L822 equip_learn_on_melee_
|
|
255
|
+
* attack; obj-slays.c learn_brand_slay_from_melee). */
|
|
256
|
+
const deps = (state as MeleeSideHost).meleeSideDeps ?? {};
|
|
257
|
+
const monVisible = monsterIsVisible(target);
|
|
258
|
+
/* health_track (player-attack.c:745-749): hitting something visible makes it
|
|
259
|
+
* the tracked monster, which is what puts it on the sidebar's health bar. This
|
|
260
|
+
* was absent, and melee is the commonest way a player acquires a tracked
|
|
261
|
+
* monster - so the bar stayed blank unless you explicitly targeted. Upstream
|
|
262
|
+
* does it per blow inside py_attack_real; the assignment is idempotent, so
|
|
263
|
+
* once before the blow loop is behaviourally identical. */
|
|
264
|
+
if (monVisible) state.healthWho = target;
|
|
265
|
+
learnBrandSlayFromMelee(
|
|
266
|
+
state.actor.player,
|
|
267
|
+
state.runeEnv,
|
|
268
|
+
state.actor.weapon,
|
|
269
|
+
{
|
|
270
|
+
race: target.race,
|
|
271
|
+
visible: monVisible,
|
|
272
|
+
lore: getLore(state.lore, target.race),
|
|
273
|
+
},
|
|
274
|
+
deps.temp,
|
|
275
|
+
);
|
|
276
|
+
const result: MeleeAttack = pyAttack(
|
|
277
|
+
state.rng,
|
|
278
|
+
state.actor.player,
|
|
279
|
+
state.actor.combat,
|
|
280
|
+
state.actor.weapon,
|
|
281
|
+
target,
|
|
282
|
+
state.brands,
|
|
283
|
+
state.slays,
|
|
284
|
+
{
|
|
285
|
+
/* chance_of_melee_hit halves unseen targets (player-attack.c:104-109),
|
|
286
|
+
* and py_attack's delayed fear message uses the same visibility. */
|
|
287
|
+
monVisible,
|
|
288
|
+
/* player_of_has(p, OF_AFRAID): py_attack_real refuses the blow and prints
|
|
289
|
+
* "You are too afraid to attack X!" (player-attack.c L752). For obvious
|
|
290
|
+
* monsters do_cmd_walk_test short-circuits before this; the check here
|
|
291
|
+
* covers the invisible-monster walk and open/close/tunnel/alter-into-a-
|
|
292
|
+
* monster (attackBlocker), which upstream routes straight to py_attack. */
|
|
293
|
+
afraid: playerOfHasFlag(state, OF.AFRAID),
|
|
294
|
+
percentDamage: state.options?.get("birth_percent_damage") ?? false,
|
|
295
|
+
/* avail_energy = MIN(p->energy, move_energy); process_player only runs
|
|
296
|
+
* with energy >= move_energy, so the full-turn default is upstream's
|
|
297
|
+
* value at every real call site. */
|
|
298
|
+
moveEnergy: state.z.moveEnergy,
|
|
299
|
+
hooks: buildMeleeHooks(state, target),
|
|
300
|
+
},
|
|
301
|
+
);
|
|
302
|
+
equipLearnOnMeleeAttack(state.actor.player, state.runeEnv);
|
|
303
|
+
/* py_attack message slice: hand the blow-by-blow result to the shell for
|
|
304
|
+
* faithful "You hit/miss/slay the X" text (combat returns HitType keys
|
|
305
|
+
* only). Before deletion so the monster name is still resolvable. */
|
|
306
|
+
state.onMelee?.(target, result);
|
|
307
|
+
/* Hack - delay fear messages (player-attack.c:1023). */
|
|
308
|
+
if (result.monsterFled) {
|
|
309
|
+
const flee = formatMonsterMessage(target, MON_MSG.FLEE_IN_TERROR);
|
|
310
|
+
if (flee) state.msg?.(flee);
|
|
311
|
+
}
|
|
312
|
+
if (result.monsterDied && !arenaInterceptDeath(state, target)) {
|
|
313
|
+
state.onPlayerKill?.(target);
|
|
314
|
+
deleteMonster(state, target.midx);
|
|
315
|
+
}
|
|
316
|
+
return result.energyUsed;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* energy_per_move (player-util.c:323-328): the energy one step costs, taking
|
|
321
|
+
* extra moves (state->num_moves, OBJ_MOD_MOVES) into account.
|
|
322
|
+
*/
|
|
323
|
+
export function energyPerMove(state: GameState): number {
|
|
324
|
+
const num = state.playerState?.numMoves ?? 0;
|
|
325
|
+
const energy = state.z.moveEnergy;
|
|
326
|
+
return Math.trunc((energy * (1 + Math.abs(num) - num)) / (1 + Math.abs(num)));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* player_attack_random_monster (player-util.c:794-813): melee a random
|
|
331
|
+
* adjacent monster ("You angrily lash out at a nearby foe!"). Draws the
|
|
332
|
+
* starting direction BEFORE the confusion check, as upstream declares
|
|
333
|
+
* `dir = randint0(8)` in the initializer. Returns the energy used, or -1 when
|
|
334
|
+
* no monster was attacked (the command proceeds normally).
|
|
335
|
+
*/
|
|
336
|
+
export function playerAttackRandomMonster(state: GameState): number {
|
|
337
|
+
const p = state.actor.player;
|
|
338
|
+
let dir = state.rng.randint0(8);
|
|
339
|
+
|
|
340
|
+
/* Confused players get a free pass. */
|
|
341
|
+
if ((p.timed[TMD.CONFUSED] ?? 0) > 0) return -1;
|
|
342
|
+
|
|
343
|
+
/* Look for a monster, attack. */
|
|
344
|
+
for (let i = 0; i < 8; i++, dir++) {
|
|
345
|
+
const grid = locSum(state.actor.grid, DDGRID_DDD[dir % 8]!);
|
|
346
|
+
const mon = squareMonster(state, grid);
|
|
347
|
+
if (mon && !monsterIsCamouflaged(mon)) {
|
|
348
|
+
/* Upstream sets energy_use = move_energy here, but py_attack resets it
|
|
349
|
+
* to zero and re-accumulates per blow (an upstream quirk preserved:
|
|
350
|
+
* the assignment is dead). */
|
|
351
|
+
state.msg?.("You angrily lash out at a nearby foe!");
|
|
352
|
+
return attackMonster(state, mon);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return -1;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* walk: melee an adjacent monster (py_attack) or step onto a passable grid,
|
|
360
|
+
* refreshing FOV via the injected hook. Returns move_energy when the turn is
|
|
361
|
+
* spent, 0 when blocked by a wall (a bump uses no energy).
|
|
362
|
+
*/
|
|
363
|
+
/**
|
|
364
|
+
* move_player's pre-step damaging-terrain check (cmd-cave.c L1156-1180), factored
|
|
365
|
+
* out for the web shell to run BEFORE it queues a walk so it can block on the
|
|
366
|
+
* yes/no confirm (the core walk action is synchronous and cannot await UI).
|
|
367
|
+
*
|
|
368
|
+
* Returns the feature's walk_msg when a deliberate (non-running) step onto fiery
|
|
369
|
+
* terrain (lava) would cost more than a third of current HP, so the shell prompts
|
|
370
|
+
* "Really step in?" and, on "no", cancels the move without spending a turn; null
|
|
371
|
+
* otherwise. Faithful conditions: only when the target grid is actually stepped
|
|
372
|
+
* onto (not a wall bump, not a monster attack) and the player is not confused
|
|
373
|
+
* (a confused player is never prompted). Like C, playerCheckTerrainDamage(false)
|
|
374
|
+
* is drawn whenever an unconfused player steps onto fiery terrain - prompt or not
|
|
375
|
+
* - which, with the post-turn damage draw, reproduces C's double draw; it learns
|
|
376
|
+
* no rune. The running-into-lava run_msg branch is a documented follow-up.
|
|
377
|
+
*/
|
|
378
|
+
export function walkTerrainPrompt(
|
|
379
|
+
state: GameState,
|
|
380
|
+
rawDir: number,
|
|
381
|
+
): string | null {
|
|
382
|
+
if (rawDir < 1 || rawDir > 9 || rawDir === 5) return null;
|
|
383
|
+
/* move_player only checks damaging terrain when not confused (cmd-cave.c
|
|
384
|
+
* L1157); a confused player is never prompted and draws no terrain-check RNG
|
|
385
|
+
* here (the randomised direction and any damage happen later in walkAction). */
|
|
386
|
+
if ((state.actor.player.timed[TMD.CONFUSED] ?? 0) > 0) return null;
|
|
387
|
+
|
|
388
|
+
const offset = DDGRID[rawDir] as Loc;
|
|
389
|
+
const next: Loc = {
|
|
390
|
+
x: state.actor.grid.x + offset.x,
|
|
391
|
+
y: state.actor.grid.y + offset.y,
|
|
392
|
+
};
|
|
393
|
+
if (!state.chunk.inBounds(next)) return null;
|
|
394
|
+
/* The confirm is on move_player's actual-step branch, after the monster-attack
|
|
395
|
+
* and wall branches: no prompt when attacking a monster or bumping a wall. */
|
|
396
|
+
if (squareMonster(state, next)) return null;
|
|
397
|
+
if (!state.chunk.isPassable(next)) return null;
|
|
398
|
+
if (!state.chunk.isFiery(next)) return null;
|
|
399
|
+
|
|
400
|
+
const dam = playerCheckTerrainDamage(state, next, false);
|
|
401
|
+
/* Non-running walk: prompt only when the step costs more than a third of the
|
|
402
|
+
* player's current HP (cmd-cave.c L1174-1177). */
|
|
403
|
+
if (dam > Math.trunc(state.actor.player.chp / 3)) {
|
|
404
|
+
return state.chunk.feature(next).walkMsg;
|
|
405
|
+
}
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export function walkAction(state: GameState, cmd: PlayerCommand): number {
|
|
410
|
+
const rawDir = cmd.dir;
|
|
411
|
+
if (rawDir === undefined || rawDir < 1 || rawDir > 9 || rawDir === 5) return 0;
|
|
412
|
+
|
|
413
|
+
/*
|
|
414
|
+
* The port merges do_cmd_walk and move_player into one action; upstream's
|
|
415
|
+
* run_step (player-path.c:2042) calls move_player DIRECTLY, skipping
|
|
416
|
+
* do_cmd_walk's preamble. `fromRun` says which caller this is, and the one
|
|
417
|
+
* place it currently changes behaviour is the known-blocked-grid wording
|
|
418
|
+
* below. The other two preamble steps are unreachable from a run either way:
|
|
419
|
+
* runAction refuses to start while confused (so player_confuse_dir cannot
|
|
420
|
+
* redirect a run step) and clears the web underfoot before the first step (and
|
|
421
|
+
* run_test treats a web ahead as a wall).
|
|
422
|
+
*/
|
|
423
|
+
const fromRun = cmd.args?.["fromRun"] === true;
|
|
424
|
+
|
|
425
|
+
/*
|
|
426
|
+
* do_cmd_walk / do_cmd_jump (cmd-cave.c:1288-1297 / 1328-1337): standing in
|
|
427
|
+
* a web clears the web and spends the turn in place - no movement.
|
|
428
|
+
*/
|
|
429
|
+
if (!fromRun && squareIsWebbed(state, state.actor.grid)) {
|
|
430
|
+
state.msg?.("You clear the web.");
|
|
431
|
+
/* square_remove_all_traps_of_type(web->tidx) (cmd-cave.c:1294). */
|
|
432
|
+
const web = squareTrap(state, state.actor.grid).find(
|
|
433
|
+
(t) => t.kind.flags.has(TRF.WEB) || t.kind.desc === "web",
|
|
434
|
+
);
|
|
435
|
+
squareRemoveAllTraps(state, state.actor.grid, web?.tidx ?? -1);
|
|
436
|
+
return state.z.moveEnergy;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/* do_cmd_walk (cmd-cave.c L1299-1302): confusion randomises the direction.
|
|
440
|
+
* When it redirects ("You are confused."), the move spends a full turn even
|
|
441
|
+
* if it dead-ends against a wall (energy_use is set to move_energy before the
|
|
442
|
+
* walkability test). The bump-open wrapper (installCaveCommands) applies
|
|
443
|
+
* confusion up front and sets confusedApplied so the RNG is drawn once; a
|
|
444
|
+
* direct caller (jump, borg, tests) rolls it here. */
|
|
445
|
+
let dir = rawDir;
|
|
446
|
+
let confused = false;
|
|
447
|
+
if (!cmd.confusedApplied) {
|
|
448
|
+
dir = playerConfuseDir(state, rawDir);
|
|
449
|
+
confused = dir !== rawDir;
|
|
450
|
+
}
|
|
451
|
+
const offset = DDGRID[dir] as Loc;
|
|
452
|
+
|
|
453
|
+
const next: Loc = { x: state.actor.grid.x + offset.x, y: state.actor.grid.y + offset.y };
|
|
454
|
+
if (!state.chunk.inBounds(next)) return confused ? state.z.moveEnergy : 0;
|
|
455
|
+
|
|
456
|
+
const target = squareMonster(state, next);
|
|
457
|
+
if (target) {
|
|
458
|
+
/* move_player (cmd-cave.c L1071): a camouflaged monster in the way
|
|
459
|
+
* surprises the player instead of being attacked - reveal it and wake it,
|
|
460
|
+
* matching upstream's become_aware + monster_wake(mon, false, 100). */
|
|
461
|
+
if (monsterIsCamouflaged(target)) {
|
|
462
|
+
state.becomeAware?.(target);
|
|
463
|
+
monsterWake(state.rng, target, false, 100);
|
|
464
|
+
return state.z.moveEnergy;
|
|
465
|
+
}
|
|
466
|
+
/* do_cmd_walk_test (cmd-cave.c L1213-1226): an afraid player refuses to
|
|
467
|
+
* attack an obvious (visible, non-camouflaged) monster - it prints "You are
|
|
468
|
+
* too afraid to attack X!", learns OF_AFRAID from equipment, and makes no
|
|
469
|
+
* move. do_cmd_walk sets energy only AFTER the test passes, so an unconfused
|
|
470
|
+
* refusal costs nothing; a confused walk already spent its full turn. An
|
|
471
|
+
* invisible monster is not obvious, so it falls through to py_attack, whose
|
|
472
|
+
* own afraid branch (player-attack.c L752) fires there instead. */
|
|
473
|
+
if (monsterIsObvious(target) && playerOfHasFlag(state, OF.AFRAID)) {
|
|
474
|
+
state.msg?.(
|
|
475
|
+
`You are too afraid to attack ${monsterDesc(target, MDESC.DEFAULT)}!`,
|
|
476
|
+
"AFRAID",
|
|
477
|
+
);
|
|
478
|
+
state.sound?.(MSG.AFRAID);
|
|
479
|
+
equipLearnFlag(state.actor.player, state.runeEnv, OF.AFRAID);
|
|
480
|
+
return confused ? state.z.moveEnergy : 0;
|
|
481
|
+
}
|
|
482
|
+
/* py_attack: the shared melee path with the full blow side-effect suite.
|
|
483
|
+
* Energy is py_attack's own energy_use (blow_energy per blow), which may
|
|
484
|
+
* be less than a full turn, exactly as upstream. */
|
|
485
|
+
return attackMonster(state, target);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/* Bump into a wall: no step, no energy.
|
|
489
|
+
* A mod may take the walk over through the walkBlockedByDiggable hook
|
|
490
|
+
* (mod/hooks.ts) - the QoL mod digs here. autoDigStep returns null having drawn
|
|
491
|
+
* NO RNG when no mod supplied one, so faithful core still just bumps. */
|
|
492
|
+
if (!state.chunk.isPassable(next)) {
|
|
493
|
+
/* `!== null`, not `> 0`: a mod may handle the walk and charge ZERO energy
|
|
494
|
+
* (mod/hooks.ts), and `> 0` silently threw that case away by treating it as
|
|
495
|
+
* "no mod supplied one". */
|
|
496
|
+
const dug = state.autoDigStep?.(state, next) ?? null;
|
|
497
|
+
if (dug !== null) return dug;
|
|
498
|
+
/*
|
|
499
|
+
* Upstream splits this by whether the player already KNOWS the grid, and
|
|
500
|
+
* the port previously used the known-grid wording for both cases.
|
|
501
|
+
*
|
|
502
|
+
* Unknown: do_cmd_walk_test lets the walk proceed (cmd-cave.c:1231-1232),
|
|
503
|
+
* so move_player runs and takes its own !square_ispassable branch
|
|
504
|
+
* (:1092-1106) - "You FEEL a wall blocking your way", because the player
|
|
505
|
+
* cannot see it - and MEMORIZES the grid. That mapping side effect is how
|
|
506
|
+
* you feel your way along an unlit corridor, and it was missing entirely:
|
|
507
|
+
* bumping an unseen wall left it unmapped forever and announced the wall as
|
|
508
|
+
* though it had been in plain sight.
|
|
509
|
+
*
|
|
510
|
+
* Known: do_cmd_walk_test messages "in the way!" and refuses the move
|
|
511
|
+
* (:1240-1253), reconciling player memory with what is really there.
|
|
512
|
+
*
|
|
513
|
+
* A closed door is silent in the KNOWN case only - the walk override
|
|
514
|
+
* (installCaveCommands) opens it (move_player's alter branch, :1079-1083) -
|
|
515
|
+
* so the base action stays a safe fallback when the override is absent
|
|
516
|
+
* (borg / unit tests). An UNKNOWN closed door does get its own line.
|
|
517
|
+
*/
|
|
518
|
+
disturb(state);
|
|
519
|
+
const rubble = state.chunk.isRubble(next);
|
|
520
|
+
const door = state.chunk.isClosedDoor(next);
|
|
521
|
+
if (!squareIsKnown(state, next)) {
|
|
522
|
+
state.msg?.(
|
|
523
|
+
rubble
|
|
524
|
+
? "You feel a pile of rubble blocking your way."
|
|
525
|
+
: door
|
|
526
|
+
? "You feel a door blocking your way."
|
|
527
|
+
: "You feel a wall blocking your way.",
|
|
528
|
+
"HITWALL",
|
|
529
|
+
);
|
|
530
|
+
/* square_memorize + square_light_spot at each of :1096, :1100, :1104. */
|
|
531
|
+
squareMemorize(state, next);
|
|
532
|
+
} else if (fromRun) {
|
|
533
|
+
/*
|
|
534
|
+
* move_player's OWN known-grid branch (cmd-cave.c:1108-1130), whose
|
|
535
|
+
* wording differs from do_cmd_walk_test's above: "blocking your way", not
|
|
536
|
+
* "in the way!". It is reached only when something other than a deliberate
|
|
537
|
+
* walk drives move_player, because a deliberate walk is refused by
|
|
538
|
+
* do_cmd_walk_test before move_player runs. In 4.2.6 that leaves exactly
|
|
539
|
+
* one route - run_step (player-path.c:2042). The whirlwind
|
|
540
|
+
* (effect-handler-attack.c:1838) is NOT a second route, contrary to the
|
|
541
|
+
* census note: it tests square_ispassable on every candidate grid and
|
|
542
|
+
* says "The way is barred." rather than moving into one.
|
|
543
|
+
*
|
|
544
|
+
* A closed door reports here too (unlike the walk case, where the walk
|
|
545
|
+
* override opens it), because run_step passes disarm only for a trap.
|
|
546
|
+
*/
|
|
547
|
+
state.msg?.(
|
|
548
|
+
rubble
|
|
549
|
+
? "There is a pile of rubble blocking your way."
|
|
550
|
+
: door
|
|
551
|
+
? "There is a door blocking your way."
|
|
552
|
+
: "There is a wall blocking your way.",
|
|
553
|
+
"HITWALL",
|
|
554
|
+
);
|
|
555
|
+
/* The same memory reconciliation, per branch (:1112-1129). */
|
|
556
|
+
if (rubble) {
|
|
557
|
+
if (!knownIsRubble(state, next)) squareMemorize(state, next);
|
|
558
|
+
} else if (door) {
|
|
559
|
+
if (!knownIsClosedDoor(state, next)) squareMemorize(state, next);
|
|
560
|
+
} else if (knownIsEnterable(state, next)) {
|
|
561
|
+
squareForget(state, next);
|
|
562
|
+
}
|
|
563
|
+
} else if (!door) {
|
|
564
|
+
state.msg?.(
|
|
565
|
+
rubble
|
|
566
|
+
? "There is a pile of rubble in the way!"
|
|
567
|
+
: "There is a wall in the way!",
|
|
568
|
+
"HITWALL",
|
|
569
|
+
);
|
|
570
|
+
/* The memory reconciliation upstream performs alongside each message: a
|
|
571
|
+
* remembered floor/rubble/door that turns out to be a wall is forgotten
|
|
572
|
+
* (:1252-1257), and rubble the player misremembered is re-memorized
|
|
573
|
+
* (:1243-1246). */
|
|
574
|
+
if (rubble) {
|
|
575
|
+
if (!knownIsRubble(state, next)) squareMemorize(state, next);
|
|
576
|
+
} else if (knownIsEnterable(state, next)) {
|
|
577
|
+
squareForget(state, next);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
/* A confused redirect into a wall still spends the turn (cmd-cave.c
|
|
581
|
+
* L1300-1302); a deliberate bump refunds all energy. */
|
|
582
|
+
return confused ? state.z.moveEnergy : 0;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
movePlayer(state, next);
|
|
586
|
+
if (state.updateFov) state.updateFov(state);
|
|
587
|
+
search(state); /* player_handle_post_move (player-util.c:1633-1634). */
|
|
588
|
+
|
|
589
|
+
/* Autopickup on the new grid (upstream queues CMD_AUTOPICKUP; its energy
|
|
590
|
+
* cost is folded into this step, see game/pickup.ts). */
|
|
591
|
+
const pickupCost = state.autoPickup ? state.autoPickup(state) : 0;
|
|
592
|
+
|
|
593
|
+
/* Trap / terrain consequences of the step (move_player -> hit_trap). */
|
|
594
|
+
state.onPlayerMoved?.(state, next);
|
|
595
|
+
|
|
596
|
+
/* energy_per_move (cmd-cave.c move_player L1163 via player-util.c:323):
|
|
597
|
+
* extra-moves items make steps cheaper (gap 2.3). */
|
|
598
|
+
return energyPerMove(state) + pickupCost;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* jump (do_cmd_jump, cmd-cave.c:1319): "walk into a trap" - identical to
|
|
603
|
+
* do_cmd_walk except move_player is called with disarm=false (cmd-cave.c:1351),
|
|
604
|
+
* so a known disarmable trap is stepped onto rather than auto-disarmed. The
|
|
605
|
+
* cave-cmd walk wrapper only auto-disarms for code "walk"; jump falls through
|
|
606
|
+
* to the step path.
|
|
607
|
+
*/
|
|
608
|
+
export function jumpAction(state: GameState, cmd: PlayerCommand): number {
|
|
609
|
+
return walkAction(state, cmd);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* search (player-util.c:1680-1715): reveal adjacent secret doors and the
|
|
614
|
+
* traps on known chests. The only RNG is place_closed_door's one_in_(4), then
|
|
615
|
+
* randint1(7) on success, once per discovered door in y/x scan order.
|
|
616
|
+
*/
|
|
617
|
+
export function search(state: GameState): void {
|
|
618
|
+
const p = state.actor.player;
|
|
619
|
+
if (
|
|
620
|
+
(p.timed[TMD.BLIND] ?? 0) > 0 ||
|
|
621
|
+
!squareIsSeen(state.chunk, state.actor.grid) ||
|
|
622
|
+
(p.timed[TMD.CONFUSED] ?? 0) > 0 ||
|
|
623
|
+
(p.timed[TMD.IMAGE] ?? 0) > 0
|
|
624
|
+
) return;
|
|
625
|
+
|
|
626
|
+
for (let y = state.actor.grid.y - 1; y <= state.actor.grid.y + 1; y++) {
|
|
627
|
+
for (let x = state.actor.grid.x - 1; x <= state.actor.grid.x + 1; x++) {
|
|
628
|
+
const grid = { x, y };
|
|
629
|
+
if (!state.chunk.inBoundsFully(grid)) continue;
|
|
630
|
+
|
|
631
|
+
const flags = state.chunk.feature(grid).flags;
|
|
632
|
+
if (flags.has(TF.DOOR_ANY) && flags.has(TF.ROCK)) {
|
|
633
|
+
state.msg?.("You have found a secret door.");
|
|
634
|
+
state.chunk.setFeat(grid, FEAT.CLOSED);
|
|
635
|
+
if (state.rng.oneIn(4)) {
|
|
636
|
+
state.setDoorLock?.(grid, state.rng.randint1(7));
|
|
637
|
+
}
|
|
638
|
+
disturb(state);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/*
|
|
642
|
+
* The C tests knowledge PER OBJECT (`if (!obj->known || ...) continue;`),
|
|
643
|
+
* which has no exact analogue here: this port's object memory is per GRID
|
|
644
|
+
* (KnownObjectMemory holds the remembered pile head's glyph, not a shadow
|
|
645
|
+
* per object), so the closest check is "is this grid's pile remembered".
|
|
646
|
+
*
|
|
647
|
+
* For floor piles the two agree, because square_know_pile shadows the
|
|
648
|
+
* WHOLE pile at once -- either every object on the grid has a shadow or
|
|
649
|
+
* none does. They diverge only for an object added to an
|
|
650
|
+
* already-remembered grid since the last know_pile, e.g. a chest dropped
|
|
651
|
+
* onto a mapped floor: upstream will not discover its trap until the pile
|
|
652
|
+
* is known again, this will. Narrow, and recorded as a finding rather than
|
|
653
|
+
* faked, since a per-object shadow is a larger design change.
|
|
654
|
+
*/
|
|
655
|
+
if (!knownObject(state, grid)) continue;
|
|
656
|
+
for (const obj of floorPile(state, grid)) {
|
|
657
|
+
if ((state.isIgnored?.(obj) ?? false) || !isTrappedChest(obj)) continue;
|
|
658
|
+
if (obj.knownPval !== obj.pval) {
|
|
659
|
+
state.msg?.("You have discovered a trap on the chest!");
|
|
660
|
+
obj.knownPval = obj.pval;
|
|
661
|
+
disturb(state);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/** hold / rest: stay put and spend a full turn. */
|
|
669
|
+
export function holdAction(state: GameState, _cmd: PlayerCommand): number {
|
|
670
|
+
search(state);
|
|
671
|
+
return state.z.moveEnergy;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* sleep (do_cmd_sleep, cmd-cave.c:1675): spend a full turn doing nothing.
|
|
676
|
+
* process_player injects CMD_SLEEP when the player is paralyzed or Knocked Out
|
|
677
|
+
* (game-world.c:965-968).
|
|
678
|
+
*/
|
|
679
|
+
export function sleepAction(state: GameState, _cmd: PlayerCommand): number {
|
|
680
|
+
return state.z.moveEnergy;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* descend / ascend: signal a level change (player->upkeep->generate_level).
|
|
685
|
+
* The actual level generation and depth change are DEFERRED to the world
|
|
686
|
+
* integration; the loop observes the signal and clears it.
|
|
687
|
+
*/
|
|
688
|
+
export function descendAction(state: GameState, _cmd: PlayerCommand): number {
|
|
689
|
+
state.generateLevel = true;
|
|
690
|
+
return state.z.moveEnergy;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
export function ascendAction(state: GameState, _cmd: PlayerCommand): number {
|
|
694
|
+
state.generateLevel = true;
|
|
695
|
+
return state.z.moveEnergy;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/** A deferred command: consumes no turn (ledgered as not yet ported). */
|
|
699
|
+
export function stubAction(_state: GameState, _cmd: PlayerCommand): number {
|
|
700
|
+
return 0;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/** Command codes registered as stubs (deferred; see game-loop.yaml).
|
|
704
|
+
* "pickup"/"autopickup" stubs are replaced by installPickup (game/pickup.ts);
|
|
705
|
+
* "run" is replaced by installRunning (game/player-path.ts). */
|
|
706
|
+
export const STUBBED_COMMANDS: readonly string[] = [
|
|
707
|
+
"tunnel",
|
|
708
|
+
"cast",
|
|
709
|
+
"fire",
|
|
710
|
+
"throw",
|
|
711
|
+
"quaff",
|
|
712
|
+
"read",
|
|
713
|
+
"eat",
|
|
714
|
+
"use-staff",
|
|
715
|
+
"aim-wand",
|
|
716
|
+
"zap-rod",
|
|
717
|
+
"activate",
|
|
718
|
+
"pickup",
|
|
719
|
+
"drop",
|
|
720
|
+
"wield",
|
|
721
|
+
"takeoff",
|
|
722
|
+
"look",
|
|
723
|
+
"search",
|
|
724
|
+
"disarm",
|
|
725
|
+
"open",
|
|
726
|
+
"close",
|
|
727
|
+
];
|
|
728
|
+
|
|
729
|
+
/** Build the default registry: the ported actions plus the deferred stubs. */
|
|
730
|
+
export function createDefaultRegistry(): ActionRegistry {
|
|
731
|
+
const reg = new ActionRegistry();
|
|
732
|
+
reg.register("walk", walkAction);
|
|
733
|
+
reg.register("jump", jumpAction);
|
|
734
|
+
reg.register("hold", holdAction);
|
|
735
|
+
reg.register("rest", holdAction);
|
|
736
|
+
reg.register("sleep", sleepAction);
|
|
737
|
+
reg.register("descend", descendAction);
|
|
738
|
+
reg.register("ascend", ascendAction);
|
|
739
|
+
for (const code of STUBBED_COMMANDS) reg.register(code, stubAction);
|
|
740
|
+
return reg;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Command codes whose upstream game_cmds entry has can_use_energy = false
|
|
745
|
+
* (cmd-core.c game_cmds): these skip the pre-command bloodlust coercion roll.
|
|
746
|
+
* Every other code maps to an energy-capable command and draws the roll.
|
|
747
|
+
*/
|
|
748
|
+
const NON_COERCION_COMMANDS: ReadonlySet<string> = new Set([
|
|
749
|
+
"inscribe",
|
|
750
|
+
"uninscribe",
|
|
751
|
+
"autoinscribe",
|
|
752
|
+
"sell",
|
|
753
|
+
"stash",
|
|
754
|
+
"buy",
|
|
755
|
+
"retrieve",
|
|
756
|
+
"retire",
|
|
757
|
+
"help",
|
|
758
|
+
"repeat",
|
|
759
|
+
]);
|
|
760
|
+
|
|
761
|
+
/** The result of pumping the player's command queue. */
|
|
762
|
+
export interface PlayerTurnResult {
|
|
763
|
+
/** The provider had no command ready: the loop should return for input. */
|
|
764
|
+
needsInput: boolean;
|
|
765
|
+
/** Energy spent this call (0 when a free command ran or input is needed). */
|
|
766
|
+
energyUsed: number;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/**
|
|
770
|
+
* process_player: drain queued commands until one spends energy, the queue
|
|
771
|
+
* empties (needsInput), or the player dies / a level change is requested.
|
|
772
|
+
* Applies the process_player_cleanup energy accounting for the spending
|
|
773
|
+
* command (player->energy -= energy_use; total_energy += energy_use).
|
|
774
|
+
*/
|
|
775
|
+
export function processPlayer(
|
|
776
|
+
state: GameState,
|
|
777
|
+
registry: ActionRegistry,
|
|
778
|
+
): PlayerTurnResult {
|
|
779
|
+
let energyUsed = 0;
|
|
780
|
+
do {
|
|
781
|
+
if (state.isDead || state.generateLevel) break;
|
|
782
|
+
|
|
783
|
+
/* game-world.c:941-947: after the refresh equivalent and before command
|
|
784
|
+
* preparation, recover an overfull/corrupt pack using calc_inventory's
|
|
785
|
+
* sorted inven[] view. */
|
|
786
|
+
state.overflowPack?.();
|
|
787
|
+
|
|
788
|
+
/* Paralyzed or Knocked Out player gets no turn (game-world.c:965-968):
|
|
789
|
+
* inject CMD_SLEEP so a full-energy no-op is spent and nextCommand is
|
|
790
|
+
* never consulted. Ordering matches C: after the detect-ore block (not
|
|
791
|
+
* yet in the port), before command prep / cmdq_pop. */
|
|
792
|
+
{
|
|
793
|
+
const p = state.actor.player;
|
|
794
|
+
const stunEff = state.world?.timedTable?.[TMD.STUN];
|
|
795
|
+
const knockedOut =
|
|
796
|
+
stunEff !== undefined &&
|
|
797
|
+
playerTimedGradeEq(p, stunEff, "Knocked Out");
|
|
798
|
+
if ((p.timed[TMD.PARALYZED] ?? 0) > 0 || knockedOut) {
|
|
799
|
+
if (!state.cmdQueue) state.cmdQueue = [];
|
|
800
|
+
state.cmdQueue.push({ code: "sleep" });
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/* Drain the internal queue (cmdq) first - self-continuing commands like
|
|
805
|
+
* running push their follow-up there - then ask the injected provider. */
|
|
806
|
+
const cmd =
|
|
807
|
+
state.cmdQueue && state.cmdQueue.length > 0
|
|
808
|
+
? state.cmdQueue.shift()!
|
|
809
|
+
: state.nextCommand();
|
|
810
|
+
if (!cmd) return { needsInput: true, energyUsed: 0 };
|
|
811
|
+
|
|
812
|
+
/* While TMD_COMMAND runs, the player's commands drive the commanded
|
|
813
|
+
* monster instead (cmd-core.c L333 swaps the command list). */
|
|
814
|
+
const commanding =
|
|
815
|
+
(state.actor.player.timed[TMD.COMMAND] ?? 0) > 0 && state.monCommand;
|
|
816
|
+
const action = commanding
|
|
817
|
+
? state.monCommand!
|
|
818
|
+
: (registry.get(cmd.code) ?? stubAction);
|
|
819
|
+
|
|
820
|
+
/* Occasional attack instead for bloodlust-affected characters
|
|
821
|
+
* (cmd-core.c:373): before an energy-capable command executes, the
|
|
822
|
+
* coercion roll is drawn (unconditionally, even at zero bloodlust,
|
|
823
|
+
* matching upstream's randint0(200) < timed[TMD_BLOODLUST]); on success
|
|
824
|
+
* the command is dropped and a random adjacent monster is attacked.
|
|
825
|
+
* skip_cmd_coercion is not modelled (save gap 12.6, WP-10). */
|
|
826
|
+
if (!commanding && !NON_COERCION_COMMANDS.has(cmd.code)) {
|
|
827
|
+
if (
|
|
828
|
+
state.rng.randint0(200) <
|
|
829
|
+
(state.actor.player.timed[TMD.BLOODLUST] ?? 0)
|
|
830
|
+
) {
|
|
831
|
+
const spent = playerAttackRandomMonster(state);
|
|
832
|
+
if (spent >= 0) {
|
|
833
|
+
if (spent > 0) {
|
|
834
|
+
state.actor.energy -= spent;
|
|
835
|
+
state.actor.totalEnergy += spent;
|
|
836
|
+
energyUsed = spent;
|
|
837
|
+
}
|
|
838
|
+
continue;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
const use = action(state, cmd);
|
|
844
|
+
if (use > 0) {
|
|
845
|
+
state.actor.energy -= use;
|
|
846
|
+
state.actor.totalEnergy += use;
|
|
847
|
+
energyUsed = use;
|
|
848
|
+
}
|
|
849
|
+
} while (energyUsed === 0 && !state.isDead && !state.generateLevel);
|
|
850
|
+
|
|
851
|
+
return { needsInput: false, energyUsed };
|
|
852
|
+
}
|