@archivist-gg/dnd5e 0.3.19 → 0.3.26
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-2NUDWOFG.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-4SYAKWY4.js +1 -0
- package/dist/chunk-56JK6VCL.js +1 -0
- package/dist/chunk-5XDCM6YK.js +1 -0
- package/dist/chunk-63YJPWTM.js +1 -0
- package/dist/chunk-6R46KYGU.js +1 -0
- package/dist/chunk-6W253VHH.js +1 -0
- package/dist/chunk-72PRMZRD.js +1 -0
- package/dist/chunk-757KM22B.js +1 -0
- package/dist/chunk-7EL3GWWJ.js +1 -0
- package/dist/chunk-7FPQJDFD.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-BREHZNTL.js +1 -0
- package/dist/chunk-BZ6BGGZS.js +1 -0
- package/dist/chunk-CAPYNIGK.js +1 -0
- package/dist/chunk-CCAVZANF.js +1 -0
- package/dist/chunk-CCFIINBA.js +1 -0
- package/dist/chunk-CEHL7PPC.js +1 -0
- package/dist/chunk-CMIEZQL4.js +1 -0
- package/dist/chunk-CNMHADNV.js +1 -0
- package/dist/chunk-CSTAQQGX.js +1 -0
- package/dist/chunk-DTB7YBMZ.js +1 -0
- package/dist/chunk-DVUXUIPV.js +1 -0
- package/dist/chunk-DZITM5AG.js +1 -0
- package/dist/chunk-E3MS4M3N.js +1 -0
- package/dist/chunk-E7KFJLDR.js +1 -0
- package/dist/chunk-EAARMPCW.js +1 -0
- package/dist/chunk-EPA24PVZ.js +1 -0
- package/dist/chunk-ETDMOGFO.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-GD7WRCNH.js +1 -0
- package/dist/chunk-GGQDQSIF.js +1 -0
- package/dist/chunk-GIQLIBC7.js +1 -0
- package/dist/chunk-HX7WBOKR.js +1 -0
- package/dist/chunk-I26FHSI6.js +1 -0
- package/dist/chunk-IHPLT2ZT.js +1 -0
- package/dist/chunk-J3RP5C7L.js +1 -0
- package/dist/chunk-J5GL6FLP.js +1 -0
- package/dist/chunk-JXDX2DKF.js +1 -0
- package/dist/chunk-KEXSF3CH.js +1 -0
- package/dist/chunk-KM75CC6Q.js +1 -0
- package/dist/chunk-L2DXF7YS.js +1 -0
- package/dist/chunk-LHH5XSEA.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-MGGKZGLG.js +1 -0
- package/dist/chunk-NEMX7QGG.js +1 -0
- package/dist/chunk-NIWLD33X.js +1 -0
- package/dist/chunk-NU2Z7MTS.js +1 -0
- package/dist/chunk-NYPH7RQN.js +1 -0
- package/dist/chunk-NYTR6NJS.js +1 -0
- package/dist/chunk-O2QZ73GA.js +1 -0
- package/dist/chunk-O776WL7O.js +1 -0
- package/dist/chunk-ONCXJMJM.js +1 -0
- package/dist/chunk-OTRH62HY.js +1 -0
- package/dist/chunk-PFQPP77Q.js +1 -0
- package/dist/chunk-PKIMOVQG.js +1 -0
- package/dist/chunk-PZ3ZZ5H5.js +1 -0
- package/dist/chunk-PZ4L2EEG.js +1 -0
- package/dist/chunk-QMEKQTUT.js +1 -0
- package/dist/chunk-QVWT67WA.js +1 -0
- package/dist/chunk-RE5Z5RNK.js +1 -0
- package/dist/chunk-RHIEOYDX.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-SFK57JAA.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-UBUKCRZ3.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-VVJXZZ4Z.js +1 -0
- package/dist/chunk-WAUNLUFQ.js +1 -0
- package/dist/chunk-X22SISGM.js +1 -0
- package/dist/chunk-XKJXT2PN.js +1 -0
- package/dist/chunk-XPF53K54.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/chunk-ZS5BMNXC.js +1 -0
- package/dist/chunk-ZVL5FXXO.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 +4 -3
- 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 +3 -30
- package/dist/dnd/amount-text.js +1 -15
- 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 +0 -15
- package/dist/entities/registry-revision.js +1 -10
- 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 +46 -4
- package/dist/feat/feat.schema.js +1 -10
- package/dist/feat/feat.types.d.ts +0 -6
- package/dist/index.js +45 -141495
- 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 +5 -0
- package/dist/item/item.schema.js +1 -11
- package/dist/item/item.types.d.ts +5 -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 +44 -3
- 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 +0 -24
- package/dist/pc/pc.additional-spells.js +1 -26
- package/dist/pc/pc.amount-bindings.d.ts +3 -28
- package/dist/pc/pc.amount-bindings.js +1 -28
- 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 +6 -145
- package/dist/pc/pc.decision-engine.js +1 -55
- 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 +19 -58
- package/dist/pc/pc.entry-overrides.js +1 -41
- package/dist/pc/pc.equipment.d.ts +2 -22
- package/dist/pc/pc.equipment.js +1 -34
- package/dist/pc/pc.feature-effects.d.ts +27 -281
- package/dist/pc/pc.feature-effects.js +1 -39
- 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 -65
- package/dist/pc/pc.item-effects.d.ts +19 -0
- package/dist/pc/pc.item-effects.js +1 -0
- package/dist/pc/pc.member-choices.d.ts +3 -66
- package/dist/pc/pc.member-choices.js +1 -39
- package/dist/pc/pc.parser.js +1 -58
- package/dist/pc/pc.pools.d.ts +7 -10
- package/dist/pc/pc.pools.js +1 -27
- package/dist/pc/pc.proficiencies.d.ts +0 -40
- package/dist/pc/pc.proficiencies.js +1 -156
- package/dist/pc/pc.proficiency-grants.d.ts +3 -27
- package/dist/pc/pc.proficiency-normalize.d.ts +0 -35
- package/dist/pc/pc.proficiency-normalize.js +1 -18
- 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 +8 -131
- package/dist/pc/pc.recalc.js +1 -1042
- package/dist/pc/pc.resolver.d.ts +9 -107
- package/dist/pc/pc.resolver.js +1 -60
- 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 -231
- package/dist/pc/pc.schema.d.ts +20 -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 +36 -0
- package/dist/pc/pc.spell-scope.d.ts +0 -16
- 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 +3 -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 +59 -374
- 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 +44 -3
- 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 +11 -23
- 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-2LULMQTF.js +0 -14
- package/dist/chunk-3LWMFYKS.js +0 -57
- package/dist/chunk-3SFGWFVQ.js +0 -19
- package/dist/chunk-3SIUAFDQ.js +0 -18
- package/dist/chunk-3TM34RSJ.js +0 -23
- package/dist/chunk-4J6DS3EJ.js +0 -30
- package/dist/chunk-4U55VNC7.js +0 -22
- package/dist/chunk-5GKJAUMX.js +0 -59
- package/dist/chunk-5JXFJ5AU.js +0 -26
- package/dist/chunk-64VNLMSG.js +0 -375
- package/dist/chunk-656QCX4U.js +0 -22
- package/dist/chunk-6GNXYAYP.js +0 -25
- package/dist/chunk-6PXTNCBP.js +0 -133
- package/dist/chunk-6X2NV665.js +0 -33
- package/dist/chunk-7Q2VPKCD.js +0 -181
- package/dist/chunk-7XJHI5H5.js +0 -709
- package/dist/chunk-A54HHCWW.js +0 -67
- package/dist/chunk-B2QHP6UF.js +0 -159
- package/dist/chunk-B3DP42OM.js +0 -55
- package/dist/chunk-BJGOSM76.js +0 -18
- package/dist/chunk-BJWSOQUC.js +0 -133
- package/dist/chunk-CJYCVNW2.js +0 -7
- package/dist/chunk-CM5CWO4K.js +0 -735
- package/dist/chunk-DEEHHLAP.js +0 -271
- package/dist/chunk-DPUJDOKV.js +0 -365
- package/dist/chunk-EJD47JHL.js +0 -1838
- package/dist/chunk-EJP263OP.js +0 -186
- package/dist/chunk-EVMUJYUD.js +0 -195
- package/dist/chunk-EYX4JMAU.js +0 -101
- package/dist/chunk-FC4IGH5Y.js +0 -18
- package/dist/chunk-FJYBLXV7.js +0 -89
- package/dist/chunk-FMUD3LDV.js +0 -19
- package/dist/chunk-FMYWORTP.js +0 -93
- package/dist/chunk-FVXLP7P3.js +0 -18
- package/dist/chunk-G6MHJDVT.js +0 -41
- package/dist/chunk-GVWEFECG.js +0 -18
- package/dist/chunk-HHBD4SQ6.js +0 -24
- package/dist/chunk-HS6FIOLP.js +0 -52
- package/dist/chunk-HY2SRSVM.js +0 -23
- package/dist/chunk-IHE6KVC3.js +0 -13
- package/dist/chunk-IN4M4X7P.js +0 -34
- package/dist/chunk-IUAAXXNO.js +0 -58
- package/dist/chunk-JXWNXIIZ.js +0 -219
- 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-LHZXYFBU.js +0 -94
- package/dist/chunk-LICYHPI3.js +0 -237
- package/dist/chunk-LNT64X7C.js +0 -81
- package/dist/chunk-LSLSG67V.js +0 -31
- package/dist/chunk-LVQLWRCU.js +0 -15
- package/dist/chunk-MYY2C5MB.js +0 -233
- package/dist/chunk-NKZMQV2C.js +0 -19
- package/dist/chunk-NTU2DXNG.js +0 -355
- package/dist/chunk-NXUY5XQN.js +0 -1062
- package/dist/chunk-NZO7M5GV.js +0 -18
- package/dist/chunk-OOL4KMG2.js +0 -71
- package/dist/chunk-OOSRUJBI.js +0 -19
- package/dist/chunk-PDJSUH24.js +0 -110
- package/dist/chunk-PTXBIDG7.js +0 -63
- package/dist/chunk-PVCEA4HZ.js +0 -6
- package/dist/chunk-QA3YCOML.js +0 -101
- package/dist/chunk-QFWQKS3M.js +0 -110
- package/dist/chunk-QS5L5YTJ.js +0 -24
- package/dist/chunk-QYZV2MQA.js +0 -97
- package/dist/chunk-RD2MID3M.js +0 -292
- package/dist/chunk-S3YUXDSC.js +0 -278
- package/dist/chunk-S7REMWW4.js +0 -21
- package/dist/chunk-TOM66P2P.js +0 -38
- package/dist/chunk-TRBGC4ZG.js +0 -112
- package/dist/chunk-UA5KS2PL.js +0 -26
- package/dist/chunk-UJCK5IW4.js +0 -187
- package/dist/chunk-UNYR5GLI.js +0 -23
- package/dist/chunk-UZXG6QSY.js +0 -58
- package/dist/chunk-VN5DLURA.js +0 -158
- package/dist/chunk-VP5TIXDK.js +0 -178
- package/dist/chunk-VPYBK2MG.js +0 -18
- package/dist/chunk-VTTA2ALZ.js +0 -16
- package/dist/chunk-W6GC6OKK.js +0 -16
- package/dist/chunk-WELIKLZF.js +0 -256
- package/dist/chunk-WOHX7YTH.js +0 -165
- 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-XTEFPUSN.js +0 -23
- package/dist/chunk-YBLDE5CG.js +0 -42
- package/dist/chunk-YDGMBMYI.js +0 -25
- package/dist/chunk-YHYTW5QA.js +0 -20
- package/dist/chunk-ZCTUYGNV.js +0 -26
- package/dist/chunk-ZDAEGJH4.js +0 -102
- package/dist/chunk-ZJXSXVFP.js +0 -58
- package/dist/chunk-ZOWKWMD2.js +0 -18
- package/dist/chunk-ZUQW5VBZ.js +0 -89
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const featureEffectSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
3
3
|
kind: z.ZodLiteral<"initiative-bonus">;
|
|
4
|
-
value: z.ZodNumber
|
|
4
|
+
value: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
amount: z.ZodOptional<z.ZodString>;
|
|
5
6
|
condition: z.ZodOptional<z.ZodString>;
|
|
6
7
|
subject: z.ZodOptional<z.ZodString>;
|
|
7
8
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -76,12 +77,29 @@ export declare const featureEffectSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
76
77
|
climb: "climb";
|
|
77
78
|
burrow: "burrow";
|
|
78
79
|
}>;
|
|
79
|
-
value: z.ZodNumber
|
|
80
|
+
value: z.ZodOptional<z.ZodNumber>;
|
|
81
|
+
equal_to: z.ZodOptional<z.ZodLiteral<"walk">>;
|
|
80
82
|
set: z.ZodOptional<z.ZodBoolean>;
|
|
81
83
|
scales_at: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
82
84
|
level: z.ZodNumber;
|
|
83
85
|
value: z.ZodNumber;
|
|
84
86
|
}, z.core.$strip>>>;
|
|
87
|
+
inactive_while: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
|
|
88
|
+
"heavy-armor": "heavy-armor";
|
|
89
|
+
armor: "armor";
|
|
90
|
+
shield: "shield";
|
|
91
|
+
}>, z.ZodArray<z.ZodEnum<{
|
|
92
|
+
"heavy-armor": "heavy-armor";
|
|
93
|
+
armor: "armor";
|
|
94
|
+
shield: "shield";
|
|
95
|
+
}>>]>>;
|
|
96
|
+
condition: z.ZodOptional<z.ZodString>;
|
|
97
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
98
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
99
|
+
kind: z.ZodLiteral<"speed-rule">;
|
|
100
|
+
flag: z.ZodEnum<{
|
|
101
|
+
"ignore-armor-strength": "ignore-armor-strength";
|
|
102
|
+
}>;
|
|
85
103
|
condition: z.ZodOptional<z.ZodString>;
|
|
86
104
|
subject: z.ZodOptional<z.ZodString>;
|
|
87
105
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -128,6 +146,8 @@ export declare const featureEffectSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
128
146
|
unarmed: "unarmed";
|
|
129
147
|
finesse: "finesse";
|
|
130
148
|
thrown: "thrown";
|
|
149
|
+
heavy: "heavy";
|
|
150
|
+
"pact-weapon": "pact-weapon";
|
|
131
151
|
}>, z.ZodArray<z.ZodEnum<{
|
|
132
152
|
weapon: "weapon";
|
|
133
153
|
melee: "melee";
|
|
@@ -135,6 +155,8 @@ export declare const featureEffectSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
135
155
|
unarmed: "unarmed";
|
|
136
156
|
finesse: "finesse";
|
|
137
157
|
thrown: "thrown";
|
|
158
|
+
heavy: "heavy";
|
|
159
|
+
"pact-weapon": "pact-weapon";
|
|
138
160
|
}>>]>>;
|
|
139
161
|
spell_scope: z.ZodOptional<z.ZodObject<{
|
|
140
162
|
list: z.ZodOptional<z.ZodString>;
|
|
@@ -151,11 +173,11 @@ export declare const featureEffectSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
151
173
|
kind: z.ZodLiteral<"proficiency">;
|
|
152
174
|
proficiency_type: z.ZodEnum<{
|
|
153
175
|
weapon: "weapon";
|
|
176
|
+
armor: "armor";
|
|
154
177
|
skill: "skill";
|
|
155
178
|
tool: "tool";
|
|
156
179
|
language: "language";
|
|
157
180
|
"saving-throw": "saving-throw";
|
|
158
|
-
armor: "armor";
|
|
159
181
|
}>;
|
|
160
182
|
value: z.ZodString;
|
|
161
183
|
expertise: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -233,6 +255,25 @@ export declare const featureEffectSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
233
255
|
level: z.ZodNumber;
|
|
234
256
|
count: z.ZodNumber;
|
|
235
257
|
}, z.core.$strip>>>;
|
|
258
|
+
applies_to: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
|
|
259
|
+
weapon: "weapon";
|
|
260
|
+
melee: "melee";
|
|
261
|
+
ranged: "ranged";
|
|
262
|
+
unarmed: "unarmed";
|
|
263
|
+
finesse: "finesse";
|
|
264
|
+
thrown: "thrown";
|
|
265
|
+
heavy: "heavy";
|
|
266
|
+
"pact-weapon": "pact-weapon";
|
|
267
|
+
}>, z.ZodArray<z.ZodEnum<{
|
|
268
|
+
weapon: "weapon";
|
|
269
|
+
melee: "melee";
|
|
270
|
+
ranged: "ranged";
|
|
271
|
+
unarmed: "unarmed";
|
|
272
|
+
finesse: "finesse";
|
|
273
|
+
thrown: "thrown";
|
|
274
|
+
heavy: "heavy";
|
|
275
|
+
"pact-weapon": "pact-weapon";
|
|
276
|
+
}>>]>>;
|
|
236
277
|
condition: z.ZodOptional<z.ZodString>;
|
|
237
278
|
subject: z.ZodOptional<z.ZodString>;
|
|
238
279
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { Feature } from "../types/feature.js";
|
|
3
|
-
/**
|
|
4
|
-
* The feature OBJECT, declared once (R4-G6 §4.2). Typed against the `Feature` interface so a wrong leaf fails
|
|
5
|
-
* `tsc`; exported UN-REFINED for the monster schema, whose name-only authored traits the hand parser accepted.
|
|
6
|
-
* The recursion runs through the REFINED schema so a nested class sub_feature keeps the description-or-entries
|
|
7
|
-
* rule; the refined `featureSchema` below keeps its exported `z.ZodType<unknown>` for every other root.
|
|
8
|
-
*/
|
|
9
3
|
export declare const featureObjectSchema: z.ZodType<Feature>;
|
|
10
4
|
export declare const featureSchema: z.ZodType<unknown>;
|
|
@@ -1,12 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
featureObjectSchema,
|
|
3
|
-
featureSchema
|
|
4
|
-
} from "../chunk-B2QHP6UF.js";
|
|
5
|
-
import "../chunk-WYGD2UGN.js";
|
|
6
|
-
import "../chunk-ZJXSXVFP.js";
|
|
7
|
-
import "../chunk-OOL4KMG2.js";
|
|
8
|
-
import "../chunk-JXWNXIIZ.js";
|
|
9
|
-
export {
|
|
10
|
-
featureObjectSchema,
|
|
11
|
-
featureSchema
|
|
12
|
-
};
|
|
1
|
+
import{featureObjectSchema,featureSchema}from"../chunk-NIWLD33X.js";import"../chunk-ZE46ADXS.js";import"../chunk-CCFIINBA.js";import"../chunk-LHH5XSEA.js";import"../chunk-ZVL5FXXO.js";export{featureObjectSchema,featureSchema};
|
|
@@ -47,6 +47,7 @@ export declare const resourceSchema: z.ZodObject<{
|
|
|
47
47
|
band: "band";
|
|
48
48
|
tab: "tab";
|
|
49
49
|
}>>;
|
|
50
|
+
equivalent_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
50
51
|
recovery: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
51
52
|
id: z.ZodString;
|
|
52
53
|
name: z.ZodString;
|
|
@@ -75,40 +76,6 @@ export declare const resourceSchema: z.ZodObject<{
|
|
|
75
76
|
}>>;
|
|
76
77
|
}, z.core.$strip>>>;
|
|
77
78
|
}, z.core.$strip>;
|
|
78
|
-
/** A feature's / optional feature's resource spend.
|
|
79
|
-
*
|
|
80
|
-
* `amount` is the MINIMUM spend. When `amount_max` is present the spend is a
|
|
81
|
-
* RANGE (`amount` .. `amount_max`). Readers of `consumes.resource`, re-measured
|
|
82
|
-
* 2026-09-05 across both repos' `src` after plugin task T4 landed: the ENGINE still has
|
|
83
|
-
* exactly one, `pc/pc.pools.ts`'s pool vote (R4-G4 §4.2.3, whose owner-aware form T2 shipped;
|
|
84
|
-
* the `consumes.resource` key itself PREDATES T2, measured on `821f80d`), which reads the
|
|
85
|
-
* id to pick `ResolvedPool.resource` and never spends it; the PLUGIN now has SEVEN FUNCTIONS over
|
|
86
|
-
* EIGHT code lines in four files (the unit matters: `grep -rn "consumes\.resource\|consumes?\.resource"
|
|
87
|
-
* packages/obsidian/src` returns NINE lines, one of them docblock prose, and `consumeCost` reads the
|
|
88
|
-
* field on two of the eight). They are: `renderSpendControl` (`components/actions/spend-control.ts`),
|
|
89
|
-
* which SPENDS it; the four row sites that gate that call, `PoolTab.row`, `PoolTab.grantedRow` and
|
|
90
|
-
* `PoolTab.blockCard` (`components/pool-tab.ts`) and `renderBoonRow`
|
|
91
|
-
* (`components/actions/boon-rows.ts`). Their gates, measured 2026-09-05 with `grep -n` on
|
|
92
|
-
* `pool-tab.ts`, are NOT the same test, because their callers differ: `row` is gated on the entry
|
|
93
|
-
* being SELECTED (`renderSpellLike` sends it every available candidate), `blockCard` on the entry
|
|
94
|
-
* being GRANTED OR SELECTED (`renderBlocks` sends it the available candidates, then the stranded
|
|
95
|
-
* picks, then the grants), and `grantedRow` is UNCONDITIONAL because it is reached only by the loop
|
|
96
|
-
* over `pool.grants`, as is `renderBoonRow`, which the plugin's `section-renderer.ts` reaches only
|
|
97
|
-
* with a `kind` of "selected" or "granted". One rule, KNOWN entries only, expressed four ways;
|
|
98
|
-
* `renderFeatureRow` (`components/actions/feature-rows.ts`), whose owner-and-spender rule
|
|
99
|
-
* decides between the row slot, the expand card and no control at all; and `consumeCost`
|
|
100
|
-
* (`components/pool-tab.ts`), the ONE Cost label the row sub-line and the block card now
|
|
101
|
-
* share, which prints the resource's NAME from the index and keeps the raw id only as the
|
|
102
|
-
* fallback for an id the character does not own (it no longer singularizes or capitalizes
|
|
103
|
-
* it). The field IS spent as of R4-G4 T4: §3's control spends `amount` exactly through
|
|
104
|
-
* `CharacterEditState.spendFeatureUse`, the clamped quantity-taking primitive the plugin
|
|
105
|
-
* already had. What R4-G4 does NOT do (§15): the HOW-MUCH UI for a range spend
|
|
106
|
-
* and its validation rule stay G8, and the converter un-withhold that would emit
|
|
107
|
-
* `amount_max` at all is a G7 handoff. So `amount_max` stays DECLARED here only, with
|
|
108
|
-
* zero emitted carriers, and the refine is undefined-safe by construction so the
|
|
109
|
-
* corpus that ships without the key keeps parsing: 294 `Feature.consumes` carriers
|
|
110
|
-
* over 161 documents, plus 70 `OptionalFeature.consumes` documents (R4-G3a §9; an
|
|
111
|
-
* unguarded refine refuses all 231, measured). */
|
|
112
79
|
export declare const resourceConsumptionSchema: z.ZodObject<{
|
|
113
80
|
source: z.ZodOptional<z.ZodEnum<{
|
|
114
81
|
"spell-slots": "spell-slots";
|
|
@@ -1,12 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
actionCostEnum,
|
|
3
|
-
resetTriggerEnum,
|
|
4
|
-
resourceConsumptionSchema,
|
|
5
|
-
resourceSchema
|
|
6
|
-
} from "../chunk-ZJXSXVFP.js";
|
|
7
|
-
export {
|
|
8
|
-
actionCostEnum,
|
|
9
|
-
resetTriggerEnum,
|
|
10
|
-
resourceConsumptionSchema,
|
|
11
|
-
resourceSchema
|
|
12
|
-
};
|
|
1
|
+
import{actionCostEnum,resetTriggerEnum,resourceConsumptionSchema,resourceSchema}from"../chunk-CCFIINBA.js";export{actionCostEnum,resetTriggerEnum,resourceConsumptionSchema,resourceSchema};
|
|
@@ -1,10 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
poolGrantSchema,
|
|
3
|
-
selectionPoolSchema,
|
|
4
|
-
tabDeclSchema
|
|
5
|
-
} from "../chunk-G6MHJDVT.js";
|
|
6
|
-
export {
|
|
7
|
-
poolGrantSchema,
|
|
8
|
-
selectionPoolSchema,
|
|
9
|
-
tabDeclSchema
|
|
10
|
-
};
|
|
1
|
+
import{poolGrantSchema,selectionPoolSchema,tabDeclSchema}from"../chunk-GCYUCIDN.js";export{poolGrantSchema,selectionPoolSchema,tabDeclSchema};
|
|
@@ -1,22 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The ONE reader of a spell's `casting_time` string. Every consumer (the plugin's compact Cast-table label,
|
|
3
|
-
* the add-drawer's filter bucket and its sort rank) goes through here, so a spelling that one of them
|
|
4
|
-
* understands the others understand too. Before this, each kept its own exact-string switch over the bundle's
|
|
5
|
-
* spellings (`action`, `bonus-action`, `1minute`), and they drifted: a converted or AI-generated spell's
|
|
6
|
-
* `1 action` / `10 minute` printed raw in the Cast table, and every vault spell spelled `bonus action`,
|
|
7
|
-
* `1 minute` or `1 hour` filtered as "special".
|
|
8
|
-
*
|
|
9
|
-
* The LEADING token decides. Prose after it (a reaction's trigger, Plant Growth's "or 8 hours") is left for
|
|
10
|
-
* the caller's tooltip and never matched, and the trailing word boundary stops a word that merely starts with
|
|
11
|
-
* a unit (`reactionary`, `bonuses`, `minuteman`) from reading as one. A count is optional and only meaningful
|
|
12
|
-
* for minutes and hours; `bonus` may drop the word `action`, which hand-authored spells do.
|
|
13
|
-
*/
|
|
14
1
|
export type CastingTimeKind = "action" | "bonus" | "reaction" | "time";
|
|
15
2
|
export interface ParsedCastingTime {
|
|
16
3
|
kind: CastingTimeKind;
|
|
17
|
-
/** 1 for the action economy; the stated number of minutes / hours for `time` (1 when omitted). */
|
|
18
4
|
count: number;
|
|
19
|
-
/** Present only for `time`. */
|
|
20
5
|
unit?: "minute" | "hour";
|
|
21
6
|
}
|
|
22
7
|
export declare function parseCastingTime(token: string | undefined): ParsedCastingTime | null;
|
|
@@ -6,10 +6,4 @@ export interface SpellCandidate {
|
|
|
6
6
|
level: number;
|
|
7
7
|
entity: Spell;
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
10
|
-
* Pure spell-picker filter. Enumerates all `spell` entities from the registry
|
|
11
|
-
* (an empty query returns every spell of the type), drops already-known slugs,
|
|
12
|
-
* then applies the name search and — unless `showAll` is set — the class/level
|
|
13
|
-
* gate. Results are sorted by level then name.
|
|
14
|
-
*/
|
|
15
9
|
export declare function classSpellCandidates(registry: EntityRegistry, classSlugs: string[], maxLevel: number, knownSlugs: Set<string>, showAll?: boolean, query?: string): SpellCandidate[];
|
|
@@ -1,45 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
baseClassName
|
|
3
|
-
} from "../chunk-VTTA2ALZ.js";
|
|
4
|
-
|
|
5
|
-
// src/spell/spell.access.ts
|
|
6
|
-
var LISTED_CLASS_NAMES = /* @__PURE__ */ new WeakMap();
|
|
7
|
-
function listedClassNames(registry) {
|
|
8
|
-
const count = registry.count();
|
|
9
|
-
const cached = LISTED_CLASS_NAMES.get(registry);
|
|
10
|
-
if (cached && cached.count === count) return cached.names;
|
|
11
|
-
const names = /* @__PURE__ */ new Set();
|
|
12
|
-
for (const e of registry.search("", "spell", Number.POSITIVE_INFINITY)) {
|
|
13
|
-
const classes = e.data.classes;
|
|
14
|
-
if (!Array.isArray(classes)) continue;
|
|
15
|
-
for (const c of classes) names.add(baseClassName(String(c)));
|
|
16
|
-
}
|
|
17
|
-
LISTED_CLASS_NAMES.set(registry, { count, names });
|
|
18
|
-
return names;
|
|
19
|
-
}
|
|
20
|
-
function classSpellCandidates(registry, classSlugs, maxLevel, knownSlugs, showAll = false, query = "") {
|
|
21
|
-
const all = registry.search(query, "spell", Number.POSITIVE_INFINITY);
|
|
22
|
-
const q = query.toLowerCase();
|
|
23
|
-
const classSet = new Set(classSlugs.map((s) => baseClassName(s)));
|
|
24
|
-
let unlistable = false;
|
|
25
|
-
if (!showAll && classSet.size > 0) {
|
|
26
|
-
const listed = listedClassNames(registry);
|
|
27
|
-
unlistable = [...classSet].some((n) => !listed.has(n));
|
|
28
|
-
}
|
|
29
|
-
return all.filter((e) => !knownSlugs.has(e.slug)).map((e) => {
|
|
30
|
-
var _a;
|
|
31
|
-
const entity = e.data;
|
|
32
|
-
return { slug: e.slug, name: e.name, entity, level: (_a = entity.level) != null ? _a : 0 };
|
|
33
|
-
}).filter((c) => {
|
|
34
|
-
var _a;
|
|
35
|
-
if (q && !c.name.toLowerCase().includes(q)) return false;
|
|
36
|
-
if (showAll) return true;
|
|
37
|
-
if (c.level > maxLevel) return false;
|
|
38
|
-
if (unlistable) return true;
|
|
39
|
-
const classes = ((_a = c.entity.classes) != null ? _a : []).map((x) => baseClassName(x));
|
|
40
|
-
return classes.some((x) => classSet.has(x));
|
|
41
|
-
}).sort((a, b) => a.level - b.level || a.name.localeCompare(b.name));
|
|
42
|
-
}
|
|
43
|
-
export {
|
|
44
|
-
classSpellCandidates
|
|
45
|
-
};
|
|
1
|
+
import{baseClassName}from"../chunk-CAPYNIGK.js";var LISTED_CLASS_NAMES=new WeakMap;function listedClassNames(registry){const count=registry.count();const cached=LISTED_CLASS_NAMES.get(registry);if(cached&&cached.count===count)return cached.names;const names=new Set;for(const e of registry.search("","spell",Number.POSITIVE_INFINITY)){const classes=e.data.classes;if(!Array.isArray(classes))continue;for(const c of classes)names.add(baseClassName(String(c)))}LISTED_CLASS_NAMES.set(registry,{count,names});return names}function classSpellCandidates(registry,classSlugs,maxLevel,knownSlugs,showAll=false,query=""){const all=registry.search(query,"spell",Number.POSITIVE_INFINITY);const q=query.toLowerCase();const classSet=new Set(classSlugs.map(s=>baseClassName(s)));let unlistable=false;if(!showAll&&classSet.size>0){const listed=listedClassNames(registry);unlistable=[...classSet].some(n=>!listed.has(n))}return all.filter(e=>!knownSlugs.has(e.slug)).map(e=>{var _a;const entity=e.data;return{slug:e.slug,name:e.name,entity,level:(_a=entity.level)!=null?_a:0}}).filter(c=>{var _a;if(q&&!c.name.toLowerCase().includes(q))return false;if(showAll)return true;if(c.level>maxLevel)return false;if(unlistable)return true;const classes=((_a=c.entity.classes)!=null?_a:[]).map(x=>baseClassName(x));return classes.some(x=>classSet.has(x))}).sort((a,b)=>a.level-b.level||a.name.localeCompare(b.name))}export{classSpellCandidates};
|
|
@@ -1,9 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
spellCodec
|
|
3
|
-
} from "../chunk-OOSRUJBI.js";
|
|
4
|
-
import "../chunk-7Q2VPKCD.js";
|
|
5
|
-
import "../chunk-ZDAEGJH4.js";
|
|
6
|
-
import "../chunk-UA5KS2PL.js";
|
|
7
|
-
export {
|
|
8
|
-
spellCodec
|
|
9
|
-
};
|
|
1
|
+
import{spellCodec}from"../chunk-XKJXT2PN.js";import"../chunk-4KVVAENP.js";import"../chunk-7EL3GWWJ.js";import"../chunk-I26FHSI6.js";export{spellCodec};
|
|
@@ -1,9 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
enrichSpell
|
|
3
|
-
} from "../chunk-WSVMLNTO.js";
|
|
4
|
-
import "../chunk-DEEHHLAP.js";
|
|
5
|
-
import "../chunk-PDJSUH24.js";
|
|
6
|
-
import "../chunk-WELIKLZF.js";
|
|
7
|
-
export {
|
|
8
|
-
enrichSpell
|
|
9
|
-
};
|
|
1
|
+
import{enrichSpell}from"../chunk-2NUDWOFG.js";import"../chunk-MGGKZGLG.js";import"../chunk-7FPQJDFD.js";import"../chunk-EVT7MGAC.js";export{enrichSpell};
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import type { SpellCandidate } from "./spell.access.js";
|
|
2
2
|
export type CastTimeCat = "action" | "bonus" | "reaction" | "long" | "special";
|
|
3
3
|
export type RangeCat = "self" | "touch" | "ranged" | "special";
|
|
4
|
-
/** Cast-time bucket, read through `parseCastingTime` (the same reader the Cast table's label uses, so the two
|
|
5
|
-
* cannot drift). Minutes/hours fold into "long"; unreadable or absent → "special". */
|
|
6
4
|
export declare function castTimeCategory(token: string | undefined): CastTimeCat;
|
|
7
|
-
/** Range bucket from the human range string. Honest read, documented buckets:
|
|
8
|
-
* "Self…"→self, "Touch…"→touch, "<n> feet|ft"→ranged, else (mile/Sight/…)→special. */
|
|
9
5
|
export declare function rangeCategory(range: string | undefined): RangeCat;
|
|
10
6
|
export type SortKey = "name" | "level" | "time" | "school" | "range" | "damage" | "save" | "source";
|
|
11
7
|
export type SortDir = "asc" | "desc";
|
|
12
8
|
export declare function castTimeRank(token: string | undefined): number;
|
|
13
|
-
/** Numeric sort weight for a range string: Self=0, Touch=1, "<n> feet"=n, else large. */
|
|
14
9
|
export declare function rangeSortValue(range: string | undefined): number;
|
|
15
10
|
export declare function compareCandidates(a: SpellCandidate, b: SpellCandidate, key: SortKey, dir: SortDir): number;
|
|
@@ -1,75 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
parseCastingTime
|
|
3
|
-
} from "../chunk-W6GC6OKK.js";
|
|
4
|
-
|
|
5
|
-
// src/spell/spell.filter.ts
|
|
6
|
-
function castTimeCategory(token) {
|
|
7
|
-
const parsed = parseCastingTime(token);
|
|
8
|
-
if (!parsed) return "special";
|
|
9
|
-
return parsed.kind === "time" ? "long" : parsed.kind;
|
|
10
|
-
}
|
|
11
|
-
function rangeCategory(range) {
|
|
12
|
-
if (!range) return "special";
|
|
13
|
-
if (/^self/i.test(range)) return "self";
|
|
14
|
-
if (/^touch/i.test(range)) return "touch";
|
|
15
|
-
if (/\d+\s*(feet|ft)\b/i.test(range)) return "ranged";
|
|
16
|
-
return "special";
|
|
17
|
-
}
|
|
18
|
-
var CAST_RANK = { action: 0, bonus: 1, reaction: 2, long: 3, special: 4 };
|
|
19
|
-
function castTimeRank(token) {
|
|
20
|
-
return CAST_RANK[castTimeCategory(token)];
|
|
21
|
-
}
|
|
22
|
-
function rangeSortValue(range) {
|
|
23
|
-
if (!range) return 99999;
|
|
24
|
-
if (/^self/i.test(range)) return 0;
|
|
25
|
-
if (/^touch/i.test(range)) return 1;
|
|
26
|
-
const m = range.match(/(\d+)\s*(feet|ft)\b/i);
|
|
27
|
-
return m ? Number(m[1]) : 99999;
|
|
28
|
-
}
|
|
29
|
-
var EDITION_RANK = { "2014": 0, "2024": 1 };
|
|
30
|
-
function cmpMaybe(a, b) {
|
|
31
|
-
if (a && b) return a.localeCompare(b);
|
|
32
|
-
if (a) return -1;
|
|
33
|
-
if (b) return 1;
|
|
34
|
-
return 0;
|
|
35
|
-
}
|
|
36
|
-
function compareCandidates(a, b, key, dir) {
|
|
37
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
38
|
-
const mul = dir === "asc" ? 1 : -1;
|
|
39
|
-
let r = 0;
|
|
40
|
-
switch (key) {
|
|
41
|
-
case "name":
|
|
42
|
-
r = a.name.localeCompare(b.name);
|
|
43
|
-
break;
|
|
44
|
-
case "level":
|
|
45
|
-
r = a.level - b.level;
|
|
46
|
-
break;
|
|
47
|
-
case "time":
|
|
48
|
-
r = castTimeRank(a.entity.casting_time) - castTimeRank(b.entity.casting_time);
|
|
49
|
-
break;
|
|
50
|
-
case "school":
|
|
51
|
-
r = cmpMaybe(a.entity.school, b.entity.school);
|
|
52
|
-
break;
|
|
53
|
-
case "range":
|
|
54
|
-
r = rangeSortValue(a.entity.range) - rangeSortValue(b.entity.range);
|
|
55
|
-
break;
|
|
56
|
-
case "damage":
|
|
57
|
-
r = cmpMaybe((_b = (_a = a.entity.damage) == null ? void 0 : _a.types) == null ? void 0 : _b[0], (_d = (_c = b.entity.damage) == null ? void 0 : _c.types) == null ? void 0 : _d[0]);
|
|
58
|
-
break;
|
|
59
|
-
case "save":
|
|
60
|
-
r = cmpMaybe((_e = a.entity.saving_throw) == null ? void 0 : _e.ability, (_f = b.entity.saving_throw) == null ? void 0 : _f.ability);
|
|
61
|
-
break;
|
|
62
|
-
case "source":
|
|
63
|
-
r = ((_h = EDITION_RANK[(_g = a.entity.edition) != null ? _g : ""]) != null ? _h : 9) - ((_j = EDITION_RANK[(_i = b.entity.edition) != null ? _i : ""]) != null ? _j : 9);
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
if (r === 0 && key !== "name") r = a.name.localeCompare(b.name);
|
|
67
|
-
return r * mul;
|
|
68
|
-
}
|
|
69
|
-
export {
|
|
70
|
-
castTimeCategory,
|
|
71
|
-
castTimeRank,
|
|
72
|
-
compareCandidates,
|
|
73
|
-
rangeCategory,
|
|
74
|
-
rangeSortValue
|
|
75
|
-
};
|
|
1
|
+
import{parseCastingTime}from"../chunk-CMIEZQL4.js";function castTimeCategory(token){const parsed=parseCastingTime(token);if(!parsed)return"special";return parsed.kind==="time"?"long":parsed.kind}function rangeCategory(range){if(!range)return"special";if(/^self/i.test(range))return"self";if(/^touch/i.test(range))return"touch";if(/\d+\s*(feet|ft)\b/i.test(range))return"ranged";return"special"}var CAST_RANK={action:0,bonus:1,reaction:2,long:3,special:4};function castTimeRank(token){return CAST_RANK[castTimeCategory(token)]}function rangeSortValue(range){if(!range)return 99999;if(/^self/i.test(range))return 0;if(/^touch/i.test(range))return 1;const m=range.match(/(\d+)\s*(feet|ft)\b/i);return m?Number(m[1]):99999}var EDITION_RANK={"2014":0,"2024":1};function cmpMaybe(a,b){if(a&&b)return a.localeCompare(b);if(a)return-1;if(b)return 1;return 0}function compareCandidates(a,b,key,dir){var _a,_b,_c,_d,_e,_f,_g,_h,_i,_j;const mul=dir==="asc"?1:-1;let r=0;switch(key){case"name":r=a.name.localeCompare(b.name);break;case"level":r=a.level-b.level;break;case"time":r=castTimeRank(a.entity.casting_time)-castTimeRank(b.entity.casting_time);break;case"school":r=cmpMaybe(a.entity.school,b.entity.school);break;case"range":r=rangeSortValue(a.entity.range)-rangeSortValue(b.entity.range);break;case"damage":r=cmpMaybe((_b=(_a=a.entity.damage)==null?void 0:_a.types)==null?void 0:_b[0],(_d=(_c=b.entity.damage)==null?void 0:_c.types)==null?void 0:_d[0]);break;case"save":r=cmpMaybe((_e=a.entity.saving_throw)==null?void 0:_e.ability,(_f=b.entity.saving_throw)==null?void 0:_f.ability);break;case"source":r=((_h=EDITION_RANK[(_g=a.entity.edition)!=null?_g:""])!=null?_h:9)-((_j=EDITION_RANK[(_i=b.entity.edition)!=null?_i:""])!=null?_j:9);break}if(r===0&&key!=="name")r=a.name.localeCompare(b.name);return r*mul}export{castTimeCategory,castTimeRank,compareCandidates,rangeCategory,rangeSortValue};
|
|
@@ -1,38 +1,7 @@
|
|
|
1
1
|
import { Spell, SpellMaterial } from "./spell.types.js";
|
|
2
2
|
import { ParseResult } from "@archivist-gg/core";
|
|
3
|
-
/**
|
|
4
|
-
* §3.3 · collapse the converter's structured `components` object to the corpus's own string form
|
|
5
|
-
* (`V, S, M (a coin), R`), leaving a string input byte-unchanged. Letter order is V, S, M, R;
|
|
6
|
-
* `m` object -> `M (<text>)` (the text already carries the cost prose), `m` string -> `M (<value>)`,
|
|
7
|
-
* `m: true` -> a bare `M`. A boolean flag contributes its letter only when it is exactly `true`.
|
|
8
|
-
* Casing follows the 862 string-form carriers (uppercase letters); `R` has no precedent among them
|
|
9
|
-
* and is an invented-but-decided literal (Gate 0 B-5).
|
|
10
|
-
*
|
|
11
|
-
* The parameter is `unknown` on purpose: `spellComponentsObjectSchema` stays local and unexported,
|
|
12
|
-
* so this function narrows structurally instead of importing the schema's type. `toStringSafe` is
|
|
13
|
-
* the unreachable-shape fallback (the schema has already accepted the value by the time we run).
|
|
14
|
-
*/
|
|
15
3
|
export declare function normalizeSpellComponents(value: unknown): string;
|
|
16
|
-
/**
|
|
17
|
-
* D2b-B · the structured material component the string form cannot carry: `components.m` when it is an OBJECT (`text` with an
|
|
18
|
-
* optional `cost` and `consume`), copied field by field; `undefined` for every other shape. Structural narrowing, as above.
|
|
19
|
-
*/
|
|
20
4
|
export declare function spellMaterialOf(value: unknown): SpellMaterial | undefined;
|
|
21
|
-
/**
|
|
22
|
-
* §3.3 · collapse the converter's structured `duration` array to the corpus's own lowercase string
|
|
23
|
-
* form (`until dispelled`, `up to 1 hour`), leaving a string input byte-unchanged. Concentration is
|
|
24
|
-
* NEVER synthesised here — the separate `concentration` boolean drives the sheet's `Conc · ` prefix.
|
|
25
|
-
* Zero docs carry more than one entry; the `; ` join is the defensive path for the day one does.
|
|
26
|
-
*/
|
|
27
5
|
export declare function normalizeSpellDuration(value: unknown): string;
|
|
28
|
-
/**
|
|
29
|
-
* R4-G7 §7.5 · the RESOLVE-time twin of the two normalisations `parseSpell` performs below. The PC pipeline
|
|
30
|
-
* reads RAW registry entities (`reg.data as unknown as Spell`), so a converter spell reaches the sheet with a
|
|
31
|
-
* structured `components` object and `duration` array unless it passes through here; `componentLetters`
|
|
32
|
-
* (the sheet) and the add drawer's duration cell both read strings. The `!= null` guards MIRROR `parseSpell`'s
|
|
33
|
-
* own, so a spell that authors neither key keeps neither. Lives HERE, beside the normalisers, and not in
|
|
34
|
-
* `pc.resolver.ts`, which already imports `pc.additional-spells` and would make the two a value cycle
|
|
35
|
-
* [G2-I-2]. Returns a fresh object; the shared registry entity is never mutated.
|
|
36
|
-
*/
|
|
37
6
|
export declare function mirrorSpellShapes(entity: Spell): Spell;
|
|
38
7
|
export declare function parseSpell(source: string): ParseResult<Spell>;
|
|
@@ -1,16 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
mirrorSpellShapes,
|
|
3
|
-
normalizeSpellComponents,
|
|
4
|
-
normalizeSpellDuration,
|
|
5
|
-
parseSpell,
|
|
6
|
-
spellMaterialOf
|
|
7
|
-
} from "../chunk-7Q2VPKCD.js";
|
|
8
|
-
import "../chunk-ZDAEGJH4.js";
|
|
9
|
-
import "../chunk-UA5KS2PL.js";
|
|
10
|
-
export {
|
|
11
|
-
mirrorSpellShapes,
|
|
12
|
-
normalizeSpellComponents,
|
|
13
|
-
normalizeSpellDuration,
|
|
14
|
-
parseSpell,
|
|
15
|
-
spellMaterialOf
|
|
16
|
-
};
|
|
1
|
+
import{mirrorSpellShapes,normalizeSpellComponents,normalizeSpellDuration,parseSpell,spellMaterialOf}from"../chunk-4KVVAENP.js";import"../chunk-7EL3GWWJ.js";import"../chunk-I26FHSI6.js";export{mirrorSpellShapes,normalizeSpellComponents,normalizeSpellDuration,parseSpell,spellMaterialOf};
|
|
@@ -1,59 +1,13 @@
|
|
|
1
1
|
import type { Spell } from "./spell.types.js";
|
|
2
|
-
/** A spell repeats under higher levels only if it has a real upcast benefit. */
|
|
3
2
|
export declare function spellScales(spell: Spell): boolean;
|
|
4
|
-
/** The `casting_options` field a scaled value was read from (R4-G7 T8 RIDER-16). */
|
|
5
3
|
export type SpellEffectField = "damage_roll" | "target_count" | "duration" | "desc";
|
|
6
|
-
/** A scaled value and the FIELD it came from, so a renderer decides where it prints from the field. */
|
|
7
4
|
export interface SpellEffectParts {
|
|
8
5
|
field: SpellEffectField;
|
|
9
|
-
/** As printed: the roll, `"<N> targets"`, the duration, or the authored sentence verbatim. */
|
|
10
6
|
value: string;
|
|
11
7
|
}
|
|
12
|
-
/** The spell's base roll (`damage_roll`), trimmed, or null when absent, empty or whitespace-only. The ONE base-roll
|
|
13
|
-
* check: every reader of `damage_roll` (the scaling readers here, the spell card) goes through it. */
|
|
14
8
|
export declare function spellBaseRoll(spell: Spell): string | null;
|
|
15
|
-
/**
|
|
16
|
-
* At-a-glance effect for casting a LEVELLED `spell` with a slot of `slotLevel`, WITH the field
|
|
17
|
-
* it came from. Returns null when absent or untrustworthy.
|
|
18
|
-
*
|
|
19
|
-
* A structured `casting_options` entry for that slot (`type: "slot_level_<N>"`) wins: the FIRST
|
|
20
|
-
* present field, in this order: `damage_roll`, `target_count`, `duration`, `desc` (so an option
|
|
21
|
-
* carrying a roll AND a sentence yields the roll). A `target_count` that equals the slot level is
|
|
22
|
-
* the known SRD-2014 bad encoding (e.g. Magic Missile 2nd->2 instead of 4) and is suppressed.
|
|
23
|
-
*
|
|
24
|
-
* With no option for the slot, the spell's BASE roll (`damage_roll`) answers at the spell's OWN
|
|
25
|
-
* level only. Above it, whether the base roll is still the roll dealt is `spellBaseRollAtSlot`'s
|
|
26
|
-
* question (it is when the damage does not scale); a SCALING spell missing its option above base
|
|
27
|
-
* stays null here. A CANTRIP is never read by slot (null): its roll follows the character's level,
|
|
28
|
-
* `spellEffectAtCharacterLevel`, even when it is cast from a scroll. This errs toward showing
|
|
29
|
-
* nothing rather than a wrong number.
|
|
30
|
-
*/
|
|
31
9
|
export declare function spellEffectPartsAtSlot(spell: Spell, slotLevel: number): SpellEffectParts | null;
|
|
32
|
-
/**
|
|
33
|
-
* The spell's BASE roll at a slot of `slotLevel` when the data PROVES its damage does not scale, so every slot at or
|
|
34
|
-
* above the spell's level deals the base roll. Two proofs, and only these:
|
|
35
|
-
* (a) it has `slot_level_<N>` options and every one carries only a `duration` and / or a `target_count` (plus the
|
|
36
|
-
* `concentration` flag a duration carries): 2024 Hex and Hunter's Mark scale their duration, Magic Missile and
|
|
37
|
-
* Scorching Ray their target count;
|
|
38
|
-
* (b) it has no slot options AND no `at_higher_levels` text (Finger of Death).
|
|
39
|
-
* Anything else is NOT proof: prose-only scaling (2014 Cure Wounds' "increases by 1d8 for each slot level above
|
|
40
|
-
* 1st", with no options) would print the unscaled base on every upcast row, so it stays null there. The companion of
|
|
41
|
-
* `spellEffectPartsAtSlot`: a row prints this roll beside a target count, and the duration a slot option carries
|
|
42
|
-
* prints in its own cell. Null for a cantrip, below the spell's level, and when the spell has no base roll.
|
|
43
|
-
*/
|
|
44
10
|
export declare function spellBaseRollAtSlot(spell: Spell, slotLevel: number): string | null;
|
|
45
|
-
/** The value of `spellEffectPartsAtSlot`, without its field. */
|
|
46
11
|
export declare function spellEffectAtSlot(spell: Spell, slotLevel: number): string | null;
|
|
47
|
-
/**
|
|
48
|
-
* R4-G7 T8 RIDER-15 (F-NODICE (a)): a CANTRIP's damage roll at the character's total level, read from structured
|
|
49
|
-
* `casting_options` (`type: "player_level_<N>"`). The roll of the HIGHEST `N <= characterLevel` wins: SRD 5e authors
|
|
50
|
-
* one option per level from 5 to 20, SRD 2024 and the converter author only 5 / 11 / 17. An option with no roll or an
|
|
51
|
-
* EMPTY one never qualifies (SRD 5e Acid Splash and Poison Spray open with `player_level_2..4` carrying
|
|
52
|
-
* `damage_roll: ''`; Eldritch Blast 2024 authors `target_count` only). When no tier qualifies (below the first tier,
|
|
53
|
-
* or tiers that carry no roll) the spell's BASE roll `damage_roll` answers: the tier-1 roll (Fire Bolt `1d10` at 4,
|
|
54
|
-
* Eldritch Blast's per-beam `1d10` at any level). Null for a levelled spell, for a level that is not a finite number
|
|
55
|
-
* (a fixture-built `derived` omits `totalLevel`), and when neither a tier nor a non-empty base roll exists.
|
|
56
|
-
*/
|
|
57
12
|
export declare function spellEffectAtCharacterLevel(spell: Spell, characterLevel: number): string | null;
|
|
58
|
-
/** Owned slot levels strictly above the spell's base level (scaling spells only). */
|
|
59
13
|
export declare function upcastLevelsFor(spell: Spell, ownedSlotLevels: number[]): number[];
|
|
@@ -1,79 +1 @@
|
|
|
1
|
-
|
|
2
|
-
function spellScales(spell) {
|
|
3
|
-
var _a, _b, _c, _d;
|
|
4
|
-
return ((_b = (_a = spell.casting_options) == null ? void 0 : _a.length) != null ? _b : 0) > 0 || ((_d = (_c = spell.at_higher_levels) == null ? void 0 : _c.length) != null ? _d : 0) > 0;
|
|
5
|
-
}
|
|
6
|
-
function spellBaseRoll(spell) {
|
|
7
|
-
const roll = typeof spell.damage_roll === "string" ? spell.damage_roll.trim() : "";
|
|
8
|
-
return roll !== "" ? roll : null;
|
|
9
|
-
}
|
|
10
|
-
function spellEffectPartsAtSlot(spell, slotLevel) {
|
|
11
|
-
var _a, _b;
|
|
12
|
-
const base = (_a = spell.level) != null ? _a : 0;
|
|
13
|
-
if (base === 0) return null;
|
|
14
|
-
const opt = ((_b = spell.casting_options) != null ? _b : []).find((o) => o.type === `slot_level_${slotLevel}`);
|
|
15
|
-
if (!opt) {
|
|
16
|
-
const roll = spellBaseRoll(spell);
|
|
17
|
-
return roll !== null && slotLevel === base ? { field: "damage_roll", value: roll } : null;
|
|
18
|
-
}
|
|
19
|
-
if (opt.damage_roll) return { field: "damage_roll", value: opt.damage_roll };
|
|
20
|
-
if (typeof opt.target_count === "number") {
|
|
21
|
-
if (opt.target_count === slotLevel) return null;
|
|
22
|
-
return { field: "target_count", value: `${opt.target_count} targets` };
|
|
23
|
-
}
|
|
24
|
-
if (opt.duration) return { field: "duration", value: opt.duration };
|
|
25
|
-
return opt.desc != null ? { field: "desc", value: opt.desc } : null;
|
|
26
|
-
}
|
|
27
|
-
var NON_ROLL_SCALES = /* @__PURE__ */ new Set(["duration", "target_count"]);
|
|
28
|
-
var NON_ROLL_OPTION_FIELDS = /* @__PURE__ */ new Set([...NON_ROLL_SCALES, "concentration"]);
|
|
29
|
-
function spellBaseRollAtSlot(spell, slotLevel) {
|
|
30
|
-
var _a, _b, _c;
|
|
31
|
-
const base = (_a = spell.level) != null ? _a : 0;
|
|
32
|
-
if (base === 0 || slotLevel < base) return null;
|
|
33
|
-
const roll = spellBaseRoll(spell);
|
|
34
|
-
if (roll === null) return null;
|
|
35
|
-
const slotOptions = ((_b = spell.casting_options) != null ? _b : []).filter((o) => {
|
|
36
|
-
var _a2;
|
|
37
|
-
return /^slot_level_\d+$/.test(String((_a2 = o.type) != null ? _a2 : ""));
|
|
38
|
-
});
|
|
39
|
-
if (slotOptions.length > 0) {
|
|
40
|
-
const onlyNonRoll = slotOptions.every((o) => {
|
|
41
|
-
const fields = Object.entries(o).filter(([k, v]) => k !== "type" && v != null).map(([k]) => k);
|
|
42
|
-
return fields.some((k) => NON_ROLL_SCALES.has(k)) && fields.every((k) => NON_ROLL_OPTION_FIELDS.has(k));
|
|
43
|
-
});
|
|
44
|
-
return onlyNonRoll ? roll : null;
|
|
45
|
-
}
|
|
46
|
-
return ((_c = spell.at_higher_levels) != null ? _c : []).some((t) => typeof t === "string" && t.trim() !== "") ? null : roll;
|
|
47
|
-
}
|
|
48
|
-
function spellEffectAtSlot(spell, slotLevel) {
|
|
49
|
-
var _a, _b;
|
|
50
|
-
return (_b = (_a = spellEffectPartsAtSlot(spell, slotLevel)) == null ? void 0 : _a.value) != null ? _b : null;
|
|
51
|
-
}
|
|
52
|
-
var PLAYER_LEVEL_TYPE = /^player_level_(\d+)$/;
|
|
53
|
-
function spellEffectAtCharacterLevel(spell, characterLevel) {
|
|
54
|
-
var _a, _b, _c;
|
|
55
|
-
if (((_a = spell.level) != null ? _a : 0) !== 0 || !Number.isFinite(characterLevel)) return null;
|
|
56
|
-
let best = null;
|
|
57
|
-
for (const opt of (_b = spell.casting_options) != null ? _b : []) {
|
|
58
|
-
const m = PLAYER_LEVEL_TYPE.exec(String((_c = opt.type) != null ? _c : ""));
|
|
59
|
-
if (!m || typeof opt.damage_roll !== "string" || opt.damage_roll.trim() === "") continue;
|
|
60
|
-
const n = Number(m[1]);
|
|
61
|
-
if (n <= characterLevel && (best === null || n > best.n)) best = { n, roll: opt.damage_roll };
|
|
62
|
-
}
|
|
63
|
-
return best ? best.roll : spellBaseRoll(spell);
|
|
64
|
-
}
|
|
65
|
-
function upcastLevelsFor(spell, ownedSlotLevels) {
|
|
66
|
-
var _a;
|
|
67
|
-
const base = (_a = spell.level) != null ? _a : 0;
|
|
68
|
-
if (base < 1 || !spellScales(spell)) return [];
|
|
69
|
-
return ownedSlotLevels.filter((l) => l > base).sort((a, b) => a - b);
|
|
70
|
-
}
|
|
71
|
-
export {
|
|
72
|
-
spellBaseRoll,
|
|
73
|
-
spellBaseRollAtSlot,
|
|
74
|
-
spellEffectAtCharacterLevel,
|
|
75
|
-
spellEffectAtSlot,
|
|
76
|
-
spellEffectPartsAtSlot,
|
|
77
|
-
spellScales,
|
|
78
|
-
upcastLevelsFor
|
|
79
|
-
};
|
|
1
|
+
function spellScales(spell){var _a,_b,_c,_d;return((_b=(_a=spell.casting_options)==null?void 0:_a.length)!=null?_b:0)>0||((_d=(_c=spell.at_higher_levels)==null?void 0:_c.length)!=null?_d:0)>0}function spellBaseRoll(spell){const roll=typeof spell.damage_roll==="string"?spell.damage_roll.trim():"";return roll!==""?roll:null}function spellEffectPartsAtSlot(spell,slotLevel){var _a,_b;const base=(_a=spell.level)!=null?_a:0;if(base===0)return null;const opt=((_b=spell.casting_options)!=null?_b:[]).find(o=>o.type===`slot_level_${slotLevel}`);if(!opt){const roll=spellBaseRoll(spell);return roll!==null&&slotLevel===base?{field:"damage_roll",value:roll}:null}if(opt.damage_roll)return{field:"damage_roll",value:opt.damage_roll};if(typeof opt.target_count==="number"){if(opt.target_count===slotLevel)return null;return{field:"target_count",value:`${opt.target_count} targets`}}if(opt.duration)return{field:"duration",value:opt.duration};return opt.desc!=null?{field:"desc",value:opt.desc}:null}var NON_ROLL_SCALES=new Set(["duration","target_count"]);var NON_ROLL_OPTION_FIELDS=new Set([...NON_ROLL_SCALES,"concentration"]);function spellBaseRollAtSlot(spell,slotLevel){var _a,_b,_c;const base=(_a=spell.level)!=null?_a:0;if(base===0||slotLevel<base)return null;const roll=spellBaseRoll(spell);if(roll===null)return null;const slotOptions=((_b=spell.casting_options)!=null?_b:[]).filter(o=>{var _a2;return/^slot_level_\d+$/.test(String((_a2=o.type)!=null?_a2:""))});if(slotOptions.length>0){const onlyNonRoll=slotOptions.every(o=>{const fields=Object.entries(o).filter(([k,v])=>k!=="type"&&v!=null).map(([k])=>k);return fields.some(k=>NON_ROLL_SCALES.has(k))&&fields.every(k=>NON_ROLL_OPTION_FIELDS.has(k))});return onlyNonRoll?roll:null}return((_c=spell.at_higher_levels)!=null?_c:[]).some(t=>typeof t==="string"&&t.trim()!=="")?null:roll}function spellEffectAtSlot(spell,slotLevel){var _a,_b;return(_b=(_a=spellEffectPartsAtSlot(spell,slotLevel))==null?void 0:_a.value)!=null?_b:null}var PLAYER_LEVEL_TYPE=/^player_level_(\d+)$/;function spellEffectAtCharacterLevel(spell,characterLevel){var _a,_b,_c;if(((_a=spell.level)!=null?_a:0)!==0||!Number.isFinite(characterLevel))return null;let best=null;for(const opt of(_b=spell.casting_options)!=null?_b:[]){const m=PLAYER_LEVEL_TYPE.exec(String((_c=opt.type)!=null?_c:""));if(!m||typeof opt.damage_roll!=="string"||opt.damage_roll.trim()==="")continue;const n=Number(m[1]);if(n<=characterLevel&&(best===null||n>best.n))best={n,roll:opt.damage_roll}}return best?best.roll:spellBaseRoll(spell)}function upcastLevelsFor(spell,ownedSlotLevels){var _a;const base=(_a=spell.level)!=null?_a:0;if(base<1||!spellScales(spell))return[];return ownedSlotLevels.filter(l=>l>base).sort((a,b)=>a-b)}export{spellBaseRoll,spellBaseRollAtSlot,spellEffectAtCharacterLevel,spellEffectAtSlot,spellEffectPartsAtSlot,spellScales,upcastLevelsFor};
|