@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,1037 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The player's gear store: the world/UI-owned side of carried objects.
|
|
3
|
+
*
|
|
4
|
+
* The parity Player (player/player.ts) deliberately omits struct player's
|
|
5
|
+
* gear list, keeping only equipment[] as per-body-slot object HANDLES
|
|
6
|
+
* (0 = empty). This module owns the objects those handles point at: a
|
|
7
|
+
* handle -> GameObject store plus an ordered pack of non-equipped handles.
|
|
8
|
+
* It ports the equipment/carry substrate and the birth starting-kit from
|
|
9
|
+
* reference/src/obj-gear.c (slot_by_type, wield_slot, inven_carry) and
|
|
10
|
+
* reference/src/player-birth.c (wield_all, player_outfit) (Angband 4.2.6).
|
|
11
|
+
*
|
|
12
|
+
* LIVE vs DEFERRED (ledgered in parity/ledger/game-gear.yaml):
|
|
13
|
+
* - LIVE: slot_by_type (empty-preferring), wield_slot (full tval switch),
|
|
14
|
+
* inven_carry's merge-or-add with quiver stack-mode routing, wield_all's
|
|
15
|
+
* split-and-wear, player_outfit's start-item roll + prep + carry + wield
|
|
16
|
+
* (birth_start_kit + eopts exclusion honoured), the real quiver subsystem
|
|
17
|
+
* (object_is_in_quiver, preferred_quiver_slot, quiver_absorb_num,
|
|
18
|
+
* calc_inventory's quiver assignment, pack_slots_used quiver accounting),
|
|
19
|
+
* combine_pack + inven_can_stack_partial, and minus_ac armour damage,
|
|
20
|
+
* pack_is_full / pack_is_overfull (the pack_size overflow enforcement itself,
|
|
21
|
+
* pack_overflow, needs drop_near and so lives in game/obj-cmd.ts next to the
|
|
22
|
+
* other obj-gear.c verbs that touch the floor).
|
|
23
|
+
* - DEFERRED: the display knowledge twin (obj->known) and equip_cnt UI
|
|
24
|
+
* counter. The pack-side inven[] listing is a derived view rather than the
|
|
25
|
+
* source of truth: gear.pack keeps master-gear insertion order while
|
|
26
|
+
* gear.inven reproduces calc_inventory's earlier_object ordering. Wielding DOES learn modifier runes
|
|
27
|
+
* (obj-knowledge.c object_learn_on_wield); see obj/knowledge.ts.
|
|
28
|
+
*/
|
|
29
|
+
import { ELEM, OF, ORIGIN, TV } from "../generated/index.js";
|
|
30
|
+
import { tvalFindIdx } from "../obj/bind.js";
|
|
31
|
+
import { learnBirthObviousFlags, objectLearnOnWield, OBJ_NOTICE } from "../obj/knowledge.js";
|
|
32
|
+
import { distributeCharges, objectAbsorb, objectAbsorbPartial, objectMergeable, objectStackable, OSTACK_PACK, OSTACK_QUIVER, tvalCanHaveCharges, tvalCanHaveTimeout, tvalIsAmmo, tvalIsBodyArmor, tvalIsFood, tvalIsHeadArmor, tvalIsLight, tvalIsMeleeWeapon, tvalIsMoney, tvalIsRing, tvalIsRod, } from "../obj/object.js";
|
|
33
|
+
import { EL_INFO_IGNORE } from "../obj/types.js";
|
|
34
|
+
import { objectPrep } from "../obj/make.js";
|
|
35
|
+
import { objectValueReal } from "../obj/value.js";
|
|
36
|
+
import { earlierObject } from "../player/calcs.js";
|
|
37
|
+
/** A fresh, empty gear store (empty quiver; calcInventory sizes it). */
|
|
38
|
+
export function newGear() {
|
|
39
|
+
return { store: new Map(), next: 1, pack: [], inven: [], quiver: [] };
|
|
40
|
+
}
|
|
41
|
+
/** Store an object under a fresh handle and return it (no pack insertion). */
|
|
42
|
+
export function gearAdd(gear, obj) {
|
|
43
|
+
const handle = gear.next;
|
|
44
|
+
gear.next += 1;
|
|
45
|
+
gear.store.set(handle, obj);
|
|
46
|
+
return handle;
|
|
47
|
+
}
|
|
48
|
+
/** The object for a handle, or null (0 / unknown handle -> null). */
|
|
49
|
+
export function gearGet(gear, handle) {
|
|
50
|
+
return gear.store.get(handle) ?? null;
|
|
51
|
+
}
|
|
52
|
+
/* ------------------------------------------------------------------ */
|
|
53
|
+
/* obj-util.c object copy / split */
|
|
54
|
+
/* ------------------------------------------------------------------ */
|
|
55
|
+
/**
|
|
56
|
+
* object_copy (obj-util.c): a faithful deep copy of the live struct. The
|
|
57
|
+
* known twin and pile links are not part of GameObject (deferred), and
|
|
58
|
+
* kind/ego/artifact/activation/effect stay shared references exactly as
|
|
59
|
+
* upstream's memcpy leaves them.
|
|
60
|
+
*/
|
|
61
|
+
function objectCopy(src) {
|
|
62
|
+
return {
|
|
63
|
+
...src,
|
|
64
|
+
flags: src.flags.clone(),
|
|
65
|
+
modifiers: [...src.modifiers],
|
|
66
|
+
elInfo: src.elInfo.map((e) => ({ resLevel: e.resLevel, flags: e.flags })),
|
|
67
|
+
brands: src.brands ? [...src.brands] : null,
|
|
68
|
+
slays: src.slays ? [...src.slays] : null,
|
|
69
|
+
curses: src.curses
|
|
70
|
+
? src.curses.map((c) => ({ power: c.power, timeout: c.timeout }))
|
|
71
|
+
: null,
|
|
72
|
+
time: { ...src.time },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* object_split (obj-util.c): split `amt` items off `src` into a fresh copy,
|
|
77
|
+
* distributing wand/staff/rod charges, and reduce src by amt. Requires
|
|
78
|
+
* src.number > amt (upstream assert). Exported for the floor-pile module
|
|
79
|
+
* (floor_object_for_use splits floor stacks the same way).
|
|
80
|
+
*/
|
|
81
|
+
export function objectSplit(src, amt) {
|
|
82
|
+
const dest = objectCopy(src);
|
|
83
|
+
/* Distribute charges of wands, staves, or rods (dest is a new stack). */
|
|
84
|
+
distributeCharges(src, dest, amt, true);
|
|
85
|
+
dest.number = amt;
|
|
86
|
+
src.number -= amt;
|
|
87
|
+
if (src.note)
|
|
88
|
+
dest.note = src.note;
|
|
89
|
+
return dest;
|
|
90
|
+
}
|
|
91
|
+
/* ------------------------------------------------------------------ */
|
|
92
|
+
/* obj-gear.c slot logic */
|
|
93
|
+
/* ------------------------------------------------------------------ */
|
|
94
|
+
/**
|
|
95
|
+
* slot_by_type (obj-gear.c L71-93): the index of a slot of the given type,
|
|
96
|
+
* preferring an empty one (full = false) or a full one (full = true), else
|
|
97
|
+
* any matching-type slot, else body.count when none exists.
|
|
98
|
+
*
|
|
99
|
+
* Upstream reads body.slots[i].obj to decide full/empty; here a slot is
|
|
100
|
+
* "filled" when equipment[i] !== 0, so the equipment array is passed in.
|
|
101
|
+
*/
|
|
102
|
+
function slotByType(body, equipment, type, full) {
|
|
103
|
+
let fallback = body.count;
|
|
104
|
+
let i = 0;
|
|
105
|
+
for (; i < body.count; i++) {
|
|
106
|
+
if (type === body.slots[i].type) {
|
|
107
|
+
const filled = (equipment[i] ?? 0) !== 0;
|
|
108
|
+
if (full) {
|
|
109
|
+
/* Found a full slot */
|
|
110
|
+
if (filled)
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
/* Found an empty slot */
|
|
115
|
+
if (!filled)
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
/* Not right for full/empty, but still the right type */
|
|
119
|
+
if (fallback === body.count)
|
|
120
|
+
fallback = i;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/* Index for the best slot we found, or body.count if none found. */
|
|
124
|
+
return i !== body.count ? i : fallback;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* wield_slot (obj-gear.c L341-367): the equipment slot an object of the
|
|
128
|
+
* given tval likes (an open slot preferred for rings), or -1 for a
|
|
129
|
+
* non-wearable tval.
|
|
130
|
+
*
|
|
131
|
+
* `equipment` (optional, defaults to all-empty) lets the empty-slot
|
|
132
|
+
* preference work; wieldObject/wieldAll pass the player's real equipment
|
|
133
|
+
* so a second ring lands in the free hand, matching upstream.
|
|
134
|
+
*/
|
|
135
|
+
export function wieldSlot(body, tval, equipment) {
|
|
136
|
+
const eq = equipment ?? new Array(body.count).fill(0);
|
|
137
|
+
switch (tval) {
|
|
138
|
+
case TV.BOW:
|
|
139
|
+
return slotByType(body, eq, "BOW", false);
|
|
140
|
+
case TV.AMULET:
|
|
141
|
+
return slotByType(body, eq, "AMULET", false);
|
|
142
|
+
case TV.CLOAK:
|
|
143
|
+
return slotByType(body, eq, "CLOAK", false);
|
|
144
|
+
case TV.SHIELD:
|
|
145
|
+
return slotByType(body, eq, "SHIELD", false);
|
|
146
|
+
case TV.GLOVES:
|
|
147
|
+
return slotByType(body, eq, "GLOVES", false);
|
|
148
|
+
case TV.BOOTS:
|
|
149
|
+
return slotByType(body, eq, "BOOTS", false);
|
|
150
|
+
default:
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
if (tvalIsMeleeWeapon(tval))
|
|
154
|
+
return slotByType(body, eq, "WEAPON", false);
|
|
155
|
+
if (tvalIsRing(tval))
|
|
156
|
+
return slotByType(body, eq, "RING", false);
|
|
157
|
+
if (tvalIsLight(tval))
|
|
158
|
+
return slotByType(body, eq, "LIGHT", false);
|
|
159
|
+
if (tvalIsBodyArmor(tval))
|
|
160
|
+
return slotByType(body, eq, "BODY_ARMOR", false);
|
|
161
|
+
if (tvalIsHeadArmor(tval))
|
|
162
|
+
return slotByType(body, eq, "HAT", false);
|
|
163
|
+
/* No slot available */
|
|
164
|
+
return -1;
|
|
165
|
+
}
|
|
166
|
+
/* ------------------------------------------------------------------ */
|
|
167
|
+
/* Quiver membership and slot preference (obj-gear.c) */
|
|
168
|
+
/* ------------------------------------------------------------------ */
|
|
169
|
+
/**
|
|
170
|
+
* object_is_in_quiver (obj-gear.c L163-174): is the object referenced by
|
|
171
|
+
* `handle` currently held in one of the computed quiver slots? A zero handle
|
|
172
|
+
* (empty slot / no object) is never in the quiver.
|
|
173
|
+
*/
|
|
174
|
+
export function objectIsInQuiver(gear, handle) {
|
|
175
|
+
if (handle === 0)
|
|
176
|
+
return false;
|
|
177
|
+
return (gear.quiver ?? []).includes(handle);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* preferred_quiver_slot (obj-gear.c L1396-1427): the quiver slot an object's
|
|
181
|
+
* inscription asks for, or -1 when it is not quiver-appropriate or not
|
|
182
|
+
* inscribed with a matching @f/@v (fire / throw) key. The fire key depends on
|
|
183
|
+
* the keyset: 't' under rogue-like commands, else 'f'; the throw key is always
|
|
184
|
+
* 'v' (upstream hardwires these because cmd_lookup_key is in the UI layer).
|
|
185
|
+
*/
|
|
186
|
+
export function preferredQuiverSlot(obj, rogueLike = false) {
|
|
187
|
+
let desiredSlot = -1;
|
|
188
|
+
if (obj.note && (tvalIsAmmo(obj.tval) || obj.flags.has(OF.THROWING))) {
|
|
189
|
+
const fireKey = rogueLike ? "t" : "f";
|
|
190
|
+
const throwKey = "v";
|
|
191
|
+
let s = obj.note.indexOf("@");
|
|
192
|
+
while (s !== -1) {
|
|
193
|
+
const k = obj.note[s + 1];
|
|
194
|
+
if (k === fireKey || k === throwKey) {
|
|
195
|
+
/* s[2] - '0': the single digit slot after the key. */
|
|
196
|
+
desiredSlot = (obj.note.charCodeAt(s + 2) || 0) - "0".charCodeAt(0);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
s = obj.note.indexOf("@", s + 1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return desiredSlot;
|
|
203
|
+
}
|
|
204
|
+
/* ------------------------------------------------------------------ */
|
|
205
|
+
/* minus_ac (obj-gear.c L376-438) */
|
|
206
|
+
/* ------------------------------------------------------------------ */
|
|
207
|
+
/** The non-armour equipment slot types minus_ac skips (obj-gear.c L387-391). */
|
|
208
|
+
function slotIsArmour(type) {
|
|
209
|
+
return (type !== undefined &&
|
|
210
|
+
type !== "WEAPON" &&
|
|
211
|
+
type !== "BOW" &&
|
|
212
|
+
type !== "RING" &&
|
|
213
|
+
type !== "AMULET" &&
|
|
214
|
+
type !== "LIGHT");
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* minus_ac (obj-gear.c L376-438): acid has hit the player, so attempt to
|
|
218
|
+
* damage a piece of worn armour. Counts the armour slots, draws one at random
|
|
219
|
+
* with the exact upstream reverse one_in_(count--) scan, and (if that item can
|
|
220
|
+
* still lose armour) either reports it resists (EL_INFO_IGNORE on ELEM_ACID)
|
|
221
|
+
* or decrements its to_a and prints the damage message. Returns whether there
|
|
222
|
+
* was any effect (a piece was picked and had ac + to_a > 0), matching upstream
|
|
223
|
+
* so the caller can halve the elemental damage.
|
|
224
|
+
*
|
|
225
|
+
* The RNG draw order is preserved bit-for-bit: the forward count loop, then
|
|
226
|
+
* the reverse pick loop consuming one_in_(count--) per armour slot until it
|
|
227
|
+
* breaks. `obj->known->to_a = obj->to_a` (L425-426) is DEFERRED - the port has
|
|
228
|
+
* no per-object known twin (obj-knowledge #4.8); obj_k->to_a is 1 at birth so
|
|
229
|
+
* the real to_a is already the shown value.
|
|
230
|
+
*/
|
|
231
|
+
export function minusAc(player, gear, rng, env = {}) {
|
|
232
|
+
const body = player.body;
|
|
233
|
+
/* Avoid crash during monster power calculations (L382): no gear, no effect. */
|
|
234
|
+
if (gear.pack.length === 0 && player.equipment.every((h) => h === 0)) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
/* Count the armour slots (L384-395). */
|
|
238
|
+
let count = 0;
|
|
239
|
+
for (let i = 0; i < body.count; i++) {
|
|
240
|
+
if (slotIsArmour(body.slots[i]?.type))
|
|
241
|
+
count++;
|
|
242
|
+
}
|
|
243
|
+
/* Pick one at random with the reverse one_in_(count--) scan (L397-407). */
|
|
244
|
+
let picked = body.count;
|
|
245
|
+
for (let i = body.count - 1; i >= 0; i--) {
|
|
246
|
+
if (!slotIsArmour(body.slots[i]?.type))
|
|
247
|
+
continue;
|
|
248
|
+
if (rng.oneIn(count--)) {
|
|
249
|
+
picked = i;
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/* Get the item in the picked slot (L410). */
|
|
254
|
+
const handle = picked < body.count ? (player.equipment[picked] ?? 0) : 0;
|
|
255
|
+
const obj = handle !== 0 ? (gear.store.get(handle) ?? null) : null;
|
|
256
|
+
/* If we can still damage the item (L412-433). */
|
|
257
|
+
if (obj && obj.ac + obj.toA > 0) {
|
|
258
|
+
const name = env.describe ? env.describe(obj) : obj.kind.name;
|
|
259
|
+
const acidEl = obj.elInfo[ELEM.ACID];
|
|
260
|
+
if (acidEl && (acidEl.flags & EL_INFO_IGNORE) !== 0) {
|
|
261
|
+
env.msg?.(`Your ${name} is unaffected!`);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
env.msg?.(`Your ${name} is damaged!`);
|
|
265
|
+
obj.toA--;
|
|
266
|
+
/* DEFERRED: obj->known->to_a = obj->to_a (no known twin, #4.8). */
|
|
267
|
+
env.updateBonuses?.(); /* PU_BONUS */
|
|
268
|
+
}
|
|
269
|
+
/* There was an effect. */
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
/* No damage or effect (L435-436). */
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
/** inven_carry plus the C `combining` bit needed by pickup awareness. */
|
|
276
|
+
export function invenCarryResult(gear, obj, limits) {
|
|
277
|
+
/* Check for combining with an existing non-equipped stack. */
|
|
278
|
+
for (const handle of gear.pack) {
|
|
279
|
+
const stack = gear.store.get(handle);
|
|
280
|
+
const mode = objectIsInQuiver(gear, handle) ? OSTACK_QUIVER : OSTACK_PACK;
|
|
281
|
+
if (stack && objectMergeable(stack, obj, mode, limits)) {
|
|
282
|
+
objectAbsorb(stack, obj, ORIGIN.MIXED);
|
|
283
|
+
return { handle, combining: true };
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/* We did not find an object to combine with: add a new pack handle. */
|
|
287
|
+
const handle = gearAdd(gear, obj);
|
|
288
|
+
gear.pack.push(handle);
|
|
289
|
+
return { handle, combining: false };
|
|
290
|
+
}
|
|
291
|
+
export function invenCarry(gear, obj, limits) {
|
|
292
|
+
return invenCarryResult(gear, obj, limits).handle;
|
|
293
|
+
}
|
|
294
|
+
/* ------------------------------------------------------------------ */
|
|
295
|
+
/* inven_carry_num / object_copy_amt / gear_object_for_use */
|
|
296
|
+
/* ------------------------------------------------------------------ */
|
|
297
|
+
/**
|
|
298
|
+
* pack_slots_used (obj-gear.c L257-296): the number of pack slots occupied.
|
|
299
|
+
* Equipped items don't count (they are absent from `pack`); ammo / throwing
|
|
300
|
+
* items assigned to the quiver aggregate by weighted count into quiver slots
|
|
301
|
+
* of quiver_slot_size, so a non-empty quiver frees up whole pack slots. When
|
|
302
|
+
* the quiver is empty this equals pack.length (every item is a pack slot).
|
|
303
|
+
*/
|
|
304
|
+
export function packSlotsUsed(gear, constants) {
|
|
305
|
+
let packSlots = 0;
|
|
306
|
+
let quiverAmmo = 0;
|
|
307
|
+
for (const handle of gear.pack) {
|
|
308
|
+
const obj = gear.store.get(handle);
|
|
309
|
+
if (!obj)
|
|
310
|
+
continue;
|
|
311
|
+
let found = false;
|
|
312
|
+
if (tvalIsAmmo(obj.tval) || obj.flags.has(OF.THROWING)) {
|
|
313
|
+
if (objectIsInQuiver(gear, handle)) {
|
|
314
|
+
quiverAmmo +=
|
|
315
|
+
obj.number * (tvalIsAmmo(obj.tval) ? 1 : constants.thrownQuiverMult);
|
|
316
|
+
found = true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/* Count regular slots. */
|
|
320
|
+
if (!found)
|
|
321
|
+
packSlots++;
|
|
322
|
+
}
|
|
323
|
+
/* Full slots, plus one for any remainder. */
|
|
324
|
+
packSlots += Math.trunc(quiverAmmo / constants.quiverSlotSize);
|
|
325
|
+
if (quiverAmmo % constants.quiverSlotSize)
|
|
326
|
+
packSlots++;
|
|
327
|
+
return packSlots;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* pack_is_full (obj-gear.c L1328-1331): the pack holds exactly the maximum
|
|
331
|
+
* number of items.
|
|
332
|
+
*/
|
|
333
|
+
export function packIsFull(gear, constants) {
|
|
334
|
+
return packSlotsUsed(gear, constants) === constants.packSize;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* pack_is_overfull (obj-gear.c L1337-1340): the pack holds MORE than the
|
|
338
|
+
* maximum, so pack_overflow (game/obj-cmd.ts) will shed an item.
|
|
339
|
+
*/
|
|
340
|
+
export function packIsOverfull(gear, constants) {
|
|
341
|
+
return packSlotsUsed(gear, constants) > constants.packSize;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* quiver_absorb_num (obj-gear.c L649-744): how many of `obj` the quiver can
|
|
345
|
+
* take, and how many additional pack slots that costs. Reads the current
|
|
346
|
+
* computed quiver (gear.quiver) exactly as upstream reads p->upkeep->quiver.
|
|
347
|
+
* `nAddPack` is the number of extra pack slots the quiver may claim; the return
|
|
348
|
+
* carries the leftover (nAddPack minus the slots consumed) alongside nToQuiver.
|
|
349
|
+
*/
|
|
350
|
+
export function quiverAbsorbNum(gear, obj, constants, nAddPack, rogueLike = false) {
|
|
351
|
+
const ammo = tvalIsAmmo(obj.tval);
|
|
352
|
+
/* Must be ammo or good for throwing (L655). */
|
|
353
|
+
if (ammo || obj.flags.has(OF.THROWING)) {
|
|
354
|
+
let quiverCount = 0;
|
|
355
|
+
let spaceFree = 0;
|
|
356
|
+
let nEmpty = 0;
|
|
357
|
+
const desiredSlot = preferredQuiverSlot(obj, rogueLike);
|
|
358
|
+
let displaces = false;
|
|
359
|
+
const qSize = constants.quiverSize;
|
|
360
|
+
const qSlot = constants.quiverSlotSize;
|
|
361
|
+
const quiver = gear.quiver ?? [];
|
|
362
|
+
/* Count the current space this object could go into (L660-710). */
|
|
363
|
+
for (let i = 0; i < qSize; i++) {
|
|
364
|
+
const qHandle = quiver[i] ?? 0;
|
|
365
|
+
const quiverObj = qHandle !== 0 ? gear.store.get(qHandle) : undefined;
|
|
366
|
+
if (quiverObj) {
|
|
367
|
+
const mult = tvalIsAmmo(quiverObj.tval) ? 1 : constants.thrownQuiverMult;
|
|
368
|
+
quiverCount += quiverObj.number * mult;
|
|
369
|
+
if (objectStackable(quiverObj, obj, OSTACK_PACK)) {
|
|
370
|
+
spaceFree += qSlot - quiverObj.number * mult;
|
|
371
|
+
}
|
|
372
|
+
else if (desiredSlot === i &&
|
|
373
|
+
preferredQuiverSlot(quiverObj, rogueLike) !== i) {
|
|
374
|
+
/* The added object prefers this slot, but it is occupied by a stack
|
|
375
|
+
* that could be displaced elsewhere if a slot is available. */
|
|
376
|
+
displaces = true;
|
|
377
|
+
if (ammo) {
|
|
378
|
+
spaceFree += qSlot - quiverObj.number * mult;
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
spaceFree += qSlot;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
nEmpty++;
|
|
387
|
+
/* Ammo fits any empty slot; a non-ammo throwing item only its
|
|
388
|
+
* preferred slot (L699-708). */
|
|
389
|
+
if (ammo || desiredSlot === i) {
|
|
390
|
+
spaceFree += qSlot;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/* Only addable if there is free space and we either displace a pile with an
|
|
395
|
+
* empty slot available or don't displace at all (L712-738). */
|
|
396
|
+
if (spaceFree && ((displaces && nEmpty) || !displaces)) {
|
|
397
|
+
const mult = ammo ? 1 : constants.thrownQuiverMult;
|
|
398
|
+
const remainder = quiverCount % qSlot;
|
|
399
|
+
let limitFromPack = remainder ? qSlot - remainder : 0;
|
|
400
|
+
if (nAddPack > 0)
|
|
401
|
+
limitFromPack += nAddPack * qSlot;
|
|
402
|
+
spaceFree = Math.min(spaceFree, limitFromPack);
|
|
403
|
+
const nToQuiver = Math.min(obj.number, Math.trunc(spaceFree / mult));
|
|
404
|
+
const usedPack = nAddPack -
|
|
405
|
+
Math.trunc((nToQuiver * mult + qSlot - 1 - remainder) / qSlot);
|
|
406
|
+
return { nToQuiver, nAddPack: usedPack };
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/* Not suitable for the quiver or no space (L742-743). */
|
|
410
|
+
return { nToQuiver: 0, nAddPack };
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* inven_carry_num (obj-gear.c L749-780): how many of `obj` the gear can accept
|
|
414
|
+
* across quiver and pack. The quiver absorbs what it can first; then a free
|
|
415
|
+
* pack slot takes the rest, or the remainder squeezes into partially-full
|
|
416
|
+
* stackable pack slots.
|
|
417
|
+
*/
|
|
418
|
+
export function invenCarryNum(gear, obj, constants) {
|
|
419
|
+
/* Treasure can always be picked up (never reached via a store). */
|
|
420
|
+
if (tvalIsMoney(obj.tval))
|
|
421
|
+
return obj.number;
|
|
422
|
+
const nFreeSlot = constants.packSize - packSlotsUsed(gear, constants);
|
|
423
|
+
/* Absorb as many as we can in the quiver (L760). quiver_absorb_num DECREMENTS
|
|
424
|
+
* the free-slot count by the pack slots the quiver expands into (via
|
|
425
|
+
* &n_free_slot); the port returns that decremented value as nAddPack. GR-01:
|
|
426
|
+
* the >0 test must use the decremented nAddPack, not the pre-call nFreeSlot,
|
|
427
|
+
* or capacity is over-reported when the quiver eats free pack slots but still
|
|
428
|
+
* cannot hold the whole stack. */
|
|
429
|
+
const { nToQuiver, nAddPack } = quiverAbsorbNum(gear, obj, constants, nFreeSlot);
|
|
430
|
+
/* The quiver will get everything, or the pack can hold what's left (L763). */
|
|
431
|
+
if (nToQuiver === obj.number || nAddPack > 0)
|
|
432
|
+
return obj.number;
|
|
433
|
+
/* See if we can add to partially-full inventory slots (L767-776). GR-02:
|
|
434
|
+
* upstream iterates p->upkeep->inven[], which EXCLUDES ammo already sitting
|
|
435
|
+
* in the quiver; gear.pack still carries those handles, so a stackable
|
|
436
|
+
* quiver ammo stack would be double-counted as pack free space. Skip any
|
|
437
|
+
* handle that is in the quiver. */
|
|
438
|
+
let numLeft = obj.number - nToQuiver;
|
|
439
|
+
for (const handle of gear.pack) {
|
|
440
|
+
if (objectIsInQuiver(gear, handle))
|
|
441
|
+
continue;
|
|
442
|
+
const stack = gear.store.get(handle);
|
|
443
|
+
if (stack && objectStackable(stack, obj, OSTACK_PACK)) {
|
|
444
|
+
numLeft -= stack.kind.base.maxStack - stack.number;
|
|
445
|
+
if (numLeft <= 0)
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return obj.number - Math.max(numLeft, 0);
|
|
450
|
+
}
|
|
451
|
+
/** Build EarlierObjectOpts (ammo tiebreak) from the calc-inventory opts. */
|
|
452
|
+
function earlierOpts(opts) {
|
|
453
|
+
const e = { store: false };
|
|
454
|
+
if (opts.ammoTval !== undefined)
|
|
455
|
+
e.ammoTval = opts.ammoTval;
|
|
456
|
+
if (opts.objectValue)
|
|
457
|
+
e.objectValue = opts.objectValue;
|
|
458
|
+
if (opts.isAware)
|
|
459
|
+
e.isAware = opts.isAware;
|
|
460
|
+
if (opts.canBrowse)
|
|
461
|
+
e.canBrowse = opts.canBrowse;
|
|
462
|
+
return e;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* calc_inventory (player-calcs.c:1023-1238): rebuild gear.quiver and the
|
|
466
|
+
* separate sorted gear.inven listing. `gear.pack` remains the raw master-gear
|
|
467
|
+
* order, so changing this derived view cannot destabilize combine/split logic.
|
|
468
|
+
* from the current non-equipped gear. First place inscribed items in their
|
|
469
|
+
* preferred slots (splitting a stack that overflows quiver_slot_size, with the
|
|
470
|
+
* excess going back to the pack), then fill the remaining slots in earlier_object
|
|
471
|
+
* order with ammo. Then select each remaining non-quiver handle in
|
|
472
|
+
* earlier_object order, exactly as upstream fills upkeep->inven[].
|
|
473
|
+
*
|
|
474
|
+
* Split remainders are appended to gear.pack via object_split, exactly as
|
|
475
|
+
* upstream's gear_insert_end. `n_stack_split <= n_pack_remaining` guards splits
|
|
476
|
+
* so the pack can overflow by at most one slot, matching upstream.
|
|
477
|
+
*/
|
|
478
|
+
export function calcInventory(gear, constants, opts = {}) {
|
|
479
|
+
const qSize = constants.quiverSize;
|
|
480
|
+
const qSlot = constants.quiverSlotSize;
|
|
481
|
+
const rogueLike = opts.rogueLike ?? false;
|
|
482
|
+
let nStackSplit = 0;
|
|
483
|
+
const nPackRemaining = constants.packSize - packSlotsUsed(gear, constants);
|
|
484
|
+
/* Copy the current quiver, then empty it (L1053-1061). */
|
|
485
|
+
const oldQuiver = [];
|
|
486
|
+
for (let i = 0; i < qSize; i++)
|
|
487
|
+
oldQuiver[i] = gear.quiver?.[i] ?? 0;
|
|
488
|
+
const quiver = new Array(qSize).fill(0);
|
|
489
|
+
gear.quiver = quiver;
|
|
490
|
+
const assigned = new Set();
|
|
491
|
+
/* Fill quiver. First, allocate inscribed items (L1063-1117). */
|
|
492
|
+
for (const handle of [...gear.pack]) {
|
|
493
|
+
const current = gear.store.get(handle);
|
|
494
|
+
if (!current)
|
|
495
|
+
continue;
|
|
496
|
+
const prefslot = preferredQuiverSlot(current, rogueLike);
|
|
497
|
+
if (prefslot >= 0 && prefslot < qSize && (quiver[prefslot] ?? 0) === 0) {
|
|
498
|
+
const mult = tvalIsAmmo(current.tval) ? 1 : constants.thrownQuiverMult;
|
|
499
|
+
let toQuiver = false;
|
|
500
|
+
if (current.number * mult <= qSlot) {
|
|
501
|
+
toQuiver = true;
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
const nsplit = Math.trunc(qSlot / mult);
|
|
505
|
+
if (nsplit > 0 && nStackSplit <= nPackRemaining) {
|
|
506
|
+
/* Split off the portion that goes to the pack; the quiver stack is
|
|
507
|
+
* earlier in the gear list so it stays preferred (L1091-1102). */
|
|
508
|
+
const rem = objectSplit(current, current.number - nsplit);
|
|
509
|
+
gear.pack.push(gearAdd(gear, rem));
|
|
510
|
+
nStackSplit++;
|
|
511
|
+
toQuiver = true;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
if (toQuiver) {
|
|
515
|
+
quiver[prefslot] = handle;
|
|
516
|
+
assigned.add(handle);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/* Now fill the rest of the slots in order (L1119-1172). */
|
|
521
|
+
for (let i = 0; i < qSize; i++) {
|
|
522
|
+
if ((quiver[i] ?? 0) !== 0)
|
|
523
|
+
continue;
|
|
524
|
+
let first = null;
|
|
525
|
+
let firstHandle = 0;
|
|
526
|
+
for (const handle of gear.pack) {
|
|
527
|
+
if (assigned.has(handle))
|
|
528
|
+
continue;
|
|
529
|
+
const current = gear.store.get(handle);
|
|
530
|
+
if (!current || !tvalIsAmmo(current.tval))
|
|
531
|
+
continue;
|
|
532
|
+
/* Only assign if, when a split is needed, there is room for it. */
|
|
533
|
+
if (current.number <= qSlot ||
|
|
534
|
+
(qSlot > 0 && nStackSplit <= nPackRemaining)) {
|
|
535
|
+
if (earlierObject(first, current, earlierOpts(opts))) {
|
|
536
|
+
first = current;
|
|
537
|
+
firstHandle = handle;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
/* Nothing left in the gear. */
|
|
542
|
+
if (!first)
|
|
543
|
+
break;
|
|
544
|
+
/* Put it in the slot, splitting (if needed) to fit (L1159-1168). */
|
|
545
|
+
if (first.number > qSlot) {
|
|
546
|
+
const rem = objectSplit(first, first.number - qSlot);
|
|
547
|
+
gear.pack.push(gearAdd(gear, rem));
|
|
548
|
+
nStackSplit++;
|
|
549
|
+
}
|
|
550
|
+
quiver[i] = firstHandle;
|
|
551
|
+
assigned.add(firstHandle);
|
|
552
|
+
}
|
|
553
|
+
/* Note reordering (L1174-1182). */
|
|
554
|
+
if (opts.characterDungeon) {
|
|
555
|
+
for (let i = 0; i < qSize; i++) {
|
|
556
|
+
if ((oldQuiver[i] ?? 0) !== 0 && quiver[i] !== oldQuiver[i]) {
|
|
557
|
+
opts.msg?.("You re-arrange your quiver.");
|
|
558
|
+
break;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/* Copy the current pack (L1183-1186) and remember how full it was (L1025),
|
|
563
|
+
* both read only by the re-arrange notice below. */
|
|
564
|
+
const oldInvenCnt = (gear.inven ?? []).length;
|
|
565
|
+
const oldPack = [...(gear.inven ?? [])];
|
|
566
|
+
/* Fill upkeep->inven[] (player-calcs.c:1191-1222). Do not sort pack in
|
|
567
|
+
* place: C's p->gear remains its own linked-list order and inven[] is only
|
|
568
|
+
* a listing. Repeated first-selection (rather than Array.sort()) faithfully
|
|
569
|
+
* preserves master-gear order when earlier_object has no preference. */
|
|
570
|
+
const inven = [];
|
|
571
|
+
const invenAssigned = new Set(quiver.filter((h) => h !== 0));
|
|
572
|
+
for (;;) {
|
|
573
|
+
let first = null;
|
|
574
|
+
let firstHandle = 0;
|
|
575
|
+
for (const handle of gear.pack) {
|
|
576
|
+
if (invenAssigned.has(handle))
|
|
577
|
+
continue;
|
|
578
|
+
const current = gear.store.get(handle);
|
|
579
|
+
if (current && earlierObject(first, current, earlierOpts(opts))) {
|
|
580
|
+
first = current;
|
|
581
|
+
firstHandle = handle;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
if (!first)
|
|
585
|
+
break;
|
|
586
|
+
inven.push(firstHandle);
|
|
587
|
+
invenAssigned.add(firstHandle);
|
|
588
|
+
}
|
|
589
|
+
gear.inven = inven;
|
|
590
|
+
/* Note reordering (L1224-1233). The quiver half of this notice was ported;
|
|
591
|
+
* the pack half was not, so shuffling the pack was silent. Only fires when
|
|
592
|
+
* the pack holds the SAME number of items as before (L1225) - a pickup or a
|
|
593
|
+
* drop reorders it too, and upstream does not call that a re-arrangement. */
|
|
594
|
+
if (opts.characterDungeon && inven.length === oldInvenCnt) {
|
|
595
|
+
for (let i = 0; i < constants.packSize; i++) {
|
|
596
|
+
const was = oldPack[i] ?? 0;
|
|
597
|
+
if (was === 0)
|
|
598
|
+
continue;
|
|
599
|
+
if (inven[i] === was)
|
|
600
|
+
continue;
|
|
601
|
+
if (opts.isEquipped?.(was))
|
|
602
|
+
continue;
|
|
603
|
+
opts.msg?.("You re-arrange your pack.");
|
|
604
|
+
break;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* inven_can_stack_partial (obj-gear.c L1183-1236): can obj1 and obj2 be merged
|
|
610
|
+
* into two uneven stacks, with obj1 the (maximised) leading stack? Refuses when
|
|
611
|
+
* obj1 is already at its per-stack limit, and (for a quiver->pack move) when the
|
|
612
|
+
* quiver has no room, to avoid combining then re-splitting in calc_inventory.
|
|
613
|
+
*/
|
|
614
|
+
function invenCanStackPartial(gear, obj1, obj2, mode1, mode2, constants) {
|
|
615
|
+
const cmode = mode1 | mode2;
|
|
616
|
+
if (!objectStackable(obj1, obj2, cmode))
|
|
617
|
+
return false;
|
|
618
|
+
/* Verify the numbers suit uneven stacks (L1196-1233). OSTACK_STORE absorbs
|
|
619
|
+
* without limit; the port's combine_pack never passes it. */
|
|
620
|
+
if (mode1 & OSTACK_QUIVER) {
|
|
621
|
+
const qlimit = Math.trunc(constants.quiverSlotSize /
|
|
622
|
+
(tvalIsAmmo(obj1.tval) ? 1 : constants.thrownQuiverMult));
|
|
623
|
+
if (obj1.number === qlimit)
|
|
624
|
+
return false;
|
|
625
|
+
/* Moving items INTO the quiver: also check the overall quiver limits. */
|
|
626
|
+
if (mode2 & ~OSTACK_QUIVER) {
|
|
627
|
+
const nFreeSlot = constants.packSize - packSlotsUsed(gear, constants);
|
|
628
|
+
const { nToQuiver } = quiverAbsorbNum(gear, obj2, constants, nFreeSlot);
|
|
629
|
+
if (nToQuiver <= 0)
|
|
630
|
+
return false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
else if (obj1.number === obj1.kind.base.maxStack) {
|
|
634
|
+
return false;
|
|
635
|
+
}
|
|
636
|
+
return true;
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* combine_pack (obj-gear.c L1242-1323): sweep the gear from the back, merging
|
|
640
|
+
* each stack fully into an earlier compatible stack where possible, else moving
|
|
641
|
+
* items between stacks into two uneven stacks (inven_can_stack_partial). Runs
|
|
642
|
+
* calc_inventory afterward. Returns whether any full combine happened (upstream
|
|
643
|
+
* shows "You combine some items in your pack." and disables command repeat).
|
|
644
|
+
*/
|
|
645
|
+
export function combinePack(gear, constants, opts = {}) {
|
|
646
|
+
const limits = {
|
|
647
|
+
quiverSlotSize: constants.quiverSlotSize,
|
|
648
|
+
thrownQuiverMult: constants.thrownQuiverMult,
|
|
649
|
+
};
|
|
650
|
+
let displayMessage = false;
|
|
651
|
+
/* Combine the pack (backwards) over a snapshot; removals mutate gear.pack. */
|
|
652
|
+
for (const h1 of [...gear.pack].reverse()) {
|
|
653
|
+
const obj1 = gear.store.get(h1);
|
|
654
|
+
if (!obj1)
|
|
655
|
+
continue;
|
|
656
|
+
const idx1 = gear.pack.indexOf(h1);
|
|
657
|
+
if (idx1 < 0)
|
|
658
|
+
continue;
|
|
659
|
+
/* Scan the items above obj1 (L1256). */
|
|
660
|
+
for (let k = 0; k < idx1; k++) {
|
|
661
|
+
const h2 = gear.pack[k];
|
|
662
|
+
const obj2 = gear.store.get(h2);
|
|
663
|
+
if (!obj2)
|
|
664
|
+
continue;
|
|
665
|
+
const mode2 = objectIsInQuiver(gear, h2) ? OSTACK_QUIVER : OSTACK_PACK;
|
|
666
|
+
if (objectMergeable(obj2, obj1, mode2, limits)) {
|
|
667
|
+
objectAbsorb(obj2, obj1, ORIGIN.MIXED);
|
|
668
|
+
gear.pack.splice(idx1, 1);
|
|
669
|
+
gear.store.delete(h1);
|
|
670
|
+
displayMessage = true;
|
|
671
|
+
break;
|
|
672
|
+
}
|
|
673
|
+
const mode1 = objectIsInQuiver(gear, h1) ? OSTACK_QUIVER : OSTACK_PACK;
|
|
674
|
+
if (invenCanStackPartial(gear, obj2, obj1, mode2, mode1, constants)) {
|
|
675
|
+
/* Shuffling items between stacks - no message (L1282-1287). */
|
|
676
|
+
objectAbsorbPartial(obj2, obj1, mode2, mode1, limits, ORIGIN.MIXED);
|
|
677
|
+
break;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
calcInventory(gear, constants, opts);
|
|
682
|
+
if (displayMessage)
|
|
683
|
+
opts.msg?.("You combine some items in your pack.");
|
|
684
|
+
return displayMessage;
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* object_copy_amt (obj-pile.c L743): a fresh copy of `src` holding `amt`
|
|
688
|
+
* items, with wand/staff charges and rod/activation timeouts scaled to the
|
|
689
|
+
* split (source unchanged). The AVERAGE charge time is deterministic.
|
|
690
|
+
*/
|
|
691
|
+
export function objectCopyAmt(src, amt) {
|
|
692
|
+
const dest = objectCopy(src);
|
|
693
|
+
dest.number = amt;
|
|
694
|
+
if (tvalCanHaveCharges(src.tval)) {
|
|
695
|
+
dest.pval = Math.trunc((src.pval * amt) / src.number);
|
|
696
|
+
}
|
|
697
|
+
if (tvalCanHaveTimeout(src.tval)) {
|
|
698
|
+
/* randcalc(src->time, 0, AVERAGE). */
|
|
699
|
+
const t = src.time;
|
|
700
|
+
const chargeTime = t.base + Math.trunc((t.dice * (t.sides + 1)) / 2);
|
|
701
|
+
const maxTime = chargeTime * amt;
|
|
702
|
+
dest.timeout = src.timeout > maxTime ? maxTime : src.timeout;
|
|
703
|
+
}
|
|
704
|
+
return dest;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* gear_to_label's label alphabet (obj-gear.c:446): a-z minus the roguelike
|
|
708
|
+
* cardinal-movement keys h/j/k/l, then A-Z. An equipment slot index and a pack
|
|
709
|
+
* LISTING index both index straight into it (L452, L465).
|
|
710
|
+
*/
|
|
711
|
+
export const GEAR_LABELS = "abcdefgimnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
712
|
+
/**
|
|
713
|
+
* gear_to_label (obj-gear.c:443-469): the one-character label for a held object -
|
|
714
|
+
* an equipment slot letter, a quiver slot digit (I2D), or a pack listing letter.
|
|
715
|
+
* "" when the handle is not currently held, upstream's '\0'.
|
|
716
|
+
*
|
|
717
|
+
* THE LISTING, NOT THE STORAGE ORDER. Upstream's pack arm reads
|
|
718
|
+
* `p->upkeep->inven[]` (L462-466) - the earlier_object-sorted view calc_inventory
|
|
719
|
+
* builds and every inventory display walks - NOT the master gear list. The port
|
|
720
|
+
* had three copies of this function (game/project-obj.ts, game/obj-cmd.ts,
|
|
721
|
+
* game/known.ts) and all three read `gear.pack`, the raw storage order, because
|
|
722
|
+
* they were written while `gear.inven` was still an unbuilt stand-in. calcInventory
|
|
723
|
+
* has filled `inven` for some time, so every one of them was quoting a letter the
|
|
724
|
+
* pack listing disagreed with: pick up a scroll into raw slot 8 of a pack that
|
|
725
|
+
* sorts it fourth and the message says (i) while the item is at (e) and (i) holds
|
|
726
|
+
* whatever sorted eighth. Same defect class as #92, one layer further in - the
|
|
727
|
+
* listings were fixed and the MESSAGES about them were not.
|
|
728
|
+
*
|
|
729
|
+
* Deliberately reads `inven` with no fallback to `pack`. A wrong letter is worse
|
|
730
|
+
* than a missing one: it sends the player to another item, and no census can see
|
|
731
|
+
* it because the slot is filled (paraphrase-is-a-deviation). If `inven` is stale
|
|
732
|
+
* the caller has skipped upstream's PU_INVEN/update_stuff, which is a bug to fix
|
|
733
|
+
* at that caller - gear-label-freshness.test.ts asserts the invariant holds after
|
|
734
|
+
* every gear mutation the live session performs.
|
|
735
|
+
*
|
|
736
|
+
* `equipment` is optional because most callers hold a Gear and no Player; a pack
|
|
737
|
+
* or quiver handle is never in equipment[], so omitting it cannot mislabel one.
|
|
738
|
+
*/
|
|
739
|
+
export function gearToLabel(gear, handle, equipment) {
|
|
740
|
+
/* Equipment is easy (L450-453). */
|
|
741
|
+
if (equipment) {
|
|
742
|
+
const eq = equipment.indexOf(handle);
|
|
743
|
+
if (eq >= 0)
|
|
744
|
+
return GEAR_LABELS[eq] ?? "";
|
|
745
|
+
}
|
|
746
|
+
/* Check the quiver (L455-460). */
|
|
747
|
+
const qi = gear.quiver?.indexOf(handle) ?? -1;
|
|
748
|
+
if (qi >= 0)
|
|
749
|
+
return String(qi);
|
|
750
|
+
/* Check the inventory (L462-466). */
|
|
751
|
+
const pi = (gear.inven ?? []).indexOf(handle);
|
|
752
|
+
if (pi >= 0 && pi < GEAR_LABELS.length)
|
|
753
|
+
return GEAR_LABELS[pi];
|
|
754
|
+
return "";
|
|
755
|
+
}
|
|
756
|
+
/**
|
|
757
|
+
* The p->gear view object_pack_total walks, built from the live gear.
|
|
758
|
+
*
|
|
759
|
+
* Upstream iterates all of p->gear and lets object_similar reject the equipped
|
|
760
|
+
* entries; the port's objectSimilar has the equipped test deferred (obj/object.ts
|
|
761
|
+
* module docs), so the view is built from the non-equipped handles instead. The
|
|
762
|
+
* resulting SET is the same, which is all object_pack_total reads.
|
|
763
|
+
*/
|
|
764
|
+
export function packTotalView(gear) {
|
|
765
|
+
const objs = [];
|
|
766
|
+
const labels = new Map();
|
|
767
|
+
for (const handle of gear.pack) {
|
|
768
|
+
const obj = gear.store.get(handle);
|
|
769
|
+
if (!obj)
|
|
770
|
+
continue;
|
|
771
|
+
objs.push(obj);
|
|
772
|
+
labels.set(obj, gearToLabel(gear, handle));
|
|
773
|
+
}
|
|
774
|
+
return {
|
|
775
|
+
gear: objs,
|
|
776
|
+
/* Never: the view holds only non-equipped handles (see above). */
|
|
777
|
+
isEquipped: () => false,
|
|
778
|
+
gearToLabel: (obj) => labels.get(obj) ?? "",
|
|
779
|
+
};
|
|
780
|
+
}
|
|
781
|
+
/**
|
|
782
|
+
* Whether upstream suppresses the split-stack aggregate for this object.
|
|
783
|
+
*
|
|
784
|
+
* A charges count or "recharging" notice in the description belongs to ONE
|
|
785
|
+
* stack, so aggregating the number across stacks would contradict the notice
|
|
786
|
+
* printed beside it. Upstream repeats this test verbatim at every aggregate
|
|
787
|
+
* site - gear_object_for_use (obj-gear.c L550-556, L583-589), inven_carry
|
|
788
|
+
* (L899-901) and inven_drop (L1138-1140) - the last two of which also test
|
|
789
|
+
* object_is_equipped, which the callers here add because inven_carry does not.
|
|
790
|
+
*/
|
|
791
|
+
export function packTotalSuppressed(obj) {
|
|
792
|
+
return tvalCanHaveCharges(obj.tval) || tvalIsRod(obj.tval) || obj.timeout > 0;
|
|
793
|
+
}
|
|
794
|
+
/**
|
|
795
|
+
* Detach `handle` (or the free equipment/pack slot holding it) from the
|
|
796
|
+
* gear. A pack handle is removed from the ordered pack; an equipped handle
|
|
797
|
+
* clears its body slot. Either way the handle leaves the store map.
|
|
798
|
+
*/
|
|
799
|
+
function gearExcise(gear, player, handle) {
|
|
800
|
+
/* Clear any stale quiver reference (calc_inventory rebuilds it). */
|
|
801
|
+
if (gear.quiver) {
|
|
802
|
+
const qi = gear.quiver.indexOf(handle);
|
|
803
|
+
if (qi >= 0)
|
|
804
|
+
gear.quiver[qi] = 0;
|
|
805
|
+
}
|
|
806
|
+
const pi = gear.pack.indexOf(handle);
|
|
807
|
+
if (pi >= 0) {
|
|
808
|
+
gear.pack.splice(pi, 1);
|
|
809
|
+
gear.store.delete(handle);
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
const si = player.equipment.indexOf(handle);
|
|
813
|
+
if (si >= 0) {
|
|
814
|
+
player.equipment[si] = 0;
|
|
815
|
+
gear.store.delete(handle);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
/**
|
|
819
|
+
* gear_object_for_use (obj-gear.c L524): remove `amt` items of the gear
|
|
820
|
+
* object referenced by `handle`, returning a detached object to hand off.
|
|
821
|
+
* When part of a stack is taken, the remainder stays under `handle` and a
|
|
822
|
+
* fresh split is returned (noneLeft=false); when the whole stack is taken,
|
|
823
|
+
* the original is excised (noneLeft=true). The total_weight upkeep and the
|
|
824
|
+
* knowledge twin are DEFERRED (see the module ledger).
|
|
825
|
+
*/
|
|
826
|
+
export function gearObjectForUse(gear, player, handle, amt) {
|
|
827
|
+
const obj = gear.store.get(handle);
|
|
828
|
+
if (!obj)
|
|
829
|
+
throw new Error(`gearObjectForUse: no object for handle ${handle}`);
|
|
830
|
+
const num = Math.min(amt, obj.number);
|
|
831
|
+
/* Split off a usable object if we are not taking the whole stack. */
|
|
832
|
+
if (obj.number > num) {
|
|
833
|
+
const usable = objectSplit(obj, num);
|
|
834
|
+
return { obj: usable, noneLeft: false };
|
|
835
|
+
}
|
|
836
|
+
/* Using the entire stack. */
|
|
837
|
+
gearExcise(gear, player, handle);
|
|
838
|
+
return { obj, noneLeft: true };
|
|
839
|
+
}
|
|
840
|
+
/**
|
|
841
|
+
* Wield the pack object with the given handle into its liked slot. If the
|
|
842
|
+
* stack has more than one item it is split, following `split` (see
|
|
843
|
+
* WieldSplit - the two upstream callers differ). Returns the filled slot, or
|
|
844
|
+
* -1 if the object cannot be wielded or the slot is already occupied. Read
|
|
845
|
+
* `player.equipment[slot]` for the handle that ended up worn: under
|
|
846
|
+
* "inven_wield" a split stack equips a FRESH handle, not `handle`.
|
|
847
|
+
*
|
|
848
|
+
* object_learn_on_wield runs the instant the item is worn (as in wield_all
|
|
849
|
+
* and inven_wield), so a worn item's modifier runes become known and its
|
|
850
|
+
* pval bonuses go live at once. The equip_cnt UI counter is DEFERRED.
|
|
851
|
+
*
|
|
852
|
+
* `intoSlot` is the slot ARGUMENT upstream's inven_wield takes
|
|
853
|
+
* (`void inven_wield(struct object *obj, int slot)`, obj-gear.c:931): the caller
|
|
854
|
+
* decides the destination and inven_wield never recomputes it. That matters for
|
|
855
|
+
* rings - do_cmd_wield asks "Replace which ring? " and then overwrites slot with
|
|
856
|
+
* `equipped_item_slot(player->body, equip_obj)` (cmd-obj.c:309), so re-deriving
|
|
857
|
+
* it here would silently discard the hand the player picked. Omit it to keep the
|
|
858
|
+
* wield_slot default (wield_all and every non-choosing caller).
|
|
859
|
+
*/
|
|
860
|
+
export function wieldObject(gear, player, handle, env, split = "wield_all", intoSlot) {
|
|
861
|
+
const obj = gear.store.get(handle);
|
|
862
|
+
if (!obj)
|
|
863
|
+
return -1;
|
|
864
|
+
const slot = intoSlot !== undefined
|
|
865
|
+
? intoSlot
|
|
866
|
+
: wieldSlot(player.body, obj.tval, player.equipment);
|
|
867
|
+
if (slot < 0 || slot >= player.body.count)
|
|
868
|
+
return -1;
|
|
869
|
+
if ((player.equipment[slot] ?? 0) !== 0)
|
|
870
|
+
return -1;
|
|
871
|
+
/* Split if necessary. */
|
|
872
|
+
let wieldedHandle = handle;
|
|
873
|
+
let wielded = obj;
|
|
874
|
+
if (obj.number > 1) {
|
|
875
|
+
if (split === "inven_wield") {
|
|
876
|
+
/* One item off the stack becomes the worn object; the original stays
|
|
877
|
+
* put in the pack holding number - 1 (obj-gear.c L947-968). */
|
|
878
|
+
wielded = objectSplit(obj, 1);
|
|
879
|
+
wieldedHandle = gearAdd(gear, wielded);
|
|
880
|
+
}
|
|
881
|
+
else {
|
|
882
|
+
/* All but one go back to the pack as a new stack at the END
|
|
883
|
+
* (player-birth.c L484-491 + L502-505). */
|
|
884
|
+
const remainder = objectSplit(obj, obj.number - 1);
|
|
885
|
+
gear.pack.push(gearAdd(gear, remainder));
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
/* Remove the wielded handle from the pack and wear it. A fresh
|
|
889
|
+
* "inven_wield" split was never in the pack, so the splice no-ops and the
|
|
890
|
+
* original keeps its listing position. */
|
|
891
|
+
const idx = gear.pack.indexOf(wieldedHandle);
|
|
892
|
+
if (idx >= 0)
|
|
893
|
+
gear.pack.splice(idx, 1);
|
|
894
|
+
player.equipment[slot] = wieldedHandle;
|
|
895
|
+
/* Learn the runes that wearing makes obvious (obj-knowledge.c wield_all
|
|
896
|
+
* L494-495). With an env the full obvious-flag/curse learning runs; the
|
|
897
|
+
* env-less path (birth outfit, worldless tests) learns the modifier
|
|
898
|
+
* runes, so worn pval bonuses apply immediately either way. */
|
|
899
|
+
objectLearnOnWield(player, wielded, env);
|
|
900
|
+
return slot;
|
|
901
|
+
}
|
|
902
|
+
/**
|
|
903
|
+
* wield_all (player-birth.c L462-507): try to wield everything wieldable in
|
|
904
|
+
* the pack. Scans a snapshot of the current pack handles (so the split-off
|
|
905
|
+
* remainders added during the pass are not re-scanned, matching upstream's
|
|
906
|
+
* deferred pile_insert_end), wielding each object whose liked slot is empty.
|
|
907
|
+
*/
|
|
908
|
+
export function wieldAll(gear, player) {
|
|
909
|
+
const handles = [...gear.pack];
|
|
910
|
+
for (const handle of handles) {
|
|
911
|
+
const obj = gear.store.get(handle);
|
|
912
|
+
if (!obj)
|
|
913
|
+
continue;
|
|
914
|
+
/* Make sure we can wield it into an empty slot. */
|
|
915
|
+
const slot = wieldSlot(player.body, obj.tval, player.equipment);
|
|
916
|
+
if (slot < 0 || slot >= player.body.count)
|
|
917
|
+
continue;
|
|
918
|
+
if ((player.equipment[slot] ?? 0) !== 0)
|
|
919
|
+
continue;
|
|
920
|
+
wieldObject(gear, player, handle);
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
/**
|
|
924
|
+
* Evaluate a start_item's eopts birth-option exclusion (player-birth.c
|
|
925
|
+
* L619-637): each token is an option name, optionally "NOT-" prefixed
|
|
926
|
+
* (init.c L3619-3634 stores +ind / -ind). A plain option excludes the item
|
|
927
|
+
* when it is SET; a NOT- option excludes it when it is UNSET. Returns true if
|
|
928
|
+
* the item should be included. With no accessor, nothing is excluded.
|
|
929
|
+
*/
|
|
930
|
+
function startItemIncluded(eopts, opt) {
|
|
931
|
+
if (eopts.length === 0 || !opt)
|
|
932
|
+
return true;
|
|
933
|
+
for (const token of eopts) {
|
|
934
|
+
const negated = token.startsWith("NOT-");
|
|
935
|
+
const name = negated ? token.slice(4) : token;
|
|
936
|
+
if (negated) {
|
|
937
|
+
if (!opt(name))
|
|
938
|
+
return false;
|
|
939
|
+
}
|
|
940
|
+
else {
|
|
941
|
+
if (opt(name))
|
|
942
|
+
return false;
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
return true;
|
|
946
|
+
}
|
|
947
|
+
/**
|
|
948
|
+
* player_outfit (player-birth.c L584-666): give the player their class
|
|
949
|
+
* starting equipment and wield everything wieldable.
|
|
950
|
+
*
|
|
951
|
+
* For each class start_item: roll the count in [min, max] via the project
|
|
952
|
+
* Rng (rand_range), look the kind up by tval/sval name, honour birth_start_kit
|
|
953
|
+
* (gap 1.6) and the eopts birth-option exclusion (gap 1.8), prep it with
|
|
954
|
+
* MINIMISE at level 0 (object_prep), set number and ORIGIN_BIRTH, carry it
|
|
955
|
+
* (invenCarry), and finally wield_all.
|
|
956
|
+
*
|
|
957
|
+
* wield_all learns each worn item's modifier runes (object_learn_on_wield);
|
|
958
|
+
* for a default class kit those items carry no modifiers, so obj_k stays
|
|
959
|
+
* empty at birth exactly as upstream.
|
|
960
|
+
*
|
|
961
|
+
* Each item is marked OBJ_NOTICE_ASSESSED (L652), the per-object half of the
|
|
962
|
+
* knowledge block that the port models on the live object, and reported through
|
|
963
|
+
* opts.onStartKind for object_flavor_aware (L650) - which the caller applies
|
|
964
|
+
* once the per-game awareness store exists (see OutfitOptions.onStartKind).
|
|
965
|
+
*/
|
|
966
|
+
export function outfitPlayer(gear, player, reg, rng, constants, opts = {}) {
|
|
967
|
+
const startKit = opts.startKit ?? (opts.opt ? opts.opt("birth_start_kit") : true);
|
|
968
|
+
const limits = {
|
|
969
|
+
quiverSlotSize: constants.quiverSlotSize,
|
|
970
|
+
thrownQuiverMult: constants.thrownQuiverMult,
|
|
971
|
+
};
|
|
972
|
+
/* Currently carrying nothing (running total is owned by the calc/inventory
|
|
973
|
+
* side, which is DEFERRED; we mirror only the reset upstream performs). */
|
|
974
|
+
player.upkeep.totalWeight = 0;
|
|
975
|
+
/* Give the player obvious object knowledge (player-birth.c L597-602): the
|
|
976
|
+
* LIGHT / DIG / THROW / CURSE_ONLY subtype flags are known from birth. Without
|
|
977
|
+
* this a mundane torch / digger / thrown item would read as not-fully-known
|
|
978
|
+
* and show a spurious "{??}" in stores and lists. (The dd/ds/ac and combat
|
|
979
|
+
* runes from the same upstream block are set in blankObjKnowledge.) */
|
|
980
|
+
learnBirthObviousFlags(player.objKnown.flags, reg.properties);
|
|
981
|
+
/* Modifier runes are learned per item at wield_all (below); the display
|
|
982
|
+
* half of the knowledge block (flavor_aware / base_known) is DEFERRED. */
|
|
983
|
+
/* Give the player starting equipment. */
|
|
984
|
+
for (const si of player.cls.startItems) {
|
|
985
|
+
let num = rng.randRange(si.min, si.max);
|
|
986
|
+
const tval = tvalFindIdx(si.tval);
|
|
987
|
+
if (tval < 0)
|
|
988
|
+
throw new Error(`outfit: unknown tval ${si.tval}`);
|
|
989
|
+
const sval = reg.lookupSval(tval, si.sval);
|
|
990
|
+
if (sval < 0)
|
|
991
|
+
throw new Error(`outfit: unknown sval ${si.tval}:${si.sval}`);
|
|
992
|
+
const kind = reg.lookupKind(tval, sval);
|
|
993
|
+
if (!kind)
|
|
994
|
+
throw new Error(`outfit: no kind ${si.tval}:${si.sval}`);
|
|
995
|
+
/* Without start_kit, only start with 1 food and 1 light. (Upstream
|
|
996
|
+
* tval_is_food_k / tval_is_light_k are TV_FOOD / TV_LIGHT only.) */
|
|
997
|
+
if (!startKit) {
|
|
998
|
+
if (!tvalIsFood(tval) && !tvalIsLight(tval))
|
|
999
|
+
continue;
|
|
1000
|
+
num = 1;
|
|
1001
|
+
}
|
|
1002
|
+
/* Exclude if configured to do so based on birth options (player-birth.c
|
|
1003
|
+
* L619-637). RNG order is preserved: rand_range(num) is drawn above, before
|
|
1004
|
+
* any continue, exactly as upstream. */
|
|
1005
|
+
if (!startItemIncluded(si.eopts, opts.opt))
|
|
1006
|
+
continue;
|
|
1007
|
+
/* Prepare a new item. */
|
|
1008
|
+
const obj = objectPrep(rng, reg, constants, kind, 0, "minimise");
|
|
1009
|
+
obj.number = num;
|
|
1010
|
+
obj.origin = ORIGIN.BIRTH;
|
|
1011
|
+
/* Deduct the cost of the item from starting cash (player-birth.c L654).
|
|
1012
|
+
* object_value_real draws no RNG. Upstream prices from obj->known; the
|
|
1013
|
+
* port has no known twin, so it prices the real object - the same
|
|
1014
|
+
* approximation the store path uses (obj/value.ts). */
|
|
1015
|
+
player.au -= objectValueReal(reg, obj, obj.number);
|
|
1016
|
+
/* obj->known->notice |= OBJ_NOTICE_ASSESSED (player-birth.c L652): a start
|
|
1017
|
+
* item has been handled, so it is assessed from birth. The port keeps that
|
|
1018
|
+
* per-object bit on the live object (objectKnownShadow mirrors it), and
|
|
1019
|
+
* without it the synthesised shadow returned before the flag/element
|
|
1020
|
+
* intersection - so a Wooden Torch's own BURNS_OUT / LIGHT_2 flags read as
|
|
1021
|
+
* UNKNOWN and the character sheet printed '?' down the torch's column even
|
|
1022
|
+
* though those flags are known from birth (learnBirthObviousFlags above). */
|
|
1023
|
+
obj.notice |= OBJ_NOTICE.ASSESSED;
|
|
1024
|
+
/* object_flavor_aware(p, obj) (player-birth.c:650). Deferred to the caller
|
|
1025
|
+
* because the awareness store does not exist yet - see onStartKind. */
|
|
1026
|
+
opts.onStartKind?.(kind);
|
|
1027
|
+
/* Carry the item. */
|
|
1028
|
+
invenCarry(gear, obj, limits);
|
|
1029
|
+
}
|
|
1030
|
+
/* Sanity check: never let the outfit drive starting gold negative
|
|
1031
|
+
* (player-birth.c L662). */
|
|
1032
|
+
if (player.au < 0)
|
|
1033
|
+
player.au = 0;
|
|
1034
|
+
/* Now try wielding everything. */
|
|
1035
|
+
wieldAll(gear, player);
|
|
1036
|
+
}
|
|
1037
|
+
//# sourceMappingURL=gear.js.map
|