@yipe/dice 0.11.0 → 0.12.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/README.md +278 -8
- package/dist/builder/ac.d.ts +44 -1
- package/dist/builder/ac.d.ts.map +1 -1
- package/dist/builder/arguments.d.ts +6 -0
- package/dist/builder/arguments.d.ts.map +1 -0
- package/dist/builder/ast.d.ts +36 -7
- package/dist/builder/ast.d.ts.map +1 -1
- package/dist/builder/attack.d.ts +88 -5
- package/dist/builder/attack.d.ts.map +1 -1
- package/dist/builder/dc.d.ts +13 -0
- package/dist/builder/dc.d.ts.map +1 -1
- package/dist/builder/example.d.ts +11 -15
- package/dist/builder/example.d.ts.map +1 -1
- package/dist/builder/expression.d.ts +72 -0
- package/dist/builder/expression.d.ts.map +1 -0
- package/dist/builder/factory.d.ts +2 -3
- package/dist/builder/factory.d.ts.map +1 -1
- package/dist/builder/index.cjs +3574 -1359
- package/dist/builder/index.cjs.map +1 -1
- package/dist/builder/index.js +3567 -1360
- package/dist/builder/index.js.map +1 -1
- package/dist/builder/nodes.d.ts +7 -1
- package/dist/builder/nodes.d.ts.map +1 -1
- package/dist/builder/prob.d.ts +9 -0
- package/dist/builder/prob.d.ts.map +1 -1
- package/dist/builder/roll.d.ts +151 -21
- package/dist/builder/roll.d.ts.map +1 -1
- package/dist/builder/save.d.ts +6 -1
- package/dist/builder/save.d.ts.map +1 -1
- package/dist/builder/types.d.ts +18 -0
- package/dist/builder/types.d.ts.map +1 -1
- package/dist/common/bounce.d.ts +24 -11
- package/dist/common/bounce.d.ts.map +1 -1
- package/dist/common/lru-cache.d.ts +29 -1
- package/dist/common/lru-cache.d.ts.map +1 -1
- package/dist/index.cjs +1131 -402
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1131 -402
- package/dist/index.js.map +1 -1
- package/dist/parser/dice.d.ts +52 -16
- package/dist/parser/dice.d.ts.map +1 -1
- package/dist/parser/parser.d.ts +1 -5
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/rollType.d.ts +4 -4
- package/dist/parser/scaleDice.d.ts +14 -0
- package/dist/parser/scaleDice.d.ts.map +1 -0
- package/dist/pmf/mixture.d.ts +17 -3
- package/dist/pmf/mixture.d.ts.map +1 -1
- package/dist/pmf/pmf.d.ts +118 -33
- package/dist/pmf/pmf.d.ts.map +1 -1
- package/dist/pmf/query.d.ts +25 -12
- package/dist/pmf/query.d.ts.map +1 -1
- package/dist/turn/effects.d.ts +114 -0
- package/dist/turn/effects.d.ts.map +1 -0
- package/dist/turn/index.d.ts +3 -1
- package/dist/turn/index.d.ts.map +1 -1
- package/dist/turn/plan.d.ts +101 -21
- package/dist/turn/plan.d.ts.map +1 -1
- package/dist/turn/state.d.ts +14 -8
- package/dist/turn/state.d.ts.map +1 -1
- package/dist/turn/turn.d.ts +127 -26
- package/dist/turn/turn.d.ts.map +1 -1
- package/dist/turn/types.d.ts +154 -17
- package/dist/turn/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/builder/nodes.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ExpressionNode = DieNode | ConstantNode | SumNode | AddNode | KeepNode | D20RollNode | HalfNode | MaxOfNode | ScaleNode;
|
|
1
|
+
export type ExpressionNode = DieNode | ConstantNode | SumNode | AddNode | KeepNode | D20RollNode | HalfNode | MaxOfNode | MaxNode | ScaleNode;
|
|
2
2
|
export type DieNode = {
|
|
3
3
|
type: "die";
|
|
4
4
|
sides: number;
|
|
@@ -38,11 +38,17 @@ export type HalfNode = {
|
|
|
38
38
|
type: "half";
|
|
39
39
|
child: ExpressionNode;
|
|
40
40
|
};
|
|
41
|
+
/** The highest of `count` independent rolls of `child`. */
|
|
41
42
|
export type MaxOfNode = {
|
|
42
43
|
type: "maxOf";
|
|
43
44
|
count: number;
|
|
44
45
|
child: ExpressionNode;
|
|
45
46
|
};
|
|
47
|
+
/** The highest of several independent, possibly different rolls (e.g. the better of 3d8 and 2d10). */
|
|
48
|
+
export type MaxNode = {
|
|
49
|
+
type: "max";
|
|
50
|
+
children: ExpressionNode[];
|
|
51
|
+
};
|
|
46
52
|
/**
|
|
47
53
|
* Scale the child's result by `numerator / denominator`, then round.
|
|
48
54
|
*
|
|
@@ -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;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"}
|
|
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,OAAO,GACP,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,2DAA2D;AAC3D,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,sGAAsG;AACtG,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B,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/prob.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import { PMF } from "../.js";
|
|
2
2
|
export declare function d20PmfFromCdf(cdfPow: (k: number) => number, eps?: number): PMF;
|
|
3
|
+
/**
|
|
4
|
+
* `P(X ≥ t)` and `P(X < t)` for `pmf`, each summed from its own bins — so a side with no bins is
|
|
5
|
+
* exactly 0, never the `1 - p` float residue of the other. Used to split a check's bonus dice at the
|
|
6
|
+
* total its natural roll still needs.
|
|
7
|
+
*/
|
|
8
|
+
export declare function splitAtThreshold(pmf: PMF, t: number): {
|
|
9
|
+
atLeast: number;
|
|
10
|
+
below: number;
|
|
11
|
+
};
|
|
3
12
|
//# sourceMappingURL=prob.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prob.d.ts","sourceRoot":"","sources":["../../src/builder/prob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,wBAAgB,aAAa,CAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC7B,GAAG,GAAE,MAAY,GAChB,GAAG,CAaL"}
|
|
1
|
+
{"version":3,"file":"prob.d.ts","sourceRoot":"","sources":["../../src/builder/prob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,wBAAgB,aAAa,CAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC7B,GAAG,GAAE,MAAY,GAChB,GAAG,CAaL;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQxF"}
|
package/dist/builder/roll.d.ts
CHANGED
|
@@ -1,14 +1,32 @@
|
|
|
1
1
|
import type { ACBuilder } from "./ac.js";
|
|
2
2
|
import type { CritConfig } from "../common/types.js";
|
|
3
3
|
import type { DCBuilder } from "./dc.js";
|
|
4
|
-
import
|
|
4
|
+
import { PMF } from "../pmf/pmf.js";
|
|
5
5
|
import type { DiceQuery } from "../pmf/query.js";
|
|
6
6
|
import { AttackBuilder } from "./attack.js";
|
|
7
7
|
import type { ExpressionNode } from "./nodes.js";
|
|
8
8
|
import type { RollConfig, RollType } from "./types.js";
|
|
9
|
-
|
|
9
|
+
export { AmbiguousKeepError } from "./ast.js";
|
|
10
|
+
/**
|
|
11
|
+
* Thrown when a parsed string (`d("d20+5")`, `RollBuilder.fromArgs("d20+5")`) is used as an attack
|
|
12
|
+
* or save check. A parsed builder carries only its PMF, not the dice and flats a check reads, so
|
|
13
|
+
* the check would silently lose them.
|
|
14
|
+
*/
|
|
15
|
+
export declare class ParsedCheckError extends Error {
|
|
16
|
+
readonly expression: string;
|
|
17
|
+
constructor(expression: string, verb: "ac" | "dc");
|
|
18
|
+
}
|
|
19
|
+
/** Clears the plain-roll and single-die PMF caches (test/bench seam; mirrors {@link clearAttackCache}). */
|
|
10
20
|
export declare function clearRollCache(): void;
|
|
11
21
|
export declare const defaultConfig: RollConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Index of the config holding a check's natural roll — the die whose 1 misses and whose 20 hits and
|
|
24
|
+
* crits — or -1 when no config can be one. Only a rolled, added die can: a subtracted or zero-count
|
|
25
|
+
* group never is. A d20 outranks every other die (a d30 or d100 beside it is a bonus die); with no
|
|
26
|
+
* d20 the largest die does, and the first of equal dice wins. The same rule the string parser uses
|
|
27
|
+
* to pick a check's natural roll, so `d4.plus(d20)` and `(1d4 + d20 AC n)` agree.
|
|
28
|
+
*/
|
|
29
|
+
export declare function naturalRollIndex(configs: readonly RollConfig[]): number;
|
|
12
30
|
export declare class RollBuilder {
|
|
13
31
|
protected readonly subRollConfigs: readonly RollConfig[];
|
|
14
32
|
constructor(countOrConfigs?: number | readonly RollConfig[]);
|
|
@@ -28,35 +46,76 @@ export declare class RollBuilder {
|
|
|
28
46
|
static fromConfig(config: Partial<RollConfig>): RollBuilder;
|
|
29
47
|
static fromConfigs(configs: Partial<RollConfig>[]): RollBuilder;
|
|
30
48
|
static fromArgs(...args: any[]): RollBuilder;
|
|
49
|
+
/**
|
|
50
|
+
* `count` independent copies of `die`, subtracted when `count` is negative. A plain group scales
|
|
51
|
+
* its dice count; a group whose count is part of its meaning (a keep, `bestOf()`, a pool-wide
|
|
52
|
+
* `explodePool()` budget) is copied, so `roll(2, d6.keepHighest(2, 1))` is two best-of-two d6.
|
|
53
|
+
* Each copy brings its own flat modifier, negated with the dice when subtracted.
|
|
54
|
+
*/
|
|
55
|
+
protected static repeated(die: RollBuilder, count: number): RollBuilder;
|
|
31
56
|
d(sides: number | undefined): RollBuilder;
|
|
32
57
|
plus(modOrRoll: number | RollBuilder | undefined): RollBuilder;
|
|
33
58
|
plus(count: number, die: RollBuilder): RollBuilder;
|
|
34
59
|
minus(modOrRoll: number | RollBuilder | undefined): RollBuilder;
|
|
35
60
|
minus(count: number, die: RollBuilder): RollBuilder;
|
|
36
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* Reroll faces 1..`value` once and keep the second roll (Great Weapon Fighting in the 2014
|
|
63
|
+
* rules). The reroll decides on the die's raw face: on a group that also has a {@link minimum},
|
|
64
|
+
* the floor applies to the kept face afterwards, whichever of the two was called first.
|
|
65
|
+
*/
|
|
37
66
|
reroll(value: number): RollBuilder;
|
|
38
|
-
/**
|
|
39
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Let each die explode: a roll of its highest face adds another die, at most `count` extra dice
|
|
69
|
+
* per die. The cap is required and must be finite; `explode(0)` is a no-op. For one budget
|
|
70
|
+
* shared by the whole pool, use {@link explodePool}.
|
|
71
|
+
*/
|
|
72
|
+
explode(count: number): RollBuilder;
|
|
40
73
|
/**
|
|
41
74
|
* Set a pool-wide exploding-dice budget: at most `budget` extra dice may be added across the
|
|
42
75
|
* 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).
|
|
76
|
+
* allowed up to `explode(k)` extra dice). `budget` must be a finite non-negative integer.
|
|
45
77
|
*/
|
|
46
78
|
explodePool(budget: number): RollBuilder;
|
|
47
|
-
/**
|
|
48
|
-
* 2 as a 3
|
|
79
|
+
/**
|
|
80
|
+
* Floor each die at `val`: `minimum(3)` treats a 1 or 2 as a 3 (the 2024 Great Weapon Fighting
|
|
81
|
+
* style). On a group that also has a {@link reroll}, the reroll decides on the raw face and this
|
|
82
|
+
* floor applies to the kept face afterwards, whichever of the two was called first.
|
|
83
|
+
*/
|
|
49
84
|
minimum(val: number | undefined): RollBuilder;
|
|
50
85
|
bestOf(count: number | undefined): RollBuilder;
|
|
86
|
+
/**
|
|
87
|
+
* Keep the highest `count` of `total`. On one die, that is `count` of `total` rolls of the die;
|
|
88
|
+
* on N dice it is `count` of the N dice when `total` is N and `count` >= 2, or the best of
|
|
89
|
+
* `total` rolls of the whole N-dice group when `count` is 1. Any other shape on N > 1 dice has
|
|
90
|
+
* more than one reading and throws an {@link AmbiguousKeepError}; use {@link keepHighestAll}
|
|
91
|
+
* or a keep on each die instead.
|
|
92
|
+
*/
|
|
51
93
|
keepHighest(total: number, count: number): RollBuilder;
|
|
94
|
+
/**
|
|
95
|
+
* Keep the lowest `count` of `total`; the mirror of {@link keepHighest}. On N > 1 dice,
|
|
96
|
+
* `keepLowest(N, 1)` throws an {@link AmbiguousKeepError}: the lowest single die and the worse
|
|
97
|
+
* of N rolls of the whole group are both plausible readings.
|
|
98
|
+
*/
|
|
52
99
|
keepLowest(total: number, count: number): RollBuilder;
|
|
100
|
+
private withKeep;
|
|
53
101
|
keepHighestAll(total: number, count: number): PooledRollBuilder;
|
|
54
102
|
keepLowestAll(total: number, count: number): PooledRollBuilder;
|
|
55
103
|
withAdvantage(): RollBuilder;
|
|
56
104
|
withDisadvantage(): RollBuilder;
|
|
105
|
+
/**
|
|
106
|
+
* Sets a roll type. On a roll with a natural d20 (a check: see {@link naturalRollIndex}) it
|
|
107
|
+
* applies to that d20 whatever the call order, so `d20.plus(d4).withAdvantage()` advantages the
|
|
108
|
+
* d20, not the Bless die. Otherwise it applies to the last group.
|
|
109
|
+
*/
|
|
110
|
+
private withRollType;
|
|
57
111
|
add(anotherRoll: RollBuilder | undefined): RollBuilder;
|
|
58
112
|
withBonus(anotherRoll: RollBuilder): RollBuilder;
|
|
59
113
|
addRoll(count?: number): RollBuilder;
|
|
114
|
+
/**
|
|
115
|
+
* Multiplies every die group's count by `scale` (crit doubling); flats stay. Throws an
|
|
116
|
+
* {@link AmbiguousCritDoublingError} for a group whose scaled meaning is ambiguous (see
|
|
117
|
+
* {@link ambiguousScaling}): the caller must give the crit explicitly.
|
|
118
|
+
*/
|
|
60
119
|
scaleDice(scale: number): RollBuilder;
|
|
61
120
|
doubleDice(): RollBuilder;
|
|
62
121
|
alwaysHits(): AlwaysHitBuilder;
|
|
@@ -75,9 +134,19 @@ export declare class RollBuilder {
|
|
|
75
134
|
get pmf(): PMF;
|
|
76
135
|
toQuery(eps?: number): DiceQuery;
|
|
77
136
|
toAST(): ExpressionNode;
|
|
78
|
-
|
|
137
|
+
/**
|
|
138
|
+
* The config carrying this roll's natural die — see {@link naturalRollIndex} — or, with no
|
|
139
|
+
* such die, the first config (so `rollType`/`baseReroll` still read a flat roll's own fields).
|
|
140
|
+
*/
|
|
79
141
|
getRootDieConfig(): RollConfig | undefined;
|
|
80
142
|
getAllDieConfigs(): readonly RollConfig[];
|
|
143
|
+
/**
|
|
144
|
+
* The check's dice other than its natural die (Bless, Bane, Guidance), each WITHOUT its flat
|
|
145
|
+
* modifier. `.plus(n)` stores `n` on whichever group came last, so `d20.plus(d4).plus(5)` holds
|
|
146
|
+
* the 5 on the d4 group; every check resolver already adds all flats once via {@link modifier},
|
|
147
|
+
* so a bonus group that kept its own would count it twice and make the check order-dependent.
|
|
148
|
+
* A check with no natural die has every die as a bonus die.
|
|
149
|
+
*/
|
|
81
150
|
getBonusDiceConfigs(): RollConfig[];
|
|
82
151
|
getBonusDicePMFs(check: RollBuilder, eps?: number): PMF[];
|
|
83
152
|
get modifier(): number;
|
|
@@ -91,12 +160,34 @@ export declare class RollBuilder {
|
|
|
91
160
|
* Compose several of these (and plain rolls) into one payload with {@link sumRolls}.
|
|
92
161
|
*/
|
|
93
162
|
scaleResult(numerator: number, denominator?: number, rounding?: "floor" | "round" | "ceil"): ScaleRollBuilder;
|
|
163
|
+
/**
|
|
164
|
+
* The highest of `count` independent rolls of this whole roll (dice, flats, rerolls and all):
|
|
165
|
+
* `roll(2, d6).plus(3).maxOf(2)` is the better of two 2d6 + 3. Given another roll instead, the
|
|
166
|
+
* higher of this roll and that one: `roll(3, d8).maxOf(roll(2, d10))`.
|
|
167
|
+
*/
|
|
94
168
|
maxOf(count: number): MaxOfRollBuilder;
|
|
169
|
+
maxOf(other: RollBuilder): RollBuilder;
|
|
95
170
|
ac(_targetAC: number): ACBuilder;
|
|
96
171
|
dc(_saveDC: number): DCBuilder;
|
|
97
172
|
}
|
|
98
|
-
|
|
173
|
+
/**
|
|
174
|
+
* A roll whose value is a transform of whole rolls: halved, scaled, the highest of several, or a
|
|
175
|
+
* sum that keeps such parts. Arithmetic on it (`plus`, `minus`, `add`) composes as a sum that
|
|
176
|
+
* keeps the transform, so `roll(2, d6).half().plus(1)` is floor(2d6 / 2) + 1. Verbs that edit the
|
|
177
|
+
* underlying dice (`reroll`, `minimum`, `keepHighest`, advantage, ...) throw instead: set them on
|
|
178
|
+
* the roll before transforming it.
|
|
179
|
+
*/
|
|
180
|
+
declare abstract class TransformedRollBuilder extends RollBuilder {
|
|
181
|
+
/** The call that made this roll, for error messages (e.g. `half()`). */
|
|
182
|
+
protected abstract readonly verb: string;
|
|
183
|
+
protected create(_configs: readonly RollConfig[]): RollBuilder;
|
|
184
|
+
plus(modOrRoll: number | RollBuilder | undefined): RollBuilder;
|
|
185
|
+
plus(count: number, die: RollBuilder): RollBuilder;
|
|
186
|
+
add(anotherRoll: RollBuilder | undefined): RollBuilder;
|
|
187
|
+
}
|
|
188
|
+
export declare class HalfRollBuilder extends TransformedRollBuilder {
|
|
99
189
|
private readonly innerRoll;
|
|
190
|
+
protected readonly verb = "half()";
|
|
100
191
|
constructor(innerRoll: RollBuilder);
|
|
101
192
|
hasHiddenState(): boolean;
|
|
102
193
|
cacheKey(): string | null;
|
|
@@ -110,14 +201,15 @@ export declare class HalfRollBuilder extends RollBuilder {
|
|
|
110
201
|
}
|
|
111
202
|
/**
|
|
112
203
|
* A roll whose result is scaled by `numerator / denominator` and rounded — the composable
|
|
113
|
-
* generalization of {@link HalfRollBuilder}. Renders as `N
|
|
114
|
-
* `(inner)
|
|
204
|
+
* generalization of {@link HalfRollBuilder}. Renders as `N ** (inner)`, `(inner) // D`, or
|
|
205
|
+
* `(inner) ** N // D`. Arithmetic after it keeps the scale (see {@link sumRolls}).
|
|
115
206
|
*/
|
|
116
|
-
export declare class ScaleRollBuilder extends
|
|
207
|
+
export declare class ScaleRollBuilder extends TransformedRollBuilder {
|
|
117
208
|
private readonly innerRoll;
|
|
118
209
|
private readonly numerator;
|
|
119
210
|
private readonly denominator;
|
|
120
211
|
private readonly rounding;
|
|
212
|
+
protected readonly verb = "scaleResult()";
|
|
121
213
|
constructor(innerRoll: RollBuilder, numerator: number, denominator?: number, rounding?: "floor" | "round" | "ceil");
|
|
122
214
|
hasHiddenState(): boolean;
|
|
123
215
|
cacheKey(): string | null;
|
|
@@ -129,16 +221,18 @@ export declare class ScaleRollBuilder extends RollBuilder {
|
|
|
129
221
|
scaleDice(scale: number): RollBuilder;
|
|
130
222
|
copy(): ScaleRollBuilder;
|
|
131
223
|
}
|
|
132
|
-
export declare class MaxOfRollBuilder extends
|
|
224
|
+
export declare class MaxOfRollBuilder extends TransformedRollBuilder {
|
|
133
225
|
private readonly innerRoll;
|
|
134
226
|
private readonly count;
|
|
135
227
|
private readonly diceCount?;
|
|
136
228
|
private readonly diceSides?;
|
|
229
|
+
protected readonly verb = "maxOf()";
|
|
137
230
|
constructor(innerRoll: RollBuilder, count: number, diceCount?: number | undefined, diceSides?: number | undefined);
|
|
138
231
|
hasHiddenState(): boolean;
|
|
139
232
|
cacheKey(): string | null;
|
|
140
233
|
get lastConfig(): RollConfig;
|
|
141
234
|
getSubRollConfigs(): readonly RollConfig[];
|
|
235
|
+
/** `NkhK(X)` keeps the highest K of N independent copies of X: the max of N rolls is `Nkh1(X)`. */
|
|
142
236
|
toExpression(): string;
|
|
143
237
|
toAST(): ExpressionNode;
|
|
144
238
|
toPMF(eps?: number): PMF;
|
|
@@ -158,8 +252,10 @@ export declare class AlwaysHitBuilder extends RollBuilder {
|
|
|
158
252
|
onHit(count: number, sides: number, modifier: number): AttackBuilder;
|
|
159
253
|
get critThreshold(): number;
|
|
160
254
|
cacheKey(): string | null;
|
|
255
|
+
/** Sets the crit threshold for this always-hitting check: a natural roll at or above it crits. */
|
|
161
256
|
critOn(critThreshold: number): AlwaysHitBuilder;
|
|
162
257
|
alwaysCrits(): AlwaysCritBuilder;
|
|
258
|
+
/** The check's natural roll, which is all this builder's own PMF reads (see {@link toPMF}). */
|
|
163
259
|
toExpression(): string;
|
|
164
260
|
toPMF(): PMF;
|
|
165
261
|
copy(): AlwaysHitBuilder;
|
|
@@ -183,6 +279,7 @@ export declare class AlwaysCritBuilder extends RollBuilder {
|
|
|
183
279
|
get critThreshold(): number;
|
|
184
280
|
cacheKey(): string | null;
|
|
185
281
|
critOn(critThreshold: number): AlwaysCritBuilder;
|
|
282
|
+
/** The check's natural roll, which is all this builder's own PMF reads (see {@link toPMF}). */
|
|
186
283
|
toExpression(): string;
|
|
187
284
|
toPMF(): PMF;
|
|
188
285
|
copy(): AlwaysCritBuilder;
|
|
@@ -196,20 +293,48 @@ export declare class ParsedRollBuilder extends RollBuilder {
|
|
|
196
293
|
protected create(configs: readonly RollConfig[]): RollBuilder;
|
|
197
294
|
toPMF(_eps?: number): PMF;
|
|
198
295
|
toExpression(): string;
|
|
296
|
+
/** Refused: a parsed roll has no dice or flats for a check to read (see {@link ParsedCheckError}). */
|
|
297
|
+
ac(_targetAC: number): ACBuilder;
|
|
298
|
+
/** Refused: a parsed roll has no dice or flats for a check to read (see {@link ParsedCheckError}). */
|
|
299
|
+
dc(_saveDC: number): DCBuilder;
|
|
199
300
|
toAST(): ExpressionNode;
|
|
200
301
|
copy(): ParsedRollBuilder;
|
|
302
|
+
/**
|
|
303
|
+
* Whether this is a damage expression whose dice a crit doubles: false for one with an AC/DC
|
|
304
|
+
* check or a crit/save/pc/miss clause, or a dice-valued repeat count (`d4d6`), which a crit adds
|
|
305
|
+
* as-is. True for every other expression, including one whose doubling is ambiguous (a keep other
|
|
306
|
+
* than keep-highest-of-1, a min of two dice terms): that is still damage, and {@link doubleDice}
|
|
307
|
+
* refuses it with an `AmbiguousCritDoublingError` so no crit is approximated. Reads the string
|
|
308
|
+
* only; nothing is parsed into a PMF.
|
|
309
|
+
*/
|
|
310
|
+
canDoubleDice(): boolean;
|
|
311
|
+
/**
|
|
312
|
+
* A crit doubles every dice term of the expression; flats and operators stay. Throws when
|
|
313
|
+
* {@link canDoubleDice} is false, and for an ambiguous keep (see {@link canDoubleDice}).
|
|
314
|
+
*/
|
|
201
315
|
doubleDice(): ParsedRollBuilder;
|
|
316
|
+
scaleDice(scale: number): ParsedRollBuilder;
|
|
202
317
|
}
|
|
318
|
+
/**
|
|
319
|
+
* Rebuilds a pool from its pre-pool roll with that roll's dice scaled. This is how a pool's dice
|
|
320
|
+
* double on a crit: `roll(2,d6).plus(3).keepHighestAll(2,1)` crits as
|
|
321
|
+
* `roll(4,d6).plus(3).keepHighestAll(2,1)`, never as the whole pool rolled twice.
|
|
322
|
+
*/
|
|
323
|
+
type RepoolScaled = (scale: number) => PooledRollBuilder;
|
|
203
324
|
export declare class PooledRollBuilder extends RollBuilder {
|
|
204
325
|
private readonly baseAST;
|
|
326
|
+
/** Prints the pool itself; called only when the expression is asked for. */
|
|
205
327
|
private readonly baseExpression;
|
|
206
|
-
|
|
328
|
+
private readonly repoolScaled?;
|
|
329
|
+
constructor(baseAST: ExpressionNode,
|
|
330
|
+
/** Prints the pool itself; called only when the expression is asked for. */
|
|
331
|
+
baseExpression: () => string, configs?: readonly RollConfig[], repoolScaled?: RepoolScaled | undefined);
|
|
207
332
|
protected create(configs: readonly RollConfig[]): PooledRollBuilder;
|
|
208
333
|
hasHiddenState(): boolean;
|
|
209
334
|
cacheKey(): string | null;
|
|
210
335
|
d(_sides: number | undefined): RollBuilder;
|
|
211
336
|
reroll(_value: number): RollBuilder;
|
|
212
|
-
explode(_count
|
|
337
|
+
explode(_count: number): RollBuilder;
|
|
213
338
|
explodePool(_budget: number): RollBuilder;
|
|
214
339
|
minimum(_val: number | undefined): RollBuilder;
|
|
215
340
|
bestOf(_count: number | undefined): RollBuilder;
|
|
@@ -221,15 +346,20 @@ export declare class PooledRollBuilder extends RollBuilder {
|
|
|
221
346
|
toAST(): ExpressionNode;
|
|
222
347
|
toExpression(): string;
|
|
223
348
|
copy(): PooledRollBuilder;
|
|
224
|
-
|
|
349
|
+
/**
|
|
350
|
+
* Scales the dice inside the pool, then pools — the pool is rebuilt from its own pre-pool roll
|
|
351
|
+
* with that roll's dice scaled, so its trial count and flats never multiply. Dice added after
|
|
352
|
+
* pooling (`pool.plus(roll(1, d4))`) scale too; flat modifiers do not.
|
|
353
|
+
*/
|
|
354
|
+
scaleDice(scale: number): PooledRollBuilder;
|
|
225
355
|
times(count: number): PooledRollBuilder;
|
|
226
356
|
}
|
|
227
357
|
/**
|
|
228
358
|
* Combine several rolls into one additive payload whose PMF is their convolution and whose
|
|
229
|
-
* expression is
|
|
230
|
-
*
|
|
359
|
+
* expression is their sum. Unlike merging plain dice, this preserves parts that carry
|
|
360
|
+
* a transform (e.g. `roll.scaleResult(1, 2)` / `roll.half()`), so per-damage-type resistance
|
|
231
361
|
* and vulnerability survive into both the distribution and the rendered expression.
|
|
232
|
-
* Empty parts collapse to `0`; a single part is returned unwrapped.
|
|
362
|
+
* Empty parts collapse to `0`; a single part is returned unwrapped; nested sums are flattened.
|
|
233
363
|
*/
|
|
234
364
|
export declare function sumRolls(parts: readonly RollBuilder[]): RollBuilder;
|
|
235
365
|
//# sourceMappingURL=roll.d.ts.map
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"roll.d.ts","sourceRoot":"","sources":["../../src/builder/roll.ts"],"names":[],"mappings":"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"}
|
package/dist/builder/save.d.ts
CHANGED
|
@@ -13,10 +13,15 @@ export declare class SaveBuilder implements CheckBuilder {
|
|
|
13
13
|
constructor(check: DCBuilder, failureEffect?: RollBuilder | undefined, saveOutcome?: SaveOutcome);
|
|
14
14
|
saveHalf(): SaveBuilder;
|
|
15
15
|
toExpression(): string;
|
|
16
|
+
/**
|
|
17
|
+
* The save's outcome: `check` is the DC check's own PMF (success at 0, failure at 1, as
|
|
18
|
+
* {@link DCBuilder.toPMF}), `weights` its success/failure chances, `saveFail` the failure payload
|
|
19
|
+
* and `saveSuccess` what a success deals (half, floored, under `saveHalf()`; else 0).
|
|
20
|
+
*/
|
|
16
21
|
resolve(eps?: number): SaveResolution;
|
|
17
22
|
/**
|
|
18
23
|
* A cheap, complete key for this save's resolved PMF, or `null` when it can't be cached soundly.
|
|
19
|
-
* {@link resolve} reads exactly three things: the DC check (via `
|
|
24
|
+
* {@link resolve} reads exactly three things: the DC check (via `saveProbabilities`/`toPMF`), the failure
|
|
20
25
|
* effect's PMF, and the save outcome — so composing their keys pins it. A `ParsedRollBuilder` failure
|
|
21
26
|
* effect returns `null`, which correctly forces this uncached.
|
|
22
27
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/builder/save.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/builder/save.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAU5C,8FAA8F;AAC9F,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,qBAAa,WAAY,YAAW,YAAY;IAE5C,QAAQ,CAAC,KAAK,EAAE,SAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAH9B,YACW,KAAK,EAAE,SAAS,EACR,aAAa,CAAC,EAAE,WAAW,YAAA,EAC3B,WAAW,GAAE,WAAsB,EAClD;IAEJ,QAAQ,IAAI,WAAW,CAEtB;IAED,YAAY,IAAI,MAAM,CAOrB;IAED;;;;OAIG;IACH,OAAO,CAAC,GAAG,GAAE,MAAY,GAAG,cAAc,CA2BzC;IAED;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAehB,KAAK,CAAC,GAAG,GAAE,MAAU,GAAG,GAAG,CAQ1B;IAED,IAAI,GAAG,QAEN;IAGD,OAAO,CAAC,GAAG,GAAE,MAAU,GAAG,SAAS,CAElC;CACF"}
|
package/dist/builder/types.d.ts
CHANGED
|
@@ -45,12 +45,30 @@ export type AttackResolution = Resolution & {
|
|
|
45
45
|
hit: PMF;
|
|
46
46
|
crit: PMF;
|
|
47
47
|
miss: PMF;
|
|
48
|
+
hitBase: PMF;
|
|
49
|
+
critBase: PMF;
|
|
50
|
+
hitSeparate: PMF;
|
|
51
|
+
critSeparate: PMF;
|
|
48
52
|
weights: {
|
|
49
53
|
hit: number;
|
|
50
54
|
crit: number;
|
|
51
55
|
miss: number;
|
|
52
56
|
};
|
|
53
57
|
};
|
|
58
|
+
/**
|
|
59
|
+
* The one re-derivation surface `AttackBuilder.withCheck(fn)` accepts. `roll` is the
|
|
60
|
+
* to-hit + bonus-dice descriptor (AC and crit threshold live alongside it, not inside it);
|
|
61
|
+
* `rollType`/`advantageDice` are the SOURCE's own values (before any grant is combined in —
|
|
62
|
+
* see `combine()` in `ac.ts`); `critOnHit` mirrors the `alwaysCrits()` path.
|
|
63
|
+
*/
|
|
64
|
+
export interface Check {
|
|
65
|
+
roll: RollBuilder;
|
|
66
|
+
ac: number;
|
|
67
|
+
critThreshold: number;
|
|
68
|
+
rollType: RollType;
|
|
69
|
+
advantageDice: 2 | 3;
|
|
70
|
+
critOnHit: boolean;
|
|
71
|
+
}
|
|
54
72
|
export type SaveResolution = Resolution & {
|
|
55
73
|
saveFail: PMF;
|
|
56
74
|
saveSuccess: PMF;
|
|
@@ -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;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;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/builder/types.ts"],"names":[],"mappings":"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"}
|
package/dist/common/bounce.d.ts
CHANGED
|
@@ -6,18 +6,22 @@
|
|
|
6
6
|
* Accounts for two modifiers:
|
|
7
7
|
* - **Elemental Adept** (`minimumDieRoll >= 2`): rolls below the minimum are
|
|
8
8
|
* bumped up to it, collapsing the low faces onto a single heavier value.
|
|
9
|
-
* - **Empowered Spell** (`rerollDamageDice > 0`):
|
|
9
|
+
* - **Empowered Spell** (`rerollDamageDice > 0`): up to that many dice may be
|
|
10
10
|
* rerolled once, giving a second chance at a match.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* Every case is exact. With Empowered Spell, a roll that already matched stands;
|
|
13
|
+
* otherwise the caster rerolls the dice — which ones and how many, up to the
|
|
14
|
+
* limit — that maximise the chance of a match. The rerolled dice match when they
|
|
15
|
+
* collide among themselves or with a kept die.
|
|
15
16
|
*/
|
|
16
17
|
/** Options that modify bounce odds via metamagic / feats. */
|
|
17
18
|
export interface BounceOddsOptions {
|
|
18
19
|
/** Minimum die roll — e.g. 2 for Elemental Adept, 3 for Great Weapon Fighting 2024. */
|
|
19
20
|
minimumDieRoll?: number;
|
|
20
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* How many dice may be rerolled once — e.g. CHA modifier for Empowered Spell. "Up to":
|
|
23
|
+
* the odds assume the best choice of which dice, and how many, to reroll.
|
|
24
|
+
*/
|
|
21
25
|
rerollDamageDice?: number;
|
|
22
26
|
}
|
|
23
27
|
/**
|
|
@@ -34,6 +38,11 @@ export declare function faceWeights(faces: number, minimum?: number, reroll?: nu
|
|
|
34
38
|
* P(at least two of `diceCount` dice with `dieFaces` faces match), honoring
|
|
35
39
|
* Elemental Adept and Empowered Spell. Returns a probability in [0, 1].
|
|
36
40
|
*
|
|
41
|
+
* With `rerollDamageDice`, a roll that matched stands; otherwise up to that many
|
|
42
|
+
* dice are rerolled once, choosing which and how many to maximise the chance of a
|
|
43
|
+
* match (rerolling fewer can be better: a kept Elemental Adept face is a likely
|
|
44
|
+
* target). The fresh dice match when they collide among themselves or with a kept die.
|
|
45
|
+
*
|
|
37
46
|
* @param diceCount Number of dice rolled.
|
|
38
47
|
* @param dieFaces Faces per die (e.g. 8 for d8).
|
|
39
48
|
* @param options Optional metamagic / feat modifiers.
|
|
@@ -64,14 +73,18 @@ export declare function jointSumAndMatch(dice: number, weights: readonly number[
|
|
|
64
73
|
* `RollBuilder.explodePool()`). The plain `jointSumAndMatch`/`calculateBounceOdds` formulas assume
|
|
65
74
|
* `dice` i.i.d. dice — false for an exploded pool, since conditioning on a realized size already
|
|
66
75
|
* 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) —
|
|
76
|
+
* (dice showing max, the exploded ones included) and `k` (dice showing anything else) —
|
|
68
77
|
*
|
|
69
78
|
* `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
|
|
71
|
-
*
|
|
79
|
+
* `m ≤ 1` → match iff the `k` non-max dice collide among themselves. Each shows face `v` with
|
|
80
|
+
* the conditional weight `w_v / (1 − pMax)`, and they cannot collide with the max face,
|
|
81
|
+
* so the two parts separate.
|
|
82
|
+
*
|
|
83
|
+
* So a single die can match its own explosion: a lone d8 with budget ≥ 1 matches when it rolls
|
|
84
|
+
* 8 and then 8 again (1/64).
|
|
72
85
|
*
|
|
73
|
-
* `
|
|
74
|
-
*
|
|
86
|
+
* `weights` is the single (non-exploding-budget) die's resolved marginal, 1-indexed with the
|
|
87
|
+
* max face last, as {@link faceWeights} returns it.
|
|
75
88
|
*/
|
|
76
|
-
export declare function explodingPoolMatchProbability(
|
|
89
|
+
export declare function explodingPoolMatchProbability(weights: readonly number[], count: number, budget: number): number;
|
|
77
90
|
//# sourceMappingURL=bounce.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bounce.d.ts","sourceRoot":"","sources":["../../src/common/bounce.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bounce.d.ts","sourceRoot":"","sources":["../../src/common/bounce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,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;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CA6CR;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,CAuB9F;AAiFD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAcR"}
|
|
@@ -1,10 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Simple LRU cache implementation
|
|
3
3
|
*/
|
|
4
|
+
/**
|
|
5
|
+
* Enable or disable the library's internal caches: the parse cache, the PMF convolution/power
|
|
6
|
+
* cache, and the builder, die, roll, attack, save and check caches. While disabled those caches
|
|
7
|
+
* store nothing and every lookup misses, and disabling empties them. Caches you construct
|
|
8
|
+
* yourself are unaffected unless created with `followsCachingToggle`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function setCachingEnabled(enabled: boolean): void;
|
|
11
|
+
/** Returns whether the library's internal caches are currently enabled. */
|
|
12
|
+
export declare function getCachingEnabled(): boolean;
|
|
13
|
+
export interface LRUCacheOptions<V> {
|
|
14
|
+
/** Called with every value as it is stored, e.g. to freeze a shared result. */
|
|
15
|
+
onInsert?: (value: V) => void;
|
|
16
|
+
/**
|
|
17
|
+
* Store and return nothing while {@link setCachingEnabled} has turned caching off, and empty
|
|
18
|
+
* this cache when it does.
|
|
19
|
+
*/
|
|
20
|
+
followsCachingToggle?: boolean;
|
|
21
|
+
}
|
|
4
22
|
export declare class LRUCache<K, V> {
|
|
5
23
|
private readonly maxSize;
|
|
6
24
|
private cache;
|
|
7
|
-
|
|
25
|
+
private readonly onInsert?;
|
|
26
|
+
private readonly followsCachingToggle;
|
|
27
|
+
private generation;
|
|
28
|
+
/**
|
|
29
|
+
* @param maxSize Entries kept before the least recently used is evicted. A capacity of 0 or
|
|
30
|
+
* less (or NaN) makes the cache store nothing.
|
|
31
|
+
*/
|
|
32
|
+
constructor(maxSize?: number, options?: LRUCacheOptions<V>);
|
|
33
|
+
/** Drops the entries of a toggle-following cache when caching was turned off since last use. */
|
|
34
|
+
private sync;
|
|
35
|
+
private get storing();
|
|
8
36
|
get(key: K): V | undefined;
|
|
9
37
|
delete(key: K): void;
|
|
10
38
|
set(key: K, value: V): this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../src/common/lru-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../src/common/lru-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAGxD;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,qBAAa,QAAQ,CAAC,CAAC,EAAE,CAAC;IAWtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IAC/C,OAAO,CAAC,UAAU,CAAmB;IAErC;;;OAGG;IACH,YACmB,OAAO,SAAO,EAC/B,OAAO,GAAE,eAAe,CAAC,CAAC,CAAM,EAIjC;IAED,gGAAgG;IAChG,OAAO,CAAC,IAAI;IAOZ,OAAO,KAAK,OAAO,GAGlB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAQzB;IAED,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAEnB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAU1B;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,IAAI,IAAI,IAAI,MAAM,CAGjB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEnB;IAED,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAG1B;IAED,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAG5B;CACF"}
|