@archivist-gg/dnd5e 0.3.13 → 0.3.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/background/background.codec.js +5 -5
- package/dist/background/background.parser.js +4 -4
- package/dist/background/background.schema.js +3 -3
- package/dist/chunk-3LWMFYKS.js +57 -0
- package/dist/{chunk-4SLOJXJ4.js → chunk-3SFGWFVQ.js} +1 -1
- package/dist/{chunk-Q6UOHCCT.js → chunk-3SIUAFDQ.js} +1 -1
- package/dist/chunk-4J6DS3EJ.js +30 -0
- package/dist/{chunk-RLGQ5PZZ.js → chunk-5JXFJ5AU.js} +11 -1
- package/dist/{chunk-4BZ47YJ4.js → chunk-64VNLMSG.js} +59 -16
- package/dist/{chunk-XY6X2APM.js → chunk-7Q2VPKCD.js} +17 -0
- package/dist/{chunk-Q5XTEYHD.js → chunk-7XJHI5H5.js} +16 -9
- package/dist/{chunk-FPGXFD2M.js → chunk-B2QHP6UF.js} +2 -2
- package/dist/{chunk-HJQNK3J5.js → chunk-B3DP42OM.js} +1 -4
- package/dist/{chunk-MC5YJ4PB.js → chunk-BJGOSM76.js} +1 -1
- package/dist/{chunk-VDPRBUU5.js → chunk-BJWSOQUC.js} +1 -1
- package/dist/{chunk-QEO7LYTG.js → chunk-EJD47JHL.js} +181 -93
- package/dist/{chunk-X7VZY4ON.js → chunk-FJYBLXV7.js} +2 -2
- package/dist/{chunk-QSBJ6NEM.js → chunk-FMUD3LDV.js} +1 -1
- package/dist/{chunk-LVX6TQ3R.js → chunk-FMYWORTP.js} +2 -2
- package/dist/{chunk-PX25R3DK.js → chunk-FVXLP7P3.js} +1 -1
- package/dist/{chunk-XJRNEQPD.js → chunk-GVWEFECG.js} +1 -1
- package/dist/{chunk-R2V5LN3I.js → chunk-HY2SRSVM.js} +1 -1
- package/dist/{chunk-ZMJQUZQH.js → chunk-JXWNXIIZ.js} +24 -0
- package/dist/chunk-KR6JF3BF.js +14 -0
- package/dist/{chunk-DPM6V7YX.js → chunk-LICYHPI3.js} +82 -6
- package/dist/{chunk-J53ERF6K.js → chunk-LNT64X7C.js} +1 -1
- package/dist/{chunk-RQNJXADQ.js → chunk-NKZMQV2C.js} +1 -1
- package/dist/{chunk-UE6LKRXQ.js → chunk-NTU2DXNG.js} +24 -1
- package/dist/{chunk-T5GZBKIQ.js → chunk-NXUY5XQN.js} +168 -33
- package/dist/{chunk-M2OWVAZG.js → chunk-NZO7M5GV.js} +1 -1
- package/dist/{chunk-BRGLDWUP.js → chunk-OOL4KMG2.js} +7 -3
- package/dist/{chunk-MWCCGPG3.js → chunk-OOSRUJBI.js} +3 -2
- package/dist/{chunk-H5PTKYXL.js → chunk-QA3YCOML.js} +1 -1
- package/dist/{chunk-MUIU7RZ3.js → chunk-QFWQKS3M.js} +1 -1
- package/dist/chunk-RD2MID3M.js +292 -0
- package/dist/chunk-TRBGC4ZG.js +112 -0
- package/dist/{chunk-PLOSP4XQ.js → chunk-UJCK5IW4.js} +11 -2
- package/dist/{chunk-5KGV6TF7.js → chunk-UNYR5GLI.js} +1 -1
- package/dist/{chunk-JNNNBEUH.js → chunk-VN5DLURA.js} +7 -2
- package/dist/{chunk-EL6QPF6I.js → chunk-VP5TIXDK.js} +1 -1
- package/dist/chunk-WOHX7YTH.js +165 -0
- package/dist/{chunk-G7ED5H2G.js → chunk-XTEFPUSN.js} +1 -1
- package/dist/{chunk-6ZY3U6BQ.js → chunk-ZOWKWMD2.js} +1 -1
- package/dist/class/class.codec.js +6 -6
- package/dist/class/class.parser.js +5 -5
- package/dist/class/class.schema.d.ts +8 -0
- package/dist/class/class.schema.js +4 -4
- package/dist/class/class.standard-array.d.ts +16 -0
- package/dist/class/class.standard-array.js +20 -0
- package/dist/class/class.types.d.ts +3 -0
- package/dist/dnd/amount-text.d.ts +42 -0
- package/dist/dnd/amount-text.js +15 -0
- package/dist/dnd/resource-words.d.ts +4 -0
- package/dist/dnd/resource-words.js +30 -0
- package/dist/entities/registry-revision.d.ts +25 -0
- package/dist/entities/registry-revision.js +10 -0
- package/dist/feat/feat.codec.js +5 -5
- package/dist/feat/feat.parser.js +4 -4
- package/dist/feat/feat.schema.d.ts +34 -0
- package/dist/feat/feat.schema.js +3 -3
- package/dist/index.js +4027 -383
- package/dist/monster/monster.parser.js +5 -5
- package/dist/monster/monster.schema.js +4 -4
- package/dist/optional-feature/optional-feature.codec.js +5 -4
- package/dist/optional-feature/optional-feature.parser.js +4 -3
- package/dist/optional-feature/optional-feature.schema.d.ts +35 -0
- package/dist/optional-feature/optional-feature.schema.js +3 -2
- package/dist/pc/pc.additional-spells.d.ts +16 -2
- package/dist/pc/pc.additional-spells.js +5 -2
- package/dist/pc/pc.amount-bindings.d.ts +41 -0
- package/dist/pc/pc.amount-bindings.js +28 -0
- package/dist/pc/pc.decision-engine.d.ts +11 -0
- package/dist/pc/pc.decision-engine.js +20 -16
- package/dist/pc/pc.entry-overrides.js +3 -2
- package/dist/pc/pc.equipment.js +7 -5
- package/dist/pc/pc.feature-effects.d.ts +21 -2
- package/dist/pc/pc.feature-effects.js +15 -2
- package/dist/pc/pc.infusions.d.ts +9 -1
- package/dist/pc/pc.infusions.js +3 -2
- package/dist/pc/pc.member-choices.d.ts +122 -0
- package/dist/pc/pc.member-choices.js +39 -0
- package/dist/pc/pc.parser.js +1 -1
- package/dist/pc/pc.pools.d.ts +7 -0
- package/dist/pc/pc.pools.js +5 -2
- package/dist/pc/pc.proficiencies.d.ts +14 -0
- package/dist/pc/pc.proficiencies.js +72 -22
- package/dist/pc/pc.proficiency-normalize.d.ts +14 -0
- package/dist/pc/pc.proficiency-normalize.js +9 -3
- package/dist/pc/pc.proficiency-query.js +7 -1
- package/dist/pc/pc.recalc.js +212 -99
- package/dist/pc/pc.resolver.d.ts +6 -2
- package/dist/pc/pc.resolver.js +16 -14
- package/dist/pc/pc.rest.js +4 -3
- package/dist/pc/pc.schema.d.ts +48 -2
- package/dist/pc/pc.schema.js +1 -1
- package/dist/pc/pc.spell-scope.d.ts +22 -0
- package/dist/pc/pc.tool-picks.js +2 -2
- package/dist/pc/pc.types.d.ts +110 -6
- package/dist/pc/pc.weapon-grant.d.ts +15 -0
- package/dist/pc/pool-layout.d.ts +3 -9
- package/dist/pc/pool-layout.js +1 -3
- package/dist/pc/resource-equivalents.d.ts +44 -0
- package/dist/pc/spell-source.js +4 -9
- package/dist/race/race.codec.js +6 -6
- package/dist/race/race.parser.js +5 -5
- package/dist/race/race.schema.js +4 -4
- package/dist/schemas/choice-schema.js +2 -2
- package/dist/schemas/feature-effect-schema.d.ts +34 -0
- package/dist/schemas/feature-effect-schema.js +1 -1
- package/dist/schemas/feature-schema.js +3 -3
- package/dist/spell/spell.codec.js +2 -2
- package/dist/spell/spell.parser.d.ts +6 -1
- package/dist/spell/spell.parser.js +5 -3
- package/dist/spell/spell.types.d.ts +10 -0
- package/dist/subclass/subclass.codec.js +6 -6
- package/dist/subclass/subclass.parser.js +5 -5
- package/dist/subclass/subclass.schema.js +4 -4
- package/dist/types/choice.d.ts +7 -2
- package/dist/types/feature-effect.d.ts +24 -0
- package/dist/types/optional-feature.types.d.ts +6 -1
- package/dist/types/selection-pool.d.ts +2 -2
- package/package.json +1 -1
package/dist/pc/pc.recalc.js
CHANGED
|
@@ -1,9 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildUnarmedRow,
|
|
3
|
+
computeAppliedBonuses,
|
|
4
|
+
computeSlotsAndAttacks,
|
|
5
|
+
emptyAppliedBonuses
|
|
6
|
+
} from "../chunk-7XJHI5H5.js";
|
|
7
|
+
import "../chunk-3LWMFYKS.js";
|
|
8
|
+
import "../chunk-YDGMBMYI.js";
|
|
9
|
+
import {
|
|
10
|
+
amountBindingsFor
|
|
11
|
+
} from "../chunk-TRBGC4ZG.js";
|
|
12
|
+
import "../chunk-KR6JF3BF.js";
|
|
13
|
+
import {
|
|
14
|
+
computeConditionEffects
|
|
15
|
+
} from "../chunk-MYY2C5MB.js";
|
|
16
|
+
import "../chunk-EJP263OP.js";
|
|
1
17
|
import {
|
|
2
18
|
collectChosenAbilityPoints,
|
|
3
19
|
collectChosenProficiencies
|
|
4
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-EJD47JHL.js";
|
|
5
21
|
import "../chunk-2LULMQTF.js";
|
|
6
|
-
import "../chunk-
|
|
22
|
+
import "../chunk-QA3YCOML.js";
|
|
23
|
+
import {
|
|
24
|
+
assembleEffectFeatures,
|
|
25
|
+
computeFeatureEffects,
|
|
26
|
+
foldsNow,
|
|
27
|
+
selfEffectsOf
|
|
28
|
+
} from "../chunk-64VNLMSG.js";
|
|
29
|
+
import "../chunk-TOM66P2P.js";
|
|
30
|
+
import "../chunk-KU3YLF6D.js";
|
|
31
|
+
import {
|
|
32
|
+
proficiencyKey
|
|
33
|
+
} from "../chunk-5JXFJ5AU.js";
|
|
34
|
+
import {
|
|
35
|
+
featPickSites,
|
|
36
|
+
poolMemberSitesOf,
|
|
37
|
+
spellsReached
|
|
38
|
+
} from "../chunk-RD2MID3M.js";
|
|
39
|
+
import "../chunk-LICYHPI3.js";
|
|
40
|
+
import "../chunk-PVCEA4HZ.js";
|
|
7
41
|
import {
|
|
8
42
|
resourceLevelFor
|
|
9
43
|
} from "../chunk-KSTV7J2U.js";
|
|
@@ -13,57 +47,39 @@ import {
|
|
|
13
47
|
effectiveSpellcastingAbility,
|
|
14
48
|
resolveSpellcasting
|
|
15
49
|
} from "../chunk-DPUJDOKV.js";
|
|
50
|
+
import {
|
|
51
|
+
legacyAsiBranch
|
|
52
|
+
} from "../chunk-LBEXLN6I.js";
|
|
16
53
|
import {
|
|
17
54
|
toDefenseSlug
|
|
18
55
|
} from "../chunk-XJ2F2WO6.js";
|
|
19
|
-
import
|
|
20
|
-
buildUnarmedRow,
|
|
21
|
-
computeAppliedBonuses,
|
|
22
|
-
computeSlotsAndAttacks,
|
|
23
|
-
emptyAppliedBonuses
|
|
24
|
-
} from "../chunk-Q5XTEYHD.js";
|
|
25
|
-
import "../chunk-YDGMBMYI.js";
|
|
26
|
-
import {
|
|
27
|
-
assembleEffectFeatures,
|
|
28
|
-
computeFeatureEffects,
|
|
29
|
-
foldsNow,
|
|
30
|
-
selfEffectsOf
|
|
31
|
-
} from "../chunk-4BZ47YJ4.js";
|
|
32
|
-
import "../chunk-TOM66P2P.js";
|
|
33
|
-
import "../chunk-KU3YLF6D.js";
|
|
34
|
-
import "../chunk-RLGQ5PZZ.js";
|
|
35
|
-
import "../chunk-T5GZBKIQ.js";
|
|
56
|
+
import "../chunk-NXUY5XQN.js";
|
|
36
57
|
import "../chunk-W6GC6OKK.js";
|
|
37
|
-
import "../chunk-
|
|
58
|
+
import "../chunk-B3DP42OM.js";
|
|
38
59
|
import {
|
|
39
60
|
diceColumnAt,
|
|
40
61
|
unarmedDieColumnFor
|
|
41
62
|
} from "../chunk-IUAAXXNO.js";
|
|
42
63
|
import "../chunk-YHYTW5QA.js";
|
|
43
|
-
import "../chunk-DPM6V7YX.js";
|
|
44
|
-
import "../chunk-PVCEA4HZ.js";
|
|
45
|
-
import {
|
|
46
|
-
legacyAsiBranch
|
|
47
|
-
} from "../chunk-LBEXLN6I.js";
|
|
48
|
-
import {
|
|
49
|
-
computeConditionEffects
|
|
50
|
-
} from "../chunk-MYY2C5MB.js";
|
|
51
|
-
import "../chunk-EJP263OP.js";
|
|
52
64
|
import "../chunk-ZUQW5VBZ.js";
|
|
53
65
|
import "../chunk-IHE6KVC3.js";
|
|
54
66
|
import "../chunk-HHBD4SQ6.js";
|
|
55
67
|
import "../chunk-A54HHCWW.js";
|
|
56
68
|
import "../chunk-LHZXYFBU.js";
|
|
69
|
+
import "../chunk-YBLDE5CG.js";
|
|
57
70
|
import "../chunk-LVQLWRCU.js";
|
|
58
71
|
import "../chunk-CM5CWO4K.js";
|
|
59
|
-
import "../chunk-
|
|
60
|
-
import "../chunk-YBLDE5CG.js";
|
|
72
|
+
import "../chunk-4J6DS3EJ.js";
|
|
61
73
|
import {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
74
|
+
resolveAmountText
|
|
75
|
+
} from "../chunk-WOHX7YTH.js";
|
|
76
|
+
import "../chunk-EVMUJYUD.js";
|
|
65
77
|
import "../chunk-VTTA2ALZ.js";
|
|
66
|
-
import
|
|
78
|
+
import {
|
|
79
|
+
bareEntitySlug,
|
|
80
|
+
slugify
|
|
81
|
+
} from "../chunk-ZCTUYGNV.js";
|
|
82
|
+
import "../chunk-7Q2VPKCD.js";
|
|
67
83
|
import "../chunk-ZDAEGJH4.js";
|
|
68
84
|
import "../chunk-3TM34RSJ.js";
|
|
69
85
|
import {
|
|
@@ -84,6 +100,60 @@ import {
|
|
|
84
100
|
import "../chunk-4U55VNC7.js";
|
|
85
101
|
import "../chunk-UA5KS2PL.js";
|
|
86
102
|
|
|
103
|
+
// src/pc/pc.spell-scope.ts
|
|
104
|
+
var lower = (s) => (s != null ? s : "").trim().toLowerCase();
|
|
105
|
+
function namedSpellSlug(ref) {
|
|
106
|
+
var _a;
|
|
107
|
+
const inner = ref.replace(/^\[\[/, "").replace(/\]\]$/, "").split("|")[0];
|
|
108
|
+
return slugify((_a = inner.split("/").pop()) != null ? _a : inner);
|
|
109
|
+
}
|
|
110
|
+
function dealsDamage(spell) {
|
|
111
|
+
var _a, _b;
|
|
112
|
+
return ((_b = (_a = spell.damage) == null ? void 0 : _a.types) != null ? _b : []).some((t) => t.trim() !== "");
|
|
113
|
+
}
|
|
114
|
+
function spellsInScope(scope, spells, pickedTypes) {
|
|
115
|
+
var _a, _b;
|
|
116
|
+
if (!scope) return [];
|
|
117
|
+
const picked = scope.damage_type_pick !== void 0 ? pickedTypes(scope.damage_type_pick).map(lower) : null;
|
|
118
|
+
const types = (_a = scope.damage_types) == null ? void 0 : _a.map(lower);
|
|
119
|
+
const named = (_b = scope.spells) == null ? void 0 : _b.map(namedSpellSlug);
|
|
120
|
+
const hit = spells.filter(({ slug, entity: e }) => {
|
|
121
|
+
var _a2, _b2, _c, _d, _e;
|
|
122
|
+
if (!dealsDamage(e)) return false;
|
|
123
|
+
const own = ((_b2 = (_a2 = e.damage) == null ? void 0 : _a2.types) != null ? _b2 : []).map(lower);
|
|
124
|
+
if (scope.list !== void 0 && !((_c = e.classes) != null ? _c : []).map(lower).includes(lower(scope.list))) return false;
|
|
125
|
+
if (scope.level !== void 0 && ((_d = e.level) != null ? _d : 0) !== scope.level) return false;
|
|
126
|
+
if (scope.school !== void 0 && lower(e.school) !== lower(scope.school)) return false;
|
|
127
|
+
if (types && !own.some((t) => types.includes(t))) return false;
|
|
128
|
+
if (picked && !own.some((t) => picked.includes(t))) return false;
|
|
129
|
+
if (named && !named.includes(bareEntitySlug(slug)) && !named.includes(slugify((_e = e.name) != null ? _e : ""))) return false;
|
|
130
|
+
return true;
|
|
131
|
+
});
|
|
132
|
+
return [...new Set(hit.map((s) => s.slug))];
|
|
133
|
+
}
|
|
134
|
+
function pickedDamageTypes(resolved, choiceId) {
|
|
135
|
+
var _a, _b, _c, _d, _e, _f;
|
|
136
|
+
const out = /* @__PURE__ */ new Set();
|
|
137
|
+
for (const c of (_a = resolved.classes) != null ? _a : []) {
|
|
138
|
+
for (const owner of [c.entity, c.subclass]) {
|
|
139
|
+
for (const [lvl, feats] of Object.entries((_b = owner == null ? void 0 : owner.features_by_level) != null ? _b : {})) {
|
|
140
|
+
for (const feat of feats != null ? feats : []) {
|
|
141
|
+
for (const ch of (_c = feat.choices) != null ? _c : []) {
|
|
142
|
+
if (ch.kind !== "select-inline" || ch.id !== choiceId) continue;
|
|
143
|
+
const sel = ((_e = (_d = c.choices) == null ? void 0 : _d[Number(lvl)]) != null ? _e : {})[ch.id];
|
|
144
|
+
if (typeof sel !== "string") continue;
|
|
145
|
+
const opt = ch.options.find((o) => o.value === sel);
|
|
146
|
+
for (const word of `${sel} ${(_f = opt == null ? void 0 : opt.label) != null ? _f : ""}`.split(/[^A-Za-z]+/)) {
|
|
147
|
+
if (word && isCanonicalDamageType(word)) out.add(word.toLowerCase());
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return [...out];
|
|
155
|
+
}
|
|
156
|
+
|
|
87
157
|
// src/pc/pc.recalc.ts
|
|
88
158
|
var WEAPON_CATEGORY_WORDS = /* @__PURE__ */ new Set([
|
|
89
159
|
"simple",
|
|
@@ -198,14 +268,9 @@ function hpLevelCount(classes) {
|
|
|
198
268
|
function multiclassMaxHP(classes, conMod) {
|
|
199
269
|
return Math.max(1, hitDiceAverageSum(classes) + conMod * hpLevelCount(classes));
|
|
200
270
|
}
|
|
201
|
-
function resolveRiderAmount(amount, bindings) {
|
|
202
|
-
if (!amount.includes("{")) return amount;
|
|
203
|
-
const formula = amount.replace(/\{prof_bonus\}/g, "{prof}");
|
|
204
|
-
if (!isValidMaxFormula(formula)) return amount;
|
|
205
|
-
return String(evaluateMaxFormula(formula, bindings));
|
|
206
|
-
}
|
|
207
271
|
function resolveDamageRider(rider, rowDamageType, bindings) {
|
|
208
|
-
const
|
|
272
|
+
const { owner, ...rest } = rider;
|
|
273
|
+
const out = { ...rest, amount: resolveAmountText(rider.amount, bindings(owner)) };
|
|
209
274
|
if (rider.damage_type !== void 0 && !isChosenDamageType(rider.damage_type)) {
|
|
210
275
|
const resolved = isCanonicalDamageType(rider.damage_type) ? rider.damage_type : rowDamageType;
|
|
211
276
|
if (resolved) out.damage_type = resolved;
|
|
@@ -359,17 +424,17 @@ function collectClassFeatAbilityPoints(resolved) {
|
|
|
359
424
|
const stripRef = (ref) => ref.replace(/^\[\[/, "").replace(/\]\]$/, "");
|
|
360
425
|
const featBySlug = /* @__PURE__ */ new Map();
|
|
361
426
|
for (const f of resolved.feats) featBySlug.set(f.slug, f);
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const feat = featBySlug.get(stripRef(
|
|
427
|
+
const sites = featPickSites(resolved.classes, poolMemberSitesOf(resolved), (ci) => {
|
|
428
|
+
var _a2, _b2, _c, _d;
|
|
429
|
+
return (_d = (_c = (_b2 = (_a2 = resolved.classes) == null ? void 0 : _a2[ci]) == null ? void 0 : _b2.entity) == null ? void 0 : _c.slug) != null ? _d : null;
|
|
430
|
+
});
|
|
431
|
+
for (const site of sites) {
|
|
432
|
+
{
|
|
433
|
+
const feat = featBySlug.get(stripRef(site.slug));
|
|
369
434
|
if (!feat) continue;
|
|
370
435
|
for (const ch of (_a = feat.choices) != null ? _a : []) {
|
|
371
436
|
if (ch.kind !== "ability-points") continue;
|
|
372
|
-
const raw =
|
|
437
|
+
const raw = site.read(ch.id);
|
|
373
438
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) continue;
|
|
374
439
|
let left = ch.points;
|
|
375
440
|
for (const ab of ABILITY_KEYS) {
|
|
@@ -449,6 +514,25 @@ function mergeInto(target, source) {
|
|
|
449
514
|
for (const c of source.categories) if (!target.categories.includes(c)) target.categories.push(c);
|
|
450
515
|
for (const s of source.specific) if (!target.specific.includes(s)) target.specific.push(s);
|
|
451
516
|
}
|
|
517
|
+
function applyArmorWeaponOverrides(profs, overrides) {
|
|
518
|
+
var _a, _b;
|
|
519
|
+
for (const kind of ["armor", "weapons"]) {
|
|
520
|
+
const ov = overrides == null ? void 0 : overrides[kind];
|
|
521
|
+
if (!ov) continue;
|
|
522
|
+
const set = profs[kind];
|
|
523
|
+
const key = (v) => proficiencyKey(kind, v);
|
|
524
|
+
const removes = new Set(((_a = ov.remove) != null ? _a : []).map(key));
|
|
525
|
+
for (const v of (_b = ov.add) != null ? _b : []) {
|
|
526
|
+
const k = key(v);
|
|
527
|
+
if (removes.has(k)) continue;
|
|
528
|
+
const category = kind === "armor" || k === "simple" || k === "martial";
|
|
529
|
+
const target = category ? set.categories : set.specific;
|
|
530
|
+
if (!target.some((e) => key(e) === k)) target.push(category ? k : v);
|
|
531
|
+
}
|
|
532
|
+
set.categories = set.categories.filter((e) => !removes.has(key(e)));
|
|
533
|
+
set.specific = set.specific.filter((e) => !removes.has(key(e)));
|
|
534
|
+
}
|
|
535
|
+
}
|
|
452
536
|
var ORIGIN_RANK = { manual: 0, equipment: 1, grant: 2 };
|
|
453
537
|
function composeDefenseEntries(manual, equipment, grants) {
|
|
454
538
|
var _a;
|
|
@@ -540,12 +624,23 @@ function computeProficiencies(resolved) {
|
|
|
540
624
|
};
|
|
541
625
|
}
|
|
542
626
|
function recalc(resolved, registry) {
|
|
543
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z
|
|
627
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z, __, _$;
|
|
544
628
|
const warnings = [];
|
|
545
629
|
const overrides = (_a = resolved.definition.overrides) != null ? _a : {};
|
|
546
630
|
const chosenProfs = collectChosenProficiencies(resolved);
|
|
547
631
|
const { features: effectFeatures, activeBuffs } = assembleEffectFeatures(resolved);
|
|
548
|
-
const
|
|
632
|
+
const tableDiceFor = (src, column, level) => {
|
|
633
|
+
var _a2;
|
|
634
|
+
const cls = src.kind === "class" ? resolved.classes.find((c) => {
|
|
635
|
+
var _a3;
|
|
636
|
+
return ((_a3 = c.entity) == null ? void 0 : _a3.slug) === src.slug;
|
|
637
|
+
}) : src.kind === "subclass" ? resolved.classes.find((c) => {
|
|
638
|
+
var _a3;
|
|
639
|
+
return ((_a3 = c.subclass) == null ? void 0 : _a3.slug) === src.slug;
|
|
640
|
+
}) : void 0;
|
|
641
|
+
return cls ? diceColumnAt((_a2 = cls.entity) == null ? void 0 : _a2.table, level, column) : null;
|
|
642
|
+
};
|
|
643
|
+
const featureEffects = computeFeatureEffects(effectFeatures, { activeBuffs, levelFor: (src) => resourceLevelFor(src, resolved), tableDiceFor });
|
|
549
644
|
const profsForApply = computeProficiencies(resolved);
|
|
550
645
|
for (const t of chosenProfs.tools) {
|
|
551
646
|
if (!profsForApply.tools.specific.includes(t)) profsForApply.tools.specific.push(t);
|
|
@@ -572,6 +667,7 @@ function recalc(resolved, registry) {
|
|
|
572
667
|
}
|
|
573
668
|
}
|
|
574
669
|
profsForApply.languages.sort();
|
|
670
|
+
applyArmorWeaponOverrides(profsForApply, (_b = resolved.definition) == null ? void 0 : _b.overrides);
|
|
575
671
|
const applied = registry ? computeAppliedBonuses(resolved, profsForApply, registry, warnings) : emptyAppliedBonuses();
|
|
576
672
|
const savesInformational = applied.informational.filter(
|
|
577
673
|
(i) => i.field === "saving_throws"
|
|
@@ -586,7 +682,7 @@ function recalc(resolved, registry) {
|
|
|
586
682
|
const scores = { ...baseScores };
|
|
587
683
|
for (const ab of ABILITY_KEYS) {
|
|
588
684
|
const bonus = applied.ability_bonuses[ab];
|
|
589
|
-
scores[ab] += (typeof bonus === "number" ? bonus : 0) + ((
|
|
685
|
+
scores[ab] += (typeof bonus === "number" ? bonus : 0) + ((_c = featureEffects.ability_bonus[ab]) != null ? _c : 0);
|
|
590
686
|
}
|
|
591
687
|
for (const ab of ABILITY_KEYS) {
|
|
592
688
|
const stat = applied.ability_statics[ab];
|
|
@@ -613,28 +709,41 @@ function recalc(resolved, registry) {
|
|
|
613
709
|
resolved.definition.edition,
|
|
614
710
|
scores
|
|
615
711
|
);
|
|
616
|
-
const firstClass = (
|
|
617
|
-
const saveProfs = new Set((
|
|
712
|
+
const firstClass = (_e = (_d = resolved.classes[0]) == null ? void 0 : _d.entity) != null ? _e : null;
|
|
713
|
+
const saveProfs = new Set((_f = firstClass == null ? void 0 : firstClass.saving_throws) != null ? _f : []);
|
|
618
714
|
for (const ab of featureEffects.proficiencies.saves) saveProfs.add(ab);
|
|
619
715
|
for (const ab of chosenProfs.saves) saveProfs.add(ab);
|
|
620
716
|
const saves = {};
|
|
621
717
|
const saveBreakdowns = {};
|
|
718
|
+
const activeSaveBonusTerms = featureEffects.save_bonus_terms.filter((t) => {
|
|
719
|
+
var _a2;
|
|
720
|
+
return t.inactiveWhile === "incapacitated" ? !conditionEffects.actions_disabled : t.inactiveWhile === "unconscious" ? !((_a2 = resolved.state.conditions) != null ? _a2 : []).includes("unconscious") : true;
|
|
721
|
+
});
|
|
622
722
|
for (const ab of ABILITY_KEYS) {
|
|
623
|
-
const override = (
|
|
624
|
-
const prof = (
|
|
625
|
-
const
|
|
626
|
-
|
|
723
|
+
const override = (_g = overrides.saves) == null ? void 0 : _g[ab];
|
|
724
|
+
const prof = (_h = override == null ? void 0 : override.proficient) != null ? _h : saveProfs.has(ab);
|
|
725
|
+
const featureTerms = [];
|
|
726
|
+
for (const t of activeSaveBonusTerms) {
|
|
727
|
+
if (t.saves.length > 0 && !t.saves.includes(ab)) continue;
|
|
728
|
+
const amount = Math.max(t.minimum, mods[t.ability]);
|
|
729
|
+
const prior = featureTerms.find((x) => x.source === t.label);
|
|
730
|
+
if (prior === void 0) featureTerms.push({ source: t.label, amount });
|
|
731
|
+
else if (amount > prior.amount) prior.amount = amount;
|
|
732
|
+
}
|
|
733
|
+
const derivedBonus = savingThrow(scores[ab], prof, proficiencyBonus) + applied.save_bonus + featureTerms.reduce((sum, t) => sum + t.amount, 0) + conditionEffects.d20_test_penalty;
|
|
734
|
+
const bonus = (_i = override == null ? void 0 : override.bonus) != null ? _i : derivedBonus;
|
|
627
735
|
saves[ab] = { bonus, proficient: prof };
|
|
628
736
|
saveBreakdowns[ab] = [
|
|
629
737
|
{ source: ab.toUpperCase(), amount: mods[ab] },
|
|
630
738
|
...prof ? [{ source: "Proficiency", amount: proficiencyBonus }] : [],
|
|
631
|
-
...applied.
|
|
632
|
-
...
|
|
739
|
+
...applied.save_terms.map((t) => ({ ...t })),
|
|
740
|
+
...featureTerms,
|
|
741
|
+
...conditionEffects.d20_test_penalty ? [{ source: `Exhaustion ${conditionEffects.exhaustion_level}`, amount: conditionEffects.d20_test_penalty }] : []
|
|
633
742
|
];
|
|
634
743
|
}
|
|
635
744
|
const profSet = /* @__PURE__ */ new Set([
|
|
636
745
|
...resolved.definition.skills.proficient,
|
|
637
|
-
...(
|
|
746
|
+
...(_k = (_j = resolved.background) == null ? void 0 : _j.skill_proficiencies) != null ? _k : [],
|
|
638
747
|
...chosenProfs.skills,
|
|
639
748
|
...featureEffects.proficiencies.skills
|
|
640
749
|
]);
|
|
@@ -644,12 +753,12 @@ function recalc(resolved, registry) {
|
|
|
644
753
|
for (const skill of ALL_SKILLS) {
|
|
645
754
|
const skillKey = skillSlugFromDisplay(skill);
|
|
646
755
|
const ab = SKILL_ABILITY[skillSlugToAbilityLookup(skillKey)];
|
|
647
|
-
const override = (
|
|
648
|
-
const tri = (
|
|
756
|
+
const override = (_l = overrides.skills) == null ? void 0 : _l[skillKey];
|
|
757
|
+
const tri = (_m = override == null ? void 0 : override.proficiency) != null ? _m : expSet.has(skillKey) ? "expertise" : profSet.has(skillKey) ? "proficient" : "none";
|
|
649
758
|
const skillTerms = featureEffects.skill_bonus_terms.filter((t) => t.skills.includes(skillKey)).map((t) => ({ source: t.label, amount: Math.max(t.minimum, mods[t.ability]) }));
|
|
650
759
|
const halfProfTerms = tri !== "none" ? [] : featureEffects.half_proficiency_terms.filter((t) => t.skills.length === 0 || t.skills.includes(skillKey)).map((t) => ({ source: t.label, amount: t.round === "up" ? Math.ceil(proficiencyBonus / 2) : Math.floor(proficiencyBonus / 2) }));
|
|
651
760
|
const halfProfBest = halfProfTerms.length ? halfProfTerms.reduce((best, t) => t.amount > best.amount ? t : best) : null;
|
|
652
|
-
const bonus = (
|
|
761
|
+
const bonus = (_o = override == null ? void 0 : override.bonus) != null ? _o : skillBonus(scores[ab], tri, proficiencyBonus) + skillTerms.reduce((sum, t) => sum + t.amount, 0) + ((_n = halfProfBest == null ? void 0 : halfProfBest.amount) != null ? _n : 0) + conditionEffects.d20_test_penalty;
|
|
653
762
|
skillBreakdowns[skillKey] = [
|
|
654
763
|
{ source: ab.toUpperCase(), amount: mods[ab] },
|
|
655
764
|
...tri !== "none" ? [{ source: tri === "expertise" ? "Expertise" : "Proficiency", amount: proficiencyBonus * (tri === "expertise" ? 2 : 1) }] : [],
|
|
@@ -665,12 +774,12 @@ function recalc(resolved, registry) {
|
|
|
665
774
|
};
|
|
666
775
|
}
|
|
667
776
|
const passives = {
|
|
668
|
-
perception: (
|
|
669
|
-
investigation: (
|
|
670
|
-
insight: (
|
|
777
|
+
perception: (_q = (_p = overrides.passives) == null ? void 0 : _p.perception) != null ? _q : 10 + skills.perception.bonus,
|
|
778
|
+
investigation: (_s = (_r = overrides.passives) == null ? void 0 : _r.investigation) != null ? _s : 10 + skills.investigation.bonus,
|
|
779
|
+
insight: (_u = (_t = overrides.passives) == null ? void 0 : _t.insight) != null ? _u : 10 + skills.insight.bonus
|
|
671
780
|
};
|
|
672
|
-
const hpRolled = (
|
|
673
|
-
const hpModifier = (
|
|
781
|
+
const hpRolled = (_w = (_v = overrides.hp) == null ? void 0 : _v.rolled) != null ? _w : null;
|
|
782
|
+
const hpModifier = (_y = (_x = overrides.hp) == null ? void 0 : _x.modifier) != null ? _y : null;
|
|
674
783
|
const averageDiceSum = hitDiceAverageSum(resolved.classes);
|
|
675
784
|
const conLevels = hpLevelCount(resolved.classes);
|
|
676
785
|
const diceSum = hpRolled != null ? hpRolled : averageDiceSum;
|
|
@@ -678,7 +787,7 @@ function recalc(resolved, registry) {
|
|
|
678
787
|
const diceConClamped = Math.max(1, diceConRaw);
|
|
679
788
|
const hpMaxDerived = diceConClamped + featureEffects.hp_per_level_bonus * totalLevel + (hpModifier != null ? hpModifier : 0);
|
|
680
789
|
const hpMaxAfterConditions = Math.max(0, Math.floor(hpMaxDerived * conditionEffects.hp_max_multiplier));
|
|
681
|
-
const hpMax = (
|
|
790
|
+
const hpMax = (_A = (_z = overrides.hp) == null ? void 0 : _z.max) != null ? _A : hpMaxAfterConditions;
|
|
682
791
|
const hpBreakdown = {
|
|
683
792
|
diceSum,
|
|
684
793
|
diceSource: hpRolled != null ? "rolled" : "average",
|
|
@@ -696,7 +805,7 @@ function recalc(resolved, registry) {
|
|
|
696
805
|
exhaustionMultiplier: conditionEffects.hp_max_multiplier,
|
|
697
806
|
exhaustionLevel: conditionEffects.exhaustion_level,
|
|
698
807
|
derivedMax: hpMaxAfterConditions,
|
|
699
|
-
override: (
|
|
808
|
+
override: (_C = (_B = overrides.hp) == null ? void 0 : _B.max) != null ? _C : null,
|
|
700
809
|
final: hpMax
|
|
701
810
|
};
|
|
702
811
|
const featureAcTermsFor = (hasArmor) => featureEffects.ac_terms.filter((t) => !t.requires_armor || hasArmor).map((t) => ({ source: t.label, amount: t.value, kind: "feature", condition: t.condition }));
|
|
@@ -720,7 +829,7 @@ function recalc(resolved, registry) {
|
|
|
720
829
|
let acBreakdownDerived = [];
|
|
721
830
|
let acInformationalDerived = [];
|
|
722
831
|
if (registry) {
|
|
723
|
-
derivedEquipment = computeSlotsAndAttacks(resolved, mods, profsForApply, registry, warnings, proficiencyBonus, weaponAbilities, (
|
|
832
|
+
derivedEquipment = computeSlotsAndAttacks(resolved, mods, profsForApply, registry, warnings, proficiencyBonus, weaponAbilities, (_D = resolved.weaponMasteries) != null ? _D : [], featureEffects.attunement_set);
|
|
724
833
|
if (derivedEquipment.equippedSlots.armor) {
|
|
725
834
|
const featTerms = featureAcTermsFor(true);
|
|
726
835
|
acDerived = derivedEquipment.ac + sumTerms(featTerms);
|
|
@@ -744,13 +853,13 @@ function recalc(resolved, registry) {
|
|
|
744
853
|
acDerived = total + sumTerms(featTerms);
|
|
745
854
|
acBreakdownDerived = [...terms, ...featTerms];
|
|
746
855
|
}
|
|
747
|
-
const ac = (
|
|
856
|
+
const ac = (_E = overrides.ac) != null ? _E : acDerived;
|
|
748
857
|
const additiveSpeed = speedFromRace(resolved) + applied.speed_bonuses.walk + featureEffects.speed_walk_bonus;
|
|
749
858
|
const baseSpeed = Math.max(featureEffects.speed_walk_set, additiveSpeed);
|
|
750
859
|
const adjustedSpeed = baseSpeed * conditionEffects.speed_multiplier - conditionEffects.speed_reduction_ft;
|
|
751
860
|
const conditionSpeed = conditionEffects.speed_floor_zero ? 0 : Math.max(0, Math.floor(adjustedSpeed));
|
|
752
|
-
const speed = (
|
|
753
|
-
const raceSpeed = (
|
|
861
|
+
const speed = (_F = overrides.speed) != null ? _F : conditionSpeed;
|
|
862
|
+
const raceSpeed = (_I = (_H = (_G = resolved.race) == null ? void 0 : _G.speed) == null ? void 0 : _H.walk) != null ? _I : 30;
|
|
754
863
|
const speedBreakdown = [
|
|
755
864
|
{ source: "Base speed", amount: raceSpeed },
|
|
756
865
|
...speedFromRace(resolved) !== raceSpeed ? [{ source: "Feats", amount: speedFromRace(resolved) - raceSpeed }] : [],
|
|
@@ -760,14 +869,14 @@ function recalc(resolved, registry) {
|
|
|
760
869
|
...conditionSpeed !== baseSpeed ? [{ source: "Conditions", amount: conditionSpeed - baseSpeed }] : []
|
|
761
870
|
];
|
|
762
871
|
if (!resolved.race) warnings.push("No race resolved; speed defaulted to 30.");
|
|
763
|
-
const init = (
|
|
872
|
+
const init = (_J = overrides.initiative) != null ? _J : initiativeBonus(mods.dex, resolved.feats, resolved.definition.edition) + featureEffects.initiative_bonus;
|
|
764
873
|
const initiativeBreakdown = [
|
|
765
874
|
{ source: "DEX", amount: mods.dex },
|
|
766
875
|
...initiativeBonus(mods.dex, resolved.feats, resolved.definition.edition) !== mods.dex ? [{ source: "Feats", amount: initiativeBonus(mods.dex, resolved.feats, resolved.definition.edition) - mods.dex }] : [],
|
|
767
876
|
...featureEffects.initiative_terms.map((term) => ({ source: term.label, amount: term.value }))
|
|
768
877
|
];
|
|
769
878
|
const senses = {
|
|
770
|
-
darkvision: Math.max((
|
|
879
|
+
darkvision: Math.max((_M = (_L = (_K = resolved.race) == null ? void 0 : _K.vision) == null ? void 0 : _L.darkvision) != null ? _M : 0, featureEffects.senses.darkvision, applied.senses.darkvision),
|
|
771
880
|
blindsight: Math.max(featureEffects.senses.blindsight, applied.senses.blindsight),
|
|
772
881
|
tremorsense: Math.max(featureEffects.senses.tremorsense, applied.senses.tremorsense),
|
|
773
882
|
truesight: Math.max(featureEffects.senses.truesight, applied.senses.truesight)
|
|
@@ -814,39 +923,42 @@ function recalc(resolved, registry) {
|
|
|
814
923
|
const spellLimits = computeSpellLimits(limitInputs);
|
|
815
924
|
const defenses = {
|
|
816
925
|
resistances: suppress(resolved, "resistances", composeDefenseEntries(
|
|
817
|
-
(
|
|
926
|
+
(_O = (_N = resolved.definition.defenses) == null ? void 0 : _N.resistances) != null ? _O : [],
|
|
818
927
|
applied.defenses.resistances,
|
|
819
928
|
featureEffects.resistances
|
|
820
929
|
)),
|
|
821
930
|
immunities: suppress(resolved, "immunities", composeDefenseEntries(
|
|
822
|
-
(
|
|
931
|
+
(_Q = (_P = resolved.definition.defenses) == null ? void 0 : _P.immunities) != null ? _Q : [],
|
|
823
932
|
applied.defenses.immunities,
|
|
824
933
|
featureEffects.immunities
|
|
825
934
|
)),
|
|
826
935
|
vulnerabilities: suppress(resolved, "vulnerabilities", composeDefenseEntries(
|
|
827
|
-
(
|
|
936
|
+
(_S = (_R = resolved.definition.defenses) == null ? void 0 : _R.vulnerabilities) != null ? _S : [],
|
|
828
937
|
applied.defenses.vulnerabilities,
|
|
829
938
|
featureEffects.vulnerabilities
|
|
830
939
|
)),
|
|
831
940
|
condition_immunities: suppress(resolved, "condition_immunities", composeDefenseEntries(
|
|
832
|
-
(
|
|
941
|
+
(_U = (_T = resolved.definition.defenses) == null ? void 0 : _T.condition_immunities) != null ? _U : [],
|
|
833
942
|
applied.defenses.condition_immunities,
|
|
834
943
|
featureEffects.condition_immunities
|
|
835
944
|
))
|
|
836
945
|
};
|
|
837
|
-
const attackRows = [...(
|
|
838
|
-
const riderBindings = {
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
946
|
+
const attackRows = [...(_V = derivedEquipment == null ? void 0 : derivedEquipment.attacks) != null ? _V : [], buildUnarmedRow(mods, proficiencyBonus, resolveUnarmedStrike(resolved))];
|
|
947
|
+
const riderBindings = (owner) => amountBindingsFor(owner, resolved, { proficiencyBonus, mods, spellcastingClasses });
|
|
948
|
+
const ownSpells = (_W = resolved.spells) != null ? _W : [];
|
|
949
|
+
const spellDamageRiders = featureEffects.spellDamageBonuses.flatMap((r) => {
|
|
950
|
+
const reached = /* @__PURE__ */ new Set([...spellsReached(r.targets, ownSpells), ...spellsInScope(r.scope, ownSpells, (id) => pickedDamageTypes(resolved, id))]);
|
|
951
|
+
const spells = [...new Set(ownSpells.map((s) => s.slug))].filter((slug) => reached.has(slug));
|
|
952
|
+
if (!spells.length) return [];
|
|
953
|
+
const { owner, targets: _targets, scope, damage_type, ...rest } = r;
|
|
954
|
+
return [{
|
|
955
|
+
...rest,
|
|
956
|
+
amount: resolveAmountText(r.amount, riderBindings(owner)),
|
|
957
|
+
...damage_type && isCanonicalDamageType(damage_type) ? { damage_type } : {},
|
|
958
|
+
...(scope == null ? void 0 : scope.once) ? { once: true } : {},
|
|
959
|
+
spells
|
|
960
|
+
}];
|
|
961
|
+
});
|
|
850
962
|
return {
|
|
851
963
|
totalLevel,
|
|
852
964
|
proficiencyBonus,
|
|
@@ -898,10 +1010,11 @@ function recalc(resolved, registry) {
|
|
|
898
1010
|
...riders.length ? { damageRiders: riders } : {}
|
|
899
1011
|
};
|
|
900
1012
|
}),
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
1013
|
+
...spellDamageRiders.length ? { spellDamageRiders } : {},
|
|
1014
|
+
equippedSlots: (_X = derivedEquipment == null ? void 0 : derivedEquipment.equippedSlots) != null ? _X : {},
|
|
1015
|
+
carriedWeight: (_Y = derivedEquipment == null ? void 0 : derivedEquipment.carriedWeight) != null ? _Y : 0,
|
|
1016
|
+
attunementUsed: (_Z = derivedEquipment == null ? void 0 : derivedEquipment.attunementUsed) != null ? _Z : 0,
|
|
1017
|
+
attunementLimit: (_$ = derivedEquipment == null ? void 0 : derivedEquipment.attunementLimit) != null ? _$ : (__ = overrides.attunement_limit) != null ? __ : Math.max(3, featureEffects.attunement_set),
|
|
905
1018
|
conditionEffects,
|
|
906
1019
|
rollModifiers: featureEffects.rollModifiers,
|
|
907
1020
|
saveOutcomes: featureEffects.saveOutcomes
|
package/dist/pc/pc.resolver.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { BackgroundEntity } from "@archivist-gg/dnd5e/background/background
|
|
|
4
4
|
import type { FeatEntity } from "@archivist-gg/dnd5e/feat/feat.types";
|
|
5
5
|
import type { Ability } from "@archivist-gg/dnd5e";
|
|
6
6
|
import type { Character, ChoiceValue, ResolvedCharacter, ResolvedClass, ResolvedFeature, ResolvedSpell, FeatVia } from "./pc.types.js";
|
|
7
|
+
import { type PoolMemberSite } from "./pc.member-choices.js";
|
|
7
8
|
export interface ResolveResult {
|
|
8
9
|
character: ResolvedCharacter;
|
|
9
10
|
warnings: string[];
|
|
@@ -113,7 +114,10 @@ export declare function collectItemGrantedSpells(character: Character, ownAbilit
|
|
|
113
114
|
* never lost. Item-source spells carry INSTANCE identity: they key by
|
|
114
115
|
* `slug + "#" + entryIndex`, so two scrolls of one spell stay two rows and a scroll of
|
|
115
116
|
* a class-known spell keeps its OWN item row, never collapsing into / being collapsed
|
|
116
|
-
* by a class/feat copy. The class/feat slug-only merge is unchanged.
|
|
117
|
+
* by a class/feat copy. The class/feat slug-only merge is unchanged. An AT-WILL copy (a pool member's innate grant) keys
|
|
118
|
+
* by `slug + "#atwill"` (review D1, coordinator ruling 2026-09-28): it is a row of its own beside a copy the character
|
|
119
|
+
* already has (the slotted cast can upcast and target others), neither row's flags cross to the other, and two at-will
|
|
120
|
+
* copies of one spell are still one row.
|
|
117
121
|
*/
|
|
118
122
|
export declare function dedupeResolvedSpells(spells: ResolvedSpell[]): ResolvedSpell[];
|
|
119
123
|
/** Selected select-entity values (optional-features) and selected inline
|
|
@@ -126,7 +130,7 @@ export declare function collectChosenGrantedFeatures(character: Character, class
|
|
|
126
130
|
getByTypeAndSlug(type: string, slug: string): {
|
|
127
131
|
data: Record<string, unknown>;
|
|
128
132
|
} | undefined;
|
|
129
|
-
}, race?: RaceEntity | null, background?: BackgroundEntity | null): ResolvedFeature[];
|
|
133
|
+
}, race?: RaceEntity | null, background?: BackgroundEntity | null, memberSites?: PoolMemberSite[]): ResolvedFeature[];
|
|
130
134
|
/**
|
|
131
135
|
* `character.additional_features` → ResolvedFeatures (the DM-grant path).
|
|
132
136
|
*
|
package/dist/pc/pc.resolver.js
CHANGED
|
@@ -10,33 +10,35 @@ import {
|
|
|
10
10
|
dedupeResolvedSpells,
|
|
11
11
|
resolveOriginFeat,
|
|
12
12
|
stripSlug
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-EJD47JHL.js";
|
|
14
14
|
import "../chunk-2LULMQTF.js";
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-DPUJDOKV.js";
|
|
18
|
-
import "../chunk-4BZ47YJ4.js";
|
|
15
|
+
import "../chunk-QA3YCOML.js";
|
|
16
|
+
import "../chunk-64VNLMSG.js";
|
|
19
17
|
import "../chunk-TOM66P2P.js";
|
|
20
18
|
import "../chunk-KU3YLF6D.js";
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
19
|
+
import "../chunk-5JXFJ5AU.js";
|
|
20
|
+
import "../chunk-RD2MID3M.js";
|
|
21
|
+
import "../chunk-LICYHPI3.js";
|
|
22
|
+
import "../chunk-PVCEA4HZ.js";
|
|
23
|
+
import "../chunk-KSTV7J2U.js";
|
|
24
|
+
import "../chunk-DPUJDOKV.js";
|
|
25
|
+
import "../chunk-LBEXLN6I.js";
|
|
26
|
+
import "../chunk-NXUY5XQN.js";
|
|
23
27
|
import "../chunk-W6GC6OKK.js";
|
|
24
|
-
import "../chunk-
|
|
28
|
+
import "../chunk-B3DP42OM.js";
|
|
25
29
|
import "../chunk-IUAAXXNO.js";
|
|
26
30
|
import "../chunk-YHYTW5QA.js";
|
|
27
|
-
import "../chunk-DPM6V7YX.js";
|
|
28
|
-
import "../chunk-PVCEA4HZ.js";
|
|
29
|
-
import "../chunk-LBEXLN6I.js";
|
|
30
31
|
import "../chunk-ZUQW5VBZ.js";
|
|
31
32
|
import "../chunk-IHE6KVC3.js";
|
|
32
33
|
import "../chunk-LHZXYFBU.js";
|
|
34
|
+
import "../chunk-YBLDE5CG.js";
|
|
33
35
|
import "../chunk-LVQLWRCU.js";
|
|
34
36
|
import "../chunk-CM5CWO4K.js";
|
|
35
|
-
import "../chunk-
|
|
36
|
-
import "../chunk-YBLDE5CG.js";
|
|
37
|
+
import "../chunk-4J6DS3EJ.js";
|
|
37
38
|
import "../chunk-EVMUJYUD.js";
|
|
38
39
|
import "../chunk-VTTA2ALZ.js";
|
|
39
|
-
import "../chunk-
|
|
40
|
+
import "../chunk-ZCTUYGNV.js";
|
|
41
|
+
import "../chunk-7Q2VPKCD.js";
|
|
40
42
|
import "../chunk-ZDAEGJH4.js";
|
|
41
43
|
import "../chunk-3TM34RSJ.js";
|
|
42
44
|
import "../chunk-PDJSUH24.js";
|
package/dist/pc/pc.rest.js
CHANGED
|
@@ -5,18 +5,19 @@ import "../chunk-DPUJDOKV.js";
|
|
|
5
5
|
import {
|
|
6
6
|
effectiveItemCharges,
|
|
7
7
|
effectiveItemRecovery
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-NXUY5XQN.js";
|
|
9
9
|
import "../chunk-W6GC6OKK.js";
|
|
10
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-B3DP42OM.js";
|
|
11
11
|
import "../chunk-IUAAXXNO.js";
|
|
12
12
|
import "../chunk-ZUQW5VBZ.js";
|
|
13
13
|
import "../chunk-IHE6KVC3.js";
|
|
14
14
|
import "../chunk-LHZXYFBU.js";
|
|
15
15
|
import "../chunk-LVQLWRCU.js";
|
|
16
16
|
import "../chunk-CM5CWO4K.js";
|
|
17
|
-
import "../chunk-
|
|
17
|
+
import "../chunk-4J6DS3EJ.js";
|
|
18
18
|
import "../chunk-EVMUJYUD.js";
|
|
19
19
|
import "../chunk-VTTA2ALZ.js";
|
|
20
|
+
import "../chunk-ZCTUYGNV.js";
|
|
20
21
|
import "../chunk-3TM34RSJ.js";
|
|
21
22
|
import "../chunk-PDJSUH24.js";
|
|
22
23
|
import "../chunk-WELIKLZF.js";
|