@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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save integrity: a tamper-DETERRENT layer over the raw savefile bytes.
|
|
3
|
+
*
|
|
4
|
+
* Context (see ./buffer and the save-scum policy): upstream Angband
|
|
5
|
+
* stamps each block with a 32-bit additive checksum for corruption
|
|
6
|
+
* detection. That is trivially recomputable. This module adds an
|
|
7
|
+
* optional whole-file digest so that a casual hand-edit of the stored
|
|
8
|
+
* bytes (e.g. via browser DevTools on an IndexedDB save) no longer
|
|
9
|
+
* verifies, which raises the bar against save-scumming.
|
|
10
|
+
*
|
|
11
|
+
* HONEST CEILING: any verifier that runs on the client also ships to the
|
|
12
|
+
* client, so a determined user can read it and recompute the digest.
|
|
13
|
+
* This is a DETERRENT, not real protection. Unforgeable anti-tamper
|
|
14
|
+
* requires a secret the client never holds - i.e. server-authoritative
|
|
15
|
+
* saves, which belong to the networking seam (a plugin), not core.
|
|
16
|
+
*
|
|
17
|
+
* MODDABILITY: the digest is a seam. A host or mod may inject a stronger
|
|
18
|
+
* provider (for example SHA-256 via SubtleCrypto, or an HMAC keyed by a
|
|
19
|
+
* server secret in a networked deployment) by implementing SaveIntegrity.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* The built-in default: FNV-1a (64-bit, emitted as 16 hex chars). It is
|
|
23
|
+
* a NON-CRYPTOGRAPHIC hash - far more diffusing than an additive sum, so
|
|
24
|
+
* it catches casual edits, but not a security primitive. Zero-dependency
|
|
25
|
+
* and synchronous so core stays environment-neutral.
|
|
26
|
+
*/
|
|
27
|
+
export const fnv1aIntegrity = {
|
|
28
|
+
id: "fnv1a-64",
|
|
29
|
+
digest(bytes) {
|
|
30
|
+
// 64-bit FNV-1a maintained as two 32-bit halves (hi, lo) to stay in
|
|
31
|
+
// safe integer math. offset basis 0xcbf29ce484222325, prime 0x100000001b3.
|
|
32
|
+
let hi = 0xcbf29ce4;
|
|
33
|
+
let lo = 0x84222325;
|
|
34
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
35
|
+
lo ^= bytes[i];
|
|
36
|
+
// Multiply the 64-bit value by the FNV prime (0x100000001b3):
|
|
37
|
+
// that is 2^40 + 2^8 + 0x1b3. Do it via 16-bit limbs to be exact.
|
|
38
|
+
const a0 = lo & 0xffff;
|
|
39
|
+
const a1 = lo >>> 16;
|
|
40
|
+
const a2 = hi & 0xffff;
|
|
41
|
+
const a3 = hi >>> 16;
|
|
42
|
+
// prime limbs: p0=0x01b3, p1=0x0001, p2=0x0100, p3=0x0000
|
|
43
|
+
let c0 = a0 * 0x01b3;
|
|
44
|
+
let c1 = a1 * 0x01b3 + a0 * 0x0001 + (c0 >>> 16);
|
|
45
|
+
let c2 = a2 * 0x01b3 + a1 * 0x0001 + a0 * 0x0100 + (c1 >>> 16);
|
|
46
|
+
let c3 = a3 * 0x01b3 + a2 * 0x0001 + a1 * 0x0100 + (c2 >>> 16);
|
|
47
|
+
lo = ((c1 & 0xffff) << 16) | (c0 & 0xffff);
|
|
48
|
+
hi = ((c3 & 0xffff) << 16) | (c2 & 0xffff);
|
|
49
|
+
lo >>>= 0;
|
|
50
|
+
hi >>>= 0;
|
|
51
|
+
}
|
|
52
|
+
const hex = (n) => (n >>> 0).toString(16).padStart(8, "0");
|
|
53
|
+
return hex(hi) + hex(lo);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
/** Marker appended after the digest so the trailer is self-describing. */
|
|
57
|
+
const TRAILER_MAGIC = "\nNGISTMP1\n";
|
|
58
|
+
/**
|
|
59
|
+
* Append an integrity trailer (provider id + digest) to a savefile byte
|
|
60
|
+
* stream. The trailer sits after the block data and is excluded from the
|
|
61
|
+
* digest, so verification digests exactly the original bytes.
|
|
62
|
+
*/
|
|
63
|
+
export function stampSavefile(bytes, provider = fnv1aIntegrity) {
|
|
64
|
+
const digest = provider.digest(bytes);
|
|
65
|
+
const trailer = `${TRAILER_MAGIC}${provider.id}:${digest}`;
|
|
66
|
+
const tbytes = new TextEncoder().encode(trailer);
|
|
67
|
+
const out = new Uint8Array(bytes.length + tbytes.length);
|
|
68
|
+
out.set(bytes, 0);
|
|
69
|
+
out.set(tbytes, bytes.length);
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Split off and verify an integrity trailer. A caller decides policy: a
|
|
74
|
+
* no-save-scum build should reject `verified === false`, while still
|
|
75
|
+
* tolerating `unstamped` legacy saves if it chooses. Verification uses
|
|
76
|
+
* the supplied provider (whose id must match the trailer's).
|
|
77
|
+
*/
|
|
78
|
+
export function verifyStampedSavefile(bytes, provider = fnv1aIntegrity) {
|
|
79
|
+
const magicBytes = new TextEncoder().encode(TRAILER_MAGIC);
|
|
80
|
+
const at = lastIndexOf(bytes, magicBytes);
|
|
81
|
+
if (at < 0) {
|
|
82
|
+
return { payload: bytes, verified: false, unstamped: true };
|
|
83
|
+
}
|
|
84
|
+
const payload = bytes.subarray(0, at);
|
|
85
|
+
const trailer = new TextDecoder().decode(bytes.subarray(at + magicBytes.length));
|
|
86
|
+
const colon = trailer.indexOf(":");
|
|
87
|
+
const providerId = colon >= 0 ? trailer.slice(0, colon) : trailer;
|
|
88
|
+
const recorded = colon >= 0 ? trailer.slice(colon + 1) : "";
|
|
89
|
+
const verified = providerId === provider.id && provider.digest(payload) === recorded;
|
|
90
|
+
return { payload, verified, unstamped: false, providerId };
|
|
91
|
+
}
|
|
92
|
+
/** Find the last occurrence of `needle` in `hay`, or -1. */
|
|
93
|
+
function lastIndexOf(hay, needle) {
|
|
94
|
+
outer: for (let i = hay.length - needle.length; i >= 0; i--) {
|
|
95
|
+
for (let j = 0; j < needle.length; j++) {
|
|
96
|
+
if (hay[i + j] !== needle[j])
|
|
97
|
+
continue outer;
|
|
98
|
+
}
|
|
99
|
+
return i;
|
|
100
|
+
}
|
|
101
|
+
return -1;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../src/save/integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-score row formatting, ported from reference/src/ui-score.c
|
|
3
|
+
* (Angband 4.2.6) display_score_page (L30). The C draws three lines per record
|
|
4
|
+
* with Term calls; this produces the same strings as DATA (ScoreRow), leaving
|
|
5
|
+
* the Term paging/scroll/keypress loop (display_scores_aux, L117) to the shell.
|
|
6
|
+
*
|
|
7
|
+
* The number fields the C reads back from the fixed-width record (pts printed
|
|
8
|
+
* with "%9s"; user/gold/turns are the space-padded numbers with their leading
|
|
9
|
+
* whitespace stripped) are reconstructed here from the typed HighScore, giving
|
|
10
|
+
* byte-identical output.
|
|
11
|
+
*/
|
|
12
|
+
import type { HighScore, ScoreRow } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Resolvers for the race/class name a record's indices map to
|
|
15
|
+
* (player_id2race / player_id2class in display_score_page). Return null for an
|
|
16
|
+
* unknown index; the C prints "<none>" then. Supply from a PlayerRegistry:
|
|
17
|
+
* `{ raceName: (i) => reg.races[i]?.name ?? null, ... }`.
|
|
18
|
+
*/
|
|
19
|
+
export interface ScoreNameResolver {
|
|
20
|
+
raceName(ridx: number): string | null;
|
|
21
|
+
className(cidx: number): string | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build the three display lines for a single record at `start`, highlighted
|
|
25
|
+
* when start === highlight. Faithful to the body of display_score_page's loop.
|
|
26
|
+
*/
|
|
27
|
+
export declare function scoreRow(scores: readonly HighScore[], start: number, highlight: number, names: ScoreNameResolver): ScoreRow;
|
|
28
|
+
/**
|
|
29
|
+
* display_score_page (ui-score.c L30): the rows for one page - up to 5 entries
|
|
30
|
+
* starting at `start`, stopping at `count`. `highlight` is the index to draw in
|
|
31
|
+
* L_GREEN (or -1 for none).
|
|
32
|
+
*/
|
|
33
|
+
export declare function scorePageRows(scores: readonly HighScore[], start: number, count: number, highlight: number, names: ScoreNameResolver): ScoreRow[];
|
|
34
|
+
/**
|
|
35
|
+
* All rows for the inclusive-exclusive range [from, to) clamped to the real
|
|
36
|
+
* record count, in one flat list (convenience over paging). `highlight` is the
|
|
37
|
+
* highlighted index or -1. Useful for a scroll surface that renders every row.
|
|
38
|
+
*/
|
|
39
|
+
export declare function scoreRows(scores: readonly HighScore[], from: number, to: number, highlight: number, names: ScoreNameResolver): ScoreRow[];
|
|
40
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/score/display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACxC;AAmBD;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,GACvB,QAAQ,CA+BV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,GACvB,QAAQ,EAAE,CAMZ;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,GACvB,QAAQ,EAAE,CAQZ"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-score row formatting, ported from reference/src/ui-score.c
|
|
3
|
+
* (Angband 4.2.6) display_score_page (L30). The C draws three lines per record
|
|
4
|
+
* with Term calls; this produces the same strings as DATA (ScoreRow), leaving
|
|
5
|
+
* the Term paging/scroll/keypress loop (display_scores_aux, L117) to the shell.
|
|
6
|
+
*
|
|
7
|
+
* The number fields the C reads back from the fixed-width record (pts printed
|
|
8
|
+
* with "%9s"; user/gold/turns are the space-padded numbers with their leading
|
|
9
|
+
* whitespace stripped) are reconstructed here from the typed HighScore, giving
|
|
10
|
+
* byte-identical output.
|
|
11
|
+
*/
|
|
12
|
+
import { COLOUR_L_GREEN, COLOUR_WHITE } from "../color.js";
|
|
13
|
+
import { SCORES_PER_PAGE } from "./types.js";
|
|
14
|
+
/** printf "%Ns": right-justify a string into at least N columns. */
|
|
15
|
+
function padStart(s, width) {
|
|
16
|
+
return s.length >= width ? s : " ".repeat(width - s.length) + s;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Clean up the stored "when" for display (ui-score.c L100): an "@YYYYMMDD"
|
|
20
|
+
* stamp (a leading '@' with total length 9) becomes "YYYY-MM-DD"; anything
|
|
21
|
+
* else (e.g. "TODAY") is shown unchanged.
|
|
22
|
+
*/
|
|
23
|
+
function formatWhen(day) {
|
|
24
|
+
if (day.startsWith("@") && day.length === 9) {
|
|
25
|
+
return `${day.slice(1, 5)}-${day.slice(5, 7)}-${day.slice(7, 9)}`;
|
|
26
|
+
}
|
|
27
|
+
return day;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build the three display lines for a single record at `start`, highlighted
|
|
31
|
+
* when start === highlight. Faithful to the body of display_score_page's loop.
|
|
32
|
+
*/
|
|
33
|
+
export function scoreRow(scores, start, highlight, names) {
|
|
34
|
+
const score = scores[start];
|
|
35
|
+
const highlighted = start === highlight;
|
|
36
|
+
const color = highlighted ? COLOUR_L_GREEN : COLOUR_WHITE;
|
|
37
|
+
const race = names.raceName(score.pRace);
|
|
38
|
+
const cls = names.className(score.pClass);
|
|
39
|
+
const clev = score.curLev;
|
|
40
|
+
const mlev = score.maxLev;
|
|
41
|
+
const cdun = score.curDun;
|
|
42
|
+
const mdun = score.maxDun;
|
|
43
|
+
// Line 1: "%3d.%9s %s the %s %s, level %d" (+ " (Max %d)" if mlev > clev).
|
|
44
|
+
let line1 = `${padStart(String(start + 1), 3)}.${padStart(String(score.pts), 9)}` +
|
|
45
|
+
` ${score.who} the ${race ?? "<none>"} ${cls ?? "<none>"}, level ${clev}`;
|
|
46
|
+
if (mlev > clev)
|
|
47
|
+
line1 += ` (Max ${mlev})`;
|
|
48
|
+
// Line 2: town vs dungeon death (+ " (Max %d)" if mdun > cdun).
|
|
49
|
+
let line2 = !cdun
|
|
50
|
+
? `Killed by ${score.how} in the town`
|
|
51
|
+
: `Killed by ${score.how} on dungeon level ${cdun}`;
|
|
52
|
+
if (mdun > cdun)
|
|
53
|
+
line2 += ` (Max ${mdun})`;
|
|
54
|
+
// Line 3: "(User %s, Date %s, Gold %s, Turn %s)." - the numeric fields are
|
|
55
|
+
// the stripped (no leading space) decimal values.
|
|
56
|
+
const line3 = `(User ${score.uid}, Date ${formatWhen(score.day)}, ` +
|
|
57
|
+
`Gold ${score.gold}, Turn ${score.turns}).`;
|
|
58
|
+
return { rank: start + 1, highlighted, color, line1, line2, line3 };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* display_score_page (ui-score.c L30): the rows for one page - up to 5 entries
|
|
62
|
+
* starting at `start`, stopping at `count`. `highlight` is the index to draw in
|
|
63
|
+
* L_GREEN (or -1 for none).
|
|
64
|
+
*/
|
|
65
|
+
export function scorePageRows(scores, start, count, highlight, names) {
|
|
66
|
+
const rows = [];
|
|
67
|
+
for (let n = 0; start < count && n < SCORES_PER_PAGE; start++, n++) {
|
|
68
|
+
rows.push(scoreRow(scores, start, highlight, names));
|
|
69
|
+
}
|
|
70
|
+
return rows;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* All rows for the inclusive-exclusive range [from, to) clamped to the real
|
|
74
|
+
* record count, in one flat list (convenience over paging). `highlight` is the
|
|
75
|
+
* highlighted index or -1. Useful for a scroll surface that renders every row.
|
|
76
|
+
*/
|
|
77
|
+
export function scoreRows(scores, from, to, highlight, names) {
|
|
78
|
+
const start = Math.max(0, from);
|
|
79
|
+
const end = Math.min(to, scores.length);
|
|
80
|
+
const rows = [];
|
|
81
|
+
for (let i = start; i < end; i++) {
|
|
82
|
+
rows.push(scoreRow(scores, i, highlight, names));
|
|
83
|
+
}
|
|
84
|
+
return rows;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/score/display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAc7C,oEAAoE;AACpE,SAAS,QAAQ,CAAC,CAAS,EAAE,KAAa;IACxC,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,MAA4B,EAC5B,KAAa,EACb,SAAiB,EACjB,KAAwB;IAExB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,KAAK,KAAK,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC;IAE1D,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IAE1B,4EAA4E;IAC5E,IAAI,KAAK,GACP,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE;QACrE,KAAK,KAAK,CAAC,GAAG,QAAQ,IAAI,IAAI,QAAQ,IAAI,GAAG,IAAI,QAAQ,WAAW,IAAI,EAAE,CAAC;IAC7E,IAAI,IAAI,GAAG,IAAI;QAAE,KAAK,IAAI,SAAS,IAAI,GAAG,CAAC;IAE3C,gEAAgE;IAChE,IAAI,KAAK,GAAG,CAAC,IAAI;QACf,CAAC,CAAC,aAAa,KAAK,CAAC,GAAG,cAAc;QACtC,CAAC,CAAC,aAAa,KAAK,CAAC,GAAG,qBAAqB,IAAI,EAAE,CAAC;IACtD,IAAI,IAAI,GAAG,IAAI;QAAE,KAAK,IAAI,SAAS,IAAI,GAAG,CAAC;IAE3C,2EAA2E;IAC3E,kDAAkD;IAClD,MAAM,KAAK,GACT,SAAS,KAAK,CAAC,GAAG,UAAU,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;QACrD,QAAQ,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,KAAK,IAAI,CAAC;IAE9C,OAAO,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA4B,EAC5B,KAAa,EACb,KAAa,EACb,SAAiB,EACjB,KAAwB;IAExB,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,MAA4B,EAC5B,IAAY,EACZ,EAAU,EACV,SAAiB,EACjB,KAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-score logic, ported from reference/src/score.c and score-util.c
|
|
3
|
+
* (Angband 4.2.6): the scoring formula, the build/where/add/count/regularize
|
|
4
|
+
* table operations, and the enter-score gating. All operations here are pure
|
|
5
|
+
* over an in-memory HighScore[]; persistence arrives through the injected
|
|
6
|
+
* ScoreStore seam (types.ts), never a filesystem.
|
|
7
|
+
*
|
|
8
|
+
* The port operates on a COMPACT list (only real records, no empty padding),
|
|
9
|
+
* capped at MAX_HISCORES, rather than the C's fixed array of MAX_HISCORES
|
|
10
|
+
* records with empty slots at the tail. The observable results (insert slot,
|
|
11
|
+
* shift-and-truncate on add, sort order, count) are identical; see
|
|
12
|
+
* parity/ledger/high-scores.yaml for the equivalence argument.
|
|
13
|
+
*/
|
|
14
|
+
import type { Player } from "../player/player.js";
|
|
15
|
+
import type { HighScore, ScoreStore } from "./types.js";
|
|
16
|
+
/**
|
|
17
|
+
* total_points (score.c L28): the whole score is max experience plus a flat
|
|
18
|
+
* bonus per deepest dungeon level reached. Ported EXACTLY.
|
|
19
|
+
*/
|
|
20
|
+
export declare function totalPoints(p: Player): number;
|
|
21
|
+
/**
|
|
22
|
+
* The non-Player state build_score reads (score.c build_score, L216). Upstream
|
|
23
|
+
* pulls these from globals (turn, player_uid, buildid) or the live world
|
|
24
|
+
* (p->depth is the current cave depth, distinct from p->max_depth). The port
|
|
25
|
+
* keeps them off Player, so buildScore takes them as deps, matching the
|
|
26
|
+
* char-sheet's deps idiom (game/char-sheet.ts).
|
|
27
|
+
*/
|
|
28
|
+
export interface BuildScoreDeps {
|
|
29
|
+
/** died_from: the method-of-death string (p->died_from, or "nobody (yet!)"). */
|
|
30
|
+
diedFrom: string;
|
|
31
|
+
/** turn (game-world.c): the game-turn counter at death. */
|
|
32
|
+
turn: number;
|
|
33
|
+
/** p->depth: the LIVE dungeon depth (cur_dun), not max_depth. */
|
|
34
|
+
depth: number;
|
|
35
|
+
/** p->full_name: the character's name (only first 15 chars are kept). */
|
|
36
|
+
fullName?: string;
|
|
37
|
+
/** player_uid: the OS player id. Default 0 (the port has no OS uid). */
|
|
38
|
+
uid?: number;
|
|
39
|
+
/** buildid the record is stamped with (what[]). Default ENGINE_VERSION. */
|
|
40
|
+
buildid?: string;
|
|
41
|
+
/**
|
|
42
|
+
* The time of death, for the "@YYYYMMDD" day stamp. NULL/undefined (the
|
|
43
|
+
* player is not dead) yields "TODAY", exactly as build_score.
|
|
44
|
+
*/
|
|
45
|
+
deathTime?: Date | null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* build_score (score.c L216): fill a score record from the player plus the
|
|
49
|
+
* death-time and cause. The C truncates who to 15 chars ("%-.15s") and how to
|
|
50
|
+
* 31 (my_strcpy into how[32]); reproduced here. `what` marks the record in
|
|
51
|
+
* use (a non-empty build id).
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildScore(p: Player, deps: BuildScoreDeps): HighScore;
|
|
54
|
+
/**
|
|
55
|
+
* highscore_valid (score-util.c L95): a non-empty record must have parseable
|
|
56
|
+
* numeric fields. With typed storage the only ways a record can be invalid are
|
|
57
|
+
* a blank build id (treated as empty) or a non-finite number in a numeric
|
|
58
|
+
* field; NaN/Infinity would break the strtol-equivalent ordering, so they are
|
|
59
|
+
* rejected exactly as an unparseable C field would be.
|
|
60
|
+
*/
|
|
61
|
+
export declare function highscoreValid(s: HighScore): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* highscore_cmp (score-util.c L43): order two records best-first. Winners
|
|
64
|
+
* (how == WINNING_HOW) precede non-winners; then more points precede fewer;
|
|
65
|
+
* ties keep their existing order (the C uses the record address, which for a
|
|
66
|
+
* contiguous array is the current order - a stable sort reproduces this).
|
|
67
|
+
* Returns <0 if a precedes b, >0 if a follows b, 0 for a true tie.
|
|
68
|
+
*/
|
|
69
|
+
export declare function highscoreCmp(a: HighScore, b: HighScore): number;
|
|
70
|
+
/**
|
|
71
|
+
* highscore_where (score-util.c L276): the index a new (valid, non-empty)
|
|
72
|
+
* entry would take in a best-first list. Ties prefer the NEW entry
|
|
73
|
+
* (entry_pts >= score_pts). If it does not fit before any existing record it
|
|
74
|
+
* takes the first free slot (list length while below the cap) or, when the
|
|
75
|
+
* list is full, replaces the last record (index MAX_HISCORES - 1).
|
|
76
|
+
*/
|
|
77
|
+
export declare function highscoreWhere(entry: HighScore, scores: readonly HighScore[]): number;
|
|
78
|
+
/**
|
|
79
|
+
* highscore_add (score.c L72): insert an entry at its slot, shifting lower
|
|
80
|
+
* records down and dropping anything past MAX_HISCORES. Mutates `scores` in
|
|
81
|
+
* place (like the C on its array) and returns the slot used.
|
|
82
|
+
*
|
|
83
|
+
* The full-list case matches the C's memmove-with-zero-count: highscoreWhere
|
|
84
|
+
* returns MAX_HISCORES - 1, splicing there pushes the old last record off the
|
|
85
|
+
* end, and the truncation drops it - i.e. the last entry is replaced.
|
|
86
|
+
*/
|
|
87
|
+
export declare function highscoreAdd(entry: HighScore, scores: HighScore[]): number;
|
|
88
|
+
/** highscore_count (score.c L84): number of real records. */
|
|
89
|
+
export declare function highscoreCount(scores: readonly HighScore[]): number;
|
|
90
|
+
/**
|
|
91
|
+
* highscore_regularize (score-util.c L199): force the list valid and ordered.
|
|
92
|
+
* Invalid or empty records are dropped, and the remainder is stable-sorted
|
|
93
|
+
* best-first (winners, then points, ties in place). Returns a NEW list plus a
|
|
94
|
+
* flag reporting whether anything changed (the C's `irregular` return).
|
|
95
|
+
*/
|
|
96
|
+
export declare function highscoreRegularize(scores: readonly HighScore[]): {
|
|
97
|
+
scores: HighScore[];
|
|
98
|
+
irregular: boolean;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* The outcome of enterScore: either entered (with its slot) or rejected with
|
|
102
|
+
* the reason the C would msg() about. The C is void + msg(); the port returns
|
|
103
|
+
* the decision so the shell owns the message.
|
|
104
|
+
*/
|
|
105
|
+
export type EnterScoreOutcome = {
|
|
106
|
+
entered: true;
|
|
107
|
+
slot: number;
|
|
108
|
+
} | {
|
|
109
|
+
entered: false;
|
|
110
|
+
reason: "cheater" | "wizard" | "borg" | "interrupted" | "retired";
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* The gating inputs enter_score checks (score.c L272). The port has no options
|
|
114
|
+
* table or noscore flags on Player yet, so they arrive as an explicit seam
|
|
115
|
+
* (defaults = a clean, scored character).
|
|
116
|
+
*/
|
|
117
|
+
export interface EnterScoreGating {
|
|
118
|
+
/** Any OP_SCORE ("cheating") option is on (score.c L277 loop). */
|
|
119
|
+
cheated?: boolean;
|
|
120
|
+
/** p->noscore & (NOSCORE_WIZARD | NOSCORE_DEBUG): a wizard/debug character. */
|
|
121
|
+
noscore?: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* p->noscore & NOSCORE_BORG (score.c:291, the !SCORE_BORGS branch): played by
|
|
124
|
+
* the Borg. Checked AFTER the wizard bits, so a character that is both is
|
|
125
|
+
* reported as a wizard, matching the C's else-if chain.
|
|
126
|
+
*/
|
|
127
|
+
borg?: boolean;
|
|
128
|
+
/** p->total_winner: a winner is scored even when interrupted/retiring. */
|
|
129
|
+
totalWinner?: boolean;
|
|
130
|
+
/** p->died_from (score.c L299/L302): "Interrupting" / "Retiring" are gated. */
|
|
131
|
+
diedFrom: string;
|
|
132
|
+
}
|
|
133
|
+
/** The host's score gate: Angband NOSCORE bits plus the port-only mod ratchet. */
|
|
134
|
+
export declare function scoreGateNoscore(playerNoscore: boolean, modNoscore: boolean): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* enter_score (score.c L272): enter a character on the high-score table "if
|
|
137
|
+
* legal". Cheaters, wizards/debug characters, and non-winning interrupted or
|
|
138
|
+
* retiring deaths are not scored (in that priority order). Otherwise the entry
|
|
139
|
+
* is built and added to the store's list.
|
|
140
|
+
*
|
|
141
|
+
* Faithful divergence from the C's read/add/write: here read/write go through
|
|
142
|
+
* the injected ScoreStore, and highscoreAdd already truncates at MAX_HISCORES.
|
|
143
|
+
*/
|
|
144
|
+
export declare function enterScore(store: ScoreStore, player: Player, build: BuildScoreDeps, gating: EnterScoreGating): EnterScoreOutcome;
|
|
145
|
+
/** The score range and highlight predict_score resolves for display. */
|
|
146
|
+
export interface PredictedScores {
|
|
147
|
+
/** The score list to page over (the provisional entry inserted if alive). */
|
|
148
|
+
scores: HighScore[];
|
|
149
|
+
/** First index to show (from). */
|
|
150
|
+
from: number;
|
|
151
|
+
/** One past the last index to show (to). */
|
|
152
|
+
to: number;
|
|
153
|
+
/** The index to highlight (the current character), or -1 for none. */
|
|
154
|
+
highlight: number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* predict_score (ui-score.c L193): find where the current character sits and
|
|
158
|
+
* pick the neighbourhood to show. A dead character is already in `scores`
|
|
159
|
+
* (enter_score ran), so we only locate it (highscore_where); a live character
|
|
160
|
+
* is provisionally inserted (highscore_add) so it appears in the table. On the
|
|
161
|
+
* top ten we show ranks 1..15; otherwise a window around the entry.
|
|
162
|
+
*
|
|
163
|
+
* This is the DATA half; the shell (display_scores_aux) owns the paging loop.
|
|
164
|
+
*/
|
|
165
|
+
export declare function predictScore(scores: HighScore[], entry: HighScore, isDead: boolean): PredictedScores;
|
|
166
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/score/score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-score logic, ported from reference/src/score.c and score-util.c
|
|
3
|
+
* (Angband 4.2.6): the scoring formula, the build/where/add/count/regularize
|
|
4
|
+
* table operations, and the enter-score gating. All operations here are pure
|
|
5
|
+
* over an in-memory HighScore[]; persistence arrives through the injected
|
|
6
|
+
* ScoreStore seam (types.ts), never a filesystem.
|
|
7
|
+
*
|
|
8
|
+
* The port operates on a COMPACT list (only real records, no empty padding),
|
|
9
|
+
* capped at MAX_HISCORES, rather than the C's fixed array of MAX_HISCORES
|
|
10
|
+
* records with empty slots at the tail. The observable results (insert slot,
|
|
11
|
+
* shift-and-truncate on add, sort order, count) are identical; see
|
|
12
|
+
* parity/ledger/high-scores.yaml for the equivalence argument.
|
|
13
|
+
*/
|
|
14
|
+
import { ENGINE_VERSION } from "../version.js";
|
|
15
|
+
import { MAX_HISCORES, WINNING_HOW } from "./types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Default build id stamped into a record's `what` (score.c build_score uses the
|
|
18
|
+
* global `buildid`). The web shell may pass a specific build id via
|
|
19
|
+
* BuildScoreDeps.buildid.
|
|
20
|
+
*
|
|
21
|
+
* This was a hardcoded copy of the version, on the reasoning that importing the
|
|
22
|
+
* barrel's ENGINE_VERSION would make a cycle. True of the barrel, but version.ts
|
|
23
|
+
* exists precisely so a core module can cite the version without it - and the
|
|
24
|
+
* copy did exactly what a copy does: the port went to 0.9.0 and every score kept
|
|
25
|
+
* being stamped 0.1.0.
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_BUILDID = ENGINE_VERSION;
|
|
28
|
+
/**
|
|
29
|
+
* total_points (score.c L28): the whole score is max experience plus a flat
|
|
30
|
+
* bonus per deepest dungeon level reached. Ported EXACTLY.
|
|
31
|
+
*/
|
|
32
|
+
export function totalPoints(p) {
|
|
33
|
+
return p.maxExp + 100 * p.maxDepth;
|
|
34
|
+
}
|
|
35
|
+
/** strftime "@%Y%m%d" in LOCAL time (build_score L235 uses localtime). */
|
|
36
|
+
function formatDay(deathTime) {
|
|
37
|
+
if (!deathTime)
|
|
38
|
+
return "TODAY";
|
|
39
|
+
const y = String(deathTime.getFullYear()).padStart(4, "0");
|
|
40
|
+
const m = String(deathTime.getMonth() + 1).padStart(2, "0");
|
|
41
|
+
const d = String(deathTime.getDate()).padStart(2, "0");
|
|
42
|
+
return `@${y}${m}${d}`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* build_score (score.c L216): fill a score record from the player plus the
|
|
46
|
+
* death-time and cause. The C truncates who to 15 chars ("%-.15s") and how to
|
|
47
|
+
* 31 (my_strcpy into how[32]); reproduced here. `what` marks the record in
|
|
48
|
+
* use (a non-empty build id).
|
|
49
|
+
*/
|
|
50
|
+
export function buildScore(p, deps) {
|
|
51
|
+
return {
|
|
52
|
+
what: (deps.buildid ?? DEFAULT_BUILDID).slice(0, 7),
|
|
53
|
+
pts: totalPoints(p),
|
|
54
|
+
gold: p.au,
|
|
55
|
+
turns: deps.turn,
|
|
56
|
+
day: formatDay(deps.deathTime),
|
|
57
|
+
who: (deps.fullName ?? "").slice(0, 15),
|
|
58
|
+
uid: deps.uid ?? 0,
|
|
59
|
+
pRace: p.race.ridx,
|
|
60
|
+
pClass: p.cls.cidx,
|
|
61
|
+
curLev: p.lev,
|
|
62
|
+
curDun: deps.depth,
|
|
63
|
+
maxLev: p.maxLev,
|
|
64
|
+
maxDun: p.maxDepth,
|
|
65
|
+
how: deps.diedFrom.slice(0, 31),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** A record is "empty"/unused when its build-id marker is blank (what[0]). */
|
|
69
|
+
function isEmpty(s) {
|
|
70
|
+
return s.what.length === 0;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* highscore_valid (score-util.c L95): a non-empty record must have parseable
|
|
74
|
+
* numeric fields. With typed storage the only ways a record can be invalid are
|
|
75
|
+
* a blank build id (treated as empty) or a non-finite number in a numeric
|
|
76
|
+
* field; NaN/Infinity would break the strtol-equivalent ordering, so they are
|
|
77
|
+
* rejected exactly as an unparseable C field would be.
|
|
78
|
+
*/
|
|
79
|
+
export function highscoreValid(s) {
|
|
80
|
+
if (isEmpty(s))
|
|
81
|
+
return true; // an empty record is valid (all-empty in C)
|
|
82
|
+
const nums = [
|
|
83
|
+
s.pts,
|
|
84
|
+
s.gold,
|
|
85
|
+
s.turns,
|
|
86
|
+
s.uid,
|
|
87
|
+
s.pRace,
|
|
88
|
+
s.pClass,
|
|
89
|
+
s.curLev,
|
|
90
|
+
s.curDun,
|
|
91
|
+
s.maxLev,
|
|
92
|
+
s.maxDun,
|
|
93
|
+
];
|
|
94
|
+
return nums.every((n) => Number.isFinite(n));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* highscore_cmp (score-util.c L43): order two records best-first. Winners
|
|
98
|
+
* (how == WINNING_HOW) precede non-winners; then more points precede fewer;
|
|
99
|
+
* ties keep their existing order (the C uses the record address, which for a
|
|
100
|
+
* contiguous array is the current order - a stable sort reproduces this).
|
|
101
|
+
* Returns <0 if a precedes b, >0 if a follows b, 0 for a true tie.
|
|
102
|
+
*/
|
|
103
|
+
export function highscoreCmp(a, b) {
|
|
104
|
+
const ae = isEmpty(a);
|
|
105
|
+
const be = isEmpty(b);
|
|
106
|
+
if (ae)
|
|
107
|
+
return be ? 0 : 1; // empty records sort after non-empty ones
|
|
108
|
+
if (be)
|
|
109
|
+
return -1;
|
|
110
|
+
const awinner = a.how === WINNING_HOW;
|
|
111
|
+
const bwinner = b.how === WINNING_HOW;
|
|
112
|
+
if (awinner !== bwinner)
|
|
113
|
+
return awinner ? -1 : 1;
|
|
114
|
+
if (a.pts !== b.pts)
|
|
115
|
+
return a.pts > b.pts ? -1 : 1;
|
|
116
|
+
return 0; // true tie: stable sort keeps current order
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* highscore_where (score-util.c L276): the index a new (valid, non-empty)
|
|
120
|
+
* entry would take in a best-first list. Ties prefer the NEW entry
|
|
121
|
+
* (entry_pts >= score_pts). If it does not fit before any existing record it
|
|
122
|
+
* takes the first free slot (list length while below the cap) or, when the
|
|
123
|
+
* list is full, replaces the last record (index MAX_HISCORES - 1).
|
|
124
|
+
*/
|
|
125
|
+
export function highscoreWhere(entry, scores) {
|
|
126
|
+
const entryWinner = entry.how === WINNING_HOW;
|
|
127
|
+
const entryPts = entry.pts;
|
|
128
|
+
for (let i = 0; i < scores.length; i++) {
|
|
129
|
+
const s = scores[i];
|
|
130
|
+
const scoreWinner = s.how === WINNING_HOW;
|
|
131
|
+
if (entryWinner !== scoreWinner) {
|
|
132
|
+
if (entryWinner)
|
|
133
|
+
return i;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (entryPts >= s.pts)
|
|
137
|
+
return i;
|
|
138
|
+
}
|
|
139
|
+
// Did not fit before any record: first free slot, else replace the last.
|
|
140
|
+
return scores.length < MAX_HISCORES ? scores.length : MAX_HISCORES - 1;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* highscore_add (score.c L72): insert an entry at its slot, shifting lower
|
|
144
|
+
* records down and dropping anything past MAX_HISCORES. Mutates `scores` in
|
|
145
|
+
* place (like the C on its array) and returns the slot used.
|
|
146
|
+
*
|
|
147
|
+
* The full-list case matches the C's memmove-with-zero-count: highscoreWhere
|
|
148
|
+
* returns MAX_HISCORES - 1, splicing there pushes the old last record off the
|
|
149
|
+
* end, and the truncation drops it - i.e. the last entry is replaced.
|
|
150
|
+
*/
|
|
151
|
+
export function highscoreAdd(entry, scores) {
|
|
152
|
+
const slot = highscoreWhere(entry, scores);
|
|
153
|
+
scores.splice(slot, 0, entry);
|
|
154
|
+
if (scores.length > MAX_HISCORES)
|
|
155
|
+
scores.length = MAX_HISCORES;
|
|
156
|
+
return slot;
|
|
157
|
+
}
|
|
158
|
+
/** highscore_count (score.c L84): number of real records. */
|
|
159
|
+
export function highscoreCount(scores) {
|
|
160
|
+
let n = 0;
|
|
161
|
+
for (const s of scores) {
|
|
162
|
+
if (isEmpty(s))
|
|
163
|
+
break; // empties are tail-only; stop at the first
|
|
164
|
+
n++;
|
|
165
|
+
}
|
|
166
|
+
return n;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* highscore_regularize (score-util.c L199): force the list valid and ordered.
|
|
170
|
+
* Invalid or empty records are dropped, and the remainder is stable-sorted
|
|
171
|
+
* best-first (winners, then points, ties in place). Returns a NEW list plus a
|
|
172
|
+
* flag reporting whether anything changed (the C's `irregular` return).
|
|
173
|
+
*/
|
|
174
|
+
export function highscoreRegularize(scores) {
|
|
175
|
+
const kept = [];
|
|
176
|
+
let irregular = false;
|
|
177
|
+
for (const s of scores) {
|
|
178
|
+
if (!highscoreValid(s) || isEmpty(s)) {
|
|
179
|
+
irregular = true; // an invalid/empty record in the body is an irregularity
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
kept.push(s);
|
|
183
|
+
}
|
|
184
|
+
// Detect out-of-order before sorting (stable sort would otherwise hide it).
|
|
185
|
+
for (let i = 1; i < kept.length; i++) {
|
|
186
|
+
if (highscoreCmp(kept[i - 1], kept[i]) > 0) {
|
|
187
|
+
irregular = true;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
kept.sort(highscoreCmp);
|
|
192
|
+
return { scores: kept, irregular };
|
|
193
|
+
}
|
|
194
|
+
/** The host's score gate: Angband NOSCORE bits plus the port-only mod ratchet. */
|
|
195
|
+
export function scoreGateNoscore(playerNoscore, modNoscore) {
|
|
196
|
+
return playerNoscore || modNoscore;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* enter_score (score.c L272): enter a character on the high-score table "if
|
|
200
|
+
* legal". Cheaters, wizards/debug characters, and non-winning interrupted or
|
|
201
|
+
* retiring deaths are not scored (in that priority order). Otherwise the entry
|
|
202
|
+
* is built and added to the store's list.
|
|
203
|
+
*
|
|
204
|
+
* Faithful divergence from the C's read/add/write: here read/write go through
|
|
205
|
+
* the injected ScoreStore, and highscoreAdd already truncates at MAX_HISCORES.
|
|
206
|
+
*/
|
|
207
|
+
export function enterScore(store, player, build, gating) {
|
|
208
|
+
if (gating.cheated)
|
|
209
|
+
return { entered: false, reason: "cheater" };
|
|
210
|
+
if (gating.noscore)
|
|
211
|
+
return { entered: false, reason: "wizard" };
|
|
212
|
+
if (gating.borg)
|
|
213
|
+
return { entered: false, reason: "borg" };
|
|
214
|
+
if (!gating.totalWinner && gating.diedFrom === "Interrupting") {
|
|
215
|
+
return { entered: false, reason: "interrupted" };
|
|
216
|
+
}
|
|
217
|
+
if (!gating.totalWinner && gating.diedFrom === "Retiring") {
|
|
218
|
+
return { entered: false, reason: "retired" };
|
|
219
|
+
}
|
|
220
|
+
const entry = buildScore(player, build);
|
|
221
|
+
const scores = store.read();
|
|
222
|
+
const slot = highscoreAdd(entry, scores);
|
|
223
|
+
store.write(scores);
|
|
224
|
+
return { entered: true, slot };
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* predict_score (ui-score.c L193): find where the current character sits and
|
|
228
|
+
* pick the neighbourhood to show. A dead character is already in `scores`
|
|
229
|
+
* (enter_score ran), so we only locate it (highscore_where); a live character
|
|
230
|
+
* is provisionally inserted (highscore_add) so it appears in the table. On the
|
|
231
|
+
* top ten we show ranks 1..15; otherwise a window around the entry.
|
|
232
|
+
*
|
|
233
|
+
* This is the DATA half; the shell (display_scores_aux) owns the paging loop.
|
|
234
|
+
*/
|
|
235
|
+
export function predictScore(scores, entry, isDead) {
|
|
236
|
+
const j = isDead
|
|
237
|
+
? highscoreWhere(entry, scores)
|
|
238
|
+
: highscoreAdd(entry, scores);
|
|
239
|
+
if (j < 10) {
|
|
240
|
+
return { scores, from: 0, to: 15, highlight: j };
|
|
241
|
+
}
|
|
242
|
+
return { scores, from: j - 2, to: j + 7, highlight: j };
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=score.js.map
|