@archivist-gg/dnd5e 0.3.11 → 0.3.13

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 (164) hide show
  1. package/LICENSES/SRD.md +38 -3
  2. package/dist/armor/armor.codec.js +3 -3
  3. package/dist/armor/armor.parser.js +2 -2
  4. package/dist/armor/armor.schema.d.ts +1 -0
  5. package/dist/armor/armor.schema.js +1 -1
  6. package/dist/armor/armor.types.d.ts +2 -0
  7. package/dist/background/background.codec.js +5 -5
  8. package/dist/background/background.parser.js +4 -4
  9. package/dist/background/background.schema.js +3 -3
  10. package/dist/chunk-2LULMQTF.js +14 -0
  11. package/dist/{chunk-CBEKVAX4.js → chunk-4BZ47YJ4.js} +10 -3
  12. package/dist/{chunk-T2SNEJOE.js → chunk-4SLOJXJ4.js} +1 -1
  13. package/dist/{chunk-2DFENQIJ.js → chunk-5GKJAUMX.js} +2 -0
  14. package/dist/{chunk-J77CKYV3.js → chunk-5KGV6TF7.js} +1 -1
  15. package/dist/{chunk-CHUALUIX.js → chunk-6ZY3U6BQ.js} +1 -1
  16. package/dist/{chunk-DNAJRMNN.js → chunk-A54HHCWW.js} +6 -7
  17. package/dist/{chunk-2M34FLAY.js → chunk-BRGLDWUP.js} +3 -1
  18. package/dist/chunk-CM5CWO4K.js +735 -0
  19. package/dist/{chunk-3HX5VLWP.js → chunk-DPM6V7YX.js} +1 -1
  20. package/dist/chunk-EJP263OP.js +186 -0
  21. package/dist/{chunk-G247QXWW.js → chunk-EL6QPF6I.js} +1 -1
  22. package/dist/{chunk-SMLXZUBH.js → chunk-EYX4JMAU.js} +4 -1
  23. package/dist/{chunk-AW3EHF3L.js → chunk-FC4IGH5Y.js} +1 -1
  24. package/dist/{chunk-PI4LLJG4.js → chunk-FPGXFD2M.js} +2 -2
  25. package/dist/{chunk-23LZLBJK.js → chunk-G6MHJDVT.js} +6 -2
  26. package/dist/{chunk-NWDF5HG3.js → chunk-G7ED5H2G.js} +1 -1
  27. package/dist/chunk-H5PTKYXL.js +101 -0
  28. package/dist/{chunk-LWFTHJIE.js → chunk-HHBD4SQ6.js} +1 -1
  29. package/dist/{chunk-PP2UHLBA.js → chunk-HJQNK3J5.js} +8 -0
  30. package/dist/{chunk-JC5UNIVM.js → chunk-HS6FIOLP.js} +2 -0
  31. package/dist/chunk-IHE6KVC3.js +13 -0
  32. package/dist/{chunk-BLRW2UU6.js → chunk-J53ERF6K.js} +2 -2
  33. package/dist/{chunk-MQ747UCR.js → chunk-JNNNBEUH.js} +65 -2
  34. package/dist/{chunk-LDDCNPHD.js → chunk-K5NJBTE2.js} +1 -1
  35. package/dist/{chunk-4ISR76DH.js → chunk-KSTV7J2U.js} +9 -3
  36. package/dist/chunk-LBEXLN6I.js +91 -0
  37. package/dist/{chunk-UBBKSYBY.js → chunk-LHZXYFBU.js} +30 -1
  38. package/dist/{chunk-U3BABVJF.js → chunk-LVX6TQ3R.js} +2 -2
  39. package/dist/{chunk-R747YKS7.js → chunk-M2OWVAZG.js} +1 -1
  40. package/dist/{chunk-7YU4NPKR.js → chunk-MC5YJ4PB.js} +1 -1
  41. package/dist/{chunk-JCEV7KYN.js → chunk-MUIU7RZ3.js} +1 -1
  42. package/dist/{chunk-R2ZV233X.js → chunk-MYY2C5MB.js} +3 -3
  43. package/dist/{chunk-S56D6B6C.js → chunk-PLOSP4XQ.js} +3 -3
  44. package/dist/{chunk-JANNRGJC.js → chunk-PX25R3DK.js} +1 -1
  45. package/dist/{chunk-V373TRJE.js → chunk-Q5XTEYHD.js} +191 -125
  46. package/dist/{chunk-MAH6DCRI.js → chunk-Q6UOHCCT.js} +1 -1
  47. package/dist/{chunk-2INMRR3Q.js → chunk-QEO7LYTG.js} +215 -94
  48. package/dist/{chunk-PJMG5XV3.js → chunk-QSBJ6NEM.js} +1 -1
  49. package/dist/{chunk-BL3VELKP.js → chunk-R2V5LN3I.js} +1 -1
  50. package/dist/{chunk-4DOMDEBZ.js → chunk-RQNJXADQ.js} +1 -1
  51. package/dist/{chunk-GFZ7PITJ.js → chunk-S3YUXDSC.js} +6 -1
  52. package/dist/chunk-T5GZBKIQ.js +927 -0
  53. package/dist/{chunk-PZCE7DJM.js → chunk-UE6LKRXQ.js} +15 -1
  54. package/dist/{chunk-5N2GW72F.js → chunk-UZXG6QSY.js} +2 -1
  55. package/dist/{chunk-QHMWA3SZ.js → chunk-VDPRBUU5.js} +1 -1
  56. package/dist/{chunk-4XTNPNQB.js → chunk-VPYBK2MG.js} +1 -1
  57. package/dist/{chunk-V6LJFP4R.js → chunk-X7VZY4ON.js} +2 -2
  58. package/dist/{chunk-HZA7OE7N.js → chunk-XCFC7LGF.js} +2 -1
  59. package/dist/{chunk-BIA32MQ5.js → chunk-XJRNEQPD.js} +1 -1
  60. package/dist/{chunk-UIRMA5KM.js → chunk-YDGMBMYI.js} +1 -1
  61. package/dist/{chunk-6X4KUDMU.js → chunk-ZCTUYGNV.js} +7 -2
  62. package/dist/{chunk-XTRDCSJB.js → chunk-ZMJQUZQH.js} +4 -1
  63. package/dist/chunk-ZUQW5VBZ.js +89 -0
  64. package/dist/class/class.codec.js +7 -7
  65. package/dist/class/class.parser.js +6 -6
  66. package/dist/class/class.schema.d.ts +10 -0
  67. package/dist/class/class.schema.js +5 -5
  68. package/dist/entities/base-item-resolver.js +2 -2
  69. package/dist/entities/slug.d.ts +18 -8
  70. package/dist/entities/slug.js +3 -1
  71. package/dist/feat/feat.codec.js +5 -5
  72. package/dist/feat/feat.parser.js +4 -4
  73. package/dist/feat/feat.schema.d.ts +16 -3
  74. package/dist/feat/feat.schema.js +3 -3
  75. package/dist/index.js +7190 -4116
  76. package/dist/item/item.actions-map.d.ts +40 -5
  77. package/dist/item/item.actions-map.js +5 -84
  78. package/dist/item/item.attunement.js +3 -9
  79. package/dist/item/item.bonuses.js +5 -2
  80. package/dist/item/item.codec.js +3 -3
  81. package/dist/item/item.conditions.js +4 -1
  82. package/dist/item/item.conditions.types.d.ts +4 -0
  83. package/dist/item/item.cost.d.ts +3 -0
  84. package/dist/item/item.cost.js +29 -0
  85. package/dist/item/item.icon.d.ts +15 -0
  86. package/dist/item/item.icon.js +211 -0
  87. package/dist/item/item.parser.js +2 -2
  88. package/dist/item/item.schema.d.ts +16 -1
  89. package/dist/item/item.schema.js +3 -1
  90. package/dist/item/item.types.d.ts +9 -2
  91. package/dist/monster/monster.parser.js +5 -5
  92. package/dist/monster/monster.schema.js +4 -4
  93. package/dist/optional-feature/optional-feature.codec.js +4 -4
  94. package/dist/optional-feature/optional-feature.parser.js +3 -3
  95. package/dist/optional-feature/optional-feature.schema.d.ts +229 -3
  96. package/dist/optional-feature/optional-feature.schema.js +6 -2
  97. package/dist/pc/pc.additional-spells.js +2 -2
  98. package/dist/pc/pc.asi-flatten.d.ts +62 -1
  99. package/dist/pc/pc.asi-flatten.js +16 -0
  100. package/dist/pc/pc.conditions.js +1 -1
  101. package/dist/pc/pc.containment.d.ts +45 -0
  102. package/dist/pc/pc.containment.js +24 -0
  103. package/dist/pc/pc.decision-engine.d.ts +21 -3
  104. package/dist/pc/pc.decision-engine.js +21 -12
  105. package/dist/pc/pc.entry-overrides.d.ts +79 -0
  106. package/dist/pc/pc.entry-overrides.js +40 -0
  107. package/dist/pc/pc.equipment.d.ts +2 -2
  108. package/dist/pc/pc.equipment.js +18 -7
  109. package/dist/pc/pc.feature-effects.js +2 -2
  110. package/dist/pc/pc.infusions.d.ts +220 -0
  111. package/dist/pc/pc.infusions.js +64 -0
  112. package/dist/pc/pc.parser.js +18 -1
  113. package/dist/pc/pc.pools.d.ts +1 -1
  114. package/dist/pc/pc.pools.js +11 -3
  115. package/dist/pc/pc.proficiencies.js +19 -12
  116. package/dist/pc/pc.recalc.d.ts +39 -36
  117. package/dist/pc/pc.recalc.js +58 -30
  118. package/dist/pc/pc.resolver.js +19 -12
  119. package/dist/pc/pc.resource-seed.js +1 -1
  120. package/dist/pc/pc.resources.d.ts +6 -1
  121. package/dist/pc/pc.resources.js +3 -1
  122. package/dist/pc/pc.rest.d.ts +21 -1
  123. package/dist/pc/pc.rest.js +52 -19
  124. package/dist/pc/pc.schema.d.ts +14 -0
  125. package/dist/pc/pc.schema.js +1 -1
  126. package/dist/pc/pc.slotting.d.ts +36 -3
  127. package/dist/pc/pc.slotting.js +13 -5
  128. package/dist/pc/pc.tool-picks.d.ts +51 -0
  129. package/dist/pc/pc.tool-picks.js +18 -0
  130. package/dist/pc/pc.types.d.ts +70 -12
  131. package/dist/pc/pool-layout.d.ts +14 -0
  132. package/dist/pc/pool-layout.js +7 -3
  133. package/dist/race/race.codec.js +6 -6
  134. package/dist/race/race.parser.js +5 -5
  135. package/dist/race/race.schema.js +4 -4
  136. package/dist/schemas/attack-schema.d.ts +1 -1
  137. package/dist/schemas/choice-schema.js +2 -2
  138. package/dist/schemas/feature-effect-schema.d.ts +16 -3
  139. package/dist/schemas/feature-effect-schema.js +1 -1
  140. package/dist/schemas/feature-schema.js +3 -3
  141. package/dist/schemas/selection-pool-schema.d.ts +10 -0
  142. package/dist/schemas/selection-pool-schema.js +1 -1
  143. package/dist/srd/retired-items.d.ts +14 -0
  144. package/dist/srd/retired-items.js +11 -0
  145. package/dist/subclass/subclass.codec.js +7 -7
  146. package/dist/subclass/subclass.parser.js +6 -6
  147. package/dist/subclass/subclass.schema.d.ts +10 -0
  148. package/dist/subclass/subclass.schema.js +5 -5
  149. package/dist/types/choice.d.ts +8 -0
  150. package/dist/types/equipment-grant.d.ts +18 -1
  151. package/dist/types/equipment-grant.js +12 -0
  152. package/dist/types/feature-effect.d.ts +6 -1
  153. package/dist/types/optional-feature.types.d.ts +79 -1
  154. package/dist/types/selection-pool.d.ts +16 -1
  155. package/dist/weapon/weapon.classify.d.ts +10 -8
  156. package/dist/weapon/weapon.classify.js +2 -2
  157. package/dist/weapon/weapon.codec.js +3 -3
  158. package/dist/weapon/weapon.parser.js +2 -2
  159. package/dist/weapon/weapon.schema.d.ts +1 -0
  160. package/dist/weapon/weapon.schema.js +1 -1
  161. package/dist/weapon/weapon.types.d.ts +2 -0
  162. package/package.json +1 -1
  163. package/dist/chunk-O4SRD3J5.js +0 -165
  164. package/dist/chunk-WXWPK3LI.js +0 -55
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  optionalFeatureCodec
3
- } from "../chunk-JANNRGJC.js";
4
- import "../chunk-PJMG5XV3.js";
5
- import "../chunk-MQ747UCR.js";
3
+ } from "../chunk-PX25R3DK.js";
4
+ import "../chunk-QSBJ6NEM.js";
5
+ import "../chunk-JNNNBEUH.js";
6
6
  import "../chunk-WYGD2UGN.js";
7
7
  import "../chunk-ZJXSXVFP.js";
8
- import "../chunk-XTRDCSJB.js";
8
+ import "../chunk-ZMJQUZQH.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-PJMG5XV3.js";
4
- import "../chunk-MQ747UCR.js";
3
+ } from "../chunk-QSBJ6NEM.js";
4
+ import "../chunk-JNNNBEUH.js";
5
5
  import "../chunk-WYGD2UGN.js";
6
6
  import "../chunk-ZJXSXVFP.js";
7
- import "../chunk-XTRDCSJB.js";
7
+ import "../chunk-ZMJQUZQH.js";
8
8
  import "../chunk-UA5KS2PL.js";
9
9
  export {
10
10
  parseOptionalFeature
@@ -1,4 +1,108 @@
1
1
  import { z } from "zod";
2
+ export declare const optionRowSchema: z.ZodObject<{
3
+ key: z.ZodString;
4
+ name: z.ZodString;
5
+ min_level: z.ZodNumber;
6
+ attunement: z.ZodOptional<z.ZodBoolean>;
7
+ creates: z.ZodObject<{
8
+ item: z.ZodOptional<z.ZodString>;
9
+ variant: z.ZodOptional<z.ZodObject<{
10
+ candidates: z.ZodArray<z.ZodString>;
11
+ }, z.core.$strict>>;
12
+ filter: z.ZodOptional<z.ZodObject<{
13
+ rarity: z.ZodArray<z.ZodString>;
14
+ types: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ exclude_types: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ cursed: z.ZodOptional<z.ZodLiteral<false>>;
17
+ }, z.core.$strict>>;
18
+ }, z.core.$strict>;
19
+ }, z.core.$strict>;
20
+ export declare const infuseBlockSchema: z.ZodObject<{
21
+ targets: z.ZodArray<z.ZodObject<{
22
+ kind: z.ZodEnum<{
23
+ weapon: "weapon";
24
+ armor: "armor";
25
+ shield: "shield";
26
+ gear: "gear";
27
+ }>;
28
+ category: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ property: z.ZodOptional<z.ZodString>;
30
+ name_any: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
+ }, z.core.$strict>>;
32
+ targets_label: z.ZodOptional<z.ZodString>;
33
+ new_object: z.ZodOptional<z.ZodString>;
34
+ rarity: z.ZodOptional<z.ZodString>;
35
+ attunement: z.ZodOptional<z.ZodObject<{
36
+ required: z.ZodLiteral<true>;
37
+ }, z.core.$strict>>;
38
+ choice: z.ZodOptional<z.ZodObject<{
39
+ kind: z.ZodLiteral<"damage-type">;
40
+ options: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
+ }, z.core.$strict>>;
42
+ item: z.ZodOptional<z.ZodObject<{
43
+ bonuses: z.ZodOptional<z.ZodObject<{
44
+ ac: z.ZodOptional<z.ZodNumber>;
45
+ weapon_attack: z.ZodOptional<z.ZodNumber>;
46
+ weapon_damage: z.ZodOptional<z.ZodNumber>;
47
+ spell_attack: z.ZodOptional<z.ZodNumber>;
48
+ saving_throws: z.ZodOptional<z.ZodNumber>;
49
+ speed: z.ZodOptional<z.ZodObject<{
50
+ walk: z.ZodOptional<z.ZodNumber>;
51
+ fly: z.ZodOptional<z.ZodNumber>;
52
+ swim: z.ZodOptional<z.ZodNumber>;
53
+ climb: z.ZodOptional<z.ZodNumber>;
54
+ }, z.core.$strict>>;
55
+ }, z.core.$strict>>;
56
+ resist: z.ZodOptional<z.ZodArray<z.ZodString>>;
57
+ charges: z.ZodOptional<z.ZodObject<{
58
+ max: z.ZodNumber;
59
+ dice: z.ZodOptional<z.ZodString>;
60
+ recharge: z.ZodOptional<z.ZodString>;
61
+ recharge_amount: z.ZodOptional<z.ZodString>;
62
+ }, z.core.$strict>>;
63
+ action: z.ZodOptional<z.ZodEnum<{
64
+ action: "action";
65
+ "bonus-action": "bonus-action";
66
+ reaction: "reaction";
67
+ free: "free";
68
+ special: "special";
69
+ }>>;
70
+ range: z.ZodOptional<z.ZodString>;
71
+ }, z.core.$strict>>;
72
+ scales_at: z.ZodOptional<z.ZodArray<z.ZodObject<{
73
+ level: z.ZodNumber;
74
+ item: z.ZodObject<{
75
+ bonuses: z.ZodOptional<z.ZodObject<{
76
+ ac: z.ZodOptional<z.ZodNumber>;
77
+ weapon_attack: z.ZodOptional<z.ZodNumber>;
78
+ weapon_damage: z.ZodOptional<z.ZodNumber>;
79
+ spell_attack: z.ZodOptional<z.ZodNumber>;
80
+ saving_throws: z.ZodOptional<z.ZodNumber>;
81
+ speed: z.ZodOptional<z.ZodObject<{
82
+ walk: z.ZodOptional<z.ZodNumber>;
83
+ fly: z.ZodOptional<z.ZodNumber>;
84
+ swim: z.ZodOptional<z.ZodNumber>;
85
+ climb: z.ZodOptional<z.ZodNumber>;
86
+ }, z.core.$strict>>;
87
+ }, z.core.$strict>>;
88
+ resist: z.ZodOptional<z.ZodArray<z.ZodString>>;
89
+ charges: z.ZodOptional<z.ZodObject<{
90
+ max: z.ZodNumber;
91
+ dice: z.ZodOptional<z.ZodString>;
92
+ recharge: z.ZodOptional<z.ZodString>;
93
+ recharge_amount: z.ZodOptional<z.ZodString>;
94
+ }, z.core.$strict>>;
95
+ action: z.ZodOptional<z.ZodEnum<{
96
+ action: "action";
97
+ "bonus-action": "bonus-action";
98
+ reaction: "reaction";
99
+ free: "free";
100
+ special: "special";
101
+ }>>;
102
+ range: z.ZodOptional<z.ZodString>;
103
+ }, z.core.$strict>;
104
+ }, z.core.$strict>>>;
105
+ }, z.core.$strict>;
2
106
  export declare const optionalFeatureEntitySchema: z.ZodObject<{
3
107
  slug: z.ZodString;
4
108
  name: z.ZodString;
@@ -154,11 +258,24 @@ export declare const optionalFeatureEntitySchema: z.ZodObject<{
154
258
  kind: z.ZodLiteral<"damage-bonus">;
155
259
  damage_type: z.ZodString;
156
260
  amount: z.ZodString;
157
- applies_to: z.ZodOptional<z.ZodEnum<{
158
- weapon: "weapon";
261
+ applies_to: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
159
262
  spell: "spell";
160
263
  all: "all";
161
- }>>;
264
+ }>, z.ZodEnum<{
265
+ weapon: "weapon";
266
+ melee: "melee";
267
+ ranged: "ranged";
268
+ unarmed: "unarmed";
269
+ finesse: "finesse";
270
+ thrown: "thrown";
271
+ }>, z.ZodArray<z.ZodEnum<{
272
+ weapon: "weapon";
273
+ melee: "melee";
274
+ ranged: "ranged";
275
+ unarmed: "unarmed";
276
+ finesse: "finesse";
277
+ thrown: "thrown";
278
+ }>>]>>;
162
279
  condition: z.ZodOptional<z.ZodString>;
163
280
  subject: z.ZodOptional<z.ZodString>;
164
281
  }, z.core.$strip>, z.ZodObject<{
@@ -463,6 +580,115 @@ export declare const optionalFeatureEntitySchema: z.ZodObject<{
463
580
  required: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
464
581
  }, z.core.$strip>>>;
465
582
  image: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
583
+ repeatable: z.ZodOptional<z.ZodLiteral<true>>;
584
+ item_choice: z.ZodOptional<z.ZodEnum<{
585
+ learn: "learn";
586
+ create: "create";
587
+ }>>;
588
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
589
+ key: z.ZodString;
590
+ name: z.ZodString;
591
+ min_level: z.ZodNumber;
592
+ attunement: z.ZodOptional<z.ZodBoolean>;
593
+ creates: z.ZodObject<{
594
+ item: z.ZodOptional<z.ZodString>;
595
+ variant: z.ZodOptional<z.ZodObject<{
596
+ candidates: z.ZodArray<z.ZodString>;
597
+ }, z.core.$strict>>;
598
+ filter: z.ZodOptional<z.ZodObject<{
599
+ rarity: z.ZodArray<z.ZodString>;
600
+ types: z.ZodOptional<z.ZodArray<z.ZodString>>;
601
+ exclude_types: z.ZodOptional<z.ZodArray<z.ZodString>>;
602
+ cursed: z.ZodOptional<z.ZodLiteral<false>>;
603
+ }, z.core.$strict>>;
604
+ }, z.core.$strict>;
605
+ }, z.core.$strict>>>;
606
+ infuse: z.ZodOptional<z.ZodObject<{
607
+ targets: z.ZodArray<z.ZodObject<{
608
+ kind: z.ZodEnum<{
609
+ weapon: "weapon";
610
+ armor: "armor";
611
+ shield: "shield";
612
+ gear: "gear";
613
+ }>;
614
+ category: z.ZodOptional<z.ZodArray<z.ZodString>>;
615
+ property: z.ZodOptional<z.ZodString>;
616
+ name_any: z.ZodOptional<z.ZodArray<z.ZodString>>;
617
+ }, z.core.$strict>>;
618
+ targets_label: z.ZodOptional<z.ZodString>;
619
+ new_object: z.ZodOptional<z.ZodString>;
620
+ rarity: z.ZodOptional<z.ZodString>;
621
+ attunement: z.ZodOptional<z.ZodObject<{
622
+ required: z.ZodLiteral<true>;
623
+ }, z.core.$strict>>;
624
+ choice: z.ZodOptional<z.ZodObject<{
625
+ kind: z.ZodLiteral<"damage-type">;
626
+ options: z.ZodOptional<z.ZodArray<z.ZodString>>;
627
+ }, z.core.$strict>>;
628
+ item: z.ZodOptional<z.ZodObject<{
629
+ bonuses: z.ZodOptional<z.ZodObject<{
630
+ ac: z.ZodOptional<z.ZodNumber>;
631
+ weapon_attack: z.ZodOptional<z.ZodNumber>;
632
+ weapon_damage: z.ZodOptional<z.ZodNumber>;
633
+ spell_attack: z.ZodOptional<z.ZodNumber>;
634
+ saving_throws: z.ZodOptional<z.ZodNumber>;
635
+ speed: z.ZodOptional<z.ZodObject<{
636
+ walk: z.ZodOptional<z.ZodNumber>;
637
+ fly: z.ZodOptional<z.ZodNumber>;
638
+ swim: z.ZodOptional<z.ZodNumber>;
639
+ climb: z.ZodOptional<z.ZodNumber>;
640
+ }, z.core.$strict>>;
641
+ }, z.core.$strict>>;
642
+ resist: z.ZodOptional<z.ZodArray<z.ZodString>>;
643
+ charges: z.ZodOptional<z.ZodObject<{
644
+ max: z.ZodNumber;
645
+ dice: z.ZodOptional<z.ZodString>;
646
+ recharge: z.ZodOptional<z.ZodString>;
647
+ recharge_amount: z.ZodOptional<z.ZodString>;
648
+ }, z.core.$strict>>;
649
+ action: z.ZodOptional<z.ZodEnum<{
650
+ action: "action";
651
+ "bonus-action": "bonus-action";
652
+ reaction: "reaction";
653
+ free: "free";
654
+ special: "special";
655
+ }>>;
656
+ range: z.ZodOptional<z.ZodString>;
657
+ }, z.core.$strict>>;
658
+ scales_at: z.ZodOptional<z.ZodArray<z.ZodObject<{
659
+ level: z.ZodNumber;
660
+ item: z.ZodObject<{
661
+ bonuses: z.ZodOptional<z.ZodObject<{
662
+ ac: z.ZodOptional<z.ZodNumber>;
663
+ weapon_attack: z.ZodOptional<z.ZodNumber>;
664
+ weapon_damage: z.ZodOptional<z.ZodNumber>;
665
+ spell_attack: z.ZodOptional<z.ZodNumber>;
666
+ saving_throws: z.ZodOptional<z.ZodNumber>;
667
+ speed: z.ZodOptional<z.ZodObject<{
668
+ walk: z.ZodOptional<z.ZodNumber>;
669
+ fly: z.ZodOptional<z.ZodNumber>;
670
+ swim: z.ZodOptional<z.ZodNumber>;
671
+ climb: z.ZodOptional<z.ZodNumber>;
672
+ }, z.core.$strict>>;
673
+ }, z.core.$strict>>;
674
+ resist: z.ZodOptional<z.ZodArray<z.ZodString>>;
675
+ charges: z.ZodOptional<z.ZodObject<{
676
+ max: z.ZodNumber;
677
+ dice: z.ZodOptional<z.ZodString>;
678
+ recharge: z.ZodOptional<z.ZodString>;
679
+ recharge_amount: z.ZodOptional<z.ZodString>;
680
+ }, z.core.$strict>>;
681
+ action: z.ZodOptional<z.ZodEnum<{
682
+ action: "action";
683
+ "bonus-action": "bonus-action";
684
+ reaction: "reaction";
685
+ free: "free";
686
+ special: "special";
687
+ }>>;
688
+ range: z.ZodOptional<z.ZodString>;
689
+ }, z.core.$strict>;
690
+ }, z.core.$strict>>>;
691
+ }, z.core.$strict>>;
466
692
  }, z.core.$strip>;
467
693
  export type OptionalFeatureSchemaInput = z.input<typeof optionalFeatureEntitySchema>;
468
694
  export type OptionalFeatureSchemaOutput = z.output<typeof optionalFeatureEntitySchema>;
@@ -1,10 +1,14 @@
1
1
  import {
2
+ infuseBlockSchema,
3
+ optionRowSchema,
2
4
  optionalFeatureEntitySchema
3
- } from "../chunk-MQ747UCR.js";
5
+ } from "../chunk-JNNNBEUH.js";
4
6
  import "../chunk-WYGD2UGN.js";
5
7
  import "../chunk-ZJXSXVFP.js";
6
- import "../chunk-XTRDCSJB.js";
8
+ import "../chunk-ZMJQUZQH.js";
7
9
  import "../chunk-UA5KS2PL.js";
8
10
  export {
11
+ infuseBlockSchema,
12
+ optionRowSchema,
9
13
  optionalFeatureEntitySchema
10
14
  };
@@ -5,10 +5,10 @@ import {
5
5
  prefixOf,
6
6
  raceIsUngated,
7
7
  resolveSpellByName
8
- } from "../chunk-3HX5VLWP.js";
8
+ } from "../chunk-DPM6V7YX.js";
9
9
  import "../chunk-PVCEA4HZ.js";
10
10
  import "../chunk-LVQLWRCU.js";
11
- import "../chunk-6X4KUDMU.js";
11
+ import "../chunk-ZCTUYGNV.js";
12
12
  import "../chunk-XY6X2APM.js";
13
13
  import "../chunk-ZDAEGJH4.js";
14
14
  import "../chunk-WELIKLZF.js";
@@ -1,4 +1,5 @@
1
- import type { Choice } from "../types/choice.js";
1
+ import type { RegisteredEntity } from "@archivist-gg/core";
2
+ import type { Choice, Ability } from "../types/choice.js";
2
3
  /**
3
4
  * Normalizes the authored two-step "Ability Score Increase or Feat" decision
4
5
  * into the flat feat pick the product now uses.
@@ -16,3 +17,63 @@ import type { Choice } from "../types/choice.js";
16
17
  * Pure: never mutates its input, never synthesizes a new object.
17
18
  */
18
19
  export declare function flattenAsiOrFeat(choice: Choice): Choice;
20
+ /** The structural registry read `resolveLegacyAsiFeat` makes; the ledger's DecisionRegistry and core's EntityRegistry both
21
+ * satisfy it. */
22
+ type FeatSearch = {
23
+ search(query: string, entityType: string, limit: number): RegisteredEntity[];
24
+ };
25
+ /**
26
+ * The legacy ASI-branch allocation a class level SAVED, or null (H234 H4(2), spec §5.2 item 1): the SHEET's predicate,
27
+ * which `collectClassAsiBranch` (pc.recalc.ts) folds per level, and the base of the Builder's {@link convertibleLegacyAsi}.
28
+ *
29
+ * Non-null exactly when `block` is an object whose `feat` is NOT a string and whose `asi` is a non-array object with at
30
+ * least one numeric ability entry; returns a FRESH object of those entries. It ignores `asi-or-feat`, so an explicit
31
+ * `"feat"` branch with no feat picked still folds on the sheet, as it always has.
32
+ *
33
+ * A string `feat` beside an `asi` is R4-P4 Decision B's orphan (the level took the feat branch and the picker never cleared
34
+ * the abandoned branch's child keys): null. Do NOT loosen the test to `"feat" in block` or a `startsWith("feat")` prefix
35
+ * test: the first strands a non-string `feat` (a legacy hand edit) with no fold at all, the second skips every
36
+ * correctly-flattened block. The `typeof … === "string"` test MIRRORS `collectClassFeatAbilityPoints`' own gate, so the two
37
+ * can never both decline on this predicate (they can both decline when the feat slug resolves to no entity: an
38
+ * unresolvable pick grants nothing, by design).
39
+ */
40
+ export declare function legacyAsiBranch(block: unknown): Partial<Record<Ability, number>> | null;
41
+ /** The BUILDER's predicate (spec §5.2 item 2, Gate 1 M-9): {@link legacyAsiBranch} when `asi-or-feat` is absent or
42
+ * `"asi"`, else null. An explicit `"feat"` branch is a two-step pick in progress (a homebrew non-flattenable two-step keeps
43
+ * `asi-or-feat` as its own row's key), so the Builder neither aliases nor converts it and today's orphan rule applies.
44
+ * The ledger alias and {@link migrateLegacyAsiLevel} both use THIS predicate, so an aliased row never receives an inert
45
+ * write. The sheet's fold keeps the value-agnostic {@link legacyAsiBranch}. */
46
+ export declare function convertibleLegacyAsi(block: unknown): Partial<Record<Ability, number>> | null;
47
+ /** The ASI feat a class answers a legacy level with, deterministically (spec §5.3, Gate 0 M-7). Candidates: the registered
48
+ * feats whose bare slug is `ability-score-improvement` and which carry an `ability-points` choice with a string `id`.
49
+ * Rank: (1) the class entity's slug prefix (the pool collapse's identity rule), (2) the class entity's edition, (3)
50
+ * ascending slug in code-unit order. `childId` is that choice's own `id`, read from the data. Null with no candidate or no
51
+ * class entity. A pure function of (registry, class entity), so the ledger alias and the write path always agree. */
52
+ export declare function resolveLegacyAsiFeat(registry: FeatSearch, classEntity: {
53
+ slug: string;
54
+ edition?: string;
55
+ } | null | undefined): {
56
+ slug: string;
57
+ childId: string;
58
+ } | null;
59
+ /**
60
+ * The level block to store BEFORE a Builder edit applies, or null for "no conversion" (spec §5.2 item 4, §5.5). The plugin's
61
+ * `setChoice` calls it for EVERY write with the edit's key and value (Gate 1 M-8), so the `feat` vocabulary stays here.
62
+ *
63
+ * Null when the key is neither `feat` nor `feat:`-prefixed, when the block is not a convertible legacy level
64
+ * ({@link convertibleLegacyAsi}), or when the class has no ASI feat ({@link resolveLegacyAsiFeat}). Else a NEW object:
65
+ * every key of `block` except `asi-or-feat`, `asi` and `feat:<childId>`, plus `feat: <the ASI slug>`, plus
66
+ * `feat:<childId>: <the legacy allocation>` UNLESS the edit is a SWITCH: `key === "feat"` with any value other than the
67
+ * ASI slug, so a pick of another feat (Gate 1 I-1, ruled option (a)) and the chip removal (null / undefined; final
68
+ * review, Review 3 m6, ruled) both count. A switch writes no `feat:<childId>` at all, so the legacy points and any
69
+ * stale child are dropped and the level's pick stays open (the new feat's own, or the removed ASI's), which is what
70
+ * today's orphan rule does for a switch; a chip removal is therefore not reversible, and re-picking the ASI feat after
71
+ * it starts open. The stepper and a re-pick of the ASI feat keep the full conversion, where the legacy allocation
72
+ * overwrites a stale child. Other keys at the level are kept untouched; the input is never mutated. An over-allocated
73
+ * legacy level is copied verbatim and then clamped by the feat's own rules when the sheet folds it (Gate 1 M-10).
74
+ */
75
+ export declare function migrateLegacyAsiLevel(block: unknown, key: string, value: unknown, registry: FeatSearch, classEntity: {
76
+ slug: string;
77
+ edition?: string;
78
+ } | null | undefined): Record<string, unknown> | null;
79
+ export {};
@@ -0,0 +1,16 @@
1
+ import {
2
+ convertibleLegacyAsi,
3
+ flattenAsiOrFeat,
4
+ legacyAsiBranch,
5
+ migrateLegacyAsiLevel,
6
+ resolveLegacyAsiFeat
7
+ } from "../chunk-LBEXLN6I.js";
8
+ import "../chunk-ZCTUYGNV.js";
9
+ import "../chunk-WELIKLZF.js";
10
+ export {
11
+ convertibleLegacyAsi,
12
+ flattenAsiOrFeat,
13
+ legacyAsiBranch,
14
+ migrateLegacyAsiLevel,
15
+ resolveLegacyAsiFeat
16
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  computeConditionEffects
3
- } from "../chunk-R2ZV233X.js";
3
+ } from "../chunk-MYY2C5MB.js";
4
4
  export {
5
5
  computeConditionEffects
6
6
  };
@@ -0,0 +1,45 @@
1
+ import type { EntityRegistry } from "@archivist-gg/core";
2
+ import type { EquipmentEntry } from "./pc.types.js";
3
+ /** I2a · containment (spec 2026-09-24-inv-i2a-containment-data-design.md §4). The equipment array stays FLAT; an entry
4
+ * sits inside another through `in: <id>`. What counts as a container is the item's `container` data
5
+ * (isContainerItem), never a name list. */
6
+ export type ContainmentBreak = "equipped" | "missing" | "self" | "unresolved" | "not-container" | "cycle";
7
+ export interface ContainmentView {
8
+ parentOf: ReadonlyArray<number | null>;
9
+ childrenOf: ReadonlyArray<ReadonlyArray<number>>;
10
+ isContainer: ReadonlyArray<boolean>;
11
+ ownerOfId: ReadonlyMap<string, number>;
12
+ duplicateIds: ReadonlyArray<number>;
13
+ broken: ReadonlyArray<{
14
+ index: number;
15
+ reason: ContainmentBreak;
16
+ }>;
17
+ }
18
+ export declare function nonEmptyRef(v: unknown): string | null;
19
+ /** `container.holds_items` decides when present; otherwise a weight or item capacity, or weightless contents, make a
20
+ * container. A pack_contents-only block (a pack) and a volume-only block (a liquid holder) are not containers. */
21
+ export declare function isContainerItem(entity: unknown): boolean;
22
+ export declare function idOwners(equipment: readonly EquipmentEntry[]): {
23
+ ownerOfId: Map<string, number>;
24
+ duplicateIds: number[];
25
+ };
26
+ export declare function entityOfEntry(entry: EquipmentEntry, registry: EntityRegistry | null): unknown;
27
+ export declare function resolveContainment(equipment: readonly EquipmentEntry[], registry: EntityRegistry | null): ContainmentView;
28
+ export type MoveRefusal = "out-of-range" | "equipped" | "self" | "descendant" | "unresolved" | "not-container";
29
+ export type MoveCheck = {
30
+ ok: true;
31
+ } | {
32
+ ok: false;
33
+ reason: MoveRefusal;
34
+ };
35
+ export type MoveResult = {
36
+ ok: true;
37
+ changed: boolean;
38
+ } | {
39
+ ok: false;
40
+ reason: MoveRefusal;
41
+ };
42
+ export declare function ensureEntryId(equipment: EquipmentEntry[], index: number, registry: EntityRegistry | null): string;
43
+ export declare function canMoveInto(equipment: readonly EquipmentEntry[], index: number, target: number | null, registry: EntityRegistry | null): MoveCheck;
44
+ export declare function moveInto(equipment: EquipmentEntry[], index: number, target: number | null, registry: EntityRegistry | null): MoveResult;
45
+ export declare function repairContainment(equipment: EquipmentEntry[], registry: EntityRegistry | null): number;
@@ -0,0 +1,24 @@
1
+ import {
2
+ canMoveInto,
3
+ ensureEntryId,
4
+ entityOfEntry,
5
+ idOwners,
6
+ isContainerItem,
7
+ moveInto,
8
+ nonEmptyRef,
9
+ repairContainment,
10
+ resolveContainment
11
+ } from "../chunk-EJP263OP.js";
12
+ import "../chunk-CM5CWO4K.js";
13
+ import "../chunk-ZCTUYGNV.js";
14
+ export {
15
+ canMoveInto,
16
+ ensureEntryId,
17
+ entityOfEntry,
18
+ idOwners,
19
+ isContainerItem,
20
+ moveInto,
21
+ nonEmptyRef,
22
+ repairContainment,
23
+ resolveContainment
24
+ };
@@ -3,6 +3,7 @@ import type { ResolvedCharacter, ChoiceValue, FeatureSource } from "./pc.types.j
3
3
  import type { RegisteredEntity } from "@archivist-gg/core";
4
4
  import { type ProficiencyEntry } from "./pc.proficiency-grants.js";
5
5
  import { wikilinkTailSlug } from "../entities/slug.js";
6
+ import { type RepeatableMember } from "./pc.infusions.js";
6
7
  export interface DecisionRegistry {
7
8
  search(query: string, entityType: string, limit: number): RegisteredEntity[];
8
9
  getByTypeAndSlug(entityType: string, slug: string): RegisteredEntity | undefined;
@@ -27,6 +28,8 @@ export interface ResolvedOption {
27
28
  /**
28
29
  * Status contract: over-selection (n > need) reports `resolved` — the engine
29
30
  * never reports an error for too many picks; the picker UI owns cap enforcement.
31
+ * A pick that FOLDS into proficiencies never over-selects, though: {@link capAtCount}
32
+ * keeps its first `count` stored values, in the ledger and the fold alike.
30
33
  * Likewise for ability-points `max_per`: the engine only sums total points
31
34
  * allocated, so per-ability caps are picker-enforced, not reflected here.
32
35
  */
@@ -88,6 +91,9 @@ export interface DecisionItem {
88
91
  id: string;
89
92
  anchorLevel: number;
90
93
  };
94
+ /** ART-a (spec §5.1, R20): present ONLY on a synthesized pool item whose pool offers a repeatable member: one entry per
95
+ * such member, with its option rows resolved for the per-copy picker (visible candidates only, U-A). */
96
+ repeatable?: RepeatableMember[];
91
97
  /**
92
98
  * Populated only for the selected branch of a select-inline (the
93
99
  * revealed-on-selection rule): a child decision becomes visible once its
@@ -119,9 +125,9 @@ export interface DecisionContext {
119
125
  /** `wikilinkTailSlug` MOVED to `entities/slug.ts` in R4-G5 T1, beside `bareEntitySlug`, so `pc.pools.ts` can
120
126
  * import it without importing this module (this module imports `pc.pools` for `strandedPicks`; the old
121
127
  * direction would be a cycle). The re-export is KEPT because `@archivist-gg/dnd5e/pc/pc.decision-engine` is
122
- * a published subpath with three plugin importers OF THIS SYMBOL (`components/passive/background-block.ts`,
123
- * `components/builder/background-step.ts`, `components/builder/class-step.ts`, all under
124
- * `packages/obsidian/src/modules/pc/`) plus this repo's `pc.resolver.ts` and
128
+ * a published subpath with a plugin importer OF THIS SYMBOL (`components/builder/class-step.ts`, under
129
+ * `packages/obsidian/src/modules/pc/`; the two background surfaces moved to the plugin's `refLabel`, which reads
130
+ * `entities/slug` directly, on 2026-09-25) plus this repo's `pc.resolver.ts` and
125
131
  * `tests/wikilink-tail-slug.test.ts`: a public
126
132
  * surface, not a migration shim, so the standing "retire every shim" rule does not reach it (spec §17 names the
127
133
  * re-export explicitly). */
@@ -129,6 +135,18 @@ export { wikilinkTailSlug };
129
135
  declare function matchesFilter(e: RegisteredEntity, where: EntityFilter, ownerBare: string): boolean;
130
136
  /** Test-only export of {@link matchesFilter} (Task B2). */
131
137
  export declare const __matchesFilterForTest: typeof matchesFilter;
138
+ /** Map a starting-equipment category grant to a nested select-entity child (vocabulary on
139
+ * {@link parseEquipmentCategory}). Weapons filter by weapon_category; armor by armor_category; `shield` is an armor
140
+ * entity in the shield class; a tool category is a MUNDANE item of the category's `type` (magic instruments carry
141
+ * `type: instrument` too).
142
+ *
143
+ * An UNKNOWN category is never guessed. It used to fall through to `weapon_category: "simple"`, which is how the
144
+ * PHB 2024 Bard's "Choose a musical instrument" listed Club, Dagger and Dart. It now yields `from: []`, the
145
+ * engine's existing zero-option shape (an authored empty pool: the row stays open and the strip prints its
146
+ * "No options available" line), and warns ONCE per distinct category. */
147
+ declare function categoryToEntitySelect(category: string, id: string): Choice;
148
+ /** Test-only export of {@link categoryToEntitySelect}. */
149
+ export declare const __categoryToEntitySelectForTest: typeof categoryToEntitySelect;
132
150
  /** Walk every decision definition + persisted selection and collect chosen
133
151
  * proficiencies. Pure; called by recalc.
134
152
  *
@@ -1,38 +1,47 @@
1
1
  import {
2
+ __categoryToEntitySelectForTest,
2
3
  __matchesFilterForTest,
3
4
  buildDecisionLedger,
4
5
  collectChosenAbilityPoints,
5
6
  collectChosenProficiencies,
6
7
  computeEffectiveProficiencies
7
- } from "../chunk-2INMRR3Q.js";
8
- import "../chunk-4ISR76DH.js";
8
+ } from "../chunk-QEO7LYTG.js";
9
+ import "../chunk-2LULMQTF.js";
10
+ import "../chunk-H5PTKYXL.js";
11
+ import "../chunk-KSTV7J2U.js";
9
12
  import "../chunk-DPUJDOKV.js";
10
- import "../chunk-O4SRD3J5.js";
11
- import "../chunk-PP2UHLBA.js";
12
- import "../chunk-IUAAXXNO.js";
13
- import "../chunk-YHYTW5QA.js";
14
- import "../chunk-3HX5VLWP.js";
15
- import "../chunk-PVCEA4HZ.js";
16
- import "../chunk-UBBKSYBY.js";
17
- import "../chunk-CBEKVAX4.js";
13
+ import "../chunk-4BZ47YJ4.js";
18
14
  import "../chunk-TOM66P2P.js";
19
15
  import "../chunk-KU3YLF6D.js";
20
16
  import "../chunk-RLGQ5PZZ.js";
17
+ import "../chunk-T5GZBKIQ.js";
18
+ import "../chunk-W6GC6OKK.js";
19
+ import "../chunk-HJQNK3J5.js";
20
+ import "../chunk-IUAAXXNO.js";
21
+ import "../chunk-YHYTW5QA.js";
22
+ import "../chunk-DPM6V7YX.js";
23
+ import "../chunk-PVCEA4HZ.js";
24
+ import "../chunk-LBEXLN6I.js";
25
+ import "../chunk-ZUQW5VBZ.js";
26
+ import "../chunk-IHE6KVC3.js";
27
+ import "../chunk-LHZXYFBU.js";
21
28
  import "../chunk-LVQLWRCU.js";
22
- import "../chunk-WXWPK3LI.js";
29
+ import "../chunk-CM5CWO4K.js";
23
30
  import {
24
31
  wikilinkTailSlug
25
- } from "../chunk-6X4KUDMU.js";
32
+ } from "../chunk-ZCTUYGNV.js";
26
33
  import "../chunk-YBLDE5CG.js";
27
34
  import "../chunk-EVMUJYUD.js";
28
35
  import "../chunk-VTTA2ALZ.js";
29
36
  import "../chunk-XY6X2APM.js";
30
37
  import "../chunk-ZDAEGJH4.js";
38
+ import "../chunk-3TM34RSJ.js";
31
39
  import "../chunk-PDJSUH24.js";
32
40
  import "../chunk-WELIKLZF.js";
33
41
  import "../chunk-4U55VNC7.js";
34
42
  import "../chunk-UA5KS2PL.js";
35
43
  export {
44
+ __categoryToEntitySelectForTest,
36
45
  __matchesFilterForTest,
37
46
  buildDecisionLedger,
38
47
  collectChosenAbilityPoints,