@archivist-gg/dnd5e 0.3.11 → 0.3.17

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 (192) 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-XTRDCSJB.js → chunk-2JSQE3DD.js} +15 -1
  11. package/dist/chunk-2LULMQTF.js +14 -0
  12. package/dist/{chunk-MAH6DCRI.js → chunk-2UDSN6VW.js} +1 -1
  13. package/dist/chunk-3LWMFYKS.js +57 -0
  14. package/dist/{chunk-JCEV7KYN.js → chunk-3MGQFFNE.js} +1 -1
  15. package/dist/chunk-3VZZDKRA.js +1014 -0
  16. package/dist/{chunk-2DFENQIJ.js → chunk-5GKJAUMX.js} +2 -0
  17. package/dist/{chunk-2M34FLAY.js → chunk-5MXFW4O3.js} +9 -3
  18. package/dist/{chunk-4DOMDEBZ.js → chunk-6EI737IO.js} +1 -1
  19. package/dist/{chunk-G247QXWW.js → chunk-7ATNGKBS.js} +1 -1
  20. package/dist/{chunk-XY6X2APM.js → chunk-7Q2VPKCD.js} +17 -0
  21. package/dist/{chunk-T2SNEJOE.js → chunk-7QN7XSAK.js} +1 -1
  22. package/dist/{chunk-DNAJRMNN.js → chunk-A54HHCWW.js} +6 -7
  23. package/dist/{chunk-7YU4NPKR.js → chunk-AZRGFUSR.js} +1 -1
  24. package/dist/{chunk-PP2UHLBA.js → chunk-B3DP42OM.js} +5 -0
  25. package/dist/chunk-CM5CWO4K.js +735 -0
  26. package/dist/{chunk-MQ747UCR.js → chunk-DOXSFYLH.js} +70 -2
  27. package/dist/chunk-EJP263OP.js +186 -0
  28. package/dist/{chunk-SMLXZUBH.js → chunk-EYX4JMAU.js} +4 -1
  29. package/dist/{chunk-V6LJFP4R.js → chunk-FANQVQ3D.js} +2 -2
  30. package/dist/{chunk-AW3EHF3L.js → chunk-FC4IGH5Y.js} +1 -1
  31. package/dist/{chunk-23LZLBJK.js → chunk-G6MHJDVT.js} +6 -2
  32. package/dist/{chunk-JANNRGJC.js → chunk-G6PBI2BU.js} +1 -1
  33. package/dist/chunk-H5PTKYXL.js +101 -0
  34. package/dist/{chunk-LWFTHJIE.js → chunk-HHBD4SQ6.js} +1 -1
  35. package/dist/{chunk-JC5UNIVM.js → chunk-HS6FIOLP.js} +2 -0
  36. package/dist/chunk-HTYMW5CH.js +228 -0
  37. package/dist/chunk-IHE6KVC3.js +13 -0
  38. package/dist/{chunk-QHMWA3SZ.js → chunk-JCMUVZIK.js} +1 -1
  39. package/dist/{chunk-V373TRJE.js → chunk-JSM6JFZR.js} +198 -125
  40. package/dist/{chunk-LDDCNPHD.js → chunk-K5NJBTE2.js} +1 -1
  41. package/dist/chunk-KR6JF3BF.js +14 -0
  42. package/dist/{chunk-4ISR76DH.js → chunk-KSTV7J2U.js} +9 -3
  43. package/dist/chunk-LBEXLN6I.js +91 -0
  44. package/dist/{chunk-BLRW2UU6.js → chunk-LF5AGJA4.js} +2 -2
  45. package/dist/{chunk-UBBKSYBY.js → chunk-LHZXYFBU.js} +30 -1
  46. package/dist/{chunk-BIA32MQ5.js → chunk-MBX25B6D.js} +1 -1
  47. package/dist/{chunk-R2ZV233X.js → chunk-MYY2C5MB.js} +3 -3
  48. package/dist/{chunk-J77CKYV3.js → chunk-OFCSP6MT.js} +1 -1
  49. package/dist/{chunk-2INMRR3Q.js → chunk-ONTGZR5T.js} +326 -149
  50. package/dist/{chunk-MWCCGPG3.js → chunk-OOSRUJBI.js} +3 -2
  51. package/dist/{chunk-U3BABVJF.js → chunk-PKX6TGRE.js} +2 -2
  52. package/dist/{chunk-PJMG5XV3.js → chunk-PQZ4LM4Z.js} +1 -1
  53. package/dist/chunk-PXVNAY7T.js +84 -0
  54. package/dist/chunk-QH36K2PU.js +158 -0
  55. package/dist/{chunk-R747YKS7.js → chunk-QZSWN2KT.js} +1 -1
  56. package/dist/{chunk-CHUALUIX.js → chunk-RYLXAYIQ.js} +1 -1
  57. package/dist/{chunk-GFZ7PITJ.js → chunk-S3YUXDSC.js} +6 -1
  58. package/dist/{chunk-PZCE7DJM.js → chunk-T6QIF5XR.js} +31 -1
  59. package/dist/{chunk-CBEKVAX4.js → chunk-TULQ4FFX.js} +41 -13
  60. package/dist/{chunk-S56D6B6C.js → chunk-UUBJCNQU.js} +12 -3
  61. package/dist/{chunk-5N2GW72F.js → chunk-UZXG6QSY.js} +2 -1
  62. package/dist/{chunk-4XTNPNQB.js → chunk-VPYBK2MG.js} +1 -1
  63. package/dist/{chunk-3HX5VLWP.js → chunk-VRV3NNTA.js} +2 -2
  64. package/dist/{chunk-HZA7OE7N.js → chunk-XCFC7LGF.js} +2 -1
  65. package/dist/{chunk-BL3VELKP.js → chunk-Y5VVP73C.js} +1 -1
  66. package/dist/{chunk-PI4LLJG4.js → chunk-YD2VAHA6.js} +2 -2
  67. package/dist/{chunk-UIRMA5KM.js → chunk-YDGMBMYI.js} +1 -1
  68. package/dist/{chunk-NWDF5HG3.js → chunk-YKL6SHRJ.js} +1 -1
  69. package/dist/{chunk-6X4KUDMU.js → chunk-ZCTUYGNV.js} +7 -2
  70. package/dist/chunk-ZUQW5VBZ.js +89 -0
  71. package/dist/class/class.codec.js +7 -7
  72. package/dist/class/class.parser.js +6 -6
  73. package/dist/class/class.schema.d.ts +18 -0
  74. package/dist/class/class.schema.js +5 -5
  75. package/dist/class/class.standard-array.d.ts +16 -0
  76. package/dist/class/class.standard-array.js +20 -0
  77. package/dist/class/class.types.d.ts +3 -0
  78. package/dist/dnd/amount-text.d.ts +38 -0
  79. package/dist/dnd/amount-text.js +13 -0
  80. package/dist/dnd/resource-words.d.ts +4 -0
  81. package/dist/dnd/resource-words.js +30 -0
  82. package/dist/entities/base-item-resolver.js +2 -2
  83. package/dist/entities/slug.d.ts +18 -8
  84. package/dist/entities/slug.js +3 -1
  85. package/dist/feat/feat.codec.js +5 -5
  86. package/dist/feat/feat.parser.js +4 -4
  87. package/dist/feat/feat.schema.d.ts +41 -3
  88. package/dist/feat/feat.schema.js +3 -3
  89. package/dist/index.js +7513 -4177
  90. package/dist/item/item.actions-map.d.ts +40 -5
  91. package/dist/item/item.actions-map.js +5 -84
  92. package/dist/item/item.attunement.js +3 -9
  93. package/dist/item/item.bonuses.js +5 -2
  94. package/dist/item/item.codec.js +3 -3
  95. package/dist/item/item.conditions.js +4 -1
  96. package/dist/item/item.conditions.types.d.ts +4 -0
  97. package/dist/item/item.cost.d.ts +3 -0
  98. package/dist/item/item.cost.js +29 -0
  99. package/dist/item/item.icon.d.ts +15 -0
  100. package/dist/item/item.icon.js +211 -0
  101. package/dist/item/item.parser.js +2 -2
  102. package/dist/item/item.schema.d.ts +16 -1
  103. package/dist/item/item.schema.js +3 -1
  104. package/dist/item/item.types.d.ts +9 -2
  105. package/dist/monster/monster.parser.js +5 -5
  106. package/dist/monster/monster.schema.js +4 -4
  107. package/dist/optional-feature/optional-feature.codec.js +5 -4
  108. package/dist/optional-feature/optional-feature.parser.js +4 -3
  109. package/dist/optional-feature/optional-feature.schema.d.ts +255 -3
  110. package/dist/optional-feature/optional-feature.schema.js +7 -2
  111. package/dist/pc/pc.additional-spells.js +3 -3
  112. package/dist/pc/pc.amount-bindings.d.ts +32 -0
  113. package/dist/pc/pc.amount-bindings.js +23 -0
  114. package/dist/pc/pc.asi-flatten.d.ts +62 -1
  115. package/dist/pc/pc.asi-flatten.js +16 -0
  116. package/dist/pc/pc.conditions.js +1 -1
  117. package/dist/pc/pc.containment.d.ts +45 -0
  118. package/dist/pc/pc.containment.js +24 -0
  119. package/dist/pc/pc.decision-engine.d.ts +24 -3
  120. package/dist/pc/pc.decision-engine.js +26 -16
  121. package/dist/pc/pc.entry-overrides.d.ts +79 -0
  122. package/dist/pc/pc.entry-overrides.js +40 -0
  123. package/dist/pc/pc.equipment.d.ts +2 -2
  124. package/dist/pc/pc.equipment.js +19 -7
  125. package/dist/pc/pc.feature-effects.d.ts +12 -0
  126. package/dist/pc/pc.feature-effects.js +2 -2
  127. package/dist/pc/pc.infusions.d.ts +228 -0
  128. package/dist/pc/pc.infusions.js +64 -0
  129. package/dist/pc/pc.member-choices.d.ts +90 -0
  130. package/dist/pc/pc.member-choices.js +32 -0
  131. package/dist/pc/pc.parser.js +18 -1
  132. package/dist/pc/pc.pools.d.ts +8 -1
  133. package/dist/pc/pc.pools.js +13 -3
  134. package/dist/pc/pc.proficiencies.js +23 -15
  135. package/dist/pc/pc.proficiency-query.js +6 -0
  136. package/dist/pc/pc.recalc.d.ts +39 -36
  137. package/dist/pc/pc.recalc.js +115 -70
  138. package/dist/pc/pc.resolver.d.ts +2 -1
  139. package/dist/pc/pc.resolver.js +22 -14
  140. package/dist/pc/pc.resource-seed.js +1 -1
  141. package/dist/pc/pc.resources.d.ts +6 -1
  142. package/dist/pc/pc.resources.js +3 -1
  143. package/dist/pc/pc.rest.d.ts +21 -1
  144. package/dist/pc/pc.rest.js +52 -19
  145. package/dist/pc/pc.schema.d.ts +43 -2
  146. package/dist/pc/pc.schema.js +1 -1
  147. package/dist/pc/pc.slotting.d.ts +36 -3
  148. package/dist/pc/pc.slotting.js +13 -5
  149. package/dist/pc/pc.tool-picks.d.ts +51 -0
  150. package/dist/pc/pc.tool-picks.js +18 -0
  151. package/dist/pc/pc.types.d.ts +115 -14
  152. package/dist/pc/pc.weapon-grant.d.ts +15 -0
  153. package/dist/pc/pool-layout.d.ts +8 -0
  154. package/dist/pc/pool-layout.js +5 -3
  155. package/dist/pc/resource-equivalents.d.ts +44 -0
  156. package/dist/pc/spell-source.js +4 -9
  157. package/dist/race/race.codec.js +6 -6
  158. package/dist/race/race.parser.js +5 -5
  159. package/dist/race/race.schema.js +4 -4
  160. package/dist/schemas/attack-schema.d.ts +1 -1
  161. package/dist/schemas/choice-schema.js +2 -2
  162. package/dist/schemas/feature-effect-schema.d.ts +41 -3
  163. package/dist/schemas/feature-effect-schema.js +1 -1
  164. package/dist/schemas/feature-schema.js +3 -3
  165. package/dist/schemas/selection-pool-schema.d.ts +10 -0
  166. package/dist/schemas/selection-pool-schema.js +1 -1
  167. package/dist/spell/spell.codec.js +2 -2
  168. package/dist/spell/spell.parser.d.ts +6 -1
  169. package/dist/spell/spell.parser.js +5 -3
  170. package/dist/spell/spell.types.d.ts +10 -0
  171. package/dist/srd/retired-items.d.ts +14 -0
  172. package/dist/srd/retired-items.js +11 -0
  173. package/dist/subclass/subclass.codec.js +7 -7
  174. package/dist/subclass/subclass.parser.js +6 -6
  175. package/dist/subclass/subclass.schema.d.ts +10 -0
  176. package/dist/subclass/subclass.schema.js +5 -5
  177. package/dist/types/choice.d.ts +13 -0
  178. package/dist/types/equipment-grant.d.ts +18 -1
  179. package/dist/types/equipment-grant.js +12 -0
  180. package/dist/types/feature-effect.d.ts +12 -1
  181. package/dist/types/optional-feature.types.d.ts +84 -1
  182. package/dist/types/selection-pool.d.ts +18 -3
  183. package/dist/weapon/weapon.classify.d.ts +10 -8
  184. package/dist/weapon/weapon.classify.js +2 -2
  185. package/dist/weapon/weapon.codec.js +3 -3
  186. package/dist/weapon/weapon.parser.js +2 -2
  187. package/dist/weapon/weapon.schema.d.ts +1 -0
  188. package/dist/weapon/weapon.schema.js +1 -1
  189. package/dist/weapon/weapon.types.d.ts +2 -0
  190. package/package.json +1 -1
  191. package/dist/chunk-O4SRD3J5.js +0 -165
  192. package/dist/chunk-WXWPK3LI.js +0 -55
@@ -1,38 +1,48 @@
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-ONTGZR5T.js";
9
+ import "../chunk-2LULMQTF.js";
10
+ import "../chunk-H5PTKYXL.js";
11
+ import "../chunk-TULQ4FFX.js";
12
+ import "../chunk-TOM66P2P.js";
13
+ import "../chunk-KU3YLF6D.js";
14
+ import "../chunk-HTYMW5CH.js";
15
+ import "../chunk-KSTV7J2U.js";
9
16
  import "../chunk-DPUJDOKV.js";
10
- import "../chunk-O4SRD3J5.js";
11
- import "../chunk-PP2UHLBA.js";
17
+ import "../chunk-LBEXLN6I.js";
18
+ import "../chunk-RLGQ5PZZ.js";
19
+ import "../chunk-3VZZDKRA.js";
20
+ import "../chunk-W6GC6OKK.js";
21
+ import "../chunk-B3DP42OM.js";
12
22
  import "../chunk-IUAAXXNO.js";
13
23
  import "../chunk-YHYTW5QA.js";
14
- import "../chunk-3HX5VLWP.js";
24
+ import "../chunk-VRV3NNTA.js";
15
25
  import "../chunk-PVCEA4HZ.js";
16
- import "../chunk-UBBKSYBY.js";
17
- import "../chunk-CBEKVAX4.js";
18
- import "../chunk-TOM66P2P.js";
19
- import "../chunk-KU3YLF6D.js";
20
- import "../chunk-RLGQ5PZZ.js";
21
- import "../chunk-LVQLWRCU.js";
22
- import "../chunk-WXWPK3LI.js";
23
- import {
24
- wikilinkTailSlug
25
- } from "../chunk-6X4KUDMU.js";
26
+ import "../chunk-IHE6KVC3.js";
27
+ import "../chunk-LHZXYFBU.js";
26
28
  import "../chunk-YBLDE5CG.js";
29
+ import "../chunk-ZUQW5VBZ.js";
30
+ import "../chunk-LVQLWRCU.js";
31
+ import "../chunk-CM5CWO4K.js";
27
32
  import "../chunk-EVMUJYUD.js";
28
33
  import "../chunk-VTTA2ALZ.js";
29
- import "../chunk-XY6X2APM.js";
34
+ import {
35
+ wikilinkTailSlug
36
+ } from "../chunk-ZCTUYGNV.js";
37
+ import "../chunk-7Q2VPKCD.js";
30
38
  import "../chunk-ZDAEGJH4.js";
39
+ import "../chunk-3TM34RSJ.js";
31
40
  import "../chunk-PDJSUH24.js";
32
41
  import "../chunk-WELIKLZF.js";
33
42
  import "../chunk-4U55VNC7.js";
34
43
  import "../chunk-UA5KS2PL.js";
35
44
  export {
45
+ __categoryToEntitySelectForTest,
36
46
  __matchesFilterForTest,
37
47
  buildDecisionLedger,
38
48
  collectChosenAbilityPoints,
@@ -0,0 +1,79 @@
1
+ import type { EntityRegistry } from "@archivist-gg/core";
2
+ import type { ActionCost } from "../types/resource.js";
3
+ import type { EquipmentEntry, EquipmentEntryState } from "./pc.types.js";
4
+ import { type EntryView } from "./pc.infusions.js";
5
+ export type CustomizableKey = "name" | "charges" | "recovery" | "action" | "range" | "bonus" | "damage_bonus" | "extra_damage" | "ac_bonus" | "resist";
6
+ /** The attack row's cost when the entry stores no `overrides.action` (pc.equipment.ts). */
7
+ export declare const WEAPON_DEFAULT_ACTION_COST: ActionCost;
8
+ /** A weapon, or an item whose `base_item` resolves to a weapon: it fills the main hand and owns an
9
+ * attack row (pc.slotting.ts `defaultSlotForType`). With a view, its rule entity decides (an infused
10
+ * weapon's wrapper routes through its `base_item`). */
11
+ export declare function isWeaponLikeEntry(entry: EquipmentEntry, registry: EntityRegistry | null, view?: EntryView | null): boolean;
12
+ /** The override keys some consumer reads for this entry's type. The Customize card adds every key the
13
+ * entry already STORES (so it can always be cleared); that union is the card's, not this rule's. */
14
+ export declare function customizableOverrideKeys(entry: EquipmentEntry, registry: EntityRegistry | null): Set<CustomizableKey>;
15
+ /** The action cost the sheet shows when no `overrides.action` is stored: the attack row's default for a
16
+ * weapon-like entry; the items row's cost (a view's `action`, the curated cost, or the potion or scroll
17
+ * default) otherwise; else null. With a view, its rule entity decides each read. */
18
+ export declare function defaultActionCost(entry: EquipmentEntry, registry: EntityRegistry | null, view?: EntryView | null): ActionCost | null;
19
+ /** A spell scroll's spell's cost, the registry half of `resolveItemAction`'s scroll default (it has no registry; its
20
+ * two callers do, and pass this as `opts.spellCost`: `defaultActionCost` here and the plugin's Actions collector).
21
+ * The spell is the one the entry sets (`overrides.spell`: a `[[slug]]` wikilink or a bare slug), looked up as the
22
+ * Spells tab looks it up (`collectItemGrantedSpells`); its `casting_time` is read by the ONE casting-time reader. An
23
+ * action, bonus action or reaction is the cost; anything else (a minute or hour cast, no spell set, a spell not
24
+ * installed, no registry) is undefined, so the scroll default falls back to Action. */
25
+ export declare function scrollSpellCost(entry: EquipmentEntry, registry: EntityRegistry | null): ActionCost | undefined;
26
+ /** A charges field's maximum (spec §5.6, U-7 A): an object's `max`, or a positive number (the two item-note shapes,
27
+ * item.schema.ts); an infusion overlay's `charges` has the object shape. */
28
+ export declare function itemChargesMax(entity: unknown): number | undefined;
29
+ /** The recovery rule an item recharges by (spec §5.5, §5.6, U-7 A), in this order: none for an item consumed on use
30
+ * ({@link isConsumedOnUse}: it has no charges to recharge, even over a rule stored before that ruling) or an orphan
31
+ * created entry (its RULE entity is null, nothing folds); an INFUSED view's overlay `charges` (their `recharge`,
32
+ * `dawn` refilling on a long rest); the stored rule; the item note's own `charges.recharge`; else the curated rule
33
+ * for a wikilinked entry. A plain-text entry never picks up a curated rule the Actions row cannot show. */
34
+ export declare function effectiveItemRecovery(entry: EquipmentEntry, registry: EntityRegistry | null, view?: EntryView | null): NonNullable<EquipmentEntryState["recovery"]> | undefined;
35
+ /** Consumed on use (T17 rider C fold, user ruling 2026-09-24): using one spends the entry's QUANTITY, never a charge
36
+ * (a potion, Holy Water, an oil, Alchemist's Fire, Dust of Disappearance, a scroll), so the item has no charges and
37
+ * no recovery anywhere and the sheet shows its quantity only. Data decides, in two places: the curated `consumed`
38
+ * flag of `ITEM_ACTIONS` (no registry needed), else the entity's own data, a `potion` or `scroll` type (the type the
39
+ * potion default of `resolveItemAction` already reads) or a `scroll_level` marker. A plain-text entry is never one:
40
+ * it resolves to no entity, as in every other rule here. */
41
+ export declare function isConsumedOnUse(entry: EquipmentEntry, registry: EntityRegistry | null, view?: EntryView | null): boolean;
42
+ /** The ONE "is a spell scroll" rule (T17 rider GH, carried from rider C's close), by the entity's own data: its `scroll`
43
+ * type or its `scroll_level` marker. A scroll is consumed on use ({@link isConsumedOnUse}). Read value-based, with no
44
+ * rarity gate: null, a non-object or an entity with neither field is no scroll. An entry reaches it through its resolved
45
+ * entity, so with no registry, or for a plain-text entry, nothing is a scroll. */
46
+ export declare function isScrollEntity(entity: unknown): boolean;
47
+ /** A scroll the sheet can CAST: it carries the `scroll_level` marker, the level its spell is cast at (0 = cantrip). Its
48
+ * use is that cast (the Spells tab spends it), so the Actions row offers it no Use of its own. A scroll typed `scroll`
49
+ * with no marker (the 2014 SRD spell scrolls) names no level: it is not castable, and its Actions row keeps the plain
50
+ * Use every other item consumed on use has (T17 rider GH). */
51
+ export declare function isCastableScroll(entity: unknown): boolean;
52
+ /** The charge pair an item shows, the twin of {@link effectiveItemRecovery}. Its sources, in this order (spec §5.5,
53
+ * §5.6, U-7 A):
54
+ * 1. none for an item consumed on use (its quantity is what it has, {@link isConsumedOnUse}, even over a pair stored
55
+ * before that ruling), and none for an orphan created entry (its view's RULE entity is null: nothing folds);
56
+ * 2. an INFUSED view whose overlay has `charges`: they live in the MARKER, `infusion.charges.current` (absent = full,
57
+ * clamped to the overlay max), never in `state`;
58
+ * 3. the stored pair as stored (a legacy `{0, 0}` included, so it can still be cleared);
59
+ * 4. the item note's OWN `charges` (an object's `max`, or a number) as a FULL pair: every item reads its own data;
60
+ * 5. the curated `max_charges` of a wikilinked entry as a FULL pair, the fallback for notes without data;
61
+ * else none. An item with no stored charges is full, the rest plan's own reading. Every surface that shows or spends
62
+ * an item's charges reads this (through `entryCharges` once it holds the view), and so does the rest plan, so a wand
63
+ * is listed wherever its charges are and a potion nowhere. */
64
+ export declare function effectiveItemCharges(entry: EquipmentEntry, registry: EntityRegistry | null, view?: EntryView | null): NonNullable<EquipmentEntryState["charges"]> | undefined;
65
+ /** The Armor Class an armour or shield entry gives (T17 T-25), by the terms `computeAC` (pc.equipment.ts) adds for it:
66
+ * the slot's own terms ({@link slotAcTerms}: the armour's AC, through `base_item` for a magic armour, `effectiveArmor`,
67
+ * and the entry's `overrides.ac_bonus`), and the item's own unconditional `bonuses.ac` (a +2 armour's +2). A shield's `value` is what it
68
+ * ADDS; an armour's is the AC it sets, plus Dex where `addDex` says so. What the item gives WORN: the engine applies
69
+ * these only while it is equipped (the bonus only while attuned where attunement is required), and a conditional
70
+ * `bonuses.ac` is left out, its conditions being the character's. Every surface that shows an entry's AC reads this, so
71
+ * a magic armour never shows its base armour's AC; the consumer-agreement test holds it to the engine's own sum. Null
72
+ * for an entry that is neither (a weapon, a ring, an unresolved link, plain text) and without a registry. With the
73
+ * entry's view (ART-a, spec §5.3) the rule entity is read: an infused armor or shield gives its base's terms plus the
74
+ * wrapper's scaled `bonuses.ac`, the ONE slot term `computeAC` merges for it. */
75
+ export declare function effectiveItemArmorClass(entry: EquipmentEntry, registry: EntityRegistry | null, view?: EntryView | null): {
76
+ value: number;
77
+ shield: boolean;
78
+ addDex: boolean;
79
+ } | null;
@@ -0,0 +1,40 @@
1
+ import {
2
+ WEAPON_DEFAULT_ACTION_COST,
3
+ customizableOverrideKeys,
4
+ defaultActionCost,
5
+ effectiveItemArmorClass,
6
+ effectiveItemCharges,
7
+ effectiveItemRecovery,
8
+ isCastableScroll,
9
+ isConsumedOnUse,
10
+ isScrollEntity,
11
+ isWeaponLikeEntry,
12
+ itemChargesMax,
13
+ scrollSpellCost
14
+ } from "../chunk-3VZZDKRA.js";
15
+ import "../chunk-W6GC6OKK.js";
16
+ import "../chunk-B3DP42OM.js";
17
+ import "../chunk-IUAAXXNO.js";
18
+ import "../chunk-IHE6KVC3.js";
19
+ import "../chunk-LHZXYFBU.js";
20
+ import "../chunk-ZUQW5VBZ.js";
21
+ import "../chunk-LVQLWRCU.js";
22
+ import "../chunk-CM5CWO4K.js";
23
+ import "../chunk-ZCTUYGNV.js";
24
+ import "../chunk-3TM34RSJ.js";
25
+ import "../chunk-PDJSUH24.js";
26
+ import "../chunk-WELIKLZF.js";
27
+ export {
28
+ WEAPON_DEFAULT_ACTION_COST,
29
+ customizableOverrideKeys,
30
+ defaultActionCost,
31
+ effectiveItemArmorClass,
32
+ effectiveItemCharges,
33
+ effectiveItemRecovery,
34
+ isCastableScroll,
35
+ isConsumedOnUse,
36
+ isScrollEntity,
37
+ isWeaponLikeEntry,
38
+ itemChargesMax,
39
+ scrollSpellCost
40
+ };
@@ -25,7 +25,7 @@ export interface UnarmedStrikeSpec {
25
25
  dice?: string;
26
26
  abilities?: Ability[];
27
27
  }
28
- /** The always-present Unarmed Strike row (R4-G6b §5.1): 1 + the modifier bludgeoning, 5 ft, always proficient. With a
28
+ /** The always-present Unarmed Strike row (R4-G6b §5.1): 1 + the modifier bludgeoning, 5 ft., always proficient. With a
29
29
  * DIE the damage string reproduces the OUTPUT of `buildAttackRow`'s `formatDice` (a closure over `dmgFlat` that cannot
30
30
  * be called): the flat part's `^\+0$` strip equals the whole-string `\+0$` strip for every modifier, so a die reads
31
31
  * `1d6-1`. With NO die the base is the number 1, and a signed suffix on a number is unevaluated arithmetic (`1-1`,
@@ -35,7 +35,7 @@ export interface UnarmedStrikeSpec {
35
35
  * listed DEX beats STR on a tie (the shipped finesse idiom `mods.dex >= mods.str`). Called from recalc, which owns
36
36
  * the walk that produces `spec`; never from `computeAttacks`, so the row is present with or without a registry.
37
37
  * The `subLabel` is an ENGINE string, printed as it ships: the sheet humanizes a weapon's category tokens, and
38
- * this row carries no weapon, so `Unarmed` is capitalised here beside `Unarmed Strike`, `5 ft` and `bludgeoning`
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
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;
@@ -4,14 +4,26 @@ import {
4
4
  computeSlotsAndAttacks,
5
5
  emptyAppliedBonuses,
6
6
  isWeaponSlugProficient
7
- } from "../chunk-V373TRJE.js";
8
- import "../chunk-UIRMA5KM.js";
9
- import "../chunk-UBBKSYBY.js";
7
+ } from "../chunk-JSM6JFZR.js";
8
+ import "../chunk-3LWMFYKS.js";
9
+ import "../chunk-YDGMBMYI.js";
10
+ import "../chunk-EJP263OP.js";
10
11
  import "../chunk-RLGQ5PZZ.js";
11
- import "../chunk-LWFTHJIE.js";
12
- import "../chunk-DNAJRMNN.js";
13
- import "../chunk-WXWPK3LI.js";
14
- import "../chunk-6X4KUDMU.js";
12
+ import "../chunk-3VZZDKRA.js";
13
+ import "../chunk-W6GC6OKK.js";
14
+ import "../chunk-B3DP42OM.js";
15
+ import "../chunk-IUAAXXNO.js";
16
+ import "../chunk-IHE6KVC3.js";
17
+ import "../chunk-HHBD4SQ6.js";
18
+ import "../chunk-A54HHCWW.js";
19
+ import "../chunk-LHZXYFBU.js";
20
+ import "../chunk-ZUQW5VBZ.js";
21
+ import "../chunk-LVQLWRCU.js";
22
+ import "../chunk-CM5CWO4K.js";
23
+ import "../chunk-ZCTUYGNV.js";
24
+ import "../chunk-3TM34RSJ.js";
25
+ import "../chunk-PDJSUH24.js";
26
+ import "../chunk-WELIKLZF.js";
15
27
  export {
16
28
  buildUnarmedRow,
17
29
  computeAppliedBonuses,
@@ -34,6 +34,15 @@ export interface FeatureEffectTotals {
34
34
  minimum: number;
35
35
  label: string;
36
36
  }[];
37
+ /** SL (spec §11.2): ability-based numeric SAVE bonuses (Aura of Protection), resolved in recalc against final scores and
38
+ * the character's conditions. Empty `saves` = every save; recalc keeps one term per `label`. */
39
+ save_bonus_terms: {
40
+ saves: Ability[];
41
+ ability: Ability;
42
+ minimum: number;
43
+ inactiveWhile?: "incapacitated" | "unconscious";
44
+ label: string;
45
+ }[];
37
46
  /**
38
47
  * Half-proficiency terms (Jack of All Trades, Remarkable Athlete). Resolved in recalc against the
39
48
  * proficiency bonus, and ONLY for a skill whose effective tri is "none" — that gate is the mechanic
@@ -226,6 +235,9 @@ export declare function emptyFeatureEffectTotals(): FeatureEffectTotals;
226
235
  export interface FeatureEffectsOpts {
227
236
  activeBuffs?: Set<string>;
228
237
  levelFor?: (source: FeatureSource) => number;
238
+ /** RG: the DICE cell (`1d6`) of column `column` in the table of the class that owns `source`, at `level`; null when that
239
+ * table has no such dice cell. recalc passes it; a caller that passes none leaves every rider at its authored amount. */
240
+ tableDiceFor?: (source: FeatureSource, column: string, level: number) => string | null;
229
241
  }
230
242
  /** Does this feature's effects fold right now? An activatable feature folds ONLY
231
243
  * while its id is in the active set; a buff is off until toggled. Shared by
@@ -7,12 +7,12 @@ import {
7
7
  foldsNow,
8
8
  foldsOnSelf,
9
9
  selfEffectsOf
10
- } from "../chunk-CBEKVAX4.js";
10
+ } from "../chunk-TULQ4FFX.js";
11
11
  import "../chunk-TOM66P2P.js";
12
12
  import "../chunk-KU3YLF6D.js";
13
13
  import "../chunk-RLGQ5PZZ.js";
14
14
  import "../chunk-LVQLWRCU.js";
15
- import "../chunk-6X4KUDMU.js";
15
+ import "../chunk-ZCTUYGNV.js";
16
16
  import "../chunk-WELIKLZF.js";
17
17
  export {
18
18
  assembleEffectFeatures,
@@ -0,0 +1,228 @@
1
+ import type { EntityRegistry, RegisteredEntity } from "@archivist-gg/core";
2
+ import type { PoolActive } from "../types/selection-pool.js";
3
+ import type { InfuseBlock, InfuseItem, OptionalFeatureEntity, OptionRow } from "../types/optional-feature.types.js";
4
+ import type { ArmorEntity } from "../armor/armor.types.js";
5
+ import type { WeaponEntity } from "../weapon/weapon.types.js";
6
+ import type { ItemEntity } from "../item/item.types.js";
7
+ import type { Character, EquipmentEntry, ResolvedCharacter } from "./pc.types.js";
8
+ /** The known-counter word (spec §4.5): the pool's `count.label`, else "Known". Applied at read, never a zod default. */
9
+ export declare function poolCountLabel(pool: {
10
+ countLabel?: string;
11
+ }): string;
12
+ export interface PoolActiveWords {
13
+ column: string;
14
+ label: string;
15
+ verb: string;
16
+ counterLabel: string;
17
+ createLabel: string;
18
+ createVerb: string;
19
+ }
20
+ /** The at-once counter's words (spec §4.5), defaults applied at read; null when the pool declares no `active`. */
21
+ export declare function poolActiveWords(pool: {
22
+ active?: PoolActive;
23
+ }): PoolActiveWords | null;
24
+ /** A stored pick split on its FIRST '#' (spec §4.4): `<note slug>#<param>` is a copy of a repeatable note. */
25
+ export declare function parsePickKey(stored: string): {
26
+ slugPart: string;
27
+ param: string | null;
28
+ };
29
+ /** The comparison key (spec §4.4): `bare(note)#param` for a copy of a repeatable note, `bare(note)` for any other pick. */
30
+ export declare function normalizedPickKey(stored: string, repeatable: boolean): string;
31
+ /** A marker's `by`, normalized the same way: a copy when it holds '#'. */
32
+ export declare function markerKey(by: string): string;
33
+ /** Derived, never authored (spec §4.1): a member that infuses an object, or a repeatable member whose rows create items. */
34
+ export declare function isItemBound(note: Pick<OptionalFeatureEntity, "infuse" | "repeatable" | "options">): boolean;
35
+ export type OptionStatus = "ok" | "needs-choice" | "not-installed" | "level" | "invalid";
36
+ /** A copy's resolved option (spec §4.6): its row, the resolved item's FULL slug (a `learn` copy, or a `create` copy's
37
+ * `item` row), and its status. */
38
+ export interface CopyOption {
39
+ row: OptionRow | null;
40
+ item?: string;
41
+ status: OptionStatus;
42
+ }
43
+ /** The registry subset option resolution reads (structurally `PoolRegistry` and `DecisionRegistry`). */
44
+ export interface ItemLookup {
45
+ search(q: string, t: string, n: number): RegisteredEntity[];
46
+ getByTypeAndSlug(t: string, s: string): RegisteredEntity | undefined;
47
+ }
48
+ export interface CandidateOptions {
49
+ edition?: string;
50
+ isEntityVisible?: (e: RegisteredEntity) => boolean;
51
+ exclude?: readonly string[];
52
+ }
53
+ /** One option row as the pickers read it (R20): `candidates` are VISIBLE full slugs in the §5.8 order (U-A). PT (spec §4,
54
+ * §6.5): `type` and `rarity` (lower-case) name the row's item, read from its first candidate (else its first installed
55
+ * item, visible or not), a `filter` row from its filter; `charges` are that item's own; null when nothing says. */
56
+ export interface ResolvedOptionRow {
57
+ key: string;
58
+ name: string;
59
+ minLevel: number;
60
+ attunement?: boolean;
61
+ arm: "item" | "variant" | "filter";
62
+ candidates: string[];
63
+ availability: "installed" | "hidden-only" | "not-installed";
64
+ type: string | null;
65
+ rarity: string | null;
66
+ charges: {
67
+ max: number;
68
+ recharge?: string;
69
+ } | null;
70
+ }
71
+ /** The per-copy picker's data for one repeatable member of a pool (spec §5.1, R20). */
72
+ export interface RepeatableMember {
73
+ noteSlug: string;
74
+ itemChoice: "learn" | "create";
75
+ rows: ResolvedOptionRow[];
76
+ }
77
+ /** The picker list for a row (spec §5.8, U-A): VISIBLE notes only, the character's edition first, the SRD books before
78
+ * importer books, then the full slug; one per bare slug; rows already replicated (by name or bare slug) left out. */
79
+ export declare function optionCandidates(row: OptionRow, registry: ItemLookup, opts?: CandidateOptions): string[];
80
+ /** Every row of a repeatable note as the pickers read it (R20): its candidates, and whether its items are installed,
81
+ * installed only in hidden books (absent from every list, U-A), or not installed at all. */
82
+ export declare function resolveOptionRows(note: Pick<OptionalFeatureEntity, "options">, registry: ItemLookup, opts?: CandidateOptions): ResolvedOptionRow[];
83
+ /** A copy's option (spec §5.8): validation by row identity, BLIND to visibility (Gate 1 C3, U-A). A `learn` param passes
84
+ * through the retired-item map first; the stored key is never rewritten (Gate 1 m5). `edition` orders the installed
85
+ * notes a `create` copy's `item` row falls back to when the row's own slug is not installed. */
86
+ export declare function resolveCopyOption(note: OptionalFeatureEntity, param: string | null, ctx: {
87
+ classLevel: number;
88
+ registry: ItemLookup;
89
+ edition?: string;
90
+ }): CopyOption;
91
+ /** One marked equipment entry's view (spec §4.6). The DISPLAY identity is not stored: it is the entry's own resolution. */
92
+ export interface EntryView {
93
+ index: number;
94
+ kind: "infused" | "created";
95
+ /** The RULE entity (spec §5.4): the wrapper (infused) or the real item (created); null for an orphan or duplicate created entry. */
96
+ entity: ArmorEntity | WeaponEntity | ItemEntity | null;
97
+ entityType: string | null;
98
+ key: string;
99
+ seq: number;
100
+ poolId: string;
101
+ classIndex: number;
102
+ noteSlug: string;
103
+ noteName: string;
104
+ /** The infusing or creating member's name (ART-c's sub-line part reads it). */
105
+ sourceLabel: string;
106
+ }
107
+ export interface InfusionCounter {
108
+ label: string;
109
+ used: number;
110
+ max: number;
111
+ over: boolean;
112
+ }
113
+ export type InfusionFlagReason = "orphan" | "duplicate" | "stack" | "mismatch" | "magic-base";
114
+ export interface InfusionContext {
115
+ views: Map<number, EntryView>;
116
+ counters: Map<string, InfusionCounter>;
117
+ flags: Array<{
118
+ index: number;
119
+ reason: InfusionFlagReason;
120
+ }>;
121
+ }
122
+ /** The overlay at the OWNING class level (spec §5.3 "Scaling"): `scales_at` rows at or below it replace keys, in level order. */
123
+ export declare function scaledInfuseItem(infuse: InfuseBlock, classLevel: number): InfuseItem;
124
+ /** The RULE entity of an equipment entry (spec §5.4): its view when it has one (null for an orphan or duplicate created
125
+ * entry), else the entry's own resolution. The ONE resolver every dnd5e fold reads (grep gate). `infusions` is the
126
+ * character's context, or ONE view (an entry-level helper's caller holds just that entry's view), or nothing. */
127
+ export declare function resolveEntryEntity(entry: EquipmentEntry, index: number, registry: EntityRegistry, infusions?: Pick<InfusionContext, "views"> | EntryView | null): {
128
+ entity: ArmorEntity | WeaponEntity | ItemEntity | null;
129
+ entityType: string | null;
130
+ };
131
+ /** Views, counters and flags (spec §5.4). Undefined, at no cost, for a character with no item-bound pool and no marker. */
132
+ export declare function buildInfusionContext(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry): InfusionContext | undefined;
133
+ /** The charge pair's reader (spec §5.5): an infused view's overlay charges live in the MARKER (`infusion.charges.current`,
134
+ * absent = full); anything else is `effectiveItemCharges` (stored, the note's own data, the curated map). */
135
+ export declare function entryCharges(entry: EquipmentEntry, view: EntryView | null | undefined, registry: EntityRegistry | null): {
136
+ current: number;
137
+ max: number;
138
+ } | undefined;
139
+ /** The charge pair's writer (spec §5.5): an infused view whose overlay has charges writes `infusion.charges.current`,
140
+ * clamped to 0..max, and never `state`; any other entry writes `state.charges` as today (`setItemCharges`): the stored
141
+ * max kept, else seeded from the item's own max ({@link effectiveItemCharges}: the note's data, then the curated map),
142
+ * else the new value; `current` clamped to 0..max. Returns a NEW entry. */
143
+ export declare function withEntryCharges(entry: EquipmentEntry, view: EntryView | null | undefined, current: number, registry: EntityRegistry | null): EquipmentEntry;
144
+ /** The reseed predicate (spec §5.7, Gate 0 M2, Gate 1 I10): the Builder's starting-equipment reseed,
145
+ * `setBuilderEquipmentMode` and `finishBuild` never replace, remove or duplicate an entry carrying `infusion`. */
146
+ export declare function isMarkedEntry(entry: EquipmentEntry): boolean;
147
+ /** One object off a stack (spec §5.7, Gate 1 m3): the source keeps qty - 1 and its hand; the new x1 keeps only
148
+ * `item`, `in` and `overrides`, unequipped, so a split never moves a hand slot. */
149
+ export declare function splitOne(equipment: readonly EquipmentEntry[], index: number): EquipmentEntry[];
150
+ /** One ended marker (spec §5.7, R18): `index` is the entry's position in the RETURNED array for an infused end (the
151
+ * entry stays) and -1 for a created one (it is removed); `item` (the entry's link or text) names it for a
152
+ * confirmation. The read-only twins `infusionsEndedByChoice` and `infusionsEndedByClassEdit` give the CURRENT index. */
153
+ export interface EndedEntry {
154
+ index: number;
155
+ key: string;
156
+ kind: "infused" | "created";
157
+ item: string;
158
+ }
159
+ /** A writer's result (spec §5.7): a NEW equipment array and the markers the write ended. */
160
+ export interface EquipmentWrite {
161
+ equipment: EquipmentEntry[];
162
+ ended: EndedEntry[];
163
+ }
164
+ export type InfuseRefusal = "not-owned" | "stranded" | "not-infusing" | "not-creating" | "target-kind" | "magic-base" | "marked" | "choice-required" | "bad-choice" | "no-target" | "invalid-item";
165
+ export type InfusionWrite = ({
166
+ ok: true;
167
+ } & EquipmentWrite) | {
168
+ ok: false;
169
+ reason: InfuseRefusal;
170
+ };
171
+ /** Ends one marker (spec §5.7, Gate 0 I3). Infused: the marker goes, `attuned` too when the base needs none (the entry's
172
+ * own resolution: arms b, b′ and c never need it, an arm d magic base may). Created: its children move to its own
173
+ * parent (or lose `in` at the top level), then it is removed. Every end path calls this; a marker's charges live in
174
+ * the marker (spec §5.5), so they go with it. */
175
+ export declare function endInfusion(equipment: readonly EquipmentEntry[], index: number, registry: EntityRegistry): EquipmentWrite;
176
+ /** Infuse one object (spec §5.7): refusals in the order `not-owned`, `not-infusing`, `stranded`, `choice-required` /
177
+ * `bad-choice` (a damage type, dnd5e's own list, and one of the note's `choice.options` when it lists them),
178
+ * `no-target`, `marked`, `magic-base` / `target-kind`; a stacked target is split first (`splitOne`) and the new x1 takes
179
+ * the marker; "A new object" is offered for EVERY infusing member (R23); then the same key's other marker and the pool's
180
+ * oldest over the cap end. `seq` is max + 1 over the INPUT equipment (an ended seq is never reused); charges start at the
181
+ * scaled overlay's max. */
182
+ export declare function infuseEntry(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: {
183
+ key: string;
184
+ target: number | {
185
+ newObject: string;
186
+ };
187
+ choice?: string;
188
+ isEntityVisible?: (e: RegisteredEntity) => boolean;
189
+ }): InfusionWrite;
190
+ /** Create one item from a creating copy (spec §5.7): `not-owned`; `not-creating` (not a repeatable member whose rows
191
+ * create items); `stranded` (the note, or its copy's option at `level`); `invalid-item` (any other status, or an item
192
+ * that is not installed or satisfies neither the copy's row nor equals its `option.item`: validation by row identity,
193
+ * §5.8). The same key's created entry and the pool's oldest over the cap end; the new entry is appended unequipped,
194
+ * x1, `kind: created`, with `seq` over the INPUT equipment. */
195
+ export declare function createEntry(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: {
196
+ key: string;
197
+ item: string;
198
+ }): InfusionWrite;
199
+ type ChoiceEdit = {
200
+ classIndex: number;
201
+ level: number;
202
+ choiceKey: string;
203
+ next: readonly string[];
204
+ };
205
+ /** Read-only (U-9): the markers `reconcileChoiceEdit` would end, with their CURRENT indices, for the confirmation. */
206
+ export declare function infusionsEndedByChoice(character: Character, resolved: ResolvedCharacter, _registry: EntityRegistry, req: ChoiceEdit): EndedEntry[];
207
+ /** Un-picking an infusion or a copy ends its markers in the same write (spec §5.7, Gate 0 I4): created items leave by the
208
+ * approved end path. Null when nothing ends. */
209
+ export declare function reconcileChoiceEdit(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: ChoiceEdit): EquipmentWrite | null;
210
+ type ClassEdit = {
211
+ classIndex: number;
212
+ remove: true;
213
+ } | {
214
+ classIndex: number;
215
+ subclass: string | null;
216
+ };
217
+ /** Read-only (B-8.2): the markers `reconcileClassEdit` would end, with their CURRENT indices, for the confirmation. */
218
+ export declare function infusionsEndedByClassEdit(character: Character, resolved: ResolvedCharacter, _registry: EntityRegistry, req: ClassEdit): EndedEntry[];
219
+ /** Removing a class or changing its subclass ends the markers it owns in the same write ("when the infusion's source is
220
+ * gone, the item ends like an ended infusion"). Null when nothing ends. */
221
+ export declare function reconcileClassEdit(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, req: ClassEdit): EquipmentWrite | null;
222
+ /** The Infuse picker's list (spec §5.7): the unmarked entries an owned infusing pick's targets admit, nonmagical, each
223
+ * with `stack` when infusing it splits one object off. */
224
+ export declare function eligibleTargets(character: Character, resolved: ResolvedCharacter, registry: EntityRegistry, key: string): Array<{
225
+ index: number;
226
+ stack: boolean;
227
+ }>;
228
+ export {};
@@ -0,0 +1,64 @@
1
+ import {
2
+ buildInfusionContext,
3
+ createEntry,
4
+ eligibleTargets,
5
+ endInfusion,
6
+ entryCharges,
7
+ infuseEntry,
8
+ infusionsEndedByChoice,
9
+ infusionsEndedByClassEdit,
10
+ isItemBound,
11
+ isMarkedEntry,
12
+ markerKey,
13
+ normalizedPickKey,
14
+ optionCandidates,
15
+ parsePickKey,
16
+ poolActiveWords,
17
+ poolCountLabel,
18
+ reconcileChoiceEdit,
19
+ reconcileClassEdit,
20
+ resolveCopyOption,
21
+ resolveEntryEntity,
22
+ resolveOptionRows,
23
+ scaledInfuseItem,
24
+ splitOne,
25
+ withEntryCharges
26
+ } from "../chunk-3VZZDKRA.js";
27
+ import "../chunk-W6GC6OKK.js";
28
+ import "../chunk-B3DP42OM.js";
29
+ import "../chunk-IUAAXXNO.js";
30
+ import "../chunk-IHE6KVC3.js";
31
+ import "../chunk-LHZXYFBU.js";
32
+ import "../chunk-ZUQW5VBZ.js";
33
+ import "../chunk-LVQLWRCU.js";
34
+ import "../chunk-CM5CWO4K.js";
35
+ import "../chunk-ZCTUYGNV.js";
36
+ import "../chunk-3TM34RSJ.js";
37
+ import "../chunk-PDJSUH24.js";
38
+ import "../chunk-WELIKLZF.js";
39
+ export {
40
+ buildInfusionContext,
41
+ createEntry,
42
+ eligibleTargets,
43
+ endInfusion,
44
+ entryCharges,
45
+ infuseEntry,
46
+ infusionsEndedByChoice,
47
+ infusionsEndedByClassEdit,
48
+ isItemBound,
49
+ isMarkedEntry,
50
+ markerKey,
51
+ normalizedPickKey,
52
+ optionCandidates,
53
+ parsePickKey,
54
+ poolActiveWords,
55
+ poolCountLabel,
56
+ reconcileChoiceEdit,
57
+ reconcileClassEdit,
58
+ resolveCopyOption,
59
+ resolveEntryEntity,
60
+ resolveOptionRows,
61
+ scaledInfuseItem,
62
+ splitOne,
63
+ withEntryCharges
64
+ };