@yipe/dice 0.10.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/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/index.cjs +393 -37
- package/dist/builder/index.cjs.map +1 -1
- package/dist/builder/index.js +393 -38
- 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 +8 -0
- package/dist/builder/roll.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 +171 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +168 -1
- package/dist/index.js.map +1 -1
- package/dist/pmf/pmf.d.ts +12 -0
- 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 +1 -1
package/dist/builder/nodes.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/builder/nodes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,YAAY,GACZ,OAAO,GACP,OAAO,GACP,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/builder/nodes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,YAAY,GACZ,OAAO,GACP,OAAO,GACP,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;IAGtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;KAAE,EAAE,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,WAAW,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAC1D,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC"}
|
package/dist/builder/roll.d.ts
CHANGED
|
@@ -37,6 +37,13 @@ export declare class RollBuilder {
|
|
|
37
37
|
reroll(value: number): RollBuilder;
|
|
38
38
|
/** Set finite explode count for max-face explosions (Infinity allowed). */
|
|
39
39
|
explode(count?: number | undefined): RollBuilder;
|
|
40
|
+
/**
|
|
41
|
+
* Set a pool-wide exploding-dice budget: at most `budget` extra dice may be added across the
|
|
42
|
+
* WHOLE pool (shared), as opposed to {@link explode}'s per-die cap (`n` dice each individually
|
|
43
|
+
* allowed up to `explode(k)` extra dice). `budget` must be a finite non-negative integer —
|
|
44
|
+
* unlike `explode()`, `Infinity` is not accepted (it would make the pool-wide DP non-terminating).
|
|
45
|
+
*/
|
|
46
|
+
explodePool(budget: number): RollBuilder;
|
|
40
47
|
/** Apply per-die minimum value (floors each die roll at `val`, e.g. `minimum(3)` treats a 1 or
|
|
41
48
|
* 2 as a 3 -- the 2024 Great Weapon Fighting style). */
|
|
42
49
|
minimum(val: number | undefined): RollBuilder;
|
|
@@ -203,6 +210,7 @@ export declare class PooledRollBuilder extends RollBuilder {
|
|
|
203
210
|
d(_sides: number | undefined): RollBuilder;
|
|
204
211
|
reroll(_value: number): RollBuilder;
|
|
205
212
|
explode(_count?: number | undefined): RollBuilder;
|
|
213
|
+
explodePool(_budget: number): RollBuilder;
|
|
206
214
|
minimum(_val: number | undefined): RollBuilder;
|
|
207
215
|
bestOf(_count: number | undefined): RollBuilder;
|
|
208
216
|
keepHighest(_total: number, _count: number): RollBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roll.d.ts","sourceRoot":"","sources":["../../src/builder/roll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAuBpD,2FAA2F;AAC3F,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,eAAO,MAAM,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"roll.d.ts","sourceRoot":"","sources":["../../src/builder/roll.ts"],"names":[],"mappings":"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"}
|
package/dist/builder/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/builder/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAChE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAClE,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACvC,IAAI,IAAI,WAAW,CAAC;IACpB,EAAE,IAAI,WAAW,CAAC;IAClB,EAAE,IAAI,WAAW,CAAC;IAClB,EAAE,IAAI,WAAW,CAAC;IAClB,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,IAAI,WAAW,CAAC;IACnB,IAAI,IAAI,WAAW,CAAC;IACpB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAG5C,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/builder/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAChE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAClE,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACvC,IAAI,IAAI,WAAW,CAAC;IACpB,EAAE,IAAI,WAAW,CAAC;IAClB,EAAE,IAAI,WAAW,CAAC;IAClB,EAAE,IAAI,WAAW,CAAC;IAClB,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,IAAI,WAAW,CAAC;IACnB,IAAI,IAAI,WAAW,CAAC;IACpB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAG5C,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAIhB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,SAAS,CAAC;IACnE,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG;IAC1C,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;IACxC,QAAQ,EAAE,GAAG,CAAC;IACd,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,YAAY,IAAI,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACnB"}
|
package/dist/common/bounce.d.ts
CHANGED
|
@@ -20,6 +20,16 @@ export interface BounceOddsOptions {
|
|
|
20
20
|
/** Number of dice that may be rerolled once — e.g. CHA modifier for Empowered Spell. */
|
|
21
21
|
rerollDamageDice?: number;
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Exact per-face probability marginal for a single die, honoring threshold `reroll(k)` and
|
|
25
|
+
* `minimum(v)` — the SAME two transforms `resolveSingleDie` (`builder/ast.ts`) applies, in the
|
|
26
|
+
* same order (reroll, then minimum-floor), so a caller building `weights` for
|
|
27
|
+
* `jointSumAndMatch`/`explodingPoolMatchProbability` gets face weights consistent with the pool's
|
|
28
|
+
* actual resolved PMF. Returns a 1-indexed array (`weights[v - 1] = P(shows v)`, `1 <= v <= faces`);
|
|
29
|
+
* a face collapsed onto by `minimum` carries its collapsed neighbors' mass, and a face below
|
|
30
|
+
* `minimum` carries zero.
|
|
31
|
+
*/
|
|
32
|
+
export declare function faceWeights(faces: number, minimum?: number, reroll?: number): number[];
|
|
23
33
|
/**
|
|
24
34
|
* P(at least two of `diceCount` dice with `dieFaces` faces match), honoring
|
|
25
35
|
* Elemental Adept and Empowered Spell. Returns a probability in [0, 1].
|
|
@@ -29,4 +39,39 @@ export interface BounceOddsOptions {
|
|
|
29
39
|
* @param options Optional metamagic / feat modifiers.
|
|
30
40
|
*/
|
|
31
41
|
export declare function calculateBounceOdds(diceCount: number, dieFaces: number, options?: BounceOddsOptions): number;
|
|
42
|
+
/**
|
|
43
|
+
* Exact joint P(sum ∧ match), K = 2 hardcoded (per design: every shipped 5e bounce mechanic is
|
|
44
|
+
* "two or more" — see `CHROMATIC_ORB.md`). `K > 2` (a face with multiplicity ≥ K) is a harder
|
|
45
|
+
* combinatorial problem with no consumer; a `match` parameter whose only legal value is 2 would
|
|
46
|
+
* advertise a generality this DP does not have, so it is not offered.
|
|
47
|
+
*
|
|
48
|
+
* `weights` is the resolved single-die marginal's per-face probabilities, 1-indexed
|
|
49
|
+
* (`weights[v - 1] = P(one die shows v)`) — NOT assumed uniform, so `minimum`/threshold `reroll`
|
|
50
|
+
* (which collapse or reweight faces) compose correctly. Dice are i.i.d. and homogeneous (same
|
|
51
|
+
* `weights` for all of them): a mixed-face-size pool (e.g. 2d6 + 1d4) is a genuinely different,
|
|
52
|
+
* harder problem (dice are no longer exchangeable) with no consumer here.
|
|
53
|
+
*/
|
|
54
|
+
/** Exact P(sum = s) for `dice` i.i.d. dice sharing `weights`, as a sum -> mass map. */
|
|
55
|
+
export declare function diceSumDistribution(dice: number, weights: readonly number[]): Map<number, number>;
|
|
56
|
+
/**
|
|
57
|
+
* Exact joint P(sum = s ∧ match) for `dice` i.i.d. dice sharing `weights`
|
|
58
|
+
* (`P(sum ∧ match) = P(sum) − P(sum ∧ all distinct)`). Returns a sum -> mass map; sums with zero
|
|
59
|
+
* match mass are omitted. `dice <= 1` returns an empty map (no match possible).
|
|
60
|
+
*/
|
|
61
|
+
export declare function jointSumAndMatch(dice: number, weights: readonly number[]): Map<number, number>;
|
|
62
|
+
/**
|
|
63
|
+
* P(match) for a pool sharing ONE pool-wide exploding-dice budget (see
|
|
64
|
+
* `RollBuilder.explodePool()`). The plain `jointSumAndMatch`/`calculateBounceOdds` formulas assume
|
|
65
|
+
* `dice` i.i.d. dice — false for an exploded pool, since conditioning on a realized size already
|
|
66
|
+
* reveals some die rolled max. Exploiting that max is the only exploding face: condition on `m`
|
|
67
|
+
* (dice showing max) and `k` (dice showing anything else) —
|
|
68
|
+
*
|
|
69
|
+
* `m ≥ 2` → match is certain (two dice already share the max face).
|
|
70
|
+
* `m ≤ 1` → match iff the `k` non-max dice collide among themselves, uniform over `faces - 1`
|
|
71
|
+
* non-max faces (they cannot collide with the max face, so the two parts separate).
|
|
72
|
+
*
|
|
73
|
+
* `pMax` and `faces` describe the single (non-exploding-budget) die's resolved marginal —
|
|
74
|
+
* `pMax = weights[faces - 1]`.
|
|
75
|
+
*/
|
|
76
|
+
export declare function explodingPoolMatchProbability(pMax: number, faces: number, count: number, budget: number): number;
|
|
32
77
|
//# sourceMappingURL=bounce.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bounce.d.ts","sourceRoot":"","sources":["../../src/common/bounce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuDD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAgCR"}
|
|
1
|
+
{"version":3,"file":"bounce.d.ts","sourceRoot":"","sources":["../../src/common/bounce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAI,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAwB5E;AAuDD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAgCR;AAED;;;;;;;;;;;GAWG;AAEH,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAejG;AA0CD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAY9F;AAoED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAoBR"}
|
package/dist/common/types.d.ts
CHANGED
|
@@ -11,6 +11,39 @@ export interface Bin {
|
|
|
11
11
|
/** Optional per-outcome damage attribution at this damage. */
|
|
12
12
|
attr?: OutcomeLabelMap;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* One homogeneous die-type's resolved shape within a damage pool — count of dice, faces per die,
|
|
16
|
+
* and the per-die `minimum`/threshold-`reroll` that shape its resolved marginal (see
|
|
17
|
+
* `RollBuilder.getSubRollConfigs()`). The raw material for `dice-match` trigger slicing.
|
|
18
|
+
*/
|
|
19
|
+
export interface DicePoolDescriptor {
|
|
20
|
+
readonly count: number;
|
|
21
|
+
readonly faces: number;
|
|
22
|
+
readonly minimum: number;
|
|
23
|
+
readonly reroll: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Exact P(match | this branch's own final damage value = d) for a resolved hit/crit branch,
|
|
27
|
+
* keyed by the SAME damage values the branch's PMF uses (post flat `modifier`, post crit
|
|
28
|
+
* doubling) — so a consumer splits a PMF bin-by-bin with no sum/modifier bookkeeping of its own.
|
|
29
|
+
*/
|
|
30
|
+
export interface DiceMatchInfo {
|
|
31
|
+
readonly matchProbabilityByDamage: ReadonlyMap<number, number>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Optional capability of a `dice-match`-eligible damage source (implemented by `AttackBuilder`):
|
|
35
|
+
* exposes the exact per-branch match-probability breakdown needed to slice its hit/crit PMF into
|
|
36
|
+
* matched / did-not-match halves. Absence (a bare `PMF`, a plain non-attack `RollBuilder`, or a
|
|
37
|
+
* `null` branch — `noCrit()`, a parsed/pooled/`keep` source) is a defined "no match slice
|
|
38
|
+
* available" state, not a crash: naming such a source in a `dice-match` trigger is a
|
|
39
|
+
* `TurnSpecError`, not a silent zero.
|
|
40
|
+
*/
|
|
41
|
+
export interface HasDiceMatchInfo {
|
|
42
|
+
diceMatchInfo(eps?: number): {
|
|
43
|
+
hit: DiceMatchInfo | null;
|
|
44
|
+
crit: DiceMatchInfo | null;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
14
47
|
export interface CritConfig {
|
|
15
48
|
critThreshold: number;
|
|
16
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,kEAAkE;AAClE,eAAO,MAAM,GAAG,QAAQ,CAAC;AAEzB,qDAAqD;AACrD,MAAM,WAAW,GAAG;IAClB,mDAAmD;IACnD,CAAC,EAAE,MAAM,CAAC;IACV,iEAAiE;IACjE,KAAK,EAAE,eAAe,CAAC;IACvB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACvB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,uDAAuD;AACvD,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxD,+DAA+D;AAC/D,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,KAAK,GACL,UAAU,GACV,YAAY,GACZ,UAAU,GACV,UAAU,GACV,IAAI,CAAC;AAET,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D,4FAA4F;AAC5F,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAEhF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAiB,GAAG,MAAM,CAatF;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAwB,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAQ1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,EAQ9C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,KAAK,GAAE,SAAS,MAAM,EAAsB,GAC3C,CAAC,EAAE,CAUL;AAED,eAAO,MAAM,QAAQ,EAAE,WAAW,EAAoB,CAAC;AACvD,eAAO,MAAM,UAAU,EAAE,WAAW,EAAa,CAAC;AAClD,eAAO,MAAM,SAAS,EAAE,WAAW,EAAY,CAAC;AAChD,eAAO,MAAM,UAAU,EAAE,WAAW,EAA+B,CAAC;AACpE,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAAmB,CAAC;AAC9D,eAAO,MAAM,cAAc,EAAE,WAAW,EAAiB,CAAC;AAC1D,eAAO,MAAM,cAAc,EAAE,WAAW,EAAiB,CAAC;AAC1D,eAAO,MAAM,mBAAmB,EAAE,WAAW,EAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,kEAAkE;AAClE,eAAO,MAAM,GAAG,QAAQ,CAAC;AAEzB,qDAAqD;AACrD,MAAM,WAAW,GAAG;IAClB,mDAAmD;IACnD,CAAC,EAAE,MAAM,CAAC;IACV,iEAAiE;IACjE,KAAK,EAAE,eAAe,CAAC;IACvB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChE;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC;CACxF;AAED,MAAM,WAAW,UAAU;IACvB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,uDAAuD;AACvD,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxD,+DAA+D;AAC/D,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,KAAK,GACL,UAAU,GACV,YAAY,GACZ,UAAU,GACV,UAAU,GACV,IAAI,CAAC;AAET,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D,4FAA4F;AAC5F,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAEhF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAiB,GAAG,MAAM,CAatF;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAwB,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAQ1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,EAQ9C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,KAAK,GAAE,SAAS,MAAM,EAAsB,GAC3C,CAAC,EAAE,CAUL;AAED,eAAO,MAAM,QAAQ,EAAE,WAAW,EAAoB,CAAC;AACvD,eAAO,MAAM,UAAU,EAAE,WAAW,EAAa,CAAC;AAClD,eAAO,MAAM,SAAS,EAAE,WAAW,EAAY,CAAC;AAChD,eAAO,MAAM,UAAU,EAAE,WAAW,EAA+B,CAAC;AACpE,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAAmB,CAAC;AAC9D,eAAO,MAAM,cAAc,EAAE,WAAW,EAAiB,CAAC;AAC1D,eAAO,MAAM,cAAc,EAAE,WAAW,EAAiB,CAAC;AAC1D,eAAO,MAAM,mBAAmB,EAAE,WAAW,EAAW,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/common/bounce.ts
|
|
4
|
+
function faceWeights(faces, minimum = 0, reroll = 0) {
|
|
5
|
+
const f = Math.max(0, Math.floor(faces));
|
|
6
|
+
if (f <= 0) return [];
|
|
7
|
+
let weights = new Array(f).fill(1 / f);
|
|
8
|
+
const r = Math.max(0, Math.min(Math.floor(reroll), f));
|
|
9
|
+
if (r > 0) {
|
|
10
|
+
const rerollMass = r / f;
|
|
11
|
+
const uniformReroll = rerollMass / f;
|
|
12
|
+
weights = weights.map((_, i) => (i < r ? 0 : 1 / f) + uniformReroll);
|
|
13
|
+
}
|
|
14
|
+
const minV = Math.max(0, Math.floor(minimum));
|
|
15
|
+
if (minV > 1) {
|
|
16
|
+
const collapsed = new Array(f).fill(0);
|
|
17
|
+
for (let v = 1; v <= f; v++) {
|
|
18
|
+
const target = Math.min(f, Math.max(v, minV));
|
|
19
|
+
collapsed[target - 1] += weights[v - 1];
|
|
20
|
+
}
|
|
21
|
+
weights = collapsed;
|
|
22
|
+
}
|
|
23
|
+
return weights;
|
|
24
|
+
}
|
|
4
25
|
function binom(n, k) {
|
|
5
26
|
if (k < 0 || k > n) return 0;
|
|
6
27
|
let result = 1;
|
|
@@ -49,6 +70,128 @@ function calculateBounceOdds(diceCount, dieFaces, options) {
|
|
|
49
70
|
);
|
|
50
71
|
return Math.min(1, pMatchFirst + pNoMatchFirst * pMatchAfterReroll);
|
|
51
72
|
}
|
|
73
|
+
function diceSumDistribution(dice, weights) {
|
|
74
|
+
let dist = /* @__PURE__ */ new Map([[0, 1]]);
|
|
75
|
+
for (let die = 0; die < dice; die++) {
|
|
76
|
+
const next = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const [sum, mass] of dist) {
|
|
78
|
+
for (let face = 1; face <= weights.length; face++) {
|
|
79
|
+
const w = weights[face - 1] ?? 0;
|
|
80
|
+
if (w <= 0) continue;
|
|
81
|
+
const s = sum + face;
|
|
82
|
+
next.set(s, (next.get(s) ?? 0) + mass * w);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
dist = next;
|
|
86
|
+
}
|
|
87
|
+
return dist;
|
|
88
|
+
}
|
|
89
|
+
function sumAllDistinctDistribution(dice, weights) {
|
|
90
|
+
const faceCount = weights.length;
|
|
91
|
+
let dp = /* @__PURE__ */ new Map([[0, /* @__PURE__ */ new Map([[0, 1]])]]);
|
|
92
|
+
for (let face = 1; face <= faceCount; face++) {
|
|
93
|
+
const w = weights[face - 1] ?? 0;
|
|
94
|
+
const next = /* @__PURE__ */ new Map();
|
|
95
|
+
for (const [count, sumMap] of dp) next.set(count, new Map(sumMap));
|
|
96
|
+
if (w > 0) {
|
|
97
|
+
for (const [count, sumMap] of dp) {
|
|
98
|
+
const nextCount = count + 1;
|
|
99
|
+
if (nextCount > dice) continue;
|
|
100
|
+
const target = next.get(nextCount) ?? /* @__PURE__ */ new Map();
|
|
101
|
+
for (const [sum, mass] of sumMap) {
|
|
102
|
+
const s = sum + face;
|
|
103
|
+
target.set(s, (target.get(s) ?? 0) + mass * w);
|
|
104
|
+
}
|
|
105
|
+
next.set(nextCount, target);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
dp = next;
|
|
109
|
+
}
|
|
110
|
+
let factorial = 1;
|
|
111
|
+
for (let i = 2; i <= dice; i++) factorial *= i;
|
|
112
|
+
const chosen = dp.get(dice) ?? /* @__PURE__ */ new Map();
|
|
113
|
+
const result = /* @__PURE__ */ new Map();
|
|
114
|
+
for (const [sum, mass] of chosen) result.set(sum, mass * factorial);
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
function jointSumAndMatch(dice, weights) {
|
|
118
|
+
if (dice <= 1) return /* @__PURE__ */ new Map();
|
|
119
|
+
const total = diceSumDistribution(dice, weights);
|
|
120
|
+
const distinct = sumAllDistinctDistribution(dice, weights);
|
|
121
|
+
const result = /* @__PURE__ */ new Map();
|
|
122
|
+
for (const [sum, mass] of total) {
|
|
123
|
+
const matchMass = Math.max(0, mass - (distinct.get(sum) ?? 0));
|
|
124
|
+
if (matchMass > 0) result.set(sum, matchMass);
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
function explodingPoolMkDistribution(pMax, count, budget) {
|
|
129
|
+
const binomial = (n, p) => {
|
|
130
|
+
const result = new Array(n + 1).fill(0);
|
|
131
|
+
result[0] = 1;
|
|
132
|
+
for (let trial = 0; trial < n; trial++) {
|
|
133
|
+
const next = new Array(n + 1).fill(0);
|
|
134
|
+
for (let successes = 0; successes <= trial; successes++) {
|
|
135
|
+
const mass = result[successes];
|
|
136
|
+
if (mass <= 0) continue;
|
|
137
|
+
next[successes] += mass * (1 - p);
|
|
138
|
+
next[successes + 1] += mass * p;
|
|
139
|
+
}
|
|
140
|
+
for (let i = 0; i <= n; i++) result[i] = next[i];
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
};
|
|
144
|
+
const memo = /* @__PURE__ */ new Map();
|
|
145
|
+
const f = (pending, remainingBudget) => {
|
|
146
|
+
if (pending === 0) return /* @__PURE__ */ new Map([["0,0", 1]]);
|
|
147
|
+
if (remainingBudget === 0) {
|
|
148
|
+
const binom2 = binomial(pending, pMax);
|
|
149
|
+
const result2 = /* @__PURE__ */ new Map();
|
|
150
|
+
for (let m = 0; m <= pending; m++) {
|
|
151
|
+
const mass = binom2[m];
|
|
152
|
+
if (mass > 0) result2.set(`${m},${pending - m}`, mass);
|
|
153
|
+
}
|
|
154
|
+
return result2;
|
|
155
|
+
}
|
|
156
|
+
const key = `${pending},${remainingBudget}`;
|
|
157
|
+
const cached = memo.get(key);
|
|
158
|
+
if (cached) return cached;
|
|
159
|
+
const result = /* @__PURE__ */ new Map();
|
|
160
|
+
const accumulate = (mk, mass) => {
|
|
161
|
+
result.set(mk, (result.get(mk) ?? 0) + mass);
|
|
162
|
+
};
|
|
163
|
+
for (const [mk, mass] of f(pending, remainingBudget - 1)) {
|
|
164
|
+
const [m, k] = mk.split(",").map(Number);
|
|
165
|
+
accumulate(`${m + 1},${k}`, mass * pMax);
|
|
166
|
+
}
|
|
167
|
+
for (const [mk, mass] of f(pending - 1, remainingBudget)) {
|
|
168
|
+
const [m, k] = mk.split(",").map(Number);
|
|
169
|
+
accumulate(`${m},${k + 1}`, mass * (1 - pMax));
|
|
170
|
+
}
|
|
171
|
+
memo.set(key, result);
|
|
172
|
+
return result;
|
|
173
|
+
};
|
|
174
|
+
return f(count, budget);
|
|
175
|
+
}
|
|
176
|
+
function explodingPoolMatchProbability(pMax, faces, count, budget) {
|
|
177
|
+
if (count <= 1) return 0;
|
|
178
|
+
const mkDistribution = explodingPoolMkDistribution(pMax, count, budget);
|
|
179
|
+
const nonMaxFaces = Math.max(1, faces - 1);
|
|
180
|
+
let pMatchTotal = 0;
|
|
181
|
+
for (const [mk, weight] of mkDistribution) {
|
|
182
|
+
const [m, k] = mk.split(",").map(Number);
|
|
183
|
+
if (m >= 2) {
|
|
184
|
+
pMatchTotal += weight;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
let pAllDistinctAmongNonMax = 1;
|
|
188
|
+
for (let i = 0; i < k; i++) {
|
|
189
|
+
pAllDistinctAmongNonMax *= (nonMaxFaces - i) / nonMaxFaces;
|
|
190
|
+
}
|
|
191
|
+
pMatchTotal += weight * (1 - Math.max(0, pAllDistinctAmongNonMax));
|
|
192
|
+
}
|
|
193
|
+
return Math.min(1, Math.max(0, pMatchTotal));
|
|
194
|
+
}
|
|
52
195
|
|
|
53
196
|
// src/common/errors.ts
|
|
54
197
|
var DiceParseError = class _DiceParseError extends Error {
|
|
@@ -1880,6 +2023,30 @@ var _PMF = class _PMF {
|
|
|
1880
2023
|
`freq(${this.identifier},${freq})`
|
|
1881
2024
|
);
|
|
1882
2025
|
}
|
|
2026
|
+
/**
|
|
2027
|
+
* Splits this PMF into two complementary PMFs by an arbitrary per-damage-value factor in
|
|
2028
|
+
* `[0, 1]` — bin `d`'s mass, `count`, and `attr` split `factor(d)` / `1 - factor(d)` between the
|
|
2029
|
+
* two results (via the same proportional scaling {@link applyHitFrequency} uses, `scaleBin`), so
|
|
2030
|
+
* `a.add(b)` recovers this PMF exactly and both halves stay chart-attributable. Unlike
|
|
2031
|
+
* {@link applyHitFrequency}, mass is NOT redistributed to a miss bin at 0 — each bin stays at its
|
|
2032
|
+
* own damage value in whichever half it lands in. `factor` outside `[0, 1]` is clamped.
|
|
2033
|
+
*
|
|
2034
|
+
* Built for `dice-match` trigger slicing: splitting a hit/crit sub-PMF into "matched" and
|
|
2035
|
+
* "did not match" halves by the exact per-damage-value match probability.
|
|
2036
|
+
*/
|
|
2037
|
+
splitByFactor(factor) {
|
|
2038
|
+
const a = /* @__PURE__ */ new Map();
|
|
2039
|
+
const b = /* @__PURE__ */ new Map();
|
|
2040
|
+
for (const [damage, bin] of this.map) {
|
|
2041
|
+
const f = Math.min(1, Math.max(0, factor(damage)));
|
|
2042
|
+
if (f > 0) a.set(damage, _PMF.scaleBin(bin, f));
|
|
2043
|
+
if (f < 1) b.set(damage, _PMF.scaleBin(bin, 1 - f));
|
|
2044
|
+
}
|
|
2045
|
+
return [
|
|
2046
|
+
new _PMF(a, this.epsilon, false, `split+(${this.identifier})`),
|
|
2047
|
+
new _PMF(b, this.epsilon, false, `split-(${this.identifier})`)
|
|
2048
|
+
];
|
|
2049
|
+
}
|
|
1883
2050
|
scaleMass(factor) {
|
|
1884
2051
|
if (factor === 1) return this;
|
|
1885
2052
|
const scaledMap = /* @__PURE__ */ new Map();
|
|
@@ -3638,7 +3805,11 @@ exports.PMF = PMF;
|
|
|
3638
3805
|
exports.calculateBounceOdds = calculateBounceOdds;
|
|
3639
3806
|
exports.clearParserCache = clearParserCache;
|
|
3640
3807
|
exports.critProbability = critProbability;
|
|
3808
|
+
exports.diceSumDistribution = diceSumDistribution;
|
|
3809
|
+
exports.explodingPoolMatchProbability = explodingPoolMatchProbability;
|
|
3810
|
+
exports.faceWeights = faceWeights;
|
|
3641
3811
|
exports.getCachingEnabled = getCachingEnabled;
|
|
3812
|
+
exports.jointSumAndMatch = jointSumAndMatch;
|
|
3642
3813
|
exports.onAnyHit = onAnyHit;
|
|
3643
3814
|
exports.onCritOnly = onCritOnly;
|
|
3644
3815
|
exports.onHitOnly = onHitOnly;
|