@archivist-gg/dnd5e 0.3.4 → 0.3.6

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 (81) 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-FDBWYMZK.js → chunk-2BI5NAXK.js} +2 -2
  5. package/dist/{chunk-COEOOQX2.js → chunk-3BMVVNCS.js} +1 -1
  6. package/dist/{chunk-LMBAEIP6.js → chunk-3PZHBLFG.js} +1 -1
  7. package/dist/{chunk-UXPGW4TI.js → chunk-4ISR76DH.js} +5 -0
  8. package/dist/{chunk-JRDPUDT5.js → chunk-63XQXPZL.js} +1 -1
  9. package/dist/{chunk-XGOFP7AQ.js → chunk-7MRW4RTH.js} +1 -1
  10. package/dist/{chunk-ZONJ66NE.js → chunk-7WNQJAZW.js} +20 -3
  11. package/dist/{chunk-6PKV5V2H.js → chunk-A6YL53NC.js} +1 -1
  12. package/dist/{chunk-HB7XZXDK.js → chunk-ABQ6ZWAF.js} +1 -1
  13. package/dist/{chunk-R3VAKWKW.js → chunk-B4TQTJVC.js} +1 -1
  14. package/dist/{chunk-RIXI5D3R.js → chunk-BJFL4KYG.js} +3 -3
  15. package/dist/{chunk-US5IKYCW.js → chunk-BS355LND.js} +1 -1
  16. package/dist/{chunk-XBQMCEI2.js → chunk-CQAL67R3.js} +1 -1
  17. package/dist/{chunk-YJJTISBN.js → chunk-DTCR4DBF.js} +3 -3
  18. package/dist/{chunk-I2NDWFDD.js → chunk-E4KG7HXO.js} +9 -0
  19. package/dist/{chunk-XQCSGNXE.js → chunk-EYZCCWG2.js} +51 -2
  20. package/dist/{chunk-5U5FFFA3.js → chunk-H4VEMVOO.js} +1 -1
  21. package/dist/{chunk-T26ZVCL5.js → chunk-IWRVOCT5.js} +1 -1
  22. package/dist/{chunk-ESS46GR4.js → chunk-JKLRBILX.js} +1 -1
  23. package/dist/{chunk-4FWNK4FD.js → chunk-JOVMV2X5.js} +3 -3
  24. package/dist/{chunk-JJ46T5XX.js → chunk-KPEJMNRD.js} +5 -0
  25. package/dist/{chunk-H7KBLR4X.js → chunk-MT4RWROQ.js} +2 -2
  26. package/dist/{chunk-IMZFOOVL.js → chunk-MYW7AOUE.js} +1 -1
  27. package/dist/{chunk-5XMQPTHD.js → chunk-NNAQ4KQF.js} +1 -1
  28. package/dist/{chunk-D5U7GMPX.js → chunk-RWZTGMSN.js} +1 -1
  29. package/dist/{chunk-YLL2QXY2.js → chunk-UA3I2YSO.js} +4 -0
  30. package/dist/{chunk-HJ5EEZ47.js → chunk-ULCQ73LA.js} +1 -1
  31. package/dist/{chunk-OSQFPGLM.js → chunk-V373TRJE.js} +4 -2
  32. package/dist/{chunk-WPWOHGPI.js → chunk-X3D6LXUU.js} +13 -0
  33. package/dist/class/class.codec.js +7 -7
  34. package/dist/class/class.parser.js +6 -6
  35. package/dist/class/class.schema.d.ts +5 -0
  36. package/dist/class/class.schema.js +5 -5
  37. package/dist/feat/feat.codec.js +6 -6
  38. package/dist/feat/feat.parser.js +5 -5
  39. package/dist/feat/feat.schema.d.ts +14 -0
  40. package/dist/feat/feat.schema.js +4 -4
  41. package/dist/index.js +24 -24
  42. package/dist/monster/monster.parser.js +6 -6
  43. package/dist/monster/monster.schema.js +5 -5
  44. package/dist/optional-feature/optional-feature.codec.js +5 -5
  45. package/dist/optional-feature/optional-feature.parser.js +4 -4
  46. package/dist/optional-feature/optional-feature.schema.d.ts +32 -0
  47. package/dist/optional-feature/optional-feature.schema.js +3 -3
  48. package/dist/pc/pc.decision-engine.js +3 -3
  49. package/dist/pc/pc.equipment.d.ts +1 -1
  50. package/dist/pc/pc.equipment.js +1 -1
  51. package/dist/pc/pc.feature-effects.d.ts +9 -0
  52. package/dist/pc/pc.feature-effects.js +1 -1
  53. package/dist/pc/pc.parser.js +1 -1
  54. package/dist/pc/pc.proficiencies.js +3 -3
  55. package/dist/pc/pc.recalc.js +6 -6
  56. package/dist/pc/pc.resolver.d.ts +14 -0
  57. package/dist/pc/pc.resolver.js +5 -3
  58. package/dist/pc/pc.resource-seed.js +1 -1
  59. package/dist/pc/pc.resources.d.ts +6 -0
  60. package/dist/pc/pc.resources.js +1 -1
  61. package/dist/pc/pc.rest.js +1 -1
  62. package/dist/pc/pc.schema.d.ts +1 -0
  63. package/dist/pc/pc.schema.js +1 -1
  64. package/dist/pc/pc.types.d.ts +8 -0
  65. package/dist/race/race.codec.js +7 -7
  66. package/dist/race/race.parser.js +6 -6
  67. package/dist/race/race.schema.js +5 -5
  68. package/dist/schemas/choice-schema.js +2 -2
  69. package/dist/schemas/feature-effect-schema.d.ts +9 -0
  70. package/dist/schemas/feature-effect-schema.js +1 -1
  71. package/dist/schemas/feature-schema.js +4 -4
  72. package/dist/schemas/resource-schema.d.ts +5 -0
  73. package/dist/schemas/resource-schema.js +1 -1
  74. package/dist/subclass/subclass.codec.js +7 -7
  75. package/dist/subclass/subclass.parser.js +6 -6
  76. package/dist/subclass/subclass.schema.d.ts +5 -0
  77. package/dist/subclass/subclass.schema.js +5 -5
  78. package/dist/types/feature-effect.d.ts +7 -0
  79. package/dist/types/optional-feature.types.d.ts +2 -0
  80. package/dist/types/resource.d.ts +5 -0
  81. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  parseFeat
3
- } from "../chunk-D5U7GMPX.js";
4
- import "../chunk-RIXI5D3R.js";
5
- import "../chunk-YLL2QXY2.js";
6
- import "../chunk-T26ZVCL5.js";
7
- import "../chunk-WPWOHGPI.js";
3
+ } from "../chunk-RWZTGMSN.js";
4
+ import "../chunk-BJFL4KYG.js";
5
+ import "../chunk-UA3I2YSO.js";
6
+ import "../chunk-IWRVOCT5.js";
7
+ import "../chunk-X3D6LXUU.js";
8
8
  import "../chunk-UA5KS2PL.js";
9
9
  export {
10
10
  parseFeat
@@ -106,6 +106,15 @@ export declare const featEntitySchema: z.ZodObject<{
106
106
  }, z.core.$strip>>>;
107
107
  condition: z.ZodOptional<z.ZodString>;
108
108
  subject: z.ZodOptional<z.ZodString>;
109
+ }, z.core.$strip>, z.ZodObject<{
110
+ kind: z.ZodLiteral<"attunement-limit">;
111
+ value: z.ZodNumber;
112
+ scales_at: z.ZodOptional<z.ZodArray<z.ZodObject<{
113
+ level: z.ZodNumber;
114
+ value: z.ZodNumber;
115
+ }, z.core.$strip>>>;
116
+ condition: z.ZodOptional<z.ZodString>;
117
+ subject: z.ZodOptional<z.ZodString>;
109
118
  }, z.core.$strip>, z.ZodObject<{
110
119
  kind: z.ZodLiteral<"sense">;
111
120
  type: z.ZodEnum<{
@@ -385,6 +394,11 @@ export declare const featEntitySchema: z.ZodObject<{
385
394
  resource: z.ZodString;
386
395
  amount: z.ZodNumber;
387
396
  }, z.core.$strip>>;
397
+ rendering_hint: z.ZodOptional<z.ZodString>;
398
+ surface: z.ZodOptional<z.ZodEnum<{
399
+ band: "band";
400
+ tab: "tab";
401
+ }>>;
388
402
  recovery: z.ZodOptional<z.ZodArray<z.ZodObject<{
389
403
  id: z.ZodString;
390
404
  name: z.ZodString;
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  featEntitySchema
3
- } from "../chunk-RIXI5D3R.js";
4
- import "../chunk-YLL2QXY2.js";
5
- import "../chunk-T26ZVCL5.js";
6
- import "../chunk-WPWOHGPI.js";
3
+ } from "../chunk-BJFL4KYG.js";
4
+ import "../chunk-UA3I2YSO.js";
5
+ import "../chunk-IWRVOCT5.js";
6
+ import "../chunk-X3D6LXUU.js";
7
7
  import "../chunk-UA5KS2PL.js";
8
8
  export {
9
9
  featEntitySchema
package/dist/index.js CHANGED
@@ -5,9 +5,9 @@ import "./chunk-HZA7OE7N.js";
5
5
  import "./chunk-2DFENQIJ.js";
6
6
  import {
7
7
  subclassCodec
8
- } from "./chunk-R3VAKWKW.js";
9
- import "./chunk-HB7XZXDK.js";
10
- import "./chunk-H7KBLR4X.js";
8
+ } from "./chunk-B4TQTJVC.js";
9
+ import "./chunk-ABQ6ZWAF.js";
10
+ import "./chunk-MT4RWROQ.js";
11
11
  import {
12
12
  spellInputSchema
13
13
  } from "./chunk-656QCX4U.js";
@@ -19,9 +19,9 @@ import {
19
19
  } from "./chunk-WSVMLNTO.js";
20
20
  import {
21
21
  raceCodec
22
- } from "./chunk-XBQMCEI2.js";
23
- import "./chunk-XGOFP7AQ.js";
24
- import "./chunk-FDBWYMZK.js";
22
+ } from "./chunk-CQAL67R3.js";
23
+ import "./chunk-7MRW4RTH.js";
24
+ import "./chunk-2BI5NAXK.js";
25
25
  import "./chunk-OZP6JFGT.js";
26
26
  import "./chunk-VQAXTIBW.js";
27
27
  import {
@@ -34,14 +34,14 @@ import {
34
34
  } from "./chunk-6PXTNCBP.js";
35
35
  import {
36
36
  parseMonster
37
- } from "./chunk-COEOOQX2.js";
38
- import "./chunk-6PKV5V2H.js";
37
+ } from "./chunk-3BMVVNCS.js";
38
+ import "./chunk-A6YL53NC.js";
39
39
  import "./chunk-IKSMX4TN.js";
40
40
  import {
41
41
  optionalFeatureCodec
42
- } from "./chunk-IMZFOOVL.js";
43
- import "./chunk-5XMQPTHD.js";
44
- import "./chunk-ZONJ66NE.js";
42
+ } from "./chunk-MYW7AOUE.js";
43
+ import "./chunk-NNAQ4KQF.js";
44
+ import "./chunk-7WNQJAZW.js";
45
45
  import {
46
46
  itemCodec
47
47
  } from "./chunk-4XTNPNQB.js";
@@ -64,23 +64,23 @@ import {
64
64
  } from "./chunk-LSLSG67V.js";
65
65
  import {
66
66
  featCodec
67
- } from "./chunk-ESS46GR4.js";
68
- import "./chunk-D5U7GMPX.js";
69
- import "./chunk-RIXI5D3R.js";
67
+ } from "./chunk-JKLRBILX.js";
68
+ import "./chunk-RWZTGMSN.js";
69
+ import "./chunk-BJFL4KYG.js";
70
70
  import "./chunk-DEEHHLAP.js";
71
71
  import "./chunk-PDJSUH24.js";
72
72
  import "./chunk-WELIKLZF.js";
73
73
  import {
74
74
  classCodec
75
- } from "./chunk-US5IKYCW.js";
76
- import "./chunk-5U5FFFA3.js";
75
+ } from "./chunk-BS355LND.js";
76
+ import "./chunk-H4VEMVOO.js";
77
77
  import "./chunk-4U55VNC7.js";
78
- import "./chunk-YJJTISBN.js";
78
+ import "./chunk-DTCR4DBF.js";
79
79
  import "./chunk-23LZLBJK.js";
80
80
  import "./chunk-CJYCVNW2.js";
81
- import "./chunk-4FWNK4FD.js";
81
+ import "./chunk-JOVMV2X5.js";
82
82
  import "./chunk-WYGD2UGN.js";
83
- import "./chunk-YLL2QXY2.js";
83
+ import "./chunk-UA3I2YSO.js";
84
84
  import {
85
85
  parseCondition
86
86
  } from "./chunk-6X2NV665.js";
@@ -91,12 +91,12 @@ import "./chunk-5N2GW72F.js";
91
91
  import "./chunk-JC5UNIVM.js";
92
92
  import {
93
93
  backgroundCodec
94
- } from "./chunk-HJ5EEZ47.js";
95
- import "./chunk-LMBAEIP6.js";
96
- import "./chunk-JRDPUDT5.js";
94
+ } from "./chunk-ULCQ73LA.js";
95
+ import "./chunk-3PZHBLFG.js";
96
+ import "./chunk-63XQXPZL.js";
97
97
  import "./chunk-IN4M4X7P.js";
98
- import "./chunk-T26ZVCL5.js";
99
- import "./chunk-WPWOHGPI.js";
98
+ import "./chunk-IWRVOCT5.js";
99
+ import "./chunk-X3D6LXUU.js";
100
100
  import "./chunk-UA5KS2PL.js";
101
101
 
102
102
  // src/monster/monster.codec.ts
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  migrateLegacy,
3
3
  parseMonster
4
- } from "../chunk-COEOOQX2.js";
5
- import "../chunk-6PKV5V2H.js";
6
- import "../chunk-4FWNK4FD.js";
4
+ } from "../chunk-3BMVVNCS.js";
5
+ import "../chunk-A6YL53NC.js";
6
+ import "../chunk-JOVMV2X5.js";
7
7
  import "../chunk-WYGD2UGN.js";
8
- import "../chunk-YLL2QXY2.js";
9
- import "../chunk-T26ZVCL5.js";
10
- import "../chunk-WPWOHGPI.js";
8
+ import "../chunk-UA3I2YSO.js";
9
+ import "../chunk-IWRVOCT5.js";
10
+ import "../chunk-X3D6LXUU.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-6PKV5V2H.js";
15
- import "../chunk-4FWNK4FD.js";
14
+ } from "../chunk-A6YL53NC.js";
15
+ import "../chunk-JOVMV2X5.js";
16
16
  import "../chunk-WYGD2UGN.js";
17
- import "../chunk-YLL2QXY2.js";
18
- import "../chunk-T26ZVCL5.js";
19
- import "../chunk-WPWOHGPI.js";
17
+ import "../chunk-UA3I2YSO.js";
18
+ import "../chunk-IWRVOCT5.js";
19
+ import "../chunk-X3D6LXUU.js";
20
20
  import "../chunk-UA5KS2PL.js";
21
21
  export {
22
22
  MONSTER_KNOWN_KEYS,
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  optionalFeatureCodec
3
- } from "../chunk-IMZFOOVL.js";
4
- import "../chunk-5XMQPTHD.js";
5
- import "../chunk-ZONJ66NE.js";
3
+ } from "../chunk-MYW7AOUE.js";
4
+ import "../chunk-NNAQ4KQF.js";
5
+ import "../chunk-7WNQJAZW.js";
6
6
  import "../chunk-WYGD2UGN.js";
7
- import "../chunk-YLL2QXY2.js";
8
- import "../chunk-WPWOHGPI.js";
7
+ import "../chunk-UA3I2YSO.js";
8
+ import "../chunk-X3D6LXUU.js";
9
9
  import "../chunk-UA5KS2PL.js";
10
10
  export {
11
11
  optionalFeatureCodec
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  parseOptionalFeature
3
- } from "../chunk-5XMQPTHD.js";
4
- import "../chunk-ZONJ66NE.js";
3
+ } from "../chunk-NNAQ4KQF.js";
4
+ import "../chunk-7WNQJAZW.js";
5
5
  import "../chunk-WYGD2UGN.js";
6
- import "../chunk-YLL2QXY2.js";
7
- import "../chunk-WPWOHGPI.js";
6
+ import "../chunk-UA3I2YSO.js";
7
+ import "../chunk-X3D6LXUU.js";
8
8
  import "../chunk-UA5KS2PL.js";
9
9
  export {
10
10
  parseOptionalFeature
@@ -97,6 +97,15 @@ export declare const optionalFeatureEntitySchema: z.ZodObject<{
97
97
  }, z.core.$strip>>>;
98
98
  condition: z.ZodOptional<z.ZodString>;
99
99
  subject: z.ZodOptional<z.ZodString>;
100
+ }, z.core.$strip>, z.ZodObject<{
101
+ kind: z.ZodLiteral<"attunement-limit">;
102
+ value: z.ZodNumber;
103
+ scales_at: z.ZodOptional<z.ZodArray<z.ZodObject<{
104
+ level: z.ZodNumber;
105
+ value: z.ZodNumber;
106
+ }, z.core.$strip>>>;
107
+ condition: z.ZodOptional<z.ZodString>;
108
+ subject: z.ZodOptional<z.ZodString>;
100
109
  }, z.core.$strip>, z.ZodObject<{
101
110
  kind: z.ZodLiteral<"sense">;
102
111
  type: z.ZodEnum<{
@@ -333,6 +342,25 @@ export declare const optionalFeatureEntitySchema: z.ZodObject<{
333
342
  round: "round";
334
343
  custom: "custom";
335
344
  }>;
345
+ recovery: z.ZodOptional<z.ZodArray<z.ZodObject<{
346
+ id: z.ZodString;
347
+ name: z.ZodString;
348
+ amount: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
349
+ reset: z.ZodEnum<{
350
+ "short-rest": "short-rest";
351
+ "long-rest": "long-rest";
352
+ either: "either";
353
+ dawn: "dawn";
354
+ dusk: "dusk";
355
+ turn: "turn";
356
+ round: "round";
357
+ custom: "custom";
358
+ }>;
359
+ restores: z.ZodOptional<z.ZodEnum<{
360
+ uses: "uses";
361
+ "spell-slots": "spell-slots";
362
+ }>>;
363
+ }, z.core.$strip>>>;
336
364
  }, z.core.$strip>>>;
337
365
  consumes: z.ZodOptional<z.ZodNullable<z.ZodObject<{
338
366
  source: z.ZodOptional<z.ZodEnum<{
@@ -377,6 +405,10 @@ export declare const optionalFeatureEntitySchema: z.ZodObject<{
377
405
  passive: z.ZodOptional<z.ZodBoolean>;
378
406
  activatable: z.ZodOptional<z.ZodBoolean>;
379
407
  rendering_hint: z.ZodOptional<z.ZodString>;
408
+ surface: z.ZodOptional<z.ZodEnum<{
409
+ band: "band";
410
+ tab: "tab";
411
+ }>>;
380
412
  additional_spells: z.ZodOptional<z.ZodArray<z.ZodObject<{
381
413
  name: z.ZodOptional<z.ZodString>;
382
414
  ability: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  optionalFeatureEntitySchema
3
- } from "../chunk-ZONJ66NE.js";
3
+ } from "../chunk-7WNQJAZW.js";
4
4
  import "../chunk-WYGD2UGN.js";
5
- import "../chunk-YLL2QXY2.js";
6
- import "../chunk-WPWOHGPI.js";
5
+ import "../chunk-UA3I2YSO.js";
6
+ import "../chunk-X3D6LXUU.js";
7
7
  import "../chunk-UA5KS2PL.js";
8
8
  export {
9
9
  optionalFeatureEntitySchema
@@ -4,8 +4,8 @@ import {
4
4
  collectChosenAbilityPoints,
5
5
  collectChosenProficiencies,
6
6
  computeEffectiveProficiencies
7
- } from "../chunk-XQCSGNXE.js";
8
- import "../chunk-UXPGW4TI.js";
7
+ } from "../chunk-EYZCCWG2.js";
8
+ import "../chunk-4ISR76DH.js";
9
9
  import "../chunk-DPUJDOKV.js";
10
10
  import "../chunk-O4SRD3J5.js";
11
11
  import "../chunk-PP2UHLBA.js";
@@ -14,7 +14,7 @@ import "../chunk-YHYTW5QA.js";
14
14
  import "../chunk-MI7P3NX3.js";
15
15
  import "../chunk-PVCEA4HZ.js";
16
16
  import "../chunk-UBBKSYBY.js";
17
- import "../chunk-JJ46T5XX.js";
17
+ import "../chunk-KPEJMNRD.js";
18
18
  import "../chunk-TOM66P2P.js";
19
19
  import "../chunk-KU3YLF6D.js";
20
20
  import "../chunk-RLGQ5PZZ.js";
@@ -38,5 +38,5 @@ export interface UnarmedStrikeSpec {
38
38
  * this row carries no weapon, so `Unarmed` is capitalised here beside `Unarmed Strike`, `5 ft` and `bludgeoning`
39
39
  * rather than in a renderer (R4-G6b live rider R-1). */
40
40
  export declare function buildUnarmedRow(mods: Record<Ability, number>, proficiencyBonus: number, spec?: UnarmedStrikeSpec): AttackRow;
41
- export declare function computeSlotsAndAttacks(resolved: ResolvedCharacter, mods: Record<Ability, number>, profs: ProficienciesForQuery, registry: EntityRegistry, warnings: string[], proficiencyBonus: number, weaponAbilities?: WeaponAbilityOverride[], weaponMasteries?: string[]): DerivedEquipment;
41
+ export declare function computeSlotsAndAttacks(resolved: ResolvedCharacter, mods: Record<Ability, number>, profs: ProficienciesForQuery, registry: EntityRegistry, warnings: string[], proficiencyBonus: number, weaponAbilities?: WeaponAbilityOverride[], weaponMasteries?: string[], attunementFloor?: number): DerivedEquipment;
42
42
  export {};
@@ -4,7 +4,7 @@ import {
4
4
  computeSlotsAndAttacks,
5
5
  emptyAppliedBonuses,
6
6
  isWeaponSlugProficient
7
- } from "../chunk-OSQFPGLM.js";
7
+ } from "../chunk-V373TRJE.js";
8
8
  import "../chunk-UIRMA5KM.js";
9
9
  import "../chunk-UBBKSYBY.js";
10
10
  import "../chunk-RLGQ5PZZ.js";
@@ -38,6 +38,15 @@ export interface FeatureEffectTotals {
38
38
  * A `scales_at` progression resolves BEFORE the max, at the effect's own source level (R4-G7 §7.3).
39
39
  */
40
40
  speed_walk_set: number;
41
+ /**
42
+ * Absolute attunement CAP granted by `attunement-limit` effects (the Artificer's Magic Item
43
+ * Adept / Savant / Master line). Max across all grants; 0 = nothing granted it. recalc applies it
44
+ * as Math.max(3, attunement_set) so a grant can never LOWER the baseline, and an explicit
45
+ * `overrides.attunement_limit` on the character still wins outright — a number the player typed is
46
+ * intent, not a derived value. A `scales_at` progression resolves BEFORE the max, at the effect's
47
+ * own source level (R4-G7 §7.3).
48
+ */
49
+ attunement_set: number;
41
50
  /** Flat ability-score bumps from `ability-score-increase` effects whose `abilities` is a FIXED LIST (the three level-20
42
51
  * capstones). `chosen` arms are the ASI SLOT's second encoding and MUST NOT fold (the synthesized feat decision pays
43
52
  * them; a flat fold double-counts). No cap: `max` is declared and unread (user ruling 2026-09-03). */
@@ -7,7 +7,7 @@ import {
7
7
  foldsNow,
8
8
  foldsOnSelf,
9
9
  selfEffectsOf
10
- } from "../chunk-JJ46T5XX.js";
10
+ } from "../chunk-KPEJMNRD.js";
11
11
  import "../chunk-TOM66P2P.js";
12
12
  import "../chunk-KU3YLF6D.js";
13
13
  import "../chunk-RLGQ5PZZ.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  characterSchema
3
- } from "../chunk-I2NDWFDD.js";
3
+ } from "../chunk-E4KG7HXO.js";
4
4
  import "../chunk-S7REMWW4.js";
5
5
 
6
6
  // src/pc/pc.parser.ts
@@ -2,8 +2,8 @@ import {
2
2
  collectChosenProficiencies,
3
3
  collectProficiencyGrants,
4
4
  computeEffectiveProficiencies
5
- } from "../chunk-XQCSGNXE.js";
6
- import "../chunk-UXPGW4TI.js";
5
+ } from "../chunk-EYZCCWG2.js";
6
+ import "../chunk-4ISR76DH.js";
7
7
  import "../chunk-DPUJDOKV.js";
8
8
  import "../chunk-O4SRD3J5.js";
9
9
  import "../chunk-PP2UHLBA.js";
@@ -12,7 +12,7 @@ import "../chunk-YHYTW5QA.js";
12
12
  import "../chunk-MI7P3NX3.js";
13
13
  import "../chunk-PVCEA4HZ.js";
14
14
  import "../chunk-UBBKSYBY.js";
15
- import "../chunk-JJ46T5XX.js";
15
+ import "../chunk-KPEJMNRD.js";
16
16
  import "../chunk-TOM66P2P.js";
17
17
  import "../chunk-KU3YLF6D.js";
18
18
  import {
@@ -4,10 +4,10 @@ import {
4
4
  import {
5
5
  collectChosenAbilityPoints,
6
6
  collectChosenProficiencies
7
- } from "../chunk-XQCSGNXE.js";
7
+ } from "../chunk-EYZCCWG2.js";
8
8
  import {
9
9
  resourceLevelFor
10
- } from "../chunk-UXPGW4TI.js";
10
+ } from "../chunk-4ISR76DH.js";
11
11
  import {
12
12
  computeSpellLimits,
13
13
  deriveSpellSlots,
@@ -31,7 +31,7 @@ import {
31
31
  computeAppliedBonuses,
32
32
  computeSlotsAndAttacks,
33
33
  emptyAppliedBonuses
34
- } from "../chunk-OSQFPGLM.js";
34
+ } from "../chunk-V373TRJE.js";
35
35
  import "../chunk-UIRMA5KM.js";
36
36
  import "../chunk-UBBKSYBY.js";
37
37
  import {
@@ -39,7 +39,7 @@ import {
39
39
  computeFeatureEffects,
40
40
  foldsNow,
41
41
  selfEffectsOf
42
- } from "../chunk-JJ46T5XX.js";
42
+ } from "../chunk-KPEJMNRD.js";
43
43
  import "../chunk-TOM66P2P.js";
44
44
  import "../chunk-KU3YLF6D.js";
45
45
  import "../chunk-RLGQ5PZZ.js";
@@ -680,7 +680,7 @@ function recalc(resolved, registry) {
680
680
  let acBreakdownDerived = [];
681
681
  let acInformationalDerived = [];
682
682
  if (registry) {
683
- derivedEquipment = computeSlotsAndAttacks(resolved, mods, profsForApply, registry, warnings, proficiencyBonus, weaponAbilities, (_B = resolved.weaponMasteries) != null ? _B : []);
683
+ derivedEquipment = computeSlotsAndAttacks(resolved, mods, profsForApply, registry, warnings, proficiencyBonus, weaponAbilities, (_B = resolved.weaponMasteries) != null ? _B : [], featureEffects.attunement_set);
684
684
  if (derivedEquipment.equippedSlots.armor) {
685
685
  const featTerms = featureAcTermsFor(true);
686
686
  acDerived = derivedEquipment.ac + sumTerms(featTerms);
@@ -846,7 +846,7 @@ function recalc(resolved, registry) {
846
846
  equippedSlots: (_R = derivedEquipment == null ? void 0 : derivedEquipment.equippedSlots) != null ? _R : {},
847
847
  carriedWeight: (_S = derivedEquipment == null ? void 0 : derivedEquipment.carriedWeight) != null ? _S : 0,
848
848
  attunementUsed: (_T = derivedEquipment == null ? void 0 : derivedEquipment.attunementUsed) != null ? _T : 0,
849
- attunementLimit: (_V = derivedEquipment == null ? void 0 : derivedEquipment.attunementLimit) != null ? _V : (_U = overrides.attunement_limit) != null ? _U : 3,
849
+ attunementLimit: (_V = derivedEquipment == null ? void 0 : derivedEquipment.attunementLimit) != null ? _V : (_U = overrides.attunement_limit) != null ? _U : Math.max(3, featureEffects.attunement_set),
850
850
  conditionEffects,
851
851
  rollModifiers: featureEffects.rollModifiers,
852
852
  saveOutcomes: featureEffects.saveOutcomes
@@ -127,4 +127,18 @@ export declare function collectChosenGrantedFeatures(character: Character, class
127
127
  data: Record<string, unknown>;
128
128
  } | undefined;
129
129
  }, race?: RaceEntity | null, background?: BackgroundEntity | null): ResolvedFeature[];
130
+ /**
131
+ * `character.additional_features` → ResolvedFeatures (the DM-grant path).
132
+ *
133
+ * Deliberately NOT routed through `walkChoiceGrants`: that converter emits
134
+ * `{id, name, description, effects, action}` and DROPS `uses`, which is correct there because a pool
135
+ * pick's tracker is built separately by `resolveResourceIndex`'s pools loop. A campaign grant has no
136
+ * pool, so nothing would ever build its tracker — the feature would render as a card with no counter.
137
+ * This walk therefore converts `uses` into the feature's own `resources[]`, which
138
+ * `resolveFeatureResources` already indexes, and the grant gets a tracker with no pool involved.
139
+ *
140
+ * A prose `uses.max` (the 4 shipped carriers that have one) yields no resource rather than a broken
141
+ * tracker, matching the pools loop's rule; the feature still renders.
142
+ */
143
+ export declare function collectAdditionalFeatures(character: Character, entities: EntityRegistry, warnings: string[]): ResolvedFeature[];
130
144
  export declare function collectResolvedFeatures(race: RaceEntity | null, classes: ResolvedClass[], background: BackgroundEntity | null, feats: FeatEntity[], featVia?: ReadonlyMap<string, FeatVia>): ResolvedFeature[];
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  PCResolver,
3
+ collectAdditionalFeatures,
3
4
  collectChosenGrantedFeatures,
4
5
  collectChosenWeaponMasteries,
5
6
  collectFeatGrantedSpells,
@@ -9,8 +10,8 @@ import {
9
10
  dedupeResolvedSpells,
10
11
  resolveOriginFeat,
11
12
  stripSlug
12
- } from "../chunk-XQCSGNXE.js";
13
- import "../chunk-UXPGW4TI.js";
13
+ } from "../chunk-EYZCCWG2.js";
14
+ import "../chunk-4ISR76DH.js";
14
15
  import "../chunk-DPUJDOKV.js";
15
16
  import "../chunk-O4SRD3J5.js";
16
17
  import "../chunk-PP2UHLBA.js";
@@ -19,7 +20,7 @@ import "../chunk-YHYTW5QA.js";
19
20
  import "../chunk-MI7P3NX3.js";
20
21
  import "../chunk-PVCEA4HZ.js";
21
22
  import "../chunk-UBBKSYBY.js";
22
- import "../chunk-JJ46T5XX.js";
23
+ import "../chunk-KPEJMNRD.js";
23
24
  import "../chunk-TOM66P2P.js";
24
25
  import "../chunk-KU3YLF6D.js";
25
26
  import "../chunk-RLGQ5PZZ.js";
@@ -37,6 +38,7 @@ import "../chunk-4U55VNC7.js";
37
38
  import "../chunk-UA5KS2PL.js";
38
39
  export {
39
40
  PCResolver,
41
+ collectAdditionalFeatures,
40
42
  collectChosenGrantedFeatures,
41
43
  collectChosenWeaponMasteries,
42
44
  collectFeatGrantedSpells,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resourceLevelFor
3
- } from "../chunk-UXPGW4TI.js";
3
+ } from "../chunk-4ISR76DH.js";
4
4
  import "../chunk-DPUJDOKV.js";
5
5
  import {
6
6
  numericColumnsAt
@@ -50,6 +50,12 @@ export interface ResolvedResource {
50
50
  scalesAt?: ResourceScaleStep[];
51
51
  recovery?: ResolvedRecovery[];
52
52
  owner: ResourceOwner;
53
+ /** Which control draws this resource — the declaring note's `rendering_hint`, carried verbatim and
54
+ * never interpreted here. The renderer owns the hint → component table; the engine only delivers the
55
+ * string, so adding a component is a change in ONE table and adding a resource is no code at all. */
56
+ renderingHint?: string;
57
+ /** `band` = also drawn in the header strip. Absent = the Resources tab alone. */
58
+ surface?: "band" | "tab";
53
59
  }
54
60
  export type ResourceIndex = ReadonlyMap<string, ResolvedResource>;
55
61
  /** KIND first (the schema key; absent = `uses`, UR2), FLAVOUR second (`action` / `reset`): a
@@ -4,7 +4,7 @@ import {
4
4
  resolveRecovery,
5
5
  resolveResourceIndex,
6
6
  resourceLevelFor
7
- } from "../chunk-UXPGW4TI.js";
7
+ } from "../chunk-4ISR76DH.js";
8
8
  import "../chunk-DPUJDOKV.js";
9
9
  import "../chunk-IUAAXXNO.js";
10
10
  import "../chunk-LVQLWRCU.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveResourceIndex
3
- } from "../chunk-UXPGW4TI.js";
3
+ } from "../chunk-4ISR76DH.js";
4
4
  import "../chunk-DPUJDOKV.js";
5
5
  import "../chunk-IUAAXXNO.js";
6
6
  import "../chunk-LVQLWRCU.js";
@@ -389,6 +389,7 @@ export declare const characterSchema: z.ZodObject<{
389
389
  gp: z.ZodNumber;
390
390
  pp: z.ZodNumber;
391
391
  }, z.core.$strip>>;
392
+ additional_features: z.ZodDefault<z.ZodArray<z.ZodString>>;
392
393
  notes: z.ZodOptional<z.ZodString>;
393
394
  defenses: z.ZodOptional<z.ZodObject<{
394
395
  resistances: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString>>>;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  characterOverridesShape,
3
3
  characterSchema
4
- } from "../chunk-I2NDWFDD.js";
4
+ } from "../chunk-E4KG7HXO.js";
5
5
  import "../chunk-S7REMWW4.js";
6
6
  export {
7
7
  characterOverridesShape,
@@ -279,6 +279,9 @@ export interface Character {
279
279
  gp: number;
280
280
  pp: number;
281
281
  };
282
+ /** DM grants: optional-feature slugs resolved onto the character with no class, level or pool behind
283
+ * them. Placement is the declaring note's `surface`, never a flag here. */
284
+ additional_features?: string[];
282
285
  notes?: string;
283
286
  defenses?: {
284
287
  resistances?: string[];
@@ -317,6 +320,11 @@ export type FeatureSource = {
317
320
  kind: "feat";
318
321
  slug: string;
319
322
  via?: FeatVia;
323
+ }
324
+ /** A DM grant listed in `character.additional_features`. No class, no level, no pool behind it. */
325
+ | {
326
+ kind: "campaign";
327
+ slug: string;
320
328
  };
321
329
  export interface ResolvedFeature {
322
330
  feature: Feature;
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  raceCodec
3
- } from "../chunk-XBQMCEI2.js";
4
- import "../chunk-XGOFP7AQ.js";
5
- import "../chunk-FDBWYMZK.js";
3
+ } from "../chunk-CQAL67R3.js";
4
+ import "../chunk-7MRW4RTH.js";
5
+ import "../chunk-2BI5NAXK.js";
6
6
  import "../chunk-4U55VNC7.js";
7
- import "../chunk-4FWNK4FD.js";
7
+ import "../chunk-JOVMV2X5.js";
8
8
  import "../chunk-WYGD2UGN.js";
9
- import "../chunk-YLL2QXY2.js";
10
- import "../chunk-T26ZVCL5.js";
11
- import "../chunk-WPWOHGPI.js";
9
+ import "../chunk-UA3I2YSO.js";
10
+ import "../chunk-IWRVOCT5.js";
11
+ import "../chunk-X3D6LXUU.js";
12
12
  import "../chunk-UA5KS2PL.js";
13
13
  export {
14
14
  raceCodec
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  parseRace
3
- } from "../chunk-XGOFP7AQ.js";
4
- import "../chunk-FDBWYMZK.js";
3
+ } from "../chunk-7MRW4RTH.js";
4
+ import "../chunk-2BI5NAXK.js";
5
5
  import "../chunk-4U55VNC7.js";
6
- import "../chunk-4FWNK4FD.js";
6
+ import "../chunk-JOVMV2X5.js";
7
7
  import "../chunk-WYGD2UGN.js";
8
- import "../chunk-YLL2QXY2.js";
9
- import "../chunk-T26ZVCL5.js";
10
- import "../chunk-WPWOHGPI.js";
8
+ import "../chunk-UA3I2YSO.js";
9
+ import "../chunk-IWRVOCT5.js";
10
+ import "../chunk-X3D6LXUU.js";
11
11
  import "../chunk-UA5KS2PL.js";
12
12
  export {
13
13
  parseRace
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  fixedAsiSchema,
3
3
  raceEntitySchema
4
- } from "../chunk-FDBWYMZK.js";
5
- import "../chunk-4FWNK4FD.js";
4
+ } from "../chunk-2BI5NAXK.js";
5
+ import "../chunk-JOVMV2X5.js";
6
6
  import "../chunk-WYGD2UGN.js";
7
- import "../chunk-YLL2QXY2.js";
8
- import "../chunk-T26ZVCL5.js";
9
- import "../chunk-WPWOHGPI.js";
7
+ import "../chunk-UA3I2YSO.js";
8
+ import "../chunk-IWRVOCT5.js";
9
+ import "../chunk-X3D6LXUU.js";
10
10
  import "../chunk-UA5KS2PL.js";
11
11
  export {
12
12
  fixedAsiSchema,