@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.
Files changed (65) hide show
  1. package/README.md +278 -8
  2. package/dist/builder/ac.d.ts +44 -1
  3. package/dist/builder/ac.d.ts.map +1 -1
  4. package/dist/builder/arguments.d.ts +6 -0
  5. package/dist/builder/arguments.d.ts.map +1 -0
  6. package/dist/builder/ast.d.ts +36 -7
  7. package/dist/builder/ast.d.ts.map +1 -1
  8. package/dist/builder/attack.d.ts +88 -5
  9. package/dist/builder/attack.d.ts.map +1 -1
  10. package/dist/builder/dc.d.ts +13 -0
  11. package/dist/builder/dc.d.ts.map +1 -1
  12. package/dist/builder/example.d.ts +11 -15
  13. package/dist/builder/example.d.ts.map +1 -1
  14. package/dist/builder/expression.d.ts +72 -0
  15. package/dist/builder/expression.d.ts.map +1 -0
  16. package/dist/builder/factory.d.ts +2 -3
  17. package/dist/builder/factory.d.ts.map +1 -1
  18. package/dist/builder/index.cjs +3574 -1359
  19. package/dist/builder/index.cjs.map +1 -1
  20. package/dist/builder/index.js +3567 -1360
  21. package/dist/builder/index.js.map +1 -1
  22. package/dist/builder/nodes.d.ts +7 -1
  23. package/dist/builder/nodes.d.ts.map +1 -1
  24. package/dist/builder/prob.d.ts +9 -0
  25. package/dist/builder/prob.d.ts.map +1 -1
  26. package/dist/builder/roll.d.ts +151 -21
  27. package/dist/builder/roll.d.ts.map +1 -1
  28. package/dist/builder/save.d.ts +6 -1
  29. package/dist/builder/save.d.ts.map +1 -1
  30. package/dist/builder/types.d.ts +18 -0
  31. package/dist/builder/types.d.ts.map +1 -1
  32. package/dist/common/bounce.d.ts +24 -11
  33. package/dist/common/bounce.d.ts.map +1 -1
  34. package/dist/common/lru-cache.d.ts +29 -1
  35. package/dist/common/lru-cache.d.ts.map +1 -1
  36. package/dist/index.cjs +1131 -402
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.js +1131 -402
  39. package/dist/index.js.map +1 -1
  40. package/dist/parser/dice.d.ts +52 -16
  41. package/dist/parser/dice.d.ts.map +1 -1
  42. package/dist/parser/parser.d.ts +1 -5
  43. package/dist/parser/parser.d.ts.map +1 -1
  44. package/dist/parser/rollType.d.ts +4 -4
  45. package/dist/parser/scaleDice.d.ts +14 -0
  46. package/dist/parser/scaleDice.d.ts.map +1 -0
  47. package/dist/pmf/mixture.d.ts +17 -3
  48. package/dist/pmf/mixture.d.ts.map +1 -1
  49. package/dist/pmf/pmf.d.ts +118 -33
  50. package/dist/pmf/pmf.d.ts.map +1 -1
  51. package/dist/pmf/query.d.ts +25 -12
  52. package/dist/pmf/query.d.ts.map +1 -1
  53. package/dist/turn/effects.d.ts +114 -0
  54. package/dist/turn/effects.d.ts.map +1 -0
  55. package/dist/turn/index.d.ts +3 -1
  56. package/dist/turn/index.d.ts.map +1 -1
  57. package/dist/turn/plan.d.ts +101 -21
  58. package/dist/turn/plan.d.ts.map +1 -1
  59. package/dist/turn/state.d.ts +14 -8
  60. package/dist/turn/state.d.ts.map +1 -1
  61. package/dist/turn/turn.d.ts +127 -26
  62. package/dist/turn/turn.d.ts.map +1 -1
  63. package/dist/turn/types.d.ts +154 -17
  64. package/dist/turn/types.d.ts.map +1 -1
  65. package/package.json +1 -1
@@ -3,9 +3,9 @@ import type { PMF } from "../pmf/pmf.js";
3
3
  export type { DiceMatchInfo, HasDiceMatchInfo };
4
4
  /**
5
5
  * Triggers that read the outcomes of source attacks, as opposed to `not-fired`,
6
- * which reads another rider. Includes `any-miss`, so this is not "hit triggers".
6
+ * which reads another rider. Includes `any-miss`/`first-miss`, so this is not "hit triggers".
7
7
  */
8
- export type AttackTriggerOn = "first-hit" | "any-crit" | "any-miss" | "every-hit";
8
+ export type AttackTriggerOn = "first-hit" | "any-crit" | "any-miss" | "first-miss" | "every-hit";
9
9
  /**
10
10
  * When a rider fires. JSON-safe, so a consumer can persist this verbatim and hand
11
11
  * it straight back in a {@link TurnSpec}.
@@ -13,7 +13,16 @@ export type AttackTriggerOn = "first-hit" | "any-crit" | "any-miss" | "every-hit
13
13
  * - `first-hit` — the first source that lands. Fires in that source's mode, so a
14
14
  * crit on the *first* landing attack doubles the rider's dice (Sneak Attack).
15
15
  * - `any-crit` — at least one source crit. Always fires in crit mode (Divine Smite).
16
- * - `any-miss` — at least one source missed. The reroll gate (Unerring Accuracy, Lucky).
16
+ * - `any-miss` — at least one source missed. Its step runs after every declared attack,
17
+ * which is exact only when the reroll is identically distributed to every attack after
18
+ * the one it replaces. An attack-shaped `any-miss` rider that reads a granted modifier
19
+ * or applies a condition's grants is refused (`unsupported-trigger`): at the end of the
20
+ * turn it would see the wrong grants. Use `first-miss` for such rerolls.
21
+ * - `first-miss` — the FIRST source in `of` that missed. Its step runs immediately after
22
+ * that attack (one slot per watched source, sharing one fire bit), so a reroll lands in
23
+ * turn order and anything that reads order — a `first-hit` rider's crit mode, or a
24
+ * granted modifier — sees it where it happened. The exact model of "when you miss, you
25
+ * may reroll" (Unerring Accuracy, Lucky).
17
26
  * - `every-hit` — once per landing source, in that hit's mode (Hunter's Mark, Hex, Rage).
18
27
  * - `dice-match` — at least one named source's own damage dice showed a duplicate
19
28
  * value on hit or crit (Chromatic Orb's bounce). `of` is REQUIRED — unlike the
@@ -21,13 +30,25 @@ export type AttackTriggerOn = "first-hit" | "any-crit" | "any-miss" | "every-hit
21
30
  * for "the dice matched", so there is no default. Each named source must expose
22
31
  * a {@link HasDiceMatchInfo} descriptor (an `AttackBuilder`-shaped source does);
23
32
  * 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".
33
+ * expression) is a `TurnSpecError`, not a silent "never matches". A damage rider
34
+ * fires in crit mode, its dice doubled, when a crit's dice matched (with several
35
+ * sources, when any matching landing was a crit); otherwise in hit mode.
25
36
  * - `not-fired` — the named rider did **not** fire ("flurry of blows if I didn't smite").
37
+ * It may also name a substitute: it then fires when the substitute was never spent.
26
38
  *
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.
39
+ * For the attack triggers besides `dice-match`, `of` is a list of attack ids,
40
+ * attack-shaped rider ids, or declaration tags (see {@link Attack}); a tag expands to
41
+ * every attack carrying it. A rider whose damage is a list of several attacks is not
42
+ * attack-shaped: naming it is `not-an-attack`, and it never joins a default `of`.
43
+ *
44
+ * `of` defaults to every declared attack plus every attack-shaped `any-miss` /
45
+ * `first-miss` rider before it — a reroll continues the attacks it watches. `Turn`'s
46
+ * chaining methods snapshot that at the call that adds the rider (the attacks and
47
+ * rerolls declared so far); a {@link TurnSpec} resolves it when the plan is built,
48
+ * giving a rider the rerolls listed before it in `riders` and a substitute or
49
+ * condition every reroll. Both spellings of one turn therefore watch the same
50
+ * sources. For `not-fired` it is the single required id of the rider being negated —
51
+ * negating a set of riders has no unambiguous meaning, so the type does not offer it.
31
52
  */
32
53
  export type Trigger = {
33
54
  on: AttackTriggerOn;
@@ -44,9 +65,12 @@ export interface ToPMF {
44
65
  toPMF(eps?: number): PMF;
45
66
  }
46
67
  /**
47
- * Rider or attack damage. Strings are not accepted: a parsed expression cannot
48
- * have its dice doubled, so a string rider would deal single dice on a crit. Call
49
- * `parse()` yourself if that is what you want.
68
+ * Rider or attack damage. Raw strings are not accepted; wrap one in `d("…")`. On a
69
+ * crit, a rider's dice double and its flats do not: a builder through
70
+ * `doubleDice()`, a `d("…")` string by rewriting its dice terms (`d("2d6+5")` crits
71
+ * as `4d6+5`), a pool inside, then pooled. A bare `PMF` is a fixed distribution with
72
+ * no dice to double, so it is added as-is on a crit. A `d("…")` attack string crits on
73
+ * its own roll: with no crit clause, at its natural 20, with its hit dice doubled.
50
74
  */
51
75
  export type Damage = PMF | ToPMF;
52
76
  /**
@@ -56,15 +80,29 @@ export type Damage = PMF | ToPMF;
56
80
  * `not-an-attack` {@link TurnSpecError} at build time, not a compile error.
57
81
  */
58
82
  export type Source = Damage;
59
- /** One payload, or several to convolve: Flurry of Blows is `[flurry, flurry]`. */
83
+ /**
84
+ * One payload, or several to convolve: Flurry of Blows is `[flurry, flurry]`. A list of
85
+ * several attacks deals their exact summed damage, but it is one payload, not attacks
86
+ * that each land: nothing can watch it in `of`, and it never joins a default `of`. To
87
+ * watch each strike, declare each as its own rider.
88
+ */
60
89
  export type RiderDamage = Damage | readonly Damage[];
61
90
  /** Everything about a rider except what it does and when — see `Turn.onFirstHit`. */
62
91
  export interface RiderOptions {
63
92
  /** Required only if another rider names this one in `of`. */
64
93
  id?: string;
65
- /** Which attacks to watch. Defaults to every declared attack. */
94
+ /**
95
+ * Which attacks to watch: attack ids, attack-shaped rider ids, or declaration tags.
96
+ * Defaults to the attacks declared so far, plus any attack-shaped `any-miss` /
97
+ * `first-miss` rider declared so far (see {@link Trigger}).
98
+ */
66
99
  of?: readonly string[];
67
- /** Defaults to `damage` with dice doubled when that is possible, else `damage`. */
100
+ /**
101
+ * Defaults to `damage` with its dice doubled (builders and `d("…")` strings that can double);
102
+ * an attack or save builder or string, or a bare `PMF` part, is added as-is. A rider that
103
+ * rolls its own attack — one attack, or a list of several — crits on its own roll, so
104
+ * giving it one is an `unused-crit-damage` error.
105
+ */
68
106
  critDamage?: RiderDamage;
69
107
  }
70
108
  export type Rider = Trigger & {
@@ -72,6 +110,16 @@ export type Rider = Trigger & {
72
110
  damage: RiderDamage;
73
111
  critDamage?: RiderDamage;
74
112
  };
113
+ /** How an attack is declared: `id` names it for `of`; `tag` groups it with others. */
114
+ export interface AttackOptions {
115
+ id?: string;
116
+ /**
117
+ * A name several attacks can share. An `of` entry that is not an id expands to
118
+ * every attack carrying that tag, so a reordered turn cannot silently retarget
119
+ * the way a positional `attack 2` can. A tag matching nothing is `unknown-id`.
120
+ */
121
+ tag?: string;
122
+ }
75
123
  /**
76
124
  * A bare source gets the id `attack 1`, `attack 2`, … in declaration order.
77
125
  *
@@ -79,15 +127,104 @@ export type Rider = Trigger & {
79
127
  * itself: an attack's value is a builder or PMF that this module does not own,
80
128
  * so there is nowhere to hang a field.
81
129
  */
82
- export type Attack = Source | {
83
- id: string;
130
+ export type Attack = Source | (AttackOptions & {
84
131
  source: Source;
132
+ });
133
+ /**
134
+ * When a substitute may be spent: on the first landing it sees (`always`, the
135
+ * default), only when the base payload total (dice plus the payload's own flat
136
+ * bonus, excluding separate-damage channels) is below the threshold for that
137
+ * mode (`below`; a landing spends regardless when no later watched step can
138
+ * still land in that turn state), or by backward induction (`optimal` — not
139
+ * supported in this release).
140
+ */
141
+ export type SubstitutePolicy = {
142
+ kind: "always";
143
+ } | {
144
+ kind: "below";
145
+ hit: number;
146
+ crit: number;
147
+ } | {
148
+ kind: "optimal";
85
149
  };
150
+ /**
151
+ * A once-per-turn payload transform: at the first watched landing the policy
152
+ * accepts, the attack's base payload is replaced by a transform of itself. The
153
+ * JSON-safe form of `Turn.onFirstHit(keepBestDamage())`; callers write the
154
+ * factory, never the string.
155
+ */
156
+ export interface SubstituteSpec {
157
+ id?: string;
158
+ on: "first-hit";
159
+ /**
160
+ * Omit it: defaults to every declared attack plus every attack-shaped `any-miss` /
161
+ * `first-miss` rider, the same sources the chaining spelling watches (see {@link Trigger}).
162
+ */
163
+ of?: readonly string[];
164
+ /** Named transform, so a {@link TurnSpec} stays JSON-safe and persistable. */
165
+ substitute: "reroll-keep-higher";
166
+ /** Defaults to `{ kind: "always" }`. */
167
+ policy?: SubstitutePolicy;
168
+ }
169
+ /**
170
+ * One granted modifier: what it does to the attack rolls that read it, how long it
171
+ * lasts, and which attack rolls read it. JSON-safe — the persisted form of a
172
+ * `Grant` built with `advantage().untilNextAttack()` and friends.
173
+ *
174
+ * - `advantage` / `disadvantage` combine with the reading attack's own roll type by
175
+ * cancellation; a net advantage rolls as many dice as that attacker's
176
+ * `advantageDice` (`ACBuilder.threeDiceAdvantage()`).
177
+ * - `critOnHit` makes every landing attack a crit; a natural 1 still misses.
178
+ * - `until: "next-attack"` is consumed by the next attack roll that reads it, hit or
179
+ * miss; `"end-of-turn"` lasts for the rest of the turn.
180
+ * - `to` lists attack ids, attack-shaped rider ids or tags. Omitted, every later
181
+ * attack roll reads it, attack-shaped riders included (an attack-shaped `any-miss`
182
+ * rider that would read it is refused; see {@link Trigger}).
183
+ */
184
+ export interface GrantSpec {
185
+ advantage?: true;
186
+ disadvantage?: true;
187
+ critOnHit?: true;
188
+ until: "next-attack" | "end-of-turn";
189
+ to?: readonly string[];
190
+ }
191
+ /**
192
+ * Grants applied by the outcomes of earlier attacks to later attack rolls: "a hit
193
+ * gives the next attack advantage". The JSON-safe form of `Turn.onEveryHit(grant)`.
194
+ *
195
+ * `on` says which outcome among `of` applies the grants: `every-hit` on each
196
+ * landing, `first-hit` on the first landing only, `any-crit` on each crit,
197
+ * `first-miss` on the first miss, `any-miss` on each miss. Miss damage
198
+ * (`halfOnMiss`, `onMiss`) is a miss, never a landing.
199
+ *
200
+ * `chance` is the probability each application takes (a target's failed save);
201
+ * `grants` apply on that branch and `onSave` on the other one. Each application
202
+ * rolls it afresh, except that an application whose grants are all `end-of-turn`
203
+ * and all already in force is skipped: nothing is rolled and `onSave` does not
204
+ * apply. An application with any `next-attack` grant is always rolled.
205
+ */
206
+ export interface ConditionSpec {
207
+ id?: string;
208
+ on: AttackTriggerOn;
209
+ /**
210
+ * Omit it: defaults to every declared attack plus every attack-shaped `any-miss` /
211
+ * `first-miss` rider (see {@link Trigger}).
212
+ */
213
+ of?: readonly string[];
214
+ /** In `[0, 1]`; defaults to 1. */
215
+ chance?: number;
216
+ /** Applied on the fail branch, or with probability `chance`. */
217
+ grants: readonly GrantSpec[];
218
+ /** Applied on the success branch. Requires `chance`. */
219
+ onSave?: readonly GrantSpec[];
220
+ }
86
221
  export interface TurnSpec {
87
222
  attacks: readonly Attack[];
88
223
  riders?: readonly Rider[];
224
+ substitutes?: readonly SubstituteSpec[];
225
+ conditions?: readonly ConditionSpec[];
89
226
  }
90
- export type TurnSpecErrorCode = "unknown-id" | "duplicate-id" | "self-reference" | "cycle" | "not-an-attack" | "unused-crit-damage" | "too-many-groups" | "no-dice-descriptor";
227
+ export type TurnSpecErrorCode = "unknown-id" | "duplicate-id" | "self-reference" | "cycle" | "not-an-attack" | "unused-crit-damage" | "too-many-groups" | "no-dice-descriptor" | "duplicate-substitute" | "attack-after-rider" | "no-rebindable-source" | "unsupported-trigger" | "unsupported-policy" | "too-many-flags";
91
228
  /**
92
229
  * A malformed turn. `code` is a stable contract: consumer UIs map it to their own
93
230
  * states (greyed dropdown option, "trigger missing" row error, …) instead of
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/turn/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yipe/dice",
3
- "version": "0.11.0",
3
+ "version": "0.12.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",