@rpgm-tools/neo-angband-core 0.18.0 → 0.19.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/README.md +1 -1
- package/dist/agent/perceive.d.ts.map +1 -1
- package/dist/agent/perceive.js +2 -2
- package/dist/agent/perceive.js.map +1 -1
- package/dist/combat/blow-vectors.d.ts +78 -0
- package/dist/combat/blow-vectors.d.ts.map +1 -0
- package/dist/combat/blow-vectors.fixtures.d.ts +19 -0
- package/dist/combat/blow-vectors.fixtures.d.ts.map +1 -0
- package/dist/combat/blow-vectors.fixtures.js +81 -0
- package/dist/combat/blow-vectors.fixtures.js.map +1 -0
- package/dist/combat/blow-vectors.js +195 -0
- package/dist/combat/blow-vectors.js.map +1 -0
- package/dist/combat/brand-slay.d.ts +22 -9
- package/dist/combat/brand-slay.d.ts.map +1 -1
- package/dist/combat/brand-slay.js +37 -10
- package/dist/combat/brand-slay.js.map +1 -1
- package/dist/combat/index.d.ts +1 -1
- package/dist/combat/index.js +1 -1
- package/dist/combat/melee.d.ts +25 -13
- package/dist/combat/melee.d.ts.map +1 -1
- package/dist/combat/melee.js +23 -19
- package/dist/combat/melee.js.map +1 -1
- package/dist/combat/mon-melee.d.ts +166 -7
- package/dist/combat/mon-melee.d.ts.map +1 -1
- package/dist/combat/mon-melee.js +469 -338
- package/dist/combat/mon-melee.js.map +1 -1
- package/dist/combat/ranged.d.ts +15 -13
- package/dist/combat/ranged.d.ts.map +1 -1
- package/dist/combat/ranged.js +31 -29
- package/dist/combat/ranged.js.map +1 -1
- package/dist/constants.d.ts +14 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +14 -0
- package/dist/constants.js.map +1 -1
- package/dist/datafile.d.ts +48 -0
- package/dist/datafile.d.ts.map +1 -0
- package/dist/datafile.js +102 -0
- package/dist/datafile.js.map +1 -0
- package/dist/effects/effect-info-registry.d.ts +237 -0
- package/dist/effects/effect-info-registry.d.ts.map +1 -0
- package/dist/effects/effect-info-registry.js +138 -0
- package/dist/effects/effect-info-registry.js.map +1 -0
- package/dist/effects/effect-info-vectors.d.ts +92 -0
- package/dist/effects/effect-info-vectors.d.ts.map +1 -0
- package/dist/effects/effect-info-vectors.fixtures.d.ts +18 -0
- package/dist/effects/effect-info-vectors.fixtures.d.ts.map +1 -0
- package/dist/effects/effect-info-vectors.fixtures.js +51 -0
- package/dist/effects/effect-info-vectors.fixtures.js.map +1 -0
- package/dist/effects/effect-info-vectors.js +315 -0
- package/dist/effects/effect-info-vectors.js.map +1 -0
- package/dist/effects/effect-info.d.ts +5 -1
- package/dist/effects/effect-info.d.ts.map +1 -1
- package/dist/effects/effect-info.js +245 -143
- package/dist/effects/effect-info.js.map +1 -1
- package/dist/effects/effect.d.ts +4 -3
- package/dist/effects/effect.d.ts.map +1 -1
- package/dist/effects/effect.js +88 -70
- package/dist/effects/effect.js.map +1 -1
- package/dist/effects/handlers.d.ts +1 -1
- package/dist/effects/handlers.d.ts.map +1 -1
- package/dist/effects/handlers.js +5 -2
- package/dist/effects/handlers.js.map +1 -1
- package/dist/effects/interpreter.d.ts +11 -0
- package/dist/effects/interpreter.d.ts.map +1 -1
- package/dist/effects/interpreter.js +13 -0
- package/dist/effects/interpreter.js.map +1 -1
- package/dist/game/cave-cmd.d.ts +9 -5
- package/dist/game/cave-cmd.d.ts.map +1 -1
- package/dist/game/cave-cmd.js +56 -11
- package/dist/game/cave-cmd.js.map +1 -1
- package/dist/game/cave-square.d.ts +42 -0
- package/dist/game/cave-square.d.ts.map +1 -0
- package/dist/game/cave-square.js +73 -0
- package/dist/game/cave-square.js.map +1 -0
- package/dist/game/char-sheet.d.ts +12 -8
- package/dist/game/char-sheet.d.ts.map +1 -1
- package/dist/game/char-sheet.js +41 -8
- package/dist/game/char-sheet.js.map +1 -1
- package/dist/game/chest.d.ts +2 -3
- package/dist/game/chest.d.ts.map +1 -1
- package/dist/game/chest.js +17 -6
- package/dist/game/chest.js.map +1 -1
- package/dist/game/context.d.ts +213 -22
- package/dist/game/context.d.ts.map +1 -1
- package/dist/game/context.js +109 -17
- package/dist/game/context.js.map +1 -1
- package/dist/game/describe.d.ts +13 -0
- package/dist/game/describe.d.ts.map +1 -1
- package/dist/game/describe.js +32 -4
- package/dist/game/describe.js.map +1 -1
- package/dist/game/display.d.ts +97 -8
- package/dist/game/display.d.ts.map +1 -1
- package/dist/game/display.js +157 -13
- package/dist/game/display.js.map +1 -1
- package/dist/game/dump-level.d.ts.map +1 -1
- package/dist/game/dump-level.js +3 -2
- package/dist/game/dump-level.js.map +1 -1
- package/dist/game/effect-attack.d.ts.map +1 -1
- package/dist/game/effect-attack.js +36 -27
- package/dist/game/effect-attack.js.map +1 -1
- package/dist/game/effect-detect.d.ts +4 -4
- package/dist/game/effect-detect.d.ts.map +1 -1
- package/dist/game/effect-detect.js +42 -9
- package/dist/game/effect-detect.js.map +1 -1
- package/dist/game/effect-env.d.ts +7 -1
- package/dist/game/effect-env.d.ts.map +1 -1
- package/dist/game/effect-env.js +1 -0
- package/dist/game/effect-env.js.map +1 -1
- package/dist/game/effect-general.d.ts +5 -3
- package/dist/game/effect-general.d.ts.map +1 -1
- package/dist/game/effect-general.js +94 -43
- package/dist/game/effect-general.js.map +1 -1
- package/dist/game/effect-item.d.ts +2 -1
- package/dist/game/effect-item.d.ts.map +1 -1
- package/dist/game/effect-item.js +136 -82
- package/dist/game/effect-item.js.map +1 -1
- package/dist/game/effect-melee.d.ts +10 -4
- package/dist/game/effect-melee.d.ts.map +1 -1
- package/dist/game/effect-melee.js +44 -19
- package/dist/game/effect-melee.js.map +1 -1
- package/dist/game/effect-monster.d.ts +26 -4
- package/dist/game/effect-monster.d.ts.map +1 -1
- package/dist/game/effect-monster.js +52 -9
- package/dist/game/effect-monster.js.map +1 -1
- package/dist/game/effect-teleport.d.ts +58 -19
- package/dist/game/effect-teleport.d.ts.map +1 -1
- package/dist/game/effect-teleport.js +143 -27
- package/dist/game/effect-teleport.js.map +1 -1
- package/dist/game/effect-terrain.d.ts +1 -3
- package/dist/game/effect-terrain.d.ts.map +1 -1
- package/dist/game/effect-terrain.js +38 -22
- package/dist/game/effect-terrain.js.map +1 -1
- package/dist/game/equip-cmp.d.ts.map +1 -1
- package/dist/game/equip-cmp.js +10 -7
- package/dist/game/equip-cmp.js.map +1 -1
- package/dist/game/floor.d.ts +16 -4
- package/dist/game/floor.d.ts.map +1 -1
- package/dist/game/floor.js +22 -4
- package/dist/game/floor.js.map +1 -1
- package/dist/game/gear.d.ts +101 -13
- package/dist/game/gear.d.ts.map +1 -1
- package/dist/game/gear.js +183 -24
- package/dist/game/gear.js.map +1 -1
- package/dist/game/harness.d.ts +2 -1
- package/dist/game/harness.d.ts.map +1 -1
- package/dist/game/harness.js +12 -1
- package/dist/game/harness.js.map +1 -1
- package/dist/game/ignore-cmd.d.ts +47 -8
- package/dist/game/ignore-cmd.d.ts.map +1 -1
- package/dist/game/ignore-cmd.js +76 -8
- package/dist/game/ignore-cmd.js.map +1 -1
- package/dist/game/known.d.ts +223 -34
- package/dist/game/known.d.ts.map +1 -1
- package/dist/game/known.js +301 -67
- package/dist/game/known.js.map +1 -1
- package/dist/game/loop.d.ts +4 -3
- package/dist/game/loop.d.ts.map +1 -1
- package/dist/game/loop.js +49 -29
- package/dist/game/loop.js.map +1 -1
- package/dist/game/lore-color.d.ts.map +1 -1
- package/dist/game/lore-color.js +13 -1
- package/dist/game/lore-color.js.map +1 -1
- package/dist/game/mon-cast.d.ts +3 -4
- package/dist/game/mon-cast.d.ts.map +1 -1
- package/dist/game/mon-cast.js +30 -2
- package/dist/game/mon-cast.js.map +1 -1
- package/dist/game/mon-cmd.d.ts +4 -5
- package/dist/game/mon-cmd.d.ts.map +1 -1
- package/dist/game/mon-cmd.js +80 -27
- package/dist/game/mon-cmd.js.map +1 -1
- package/dist/game/mon-death.d.ts +8 -4
- package/dist/game/mon-death.d.ts.map +1 -1
- package/dist/game/mon-death.js +6 -9
- package/dist/game/mon-death.js.map +1 -1
- package/dist/game/mon-group.d.ts +9 -5
- package/dist/game/mon-group.d.ts.map +1 -1
- package/dist/game/mon-group.js +9 -5
- package/dist/game/mon-group.js.map +1 -1
- package/dist/game/mon-message.d.ts +90 -40
- package/dist/game/mon-message.d.ts.map +1 -1
- package/dist/game/mon-message.js +267 -59
- package/dist/game/mon-message.js.map +1 -1
- package/dist/game/mon-place.d.ts +11 -1
- package/dist/game/mon-place.d.ts.map +1 -1
- package/dist/game/mon-place.js +15 -3
- package/dist/game/mon-place.js.map +1 -1
- package/dist/game/mon-ranged.d.ts +2 -1
- package/dist/game/mon-ranged.d.ts.map +1 -1
- package/dist/game/mon-ranged.js +11 -5
- package/dist/game/mon-ranged.js.map +1 -1
- package/dist/game/mon-side.d.ts +3 -2
- package/dist/game/mon-side.d.ts.map +1 -1
- package/dist/game/mon-side.js +15 -14
- package/dist/game/mon-side.js.map +1 -1
- package/dist/game/monster-turn.d.ts +20 -10
- package/dist/game/monster-turn.d.ts.map +1 -1
- package/dist/game/monster-turn.js +110 -83
- package/dist/game/monster-turn.js.map +1 -1
- package/dist/game/notice.d.ts +36 -0
- package/dist/game/notice.d.ts.map +1 -0
- package/dist/game/notice.js +79 -0
- package/dist/game/notice.js.map +1 -0
- package/dist/game/obj-cmd.d.ts +14 -3
- package/dist/game/obj-cmd.d.ts.map +1 -1
- package/dist/game/obj-cmd.js +109 -35
- package/dist/game/obj-cmd.js.map +1 -1
- package/dist/game/obj-list.d.ts +13 -2
- package/dist/game/obj-list.d.ts.map +1 -1
- package/dist/game/obj-list.js +42 -27
- package/dist/game/obj-list.js.map +1 -1
- package/dist/game/object-inspect.d.ts +9 -0
- package/dist/game/object-inspect.d.ts.map +1 -1
- package/dist/game/object-inspect.js +4 -0
- package/dist/game/object-inspect.js.map +1 -1
- package/dist/game/pickup.d.ts +0 -2
- package/dist/game/pickup.d.ts.map +1 -1
- package/dist/game/pickup.js +18 -3
- package/dist/game/pickup.js.map +1 -1
- package/dist/game/player-side-vectors.d.ts +174 -0
- package/dist/game/player-side-vectors.d.ts.map +1 -0
- package/dist/game/player-side-vectors.fixtures.d.ts +33 -0
- package/dist/game/player-side-vectors.fixtures.d.ts.map +1 -0
- package/dist/game/player-side-vectors.fixtures.js +191 -0
- package/dist/game/player-side-vectors.fixtures.js.map +1 -0
- package/dist/game/player-side-vectors.js +292 -0
- package/dist/game/player-side-vectors.js.map +1 -0
- package/dist/game/player-side.d.ts +129 -1
- package/dist/game/player-side.d.ts.map +1 -1
- package/dist/game/player-side.js +520 -338
- package/dist/game/player-side.js.map +1 -1
- package/dist/game/player-turn.d.ts +26 -7
- package/dist/game/player-turn.d.ts.map +1 -1
- package/dist/game/player-turn.js +180 -33
- package/dist/game/player-turn.js.map +1 -1
- package/dist/game/poly.d.ts +38 -0
- package/dist/game/poly.d.ts.map +1 -0
- package/dist/game/poly.js +82 -0
- package/dist/game/poly.js.map +1 -0
- package/dist/game/project-cast.d.ts +20 -3
- package/dist/game/project-cast.d.ts.map +1 -1
- package/dist/game/project-cast.js +49 -6
- package/dist/game/project-cast.js.map +1 -1
- package/dist/game/project-feat-vectors.d.ts +124 -0
- package/dist/game/project-feat-vectors.d.ts.map +1 -0
- package/dist/game/project-feat-vectors.fixtures.d.ts +13 -0
- package/dist/game/project-feat-vectors.fixtures.d.ts.map +1 -0
- package/dist/game/project-feat-vectors.fixtures.js +94 -0
- package/dist/game/project-feat-vectors.fixtures.js.map +1 -0
- package/dist/game/project-feat-vectors.js +229 -0
- package/dist/game/project-feat-vectors.js.map +1 -0
- package/dist/game/project-feat.d.ts +53 -1
- package/dist/game/project-feat.d.ts.map +1 -1
- package/dist/game/project-feat.js +374 -247
- package/dist/game/project-feat.js.map +1 -1
- package/dist/game/project-monster.d.ts +21 -8
- package/dist/game/project-monster.d.ts.map +1 -1
- package/dist/game/project-monster.js +45 -21
- package/dist/game/project-monster.js.map +1 -1
- package/dist/game/project-obj.d.ts +62 -0
- package/dist/game/project-obj.d.ts.map +1 -1
- package/dist/game/project-obj.js +72 -41
- package/dist/game/project-obj.js.map +1 -1
- package/dist/game/project-player.d.ts +8 -0
- package/dist/game/project-player.d.ts.map +1 -1
- package/dist/game/project-player.js.map +1 -1
- package/dist/game/projection-handlers.d.ts +81 -0
- package/dist/game/projection-handlers.d.ts.map +1 -0
- package/dist/game/projection-handlers.js +93 -0
- package/dist/game/projection-handlers.js.map +1 -0
- package/dist/game/quest.d.ts +23 -0
- package/dist/game/quest.d.ts.map +1 -1
- package/dist/game/quest.js +42 -0
- package/dist/game/quest.js.map +1 -1
- package/dist/game/ranged-cmd.d.ts +13 -2
- package/dist/game/ranged-cmd.d.ts.map +1 -1
- package/dist/game/ranged-cmd.js +32 -15
- package/dist/game/ranged-cmd.js.map +1 -1
- package/dist/game/repeat.d.ts +78 -0
- package/dist/game/repeat.d.ts.map +1 -0
- package/dist/game/repeat.js +88 -0
- package/dist/game/repeat.js.map +1 -0
- package/dist/game/shape-inspect.d.ts +74 -0
- package/dist/game/shape-inspect.d.ts.map +1 -0
- package/dist/game/shape-inspect.js +114 -0
- package/dist/game/shape-inspect.js.map +1 -0
- package/dist/game/spell-cmd.d.ts +15 -4
- package/dist/game/spell-cmd.d.ts.map +1 -1
- package/dist/game/spell-cmd.js +35 -6
- package/dist/game/spell-cmd.js.map +1 -1
- package/dist/game/spoil.d.ts.map +1 -1
- package/dist/game/spoil.js +89 -40
- package/dist/game/spoil.js.map +1 -1
- package/dist/game/steal.d.ts +3 -3
- package/dist/game/steal.d.ts.map +1 -1
- package/dist/game/steal.js +9 -4
- package/dist/game/steal.js.map +1 -1
- package/dist/game/target-loop.d.ts +10 -4
- package/dist/game/target-loop.d.ts.map +1 -1
- package/dist/game/target-loop.js +14 -8
- package/dist/game/target-loop.js.map +1 -1
- package/dist/game/target.d.ts +4 -4
- package/dist/game/target.d.ts.map +1 -1
- package/dist/game/target.js +19 -8
- package/dist/game/target.js.map +1 -1
- package/dist/game/ui-entry.d.ts +63 -4
- package/dist/game/ui-entry.d.ts.map +1 -1
- package/dist/game/ui-entry.js +151 -23
- package/dist/game/ui-entry.js.map +1 -1
- package/dist/game/wizard.d.ts +23 -5
- package/dist/game/wizard.d.ts.map +1 -1
- package/dist/game/wizard.js +93 -11
- package/dist/game/wizard.js.map +1 -1
- package/dist/game/world.d.ts.map +1 -1
- package/dist/game/world.js +6 -0
- package/dist/game/world.js.map +1 -1
- package/dist/gen/cave.d.ts +49 -8
- package/dist/gen/cave.d.ts.map +1 -1
- package/dist/gen/cave.js +200 -28
- package/dist/gen/cave.js.map +1 -1
- package/dist/gen/generate.d.ts +54 -9
- package/dist/gen/generate.d.ts.map +1 -1
- package/dist/gen/generate.js +55 -8
- package/dist/gen/generate.js.map +1 -1
- package/dist/gen/glyph-vectors.d.ts +109 -0
- package/dist/gen/glyph-vectors.d.ts.map +1 -0
- package/dist/gen/glyph-vectors.fixtures.d.ts +18 -0
- package/dist/gen/glyph-vectors.fixtures.d.ts.map +1 -0
- package/dist/gen/glyph-vectors.fixtures.js +94 -0
- package/dist/gen/glyph-vectors.fixtures.js.map +1 -0
- package/dist/gen/glyph-vectors.js +218 -0
- package/dist/gen/glyph-vectors.js.map +1 -0
- package/dist/gen/glyph.d.ts +104 -0
- package/dist/gen/glyph.d.ts.map +1 -0
- package/dist/gen/glyph.js +72 -0
- package/dist/gen/glyph.js.map +1 -0
- package/dist/gen/room.d.ts +26 -2
- package/dist/gen/room.d.ts.map +1 -1
- package/dist/gen/room.js +414 -264
- package/dist/gen/room.js.map +1 -1
- package/dist/gen/util.d.ts +11 -2
- package/dist/gen/util.d.ts.map +1 -1
- package/dist/gen/util.js +31 -9
- package/dist/gen/util.js.map +1 -1
- package/dist/i18n/i18n.d.ts +207 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/i18n.js +405 -0
- package/dist/i18n/i18n.js.map +1 -0
- package/dist/i18n/text.d.ts +62 -0
- package/dist/i18n/text.d.ts.map +1 -0
- package/dist/i18n/text.js +120 -0
- package/dist/i18n/text.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -1
- package/dist/mod/extension.d.ts +115 -0
- package/dist/mod/extension.d.ts.map +1 -0
- package/dist/mod/extension.js +85 -0
- package/dist/mod/extension.js.map +1 -0
- package/dist/mod/ids.d.ts +10 -0
- package/dist/mod/ids.d.ts.map +1 -1
- package/dist/mod/ids.js +90 -21
- package/dist/mod/ids.js.map +1 -1
- package/dist/mod/record-keys.d.ts +43 -0
- package/dist/mod/record-keys.d.ts.map +1 -0
- package/dist/mod/record-keys.js +100 -0
- package/dist/mod/record-keys.js.map +1 -0
- package/dist/mod/registry-host.d.ts +472 -0
- package/dist/mod/registry-host.d.ts.map +1 -1
- package/dist/mod/registry-host.js +313 -0
- package/dist/mod/registry-host.js.map +1 -1
- package/dist/mod/save-blocks.d.ts +1 -1
- package/dist/mon/bind.d.ts.map +1 -1
- package/dist/mon/bind.js +6 -3
- package/dist/mon/bind.js.map +1 -1
- package/dist/mon/knowledge-groups.d.ts +0 -6
- package/dist/mon/knowledge-groups.d.ts.map +1 -1
- package/dist/mon/knowledge-groups.js +12 -8
- package/dist/mon/knowledge-groups.js.map +1 -1
- package/dist/mon/lore-describe.d.ts +46 -10
- package/dist/mon/lore-describe.d.ts.map +1 -1
- package/dist/mon/lore-describe.js +74 -22
- package/dist/mon/lore-describe.js.map +1 -1
- package/dist/mon/lore-file.d.ts +126 -0
- package/dist/mon/lore-file.d.ts.map +1 -0
- package/dist/mon/lore-file.js +291 -0
- package/dist/mon/lore-file.js.map +1 -0
- package/dist/mon/lore.d.ts +9 -3
- package/dist/mon/lore.d.ts.map +1 -1
- package/dist/mon/lore.js +9 -3
- package/dist/mon/lore.js.map +1 -1
- package/dist/mon/make.d.ts +4 -2
- package/dist/mon/make.d.ts.map +1 -1
- package/dist/mon/make.js +4 -2
- package/dist/mon/make.js.map +1 -1
- package/dist/mon/monster.d.ts +1 -1
- package/dist/mon/monster.js +1 -1
- package/dist/mon/predicate.d.ts +14 -9
- package/dist/mon/predicate.d.ts.map +1 -1
- package/dist/mon/predicate.js +14 -9
- package/dist/mon/predicate.js.map +1 -1
- package/dist/mon/project-mon.d.ts +16 -3
- package/dist/mon/project-mon.d.ts.map +1 -1
- package/dist/mon/project-mon.js +14 -5
- package/dist/mon/project-mon.js.map +1 -1
- package/dist/mon/steal.d.ts +31 -4
- package/dist/mon/steal.d.ts.map +1 -1
- package/dist/mon/steal.js +20 -7
- package/dist/mon/steal.js.map +1 -1
- package/dist/mon/take-hit.d.ts +8 -3
- package/dist/mon/take-hit.d.ts.map +1 -1
- package/dist/mon/take-hit.js +8 -3
- package/dist/mon/take-hit.js.map +1 -1
- package/dist/mon/timed.d.ts +15 -9
- package/dist/mon/timed.d.ts.map +1 -1
- package/dist/mon/timed.js +13 -8
- package/dist/mon/timed.js.map +1 -1
- package/dist/mon/types.d.ts +11 -4
- package/dist/mon/types.d.ts.map +1 -1
- package/dist/mon/types.js.map +1 -1
- package/dist/msg.d.ts +40 -1
- package/dist/msg.d.ts.map +1 -1
- package/dist/msg.js +42 -1
- package/dist/msg.js.map +1 -1
- package/dist/obj/artifact-fake.d.ts +46 -14
- package/dist/obj/artifact-fake.d.ts.map +1 -1
- package/dist/obj/artifact-fake.js +46 -17
- package/dist/obj/artifact-fake.js.map +1 -1
- package/dist/obj/bind.d.ts +23 -0
- package/dist/obj/bind.d.ts.map +1 -1
- package/dist/obj/bind.js +49 -9
- package/dist/obj/bind.js.map +1 -1
- package/dist/obj/desc-vectors.d.ts +68 -0
- package/dist/obj/desc-vectors.d.ts.map +1 -0
- package/dist/obj/desc-vectors.fixtures.d.ts +12 -0
- package/dist/obj/desc-vectors.fixtures.d.ts.map +1 -0
- package/dist/obj/desc-vectors.fixtures.js +95 -0
- package/dist/obj/desc-vectors.fixtures.js.map +1 -0
- package/dist/obj/desc-vectors.js +86 -0
- package/dist/obj/desc-vectors.js.map +1 -0
- package/dist/obj/desc.d.ts +17 -2
- package/dist/obj/desc.d.ts.map +1 -1
- package/dist/obj/desc.js +129 -54
- package/dist/obj/desc.js.map +1 -1
- package/dist/obj/effects-info.d.ts.map +1 -1
- package/dist/obj/effects-info.js +87 -58
- package/dist/obj/effects-info.js.map +1 -1
- package/dist/obj/fake-object.d.ts +70 -0
- package/dist/obj/fake-object.d.ts.map +1 -0
- package/dist/obj/fake-object.js +104 -0
- package/dist/obj/fake-object.js.map +1 -0
- package/dist/obj/ignore.d.ts +55 -12
- package/dist/obj/ignore.d.ts.map +1 -1
- package/dist/obj/ignore.js +68 -31
- package/dist/obj/ignore.js.map +1 -1
- package/dist/obj/knowledge.d.ts +46 -3
- package/dist/obj/knowledge.d.ts.map +1 -1
- package/dist/obj/knowledge.js +169 -151
- package/dist/obj/knowledge.js.map +1 -1
- package/dist/obj/known-object.d.ts +68 -8
- package/dist/obj/known-object.d.ts.map +1 -1
- package/dist/obj/known-object.js +90 -10
- package/dist/obj/known-object.js.map +1 -1
- package/dist/obj/make.d.ts +15 -4
- package/dist/obj/make.d.ts.map +1 -1
- package/dist/obj/make.js +49 -27
- package/dist/obj/make.js.map +1 -1
- package/dist/obj/object-info.d.ts +10 -0
- package/dist/obj/object-info.d.ts.map +1 -1
- package/dist/obj/object-info.js +93 -7
- package/dist/obj/object-info.js.map +1 -1
- package/dist/obj/object.d.ts +42 -4
- package/dist/obj/object.d.ts.map +1 -1
- package/dist/obj/object.js +362 -147
- package/dist/obj/object.js.map +1 -1
- package/dist/obj/power.d.ts +23 -4
- package/dist/obj/power.d.ts.map +1 -1
- package/dist/obj/power.js +231 -65
- package/dist/obj/power.js.map +1 -1
- package/dist/obj/randart-build.d.ts +27 -22
- package/dist/obj/randart-build.d.ts.map +1 -1
- package/dist/obj/randart-build.js +435 -357
- package/dist/obj/randart-build.js.map +1 -1
- package/dist/obj/randart-data.d.ts +62 -24
- package/dist/obj/randart-data.d.ts.map +1 -1
- package/dist/obj/randart-data.js +333 -189
- package/dist/obj/randart-data.js.map +1 -1
- package/dist/obj/randart-file.d.ts +21 -0
- package/dist/obj/randart-file.d.ts.map +1 -0
- package/dist/obj/randart-file.js +119 -0
- package/dist/obj/randart-file.js.map +1 -0
- package/dist/obj/randart-log.d.ts +63 -0
- package/dist/obj/randart-log.d.ts.map +1 -0
- package/dist/obj/randart-log.js +72 -0
- package/dist/obj/randart-log.js.map +1 -0
- package/dist/obj/randart-registry.d.ts +178 -0
- package/dist/obj/randart-registry.d.ts.map +1 -0
- package/dist/obj/randart-registry.js +140 -0
- package/dist/obj/randart-registry.js.map +1 -0
- package/dist/obj/randart-vectors.d.ts +97 -0
- package/dist/obj/randart-vectors.d.ts.map +1 -0
- package/dist/obj/randart-vectors.fixtures.d.ts +18 -0
- package/dist/obj/randart-vectors.fixtures.d.ts.map +1 -0
- package/dist/obj/randart-vectors.fixtures.js +50 -0
- package/dist/obj/randart-vectors.fixtures.js.map +1 -0
- package/dist/obj/randart-vectors.js +311 -0
- package/dist/obj/randart-vectors.js.map +1 -0
- package/dist/obj/randart.d.ts +53 -15
- package/dist/obj/randart.d.ts.map +1 -1
- package/dist/obj/randart.js +166 -44
- package/dist/obj/randart.js.map +1 -1
- package/dist/obj/rune-registry.d.ts +180 -0
- package/dist/obj/rune-registry.d.ts.map +1 -0
- package/dist/obj/rune-registry.js +161 -0
- package/dist/obj/rune-registry.js.map +1 -0
- package/dist/obj/rune-vectors.d.ts +99 -0
- package/dist/obj/rune-vectors.d.ts.map +1 -0
- package/dist/obj/rune-vectors.fixtures.d.ts +44 -0
- package/dist/obj/rune-vectors.fixtures.d.ts.map +1 -0
- package/dist/obj/rune-vectors.fixtures.js +125 -0
- package/dist/obj/rune-vectors.fixtures.js.map +1 -0
- package/dist/obj/rune-vectors.js +159 -0
- package/dist/obj/rune-vectors.js.map +1 -0
- package/dist/obj/tval-registry.d.ts +174 -0
- package/dist/obj/tval-registry.d.ts.map +1 -0
- package/dist/obj/tval-registry.js +151 -0
- package/dist/obj/tval-registry.js.map +1 -0
- package/dist/obj/tval-vectors.d.ts +85 -0
- package/dist/obj/tval-vectors.d.ts.map +1 -0
- package/dist/obj/tval-vectors.fixtures.d.ts +24 -0
- package/dist/obj/tval-vectors.fixtures.d.ts.map +1 -0
- package/dist/obj/tval-vectors.fixtures.js +41 -0
- package/dist/obj/tval-vectors.fixtures.js.map +1 -0
- package/dist/obj/tval-vectors.js +76 -0
- package/dist/obj/tval-vectors.js.map +1 -0
- package/dist/obj/types.d.ts +18 -7
- package/dist/obj/types.d.ts.map +1 -1
- package/dist/obj/types.js.map +1 -1
- package/dist/obj/value.d.ts.map +1 -1
- package/dist/obj/value.js +23 -20
- package/dist/obj/value.js.map +1 -1
- package/dist/parser.d.ts +116 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +205 -0
- package/dist/parser.js.map +1 -0
- package/dist/player/bind.d.ts.map +1 -1
- package/dist/player/bind.js +3 -2
- package/dist/player/bind.js.map +1 -1
- package/dist/player/birth.d.ts +2 -1
- package/dist/player/birth.d.ts.map +1 -1
- package/dist/player/birth.js +2 -1
- package/dist/player/birth.js.map +1 -1
- package/dist/player/calcs.d.ts +58 -23
- package/dist/player/calcs.d.ts.map +1 -1
- package/dist/player/calcs.js +93 -36
- package/dist/player/calcs.js.map +1 -1
- package/dist/player/death.d.ts +50 -0
- package/dist/player/death.d.ts.map +1 -0
- package/dist/player/death.js +46 -0
- package/dist/player/death.js.map +1 -0
- package/dist/player/options-file.d.ts +129 -0
- package/dist/player/options-file.d.ts.map +1 -0
- package/dist/player/options-file.js +309 -0
- package/dist/player/options-file.js.map +1 -0
- package/dist/player/options.d.ts +2 -1
- package/dist/player/options.d.ts.map +1 -1
- package/dist/player/options.js +2 -1
- package/dist/player/options.js.map +1 -1
- package/dist/player/player.d.ts +50 -3
- package/dist/player/player.d.ts.map +1 -1
- package/dist/player/player.js +10 -1
- package/dist/player/player.js.map +1 -1
- package/dist/player/shape-lore.d.ts +11 -7
- package/dist/player/shape-lore.d.ts.map +1 -1
- package/dist/player/shape-lore.js +24 -11
- package/dist/player/shape-lore.js.map +1 -1
- package/dist/player/timed.d.ts +5 -3
- package/dist/player/timed.d.ts.map +1 -1
- package/dist/player/timed.js +11 -2
- package/dist/player/timed.js.map +1 -1
- package/dist/player/types.d.ts +29 -4
- package/dist/player/types.d.ts.map +1 -1
- package/dist/player/types.js +24 -1
- package/dist/player/types.js.map +1 -1
- package/dist/session/boot.d.ts +26 -2
- package/dist/session/boot.d.ts.map +1 -1
- package/dist/session/boot.js +21 -2
- package/dist/session/boot.js.map +1 -1
- package/dist/session/game.d.ts +15 -0
- package/dist/session/game.d.ts.map +1 -1
- package/dist/session/game.js +616 -140
- package/dist/session/game.js.map +1 -1
- package/dist/session/save-migrate.d.ts.map +1 -1
- package/dist/session/save-migrate.js +76 -1
- package/dist/session/save-migrate.js.map +1 -1
- package/dist/session/save.d.ts +75 -12
- package/dist/session/save.d.ts.map +1 -1
- package/dist/session/save.js +177 -18
- package/dist/session/save.js.map +1 -1
- package/dist/store/bind.d.ts +1 -1
- package/dist/store/bind.d.ts.map +1 -1
- package/dist/store/bind.js +4 -3
- package/dist/store/bind.js.map +1 -1
- package/dist/store/mass-produce-vectors.d.ts +40 -0
- package/dist/store/mass-produce-vectors.d.ts.map +1 -0
- package/dist/store/mass-produce-vectors.fixtures.d.ts +13 -0
- package/dist/store/mass-produce-vectors.fixtures.d.ts.map +1 -0
- package/dist/store/mass-produce-vectors.fixtures.js +52 -0
- package/dist/store/mass-produce-vectors.fixtures.js.map +1 -0
- package/dist/store/mass-produce-vectors.js +44 -0
- package/dist/store/mass-produce-vectors.js.map +1 -0
- package/dist/store/store.d.ts +104 -7
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +199 -77
- package/dist/store/store.js.map +1 -1
- package/dist/store/transact.d.ts +14 -5
- package/dist/store/transact.d.ts.map +1 -1
- package/dist/store/transact.js +17 -16
- package/dist/store/transact.js.map +1 -1
- package/dist/store/types.d.ts +3 -2
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/types.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/visuals/index.d.ts +1 -0
- package/dist/visuals/index.d.ts.map +1 -1
- package/dist/visuals/index.js +1 -0
- package/dist/visuals/index.js.map +1 -1
- package/dist/visuals/map-text.d.ts +8 -0
- package/dist/visuals/map-text.d.ts.map +1 -1
- package/dist/visuals/map-text.js +1 -1
- package/dist/visuals/map-text.js.map +1 -1
- package/dist/visuals/object-glyph.d.ts +56 -0
- package/dist/visuals/object-glyph.d.ts.map +1 -0
- package/dist/visuals/object-glyph.js +52 -0
- package/dist/visuals/object-glyph.js.map +1 -0
- package/dist/visuals/prefs.d.ts +14 -22
- package/dist/visuals/prefs.d.ts.map +1 -1
- package/dist/visuals/prefs.js +4 -23
- package/dist/visuals/prefs.js.map +1 -1
- package/dist/visuals/tile-prefs.d.ts +26 -0
- package/dist/visuals/tile-prefs.d.ts.map +1 -1
- package/dist/visuals/tile-prefs.js +28 -0
- package/dist/visuals/tile-prefs.js.map +1 -1
- package/dist/world/feature.d.ts +2 -1
- package/dist/world/feature.d.ts.map +1 -1
- package/dist/world/feature.js +2 -0
- package/dist/world/feature.js.map +1 -1
- package/dist/world/project.d.ts +10 -2
- package/dist/world/project.d.ts.map +1 -1
- package/dist/world/project.js +18 -6
- package/dist/world/project.js.map +1 -1
- package/dist/world/projection.d.ts +37 -3
- package/dist/world/projection.d.ts.map +1 -1
- package/dist/world/projection.js +69 -7
- package/dist/world/projection.js.map +1 -1
- package/dist/world/trap.d.ts +2 -1
- package/dist/world/trap.d.ts.map +1 -1
- package/dist/world/trap.js +2 -1
- package/dist/world/trap.js.map +1 -1
- package/dist/world/view.d.ts +1 -1
- package/dist/world/view.d.ts.map +1 -1
- package/dist/world/view.js +11 -3
- package/dist/world/view.js.map +1 -1
- package/package.json +1 -1
- package/src/agent/perceive.ts +2 -3
- package/src/combat/blow-vectors.fixtures.ts +99 -0
- package/src/combat/blow-vectors.json +482 -0
- package/src/combat/blow-vectors.ts +280 -0
- package/src/combat/brand-slay.ts +42 -11
- package/src/combat/index.ts +1 -1
- package/src/combat/melee.ts +37 -19
- package/src/combat/mon-melee.ts +611 -364
- package/src/combat/ranged.ts +43 -26
- package/src/constants.ts +15 -0
- package/src/datafile.ts +148 -0
- package/src/effects/effect-info-registry.ts +313 -0
- package/src/effects/effect-info-vectors.fixtures.ts +61 -0
- package/src/effects/effect-info-vectors.json +11532 -0
- package/src/effects/effect-info-vectors.ts +376 -0
- package/src/effects/effect-info.ts +1005 -859
- package/src/effects/effect.ts +96 -62
- package/src/effects/handlers.ts +5 -2
- package/src/effects/interpreter.ts +14 -0
- package/src/game/cave-cmd.ts +54 -11
- package/src/game/cave-square.ts +80 -0
- package/src/game/char-sheet.ts +59 -16
- package/src/game/chest.ts +25 -8
- package/src/game/context.ts +293 -27
- package/src/game/describe.ts +34 -4
- package/src/game/display.ts +215 -19
- package/src/game/dump-level.ts +3 -2
- package/src/game/effect-attack.ts +41 -28
- package/src/game/effect-detect.ts +45 -8
- package/src/game/effect-env.ts +8 -0
- package/src/game/effect-general.ts +110 -47
- package/src/game/effect-item.ts +1075 -999
- package/src/game/effect-melee.ts +51 -18
- package/src/game/effect-monster.ts +55 -9
- package/src/game/effect-teleport.ts +173 -38
- package/src/game/effect-terrain.ts +38 -22
- package/src/game/equip-cmp.ts +483 -480
- package/src/game/floor.ts +22 -4
- package/src/game/gear.ts +210 -21
- package/src/game/harness.ts +12 -1
- package/src/game/ignore-cmd.ts +96 -8
- package/src/game/known.ts +392 -73
- package/src/game/loop.ts +52 -27
- package/src/game/lore-color.ts +13 -1
- package/src/game/mon-cast.ts +31 -6
- package/src/game/mon-cmd.ts +95 -30
- package/src/game/mon-death.ts +14 -12
- package/src/game/mon-group.ts +9 -5
- package/src/game/mon-message.ts +363 -65
- package/src/game/mon-place.ts +15 -3
- package/src/game/mon-ranged.ts +14 -5
- package/src/game/mon-side.ts +16 -12
- package/src/game/monster-turn.ts +120 -87
- package/src/game/notice.ts +85 -0
- package/src/game/obj-cmd.ts +126 -37
- package/src/game/obj-list.ts +44 -26
- package/src/game/object-inspect.ts +13 -0
- package/src/game/pickup.ts +29 -5
- package/src/game/player-side-vectors.fixtures.ts +215 -0
- package/src/game/player-side-vectors.json +6914 -0
- package/src/game/player-side-vectors.ts +420 -0
- package/src/game/player-side.ts +622 -340
- package/src/game/player-turn.ts +228 -31
- package/src/game/poly.ts +107 -0
- package/src/game/project-cast.ts +63 -6
- package/src/game/project-feat-vectors.fixtures.ts +106 -0
- package/src/game/project-feat-vectors.json +6554 -0
- package/src/game/project-feat-vectors.ts +323 -0
- package/src/game/project-feat.ts +417 -248
- package/src/game/project-monster.ts +69 -30
- package/src/game/project-obj-vectors.json +1 -0
- package/src/game/project-obj.ts +115 -47
- package/src/game/project-player.ts +8 -0
- package/src/game/projection-handlers.ts +110 -0
- package/src/game/quest.ts +48 -0
- package/src/game/ranged-cmd.ts +45 -11
- package/src/game/repeat.ts +92 -0
- package/src/game/shape-inspect.ts +166 -0
- package/src/game/spell-cmd.ts +39 -6
- package/src/game/spoil.ts +92 -39
- package/src/game/steal.ts +9 -4
- package/src/game/target-loop.ts +14 -7
- package/src/game/target.ts +18 -7
- package/src/game/ui-entry.ts +172 -22
- package/src/game/wizard.ts +97 -10
- package/src/game/world.ts +6 -0
- package/src/gen/cave.ts +225 -26
- package/src/gen/generate.ts +62 -9
- package/src/gen/glyph-vectors.fixtures.ts +122 -0
- package/src/gen/glyph-vectors.json +5996 -0
- package/src/gen/glyph-vectors.ts +280 -0
- package/src/gen/glyph.ts +132 -0
- package/src/gen/room.ts +446 -265
- package/src/gen/util.ts +32 -9
- package/src/i18n/i18n.ts +492 -0
- package/src/i18n/text.ts +117 -0
- package/src/index.ts +307 -254
- package/src/mod/extension.ts +136 -0
- package/src/mod/ids.ts +92 -21
- package/src/mod/record-keys.ts +102 -0
- package/src/mod/registry-host.ts +1063 -234
- package/src/mon/bind.ts +14 -8
- package/src/mon/knowledge-groups.ts +12 -12
- package/src/mon/lore-describe.ts +93 -26
- package/src/mon/lore-file.ts +365 -0
- package/src/mon/lore.ts +9 -3
- package/src/mon/make.ts +4 -2
- package/src/mon/monster.ts +1 -1
- package/src/mon/predicate.ts +14 -9
- package/src/mon/project-mon.ts +23 -5
- package/src/mon/steal.ts +39 -7
- package/src/mon/take-hit.ts +8 -3
- package/src/mon/timed.ts +15 -9
- package/src/mon/types.ts +11 -4
- package/src/msg.ts +55 -1
- package/src/obj/artifact-fake.ts +47 -17
- package/src/obj/bind.ts +52 -9
- package/src/obj/desc-vectors.fixtures.ts +119 -0
- package/src/obj/desc-vectors.json +2360 -0
- package/src/obj/desc-vectors.ts +128 -0
- package/src/obj/desc.ts +159 -55
- package/src/obj/effects-info.ts +90 -59
- package/src/obj/fake-object.ts +135 -0
- package/src/obj/ignore.ts +95 -28
- package/src/obj/knowledge.ts +291 -139
- package/src/obj/known-object.ts +126 -11
- package/src/obj/make.ts +53 -29
- package/src/obj/object-info.ts +103 -6
- package/src/obj/object.ts +392 -151
- package/src/obj/power.ts +297 -59
- package/src/obj/randart-build.ts +1875 -1705
- package/src/obj/randart-data.ts +1547 -1344
- package/src/obj/randart-file.ts +130 -0
- package/src/obj/randart-log.ts +78 -0
- package/src/obj/randart-registry.ts +247 -0
- package/src/obj/randart-vectors.fixtures.ts +61 -0
- package/src/obj/randart-vectors.json +836 -0
- package/src/obj/randart-vectors.ts +369 -0
- package/src/obj/randart.ts +722 -552
- package/src/obj/rune-registry.ts +270 -0
- package/src/obj/rune-vectors.fixtures.ts +164 -0
- package/src/obj/rune-vectors.json +121 -0
- package/src/obj/rune-vectors.ts +229 -0
- package/src/obj/tval-kind-vectors.json +391 -0
- package/src/obj/tval-registry.ts +243 -0
- package/src/obj/tval-vectors.fixtures.ts +50 -0
- package/src/obj/tval-vectors.json +38 -0
- package/src/obj/tval-vectors.ts +126 -0
- package/src/obj/types.ts +18 -7
- package/src/obj/value.ts +26 -20
- package/src/parser.ts +214 -0
- package/src/player/bind.ts +5 -2
- package/src/player/birth.ts +2 -1
- package/src/player/calcs.ts +123 -42
- package/src/player/death.ts +78 -0
- package/src/player/options-file.ts +387 -0
- package/src/player/options.ts +2 -1
- package/src/player/player.ts +60 -4
- package/src/player/shape-lore.ts +33 -14
- package/src/player/timed.ts +14 -4
- package/src/player/types.ts +30 -4
- package/src/session/boot.ts +51 -1
- package/src/session/game.ts +720 -163
- package/src/session/save-migrate.ts +81 -1
- package/src/session/save.ts +264 -22
- package/src/store/bind.ts +4 -3
- package/src/store/mass-produce-vectors.fixtures.ts +64 -0
- package/src/store/mass-produce-vectors.json +1169 -0
- package/src/store/mass-produce-vectors.ts +67 -0
- package/src/store/store.ts +266 -63
- package/src/store/transact.ts +39 -16
- package/src/store/types.ts +3 -2
- package/src/version.ts +1 -1
- package/src/visuals/index.ts +1 -0
- package/src/visuals/map-text.ts +1 -1
- package/src/visuals/object-glyph.ts +76 -0
- package/src/visuals/prefs.ts +22 -32
- package/src/visuals/tile-prefs.ts +32 -0
- package/src/world/feature.ts +4 -1
- package/src/world/project.ts +19 -4
- package/src/world/projection.ts +79 -8
- package/src/world/trap.ts +25 -21
- package/src/world/view.ts +11 -1
package/src/combat/ranged.ts
CHANGED
|
@@ -7,13 +7,15 @@
|
|
|
7
7
|
*
|
|
8
8
|
* This is the attack-resolution shell: to-hit, damage, and critical. The
|
|
9
9
|
* projectile path, ammo/quiver management, drop_near/breakage application,
|
|
10
|
-
* piercing (TMD_POWERSHOT)
|
|
11
|
-
*
|
|
10
|
+
* piercing (TMD_POWERSHOT) and the do_cmd_fire/throw front ends live in the
|
|
11
|
+
* world/command layer, which is ported: game/ranged-cmd.ts and the quiver
|
|
12
|
+
* subsystem in game/gear.ts.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
* (
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* The knowledge/learning half is ported too: missileLearnOnRangedAttack
|
|
15
|
+
* (obj/knowledge.ts:637, called at ranged-cmd.ts:164-167) and
|
|
16
|
+
* learnBrandSlayFromLaunch / FromThrow (combat/brand-slay.ts). Temporary
|
|
17
|
+
* brands/slays are ported as an injected predicate (TempBrandSlay); the
|
|
18
|
+
* launcher/throw paths pass allow_temp = false, as upstream does.
|
|
17
19
|
*
|
|
18
20
|
* O-combat ranged (birth_percent_damage) IS ported: oRangedDamage /
|
|
19
21
|
* o_critical_shot, gated in makeRangedShot / makeRangedThrow at the same points
|
|
@@ -22,7 +24,7 @@
|
|
|
22
24
|
*/
|
|
23
25
|
|
|
24
26
|
import type { Rng } from "../rng.js";
|
|
25
|
-
import type { Brand, Slay } from "../obj/types.js";
|
|
27
|
+
import type { Brand, Curse, Slay } from "../obj/types.js";
|
|
26
28
|
import type { GameObject } from "../obj/object.js";
|
|
27
29
|
import type { Monster } from "../mon/monster.js";
|
|
28
30
|
import type { Player } from "../player/player.js";
|
|
@@ -80,8 +82,9 @@ export function chanceOfMissileHitBase(
|
|
|
80
82
|
state: PlayerCombatState,
|
|
81
83
|
missile: GameObject,
|
|
82
84
|
launcher: GameObject | null,
|
|
85
|
+
curses?: readonly (Curse | null)[] | null,
|
|
83
86
|
): number {
|
|
84
|
-
let bonus = objectToHit(missile);
|
|
87
|
+
let bonus = objectToHit(missile, curses);
|
|
85
88
|
let chance: number;
|
|
86
89
|
|
|
87
90
|
if (!launcher) {
|
|
@@ -94,7 +97,7 @@ export function chanceOfMissileHitBase(
|
|
|
94
97
|
bonus * BTH_PLUS_ADJ;
|
|
95
98
|
}
|
|
96
99
|
} else {
|
|
97
|
-
bonus += state.toH + objectToHit(launcher);
|
|
100
|
+
bonus += state.toH + objectToHit(launcher, curses);
|
|
98
101
|
chance = skill(state, SKILL.TO_HIT_BOW) + bonus * BTH_PLUS_ADJ;
|
|
99
102
|
}
|
|
100
103
|
|
|
@@ -111,8 +114,10 @@ export function chanceOfMissileHit(
|
|
|
111
114
|
launcher: GameObject | null,
|
|
112
115
|
distance: number,
|
|
113
116
|
monObvious: boolean,
|
|
117
|
+
curses?: readonly (Curse | null)[] | null,
|
|
114
118
|
): number {
|
|
115
|
-
const chance =
|
|
119
|
+
const chance =
|
|
120
|
+
chanceOfMissileHitBase(state, missile, launcher, curses) - distance;
|
|
116
121
|
return monObvious ? chance : Math.trunc(chance / 2);
|
|
117
122
|
}
|
|
118
123
|
|
|
@@ -130,6 +135,7 @@ export function rangedDamage(
|
|
|
130
135
|
slay: number,
|
|
131
136
|
brands: readonly (Brand | null)[],
|
|
132
137
|
slays: readonly (Slay | null)[],
|
|
138
|
+
curses?: readonly (Curse | null)[] | null,
|
|
133
139
|
): number {
|
|
134
140
|
let mult = launcher ? state.ammoMult : 1;
|
|
135
141
|
|
|
@@ -140,11 +146,11 @@ export function rangedDamage(
|
|
|
140
146
|
}
|
|
141
147
|
|
|
142
148
|
let dmg = rng.damroll(missile.dd, missile.ds);
|
|
143
|
-
dmg += objectToDam(missile);
|
|
149
|
+
dmg += objectToDam(missile, curses);
|
|
144
150
|
if (launcher) {
|
|
145
|
-
dmg += objectToDam(launcher);
|
|
151
|
+
dmg += objectToDam(launcher, curses);
|
|
146
152
|
} else if (missile.flags.has(OF.THROWING)) {
|
|
147
|
-
dmg *= 2 + Math.trunc(objectWeightOne(missile) / 12);
|
|
153
|
+
dmg *= 2 + Math.trunc(objectWeightOne(missile, curses) / 12);
|
|
148
154
|
}
|
|
149
155
|
dmg *= mult;
|
|
150
156
|
|
|
@@ -179,6 +185,7 @@ export function oRangedDamage(
|
|
|
179
185
|
slay: number,
|
|
180
186
|
brands: readonly (Brand | null)[],
|
|
181
187
|
slays: readonly (Slay | null)[],
|
|
188
|
+
curses?: readonly (Curse | null)[] | null,
|
|
182
189
|
): RangedDamageOutcome {
|
|
183
190
|
const mult = launcher ? state.ammoMult : 1;
|
|
184
191
|
let dice = missile.dd;
|
|
@@ -204,9 +211,9 @@ export function oRangedDamage(
|
|
|
204
211
|
|
|
205
212
|
/* Deadliness: missile to-dam always; launcher adds launcher to-dam + to_d;
|
|
206
213
|
* a thrown throwing-weapon adds to_d; a plain thrown object adds neither. */
|
|
207
|
-
let deadliness = objectToDam(missile);
|
|
214
|
+
let deadliness = objectToDam(missile, curses);
|
|
208
215
|
if (launcher) {
|
|
209
|
-
deadliness += objectToDam(launcher) + state.toD;
|
|
216
|
+
deadliness += objectToDam(launcher, curses) + state.toD;
|
|
210
217
|
} else if (missile.flags.has(OF.THROWING)) {
|
|
211
218
|
deadliness += state.toD;
|
|
212
219
|
}
|
|
@@ -239,7 +246,7 @@ export function oRangedDamage(
|
|
|
239
246
|
);
|
|
240
247
|
dice += crit.addDice;
|
|
241
248
|
msg = crit.msg;
|
|
242
|
-
dice *= 2 + Math.trunc(objectWeightOne(missile) / 12);
|
|
249
|
+
dice *= 2 + Math.trunc(objectWeightOne(missile, curses) / 12);
|
|
243
250
|
}
|
|
244
251
|
|
|
245
252
|
let dmg = rng.damroll(dice, sides);
|
|
@@ -264,11 +271,12 @@ export function makeRangedShot(
|
|
|
264
271
|
distance: number,
|
|
265
272
|
monObvious = true,
|
|
266
273
|
percentDamage = false,
|
|
274
|
+
curses?: readonly (Curse | null)[] | null,
|
|
267
275
|
): RangedAttackResult {
|
|
268
276
|
if (
|
|
269
277
|
!testHit(
|
|
270
278
|
rng,
|
|
271
|
-
chanceOfMissileHit(state, ammo, launcher, distance, monObvious),
|
|
279
|
+
chanceOfMissileHit(state, ammo, launcher, distance, monObvious, curses),
|
|
272
280
|
mon.race.ac,
|
|
273
281
|
)
|
|
274
282
|
) {
|
|
@@ -285,20 +293,24 @@ export function makeRangedShot(
|
|
|
285
293
|
let dmg: number;
|
|
286
294
|
let msg: HitType;
|
|
287
295
|
if (!percentDamage) {
|
|
288
|
-
dmg = rangedDamage(
|
|
296
|
+
dmg = rangedDamage(
|
|
297
|
+
rng, state, mon, ammo, launcher, mod.brand, mod.slay, brands, slays, curses,
|
|
298
|
+
);
|
|
289
299
|
const crit = criticalShot(
|
|
290
300
|
rng,
|
|
291
301
|
critActor(p, state),
|
|
292
302
|
mon,
|
|
293
|
-
objectWeightOne(ammo),
|
|
294
|
-
objectToHit(ammo),
|
|
303
|
+
objectWeightOne(ammo, curses),
|
|
304
|
+
objectToHit(ammo, curses),
|
|
295
305
|
dmg,
|
|
296
306
|
true,
|
|
297
307
|
);
|
|
298
308
|
dmg = crit.damage;
|
|
299
309
|
msg = crit.msg;
|
|
300
310
|
} else {
|
|
301
|
-
const o = oRangedDamage(
|
|
311
|
+
const o = oRangedDamage(
|
|
312
|
+
rng, state, mon, ammo, launcher, mod.brand, mod.slay, brands, slays, curses,
|
|
313
|
+
);
|
|
302
314
|
dmg = o.damage;
|
|
303
315
|
msg = o.msg;
|
|
304
316
|
}
|
|
@@ -328,11 +340,12 @@ export function makeRangedThrow(
|
|
|
328
340
|
distance: number,
|
|
329
341
|
monObvious = true,
|
|
330
342
|
percentDamage = false,
|
|
343
|
+
curses?: readonly (Curse | null)[] | null,
|
|
331
344
|
): RangedAttackResult {
|
|
332
345
|
if (
|
|
333
346
|
!testHit(
|
|
334
347
|
rng,
|
|
335
|
-
chanceOfMissileHit(state, obj, null, distance, monObvious),
|
|
348
|
+
chanceOfMissileHit(state, obj, null, distance, monObvious, curses),
|
|
336
349
|
mon.race.ac,
|
|
337
350
|
)
|
|
338
351
|
) {
|
|
@@ -346,20 +359,24 @@ export function makeRangedThrow(
|
|
|
346
359
|
let dmg: number;
|
|
347
360
|
let msg: HitType;
|
|
348
361
|
if (!percentDamage) {
|
|
349
|
-
dmg = rangedDamage(
|
|
362
|
+
dmg = rangedDamage(
|
|
363
|
+
rng, state, mon, obj, null, mod.brand, mod.slay, brands, slays, curses,
|
|
364
|
+
);
|
|
350
365
|
const crit = criticalShot(
|
|
351
366
|
rng,
|
|
352
367
|
critActor(p, state),
|
|
353
368
|
mon,
|
|
354
|
-
objectWeightOne(obj),
|
|
355
|
-
objectToHit(obj),
|
|
369
|
+
objectWeightOne(obj, curses),
|
|
370
|
+
objectToHit(obj, curses),
|
|
356
371
|
dmg,
|
|
357
372
|
false,
|
|
358
373
|
);
|
|
359
374
|
dmg = crit.damage;
|
|
360
375
|
msg = crit.msg;
|
|
361
376
|
} else {
|
|
362
|
-
const o = oRangedDamage(
|
|
377
|
+
const o = oRangedDamage(
|
|
378
|
+
rng, state, mon, obj, null, mod.brand, mod.slay, brands, slays, curses,
|
|
379
|
+
);
|
|
363
380
|
dmg = o.damage;
|
|
364
381
|
msg = o.msg;
|
|
365
382
|
}
|
package/src/constants.ts
CHANGED
|
@@ -143,6 +143,21 @@ export interface Constants {
|
|
|
143
143
|
oRangedCritical: ORangedCritical;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
/**
|
|
147
|
+
* `world:feeling-need` in the SHIPPED constants.txt (`:119`): how many grids of
|
|
148
|
+
* a level the player must have explored before the object half of the level
|
|
149
|
+
* feeling is revealed rather than shown as `?`.
|
|
150
|
+
*
|
|
151
|
+
* It is here, named and cited, because two display functions need a value when
|
|
152
|
+
* no caller hands them one - the worldless harness, mainly - and they each had
|
|
153
|
+
* a bare `10` written into them instead. A literal in two files is a value that
|
|
154
|
+
* can drift from its data and from itself; this one is checked against
|
|
155
|
+
* constants.txt by a test. Anything with a loaded pack must pass
|
|
156
|
+
* `constants.feelingNeed`, which is the whole point of the row: a pack or mod
|
|
157
|
+
* that changes the number has to be obeyed.
|
|
158
|
+
*/
|
|
159
|
+
export const SHIPPED_FEELING_NEED = 10;
|
|
160
|
+
|
|
146
161
|
/** section -> label -> Constants field, mirroring init.c parse_constants_*. */
|
|
147
162
|
const SCALAR_MAP: Record<string, Record<string, string>> = {
|
|
148
163
|
"level-max": { monsters: "levelMonsterMax" },
|
package/src/datafile.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* datafile.c's WRITERS - the half of the data-file layer that emits a record
|
|
3
|
+
* rather than parsing one (parser.c covers the reading side).
|
|
4
|
+
*
|
|
5
|
+
* These exist because two very different features need to round-trip game data
|
|
6
|
+
* back out through the same grammar the .txt files use: mon-lore.c's "dump
|
|
7
|
+
* monster knowledge" and obj-randart.c's optional randart.txt. Upstream shares
|
|
8
|
+
* one implementation between them, so the port does too - writeFlags used to
|
|
9
|
+
* live in mon/lore-file.ts, which made obj/ reach into mon/ for it.
|
|
10
|
+
*
|
|
11
|
+
* Each writer returns a string instead of taking a file handle: HostIo.write is
|
|
12
|
+
* a whole-file call, so the callers assemble their document and write once.
|
|
13
|
+
*
|
|
14
|
+
* All three reproduce the same two upstream warts, and a parser reading these
|
|
15
|
+
* files has to cope with them:
|
|
16
|
+
*
|
|
17
|
+
* - the " | " separator is appended BEFORE the next name is known, so a run
|
|
18
|
+
* that stops early leaves a trailing separator in the buffer, and that
|
|
19
|
+
* buffer is still written;
|
|
20
|
+
* - `pointer` is compared against 60 AFTER the name is appended, so a line
|
|
21
|
+
* can overshoot by the length of its last entry.
|
|
22
|
+
*/
|
|
23
|
+
import type { FlagSet } from "./bitflag.js";
|
|
24
|
+
import {
|
|
25
|
+
ELEMENT_ENTRIES,
|
|
26
|
+
OBJECT_MODIFIER_ENTRIES,
|
|
27
|
+
STAT_ENTRIES,
|
|
28
|
+
} from "./generated/index.js";
|
|
29
|
+
|
|
30
|
+
/** OBJ_MOD_MAX: the stats come first, then list-object-modifiers.h. */
|
|
31
|
+
const OBJ_MOD_NAMES: readonly string[] = [
|
|
32
|
+
...STAT_ENTRIES.map((e) => e.name),
|
|
33
|
+
...OBJECT_MODIFIER_ENTRIES.map((e) => e.name),
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* write_flags (datafile.c:482-514): `intro` followed by the set flags' names,
|
|
38
|
+
* " | "-separated, wrapped at ~60 characters.
|
|
39
|
+
*/
|
|
40
|
+
export function writeFlags(
|
|
41
|
+
intro: string,
|
|
42
|
+
flags: FlagSet,
|
|
43
|
+
size: number,
|
|
44
|
+
names: readonly (string | undefined)[],
|
|
45
|
+
): string {
|
|
46
|
+
const lines: string[] = [];
|
|
47
|
+
let buf = "";
|
|
48
|
+
let pointer = 0;
|
|
49
|
+
|
|
50
|
+
for (
|
|
51
|
+
let flag = flags.next(1);
|
|
52
|
+
flag > 0 && flag < size * 8;
|
|
53
|
+
flag = flags.next(flag + 1)
|
|
54
|
+
) {
|
|
55
|
+
if (buf.length > 0) {
|
|
56
|
+
buf += " | ";
|
|
57
|
+
pointer += 3;
|
|
58
|
+
}
|
|
59
|
+
/* "If no name, we're past the real flags" - and the trailing " | " stays. */
|
|
60
|
+
const name = names[flag];
|
|
61
|
+
if (name === undefined) break;
|
|
62
|
+
buf += name;
|
|
63
|
+
pointer += name.length;
|
|
64
|
+
|
|
65
|
+
if (pointer >= 60) {
|
|
66
|
+
lines.push(`${intro}${buf}\n`);
|
|
67
|
+
buf = "";
|
|
68
|
+
pointer = 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* "Print remaining flags if any", gated on pointer rather than on buf. */
|
|
73
|
+
if (pointer) lines.push(`${intro}${buf}\n`);
|
|
74
|
+
return lines.join("");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* write_mods (datafile.c:520-563): `values:` lines for every non-zero modifier,
|
|
79
|
+
* as NAME[value].
|
|
80
|
+
*
|
|
81
|
+
* `pointer += 5` for the "[%d]" regardless of how many digits the value has -
|
|
82
|
+
* upstream's own approximation, kept because it is what decides where the line
|
|
83
|
+
* breaks.
|
|
84
|
+
*/
|
|
85
|
+
export function writeMods(values: readonly number[]): string {
|
|
86
|
+
const lines: string[] = [];
|
|
87
|
+
let buf = "";
|
|
88
|
+
let pointer = 0;
|
|
89
|
+
|
|
90
|
+
for (let i = 0; i < OBJ_MOD_NAMES.length; i++) {
|
|
91
|
+
const v = values[i] ?? 0;
|
|
92
|
+
if (v === 0) continue;
|
|
93
|
+
|
|
94
|
+
if (buf.length > 0) {
|
|
95
|
+
buf += " | ";
|
|
96
|
+
pointer += 3;
|
|
97
|
+
}
|
|
98
|
+
const name = OBJ_MOD_NAMES[i]!;
|
|
99
|
+
buf += `${name}[${String(v)}]`;
|
|
100
|
+
pointer += name.length + 5;
|
|
101
|
+
|
|
102
|
+
if (pointer >= 60) {
|
|
103
|
+
lines.push(`values:${buf}\n`);
|
|
104
|
+
buf = "";
|
|
105
|
+
pointer = 0;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (pointer) lines.push(`values:${buf}\n`);
|
|
110
|
+
return lines.join("");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* write_elements (datafile.c:569-610): `values:` lines for every element with a
|
|
115
|
+
* non-zero resistance level, as RES_NAME[level].
|
|
116
|
+
*
|
|
117
|
+
* `pointer += strlen(name) + 4` counts "RES_" but the value still only counts
|
|
118
|
+
* as 5 - the same approximation as write_mods.
|
|
119
|
+
*/
|
|
120
|
+
export function writeElements(
|
|
121
|
+
elInfo: readonly { readonly resLevel: number }[],
|
|
122
|
+
): string {
|
|
123
|
+
const lines: string[] = [];
|
|
124
|
+
let buf = "";
|
|
125
|
+
let pointer = 0;
|
|
126
|
+
|
|
127
|
+
for (let i = 0; i < ELEMENT_ENTRIES.length; i++) {
|
|
128
|
+
const level = elInfo[i]?.resLevel ?? 0;
|
|
129
|
+
if (level === 0) continue;
|
|
130
|
+
|
|
131
|
+
if (buf.length > 0) {
|
|
132
|
+
buf += " | ";
|
|
133
|
+
pointer += 3;
|
|
134
|
+
}
|
|
135
|
+
const name = ELEMENT_ENTRIES[i]!.name;
|
|
136
|
+
buf += `RES_${name}[${String(level)}]`;
|
|
137
|
+
pointer += name.length + 4 + 5;
|
|
138
|
+
|
|
139
|
+
if (pointer >= 60) {
|
|
140
|
+
lines.push(`values:${buf}\n`);
|
|
141
|
+
buf = "";
|
|
142
|
+
pointer = 0;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (pointer) lines.push(`values:${buf}\n`);
|
|
147
|
+
return lines.join("");
|
|
148
|
+
}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The EFFECT INFO registry: everything the game SAYS about an effect, and how a
|
|
3
|
+
* gamedata `type:` name becomes its integer subtype.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS IS A REGISTRY. `registry:effect` already let a mod register a handler
|
|
6
|
+
* for a brand-new effect code and have it DO something. What it could not do was
|
|
7
|
+
* let the game describe it. Four closed `switch` statements stood in the way,
|
|
8
|
+
* and each failed silently rather than loudly:
|
|
9
|
+
*
|
|
10
|
+
* - `effectMenuName` (effect-info.ts, keyed on the EFINFO_* flag) returned ""
|
|
11
|
+
* for an unknown flag, so a mod's effect showed a BLANK ROW in the "Activate
|
|
12
|
+
* which item?" and spell menus.
|
|
13
|
+
* - `formatEffectDesc` (effect-info.ts, same key) returned "" as well, so
|
|
14
|
+
* object recall and spell descriptions said nothing at all about it.
|
|
15
|
+
* - the activation summary walker (obj/effects-info.ts, keyed on the effect
|
|
16
|
+
* CODE) counted it "unsummarized", so a randart activation built from a mod
|
|
17
|
+
* effect could never be recognised as duplicating an intrinsic property.
|
|
18
|
+
* - `effectSubtype` (effect.ts, keyed on the EF index) returned -1 for every
|
|
19
|
+
* name, so a mod's effect could take NO named subtype - only a bare integer.
|
|
20
|
+
*
|
|
21
|
+
* FOUR TABLES, THREE KEYS, and they are separate because upstream's keys are.
|
|
22
|
+
* The EFINFO_* flag is a property of the effect's ENTRY (many effects share one
|
|
23
|
+
* flag: twenty flags cover a hundred and twelve effects), the summary walker
|
|
24
|
+
* keys on the effect's own code, and subtype decoding keys on the effect index.
|
|
25
|
+
* Collapsing them would force a mod to register the same behaviour three times
|
|
26
|
+
* under three spellings.
|
|
27
|
+
*
|
|
28
|
+
* WHY MODULE-LEVEL. Ruled 2026-08-09: disabling a mod always takes effect on the
|
|
29
|
+
* next RELOAD (exiting mod management prompts to save and reload). A toggle can
|
|
30
|
+
* therefore never need to apply to a running session, so a module-level table
|
|
31
|
+
* cannot violate the mod default policy.
|
|
32
|
+
*
|
|
33
|
+
* What actually clears it is the reload itself: a fresh page is a fresh module
|
|
34
|
+
* instance, and the host installs each plugin at most once per realm
|
|
35
|
+
* (`installedPluginIds` in web/main.ts is never cleared). So a disabled mod's
|
|
36
|
+
* registrations are gone on the next boot because the table they lived in is.
|
|
37
|
+
* `resetEffectInfoRegistry()` is the same restoration WITHOUT a fresh realm -
|
|
38
|
+
* core's arms back, every mod registration dropped - which is what a test needs
|
|
39
|
+
* in order to prove the mod default policy holds here rather than assert it.
|
|
40
|
+
* It has no production caller and is not meant to acquire one: calling it
|
|
41
|
+
* mid-session would strip a running mod's handlers, which is precisely the
|
|
42
|
+
* live-toggle behaviour the ruling says must not happen.
|
|
43
|
+
*
|
|
44
|
+
* ORDER AND RNG. Core's handlers are the case bodies lifted unchanged. Nothing
|
|
45
|
+
* here draws: upstream's `effect_describe` calls `dice_roll()` to populate the
|
|
46
|
+
* random_value it formats, and the port substitutes `Dice.randomValue()` at
|
|
47
|
+
* every such site precisely so that rendering a menu row cannot perturb the
|
|
48
|
+
* stream (see effect-info.ts's header). A mod handler receives the already
|
|
49
|
+
* computed value and has no Rng to reach, so that property survives the seam.
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
import type { RandomValue } from "../rng.js";
|
|
53
|
+
import type { ProjectionInfo } from "../world/projection.js";
|
|
54
|
+
import type { EffectObjectProperty } from "../obj/randart-build.js";
|
|
55
|
+
import type { EffectRecordJson } from "../obj/types.js";
|
|
56
|
+
import type { GameState } from "../game/context.js";
|
|
57
|
+
import type { ItemRequest } from "../game/effect-item.js";
|
|
58
|
+
import type { Effect, EffectCode, SubtypeInjections } from "./effect.js";
|
|
59
|
+
|
|
60
|
+
/* ------------------------------------------------------------------ *
|
|
61
|
+
* Table 1 and 2: the two text handlers, keyed on the EFINFO_* flag.
|
|
62
|
+
* ------------------------------------------------------------------ */
|
|
63
|
+
|
|
64
|
+
/** The projection strings an effect's subtype selects, "" when out of range. */
|
|
65
|
+
export interface EffectProjectionText {
|
|
66
|
+
/** projections[subtype].desc - EFINFO_SEEN / _BOLT / _BOLTD / _TOUCH. */
|
|
67
|
+
readonly desc: string;
|
|
68
|
+
/** projections[subtype].player_desc - EFINFO_BALL / _SPOT / _BREATH / _SHORT. */
|
|
69
|
+
readonly playerDesc: string;
|
|
70
|
+
/** projections[subtype].lash_desc - EFINFO_LASH. */
|
|
71
|
+
readonly lashDesc: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** What a menu-name handler is given (effect_get_menu_name, effects-info.c L583). */
|
|
75
|
+
export interface EffectMenuContext {
|
|
76
|
+
/** The effect being named. */
|
|
77
|
+
readonly effect: Effect;
|
|
78
|
+
/** base_descs[index].menu_name: the raw format string. */
|
|
79
|
+
readonly fmt: string;
|
|
80
|
+
/** sprintf(fmt, ...) - the format string with its arguments filled in. */
|
|
81
|
+
format(...args: Array<string | number>): string;
|
|
82
|
+
/** The effect's dice as a random_value, zeroed when it has none. */
|
|
83
|
+
readonly value: RandomValue;
|
|
84
|
+
/** randcalc(value, level, AVERAGE) - no RNG is drawn. */
|
|
85
|
+
average(level?: number): number;
|
|
86
|
+
/** projections[subtype], with "" for an out-of-range subtype. */
|
|
87
|
+
readonly proj: EffectProjectionText;
|
|
88
|
+
/** timed_effects[subtype].desc, "" when the host supplied no lookup. */
|
|
89
|
+
timedDesc(): string;
|
|
90
|
+
/** The stat property name for the subtype, "" when unavailable. */
|
|
91
|
+
statName(): string;
|
|
92
|
+
/** summon_desc(subtype), "" when unavailable. */
|
|
93
|
+
summonDesc(): string;
|
|
94
|
+
/** z_info->food_value scaled full / hungry thresholds (EFINFO_FOOD). */
|
|
95
|
+
readonly foodFull: number;
|
|
96
|
+
readonly foodHungry: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** What a description handler is given (effect_describe's body, L384-548). */
|
|
100
|
+
export interface EffectDescContext {
|
|
101
|
+
/** The effect being described. */
|
|
102
|
+
readonly effect: Effect;
|
|
103
|
+
/** base_descs[index].desc: the raw format string. */
|
|
104
|
+
readonly desc: string;
|
|
105
|
+
/** sprintf(desc, ...) - the format string with its arguments filled in. */
|
|
106
|
+
format(...args: Array<string | number>): string;
|
|
107
|
+
/** The random_value in force (an earlier SET_VALUE's, or the effect's own). */
|
|
108
|
+
readonly value: RandomValue;
|
|
109
|
+
/** format_dice_string(value) as the caller already computed it. */
|
|
110
|
+
readonly diceString: string;
|
|
111
|
+
/** format_dice_string(value, multiplier) - EFINFO_FOOD's turn count. */
|
|
112
|
+
diceStringTimes(multiplier: number): string;
|
|
113
|
+
/** The device-skill boost percentage in force. */
|
|
114
|
+
readonly devSkillBoost: number;
|
|
115
|
+
/** append_damage(value, boost) - defaults to the boost in force. */
|
|
116
|
+
appendDamage(boost?: number): string;
|
|
117
|
+
/** randcalc(value, level, AVERAGE) - no RNG is drawn. */
|
|
118
|
+
average(level?: number): number;
|
|
119
|
+
/** projections[subtype], with "" for an out-of-range subtype. */
|
|
120
|
+
readonly proj: EffectProjectionText;
|
|
121
|
+
/** timed_effects[subtype].desc, "" when the host supplied no lookup. */
|
|
122
|
+
timedDesc(): string;
|
|
123
|
+
/** The stat property name for the subtype, "" when unavailable. */
|
|
124
|
+
statName(): string;
|
|
125
|
+
/** summon_desc(subtype), "" when unavailable. */
|
|
126
|
+
summonDesc(): string;
|
|
127
|
+
/** player->lev, 0 when the host supplied none (EFINFO_SHORT). */
|
|
128
|
+
readonly playerLevel: number;
|
|
129
|
+
/** z_info->food_value, 100 upstream (EFINFO_FOOD). */
|
|
130
|
+
readonly foodValue: number;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* What one EFINFO_* flag means. Both halves are optional, and an absent half
|
|
135
|
+
* is upstream's own behaviour for an unhandled flag: "" - which is why a mod
|
|
136
|
+
* that supplies only `describe` still gets a blank menu row, and should say so
|
|
137
|
+
* to itself rather than be surprised.
|
|
138
|
+
*/
|
|
139
|
+
export interface EffectTextHandler {
|
|
140
|
+
/** The row text in the activate / cast menus. */
|
|
141
|
+
menuName?(ctx: EffectMenuContext): string;
|
|
142
|
+
/** The sentence in object recall and spell descriptions. */
|
|
143
|
+
describe?(ctx: EffectDescContext): string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* ------------------------------------------------------------------ *
|
|
147
|
+
* Table 3: the activation summary walker, keyed on the effect CODE.
|
|
148
|
+
* ------------------------------------------------------------------ */
|
|
149
|
+
|
|
150
|
+
/** EFPROP kinds and the resolved timed data, as the walker sees them. */
|
|
151
|
+
export interface ActivationSummaryContext {
|
|
152
|
+
/** The compiled effect record being walked. */
|
|
153
|
+
readonly record: EffectRecordJson;
|
|
154
|
+
/** Append one summarized object property. */
|
|
155
|
+
add(idx: number, reslevelMin: number, reslevelMax: number, kind: number): void;
|
|
156
|
+
/** summarize_cure for the record's `type` (a no-op for an unknown name). */
|
|
157
|
+
summarizeCure(name: string | undefined): void;
|
|
158
|
+
/** The temp-resist / brand / slay / conflict half of an increase. */
|
|
159
|
+
summarizeTimedInc(name: string | undefined): void;
|
|
160
|
+
/** dice_evaluate(dice, 0, MAXIMISE) for this record, honouring SET_VALUE. */
|
|
161
|
+
timedValue(): number;
|
|
162
|
+
/** Whether the pack has a player_timed record under this name. */
|
|
163
|
+
knownTimed(name: string | undefined): boolean;
|
|
164
|
+
/** OF_NO_TELEPORT's index, for the teleport family. */
|
|
165
|
+
readonly ofNoTeleport: number;
|
|
166
|
+
/** Remember (or forget) the dice a later timed effect reads: SET/CLEAR_VALUE. */
|
|
167
|
+
setRememberedDice(dice: string | undefined): void;
|
|
168
|
+
/** Count this record as contributing no object property. */
|
|
169
|
+
markUnsummarized(): void;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* One arm of effect_summarize_properties. Returning nothing is "this effect
|
|
174
|
+
* relates to no object property", which the walker records as unsummarized -
|
|
175
|
+
* so a handler that means "deliberately nothing" must still say so by calling
|
|
176
|
+
* `markUnsummarized()`, exactly as the ported default arm does.
|
|
177
|
+
*/
|
|
178
|
+
export type ActivationSummaryHandler = (ctx: ActivationSummaryContext) => void;
|
|
179
|
+
|
|
180
|
+
/** The shape the walker produces, re-exported so a caller need not reach in. */
|
|
181
|
+
export type ActivationSummaryResult = {
|
|
182
|
+
props: EffectObjectProperty[];
|
|
183
|
+
unsummarizedCount: number;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/* ------------------------------------------------------------------ *
|
|
187
|
+
* Table 4 and 5: subtype decoding and the item prompt, keyed on the index.
|
|
188
|
+
* ------------------------------------------------------------------ */
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* How one effect turns a gamedata `type:` NAME into its integer subtype.
|
|
192
|
+
* Return null (not -1) for "this name means nothing to me", so the caller can
|
|
193
|
+
* tell a handler that declined from one that resolved the name to -1.
|
|
194
|
+
*/
|
|
195
|
+
export type EffectSubtypeHandler = (
|
|
196
|
+
type: string,
|
|
197
|
+
inject: SubtypeInjections,
|
|
198
|
+
) => number | null;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Which item an effect prompts for, when it consumes one. Return null for
|
|
202
|
+
* "this effect chooses no item" - which is what BRAND_WEAPON, CURSE_ARMOR,
|
|
203
|
+
* CURSE_WEAPON and ACQUIRE do, because they pick their own target.
|
|
204
|
+
*/
|
|
205
|
+
export type EffectRequestHandler = (
|
|
206
|
+
subtype: number,
|
|
207
|
+
state: GameState,
|
|
208
|
+
) => ItemRequest | null;
|
|
209
|
+
|
|
210
|
+
/* ------------------------------------------------------------------ *
|
|
211
|
+
* The tables.
|
|
212
|
+
* ------------------------------------------------------------------ */
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* One keyed table. Written once and used five times, because the five differ
|
|
216
|
+
* only in their key and handler types - five hand-copied blocks would be five
|
|
217
|
+
* places for `handlerFor` to drift from `set`.
|
|
218
|
+
*/
|
|
219
|
+
export class EffectInfoTable<K, H> {
|
|
220
|
+
private readonly table = new Map<K, H>();
|
|
221
|
+
|
|
222
|
+
/** Install (or replace) the handler for one key. */
|
|
223
|
+
set(key: K, handler: H): void {
|
|
224
|
+
this.table.set(key, handler);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* The handler installed for a key right now, or null. This is what a mod
|
|
229
|
+
* calls to WRAP core - keep the returned handler, install its own, and call
|
|
230
|
+
* through - instead of only replacing it.
|
|
231
|
+
*/
|
|
232
|
+
handlerFor(key: K): H | null {
|
|
233
|
+
return this.table.get(key) ?? null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Whether anything handles this key. */
|
|
237
|
+
has(key: K): boolean {
|
|
238
|
+
return this.table.has(key);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/** Every key handled, in registration order (core's first). */
|
|
242
|
+
keys(): readonly K[] {
|
|
243
|
+
return [...this.table.keys()];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Everything the game says about an effect, in five tables under three keys.
|
|
249
|
+
*
|
|
250
|
+
* `text` is keyed on the EFINFO_* flag because that is what upstream's two
|
|
251
|
+
* switches key on: twenty flags describe a hundred and twelve effects, and an
|
|
252
|
+
* effect that behaves like an existing one for display purposes reuses its
|
|
253
|
+
* flag rather than repeating it. `summary` is keyed on the effect CODE, and
|
|
254
|
+
* `subtype` / `request` on the effect INDEX (or a mod's string code).
|
|
255
|
+
*/
|
|
256
|
+
export class EffectInfoRegistry {
|
|
257
|
+
/** The menu row and the recall sentence, keyed on the EFINFO_* flag. */
|
|
258
|
+
readonly text = new EffectInfoTable<string, EffectTextHandler>();
|
|
259
|
+
/** effect_summarize_properties' arms, keyed on the effect code. */
|
|
260
|
+
readonly summary = new EffectInfoTable<string, ActivationSummaryHandler>();
|
|
261
|
+
/** effect_subtype's arms, keyed on the effect index (or a mod code). */
|
|
262
|
+
readonly subtype = new EffectInfoTable<EffectCode, EffectSubtypeHandler>();
|
|
263
|
+
/** requestForEffect's arms, keyed on the effect index (or a mod code). */
|
|
264
|
+
readonly request = new EffectInfoTable<EffectCode, EffectRequestHandler>();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/** ProjectionInfo as the text handlers read it. */
|
|
268
|
+
export type ProjectionTextSource = readonly Pick<
|
|
269
|
+
ProjectionInfo,
|
|
270
|
+
"desc" | "playerDesc" | "lashDesc"
|
|
271
|
+
>[];
|
|
272
|
+
|
|
273
|
+
/* ------------------------------------------------------------------ *
|
|
274
|
+
* The live registry.
|
|
275
|
+
* ------------------------------------------------------------------ */
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Core's own seeders. Each of the four modules that OWNS a table registers its
|
|
279
|
+
* arms here at import time, and each is also the only module that READS its
|
|
280
|
+
* table - so "the module is loaded" and "core's arms are installed" cannot come
|
|
281
|
+
* apart. That is the point: a seeder somebody has to remember to call is a
|
|
282
|
+
* seeder that gets forgotten on one path, and the failure mode here is silent
|
|
283
|
+
* (every effect describes itself as "").
|
|
284
|
+
*/
|
|
285
|
+
const seeders: Array<(reg: EffectInfoRegistry) => void> = [];
|
|
286
|
+
|
|
287
|
+
let live = new EffectInfoRegistry();
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Install a set of core arms, now and on every reset. Called at module scope by
|
|
291
|
+
* effect-info.ts, obj/effects-info.ts, effects/effect.ts and
|
|
292
|
+
* game/effect-item.ts; a MOD never calls this - it registers through the
|
|
293
|
+
* capability-gated facade, whose registrations a reset deliberately drops.
|
|
294
|
+
*/
|
|
295
|
+
export function seedEffectInfo(seed: (reg: EffectInfoRegistry) => void): void {
|
|
296
|
+
seeders.push(seed);
|
|
297
|
+
seed(live);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/** The live registry. Module-level; see this file's header for why that is safe. */
|
|
301
|
+
export function effectInfoRegistry(): EffectInfoRegistry {
|
|
302
|
+
return live;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Back to core's arms alone, dropping every mod registration - the same state a
|
|
307
|
+
* reload produces, without needing a fresh realm. No production caller by
|
|
308
|
+
* design; see this file's header.
|
|
309
|
+
*/
|
|
310
|
+
export function resetEffectInfoRegistry(): void {
|
|
311
|
+
live = new EffectInfoRegistry();
|
|
312
|
+
for (const seed of seeders) seed(live);
|
|
313
|
+
}
|