@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,1153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monster melee attacks against the player, ported from
|
|
3
|
+
* reference/src/mon-attack.c (make_attack_normal, monster_critical, check_hit,
|
|
4
|
+
* chance_of_monster_hit, adjust_dam_armor) and the RBE_ blow-effect handlers
|
|
5
|
+
* in reference/src/mon-blows.c (Angband 4.2.6).
|
|
6
|
+
*
|
|
7
|
+
* The blow loop, to-hit test, monster critical, per-blow damage roll and the
|
|
8
|
+
* cut/stun rolls are ported faithfully. Blow EFFECTS resolve one of two ways:
|
|
9
|
+
*
|
|
10
|
+
* - When a world-touching MonBlowEnv is injected (the live game), every
|
|
11
|
+
* melee_effect_handler_* runs its real consequences inline in the EXACT
|
|
12
|
+
* upstream RNG order: adjust_dam elemental resist rolls (env.elementalDam),
|
|
13
|
+
* inven_damage, player_apply_damage_reduction on the HP dealt, and all the
|
|
14
|
+
* status / stat / exp / theft / disenchant / earthquake / knockback effects.
|
|
15
|
+
* This is the analog of project-player's onSideEffects seam: combat/ stays
|
|
16
|
+
* worldless, and game/mon-side.ts (makeMonBlowEnv) supplies the environment.
|
|
17
|
+
* The unreduced context->damage drives the side-effect math and the cut/stun
|
|
18
|
+
* critical; only the HP actually subtracted goes through damage reduction.
|
|
19
|
+
*
|
|
20
|
+
* - When no env is injected (the worldless harness / unit tests), the effects
|
|
21
|
+
* that need the player timed / resist / inventory / stat systems are recorded
|
|
22
|
+
* as structured BlowSideEffect intents (the "stub log"), exactly as before.
|
|
23
|
+
*
|
|
24
|
+
* Additional per-blow rolls now ported inside the blow loop: the protection
|
|
25
|
+
* from evil repel (randint0(100) drawn when PROTEVIL is up vs an evil monster),
|
|
26
|
+
* the PARALYZE damage=1 pre-clamp, and the "player moved" early-out (a blow that
|
|
27
|
+
* relocates the player via earthquake / knockback skips the remaining blows).
|
|
28
|
+
*
|
|
29
|
+
* DEFERRED (ledgered in parity/ledger/combat-melee.yaml): monster lore /
|
|
30
|
+
* smart-learn, monster-vs-monster melee (monster_attack_monster), react_to_slay
|
|
31
|
+
* blocking a theft (the item is stolen regardless; no RNG impact), and attaching
|
|
32
|
+
* stolen gold/items to the monster's held-object pile (monster_carry, coordinated
|
|
33
|
+
* with the loot-drops gap; the item/gold is still removed from the player and no
|
|
34
|
+
* RNG is drawn by the attach).
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import type { Rng, RandomValue } from "../rng.js";
|
|
38
|
+
import type { Loc } from "../loc.js";
|
|
39
|
+
import { locEq } from "../loc.js";
|
|
40
|
+
import type { Monster } from "../mon/monster.js";
|
|
41
|
+
import type { BlowMethod } from "../mon/types.js";
|
|
42
|
+
import type { Player } from "../player/player.js";
|
|
43
|
+
import { ELEM, MON_TMD, PROJ, RF, STAT, TMD } from "../generated/index.js";
|
|
44
|
+
import { STUN_DAM_REDUCTION, STUN_HIT_REDUCTION, testHit } from "./hit.js";
|
|
45
|
+
|
|
46
|
+
/** A defender's combat AC contribution (upstream p->state.ac + p->state.to_a). */
|
|
47
|
+
export interface DefenderState {
|
|
48
|
+
/** state->ac. */
|
|
49
|
+
ac: number;
|
|
50
|
+
/** state->to_a. */
|
|
51
|
+
toA: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* A recorded blow side effect ("stub log"): the intent a fully-modelled
|
|
56
|
+
* player-timed / resist / inventory system would apply. `element` and status
|
|
57
|
+
* `amount` durations use the exact upstream formulas.
|
|
58
|
+
*/
|
|
59
|
+
export type BlowSideEffect =
|
|
60
|
+
| { kind: "timed"; effect: string; amount: number }
|
|
61
|
+
| { kind: "drainStat"; stat: string }
|
|
62
|
+
| { kind: "loseExp"; holdChance: number; amount: number }
|
|
63
|
+
| { kind: "drainCharges" }
|
|
64
|
+
| { kind: "eatGold" }
|
|
65
|
+
| { kind: "eatItem" }
|
|
66
|
+
| { kind: "eatFood" }
|
|
67
|
+
| { kind: "eatLight" }
|
|
68
|
+
| { kind: "disenchant" }
|
|
69
|
+
| { kind: "elemental"; element: string; damage: number }
|
|
70
|
+
| { kind: "earthquake"; radius: number }
|
|
71
|
+
| { kind: "knockback"; distance: number };
|
|
72
|
+
|
|
73
|
+
/** The outcome of a single monster blow. */
|
|
74
|
+
export interface MonBlow {
|
|
75
|
+
hit: boolean;
|
|
76
|
+
/** RBE_ effect name (e.g. "HURT", "POISON"). */
|
|
77
|
+
effect: string;
|
|
78
|
+
/** RBM_ method name (e.g. "HIT", "CLAW"). */
|
|
79
|
+
method: string;
|
|
80
|
+
/** HP damage actually dealt to the player. */
|
|
81
|
+
damage: number;
|
|
82
|
+
sideEffects: BlowSideEffect[];
|
|
83
|
+
obvious: boolean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** The outcome of a full monster attack (make_attack_normal). */
|
|
87
|
+
export interface MonMeleeAttack {
|
|
88
|
+
/** false only when RF_NEVER_BLOW blocked the attack entirely. */
|
|
89
|
+
attacked: boolean;
|
|
90
|
+
blows: MonBlow[];
|
|
91
|
+
totalDamage: number;
|
|
92
|
+
playerDied: boolean;
|
|
93
|
+
/** Aggregated side-effect intents across all blows. */
|
|
94
|
+
sideEffects: BlowSideEffect[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The world-touching environment a monster blow needs: the analog of
|
|
99
|
+
* project-player's onSideEffects hook. It keeps combat/ worldless - when
|
|
100
|
+
* absent, monMeleeAttack falls back to the stub-log intents. Implemented by
|
|
101
|
+
* game/mon-side.ts (makeMonBlowEnv), bound to the attacking monster.
|
|
102
|
+
*/
|
|
103
|
+
export interface MonBlowEnv {
|
|
104
|
+
/** p->grid, read to detect the "player moved" mid-loop break. */
|
|
105
|
+
playerGrid(): Loc;
|
|
106
|
+
/** player_apply_damage_reduction(p, dam): the HP actually taken. */
|
|
107
|
+
applyReduction(dam: number): number;
|
|
108
|
+
/** take_hit(p, reducedDam, ddesc): subtract HP, set is_dead. */
|
|
109
|
+
takeHit(reducedDam: number): void;
|
|
110
|
+
/** Flush pure-element smart-learn after the complete elemental sequence. */
|
|
111
|
+
finishElemental?: () => void;
|
|
112
|
+
/** p->is_dead after the last takeHit. */
|
|
113
|
+
readonly playerDied: boolean;
|
|
114
|
+
/** msg(): route a blow message to the game's sink. An optional msgt (the
|
|
115
|
+
* blow method's sound channel, e.g. MON_HIT) plays the typed sound. */
|
|
116
|
+
msg(text: string, msgt?: string): void;
|
|
117
|
+
/** monster_desc(mon, MDESC_STANDARD): "The kobold" / "Something", for the
|
|
118
|
+
* per-blow "m_name act." message (drawn once per attack, no RNG). */
|
|
119
|
+
readonly monName: string;
|
|
120
|
+
/** OPT(p, show_damage): append the " (N)" suffix to the blow message. */
|
|
121
|
+
readonly showDamage: boolean;
|
|
122
|
+
/** monster_is_visible(mon): gates the "%s misses you." message (a visible
|
|
123
|
+
* monster's missed blow is announced; an unseen one is silent). */
|
|
124
|
+
readonly monVisible: boolean;
|
|
125
|
+
/** adjust_dam(p, proj, dam, RANDOMISE): elemental damage after resists. */
|
|
126
|
+
elementalDam(proj: number, dam: number): number;
|
|
127
|
+
/** inven_damage(p, elem, cperc): pack casualties from an elemental hit. */
|
|
128
|
+
invenDamage(elem: number, cperc: number): void;
|
|
129
|
+
/** player_resists(p, elem): el_info[elem].res_level > 0. */
|
|
130
|
+
resists(elem: number): boolean;
|
|
131
|
+
/** player_inc_timed(p, tmd, amount, ..., check): returns whether noticed. */
|
|
132
|
+
incTimed(tmd: number, amount: number, check: boolean): boolean;
|
|
133
|
+
/** randint0(100) < p->state.skills[SKILL_SAVE] (the melee saving throw). */
|
|
134
|
+
saveVsSkill(): boolean;
|
|
135
|
+
/** effect_simple(EF_DRAIN_STAT): sustain check then player_stat_dec. */
|
|
136
|
+
drainStat(stat: number): void;
|
|
137
|
+
/** player_of_has(p, OF_HOLD_LIFE). */
|
|
138
|
+
hasHoldLife(): boolean;
|
|
139
|
+
/** melee_effect_experience's HOLD_LIFE gate and player_exp_lose. */
|
|
140
|
+
drainExp(chance: number, drainAmount: number): void;
|
|
141
|
+
/** DRAIN_CHARGES: drain a random charged wand/staff, healing the monster. */
|
|
142
|
+
drainCharges(rlev: number): void;
|
|
143
|
+
/** EAT_GOLD: save-or-steal the player's gold; returns context->blinked. */
|
|
144
|
+
eatGold(): boolean;
|
|
145
|
+
/** EAT_ITEM: save-or-steal a pack item; returns blinked / obvious. */
|
|
146
|
+
eatItem(): { blinked: boolean; obvious: boolean };
|
|
147
|
+
/** EAT_FOOD: eat a random edible pack item. */
|
|
148
|
+
eatFood(): void;
|
|
149
|
+
/** EAT_LIGHT: EF_DRAIN_LIGHT "250+1d250". */
|
|
150
|
+
eatLight(): void;
|
|
151
|
+
/** EF_DISENCHANT on the player's equipment. */
|
|
152
|
+
disenchant(): void;
|
|
153
|
+
/** EF_EARTHQUAKE centred on the monster, given radius. */
|
|
154
|
+
earthquake(radius: number): void;
|
|
155
|
+
/** thrust_away(monster grid, player grid, dist). */
|
|
156
|
+
thrust(dist: number): void;
|
|
157
|
+
/** Blink the monster away (EF_TELEPORT max_sight*2+5) after the blows. */
|
|
158
|
+
blinkAway(): void;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Options for a monster melee attack. */
|
|
162
|
+
export interface MonMeleeOptions {
|
|
163
|
+
/** monster_is_visible(mon); affects only messaging (DEFERRED). */
|
|
164
|
+
monVisible?: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* The world-touching blow environment (game/mon-side.ts), bound to the
|
|
167
|
+
* attacking monster. When present, blow effects apply for real in upstream
|
|
168
|
+
* RNG order; the `rng` argument MUST be the same stream this env draws from
|
|
169
|
+
* (state.rng), because the env's reused helpers (adjust_dam, inven_damage,
|
|
170
|
+
* ...) draw from it and interleave with this driver's own rolls.
|
|
171
|
+
*/
|
|
172
|
+
env?: MonBlowEnv;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* ------------------------------------------------------------------ *
|
|
176
|
+
* Shared math (mon-attack.c)
|
|
177
|
+
* ------------------------------------------------------------------ */
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* chance_of_monster_hit_base: a monster's to-hit from race level and the
|
|
181
|
+
* blow's power.
|
|
182
|
+
*/
|
|
183
|
+
export function chanceOfMonsterHitBase(level: number, effectPower: number): number {
|
|
184
|
+
return Math.max(level, 1) * 3 + effectPower;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* chance_of_monster_hit: the base value, reduced if the monster is stunned.
|
|
189
|
+
*/
|
|
190
|
+
export function chanceOfMonsterHit(
|
|
191
|
+
mon: Monster,
|
|
192
|
+
level: number,
|
|
193
|
+
effectPower: number,
|
|
194
|
+
): number {
|
|
195
|
+
let toHit = chanceOfMonsterHitBase(level, effectPower);
|
|
196
|
+
if ((mon.mTimed[MON_TMD.STUN] ?? 0) > 0) {
|
|
197
|
+
toHit = Math.trunc((toHit * (100 - STUN_HIT_REDUCTION)) / 100);
|
|
198
|
+
}
|
|
199
|
+
return toHit;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* check_hit: does an attack with the given to-hit land on the player? Uses the
|
|
204
|
+
* player's total AC (state.ac + state.to_a).
|
|
205
|
+
*/
|
|
206
|
+
export function checkHit(rng: Rng, toHit: number, def: DefenderState): boolean {
|
|
207
|
+
return testHit(rng, toHit, def.ac + def.toA);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* adjust_dam_armor: physical damage remaining after armor (mon-attack.c).
|
|
212
|
+
*/
|
|
213
|
+
export function adjustDamArmor(damage: number, ac: number): number {
|
|
214
|
+
return damage - Math.trunc((damage * (ac < 240 ? ac : 240)) / 400);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* monster_critical: the "cut/stun" critical tier of a monster blow. All hits
|
|
219
|
+
* doing >= 95% of the maximum possible (and >= 20, or sometimes N) qualify.
|
|
220
|
+
* Returns a tier 0..(6+extra) used to index the cut/stun amount tables.
|
|
221
|
+
*/
|
|
222
|
+
export function monsterCritical(
|
|
223
|
+
rng: Rng,
|
|
224
|
+
dice: RandomValue,
|
|
225
|
+
rlev: number,
|
|
226
|
+
dam: number,
|
|
227
|
+
): number {
|
|
228
|
+
let max = 0;
|
|
229
|
+
const total = rng.randcalc(dice, rlev, "maximise");
|
|
230
|
+
|
|
231
|
+
/* Must do at least 95% of perfect */
|
|
232
|
+
if (dam < Math.trunc((total * 19) / 20)) return 0;
|
|
233
|
+
|
|
234
|
+
/* Weak blows rarely work */
|
|
235
|
+
if (dam < 20 && rng.randint0(100) >= dam) return 0;
|
|
236
|
+
|
|
237
|
+
/* Perfect damage */
|
|
238
|
+
if (dam === total) max++;
|
|
239
|
+
|
|
240
|
+
/* Super-charge */
|
|
241
|
+
if (dam >= 20) {
|
|
242
|
+
while (rng.randint0(100) < 2) max++;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* Critical damage */
|
|
246
|
+
if (dam > 45) return 6 + max;
|
|
247
|
+
if (dam > 33) return 5 + max;
|
|
248
|
+
if (dam > 25) return 4 + max;
|
|
249
|
+
if (dam > 18) return 3 + max;
|
|
250
|
+
if (dam > 11) return 2 + max;
|
|
251
|
+
return 1 + max;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Cut amount for a monster_critical tier (make_attack_normal cut switch). */
|
|
255
|
+
function cutAmount(rng: Rng, tier: number): number {
|
|
256
|
+
switch (tier) {
|
|
257
|
+
case 0:
|
|
258
|
+
return 0;
|
|
259
|
+
case 1:
|
|
260
|
+
return rng.randint1(5);
|
|
261
|
+
case 2:
|
|
262
|
+
return rng.randint1(5) + 5;
|
|
263
|
+
case 3:
|
|
264
|
+
return rng.randint1(20) + 20;
|
|
265
|
+
case 4:
|
|
266
|
+
return rng.randint1(50) + 50;
|
|
267
|
+
case 5:
|
|
268
|
+
return rng.randint1(100) + 100;
|
|
269
|
+
case 6:
|
|
270
|
+
return 300;
|
|
271
|
+
default:
|
|
272
|
+
return 500;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Stun amount for a monster_critical tier (make_attack_normal stun switch). */
|
|
277
|
+
function stunAmount(rng: Rng, tier: number): number {
|
|
278
|
+
switch (tier) {
|
|
279
|
+
case 0:
|
|
280
|
+
return 0;
|
|
281
|
+
case 1:
|
|
282
|
+
return rng.randint1(5);
|
|
283
|
+
case 2:
|
|
284
|
+
return rng.randint1(10) + 10;
|
|
285
|
+
case 3:
|
|
286
|
+
return rng.randint1(20) + 20;
|
|
287
|
+
case 4:
|
|
288
|
+
return rng.randint1(30) + 30;
|
|
289
|
+
case 5:
|
|
290
|
+
return rng.randint1(40) + 40;
|
|
291
|
+
case 6:
|
|
292
|
+
return 100;
|
|
293
|
+
default:
|
|
294
|
+
return 200;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* ------------------------------------------------------------------ *
|
|
299
|
+
* Blow-effect resolution (mon-blows.c handlers)
|
|
300
|
+
* ------------------------------------------------------------------ */
|
|
301
|
+
|
|
302
|
+
interface BlowEffectContext {
|
|
303
|
+
rng: Rng;
|
|
304
|
+
/** damage = randcalc(dice, rlev, RANDOMISE), after stun reduction. */
|
|
305
|
+
baseDamage: number;
|
|
306
|
+
ac: number;
|
|
307
|
+
rlev: number;
|
|
308
|
+
/** method->phys: whether the blow has a physical component. */
|
|
309
|
+
phys: boolean;
|
|
310
|
+
/** The blow method, for display_blow_message_vs_player's action + msgt. */
|
|
311
|
+
method: BlowMethod;
|
|
312
|
+
/** In the worldless path HP is applied after the handler returns. */
|
|
313
|
+
willPlayerDie?: (damage: number) => boolean;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
interface BlowEffectResult {
|
|
317
|
+
/** context->damage after the handler (HP dealt, and used by cut/stun crit). */
|
|
318
|
+
hpDamage: number;
|
|
319
|
+
obvious: boolean;
|
|
320
|
+
sideEffects: BlowSideEffect[];
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const ELEMENT_OF_EFFECT: Readonly<Record<string, string>> = {
|
|
324
|
+
ACID: "ACID",
|
|
325
|
+
ELEC: "ELEC",
|
|
326
|
+
FIRE: "FIRE",
|
|
327
|
+
COLD: "COLD",
|
|
328
|
+
POISON: "POIS",
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
const STAT_OF_EFFECT: Readonly<Record<string, string>> = {
|
|
332
|
+
LOSE_STR: "STR",
|
|
333
|
+
LOSE_INT: "INT",
|
|
334
|
+
LOSE_WIS: "WIS",
|
|
335
|
+
LOSE_DEX: "DEX",
|
|
336
|
+
LOSE_CON: "CON",
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
/** Experience-drain effects: OF_HOLD_LIFE resist chance and base drain dice. */
|
|
340
|
+
const EXP_DRAIN: Readonly<Record<string, { holdChance: number; dice: number }>> = {
|
|
341
|
+
EXP_10: { holdChance: 95, dice: 10 },
|
|
342
|
+
EXP_20: { holdChance: 90, dice: 20 },
|
|
343
|
+
EXP_40: { holdChance: 75, dice: 40 },
|
|
344
|
+
EXP_80: { holdChance: 50, dice: 80 },
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* monster_blow_method_action (mon-blows.c L74): pick one of the blow method's
|
|
349
|
+
* action messages via randint0(num_messages) and substitute the player-target
|
|
350
|
+
* tags. Returns null when the method carries no messages (act == NULL upstream,
|
|
351
|
+
* which yields the "You take N damage." fallback).
|
|
352
|
+
*
|
|
353
|
+
* The randint0(num_messages) draw is ALWAYS performed so the RNG stream matches
|
|
354
|
+
* upstream whether or not the message is shown. randint0 (Rand_div) short-
|
|
355
|
+
* circuits for num_messages <= 1, so only the multi-message methods (INSULT and
|
|
356
|
+
* MOAN, 8 each) consume any RNG here; every other blow is byte-identical.
|
|
357
|
+
*
|
|
358
|
+
* For a blow against the player (upstream midx < 0) the tags resolve to the
|
|
359
|
+
* fixed second-person words, not a monster_desc: {target}->you, {oftarget}->
|
|
360
|
+
* your, {has}->have (mon-blows.c L116-152).
|
|
361
|
+
*/
|
|
362
|
+
function monsterBlowMethodAction(method: BlowMethod, rng: Rng): string | null {
|
|
363
|
+
const n = method.messages.length;
|
|
364
|
+
if (n === 0) return null;
|
|
365
|
+
const choice = rng.randint0(n);
|
|
366
|
+
const raw = method.messages[choice] ?? method.messages[0]!;
|
|
367
|
+
return raw
|
|
368
|
+
.replace(/\{target\}/g, "you")
|
|
369
|
+
.replace(/\{oftarget\}/g, "your")
|
|
370
|
+
.replace(/\{has\}/g, "have");
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* display_blow_message_vs_player (mon-blows.c L194): show "m_name act." for a
|
|
375
|
+
* blow that lands on the player, with the " (N)" damage suffix when show_damage
|
|
376
|
+
* is on and the blow dealt HP. When `sink` is null (the worldless recording
|
|
377
|
+
* path) the message is drawn but not emitted, so both paths consume RNG
|
|
378
|
+
* identically. The fullstop is dropped when the action ends in "'" or "!".
|
|
379
|
+
*/
|
|
380
|
+
function displayBlowMessageVsPlayer(
|
|
381
|
+
rng: Rng,
|
|
382
|
+
method: BlowMethod,
|
|
383
|
+
reduced: number,
|
|
384
|
+
monName: string,
|
|
385
|
+
showDamage: boolean,
|
|
386
|
+
sink: ((text: string, msgt: string) => void) | null,
|
|
387
|
+
): void {
|
|
388
|
+
const act = monsterBlowMethodAction(method, rng);
|
|
389
|
+
if (!sink) return;
|
|
390
|
+
/* msgt(method->msgt, ...) (mon-blows.c L206-213): the blow line plays the
|
|
391
|
+
* method's sound channel (blow_methods.txt msg:, e.g. MON_HIT). */
|
|
392
|
+
if (act !== null) {
|
|
393
|
+
const fullstop = act.endsWith("'") || act.endsWith("!") ? "" : ".";
|
|
394
|
+
const tail = reduced > 0 && showDamage ? ` (${reduced})` : "";
|
|
395
|
+
sink(`${monName} ${act}${fullstop}${tail}`, method.msgt);
|
|
396
|
+
} else if (reduced > 0 && showDamage) {
|
|
397
|
+
sink(`You take ${reduced} damage.`, method.msgt);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Live-path blow message: emit "The kobold hits you." through the env sink
|
|
403
|
+
* immediately before take_hit (display_blow_message_vs_player, called from every
|
|
404
|
+
* damage-dealing melee_effect_handler in mon-blows.c).
|
|
405
|
+
*/
|
|
406
|
+
function emitBlowMessageLive(
|
|
407
|
+
env: MonBlowEnv,
|
|
408
|
+
ctx: BlowEffectContext,
|
|
409
|
+
reduced: number,
|
|
410
|
+
): void {
|
|
411
|
+
displayBlowMessageVsPlayer(
|
|
412
|
+
ctx.rng,
|
|
413
|
+
ctx.method,
|
|
414
|
+
reduced,
|
|
415
|
+
env.monName,
|
|
416
|
+
env.showDamage,
|
|
417
|
+
(text: string, msgt: string): void => env.msg(text, msgt),
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Recording-path blow message: perform the randint0(num_messages) draw without
|
|
423
|
+
* emitting (the worldless intent-recording path has no sink or monster name).
|
|
424
|
+
* Keeps the two paths in RNG lock-step; for every multi-message method in the
|
|
425
|
+
* vanilla data (INSULT / MOAN) the draw is the effect's first RNG event, so its
|
|
426
|
+
* position matches upstream.
|
|
427
|
+
*/
|
|
428
|
+
function drawBlowMessage(ctx: BlowEffectContext): void {
|
|
429
|
+
displayBlowMessageVsPlayer(ctx.rng, ctx.method, 0, "", false, null);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Resolve one RBE_ blow effect: compute the HP damage the effect deals to the
|
|
434
|
+
* player (context->damage after the handler runs) and record any timed /
|
|
435
|
+
* stat / inventory / elemental side-effect intents.
|
|
436
|
+
*/
|
|
437
|
+
function resolveBlowEffect(
|
|
438
|
+
name: string,
|
|
439
|
+
ctx: BlowEffectContext,
|
|
440
|
+
): BlowEffectResult {
|
|
441
|
+
const { rng, baseDamage, ac, rlev, phys } = ctx;
|
|
442
|
+
const side: BlowSideEffect[] = [];
|
|
443
|
+
|
|
444
|
+
/* display_blow_message_vs_player draws randint0(num_messages) before take_hit
|
|
445
|
+
* in every handler; hoisted here for the worldless path (no-op for the single-
|
|
446
|
+
* message methods, first RNG event for the INSULT / MOAN effects). */
|
|
447
|
+
drawBlowMessage(ctx);
|
|
448
|
+
|
|
449
|
+
/* Elemental blows: physical component to HP; elemental component deferred. */
|
|
450
|
+
if (name === "ACID" || name === "ELEC" || name === "FIRE" || name === "COLD") {
|
|
451
|
+
const physical = phys ? adjustDamArmor(baseDamage, ac + 50) : 0;
|
|
452
|
+
side.push({
|
|
453
|
+
kind: "elemental",
|
|
454
|
+
element: ELEMENT_OF_EFFECT[name] as string,
|
|
455
|
+
damage: baseDamage,
|
|
456
|
+
});
|
|
457
|
+
return { hpDamage: physical, obvious: true, sideEffects: side };
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
switch (name) {
|
|
461
|
+
case "NONE":
|
|
462
|
+
return { hpDamage: 0, obvious: true, sideEffects: side };
|
|
463
|
+
|
|
464
|
+
case "HURT":
|
|
465
|
+
return {
|
|
466
|
+
hpDamage: adjustDamArmor(baseDamage, ac),
|
|
467
|
+
obvious: true,
|
|
468
|
+
sideEffects: side,
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
case "POISON": {
|
|
472
|
+
const physical = phys ? adjustDamArmor(baseDamage, ac + 50) : 0;
|
|
473
|
+
side.push({ kind: "elemental", element: "POIS", damage: baseDamage });
|
|
474
|
+
side.push({
|
|
475
|
+
kind: "timed",
|
|
476
|
+
effect: "POISONED",
|
|
477
|
+
amount: 5 + rng.randint1(rlev),
|
|
478
|
+
});
|
|
479
|
+
return { hpDamage: physical, obvious: true, sideEffects: side };
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
case "DISENCHANT":
|
|
483
|
+
side.push({ kind: "disenchant" });
|
|
484
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
485
|
+
|
|
486
|
+
case "DRAIN_CHARGES":
|
|
487
|
+
side.push({ kind: "drainCharges" });
|
|
488
|
+
return { hpDamage: baseDamage, obvious: false, sideEffects: side };
|
|
489
|
+
|
|
490
|
+
case "EAT_GOLD":
|
|
491
|
+
side.push({ kind: "eatGold" });
|
|
492
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
493
|
+
|
|
494
|
+
case "EAT_ITEM":
|
|
495
|
+
side.push({ kind: "eatItem" });
|
|
496
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
497
|
+
|
|
498
|
+
case "EAT_FOOD":
|
|
499
|
+
side.push({ kind: "eatFood" });
|
|
500
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
501
|
+
|
|
502
|
+
case "EAT_LIGHT":
|
|
503
|
+
side.push({ kind: "eatLight" });
|
|
504
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
505
|
+
|
|
506
|
+
case "BLIND":
|
|
507
|
+
side.push({
|
|
508
|
+
kind: "timed",
|
|
509
|
+
effect: "BLIND",
|
|
510
|
+
amount: 10 + rng.randint1(rlev),
|
|
511
|
+
});
|
|
512
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
513
|
+
|
|
514
|
+
case "CONFUSE":
|
|
515
|
+
side.push({
|
|
516
|
+
kind: "timed",
|
|
517
|
+
effect: "CONFUSED",
|
|
518
|
+
amount: 3 + rng.randint1(rlev),
|
|
519
|
+
});
|
|
520
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
521
|
+
|
|
522
|
+
case "TERRIFY":
|
|
523
|
+
side.push({
|
|
524
|
+
kind: "timed",
|
|
525
|
+
effect: "AFRAID",
|
|
526
|
+
amount: 3 + rng.randint1(rlev),
|
|
527
|
+
});
|
|
528
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
529
|
+
|
|
530
|
+
case "PARALYZE":
|
|
531
|
+
side.push({
|
|
532
|
+
kind: "timed",
|
|
533
|
+
effect: "PARALYZED",
|
|
534
|
+
amount: 3 + rng.randint1(rlev),
|
|
535
|
+
});
|
|
536
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
537
|
+
|
|
538
|
+
case "LOSE_STR":
|
|
539
|
+
case "LOSE_INT":
|
|
540
|
+
case "LOSE_WIS":
|
|
541
|
+
case "LOSE_DEX":
|
|
542
|
+
case "LOSE_CON":
|
|
543
|
+
side.push({ kind: "drainStat", stat: STAT_OF_EFFECT[name] as string });
|
|
544
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
545
|
+
|
|
546
|
+
case "LOSE_ALL":
|
|
547
|
+
for (const stat of ["STR", "DEX", "CON", "INT", "WIS"]) {
|
|
548
|
+
side.push({ kind: "drainStat", stat });
|
|
549
|
+
}
|
|
550
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
551
|
+
|
|
552
|
+
case "SHATTER": {
|
|
553
|
+
const hp = adjustDamArmor(baseDamage, ac);
|
|
554
|
+
/* monster_damage_target() returns immediately on death (mon-blows.c
|
|
555
|
+
* L1095), before either SHATTER side-effect gate or its RNG draw. */
|
|
556
|
+
if (ctx.willPlayerDie?.(hp)) {
|
|
557
|
+
return { hpDamage: hp, obvious: true, sideEffects: side };
|
|
558
|
+
}
|
|
559
|
+
if (hp > 23) {
|
|
560
|
+
side.push({ kind: "earthquake", radius: Math.trunc(hp / 12) });
|
|
561
|
+
}
|
|
562
|
+
if (hp > 100) {
|
|
563
|
+
const value = hp - 100;
|
|
564
|
+
if (rng.randint1(value) > 40) {
|
|
565
|
+
side.push({ kind: "knockback", distance: 1 + Math.trunc(value / 40) });
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
return { hpDamage: hp, obvious: true, sideEffects: side };
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
case "EXP_10":
|
|
572
|
+
case "EXP_20":
|
|
573
|
+
case "EXP_40":
|
|
574
|
+
case "EXP_80": {
|
|
575
|
+
const spec = EXP_DRAIN[name] as { holdChance: number; dice: number };
|
|
576
|
+
/* damroll(N, 6) is evaluated as the handler's argument. */
|
|
577
|
+
const amount = rng.damroll(spec.dice, 6);
|
|
578
|
+
side.push({ kind: "loseExp", holdChance: spec.holdChance, amount });
|
|
579
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
case "HALLU":
|
|
583
|
+
side.push({
|
|
584
|
+
kind: "timed",
|
|
585
|
+
effect: "IMAGE",
|
|
586
|
+
amount: 3 + rng.randint1(Math.trunc(rlev / 2)),
|
|
587
|
+
});
|
|
588
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
589
|
+
|
|
590
|
+
case "BLACK_BREATH":
|
|
591
|
+
if (rng.oneIn(5)) {
|
|
592
|
+
side.push({
|
|
593
|
+
kind: "timed",
|
|
594
|
+
effect: "BLACKBREATH",
|
|
595
|
+
amount: Math.trunc(baseDamage / 10),
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
599
|
+
|
|
600
|
+
default:
|
|
601
|
+
/* Unknown effect: deal the base damage, as the fallthrough would. */
|
|
602
|
+
return { hpDamage: baseDamage, obvious: true, sideEffects: side };
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* melee_handler_for_blow_effect (mon-blows.c:1191): upstream's name -> handler
|
|
608
|
+
* table, as a list. The two switch statements in this file (resolveBlowEffect
|
|
609
|
+
* for the recording path, resolveBlowEffectLive for the live path) are the
|
|
610
|
+
* handlers themselves; this list is the table's key set, so a test can prove the
|
|
611
|
+
* mapping total against the pack in both directions.
|
|
612
|
+
*
|
|
613
|
+
* Upstream's table has exactly these 30 entries (mon-blows.c:1197-1226) and
|
|
614
|
+
* blow_effects.txt defines exactly the same 30 names, so a NULL handler (which
|
|
615
|
+
* upstream reports as "ERROR: Effect handler not found", mon-attack.c:650/841)
|
|
616
|
+
* is unreachable with vanilla data.
|
|
617
|
+
*/
|
|
618
|
+
export const RESOLVED_BLOW_EFFECTS: readonly string[] = [
|
|
619
|
+
"NONE",
|
|
620
|
+
"HURT",
|
|
621
|
+
"POISON",
|
|
622
|
+
"DISENCHANT",
|
|
623
|
+
"DRAIN_CHARGES",
|
|
624
|
+
"EAT_GOLD",
|
|
625
|
+
"EAT_ITEM",
|
|
626
|
+
"EAT_FOOD",
|
|
627
|
+
"EAT_LIGHT",
|
|
628
|
+
"ACID",
|
|
629
|
+
"ELEC",
|
|
630
|
+
"FIRE",
|
|
631
|
+
"COLD",
|
|
632
|
+
"BLIND",
|
|
633
|
+
"CONFUSE",
|
|
634
|
+
"TERRIFY",
|
|
635
|
+
"PARALYZE",
|
|
636
|
+
"LOSE_STR",
|
|
637
|
+
"LOSE_INT",
|
|
638
|
+
"LOSE_WIS",
|
|
639
|
+
"LOSE_DEX",
|
|
640
|
+
"LOSE_CON",
|
|
641
|
+
"LOSE_ALL",
|
|
642
|
+
"SHATTER",
|
|
643
|
+
"EXP_10",
|
|
644
|
+
"EXP_20",
|
|
645
|
+
"EXP_40",
|
|
646
|
+
"EXP_80",
|
|
647
|
+
"HALLU",
|
|
648
|
+
"BLACK_BREATH",
|
|
649
|
+
];
|
|
650
|
+
|
|
651
|
+
/* ------------------------------------------------------------------ *
|
|
652
|
+
* Live blow-effect resolution (mon-blows.c handlers with a MonBlowEnv)
|
|
653
|
+
* ------------------------------------------------------------------ */
|
|
654
|
+
|
|
655
|
+
/** effect name -> { proj: PROJ_ value, elem: ELEM_ value } for elementals. */
|
|
656
|
+
const ELEMENTAL_OF_EFFECT: Readonly<
|
|
657
|
+
Record<string, { proj: number; elem: number }>
|
|
658
|
+
> = {
|
|
659
|
+
ACID: { proj: PROJ.ACID, elem: ELEM.ACID },
|
|
660
|
+
ELEC: { proj: PROJ.ELEC, elem: ELEM.ELEC },
|
|
661
|
+
FIRE: { proj: PROJ.FIRE, elem: ELEM.FIRE },
|
|
662
|
+
COLD: { proj: PROJ.COLD, elem: ELEM.COLD },
|
|
663
|
+
POISON: { proj: PROJ.POIS, elem: ELEM.POIS },
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
/** The "You are covered in acid!" flavour lines (melee_effect_elemental). */
|
|
667
|
+
const ELEMENTAL_MESSAGE: Readonly<Record<string, string>> = {
|
|
668
|
+
ACID: "You are covered in acid!",
|
|
669
|
+
ELEC: "You are struck by electricity!",
|
|
670
|
+
FIRE: "You are enveloped in flames!",
|
|
671
|
+
COLD: "You are covered with frost!",
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
const STAT_OF_LIVE_EFFECT: Readonly<Record<string, number>> = {
|
|
675
|
+
LOSE_STR: STAT.STR,
|
|
676
|
+
LOSE_INT: STAT.INT,
|
|
677
|
+
LOSE_WIS: STAT.WIS,
|
|
678
|
+
LOSE_DEX: STAT.DEX,
|
|
679
|
+
LOSE_CON: STAT.CON,
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
/** The outcome of a live blow effect (context->damage, HP taken, blinked). */
|
|
683
|
+
interface LiveBlowResult {
|
|
684
|
+
/** context->damage after the handler (unreduced; feeds the cut/stun crit). */
|
|
685
|
+
contextDamage: number;
|
|
686
|
+
/** The HP actually subtracted (post player_apply_damage_reduction). */
|
|
687
|
+
reducedDamage: number;
|
|
688
|
+
obvious: boolean;
|
|
689
|
+
/** context->blinked (EAT_GOLD / EAT_ITEM theft). */
|
|
690
|
+
blinked: boolean;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* melee_effect_elemental (mon-blows.c L417): physical vs elemental, the larger
|
|
695
|
+
* to HP, inven_damage on the elemental component. RNG order: [adjust_dam
|
|
696
|
+
* denominator] then [inven_damage per-item saves].
|
|
697
|
+
*/
|
|
698
|
+
function applyElemental(
|
|
699
|
+
env: MonBlowEnv,
|
|
700
|
+
name: string,
|
|
701
|
+
ctx: BlowEffectContext,
|
|
702
|
+
pure: boolean,
|
|
703
|
+
): { contextDamage: number; reducedDamage: number } {
|
|
704
|
+
if (pure) {
|
|
705
|
+
const line = ELEMENTAL_MESSAGE[name];
|
|
706
|
+
if (line) env.msg(line);
|
|
707
|
+
}
|
|
708
|
+
const map = ELEMENTAL_OF_EFFECT[name]!;
|
|
709
|
+
const physical = ctx.phys ? adjustDamArmor(ctx.baseDamage, ctx.ac + 50) : 0;
|
|
710
|
+
const elementalDam = env.elementalDam(map.proj, ctx.baseDamage);
|
|
711
|
+
const contextDamage = physical > elementalDam ? physical : elementalDam;
|
|
712
|
+
if (elementalDam > 0) {
|
|
713
|
+
env.invenDamage(map.elem, Math.min(elementalDam * 5, 300));
|
|
714
|
+
}
|
|
715
|
+
let reducedDamage = 0;
|
|
716
|
+
if (contextDamage > 0) {
|
|
717
|
+
reducedDamage = env.applyReduction(contextDamage);
|
|
718
|
+
emitBlowMessageLive(env, ctx, reducedDamage);
|
|
719
|
+
env.takeHit(reducedDamage);
|
|
720
|
+
}
|
|
721
|
+
env.finishElemental?.();
|
|
722
|
+
return { contextDamage, reducedDamage };
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/**
|
|
726
|
+
* Resolve one RBE_ blow effect for real, running each mon-blows.c handler in
|
|
727
|
+
* the exact upstream RNG order and applying HP through the env. Returns the
|
|
728
|
+
* (unreduced) context->damage for the cut/stun critical, the reduced HP dealt,
|
|
729
|
+
* and context->blinked. The PARALYZE damage=1 pre-clamp is applied by the
|
|
730
|
+
* caller before this runs (mon-blows.c L1020).
|
|
731
|
+
*/
|
|
732
|
+
function resolveBlowEffectLive(
|
|
733
|
+
name: string,
|
|
734
|
+
ctx: BlowEffectContext,
|
|
735
|
+
env: MonBlowEnv,
|
|
736
|
+
): LiveBlowResult {
|
|
737
|
+
const { rng, baseDamage, ac, rlev } = ctx;
|
|
738
|
+
const done = (
|
|
739
|
+
contextDamage: number,
|
|
740
|
+
reducedDamage: number,
|
|
741
|
+
blinked = false,
|
|
742
|
+
): LiveBlowResult => ({ contextDamage, reducedDamage, obvious: true, blinked });
|
|
743
|
+
|
|
744
|
+
/* Elemental blows (pure). */
|
|
745
|
+
if (name === "ACID" || name === "ELEC" || name === "FIRE" || name === "COLD") {
|
|
746
|
+
const r = applyElemental(env, name, ctx, true);
|
|
747
|
+
return done(r.contextDamage, r.reducedDamage);
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
switch (name) {
|
|
751
|
+
case "NONE":
|
|
752
|
+
/* melee_effect_handler_NONE (mon-blows.c L638): show the message (with
|
|
753
|
+
* its randint0(num_messages) draw) for a no-damage hit; no take_hit. */
|
|
754
|
+
emitBlowMessageLive(env, ctx, 0);
|
|
755
|
+
return done(0, 0);
|
|
756
|
+
|
|
757
|
+
case "HURT": {
|
|
758
|
+
const cd = adjustDamArmor(baseDamage, ac);
|
|
759
|
+
const reduced = env.applyReduction(cd);
|
|
760
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
761
|
+
env.takeHit(reduced);
|
|
762
|
+
return done(cd, reduced);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
case "POISON": {
|
|
766
|
+
const r = applyElemental(env, name, ctx, false);
|
|
767
|
+
if (!env.playerDied) {
|
|
768
|
+
/* player_inc_timed(TMD_POISONED, 5 + randint1(rlev)). */
|
|
769
|
+
env.incTimed(TMD.POISONED, 5 + rng.randint1(rlev), true);
|
|
770
|
+
}
|
|
771
|
+
return done(r.contextDamage, r.reducedDamage);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
case "DISENCHANT": {
|
|
775
|
+
const reduced = env.applyReduction(baseDamage);
|
|
776
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
777
|
+
env.takeHit(reduced);
|
|
778
|
+
if (!env.playerDied && !env.resists(ELEM.DISEN)) env.disenchant();
|
|
779
|
+
return done(baseDamage, reduced);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
case "DRAIN_CHARGES": {
|
|
783
|
+
const reduced = env.applyReduction(baseDamage);
|
|
784
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
785
|
+
env.takeHit(reduced);
|
|
786
|
+
if (!env.playerDied) env.drainCharges(rlev);
|
|
787
|
+
return done(baseDamage, reduced);
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
case "EAT_GOLD": {
|
|
791
|
+
const reduced = env.applyReduction(baseDamage);
|
|
792
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
793
|
+
env.takeHit(reduced);
|
|
794
|
+
if (env.playerDied) return done(baseDamage, reduced);
|
|
795
|
+
const blinked = env.eatGold();
|
|
796
|
+
return done(baseDamage, reduced, blinked);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
case "EAT_ITEM": {
|
|
800
|
+
/* monster_damage_target(context, false): returns only on death. */
|
|
801
|
+
const reduced = env.applyReduction(baseDamage);
|
|
802
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
803
|
+
env.takeHit(reduced);
|
|
804
|
+
if (env.playerDied) return done(baseDamage, reduced);
|
|
805
|
+
const r = env.eatItem();
|
|
806
|
+
return done(baseDamage, reduced, r.blinked);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
case "EAT_FOOD": {
|
|
810
|
+
const reduced = env.applyReduction(baseDamage);
|
|
811
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
812
|
+
env.takeHit(reduced);
|
|
813
|
+
if (!env.playerDied) env.eatFood();
|
|
814
|
+
return done(baseDamage, reduced);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
case "EAT_LIGHT": {
|
|
818
|
+
const reduced = env.applyReduction(baseDamage);
|
|
819
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
820
|
+
env.takeHit(reduced);
|
|
821
|
+
if (!env.playerDied) env.eatLight();
|
|
822
|
+
return done(baseDamage, reduced);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
case "BLIND": {
|
|
826
|
+
/* melee_effect_timed: duration arg drawn first, then damage, no save. */
|
|
827
|
+
const amount = 10 + rng.randint1(rlev);
|
|
828
|
+
const reduced = env.applyReduction(baseDamage);
|
|
829
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
830
|
+
env.takeHit(reduced);
|
|
831
|
+
if (!env.playerDied) env.incTimed(TMD.BLIND, amount, true);
|
|
832
|
+
return done(baseDamage, reduced);
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
case "CONFUSE": {
|
|
836
|
+
const amount = 3 + rng.randint1(rlev);
|
|
837
|
+
const reduced = env.applyReduction(baseDamage);
|
|
838
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
839
|
+
env.takeHit(reduced);
|
|
840
|
+
if (!env.playerDied) env.incTimed(TMD.CONFUSED, amount, true);
|
|
841
|
+
return done(baseDamage, reduced);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
case "TERRIFY": {
|
|
845
|
+
const amount = 3 + rng.randint1(rlev);
|
|
846
|
+
const reduced = env.applyReduction(baseDamage);
|
|
847
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
848
|
+
env.takeHit(reduced);
|
|
849
|
+
if (!env.playerDied) {
|
|
850
|
+
if (env.saveVsSkill()) env.msg("You stand your ground!");
|
|
851
|
+
else env.incTimed(TMD.AFRAID, amount, true);
|
|
852
|
+
}
|
|
853
|
+
return done(baseDamage, reduced);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
case "PARALYZE": {
|
|
857
|
+
const amount = 3 + rng.randint1(rlev);
|
|
858
|
+
const reduced = env.applyReduction(baseDamage);
|
|
859
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
860
|
+
env.takeHit(reduced);
|
|
861
|
+
if (!env.playerDied) {
|
|
862
|
+
if (env.saveVsSkill()) env.msg("You resist the effects!");
|
|
863
|
+
else env.incTimed(TMD.PARALYZED, amount, true);
|
|
864
|
+
}
|
|
865
|
+
return done(baseDamage, reduced);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
case "LOSE_STR":
|
|
869
|
+
case "LOSE_INT":
|
|
870
|
+
case "LOSE_WIS":
|
|
871
|
+
case "LOSE_DEX":
|
|
872
|
+
case "LOSE_CON": {
|
|
873
|
+
const reduced = env.applyReduction(baseDamage);
|
|
874
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
875
|
+
env.takeHit(reduced);
|
|
876
|
+
if (!env.playerDied) env.drainStat(STAT_OF_LIVE_EFFECT[name]!);
|
|
877
|
+
return done(baseDamage, reduced);
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
case "LOSE_ALL": {
|
|
881
|
+
const reduced = env.applyReduction(baseDamage);
|
|
882
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
883
|
+
env.takeHit(reduced);
|
|
884
|
+
if (!env.playerDied) {
|
|
885
|
+
env.drainStat(STAT.STR);
|
|
886
|
+
env.drainStat(STAT.DEX);
|
|
887
|
+
env.drainStat(STAT.CON);
|
|
888
|
+
env.drainStat(STAT.INT);
|
|
889
|
+
env.drainStat(STAT.WIS);
|
|
890
|
+
}
|
|
891
|
+
return done(baseDamage, reduced);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
case "SHATTER": {
|
|
895
|
+
const cd = adjustDamArmor(baseDamage, ac);
|
|
896
|
+
const reduced = env.applyReduction(cd);
|
|
897
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
898
|
+
env.takeHit(reduced);
|
|
899
|
+
if (env.playerDied) return done(cd, reduced);
|
|
900
|
+
if (cd > 23) env.earthquake(Math.trunc(cd / 12));
|
|
901
|
+
if (cd > 100) {
|
|
902
|
+
const value = cd - 100;
|
|
903
|
+
if (rng.randint1(value) > 40) env.thrust(1 + Math.trunc(value / 40));
|
|
904
|
+
}
|
|
905
|
+
return done(cd, reduced);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
case "EXP_10":
|
|
909
|
+
case "EXP_20":
|
|
910
|
+
case "EXP_40":
|
|
911
|
+
case "EXP_80": {
|
|
912
|
+
const spec = EXP_DRAIN[name]!;
|
|
913
|
+
/* damroll(N, 6) is evaluated as the handler's argument, before take_hit. */
|
|
914
|
+
const drainAmount = rng.damroll(spec.dice, 6);
|
|
915
|
+
const reduced = env.applyReduction(baseDamage);
|
|
916
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
917
|
+
env.takeHit(reduced);
|
|
918
|
+
if (!env.playerDied) env.drainExp(spec.holdChance, drainAmount);
|
|
919
|
+
return done(baseDamage, reduced);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
case "HALLU": {
|
|
923
|
+
const reduced = env.applyReduction(baseDamage);
|
|
924
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
925
|
+
env.takeHit(reduced);
|
|
926
|
+
if (!env.playerDied) {
|
|
927
|
+
env.incTimed(TMD.IMAGE, 3 + rng.randint1(Math.trunc(rlev / 2)), true);
|
|
928
|
+
}
|
|
929
|
+
return done(baseDamage, reduced);
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
case "BLACK_BREATH": {
|
|
933
|
+
const reduced = env.applyReduction(baseDamage);
|
|
934
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
935
|
+
env.takeHit(reduced);
|
|
936
|
+
if (!env.playerDied && rng.oneIn(5)) {
|
|
937
|
+
env.incTimed(TMD.BLACKBREATH, Math.trunc(baseDamage / 10), false);
|
|
938
|
+
}
|
|
939
|
+
return done(baseDamage, reduced);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
default: {
|
|
943
|
+
/* Unknown effect: deal the base damage, as the fallthrough would. */
|
|
944
|
+
const reduced = env.applyReduction(baseDamage);
|
|
945
|
+
emitBlowMessageLive(env, ctx, reduced);
|
|
946
|
+
env.takeHit(reduced);
|
|
947
|
+
return done(baseDamage, reduced);
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/* ------------------------------------------------------------------ *
|
|
953
|
+
* make_attack_normal
|
|
954
|
+
* ------------------------------------------------------------------ */
|
|
955
|
+
|
|
956
|
+
/** Zero random_value, for blows that carry no damage dice. */
|
|
957
|
+
const ZERO_RV: RandomValue = { base: 0, dice: 0, sides: 0, mBonus: 0 };
|
|
958
|
+
|
|
959
|
+
/**
|
|
960
|
+
* make_attack_normal: run all of the monster's blows against the player. When
|
|
961
|
+
* `opts.env` is supplied the blow effects apply for real (HP through
|
|
962
|
+
* player_apply_damage_reduction / take_hit, plus every status / stat / theft /
|
|
963
|
+
* terrain consequence in the exact upstream RNG order); otherwise HP damage is
|
|
964
|
+
* applied to `defender.chp` and the rest is recorded as BlowSideEffect intents.
|
|
965
|
+
* Stops early if the player dies or a blow relocates the player.
|
|
966
|
+
*/
|
|
967
|
+
export function monMeleeAttack(
|
|
968
|
+
rng: Rng,
|
|
969
|
+
mon: Monster,
|
|
970
|
+
defender: Player,
|
|
971
|
+
def: DefenderState,
|
|
972
|
+
opts: MonMeleeOptions = {},
|
|
973
|
+
): MonMeleeAttack {
|
|
974
|
+
/* Not allowed to attack. */
|
|
975
|
+
if (mon.race.flags.has(RF.NEVER_BLOW)) {
|
|
976
|
+
return {
|
|
977
|
+
attacked: false,
|
|
978
|
+
blows: [],
|
|
979
|
+
totalDamage: 0,
|
|
980
|
+
playerDied: false,
|
|
981
|
+
sideEffects: [],
|
|
982
|
+
};
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
const env = opts.env;
|
|
986
|
+
const rlev = mon.race.level >= 1 ? mon.race.level : 1;
|
|
987
|
+
const stunned = (mon.mTimed[MON_TMD.STUN] ?? 0) > 0;
|
|
988
|
+
|
|
989
|
+
const blows: MonBlow[] = [];
|
|
990
|
+
const allSide: BlowSideEffect[] = [];
|
|
991
|
+
let totalDamage = 0;
|
|
992
|
+
let playerDied = false;
|
|
993
|
+
let blinked = false;
|
|
994
|
+
|
|
995
|
+
for (const blow of mon.race.blows) {
|
|
996
|
+
/* No more attacks. */
|
|
997
|
+
if (!blow.method) break;
|
|
998
|
+
if (playerDied) break;
|
|
999
|
+
|
|
1000
|
+
/* p->grid at the start of the blow (mon-attack.c L568). */
|
|
1001
|
+
const pgrid: Loc | null = env ? env.playerGrid() : null;
|
|
1002
|
+
const effectName = blow.effect.name;
|
|
1003
|
+
|
|
1004
|
+
/* Monster hits player (a "NONE" effect always connects, no to-hit roll). */
|
|
1005
|
+
const hit =
|
|
1006
|
+
effectName === "NONE" ||
|
|
1007
|
+
checkHit(rng, chanceOfMonsterHit(mon, mon.race.level, blow.effect.power), def);
|
|
1008
|
+
|
|
1009
|
+
if (!hit) {
|
|
1010
|
+
/* Visible monster missed the player: announce it (mon-attack.c L718). No
|
|
1011
|
+
* RNG is drawn; unseen monsters and no-miss methods stay silent. */
|
|
1012
|
+
if (env && env.monVisible && blow.method.miss) {
|
|
1013
|
+
env.msg(`${env.monName} misses you.`);
|
|
1014
|
+
}
|
|
1015
|
+
blows.push({
|
|
1016
|
+
hit: false,
|
|
1017
|
+
effect: effectName,
|
|
1018
|
+
method: blow.method.name,
|
|
1019
|
+
damage: 0,
|
|
1020
|
+
sideEffects: [],
|
|
1021
|
+
obvious: false,
|
|
1022
|
+
});
|
|
1023
|
+
continue;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
/* Apply "protection from evil" (mon-attack.c L597): an evil monster is
|
|
1027
|
+
* repelled on a high roll. The randint0(100) draw happens only when the
|
|
1028
|
+
* guard conditions hold, matching the C short-circuit order. */
|
|
1029
|
+
if (
|
|
1030
|
+
(defender.timed[TMD.PROTEVIL] ?? 0) > 0 &&
|
|
1031
|
+
mon.race.flags.has(RF.EVIL) &&
|
|
1032
|
+
defender.lev >= rlev &&
|
|
1033
|
+
rng.randint0(100) + defender.lev > 50
|
|
1034
|
+
) {
|
|
1035
|
+
env?.msg(`${mon.race.name} is repelled.`);
|
|
1036
|
+
continue;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
/* Roll dice, reduce when the attacker is stunned. */
|
|
1040
|
+
const diceRv = blow.dice ? blow.dice.randomValue() : ZERO_RV;
|
|
1041
|
+
let damage = blow.dice ? rng.randcalc(diceRv, rlev, "randomise") : 0;
|
|
1042
|
+
if (stunned) {
|
|
1043
|
+
damage = Math.trunc((damage * (100 - STUN_DAM_REDUCTION)) / 100);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
/* PARALYZE pre-clamp (mon-blows.c L1020): a paralysed player always takes
|
|
1047
|
+
* at least 1 damage, so paralysis cannot be perma-locked at 0 damage. */
|
|
1048
|
+
if (
|
|
1049
|
+
effectName === "PARALYZE" &&
|
|
1050
|
+
(defender.timed[TMD.PARALYZED] ?? 0) > 0 &&
|
|
1051
|
+
damage < 1
|
|
1052
|
+
) {
|
|
1053
|
+
damage = 1;
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
const blowCtx: BlowEffectContext = {
|
|
1057
|
+
rng,
|
|
1058
|
+
baseDamage: damage,
|
|
1059
|
+
ac: def.ac + def.toA,
|
|
1060
|
+
rlev,
|
|
1061
|
+
phys: blow.method.phys,
|
|
1062
|
+
method: blow.method,
|
|
1063
|
+
/* The worldless path applies hpDamage after resolveBlowEffect(), unlike
|
|
1064
|
+
* C's monster_damage_target(); predict its return value for handlers
|
|
1065
|
+
* that must stop before later RNG draws (mon-blows.c L1095). */
|
|
1066
|
+
...(env
|
|
1067
|
+
? {}
|
|
1068
|
+
: { willPlayerDie: (pendingDamage: number) => defender.chp - pendingDamage < 0 }),
|
|
1069
|
+
};
|
|
1070
|
+
|
|
1071
|
+
/* context->damage after the handler (unreduced; feeds the cut/stun crit). */
|
|
1072
|
+
let contextDamage: number;
|
|
1073
|
+
/* The HP actually dealt this blow (reported / totalled). */
|
|
1074
|
+
let dealtDamage: number;
|
|
1075
|
+
let obvious: boolean;
|
|
1076
|
+
const blowSide: BlowSideEffect[] = [];
|
|
1077
|
+
|
|
1078
|
+
if (env) {
|
|
1079
|
+
const res = resolveBlowEffectLive(effectName, blowCtx, env);
|
|
1080
|
+
contextDamage = res.contextDamage;
|
|
1081
|
+
dealtDamage = res.reducedDamage;
|
|
1082
|
+
obvious = res.obvious;
|
|
1083
|
+
if (res.blinked) blinked = true;
|
|
1084
|
+
if (dealtDamage > 0) totalDamage += dealtDamage;
|
|
1085
|
+
if (env.playerDied) playerDied = true;
|
|
1086
|
+
} else {
|
|
1087
|
+
const res = resolveBlowEffect(effectName, blowCtx);
|
|
1088
|
+
contextDamage = res.hpDamage;
|
|
1089
|
+
dealtDamage = res.hpDamage;
|
|
1090
|
+
obvious = res.obvious;
|
|
1091
|
+
for (const s of res.sideEffects) blowSide.push(s);
|
|
1092
|
+
if (res.hpDamage > 0) {
|
|
1093
|
+
defender.chp -= res.hpDamage;
|
|
1094
|
+
totalDamage += res.hpDamage;
|
|
1095
|
+
if (defender.chp < 0) playerDied = true;
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
/* Cut and stun (only one of the two), keyed off the UNREDUCED damage. */
|
|
1100
|
+
let doCut = blow.method.cut;
|
|
1101
|
+
let doStun = blow.method.stun;
|
|
1102
|
+
if (playerDied) {
|
|
1103
|
+
doCut = false;
|
|
1104
|
+
doStun = false;
|
|
1105
|
+
}
|
|
1106
|
+
if (doCut && doStun) {
|
|
1107
|
+
if (rng.randint0(100) < 50) doCut = false;
|
|
1108
|
+
else doStun = false;
|
|
1109
|
+
}
|
|
1110
|
+
if (doCut) {
|
|
1111
|
+
const tier = monsterCritical(rng, diceRv, rlev, contextDamage);
|
|
1112
|
+
const amt = cutAmount(rng, tier);
|
|
1113
|
+
if (amt) {
|
|
1114
|
+
if (env) env.incTimed(TMD.CUT, amt, true);
|
|
1115
|
+
else blowSide.push({ kind: "timed", effect: "CUT", amount: amt });
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
if (doStun) {
|
|
1119
|
+
const tier = monsterCritical(rng, diceRv, rlev, contextDamage);
|
|
1120
|
+
const amt = stunAmount(rng, tier);
|
|
1121
|
+
if (amt) {
|
|
1122
|
+
if (env) env.incTimed(TMD.STUN, amt, true);
|
|
1123
|
+
else blowSide.push({ kind: "timed", effect: "STUN", amount: amt });
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
for (const s of blowSide) allSide.push(s);
|
|
1128
|
+
blows.push({
|
|
1129
|
+
hit: true,
|
|
1130
|
+
effect: effectName,
|
|
1131
|
+
method: blow.method.name,
|
|
1132
|
+
damage: dealtDamage,
|
|
1133
|
+
sideEffects: blowSide,
|
|
1134
|
+
obvious,
|
|
1135
|
+
});
|
|
1136
|
+
|
|
1137
|
+
/* Skip the other blows if the player has moved (mon-attack.c L736): an
|
|
1138
|
+
* earthquake or knockback relocated the player mid-loop. */
|
|
1139
|
+
if (env && pgrid && !locEq(env.playerGrid(), pgrid)) break;
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
/* Blink away (mon-attack.c L740): a monster that stole gold / an item
|
|
1143
|
+
* teleports after all its blows resolve. */
|
|
1144
|
+
if (env && blinked) env.blinkAway();
|
|
1145
|
+
|
|
1146
|
+
return {
|
|
1147
|
+
attacked: true,
|
|
1148
|
+
blows,
|
|
1149
|
+
totalDamage,
|
|
1150
|
+
playerDied,
|
|
1151
|
+
sideEffects: allSide,
|
|
1152
|
+
};
|
|
1153
|
+
}
|