@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,1189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Player calculation tables and helpers, ported VERBATIM from
|
|
3
|
+
* reference/src/player-calcs.c and player-util.c (Angband 4.2.6).
|
|
4
|
+
*
|
|
5
|
+
* The adj_* arrays are the stat-adjustment tables indexed by state->stat_ind
|
|
6
|
+
* (0..STAT_RANGE-1). Each has exactly STAT_RANGE (38) entries. blows_table is
|
|
7
|
+
* the 12x12 blow-energy table; player_exp is the experience needed per level.
|
|
8
|
+
*
|
|
9
|
+
* This module also ports the innate (race/class/stat/level) portion of
|
|
10
|
+
* calc_bonuses as calcBonuses, calc_blows as the pure calcBlows, plus
|
|
11
|
+
* player_flags (player.c), adjust_skill_scale and weight_limit, and the
|
|
12
|
+
* level-1 hitpoint math. The equipment analysis loop and the launcher /
|
|
13
|
+
* weapon analysis ARE ported: pass the worn objects via
|
|
14
|
+
* CalcBonusesOptions.equipment and calc_bonuses applies their stat, skill,
|
|
15
|
+
* combat and resist contributions and derives blows from the wielded weapon.
|
|
16
|
+
* calc_light and the timed effects (food, stun, bless, hero, shero,
|
|
17
|
+
* fast/slow, temp resists, etc.) are now ported (calcLight + the
|
|
18
|
+
* timedEffects-gated blocks in calcBonuses). The per-object curse-object
|
|
19
|
+
* traversal inside the equipment loop (2009-2023) is now ported: a worn item's
|
|
20
|
+
* active curses fold their template objects into the state (pass the bound
|
|
21
|
+
* Curse registry via CalcBonusesOptions.curses). Still DEFERRED (see the
|
|
22
|
+
* calcBonuses notes and parity/ledger/player-calcs-bonuses.yaml):
|
|
23
|
+
* - the learn-by-use rune system that populates obj_k (equipment modifiers
|
|
24
|
+
* are rune-gated and inert at birth)
|
|
25
|
+
* calc_mana (player-calcs.c:2322) is ported (player/spell.ts calcMana) and
|
|
26
|
+
* invoked by the session layer (session/game.ts) right after this pass, split
|
|
27
|
+
* across the calc/session seam; msp is populated there.
|
|
28
|
+
* calc_shapechange is now ported (a non-normal player.shape stacks its
|
|
29
|
+
* combat/skill/flag/modifier/resist package on the state).
|
|
30
|
+
*/
|
|
31
|
+
import { OF_SIZE, PF_SIZE, PY_MAX_LEVEL, SKILL, SKILL_MAX, STAT_MAX, STAT_RANGE, TMD_MAX, } from "./types.js";
|
|
32
|
+
import { ELEM, KF, OBJ_MOD, OF, PF, STAT, TMD, TV } from "../generated/index.js";
|
|
33
|
+
import { COLOUR_L_GREEN, COLOUR_RED, COLOUR_YELLOW } from "../color.js";
|
|
34
|
+
import { FlagSet } from "../bitflag.js";
|
|
35
|
+
import { tvalCanHaveFlavor, tvalIsAmmo, tvalIsDigger, tvalIsLight, } from "../obj/object.js";
|
|
36
|
+
import { playerTimedGradeEq } from "./timed.js";
|
|
37
|
+
/* ------------------------------------------------------------------ */
|
|
38
|
+
/* Stat adjustment tables (player-calcs.c), each STAT_RANGE entries */
|
|
39
|
+
/* ------------------------------------------------------------------ */
|
|
40
|
+
/** Stat Table (INT) -- Magic devices. */
|
|
41
|
+
export const adj_int_dev = [
|
|
42
|
+
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6,
|
|
43
|
+
7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13,
|
|
44
|
+
];
|
|
45
|
+
/** Stat Table (WIS) -- Saving throw. */
|
|
46
|
+
export const adj_wis_sav = [
|
|
47
|
+
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 7,
|
|
48
|
+
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
|
49
|
+
];
|
|
50
|
+
/** Stat Table (DEX) -- disarming. */
|
|
51
|
+
export const adj_dex_dis = [
|
|
52
|
+
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10,
|
|
53
|
+
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19,
|
|
54
|
+
];
|
|
55
|
+
/** Stat Table (INT) -- disarming. */
|
|
56
|
+
export const adj_int_dis = [
|
|
57
|
+
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10,
|
|
58
|
+
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19,
|
|
59
|
+
];
|
|
60
|
+
/** Stat Table (DEX) -- bonus to ac. */
|
|
61
|
+
export const adj_dex_ta = [
|
|
62
|
+
-4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5,
|
|
63
|
+
6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 15, 15,
|
|
64
|
+
];
|
|
65
|
+
/** Stat Table (STR) -- bonus to dam. */
|
|
66
|
+
export const adj_str_td = [
|
|
67
|
+
-2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5,
|
|
68
|
+
6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20,
|
|
69
|
+
];
|
|
70
|
+
/** Stat Table (DEX) -- bonus to hit. */
|
|
71
|
+
export const adj_dex_th = [
|
|
72
|
+
-3, -2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5,
|
|
73
|
+
6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 15, 15,
|
|
74
|
+
];
|
|
75
|
+
/** Stat Table (STR) -- bonus to hit. */
|
|
76
|
+
export const adj_str_th = [
|
|
77
|
+
-3, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4,
|
|
78
|
+
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15,
|
|
79
|
+
];
|
|
80
|
+
/** Stat Table (STR) -- weight limit in deca-pounds. */
|
|
81
|
+
export const adj_str_wgt = [
|
|
82
|
+
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 30,
|
|
83
|
+
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
|
|
84
|
+
];
|
|
85
|
+
/** Stat Table (STR) -- weapon weight limit in pounds. */
|
|
86
|
+
export const adj_str_hold = [
|
|
87
|
+
4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 35, 40, 45, 50,
|
|
88
|
+
55, 60, 65, 70, 80, 80, 80, 80, 80, 90, 90, 90, 90, 90, 100, 100, 100,
|
|
89
|
+
];
|
|
90
|
+
/** Stat Table (STR) -- digging value. */
|
|
91
|
+
export const adj_str_dig = [
|
|
92
|
+
0, 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 12, 15, 20, 25, 30, 35, 40,
|
|
93
|
+
45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 100, 100,
|
|
94
|
+
];
|
|
95
|
+
/** Stat Table (STR) -- index into the "blow" table. */
|
|
96
|
+
export const adj_str_blow = [
|
|
97
|
+
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 30, 40, 50, 60, 70,
|
|
98
|
+
80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230,
|
|
99
|
+
240,
|
|
100
|
+
];
|
|
101
|
+
/** Stat Table (DEX) -- index into the "blow" table. */
|
|
102
|
+
export const adj_dex_blow = [
|
|
103
|
+
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
|
|
104
|
+
7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11,
|
|
105
|
+
];
|
|
106
|
+
/** Stat Table (DEX) -- chance of avoiding "theft" and "falling". */
|
|
107
|
+
export const adj_dex_safe = [
|
|
108
|
+
0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 15, 15, 20, 25, 30, 35,
|
|
109
|
+
40, 45, 50, 60, 70, 80, 90, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
110
|
+
];
|
|
111
|
+
/** Stat Table (CON) -- base regeneration rate. */
|
|
112
|
+
export const adj_con_fix = [
|
|
113
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4,
|
|
114
|
+
4, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9,
|
|
115
|
+
];
|
|
116
|
+
/** Stat Table (CON) -- extra 1/100th hitpoints per level. */
|
|
117
|
+
export const adj_con_mhp = [
|
|
118
|
+
-250, -150, -100, -75, -50, -25, -10, -5, 0, 5, 10, 25, 50, 75, 100, 150, 175,
|
|
119
|
+
200, 225, 250, 275, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800,
|
|
120
|
+
900, 1000, 1100, 1250, 1250, 1250,
|
|
121
|
+
];
|
|
122
|
+
/** Stat Table (INT/WIS) -- spell study rate. */
|
|
123
|
+
export const adj_mag_study = [
|
|
124
|
+
0, 0, 10, 20, 30, 40, 50, 60, 70, 80, 85, 90, 95, 100, 105, 110, 115, 120, 130,
|
|
125
|
+
140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 250, 250, 250, 250,
|
|
126
|
+
250, 250, 250,
|
|
127
|
+
];
|
|
128
|
+
/** Stat Table (INT/WIS) -- extra 1/100 mana-points per level. */
|
|
129
|
+
export const adj_mag_mana = [
|
|
130
|
+
0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170,
|
|
131
|
+
180, 190, 200, 225, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800,
|
|
132
|
+
800, 800, 800, 800,
|
|
133
|
+
];
|
|
134
|
+
/**
|
|
135
|
+
* blows_table[P][D] (player-calcs.c): energy per blow indexed by the STR blow
|
|
136
|
+
* index P (adj_str_blow bucketed) and the DEX blow index D (adj_dex_blow).
|
|
137
|
+
*/
|
|
138
|
+
export const blows_table = [
|
|
139
|
+
[100, 100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23],
|
|
140
|
+
[100, 95, 85, 75, 60, 50, 42, 35, 30, 25, 23, 21],
|
|
141
|
+
[95, 85, 75, 60, 50, 42, 35, 30, 26, 23, 21, 20],
|
|
142
|
+
[85, 75, 60, 50, 42, 36, 32, 28, 25, 22, 20, 19],
|
|
143
|
+
[75, 60, 50, 42, 36, 33, 28, 25, 23, 21, 19, 18],
|
|
144
|
+
[60, 50, 42, 36, 33, 30, 27, 24, 22, 21, 19, 17],
|
|
145
|
+
[50, 42, 36, 33, 30, 27, 25, 23, 21, 20, 18, 17],
|
|
146
|
+
[42, 36, 33, 30, 28, 26, 24, 22, 20, 19, 18, 17],
|
|
147
|
+
[36, 33, 30, 28, 26, 24, 22, 21, 20, 19, 17, 16],
|
|
148
|
+
[35, 32, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16],
|
|
149
|
+
[34, 30, 27, 25, 23, 22, 21, 20, 19, 18, 17, 16],
|
|
150
|
+
[33, 29, 26, 24, 22, 21, 20, 19, 18, 17, 16, 15],
|
|
151
|
+
];
|
|
152
|
+
/**
|
|
153
|
+
* Experience needed to reach each level (player.c player_exp[PY_MAX_LEVEL]).
|
|
154
|
+
* player_exp[lev-1] is the base threshold for level lev+1; multiplied by the
|
|
155
|
+
* player's expfact/100.
|
|
156
|
+
*/
|
|
157
|
+
export const player_exp = [
|
|
158
|
+
10, 25, 45, 70, 100, 140, 200, 280, 380, 500, 650, 850, 1100, 1400, 1800, 2300,
|
|
159
|
+
2900, 3600, 4400, 5400, 6800, 8400, 10200, 12500, 17500, 25000, 35000, 50000,
|
|
160
|
+
75000, 100000, 150000, 200000, 275000, 350000, 450000, 550000, 700000, 850000,
|
|
161
|
+
1000000, 1250000, 1500000, 1800000, 2100000, 2400000, 2700000, 3000000, 3500000,
|
|
162
|
+
4000000, 4500000, 5000000,
|
|
163
|
+
];
|
|
164
|
+
/* ------------------------------------------------------------------ */
|
|
165
|
+
/* Helpers */
|
|
166
|
+
/* ------------------------------------------------------------------ */
|
|
167
|
+
/** Bounds-checked table read; throws on an out-of-range index. */
|
|
168
|
+
function at(table, i) {
|
|
169
|
+
const v = table[i];
|
|
170
|
+
if (v === undefined) {
|
|
171
|
+
throw new Error(`player: adj table index out of range: ${i}`);
|
|
172
|
+
}
|
|
173
|
+
return v;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* modify_stat_value (player-util.c): apply a racial/class stat modifier to a
|
|
177
|
+
* base stat value, using the 3..18/220 encoding (each point below 18 is +1,
|
|
178
|
+
* each point at/above 18 is +10; symmetric on the way down).
|
|
179
|
+
*/
|
|
180
|
+
export function modifyStatValue(value, amount) {
|
|
181
|
+
let v = value;
|
|
182
|
+
if (amount > 0) {
|
|
183
|
+
for (let i = 0; i < amount; i++) {
|
|
184
|
+
if (v < 18)
|
|
185
|
+
v++;
|
|
186
|
+
else
|
|
187
|
+
v += 10;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else if (amount < 0) {
|
|
191
|
+
for (let i = 0; i < -amount; i++) {
|
|
192
|
+
if (v >= 18 + 10)
|
|
193
|
+
v -= 10;
|
|
194
|
+
else if (v > 18)
|
|
195
|
+
v = 18;
|
|
196
|
+
else if (v > 3)
|
|
197
|
+
v--;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return v;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The stat_ind computation from calc_bonuses: map a modified stat "use" value
|
|
204
|
+
* to its index into the adj_* tables (0..STAT_RANGE-1).
|
|
205
|
+
*/
|
|
206
|
+
export function statUseToIndex(use) {
|
|
207
|
+
let ind;
|
|
208
|
+
if (use <= 3)
|
|
209
|
+
ind = 0;
|
|
210
|
+
else if (use <= 18)
|
|
211
|
+
ind = use - 3;
|
|
212
|
+
else if (use <= 18 + 219)
|
|
213
|
+
ind = 15 + Math.trunc((use - 18) / 10);
|
|
214
|
+
else
|
|
215
|
+
ind = 37;
|
|
216
|
+
if (ind < 0 || ind >= STAT_RANGE) {
|
|
217
|
+
throw new Error(`player: stat index out of range: ${ind}`);
|
|
218
|
+
}
|
|
219
|
+
return ind;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Compute the stat_ind array (indices into adj_* tables) for a race/class at a
|
|
223
|
+
* given set of base stat values (state->stat_ind in calc_bonuses, without the
|
|
224
|
+
* hypothetical-blow hack). stat_add (equipment) is DEFERRED and treated as 0.
|
|
225
|
+
*/
|
|
226
|
+
export function calcStatIndices(race, cls, statCur) {
|
|
227
|
+
const out = new Array(STAT_MAX).fill(0);
|
|
228
|
+
for (let i = 0; i < STAT_MAX; i++) {
|
|
229
|
+
const add = (race.statAdj[i] ?? 0) + (cls.statAdj[i] ?? 0);
|
|
230
|
+
const use = modifyStatValue(statCur[i] ?? 0, add);
|
|
231
|
+
out[i] = statUseToIndex(use);
|
|
232
|
+
}
|
|
233
|
+
return out;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* calc_hitpoints (player-calcs.c): maximum hitpoints at a level, given the
|
|
237
|
+
* accumulated player_hp roll for that level and the CON stat index.
|
|
238
|
+
* mhp = player_hp[lev-1] + adj_con_mhp[con_ind] * lev / 100, floored at lev+1.
|
|
239
|
+
*/
|
|
240
|
+
export function calcHitpoints(playerHpAtLevel, lev, conInd) {
|
|
241
|
+
const bonus = at(adj_con_mhp, conInd);
|
|
242
|
+
let mhp = playerHpAtLevel + Math.trunc((bonus * lev) / 100);
|
|
243
|
+
if (mhp < lev + 1)
|
|
244
|
+
mhp = lev + 1;
|
|
245
|
+
return mhp;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* The "Modify skills" tail of calc_bonuses (player-calcs.c:2239-2250),
|
|
249
|
+
* applied in the exact upstream statement order:
|
|
250
|
+
* DISARM_PHYS += adj_dex_dis[stat_ind[DEX]] (2240)
|
|
251
|
+
* DISARM_MAGIC += adj_int_dis[stat_ind[INT]] (2241)
|
|
252
|
+
* DEVICE += adj_int_dev[stat_ind[INT]] (2242)
|
|
253
|
+
* SAVE += adj_wis_sav[stat_ind[WIS]] (2243)
|
|
254
|
+
* DIGGING += adj_str_dig[stat_ind[STR]] (2244)
|
|
255
|
+
* skills[i] += x_skills[i] * lev / 10 (2245-2246)
|
|
256
|
+
* then DIGGING is floored at 1 and STEALTH clamped to [0, 30] (2248-2250).
|
|
257
|
+
*/
|
|
258
|
+
function applySkillStatAndLevel(skills, cls, lev, statInd) {
|
|
259
|
+
skills[SKILL.DISARM_PHYS] =
|
|
260
|
+
(skills[SKILL.DISARM_PHYS] ?? 0) + at(adj_dex_dis, statInd[STAT.DEX] ?? 0);
|
|
261
|
+
skills[SKILL.DISARM_MAGIC] =
|
|
262
|
+
(skills[SKILL.DISARM_MAGIC] ?? 0) + at(adj_int_dis, statInd[STAT.INT] ?? 0);
|
|
263
|
+
skills[SKILL.DEVICE] =
|
|
264
|
+
(skills[SKILL.DEVICE] ?? 0) + at(adj_int_dev, statInd[STAT.INT] ?? 0);
|
|
265
|
+
skills[SKILL.SAVE] =
|
|
266
|
+
(skills[SKILL.SAVE] ?? 0) + at(adj_wis_sav, statInd[STAT.WIS] ?? 0);
|
|
267
|
+
skills[SKILL.DIGGING] =
|
|
268
|
+
(skills[SKILL.DIGGING] ?? 0) + at(adj_str_dig, statInd[STAT.STR] ?? 0);
|
|
269
|
+
for (let i = 0; i < SKILL_MAX; i++) {
|
|
270
|
+
skills[i] = (skills[i] ?? 0) + Math.trunc(((cls.extraSkills[i] ?? 0) * lev) / 10);
|
|
271
|
+
}
|
|
272
|
+
if ((skills[SKILL.DIGGING] ?? 0) < 1)
|
|
273
|
+
skills[SKILL.DIGGING] = 1;
|
|
274
|
+
if ((skills[SKILL.STEALTH] ?? 0) > 30)
|
|
275
|
+
skills[SKILL.STEALTH] = 30;
|
|
276
|
+
if ((skills[SKILL.STEALTH] ?? 0) < 0)
|
|
277
|
+
skills[SKILL.STEALTH] = 0;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* The non-equipment portion of calc_bonuses skill computation: base
|
|
281
|
+
* skills[i] = r_skills[i] + c_skills[i] (player-calcs.c:1904-1906) followed
|
|
282
|
+
* by the stat and level adjustments (2239-2250, see applySkillStatAndLevel).
|
|
283
|
+
* For a player with no equipment, no timed effects and the normal shape this
|
|
284
|
+
* equals calcBonuses(player).skills.
|
|
285
|
+
*/
|
|
286
|
+
export function calcSkills(race, cls, lev, statInd) {
|
|
287
|
+
const skills = new Array(SKILL_MAX).fill(0);
|
|
288
|
+
for (let i = 0; i < SKILL_MAX; i++) {
|
|
289
|
+
skills[i] = (race.skills[i] ?? 0) + (cls.skills[i] ?? 0);
|
|
290
|
+
}
|
|
291
|
+
applySkillStatAndLevel(skills, cls, lev, statInd);
|
|
292
|
+
return skills;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* player_flags (player.c:290-300): the player's innate object flags -- racial
|
|
296
|
+
* flags unioned with class flags, plus OF_PROT_FEAR for PF_BRAVERY_30
|
|
297
|
+
* classes at level 30+. Returns a fresh OF-sized flag set (upstream fills a
|
|
298
|
+
* caller buffer).
|
|
299
|
+
*/
|
|
300
|
+
export function playerFlags(player) {
|
|
301
|
+
const f = new FlagSet(OF_SIZE);
|
|
302
|
+
f.copy(player.race.flags);
|
|
303
|
+
f.union(player.cls.flags);
|
|
304
|
+
if ((player.race.pflags.has(PF.BRAVERY_30) ||
|
|
305
|
+
player.cls.pflags.has(PF.BRAVERY_30)) &&
|
|
306
|
+
player.lev >= 30) {
|
|
307
|
+
f.on(OF.PROT_FEAR);
|
|
308
|
+
}
|
|
309
|
+
return f;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* player_hp_attr (player.c:323): the colour the current hitpoints are drawn
|
|
313
|
+
* in - COLOUR_L_GREEN at full health, COLOUR_YELLOW while above the
|
|
314
|
+
* hitpoint-warning fraction (mhp * hitpoint_warn / 10), else COLOUR_RED.
|
|
315
|
+
* `hitpointWarn` is op_ptr->hitpoint_warn (0..9); the options store is
|
|
316
|
+
* deferred, so the caller supplies it.
|
|
317
|
+
*/
|
|
318
|
+
export function playerHpAttr(p, hitpointWarn) {
|
|
319
|
+
if (p.chp >= p.mhp)
|
|
320
|
+
return COLOUR_L_GREEN;
|
|
321
|
+
if (p.chp > Math.trunc((p.mhp * hitpointWarn) / 10))
|
|
322
|
+
return COLOUR_YELLOW;
|
|
323
|
+
return COLOUR_RED;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* player_sp_attr (player.c:337): the spell-point colour, identical thresholds
|
|
327
|
+
* to player_hp_attr but on csp / msp.
|
|
328
|
+
*/
|
|
329
|
+
export function playerSpAttr(p, hitpointWarn) {
|
|
330
|
+
if (p.csp >= p.msp)
|
|
331
|
+
return COLOUR_L_GREEN;
|
|
332
|
+
if (p.csp > Math.trunc((p.msp * hitpointWarn) / 10))
|
|
333
|
+
return COLOUR_YELLOW;
|
|
334
|
+
return COLOUR_RED;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* adjust_skill_scale (player-calcs.c:1781-1792): adjust a value by a
|
|
338
|
+
* relative factor of its absolute value, mimicking value * (den + num) / den
|
|
339
|
+
* for positive values (negative num rounds the adjustment up). Returns the
|
|
340
|
+
* adjusted value instead of mutating through a pointer.
|
|
341
|
+
*/
|
|
342
|
+
export function adjustSkillScale(v, num, den, minv) {
|
|
343
|
+
if (num >= 0) {
|
|
344
|
+
return v + Math.trunc((Math.max(minv, Math.abs(v)) * num) / den);
|
|
345
|
+
}
|
|
346
|
+
/* To mimic (value * (den + num)) / den for positive value, round up. */
|
|
347
|
+
return v - Math.trunc((Math.max(minv, Math.abs(v)) * -num + den - 1) / den);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* weight_limit (player-calcs.c:1741-1750): the carrying capacity in tenth
|
|
351
|
+
* pounds, based only on strength.
|
|
352
|
+
*/
|
|
353
|
+
export function weightLimit(state) {
|
|
354
|
+
return at(adj_str_wgt, state.statInd[STAT.STR] ?? 0) * 100;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* weight_remaining (player-calcs.c:1752-1765): tenth-pounds of carry capacity
|
|
358
|
+
* left before becoming burdened - `60 * adj_str_wgt[STR] - total_weight - 1`,
|
|
359
|
+
* which is NEGATIVE while there is room to spare (the character sheet prints
|
|
360
|
+
* `-diff/10`, so spare capacity shows as a negative "Overweight" figure, and
|
|
361
|
+
* real encumbrance shows as a positive one).
|
|
362
|
+
*/
|
|
363
|
+
export function weightRemaining(state, totalWeight) {
|
|
364
|
+
return 60 * at(adj_str_wgt, state.statInd[STAT.STR] ?? 0) - totalWeight - 1;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* calc_blows (player-calcs.c:1703-1735): the blows a player would get with a
|
|
368
|
+
* weapon of the given weight, as a pure function of the class blow
|
|
369
|
+
* parameters and the STR/DEX stat indices (state->stat_ind upstream).
|
|
370
|
+
*
|
|
371
|
+
* \param cls supplies min_weight, att_multiply and max_attacks.
|
|
372
|
+
* \param weaponWeight is object_weight_one(obj) in tenth pounds, or null for
|
|
373
|
+
* no weapon (upstream passes obj == NULL and uses weight 0, so the class
|
|
374
|
+
* min_weight becomes the divisor).
|
|
375
|
+
* \param strInd / dexInd are stat_ind[STAT_STR] / stat_ind[STAT_DEX].
|
|
376
|
+
* \param extraBlows is the +blows total from gear and state (innately 0).
|
|
377
|
+
* \param percentDamage is OPT(p, birth_percent_damage): O-combat requires
|
|
378
|
+
* two blows minimum instead of one.
|
|
379
|
+
* \returns 100x the number of blows.
|
|
380
|
+
*/
|
|
381
|
+
export function calcBlows(cls, weaponWeight, strInd, dexInd, extraBlows = 0, percentDamage = false) {
|
|
382
|
+
const weight = weaponWeight === null ? 0 : weaponWeight;
|
|
383
|
+
const minWeight = cls.minWeight;
|
|
384
|
+
/* Enforce a minimum "weight" (tenth pounds) (1715). */
|
|
385
|
+
const div = weight < minWeight ? minWeight : weight;
|
|
386
|
+
/* Get the strength vs weight (1717-1722). */
|
|
387
|
+
let strIndex = Math.trunc((at(adj_str_blow, strInd) * cls.attMultiply) / div);
|
|
388
|
+
if (strIndex > 11)
|
|
389
|
+
strIndex = 11;
|
|
390
|
+
/* Index by dexterity (1724-1725). */
|
|
391
|
+
const dexIndex = Math.min(at(adj_dex_blow, dexInd), 11);
|
|
392
|
+
/* Use the blows table to get energy per blow (1727-1730). */
|
|
393
|
+
const blowEnergy = blows_table[strIndex]?.[dexIndex];
|
|
394
|
+
if (blowEnergy === undefined) {
|
|
395
|
+
throw new Error(`player: blows_table index out of range: ${strIndex},${dexIndex}`);
|
|
396
|
+
}
|
|
397
|
+
const blows = Math.min(Math.trunc(10000 / blowEnergy), 100 * cls.maxAttacks);
|
|
398
|
+
/* Require at least one blow, two for O-combat (1732-1734). */
|
|
399
|
+
return Math.max(blows + 100 * extraBlows, percentDamage ? 200 : 100);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* calc_light (player-calcs.c:1598-1645): set state.curLight to the sum of the
|
|
403
|
+
* light radii of every wielded light source. Each slot contributes OF_LIGHT_2
|
|
404
|
+
* (2) or OF_LIGHT_3 (3) plus its OBJ_MOD_LIGHT modifier, an UNLIGHT player
|
|
405
|
+
* loses 1 from any positive +LIGHT item, and a tval-light item with fuel that
|
|
406
|
+
* has run out (timeout == 0, no NO_FUEL) contributes nothing.
|
|
407
|
+
*
|
|
408
|
+
* FAITHFULNESS: obj->modifiers[OBJ_MOD_LIGHT] is read RAW here (1629), NOT
|
|
409
|
+
* multiplied by the learned-rune mask obj_k like the pval modifiers in the
|
|
410
|
+
* equipment loop -- upstream calc_light does not rune-gate light. Do not
|
|
411
|
+
* "consistency-fix" this into a knownMods multiply; that would diverge.
|
|
412
|
+
*/
|
|
413
|
+
function calcLight(player, state, options) {
|
|
414
|
+
/* Assume no light (1604). */
|
|
415
|
+
state.curLight = 0;
|
|
416
|
+
/* Ascertain lightness if in the town (1606-1613). is_daytime() comes from
|
|
417
|
+
the world clock (deferred), so isDaytime defaults false and this branch
|
|
418
|
+
is dormant in the dungeon-only build.
|
|
419
|
+
TODO(world-clock): when isDaytime becomes real, also reinstate the
|
|
420
|
+
upstream visual refresh here -- calc_light sets p->upkeep->update |=
|
|
421
|
+
(PU_UPDATE_VIEW | PU_MONSTERS) when the town light changes (1608-1611)
|
|
422
|
+
before returning. The port must trigger the equivalent view/monster
|
|
423
|
+
refresh on the town daytime path once the town/world clock lands. */
|
|
424
|
+
const depth = options.depth;
|
|
425
|
+
const update = options.update ?? true;
|
|
426
|
+
if (depth === 0 && (options.isDaytime ?? false) && update) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const equipment = options.equipment ?? [];
|
|
430
|
+
/* Examine all wielded objects, use the brightest (1615-1644). */
|
|
431
|
+
for (let i = 0; i < player.body.count; i++) {
|
|
432
|
+
let amt = 0;
|
|
433
|
+
const obj = equipment[i] ?? null;
|
|
434
|
+
/* Skip empty slots (1621). */
|
|
435
|
+
if (!obj)
|
|
436
|
+
continue;
|
|
437
|
+
/* Light radius - innate plus modifier (1623-1629). */
|
|
438
|
+
if (obj.flags.has(OF.LIGHT_2)) {
|
|
439
|
+
amt = 2;
|
|
440
|
+
}
|
|
441
|
+
else if (obj.flags.has(OF.LIGHT_3)) {
|
|
442
|
+
amt = 3;
|
|
443
|
+
}
|
|
444
|
+
amt += obj.modifiers[OBJ_MOD.LIGHT] ?? 0;
|
|
445
|
+
/* Adjustment to allow UNLIGHT players to use +1 LIGHT gear (1631-1634). */
|
|
446
|
+
if ((obj.modifiers[OBJ_MOD.LIGHT] ?? 0) > 0 && state.pflags.has(PF.UNLIGHT)) {
|
|
447
|
+
amt--;
|
|
448
|
+
}
|
|
449
|
+
/* Examine actual lights: no fuel means no light (1636-1640). */
|
|
450
|
+
if (tvalIsLight(obj.tval) && !obj.flags.has(OF.NO_FUEL) && obj.timeout === 0) {
|
|
451
|
+
amt = 0;
|
|
452
|
+
}
|
|
453
|
+
/* Alter cur_light if reasonable (1643). */
|
|
454
|
+
state.curLight += amt;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* calc_bonuses (player-calcs.c:1877-2331), innate portion: derives the
|
|
459
|
+
* player's state from race/class intrinsics, stats, level, the worn
|
|
460
|
+
* equipment (options.equipment) and the timed effects (options.timedEffects
|
|
461
|
+
* + player.timed). With no equipment supplied the player is unarmed and
|
|
462
|
+
* unarmored (the just-born default); with no timed table supplied the timed
|
|
463
|
+
* model is inert (see CalcBonusesOptions.timedEffects).
|
|
464
|
+
*
|
|
465
|
+
* Ported statement-for-statement in upstream order; each block cites its
|
|
466
|
+
* lines. DEFERRED blocks (see parity/ledger/player-calcs-bonuses.yaml), all
|
|
467
|
+
* of which are no-ops for the innate state:
|
|
468
|
+
* - the learn-by-use rune system that populates obj_k: equipment modifiers
|
|
469
|
+
* are rune-gated (obj->modifiers * obj_k->modifiers) and UNKNOWN at birth
|
|
470
|
+
* (decision 25), so they contribute nothing until a rune is learned. The
|
|
471
|
+
* per-object curse-object traversal in the equipment loop (2009-2023) is
|
|
472
|
+
* now ported (see options.curses)
|
|
473
|
+
* - calc_light (2040-2041), the food-grade block (2094-2132) and the timed
|
|
474
|
+
* block (2134-2213) are now ported (calcLight + the timedEffects-gated
|
|
475
|
+
* blocks below); the launcher analysis (2254-2288) and weapon analysis
|
|
476
|
+
* (2291-2319) are ported and the wielded weapon drives num_blows/digging
|
|
477
|
+
* - calc_mana (2322): ported (player/spell.ts calcMana) but called by the
|
|
478
|
+
* session layer just after this pass, not inline; the PF_NO_MANA check
|
|
479
|
+
* (2323-2325) is ported here and reads p->msp populated by that call
|
|
480
|
+
* - the known_only object-knowledge variant and the !update hypothetical
|
|
481
|
+
* blows index shift (1891-1893, 2077-2088): birth-UI only
|
|
482
|
+
*/
|
|
483
|
+
export function calcBonuses(player, options = {}) {
|
|
484
|
+
const race = player.race;
|
|
485
|
+
const cls = player.cls;
|
|
486
|
+
const elemCount = race.elInfo.length;
|
|
487
|
+
/* extra_blows/shots/might/moves accumulate from equipment modifiers and
|
|
488
|
+
feed the launcher / weapon / movement analysis below (0 when unarmed). */
|
|
489
|
+
let extraBlows = 0;
|
|
490
|
+
let extraShots = 0;
|
|
491
|
+
let extraMight = 0;
|
|
492
|
+
let extraMoves = 0;
|
|
493
|
+
/* The wielded weapon and launcher, captured during the equipment loop. */
|
|
494
|
+
let weapon = null;
|
|
495
|
+
let launcher = null;
|
|
496
|
+
/* Reset (1896) and set various defaults (1898-1900). */
|
|
497
|
+
const state = {
|
|
498
|
+
statAdd: new Array(STAT_MAX).fill(0),
|
|
499
|
+
statInd: new Array(STAT_MAX).fill(0),
|
|
500
|
+
statUse: new Array(STAT_MAX).fill(0),
|
|
501
|
+
statTop: new Array(STAT_MAX).fill(0),
|
|
502
|
+
skills: new Array(SKILL_MAX).fill(0),
|
|
503
|
+
speed: 110,
|
|
504
|
+
numBlows: 100,
|
|
505
|
+
numShots: 0,
|
|
506
|
+
numMoves: 0,
|
|
507
|
+
ammoMult: 0,
|
|
508
|
+
ammoTval: 0,
|
|
509
|
+
ac: 0,
|
|
510
|
+
damRed: 0,
|
|
511
|
+
percDamRed: 0,
|
|
512
|
+
toA: 0,
|
|
513
|
+
toH: 0,
|
|
514
|
+
toD: 0,
|
|
515
|
+
seeInfra: 0,
|
|
516
|
+
curLight: 0,
|
|
517
|
+
heavyWield: false,
|
|
518
|
+
heavyShoot: false,
|
|
519
|
+
blessWield: false,
|
|
520
|
+
cumberArmor: false,
|
|
521
|
+
flags: new FlagSet(OF_SIZE),
|
|
522
|
+
pflags: new FlagSet(PF_SIZE),
|
|
523
|
+
elInfo: [],
|
|
524
|
+
hold: 0,
|
|
525
|
+
};
|
|
526
|
+
/* Extract race/class info (1902-1914). */
|
|
527
|
+
state.seeInfra = race.infravision;
|
|
528
|
+
for (let i = 0; i < SKILL_MAX; i++) {
|
|
529
|
+
state.skills[i] = (race.skills[i] ?? 0) + (cls.skills[i] ?? 0);
|
|
530
|
+
}
|
|
531
|
+
const vuln = new Array(elemCount).fill(false);
|
|
532
|
+
for (let i = 0; i < elemCount; i++) {
|
|
533
|
+
const raceRes = race.elInfo[i]?.resLevel ?? 0;
|
|
534
|
+
if (raceRes === -1) {
|
|
535
|
+
vuln[i] = true;
|
|
536
|
+
state.elInfo.push({ resLevel: 0 });
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
state.elInfo.push({ resLevel: raceRes });
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
/* Base pflags (1916-1919). */
|
|
543
|
+
state.pflags.wipe();
|
|
544
|
+
state.pflags.copy(race.pflags);
|
|
545
|
+
state.pflags.union(cls.pflags);
|
|
546
|
+
/* Extract the player flags (1921-1922; player.c:290-300). */
|
|
547
|
+
const collectF = playerFlags(player);
|
|
548
|
+
/* Analyze equipment (1924-2025). Equipped objects arrive from the caller
|
|
549
|
+
(options.equipment, indexed by body slot). Each item's pval MODIFIERS are
|
|
550
|
+
gated by the player's learned-rune mask (p->obj_k->modifiers): upstream
|
|
551
|
+
multiplies every modifier by obj_k, so a bonus is inert until its rune is
|
|
552
|
+
known, and runes are UNKNOWN by default (PORT_PLAN.md decision 25) -- at
|
|
553
|
+
birth, item modifiers contribute nothing until learned. The el_info and
|
|
554
|
+
combat bonuses (to_a/to_h/to_d) are NOT rune-gated for the real state
|
|
555
|
+
(upstream gates those only for the displayed known_state), so they apply
|
|
556
|
+
unconditionally here.
|
|
557
|
+
|
|
558
|
+
Per-object curse traversal (2009-2023) IS ported: the inner while walks
|
|
559
|
+
from the worn item to each of its active curse objects, folding each
|
|
560
|
+
one's own template object (modifiers/flags/toH/toD/toA/elInfo) into the
|
|
561
|
+
state through the SAME loop body (applySource), in the exact upstream
|
|
562
|
+
accumulation order (worn item first, then its curses in ascending index
|
|
563
|
+
order). The curse template objects come from the bound registry
|
|
564
|
+
(options.curses == upstream's global curses[]); a curse object carries no
|
|
565
|
+
ac and no tval, matching the zeroed fields of the upstream curse struct
|
|
566
|
+
(curse ac is a guaranteed no-op, tval 0 makes tval_is_digger false).
|
|
567
|
+
Still DEFERRED (parity ledger): the learn-by-use rune system that
|
|
568
|
+
populates obj_k (obj-knowledge.c), pending its own increment. */
|
|
569
|
+
const equipment = options.equipment ?? [];
|
|
570
|
+
const curseTable = options.curses ?? [];
|
|
571
|
+
const knownMods = player.objKnown.modifiers;
|
|
572
|
+
const applySource = (src, isWeaponSlot, isBowSlot) => {
|
|
573
|
+
/* Extract the item flags (1933-1939). */
|
|
574
|
+
collectF.union(src.flags);
|
|
575
|
+
/* Apply modifiers (1941-1981), each multiplied by the learned-rune mask
|
|
576
|
+
(obj->modifiers[X] * p->obj_k->modifiers[X]). The five stat modifiers
|
|
577
|
+
share indices with STAT_* (OBJ_MOD_STR == STAT_STR == 0). */
|
|
578
|
+
for (let s = 0; s < STAT_MAX; s++) {
|
|
579
|
+
state.statAdd[s] =
|
|
580
|
+
(state.statAdd[s] ?? 0) + (src.modifiers[s] ?? 0) * (knownMods[s] ?? 0);
|
|
581
|
+
}
|
|
582
|
+
state.skills[SKILL.STEALTH] =
|
|
583
|
+
(state.skills[SKILL.STEALTH] ?? 0) +
|
|
584
|
+
(src.modifiers[OBJ_MOD.STEALTH] ?? 0) * (knownMods[OBJ_MOD.STEALTH] ?? 0);
|
|
585
|
+
state.skills[SKILL.SEARCH] =
|
|
586
|
+
(state.skills[SKILL.SEARCH] ?? 0) +
|
|
587
|
+
(src.modifiers[OBJ_MOD.SEARCH] ?? 0) * 5 * (knownMods[OBJ_MOD.SEARCH] ?? 0);
|
|
588
|
+
state.seeInfra +=
|
|
589
|
+
(src.modifiers[OBJ_MOD.INFRA] ?? 0) * (knownMods[OBJ_MOD.INFRA] ?? 0);
|
|
590
|
+
let dig = 0;
|
|
591
|
+
if (tvalIsDigger(src.tval)) {
|
|
592
|
+
if (src.flags.has(OF.DIG_1))
|
|
593
|
+
dig = 1;
|
|
594
|
+
else if (src.flags.has(OF.DIG_2))
|
|
595
|
+
dig = 2;
|
|
596
|
+
else if (src.flags.has(OF.DIG_3))
|
|
597
|
+
dig = 3;
|
|
598
|
+
}
|
|
599
|
+
dig += (src.modifiers[OBJ_MOD.TUNNEL] ?? 0) * (knownMods[OBJ_MOD.TUNNEL] ?? 0);
|
|
600
|
+
state.skills[SKILL.DIGGING] = (state.skills[SKILL.DIGGING] ?? 0) + dig * 20;
|
|
601
|
+
state.speed +=
|
|
602
|
+
(src.modifiers[OBJ_MOD.SPEED] ?? 0) * (knownMods[OBJ_MOD.SPEED] ?? 0);
|
|
603
|
+
state.damRed +=
|
|
604
|
+
(src.modifiers[OBJ_MOD.DAM_RED] ?? 0) * (knownMods[OBJ_MOD.DAM_RED] ?? 0);
|
|
605
|
+
extraBlows += (src.modifiers[OBJ_MOD.BLOWS] ?? 0) * (knownMods[OBJ_MOD.BLOWS] ?? 0);
|
|
606
|
+
extraShots += (src.modifiers[OBJ_MOD.SHOTS] ?? 0) * (knownMods[OBJ_MOD.SHOTS] ?? 0);
|
|
607
|
+
extraMight += (src.modifiers[OBJ_MOD.MIGHT] ?? 0) * (knownMods[OBJ_MOD.MIGHT] ?? 0);
|
|
608
|
+
extraMoves += (src.modifiers[OBJ_MOD.MOVES] ?? 0) * (knownMods[OBJ_MOD.MOVES] ?? 0);
|
|
609
|
+
/* Apply element info, noting vulnerabilities for later (1983-1993). */
|
|
610
|
+
for (let jj = 0; jj < elemCount; jj++) {
|
|
611
|
+
const oel = src.elInfo[jj];
|
|
612
|
+
const sel = state.elInfo[jj];
|
|
613
|
+
if (!oel)
|
|
614
|
+
continue;
|
|
615
|
+
if (oel.resLevel === -1)
|
|
616
|
+
vuln[jj] = true;
|
|
617
|
+
if (oel.resLevel > sel.resLevel)
|
|
618
|
+
sel.resLevel = oel.resLevel;
|
|
619
|
+
}
|
|
620
|
+
/* Apply combat bonuses (1995-2007). The wielded weapon's and launcher's
|
|
621
|
+
own to_h/to_d are applied at attack time, not here. A curse object's ac
|
|
622
|
+
is 0 (curse struct carries none). */
|
|
623
|
+
state.ac += src.ac;
|
|
624
|
+
state.toA += src.toA;
|
|
625
|
+
if (!isWeaponSlot && !isBowSlot) {
|
|
626
|
+
state.toH += src.toH;
|
|
627
|
+
state.toD += src.toD;
|
|
628
|
+
}
|
|
629
|
+
};
|
|
630
|
+
for (let i = 0; i < player.body.count; i++) {
|
|
631
|
+
const worn = equipment[i] ?? null;
|
|
632
|
+
if (!worn)
|
|
633
|
+
continue;
|
|
634
|
+
const slotType = player.body.slots[i]?.type;
|
|
635
|
+
const isWeaponSlot = slotType === "WEAPON";
|
|
636
|
+
const isBowSlot = slotType === "BOW";
|
|
637
|
+
/* weapon/launcher are the WORN items (upstream reads them by slot name
|
|
638
|
+
before the loop, 1885-1886); a curse object never becomes the weapon. */
|
|
639
|
+
if (isWeaponSlot)
|
|
640
|
+
weapon = worn;
|
|
641
|
+
if (isBowSlot)
|
|
642
|
+
launcher = worn;
|
|
643
|
+
/* curse := obj->curses, the worn item's curse_data array, held fixed while
|
|
644
|
+
we walk the item and its curse objects (1928, 2009-2023). */
|
|
645
|
+
const curse = worn.curses;
|
|
646
|
+
let obj = worn;
|
|
647
|
+
let index = 0;
|
|
648
|
+
while (obj) {
|
|
649
|
+
applySource(obj, isWeaponSlot, isBowSlot);
|
|
650
|
+
/* Move to any unprocessed curse object (2009-2023). Scan the worn item's
|
|
651
|
+
curse_data for the next active (power != 0) curse, resolving its
|
|
652
|
+
template object from the bound registry (curses[index].obj). The scan
|
|
653
|
+
bound is z_info->curse_max == curseTable.length. */
|
|
654
|
+
if (curse) {
|
|
655
|
+
index++;
|
|
656
|
+
obj = null;
|
|
657
|
+
while (index < curseTable.length) {
|
|
658
|
+
if (curse[index]?.power) {
|
|
659
|
+
const template = curseTable[index]?.obj;
|
|
660
|
+
obj = template
|
|
661
|
+
? {
|
|
662
|
+
flags: template.flags,
|
|
663
|
+
modifiers: template.modifiers,
|
|
664
|
+
elInfo: template.elInfo,
|
|
665
|
+
ac: 0,
|
|
666
|
+
toA: template.toA,
|
|
667
|
+
toH: template.toH,
|
|
668
|
+
toD: template.toD,
|
|
669
|
+
tval: 0,
|
|
670
|
+
}
|
|
671
|
+
: null;
|
|
672
|
+
break;
|
|
673
|
+
}
|
|
674
|
+
else {
|
|
675
|
+
index++;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
obj = null;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
/* Apply the collected flags (2027-2028). */
|
|
685
|
+
state.flags.union(collectF);
|
|
686
|
+
/* Add shapechange info (calc_shapechange, 1798/2030): a non-normal
|
|
687
|
+
shape's combat bonuses, skills, flags and modifiers stack on top of
|
|
688
|
+
the equipment, and its resists apply when better (vulnerabilities
|
|
689
|
+
join the vuln pass below). The normal shape is null (all zeros). */
|
|
690
|
+
const shape = player.shape;
|
|
691
|
+
if (shape) {
|
|
692
|
+
state.toA += shape.toA;
|
|
693
|
+
state.toH += shape.toH;
|
|
694
|
+
state.toD += shape.toD;
|
|
695
|
+
for (let i = 0; i < SKILL_MAX; i++) {
|
|
696
|
+
state.skills[i] = (state.skills[i] ?? 0) + (shape.skills[i] ?? 0);
|
|
697
|
+
}
|
|
698
|
+
state.flags.union(shape.flags);
|
|
699
|
+
state.pflags.union(shape.pflags);
|
|
700
|
+
for (let s = 0; s < STAT_MAX; s++) {
|
|
701
|
+
state.statAdd[s] = (state.statAdd[s] ?? 0) + (shape.modifiers[s] ?? 0);
|
|
702
|
+
}
|
|
703
|
+
state.skills[SKILL.STEALTH] =
|
|
704
|
+
(state.skills[SKILL.STEALTH] ?? 0) +
|
|
705
|
+
(shape.modifiers[OBJ_MOD.STEALTH] ?? 0);
|
|
706
|
+
state.skills[SKILL.SEARCH] =
|
|
707
|
+
(state.skills[SKILL.SEARCH] ?? 0) +
|
|
708
|
+
(shape.modifiers[OBJ_MOD.SEARCH] ?? 0) * 5;
|
|
709
|
+
state.seeInfra += shape.modifiers[OBJ_MOD.INFRA] ?? 0;
|
|
710
|
+
state.skills[SKILL.DIGGING] =
|
|
711
|
+
(state.skills[SKILL.DIGGING] ?? 0) +
|
|
712
|
+
(shape.modifiers[OBJ_MOD.TUNNEL] ?? 0) * 20;
|
|
713
|
+
state.speed += shape.modifiers[OBJ_MOD.SPEED] ?? 0;
|
|
714
|
+
state.damRed += shape.modifiers[OBJ_MOD.DAM_RED] ?? 0;
|
|
715
|
+
extraBlows += shape.modifiers[OBJ_MOD.BLOWS] ?? 0;
|
|
716
|
+
extraShots += shape.modifiers[OBJ_MOD.SHOTS] ?? 0;
|
|
717
|
+
extraMight += shape.modifiers[OBJ_MOD.MIGHT] ?? 0;
|
|
718
|
+
extraMoves += shape.modifiers[OBJ_MOD.MOVES] ?? 0;
|
|
719
|
+
/* Resists and vulnerabilities. */
|
|
720
|
+
for (let i = 0; i < elemCount; i++) {
|
|
721
|
+
const sel = state.elInfo[i];
|
|
722
|
+
const res = shape.elInfo[i]?.resLevel ?? 0;
|
|
723
|
+
if (res === -1)
|
|
724
|
+
vuln[i] = true;
|
|
725
|
+
else if (res > sel.resLevel)
|
|
726
|
+
sel.resLevel = res;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
/* Now deal with vulnerabilities (2034-2038). */
|
|
730
|
+
for (let i = 0; i < elemCount; i++) {
|
|
731
|
+
const el = state.elInfo[i];
|
|
732
|
+
if (vuln[i] && el.resLevel < 3)
|
|
733
|
+
el.resLevel--;
|
|
734
|
+
}
|
|
735
|
+
/* Calculate light (2040-2041). */
|
|
736
|
+
calcLight(player, state, options);
|
|
737
|
+
/* Unlight (2043-2046). */
|
|
738
|
+
const characterDungeon = options.characterDungeon ?? false;
|
|
739
|
+
if (state.pflags.has(PF.UNLIGHT) && characterDungeon) {
|
|
740
|
+
const el = state.elInfo[ELEM.DARK];
|
|
741
|
+
if (el)
|
|
742
|
+
el.resLevel = 1;
|
|
743
|
+
}
|
|
744
|
+
/* Evil (2048-2052). */
|
|
745
|
+
if (state.pflags.has(PF.EVIL) && characterDungeon) {
|
|
746
|
+
const nether = state.elInfo[ELEM.NETHER];
|
|
747
|
+
if (nether)
|
|
748
|
+
nether.resLevel = 1;
|
|
749
|
+
const holy = state.elInfo[ELEM.HOLY_ORB];
|
|
750
|
+
if (holy)
|
|
751
|
+
holy.resLevel = -1;
|
|
752
|
+
}
|
|
753
|
+
/* Calculate the various stat values (2054-2092). */
|
|
754
|
+
for (let i = 0; i < STAT_MAX; i++) {
|
|
755
|
+
let add = state.statAdd[i] ?? 0;
|
|
756
|
+
add += (race.statAdj[i] ?? 0) + (cls.statAdj[i] ?? 0);
|
|
757
|
+
state.statTop[i] = modifyStatValue(player.statMax[i] ?? 0, add);
|
|
758
|
+
const use = modifyStatValue(player.statCur[i] ?? 0, add);
|
|
759
|
+
state.statUse[i] = use;
|
|
760
|
+
let ind = statUseToIndex(use);
|
|
761
|
+
/* The !update hypothetical-blows index shift (2077-2088): applied only
|
|
762
|
+
when a caller supplies statIndBoost (obj-info's hypothetical re-derive);
|
|
763
|
+
the live refresh path leaves it undefined and takes the update=true
|
|
764
|
+
branch (no shift). */
|
|
765
|
+
const boost = options.statIndBoost;
|
|
766
|
+
if (boost) {
|
|
767
|
+
if (i === STAT.STR)
|
|
768
|
+
ind = Math.max(3, Math.min(37, ind + boost.str));
|
|
769
|
+
else if (i === STAT.DEX)
|
|
770
|
+
ind = Math.max(3, Math.min(37, ind + boost.dex));
|
|
771
|
+
}
|
|
772
|
+
state.statInd[i] = ind;
|
|
773
|
+
}
|
|
774
|
+
/* The timed model (FOOD 2094-2132 + the timed block 2134-2213) is gated on
|
|
775
|
+
the bound table being supplied. An empty table disables BOTH halves -- the
|
|
776
|
+
table-driven grade / flag / temp_resist logic AND the per-timer combat
|
|
777
|
+
branches -- so a caller that omits the table gets a consistent "no timed
|
|
778
|
+
effects" derive rather than a partial one (see CalcBonusesOptions). */
|
|
779
|
+
const timedEffects = options.timedEffects ?? [];
|
|
780
|
+
const update = options.update ?? true;
|
|
781
|
+
if (timedEffects.length > 0) {
|
|
782
|
+
/* Effects of food outside the "Fed" range (2094-2132). PY_FOOD_* are the
|
|
783
|
+
FOOD grade maxes (player-timed.c:320-338), already FOOD_VALUE-scaled in
|
|
784
|
+
the bound table: Fed.max = PY_FOOD_FULL, Full.max = PY_FOOD_MAX,
|
|
785
|
+
Hungry.max = PY_FOOD_HUNGRY. */
|
|
786
|
+
const foodEffect = timedEffects[TMD.FOOD];
|
|
787
|
+
if (foodEffect && !playerTimedGradeEq(player, foodEffect, "Fed")) {
|
|
788
|
+
const foodMax = (name) => foodEffect.grades.find((g) => g.name === name)?.max ?? 0;
|
|
789
|
+
const pyFoodFull = foodMax("Fed");
|
|
790
|
+
const pyFoodMax = foodMax("Full");
|
|
791
|
+
const pyFoodHungry = foodMax("Hungry");
|
|
792
|
+
const food = player.timed[TMD.FOOD] ?? 0;
|
|
793
|
+
const excess = food - pyFoodFull;
|
|
794
|
+
const lack = pyFoodHungry - food;
|
|
795
|
+
if (excess > 0 && !player.timed[TMD.ATT_VAMP]) {
|
|
796
|
+
/* Scale to units 1/10 of the range and subtract from speed. */
|
|
797
|
+
state.speed -= Math.trunc((excess * 10) / (pyFoodMax - pyFoodFull));
|
|
798
|
+
}
|
|
799
|
+
else if (lack > 0) {
|
|
800
|
+
/* Scale to units 1/20 of the range. */
|
|
801
|
+
const l = Math.trunc((lack * 20) / pyFoodHungry);
|
|
802
|
+
state.toH -= l;
|
|
803
|
+
state.toD -= l;
|
|
804
|
+
if (l > 10 && l <= 15) {
|
|
805
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 10, 0);
|
|
806
|
+
}
|
|
807
|
+
else if (l > 15 && l <= 18) {
|
|
808
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
|
|
809
|
+
state.skills[SKILL.DISARM_PHYS] =
|
|
810
|
+
Math.trunc(((state.skills[SKILL.DISARM_PHYS] ?? 0) * 9) / 10);
|
|
811
|
+
state.skills[SKILL.DISARM_MAGIC] =
|
|
812
|
+
Math.trunc(((state.skills[SKILL.DISARM_MAGIC] ?? 0) * 9) / 10);
|
|
813
|
+
}
|
|
814
|
+
else if (l > 18) {
|
|
815
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -3, 10, 0);
|
|
816
|
+
state.skills[SKILL.DISARM_PHYS] =
|
|
817
|
+
Math.trunc(((state.skills[SKILL.DISARM_PHYS] ?? 0) * 8) / 10);
|
|
818
|
+
state.skills[SKILL.DISARM_MAGIC] =
|
|
819
|
+
Math.trunc(((state.skills[SKILL.DISARM_MAGIC] ?? 0) * 8) / 10);
|
|
820
|
+
state.skills[SKILL.SAVE] =
|
|
821
|
+
Math.trunc(((state.skills[SKILL.SAVE] ?? 0) * 9) / 10);
|
|
822
|
+
state.skills[SKILL.SEARCH] =
|
|
823
|
+
Math.trunc(((state.skills[SKILL.SEARCH] ?? 0) * 9) / 10);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
/* Other timed effects (2134-2213). */
|
|
828
|
+
/* player_flags_timed (2135; player.c:310-320): OR each active effect's
|
|
829
|
+
oflag_dup into state.flags, except TMD_TRAPSAFE (excluded so the
|
|
830
|
+
OF_TRAP_IMMUNE learning hack can tell timed from innate). */
|
|
831
|
+
for (let i = 0; i < TMD_MAX; i++) {
|
|
832
|
+
const eff = timedEffects[i];
|
|
833
|
+
if (player.timed[i] &&
|
|
834
|
+
eff &&
|
|
835
|
+
eff.oflagDup !== 0 &&
|
|
836
|
+
i !== TMD.TRAPSAFE) {
|
|
837
|
+
state.flags.on(eff.oflagDup);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
/* STUN grade (2137-2151): the FASTCAST-zeroing is the one faithful
|
|
841
|
+
player.timed mutation this derive makes, gated on `update`. */
|
|
842
|
+
const stunEffect = timedEffects[TMD.STUN];
|
|
843
|
+
if (stunEffect && playerTimedGradeEq(player, stunEffect, "Heavy Stun")) {
|
|
844
|
+
state.toH -= 20;
|
|
845
|
+
state.toD -= 20;
|
|
846
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
|
|
847
|
+
if (update)
|
|
848
|
+
player.timed[TMD.FASTCAST] = 0;
|
|
849
|
+
}
|
|
850
|
+
else if (stunEffect && playerTimedGradeEq(player, stunEffect, "Stun")) {
|
|
851
|
+
state.toH -= 5;
|
|
852
|
+
state.toD -= 5;
|
|
853
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 10, 0);
|
|
854
|
+
if (update)
|
|
855
|
+
player.timed[TMD.FASTCAST] = 0;
|
|
856
|
+
}
|
|
857
|
+
if (player.timed[TMD.INVULN]) {
|
|
858
|
+
state.toA += 100;
|
|
859
|
+
}
|
|
860
|
+
if (player.timed[TMD.BLESSED]) {
|
|
861
|
+
state.toA += 5;
|
|
862
|
+
state.toH += 10;
|
|
863
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, 1, 20, 0);
|
|
864
|
+
}
|
|
865
|
+
if (player.timed[TMD.SHIELD]) {
|
|
866
|
+
state.toA += 50;
|
|
867
|
+
}
|
|
868
|
+
if (player.timed[TMD.STONESKIN]) {
|
|
869
|
+
state.toA += 40;
|
|
870
|
+
state.speed -= 5;
|
|
871
|
+
}
|
|
872
|
+
if (player.timed[TMD.HERO]) {
|
|
873
|
+
state.toH += 12;
|
|
874
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, 1, 20, 0);
|
|
875
|
+
}
|
|
876
|
+
if (player.timed[TMD.SHERO]) {
|
|
877
|
+
state.skills[SKILL.TO_HIT_MELEE] =
|
|
878
|
+
(state.skills[SKILL.TO_HIT_MELEE] ?? 0) + 75;
|
|
879
|
+
state.toA -= 10;
|
|
880
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 10, 0);
|
|
881
|
+
}
|
|
882
|
+
if (player.timed[TMD.FAST] || player.timed[TMD.SPRINT]) {
|
|
883
|
+
state.speed += 10;
|
|
884
|
+
}
|
|
885
|
+
if (player.timed[TMD.SLOW]) {
|
|
886
|
+
state.speed -= 10;
|
|
887
|
+
}
|
|
888
|
+
if (player.timed[TMD.SINFRA]) {
|
|
889
|
+
state.seeInfra += 5;
|
|
890
|
+
}
|
|
891
|
+
if (player.timed[TMD.TERROR]) {
|
|
892
|
+
state.speed += 10;
|
|
893
|
+
}
|
|
894
|
+
/* Temporary elemental resists (2188-2194): each active temp_resist effect
|
|
895
|
+
bumps its element's res_level by one, capped at 2 through this path. */
|
|
896
|
+
for (let i = 0; i < TMD_MAX; i++) {
|
|
897
|
+
const eff = timedEffects[i];
|
|
898
|
+
if (!player.timed[i] || !eff || eff.tempResist === -1)
|
|
899
|
+
continue;
|
|
900
|
+
const el = state.elInfo[eff.tempResist];
|
|
901
|
+
if (el && el.resLevel < 2)
|
|
902
|
+
el.resLevel++;
|
|
903
|
+
}
|
|
904
|
+
if (player.timed[TMD.CONFUSED]) {
|
|
905
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 4, 0);
|
|
906
|
+
}
|
|
907
|
+
if (player.timed[TMD.AMNESIA]) {
|
|
908
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
|
|
909
|
+
}
|
|
910
|
+
if (player.timed[TMD.POISONED]) {
|
|
911
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 20, 0);
|
|
912
|
+
}
|
|
913
|
+
if (player.timed[TMD.IMAGE]) {
|
|
914
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 5, 0);
|
|
915
|
+
}
|
|
916
|
+
if (player.timed[TMD.BLOODLUST]) {
|
|
917
|
+
const bl = player.timed[TMD.BLOODLUST] ?? 0;
|
|
918
|
+
state.toD += Math.trunc(bl / 2);
|
|
919
|
+
extraBlows += Math.trunc(bl / 20);
|
|
920
|
+
}
|
|
921
|
+
if (player.timed[TMD.STEALTH]) {
|
|
922
|
+
state.skills[SKILL.STEALTH] = (state.skills[SKILL.STEALTH] ?? 0) + 10;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
/* Analyze flags - check for fear (2215-2220). Innate flags can in
|
|
926
|
+
principle carry OF_AFRAID (mods), so the check is ported. */
|
|
927
|
+
if (state.flags.has(OF.AFRAID)) {
|
|
928
|
+
state.toH -= 20;
|
|
929
|
+
state.toA += 8;
|
|
930
|
+
state.skills[SKILL.DEVICE] = adjustSkillScale(state.skills[SKILL.DEVICE] ?? 0, -1, 20, 0);
|
|
931
|
+
}
|
|
932
|
+
/* Analyze weight (2222-2230). */
|
|
933
|
+
const j = player.upkeep.totalWeight;
|
|
934
|
+
const limit = weightLimit(state);
|
|
935
|
+
if (j > Math.trunc(limit / 2)) {
|
|
936
|
+
state.speed -=
|
|
937
|
+
Math.trunc((j - Math.trunc(limit / 2)) / Math.trunc(limit / 10));
|
|
938
|
+
}
|
|
939
|
+
if (state.speed < 0)
|
|
940
|
+
state.speed = 0;
|
|
941
|
+
if (state.speed > 199)
|
|
942
|
+
state.speed = 199;
|
|
943
|
+
/* Apply modifier bonuses (2232-2236). */
|
|
944
|
+
state.toA += at(adj_dex_ta, state.statInd[STAT.DEX] ?? 0);
|
|
945
|
+
state.toD += at(adj_str_td, state.statInd[STAT.STR] ?? 0);
|
|
946
|
+
state.toH += at(adj_dex_th, state.statInd[STAT.DEX] ?? 0);
|
|
947
|
+
state.toH += at(adj_str_th, state.statInd[STAT.STR] ?? 0);
|
|
948
|
+
/* Modify skills (2239-2250). */
|
|
949
|
+
applySkillStatAndLevel(state.skills, cls, player.lev, state.statInd);
|
|
950
|
+
state.hold = at(adj_str_hold, state.statInd[STAT.STR] ?? 0);
|
|
951
|
+
/* Analyze launcher (2254-2288). object_weight_one is per-item weight; a
|
|
952
|
+
wielded launcher has number 1. */
|
|
953
|
+
state.heavyShoot = false;
|
|
954
|
+
if (launcher) {
|
|
955
|
+
const launcherWeight = launcher.weight;
|
|
956
|
+
if (state.hold < Math.trunc(launcherWeight / 10)) {
|
|
957
|
+
state.toH += 2 * (state.hold - Math.trunc(launcherWeight / 10));
|
|
958
|
+
state.heavyShoot = true;
|
|
959
|
+
}
|
|
960
|
+
state.numShots = 10;
|
|
961
|
+
if (launcher.kind.kindFlags.has(KF.SHOOTS_SHOTS))
|
|
962
|
+
state.ammoTval = TV.SHOT;
|
|
963
|
+
else if (launcher.kind.kindFlags.has(KF.SHOOTS_ARROWS))
|
|
964
|
+
state.ammoTval = TV.ARROW;
|
|
965
|
+
else if (launcher.kind.kindFlags.has(KF.SHOOTS_BOLTS))
|
|
966
|
+
state.ammoTval = TV.BOLT;
|
|
967
|
+
state.ammoMult = launcher.pval;
|
|
968
|
+
if (!state.heavyShoot) {
|
|
969
|
+
state.numShots += extraShots;
|
|
970
|
+
state.ammoMult += extraMight;
|
|
971
|
+
if (state.pflags.has(PF.FAST_SHOT)) {
|
|
972
|
+
state.numShots += Math.trunc(player.lev / 3);
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
if (state.numShots < 10)
|
|
976
|
+
state.numShots = 10;
|
|
977
|
+
}
|
|
978
|
+
/* Analyze weapon (2291-2319). An empty weapon slot uses the unarmed branch
|
|
979
|
+
(2316-2319); a too-heavy weapon keeps num_blows at its 1-blow default. */
|
|
980
|
+
state.heavyWield = false;
|
|
981
|
+
state.blessWield = false;
|
|
982
|
+
if (weapon) {
|
|
983
|
+
const weaponWeight = weapon.weight;
|
|
984
|
+
if (state.hold < Math.trunc(weaponWeight / 10)) {
|
|
985
|
+
state.toH += 2 * (state.hold - Math.trunc(weaponWeight / 10));
|
|
986
|
+
state.heavyWield = true;
|
|
987
|
+
}
|
|
988
|
+
if (!state.heavyWield) {
|
|
989
|
+
state.numBlows = calcBlows(cls, weaponWeight, state.statInd[STAT.STR] ?? 0, state.statInd[STAT.DEX] ?? 0, extraBlows);
|
|
990
|
+
state.skills[SKILL.DIGGING] =
|
|
991
|
+
(state.skills[SKILL.DIGGING] ?? 0) + Math.trunc(weaponWeight / 10);
|
|
992
|
+
}
|
|
993
|
+
if (state.pflags.has(PF.BLESS_WEAPON) &&
|
|
994
|
+
(weapon.tval === TV.HAFTED || state.flags.has(OF.BLESSED))) {
|
|
995
|
+
state.toD += 2;
|
|
996
|
+
state.blessWield = true;
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
else {
|
|
1000
|
+
/* Unarmed (2316-2319). */
|
|
1001
|
+
state.numBlows = calcBlows(cls, null, state.statInd[STAT.STR] ?? 0, state.statInd[STAT.DEX] ?? 0, extraBlows);
|
|
1002
|
+
}
|
|
1003
|
+
/* Mana (2321-2325): calc_mana DEFERRED. The PF_NO_MANA check reads
|
|
1004
|
+
p->msp, which is 0 until calc_mana is ported (correct for warriors;
|
|
1005
|
+
see the ledger for the caster caveat). */
|
|
1006
|
+
if (!player.msp) {
|
|
1007
|
+
state.pflags.on(PF.NO_MANA);
|
|
1008
|
+
}
|
|
1009
|
+
/* Movement speed (2327-2328): num_moves = extra_moves. */
|
|
1010
|
+
state.numMoves = extraMoves;
|
|
1011
|
+
return state;
|
|
1012
|
+
}
|
|
1013
|
+
/**
|
|
1014
|
+
* earlier_object (player-calcs.c:934-1003): decide whether `next` should
|
|
1015
|
+
* replace `orig` as the object that comes earlier in the standard inventory
|
|
1016
|
+
* listing (returns true to replace). Ported statement-for-statement; the
|
|
1017
|
+
* globals earlier_object reads (player->state.ammo_tval, object_value,
|
|
1018
|
+
* object_flavor_is_aware, obj_can_browse) arrive through EarlierObjectOpts.
|
|
1019
|
+
* `pval` (light fuel) is read straight off the object.
|
|
1020
|
+
*/
|
|
1021
|
+
export function earlierObject(orig, next, opts = {}) {
|
|
1022
|
+
/* Check we have actual objects (938-940). */
|
|
1023
|
+
if (!next)
|
|
1024
|
+
return false;
|
|
1025
|
+
if (!orig)
|
|
1026
|
+
return true;
|
|
1027
|
+
const store = opts.store ?? false;
|
|
1028
|
+
const ammoTval = opts.ammoTval ?? 0;
|
|
1029
|
+
const value = opts.objectValue ?? (() => 0);
|
|
1030
|
+
const aware = opts.isAware ?? (() => true);
|
|
1031
|
+
const canBrowse = opts.canBrowse ?? (() => false);
|
|
1032
|
+
if (!store) {
|
|
1033
|
+
/* Readable books always come first (943-945). */
|
|
1034
|
+
if (canBrowse(orig) && !canBrowse(next))
|
|
1035
|
+
return false;
|
|
1036
|
+
if (!canBrowse(orig) && canBrowse(next))
|
|
1037
|
+
return true;
|
|
1038
|
+
}
|
|
1039
|
+
/* Usable ammo is before other ammo (948-956). */
|
|
1040
|
+
if (tvalIsAmmo(orig.tval) && tvalIsAmmo(next.tval)) {
|
|
1041
|
+
if (ammoTval === orig.tval && ammoTval !== next.tval)
|
|
1042
|
+
return false;
|
|
1043
|
+
if (ammoTval !== orig.tval && ammoTval === next.tval)
|
|
1044
|
+
return true;
|
|
1045
|
+
}
|
|
1046
|
+
/* Objects sort by decreasing type (959-961). */
|
|
1047
|
+
if (orig.tval > next.tval)
|
|
1048
|
+
return false;
|
|
1049
|
+
if (orig.tval < next.tval)
|
|
1050
|
+
return true;
|
|
1051
|
+
if (!store) {
|
|
1052
|
+
/* Non-aware (flavored) items always come last (966-969). */
|
|
1053
|
+
if (!aware(next))
|
|
1054
|
+
return false;
|
|
1055
|
+
if (!aware(orig))
|
|
1056
|
+
return true;
|
|
1057
|
+
}
|
|
1058
|
+
/* Objects sort by increasing sval (972-974). */
|
|
1059
|
+
if (orig.sval < next.sval)
|
|
1060
|
+
return false;
|
|
1061
|
+
if (orig.sval > next.sval)
|
|
1062
|
+
return true;
|
|
1063
|
+
if (!store) {
|
|
1064
|
+
/* Unaware objects always come last (977-979). The port marks a kind as
|
|
1065
|
+
* flavored by tval (tvalCanHaveFlavor), the same convention obj/value.ts and
|
|
1066
|
+
* obj/desc.ts use, since bound ObjectKind carries no flavor pointer. */
|
|
1067
|
+
if (tvalCanHaveFlavor(next.tval) && !aware(next))
|
|
1068
|
+
return false;
|
|
1069
|
+
if (tvalCanHaveFlavor(orig.tval) && !aware(orig))
|
|
1070
|
+
return true;
|
|
1071
|
+
/* Lights sort by decreasing fuel (982-985). */
|
|
1072
|
+
if (tvalIsLight(orig.tval)) {
|
|
1073
|
+
if (orig.pval > next.pval)
|
|
1074
|
+
return false;
|
|
1075
|
+
if (orig.pval < next.pval)
|
|
1076
|
+
return true;
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
/* Objects sort by decreasing value, except ammo which sorts increasing
|
|
1080
|
+
* (988-999). */
|
|
1081
|
+
if (tvalIsAmmo(orig.tval)) {
|
|
1082
|
+
if (value(orig) < value(next))
|
|
1083
|
+
return false;
|
|
1084
|
+
if (value(orig) > value(next))
|
|
1085
|
+
return true;
|
|
1086
|
+
}
|
|
1087
|
+
else {
|
|
1088
|
+
if (value(orig) > value(next))
|
|
1089
|
+
return false;
|
|
1090
|
+
if (value(orig) < value(next))
|
|
1091
|
+
return true;
|
|
1092
|
+
}
|
|
1093
|
+
/* No preference (1002). */
|
|
1094
|
+
return false;
|
|
1095
|
+
}
|
|
1096
|
+
/* ------------------------------------------------------------------ */
|
|
1097
|
+
/* Adapters for the combat and turn-loop consumers */
|
|
1098
|
+
/* ------------------------------------------------------------------ */
|
|
1099
|
+
/**
|
|
1100
|
+
* The player_state fields player-attack.c reads as p->state, shaped as
|
|
1101
|
+
* combat/melee.ts PlayerCombatState. The skills array is shared, not
|
|
1102
|
+
* copied: recompute the state rather than mutating it.
|
|
1103
|
+
*/
|
|
1104
|
+
export function toCombatState(state) {
|
|
1105
|
+
return {
|
|
1106
|
+
toH: state.toH,
|
|
1107
|
+
toD: state.toD,
|
|
1108
|
+
ac: state.ac,
|
|
1109
|
+
toA: state.toA,
|
|
1110
|
+
skills: state.skills,
|
|
1111
|
+
numBlows: state.numBlows,
|
|
1112
|
+
ammoMult: state.ammoMult,
|
|
1113
|
+
numShots: state.numShots,
|
|
1114
|
+
ammoTval: state.ammoTval,
|
|
1115
|
+
blessWield: state.blessWield,
|
|
1116
|
+
};
|
|
1117
|
+
}
|
|
1118
|
+
/**
|
|
1119
|
+
* The player_state fields mon-attack.c reads (p->state.ac + p->state.to_a),
|
|
1120
|
+
* shaped as combat/mon-melee.ts DefenderState.
|
|
1121
|
+
*/
|
|
1122
|
+
export function toDefenderState(state) {
|
|
1123
|
+
return { ac: state.ac, toA: state.toA };
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* calc_bonuses' state-change notices (player-calcs.c:2412-2453): the messages
|
|
1127
|
+
* upstream emits when heavy_shoot / heavy_wield / bless_wield / cumber_armor
|
|
1128
|
+
* flip between the OLD p->state and the NEWLY derived state, in upstream's
|
|
1129
|
+
* order. Returns the lines to emit, so the diff stays pure and testable and the
|
|
1130
|
+
* session layer owns the message sink.
|
|
1131
|
+
*
|
|
1132
|
+
* calcBonuses itself cannot do this: it is a pure derive that never sees the
|
|
1133
|
+
* previous state (upstream reads p->state, messages, and only then memcpy's the
|
|
1134
|
+
* new one over it). That is why every one of these ten messages was missing -
|
|
1135
|
+
* the derive was ported and the diff at the end of the same function was not, so
|
|
1136
|
+
* wielding a weapon far too heavy for your STR said nothing at all.
|
|
1137
|
+
*
|
|
1138
|
+
* Upstream gates the whole block on !p->upkeep->only_partial. The port has no
|
|
1139
|
+
* partial-update mode - the hypothetical derives (best-digger, item inspection)
|
|
1140
|
+
* pass update:false and simply never reach this - so there is no flag to test.
|
|
1141
|
+
*/
|
|
1142
|
+
export function bonusChangeMessages(prev, next, gear) {
|
|
1143
|
+
const out = [];
|
|
1144
|
+
/* "heavy bow" (2413-2422). */
|
|
1145
|
+
if (prev.heavyShoot !== next.heavyShoot) {
|
|
1146
|
+
if (next.heavyShoot) {
|
|
1147
|
+
out.push("You have trouble wielding such a heavy bow.");
|
|
1148
|
+
}
|
|
1149
|
+
else if (gear.hasLauncher) {
|
|
1150
|
+
out.push("You have no trouble wielding your bow.");
|
|
1151
|
+
}
|
|
1152
|
+
else {
|
|
1153
|
+
out.push("You feel relieved to put down your heavy bow.");
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
/* "heavy weapon" (2424-2433). */
|
|
1157
|
+
if (prev.heavyWield !== next.heavyWield) {
|
|
1158
|
+
if (next.heavyWield) {
|
|
1159
|
+
out.push("You have trouble wielding such a heavy weapon.");
|
|
1160
|
+
}
|
|
1161
|
+
else if (gear.hasWeapon) {
|
|
1162
|
+
out.push("You have no trouble wielding your weapon.");
|
|
1163
|
+
}
|
|
1164
|
+
else {
|
|
1165
|
+
out.push("You feel relieved to put down your heavy weapon.");
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
/* "illegal weapon" - a priest wielding an unblessed edged weapon
|
|
1169
|
+
* (2435-2443). Note the asymmetry: upstream emits nothing when the offending
|
|
1170
|
+
* weapon is simply removed, so there is no third branch here. */
|
|
1171
|
+
if (prev.blessWield !== next.blessWield) {
|
|
1172
|
+
if (next.blessWield) {
|
|
1173
|
+
out.push("You feel attuned to your weapon.");
|
|
1174
|
+
}
|
|
1175
|
+
else if (gear.hasWeapon) {
|
|
1176
|
+
out.push("You feel less attuned to your weapon.");
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
/* "armor state" (2445-2452). */
|
|
1180
|
+
if (prev.cumberArmor !== next.cumberArmor) {
|
|
1181
|
+
out.push(next.cumberArmor
|
|
1182
|
+
? "The weight of your armor reduces your maximum SP."
|
|
1183
|
+
: "Your maximum SP is no longer reduced by armor weight.");
|
|
1184
|
+
}
|
|
1185
|
+
return out;
|
|
1186
|
+
}
|
|
1187
|
+
/** Re-export for callers computing HP arrays over all levels. */
|
|
1188
|
+
export { PY_MAX_LEVEL };
|
|
1189
|
+
//# sourceMappingURL=calcs.js.map
|