@yipe/dice 0.9.0 → 0.11.0
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/builder/ac.d.ts.map +1 -1
- package/dist/builder/ast.d.ts +32 -2
- package/dist/builder/ast.d.ts.map +1 -1
- package/dist/builder/attack.d.ts +19 -0
- package/dist/builder/attack.d.ts.map +1 -1
- package/dist/builder/dc.d.ts.map +1 -1
- package/dist/builder/example.d.ts +4 -4
- package/dist/builder/example.d.ts.map +1 -1
- package/dist/builder/index.cjs +614 -121
- package/dist/builder/index.cjs.map +1 -1
- package/dist/builder/index.js +614 -122
- package/dist/builder/index.js.map +1 -1
- package/dist/builder/nodes.d.ts +1 -0
- package/dist/builder/nodes.d.ts.map +1 -1
- package/dist/builder/roll.d.ts +13 -1
- package/dist/builder/roll.d.ts.map +1 -1
- package/dist/builder/save.d.ts.map +1 -1
- package/dist/builder/types.d.ts +1 -0
- package/dist/builder/types.d.ts.map +1 -1
- package/dist/common/bounce.d.ts +45 -0
- package/dist/common/bounce.d.ts.map +1 -1
- package/dist/common/types.d.ts +33 -0
- package/dist/common/types.d.ts.map +1 -1
- package/dist/index.cjs +235 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +232 -16
- package/dist/index.js.map +1 -1
- package/dist/parser/dice.d.ts +14 -0
- package/dist/parser/dice.d.ts.map +1 -1
- package/dist/pmf/pmf.d.ts +22 -4
- package/dist/pmf/pmf.d.ts.map +1 -1
- package/dist/turn/plan.d.ts +29 -6
- package/dist/turn/plan.d.ts.map +1 -1
- package/dist/turn/state.d.ts +16 -8
- package/dist/turn/state.d.ts.map +1 -1
- package/dist/turn/turn.d.ts +35 -0
- package/dist/turn/turn.d.ts.map +1 -1
- package/dist/turn/types.d.ts +32 -10
- package/dist/turn/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/CHANGELOG.md +0 -456
package/dist/parser/dice.d.ts
CHANGED
|
@@ -8,6 +8,20 @@ export interface DicePrivateData {
|
|
|
8
8
|
except?: Dice | Record<string, never>;
|
|
9
9
|
/** Keep-highest/lowest selector applied when a die is multiplied out. */
|
|
10
10
|
keep?: (values: number[]) => number;
|
|
11
|
+
/** Set on a freshly parsed flat `dN`/`hdN` atom: its own face count and whether it rerolls a
|
|
12
|
+
* natural 1 once (Halfling Luck). Read by {@link parseExpression} in parser.ts to recover a
|
|
13
|
+
* base check die's natural-max identity after it has been convolved with bonus to-hit dice
|
|
14
|
+
* and modifiers, for a correct plain-`crit` probability. See parser.ts's "Track a flat ...
|
|
15
|
+
* base check die" comment. */
|
|
16
|
+
checkDie?: {
|
|
17
|
+
sides: number;
|
|
18
|
+
rerollOne: boolean;
|
|
19
|
+
};
|
|
20
|
+
/** Set on the result of a tracked AC gate (see parser.ts): the exact "natural max, any bonus
|
|
21
|
+
* roll" sub-distribution, already isolated from the rest of the to-hit total. A plain `crit`
|
|
22
|
+
* clause reads this directly instead of peeling the combined expression's single highest
|
|
23
|
+
* face, which is wrong whenever bonus dice are present. */
|
|
24
|
+
natMaxCritSlice?: Dice;
|
|
11
25
|
}
|
|
12
26
|
/**
|
|
13
27
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dice.d.ts","sourceRoot":"","sources":["../../src/parser/dice.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,kBAAkB,EAElB,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAYjC,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,yEAAyE;IACzE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"dice.d.ts","sourceRoot":"","sources":["../../src/parser/dice.ts"],"names":[],"mappings":"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"}
|
package/dist/pmf/pmf.d.ts
CHANGED
|
@@ -265,15 +265,33 @@ export declare class PMF {
|
|
|
265
265
|
* @param frequency Probability in [0, 1] that the effect occurs.
|
|
266
266
|
*/
|
|
267
267
|
applyHitFrequency(frequency: number): PMF;
|
|
268
|
+
/**
|
|
269
|
+
* Splits this PMF into two complementary PMFs by an arbitrary per-damage-value factor in
|
|
270
|
+
* `[0, 1]` — bin `d`'s mass, `count`, and `attr` split `factor(d)` / `1 - factor(d)` between the
|
|
271
|
+
* two results (via the same proportional scaling {@link applyHitFrequency} uses, `scaleBin`), so
|
|
272
|
+
* `a.add(b)` recovers this PMF exactly and both halves stay chart-attributable. Unlike
|
|
273
|
+
* {@link applyHitFrequency}, mass is NOT redistributed to a miss bin at 0 — each bin stays at its
|
|
274
|
+
* own damage value in whichever half it lands in. `factor` outside `[0, 1]` is clamped.
|
|
275
|
+
*
|
|
276
|
+
* Built for `dice-match` trigger slicing: splitting a hit/crit sub-PMF into "matched" and
|
|
277
|
+
* "did not match" halves by the exact per-damage-value match probability.
|
|
278
|
+
*/
|
|
279
|
+
splitByFactor(factor: (damage: number) => number): [PMF, PMF];
|
|
268
280
|
scaleMass(factor: number): PMF;
|
|
269
281
|
mapDamage(damageTransformFunction: (damageValue: number) => number): PMF;
|
|
270
282
|
scaleDamage(factor: number, rounding?: "floor" | "round" | "ceil"): PMF;
|
|
271
283
|
private getPMFCombineCacheKey;
|
|
272
284
|
/**
|
|
273
|
-
* A
|
|
274
|
-
* cache keys change
|
|
275
|
-
*
|
|
276
|
-
*
|
|
285
|
+
* A content fingerprint of every bin (probability, per-label `count`, per-label `attr`) plus
|
|
286
|
+
* the `normalized` flag, so convolution/power cache keys change whenever the underlying
|
|
287
|
+
* numbers do. Mass/bin-count/face-sum alone are not content-unique: `mapDamage` variants can
|
|
288
|
+
* keep the same identifier, support, mass, and face sum while differing in per-bin
|
|
289
|
+
* probabilities or in the `count`/`attr` channels `convolve()`/`power()` actually propagate --
|
|
290
|
+
* that previously let `power()` return one PMF's cached result for a different PMF. Memoized
|
|
291
|
+
* because a PMF is immutable once constructed -- this avoids re-deriving the key on every
|
|
292
|
+
* convolve()/power() call (including cache hits). Bin order is sorted by damage value (and
|
|
293
|
+
* label keys sorted within each bin) so two equal-content PMFs built via different code paths
|
|
294
|
+
* fingerprint identically regardless of Map insertion order.
|
|
277
295
|
*/
|
|
278
296
|
fingerprint(): string;
|
|
279
297
|
convolve(other: PMF, eps?: number, raw?: boolean): PMF;
|
package/dist/pmf/pmf.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pmf.d.ts","sourceRoot":"","sources":["../../src/pmf/pmf.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pmf.d.ts","sourceRoot":"","sources":["../../src/pmf/pmf.ts"],"names":[],"mappings":"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"}
|
package/dist/turn/plan.d.ts
CHANGED
|
@@ -23,6 +23,34 @@ export interface TurnPlan {
|
|
|
23
23
|
* rather than becoming steps, so they have no step index.
|
|
24
24
|
*/
|
|
25
25
|
perHitGroups: ReadonlyMap<string, number>;
|
|
26
|
+
/**
|
|
27
|
+
* The LAST step index (in final walk order) that reads each group, by group
|
|
28
|
+
* index — `steps.length` for a group `perHitGroups` still needs at the final
|
|
29
|
+
* collapse. Once the walk passes a group's last reader, its specific code
|
|
30
|
+
* stops discriminating any future decision, so `Turn.resolve`'s `merge` stops
|
|
31
|
+
* keying on it past that point — the dominant cost fix for a long `dice-match`
|
|
32
|
+
* chain (a group read by exactly one downstream step, the common shape, would
|
|
33
|
+
* otherwise keep splitting states for every step after that single read).
|
|
34
|
+
*/
|
|
35
|
+
groupLastReadStep: readonly number[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Outcome-labelled sub-mass PMFs for one source, masses summing to 1.
|
|
39
|
+
*
|
|
40
|
+
* `hitMatch`/`hitNoMatch`/`critMatch`/`critNoMatch` are non-null only when this
|
|
41
|
+
* source is referenced by a `dice-match` trigger's `of` — computing the exact
|
|
42
|
+
* per-damage match split costs a DP walk, so it is opt-in per source rather than
|
|
43
|
+
* always paid. When present, `hitMatch.add(hitNoMatch) === hit` (and similarly for
|
|
44
|
+
* crit) up to floating-point mass.
|
|
45
|
+
*/
|
|
46
|
+
export interface SourceSlices {
|
|
47
|
+
hit: PMF;
|
|
48
|
+
crit: PMF;
|
|
49
|
+
miss: PMF;
|
|
50
|
+
hitMatch: PMF | null;
|
|
51
|
+
hitNoMatch: PMF | null;
|
|
52
|
+
critMatch: PMF | null;
|
|
53
|
+
critNoMatch: PMF | null;
|
|
26
54
|
}
|
|
27
55
|
/**
|
|
28
56
|
* One step of the turn. `slices` non-null ⇒ the step rolls its own attack and
|
|
@@ -33,12 +61,7 @@ export interface Step {
|
|
|
33
61
|
id: string;
|
|
34
62
|
/** Declared attacks always fire; riders consult their trigger. */
|
|
35
63
|
trigger: Trigger | null;
|
|
36
|
-
|
|
37
|
-
slices: {
|
|
38
|
-
hit: PMF;
|
|
39
|
-
crit: PMF;
|
|
40
|
-
miss: PMF;
|
|
41
|
-
} | null;
|
|
64
|
+
slices: SourceSlices | null;
|
|
42
65
|
/** Pure-damage payloads, mass 1 each. */
|
|
43
66
|
damage: {
|
|
44
67
|
hit: PMF;
|
package/dist/turn/plan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/turn/plan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/turn/plan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAKV,OAAO,EACP,QAAQ,EAET,MAAM,SAAS,CAAC;AAGjB;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,UAAU,EAAE,SAAS,GAAG,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,oEAAoE;IACpE,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;;OAIG;IACH,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C;;;;;;;;OAQG;IACH,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,yCAAyC;IACzC,MAAM,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI,CAAC;IACvC,kDAAkD;IAClD,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;CACjB;AAuID,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAE,MAAY,GAAG,QAAQ,CA8VrE"}
|
package/dist/turn/state.d.ts
CHANGED
|
@@ -3,21 +3,29 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A "group" is one distinct set of source ids referenced by a trigger. Everything
|
|
5
5
|
* any trigger needs to know about a group is which outcome landed *first*, whether
|
|
6
|
-
* anything crit,
|
|
7
|
-
*
|
|
6
|
+
* anything crit, whether anything missed, and whether anything's dice matched — so
|
|
7
|
+
* the whole turn state stays small (up to 24 codes per group, ~14 reachable) per
|
|
8
|
+
* group.
|
|
8
9
|
*
|
|
9
|
-
* Layout: `first << 2 | anyCrit << 1 | anyMiss`, where `first` is
|
|
10
|
-
* {@link FIRST_NONE} / {@link FIRST_HIT} / {@link FIRST_CRIT}. Readers decode
|
|
11
|
-
* `code >> 2`, `code & CRIT_BIT`, `code & MISS_BIT`.
|
|
10
|
+
* Layout: `first << 2 | anyCrit << 1 | anyMiss | anyMatch << 4`, where `first` is
|
|
11
|
+
* one of {@link FIRST_NONE} / {@link FIRST_HIT} / {@link FIRST_CRIT}. Readers decode
|
|
12
|
+
* with `code >> 2 & 0b11`, `code & CRIT_BIT`, `code & MISS_BIT`, `code & MATCH_BIT`.
|
|
12
13
|
*/
|
|
13
14
|
export declare const FIRST_NONE = 0;
|
|
14
15
|
export declare const FIRST_HIT = 1;
|
|
15
16
|
export declare const FIRST_CRIT = 2;
|
|
16
17
|
export declare const CRIT_BIT = 2;
|
|
17
18
|
export declare const MISS_BIT = 1;
|
|
18
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Bit 4 — `FIRST_CRIT` (2) shifted left by 2 is `0b1000` (bit 3), so bits 0-3 are
|
|
21
|
+
* occupied by first/crit/miss. Max reachable code is `8|2|1|16 = 27`, still < 256,
|
|
22
|
+
* so `turn.ts`'s `String.fromCharCode` per-group state key is unaffected.
|
|
23
|
+
*/
|
|
24
|
+
export declare const MATCH_BIT = 16;
|
|
25
|
+
/** A group that has seen nothing yet: no first landing, no crit, no miss, no match. */
|
|
19
26
|
export declare const START_CODE: number;
|
|
20
27
|
export type StepOutcome = "hit" | "crit" | "miss";
|
|
21
|
-
/** Fold one source outcome into a group's state.
|
|
22
|
-
|
|
28
|
+
/** Fold one source outcome into a group's state. `matched` only has an effect on
|
|
29
|
+
* `"hit"`/`"crit"` — a miss rolls no dice, so it can never match. */
|
|
30
|
+
export declare function advance(code: number, outcome: StepOutcome, matched?: boolean): number;
|
|
23
31
|
//# sourceMappingURL=state.d.ts.map
|
package/dist/turn/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/turn/state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/turn/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B;;;;GAIG;AACH,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,uFAAuF;AACvF,eAAO,MAAM,UAAU,QAAkB,CAAC;AAE1C,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD;qEACqE;AACrE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,UAAQ,GAAG,MAAM,CAUnF"}
|
package/dist/turn/turn.d.ts
CHANGED
|
@@ -94,6 +94,18 @@ export declare class Turn {
|
|
|
94
94
|
* triggers against the right one.
|
|
95
95
|
*/
|
|
96
96
|
otherwise(damage: RiderDamage, options?: Omit<RiderOptions, "of">): Turn;
|
|
97
|
+
/**
|
|
98
|
+
* Fires once if any of `of`'s named sources' own damage dice matched (showed a
|
|
99
|
+
* duplicate value) on hit or crit — Chromatic Orb's bounce. Unlike the other
|
|
100
|
+
* `onX` triggers, `of` is required: "the dice matched" has no coherent meaning
|
|
101
|
+
* defaulted across every declared attack. Each named source must expose a
|
|
102
|
+
* dice-match descriptor (an `AttackBuilder`-shaped source does); naming one
|
|
103
|
+
* that doesn't is a `TurnSpecError("no-dice-descriptor", ...)`.
|
|
104
|
+
*
|
|
105
|
+
* Most callers want {@link bounce} instead of calling this directly — it
|
|
106
|
+
* builds the whole depth-capped chain of attack-shaped riders.
|
|
107
|
+
*/
|
|
108
|
+
onDiceMatch(of: readonly string[], damage: RiderDamage, options?: Omit<RiderOptions, "of">): Turn;
|
|
97
109
|
/**
|
|
98
110
|
* The exact joint distribution: mass 1, outcome-labelled. Resolved once and
|
|
99
111
|
* cached.
|
|
@@ -146,4 +158,27 @@ export declare class Turn {
|
|
|
146
158
|
* ```
|
|
147
159
|
*/
|
|
148
160
|
export declare function turn(attacks?: Attack | readonly Attack[], eps?: number): Turn;
|
|
161
|
+
/**
|
|
162
|
+
* `bounce({ source, max })` — sugar for a depth-capped chain of attack-shaped
|
|
163
|
+
* `dice-match` riders, so no caller hand-writes the chain by hand: beam 1 is
|
|
164
|
+
* `source` itself as the turn's only declared attack; beam `i + 1` (for
|
|
165
|
+
* `i = 1..max`) is `source` again, as a rider fired only when beam `i`'s own
|
|
166
|
+
* dice matched. Every beam shares `source`'s exact profile (same to-hit, same
|
|
167
|
+
* damage dice) — the natural reading of "the orb leaps to a new target, same
|
|
168
|
+
* damage profile, and repeats."
|
|
169
|
+
*
|
|
170
|
+
* `max` is required and MUST be a non-negative integer: match probability alone
|
|
171
|
+
* does not terminate the recursion (Chromatic Orb bounces are not literally
|
|
172
|
+
* unbounded — DMs cap them by fiat or table size — and something has to).
|
|
173
|
+
*
|
|
174
|
+
* Each beam after the first is its own {@link MAX_TRIGGER_GROUPS}-counted trigger
|
|
175
|
+
* group (`of: [<previous beam's id>]` is a distinct source set every time), so
|
|
176
|
+
* `max` is effectively capped at the turn's remaining group budget — a chain
|
|
177
|
+
* asking for more throws `TurnSpecError("too-many-groups", ...)` the same way
|
|
178
|
+
* any other over-budget turn would, not a silent truncation.
|
|
179
|
+
*/
|
|
180
|
+
export declare function bounce({ source, max }: {
|
|
181
|
+
source: Source;
|
|
182
|
+
max: number;
|
|
183
|
+
}): Turn;
|
|
149
184
|
//# sourceMappingURL=turn.d.ts.map
|
package/dist/turn/turn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn.d.ts","sourceRoot":"","sources":["../../src/turn/turn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"turn.d.ts","sourceRoot":"","sources":["../../src/turn/turn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAazC,OAAO,KAAK,EACV,MAAM,EACN,KAAK,EACL,WAAW,EACX,YAAY,EACZ,MAAM,EACN,QAAQ,EACT,MAAM,SAAS,CAAC;AA8EjB;;;;;;;;;;;;;;GAcG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAsD;IAEvE,OAAO,eAeN;IAED;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAE,MAAY,GAAG,IAAI,CAEnD;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAGxC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ3C;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAExB;IAED;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,YAAiB,GAAG,IAAI,CAEhE;IAED;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,YAAiB,GAAG,IAAI,CAE/D;IAED;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,YAAiB,GAAG,IAAI,CAE/D;IAED;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,YAAiB,GAAG,IAAI,CAEhE;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CACP,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAM,GACrC,IAAI,CAwBN;IAED;;;;;;;;;;OAUG;IACH,WAAW,CACT,EAAE,EAAE,SAAS,MAAM,EAAE,EACrB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAM,GACrC,IAAI,CAEN;IAED;;;;;;;OAOG;IACH,IAAI,GAAG,IAAI,GAAG,CAEb;IAED,gCAAgC;IAChC,IAAI,IAAI,MAAM,CAEb;IAED;;;;;;;;OAQG;IACH,OAAO,IAAI,SAAS,CAEnB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,SAAS,MAAM,EAAE,CAEjC;IAED;;;OAGG;IACH,IAAI,QAAQ,IAAI,SAAS,MAAM,EAAE,CAEhC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAYlC;IAED,OAAO,CAAC,OAAO;CA0IhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAClB,OAAO,GAAE,MAAM,GAAG,SAAS,MAAM,EAAO,EACxC,GAAG,GAAE,MAAY,GAChB,IAAI,CAKN;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAa7E"}
|
package/dist/turn/types.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { DiceMatchInfo, HasDiceMatchInfo } from "../common/types.js";
|
|
1
2
|
import type { PMF } from "../pmf/pmf.js";
|
|
3
|
+
export type { DiceMatchInfo, HasDiceMatchInfo };
|
|
2
4
|
/**
|
|
3
5
|
* Triggers that read the outcomes of source attacks, as opposed to `not-fired`,
|
|
4
6
|
* which reads another rider. Includes `any-miss`, so this is not "hit triggers".
|
|
@@ -13,12 +15,19 @@ export type AttackTriggerOn = "first-hit" | "any-crit" | "any-miss" | "every-hit
|
|
|
13
15
|
* - `any-crit` — at least one source crit. Always fires in crit mode (Divine Smite).
|
|
14
16
|
* - `any-miss` — at least one source missed. The reroll gate (Unerring Accuracy, Lucky).
|
|
15
17
|
* - `every-hit` — once per landing source, in that hit's mode (Hunter's Mark, Hex, Rage).
|
|
18
|
+
* - `dice-match` — at least one named source's own damage dice showed a duplicate
|
|
19
|
+
* value on hit or crit (Chromatic Orb's bounce). `of` is REQUIRED — unlike the
|
|
20
|
+
* other attack triggers, "every declared attack" has no coherent single meaning
|
|
21
|
+
* for "the dice matched", so there is no default. Each named source must expose
|
|
22
|
+
* a {@link HasDiceMatchInfo} descriptor (an `AttackBuilder`-shaped source does);
|
|
23
|
+
* naming one that doesn't (a bare `PMF`, a `keep`/`bestOf` pool, a string-parsed
|
|
24
|
+
* expression) is a `TurnSpecError`, not a silent "never matches".
|
|
16
25
|
* - `not-fired` — the named rider did **not** fire ("flurry of blows if I didn't smite").
|
|
17
26
|
*
|
|
18
|
-
* For the attack triggers `of` is a list of attack ids and
|
|
19
|
-
* declared attack, which is what most riders mean. For
|
|
20
|
-
* single required id of the rider being negated — negating
|
|
21
|
-
* no unambiguous meaning, so the type does not offer it.
|
|
27
|
+
* For the attack triggers besides `dice-match`, `of` is a list of attack ids and
|
|
28
|
+
* defaults to every declared attack, which is what most riders mean. For
|
|
29
|
+
* `not-fired` it is the single required id of the rider being negated — negating
|
|
30
|
+
* a set of riders has no unambiguous meaning, so the type does not offer it.
|
|
22
31
|
*/
|
|
23
32
|
export type Trigger = {
|
|
24
33
|
on: AttackTriggerOn;
|
|
@@ -26,6 +35,9 @@ export type Trigger = {
|
|
|
26
35
|
} | {
|
|
27
36
|
on: "not-fired";
|
|
28
37
|
of: string;
|
|
38
|
+
} | {
|
|
39
|
+
on: "dice-match";
|
|
40
|
+
of: readonly string[];
|
|
29
41
|
};
|
|
30
42
|
/** Anything that can produce a PMF: `RollBuilder`, `AttackBuilder`, `SaveBuilder`, or a `PMF`. */
|
|
31
43
|
export interface ToPMF {
|
|
@@ -75,7 +87,7 @@ export interface TurnSpec {
|
|
|
75
87
|
attacks: readonly Attack[];
|
|
76
88
|
riders?: readonly Rider[];
|
|
77
89
|
}
|
|
78
|
-
export type TurnSpecErrorCode = "unknown-id" | "duplicate-id" | "self-reference" | "cycle" | "not-an-attack" | "unused-crit-damage" | "too-many-groups";
|
|
90
|
+
export type TurnSpecErrorCode = "unknown-id" | "duplicate-id" | "self-reference" | "cycle" | "not-an-attack" | "unused-crit-damage" | "too-many-groups" | "no-dice-descriptor";
|
|
79
91
|
/**
|
|
80
92
|
* A malformed turn. `code` is a stable contract: consumer UIs map it to their own
|
|
81
93
|
* states (greyed dropdown option, "trigger missing" row error, …) instead of
|
|
@@ -90,10 +102,20 @@ export declare class TurnSpecError extends Error {
|
|
|
90
102
|
* How many distinct `of` sets a single turn may track.
|
|
91
103
|
*
|
|
92
104
|
* Each group multiplies the state space, so the cap is a cost ceiling rather
|
|
93
|
-
* than a modelling limit. Measured on four attacks with two riders per group
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
105
|
+
* than a modelling limit. Measured on four attacks with two riders per group
|
|
106
|
+
* (every group fed by multiple independent sources — the expensive, dense
|
|
107
|
+
* case): 2.1ms for one group, 3.1 for two, 5.9 for three, 23.5 for four —
|
|
108
|
+
* roughly 4x per group. A `bounce()` chain is the opposite case — each group
|
|
109
|
+
* is fed by exactly ONE step, and the chain is strictly sequential (group N+1
|
|
110
|
+
* only ever reads a nonzero state once group N has already resolved), so its
|
|
111
|
+
* reachable state space grows close to linearly rather than combinatorially;
|
|
112
|
+
* see `dice-match.test.ts`'s latency measurement.
|
|
113
|
+
*
|
|
114
|
+
* 9, not 4: Chromatic Orb's `effectCountScaling: 'spell_level_plus_one'` needs
|
|
115
|
+
* up to `1 + 9 = 10` beams at a 9th-level slot — 9 additional bounces beyond
|
|
116
|
+
* the first. A non-bounce turn tracking 9 independent dense groups would be
|
|
117
|
+
* the pathological case the latency table above warns about; real builds use
|
|
118
|
+
* one or two (the goliath rogue/monk/paladin uses one).
|
|
97
119
|
*/
|
|
98
|
-
export declare const MAX_TRIGGER_GROUPS =
|
|
120
|
+
export declare const MAX_TRIGGER_GROUPS = 9;
|
|
99
121
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/turn/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/turn/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,UAAU,GACV,UAAU,GACV,WAAW,CAAC;AAEhB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/turn/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAEhD;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,UAAU,GACV,UAAU,GACV,WAAW,CAAC;AAEhB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,OAAO,GACf;IAAE,EAAE,EAAE,eAAe,CAAC;IAAC,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC/C;IAAE,EAAE,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhD,kGAAkG;AAClG,MAAM,WAAW,KAAK;IACpB,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;AAErD,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,mFAAmF;IACnF,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,cAAc,GACd,gBAAgB,GAChB,OAAO,GACP,eAAe,GACf,oBAAoB,GACpB,iBAAiB,GACjB,oBAAoB,CAAC;AAEzB;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAEpC,QAAQ,CAAC,IAAI,EAAE,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAFrB,YACW,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAIhB;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yipe/dice",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "A high-performance dice probability engine for D&D 5e DPR calculations. Powers dprcalc.com.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dnd",
|
|
@@ -91,4 +91,4 @@
|
|
|
91
91
|
"typescript": "^7.0.2",
|
|
92
92
|
"vitest": "^4.1.10"
|
|
93
93
|
}
|
|
94
|
-
}
|
|
94
|
+
}
|