@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,1838 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The DATA half of the second character screen's resist / ability / sustain /
|
|
3
|
+
* modifier grid, ported from Angband 4.2.6:
|
|
4
|
+
* - reference/src/ui-entry.c (the config engine + value compute)
|
|
5
|
+
* - reference/src/ui-entry-combiner.c (the 9 value combiners)
|
|
6
|
+
* - reference/src/ui-entry-renderers.c (value -> symbol + palette-index)
|
|
7
|
+
* - reference/src/ui-player.c (display_resistance_panel /
|
|
8
|
+
* display_player_sust_info assembly + configure_char_sheet layout)
|
|
9
|
+
*
|
|
10
|
+
* The upstream files split naturally into an engine (build a table of ui_entry
|
|
11
|
+
* records from ui_entry.txt / ui_entry_base.txt, bind object/player properties
|
|
12
|
+
* to them via the bindui directive, then for a given object or player combine
|
|
13
|
+
* the bound property values) and a renderer (turn a per-column (val, auxval)
|
|
14
|
+
* pair into a cell symbol + a palette-index colour, and colour the row label by
|
|
15
|
+
* the combined value). This module ports both halves as DATA: characterGrid()
|
|
16
|
+
* returns, per panel, an ordered list of rows; each row is a 6-char label, its
|
|
17
|
+
* colour, and one {symbol, color} cell per equipment slot then the player.
|
|
18
|
+
*
|
|
19
|
+
* The DRAW half stays with the shell: the Term_putch / Term_putstr row/col
|
|
20
|
+
* placement, region_erase, the screen-size priority culling of
|
|
21
|
+
* configure_char_sheet's "fit in 24 rows" clamp beyond what the row cap
|
|
22
|
+
* reproduces, the equippy header row and the "abcdefgimnop@" column header.
|
|
23
|
+
*
|
|
24
|
+
* Seams the port does not carry on GameState arrive through UiEntryDeps; each
|
|
25
|
+
* has a documented default and is listed in parity/ledger/ui-entry.yaml. The
|
|
26
|
+
* per-object known twin (obj->known) and player_flags_timed() are not ported,
|
|
27
|
+
* so the timed player-flag / timed element contributions default to "no timed
|
|
28
|
+
* effect" - faithful for a character with no active buffs.
|
|
29
|
+
*/
|
|
30
|
+
import { BASIC_COLORS, COLOR_TABLE, colorCharToAttr } from "../color.js";
|
|
31
|
+
import { FlagSet } from "../bitflag.js";
|
|
32
|
+
import { OF } from "../generated/object-flags.js";
|
|
33
|
+
import { PF } from "../generated/player-flags.js";
|
|
34
|
+
import { TMD } from "../generated/player-timed.js";
|
|
35
|
+
import { OBJ_MOD } from "../generated/object-modifiers.js";
|
|
36
|
+
import { STAT } from "../generated/stats.js";
|
|
37
|
+
import { ELEM, ELEMENT_ENTRIES } from "../generated/elements.js";
|
|
38
|
+
import { UI_ENTRY_RENDERER, UI_ENTRY_RENDERER_ENTRIES, } from "../generated/ui-entry-renderers.js";
|
|
39
|
+
import { EL_INFO_IGNORE, OF_SIZE } from "../obj/types.js";
|
|
40
|
+
import { SKILL } from "../player/types.js";
|
|
41
|
+
import { playerFlags } from "../player/calcs.js";
|
|
42
|
+
import { objectFullyKnown, objectKnownShadow } from "../obj/known-object.js";
|
|
43
|
+
import { gearGet } from "./gear.js";
|
|
44
|
+
import { knownDescOf } from "./describe.js";
|
|
45
|
+
/* ------------------------------------------------------------------ */
|
|
46
|
+
/* Special values (ui-entry-combiner.h) */
|
|
47
|
+
/* ------------------------------------------------------------------ */
|
|
48
|
+
const INT_MAX = 2147483647;
|
|
49
|
+
const INT_MIN = -2147483648;
|
|
50
|
+
/** ui-entry-combiner.h: real value unknown to the player. */
|
|
51
|
+
export const UI_ENTRY_UNKNOWN_VALUE = INT_MAX;
|
|
52
|
+
/** ui-entry-combiner.h: value is to be treated as not present. */
|
|
53
|
+
export const UI_ENTRY_VALUE_NOT_PRESENT = INT_MAX - 1;
|
|
54
|
+
/** ui-entry-combiner.h: resist + vulnerability but not immunity, same element. */
|
|
55
|
+
export const UI_ENTRY_RESIST0_RES_VUL = INT_MAX - 2;
|
|
56
|
+
/* Sign handling (ui-entry-renderers.c enum). */
|
|
57
|
+
const UI_ENTRY_NO_SIGN = 0;
|
|
58
|
+
const UI_ENTRY_ALWAYS_SIGN = 1;
|
|
59
|
+
const UI_ENTRY_NEGATIVE_SIGN = 2;
|
|
60
|
+
/* Object property types (obj/types.ts OBJ_PROPERTY). */
|
|
61
|
+
const OP_STAT = 1;
|
|
62
|
+
const OP_MOD = 2;
|
|
63
|
+
const OP_FLAG = 3;
|
|
64
|
+
const OP_IGNORE = 4;
|
|
65
|
+
const OP_RESIST = 5;
|
|
66
|
+
const OP_VULN = 6;
|
|
67
|
+
const OP_IMM = 7;
|
|
68
|
+
/* Entry flag bit (ui-entry.c ENTRY_FLAG_TIMED_AUX). */
|
|
69
|
+
const ENTRY_FLAG_TIMED_AUX = 1;
|
|
70
|
+
function simpleInit(v, a, st) {
|
|
71
|
+
st.work = null;
|
|
72
|
+
st.accum = v;
|
|
73
|
+
st.accumAux = a;
|
|
74
|
+
}
|
|
75
|
+
function dummyAccum() {
|
|
76
|
+
/* Do nothing. */
|
|
77
|
+
}
|
|
78
|
+
function dummyFinish() {
|
|
79
|
+
/* Do nothing. */
|
|
80
|
+
}
|
|
81
|
+
/* ADD */
|
|
82
|
+
function addHelp(x, accum) {
|
|
83
|
+
if (x === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
84
|
+
return accum;
|
|
85
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE) {
|
|
86
|
+
return accum === UI_ENTRY_VALUE_NOT_PRESENT ? UI_ENTRY_UNKNOWN_VALUE : accum;
|
|
87
|
+
}
|
|
88
|
+
if (accum === UI_ENTRY_UNKNOWN_VALUE || accum === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
89
|
+
return x;
|
|
90
|
+
}
|
|
91
|
+
if (x > 0) {
|
|
92
|
+
return accum <= INT_MAX - 2 - x ? accum + x : INT_MAX - 2;
|
|
93
|
+
}
|
|
94
|
+
if (x < 0) {
|
|
95
|
+
return accum >= INT_MIN - x ? accum + x : INT_MIN;
|
|
96
|
+
}
|
|
97
|
+
return accum;
|
|
98
|
+
}
|
|
99
|
+
const ADD = {
|
|
100
|
+
init: simpleInit,
|
|
101
|
+
accum(v, a, st) {
|
|
102
|
+
st.accum = addHelp(v, st.accum);
|
|
103
|
+
st.accumAux = addHelp(a, st.accumAux);
|
|
104
|
+
},
|
|
105
|
+
finish: dummyFinish,
|
|
106
|
+
vec(vals, auxs) {
|
|
107
|
+
let accum = vals.length > 0 ? vals[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
108
|
+
for (let i = 1; i < vals.length; i++)
|
|
109
|
+
accum = addHelp(vals[i], accum);
|
|
110
|
+
let accumAux = auxs.length > 0 ? auxs[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
111
|
+
for (let i = 1; i < auxs.length; i++)
|
|
112
|
+
accumAux = addHelp(auxs[i], accumAux);
|
|
113
|
+
return { accum, accumAux };
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
/* BITWISE_OR */
|
|
117
|
+
function bitwiseOrHelp(x, accum) {
|
|
118
|
+
if (x === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
119
|
+
return accum;
|
|
120
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE) {
|
|
121
|
+
return accum === UI_ENTRY_VALUE_NOT_PRESENT ? UI_ENTRY_UNKNOWN_VALUE : accum;
|
|
122
|
+
}
|
|
123
|
+
if (accum === UI_ENTRY_UNKNOWN_VALUE || accum === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
124
|
+
return x;
|
|
125
|
+
}
|
|
126
|
+
return accum | x;
|
|
127
|
+
}
|
|
128
|
+
const BITWISE_OR = {
|
|
129
|
+
init: simpleInit,
|
|
130
|
+
accum(v, a, st) {
|
|
131
|
+
st.accum = bitwiseOrHelp(v, st.accum);
|
|
132
|
+
st.accumAux = bitwiseOrHelp(a, st.accumAux);
|
|
133
|
+
},
|
|
134
|
+
finish: dummyFinish,
|
|
135
|
+
vec(vals, auxs) {
|
|
136
|
+
let accum = vals.length > 0 ? vals[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
137
|
+
for (let i = 1; i < vals.length; i++)
|
|
138
|
+
accum = bitwiseOrHelp(vals[i], accum);
|
|
139
|
+
let accumAux = auxs.length > 0 ? auxs[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
140
|
+
for (let i = 1; i < auxs.length; i++)
|
|
141
|
+
accumAux = bitwiseOrHelp(auxs[i], accumAux);
|
|
142
|
+
return { accum, accumAux };
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
/* FIRST */
|
|
146
|
+
const FIRST = {
|
|
147
|
+
init: simpleInit,
|
|
148
|
+
accum: dummyAccum,
|
|
149
|
+
finish: dummyFinish,
|
|
150
|
+
vec(vals, auxs) {
|
|
151
|
+
if (vals.length > 0)
|
|
152
|
+
return { accum: vals[0], accumAux: auxs[0] };
|
|
153
|
+
return { accum: UI_ENTRY_VALUE_NOT_PRESENT, accumAux: UI_ENTRY_VALUE_NOT_PRESENT };
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
/* LARGEST */
|
|
157
|
+
function largestHelp(x, accum) {
|
|
158
|
+
if (x === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
159
|
+
return accum;
|
|
160
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE) {
|
|
161
|
+
return accum === UI_ENTRY_VALUE_NOT_PRESENT ? UI_ENTRY_UNKNOWN_VALUE : accum;
|
|
162
|
+
}
|
|
163
|
+
if (accum === UI_ENTRY_UNKNOWN_VALUE ||
|
|
164
|
+
accum === UI_ENTRY_VALUE_NOT_PRESENT ||
|
|
165
|
+
accum < x) {
|
|
166
|
+
return x;
|
|
167
|
+
}
|
|
168
|
+
return accum;
|
|
169
|
+
}
|
|
170
|
+
const LARGEST = {
|
|
171
|
+
init: simpleInit,
|
|
172
|
+
accum(v, a, st) {
|
|
173
|
+
st.accum = largestHelp(v, st.accum);
|
|
174
|
+
st.accumAux = largestHelp(a, st.accumAux);
|
|
175
|
+
},
|
|
176
|
+
finish: dummyFinish,
|
|
177
|
+
vec(vals, auxs) {
|
|
178
|
+
let accum = vals.length > 0 ? vals[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
179
|
+
for (let i = 1; i < vals.length; i++)
|
|
180
|
+
accum = largestHelp(vals[i], accum);
|
|
181
|
+
let accumAux = auxs.length > 0 ? auxs[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
182
|
+
for (let i = 1; i < auxs.length; i++)
|
|
183
|
+
accumAux = largestHelp(auxs[i], accumAux);
|
|
184
|
+
return { accum, accumAux };
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
/* LAST */
|
|
188
|
+
const LAST = {
|
|
189
|
+
init: simpleInit,
|
|
190
|
+
accum(v, a, st) {
|
|
191
|
+
st.accum = v;
|
|
192
|
+
st.accumAux = a;
|
|
193
|
+
},
|
|
194
|
+
finish: dummyFinish,
|
|
195
|
+
vec(vals, auxs) {
|
|
196
|
+
if (vals.length > 0) {
|
|
197
|
+
return { accum: vals[vals.length - 1], accumAux: auxs[auxs.length - 1] };
|
|
198
|
+
}
|
|
199
|
+
return { accum: UI_ENTRY_VALUE_NOT_PRESENT, accumAux: UI_ENTRY_VALUE_NOT_PRESENT };
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
/* LOGICAL_OR */
|
|
203
|
+
function logicalInit(v, a, st) {
|
|
204
|
+
st.work = null;
|
|
205
|
+
st.accum =
|
|
206
|
+
v === UI_ENTRY_UNKNOWN_VALUE || v === UI_ENTRY_VALUE_NOT_PRESENT ? v : v !== 0 ? 1 : 0;
|
|
207
|
+
st.accumAux =
|
|
208
|
+
a === UI_ENTRY_UNKNOWN_VALUE || a === UI_ENTRY_VALUE_NOT_PRESENT ? a : a !== 0 ? 1 : 0;
|
|
209
|
+
}
|
|
210
|
+
function logicalOrHelp(x, accum) {
|
|
211
|
+
if (x === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
212
|
+
return accum;
|
|
213
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE) {
|
|
214
|
+
return accum === UI_ENTRY_VALUE_NOT_PRESENT ? UI_ENTRY_UNKNOWN_VALUE : accum;
|
|
215
|
+
}
|
|
216
|
+
if (accum === UI_ENTRY_UNKNOWN_VALUE || accum === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
217
|
+
return x !== 0 ? 1 : 0;
|
|
218
|
+
}
|
|
219
|
+
return accum || x !== 0 ? 1 : 0;
|
|
220
|
+
}
|
|
221
|
+
const LOGICAL_OR = {
|
|
222
|
+
init: logicalInit,
|
|
223
|
+
accum(v, a, st) {
|
|
224
|
+
st.accum = logicalOrHelp(v, st.accum);
|
|
225
|
+
st.accumAux = logicalOrHelp(a, st.accumAux);
|
|
226
|
+
},
|
|
227
|
+
finish: dummyFinish,
|
|
228
|
+
vec(vals, auxs) {
|
|
229
|
+
let accum = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
230
|
+
for (let i = 0; i < vals.length; i++)
|
|
231
|
+
accum = logicalOrHelp(vals[i], accum);
|
|
232
|
+
let accumAux = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
233
|
+
for (let i = 0; i < auxs.length; i++)
|
|
234
|
+
accumAux = logicalOrHelp(auxs[i], accumAux);
|
|
235
|
+
return { accum, accumAux };
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
/* LOGICAL_OR_WITH_CANCEL */
|
|
239
|
+
function locInit(v, a, st) {
|
|
240
|
+
st.work = null;
|
|
241
|
+
st.accum =
|
|
242
|
+
v === UI_ENTRY_UNKNOWN_VALUE || v === UI_ENTRY_VALUE_NOT_PRESENT
|
|
243
|
+
? v
|
|
244
|
+
: v > 0
|
|
245
|
+
? 1
|
|
246
|
+
: v < 0
|
|
247
|
+
? 2
|
|
248
|
+
: 0;
|
|
249
|
+
st.accumAux =
|
|
250
|
+
a === UI_ENTRY_UNKNOWN_VALUE || a === UI_ENTRY_VALUE_NOT_PRESENT
|
|
251
|
+
? a
|
|
252
|
+
: a > 0
|
|
253
|
+
? 1
|
|
254
|
+
: a < 0
|
|
255
|
+
? 2
|
|
256
|
+
: 0;
|
|
257
|
+
}
|
|
258
|
+
function locHelp(x, accum) {
|
|
259
|
+
if (x === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
260
|
+
return accum;
|
|
261
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE) {
|
|
262
|
+
return accum === UI_ENTRY_VALUE_NOT_PRESENT ? UI_ENTRY_UNKNOWN_VALUE : accum;
|
|
263
|
+
}
|
|
264
|
+
if (accum === UI_ENTRY_UNKNOWN_VALUE || accum === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
265
|
+
return x > 0 ? 1 : x < 0 ? 2 : 0;
|
|
266
|
+
}
|
|
267
|
+
if (x > 0)
|
|
268
|
+
return accum | 1;
|
|
269
|
+
if (x < 0)
|
|
270
|
+
return accum | 2;
|
|
271
|
+
return accum;
|
|
272
|
+
}
|
|
273
|
+
function locResolve(v) {
|
|
274
|
+
if (v !== UI_ENTRY_UNKNOWN_VALUE && v !== UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
275
|
+
if ((v & 2) !== 0)
|
|
276
|
+
return -1;
|
|
277
|
+
}
|
|
278
|
+
return v;
|
|
279
|
+
}
|
|
280
|
+
const LOGICAL_OR_WITH_CANCEL = {
|
|
281
|
+
init: locInit,
|
|
282
|
+
accum(v, a, st) {
|
|
283
|
+
st.accum = locHelp(v, st.accum);
|
|
284
|
+
st.accumAux = locHelp(a, st.accumAux);
|
|
285
|
+
},
|
|
286
|
+
finish(st) {
|
|
287
|
+
st.accum = locResolve(st.accum);
|
|
288
|
+
st.accumAux = locResolve(st.accumAux);
|
|
289
|
+
},
|
|
290
|
+
vec(vals, auxs) {
|
|
291
|
+
let accum = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
292
|
+
for (let i = 0; i < vals.length; i++)
|
|
293
|
+
accum = locHelp(vals[i], accum);
|
|
294
|
+
accum = locResolve(accum);
|
|
295
|
+
let accumAux = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
296
|
+
for (let i = 0; i < auxs.length; i++)
|
|
297
|
+
accumAux = locHelp(auxs[i], accumAux);
|
|
298
|
+
accumAux = locResolve(accumAux);
|
|
299
|
+
return { accum, accumAux };
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
/* RESIST_0 (uses work[0]=most negative for val, work[1]=most negative for aux) */
|
|
303
|
+
function resist0Seed(x) {
|
|
304
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE || x === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
305
|
+
return { pos: x, neg: x };
|
|
306
|
+
}
|
|
307
|
+
if (x === UI_ENTRY_RESIST0_RES_VUL)
|
|
308
|
+
return { pos: 1, neg: -1 };
|
|
309
|
+
if (x > 0)
|
|
310
|
+
return { pos: x, neg: 0 };
|
|
311
|
+
return { pos: 0, neg: x };
|
|
312
|
+
}
|
|
313
|
+
function resist0Help(x, pos, neg) {
|
|
314
|
+
if (x === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
315
|
+
return { pos, neg };
|
|
316
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE) {
|
|
317
|
+
if (pos === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
318
|
+
return { pos: UI_ENTRY_UNKNOWN_VALUE, neg: UI_ENTRY_UNKNOWN_VALUE };
|
|
319
|
+
}
|
|
320
|
+
return { pos, neg };
|
|
321
|
+
}
|
|
322
|
+
if (x === UI_ENTRY_RESIST0_RES_VUL) {
|
|
323
|
+
if (pos === UI_ENTRY_UNKNOWN_VALUE || pos === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
324
|
+
return { pos: 1, neg: -1 };
|
|
325
|
+
}
|
|
326
|
+
return { pos: pos < 1 ? 1 : pos, neg: neg > -1 ? -1 : neg };
|
|
327
|
+
}
|
|
328
|
+
if (x > 0) {
|
|
329
|
+
if (pos === UI_ENTRY_UNKNOWN_VALUE || pos === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
330
|
+
return { pos: x, neg: 0 };
|
|
331
|
+
}
|
|
332
|
+
return { pos: pos < x ? x : pos, neg };
|
|
333
|
+
}
|
|
334
|
+
if (neg === UI_ENTRY_UNKNOWN_VALUE || neg === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
335
|
+
return { pos: 0, neg: x };
|
|
336
|
+
}
|
|
337
|
+
return { pos, neg: neg > x ? x : neg };
|
|
338
|
+
}
|
|
339
|
+
function resist0Finish(pos, neg) {
|
|
340
|
+
if (neg < 0 && neg !== UI_ENTRY_UNKNOWN_VALUE && neg !== UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
341
|
+
/* A vulnerability cancels a resist but not an immunity. */
|
|
342
|
+
if (pos < 3 && pos !== UI_ENTRY_UNKNOWN_VALUE && pos !== UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
343
|
+
return pos === 0 ? -1 : UI_ENTRY_RESIST0_RES_VUL;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return pos;
|
|
347
|
+
}
|
|
348
|
+
const RESIST_0 = {
|
|
349
|
+
init(v, a, st) {
|
|
350
|
+
const sv = resist0Seed(v);
|
|
351
|
+
const sa = resist0Seed(a);
|
|
352
|
+
st.work = [sv.neg, sa.neg];
|
|
353
|
+
st.accum = sv.pos;
|
|
354
|
+
st.accumAux = sa.pos;
|
|
355
|
+
},
|
|
356
|
+
accum(v, a, st) {
|
|
357
|
+
const work = st.work;
|
|
358
|
+
const rv = resist0Help(v, st.accum, work[0]);
|
|
359
|
+
st.accum = rv.pos;
|
|
360
|
+
work[0] = rv.neg;
|
|
361
|
+
const ra = resist0Help(a, st.accumAux, work[1]);
|
|
362
|
+
st.accumAux = ra.pos;
|
|
363
|
+
work[1] = ra.neg;
|
|
364
|
+
},
|
|
365
|
+
finish(st) {
|
|
366
|
+
const work = st.work;
|
|
367
|
+
st.accum = resist0Finish(st.accum, work[0]);
|
|
368
|
+
st.accumAux = resist0Finish(st.accumAux, work[1]);
|
|
369
|
+
st.work = null;
|
|
370
|
+
},
|
|
371
|
+
vec(vals, auxs) {
|
|
372
|
+
let accum = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
373
|
+
let neg = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
374
|
+
for (let i = 0; i < vals.length; i++) {
|
|
375
|
+
const r = resist0Help(vals[i], accum, neg);
|
|
376
|
+
accum = r.pos;
|
|
377
|
+
neg = r.neg;
|
|
378
|
+
}
|
|
379
|
+
accum = resist0Finish(accum, neg);
|
|
380
|
+
let accumAux = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
381
|
+
let negA = UI_ENTRY_VALUE_NOT_PRESENT;
|
|
382
|
+
for (let i = 0; i < auxs.length; i++) {
|
|
383
|
+
const r = resist0Help(auxs[i], accumAux, negA);
|
|
384
|
+
accumAux = r.pos;
|
|
385
|
+
negA = r.neg;
|
|
386
|
+
}
|
|
387
|
+
accumAux = resist0Finish(accumAux, negA);
|
|
388
|
+
return { accum, accumAux };
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
/* SMALLEST */
|
|
392
|
+
function smallestHelp(x, accum) {
|
|
393
|
+
if (x === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
394
|
+
return accum;
|
|
395
|
+
if (x === UI_ENTRY_UNKNOWN_VALUE) {
|
|
396
|
+
return accum === UI_ENTRY_VALUE_NOT_PRESENT ? UI_ENTRY_UNKNOWN_VALUE : accum;
|
|
397
|
+
}
|
|
398
|
+
if (accum === UI_ENTRY_UNKNOWN_VALUE ||
|
|
399
|
+
accum === UI_ENTRY_VALUE_NOT_PRESENT ||
|
|
400
|
+
accum > x) {
|
|
401
|
+
return x;
|
|
402
|
+
}
|
|
403
|
+
return accum;
|
|
404
|
+
}
|
|
405
|
+
const SMALLEST = {
|
|
406
|
+
init: simpleInit,
|
|
407
|
+
accum(v, a, st) {
|
|
408
|
+
st.accum = smallestHelp(v, st.accum);
|
|
409
|
+
st.accumAux = smallestHelp(a, st.accumAux);
|
|
410
|
+
},
|
|
411
|
+
finish: dummyFinish,
|
|
412
|
+
vec(vals, auxs) {
|
|
413
|
+
let accum = vals.length > 0 ? vals[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
414
|
+
for (let i = 1; i < vals.length; i++)
|
|
415
|
+
accum = smallestHelp(vals[i], accum);
|
|
416
|
+
let accumAux = auxs.length > 0 ? auxs[0] : UI_ENTRY_VALUE_NOT_PRESENT;
|
|
417
|
+
for (let i = 1; i < auxs.length; i++)
|
|
418
|
+
accumAux = smallestHelp(auxs[i], accumAux);
|
|
419
|
+
return { accum, accumAux };
|
|
420
|
+
},
|
|
421
|
+
};
|
|
422
|
+
/** combiners[], sorted alphabetically by name (ui-entry-combiner.c L83). */
|
|
423
|
+
const COMBINERS = [
|
|
424
|
+
{ name: "ADD", funcs: ADD },
|
|
425
|
+
{ name: "BITWISE_OR", funcs: BITWISE_OR },
|
|
426
|
+
{ name: "FIRST", funcs: FIRST },
|
|
427
|
+
{ name: "LARGEST", funcs: LARGEST },
|
|
428
|
+
{ name: "LAST", funcs: LAST },
|
|
429
|
+
{ name: "LOGICAL_OR", funcs: LOGICAL_OR },
|
|
430
|
+
{ name: "LOGICAL_OR_WITH_CANCEL", funcs: LOGICAL_OR_WITH_CANCEL },
|
|
431
|
+
{ name: "RESIST_0", funcs: RESIST_0 },
|
|
432
|
+
{ name: "SMALLEST", funcs: SMALLEST },
|
|
433
|
+
];
|
|
434
|
+
/** ui_entry_combiner_lookup: 1-based index, 0 if unknown. */
|
|
435
|
+
export function combinerLookup(name) {
|
|
436
|
+
for (let i = 0; i < COMBINERS.length; i++) {
|
|
437
|
+
if (COMBINERS[i].name === name)
|
|
438
|
+
return i + 1;
|
|
439
|
+
}
|
|
440
|
+
return 0;
|
|
441
|
+
}
|
|
442
|
+
function combinerFuncs(index) {
|
|
443
|
+
const c = COMBINERS[index - 1];
|
|
444
|
+
if (!c)
|
|
445
|
+
throw new Error(`bad combiner index ${index}`);
|
|
446
|
+
return c.funcs;
|
|
447
|
+
}
|
|
448
|
+
/** Run a combiner over parallel arrays (its vec_func); exported for tests. */
|
|
449
|
+
export function combineValues(combinerName, vals, auxs) {
|
|
450
|
+
const idx = combinerLookup(combinerName);
|
|
451
|
+
if (idx === 0)
|
|
452
|
+
throw new Error(`unknown combiner ${combinerName}`);
|
|
453
|
+
return combinerFuncs(idx).vec(vals, auxs);
|
|
454
|
+
}
|
|
455
|
+
function signNameToInt(name) {
|
|
456
|
+
if (name === "NO_SIGN")
|
|
457
|
+
return UI_ENTRY_NO_SIGN;
|
|
458
|
+
if (name === "ALWAYS_SIGN")
|
|
459
|
+
return UI_ENTRY_ALWAYS_SIGN;
|
|
460
|
+
if (name === "NEGATIVE_SIGN")
|
|
461
|
+
return UI_ENTRY_NEGATIVE_SIGN;
|
|
462
|
+
return UI_ENTRY_NO_SIGN;
|
|
463
|
+
}
|
|
464
|
+
function colorsFromChars(chars) {
|
|
465
|
+
const out = [];
|
|
466
|
+
for (let i = 0; i < chars.length; i++) {
|
|
467
|
+
const a = colorCharToAttr(chars[i]);
|
|
468
|
+
out.push(a >= 0 ? a : 1 /* COLOUR_WHITE */);
|
|
469
|
+
}
|
|
470
|
+
return out;
|
|
471
|
+
}
|
|
472
|
+
/** augment_colors: extend attr[] with the default palette tail if shorter. */
|
|
473
|
+
function augmentColors(defaults, attr) {
|
|
474
|
+
if (attr.length < defaults.length) {
|
|
475
|
+
const tail = colorsFromChars(defaults.slice(attr.length));
|
|
476
|
+
return attr.concat(tail);
|
|
477
|
+
}
|
|
478
|
+
return attr;
|
|
479
|
+
}
|
|
480
|
+
/** augment_symbols: extend symbols with the default tail if shorter. */
|
|
481
|
+
function augmentSymbols(defaults, sym) {
|
|
482
|
+
return sym.length < defaults.length ? sym + defaults.slice(sym.length) : sym;
|
|
483
|
+
}
|
|
484
|
+
function buildRenderers(records) {
|
|
485
|
+
const out = [];
|
|
486
|
+
const byName = new Map();
|
|
487
|
+
/* First pass: create renderer_info, resolving the backend. */
|
|
488
|
+
for (const rec of records) {
|
|
489
|
+
const name = String(rec["name"]);
|
|
490
|
+
const code = String(rec["code"]);
|
|
491
|
+
const backendIndex = UI_ENTRY_RENDERER[code] ?? -1;
|
|
492
|
+
const backend = backendIndex >= 0 ? UI_ENTRY_RENDERER_ENTRIES[backendIndex] : null;
|
|
493
|
+
let colors = rec["colors"] !== undefined ? colorsFromChars(String(rec["colors"])) : [];
|
|
494
|
+
let labelColors = rec["labelcolors"] !== undefined ? colorsFromChars(String(rec["labelcolors"])) : [];
|
|
495
|
+
let symbols = rec["symbols"] !== undefined ? String(rec["symbols"]) : "";
|
|
496
|
+
/* finish_parse: default combiner + augment with backend defaults. */
|
|
497
|
+
let combinerIndex = rec["combine"] !== undefined ? combinerLookup(String(rec["combine"])) : 0;
|
|
498
|
+
if (backend) {
|
|
499
|
+
if (combinerIndex === 0)
|
|
500
|
+
combinerIndex = combinerLookup(backend.defaultCombinerName);
|
|
501
|
+
colors = augmentColors(backend.defaultColors, colors);
|
|
502
|
+
labelColors = augmentColors(backend.defaultLabelColors, labelColors);
|
|
503
|
+
symbols = augmentSymbols(backend.defaultSymbols, symbols);
|
|
504
|
+
}
|
|
505
|
+
const ndigit = rec["ndigit"] !== undefined ? Number(rec["ndigit"]) : (backend?.defaultNDigit ?? 1);
|
|
506
|
+
const sign = rec["sign"] !== undefined
|
|
507
|
+
? signNameToInt(String(rec["sign"]))
|
|
508
|
+
: signNameToInt(backend?.defaultSign ?? "NO_SIGN");
|
|
509
|
+
byName.set(name, out.length + 1);
|
|
510
|
+
out.push({
|
|
511
|
+
name,
|
|
512
|
+
backendIndex,
|
|
513
|
+
combinerIndex,
|
|
514
|
+
colors,
|
|
515
|
+
labelColors,
|
|
516
|
+
symbols,
|
|
517
|
+
ndigit,
|
|
518
|
+
sign,
|
|
519
|
+
combinedRendererIndex: 0,
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
/* Second pass: resolve combined-renderer links. */
|
|
523
|
+
for (let i = 0; i < records.length; i++) {
|
|
524
|
+
const cr = records[i]["combined-renderer"];
|
|
525
|
+
if (cr !== undefined) {
|
|
526
|
+
out[i].combinedRendererIndex = byName.get(String(cr)) ?? 0;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return out;
|
|
530
|
+
}
|
|
531
|
+
/** ui_entry_renderer_lookup: 1-based renderer index, 0 if unknown. */
|
|
532
|
+
function rendererLookup(renderers, name) {
|
|
533
|
+
for (let i = 0; i < renderers.length; i++) {
|
|
534
|
+
if (renderers[i].name === name)
|
|
535
|
+
return i + 1;
|
|
536
|
+
}
|
|
537
|
+
return 0;
|
|
538
|
+
}
|
|
539
|
+
/* ------------------------------------------------------------------ */
|
|
540
|
+
/* Concrete ui_entry table (ui-entry.c) */
|
|
541
|
+
/* ------------------------------------------------------------------ */
|
|
542
|
+
const MAX_SHORTENED = 10;
|
|
543
|
+
/** Priority scheme index: 0=default, 1=index, 2=negative_index. */
|
|
544
|
+
function priorityScheme(name) {
|
|
545
|
+
if (name === "index")
|
|
546
|
+
return 1;
|
|
547
|
+
if (name === "negative_index")
|
|
548
|
+
return 2;
|
|
549
|
+
return 0;
|
|
550
|
+
}
|
|
551
|
+
function applyPriorityScheme(scheme, i) {
|
|
552
|
+
if (scheme === 1)
|
|
553
|
+
return i;
|
|
554
|
+
if (scheme === 2)
|
|
555
|
+
return -i;
|
|
556
|
+
return 0;
|
|
557
|
+
}
|
|
558
|
+
/** Parameter kind: 0=none, 1=element, 2=stat. */
|
|
559
|
+
function parameterKind(name) {
|
|
560
|
+
if (name === "element")
|
|
561
|
+
return 1;
|
|
562
|
+
if (name === "stat")
|
|
563
|
+
return 2;
|
|
564
|
+
return 0;
|
|
565
|
+
}
|
|
566
|
+
function paramCount(kind) {
|
|
567
|
+
if (kind === 1)
|
|
568
|
+
return ELEMENT_ENTRIES.length;
|
|
569
|
+
if (kind === 2)
|
|
570
|
+
return 5; /* STAT_MAX */
|
|
571
|
+
return 1;
|
|
572
|
+
}
|
|
573
|
+
function paramName(kind, i) {
|
|
574
|
+
if (kind === 1)
|
|
575
|
+
return ELEMENT_ENTRIES[i].name;
|
|
576
|
+
if (kind === 2)
|
|
577
|
+
return ["STR", "INT", "WIS", "DEX", "CON"][i];
|
|
578
|
+
return "";
|
|
579
|
+
}
|
|
580
|
+
/** fill_out_shortened (ui-entry.c L1756): fill every shortened slot. */
|
|
581
|
+
function fillOutShortened(entry) {
|
|
582
|
+
for (let i = 0; i < MAX_SHORTENED; i++) {
|
|
583
|
+
if (entry.nshortened[i] !== 0)
|
|
584
|
+
continue;
|
|
585
|
+
let n;
|
|
586
|
+
let src;
|
|
587
|
+
let j = i + 1;
|
|
588
|
+
for (;;) {
|
|
589
|
+
if (j >= MAX_SHORTENED) {
|
|
590
|
+
n = entry.nlabel;
|
|
591
|
+
src = entry.label;
|
|
592
|
+
break;
|
|
593
|
+
}
|
|
594
|
+
if (entry.nshortened[j] !== 0) {
|
|
595
|
+
n = entry.nshortened[j];
|
|
596
|
+
src = entry.shortened[j];
|
|
597
|
+
break;
|
|
598
|
+
}
|
|
599
|
+
j++;
|
|
600
|
+
}
|
|
601
|
+
const take = n < i + 1 ? n : i + 1;
|
|
602
|
+
entry.nshortened[i] = take;
|
|
603
|
+
entry.shortened[i] = src.slice(0, take);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* get_ui_entry_label (ui-entry.c L337): the visible (length-1)-char label,
|
|
608
|
+
* padded left or right. The final null slot is the caller's business.
|
|
609
|
+
*/
|
|
610
|
+
function getUiEntryLabel(entry, length, padLeft) {
|
|
611
|
+
if (length <= 1)
|
|
612
|
+
return "";
|
|
613
|
+
let src;
|
|
614
|
+
let n;
|
|
615
|
+
if (length <= MAX_SHORTENED + 1) {
|
|
616
|
+
src = entry.shortened[length - 2];
|
|
617
|
+
n = entry.nshortened[length - 2];
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
src = entry.label;
|
|
621
|
+
n = entry.nlabel;
|
|
622
|
+
}
|
|
623
|
+
const content = length - 1;
|
|
624
|
+
if (n < content) {
|
|
625
|
+
const pad = " ".repeat(content - n);
|
|
626
|
+
return padLeft ? pad + src.slice(0, n) : src.slice(0, n) + pad;
|
|
627
|
+
}
|
|
628
|
+
return src.slice(0, content);
|
|
629
|
+
}
|
|
630
|
+
function blankEntry(name) {
|
|
631
|
+
return {
|
|
632
|
+
name,
|
|
633
|
+
categories: [],
|
|
634
|
+
objProps: [],
|
|
635
|
+
pAbilities: [],
|
|
636
|
+
label: "",
|
|
637
|
+
nlabel: 0,
|
|
638
|
+
shortened: new Array(MAX_SHORTENED).fill(""),
|
|
639
|
+
nshortened: new Array(MAX_SHORTENED).fill(0),
|
|
640
|
+
rendererIndex: 0,
|
|
641
|
+
combinerIndex: 0,
|
|
642
|
+
defaultPriority: 0,
|
|
643
|
+
paramIndex: -1,
|
|
644
|
+
flags: 0,
|
|
645
|
+
templateOnly: false,
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
/** search_categories on a UiEntry: insert if absent (kept sorted by name). */
|
|
649
|
+
function addCategory(entry, name, priority) {
|
|
650
|
+
let lo = 0;
|
|
651
|
+
let hi = entry.categories.length;
|
|
652
|
+
while (lo < hi) {
|
|
653
|
+
const mid = (lo + hi) >> 1;
|
|
654
|
+
const cmp = entry.categories[mid].name < name ? -1 : entry.categories[mid].name > name ? 1 : 0;
|
|
655
|
+
if (cmp === 0)
|
|
656
|
+
return; /* already present */
|
|
657
|
+
if (cmp < 0)
|
|
658
|
+
lo = mid + 1;
|
|
659
|
+
else
|
|
660
|
+
hi = mid;
|
|
661
|
+
}
|
|
662
|
+
entry.categories.splice(lo, 0, { name, priority });
|
|
663
|
+
}
|
|
664
|
+
function categoryPriority(entry, name) {
|
|
665
|
+
for (const c of entry.categories) {
|
|
666
|
+
if (c.name === name)
|
|
667
|
+
return c.priority;
|
|
668
|
+
}
|
|
669
|
+
return null;
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* Build the ui_entry table from ui_entry_base.txt (templates) then
|
|
673
|
+
* ui_entry.txt, mirroring run_parse_ui_entry / hatch_embryo. Records are keyed
|
|
674
|
+
* by name; a record whose name already exists edits that entry, otherwise a new
|
|
675
|
+
* one is created (and, if it carries a parameter, expanded per element/stat).
|
|
676
|
+
*/
|
|
677
|
+
function buildEntries(baseRecords, entryRecords, renderers) {
|
|
678
|
+
const table = new Map();
|
|
679
|
+
const strField = (rec, key) => rec[key] !== undefined ? String(rec[key]) : undefined;
|
|
680
|
+
const arrField = (rec, key) => {
|
|
681
|
+
const v = rec[key];
|
|
682
|
+
if (v === undefined)
|
|
683
|
+
return [];
|
|
684
|
+
return Array.isArray(v) ? v.map(String) : [String(v)];
|
|
685
|
+
};
|
|
686
|
+
const hatch = (rec, templateOnlyDefault) => {
|
|
687
|
+
const name = rec.name;
|
|
688
|
+
const existing = table.get(name);
|
|
689
|
+
if (existing) {
|
|
690
|
+
/* Edit an existing entry. */
|
|
691
|
+
applyRecordToEntry(rec, existing, renderers, strField, arrField, -1, 0);
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
const kind = parameterKind(strField(rec, "parameter"));
|
|
695
|
+
/* Determine the priority scheme source for a fresh (possibly generic) entry. */
|
|
696
|
+
const priorityStr = strField(rec, "priority");
|
|
697
|
+
const psource = priorityStr !== undefined ? priorityScheme(priorityStr) : 0;
|
|
698
|
+
if (kind === 0) {
|
|
699
|
+
const entry = blankEntry(name);
|
|
700
|
+
entry.templateOnly = templateOnlyDefault;
|
|
701
|
+
applyRecordToEntry(rec, entry, renderers, strField, arrField, -1, 0);
|
|
702
|
+
table.set(name, entry);
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
/* Generic entry: expand into one concrete entry per parameter value. */
|
|
706
|
+
const n = paramCount(kind);
|
|
707
|
+
for (let i = 0; i < n; i++) {
|
|
708
|
+
const pname = paramName(kind, i);
|
|
709
|
+
const entry = blankEntry(`${name}<${pname}>`);
|
|
710
|
+
entry.templateOnly = templateOnlyDefault;
|
|
711
|
+
entry.paramIndex = i;
|
|
712
|
+
applyRecordToEntry(rec, entry, renderers, strField, arrField, i, psource);
|
|
713
|
+
/* Default label is the parameter name unless one was set. */
|
|
714
|
+
if (entry.nlabel === 0) {
|
|
715
|
+
entry.label = pname;
|
|
716
|
+
entry.nlabel = pname.length;
|
|
717
|
+
}
|
|
718
|
+
table.set(entry.name, entry);
|
|
719
|
+
}
|
|
720
|
+
};
|
|
721
|
+
for (const rec of baseRecords)
|
|
722
|
+
hatch(rec, false);
|
|
723
|
+
/* After the base file, all entries so far become templates-only. */
|
|
724
|
+
for (const e of table.values())
|
|
725
|
+
e.templateOnly = true;
|
|
726
|
+
for (const rec of entryRecords)
|
|
727
|
+
hatch(rec, false);
|
|
728
|
+
/* finish_parse: default labels from name, fill shortened, fill priorities. */
|
|
729
|
+
for (const entry of table.values()) {
|
|
730
|
+
if (entry.nlabel === 0) {
|
|
731
|
+
entry.label = entry.name;
|
|
732
|
+
entry.nlabel = entry.name.length;
|
|
733
|
+
}
|
|
734
|
+
fillOutShortened(entry);
|
|
735
|
+
/*
|
|
736
|
+
* finish_parse (ui-entry.c L2389): categories with no explicit per-category
|
|
737
|
+
* priority inherit the entry's final default priority. The shipped data
|
|
738
|
+
* never sets a per-category priority (priority always precedes any category
|
|
739
|
+
* line, so it sets the default), so every category takes defaultPriority -
|
|
740
|
+
* which is what makes the priority line seen after a template's categories
|
|
741
|
+
* still order the row correctly.
|
|
742
|
+
*/
|
|
743
|
+
for (const c of entry.categories) {
|
|
744
|
+
c.priority = entry.defaultPriority;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
return table;
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Apply one parsed record's fields to an entry, resolving template, renderer,
|
|
751
|
+
* combiner, labels, categories, priority and flags. paramIdx/psource drive the
|
|
752
|
+
* generic priority scheme (negative_index etc.) for expanded entries.
|
|
753
|
+
*/
|
|
754
|
+
function applyRecordToEntry(rec, entry, renderers, strField, arrField, paramIdx, psource) {
|
|
755
|
+
/* Template first: copy simple fields and merge its categories. */
|
|
756
|
+
const template = strField(rec, "template");
|
|
757
|
+
if (template !== undefined) {
|
|
758
|
+
const t = TEMPLATE_LOOKUP.get(template);
|
|
759
|
+
if (t) {
|
|
760
|
+
entry.rendererIndex = t.rendererIndex;
|
|
761
|
+
entry.combinerIndex = t.combinerIndex;
|
|
762
|
+
entry.defaultPriority = t.defaultPriority;
|
|
763
|
+
entry.flags = t.flags & ~0; /* TEMPLATE_ONLY is not a data flag here */
|
|
764
|
+
for (const c of t.categories)
|
|
765
|
+
addCategory(entry, c.name, entry.defaultPriority);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
const renderer = strField(rec, "renderer");
|
|
769
|
+
if (renderer !== undefined)
|
|
770
|
+
entry.rendererIndex = rendererLookup(renderers, renderer);
|
|
771
|
+
const combine = strField(rec, "combine");
|
|
772
|
+
if (combine !== undefined)
|
|
773
|
+
entry.combinerIndex = combinerLookup(combine);
|
|
774
|
+
const label = strField(rec, "label");
|
|
775
|
+
if (label !== undefined) {
|
|
776
|
+
entry.label = label;
|
|
777
|
+
entry.nlabel = label.length;
|
|
778
|
+
}
|
|
779
|
+
for (let k = 1; k <= MAX_SHORTENED; k++) {
|
|
780
|
+
const s = strField(rec, `label${k}`);
|
|
781
|
+
if (s !== undefined) {
|
|
782
|
+
const take = s.length < k ? s.length : k;
|
|
783
|
+
entry.shortened[k - 1] = s.slice(0, take);
|
|
784
|
+
entry.nshortened[k - 1] = take;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
/* Priority (before any category in the shipped data -> default priority). */
|
|
788
|
+
const priorityStr = strField(rec, "priority");
|
|
789
|
+
if (priorityStr !== undefined) {
|
|
790
|
+
const scheme = priorityScheme(priorityStr);
|
|
791
|
+
if (scheme !== 0) {
|
|
792
|
+
entry.defaultPriority = applyPriorityScheme(scheme, paramIdx >= 0 ? paramIdx : entry.paramIndex >= 0 ? entry.paramIndex : 0);
|
|
793
|
+
}
|
|
794
|
+
else {
|
|
795
|
+
const v = parseInt(priorityStr, 10);
|
|
796
|
+
if (!Number.isNaN(v))
|
|
797
|
+
entry.defaultPriority = v;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
else if (psource !== 0 && paramIdx >= 0) {
|
|
801
|
+
entry.defaultPriority = applyPriorityScheme(psource, paramIdx);
|
|
802
|
+
}
|
|
803
|
+
/* Categories: added with the (now-resolved) default priority. */
|
|
804
|
+
for (const cat of arrField(rec, "category")) {
|
|
805
|
+
addCategory(entry, cat, entry.defaultPriority);
|
|
806
|
+
}
|
|
807
|
+
/* Flags. */
|
|
808
|
+
for (const fl of arrField(rec, "flags")) {
|
|
809
|
+
for (const tok of fl.split(/[\s|]+/)) {
|
|
810
|
+
if (tok === "TIMED_AS_AUX")
|
|
811
|
+
entry.flags |= ENTRY_FLAG_TIMED_AUX;
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
/** Lookup used by applyRecordToEntry for template resolution. */
|
|
816
|
+
let TEMPLATE_LOOKUP = new Map();
|
|
817
|
+
/* ------------------------------------------------------------------ */
|
|
818
|
+
/* Binding object / player properties to entries (the bindui directive) */
|
|
819
|
+
/* ------------------------------------------------------------------ */
|
|
820
|
+
function objPropType(typeStr) {
|
|
821
|
+
switch (typeStr) {
|
|
822
|
+
case "stat":
|
|
823
|
+
return OP_STAT;
|
|
824
|
+
case "mod":
|
|
825
|
+
return OP_MOD;
|
|
826
|
+
case "flag":
|
|
827
|
+
return OP_FLAG;
|
|
828
|
+
case "ignore":
|
|
829
|
+
return OP_IGNORE;
|
|
830
|
+
case "resistance":
|
|
831
|
+
return OP_RESIST;
|
|
832
|
+
case "vulnerability":
|
|
833
|
+
return OP_VULN;
|
|
834
|
+
case "immunity":
|
|
835
|
+
return OP_IMM;
|
|
836
|
+
default:
|
|
837
|
+
return 0;
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
/** Resolve an object property's code to its index within its type. */
|
|
841
|
+
function objPropIndex(typeStr, code) {
|
|
842
|
+
switch (typeStr) {
|
|
843
|
+
case "stat":
|
|
844
|
+
return STAT[code] ?? -1;
|
|
845
|
+
case "mod":
|
|
846
|
+
return OBJ_MOD[code] ?? -1;
|
|
847
|
+
case "flag":
|
|
848
|
+
return OF[code] ?? -1;
|
|
849
|
+
case "ignore":
|
|
850
|
+
case "resistance":
|
|
851
|
+
case "vulnerability":
|
|
852
|
+
case "immunity":
|
|
853
|
+
return ELEM[code] ?? -1;
|
|
854
|
+
default:
|
|
855
|
+
return -1;
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
function bindObjectProperties(table, records) {
|
|
859
|
+
for (const rec of records) {
|
|
860
|
+
const bindui = rec["bindui"];
|
|
861
|
+
if (!bindui)
|
|
862
|
+
continue;
|
|
863
|
+
const uiName = String(bindui["ui"]);
|
|
864
|
+
const entry = table.get(uiName);
|
|
865
|
+
if (!entry)
|
|
866
|
+
continue;
|
|
867
|
+
const typeStr = String(rec["type"]);
|
|
868
|
+
const code = String(rec["code"]);
|
|
869
|
+
const type = objPropType(typeStr);
|
|
870
|
+
const index = objPropIndex(typeStr, code);
|
|
871
|
+
if (type === 0 || index < 0)
|
|
872
|
+
continue;
|
|
873
|
+
const haveValue = bindui["uival"] !== undefined;
|
|
874
|
+
const value = haveValue ? Number(bindui["uival"]) : 0;
|
|
875
|
+
const isaux = Number(bindui["aux"]) !== 0;
|
|
876
|
+
entry.objProps.push({ type, index, value, haveValue, isaux });
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
function bindPlayerProperties(table, records) {
|
|
880
|
+
const elementCount = ELEMENT_ENTRIES.length;
|
|
881
|
+
for (const rec of records) {
|
|
882
|
+
const bindui = rec["bindui"];
|
|
883
|
+
if (!bindui)
|
|
884
|
+
continue;
|
|
885
|
+
const abilityType = String(rec["type"]);
|
|
886
|
+
const uiName = String(bindui["ui"]);
|
|
887
|
+
const uival = bindui["uival"] !== undefined ? String(bindui["uival"]) : "";
|
|
888
|
+
const isspecial = uival === "special";
|
|
889
|
+
const haveValue = !isspecial;
|
|
890
|
+
const value = isspecial ? 0 : parseInt(uival, 10) || 0;
|
|
891
|
+
const isaux = Number(bindui["aux"]) !== 0;
|
|
892
|
+
if (abilityType === "element") {
|
|
893
|
+
/* finish_parse_player_prop (init.c L1362): one ability per element,
|
|
894
|
+
excluding the last, bound to "<ui><ELEM>". */
|
|
895
|
+
for (let i = 0; i < elementCount - 1; i++) {
|
|
896
|
+
const name = `${uiName}<${ELEMENT_ENTRIES[i].name}>`;
|
|
897
|
+
const entry = table.get(name);
|
|
898
|
+
if (!entry)
|
|
899
|
+
continue;
|
|
900
|
+
entry.pAbilities.push({ abilityType: "element", index: i, value, haveValue, isaux });
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
else {
|
|
904
|
+
const entry = table.get(uiName);
|
|
905
|
+
if (!entry)
|
|
906
|
+
continue;
|
|
907
|
+
const code = rec["code"] !== undefined ? String(rec["code"]) : "";
|
|
908
|
+
let index = -1;
|
|
909
|
+
if (abilityType === "player")
|
|
910
|
+
index = PF[code] ?? -1;
|
|
911
|
+
else if (abilityType === "object")
|
|
912
|
+
index = OF[code] ?? -1;
|
|
913
|
+
if (index < 0)
|
|
914
|
+
continue;
|
|
915
|
+
entry.pAbilities.push({ abilityType, index, value, haveValue, isaux });
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
/**
|
|
920
|
+
* One config per pack-records object, so every screen shares the SAME renderer
|
|
921
|
+
* table. Upstream's renderers are file-scope globals that
|
|
922
|
+
* ui_entry_renderer_customize mutates in place; if each caller rebuilt its own
|
|
923
|
+
* copy, an `entry-renderer:` pref line would change one screen and not the next.
|
|
924
|
+
*/
|
|
925
|
+
const UI_ENTRY_CONFIG_CACHE = new WeakMap();
|
|
926
|
+
/**
|
|
927
|
+
* Build the whole ui_entry config from the compiled pack records, memoised on
|
|
928
|
+
* the records object (see UI_ENTRY_CONFIG_CACHE).
|
|
929
|
+
*/
|
|
930
|
+
export function buildUiEntryConfig(packs) {
|
|
931
|
+
const hit = UI_ENTRY_CONFIG_CACHE.get(packs);
|
|
932
|
+
if (hit)
|
|
933
|
+
return hit;
|
|
934
|
+
const built = buildUiEntryConfigUncached(packs);
|
|
935
|
+
UI_ENTRY_CONFIG_CACHE.set(packs, built);
|
|
936
|
+
return built;
|
|
937
|
+
}
|
|
938
|
+
function buildUiEntryConfigUncached(packs) {
|
|
939
|
+
const renderers = buildRenderers(packs.uiEntryRenderer);
|
|
940
|
+
/* The base file's entries become the template pool. */
|
|
941
|
+
TEMPLATE_LOOKUP = new Map();
|
|
942
|
+
const baseTable = buildEntries(packs.uiEntryBase, [], renderers);
|
|
943
|
+
TEMPLATE_LOOKUP = baseTable;
|
|
944
|
+
/* Now build the full table: base entries (templates) plus ui_entry.txt. */
|
|
945
|
+
const table = buildEntries(packs.uiEntryBase, packs.uiEntry, renderers);
|
|
946
|
+
TEMPLATE_LOOKUP = table;
|
|
947
|
+
bindObjectProperties(table, packs.objectProperty);
|
|
948
|
+
bindPlayerProperties(table, packs.playerProperty);
|
|
949
|
+
const entries = [...table.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
950
|
+
return { entries, renderers };
|
|
951
|
+
}
|
|
952
|
+
/* ------------------------------------------------------------------ */
|
|
953
|
+
/* Iterator (initialize_ui_entry_iterator + cmp_desc_prio) */
|
|
954
|
+
/* ------------------------------------------------------------------ */
|
|
955
|
+
/** Entries with both categories, ordered by descending sortcategory priority. */
|
|
956
|
+
function iterateEntries(config, cat0, cat1, sortCategory) {
|
|
957
|
+
const selected = config.entries.filter((e) => !e.templateOnly &&
|
|
958
|
+
categoryPriority(e, cat0) !== null &&
|
|
959
|
+
categoryPriority(e, cat1) !== null);
|
|
960
|
+
selected.sort((left, right) => {
|
|
961
|
+
const lp = categoryPriority(left, sortCategory);
|
|
962
|
+
const rp = categoryPriority(right, sortCategory);
|
|
963
|
+
if (lp !== null && rp !== null) {
|
|
964
|
+
if (lp > rp)
|
|
965
|
+
return -1;
|
|
966
|
+
if (lp < rp)
|
|
967
|
+
return 1;
|
|
968
|
+
return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
|
|
969
|
+
}
|
|
970
|
+
if (lp !== null)
|
|
971
|
+
return -1;
|
|
972
|
+
if (rp !== null)
|
|
973
|
+
return 1;
|
|
974
|
+
return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
|
|
975
|
+
});
|
|
976
|
+
return selected;
|
|
977
|
+
}
|
|
978
|
+
/* ------------------------------------------------------------------ */
|
|
979
|
+
/* is_ui_entry_for_known_rune (ui-entry.c L591) */
|
|
980
|
+
/* ------------------------------------------------------------------ */
|
|
981
|
+
export function isUiEntryForKnownRune(entry, p) {
|
|
982
|
+
const objKnown = p.objKnown;
|
|
983
|
+
for (const op of entry.objProps) {
|
|
984
|
+
const ind = op.index;
|
|
985
|
+
switch (op.type) {
|
|
986
|
+
case OP_STAT:
|
|
987
|
+
case OP_MOD:
|
|
988
|
+
if ((objKnown.modifiers[ind] ?? 0) === 0)
|
|
989
|
+
return false;
|
|
990
|
+
break;
|
|
991
|
+
case OP_FLAG:
|
|
992
|
+
if (!objKnown.flags.has(ind))
|
|
993
|
+
return false;
|
|
994
|
+
break;
|
|
995
|
+
case OP_IGNORE:
|
|
996
|
+
case OP_RESIST:
|
|
997
|
+
case OP_VULN:
|
|
998
|
+
case OP_IMM:
|
|
999
|
+
if ((objKnown.elInfo[ind]?.resLevel ?? 0) === 0)
|
|
1000
|
+
return false;
|
|
1001
|
+
break;
|
|
1002
|
+
default:
|
|
1003
|
+
return false;
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
for (const pa of entry.pAbilities) {
|
|
1007
|
+
const ind = pa.index;
|
|
1008
|
+
if (pa.abilityType === "player") {
|
|
1009
|
+
continue;
|
|
1010
|
+
}
|
|
1011
|
+
else if (pa.abilityType === "object") {
|
|
1012
|
+
if (!objKnown.flags.has(ind))
|
|
1013
|
+
return false;
|
|
1014
|
+
}
|
|
1015
|
+
else if (pa.abilityType === "element") {
|
|
1016
|
+
if ((objKnown.elInfo[ind]?.resLevel ?? 0) === 0)
|
|
1017
|
+
return false;
|
|
1018
|
+
}
|
|
1019
|
+
else {
|
|
1020
|
+
return false;
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
return true;
|
|
1024
|
+
}
|
|
1025
|
+
/* ------------------------------------------------------------------ */
|
|
1026
|
+
/* Timed helpers (ui-entry.c) */
|
|
1027
|
+
/* ------------------------------------------------------------------ */
|
|
1028
|
+
/** get_timed_modifier_effect (ui-entry.c L1370): fully self-contained. */
|
|
1029
|
+
function getTimedModifierEffect(p, ind) {
|
|
1030
|
+
switch (ind) {
|
|
1031
|
+
case OBJ_MOD.BLOWS:
|
|
1032
|
+
return p.timed[TMD.BLOODLUST] ? Math.trunc(p.timed[TMD.BLOODLUST] / 20) : 0;
|
|
1033
|
+
case OBJ_MOD.INFRA:
|
|
1034
|
+
return p.timed[TMD.SINFRA] ? 5 : 0;
|
|
1035
|
+
case OBJ_MOD.SPEED: {
|
|
1036
|
+
let result = p.timed[TMD.FAST] || p.timed[TMD.SPRINT] ? 10 : 0;
|
|
1037
|
+
if (p.timed[TMD.STONESKIN])
|
|
1038
|
+
result -= 5;
|
|
1039
|
+
if (p.timed[TMD.SLOW])
|
|
1040
|
+
result -= 10;
|
|
1041
|
+
if (p.timed[TMD.TERROR])
|
|
1042
|
+
result += 10;
|
|
1043
|
+
return result;
|
|
1044
|
+
}
|
|
1045
|
+
case OBJ_MOD.STEALTH:
|
|
1046
|
+
return p.timed[TMD.STEALTH] ? 10 : 0;
|
|
1047
|
+
default:
|
|
1048
|
+
return 0;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
/** modifier_to_skill (ui-entry.c L1317): only TUNNEL -> digging/20 is live. */
|
|
1052
|
+
function modifierToSkill(modind) {
|
|
1053
|
+
if (modind === OBJ_MOD.TUNNEL)
|
|
1054
|
+
return { skill: SKILL.DIGGING, num: 1, den: 20 };
|
|
1055
|
+
return { skill: -1, num: 1, den: 1 };
|
|
1056
|
+
}
|
|
1057
|
+
/* ------------------------------------------------------------------ */
|
|
1058
|
+
/* compute_ui_entry_values_for_object (ui-entry.c L708) */
|
|
1059
|
+
/* ------------------------------------------------------------------ */
|
|
1060
|
+
/**
|
|
1061
|
+
* The per-object combined (val, auxval). obj may be null (NOT_PRESENT). p is
|
|
1062
|
+
* used to gate knowledge via p.objKnown. The upstream separate curse-object
|
|
1063
|
+
* iteration is deferred (see the ledger); this reads the object's own
|
|
1064
|
+
* flags/modifiers/el_info, which already fold in merged curse data in the port.
|
|
1065
|
+
*
|
|
1066
|
+
* `fullyKnown` is object_fully_known(obj) (obj-knowledge.c L754), which is the
|
|
1067
|
+
* FIRST route out of both object_flag_is_known (L776) and
|
|
1068
|
+
* object_element_is_known (L799) - upstream calls those two helpers here rather
|
|
1069
|
+
* than reading p->obj_k directly. It is true for gear with no unknown runes,
|
|
1070
|
+
* which for ordinary equipment (a plain torch, soft leather armour, a mundane
|
|
1071
|
+
* weapon) means no runes at all, so every flag and element reads as KNOWN and
|
|
1072
|
+
* the grid prints '.'. Callers that cannot synthesise obj->known leave it false,
|
|
1073
|
+
* the pre-existing p->obj_k-only behaviour. The MOD/STAT case takes no such
|
|
1074
|
+
* route in upstream either (L764: raw p->obj_k->modifiers), and does not here.
|
|
1075
|
+
*/
|
|
1076
|
+
export function computeObjectValues(entry, obj, p, fullyKnown = false) {
|
|
1077
|
+
if (!obj || entry.objProps.length === 0) {
|
|
1078
|
+
return { val: UI_ENTRY_VALUE_NOT_PRESENT, auxval: UI_ENTRY_VALUE_NOT_PRESENT };
|
|
1079
|
+
}
|
|
1080
|
+
const combiner = combinerFuncs(entry.combinerIndex);
|
|
1081
|
+
const st = { work: null, accum: 0, accumAux: 0 };
|
|
1082
|
+
let first = true;
|
|
1083
|
+
let anyAux = false;
|
|
1084
|
+
let allAux = true;
|
|
1085
|
+
for (const op of entry.objProps) {
|
|
1086
|
+
const ind = op.index;
|
|
1087
|
+
let v = 0;
|
|
1088
|
+
let a = 0;
|
|
1089
|
+
if (op.isaux) {
|
|
1090
|
+
if (entry.flags & ENTRY_FLAG_TIMED_AUX)
|
|
1091
|
+
continue;
|
|
1092
|
+
anyAux = true;
|
|
1093
|
+
}
|
|
1094
|
+
else {
|
|
1095
|
+
allAux = false;
|
|
1096
|
+
}
|
|
1097
|
+
switch (op.type) {
|
|
1098
|
+
case OP_STAT:
|
|
1099
|
+
case OP_MOD:
|
|
1100
|
+
if ((p.objKnown.modifiers[ind] ?? 0) !== 0 || (obj.modifiers[ind] ?? 0) === 0) {
|
|
1101
|
+
v = obj.modifiers[ind] ?? 0;
|
|
1102
|
+
if (v && op.haveValue)
|
|
1103
|
+
v = op.value;
|
|
1104
|
+
}
|
|
1105
|
+
else {
|
|
1106
|
+
v = UI_ENTRY_UNKNOWN_VALUE;
|
|
1107
|
+
a = UI_ENTRY_UNKNOWN_VALUE;
|
|
1108
|
+
}
|
|
1109
|
+
break;
|
|
1110
|
+
case OP_FLAG:
|
|
1111
|
+
/* object_flag_is_known (obj-knowledge.c L773-787). */
|
|
1112
|
+
if (fullyKnown || p.objKnown.flags.has(ind)) {
|
|
1113
|
+
v = obj.flags.has(ind) ? 1 : 0;
|
|
1114
|
+
if (v && op.haveValue)
|
|
1115
|
+
v = op.value;
|
|
1116
|
+
}
|
|
1117
|
+
else {
|
|
1118
|
+
v = UI_ENTRY_UNKNOWN_VALUE;
|
|
1119
|
+
a = UI_ENTRY_UNKNOWN_VALUE;
|
|
1120
|
+
}
|
|
1121
|
+
break;
|
|
1122
|
+
case OP_IGNORE:
|
|
1123
|
+
/* object_element_is_known (obj-knowledge.c L795-809). */
|
|
1124
|
+
if (fullyKnown || (p.objKnown.elInfo[ind]?.resLevel ?? 0) !== 0) {
|
|
1125
|
+
v = ((obj.elInfo[ind]?.flags ?? 0) & EL_INFO_IGNORE) !== 0 ? 1 : 0;
|
|
1126
|
+
if (v && op.haveValue)
|
|
1127
|
+
v = op.value;
|
|
1128
|
+
}
|
|
1129
|
+
else {
|
|
1130
|
+
v = UI_ENTRY_UNKNOWN_VALUE;
|
|
1131
|
+
a = UI_ENTRY_UNKNOWN_VALUE;
|
|
1132
|
+
}
|
|
1133
|
+
break;
|
|
1134
|
+
case OP_RESIST:
|
|
1135
|
+
case OP_VULN:
|
|
1136
|
+
case OP_IMM:
|
|
1137
|
+
/* object_element_is_known (obj-knowledge.c L795-809). */
|
|
1138
|
+
if (fullyKnown || (p.objKnown.elInfo[ind]?.resLevel ?? 0) !== 0) {
|
|
1139
|
+
v = obj.elInfo[ind]?.resLevel ?? 0;
|
|
1140
|
+
if (v && op.haveValue)
|
|
1141
|
+
v = op.value;
|
|
1142
|
+
}
|
|
1143
|
+
else {
|
|
1144
|
+
v = UI_ENTRY_UNKNOWN_VALUE;
|
|
1145
|
+
a = UI_ENTRY_UNKNOWN_VALUE;
|
|
1146
|
+
}
|
|
1147
|
+
break;
|
|
1148
|
+
default:
|
|
1149
|
+
v = 0;
|
|
1150
|
+
break;
|
|
1151
|
+
}
|
|
1152
|
+
if (v) {
|
|
1153
|
+
if (op.isaux) {
|
|
1154
|
+
const t = a;
|
|
1155
|
+
a = v;
|
|
1156
|
+
v = t;
|
|
1157
|
+
}
|
|
1158
|
+
if (first) {
|
|
1159
|
+
combiner.init(v, a, st);
|
|
1160
|
+
first = false;
|
|
1161
|
+
}
|
|
1162
|
+
else {
|
|
1163
|
+
combiner.accum(v, a, st);
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
if (!first)
|
|
1168
|
+
combiner.finish(st);
|
|
1169
|
+
return {
|
|
1170
|
+
val: allAux ? 0 : st.accum,
|
|
1171
|
+
auxval: anyAux ? st.accumAux : 0,
|
|
1172
|
+
};
|
|
1173
|
+
}
|
|
1174
|
+
export function resolveUiDeps(p, deps) {
|
|
1175
|
+
const timed = deps.timedObjectFlags ?? new FlagSet(OF_SIZE);
|
|
1176
|
+
if (p.timed[TMD.TRAPSAFE])
|
|
1177
|
+
timed.on(OF.TRAP_IMMUNE);
|
|
1178
|
+
const pflags = p.pflags;
|
|
1179
|
+
return {
|
|
1180
|
+
timedObjectFlags: timed,
|
|
1181
|
+
timedElementEffect: deps.timedElementEffect ?? (() => 0),
|
|
1182
|
+
playerHas: deps.playerHas ?? ((flag) => (pflags ? pflags.has(flag) : false)),
|
|
1183
|
+
};
|
|
1184
|
+
}
|
|
1185
|
+
export function computePlayerValues(entry, p, deps, cache) {
|
|
1186
|
+
const combiner = combinerFuncs(entry.combinerIndex);
|
|
1187
|
+
const st = { work: null, accum: 0, accumAux: 0 };
|
|
1188
|
+
let first = true;
|
|
1189
|
+
const timedAux = (entry.flags & ENTRY_FLAG_TIMED_AUX) !== 0;
|
|
1190
|
+
/* init_func for the first contribution, accum_func for the rest (the caller
|
|
1191
|
+
order matches the C, where the shape/skill/infra adds are never first). */
|
|
1192
|
+
const push = (v0, a0, isaux) => {
|
|
1193
|
+
let v = v0;
|
|
1194
|
+
let a = a0;
|
|
1195
|
+
if (isaux) {
|
|
1196
|
+
const t = v;
|
|
1197
|
+
v = a;
|
|
1198
|
+
a = t;
|
|
1199
|
+
}
|
|
1200
|
+
if (first) {
|
|
1201
|
+
combiner.init(v, a, st);
|
|
1202
|
+
first = false;
|
|
1203
|
+
}
|
|
1204
|
+
else {
|
|
1205
|
+
combiner.accum(v, a, st);
|
|
1206
|
+
}
|
|
1207
|
+
};
|
|
1208
|
+
for (const pa of entry.pAbilities) {
|
|
1209
|
+
const ind = pa.index;
|
|
1210
|
+
if (timedAux && pa.isaux)
|
|
1211
|
+
continue;
|
|
1212
|
+
if (pa.abilityType === "player") {
|
|
1213
|
+
if (!deps.playerHas(ind))
|
|
1214
|
+
continue;
|
|
1215
|
+
if (pa.haveValue) {
|
|
1216
|
+
push(pa.value, UI_ENTRY_VALUE_NOT_PRESENT, pa.isaux);
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
/* Special-case abilities that bound no value (uival "special"). */
|
|
1220
|
+
if (ind === PF.FAST_SHOT) {
|
|
1221
|
+
/* Needs the equipped launcher + KF_SHOOTS_ARROWS; deferred -> 0. */
|
|
1222
|
+
push(0, 0, pa.isaux);
|
|
1223
|
+
}
|
|
1224
|
+
else if (ind === PF.BRAVERY_30) {
|
|
1225
|
+
push(p.lev >= 30 ? 1 : 0, 0, pa.isaux);
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
else if (pa.abilityType === "object") {
|
|
1230
|
+
let v = cache.untimed.has(ind) ? 1 : 0;
|
|
1231
|
+
let a = timedAux ? (deps.timedObjectFlags.has(ind) ? 1 : 0) : 0;
|
|
1232
|
+
push(v, a, pa.isaux);
|
|
1233
|
+
/* Shape contribution. */
|
|
1234
|
+
const shape = p.shape;
|
|
1235
|
+
if (shape) {
|
|
1236
|
+
v = shape.flags.has(ind) ? 1 : 0;
|
|
1237
|
+
a = 0;
|
|
1238
|
+
if (v && p.objKnown.flags.has(ind)) {
|
|
1239
|
+
push(v, a, pa.isaux);
|
|
1240
|
+
}
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
else if (pa.abilityType === "element") {
|
|
1244
|
+
let v = p.race.elInfo[ind]?.resLevel ?? 0;
|
|
1245
|
+
let a = timedAux ? deps.timedElementEffect(ind) : 0;
|
|
1246
|
+
push(v, a, pa.isaux);
|
|
1247
|
+
const shape = p.shape;
|
|
1248
|
+
if (shape) {
|
|
1249
|
+
v = shape.elInfo[ind]?.resLevel ?? 0;
|
|
1250
|
+
a = 0;
|
|
1251
|
+
if (v !== 0 && (p.objKnown.elInfo[ind]?.resLevel ?? 0)) {
|
|
1252
|
+
push(v, a, pa.isaux);
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
/* Stats / modifiers aren't in the ability list; add intrinsic values. */
|
|
1258
|
+
for (const op of entry.objProps) {
|
|
1259
|
+
const ind = op.index;
|
|
1260
|
+
if (op.isaux && timedAux)
|
|
1261
|
+
continue;
|
|
1262
|
+
if (op.type === OP_STAT || op.type === OP_MOD) {
|
|
1263
|
+
const shape = p.shape;
|
|
1264
|
+
let v = shape ? (shape.modifiers[ind] ?? 0) : 0;
|
|
1265
|
+
let a = timedAux ? getTimedModifierEffect(p, ind) : 0;
|
|
1266
|
+
push(v, a, op.isaux);
|
|
1267
|
+
const conv = modifierToSkill(ind);
|
|
1268
|
+
if (conv.skill >= 0) {
|
|
1269
|
+
v = Math.trunc(((p.race.skills[conv.skill] ?? 0) * conv.num) / conv.den);
|
|
1270
|
+
a = 0;
|
|
1271
|
+
push(v, a, op.isaux);
|
|
1272
|
+
}
|
|
1273
|
+
if (ind === OBJ_MOD.INFRA) {
|
|
1274
|
+
v = p.race.infravision;
|
|
1275
|
+
a = 0;
|
|
1276
|
+
push(v, a, op.isaux);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
if (first) {
|
|
1281
|
+
return { val: UI_ENTRY_VALUE_NOT_PRESENT, auxval: UI_ENTRY_VALUE_NOT_PRESENT };
|
|
1282
|
+
}
|
|
1283
|
+
combiner.finish(st);
|
|
1284
|
+
return { val: st.accum, auxval: st.accumAux };
|
|
1285
|
+
}
|
|
1286
|
+
/** convert_vanilla_res_level (ui-entry-renderers.c L549). */
|
|
1287
|
+
function convertVanillaResLevel(i) {
|
|
1288
|
+
if (i === UI_ENTRY_UNKNOWN_VALUE)
|
|
1289
|
+
return 4;
|
|
1290
|
+
if (i === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1291
|
+
return 5;
|
|
1292
|
+
if (i === UI_ENTRY_RESIST0_RES_VUL)
|
|
1293
|
+
return 6;
|
|
1294
|
+
if (i >= 3)
|
|
1295
|
+
return 3;
|
|
1296
|
+
if (i >= 1)
|
|
1297
|
+
return 1;
|
|
1298
|
+
if (i <= -1)
|
|
1299
|
+
return 2;
|
|
1300
|
+
return 0;
|
|
1301
|
+
}
|
|
1302
|
+
const COMBINED_EFFECT_TBL = [
|
|
1303
|
+
[2, 6, 9, 11, 2, 2, 18],
|
|
1304
|
+
[3, 7, 10, 12, 3, 3, 19],
|
|
1305
|
+
[4, 8, 4, 13, 4, 4, 20],
|
|
1306
|
+
[5, 5, 5, 5, 5, 5, 5],
|
|
1307
|
+
[0, 0, 0, 0, 0, 0, 0],
|
|
1308
|
+
[1, 1, 1, 1, 1, 1, 1],
|
|
1309
|
+
[14, 15, 16, 17, 14, 14, 21],
|
|
1310
|
+
];
|
|
1311
|
+
const COMBINED_LABEL_TBL = [
|
|
1312
|
+
[1, 5, 8, 10, 1, 1, 1],
|
|
1313
|
+
[2, 6, 9, 11, 2, 2, 2],
|
|
1314
|
+
[3, 7, 3, 12, 3, 3, 3],
|
|
1315
|
+
[4, 4, 4, 4, 4, 4, 4],
|
|
1316
|
+
[1, 5, 8, 10, 1, 1, 1],
|
|
1317
|
+
[1, 5, 8, 10, 1, 1, 1],
|
|
1318
|
+
[1, 5, 8, 10, 1, 1, 1],
|
|
1319
|
+
];
|
|
1320
|
+
/**
|
|
1321
|
+
* format_int (ui-entry-renderers.c L462): render an integer into nbuf chars
|
|
1322
|
+
* using zero/overflow symbols, optional +1, optional sign. Returns the string.
|
|
1323
|
+
*/
|
|
1324
|
+
function formatInt(i, addOne, zero, overflow, nonneg, useSign, nbuf) {
|
|
1325
|
+
const digits = "0123456789+- ";
|
|
1326
|
+
const buf = new Array(nbuf).fill("");
|
|
1327
|
+
let j = nbuf - 1;
|
|
1328
|
+
let quot;
|
|
1329
|
+
let rem;
|
|
1330
|
+
if (i === 0 && !addOne) {
|
|
1331
|
+
quot = 0;
|
|
1332
|
+
rem = 0;
|
|
1333
|
+
buf[j] = zero;
|
|
1334
|
+
}
|
|
1335
|
+
else {
|
|
1336
|
+
quot = Math.trunc(i / 10);
|
|
1337
|
+
rem = i % 10;
|
|
1338
|
+
if (addOne) {
|
|
1339
|
+
rem++;
|
|
1340
|
+
if (rem === 10) {
|
|
1341
|
+
rem = 0;
|
|
1342
|
+
quot++;
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
buf[j] = digits[rem];
|
|
1346
|
+
}
|
|
1347
|
+
j--;
|
|
1348
|
+
while (quot > 0 && j >= 0) {
|
|
1349
|
+
rem = quot % 10;
|
|
1350
|
+
quot = Math.trunc(quot / 10);
|
|
1351
|
+
buf[j] = digits[rem];
|
|
1352
|
+
j--;
|
|
1353
|
+
}
|
|
1354
|
+
if (quot > 0 || (useSign && j === -1)) {
|
|
1355
|
+
if (useSign) {
|
|
1356
|
+
buf[0] = nonneg ? digits[10] : digits[11];
|
|
1357
|
+
j = 1;
|
|
1358
|
+
}
|
|
1359
|
+
else {
|
|
1360
|
+
j = 0;
|
|
1361
|
+
}
|
|
1362
|
+
while (j < nbuf) {
|
|
1363
|
+
buf[j] = overflow;
|
|
1364
|
+
j++;
|
|
1365
|
+
}
|
|
1366
|
+
}
|
|
1367
|
+
else {
|
|
1368
|
+
if (useSign && (i !== 0 || addOne || zero === digits[0])) {
|
|
1369
|
+
buf[j] = nonneg ? digits[10] : digits[11];
|
|
1370
|
+
j--;
|
|
1371
|
+
}
|
|
1372
|
+
while (j >= 0) {
|
|
1373
|
+
buf[j] = digits[12];
|
|
1374
|
+
j--;
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
return buf.join("");
|
|
1378
|
+
}
|
|
1379
|
+
/**
|
|
1380
|
+
* ui_entry_renderer_apply (ui-entry-renderers.c L309), DATA half: for each
|
|
1381
|
+
* (val, aux) pair produce a cell {symbol, color}, and colour the label by the
|
|
1382
|
+
* combined value. The Term drawing (positions, combined cell) is the shell's.
|
|
1383
|
+
*/
|
|
1384
|
+
export function applyRenderer(renderer, vals, auxvals, details) {
|
|
1385
|
+
const backend = renderer.backendIndex;
|
|
1386
|
+
const cells = [];
|
|
1387
|
+
const combiner = combinerFuncs(renderer.combinerIndex);
|
|
1388
|
+
const cellColor = (paletteIndex, offset) => renderer.colors[paletteIndex + offset] ?? 1;
|
|
1389
|
+
const sym = (paletteIndex) => renderer.symbols[paletteIndex] ?? " ";
|
|
1390
|
+
if (backend === UI_ENTRY_RENDERER.COMPACT_RESIST_RENDERER_WITH_COMBINED_AUX) {
|
|
1391
|
+
let colorOffset = details.alternateColorFirst ? 22 : 0;
|
|
1392
|
+
for (let i = 0; i < vals.length; i++) {
|
|
1393
|
+
const untimed = convertVanillaResLevel(vals[i]);
|
|
1394
|
+
const timed = convertVanillaResLevel(auxvals[i]);
|
|
1395
|
+
const pi = COMBINED_EFFECT_TBL[untimed][timed];
|
|
1396
|
+
cells.push({ symbol: sym(pi), color: cellColor(pi, colorOffset) });
|
|
1397
|
+
colorOffset ^= 22;
|
|
1398
|
+
}
|
|
1399
|
+
const { accum: vc, accumAux: ac } = combiner.vec(vals, auxvals);
|
|
1400
|
+
let labelPI = 0;
|
|
1401
|
+
if (details.knownRune) {
|
|
1402
|
+
labelPI = COMBINED_LABEL_TBL[convertVanillaResLevel(vc)][convertVanillaResLevel(ac)];
|
|
1403
|
+
}
|
|
1404
|
+
return {
|
|
1405
|
+
cells,
|
|
1406
|
+
labelColorIndex: labelPI,
|
|
1407
|
+
labelColor: renderer.labelColors[labelPI] ?? 1,
|
|
1408
|
+
};
|
|
1409
|
+
}
|
|
1410
|
+
if (backend === UI_ENTRY_RENDERER.COMPACT_FLAG_RENDERER_WITH_COMBINED_AUX) {
|
|
1411
|
+
let colorOffset = details.alternateColorFirst ? 5 : 0;
|
|
1412
|
+
for (let i = 0; i < vals.length; i++) {
|
|
1413
|
+
let pi = 2;
|
|
1414
|
+
if (vals[i] === UI_ENTRY_UNKNOWN_VALUE)
|
|
1415
|
+
pi = 0;
|
|
1416
|
+
else if (vals[i] === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1417
|
+
pi = 1;
|
|
1418
|
+
else if (vals[i])
|
|
1419
|
+
pi = 3;
|
|
1420
|
+
const av = auxvals[i];
|
|
1421
|
+
if (av && av !== UI_ENTRY_UNKNOWN_VALUE && av !== UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
1422
|
+
if (vals[i] === 0)
|
|
1423
|
+
pi = 4;
|
|
1424
|
+
}
|
|
1425
|
+
cells.push({ symbol: sym(pi), color: cellColor(pi, colorOffset) });
|
|
1426
|
+
colorOffset ^= 5;
|
|
1427
|
+
}
|
|
1428
|
+
const { accum: vc, accumAux: ac } = combiner.vec(vals, auxvals);
|
|
1429
|
+
let labelPI = 1;
|
|
1430
|
+
if (!details.knownRune)
|
|
1431
|
+
labelPI = 0;
|
|
1432
|
+
else if (vc && vc !== UI_ENTRY_UNKNOWN_VALUE && vc !== UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1433
|
+
labelPI = 2;
|
|
1434
|
+
else if (ac && ac !== UI_ENTRY_UNKNOWN_VALUE && ac !== UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1435
|
+
labelPI = 3;
|
|
1436
|
+
return { cells, labelColorIndex: labelPI, labelColor: renderer.labelColors[labelPI] ?? 1 };
|
|
1437
|
+
}
|
|
1438
|
+
if (backend === UI_ENTRY_RENDERER.COMPACT_FLAG_WITH_CANCEL_RENDERER_WITH_COMBINED_AUX) {
|
|
1439
|
+
let colorOffset = details.alternateColorFirst ? 11 : 0;
|
|
1440
|
+
for (let i = 0; i < vals.length; i++) {
|
|
1441
|
+
const v = vals[i];
|
|
1442
|
+
const av = auxvals[i];
|
|
1443
|
+
let pi;
|
|
1444
|
+
if (v === UI_ENTRY_UNKNOWN_VALUE || av === UI_ENTRY_UNKNOWN_VALUE)
|
|
1445
|
+
pi = 0;
|
|
1446
|
+
else if (v === UI_ENTRY_VALUE_NOT_PRESENT && av === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1447
|
+
pi = 1;
|
|
1448
|
+
else if (av === UI_ENTRY_VALUE_NOT_PRESENT || av === 0) {
|
|
1449
|
+
if (v === UI_ENTRY_VALUE_NOT_PRESENT || v === 0)
|
|
1450
|
+
pi = 2;
|
|
1451
|
+
else if (v > 0)
|
|
1452
|
+
pi = 3;
|
|
1453
|
+
else
|
|
1454
|
+
pi = 4;
|
|
1455
|
+
}
|
|
1456
|
+
else if (av > 0) {
|
|
1457
|
+
if (v === UI_ENTRY_VALUE_NOT_PRESENT || v === 0)
|
|
1458
|
+
pi = 5;
|
|
1459
|
+
else if (v > 0)
|
|
1460
|
+
pi = 6;
|
|
1461
|
+
else
|
|
1462
|
+
pi = 7;
|
|
1463
|
+
}
|
|
1464
|
+
else {
|
|
1465
|
+
if (v === UI_ENTRY_VALUE_NOT_PRESENT || v === 0)
|
|
1466
|
+
pi = 8;
|
|
1467
|
+
else if (v > 0)
|
|
1468
|
+
pi = 9;
|
|
1469
|
+
else
|
|
1470
|
+
pi = 10;
|
|
1471
|
+
}
|
|
1472
|
+
cells.push({ symbol: sym(pi), color: cellColor(pi, colorOffset) });
|
|
1473
|
+
colorOffset ^= 11;
|
|
1474
|
+
}
|
|
1475
|
+
const { accum: vc, accumAux: ac } = combiner.vec(vals, auxvals);
|
|
1476
|
+
let labelPI;
|
|
1477
|
+
if (!details.knownRune)
|
|
1478
|
+
labelPI = 0;
|
|
1479
|
+
else if (vc === UI_ENTRY_VALUE_NOT_PRESENT || vc === UI_ENTRY_UNKNOWN_VALUE || vc === 0) {
|
|
1480
|
+
if (ac === UI_ENTRY_VALUE_NOT_PRESENT || ac === UI_ENTRY_UNKNOWN_VALUE || ac === 0)
|
|
1481
|
+
labelPI = 4;
|
|
1482
|
+
else if (ac > 0)
|
|
1483
|
+
labelPI = 6;
|
|
1484
|
+
else
|
|
1485
|
+
labelPI = 2;
|
|
1486
|
+
}
|
|
1487
|
+
else if (vc > 0) {
|
|
1488
|
+
if (ac === UI_ENTRY_VALUE_NOT_PRESENT || ac === UI_ENTRY_UNKNOWN_VALUE || ac >= 0)
|
|
1489
|
+
labelPI = 5;
|
|
1490
|
+
else
|
|
1491
|
+
labelPI = 3;
|
|
1492
|
+
}
|
|
1493
|
+
else
|
|
1494
|
+
labelPI = 1;
|
|
1495
|
+
return { cells, labelColorIndex: labelPI, labelColor: renderer.labelColors[labelPI] ?? 1 };
|
|
1496
|
+
}
|
|
1497
|
+
if (backend === UI_ENTRY_RENDERER.NUMERIC_AS_SIGN_RENDERER_WITH_COMBINED_AUX) {
|
|
1498
|
+
let colorOffset = details.alternateColorFirst ? 7 : 0;
|
|
1499
|
+
for (let i = 0; i < vals.length; i++) {
|
|
1500
|
+
const cst = { work: null, accum: 0, accumAux: 0 };
|
|
1501
|
+
combiner.init(vals[i], 0, cst);
|
|
1502
|
+
combiner.accum(auxvals[i], 0, cst);
|
|
1503
|
+
combiner.finish(cst);
|
|
1504
|
+
let pi;
|
|
1505
|
+
if (vals[i] === UI_ENTRY_UNKNOWN_VALUE || (vals[i] === 0 && auxvals[i] === UI_ENTRY_UNKNOWN_VALUE)) {
|
|
1506
|
+
pi = 0;
|
|
1507
|
+
}
|
|
1508
|
+
else if (cst.accum === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
1509
|
+
pi = 1;
|
|
1510
|
+
}
|
|
1511
|
+
else {
|
|
1512
|
+
pi =
|
|
1513
|
+
(cst.accum > 0 ? 5 : cst.accum < 0 ? 8 : 2) +
|
|
1514
|
+
(auxvals[i] > 0 ? 1 : auxvals[i] < 0 ? 2 : 0);
|
|
1515
|
+
}
|
|
1516
|
+
cells.push({ symbol: sym(pi), color: cellColor(pi, colorOffset) });
|
|
1517
|
+
colorOffset ^= 11;
|
|
1518
|
+
}
|
|
1519
|
+
const { accum: vc, accumAux: ac } = combiner.vec(vals, auxvals);
|
|
1520
|
+
let labelPI;
|
|
1521
|
+
if (!details.knownRune)
|
|
1522
|
+
labelPI = 0;
|
|
1523
|
+
else {
|
|
1524
|
+
const cst = { work: null, accum: 0, accumAux: 0 };
|
|
1525
|
+
combiner.init(vc, 0, cst);
|
|
1526
|
+
combiner.accum(ac, 0, cst);
|
|
1527
|
+
combiner.finish(cst);
|
|
1528
|
+
if (cst.accum === UI_ENTRY_UNKNOWN_VALUE || cst.accum === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1529
|
+
labelPI = 1;
|
|
1530
|
+
else
|
|
1531
|
+
labelPI = (cst.accum > 0 ? 4 : cst.accum < 0 ? 7 : 1) + (ac > 0 ? 1 : ac < 0 ? 2 : 0);
|
|
1532
|
+
}
|
|
1533
|
+
return { cells, labelColorIndex: labelPI, labelColor: renderer.labelColors[labelPI] ?? 1 };
|
|
1534
|
+
}
|
|
1535
|
+
if (backend === UI_ENTRY_RENDERER.NUMERIC_RENDERER_WITH_COMBINED_AUX) {
|
|
1536
|
+
const nbuf = renderer.ndigit + (renderer.sign === UI_ENTRY_NO_SIGN ? 0 : 1);
|
|
1537
|
+
let colorOffset = details.alternateColorFirst ? 11 : 0;
|
|
1538
|
+
for (let i = 0; i < vals.length; i++) {
|
|
1539
|
+
const cst = { work: null, accum: 0, accumAux: 0 };
|
|
1540
|
+
combiner.init(vals[i], 0, cst);
|
|
1541
|
+
combiner.accum(auxvals[i], 0, cst);
|
|
1542
|
+
combiner.finish(cst);
|
|
1543
|
+
let pi;
|
|
1544
|
+
let text;
|
|
1545
|
+
if (vals[i] === UI_ENTRY_UNKNOWN_VALUE || (vals[i] === 0 && auxvals[i] === UI_ENTRY_UNKNOWN_VALUE)) {
|
|
1546
|
+
pi = 0;
|
|
1547
|
+
text = formatInt(0, false, sym(0), sym(0), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1548
|
+
}
|
|
1549
|
+
else if (cst.accum === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
1550
|
+
pi = 1;
|
|
1551
|
+
text = formatInt(0, false, sym(1), sym(1), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1552
|
+
}
|
|
1553
|
+
else if (cst.accum === 0) {
|
|
1554
|
+
pi = auxvals[i] > 0 ? 3 : auxvals[i] < 0 ? 4 : 2;
|
|
1555
|
+
text = formatInt(0, false, sym(pi), sym(pi), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1556
|
+
}
|
|
1557
|
+
else if (cst.accum > 0) {
|
|
1558
|
+
pi = auxvals[i] > 0 ? 6 : auxvals[i] < 0 ? 7 : 5;
|
|
1559
|
+
text = formatInt(cst.accum, false, sym(2), sym(5), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1560
|
+
}
|
|
1561
|
+
else {
|
|
1562
|
+
pi = auxvals[i] > 0 ? 9 : auxvals[i] < 0 ? 10 : 8;
|
|
1563
|
+
let vv;
|
|
1564
|
+
let o;
|
|
1565
|
+
if (vals[i] === INT_MIN) {
|
|
1566
|
+
vv = -(INT_MIN + 1);
|
|
1567
|
+
o = true;
|
|
1568
|
+
}
|
|
1569
|
+
else {
|
|
1570
|
+
vv = -vals[i];
|
|
1571
|
+
o = false;
|
|
1572
|
+
}
|
|
1573
|
+
text = formatInt(vv, o, sym(2), sym(6), false, renderer.sign !== UI_ENTRY_NO_SIGN, nbuf);
|
|
1574
|
+
}
|
|
1575
|
+
cells.push({ symbol: text, color: cellColor(pi, colorOffset) });
|
|
1576
|
+
colorOffset ^= 11;
|
|
1577
|
+
}
|
|
1578
|
+
const { accum: vc, accumAux: ac } = combiner.vec(vals, auxvals);
|
|
1579
|
+
let labelPI;
|
|
1580
|
+
if (!details.knownRune)
|
|
1581
|
+
labelPI = 0;
|
|
1582
|
+
else {
|
|
1583
|
+
const cst = { work: null, accum: 0, accumAux: 0 };
|
|
1584
|
+
combiner.init(vc, 0, cst);
|
|
1585
|
+
combiner.accum(ac, 0, cst);
|
|
1586
|
+
combiner.finish(cst);
|
|
1587
|
+
if (cst.accum === UI_ENTRY_UNKNOWN_VALUE || cst.accum === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1588
|
+
labelPI = 1;
|
|
1589
|
+
else
|
|
1590
|
+
labelPI = (cst.accum > 0 ? 4 : cst.accum < 0 ? 7 : 1) + (ac > 0 ? 1 : ac < 0 ? 2 : 0);
|
|
1591
|
+
}
|
|
1592
|
+
return { cells, labelColorIndex: labelPI, labelColor: renderer.labelColors[labelPI] ?? 1 };
|
|
1593
|
+
}
|
|
1594
|
+
if (backend === UI_ENTRY_RENDERER.NUMERIC_RENDERER_WITH_BOOL_AUX) {
|
|
1595
|
+
const nbuf = renderer.ndigit + (renderer.sign === UI_ENTRY_NO_SIGN ? 0 : 1);
|
|
1596
|
+
let colorOffset = details.alternateColorFirst ? 8 : 0;
|
|
1597
|
+
for (let i = 0; i < vals.length; i++) {
|
|
1598
|
+
const v = vals[i];
|
|
1599
|
+
const av = auxvals[i];
|
|
1600
|
+
const auxOn = av !== 0 && av !== UI_ENTRY_UNKNOWN_VALUE && av !== UI_ENTRY_VALUE_NOT_PRESENT;
|
|
1601
|
+
let pi;
|
|
1602
|
+
let text;
|
|
1603
|
+
if (v === UI_ENTRY_UNKNOWN_VALUE || (v === 0 && av === UI_ENTRY_UNKNOWN_VALUE)) {
|
|
1604
|
+
pi = 0;
|
|
1605
|
+
text = formatInt(0, false, sym(0), sym(0), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1606
|
+
}
|
|
1607
|
+
else if (v === UI_ENTRY_VALUE_NOT_PRESENT) {
|
|
1608
|
+
pi = 1;
|
|
1609
|
+
text = formatInt(0, false, sym(1), sym(1), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1610
|
+
}
|
|
1611
|
+
else if (v > 0) {
|
|
1612
|
+
pi = auxOn ? 5 : 4;
|
|
1613
|
+
text = formatInt(v, false, sym(2), sym(4), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1614
|
+
}
|
|
1615
|
+
else if (v < 0) {
|
|
1616
|
+
pi = auxOn ? 7 : 6;
|
|
1617
|
+
let vv;
|
|
1618
|
+
let o;
|
|
1619
|
+
if (v === INT_MIN) {
|
|
1620
|
+
vv = -(INT_MIN + 1);
|
|
1621
|
+
o = true;
|
|
1622
|
+
}
|
|
1623
|
+
else {
|
|
1624
|
+
vv = -v;
|
|
1625
|
+
o = false;
|
|
1626
|
+
}
|
|
1627
|
+
text = formatInt(vv, o, sym(2), sym(5), false, renderer.sign !== UI_ENTRY_NO_SIGN, nbuf);
|
|
1628
|
+
}
|
|
1629
|
+
else {
|
|
1630
|
+
const zerosym = auxOn ? 3 : 2;
|
|
1631
|
+
pi = auxOn ? 3 : 2;
|
|
1632
|
+
text = formatInt(0, false, sym(zerosym), sym(4), true, renderer.sign === UI_ENTRY_ALWAYS_SIGN, nbuf);
|
|
1633
|
+
}
|
|
1634
|
+
cells.push({ symbol: text, color: cellColor(pi, colorOffset) });
|
|
1635
|
+
colorOffset ^= 8;
|
|
1636
|
+
}
|
|
1637
|
+
const { accum: vc, accumAux: ac } = combiner.vec(vals, auxvals);
|
|
1638
|
+
const acbool = ac !== 0 && ac !== UI_ENTRY_UNKNOWN_VALUE && ac !== UI_ENTRY_VALUE_NOT_PRESENT;
|
|
1639
|
+
let labelPI;
|
|
1640
|
+
if (!details.knownRune)
|
|
1641
|
+
labelPI = 0;
|
|
1642
|
+
else if (vc === 0 || vc === UI_ENTRY_UNKNOWN_VALUE || vc === UI_ENTRY_VALUE_NOT_PRESENT)
|
|
1643
|
+
labelPI = acbool ? 6 : 5;
|
|
1644
|
+
else if (vc > 0)
|
|
1645
|
+
labelPI = acbool ? 2 : 1;
|
|
1646
|
+
else
|
|
1647
|
+
labelPI = acbool ? 4 : 3;
|
|
1648
|
+
return { cells, labelColorIndex: labelPI, labelColor: renderer.labelColors[labelPI] ?? 1 };
|
|
1649
|
+
}
|
|
1650
|
+
return { cells, labelColorIndex: 0, labelColor: 1 };
|
|
1651
|
+
}
|
|
1652
|
+
const STAT_MAX = 5;
|
|
1653
|
+
/** configure_char_sheet region_categories (ui-player.c L187). */
|
|
1654
|
+
const REGION_CATEGORIES = ["resistances", "abilities", "hindrances", "modifiers"];
|
|
1655
|
+
function slotObject(state, slot) {
|
|
1656
|
+
const handle = state.actor.player.equipment[slot] ?? 0;
|
|
1657
|
+
return gearGet(state.gear, handle);
|
|
1658
|
+
}
|
|
1659
|
+
/**
|
|
1660
|
+
* The label for a resist-panel row: get_ui_entry_label(entry, 6, pad_left) with
|
|
1661
|
+
* the null slot overwritten by ':' (configure_char_sheet L252-253).
|
|
1662
|
+
*/
|
|
1663
|
+
function resistRowLabel(entry) {
|
|
1664
|
+
return `${getUiEntryLabel(entry, 6, true)}:`;
|
|
1665
|
+
}
|
|
1666
|
+
/**
|
|
1667
|
+
* characterGrid: the ui-entry grid of the second character screen. Returns the
|
|
1668
|
+
* four resist/ability/hindrance/modifier panels (display_player_flag_info ->
|
|
1669
|
+
* display_resistance_panel) and the stat-modifier panel (display_player_sust_
|
|
1670
|
+
* info). Row ordering matches the priority-sorted ui_entry iterator; each row
|
|
1671
|
+
* has its equipment-slot cells then the player cell, and the combined-coloured
|
|
1672
|
+
* label. The Term draw half (positions, headers, equippy row) is the shell's.
|
|
1673
|
+
*/
|
|
1674
|
+
export function characterGrid(state, config, deps = {}) {
|
|
1675
|
+
const p = state.actor.player;
|
|
1676
|
+
const bodyCount = p.body.count;
|
|
1677
|
+
const rd = resolveUiDeps(p, deps);
|
|
1678
|
+
const untimedCache = { untimed: playerFlags(p) };
|
|
1679
|
+
const equipment = [];
|
|
1680
|
+
for (let i = 0; i < bodyCount; i++)
|
|
1681
|
+
equipment.push(slotObject(state, i));
|
|
1682
|
+
/* obj->known, synthesised ONCE per equipped object - upstream caches exactly
|
|
1683
|
+
* this per object across the whole grid (cached_object_data, ui-entry.c
|
|
1684
|
+
* L726-733). object_flag_is_known and object_element_is_known both take
|
|
1685
|
+
* object_fully_known as their first route out (obj-knowledge.c L776, L799),
|
|
1686
|
+
* and mundane gear carries no runes at all, so it IS fully known: a plain
|
|
1687
|
+
* torch, soft leather armour or a mundane weapon must print '.' down every
|
|
1688
|
+
* row. Reading p->obj_k alone (what this did) printed '?' for all of them. */
|
|
1689
|
+
const knownDesc = knownDescOf(state);
|
|
1690
|
+
const objFullyKnown = equipment.map((o) => o ? objectFullyKnown(o, objectKnownShadow(o, p, state.runeEnv, knownDesc), p, state.runeEnv) : false);
|
|
1691
|
+
const renderRow = (entry, forcePlayerValZero, withLabel) => {
|
|
1692
|
+
const vals = [];
|
|
1693
|
+
const auxs = [];
|
|
1694
|
+
for (let j = 0; j < bodyCount; j++) {
|
|
1695
|
+
const r = computeObjectValues(entry, equipment[j], p, objFullyKnown[j] ?? false);
|
|
1696
|
+
vals.push(r.val);
|
|
1697
|
+
auxs.push(r.auxval);
|
|
1698
|
+
}
|
|
1699
|
+
const pr = computePlayerValues(entry, p, rd, untimedCache);
|
|
1700
|
+
vals.push(forcePlayerValZero ? 0 : pr.val);
|
|
1701
|
+
auxs.push(pr.auxval);
|
|
1702
|
+
const renderer = config.renderers[entry.rendererIndex - 1];
|
|
1703
|
+
const knownRune = withLabel ? isUiEntryForKnownRune(entry, p) : true;
|
|
1704
|
+
const rendered = renderer
|
|
1705
|
+
? applyRenderer(renderer, vals, auxs, { knownRune, alternateColorFirst: false })
|
|
1706
|
+
: { cells: [], labelColor: 1, labelColorIndex: 0 };
|
|
1707
|
+
return {
|
|
1708
|
+
name: entry.name,
|
|
1709
|
+
label: withLabel ? resistRowLabel(entry) : "",
|
|
1710
|
+
labelColor: rendered.labelColor,
|
|
1711
|
+
cells: rendered.cells,
|
|
1712
|
+
};
|
|
1713
|
+
};
|
|
1714
|
+
/* Four resist regions (display_resistance_panel per region). */
|
|
1715
|
+
const region0Row = 2 + STAT_MAX;
|
|
1716
|
+
const resistPanels = [];
|
|
1717
|
+
for (const cat of REGION_CATEGORIES) {
|
|
1718
|
+
const iter = iterateEntries(config, "CHAR_SCREEN1", cat, cat);
|
|
1719
|
+
/* configure_char_sheet row cap: fit in 24 rows, one blank before prompt. */
|
|
1720
|
+
let n = iter.length;
|
|
1721
|
+
if (n + 2 + region0Row > 22)
|
|
1722
|
+
n = 20 - region0Row;
|
|
1723
|
+
const rows = [];
|
|
1724
|
+
for (let i = 0; i < n; i++)
|
|
1725
|
+
rows.push(renderRow(iter[i], false, true));
|
|
1726
|
+
resistPanels.push({ key: cat, rows });
|
|
1727
|
+
}
|
|
1728
|
+
/* Stat-modifier panel (display_player_sust_info): stat_mod entries, player
|
|
1729
|
+
column shows only the sustain (val forced to 0), no label drawn. */
|
|
1730
|
+
const statIter = iterateEntries(config, "CHAR_SCREEN1", "stat_modifiers", "stat_modifiers");
|
|
1731
|
+
const nStat = statIter.length > STAT_MAX ? STAT_MAX : statIter.length;
|
|
1732
|
+
const statRows = [];
|
|
1733
|
+
for (let i = 0; i < nStat; i++)
|
|
1734
|
+
statRows.push(renderRow(statIter[i], true, false));
|
|
1735
|
+
return { resistPanels, statModPanel: { key: "stat_modifiers", rows: statRows } };
|
|
1736
|
+
}
|
|
1737
|
+
/* ------------------------------------------------------------------ */
|
|
1738
|
+
/* Equip-cmp support (ui-equip-cmp.c initialize_summary / */
|
|
1739
|
+
/* compute_player_and_equipment_values): shared plumbing the */
|
|
1740
|
+
/* equip-cmp.ts model needs but that lives on the private UiEntry / */
|
|
1741
|
+
/* RendererInfo shapes, so it is exposed here rather than duplicated. */
|
|
1742
|
+
/* ------------------------------------------------------------------ */
|
|
1743
|
+
/** initialize_summary's five property categories (L2394), each intersected
|
|
1744
|
+
* with category "EQUIPCMP_SCREEN" (the equip-cmp screen's own category tag,
|
|
1745
|
+
* distinct from the character screen's "CHAR_SCREEN1"). */
|
|
1746
|
+
const EQUIPCMP_CATEGORIES = [...REGION_CATEGORIES, "stat_modifiers"];
|
|
1747
|
+
/**
|
|
1748
|
+
* The equip-cmp screen's property columns (initialize_summary L2434-2469):
|
|
1749
|
+
* the same five categories as the character screen's resist/ability/
|
|
1750
|
+
* hindrance/modifier/stat-modifier panels, but scoped to "EQUIPCMP_SCREEN"
|
|
1751
|
+
* instead of "CHAR_SCREEN1".
|
|
1752
|
+
*/
|
|
1753
|
+
export function equipCmpCategories(config) {
|
|
1754
|
+
return EQUIPCMP_CATEGORIES.map((cat) => ({
|
|
1755
|
+
key: cat,
|
|
1756
|
+
entries: iterateEntries(config, "EQUIPCMP_SCREEN", cat, cat),
|
|
1757
|
+
}));
|
|
1758
|
+
}
|
|
1759
|
+
/** get_ui_entry_label(entry, nproplab + 1, true) with nproplab hardwired to 2
|
|
1760
|
+
* (ui-equip-cmp.c initialize_summary L2421): the equip-cmp column header. */
|
|
1761
|
+
export function equipCmpColumnLabel(entry) {
|
|
1762
|
+
return getUiEntryLabel(entry, 3, true);
|
|
1763
|
+
}
|
|
1764
|
+
/**
|
|
1765
|
+
* get_ui_entry_label(entry, 4, false) - the three-character label the easy
|
|
1766
|
+
* filter matches a 3-character code against (ui-equip-cmp.c:1345). Only the
|
|
1767
|
+
* stat modifiers have distinct 3-char labels; the comparison is exact over all
|
|
1768
|
+
* three characters, pad included, exactly as the C compares wce[0..2].
|
|
1769
|
+
*/
|
|
1770
|
+
export function equipCmpFilterLabel3(entry) {
|
|
1771
|
+
return getUiEntryLabel(entry, 4, false);
|
|
1772
|
+
}
|
|
1773
|
+
/**
|
|
1774
|
+
* compute_player_and_equipment_values's per-property accumulation (ui-equip-
|
|
1775
|
+
* cmp.c L2279), condensed to the vectorized form combineValues already uses:
|
|
1776
|
+
* combine the player's own value with every equipped item's value for one
|
|
1777
|
+
* property entry into the equip-cmp "@" row's single combined (val, auxval).
|
|
1778
|
+
* Uses the entry's own (already-resolved) combinerIndex rather than looking
|
|
1779
|
+
* it up via the renderer - computePlayerValues does the same (L1323).
|
|
1780
|
+
*/
|
|
1781
|
+
export function combineEntryValues(entry, vals, auxs) {
|
|
1782
|
+
return combinerFuncs(entry.combinerIndex).vec(vals, auxs);
|
|
1783
|
+
}
|
|
1784
|
+
/* ------------------------------------------------------------------ */
|
|
1785
|
+
/* Renderer palette accessors (ui-entry-renderers.c L188-432) */
|
|
1786
|
+
/* ------------------------------------------------------------------ */
|
|
1787
|
+
/**
|
|
1788
|
+
* convert_attrs_to_chars (ui-entry-renderers.c L1327-1351): the palette as the
|
|
1789
|
+
* colour-index characters a pref file writes. An attr outside the basic range
|
|
1790
|
+
* is written as 'w', not skipped.
|
|
1791
|
+
*/
|
|
1792
|
+
function attrsToChars(attrs) {
|
|
1793
|
+
let out = "";
|
|
1794
|
+
for (const a of attrs) {
|
|
1795
|
+
out += a >= 0 && a < BASIC_COLORS ? (COLOR_TABLE[a]?.char ?? "w") : "w";
|
|
1796
|
+
}
|
|
1797
|
+
return out;
|
|
1798
|
+
}
|
|
1799
|
+
/** The rows dump_ui_entry_renderers writes, in renderer-index order. */
|
|
1800
|
+
export function uiEntryRendererRows(config) {
|
|
1801
|
+
return config.renderers.map((r) => ({
|
|
1802
|
+
name: r.name,
|
|
1803
|
+
colors: attrsToChars(r.colors),
|
|
1804
|
+
labelColors: attrsToChars(r.labelColors),
|
|
1805
|
+
symbols: r.symbols,
|
|
1806
|
+
}));
|
|
1807
|
+
}
|
|
1808
|
+
/**
|
|
1809
|
+
* ui_entry_renderer_customize (ui-entry-renderers.c L331-370): overwrite a
|
|
1810
|
+
* renderer's palettes from the colour-index / symbol strings a pref file
|
|
1811
|
+
* carries. Each string is truncated to the palette length it is replacing (the
|
|
1812
|
+
* C's `length < ncolors ? length : ncolors`), so a short string leaves the tail
|
|
1813
|
+
* as the gamedata built it. A null argument leaves that palette alone - which
|
|
1814
|
+
* is what the `*` field in an `entry-renderer:` line means.
|
|
1815
|
+
*
|
|
1816
|
+
* Returns false when the name is not a configured renderer (the C's nonzero
|
|
1817
|
+
* return, which parse_prefs_entry_renderer turns into INVALID_VALUE).
|
|
1818
|
+
*/
|
|
1819
|
+
export function uiEntryRendererCustomize(config, name, colors, labelColors, symbols) {
|
|
1820
|
+
const r = config.renderers.find((x) => x.name === name);
|
|
1821
|
+
if (!r)
|
|
1822
|
+
return false;
|
|
1823
|
+
const overlay = (dst, src) => {
|
|
1824
|
+
const n = Math.min(src.length, dst.length);
|
|
1825
|
+
for (let i = 0; i < n; i++)
|
|
1826
|
+
dst[i] = colorCharToAttr(src[i]);
|
|
1827
|
+
};
|
|
1828
|
+
if (colors !== null)
|
|
1829
|
+
overlay(r.colors, colors);
|
|
1830
|
+
if (labelColors !== null)
|
|
1831
|
+
overlay(r.labelColors, labelColors);
|
|
1832
|
+
if (symbols !== null) {
|
|
1833
|
+
const n = Math.min(symbols.length, r.symbols.length);
|
|
1834
|
+
r.symbols = symbols.slice(0, n) + r.symbols.slice(n);
|
|
1835
|
+
}
|
|
1836
|
+
return true;
|
|
1837
|
+
}
|
|
1838
|
+
//# sourceMappingURL=ui-entry.js.map
|