@archivist-gg/dnd5e 0.3.17 → 0.3.19
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/dist/background/background.codec.js +5 -5
- package/dist/background/background.parser.js +4 -4
- package/dist/background/background.schema.js +3 -3
- package/dist/{chunk-7QN7XSAK.js → chunk-3SFGWFVQ.js} +1 -1
- package/dist/{chunk-2UDSN6VW.js → chunk-3SIUAFDQ.js} +1 -1
- package/dist/chunk-4J6DS3EJ.js +30 -0
- package/dist/{chunk-RLGQ5PZZ.js → chunk-5JXFJ5AU.js} +11 -1
- package/dist/{chunk-TULQ4FFX.js → chunk-64VNLMSG.js} +31 -9
- package/dist/{chunk-JSM6JFZR.js → chunk-7XJHI5H5.js} +2 -2
- package/dist/{chunk-YD2VAHA6.js → chunk-B2QHP6UF.js} +2 -2
- package/dist/{chunk-AZRGFUSR.js → chunk-BJGOSM76.js} +1 -1
- package/dist/{chunk-JCMUVZIK.js → chunk-BJWSOQUC.js} +1 -1
- package/dist/{chunk-ONTGZR5T.js → chunk-EJD47JHL.js} +64 -32
- package/dist/{chunk-FANQVQ3D.js → chunk-FJYBLXV7.js} +2 -2
- package/dist/{chunk-PQZ4LM4Z.js → chunk-FMUD3LDV.js} +1 -1
- package/dist/{chunk-PKX6TGRE.js → chunk-FMYWORTP.js} +2 -2
- package/dist/{chunk-G6PBI2BU.js → chunk-FVXLP7P3.js} +1 -1
- package/dist/{chunk-MBX25B6D.js → chunk-GVWEFECG.js} +1 -1
- package/dist/{chunk-Y5VVP73C.js → chunk-HY2SRSVM.js} +1 -1
- package/dist/{chunk-2JSQE3DD.js → chunk-JXWNXIIZ.js} +13 -0
- package/dist/{chunk-VRV3NNTA.js → chunk-LICYHPI3.js} +81 -5
- package/dist/{chunk-LF5AGJA4.js → chunk-LNT64X7C.js} +1 -1
- package/dist/{chunk-6EI737IO.js → chunk-NKZMQV2C.js} +1 -1
- package/dist/{chunk-T6QIF5XR.js → chunk-NTU2DXNG.js} +9 -2
- package/dist/{chunk-3VZZDKRA.js → chunk-NXUY5XQN.js} +63 -15
- package/dist/{chunk-QZSWN2KT.js → chunk-NZO7M5GV.js} +1 -1
- package/dist/{chunk-5MXFW4O3.js → chunk-OOL4KMG2.js} +1 -1
- package/dist/{chunk-H5PTKYXL.js → chunk-QA3YCOML.js} +1 -1
- package/dist/{chunk-3MGQFFNE.js → chunk-QFWQKS3M.js} +1 -1
- package/dist/{chunk-HTYMW5CH.js → chunk-RD2MID3M.js} +67 -3
- package/dist/{chunk-PXVNAY7T.js → chunk-TRBGC4ZG.js} +29 -1
- package/dist/{chunk-UUBJCNQU.js → chunk-UJCK5IW4.js} +2 -2
- package/dist/{chunk-OFCSP6MT.js → chunk-UNYR5GLI.js} +1 -1
- package/dist/{chunk-DOXSFYLH.js → chunk-VN5DLURA.js} +2 -2
- package/dist/{chunk-7ATNGKBS.js → chunk-VP5TIXDK.js} +1 -1
- package/dist/{chunk-QH36K2PU.js → chunk-WOHX7YTH.js} +7 -0
- package/dist/{chunk-YKL6SHRJ.js → chunk-XTEFPUSN.js} +1 -1
- package/dist/{chunk-RYLXAYIQ.js → chunk-ZOWKWMD2.js} +1 -1
- package/dist/class/class.codec.js +6 -6
- package/dist/class/class.parser.js +5 -5
- package/dist/class/class.schema.js +4 -4
- package/dist/dnd/amount-text.d.ts +4 -0
- package/dist/dnd/amount-text.js +3 -1
- package/dist/entities/registry-revision.d.ts +25 -0
- package/dist/entities/registry-revision.js +10 -0
- package/dist/feat/feat.codec.js +5 -5
- package/dist/feat/feat.parser.js +4 -4
- package/dist/feat/feat.schema.d.ts +9 -0
- package/dist/feat/feat.schema.js +3 -3
- package/dist/index.js +3720 -338
- package/dist/monster/monster.parser.js +5 -5
- package/dist/monster/monster.schema.js +4 -4
- package/dist/optional-feature/optional-feature.codec.js +5 -5
- package/dist/optional-feature/optional-feature.parser.js +4 -4
- package/dist/optional-feature/optional-feature.schema.d.ts +9 -0
- package/dist/optional-feature/optional-feature.schema.js +3 -3
- package/dist/pc/pc.additional-spells.d.ts +16 -2
- package/dist/pc/pc.additional-spells.js +4 -1
- package/dist/pc/pc.amount-bindings.d.ts +11 -2
- package/dist/pc/pc.amount-bindings.js +6 -1
- package/dist/pc/pc.decision-engine.d.ts +8 -0
- package/dist/pc/pc.decision-engine.js +13 -10
- package/dist/pc/pc.entry-overrides.js +3 -2
- package/dist/pc/pc.equipment.js +5 -4
- package/dist/pc/pc.feature-effects.d.ts +9 -2
- package/dist/pc/pc.feature-effects.js +15 -2
- package/dist/pc/pc.infusions.js +3 -2
- package/dist/pc/pc.member-choices.d.ts +33 -1
- package/dist/pc/pc.member-choices.js +12 -5
- package/dist/pc/pc.parser.js +1 -1
- package/dist/pc/pc.pools.js +3 -2
- package/dist/pc/pc.proficiencies.d.ts +14 -0
- package/dist/pc/pc.proficiencies.js +68 -19
- package/dist/pc/pc.proficiency-normalize.d.ts +14 -0
- package/dist/pc/pc.proficiency-normalize.js +9 -3
- package/dist/pc/pc.proficiency-query.js +1 -1
- package/dist/pc/pc.recalc.js +151 -55
- package/dist/pc/pc.resolver.d.ts +4 -1
- package/dist/pc/pc.resolver.js +10 -9
- package/dist/pc/pc.rest.js +3 -2
- package/dist/pc/pc.schema.d.ts +19 -0
- package/dist/pc/pc.schema.js +1 -1
- package/dist/pc/pc.spell-scope.d.ts +22 -0
- package/dist/pc/pc.tool-picks.js +2 -2
- package/dist/pc/pc.types.d.ts +65 -4
- package/dist/race/race.codec.js +6 -6
- package/dist/race/race.parser.js +5 -5
- package/dist/race/race.schema.js +4 -4
- package/dist/schemas/choice-schema.js +2 -2
- package/dist/schemas/feature-effect-schema.d.ts +9 -0
- package/dist/schemas/feature-effect-schema.js +1 -1
- package/dist/schemas/feature-schema.js +3 -3
- package/dist/subclass/subclass.codec.js +6 -6
- package/dist/subclass/subclass.parser.js +5 -5
- package/dist/subclass/subclass.schema.js +4 -4
- package/dist/types/choice.d.ts +2 -2
- package/dist/types/feature-effect.d.ts +18 -0
- package/dist/types/optional-feature.types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
migrateLegacy,
|
|
3
3
|
parseMonster
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-BJWSOQUC.js";
|
|
5
|
+
import "../chunk-VP5TIXDK.js";
|
|
6
|
+
import "../chunk-B2QHP6UF.js";
|
|
7
7
|
import "../chunk-WYGD2UGN.js";
|
|
8
8
|
import "../chunk-ZJXSXVFP.js";
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
9
|
+
import "../chunk-OOL4KMG2.js";
|
|
10
|
+
import "../chunk-JXWNXIIZ.js";
|
|
11
11
|
import "../chunk-UA5KS2PL.js";
|
|
12
12
|
export {
|
|
13
13
|
migrateLegacy,
|
|
@@ -11,12 +11,12 @@ import {
|
|
|
11
11
|
monsterSpeedSchema,
|
|
12
12
|
monsterSpellcastingSchema,
|
|
13
13
|
monsterTypeSchema
|
|
14
|
-
} from "../chunk-
|
|
15
|
-
import "../chunk-
|
|
14
|
+
} from "../chunk-VP5TIXDK.js";
|
|
15
|
+
import "../chunk-B2QHP6UF.js";
|
|
16
16
|
import "../chunk-WYGD2UGN.js";
|
|
17
17
|
import "../chunk-ZJXSXVFP.js";
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-OOL4KMG2.js";
|
|
19
|
+
import "../chunk-JXWNXIIZ.js";
|
|
20
20
|
import "../chunk-UA5KS2PL.js";
|
|
21
21
|
export {
|
|
22
22
|
MONSTER_KNOWN_KEYS,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
optionalFeatureCodec
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-FVXLP7P3.js";
|
|
4
|
+
import "../chunk-FMUD3LDV.js";
|
|
5
|
+
import "../chunk-VN5DLURA.js";
|
|
6
6
|
import "../chunk-WYGD2UGN.js";
|
|
7
7
|
import "../chunk-ZJXSXVFP.js";
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-OOL4KMG2.js";
|
|
9
|
+
import "../chunk-JXWNXIIZ.js";
|
|
10
10
|
import "../chunk-UA5KS2PL.js";
|
|
11
11
|
export {
|
|
12
12
|
optionalFeatureCodec
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseOptionalFeature
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-FMUD3LDV.js";
|
|
4
|
+
import "../chunk-VN5DLURA.js";
|
|
5
5
|
import "../chunk-WYGD2UGN.js";
|
|
6
6
|
import "../chunk-ZJXSXVFP.js";
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-OOL4KMG2.js";
|
|
8
|
+
import "../chunk-JXWNXIIZ.js";
|
|
9
9
|
import "../chunk-UA5KS2PL.js";
|
|
10
10
|
export {
|
|
11
11
|
parseOptionalFeature
|
|
@@ -301,6 +301,15 @@ export declare const optionalFeatureEntitySchema: z.ZodObject<{
|
|
|
301
301
|
finesse: "finesse";
|
|
302
302
|
thrown: "thrown";
|
|
303
303
|
}>>]>>;
|
|
304
|
+
spell_scope: z.ZodOptional<z.ZodObject<{
|
|
305
|
+
list: z.ZodOptional<z.ZodString>;
|
|
306
|
+
level: z.ZodOptional<z.ZodNumber>;
|
|
307
|
+
school: z.ZodOptional<z.ZodString>;
|
|
308
|
+
damage_types: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
309
|
+
damage_type_pick: z.ZodOptional<z.ZodString>;
|
|
310
|
+
spells: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
311
|
+
once: z.ZodOptional<z.ZodBoolean>;
|
|
312
|
+
}, z.core.$strict>>;
|
|
304
313
|
condition: z.ZodOptional<z.ZodString>;
|
|
305
314
|
subject: z.ZodOptional<z.ZodString>;
|
|
306
315
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
infuseBlockSchema,
|
|
3
3
|
optionRowSchema,
|
|
4
4
|
optionalFeatureEntitySchema
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-VN5DLURA.js";
|
|
6
6
|
import "../chunk-WYGD2UGN.js";
|
|
7
7
|
import "../chunk-ZJXSXVFP.js";
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-OOL4KMG2.js";
|
|
9
|
+
import "../chunk-JXWNXIIZ.js";
|
|
10
10
|
import "../chunk-UA5KS2PL.js";
|
|
11
11
|
export {
|
|
12
12
|
infuseBlockSchema,
|
|
@@ -3,7 +3,7 @@ import type { RaceEntity } from "@archivist-gg/dnd5e/race/race.types";
|
|
|
3
3
|
import type { FeatEntity } from "@archivist-gg/dnd5e/feat/feat.types";
|
|
4
4
|
import type { Spell } from "@archivist-gg/dnd5e/spell/spell.types";
|
|
5
5
|
import type { Ability } from "@archivist-gg/dnd5e";
|
|
6
|
-
import type { ResolvedClass, ResolvedSpell } from "./pc.types.js";
|
|
6
|
+
import type { ChoiceValue, ResolvedClass, ResolvedPool, ResolvedSpell } from "./pc.types.js";
|
|
7
7
|
export declare const prefixOf: (slug: string) => string;
|
|
8
8
|
/** §5.2.2 · a raw 5etools / bundle spell ref → the bare NAME slug. The path tail is taken ONLY for a wikilink; a bare
|
|
9
9
|
* name may legally contain "/" ("blindness/deafness" → "blindnessdeafness", the converter's own slug tail · Gate 0 B1).
|
|
@@ -34,7 +34,16 @@ export declare function resolveSpellByName(opts: {
|
|
|
34
34
|
/** §5.2.9 · fold a race's entries ONLY when no select-inline on race.choices[] / traits[].choices[] / nested option.choices[]
|
|
35
35
|
* carries an id outside the structural set (nested: zero carriers, defensive). */
|
|
36
36
|
export declare function raceIsUngated(race: RaceEntity): boolean;
|
|
37
|
-
/**
|
|
37
|
+
/** SRD-G T4: the slugs (value and label) of every option the character CHOSE on a race's content select-inlines
|
|
38
|
+
* (`race.choices[]` and `traits[].choices[]`, the structural set excluded), read through `read(<choice id>)`. */
|
|
39
|
+
export declare function chosenRaceOptionKeys(race: RaceEntity, read: (id: string) => ChoiceValue | undefined): Set<string>;
|
|
40
|
+
/** §5.2.1 · the reader. Every object it receives is the RAW registry entity; nothing is mutated.
|
|
41
|
+
*
|
|
42
|
+
* SRD-G T4 (audit §3a): the RACE root also reads (1) a race whose lineage select-inline GATES it: the entry NAMED like
|
|
43
|
+
* the option the character chose folds (the SRD 5.2 Tiefling's legacy, the Elf's and Gnome's lineage); an unnamed
|
|
44
|
+
* entry on a gated race still folds nothing (it may belong to any lineage); (2) an `ability: {choose}` entry, when
|
|
45
|
+
* `raceChoice("spellcasting-ability")` answers one of its abilities (unanswered, the entry waits for the pick);
|
|
46
|
+
* (3) the `innate` level spells (the level 3 / 5 once-per-Long-Rest spells), folded always prepared like `known`. */
|
|
38
47
|
export declare function collectAdditionalSpells(args: {
|
|
39
48
|
race: RaceEntity | null;
|
|
40
49
|
feats: FeatEntity[];
|
|
@@ -44,4 +53,9 @@ export declare function collectAdditionalSpells(args: {
|
|
|
44
53
|
alreadyCollected: ResolvedSpell[];
|
|
45
54
|
entities: EntityRegistry;
|
|
46
55
|
warnings: string[];
|
|
56
|
+
/** SRD-G T4: the character's answer to a race choice, by choice id (`origin_choices["race:<id>"]`). */
|
|
57
|
+
raceChoice?: (id: string) => ChoiceValue | undefined;
|
|
58
|
+
/** User report 2026-09-28: the RESOLVED pools. Every member the character has (a pick or a grant; an item-bound one's
|
|
59
|
+
* subject is its item) is a root, read at the owning class's level, its spells that class's. */
|
|
60
|
+
pools?: ReadonlyArray<ResolvedPool>;
|
|
47
61
|
}): ResolvedSpell[];
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildSpellNameIndex,
|
|
3
|
+
chosenRaceOptionKeys,
|
|
3
4
|
collectAdditionalSpells,
|
|
4
5
|
normalizeSpellRef,
|
|
5
6
|
prefixOf,
|
|
6
7
|
raceIsUngated,
|
|
7
8
|
resolveSpellByName
|
|
8
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-LICYHPI3.js";
|
|
9
10
|
import "../chunk-PVCEA4HZ.js";
|
|
10
11
|
import "../chunk-LVQLWRCU.js";
|
|
12
|
+
import "../chunk-4J6DS3EJ.js";
|
|
11
13
|
import "../chunk-ZCTUYGNV.js";
|
|
12
14
|
import "../chunk-7Q2VPKCD.js";
|
|
13
15
|
import "../chunk-ZDAEGJH4.js";
|
|
@@ -15,6 +17,7 @@ import "../chunk-WELIKLZF.js";
|
|
|
15
17
|
import "../chunk-UA5KS2PL.js";
|
|
16
18
|
export {
|
|
17
19
|
buildSpellNameIndex,
|
|
20
|
+
chosenRaceOptionKeys,
|
|
18
21
|
collectAdditionalSpells,
|
|
19
22
|
normalizeSpellRef,
|
|
20
23
|
prefixOf,
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { Ability } from "@archivist-gg/dnd5e/types/choice";
|
|
6
6
|
import type { Spell } from "@archivist-gg/dnd5e/spell/spell.types";
|
|
7
|
-
import type
|
|
8
|
-
import type { DerivedStats, FeatureSource, ResolvedCharacter, ResolvedSpell } from "./pc.types.js";
|
|
7
|
+
import { type AmountBindings } from "@archivist-gg/dnd5e/dnd/amount-text";
|
|
8
|
+
import type { DerivedStats, FeatureSource, ResolvedCharacter, ResolvedSpell, SpellDamageRider } from "./pc.types.js";
|
|
9
9
|
/** The derived fields the bindings read (recalc builds them before its return; the sheet passes `ctx.derived`). */
|
|
10
10
|
export type AmountDerived = Pick<DerivedStats, "proficiencyBonus" | "mods" | "spellcastingClasses"> & Partial<Pick<DerivedStats, "abilitySpellcasting">>;
|
|
11
11
|
/** The class slug that owns `source`: a class by its slug, a subclass by the class that holds it, a feat through the
|
|
@@ -30,3 +30,12 @@ export declare function spellAmountBindings(spell: Pick<ResolvedSpell, "source"
|
|
|
30
30
|
* null. Read from the note's own words at read time; the roll must be the one the phrase follows, so a spell whose
|
|
31
31
|
* modifier rides a different roll (a heal beside a damage roll) adds nothing. */
|
|
32
32
|
export declare function spellRollBonus(spell: Pick<Spell, "damage_roll" | "description">): string | null;
|
|
33
|
+
/** The spell's printed roll with every spell damage rider that reaches it added INSIDE the one roll (bonus damage prints
|
|
34
|
+
* in the damage cell, user ruling): Agonizing Blast's Charisma on its cantrip reads "1d10+3" (found live 2026-09-28),
|
|
35
|
+
* Potent Spellcasting's Wisdom on Sacred Flame "1d8+3". A conditional rider, or one of another canonical damage type
|
|
36
|
+
* than the spell's own, is not added here: it is a line of its own (`spellDamageRiderLines`). */
|
|
37
|
+
export declare function addSpellDamageRiders(roll: string, spell: Pick<ResolvedSpell, "slug" | "entity">, derived: Partial<Pick<DerivedStats, "spellDamageRiders">>): string;
|
|
38
|
+
/** The spell damage riders that reach `spell` but do not fold into its roll, each its own line in the damage cell, the
|
|
39
|
+
* way a conditional weapon rider is (Power Surge's "+ 5 force" once a surge is spent; Arcane Firearm's "+ 1d8" through
|
|
40
|
+
* the firearm): a `condition`, or another canonical damage type. `spells` and `once` are the engine's, not the line's. */
|
|
41
|
+
export declare function spellDamageRiderLines(spell: Pick<ResolvedSpell, "slug" | "entity">, derived: Partial<Pick<DerivedStats, "spellDamageRiders">>): Array<Pick<SpellDamageRider, "amount" | "damage_type" | "source" | "condition">>;
|
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
|
+
addSpellDamageRiders,
|
|
2
3
|
amountBindingsFor,
|
|
3
4
|
ownerClassSlug,
|
|
4
5
|
spellAmountBindings,
|
|
6
|
+
spellDamageRiderLines,
|
|
5
7
|
spellRollBonus,
|
|
6
8
|
spellcastingFor
|
|
7
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-TRBGC4ZG.js";
|
|
8
10
|
import "../chunk-KR6JF3BF.js";
|
|
9
11
|
import "../chunk-KSTV7J2U.js";
|
|
10
12
|
import "../chunk-DPUJDOKV.js";
|
|
11
13
|
import "../chunk-IUAAXXNO.js";
|
|
12
14
|
import "../chunk-LVQLWRCU.js";
|
|
15
|
+
import "../chunk-WOHX7YTH.js";
|
|
13
16
|
import "../chunk-EVMUJYUD.js";
|
|
14
17
|
import "../chunk-VTTA2ALZ.js";
|
|
15
18
|
import "../chunk-PDJSUH24.js";
|
|
16
19
|
import "../chunk-WELIKLZF.js";
|
|
17
20
|
export {
|
|
21
|
+
addSpellDamageRiders,
|
|
18
22
|
amountBindingsFor,
|
|
19
23
|
ownerClassSlug,
|
|
20
24
|
spellAmountBindings,
|
|
25
|
+
spellDamageRiderLines,
|
|
21
26
|
spellRollBonus,
|
|
22
27
|
spellcastingFor
|
|
23
28
|
};
|
|
@@ -203,6 +203,14 @@ export declare function computeEffectiveProficiencies(resolved: ResolvedCharacte
|
|
|
203
203
|
languages: ProficiencyEntry[];
|
|
204
204
|
tools: ProficiencyEntry[];
|
|
205
205
|
};
|
|
206
|
+
/** D4 A: the complement of {@link computeEffectiveProficiencies}: every language and tool the character's grants, picks
|
|
207
|
+
* or adds would hold but `overrides.<domain>.remove` (or a `none` tools tri) suppresses, each entry keeping its
|
|
208
|
+
* `sources` and `origin`. The proficiency picker draws these struck through ("Dwarf · removed"). Both functions read
|
|
209
|
+
* ONE composer, so a row is kept or suppressed, never both and never neither. */
|
|
210
|
+
export declare function computeSuppressedProficiencies(resolved: ResolvedCharacter): {
|
|
211
|
+
languages: ProficiencyEntry[];
|
|
212
|
+
tools: ProficiencyEntry[];
|
|
213
|
+
};
|
|
206
214
|
export interface OriginAbilityPoints {
|
|
207
215
|
race: Partial<Record<Ability, number>>;
|
|
208
216
|
background: Partial<Record<Ability, number>>;
|
|
@@ -4,31 +4,33 @@ import {
|
|
|
4
4
|
buildDecisionLedger,
|
|
5
5
|
collectChosenAbilityPoints,
|
|
6
6
|
collectChosenProficiencies,
|
|
7
|
-
computeEffectiveProficiencies
|
|
8
|
-
|
|
7
|
+
computeEffectiveProficiencies,
|
|
8
|
+
computeSuppressedProficiencies
|
|
9
|
+
} from "../chunk-EJD47JHL.js";
|
|
9
10
|
import "../chunk-2LULMQTF.js";
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-QA3YCOML.js";
|
|
12
|
+
import "../chunk-64VNLMSG.js";
|
|
12
13
|
import "../chunk-TOM66P2P.js";
|
|
13
14
|
import "../chunk-KU3YLF6D.js";
|
|
14
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-5JXFJ5AU.js";
|
|
16
|
+
import "../chunk-RD2MID3M.js";
|
|
17
|
+
import "../chunk-LICYHPI3.js";
|
|
18
|
+
import "../chunk-PVCEA4HZ.js";
|
|
15
19
|
import "../chunk-KSTV7J2U.js";
|
|
16
20
|
import "../chunk-DPUJDOKV.js";
|
|
17
21
|
import "../chunk-LBEXLN6I.js";
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-3VZZDKRA.js";
|
|
22
|
+
import "../chunk-NXUY5XQN.js";
|
|
20
23
|
import "../chunk-W6GC6OKK.js";
|
|
21
24
|
import "../chunk-B3DP42OM.js";
|
|
22
25
|
import "../chunk-IUAAXXNO.js";
|
|
23
26
|
import "../chunk-YHYTW5QA.js";
|
|
24
|
-
import "../chunk-
|
|
25
|
-
import "../chunk-PVCEA4HZ.js";
|
|
27
|
+
import "../chunk-ZUQW5VBZ.js";
|
|
26
28
|
import "../chunk-IHE6KVC3.js";
|
|
27
29
|
import "../chunk-LHZXYFBU.js";
|
|
28
30
|
import "../chunk-YBLDE5CG.js";
|
|
29
|
-
import "../chunk-ZUQW5VBZ.js";
|
|
30
31
|
import "../chunk-LVQLWRCU.js";
|
|
31
32
|
import "../chunk-CM5CWO4K.js";
|
|
33
|
+
import "../chunk-4J6DS3EJ.js";
|
|
32
34
|
import "../chunk-EVMUJYUD.js";
|
|
33
35
|
import "../chunk-VTTA2ALZ.js";
|
|
34
36
|
import {
|
|
@@ -48,5 +50,6 @@ export {
|
|
|
48
50
|
collectChosenAbilityPoints,
|
|
49
51
|
collectChosenProficiencies,
|
|
50
52
|
computeEffectiveProficiencies,
|
|
53
|
+
computeSuppressedProficiencies,
|
|
51
54
|
wikilinkTailSlug
|
|
52
55
|
};
|
|
@@ -11,15 +11,16 @@ import {
|
|
|
11
11
|
isWeaponLikeEntry,
|
|
12
12
|
itemChargesMax,
|
|
13
13
|
scrollSpellCost
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-NXUY5XQN.js";
|
|
15
15
|
import "../chunk-W6GC6OKK.js";
|
|
16
16
|
import "../chunk-B3DP42OM.js";
|
|
17
17
|
import "../chunk-IUAAXXNO.js";
|
|
18
|
+
import "../chunk-ZUQW5VBZ.js";
|
|
18
19
|
import "../chunk-IHE6KVC3.js";
|
|
19
20
|
import "../chunk-LHZXYFBU.js";
|
|
20
|
-
import "../chunk-ZUQW5VBZ.js";
|
|
21
21
|
import "../chunk-LVQLWRCU.js";
|
|
22
22
|
import "../chunk-CM5CWO4K.js";
|
|
23
|
+
import "../chunk-4J6DS3EJ.js";
|
|
23
24
|
import "../chunk-ZCTUYGNV.js";
|
|
24
25
|
import "../chunk-3TM34RSJ.js";
|
|
25
26
|
import "../chunk-PDJSUH24.js";
|
package/dist/pc/pc.equipment.js
CHANGED
|
@@ -4,22 +4,23 @@ import {
|
|
|
4
4
|
computeSlotsAndAttacks,
|
|
5
5
|
emptyAppliedBonuses,
|
|
6
6
|
isWeaponSlugProficient
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-7XJHI5H5.js";
|
|
8
8
|
import "../chunk-3LWMFYKS.js";
|
|
9
9
|
import "../chunk-YDGMBMYI.js";
|
|
10
10
|
import "../chunk-EJP263OP.js";
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-5JXFJ5AU.js";
|
|
12
|
+
import "../chunk-NXUY5XQN.js";
|
|
13
13
|
import "../chunk-W6GC6OKK.js";
|
|
14
14
|
import "../chunk-B3DP42OM.js";
|
|
15
15
|
import "../chunk-IUAAXXNO.js";
|
|
16
|
+
import "../chunk-ZUQW5VBZ.js";
|
|
16
17
|
import "../chunk-IHE6KVC3.js";
|
|
17
18
|
import "../chunk-HHBD4SQ6.js";
|
|
18
19
|
import "../chunk-A54HHCWW.js";
|
|
19
20
|
import "../chunk-LHZXYFBU.js";
|
|
20
|
-
import "../chunk-ZUQW5VBZ.js";
|
|
21
21
|
import "../chunk-LVQLWRCU.js";
|
|
22
22
|
import "../chunk-CM5CWO4K.js";
|
|
23
|
+
import "../chunk-4J6DS3EJ.js";
|
|
23
24
|
import "../chunk-ZCTUYGNV.js";
|
|
24
25
|
import "../chunk-3TM34RSJ.js";
|
|
25
26
|
import "../chunk-PDJSUH24.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FeatureEffect, SenseType } 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";
|
|
3
|
+
import type { DamageRider, DefenseGrant, FeatureSource, ResolvedCharacter, ResolvedFeature, RollModifierEntry, SaveOutcomeEntry, SpellDamageRider } from "./pc.types.js";
|
|
4
4
|
/**
|
|
5
5
|
* A melee-attack ability override from a `weapon-ability` effect. `weaponSlugs`
|
|
6
6
|
* (bare, namespace-stripped) scopes the override to matching weapon types only;
|
|
@@ -210,11 +210,18 @@ export interface FeatureEffectTotals {
|
|
|
210
210
|
attackNotes: string[];
|
|
211
211
|
/**
|
|
212
212
|
* Additive on-hit damage riders from `damage-bonus` effects with
|
|
213
|
-
* `applies_to` weapon/all (spell
|
|
213
|
+
* `applies_to` weapon/all (spell and all riders also go to `spellDamageBonuses`). Each is
|
|
214
214
|
* labeled with the owning feature's name. recalc merges these onto every
|
|
215
215
|
* weapon AttackRow's `damageRiders`.
|
|
216
216
|
*/
|
|
217
217
|
damageBonuses: DamageRider[];
|
|
218
|
+
/**
|
|
219
|
+
* The `damage-bonus` effects with `applies_to: spell` or `all`, labeled with the owning feature's name and carrying its
|
|
220
|
+
* `spellTargets` and `spell_scope` (found live 2026-09-28: they were dropped here, so Agonizing Blast never reached its
|
|
221
|
+
* cantrip). recalc reads each against the character's spells (`spellsReached`, `spellsInScope`) into
|
|
222
|
+
* `DerivedStats.spellDamageRiders`.
|
|
223
|
+
*/
|
|
224
|
+
spellDamageBonuses: SpellDamageRider[];
|
|
218
225
|
}
|
|
219
226
|
export declare function emptyFeatureEffectTotals(): FeatureEffectTotals;
|
|
220
227
|
/**
|
|
@@ -7,12 +7,25 @@ import {
|
|
|
7
7
|
foldsNow,
|
|
8
8
|
foldsOnSelf,
|
|
9
9
|
selfEffectsOf
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-64VNLMSG.js";
|
|
11
11
|
import "../chunk-TOM66P2P.js";
|
|
12
12
|
import "../chunk-KU3YLF6D.js";
|
|
13
|
-
import "../chunk-
|
|
13
|
+
import "../chunk-5JXFJ5AU.js";
|
|
14
|
+
import "../chunk-RD2MID3M.js";
|
|
15
|
+
import "../chunk-NXUY5XQN.js";
|
|
16
|
+
import "../chunk-W6GC6OKK.js";
|
|
17
|
+
import "../chunk-B3DP42OM.js";
|
|
18
|
+
import "../chunk-IUAAXXNO.js";
|
|
19
|
+
import "../chunk-ZUQW5VBZ.js";
|
|
20
|
+
import "../chunk-IHE6KVC3.js";
|
|
21
|
+
import "../chunk-LHZXYFBU.js";
|
|
22
|
+
import "../chunk-YBLDE5CG.js";
|
|
14
23
|
import "../chunk-LVQLWRCU.js";
|
|
24
|
+
import "../chunk-CM5CWO4K.js";
|
|
25
|
+
import "../chunk-4J6DS3EJ.js";
|
|
15
26
|
import "../chunk-ZCTUYGNV.js";
|
|
27
|
+
import "../chunk-3TM34RSJ.js";
|
|
28
|
+
import "../chunk-PDJSUH24.js";
|
|
16
29
|
import "../chunk-WELIKLZF.js";
|
|
17
30
|
export {
|
|
18
31
|
assembleEffectFeatures,
|
package/dist/pc/pc.infusions.js
CHANGED
|
@@ -23,15 +23,16 @@ import {
|
|
|
23
23
|
scaledInfuseItem,
|
|
24
24
|
splitOne,
|
|
25
25
|
withEntryCharges
|
|
26
|
-
} from "../chunk-
|
|
26
|
+
} from "../chunk-NXUY5XQN.js";
|
|
27
27
|
import "../chunk-W6GC6OKK.js";
|
|
28
28
|
import "../chunk-B3DP42OM.js";
|
|
29
29
|
import "../chunk-IUAAXXNO.js";
|
|
30
|
+
import "../chunk-ZUQW5VBZ.js";
|
|
30
31
|
import "../chunk-IHE6KVC3.js";
|
|
31
32
|
import "../chunk-LHZXYFBU.js";
|
|
32
|
-
import "../chunk-ZUQW5VBZ.js";
|
|
33
33
|
import "../chunk-LVQLWRCU.js";
|
|
34
34
|
import "../chunk-CM5CWO4K.js";
|
|
35
|
+
import "../chunk-4J6DS3EJ.js";
|
|
35
36
|
import "../chunk-ZCTUYGNV.js";
|
|
36
37
|
import "../chunk-3TM34RSJ.js";
|
|
37
38
|
import "../chunk-PDJSUH24.js";
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* from the raw keys the notes already carry (`feat_progression`, `optionalfeature_progression`, `additional_spells`
|
|
12
12
|
* with `choose`, a `spell-choose` prerequisite), so existing notes work with no re-import. Authored `choices` win.
|
|
13
13
|
*/
|
|
14
|
-
import type { Character, ChoiceValue, FeatVia, ResolvedCharacter, ResolvedClass } from "./pc.types.js";
|
|
14
|
+
import type { Character, ChoiceValue, FeatVia, ResolvedCharacter, ResolvedClass, ResolvedSpell, SpellTargets } from "./pc.types.js";
|
|
15
15
|
import type { Choice } from "@archivist-gg/dnd5e/types/choice";
|
|
16
16
|
import type { OptionalFeatureEntity } from "@archivist-gg/dnd5e/types/optional-feature.types";
|
|
17
17
|
import type { FeatEntity } from "@archivist-gg/dnd5e/feat/feat.types";
|
|
@@ -23,6 +23,22 @@ export declare function isTargetChoice(ch: Choice): boolean;
|
|
|
23
23
|
* derived rows carry the member's edition so a pick never offers the other edition's twin.
|
|
24
24
|
*/
|
|
25
25
|
export declare function memberChoices(entity: OptionalFeatureEntity | null | undefined): Choice[];
|
|
26
|
+
/**
|
|
27
|
+
* The spells a member's spell-scoped damage rider reaches, as its DATA names them (found live 2026-09-28: Agonizing
|
|
28
|
+
* Blast's Charisma never reached its cantrip): each answer of a spell target pick (`isTargetChoice`, the blasts' cantrip,
|
|
29
|
+
* read through `read`, the member's nested key) and each `spell-known` prerequisite (the 2014 Agonizing Blast's Eldritch
|
|
30
|
+
* Blast). A target pick left unanswered keeps its filter in `open` (see {@link spellsReached}). Null when the member names
|
|
31
|
+
* no spell, so its spell riders reach none.
|
|
32
|
+
*/
|
|
33
|
+
export declare function memberSpellTargets(member: OptionalFeatureEntity, read: (choiceId: string) => ChoiceValue | undefined): SpellTargets | null;
|
|
34
|
+
/**
|
|
35
|
+
* The slugs of the character's `spells` a rider with `targets` reaches, unique, in `spells` order: every spell a ref
|
|
36
|
+
* names (its full slug, else its bare name, so a path link `[[SRD 5e/eldritch-blast]]` finds `srd-5e_spell_eldritch-blast`),
|
|
37
|
+
* and, for each open target pick, its ONE legal answer: the character's own spells that match the pick's filter and roll
|
|
38
|
+
* damage, when exactly one does ("one of your known Warlock cantrips that deals damage" with only Eldritch Blast known).
|
|
39
|
+
* Two or more legal answers are a choice the player has not made, and reach none.
|
|
40
|
+
*/
|
|
41
|
+
export declare function spellsReached(targets: SpellTargets | undefined, spells: ReadonlyArray<Pick<ResolvedSpell, "slug" | "entity">>): string[];
|
|
26
42
|
/** One stored pool pick whose member carries choices, with the block its nested picks live in. */
|
|
27
43
|
export interface PoolMemberSite {
|
|
28
44
|
classIndex: number;
|
|
@@ -80,6 +96,22 @@ export interface FeatPickSite {
|
|
|
80
96
|
export declare function featPickSites(classEntries: ReadonlyArray<{
|
|
81
97
|
choices?: Character["class"][number]["choices"] | ResolvedClass["choices"];
|
|
82
98
|
}> | undefined, memberSites: PoolMemberSite[], classSlugOf: (classIndex: number) => string | null): FeatPickSite[];
|
|
99
|
+
/** SRD-G T4 (audit §3b): a feat the character picked through a SPECIES (the SRD 5.2 Human's Versatile: "You gain an
|
|
100
|
+
* Origin feat of your choice"): a `select-entity` of `entity_type: feat` on `race.choices[]` or a trait's `choices[]`,
|
|
101
|
+
* answered under `origin_choices["race:<id>"]`. The feat's OWN children are read under `race:feat:<childId>`, the key
|
|
102
|
+
* the builder's ledger writes them to (a race item's feat children carry the `feat:` prefix, namespace `race`). */
|
|
103
|
+
export interface RaceFeatSite {
|
|
104
|
+
slug: string;
|
|
105
|
+
via: FeatVia;
|
|
106
|
+
read: (childId: string) => ChoiceValue | undefined;
|
|
107
|
+
}
|
|
108
|
+
export declare function raceFeatSites(race: {
|
|
109
|
+
slug: string;
|
|
110
|
+
choices?: unknown;
|
|
111
|
+
traits?: ReadonlyArray<{
|
|
112
|
+
choices?: unknown;
|
|
113
|
+
}>;
|
|
114
|
+
} | null | undefined, originChoices: Readonly<Record<string, ChoiceValue>> | undefined): RaceFeatSite[];
|
|
83
115
|
/** Look a feat pick up in the resolved feats (by slug, then bare slug). */
|
|
84
116
|
export declare function featOfSite(site: FeatPickSite, feats: ReadonlyArray<FeatEntity>): FeatEntity | undefined;
|
|
85
117
|
/**
|
|
@@ -3,20 +3,24 @@ import {
|
|
|
3
3
|
featPickSites,
|
|
4
4
|
isTargetChoice,
|
|
5
5
|
memberChoices,
|
|
6
|
+
memberSpellTargets,
|
|
6
7
|
nestedPickKeysToPrune,
|
|
7
8
|
poolMemberSites,
|
|
8
|
-
poolMemberSitesOf
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
poolMemberSitesOf,
|
|
10
|
+
raceFeatSites,
|
|
11
|
+
spellsReached
|
|
12
|
+
} from "../chunk-RD2MID3M.js";
|
|
13
|
+
import "../chunk-NXUY5XQN.js";
|
|
11
14
|
import "../chunk-W6GC6OKK.js";
|
|
12
15
|
import "../chunk-B3DP42OM.js";
|
|
13
16
|
import "../chunk-IUAAXXNO.js";
|
|
17
|
+
import "../chunk-ZUQW5VBZ.js";
|
|
14
18
|
import "../chunk-IHE6KVC3.js";
|
|
15
19
|
import "../chunk-LHZXYFBU.js";
|
|
16
20
|
import "../chunk-YBLDE5CG.js";
|
|
17
|
-
import "../chunk-ZUQW5VBZ.js";
|
|
18
21
|
import "../chunk-LVQLWRCU.js";
|
|
19
22
|
import "../chunk-CM5CWO4K.js";
|
|
23
|
+
import "../chunk-4J6DS3EJ.js";
|
|
20
24
|
import "../chunk-ZCTUYGNV.js";
|
|
21
25
|
import "../chunk-3TM34RSJ.js";
|
|
22
26
|
import "../chunk-PDJSUH24.js";
|
|
@@ -26,7 +30,10 @@ export {
|
|
|
26
30
|
featPickSites,
|
|
27
31
|
isTargetChoice,
|
|
28
32
|
memberChoices,
|
|
33
|
+
memberSpellTargets,
|
|
29
34
|
nestedPickKeysToPrune,
|
|
30
35
|
poolMemberSites,
|
|
31
|
-
poolMemberSitesOf
|
|
36
|
+
poolMemberSitesOf,
|
|
37
|
+
raceFeatSites,
|
|
38
|
+
spellsReached
|
|
32
39
|
};
|
package/dist/pc/pc.parser.js
CHANGED
package/dist/pc/pc.pools.js
CHANGED
|
@@ -4,15 +4,16 @@ import {
|
|
|
4
4
|
resolveAllPools,
|
|
5
5
|
resolvePool,
|
|
6
6
|
strandedPicks
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-NXUY5XQN.js";
|
|
8
8
|
import "../chunk-W6GC6OKK.js";
|
|
9
9
|
import "../chunk-B3DP42OM.js";
|
|
10
10
|
import "../chunk-IUAAXXNO.js";
|
|
11
|
+
import "../chunk-ZUQW5VBZ.js";
|
|
11
12
|
import "../chunk-IHE6KVC3.js";
|
|
12
13
|
import "../chunk-LHZXYFBU.js";
|
|
13
|
-
import "../chunk-ZUQW5VBZ.js";
|
|
14
14
|
import "../chunk-LVQLWRCU.js";
|
|
15
15
|
import "../chunk-CM5CWO4K.js";
|
|
16
|
+
import "../chunk-4J6DS3EJ.js";
|
|
16
17
|
import "../chunk-ZCTUYGNV.js";
|
|
17
18
|
import "../chunk-3TM34RSJ.js";
|
|
18
19
|
import "../chunk-PDJSUH24.js";
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ResolvedCharacter } from "./pc.types.js";
|
|
2
|
+
import type { WeaponEntity } from "@archivist-gg/dnd5e/weapon/weapon.types";
|
|
3
|
+
import { type ProficiencyKind } from "./pc.proficiency-normalize.js";
|
|
2
4
|
import { type ProficiencyEntry, type ProficiencyGrant } from "./pc.proficiency-grants.js";
|
|
3
5
|
/** Re-exported for the plugin: both types are DECLARED in the leaf so that
|
|
4
6
|
* pc.decision-engine can reference them without importing this module, which
|
|
@@ -62,3 +64,15 @@ export interface ProficiencySources {
|
|
|
62
64
|
}
|
|
63
65
|
export declare function collectProficiencySources(resolved: ResolvedCharacter): ProficiencySources;
|
|
64
66
|
export declare function aggregateProficiencies(resolved: ResolvedCharacter): ProficiencyAggregate;
|
|
67
|
+
/** D4 A: one kind's proficiencies as the picker needs them: `effective` is exactly the sheet's line (the aggregate's
|
|
68
|
+
* bucket), `removed` every grant or pick the user's overrides suppress, keeping its `sources`. Both halves come out of
|
|
69
|
+
* the composers the sheet reads, so the picker and the sheet line cannot disagree. */
|
|
70
|
+
export declare function proficiencyOverview(resolved: ResolvedCharacter, kind: ProficiencyKind): {
|
|
71
|
+
effective: ProficiencyEntry[];
|
|
72
|
+
removed: ProficiencyEntry[];
|
|
73
|
+
};
|
|
74
|
+
/** D4 A: the effective weapon entry that covers `weapon` without naming it, a category (`simple`, `martial`, or the
|
|
75
|
+
* entity's own `martial-melee` form) or a property-qualified grant ("Martial weapons that have the Light property").
|
|
76
|
+
* The same three arms as the live gate, `isWeaponSlugProficient` (pc.equipment.ts), so the picker's dimmed "via" row
|
|
77
|
+
* and the attack row's proficiency agree. Undefined when nothing but the weapon's own entry could cover it. */
|
|
78
|
+
export declare function weaponCoveredBy(effective: readonly ProficiencyEntry[], weapon: Pick<WeaponEntity, "category" | "properties" | "range" | "slug">): ProficiencyEntry | undefined;
|