@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,1414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monster recall text, ported from the recall half of
|
|
3
|
+
* reference/src/mon-lore.c (Angband 4.2.6): the description helpers
|
|
4
|
+
* (awareness / speed / sex / pronouns), the clause builders, and the
|
|
5
|
+
* lore_append_* section functions, plus the top-level recall assembly that
|
|
6
|
+
* upstream keeps in ui-mon-lore.c (lore_description). The two small spell
|
|
7
|
+
* lore helpers from mon-spell.c (mon_spell_lore_description /
|
|
8
|
+
* mon_spell_lore_damage) live here too, since lore_append_spells needs them.
|
|
9
|
+
*
|
|
10
|
+
* This engine is headless, so upstream's z-textblock output is modelled as a
|
|
11
|
+
* flat list of colored runs (LoreText) instead of a wrapped terminal buffer.
|
|
12
|
+
* Every textblock_append becomes LoreTextBuilder.append(text) (COLOUR_WHITE)
|
|
13
|
+
* and every textblock_append_c(COLOUR_X, ...) becomes append(text, COLOUR_X).
|
|
14
|
+
* Wording, punctuation, the two-space sentence separators, number words and
|
|
15
|
+
* the pronoun / sex logic are kept verbatim.
|
|
16
|
+
*
|
|
17
|
+
* Player-derived state (level, depth, speed, and the combat hit chances /
|
|
18
|
+
* spell&blow danger colors that upstream reads off the global player) is not
|
|
19
|
+
* available in this module, so it is injected through the LoreDeps object.
|
|
20
|
+
* Colors default to the datum's base lore color when no danger evaluator is
|
|
21
|
+
* supplied; the two hit-chance callbacks are the remaining integration seams
|
|
22
|
+
* for the combat layer (still default to 0 unwired). The spell damage
|
|
23
|
+
* callback (`spellLoreDamage`) is a full override only - its default
|
|
24
|
+
* computes the real mon_spell_lore_damage from the bound spell + race data
|
|
25
|
+
* (see monSpellLoreDamage below), needing just `breathProjection` from the
|
|
26
|
+
* caller for the one piece of breath damage that lives outside mon/ (the
|
|
27
|
+
* element's damage divisor/cap, world/projection.ts).
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { FlagSet, FLAG_START, NO_FLAG } from "../bitflag.js";
|
|
31
|
+
import {
|
|
32
|
+
COLOUR_BLUE,
|
|
33
|
+
COLOUR_DARK,
|
|
34
|
+
COLOUR_GREEN,
|
|
35
|
+
COLOUR_L_BLUE,
|
|
36
|
+
COLOUR_L_GREEN,
|
|
37
|
+
COLOUR_L_RED,
|
|
38
|
+
COLOUR_L_UMBER,
|
|
39
|
+
COLOUR_ORANGE,
|
|
40
|
+
COLOUR_RED,
|
|
41
|
+
COLOUR_VIOLET,
|
|
42
|
+
COLOUR_WHITE,
|
|
43
|
+
colorTextToAttr,
|
|
44
|
+
} from "../color.js";
|
|
45
|
+
import { EF, MON_RACE_FLAG_ENTRIES, OF, PROJ, RF } from "../generated/index.js";
|
|
46
|
+
import { createMonFlagMask, monsterFlagsKnown } from "./lore.js";
|
|
47
|
+
import type { MonsterLore } from "./lore.js";
|
|
48
|
+
import { EXTRACT_ENERGY } from "./monster.js";
|
|
49
|
+
import {
|
|
50
|
+
breathDam,
|
|
51
|
+
createMonSpellMask,
|
|
52
|
+
monSpellHasDamage,
|
|
53
|
+
monSpellIsBreath,
|
|
54
|
+
monSpellIsValid,
|
|
55
|
+
monSpellNonhpDamage,
|
|
56
|
+
RST,
|
|
57
|
+
} from "./spell.js";
|
|
58
|
+
import type { BreathProjection } from "./spell.js";
|
|
59
|
+
import { RF_SIZE, RSF_SIZE } from "./types.js";
|
|
60
|
+
import type { BlowEffect, MonsterRace, MonsterSpell } from "./types.js";
|
|
61
|
+
|
|
62
|
+
const SHRT_MAX = 32767;
|
|
63
|
+
const UCHAR_MAX = 255;
|
|
64
|
+
|
|
65
|
+
/** m_bonus_calc uses MAX_RAND_DEPTH; unused here because lore rolls at level 0. */
|
|
66
|
+
|
|
67
|
+
/* ------------------------------------------------------------------ *
|
|
68
|
+
* The headless textblock reduction.
|
|
69
|
+
* ------------------------------------------------------------------ */
|
|
70
|
+
|
|
71
|
+
/** One colored run of recall text (color is a COLOUR_* from ../color). */
|
|
72
|
+
export interface LoreTextRun {
|
|
73
|
+
text: string;
|
|
74
|
+
color: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The finished recall: a flat, front-end-agnostic list of colored runs. */
|
|
78
|
+
export type LoreText = LoreTextRun[];
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* A minimal stand-in for z-textblock: append() pushes one colored run in the
|
|
82
|
+
* order it is written. There is no wrapping or indent - that is the front
|
|
83
|
+
* end's job.
|
|
84
|
+
*/
|
|
85
|
+
export class LoreTextBuilder {
|
|
86
|
+
runs: LoreTextRun[] = [];
|
|
87
|
+
|
|
88
|
+
/** textblock_append / textblock_append_c: push a run of text. */
|
|
89
|
+
append(text: string, color = COLOUR_WHITE): this {
|
|
90
|
+
if (text.length > 0) this.runs.push({ text, color });
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
build(): LoreText {
|
|
95
|
+
return this.runs;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* ------------------------------------------------------------------ *
|
|
100
|
+
* Dependencies injected from the player / world / combat layers.
|
|
101
|
+
* ------------------------------------------------------------------ */
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The player-, world-, and combat-derived inputs the recall reads. Upstream
|
|
105
|
+
* pulls these off the global `player`, the bound spell list, and the
|
|
106
|
+
* player-attack combat math; here they are passed in so the module stays pure.
|
|
107
|
+
*/
|
|
108
|
+
export interface LoreDeps {
|
|
109
|
+
/** player->lev (used for the experience calculation). */
|
|
110
|
+
playerLevel: number;
|
|
111
|
+
/** player->max_depth in levels (colors the "found at depths of" line). */
|
|
112
|
+
playerMaxDepth: number;
|
|
113
|
+
/** player->state.speed (used by the effective-speed multiplier form). */
|
|
114
|
+
playerSpeed: number;
|
|
115
|
+
/** OPT(player, effective_speed): multiplier form vs. adjective form. */
|
|
116
|
+
effectiveSpeed: boolean;
|
|
117
|
+
/** monster_spell_by_index: the bound spell list, keyed by RSF_ index. */
|
|
118
|
+
spells: ReadonlyMap<number, MonsterSpell>;
|
|
119
|
+
/**
|
|
120
|
+
* spell_color(player, race, spellIndex): the danger color of a spell.
|
|
121
|
+
* Defaults to the spell level's base lore color when omitted.
|
|
122
|
+
*/
|
|
123
|
+
spellColor?: (race: MonsterRace, spellIndex: number) => number;
|
|
124
|
+
/**
|
|
125
|
+
* blow_color(player, blowEffect): the danger color of a melee blow effect.
|
|
126
|
+
* Defaults to the effect's base lore color when omitted.
|
|
127
|
+
*/
|
|
128
|
+
blowColor?: (effect: BlowEffect) => number;
|
|
129
|
+
/**
|
|
130
|
+
* The player's percent chance to hit this race in melee
|
|
131
|
+
* (random_chance_scaled of hit_chance(chance_of_melee_hit_base, ac)).
|
|
132
|
+
* DEFERRED: defaults to 0 when the combat layer does not supply it.
|
|
133
|
+
*/
|
|
134
|
+
meleeHitPercent?: (race: MonsterRace) => number;
|
|
135
|
+
/**
|
|
136
|
+
* The monster's percent chance to land the given blow on the player
|
|
137
|
+
* (random_chance_scaled of hit_chance(chance_of_monster_hit_base, ac+to_a)).
|
|
138
|
+
* DEFERRED: defaults to 0 when the combat layer does not supply it.
|
|
139
|
+
*/
|
|
140
|
+
monsterHitPercent?: (race: MonsterRace, effect: BlowEffect) => number;
|
|
141
|
+
/**
|
|
142
|
+
* mon_spell_lore_damage(index, race, know_hp): the max damage shown next to
|
|
143
|
+
* a spell. Optional full override; when omitted, the default computes it
|
|
144
|
+
* from the bound spell + race data (mon/spell.ts's monSpellNonhpDamage for
|
|
145
|
+
* ordinary damaging spells, breathDam scaled by `breathProjection` below
|
|
146
|
+
* for breaths), exactly as mon-spell.c's mon_spell_lore_damage /
|
|
147
|
+
* mon_spell_dam / nonhp_dam.
|
|
148
|
+
*/
|
|
149
|
+
spellLoreDamage?: (index: number, race: MonsterRace, knowHp: boolean) => number;
|
|
150
|
+
/**
|
|
151
|
+
* The breath element's damage divisor/cap (element->divisor /
|
|
152
|
+
* element->damage_cap, projection.txt), keyed by PROJ_ value - the one
|
|
153
|
+
* piece of breath damage that lives outside mon/ (world/projection.ts).
|
|
154
|
+
* Only consulted for breath-type spells' default damage. DEFERRED: damage
|
|
155
|
+
* shows as 0 when the caller does not supply it, like the other
|
|
156
|
+
* world-derived callbacks above.
|
|
157
|
+
*/
|
|
158
|
+
breathProjection?: (subtype: number) => BreathProjection | undefined;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* ------------------------------------------------------------------ *
|
|
162
|
+
* Small string helpers mirroring the upstream macros.
|
|
163
|
+
* ------------------------------------------------------------------ */
|
|
164
|
+
|
|
165
|
+
/** PLURAL(c): "" when c == 1, else "s". */
|
|
166
|
+
function plural(c: number): string {
|
|
167
|
+
return c === 1 ? "" : "s";
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** VERB_AGREEMENT(c, singular, plural): singular when c == 1, else plural. */
|
|
171
|
+
function verbAgreement(c: number, singular: string, pluralForm: string): string {
|
|
172
|
+
return c === 1 ? singular : pluralForm;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** describe_race_flag (mon-util.c L69): the monster_flag_table desc string. */
|
|
176
|
+
function describeRaceFlag(flag: number): string {
|
|
177
|
+
if (flag <= RF.NONE || flag >= MON_RACE_FLAG_ENTRIES.length) return "";
|
|
178
|
+
return MON_RACE_FLAG_ENTRIES[flag]!.description;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** The set flags of a FlagSet in ascending order. */
|
|
182
|
+
function flagList(f: FlagSet): number[] {
|
|
183
|
+
return [...f];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* ------------------------------------------------------------------ *
|
|
187
|
+
* Monster sex and pronouns.
|
|
188
|
+
* ------------------------------------------------------------------ */
|
|
189
|
+
|
|
190
|
+
/** enum monster_sex (mon-lore.c L43). */
|
|
191
|
+
export const MON_SEX = {
|
|
192
|
+
NEUTER: 0,
|
|
193
|
+
MALE: 1,
|
|
194
|
+
FEMALE: 2,
|
|
195
|
+
} as const;
|
|
196
|
+
export type MonsterSex = (typeof MON_SEX)[keyof typeof MON_SEX];
|
|
197
|
+
|
|
198
|
+
/** lore_monster_sex (mon-lore.c L695). */
|
|
199
|
+
export function loreMonsterSex(race: MonsterRace): MonsterSex {
|
|
200
|
+
if (race.flags.has(RF.FEMALE)) return MON_SEX.FEMALE;
|
|
201
|
+
if (race.flags.has(RF.MALE)) return MON_SEX.MALE;
|
|
202
|
+
return MON_SEX.NEUTER;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const LORE_PRONOUN_NOMINATIVE: readonly [string, string][] = [
|
|
206
|
+
["it", "It"],
|
|
207
|
+
["he", "He"],
|
|
208
|
+
["she", "She"],
|
|
209
|
+
];
|
|
210
|
+
|
|
211
|
+
const LORE_PRONOUN_POSSESSIVE: readonly [string, string][] = [
|
|
212
|
+
["its", "Its"],
|
|
213
|
+
["his", "His"],
|
|
214
|
+
["her", "Her"],
|
|
215
|
+
];
|
|
216
|
+
|
|
217
|
+
/** lore_pronoun_nominative (mon-lore.c L715). */
|
|
218
|
+
export function lorePronounNominative(sex: MonsterSex, titleCase: boolean): string {
|
|
219
|
+
const row = LORE_PRONOUN_NOMINATIVE[sex] ?? LORE_PRONOUN_NOMINATIVE[MON_SEX.NEUTER]!;
|
|
220
|
+
return row[titleCase ? 1 : 0];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** lore_pronoun_possessive (mon-lore.c L744). */
|
|
224
|
+
export function lorePronounPossessive(sex: MonsterSex, titleCase: boolean): string {
|
|
225
|
+
const row = LORE_PRONOUN_POSSESSIVE[sex] ?? LORE_PRONOUN_POSSESSIVE[MON_SEX.NEUTER]!;
|
|
226
|
+
return row[titleCase ? 1 : 0];
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/* ------------------------------------------------------------------ *
|
|
230
|
+
* Awareness / speed description tables.
|
|
231
|
+
* ------------------------------------------------------------------ */
|
|
232
|
+
|
|
233
|
+
/** lore_describe_awareness (mon-lore.c L558). */
|
|
234
|
+
export function loreDescribeAwareness(awareness: number): string {
|
|
235
|
+
const table: readonly [number, string][] = [
|
|
236
|
+
[200, "prefers to ignore"],
|
|
237
|
+
[95, "pays very little attention to"],
|
|
238
|
+
[75, "pays little attention to"],
|
|
239
|
+
[45, "tends to overlook"],
|
|
240
|
+
[25, "takes quite a while to see"],
|
|
241
|
+
[10, "takes a while to see"],
|
|
242
|
+
[5, "is fairly observant of"],
|
|
243
|
+
[3, "is observant of"],
|
|
244
|
+
[1, "is very observant of"],
|
|
245
|
+
[0, "is vigilant for"],
|
|
246
|
+
];
|
|
247
|
+
for (const [threshold, description] of table) {
|
|
248
|
+
if (threshold === SHRT_MAX) break;
|
|
249
|
+
if (awareness > threshold) return description;
|
|
250
|
+
}
|
|
251
|
+
return "is ever vigilant for";
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** lore_describe_speed (mon-lore.c L599). */
|
|
255
|
+
export function loreDescribeSpeed(speed: number): string {
|
|
256
|
+
const table: readonly [number, string][] = [
|
|
257
|
+
[130, "incredibly quickly"],
|
|
258
|
+
[120, "very quickly"],
|
|
259
|
+
[115, "quickly"],
|
|
260
|
+
[110, "fairly quickly"],
|
|
261
|
+
[109, "normal speed"] /* 110 is normal speed */,
|
|
262
|
+
[99, "slowly"],
|
|
263
|
+
[89, "very slowly"],
|
|
264
|
+
[0, "incredibly slowly"],
|
|
265
|
+
];
|
|
266
|
+
for (const [threshold, description] of table) {
|
|
267
|
+
if (threshold === UCHAR_MAX) break;
|
|
268
|
+
if (speed > threshold) return description;
|
|
269
|
+
}
|
|
270
|
+
return "erroneously";
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** lore_adjective_speed (mon-lore.c L636). */
|
|
274
|
+
export function loreAdjectiveSpeed(b: LoreTextBuilder, race: MonsterRace): void {
|
|
275
|
+
/* "at" is separate so it uses the normal text colour. */
|
|
276
|
+
if (race.speed === 110) b.append("at ");
|
|
277
|
+
b.append(loreDescribeSpeed(race.speed), COLOUR_GREEN);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** lore_multiplier_speed (mon-lore.c L652). */
|
|
281
|
+
export function loreMultiplierSpeed(
|
|
282
|
+
b: LoreTextBuilder,
|
|
283
|
+
race: MonsterRace,
|
|
284
|
+
deps: LoreDeps,
|
|
285
|
+
): void {
|
|
286
|
+
// moves at 2.3x normal speed (0.9x your current speed)
|
|
287
|
+
b.append("at ");
|
|
288
|
+
|
|
289
|
+
const energy = (speed: number): number => EXTRACT_ENERGY[speed] ?? 0;
|
|
290
|
+
|
|
291
|
+
let multiplier = Math.trunc((10 * energy(race.speed)) / energy(110));
|
|
292
|
+
let intMul = Math.trunc(multiplier / 10);
|
|
293
|
+
let decMul = multiplier % 10;
|
|
294
|
+
b.append(`${intMul}.${decMul}x`, COLOUR_L_BLUE);
|
|
295
|
+
|
|
296
|
+
b.append(" normal speed, which is ");
|
|
297
|
+
multiplier = Math.trunc((100 * energy(race.speed)) / energy(deps.playerSpeed));
|
|
298
|
+
intMul = Math.trunc(multiplier / 100);
|
|
299
|
+
decMul = multiplier % 100;
|
|
300
|
+
let buf: string;
|
|
301
|
+
if (!decMul) {
|
|
302
|
+
buf = `${intMul}x`;
|
|
303
|
+
} else if (!(decMul % 10)) {
|
|
304
|
+
buf = `${intMul}.${Math.trunc(decMul / 10)}x`;
|
|
305
|
+
} else {
|
|
306
|
+
buf = `${intMul}.${String(decMul).padStart(2, "0")}x`;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
let attr = COLOUR_ORANGE;
|
|
310
|
+
if (deps.playerSpeed > race.speed) attr = COLOUR_L_GREEN;
|
|
311
|
+
else if (deps.playerSpeed < race.speed) attr = COLOUR_RED;
|
|
312
|
+
|
|
313
|
+
if (deps.playerSpeed === race.speed) {
|
|
314
|
+
b.append("the same as you");
|
|
315
|
+
} else {
|
|
316
|
+
b.append(buf, attr);
|
|
317
|
+
b.append(" your speed");
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/* ------------------------------------------------------------------ *
|
|
322
|
+
* Clause builders.
|
|
323
|
+
* ------------------------------------------------------------------ */
|
|
324
|
+
|
|
325
|
+
/** lore_append_clause (mon-lore.c L777): a serial-comma list of race flags. */
|
|
326
|
+
export function loreAppendClause(
|
|
327
|
+
b: LoreTextBuilder,
|
|
328
|
+
f: FlagSet,
|
|
329
|
+
attr: number,
|
|
330
|
+
start: string,
|
|
331
|
+
conjunction: string,
|
|
332
|
+
end: string,
|
|
333
|
+
): void {
|
|
334
|
+
const flags = flagList(f);
|
|
335
|
+
const count = flags.length;
|
|
336
|
+
const comma = count > 2;
|
|
337
|
+
|
|
338
|
+
if (count) {
|
|
339
|
+
b.append(start);
|
|
340
|
+
for (let i = 0; i < flags.length; i++) {
|
|
341
|
+
if (i !== 0) {
|
|
342
|
+
if (comma) b.append(",");
|
|
343
|
+
/* Last entry */
|
|
344
|
+
if (i === flags.length - 1) {
|
|
345
|
+
b.append(" ");
|
|
346
|
+
b.append(conjunction);
|
|
347
|
+
}
|
|
348
|
+
b.append(" ");
|
|
349
|
+
}
|
|
350
|
+
b.append(describeRaceFlag(flags[i]!), attr);
|
|
351
|
+
}
|
|
352
|
+
b.append(end);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** lore_append_spell_clause (mon-lore.c L819): the spell-formatted variant. */
|
|
357
|
+
export function loreAppendSpellClause(
|
|
358
|
+
b: LoreTextBuilder,
|
|
359
|
+
f: FlagSet,
|
|
360
|
+
knowHp: boolean,
|
|
361
|
+
race: MonsterRace,
|
|
362
|
+
deps: LoreDeps,
|
|
363
|
+
conjunction: string,
|
|
364
|
+
end: string,
|
|
365
|
+
): void {
|
|
366
|
+
const spells = flagList(f);
|
|
367
|
+
const count = spells.length;
|
|
368
|
+
const comma = count > 2;
|
|
369
|
+
|
|
370
|
+
if (count) {
|
|
371
|
+
for (let i = 0; i < spells.length; i++) {
|
|
372
|
+
const spell = spells[i]!;
|
|
373
|
+
const color = spellColor(deps, race, spell);
|
|
374
|
+
const damage = monSpellLoreDamage(spell, race, knowHp, deps);
|
|
375
|
+
|
|
376
|
+
if (i !== 0) {
|
|
377
|
+
if (comma) b.append(",");
|
|
378
|
+
if (i === spells.length - 1) {
|
|
379
|
+
b.append(" ");
|
|
380
|
+
b.append(conjunction);
|
|
381
|
+
}
|
|
382
|
+
b.append(" ");
|
|
383
|
+
}
|
|
384
|
+
b.append(monSpellLoreDescription(spell, race, deps.spells), color);
|
|
385
|
+
if (damage > 0) b.append(` (${damage})`, color);
|
|
386
|
+
}
|
|
387
|
+
b.append(end);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/* ------------------------------------------------------------------ *
|
|
392
|
+
* mon-spell.c lore helpers (local port; upstream mon-spell.c L681/L698).
|
|
393
|
+
* ------------------------------------------------------------------ */
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Select the monster_spell_level for a race's spell power (the shared
|
|
397
|
+
* "while (level->next && spell_power >= level->next->power)" walk).
|
|
398
|
+
*/
|
|
399
|
+
function spellLevelFor(spell: MonsterSpell, race: MonsterRace) {
|
|
400
|
+
let level = spell.levels[0]!;
|
|
401
|
+
for (let i = 1; i < spell.levels.length; i++) {
|
|
402
|
+
const next = spell.levels[i]!;
|
|
403
|
+
if (race.spellPower >= next.power) level = next;
|
|
404
|
+
else break;
|
|
405
|
+
}
|
|
406
|
+
return level;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/** mon_spell_lore_description (mon-spell.c L681). */
|
|
410
|
+
export function monSpellLoreDescription(
|
|
411
|
+
index: number,
|
|
412
|
+
race: MonsterRace,
|
|
413
|
+
spells: ReadonlyMap<number, MonsterSpell>,
|
|
414
|
+
): string {
|
|
415
|
+
if (monSpellIsValid(index)) {
|
|
416
|
+
const spell = spells.get(index);
|
|
417
|
+
if (!spell) return "";
|
|
418
|
+
return spellLevelFor(spell, race).loreDesc;
|
|
419
|
+
}
|
|
420
|
+
return "";
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* mon_spell_lore_damage (mon-spell.c L698): the max damage shown next to a
|
|
425
|
+
* known spell, or 0 (which omits the "(N)" suffix, lore_append_spell_clause)
|
|
426
|
+
* when the spell has no damage or is not valid.
|
|
427
|
+
*
|
|
428
|
+
* `deps.spellLoreDamage` is a full override (the combat layer's escape
|
|
429
|
+
* hatch); otherwise this reproduces mon_spell_dam (mon-spell.c L637):
|
|
430
|
+
* - a breath spell (monster_spell_is_breath) uses breath_dam against
|
|
431
|
+
* hp = know_hp ? race->avg_hp : 0 (mon/spell.ts's breathDam, reused as
|
|
432
|
+
* is - the same formula the live BREATH effect handler uses,
|
|
433
|
+
* game/effect-attack.ts handleBREATH), scaled by the element the
|
|
434
|
+
* spell's first effect targets (`deps.breathProjection`).
|
|
435
|
+
* - any other damaging spell uses nonhp_dam (mon/spell.ts's
|
|
436
|
+
* monSpellNonhpDamage), which does not depend on know_hp at all -
|
|
437
|
+
* upstream's nonhp_dam takes no hp parameter, so this damage is shown as
|
|
438
|
+
* soon as the spell itself is known (already gated by the caller
|
|
439
|
+
* intersecting lore.spellFlags before this is ever called).
|
|
440
|
+
*/
|
|
441
|
+
export function monSpellLoreDamage(
|
|
442
|
+
index: number,
|
|
443
|
+
race: MonsterRace,
|
|
444
|
+
knowHp: boolean,
|
|
445
|
+
deps: LoreDeps,
|
|
446
|
+
): number {
|
|
447
|
+
if (!monSpellIsValid(index) || !monSpellHasDamage(index)) return 0;
|
|
448
|
+
if (deps.spellLoreDamage) return deps.spellLoreDamage(index, race, knowHp);
|
|
449
|
+
|
|
450
|
+
const spell = deps.spells.get(index);
|
|
451
|
+
if (!spell) return 0;
|
|
452
|
+
|
|
453
|
+
if (monSpellIsBreath(index)) {
|
|
454
|
+
const subtypeName = spell.effects[0]?.type;
|
|
455
|
+
const subtype = subtypeName ? (PROJ as Record<string, number>)[subtypeName] : undefined;
|
|
456
|
+
if (subtype === undefined) return 0;
|
|
457
|
+
const proj = deps.breathProjection?.(subtype);
|
|
458
|
+
if (!proj) return 0;
|
|
459
|
+
const hp = knowHp ? race.avgHp : 0;
|
|
460
|
+
return breathDam(proj, hp);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
return monSpellNonhpDamage(spell.effects, race);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/** spell_color default (mon-lore.c L59): the spell level's base lore color. */
|
|
467
|
+
function spellColor(deps: LoreDeps, race: MonsterRace, spellIndex: number): number {
|
|
468
|
+
if (deps.spellColor) return deps.spellColor(race, spellIndex);
|
|
469
|
+
const spell = deps.spells.get(spellIndex);
|
|
470
|
+
if (!spell) return COLOUR_DARK;
|
|
471
|
+
const attr = colorTextToAttr(spellLevelFor(spell, race).loreColorBase);
|
|
472
|
+
return attr < 0 ? COLOUR_WHITE : attr;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* blow_color default (mon-lore.c L178): the blow effect's base lore color.
|
|
477
|
+
*
|
|
478
|
+
* blow_index (mon-blows.c:174) is INLINED away here: upstream needs it only to
|
|
479
|
+
* turn race->blow[i].effect->name back into the blow_effects[] index that
|
|
480
|
+
* blow_color takes (its sole caller, mon-lore.c:1689), and the port passes the
|
|
481
|
+
* bound BlowEffect record itself, so the name->index round trip is unnecessary.
|
|
482
|
+
*/
|
|
483
|
+
function blowColor(deps: LoreDeps, effect: BlowEffect): number {
|
|
484
|
+
if (deps.blowColor) return deps.blowColor(effect);
|
|
485
|
+
const attr = colorTextToAttr(effect.loreColorBase);
|
|
486
|
+
return attr < 0 ? COLOUR_WHITE : attr;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/* ------------------------------------------------------------------ *
|
|
490
|
+
* spell_color / blow_color (mon-lore.c L59-276): the player-resistance-
|
|
491
|
+
* aware danger recolouring of a monster's listed spells and blows.
|
|
492
|
+
*
|
|
493
|
+
* Upstream reads these off the global player's known_state (the rune-gated
|
|
494
|
+
* resists / protections / save skill / stat_ind) and scans the pack; here the
|
|
495
|
+
* live known-state is injected as LoreColorState so the module stays pure.
|
|
496
|
+
* The UI layer wires spellColorFor/blowColorFor as LoreDeps.spellColor /
|
|
497
|
+
* blowColor (main.ts recallDeps), so a monster's spells/blows are coloured by
|
|
498
|
+
* whether the player actually resists them, exactly as ui-mon-lore.c renders.
|
|
499
|
+
* ------------------------------------------------------------------ */
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* The player known-state inputs spell_color / blow_color read (mon-lore.c
|
|
503
|
+
* p->known_state and the pack scans). Built by the UI layer from the live
|
|
504
|
+
* derived player_state so the recolouring reflects worn (known) resistances.
|
|
505
|
+
*/
|
|
506
|
+
export interface LoreColorState {
|
|
507
|
+
/** known_state.skills[SKILL_SAVE] (mon-lore.c L82). */
|
|
508
|
+
saveSkill: number;
|
|
509
|
+
/** known_state.el_info[elem].res_level, by PROJ_/ELEM_ index (3 == immune). */
|
|
510
|
+
resLevel: (elem: number) => number;
|
|
511
|
+
/** of_has(known_state.flags, OF_*), by OF_ index. */
|
|
512
|
+
hasFlag: (of: number) => boolean;
|
|
513
|
+
/**
|
|
514
|
+
* player_inc_check(p, subtype, true) for an EF_TIMED_INC subtype: whether the
|
|
515
|
+
* given timed effect (a TMD_ name) could land on the player (mon-lore.c L92).
|
|
516
|
+
*/
|
|
517
|
+
incCheck: (timedName: string) => boolean;
|
|
518
|
+
/** p->lev + adj_dex_safe[stat_ind[STAT_DEX]] >= 100 (theft blows, L208). */
|
|
519
|
+
theftSafe: boolean;
|
|
520
|
+
/** A pack item that can hold charges and has pval > 0 (drain-charges, L216). */
|
|
521
|
+
hasChargeItem: boolean;
|
|
522
|
+
/** A pack item that is edible (eat-food blows, L231). */
|
|
523
|
+
hasEdible: boolean;
|
|
524
|
+
/** The wielded light burns fuel: obj && timeout && !OF_NO_FUEL (eat-light, L246). */
|
|
525
|
+
lightBurning: boolean;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* A lore colour name -> attr, with unknown/unset mapped to COLOUR_DARK (0) to
|
|
530
|
+
* match the zero-initialised lore_attr_resist / lore_attr_immune the C tests
|
|
531
|
+
* with `!level->lore_attr_resist` (mon-lore.c L75, L183).
|
|
532
|
+
*/
|
|
533
|
+
function loreAttrOrDark(name: string): number {
|
|
534
|
+
// z-color.c:195-201 makes an empty name the zero-filled row 28, but
|
|
535
|
+
// mon-lore.c:75/183 treats an unset lore colour as COLOUR_DARK.
|
|
536
|
+
return name === "" ? COLOUR_DARK : colorTextToAttr(name);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* A base lore colour name -> attr, unknown mapped to COLOUR_WHITE (the same
|
|
541
|
+
* default the plain spellColor/blowColor helpers above use).
|
|
542
|
+
*/
|
|
543
|
+
function loreAttrOrWhite(name: string): number {
|
|
544
|
+
return name === "" ? COLOUR_WHITE : colorTextToAttr(name);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/** spell_color (mon-lore.c L59): the danger colour of a monster spell. */
|
|
548
|
+
export function spellColorFor(
|
|
549
|
+
race: MonsterRace,
|
|
550
|
+
spellIndex: number,
|
|
551
|
+
spells: ReadonlyMap<number, MonsterSpell>,
|
|
552
|
+
st: LoreColorState,
|
|
553
|
+
): number {
|
|
554
|
+
const spell = spells.get(spellIndex);
|
|
555
|
+
/* No spell (L67). */
|
|
556
|
+
if (!spell) return COLOUR_DARK;
|
|
557
|
+
|
|
558
|
+
/* Get the right level (L70-72). */
|
|
559
|
+
const level = spellLevelFor(spell, race);
|
|
560
|
+
const base = loreAttrOrWhite(level.loreColorBase);
|
|
561
|
+
const resist = loreAttrOrDark(level.loreColorResist);
|
|
562
|
+
const immune = loreAttrOrDark(level.loreColorImmune);
|
|
563
|
+
|
|
564
|
+
/* Unresistable spells just use the default color (L74-77). */
|
|
565
|
+
if (!resist && !immune) return base;
|
|
566
|
+
|
|
567
|
+
const eff = spell.effects[0];
|
|
568
|
+
const effIndex = eff ? (EF as Record<string, number>)[eff.eff] : undefined;
|
|
569
|
+
|
|
570
|
+
/* Spells with a save (L80-115). */
|
|
571
|
+
if (level.saveMessage) {
|
|
572
|
+
if (st.saveSkill < 100) {
|
|
573
|
+
if (effIndex === EF.TELEPORT_LEVEL) {
|
|
574
|
+
/* Special case - teleport level (L83-89). */
|
|
575
|
+
return st.resLevel(PROJ.NEXUS) > 0 ? resist : base;
|
|
576
|
+
}
|
|
577
|
+
if (effIndex === EF.TIMED_INC) {
|
|
578
|
+
/* Simple timed effects (L90-96). */
|
|
579
|
+
return st.incCheck(eff?.type ?? "") ? base : resist;
|
|
580
|
+
}
|
|
581
|
+
if (immune) {
|
|
582
|
+
/* Multiple timed effects plus damage (L97-105). */
|
|
583
|
+
for (const e of spell.effects) {
|
|
584
|
+
if ((EF as Record<string, number>)[e.eff] !== EF.TIMED_INC) continue;
|
|
585
|
+
if (st.incCheck(e.type ?? "")) return base;
|
|
586
|
+
}
|
|
587
|
+
return resist;
|
|
588
|
+
}
|
|
589
|
+
/* Straight damage (L106-108). */
|
|
590
|
+
return base;
|
|
591
|
+
}
|
|
592
|
+
if (immune) return immune; /* L110-111 */
|
|
593
|
+
return resist; /* L112-113 */
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/* Bolts, balls and breaths (L117-166). */
|
|
597
|
+
if (effIndex === EF.BOLT || effIndex === EF.BALL || effIndex === EF.BREATH) {
|
|
598
|
+
const subtype = eff?.type ? (PROJ as Record<string, number>)[eff.type] : undefined;
|
|
599
|
+
switch (subtype) {
|
|
600
|
+
/* Special case - sound (L123-131). */
|
|
601
|
+
case PROJ.SOUND:
|
|
602
|
+
if (st.resLevel(PROJ.SOUND) > 0) return immune;
|
|
603
|
+
if (st.hasFlag(OF.PROT_STUN)) return resist;
|
|
604
|
+
return base;
|
|
605
|
+
/* Special case - nexus (L133-141). */
|
|
606
|
+
case PROJ.NEXUS:
|
|
607
|
+
if (st.resLevel(PROJ.NEXUS) > 0) return immune;
|
|
608
|
+
if (st.saveSkill >= 100) return resist;
|
|
609
|
+
return base;
|
|
610
|
+
/* Elements that stun or confuse (L143-155). */
|
|
611
|
+
case PROJ.FORCE:
|
|
612
|
+
case PROJ.ICE:
|
|
613
|
+
case PROJ.PLASMA:
|
|
614
|
+
case PROJ.WATER:
|
|
615
|
+
if (!st.hasFlag(OF.PROT_STUN)) return base;
|
|
616
|
+
if (!st.hasFlag(OF.PROT_CONF) && subtype === PROJ.WATER) return base;
|
|
617
|
+
return resist;
|
|
618
|
+
/* All other elements (L157-164). */
|
|
619
|
+
default: {
|
|
620
|
+
if (subtype === undefined) return base;
|
|
621
|
+
const rl = st.resLevel(subtype);
|
|
622
|
+
if (rl === 3) return immune;
|
|
623
|
+
if (rl > 0) return resist;
|
|
624
|
+
return base;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
return base; /* L168 */
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/** blow_color (mon-lore.c L178): the danger colour of a monster melee blow. */
|
|
633
|
+
export function blowColorFor(effect: BlowEffect, st: LoreColorState): number {
|
|
634
|
+
const base = loreAttrOrWhite(effect.loreColorBase);
|
|
635
|
+
const resist = loreAttrOrDark(effect.loreColorResist);
|
|
636
|
+
const immune = loreAttrOrDark(effect.loreColorImmune);
|
|
637
|
+
|
|
638
|
+
/* Some blows just use the default color (L182-185). */
|
|
639
|
+
if (!resist && !immune) return base;
|
|
640
|
+
|
|
641
|
+
/* Effects with immunities are straightforward (L187-204). proj_name_to_idx
|
|
642
|
+
* of the blow's element name gives the el_info slot (the loop L191-195 just
|
|
643
|
+
* finds i == that index for ACID..COLD). */
|
|
644
|
+
if (immune) {
|
|
645
|
+
const i = (PROJ as Record<string, number>)[effect.name];
|
|
646
|
+
const rl = i === undefined ? 0 : st.resLevel(i);
|
|
647
|
+
if (rl === 3) return immune;
|
|
648
|
+
if (rl > 0) return resist;
|
|
649
|
+
return base;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
/* Now look at what player attributes can protect from the effects (L206-273). */
|
|
653
|
+
switch (effect.effectType) {
|
|
654
|
+
case "theft":
|
|
655
|
+
return st.theftSafe ? resist : base;
|
|
656
|
+
case "drain":
|
|
657
|
+
return st.hasChargeItem ? base : resist;
|
|
658
|
+
case "eat-food":
|
|
659
|
+
return st.hasEdible ? base : resist;
|
|
660
|
+
case "eat-light":
|
|
661
|
+
return st.lightBurning ? base : resist;
|
|
662
|
+
case "element": {
|
|
663
|
+
const i = effect.resist ? (PROJ as Record<string, number>)[effect.resist] : undefined;
|
|
664
|
+
return i !== undefined && st.resLevel(i) > 0 ? resist : base;
|
|
665
|
+
}
|
|
666
|
+
case "flag": {
|
|
667
|
+
const of = effect.resist ? (OF as Record<string, number>)[effect.resist] : undefined;
|
|
668
|
+
return of !== undefined && st.hasFlag(of) ? resist : base;
|
|
669
|
+
}
|
|
670
|
+
case "all_sustains":
|
|
671
|
+
return st.hasFlag(OF.SUST_STR) &&
|
|
672
|
+
st.hasFlag(OF.SUST_INT) &&
|
|
673
|
+
st.hasFlag(OF.SUST_WIS) &&
|
|
674
|
+
st.hasFlag(OF.SUST_DEX) &&
|
|
675
|
+
st.hasFlag(OF.SUST_CON)
|
|
676
|
+
? resist
|
|
677
|
+
: base;
|
|
678
|
+
default:
|
|
679
|
+
return base; /* L275 */
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/* ------------------------------------------------------------------ *
|
|
684
|
+
* lore_append_* section functions.
|
|
685
|
+
* ------------------------------------------------------------------ */
|
|
686
|
+
|
|
687
|
+
/** lore_append_kills (mon-lore.c L867). */
|
|
688
|
+
export function loreAppendKills(
|
|
689
|
+
b: LoreTextBuilder,
|
|
690
|
+
race: MonsterRace,
|
|
691
|
+
lore: MonsterLore,
|
|
692
|
+
knownFlags: FlagSet,
|
|
693
|
+
): void {
|
|
694
|
+
const msex = loreMonsterSex(race);
|
|
695
|
+
let out = true;
|
|
696
|
+
|
|
697
|
+
if (knownFlags.has(RF.UNIQUE)) {
|
|
698
|
+
const dead = race.maxNum === 0;
|
|
699
|
+
|
|
700
|
+
if (lore.deaths) {
|
|
701
|
+
b.append(
|
|
702
|
+
`${lorePronounNominative(msex, true)} has slain ${lore.deaths} of your ancestors`,
|
|
703
|
+
);
|
|
704
|
+
if (dead) {
|
|
705
|
+
b.append(", but you have taken revenge! ");
|
|
706
|
+
} else {
|
|
707
|
+
b.append(
|
|
708
|
+
`, who ${verbAgreement(lore.deaths, "remains", "remain")} unavenged. `,
|
|
709
|
+
);
|
|
710
|
+
}
|
|
711
|
+
} else if (dead) {
|
|
712
|
+
b.append("You have slain this foe. ");
|
|
713
|
+
} else {
|
|
714
|
+
out = false;
|
|
715
|
+
}
|
|
716
|
+
} else if (lore.deaths) {
|
|
717
|
+
b.append(
|
|
718
|
+
`${lore.deaths} of your ancestors ${verbAgreement(lore.deaths, "has", "have")} been killed by this creature, `,
|
|
719
|
+
);
|
|
720
|
+
|
|
721
|
+
if (lore.pkills) {
|
|
722
|
+
b.append(
|
|
723
|
+
`and you have exterminated at least ${lore.pkills} of the creatures. `,
|
|
724
|
+
);
|
|
725
|
+
} else if (lore.tkills) {
|
|
726
|
+
b.append(
|
|
727
|
+
`and your ancestors have exterminated at least ${lore.tkills} of the creatures. `,
|
|
728
|
+
);
|
|
729
|
+
} else {
|
|
730
|
+
b.append(
|
|
731
|
+
`and ${lorePronounNominative(msex, false)} is not ever known to have been defeated. `,
|
|
732
|
+
COLOUR_RED,
|
|
733
|
+
);
|
|
734
|
+
}
|
|
735
|
+
} else {
|
|
736
|
+
if (lore.pkills) {
|
|
737
|
+
b.append(`You have killed at least ${lore.pkills} of these creatures. `);
|
|
738
|
+
} else if (lore.tkills) {
|
|
739
|
+
b.append(
|
|
740
|
+
`Your ancestors have killed at least ${lore.tkills} of these creatures. `,
|
|
741
|
+
);
|
|
742
|
+
} else {
|
|
743
|
+
b.append("No battles to the death are recalled. ");
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if (out) b.append("\n");
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
/** lore_append_flavor (mon-lore.c L943). */
|
|
751
|
+
export function loreAppendFlavor(b: LoreTextBuilder, race: MonsterRace): void {
|
|
752
|
+
b.append(`${race.text}\n`);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
/** lore_append_movement (mon-lore.c L961). */
|
|
756
|
+
export function loreAppendMovement(
|
|
757
|
+
b: LoreTextBuilder,
|
|
758
|
+
race: MonsterRace,
|
|
759
|
+
_lore: MonsterLore,
|
|
760
|
+
knownFlags: FlagSet,
|
|
761
|
+
deps: LoreDeps,
|
|
762
|
+
): void {
|
|
763
|
+
b.append("This");
|
|
764
|
+
|
|
765
|
+
/* Adjectives (from race->flags directly, as upstream). */
|
|
766
|
+
const adj = createMonFlagMask("RFT_RACE_A");
|
|
767
|
+
adj.inter(race.flags);
|
|
768
|
+
for (const f of adj) {
|
|
769
|
+
b.append(` ${describeRaceFlag(f)}`, COLOUR_L_BLUE);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/* Noun (first race-noun flag, else "creature"). */
|
|
773
|
+
const noun = createMonFlagMask("RFT_RACE_N");
|
|
774
|
+
noun.inter(race.flags);
|
|
775
|
+
const nounFlag = noun.next(FLAG_START);
|
|
776
|
+
if (nounFlag !== NO_FLAG) {
|
|
777
|
+
b.append(` ${describeRaceFlag(nounFlag)}`, COLOUR_L_BLUE);
|
|
778
|
+
} else {
|
|
779
|
+
b.append(" creature", COLOUR_L_BLUE);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/* Location. */
|
|
783
|
+
if (race.level === 0) {
|
|
784
|
+
b.append(" lives in the town");
|
|
785
|
+
} else {
|
|
786
|
+
const colour = race.level > deps.playerMaxDepth ? COLOUR_RED : COLOUR_L_BLUE;
|
|
787
|
+
if (knownFlags.has(RF.FORCE_DEPTH)) b.append(" is found ");
|
|
788
|
+
else b.append(" is normally found ");
|
|
789
|
+
b.append("at depths of ");
|
|
790
|
+
b.append(`${race.level * 50}`, colour);
|
|
791
|
+
b.append(" feet (level ");
|
|
792
|
+
b.append(`${race.level}`, colour);
|
|
793
|
+
b.append(")");
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
b.append(", and moves");
|
|
797
|
+
|
|
798
|
+
/* Random-ness. */
|
|
799
|
+
if (knownFlags.test(RF.RAND_50, RF.RAND_25)) {
|
|
800
|
+
const r50 = knownFlags.has(RF.RAND_50);
|
|
801
|
+
const r25 = knownFlags.has(RF.RAND_25);
|
|
802
|
+
if (r50 && r25) b.append(" extremely");
|
|
803
|
+
else if (r50) b.append(" somewhat");
|
|
804
|
+
else if (r25) b.append(" a bit");
|
|
805
|
+
|
|
806
|
+
b.append(" erratically");
|
|
807
|
+
|
|
808
|
+
if (race.speed !== 110) b.append(", and");
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
/* Speed. */
|
|
812
|
+
b.append(" ");
|
|
813
|
+
if (deps.effectiveSpeed) loreMultiplierSpeed(b, race, deps);
|
|
814
|
+
else loreAdjectiveSpeed(b, race);
|
|
815
|
+
|
|
816
|
+
/* Attack speed also. */
|
|
817
|
+
if (knownFlags.has(RF.NEVER_MOVE)) {
|
|
818
|
+
b.append(", but ");
|
|
819
|
+
b.append("does not deign to chase intruders", COLOUR_L_GREEN);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
b.append(". ");
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/** lore_append_toughness (mon-lore.c L1057). */
|
|
826
|
+
export function loreAppendToughness(
|
|
827
|
+
b: LoreTextBuilder,
|
|
828
|
+
race: MonsterRace,
|
|
829
|
+
lore: MonsterLore,
|
|
830
|
+
knownFlags: FlagSet,
|
|
831
|
+
deps: LoreDeps,
|
|
832
|
+
): void {
|
|
833
|
+
const msex = loreMonsterSex(race);
|
|
834
|
+
|
|
835
|
+
if (lore.armourKnown) {
|
|
836
|
+
b.append(`${lorePronounNominative(msex, true)} has a`);
|
|
837
|
+
if (!knownFlags.has(RF.UNIQUE)) b.append("n average");
|
|
838
|
+
b.append(" life rating of ");
|
|
839
|
+
b.append(`${race.avgHp}`, COLOUR_L_BLUE);
|
|
840
|
+
|
|
841
|
+
b.append(", and an armor rating of ");
|
|
842
|
+
b.append(`${race.ac}`, COLOUR_L_BLUE);
|
|
843
|
+
b.append(". ");
|
|
844
|
+
|
|
845
|
+
/* Player's base chance to hit.
|
|
846
|
+
* DEFERRED: hit_chance(chance_of_melee_hit_base(player, weapon), ac)
|
|
847
|
+
* needs the player-attack combat math and the equipped weapon, neither of
|
|
848
|
+
* which is available here; defaults to 0 unless deps.meleeHitPercent is
|
|
849
|
+
* supplied. Upstream mon-lore.c L1086-1094. */
|
|
850
|
+
const percent = deps.meleeHitPercent ? deps.meleeHitPercent(race) : 0;
|
|
851
|
+
b.append("You have a");
|
|
852
|
+
if (percent === 8 || Math.trunc(percent / 10) === 8) b.append("n");
|
|
853
|
+
b.append(` ${percent}`, COLOUR_L_BLUE);
|
|
854
|
+
b.append("% chance to hit such a creature in melee (if you can see it). ");
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/** lore_append_exp (mon-lore.c L1109). */
|
|
859
|
+
export function loreAppendExp(
|
|
860
|
+
b: LoreTextBuilder,
|
|
861
|
+
race: MonsterRace,
|
|
862
|
+
_lore: MonsterLore,
|
|
863
|
+
knownFlags: FlagSet,
|
|
864
|
+
deps: LoreDeps,
|
|
865
|
+
): void {
|
|
866
|
+
if (!race.rarity) return;
|
|
867
|
+
|
|
868
|
+
if (knownFlags.has(RF.UNIQUE)) b.append("Killing");
|
|
869
|
+
else b.append("A kill of");
|
|
870
|
+
|
|
871
|
+
b.append(" this creature");
|
|
872
|
+
|
|
873
|
+
const lev = deps.playerLevel;
|
|
874
|
+
|
|
875
|
+
/* Integer and (x100) fractional experience, long arithmetic upstream. */
|
|
876
|
+
const expInteger = Math.trunc((race.mexp * race.level) / lev);
|
|
877
|
+
const expFraction = Math.trunc(
|
|
878
|
+
(Math.trunc((((race.mexp * race.level) % lev) * 1000) / lev) + 5) / 10,
|
|
879
|
+
);
|
|
880
|
+
|
|
881
|
+
let buf = `${expInteger}`;
|
|
882
|
+
if (expFraction) buf += `.${String(expFraction).padStart(2, "0")}`;
|
|
883
|
+
|
|
884
|
+
b.append(" is worth ");
|
|
885
|
+
b.append(
|
|
886
|
+
`${buf} point${plural(expInteger === 1 && expFraction === 0 ? 1 : 2)}`,
|
|
887
|
+
COLOUR_BLUE,
|
|
888
|
+
);
|
|
889
|
+
|
|
890
|
+
/* Annoying English ordinals. */
|
|
891
|
+
let ordinal = "th";
|
|
892
|
+
const level = lev % 10;
|
|
893
|
+
if (Math.trunc(lev / 10) === 1) {
|
|
894
|
+
/* nothing */
|
|
895
|
+
} else if (level === 1) ordinal = "st";
|
|
896
|
+
else if (level === 2) ordinal = "nd";
|
|
897
|
+
else if (level === 3) ordinal = "rd";
|
|
898
|
+
|
|
899
|
+
/* Leading vowels. */
|
|
900
|
+
let article = "a";
|
|
901
|
+
if (lev === 8 || lev === 11 || lev === 18) article = "an";
|
|
902
|
+
|
|
903
|
+
b.append(` for ${article} ${lev}${ordinal} level character. `);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/**
|
|
907
|
+
* mon_create_drop_count (mon-make.c L699), maximize=true, specific=false path.
|
|
908
|
+
* This path is deterministic (no RNG), so it is ported inline. The port's
|
|
909
|
+
* MonsterRace carries the drop list, so the specific-drop maximum is summed.
|
|
910
|
+
*/
|
|
911
|
+
function monCreateDropCountMax(race: MonsterRace): { number: number; nspec: number } {
|
|
912
|
+
const DROP_4_MAX = 6;
|
|
913
|
+
const DROP_3_MAX = 4;
|
|
914
|
+
const DROP_2_MAX = 3;
|
|
915
|
+
let number = 0;
|
|
916
|
+
let nspec = 0;
|
|
917
|
+
|
|
918
|
+
if (race.flags.has(RF.DROP_20)) number++;
|
|
919
|
+
if (race.flags.has(RF.DROP_40)) number++;
|
|
920
|
+
if (race.flags.has(RF.DROP_60)) number++;
|
|
921
|
+
if (race.flags.has(RF.DROP_4)) number += DROP_4_MAX;
|
|
922
|
+
if (race.flags.has(RF.DROP_3)) number += DROP_3_MAX;
|
|
923
|
+
if (race.flags.has(RF.DROP_2)) number += DROP_2_MAX;
|
|
924
|
+
if (race.flags.has(RF.DROP_1)) number++;
|
|
925
|
+
for (const drop of race.drops) nspec += drop.max;
|
|
926
|
+
|
|
927
|
+
return { number, nspec };
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
/** lore_append_drop (mon-lore.c L1177). */
|
|
931
|
+
export function loreAppendDrop(
|
|
932
|
+
b: LoreTextBuilder,
|
|
933
|
+
race: MonsterRace,
|
|
934
|
+
lore: MonsterLore,
|
|
935
|
+
knownFlags: FlagSet,
|
|
936
|
+
): void {
|
|
937
|
+
if (!lore.dropKnown) return;
|
|
938
|
+
|
|
939
|
+
const msex = loreMonsterSex(race);
|
|
940
|
+
const { number: n, nspec } = monCreateDropCountMax(race);
|
|
941
|
+
|
|
942
|
+
if (n > 0 || nspec > 0) {
|
|
943
|
+
b.append(`${lorePronounNominative(msex, true)} may carry`);
|
|
944
|
+
|
|
945
|
+
if (n > 0) {
|
|
946
|
+
const onlyItem = knownFlags.has(RF.ONLY_ITEM);
|
|
947
|
+
const onlyGold = knownFlags.has(RF.ONLY_GOLD);
|
|
948
|
+
|
|
949
|
+
if (n === 1) {
|
|
950
|
+
b.append(" a single ", COLOUR_BLUE);
|
|
951
|
+
} else if (n === 2) {
|
|
952
|
+
b.append(" one or two ", COLOUR_BLUE);
|
|
953
|
+
} else {
|
|
954
|
+
b.append(" up to ");
|
|
955
|
+
b.append(`${n} `, COLOUR_BLUE);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
if (knownFlags.has(RF.DROP_GREAT)) {
|
|
959
|
+
b.append("exceptional ", COLOUR_BLUE);
|
|
960
|
+
} else if (knownFlags.has(RF.DROP_GOOD)) {
|
|
961
|
+
b.append("good ", COLOUR_BLUE);
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
if (onlyItem && onlyGold) {
|
|
965
|
+
b.append(`error${plural(n)}`, COLOUR_BLUE);
|
|
966
|
+
} else if (onlyItem && !onlyGold) {
|
|
967
|
+
b.append(`object${plural(n)}`, COLOUR_BLUE);
|
|
968
|
+
} else if (!onlyItem && onlyGold) {
|
|
969
|
+
b.append(`treasure${plural(n)}`, COLOUR_BLUE);
|
|
970
|
+
} else {
|
|
971
|
+
b.append(`object${plural(n)} or treasure${plural(n)}`, COLOUR_BLUE);
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
if (nspec > 0) {
|
|
976
|
+
if (n > 0) b.append(" and");
|
|
977
|
+
if (nspec === 1) {
|
|
978
|
+
b.append(" a single");
|
|
979
|
+
} else if (nspec === 2) {
|
|
980
|
+
b.append(" one or two");
|
|
981
|
+
} else {
|
|
982
|
+
b.append(" up to");
|
|
983
|
+
b.append(` ${nspec}`, COLOUR_BLUE);
|
|
984
|
+
}
|
|
985
|
+
b.append(" specific items");
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
b.append(". ");
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
/** lore_append_abilities (mon-lore.c L1276). */
|
|
993
|
+
export function loreAppendAbilities(
|
|
994
|
+
b: LoreTextBuilder,
|
|
995
|
+
race: MonsterRace,
|
|
996
|
+
lore: MonsterLore,
|
|
997
|
+
knownFlags: FlagSet,
|
|
998
|
+
): void {
|
|
999
|
+
const msex = loreMonsterSex(race);
|
|
1000
|
+
const pronoun = lorePronounNominative(msex, true);
|
|
1001
|
+
let prev = false;
|
|
1002
|
+
|
|
1003
|
+
const known = (types: string[]): FlagSet => {
|
|
1004
|
+
const f = createMonFlagMask(...types);
|
|
1005
|
+
f.inter(knownFlags);
|
|
1006
|
+
return f;
|
|
1007
|
+
};
|
|
1008
|
+
|
|
1009
|
+
/* Environment-shaping abilities. */
|
|
1010
|
+
loreAppendClause(b, known(["RFT_ALTER"]), COLOUR_WHITE, `${pronoun} can `, "and", ". ");
|
|
1011
|
+
|
|
1012
|
+
/* Detection traits. */
|
|
1013
|
+
loreAppendClause(b, known(["RFT_DET"]), COLOUR_WHITE, `${pronoun} is `, "and", ". ");
|
|
1014
|
+
|
|
1015
|
+
/* Special things. */
|
|
1016
|
+
if (knownFlags.has(RF.UNAWARE))
|
|
1017
|
+
b.append(`${pronoun} disguises itself as something else. `);
|
|
1018
|
+
if (knownFlags.has(RF.MULTIPLY))
|
|
1019
|
+
b.append(`${pronoun} breeds explosively. `, COLOUR_ORANGE);
|
|
1020
|
+
if (knownFlags.has(RF.REGENERATE)) b.append(`${pronoun} regenerates quickly. `);
|
|
1021
|
+
|
|
1022
|
+
/* Light. */
|
|
1023
|
+
if (race.light > 1) {
|
|
1024
|
+
b.append(
|
|
1025
|
+
`${pronoun} illuminates ${lorePronounPossessive(msex, false)} surroundings. `,
|
|
1026
|
+
);
|
|
1027
|
+
} else if (race.light === 1) {
|
|
1028
|
+
b.append(`${pronoun} is illuminated. `);
|
|
1029
|
+
} else if (race.light === -1) {
|
|
1030
|
+
b.append(`${pronoun} is darkened. `);
|
|
1031
|
+
} else if (race.light < -1) {
|
|
1032
|
+
b.append(
|
|
1033
|
+
`${pronoun} shrouds ${lorePronounPossessive(msex, false)} surroundings in darkness. `,
|
|
1034
|
+
);
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
/* Susceptibilities. */
|
|
1038
|
+
let current = known(["RFT_VULN", "RFT_VULN_I"]);
|
|
1039
|
+
loreAppendClause(b, current, COLOUR_VIOLET, `${pronoun} is hurt by `, "and", "");
|
|
1040
|
+
if (!current.isEmpty()) prev = true;
|
|
1041
|
+
|
|
1042
|
+
/* Immunities and resistances (plus lack of a vulnerability). */
|
|
1043
|
+
current = known(["RFT_RES"]);
|
|
1044
|
+
{
|
|
1045
|
+
const testFlags = createMonFlagMask("RFT_VULN");
|
|
1046
|
+
for (const flag of testFlags) {
|
|
1047
|
+
if (lore.flags.has(flag) && !knownFlags.has(flag)) current.on(flag);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
loreAppendClause(
|
|
1051
|
+
b,
|
|
1052
|
+
current,
|
|
1053
|
+
COLOUR_L_UMBER,
|
|
1054
|
+
prev ? ", but resists " : `${pronoun} resists `,
|
|
1055
|
+
"and",
|
|
1056
|
+
"",
|
|
1057
|
+
);
|
|
1058
|
+
if (!current.isEmpty()) prev = true;
|
|
1059
|
+
|
|
1060
|
+
/* Known-but-average susceptibilities (resistances known to be absent). */
|
|
1061
|
+
current = new FlagSet(RF_SIZE);
|
|
1062
|
+
{
|
|
1063
|
+
const testFlags = createMonFlagMask("RFT_RES");
|
|
1064
|
+
for (const flag of testFlags) {
|
|
1065
|
+
if (lore.flags.has(flag) && !knownFlags.has(flag)) current.on(flag);
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
/* Vulnerabilities need to be specifically removed (by description match). */
|
|
1069
|
+
{
|
|
1070
|
+
const testFlags = createMonFlagMask("RFT_VULN_I");
|
|
1071
|
+
testFlags.inter(knownFlags);
|
|
1072
|
+
const susc = flagList(current);
|
|
1073
|
+
for (const flag of testFlags) {
|
|
1074
|
+
for (const suscFlag of susc) {
|
|
1075
|
+
if (describeRaceFlag(flag) === describeRaceFlag(suscFlag)) current.off(suscFlag);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
/* Special case for undead. */
|
|
1080
|
+
if (knownFlags.has(RF.UNDEAD)) current.off(RF.IM_NETHER);
|
|
1081
|
+
|
|
1082
|
+
loreAppendClause(
|
|
1083
|
+
b,
|
|
1084
|
+
current,
|
|
1085
|
+
COLOUR_L_UMBER,
|
|
1086
|
+
prev ? ", and does not resist " : `${pronoun} does not resist `,
|
|
1087
|
+
"or",
|
|
1088
|
+
"",
|
|
1089
|
+
);
|
|
1090
|
+
if (!current.isEmpty()) prev = true;
|
|
1091
|
+
|
|
1092
|
+
/* Non-effects (cannot be X'd). */
|
|
1093
|
+
current = known(["RFT_PROT"]);
|
|
1094
|
+
loreAppendClause(
|
|
1095
|
+
b,
|
|
1096
|
+
current,
|
|
1097
|
+
COLOUR_L_UMBER,
|
|
1098
|
+
prev ? ", and cannot be " : `${pronoun} cannot be `,
|
|
1099
|
+
"or",
|
|
1100
|
+
"",
|
|
1101
|
+
);
|
|
1102
|
+
if (!current.isEmpty()) prev = true;
|
|
1103
|
+
|
|
1104
|
+
if (prev) b.append(". ");
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
/** lore_append_awareness (mon-lore.c L1425). */
|
|
1108
|
+
export function loreAppendAwareness(
|
|
1109
|
+
b: LoreTextBuilder,
|
|
1110
|
+
race: MonsterRace,
|
|
1111
|
+
lore: MonsterLore,
|
|
1112
|
+
_knownFlags: FlagSet,
|
|
1113
|
+
): void {
|
|
1114
|
+
const msex = loreMonsterSex(race);
|
|
1115
|
+
|
|
1116
|
+
if (lore.sleepKnown) {
|
|
1117
|
+
const aware = loreDescribeAwareness(race.sleep);
|
|
1118
|
+
b.append(
|
|
1119
|
+
`${lorePronounNominative(msex, true)} ${aware} intruders, which ${lorePronounNominative(msex, false)} may notice from `,
|
|
1120
|
+
);
|
|
1121
|
+
b.append(`${10 * race.hearing}`, COLOUR_L_BLUE);
|
|
1122
|
+
b.append(" feet. ");
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
/** lore_append_friends (mon-lore.c L1458). */
|
|
1127
|
+
export function loreAppendFriends(
|
|
1128
|
+
b: LoreTextBuilder,
|
|
1129
|
+
race: MonsterRace,
|
|
1130
|
+
_lore: MonsterLore,
|
|
1131
|
+
knownFlags: FlagSet,
|
|
1132
|
+
): void {
|
|
1133
|
+
const msex = loreMonsterSex(race);
|
|
1134
|
+
|
|
1135
|
+
if (race.friends.length > 0 || race.friendsBase.length > 0) {
|
|
1136
|
+
b.append(`${lorePronounNominative(msex, true)} may appear with other monsters`);
|
|
1137
|
+
if (knownFlags.has(RF.GROUP_AI)) b.append(" and hunts in packs");
|
|
1138
|
+
b.append(". ");
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
/** lore_append_spells (mon-lore.c L1491). */
|
|
1143
|
+
export function loreAppendSpells(
|
|
1144
|
+
b: LoreTextBuilder,
|
|
1145
|
+
race: MonsterRace,
|
|
1146
|
+
lore: MonsterLore,
|
|
1147
|
+
knownFlags: FlagSet,
|
|
1148
|
+
deps: LoreDeps,
|
|
1149
|
+
): void {
|
|
1150
|
+
let innate = false;
|
|
1151
|
+
let breath = false;
|
|
1152
|
+
|
|
1153
|
+
const knowHp = lore.armourKnown;
|
|
1154
|
+
const msex = loreMonsterSex(race);
|
|
1155
|
+
const pronoun = lorePronounNominative(msex, true);
|
|
1156
|
+
|
|
1157
|
+
/* Innate (non-breath) attacks. */
|
|
1158
|
+
let current = createMonSpellMask(RST.INNATE);
|
|
1159
|
+
current.inter(lore.spellFlags);
|
|
1160
|
+
current.diff(createMonSpellMask(RST.BREATH));
|
|
1161
|
+
if (!current.isEmpty()) {
|
|
1162
|
+
b.append(`${pronoun} may `);
|
|
1163
|
+
loreAppendSpellClause(b, current, knowHp, race, deps, "or", "");
|
|
1164
|
+
innate = true;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
/* Breaths. */
|
|
1168
|
+
current = createMonSpellMask(RST.BREATH);
|
|
1169
|
+
current.inter(lore.spellFlags);
|
|
1170
|
+
if (!current.isEmpty()) {
|
|
1171
|
+
if (innate) b.append(", and may ");
|
|
1172
|
+
else b.append(`${pronoun} may `);
|
|
1173
|
+
b.append("breathe ", COLOUR_L_RED);
|
|
1174
|
+
loreAppendSpellClause(b, current, knowHp, race, deps, "or", "");
|
|
1175
|
+
breath = true;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
/* Frequency of innate spells / breaths. */
|
|
1179
|
+
if ((innate || breath) && race.freqInnate) {
|
|
1180
|
+
if (lore.innateFreqKnown) {
|
|
1181
|
+
b.append("; ");
|
|
1182
|
+
b.append("1", COLOUR_L_GREEN);
|
|
1183
|
+
b.append(" time in ");
|
|
1184
|
+
b.append(`${Math.trunc(100 / race.freqInnate)}`, COLOUR_L_GREEN);
|
|
1185
|
+
} else if (lore.castInnate) {
|
|
1186
|
+
const approx = Math.max(Math.trunc((race.freqInnate + 9) / 10) * 10, 1);
|
|
1187
|
+
b.append("; about ");
|
|
1188
|
+
b.append("1", COLOUR_L_GREEN);
|
|
1189
|
+
b.append(" time in ");
|
|
1190
|
+
b.append(`${Math.trunc(100 / approx)}`, COLOUR_L_GREEN);
|
|
1191
|
+
}
|
|
1192
|
+
b.append(". ");
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
/* Other (non-innate, non-breath) spells. */
|
|
1196
|
+
current = lore.spellFlags.clone();
|
|
1197
|
+
current.diff(createMonSpellMask(RST.BREATH, RST.INNATE));
|
|
1198
|
+
if (!current.isEmpty()) {
|
|
1199
|
+
b.append(`${pronoun} may `);
|
|
1200
|
+
b.append("cast spells", COLOUR_L_RED);
|
|
1201
|
+
if (knownFlags.has(RF.SMART)) b.append(" intelligently");
|
|
1202
|
+
b.append(" which ");
|
|
1203
|
+
loreAppendSpellClause(b, current, knowHp, race, deps, "or", "");
|
|
1204
|
+
|
|
1205
|
+
if (race.freqSpell) {
|
|
1206
|
+
if (lore.spellFreqKnown) {
|
|
1207
|
+
b.append("; ");
|
|
1208
|
+
b.append("1", COLOUR_L_GREEN);
|
|
1209
|
+
b.append(" time in ");
|
|
1210
|
+
b.append(`${Math.trunc(100 / race.freqSpell)}`, COLOUR_L_GREEN);
|
|
1211
|
+
} else if (lore.castSpell) {
|
|
1212
|
+
const approx = Math.max(Math.trunc((race.freqSpell + 9) / 10) * 10, 1);
|
|
1213
|
+
b.append("; about ");
|
|
1214
|
+
b.append("1", COLOUR_L_GREEN);
|
|
1215
|
+
b.append(" time in ");
|
|
1216
|
+
b.append(`${Math.trunc(100 / approx)}`, COLOUR_L_GREEN);
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
b.append(". ");
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
/** randcalc(dice, 0, AVERAGE): deterministic average (m_bonus term is 0 at level 0). */
|
|
1225
|
+
function randcalcAverage(base: number, dice: number, sides: number): number {
|
|
1226
|
+
return base + Math.trunc((dice * (sides + 1)) / 2);
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/** lore_append_attack (mon-lore.c L1621). */
|
|
1230
|
+
export function loreAppendAttack(
|
|
1231
|
+
b: LoreTextBuilder,
|
|
1232
|
+
race: MonsterRace,
|
|
1233
|
+
lore: MonsterLore,
|
|
1234
|
+
knownFlags: FlagSet,
|
|
1235
|
+
deps: LoreDeps,
|
|
1236
|
+
): void {
|
|
1237
|
+
const msex = loreMonsterSex(race);
|
|
1238
|
+
|
|
1239
|
+
/* Notice lack of attacks. */
|
|
1240
|
+
if (knownFlags.has(RF.NEVER_BLOW)) {
|
|
1241
|
+
b.append(`${lorePronounNominative(msex, true)} has no physical attacks. `);
|
|
1242
|
+
return;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
let totalAttacks = 0;
|
|
1246
|
+
let knownAttacks = 0;
|
|
1247
|
+
|
|
1248
|
+
for (let i = 0; i < race.blows.length; i++) {
|
|
1249
|
+
totalAttacks++;
|
|
1250
|
+
if (lore.blowKnown[i]) knownAttacks++;
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
if (knownAttacks === 0) {
|
|
1254
|
+
b.append(
|
|
1255
|
+
`Nothing is known about ${lorePronounPossessive(msex, false)} attack. `,
|
|
1256
|
+
COLOUR_ORANGE,
|
|
1257
|
+
);
|
|
1258
|
+
return;
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
let describedCount = 0;
|
|
1262
|
+
let totalCentidamage = 99; // round the final result up to the next point
|
|
1263
|
+
|
|
1264
|
+
for (let i = 0; i < race.blows.length; i++) {
|
|
1265
|
+
if (!lore.blowKnown[i]) continue;
|
|
1266
|
+
|
|
1267
|
+
const blow = race.blows[i]!;
|
|
1268
|
+
const rv = blow.dice
|
|
1269
|
+
? blow.dice.randomValue()
|
|
1270
|
+
: { base: 0, dice: 0, sides: 0, mBonus: 0 };
|
|
1271
|
+
const effectStr = blow.effect.desc;
|
|
1272
|
+
|
|
1273
|
+
if (describedCount === 0) {
|
|
1274
|
+
b.append(`${lorePronounNominative(msex, true)} can `);
|
|
1275
|
+
} else if (describedCount < knownAttacks - 1) {
|
|
1276
|
+
b.append(", ");
|
|
1277
|
+
} else {
|
|
1278
|
+
b.append(", and ");
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
/* Method. */
|
|
1282
|
+
b.append(blow.method.desc);
|
|
1283
|
+
|
|
1284
|
+
/* Effect (if any). */
|
|
1285
|
+
if (effectStr && effectStr.length > 0) {
|
|
1286
|
+
b.append(" to ");
|
|
1287
|
+
b.append(effectStr, blowColor(deps, blow.effect));
|
|
1288
|
+
|
|
1289
|
+
b.append(" (");
|
|
1290
|
+
/* Damage (if known). */
|
|
1291
|
+
if (rv.base || (rv.dice && rv.sides) || rv.mBonus) {
|
|
1292
|
+
if (rv.base) b.append(`${rv.base}`, COLOUR_L_GREEN);
|
|
1293
|
+
if (rv.dice && rv.sides) b.append(`${rv.dice}d${rv.sides}`, COLOUR_L_GREEN);
|
|
1294
|
+
if (rv.mBonus) b.append(`M${rv.mBonus}`, COLOUR_L_GREEN);
|
|
1295
|
+
b.append(", ");
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
/* Hit chance.
|
|
1299
|
+
* DEFERRED: hit_chance(chance_of_monster_hit_base(race, effect),
|
|
1300
|
+
* player ac+to_a) needs the player's defensive combat state; defaults to
|
|
1301
|
+
* 0 unless deps.monsterHitPercent is supplied. mon-lore.c L1710-1715. */
|
|
1302
|
+
const percent = deps.monsterHitPercent ? deps.monsterHitPercent(race, blow.effect) : 0;
|
|
1303
|
+
b.append(`${percent}`, COLOUR_L_BLUE);
|
|
1304
|
+
b.append("%)");
|
|
1305
|
+
|
|
1306
|
+
totalCentidamage += percent * randcalcAverage(rv.base, rv.dice, rv.sides);
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
describedCount++;
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
b.append(", averaging");
|
|
1313
|
+
if (knownAttacks < totalAttacks) b.append(" at least", COLOUR_ORANGE);
|
|
1314
|
+
b.append(` ${Math.trunc(totalCentidamage / 100)}`, COLOUR_L_GREEN);
|
|
1315
|
+
b.append(` damage on each of ${lorePronounPossessive(msex, false)} turns. `);
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
/* ------------------------------------------------------------------ *
|
|
1319
|
+
* Top-level assembly (ui-mon-lore.c lore_description, non-spoiler path).
|
|
1320
|
+
* ------------------------------------------------------------------ */
|
|
1321
|
+
|
|
1322
|
+
/**
|
|
1323
|
+
* lore_is_fully_known body (mon-lore.c L441), read against the supplied lore
|
|
1324
|
+
* without the store lookup or the mutating side effects.
|
|
1325
|
+
*/
|
|
1326
|
+
function isFullyKnown(race: MonsterRace, lore: MonsterLore): boolean {
|
|
1327
|
+
if (lore.allKnown) return true;
|
|
1328
|
+
if (!lore.armourKnown) return false;
|
|
1329
|
+
if (!lore.spellFreqKnown && race.freqInnate + race.freqSpell) return false;
|
|
1330
|
+
if (!lore.dropKnown) return false;
|
|
1331
|
+
if (!lore.sleepKnown) return false;
|
|
1332
|
+
for (let i = 0; i < race.blows.length; i++) {
|
|
1333
|
+
if (!lore.blowKnown[i]) return false;
|
|
1334
|
+
}
|
|
1335
|
+
for (let i = 0; i < RF_SIZE; i++) {
|
|
1336
|
+
if (!lore.flags.bits[i]) return false;
|
|
1337
|
+
}
|
|
1338
|
+
for (let i = 0; i < RSF_SIZE; i++) {
|
|
1339
|
+
if (lore.spellFlags.bits[i] !== race.spellFlags.bits[i]) return false;
|
|
1340
|
+
}
|
|
1341
|
+
return true;
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
/**
|
|
1345
|
+
* lore_title (ui-mon-lore.c L38), reduced to what the headless model can
|
|
1346
|
+
* express: "The " for non-uniques, the name, and the primary glyph.
|
|
1347
|
+
*
|
|
1348
|
+
* DEFERRED: the optional secondary glyph (monster_x_char / monster_x_attr,
|
|
1349
|
+
* ui-mon-lore.c L47/L51), OPT(purple_uniques) recoloring (L56), and tile
|
|
1350
|
+
* width/height gating (L69) are all presentation state not modelled here.
|
|
1351
|
+
*/
|
|
1352
|
+
function loreTitle(b: LoreTextBuilder, race: MonsterRace): void {
|
|
1353
|
+
if (!race.flags.has(RF.UNIQUE)) b.append("The ");
|
|
1354
|
+
b.append(race.name);
|
|
1355
|
+
b.append(" ('");
|
|
1356
|
+
b.append(race.dChar, race.dAttr);
|
|
1357
|
+
b.append("')");
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
/**
|
|
1361
|
+
* lore_description (ui-mon-lore.c L89), non-spoiler path: assemble the full
|
|
1362
|
+
* recall for what the player knows. Returns the finished flat run list.
|
|
1363
|
+
*
|
|
1364
|
+
* The order of sections is transcribed from ui-mon-lore.c L110-150:
|
|
1365
|
+
* title, kills, flavor, movement, toughness, exp, drop, abilities,
|
|
1366
|
+
* awareness, friends, spells, attack, fully-known note, questor note.
|
|
1367
|
+
*/
|
|
1368
|
+
export function loreDescription(
|
|
1369
|
+
race: MonsterRace,
|
|
1370
|
+
lore: MonsterLore,
|
|
1371
|
+
deps: LoreDeps,
|
|
1372
|
+
): LoreText {
|
|
1373
|
+
const b = new LoreTextBuilder();
|
|
1374
|
+
const knownFlags = monsterFlagsKnown(race, lore);
|
|
1375
|
+
|
|
1376
|
+
/* Title (only in the non-spoiler player view). */
|
|
1377
|
+
loreTitle(b, race);
|
|
1378
|
+
b.append("\n");
|
|
1379
|
+
|
|
1380
|
+
/* Kills of monster vs. player(s). */
|
|
1381
|
+
loreAppendKills(b, race, lore, knownFlags);
|
|
1382
|
+
|
|
1383
|
+
loreAppendFlavor(b, race);
|
|
1384
|
+
|
|
1385
|
+
/* Type, location, speed. */
|
|
1386
|
+
loreAppendMovement(b, race, lore, knownFlags, deps);
|
|
1387
|
+
|
|
1388
|
+
/* Life and armor, and player's hit chance. */
|
|
1389
|
+
loreAppendToughness(b, race, lore, knownFlags, deps);
|
|
1390
|
+
|
|
1391
|
+
/* Experience reward. */
|
|
1392
|
+
loreAppendExp(b, race, lore, knownFlags, deps);
|
|
1393
|
+
|
|
1394
|
+
loreAppendDrop(b, race, lore, knownFlags);
|
|
1395
|
+
|
|
1396
|
+
/* Special properties. */
|
|
1397
|
+
loreAppendAbilities(b, race, lore, knownFlags);
|
|
1398
|
+
loreAppendAwareness(b, race, lore, knownFlags);
|
|
1399
|
+
loreAppendFriends(b, race, lore, knownFlags);
|
|
1400
|
+
|
|
1401
|
+
/* Spells, spell-like abilities and melee attacks. */
|
|
1402
|
+
loreAppendSpells(b, race, lore, knownFlags, deps);
|
|
1403
|
+
loreAppendAttack(b, race, lore, knownFlags, deps);
|
|
1404
|
+
|
|
1405
|
+
if (isFullyKnown(race, lore))
|
|
1406
|
+
b.append("You know everything about this monster.");
|
|
1407
|
+
|
|
1408
|
+
if (race.flags.has(RF.QUESTOR))
|
|
1409
|
+
b.append("You feel an intense desire to kill this monster... ");
|
|
1410
|
+
|
|
1411
|
+
b.append("\n");
|
|
1412
|
+
|
|
1413
|
+
return b.build();
|
|
1414
|
+
}
|