@archivist-gg/dnd5e 0.3.17 → 0.3.24
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 +48 -21
- package/README.md +26 -48
- package/dist/armor/armor.codec.d.ts +0 -7
- package/dist/armor/armor.codec.js +1 -9
- package/dist/armor/armor.parser.js +1 -8
- package/dist/armor/armor.schema.js +1 -7
- package/dist/armor/armor.types.d.ts +0 -3
- package/dist/background/background.codec.d.ts +0 -6
- package/dist/background/background.codec.js +1 -12
- package/dist/background/background.parser.js +1 -11
- package/dist/background/background.schema.js +1 -12
- package/dist/background/background.types.d.ts +0 -5
- package/dist/chunk-2EOGK6R6.js +1 -0
- package/dist/chunk-2HRRH3WL.js +1 -0
- package/dist/chunk-2LCGKNVM.js +1 -0
- package/dist/chunk-2NUDWOFG.js +1 -0
- package/dist/chunk-334WLI7V.js +1 -0
- package/dist/chunk-3LWOVRLA.js +1 -0
- package/dist/chunk-3QQOATV3.js +1 -0
- package/dist/chunk-4E2GIWJE.js +1 -0
- package/dist/chunk-4GN3GYMP.js +1 -0
- package/dist/chunk-4IAMSRHD.js +1 -0
- package/dist/chunk-4JEF3CET.js +1 -0
- package/dist/chunk-4KVVAENP.js +1 -0
- package/dist/chunk-56JK6VCL.js +1 -0
- package/dist/chunk-5FEXHY4U.js +1 -0
- package/dist/chunk-63YJPWTM.js +1 -0
- package/dist/chunk-6ASJ3MVB.js +1 -0
- package/dist/chunk-6IC53O3Q.js +1 -0
- package/dist/chunk-6LCNV26D.js +1 -0
- package/dist/chunk-6W253VHH.js +1 -0
- package/dist/chunk-7AKJBRBD.js +1 -0
- package/dist/chunk-7EL3GWWJ.js +1 -0
- package/dist/chunk-7FPQJDFD.js +1 -0
- package/dist/chunk-7J5BNH2D.js +1 -0
- package/dist/chunk-7LPKI27J.js +1 -0
- package/dist/chunk-7UPYRKMF.js +1 -0
- package/dist/chunk-A7H6LX47.js +1 -0
- package/dist/chunk-AINRPPLH.js +1 -0
- package/dist/chunk-BC52J4LA.js +1 -0
- package/dist/chunk-BCXGB4HP.js +1 -0
- package/dist/chunk-BGX36NPE.js +1 -0
- package/dist/chunk-BPKG6RZ7.js +1 -0
- package/dist/chunk-BREHZNTL.js +1 -0
- package/dist/chunk-BZ6BGGZS.js +1 -0
- package/dist/chunk-CAPYNIGK.js +1 -0
- package/dist/chunk-CCFIINBA.js +1 -0
- package/dist/chunk-CMIEZQL4.js +1 -0
- package/dist/chunk-DVUXUIPV.js +1 -0
- package/dist/chunk-DY6FVAGA.js +1 -0
- package/dist/chunk-DZITM5AG.js +1 -0
- package/dist/chunk-DZKSXSJF.js +1 -0
- package/dist/chunk-EAARMPCW.js +1 -0
- package/dist/chunk-EVT7MGAC.js +1 -0
- package/dist/chunk-FOLHTMSC.js +1 -0
- package/dist/chunk-GCYUCIDN.js +1 -0
- package/dist/chunk-GIOV6JW7.js +1 -0
- package/dist/chunk-HCK6IUB3.js +1 -0
- package/dist/chunk-HR5MKCP2.js +1 -0
- package/dist/chunk-I26FHSI6.js +1 -0
- package/dist/chunk-I4O2FIDT.js +1 -0
- package/dist/chunk-IGVRLGLM.js +1 -0
- package/dist/chunk-IHPLT2ZT.js +1 -0
- package/dist/chunk-IOCJIWCV.js +1 -0
- package/dist/chunk-JXDX2DKF.js +1 -0
- package/dist/chunk-KBFSJ5WE.js +1 -0
- package/dist/chunk-KM75CC6Q.js +1 -0
- package/dist/chunk-KZDDFG4O.js +1 -0
- package/dist/chunk-LJNT3PJP.js +1 -0
- package/dist/chunk-LR6UMA5V.js +1 -0
- package/dist/chunk-M6RPOLKS.js +1 -0
- package/dist/chunk-MC6PLWRZ.js +1 -0
- package/dist/chunk-MGGKZGLG.js +1 -0
- package/dist/chunk-N3RYJ7RE.js +1 -0
- package/dist/chunk-NEMX7QGG.js +1 -0
- package/dist/chunk-NI364WV7.js +1 -0
- package/dist/chunk-O2QZ73GA.js +1 -0
- package/dist/chunk-O776WL7O.js +1 -0
- package/dist/chunk-OTFNINUY.js +1 -0
- package/dist/chunk-PQAVMK3T.js +1 -0
- package/dist/chunk-PZ3ZZ5H5.js +1 -0
- package/dist/chunk-PZ4L2EEG.js +1 -0
- package/dist/chunk-PZUPZBTN.js +1 -0
- package/dist/chunk-QBA757AU.js +1 -0
- package/dist/chunk-QFIGPOFW.js +1 -0
- package/dist/chunk-QMEKQTUT.js +1 -0
- package/dist/chunk-QVWT67WA.js +1 -0
- package/dist/chunk-RDXQAZBA.js +1 -0
- package/dist/chunk-RE5Z5RNK.js +1 -0
- package/dist/chunk-RL4VY2AL.js +1 -0
- package/dist/chunk-RQGTBHJW.js +1 -0
- package/dist/chunk-RQZCGXUZ.js +1 -0
- package/dist/chunk-S5UCI27C.js +1 -0
- package/dist/chunk-SEOASDO4.js +1 -0
- package/dist/chunk-SU4MEZ5P.js +1 -0
- package/dist/chunk-T55DELVL.js +1 -0
- package/dist/chunk-TKIEPC6F.js +1 -0
- package/dist/chunk-TLXFGGWH.js +1 -0
- package/dist/chunk-UBUKCRZ3.js +1 -0
- package/dist/chunk-V6NQ547U.js +1 -0
- package/dist/chunk-VA3ZWV7C.js +1 -0
- package/dist/chunk-VIP3FH2O.js +1 -0
- package/dist/chunk-VTQ4RWEG.js +1 -0
- package/dist/chunk-WUHTSLG4.js +1 -0
- package/dist/chunk-X22SISGM.js +1 -0
- package/dist/chunk-XKJXT2PN.js +1 -0
- package/dist/chunk-XQMKH4R4.js +1 -0
- package/dist/chunk-YGH7S5ZF.js +1 -0
- package/dist/chunk-ZE46ADXS.js +1 -0
- package/dist/chunk-ZI3FEUX3.js +1 -0
- package/dist/class/class.codec.d.ts +0 -7
- package/dist/class/class.codec.js +1 -18
- package/dist/class/class.parser.js +1 -17
- package/dist/class/class.schema.d.ts +2 -1
- package/dist/class/class.schema.js +1 -15
- package/dist/class/class.slug.d.ts +0 -11
- package/dist/class/class.slug.js +1 -8
- package/dist/class/class.standard-array.d.ts +0 -7
- package/dist/class/class.standard-array.js +1 -20
- package/dist/class/class.types.d.ts +0 -20
- package/dist/condition/condition.codec.d.ts +0 -6
- package/dist/condition/condition.parser.d.ts +0 -10
- package/dist/condition/condition.parser.js +1 -7
- package/dist/condition/condition.schema.d.ts +0 -16
- package/dist/condition/condition.types.d.ts +0 -3
- package/dist/data-srd/index.generated.js +1 -146
- package/dist/dnd/amount-text.d.ts +4 -27
- package/dist/dnd/amount-text.js +1 -13
- package/dist/dnd/constants.d.ts +0 -18
- package/dist/dnd/constants.js +1 -42
- package/dist/dnd/formula-tags.d.ts +0 -2
- package/dist/dnd/formula-tags.js +1 -119
- package/dist/dnd/math.d.ts +0 -26
- package/dist/dnd/math.js +1 -45
- package/dist/dnd/prose-tags.d.ts +1 -15
- package/dist/dnd/prose-tags.js +1 -18
- package/dist/dnd/resource-die.d.ts +0 -4
- package/dist/dnd/resource-die.js +1 -17
- package/dist/dnd/resource-formula.d.ts +0 -43
- package/dist/dnd/resource-formula.js +1 -14
- package/dist/dnd/resource-words.d.ts +0 -2
- package/dist/dnd/resource-words.js +1 -30
- package/dist/dnd/srd-tag-converter.d.ts +0 -21
- package/dist/dnd/srd-tag-converter.js +1 -12
- package/dist/dnd/tag-grammar.js +1 -12
- package/dist/dnd/warn-once.js +1 -8
- package/dist/encounter/encounter.ai-schema.js +1 -8
- package/dist/entities/base-item-resolver.d.ts +0 -26
- package/dist/entities/base-item-resolver.js +1 -11
- package/dist/entities/registry-revision.d.ts +10 -0
- package/dist/entities/registry-revision.js +1 -0
- package/dist/entities/slug.d.ts +1 -31
- package/dist/entities/slug.js +1 -12
- package/dist/entities/wikilink-display.d.ts +0 -2
- package/dist/entities/wikilink-display.js +1 -10
- package/dist/feat/feat.category-codes.d.ts +1 -26
- package/dist/feat/feat.category-codes.js +1 -14
- package/dist/feat/feat.codec.d.ts +0 -6
- package/dist/feat/feat.codec.js +1 -12
- package/dist/feat/feat.parser.js +1 -11
- package/dist/feat/feat.schema.d.ts +31 -1
- package/dist/feat/feat.schema.js +1 -10
- package/dist/feat/feat.types.d.ts +0 -6
- package/dist/index.js +45 -138113
- package/dist/inline-tag-parser.js +1 -6
- package/dist/item/item.actions-map.d.ts +4 -63
- package/dist/item/item.actions-map.js +1 -10
- package/dist/item/item.ai-schema.js +1 -6
- package/dist/item/item.attunement.d.ts +0 -14
- package/dist/item/item.attunement.js +1 -6
- package/dist/item/item.bonuses.js +1 -10
- package/dist/item/item.codec.js +1 -9
- package/dist/item/item.conditions.d.ts +0 -7
- package/dist/item/item.conditions.js +1 -11
- package/dist/item/item.conditions.types.d.ts +0 -2
- package/dist/item/item.cost.js +1 -29
- package/dist/item/item.enrichment.js +1 -9
- package/dist/item/item.icon.d.ts +0 -8
- package/dist/item/item.icon.js +1 -211
- package/dist/item/item.parser.js +1 -8
- package/dist/item/item.schema.d.ts +2 -0
- package/dist/item/item.schema.js +1 -11
- package/dist/item/item.types.d.ts +2 -28
- package/dist/monster/monster.ai-schema.js +1 -6
- package/dist/monster/monster.codec.d.ts +0 -10
- package/dist/monster/monster.enrichment.js +1 -19
- package/dist/monster/monster.format.d.ts +0 -69
- package/dist/monster/monster.format.js +1 -78
- package/dist/monster/monster.parser.d.ts +0 -4
- package/dist/monster/monster.parser.js +1 -15
- package/dist/monster/monster.resolve.d.ts +0 -4
- package/dist/monster/monster.schema.d.ts +0 -9
- package/dist/monster/monster.schema.js +1 -34
- package/dist/monster/monster.types.d.ts +0 -3
- package/dist/monster/monster.types.js +1 -1
- package/dist/optional-feature/optional-feature.codec.d.ts +0 -11
- package/dist/optional-feature/optional-feature.codec.js +1 -13
- package/dist/optional-feature/optional-feature.parser.js +1 -12
- package/dist/optional-feature/optional-feature.schema.d.ts +30 -1
- package/dist/optional-feature/optional-feature.schema.js +1 -15
- package/dist/pack.d.ts +0 -9
- package/dist/pc/conditions.constants.js +1 -6
- package/dist/pc/decision-recognizer.js +1 -8
- package/dist/pc/pc.additional-spells.d.ts +4 -14
- package/dist/pc/pc.additional-spells.js +1 -23
- package/dist/pc/pc.amount-bindings.d.ts +4 -20
- package/dist/pc/pc.amount-bindings.js +1 -23
- package/dist/pc/pc.asi-flatten.d.ts +0 -59
- package/dist/pc/pc.asi-flatten.js +1 -16
- package/dist/pc/pc.conditions.d.ts +1 -0
- package/dist/pc/pc.conditions.js +1 -6
- package/dist/pc/pc.containment.d.ts +0 -5
- package/dist/pc/pc.containment.js +1 -24
- package/dist/pc/pc.decision-engine.d.ts +4 -141
- package/dist/pc/pc.decision-engine.js +1 -52
- package/dist/pc/pc.defense-normalize.d.ts +0 -10
- package/dist/pc/pc.defense-normalize.js +1 -6
- package/dist/pc/pc.entry-overrides.d.ts +0 -58
- package/dist/pc/pc.entry-overrides.js +1 -40
- package/dist/pc/pc.equipment.d.ts +2 -22
- package/dist/pc/pc.equipment.js +1 -33
- package/dist/pc/pc.feature-effects.d.ts +23 -275
- package/dist/pc/pc.feature-effects.js +1 -26
- package/dist/pc/pc.formula-context.js +1 -11
- package/dist/pc/pc.infusions.d.ts +0 -65
- package/dist/pc/pc.infusions.js +1 -64
- package/dist/pc/pc.item-effects.d.ts +18 -0
- package/dist/pc/pc.member-choices.d.ts +18 -49
- package/dist/pc/pc.member-choices.js +1 -32
- package/dist/pc/pc.parser.js +1 -58
- package/dist/pc/pc.pools.d.ts +7 -10
- package/dist/pc/pc.pools.js +1 -26
- package/dist/pc/pc.proficiencies.d.ts +7 -33
- package/dist/pc/pc.proficiencies.js +1 -107
- package/dist/pc/pc.proficiency-grants.d.ts +0 -26
- package/dist/pc/pc.proficiency-normalize.d.ts +4 -25
- package/dist/pc/pc.proficiency-normalize.js +1 -12
- package/dist/pc/pc.proficiency-query.d.ts +0 -13
- package/dist/pc/pc.proficiency-query.js +1 -27
- package/dist/pc/pc.recalc.d.ts +7 -131
- package/dist/pc/pc.recalc.js +1 -946
- package/dist/pc/pc.resolver.d.ts +0 -104
- package/dist/pc/pc.resolver.js +1 -59
- package/dist/pc/pc.resource-seed.d.ts +0 -8
- package/dist/pc/pc.resource-seed.js +1 -42
- package/dist/pc/pc.resources.d.ts +1 -59
- package/dist/pc/pc.resources.js +1 -23
- package/dist/pc/pc.rest.d.ts +1 -20
- package/dist/pc/pc.rest.js +1 -230
- package/dist/pc/pc.schema.d.ts +19 -2
- package/dist/pc/pc.schema.js +1 -9
- package/dist/pc/pc.slotting.d.ts +0 -29
- package/dist/pc/pc.slotting.js +1 -28
- package/dist/pc/pc.speeds.d.ts +19 -0
- package/dist/pc/pc.spell-scope.d.ts +6 -0
- package/dist/pc/pc.spellcasting.d.ts +0 -70
- package/dist/pc/pc.spellcasting.js +1 -28
- package/dist/pc/pc.table-column.d.ts +0 -22
- package/dist/pc/pc.table-column.js +1 -18
- package/dist/pc/pc.tool-picks.d.ts +0 -27
- package/dist/pc/pc.tool-picks.js +1 -18
- package/dist/pc/pc.types.d.ts +85 -344
- package/dist/pc/pc.weapon-grant.d.ts +0 -6
- package/dist/pc/pool-layout.d.ts +0 -39
- package/dist/pc/pool-layout.js +1 -18
- package/dist/pc/resource-equivalents.d.ts +2 -40
- package/dist/pc/roll-scope.js +1 -8
- package/dist/pc/roll-tag-labels.d.ts +0 -32
- package/dist/pc/roll-tag-labels.js +1 -17
- package/dist/pc/spell-source.d.ts +0 -11
- package/dist/pc/spell-source.js +1 -8
- package/dist/race/race.codec.d.ts +0 -6
- package/dist/race/race.codec.js +1 -15
- package/dist/race/race.parser.js +1 -14
- package/dist/race/race.schema.d.ts +0 -8
- package/dist/race/race.schema.js +1 -14
- package/dist/race/race.structural.d.ts +0 -6
- package/dist/race/race.structural.js +1 -6
- package/dist/race/race.types.d.ts +0 -8
- package/dist/schemas/attack-schema.d.ts +5 -0
- package/dist/schemas/caster-type-schema.d.ts +1 -6
- package/dist/schemas/caster-type-schema.js +1 -6
- package/dist/schemas/choice-schema.js +1 -7
- package/dist/schemas/duration-schema.d.ts +0 -2
- package/dist/schemas/duration-schema.js +1 -6
- package/dist/schemas/entity-extras-schema.d.ts +0 -30
- package/dist/schemas/entity-extras-schema.js +1 -10
- package/dist/schemas/equipment-grant-schema.d.ts +0 -2
- package/dist/schemas/equipment-grant-schema.js +1 -12
- package/dist/schemas/feature-alias.d.ts +0 -27
- package/dist/schemas/feature-effect-schema.d.ts +30 -1
- package/dist/schemas/feature-effect-schema.js +1 -6
- package/dist/schemas/feature-schema.d.ts +0 -6
- package/dist/schemas/feature-schema.js +1 -12
- package/dist/schemas/resource-schema.d.ts +1 -34
- package/dist/schemas/resource-schema.js +1 -12
- package/dist/schemas/selection-pool-schema.js +1 -10
- package/dist/spell/casting-time.d.ts +0 -15
- package/dist/spell/casting-time.js +1 -6
- package/dist/spell/spell.access.d.ts +0 -6
- package/dist/spell/spell.access.js +1 -45
- package/dist/spell/spell.ai-schema.js +1 -6
- package/dist/spell/spell.codec.js +1 -9
- package/dist/spell/spell.enrichment.js +1 -9
- package/dist/spell/spell.filter.d.ts +0 -5
- package/dist/spell/spell.filter.js +1 -75
- package/dist/spell/spell.parser.d.ts +0 -31
- package/dist/spell/spell.parser.js +1 -16
- package/dist/spell/spell.scaling.d.ts +0 -46
- package/dist/spell/spell.scaling.js +1 -79
- package/dist/spell/spell.schema.js +1 -7
- package/dist/spell/spell.types.d.ts +0 -7
- package/dist/srd/retired-items.d.ts +0 -4
- package/dist/srd/retired-items.js +1 -11
- package/dist/srd-store.d.ts +0 -33
- package/dist/subclass/subclass.codec.d.ts +0 -8
- package/dist/subclass/subclass.codec.js +1 -17
- package/dist/subclass/subclass.parser.js +1 -16
- package/dist/subclass/subclass.schema.d.ts +2 -1
- package/dist/subclass/subclass.schema.js +1 -14
- package/dist/subclass/subclass.types.d.ts +0 -3
- package/dist/types/attack.d.ts +2 -0
- package/dist/types/casting-option.d.ts +0 -4
- package/dist/types/choice.d.ts +1 -72
- package/dist/types/choice.js +1 -24
- package/dist/types/edition.d.ts +0 -3
- package/dist/types/equipment-grant.d.ts +1 -27
- package/dist/types/equipment-grant.js +1 -12
- package/dist/types/feature-effect.d.ts +14 -14
- package/dist/types/feature.d.ts +0 -22
- package/dist/types/optional-feature.types.d.ts +1 -31
- package/dist/types/resource.d.ts +1 -21
- package/dist/types/selection-pool.d.ts +0 -24
- package/dist/weapon/weapon-mastery.d.ts +0 -1
- package/dist/weapon/weapon.classify.d.ts +0 -11
- package/dist/weapon/weapon.classify.js +1 -7
- package/dist/weapon/weapon.codec.d.ts +0 -9
- package/dist/weapon/weapon.codec.js +1 -9
- package/dist/weapon/weapon.parser.js +1 -8
- package/dist/weapon/weapon.schema.js +1 -7
- package/dist/weapon/weapon.types.d.ts +0 -3
- package/package.json +3 -3
- package/src/data-srd/ATTRIBUTION.md +1 -1
- package/dist/chunk-2FRUSVZS.js +0 -489
- package/dist/chunk-2JSQE3DD.js +0 -206
- package/dist/chunk-2LULMQTF.js +0 -14
- package/dist/chunk-2UDSN6VW.js +0 -18
- package/dist/chunk-3LWMFYKS.js +0 -57
- package/dist/chunk-3MGQFFNE.js +0 -110
- package/dist/chunk-3TM34RSJ.js +0 -23
- package/dist/chunk-3VZZDKRA.js +0 -1014
- package/dist/chunk-4U55VNC7.js +0 -22
- package/dist/chunk-5GKJAUMX.js +0 -59
- package/dist/chunk-5MXFW4O3.js +0 -71
- package/dist/chunk-656QCX4U.js +0 -22
- package/dist/chunk-6EI737IO.js +0 -19
- package/dist/chunk-6GNXYAYP.js +0 -25
- package/dist/chunk-6PXTNCBP.js +0 -133
- package/dist/chunk-6X2NV665.js +0 -33
- package/dist/chunk-7ATNGKBS.js +0 -178
- package/dist/chunk-7Q2VPKCD.js +0 -181
- package/dist/chunk-7QN7XSAK.js +0 -19
- package/dist/chunk-A54HHCWW.js +0 -67
- package/dist/chunk-AZRGFUSR.js +0 -18
- package/dist/chunk-B3DP42OM.js +0 -55
- package/dist/chunk-CJYCVNW2.js +0 -7
- package/dist/chunk-CM5CWO4K.js +0 -735
- package/dist/chunk-DEEHHLAP.js +0 -271
- package/dist/chunk-DOXSFYLH.js +0 -158
- package/dist/chunk-DPUJDOKV.js +0 -365
- package/dist/chunk-EJP263OP.js +0 -186
- package/dist/chunk-EVMUJYUD.js +0 -195
- package/dist/chunk-EYX4JMAU.js +0 -101
- package/dist/chunk-FANQVQ3D.js +0 -89
- package/dist/chunk-FC4IGH5Y.js +0 -18
- package/dist/chunk-G6MHJDVT.js +0 -41
- package/dist/chunk-G6PBI2BU.js +0 -18
- package/dist/chunk-H5PTKYXL.js +0 -101
- package/dist/chunk-HHBD4SQ6.js +0 -24
- package/dist/chunk-HS6FIOLP.js +0 -52
- package/dist/chunk-HTYMW5CH.js +0 -228
- package/dist/chunk-IHE6KVC3.js +0 -13
- package/dist/chunk-IN4M4X7P.js +0 -34
- package/dist/chunk-IUAAXXNO.js +0 -58
- package/dist/chunk-JCMUVZIK.js +0 -133
- package/dist/chunk-JSM6JFZR.js +0 -709
- package/dist/chunk-K5NJBTE2.js +0 -18
- package/dist/chunk-KR6JF3BF.js +0 -14
- package/dist/chunk-KSTV7J2U.js +0 -112
- package/dist/chunk-KU3YLF6D.js +0 -106
- package/dist/chunk-LBEXLN6I.js +0 -91
- package/dist/chunk-LF5AGJA4.js +0 -81
- package/dist/chunk-LHZXYFBU.js +0 -94
- package/dist/chunk-LSLSG67V.js +0 -31
- package/dist/chunk-LVQLWRCU.js +0 -15
- package/dist/chunk-MBX25B6D.js +0 -18
- package/dist/chunk-MYY2C5MB.js +0 -233
- package/dist/chunk-OFCSP6MT.js +0 -23
- package/dist/chunk-ONTGZR5T.js +0 -1806
- package/dist/chunk-OOSRUJBI.js +0 -19
- package/dist/chunk-PDJSUH24.js +0 -110
- package/dist/chunk-PKX6TGRE.js +0 -93
- package/dist/chunk-PQZ4LM4Z.js +0 -19
- package/dist/chunk-PTXBIDG7.js +0 -63
- package/dist/chunk-PVCEA4HZ.js +0 -6
- package/dist/chunk-PXVNAY7T.js +0 -84
- package/dist/chunk-QH36K2PU.js +0 -158
- package/dist/chunk-QS5L5YTJ.js +0 -24
- package/dist/chunk-QYZV2MQA.js +0 -97
- package/dist/chunk-QZSWN2KT.js +0 -18
- package/dist/chunk-RLGQ5PZZ.js +0 -16
- package/dist/chunk-RYLXAYIQ.js +0 -18
- package/dist/chunk-S3YUXDSC.js +0 -278
- package/dist/chunk-S7REMWW4.js +0 -21
- package/dist/chunk-T6QIF5XR.js +0 -348
- package/dist/chunk-TOM66P2P.js +0 -38
- package/dist/chunk-TULQ4FFX.js +0 -353
- package/dist/chunk-UA5KS2PL.js +0 -26
- package/dist/chunk-UUBJCNQU.js +0 -187
- package/dist/chunk-UZXG6QSY.js +0 -58
- package/dist/chunk-VPYBK2MG.js +0 -18
- package/dist/chunk-VRV3NNTA.js +0 -161
- package/dist/chunk-VTTA2ALZ.js +0 -16
- package/dist/chunk-W6GC6OKK.js +0 -16
- package/dist/chunk-WELIKLZF.js +0 -256
- package/dist/chunk-WSVMLNTO.js +0 -31
- package/dist/chunk-WYGD2UGN.js +0 -14
- package/dist/chunk-XCFC7LGF.js +0 -122
- package/dist/chunk-XJ2F2WO6.js +0 -8
- package/dist/chunk-Y5VVP73C.js +0 -23
- package/dist/chunk-YBLDE5CG.js +0 -42
- package/dist/chunk-YD2VAHA6.js +0 -159
- package/dist/chunk-YDGMBMYI.js +0 -25
- package/dist/chunk-YHYTW5QA.js +0 -20
- package/dist/chunk-YKL6SHRJ.js +0 -23
- package/dist/chunk-ZCTUYGNV.js +0 -26
- package/dist/chunk-ZDAEGJH4.js +0 -102
- package/dist/chunk-ZJXSXVFP.js +0 -58
- package/dist/chunk-ZUQW5VBZ.js +0 -89
|
@@ -1,41 +1,28 @@
|
|
|
1
|
-
import type { FeatureEffect, SenseType } from "@archivist-gg/dnd5e/types/feature-effect";
|
|
1
|
+
import type { FeatureEffect, SenseType, WeaponScope } from "@archivist-gg/dnd5e/types/feature-effect";
|
|
2
2
|
import type { Ability } from "@archivist-gg/dnd5e";
|
|
3
|
-
import type { DamageRider, DefenseGrant, FeatureSource, ResolvedCharacter, ResolvedFeature, RollModifierEntry, SaveOutcomeEntry } from "./pc.types.js";
|
|
4
|
-
/**
|
|
5
|
-
* A melee-attack ability override from a `weapon-ability` effect. `weaponSlugs`
|
|
6
|
-
* (bare, namespace-stripped) scopes the override to matching weapon types only;
|
|
7
|
-
* empty/absent `weaponSlugs` = GLOBAL (applies to every melee weapon). The
|
|
8
|
-
* `"spellcasting"` sentinel is NOT stored here — it is resolved against the
|
|
9
|
-
* caster ability in recalc and prepended as a global.
|
|
10
|
-
*/
|
|
3
|
+
import type { ConditionalCrit, DamageRider, DefenseGrant, DefenseItemSource, FeatureSource, SpeedMode, ResolvedCharacter, ResolvedFeature, RollModifierEntry, SaveOutcomeEntry, SpellDamageRider } from "./pc.types.js";
|
|
11
4
|
export interface WeaponAbilityOverride {
|
|
12
5
|
ability: Ability;
|
|
13
6
|
weaponSlugs?: string[];
|
|
7
|
+
pactWeapon?: true;
|
|
14
8
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Aggregated passive feature effects (effects-application engine).
|
|
17
|
-
* One pure scan over resolved.features[].feature.effects[]. Merge semantics
|
|
18
|
-
* mirror pc.conditions mergePartial: numbers add, each sense range takes max,
|
|
19
|
-
* lists union case-insensitively. apply-condition is action time and
|
|
20
|
-
* intentionally not aggregated; `damage-bonus` folds into damageBonuses (additive
|
|
21
|
-
* on-hit riders); `while`-gated immune-condition entries are skipped entirely
|
|
22
|
-
* (conditional effects are a named deferral).
|
|
23
|
-
*/
|
|
24
9
|
export interface FeatureEffectTotals {
|
|
25
10
|
initiative_bonus: number;
|
|
26
11
|
initiative_terms: {
|
|
27
12
|
label: string;
|
|
28
13
|
value: number;
|
|
29
14
|
}[];
|
|
30
|
-
|
|
15
|
+
initiative_amount_terms: {
|
|
16
|
+
label: string;
|
|
17
|
+
amount: string;
|
|
18
|
+
owner?: FeatureSource;
|
|
19
|
+
}[];
|
|
31
20
|
skill_bonus_terms: {
|
|
32
21
|
skills: string[];
|
|
33
22
|
ability: Ability;
|
|
34
23
|
minimum: number;
|
|
35
24
|
label: string;
|
|
36
25
|
}[];
|
|
37
|
-
/** SL (spec §11.2): ability-based numeric SAVE bonuses (Aura of Protection), resolved in recalc against final scores and
|
|
38
|
-
* the character's conditions. Empty `saves` = every save; recalc keeps one term per `label`. */
|
|
39
26
|
save_bonus_terms: {
|
|
40
27
|
saves: Ability[];
|
|
41
28
|
ability: Ability;
|
|
@@ -43,20 +30,12 @@ export interface FeatureEffectTotals {
|
|
|
43
30
|
inactiveWhile?: "incapacitated" | "unconscious";
|
|
44
31
|
label: string;
|
|
45
32
|
}[];
|
|
46
|
-
/**
|
|
47
|
-
* Half-proficiency terms (Jack of All Trades, Remarkable Athlete). Resolved in recalc against the
|
|
48
|
-
* proficiency bonus, and ONLY for a skill whose effective tri is "none" — that gate is the mechanic
|
|
49
|
-
* ("a skill proficiency you lack"), so it lives at the consumer, not here. Empty `skills` = every skill.
|
|
50
|
-
* recalc takes the MAX across terms, never the sum: "add half your Proficiency Bonus" is one grant, so two
|
|
51
|
-
* features (or a duplicated homebrew note) must not double it.
|
|
52
|
-
*/
|
|
53
33
|
half_proficiency_terms: {
|
|
54
34
|
skills: string[];
|
|
55
35
|
round: "down" | "up";
|
|
56
36
|
label: string;
|
|
57
37
|
}[];
|
|
58
38
|
hp_per_level_bonus: number;
|
|
59
|
-
/** One term per hp-per-level-bonus effect, labeled with the owning feature's name. */
|
|
60
39
|
hp_per_level_terms: {
|
|
61
40
|
label: string;
|
|
62
41
|
value: number;
|
|
@@ -66,95 +45,27 @@ export interface FeatureEffectTotals {
|
|
|
66
45
|
label: string;
|
|
67
46
|
value: number;
|
|
68
47
|
}[];
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
48
|
+
speed_terms: {
|
|
49
|
+
mode: SpeedMode;
|
|
50
|
+
label: string;
|
|
51
|
+
value: number;
|
|
52
|
+
set: boolean;
|
|
53
|
+
condition?: string;
|
|
54
|
+
}[];
|
|
76
55
|
speed_walk_set: number;
|
|
77
|
-
/**
|
|
78
|
-
* Absolute attunement CAP granted by `attunement-limit` effects (the Artificer's Magic Item
|
|
79
|
-
* Adept / Savant / Master line). Max across all grants; 0 = nothing granted it. recalc applies it
|
|
80
|
-
* as Math.max(3, attunement_set) so a grant can never LOWER the baseline, and an explicit
|
|
81
|
-
* `overrides.attunement_limit` on the character still wins outright — a number the player typed is
|
|
82
|
-
* intent, not a derived value. A `scales_at` progression resolves BEFORE the max, at the effect's
|
|
83
|
-
* own source level (R4-G7 §7.3).
|
|
84
|
-
*/
|
|
85
56
|
attunement_set: number;
|
|
86
|
-
/** Flat ability-score bumps from `ability-score-increase` effects whose `abilities` is a FIXED LIST (the three level-20
|
|
87
|
-
* capstones). `chosen` arms are the ASI SLOT's second encoding and MUST NOT fold (the synthesized feat decision pays
|
|
88
|
-
* them; a flat fold double-counts). No cap: `max` is declared and unread (user ruling 2026-09-03). */
|
|
89
57
|
ability_bonus: Partial<Record<Ability, number>>;
|
|
90
|
-
/** Max range per sense type granted by effects; 0 = none for that type. */
|
|
91
58
|
senses: Record<SenseType, number>;
|
|
92
|
-
/** One term per ac-bonus effect, labeled with the owning feature's name. `condition` is the
|
|
93
|
-
* effect's situational qualifier, carried verbatim onto the ACTerm and never evaluated. */
|
|
94
59
|
ac_terms: {
|
|
95
60
|
value: number;
|
|
96
61
|
requires_armor: boolean;
|
|
97
62
|
label: string;
|
|
98
63
|
condition?: string;
|
|
99
64
|
}[];
|
|
100
|
-
/**
|
|
101
|
-
* The four defense buckets a feature effect can grant, as DefenseGrant ENTRIES (R4-G3a §3.2.1).
|
|
102
|
-
* Deduped by value case-insensitively, first spelling wins, trimmed · exactly the contract
|
|
103
|
-
* `pushUnique` had when these were `string[]` · but the SECOND granting feature's NAME is merged
|
|
104
|
-
* into `sources` rather than discarded. `immunity` and `vulnerability` fold REGARDLESS of
|
|
105
|
-
* `condition` (following `resistance`: dropping a real immunity is worse than showing it
|
|
106
|
-
* unqualified); `immune-condition` keeps its `while` skip. Values stay in the AUTHORED spelling ·
|
|
107
|
-
* toDefenseSlug runs in pc.recalc.ts, where composeDefenseEntries turns these into DefenseEntry.
|
|
108
|
-
*/
|
|
109
65
|
resistances: DefenseGrant[];
|
|
110
66
|
immunities: DefenseGrant[];
|
|
111
67
|
vulnerabilities: DefenseGrant[];
|
|
112
68
|
condition_immunities: DefenseGrant[];
|
|
113
|
-
/**
|
|
114
|
-
* skills, tools and languages are canonical slugs (toProfSlug: lowercase, U+2019
|
|
115
|
-
* folded to ASCII, whitespace collapsed to hyphens). armor and weapons entries
|
|
116
|
-
* are only `.toLowerCase()`d, NOT slugified, so an authored value keeps its
|
|
117
|
-
* spaces. recalc folds armor into armor.categories ONLY; it folds every weapons
|
|
118
|
-
* value into weapons.categories and additionally routes a non-category value
|
|
119
|
-
* into weapons.specific. saves are canonical ability keys, and are the one
|
|
120
|
-
* bucket a closed vocabulary genuinely guarantees: normalizeAbility returns null
|
|
121
|
-
* for anything else and the effect is dropped.
|
|
122
|
-
*
|
|
123
|
-
* What is INTENDED and what is ENFORCED differ here, and the gap is silent.
|
|
124
|
-
* INTENDED: skills/tools/languages land on ALL_SKILL_SLUGS / ALL_TOOLS /
|
|
125
|
-
* ALL_LANGUAGES, over which toProfSlug is the identity; armor values are
|
|
126
|
-
* CATEGORY words ("heavy"/"shield"); weapons values are a category word
|
|
127
|
-
* ("simple"/"martial", or an entity-level "martial-melee" form) or an authored
|
|
128
|
-
* weapon NAME. ENFORCED at runtime: nothing. feature-effect-schema's proficiency
|
|
129
|
-
* arm is `value: z.string().min(1)`, an OPEN string, and classifyProficiencyEffect
|
|
130
|
-
* does no membership test. The only guard is
|
|
131
|
-
* tests/srd-canonical/overlay-effect-slugs.test.ts, and it sees OVERLAY-AUTHORED
|
|
132
|
-
* data only · there skill/tool/language are checked against those three lists and
|
|
133
|
-
* weapon against the live gate, while armor and saving-throw are unchecked even
|
|
134
|
-
* there. Vault homebrew reaching this at runtime is checked by nothing.
|
|
135
|
-
*
|
|
136
|
-
* An off-vocabulary value does not crash and does not disappear · it becomes a
|
|
137
|
-
* value that can never coincide with the canonical one. Measured: an authored
|
|
138
|
-
* `{proficiency_type:"tool", value:"Playing Card Set"}` normalizes to
|
|
139
|
-
* "playing-card-set", which is NOT in ALL_TOOLS (that list carries the 2024
|
|
140
|
-
* spelling "playing-cards"). It still folds, and still renders as its own row
|
|
141
|
-
* labeled "Playing Card Set", but everything keyed on the canonical slug · the
|
|
142
|
-
* first-seen-wins dedupe in computeEffectiveProficiencies, an
|
|
143
|
-
* `overrides.tools.remove` suppression, the builder's already-satisfied
|
|
144
|
-
* exclusion · misses it, so the character ends up able to hold both.
|
|
145
|
-
*
|
|
146
|
-
* `skillExpertise` is NOT a seventh bucket · it is a SUBSET of `skills`, in the
|
|
147
|
-
* same canonical slug form, carrying the values whose effect set
|
|
148
|
-
* `expertise: true`. An expertise skill is pushed to BOTH, so every consumer
|
|
149
|
-
* that only knows about proficiency keeps working and recalc's `expSet` gains
|
|
150
|
-
* one source. SKILLS ONLY (spec §7.2): a tool or language effect carrying
|
|
151
|
-
* `expertise: true` folds as a plain proficiency and never lands here. It is
|
|
152
|
-
* not lost · since R4-G4 §9.2 the authored flag travels the GRANT channel
|
|
153
|
-
* instead (`EffectProficiencyGrant.expertise` -> `ProficiencyGrant.expertise`
|
|
154
|
-
* -> `ProficiencyEntry.expertise`), which is the channel the sheet panel and
|
|
155
|
-
* the proficiency modal read. Routing it here as well would put a value in the
|
|
156
|
-
* skill-expertise set that no skill key can ever match.
|
|
157
|
-
*/
|
|
158
69
|
proficiencies: {
|
|
159
70
|
skills: string[];
|
|
160
71
|
skillExpertise: string[];
|
|
@@ -164,159 +75,40 @@ export interface FeatureEffectTotals {
|
|
|
164
75
|
armor: string[];
|
|
165
76
|
weapons: string[];
|
|
166
77
|
};
|
|
167
|
-
/**
|
|
168
|
-
* Melee-attack ability overrides (Hexblade "Lies", MCDM Illrigger scoped
|
|
169
|
-
* "Lies", etc.), in fold order. Each carries an optional `weaponSlugs` scope
|
|
170
|
-
* (bare slugs) — absent/empty = GLOBAL (every melee weapon). The
|
|
171
|
-
* `"spellcasting"` sentinel is excluded here (no caster context in the fold);
|
|
172
|
-
* recalc resolves it and prepends the resolved global so it wins over concrete
|
|
173
|
-
* globals. recalc threads this list into attack computation, where a
|
|
174
|
-
* scoped-match wins over a global for the matching weapon. [] = no override.
|
|
175
|
-
*/
|
|
176
78
|
weaponAbilities: WeaponAbilityOverride[];
|
|
177
|
-
/**
|
|
178
|
-
* Order-preserving list of structured advantage/disadvantage entries from
|
|
179
|
-
* `roll-modifier` effects. Pass-through (no dedupe/merge); each entry is
|
|
180
|
-
* labeled with the owning feature's name.
|
|
181
|
-
*/
|
|
182
79
|
rollModifiers: RollModifierEntry[];
|
|
183
|
-
/**
|
|
184
|
-
* Order-preserving list of `save-outcome` entries (R4-G3a §5.3), labeled with the owning
|
|
185
|
-
* feature's name. Pass-through (no dedupe/merge); `ability: "any"` becomes an ABSENT ability,
|
|
186
|
-
* which the save chip reads as "every save".
|
|
187
|
-
*/
|
|
188
80
|
saveOutcomes: SaveOutcomeEntry[];
|
|
189
|
-
/**
|
|
190
|
-
* Lowest weapon-attack crit threshold (natural roll that scores a critical
|
|
191
|
-
* hit) granted by `crit-range` effects. Folds via Math.min from init 20, so
|
|
192
|
-
* 20 = no expansion. spell-only (`applies_to:"spell"`) entries do NOT lower
|
|
193
|
-
* it. recalc maps this onto each AttackRow as `critRange` only when < 20.
|
|
194
|
-
*/
|
|
195
81
|
critRange: number;
|
|
196
|
-
|
|
197
|
-
* Max EXTRA attacks per Attack action granted by `extra-attack` effects, never the total:
|
|
198
|
-
* Non-stacking (D&D Extra Attack features don't stack): folds via Math.max
|
|
199
|
-
* from init 0, so 0 = no extra attacks. recalc maps this onto
|
|
200
|
-
* DerivedStats.attacksPerAction as `1 + extraAttack`.
|
|
201
|
-
* A `scales_at` progression resolves BEFORE the max, at the effect's own source level (R4-G7 §7.3).
|
|
202
|
-
*/
|
|
82
|
+
conditionalCrits: ConditionalCrit[];
|
|
203
83
|
extraAttack: number;
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
* non-empty, so untouched attack rows keep `attackNotes: undefined`.
|
|
209
|
-
*/
|
|
84
|
+
scopedExtraAttacks: Array<{
|
|
85
|
+
count: number;
|
|
86
|
+
scope: WeaponScope[];
|
|
87
|
+
}>;
|
|
210
88
|
attackNotes: string[];
|
|
211
|
-
/**
|
|
212
|
-
* Additive on-hit damage riders from `damage-bonus` effects with
|
|
213
|
-
* `applies_to` weapon/all (spell-only ignored — no spell surface). Each is
|
|
214
|
-
* labeled with the owning feature's name. recalc merges these onto every
|
|
215
|
-
* weapon AttackRow's `damageRiders`.
|
|
216
|
-
*/
|
|
217
89
|
damageBonuses: DamageRider[];
|
|
90
|
+
spellDamageBonuses: SpellDamageRider[];
|
|
218
91
|
}
|
|
219
92
|
export declare function emptyFeatureEffectTotals(): FeatureEffectTotals;
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
* ids/slugs (from Character.state.active_buffs + selected pool boons). An
|
|
223
|
-
* `activatable` feature's effects fold ONLY while its id is in this set; a buff
|
|
224
|
-
* is OFF by default, so callers passing no opts see activatable features fold to
|
|
225
|
-
* nothing (correct — a buff is off until toggled). Non-activatable features fold
|
|
226
|
-
* unconditionally regardless of opts.
|
|
227
|
-
*
|
|
228
|
-
* R4-G7 §7.3: `levelFor` answers "at what level does an effect from THIS source resolve", which is the rule
|
|
229
|
-
* `resourceLevelFor` (pc.resources.ts) already applies to a resource's own `scales_at`: the character's level
|
|
230
|
-
* in the granting class for a `class` source, the level in the class owning the subclass for a `subclass`
|
|
231
|
-
* source, the total level otherwise. Both production callers pass exactly that (dnd5e `pc.recalc.ts` and the
|
|
232
|
-
* plugin's builder `abilities-step.ts`); a caller that passes none leaves every `scales_at` unresolved and
|
|
233
|
-
* every effect at its BASE value, which is what a fixture with no character behind it should read.
|
|
234
|
-
*/
|
|
93
|
+
export declare function pushDefenseGrant(list: DefenseGrant[], value: string, source: string, condition?: string, item?: DefenseItemSource): void;
|
|
94
|
+
export declare function mergeDefenseItems(into: DefenseItemSource[], from: readonly DefenseItemSource[]): void;
|
|
235
95
|
export interface FeatureEffectsOpts {
|
|
236
96
|
activeBuffs?: Set<string>;
|
|
237
97
|
levelFor?: (source: FeatureSource) => number;
|
|
238
|
-
/** RG: the DICE cell (`1d6`) of column `column` in the table of the class that owns `source`, at `level`; null when that
|
|
239
|
-
* table has no such dice cell. recalc passes it; a caller that passes none leaves every rider at its authored amount. */
|
|
240
98
|
tableDiceFor?: (source: FeatureSource, column: string, level: number) => string | null;
|
|
241
99
|
}
|
|
242
|
-
/** Does this feature's effects fold right now? An activatable feature folds ONLY
|
|
243
|
-
* while its id is in the active set; a buff is off until toggled. Shared by
|
|
244
|
-
* computeFeatureEffects and the display-side proficiency collector so the fold
|
|
245
|
-
* and the display can never disagree about boons (spec fence F3). */
|
|
246
100
|
export declare function foldsNow(rf: ResolvedFeature, activeBuffs: Set<string>): boolean;
|
|
247
|
-
/** The ONE assembly of everything whose effects fold: authored features plus
|
|
248
|
-
* pool-granted and pool-selected boons, with the active-buff set.
|
|
249
|
-
*
|
|
250
|
-
* Returning BOTH halves is load-bearing: a caller handed only the feature list
|
|
251
|
-
* would drop activeBuffs and computeFeatureEffects would skip every activatable
|
|
252
|
-
* boon · exactly the display/gate divergence this helper exists to close.
|
|
253
|
-
*
|
|
254
|
-
* The guards defend against CAST-BUILT FIXTURES, not against the type: `features`,
|
|
255
|
-
* `pools` and `state` are all non-optional on ResolvedCharacter, but `tests/` is
|
|
256
|
-
* typechecked by nothing. Only fixtures that actually reach this function count,
|
|
257
|
-
* and today that is THREE entry points: recalc, the display-side walk
|
|
258
|
-
* (computeEffectiveProficiencies → collectProficiencyGrants), and this
|
|
259
|
-
* function's own direct tests. All three guards are LIVE. Counts below were
|
|
260
|
-
* measured by deleting each guard and running the suite · re-derive them the
|
|
261
|
-
* same way rather than trusting the numbers, which drift as tests are added:
|
|
262
|
-
* · `pools ?? []` is exercised by `emptyResolved()` in
|
|
263
|
-
* tests/pc-recalc-feature-effects.test.ts, which omits pools and IS fed to
|
|
264
|
-
* recalc, and by `dwarf()` in tests/pc-proficiency-effective.test.ts. This
|
|
265
|
-
* guard predates the extraction; it was already here. Deleting it: 149 tests
|
|
266
|
-
* red across 13 files.
|
|
267
|
-
* · `state?.` is exercised by the "survives a cast-built fixture with no pools
|
|
268
|
-
* and no state" case in tests/pc-feature-effects.test.ts, which calls this
|
|
269
|
-
* function directly with `{ features: [...] } as never`, and again by
|
|
270
|
-
* `dwarf()`. Deleting it: 11 red across 2 files.
|
|
271
|
-
* · `features ?? []` is exercised by `dwarf()` in
|
|
272
|
-
* tests/pc-proficiency-effective.test.ts, which omits `features` and reaches
|
|
273
|
-
* here through the display walk. Deleting it: 7 red, all in that file.
|
|
274
|
-
* ⚠️ This bullet used to read "NOT exercised today, and is the one kept
|
|
275
|
-
* purely for the display-side callers". That was TRUE when written and was
|
|
276
|
-
* falsified LATER IN THIS SAME PHASE by the tasks that wired the display
|
|
277
|
-
* path, because nobody re-read it. A guard's own justification is the thing
|
|
278
|
-
* most likely to go stale under you · re-run the deletion before restating
|
|
279
|
-
* any of these three.
|
|
280
|
-
* Do not "simplify" any of the three away. */
|
|
281
101
|
export declare function assembleEffectFeatures(resolved: ResolvedCharacter): {
|
|
282
102
|
features: ResolvedFeature[];
|
|
283
103
|
activeBuffs: Set<string>;
|
|
284
104
|
};
|
|
285
|
-
/** Spec R4-G1a D2. Whether an effect changes the character it is written on. `subject` is absent on every SRD
|
|
286
|
-
* effect (=== "self"); the converter emits "self" today and will emit other creatures later (Hound of Ill Omen
|
|
287
|
-
* imposes disadvantage on a TARGET). A non-self effect never folds onto the PC: not here, not in
|
|
288
|
-
* collectProficiencyEffectGrants, not in unarmoredACBreakdown, not in recalc's weapon-ability scan. Its FEATURE
|
|
289
|
-
* still resolves and renders (it is not buildOnly); R4-G3a §4 gives it a row-local caption.
|
|
290
|
-
*
|
|
291
|
-
* R4-G3a §4.4: a subject that is neither absent nor "self" warns ONCE per distinct subject string
|
|
292
|
-
* (`warnOnce`, keyed on the subject). The converter's vocabulary here is open, so an unexpected
|
|
293
|
-
* spelling ("Self", "target creature") silently stops folding today; the warning names it without
|
|
294
|
-
* changing the answer. Never a refusal: the return value is unchanged. */
|
|
295
105
|
export declare function foldsOnSelf(eff: {
|
|
296
106
|
subject?: string;
|
|
297
107
|
}): boolean;
|
|
298
|
-
/** The effects of a feature that fold on the character: every reader of `feature.effects` for a derived stat goes through this. */
|
|
299
108
|
export declare function selfEffectsOf(f: {
|
|
300
109
|
effects?: FeatureEffect[];
|
|
301
110
|
}): FeatureEffect[];
|
|
302
111
|
export declare function computeFeatureEffects(features: ResolvedFeature[], opts?: FeatureEffectsOpts): FeatureEffectTotals;
|
|
303
|
-
/** The ONE interpreter of `kind: "proficiency"` effects (spec fence F3).
|
|
304
|
-
*
|
|
305
|
-
* Two consumers with different needs, so the return carries BOTH forms:
|
|
306
|
-
* `applyEffect` pushes `value` (normalized) into FeatureEffectTotals, while the
|
|
307
|
-
* display collector reads `raw` for armor/weapons · composeGrantEntries stores
|
|
308
|
-
* the raw authored string as ProficiencyEntry.value (spec §4.8 #1) and computes
|
|
309
|
-
* its dedupe key separately. Tools/languages read `value`.
|
|
310
|
-
*
|
|
311
|
-
* `saves` is discriminated because FeatureEffectTotals.proficiencies.saves is
|
|
312
|
-
* Ability[], not string[] (fence F1). A null return means "not a proficiency
|
|
313
|
-
* effect, or an unresolvable ability".
|
|
314
|
-
*
|
|
315
|
-
* `expertise` is REQUIRED and always a boolean, never absent: the authored key
|
|
316
|
-
* is optional, so folding it here once means no consumer has to tell
|
|
317
|
-
* `undefined` from `false`. It is reported for EVERY bucket · deciding that
|
|
318
|
-
* only skills act on it belongs to the fold (spec §7.2), not to the
|
|
319
|
-
* classification. */
|
|
320
112
|
export type ProficiencyClassification = {
|
|
321
113
|
bucket: "skills" | "tools" | "languages" | "armor" | "weapons";
|
|
322
114
|
value: string;
|
|
@@ -329,56 +121,12 @@ export type ProficiencyClassification = {
|
|
|
329
121
|
expertise: boolean;
|
|
330
122
|
};
|
|
331
123
|
export declare function classifyProficiencyEffect(eff: FeatureEffect): ProficiencyClassification | null;
|
|
332
|
-
/** One proficiency an effect grants, tagged with the source it came from.
|
|
333
|
-
*
|
|
334
|
-
* BOTH forms are carried because the two display consumers need different ones
|
|
335
|
-
* and, since the tool/language canonicalization landed, they no longer coincide:
|
|
336
|
-
* armor/weapons read `raw` (composeGrantEntries stores the raw authored string
|
|
337
|
-
* as ProficiencyEntry.value and keys its dedupe on toProfSlug separately), while
|
|
338
|
-
* tools/languages read `value`, the canonical slug the effective-proficiency
|
|
339
|
-
* matcher matches its vocabulary and suppressions on. Reaching for the wrong
|
|
340
|
-
* field is silently wrong, not harmlessly identical.
|
|
341
|
-
*
|
|
342
|
-
* `sourceSlug` is the source's slug VERBATIM (namespace and all), because the
|
|
343
|
-
* consumer resolves it against the resolved character's entities to get a
|
|
344
|
-
* display name. */
|
|
345
124
|
export interface EffectProficiencyGrant {
|
|
346
125
|
value: string;
|
|
347
126
|
raw: string;
|
|
348
127
|
sourceKind: FeatureSource["kind"];
|
|
349
128
|
sourceSlug: string;
|
|
350
|
-
/**
|
|
351
|
-
* Set (to `true`) only when the granting effect carried `expertise: true`, and
|
|
352
|
-
* ABSENT otherwise, so a plain grant keeps the exact four-key shape the two
|
|
353
|
-
* display consumers already read. Reported for every bucket, unlike the fold,
|
|
354
|
-
* which routes skills only (spec §7.2). CONSUMED since R4-G4 §9.2 by
|
|
355
|
-
* `toGrants` in pc.proficiency-grants.ts, which spreads it onto
|
|
356
|
-
* `ProficiencyGrant` for every bucket; the tools display is the one reader
|
|
357
|
-
* today, and it reads this rather than re-deriving it from the raw effects.
|
|
358
|
-
*/
|
|
359
129
|
expertise?: boolean;
|
|
360
130
|
}
|
|
361
131
|
export type EffectProficiencyGrants = Record<"skills" | "tools" | "languages" | "saves" | "armor" | "weapons", EffectProficiencyGrant[]>;
|
|
362
|
-
/** Every proficiency an effect grants, tagged with the FeatureSource it came from.
|
|
363
|
-
*
|
|
364
|
-
* Deliberately NOT deduped: composeGrantEntries collects distinct SOURCES per
|
|
365
|
-
* value, so collapsing on value alone here would silently drop the second
|
|
366
|
-
* granting entity and blank half the provenance.
|
|
367
|
-
*
|
|
368
|
-
* `skills` and `saves` are collected because classifyProficiencyEffect's bucket
|
|
369
|
-
* union has SIX members and this function indexes the record by it · drop either
|
|
370
|
-
* key and `out[c.bucket].push(...)` is a type error, and a hand-built record
|
|
371
|
-
* missing one crashes on the first such effect. They have NO display consumer:
|
|
372
|
-
* effect-granted skills already reach the sheet via recalc's skill union and
|
|
373
|
-
* saves via its save set, and the Proficiencies panel has only four rows. No
|
|
374
|
-
* test asserts either bucket, and `toGrants` in pc.proficiency-grants.ts reads
|
|
375
|
-
* only the other four. That is deliberate, not an oversight.
|
|
376
|
-
*
|
|
377
|
-
* Reads the same three rules as the fold, and NOTHING else: foldsNow decides
|
|
378
|
-
* what is active, selfEffectsOf decides whose numbers an effect changes and
|
|
379
|
-
* classifyProficiencyEffect decides what a proficiency effect means (spec fence
|
|
380
|
-
* F3), so the display can never disagree with the engine.
|
|
381
|
-
*
|
|
382
|
-
* Reads only effects that fold on self (`selfEffectsOf`), the same predicate as
|
|
383
|
-
* the fold, so a non-self proficiency is neither granted nor displayed. */
|
|
384
132
|
export declare function collectProficiencyEffectGrants(features: ResolvedFeature[], activeBuffs: Set<string>): EffectProficiencyGrants;
|
|
@@ -1,26 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
assembleEffectFeatures,
|
|
3
|
-
classifyProficiencyEffect,
|
|
4
|
-
collectProficiencyEffectGrants,
|
|
5
|
-
computeFeatureEffects,
|
|
6
|
-
emptyFeatureEffectTotals,
|
|
7
|
-
foldsNow,
|
|
8
|
-
foldsOnSelf,
|
|
9
|
-
selfEffectsOf
|
|
10
|
-
} from "../chunk-TULQ4FFX.js";
|
|
11
|
-
import "../chunk-TOM66P2P.js";
|
|
12
|
-
import "../chunk-KU3YLF6D.js";
|
|
13
|
-
import "../chunk-RLGQ5PZZ.js";
|
|
14
|
-
import "../chunk-LVQLWRCU.js";
|
|
15
|
-
import "../chunk-ZCTUYGNV.js";
|
|
16
|
-
import "../chunk-WELIKLZF.js";
|
|
17
|
-
export {
|
|
18
|
-
assembleEffectFeatures,
|
|
19
|
-
classifyProficiencyEffect,
|
|
20
|
-
collectProficiencyEffectGrants,
|
|
21
|
-
computeFeatureEffects,
|
|
22
|
-
emptyFeatureEffectTotals,
|
|
23
|
-
foldsNow,
|
|
24
|
-
foldsOnSelf,
|
|
25
|
-
selfEffectsOf
|
|
26
|
-
};
|
|
1
|
+
import{assembleEffectFeatures,classifyProficiencyEffect,collectProficiencyEffectGrants,computeFeatureEffects,emptyFeatureEffectTotals,foldsNow,foldsOnSelf,mergeDefenseItems,pushDefenseGrant,selfEffectsOf}from"../chunk-HCK6IUB3.js";import"../chunk-FOLHTMSC.js";import"../chunk-4JEF3CET.js";import"../chunk-VTQ4RWEG.js";import"../chunk-QBA757AU.js";import"../chunk-DY6FVAGA.js";import"../chunk-CMIEZQL4.js";import"../chunk-BGX36NPE.js";import"../chunk-O776WL7O.js";import"../chunk-DVUXUIPV.js";import"../chunk-YGH7S5ZF.js";import"../chunk-4IAMSRHD.js";import"../chunk-3QQOATV3.js";import"../chunk-DZITM5AG.js";import"../chunk-PZ4L2EEG.js";import"../chunk-QMEKQTUT.js";import"../chunk-63YJPWTM.js";import"../chunk-BREHZNTL.js";import"../chunk-7FPQJDFD.js";import"../chunk-EVT7MGAC.js";export{assembleEffectFeatures,classifyProficiencyEffect,collectProficiencyEffectGrants,computeFeatureEffects,emptyFeatureEffectTotals,foldsNow,foldsOnSelf,mergeDefenseItems,pushDefenseGrant,selfEffectsOf};
|
|
@@ -1,11 +1 @@
|
|
|
1
|
-
|
|
2
|
-
function buildFormulaContext(resolved, derived, registry) {
|
|
3
|
-
return {
|
|
4
|
-
abilities: resolved.definition.abilities,
|
|
5
|
-
proficiencyBonus: derived.proficiencyBonus,
|
|
6
|
-
compendium: registry
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
export {
|
|
10
|
-
buildFormulaContext
|
|
11
|
-
};
|
|
1
|
+
function buildFormulaContext(resolved,derived,registry){return{abilities:resolved.definition.abilities,proficiencyBonus:derived.proficiencyBonus,compendium:registry}}export{buildFormulaContext};
|
|
@@ -5,7 +5,6 @@ import type { ArmorEntity } from "../armor/armor.types.js";
|
|
|
5
5
|
import type { WeaponEntity } from "../weapon/weapon.types.js";
|
|
6
6
|
import type { ItemEntity } from "../item/item.types.js";
|
|
7
7
|
import type { Character, EquipmentEntry, ResolvedCharacter } from "./pc.types.js";
|
|
8
|
-
/** The known-counter word (spec §4.5): the pool's `count.label`, else "Known". Applied at read, never a zod default. */
|
|
9
8
|
export declare function poolCountLabel(pool: {
|
|
10
9
|
countLabel?: string;
|
|
11
10
|
}): string;
|
|
@@ -17,30 +16,22 @@ export interface PoolActiveWords {
|
|
|
17
16
|
createLabel: string;
|
|
18
17
|
createVerb: string;
|
|
19
18
|
}
|
|
20
|
-
/** The at-once counter's words (spec §4.5), defaults applied at read; null when the pool declares no `active`. */
|
|
21
19
|
export declare function poolActiveWords(pool: {
|
|
22
20
|
active?: PoolActive;
|
|
23
21
|
}): PoolActiveWords | null;
|
|
24
|
-
/** A stored pick split on its FIRST '#' (spec §4.4): `<note slug>#<param>` is a copy of a repeatable note. */
|
|
25
22
|
export declare function parsePickKey(stored: string): {
|
|
26
23
|
slugPart: string;
|
|
27
24
|
param: string | null;
|
|
28
25
|
};
|
|
29
|
-
/** The comparison key (spec §4.4): `bare(note)#param` for a copy of a repeatable note, `bare(note)` for any other pick. */
|
|
30
26
|
export declare function normalizedPickKey(stored: string, repeatable: boolean): string;
|
|
31
|
-
/** A marker's `by`, normalized the same way: a copy when it holds '#'. */
|
|
32
27
|
export declare function markerKey(by: string): string;
|
|
33
|
-
/** Derived, never authored (spec §4.1): a member that infuses an object, or a repeatable member whose rows create items. */
|
|
34
28
|
export declare function isItemBound(note: Pick<OptionalFeatureEntity, "infuse" | "repeatable" | "options">): boolean;
|
|
35
29
|
export type OptionStatus = "ok" | "needs-choice" | "not-installed" | "level" | "invalid";
|
|
36
|
-
/** A copy's resolved option (spec §4.6): its row, the resolved item's FULL slug (a `learn` copy, or a `create` copy's
|
|
37
|
-
* `item` row), and its status. */
|
|
38
30
|
export interface CopyOption {
|
|
39
31
|
row: OptionRow | null;
|
|
40
32
|
item?: string;
|
|
41
33
|
status: OptionStatus;
|
|
42
34
|
}
|
|
43
|
-
/** The registry subset option resolution reads (structurally `PoolRegistry` and `DecisionRegistry`). */
|
|
44
35
|
export interface ItemLookup {
|
|
45
36
|
search(q: string, t: string, n: number): RegisteredEntity[];
|
|
46
37
|
getByTypeAndSlug(t: string, s: string): RegisteredEntity | undefined;
|
|
@@ -50,9 +41,6 @@ export interface CandidateOptions {
|
|
|
50
41
|
isEntityVisible?: (e: RegisteredEntity) => boolean;
|
|
51
42
|
exclude?: readonly string[];
|
|
52
43
|
}
|
|
53
|
-
/** One option row as the pickers read it (R20): `candidates` are VISIBLE full slugs in the §5.8 order (U-A). PT (spec §4,
|
|
54
|
-
* §6.5): `type` and `rarity` (lower-case) name the row's item, read from its first candidate (else its first installed
|
|
55
|
-
* item, visible or not), a `filter` row from its filter; `charges` are that item's own; null when nothing says. */
|
|
56
44
|
export interface ResolvedOptionRow {
|
|
57
45
|
key: string;
|
|
58
46
|
name: string;
|
|
@@ -68,31 +56,21 @@ export interface ResolvedOptionRow {
|
|
|
68
56
|
recharge?: string;
|
|
69
57
|
} | null;
|
|
70
58
|
}
|
|
71
|
-
/** The per-copy picker's data for one repeatable member of a pool (spec §5.1, R20). */
|
|
72
59
|
export interface RepeatableMember {
|
|
73
60
|
noteSlug: string;
|
|
74
61
|
itemChoice: "learn" | "create";
|
|
75
62
|
rows: ResolvedOptionRow[];
|
|
76
63
|
}
|
|
77
|
-
/** The picker list for a row (spec §5.8, U-A): VISIBLE notes only, the character's edition first, the SRD books before
|
|
78
|
-
* importer books, then the full slug; one per bare slug; rows already replicated (by name or bare slug) left out. */
|
|
79
64
|
export declare function optionCandidates(row: OptionRow, registry: ItemLookup, opts?: CandidateOptions): string[];
|
|
80
|
-
/** Every row of a repeatable note as the pickers read it (R20): its candidates, and whether its items are installed,
|
|
81
|
-
* installed only in hidden books (absent from every list, U-A), or not installed at all. */
|
|
82
65
|
export declare function resolveOptionRows(note: Pick<OptionalFeatureEntity, "options">, registry: ItemLookup, opts?: CandidateOptions): ResolvedOptionRow[];
|
|
83
|
-
/** A copy's option (spec §5.8): validation by row identity, BLIND to visibility (Gate 1 C3, U-A). A `learn` param passes
|
|
84
|
-
* through the retired-item map first; the stored key is never rewritten (Gate 1 m5). `edition` orders the installed
|
|
85
|
-
* notes a `create` copy's `item` row falls back to when the row's own slug is not installed. */
|
|
86
66
|
export declare function resolveCopyOption(note: OptionalFeatureEntity, param: string | null, ctx: {
|
|
87
67
|
classLevel: number;
|
|
88
68
|
registry: ItemLookup;
|
|
89
69
|
edition?: string;
|
|
90
70
|
}): CopyOption;
|
|
91
|
-
/** One marked equipment entry's view (spec §4.6). The DISPLAY identity is not stored: it is the entry's own resolution. */
|
|
92
71
|
export interface EntryView {
|
|
93
72
|
index: number;
|
|
94
73
|
kind: "infused" | "created";
|
|
95
|
-
/** The RULE entity (spec §5.4): the wrapper (infused) or the real item (created); null for an orphan or duplicate created entry. */
|
|
96
74
|
entity: ArmorEntity | WeaponEntity | ItemEntity | null;
|
|
97
75
|
entityType: string | null;
|
|
98
76
|
key: string;
|
|
@@ -101,7 +79,6 @@ export interface EntryView {
|
|
|
101
79
|
classIndex: number;
|
|
102
80
|
noteSlug: string;
|
|
103
81
|
noteName: string;
|
|
104
|
-
/** The infusing or creating member's name (ART-c's sub-line part reads it). */
|
|
105
82
|
sourceLabel: string;
|
|
106
83
|
}
|
|
107
84
|
export interface InfusionCounter {
|
|
@@ -119,44 +96,25 @@ export interface InfusionContext {
|
|
|
119
96
|
reason: InfusionFlagReason;
|
|
120
97
|
}>;
|
|
121
98
|
}
|
|
122
|
-
/** The overlay at the OWNING class level (spec §5.3 "Scaling"): `scales_at` rows at or below it replace keys, in level order. */
|
|
123
99
|
export declare function scaledInfuseItem(infuse: InfuseBlock, classLevel: number): InfuseItem;
|
|
124
|
-
/** The RULE entity of an equipment entry (spec §5.4): its view when it has one (null for an orphan or duplicate created
|
|
125
|
-
* entry), else the entry's own resolution. The ONE resolver every dnd5e fold reads (grep gate). `infusions` is the
|
|
126
|
-
* character's context, or ONE view (an entry-level helper's caller holds just that entry's view), or nothing. */
|
|
127
100
|
export declare function resolveEntryEntity(entry: EquipmentEntry, index: number, registry: EntityRegistry, infusions?: Pick<InfusionContext, "views"> | EntryView | null): {
|
|
128
101
|
entity: ArmorEntity | WeaponEntity | ItemEntity | null;
|
|
129
102
|
entityType: string | null;
|
|
130
103
|
};
|
|
131
|
-
/** Views, counters and flags (spec §5.4). Undefined, at no cost, for a character with no item-bound pool and no marker. */
|
|
132
104
|
export declare function buildInfusionContext(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry): InfusionContext | undefined;
|
|
133
|
-
/** The charge pair's reader (spec §5.5): an infused view's overlay charges live in the MARKER (`infusion.charges.current`,
|
|
134
|
-
* absent = full); anything else is `effectiveItemCharges` (stored, the note's own data, the curated map). */
|
|
135
105
|
export declare function entryCharges(entry: EquipmentEntry, view: EntryView | null | undefined, registry: EntityRegistry | null): {
|
|
136
106
|
current: number;
|
|
137
107
|
max: number;
|
|
138
108
|
} | undefined;
|
|
139
|
-
/** The charge pair's writer (spec §5.5): an infused view whose overlay has charges writes `infusion.charges.current`,
|
|
140
|
-
* clamped to 0..max, and never `state`; any other entry writes `state.charges` as today (`setItemCharges`): the stored
|
|
141
|
-
* max kept, else seeded from the item's own max ({@link effectiveItemCharges}: the note's data, then the curated map),
|
|
142
|
-
* else the new value; `current` clamped to 0..max. Returns a NEW entry. */
|
|
143
109
|
export declare function withEntryCharges(entry: EquipmentEntry, view: EntryView | null | undefined, current: number, registry: EntityRegistry | null): EquipmentEntry;
|
|
144
|
-
/** The reseed predicate (spec §5.7, Gate 0 M2, Gate 1 I10): the Builder's starting-equipment reseed,
|
|
145
|
-
* `setBuilderEquipmentMode` and `finishBuild` never replace, remove or duplicate an entry carrying `infusion`. */
|
|
146
110
|
export declare function isMarkedEntry(entry: EquipmentEntry): boolean;
|
|
147
|
-
/** One object off a stack (spec §5.7, Gate 1 m3): the source keeps qty - 1 and its hand; the new x1 keeps only
|
|
148
|
-
* `item`, `in` and `overrides`, unequipped, so a split never moves a hand slot. */
|
|
149
111
|
export declare function splitOne(equipment: readonly EquipmentEntry[], index: number): EquipmentEntry[];
|
|
150
|
-
/** One ended marker (spec §5.7, R18): `index` is the entry's position in the RETURNED array for an infused end (the
|
|
151
|
-
* entry stays) and -1 for a created one (it is removed); `item` (the entry's link or text) names it for a
|
|
152
|
-
* confirmation. The read-only twins `infusionsEndedByChoice` and `infusionsEndedByClassEdit` give the CURRENT index. */
|
|
153
112
|
export interface EndedEntry {
|
|
154
113
|
index: number;
|
|
155
114
|
key: string;
|
|
156
115
|
kind: "infused" | "created";
|
|
157
116
|
item: string;
|
|
158
117
|
}
|
|
159
|
-
/** A writer's result (spec §5.7): a NEW equipment array and the markers the write ended. */
|
|
160
118
|
export interface EquipmentWrite {
|
|
161
119
|
equipment: EquipmentEntry[];
|
|
162
120
|
ended: EndedEntry[];
|
|
@@ -168,17 +126,7 @@ export type InfusionWrite = ({
|
|
|
168
126
|
ok: false;
|
|
169
127
|
reason: InfuseRefusal;
|
|
170
128
|
};
|
|
171
|
-
/** Ends one marker (spec §5.7, Gate 0 I3). Infused: the marker goes, `attuned` too when the base needs none (the entry's
|
|
172
|
-
* own resolution: arms b, b′ and c never need it, an arm d magic base may). Created: its children move to its own
|
|
173
|
-
* parent (or lose `in` at the top level), then it is removed. Every end path calls this; a marker's charges live in
|
|
174
|
-
* the marker (spec §5.5), so they go with it. */
|
|
175
129
|
export declare function endInfusion(equipment: readonly EquipmentEntry[], index: number, registry: EntityRegistry): EquipmentWrite;
|
|
176
|
-
/** Infuse one object (spec §5.7): refusals in the order `not-owned`, `not-infusing`, `stranded`, `choice-required` /
|
|
177
|
-
* `bad-choice` (a damage type, dnd5e's own list, and one of the note's `choice.options` when it lists them),
|
|
178
|
-
* `no-target`, `marked`, `magic-base` / `target-kind`; a stacked target is split first (`splitOne`) and the new x1 takes
|
|
179
|
-
* the marker; "A new object" is offered for EVERY infusing member (R23); then the same key's other marker and the pool's
|
|
180
|
-
* oldest over the cap end. `seq` is max + 1 over the INPUT equipment (an ended seq is never reused); charges start at the
|
|
181
|
-
* scaled overlay's max. */
|
|
182
130
|
export declare function infuseEntry(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: {
|
|
183
131
|
key: string;
|
|
184
132
|
target: number | {
|
|
@@ -187,11 +135,6 @@ export declare function infuseEntry(character: Character, resolved: ResolvedChar
|
|
|
187
135
|
choice?: string;
|
|
188
136
|
isEntityVisible?: (e: RegisteredEntity) => boolean;
|
|
189
137
|
}): InfusionWrite;
|
|
190
|
-
/** Create one item from a creating copy (spec §5.7): `not-owned`; `not-creating` (not a repeatable member whose rows
|
|
191
|
-
* create items); `stranded` (the note, or its copy's option at `level`); `invalid-item` (any other status, or an item
|
|
192
|
-
* that is not installed or satisfies neither the copy's row nor equals its `option.item`: validation by row identity,
|
|
193
|
-
* §5.8). The same key's created entry and the pool's oldest over the cap end; the new entry is appended unequipped,
|
|
194
|
-
* x1, `kind: created`, with `seq` over the INPUT equipment. */
|
|
195
138
|
export declare function createEntry(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: {
|
|
196
139
|
key: string;
|
|
197
140
|
item: string;
|
|
@@ -202,10 +145,7 @@ type ChoiceEdit = {
|
|
|
202
145
|
choiceKey: string;
|
|
203
146
|
next: readonly string[];
|
|
204
147
|
};
|
|
205
|
-
/** Read-only (U-9): the markers `reconcileChoiceEdit` would end, with their CURRENT indices, for the confirmation. */
|
|
206
148
|
export declare function infusionsEndedByChoice(character: Character, resolved: ResolvedCharacter, _registry: EntityRegistry, req: ChoiceEdit): EndedEntry[];
|
|
207
|
-
/** Un-picking an infusion or a copy ends its markers in the same write (spec §5.7, Gate 0 I4): created items leave by the
|
|
208
|
-
* approved end path. Null when nothing ends. */
|
|
209
149
|
export declare function reconcileChoiceEdit(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: ChoiceEdit): EquipmentWrite | null;
|
|
210
150
|
type ClassEdit = {
|
|
211
151
|
classIndex: number;
|
|
@@ -214,13 +154,8 @@ type ClassEdit = {
|
|
|
214
154
|
classIndex: number;
|
|
215
155
|
subclass: string | null;
|
|
216
156
|
};
|
|
217
|
-
/** Read-only (B-8.2): the markers `reconcileClassEdit` would end, with their CURRENT indices, for the confirmation. */
|
|
218
157
|
export declare function infusionsEndedByClassEdit(character: Character, resolved: ResolvedCharacter, _registry: EntityRegistry, req: ClassEdit): EndedEntry[];
|
|
219
|
-
/** Removing a class or changing its subclass ends the markers it owns in the same write ("when the infusion's source is
|
|
220
|
-
* gone, the item ends like an ended infusion"). Null when nothing ends. */
|
|
221
158
|
export declare function reconcileClassEdit(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: ClassEdit): EquipmentWrite | null;
|
|
222
|
-
/** The Infuse picker's list (spec §5.7): the unmarked entries an owned infusing pick's targets admit, nonmagical, each
|
|
223
|
-
* with `stack` when infusing it splits one object off. */
|
|
224
159
|
export declare function eligibleTargets(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, key: string): Array<{
|
|
225
160
|
index: number;
|
|
226
161
|
stack: boolean;
|