@archivist-gg/dnd5e 0.3.13 → 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.
Files changed (122) hide show
  1. package/dist/background/background.codec.js +5 -5
  2. package/dist/background/background.parser.js +4 -4
  3. package/dist/background/background.schema.js +3 -3
  4. package/dist/chunk-3LWMFYKS.js +57 -0
  5. package/dist/{chunk-4SLOJXJ4.js → chunk-3SFGWFVQ.js} +1 -1
  6. package/dist/{chunk-Q6UOHCCT.js → chunk-3SIUAFDQ.js} +1 -1
  7. package/dist/chunk-4J6DS3EJ.js +30 -0
  8. package/dist/{chunk-RLGQ5PZZ.js → chunk-5JXFJ5AU.js} +11 -1
  9. package/dist/{chunk-4BZ47YJ4.js → chunk-64VNLMSG.js} +59 -16
  10. package/dist/{chunk-XY6X2APM.js → chunk-7Q2VPKCD.js} +17 -0
  11. package/dist/{chunk-Q5XTEYHD.js → chunk-7XJHI5H5.js} +16 -9
  12. package/dist/{chunk-FPGXFD2M.js → chunk-B2QHP6UF.js} +2 -2
  13. package/dist/{chunk-HJQNK3J5.js → chunk-B3DP42OM.js} +1 -4
  14. package/dist/{chunk-MC5YJ4PB.js → chunk-BJGOSM76.js} +1 -1
  15. package/dist/{chunk-VDPRBUU5.js → chunk-BJWSOQUC.js} +1 -1
  16. package/dist/{chunk-QEO7LYTG.js → chunk-EJD47JHL.js} +181 -93
  17. package/dist/{chunk-X7VZY4ON.js → chunk-FJYBLXV7.js} +2 -2
  18. package/dist/{chunk-QSBJ6NEM.js → chunk-FMUD3LDV.js} +1 -1
  19. package/dist/{chunk-LVX6TQ3R.js → chunk-FMYWORTP.js} +2 -2
  20. package/dist/{chunk-PX25R3DK.js → chunk-FVXLP7P3.js} +1 -1
  21. package/dist/{chunk-XJRNEQPD.js → chunk-GVWEFECG.js} +1 -1
  22. package/dist/{chunk-R2V5LN3I.js → chunk-HY2SRSVM.js} +1 -1
  23. package/dist/{chunk-ZMJQUZQH.js → chunk-JXWNXIIZ.js} +24 -0
  24. package/dist/chunk-KR6JF3BF.js +14 -0
  25. package/dist/{chunk-DPM6V7YX.js → chunk-LICYHPI3.js} +82 -6
  26. package/dist/{chunk-J53ERF6K.js → chunk-LNT64X7C.js} +1 -1
  27. package/dist/{chunk-RQNJXADQ.js → chunk-NKZMQV2C.js} +1 -1
  28. package/dist/{chunk-UE6LKRXQ.js → chunk-NTU2DXNG.js} +24 -1
  29. package/dist/{chunk-T5GZBKIQ.js → chunk-NXUY5XQN.js} +168 -33
  30. package/dist/{chunk-M2OWVAZG.js → chunk-NZO7M5GV.js} +1 -1
  31. package/dist/{chunk-BRGLDWUP.js → chunk-OOL4KMG2.js} +7 -3
  32. package/dist/{chunk-MWCCGPG3.js → chunk-OOSRUJBI.js} +3 -2
  33. package/dist/{chunk-H5PTKYXL.js → chunk-QA3YCOML.js} +1 -1
  34. package/dist/{chunk-MUIU7RZ3.js → chunk-QFWQKS3M.js} +1 -1
  35. package/dist/chunk-RD2MID3M.js +292 -0
  36. package/dist/chunk-TRBGC4ZG.js +112 -0
  37. package/dist/{chunk-PLOSP4XQ.js → chunk-UJCK5IW4.js} +11 -2
  38. package/dist/{chunk-5KGV6TF7.js → chunk-UNYR5GLI.js} +1 -1
  39. package/dist/{chunk-JNNNBEUH.js → chunk-VN5DLURA.js} +7 -2
  40. package/dist/{chunk-EL6QPF6I.js → chunk-VP5TIXDK.js} +1 -1
  41. package/dist/chunk-WOHX7YTH.js +165 -0
  42. package/dist/{chunk-G7ED5H2G.js → chunk-XTEFPUSN.js} +1 -1
  43. package/dist/{chunk-6ZY3U6BQ.js → chunk-ZOWKWMD2.js} +1 -1
  44. package/dist/class/class.codec.js +6 -6
  45. package/dist/class/class.parser.js +5 -5
  46. package/dist/class/class.schema.d.ts +8 -0
  47. package/dist/class/class.schema.js +4 -4
  48. package/dist/class/class.standard-array.d.ts +16 -0
  49. package/dist/class/class.standard-array.js +20 -0
  50. package/dist/class/class.types.d.ts +3 -0
  51. package/dist/dnd/amount-text.d.ts +42 -0
  52. package/dist/dnd/amount-text.js +15 -0
  53. package/dist/dnd/resource-words.d.ts +4 -0
  54. package/dist/dnd/resource-words.js +30 -0
  55. package/dist/entities/registry-revision.d.ts +25 -0
  56. package/dist/entities/registry-revision.js +10 -0
  57. package/dist/feat/feat.codec.js +5 -5
  58. package/dist/feat/feat.parser.js +4 -4
  59. package/dist/feat/feat.schema.d.ts +34 -0
  60. package/dist/feat/feat.schema.js +3 -3
  61. package/dist/index.js +4027 -383
  62. package/dist/monster/monster.parser.js +5 -5
  63. package/dist/monster/monster.schema.js +4 -4
  64. package/dist/optional-feature/optional-feature.codec.js +5 -4
  65. package/dist/optional-feature/optional-feature.parser.js +4 -3
  66. package/dist/optional-feature/optional-feature.schema.d.ts +35 -0
  67. package/dist/optional-feature/optional-feature.schema.js +3 -2
  68. package/dist/pc/pc.additional-spells.d.ts +16 -2
  69. package/dist/pc/pc.additional-spells.js +5 -2
  70. package/dist/pc/pc.amount-bindings.d.ts +41 -0
  71. package/dist/pc/pc.amount-bindings.js +28 -0
  72. package/dist/pc/pc.decision-engine.d.ts +11 -0
  73. package/dist/pc/pc.decision-engine.js +20 -16
  74. package/dist/pc/pc.entry-overrides.js +3 -2
  75. package/dist/pc/pc.equipment.js +7 -5
  76. package/dist/pc/pc.feature-effects.d.ts +21 -2
  77. package/dist/pc/pc.feature-effects.js +15 -2
  78. package/dist/pc/pc.infusions.d.ts +9 -1
  79. package/dist/pc/pc.infusions.js +3 -2
  80. package/dist/pc/pc.member-choices.d.ts +122 -0
  81. package/dist/pc/pc.member-choices.js +39 -0
  82. package/dist/pc/pc.parser.js +1 -1
  83. package/dist/pc/pc.pools.d.ts +7 -0
  84. package/dist/pc/pc.pools.js +5 -2
  85. package/dist/pc/pc.proficiencies.d.ts +14 -0
  86. package/dist/pc/pc.proficiencies.js +72 -22
  87. package/dist/pc/pc.proficiency-normalize.d.ts +14 -0
  88. package/dist/pc/pc.proficiency-normalize.js +9 -3
  89. package/dist/pc/pc.proficiency-query.js +7 -1
  90. package/dist/pc/pc.recalc.js +212 -99
  91. package/dist/pc/pc.resolver.d.ts +6 -2
  92. package/dist/pc/pc.resolver.js +16 -14
  93. package/dist/pc/pc.rest.js +4 -3
  94. package/dist/pc/pc.schema.d.ts +48 -2
  95. package/dist/pc/pc.schema.js +1 -1
  96. package/dist/pc/pc.spell-scope.d.ts +22 -0
  97. package/dist/pc/pc.tool-picks.js +2 -2
  98. package/dist/pc/pc.types.d.ts +110 -6
  99. package/dist/pc/pc.weapon-grant.d.ts +15 -0
  100. package/dist/pc/pool-layout.d.ts +3 -9
  101. package/dist/pc/pool-layout.js +1 -3
  102. package/dist/pc/resource-equivalents.d.ts +44 -0
  103. package/dist/pc/spell-source.js +4 -9
  104. package/dist/race/race.codec.js +6 -6
  105. package/dist/race/race.parser.js +5 -5
  106. package/dist/race/race.schema.js +4 -4
  107. package/dist/schemas/choice-schema.js +2 -2
  108. package/dist/schemas/feature-effect-schema.d.ts +34 -0
  109. package/dist/schemas/feature-effect-schema.js +1 -1
  110. package/dist/schemas/feature-schema.js +3 -3
  111. package/dist/spell/spell.codec.js +2 -2
  112. package/dist/spell/spell.parser.d.ts +6 -1
  113. package/dist/spell/spell.parser.js +5 -3
  114. package/dist/spell/spell.types.d.ts +10 -0
  115. package/dist/subclass/subclass.codec.js +6 -6
  116. package/dist/subclass/subclass.parser.js +5 -5
  117. package/dist/subclass/subclass.schema.js +4 -4
  118. package/dist/types/choice.d.ts +7 -2
  119. package/dist/types/feature-effect.d.ts +24 -0
  120. package/dist/types/optional-feature.types.d.ts +6 -1
  121. package/dist/types/selection-pool.d.ts +2 -2
  122. package/package.json +1 -1
@@ -1,5 +1,10 @@
1
1
  import type { CastingOption } from "@archivist-gg/dnd5e/types/casting-option";
2
2
  export type { CastingOption };
3
+ export interface SpellMaterial {
4
+ text: string;
5
+ cost?: number;
6
+ consume?: boolean | string;
7
+ }
3
8
  export interface Spell {
4
9
  name: string;
5
10
  level?: number;
@@ -7,6 +12,11 @@ export interface Spell {
7
12
  casting_time?: string;
8
13
  range?: string;
9
14
  components?: string;
15
+ /** D2b-B: the converter's structured material component (`components.m` as an object), kept beside the `components` string,
16
+ * which cannot carry its numbers: `cost` in copper pieces as authored (5etools), `consume` true or a word ("optional").
17
+ * Absent for a string `components`, a bare `m: true` or a string `m`. A PARSE output only, never a YAML key: the codec
18
+ * drops it on serialize. */
19
+ material?: SpellMaterial;
10
20
  duration?: string;
11
21
  concentration?: boolean;
12
22
  ritual?: boolean;
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  subclassCodec
3
- } from "../chunk-M2OWVAZG.js";
4
- import "../chunk-5KGV6TF7.js";
5
- import "../chunk-J53ERF6K.js";
3
+ } from "../chunk-NZO7M5GV.js";
4
+ import "../chunk-UNYR5GLI.js";
5
+ import "../chunk-LNT64X7C.js";
6
6
  import "../chunk-4U55VNC7.js";
7
7
  import "../chunk-G6MHJDVT.js";
8
8
  import "../chunk-CJYCVNW2.js";
9
- import "../chunk-FPGXFD2M.js";
9
+ import "../chunk-B2QHP6UF.js";
10
10
  import "../chunk-WYGD2UGN.js";
11
11
  import "../chunk-ZJXSXVFP.js";
12
- import "../chunk-BRGLDWUP.js";
13
- import "../chunk-ZMJQUZQH.js";
12
+ import "../chunk-OOL4KMG2.js";
13
+ import "../chunk-JXWNXIIZ.js";
14
14
  import "../chunk-UA5KS2PL.js";
15
15
  export {
16
16
  subclassCodec
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  parseSubclass
3
- } from "../chunk-5KGV6TF7.js";
4
- import "../chunk-J53ERF6K.js";
3
+ } from "../chunk-UNYR5GLI.js";
4
+ import "../chunk-LNT64X7C.js";
5
5
  import "../chunk-4U55VNC7.js";
6
6
  import "../chunk-G6MHJDVT.js";
7
7
  import "../chunk-CJYCVNW2.js";
8
- import "../chunk-FPGXFD2M.js";
8
+ import "../chunk-B2QHP6UF.js";
9
9
  import "../chunk-WYGD2UGN.js";
10
10
  import "../chunk-ZJXSXVFP.js";
11
- import "../chunk-BRGLDWUP.js";
12
- import "../chunk-ZMJQUZQH.js";
11
+ import "../chunk-OOL4KMG2.js";
12
+ import "../chunk-JXWNXIIZ.js";
13
13
  import "../chunk-UA5KS2PL.js";
14
14
  export {
15
15
  parseSubclass
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  subclassEntitySchema
3
- } from "../chunk-J53ERF6K.js";
3
+ } from "../chunk-LNT64X7C.js";
4
4
  import "../chunk-G6MHJDVT.js";
5
5
  import "../chunk-CJYCVNW2.js";
6
- import "../chunk-FPGXFD2M.js";
6
+ import "../chunk-B2QHP6UF.js";
7
7
  import "../chunk-WYGD2UGN.js";
8
8
  import "../chunk-ZJXSXVFP.js";
9
- import "../chunk-BRGLDWUP.js";
10
- import "../chunk-ZMJQUZQH.js";
9
+ import "../chunk-OOL4KMG2.js";
10
+ import "../chunk-JXWNXIIZ.js";
11
11
  import "../chunk-UA5KS2PL.js";
12
12
  export {
13
13
  subclassEntitySchema
@@ -22,8 +22,8 @@ export declare const ALL_SKILL_SLUGS: SkillSlug[];
22
22
  * comparison, `matchPool` — a module-level helper it shares with its other call
23
23
  * sites, not one of its own. `computeEffectiveProficiencies` reads ALL_LANGUAGES
24
24
  * from HERE, directly — it does not go through the generator's KNOWN_LANGUAGES.
25
- * · the PLUGIN: `proficiency-edit-modal.ts` renders its LANGUAGE section from
26
- * `[...ALL_LANGUAGES, ...suppressed]`.
25
+ * · the PLUGIN: `proficiency-picker.ts` (D4 A) lists STANDARD, EXOTIC ("Rare") and
26
+ * SECRET_LANGUAGES as its Languages rows, plus any held or removed value they miss.
27
27
  * Membership is also what makes two spellings of one language FOLD onto a single
28
28
  * row: a vocabulary MISS keys on the raw string and splits the row in two. */
29
29
  export declare const STANDARD_LANGUAGES: string[];
@@ -88,6 +88,8 @@ export interface EntityFilter {
88
88
  list?: string;
89
89
  level?: number;
90
90
  edition?: string;
91
+ /** D2b-A: true keeps only spells a note marks `ritual` (Pact of the Tome's rituals). */
92
+ ritual?: boolean;
91
93
  }
92
94
  export interface InlineOption {
93
95
  value: string;
@@ -116,6 +118,9 @@ export type Choice = {
116
118
  entity_type: string;
117
119
  from?: string[];
118
120
  where?: EntityFilter;
121
+ /** D2b-A: the pick names a TARGET (the cantrip a blast invocation's rider reaches), not a grant: nothing it picks
122
+ * becomes the character's own (a spell, a feat, a feature). */
123
+ target?: true;
119
124
  } | {
120
125
  kind: "select-proficiency";
121
126
  id: string;
@@ -5,6 +5,23 @@ export type SenseType = "darkvision" | "blindsight" | "tremorsense" | "truesight
5
5
  * Unarmed Strike row, `finesse` and `thrown` the row's properties, and `weapon` every attack row (today's reach, the
6
6
  * Unarmed Strike row included). A list reaches a row when ANY word matches it. */
7
7
  export type WeaponScope = "weapon" | "melee" | "ranged" | "unarmed" | "finesse" | "thrown";
8
+ /** A spell damage rider's spell scope, the `damage-bonus` arm's `spell_scope` (found 2026-09-29: Potent Spellcasting,
9
+ * Empowered Evocation, Elemental Affinity and Radiant Soul said which spells they reach only in prose, so they reached
10
+ * none). The rider reaches a character's spell that DEALS DAMAGE when every word it carries matches: `list` the spell is
11
+ * on that class's list, `level` its exact level (0 = cantrip), `school` its school, `damage_types` it deals ANY of them,
12
+ * `damage_type_pick` it deals the damage type the character chose at that `select-inline` (its option value or a type
13
+ * named in its label, "Red (Fire)"), `spells` it is one of these (a name or a slug). `once`: the rider adds to ONE damage
14
+ * roll of the casting, however many rolls or targets the spell has ("one damage roll of that spell"). Read with
15
+ * `applies_to: spell` or `all`; `all` with no scope reaches every damaging spell. */
16
+ export interface SpellScope {
17
+ list?: string;
18
+ level?: number;
19
+ school?: string;
20
+ damage_types?: string[];
21
+ damage_type_pick?: string;
22
+ spells?: string[];
23
+ once?: boolean;
24
+ }
8
25
  /** Present on every arm: whose numbers the effect changes. Absent === "self". The engine's fold readers skip
9
26
  * every effect whose subject is present and not "self" (`foldsOnSelf` in pc.feature-effects.ts). */
10
27
  type Subject = {
@@ -27,6 +44,12 @@ export type FeatureEffect = ({
27
44
  skills: string[];
28
45
  ability: Ability;
29
46
  minimum?: number;
47
+ } & Qualified) | ({
48
+ kind: "save-bonus";
49
+ ability: Ability;
50
+ minimum?: number;
51
+ saves?: Ability[];
52
+ inactive_while?: "incapacitated" | "unconscious";
30
53
  } & Qualified) | ({
31
54
  kind: "half-proficiency";
32
55
  skills?: string[];
@@ -75,6 +98,7 @@ export type FeatureEffect = ({
75
98
  damage_type: string;
76
99
  amount: string;
77
100
  applies_to?: "spell" | "all" | WeaponScope | WeaponScope[];
101
+ spell_scope?: SpellScope;
78
102
  } & Qualified) | ({
79
103
  kind: "proficiency";
80
104
  proficiency_type: "skill" | "tool" | "language" | "saving-throw" | "armor" | "weapon";
@@ -1,3 +1,4 @@
1
+ import type { Choice } from "./choice.js";
1
2
  import type { FeatureEffect } from "./feature-effect.js";
2
3
  import type { ActionCost, ResetTrigger, ResourceConsumption } from "./resource.js";
3
4
  import type { Duration } from "../schemas/duration-schema.js";
@@ -8,7 +9,7 @@ import type { AdditionalSpellsEntry, ProgressionEntry } from "../schemas/entity-
8
9
  * `feature_type` field is now an open string (see {@link OptionalFeatureEntity})
9
10
  * so homebrew categories parse; this union is kept purely as a reference list.
10
11
  */
11
- export type OptionalFeatureKind = "invocation" | "fighting_style" | "metamagic" | "maneuver" | "infusion" | "artificer_plan";
12
+ export type OptionalFeatureKind = "invocation" | "fighting_style" | "metamagic" | "maneuver" | "infusion" | "artificer_plan" | "pact_boon";
12
13
  /** A class/subclass named reference carried by a level prerequisite; mirrors namedRefSchema. */
13
14
  export type OptionalFeatureNamedRef = {
14
15
  name: string;
@@ -165,4 +166,8 @@ export interface OptionalFeatureEntity {
165
166
  options?: OptionRow[];
166
167
  /** This member infuses an existing object; its effect is an item-vocabulary overlay (spec §4.2). */
167
168
  infuse?: InfuseBlock;
169
+ /** D2b-A (design §2.2 step 1): the member's OWN choices (Lessons of the First Ones' Origin feat, Superior Technique's
170
+ * maneuver, Pact of the Tome's cantrips and rituals), in the same `Choice` vocabulary features and feats use. Absent,
171
+ * the engine derives them from the raw keys the note already carries (`memberChoices`, `pc.member-choices.ts`). */
172
+ choices?: Choice[];
168
173
  }
@@ -43,8 +43,8 @@ export interface PoolGrant {
43
43
  * members' `rendering_hint` at resolve time onto `ResolvedPool.layout` (pc/pool-layout.ts), and that
44
44
  * derivation is UNCONDITIONAL: it runs whether or not the declaration carries a `layout`. R4-G4 T5
45
45
  * LANDED the precedence in the plugin: `TabsContainer`'s dynamic-pool-tab loop reads the AUTHORED
46
- * value first, then `ResolvedPool.layout`, then the `spell-like` default, and `PoolTab`'s `LAYOUTS`
47
- * registry routes all four members (an unknown string degrades to `spell-like` and never throws).
46
+ * value first, then `ResolvedPool.layout`. Since PT (spec §9) every pool tab draws one table and the value
47
+ * picks only the tab's HEAD (`poolPresentation`); `spell-like` and `blocks` still parse and are ignored.
48
48
  * R4-G5 CLOSED that list, and NOT by adding values: `pool-selection` and `stance` never get a layout value
49
49
  * (measured, spec §10: the three `stance`-hinted documents are field-identical to three unhinted siblings, and
50
50
  * `pool-selection`'s meaning is delivered by `spell-like` plus the §5 head), and `granted-die-to-ally` is a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@archivist-gg/dnd5e",
3
- "version": "0.3.13",
3
+ "version": "0.3.19",
4
4
  "license": "MIT AND CC-BY-4.0",
5
5
  "type": "module",
6
6
  "publishConfig": {