@yipe/dice 0.8.0 → 0.9.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/CHANGELOG.md +456 -0
- package/README.md +169 -19
- package/dist/builder/dc.d.ts +8 -0
- package/dist/builder/dc.d.ts.map +1 -1
- package/dist/builder/index.cjs +735 -10
- package/dist/builder/index.cjs.map +1 -1
- package/dist/builder/index.d.ts +1 -0
- package/dist/builder/index.d.ts.map +1 -1
- package/dist/builder/index.js +729 -11
- package/dist/builder/index.js.map +1 -1
- package/dist/builder/roll.d.ts +2 -0
- package/dist/builder/roll.d.ts.map +1 -1
- package/dist/builder/save.d.ts +9 -0
- package/dist/builder/save.d.ts.map +1 -1
- package/dist/index.cjs +114 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +113 -1
- package/dist/index.js.map +1 -1
- package/dist/parser/rollType.d.ts +58 -0
- package/dist/parser/rollType.d.ts.map +1 -0
- package/dist/pmf/query.d.ts +26 -0
- package/dist/pmf/query.d.ts.map +1 -1
- package/dist/turn/index.d.ts +3 -0
- package/dist/turn/index.d.ts.map +1 -0
- package/dist/turn/plan.d.ts +55 -0
- package/dist/turn/plan.d.ts.map +1 -0
- package/dist/turn/state.d.ts +23 -0
- package/dist/turn/state.d.ts.map +1 -0
- package/dist/turn/turn.d.ts +149 -0
- package/dist/turn/turn.d.ts.map +1 -0
- package/dist/turn/types.d.ts +99 -0
- package/dist/turn/types.d.ts.map +1 -0
- package/package.json +2 -2
package/dist/builder/roll.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ 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
|
+
/** Clears the plain-roll PMF cache (test/bench seam; mirrors {@link clearAttackCache}). */
|
|
10
|
+
export declare function clearRollCache(): void;
|
|
9
11
|
export declare const defaultConfig: RollConfig;
|
|
10
12
|
export declare class RollBuilder {
|
|
11
13
|
protected readonly subRollConfigs: readonly RollConfig[];
|
|
@@ -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;
|
|
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
|
@@ -4,6 +4,8 @@ import type { DCBuilder } from "./dc.js";
|
|
|
4
4
|
import { type RollBuilder } from "./roll.js";
|
|
5
5
|
import type { CheckBuilder, SaveResolution } from "./types.js";
|
|
6
6
|
export type SaveOutcome = "normal" | "half";
|
|
7
|
+
/** Clears the resolved-save PMF cache (test/bench seam; mirrors {@link clearAttackCache}). */
|
|
8
|
+
export declare function clearSaveCache(): void;
|
|
7
9
|
export declare class SaveBuilder implements CheckBuilder {
|
|
8
10
|
readonly check: DCBuilder;
|
|
9
11
|
private readonly failureEffect?;
|
|
@@ -12,6 +14,13 @@ export declare class SaveBuilder implements CheckBuilder {
|
|
|
12
14
|
saveHalf(): SaveBuilder;
|
|
13
15
|
toExpression(): string;
|
|
14
16
|
resolve(eps?: number): SaveResolution;
|
|
17
|
+
/**
|
|
18
|
+
* 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 `resolveProbabilities`), the failure
|
|
20
|
+
* effect's PMF, and the save outcome — so composing their keys pins it. A `ParsedRollBuilder` failure
|
|
21
|
+
* effect returns `null`, which correctly forces this uncached.
|
|
22
|
+
*/
|
|
23
|
+
private cacheKey;
|
|
15
24
|
toPMF(eps?: number): PMF;
|
|
16
25
|
get pmf(): PMF;
|
|
17
26
|
toQuery(eps?: number): DiceQuery;
|
|
@@ -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":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,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,OAAO,CAAC,GAAG,GAAE,MAAY,GAAG,cAAc,CA8BzC;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/index.cjs
CHANGED
|
@@ -209,6 +209,10 @@ var _DiceQuery = class _DiceQuery {
|
|
|
209
209
|
if (this._combinedWithAttr) {
|
|
210
210
|
return this._combinedWithAttr;
|
|
211
211
|
}
|
|
212
|
+
if (this._combinedProvided) {
|
|
213
|
+
this._combinedWithAttr = this.combined.withAttribution();
|
|
214
|
+
return this._combinedWithAttr;
|
|
215
|
+
}
|
|
212
216
|
if (this.singles.every((pmf) => pmf.hasAttribution())) {
|
|
213
217
|
this._combinedWithAttr = this.combined;
|
|
214
218
|
return this._combinedWithAttr;
|
|
@@ -979,6 +983,55 @@ var _DiceQuery = class _DiceQuery {
|
|
|
979
983
|
}
|
|
980
984
|
return out;
|
|
981
985
|
}
|
|
986
|
+
/**
|
|
987
|
+
* Per-outcome probabilities and damage ranges, aggregated over the individual
|
|
988
|
+
* singles rather than read off the combined distribution.
|
|
989
|
+
*
|
|
990
|
+
* `damageRange` is the sum, over every single that can produce the outcome, of
|
|
991
|
+
* that single's own conditional damage range: "what this outcome contributes
|
|
992
|
+
* across the whole turn when every attack that can produce it does". Linear in
|
|
993
|
+
* the number of attacks by construction.
|
|
994
|
+
*
|
|
995
|
+
* Prefer this over {@link DiceQuery.snapshot} for a multi-attack query.
|
|
996
|
+
* `snapshot` reads `damageRange` off the combined PMF's `count`, which the
|
|
997
|
+
* convolution accumulates as an expected count, so its `avg` is size-biased
|
|
998
|
+
* for N≥2 (its own doc comment says so). The two agree for a single attack.
|
|
999
|
+
*
|
|
1000
|
+
* Only outcomes that actually occur appear in the result.
|
|
1001
|
+
*
|
|
1002
|
+
* Like every `singles`-based helper on this class, it describes the singles
|
|
1003
|
+
* and not an explicitly provided `combined`. `Turn.toQuery()` supplies one whose
|
|
1004
|
+
* distribution also contains rider attacks that are absent from `singles`
|
|
1005
|
+
* (an `otherwise([unarmed, unarmed])` flurry, say), so those attacks do not
|
|
1006
|
+
* appear here. For rider-inclusive figures read the combined distribution
|
|
1007
|
+
* directly: {@link DiceQuery.outcomeTotals}, {@link DiceQuery.outcomeDamageRanges}.
|
|
1008
|
+
*
|
|
1009
|
+
* @param outcomes Which outcomes to consider; defaults to every canonical one.
|
|
1010
|
+
*/
|
|
1011
|
+
outcomeStats(outcomes = ALL_OUTCOME_TYPES) {
|
|
1012
|
+
const stats = /* @__PURE__ */ new Map();
|
|
1013
|
+
const perSingle = this.singles.map((pmf) => new _DiceQuery([pmf], void 0, this._eps));
|
|
1014
|
+
for (const outcome of outcomes) {
|
|
1015
|
+
const atLeastOneProbability = this.probAtLeastOne(outcome);
|
|
1016
|
+
if (atLeastOneProbability <= 0) continue;
|
|
1017
|
+
const damageRange = { min: 0, avg: 0, max: 0 };
|
|
1018
|
+
let contributors = 0;
|
|
1019
|
+
for (const single of perSingle) {
|
|
1020
|
+
if (single.probAtLeastOne(outcome) <= 0) continue;
|
|
1021
|
+
contributors++;
|
|
1022
|
+
const stat = single.damageStatsFrom(outcome);
|
|
1023
|
+
damageRange.min += stat.min;
|
|
1024
|
+
damageRange.avg += stat.avg;
|
|
1025
|
+
damageRange.max += stat.max;
|
|
1026
|
+
}
|
|
1027
|
+
stats.set(outcome, {
|
|
1028
|
+
atLeastOneProbability,
|
|
1029
|
+
allProbability: contributors > 0 ? this.probExactlyK(outcome, contributors) : 0,
|
|
1030
|
+
damageRange
|
|
1031
|
+
});
|
|
1032
|
+
}
|
|
1033
|
+
return stats;
|
|
1034
|
+
}
|
|
982
1035
|
/**
|
|
983
1036
|
* Snapshot of the distribution in the exact shape the UI consumes.
|
|
984
1037
|
* - outcome probabilities are "at least one" (and equal to "all" for a single PMF)
|
|
@@ -3347,6 +3400,65 @@ function parseOperation(s) {
|
|
|
3347
3400
|
return;
|
|
3348
3401
|
}
|
|
3349
3402
|
|
|
3403
|
+
// src/parser/rollType.ts
|
|
3404
|
+
var DECIMAL_INTEGER = /^\s*[+-]?\d+\s*$/;
|
|
3405
|
+
function tryParse(expression) {
|
|
3406
|
+
if (DECIMAL_INTEGER.test(expression)) {
|
|
3407
|
+
const value = Number(expression);
|
|
3408
|
+
return Number.isSafeInteger(value) ? PMF.delta(value) : PMF.empty();
|
|
3409
|
+
}
|
|
3410
|
+
try {
|
|
3411
|
+
return parse(expression);
|
|
3412
|
+
} catch {
|
|
3413
|
+
return PMF.empty();
|
|
3414
|
+
}
|
|
3415
|
+
}
|
|
3416
|
+
var CHECK_TOKEN = /\b(AC|DC)\b/i;
|
|
3417
|
+
var D20_RUN = /\bh?d20(?:\s*[><]\s*h?d20)*/i;
|
|
3418
|
+
var RUN_FOR_ROLL_TYPE = {
|
|
3419
|
+
flat: "d20",
|
|
3420
|
+
advantage: "d20 > d20",
|
|
3421
|
+
disadvantage: "d20 < d20",
|
|
3422
|
+
"elven accuracy": "d20 > d20 > d20"
|
|
3423
|
+
};
|
|
3424
|
+
function withRollType(expression, rollType) {
|
|
3425
|
+
const scopes = enclosingScopes(expression);
|
|
3426
|
+
let rewritten = "";
|
|
3427
|
+
let copiedUpTo = 0;
|
|
3428
|
+
for (const run of expression.matchAll(new RegExp(D20_RUN, "gi"))) {
|
|
3429
|
+
const at = run.index;
|
|
3430
|
+
if (!isAttackRoll(expression, scopes, at)) continue;
|
|
3431
|
+
const replacement = run[0].toLowerCase().startsWith("h") ? `h${RUN_FOR_ROLL_TYPE[rollType]}` : RUN_FOR_ROLL_TYPE[rollType];
|
|
3432
|
+
rewritten += expression.slice(copiedUpTo, at) + replacement;
|
|
3433
|
+
copiedUpTo = at + run[0].length;
|
|
3434
|
+
}
|
|
3435
|
+
return rewritten + expression.slice(copiedUpTo);
|
|
3436
|
+
}
|
|
3437
|
+
function enclosingScopes(expression) {
|
|
3438
|
+
const open = [];
|
|
3439
|
+
const scopes = [];
|
|
3440
|
+
for (let i = 0; i < expression.length; i++) {
|
|
3441
|
+
if (expression[i] === "(") open.push(i);
|
|
3442
|
+
else if (expression[i] === ")") {
|
|
3443
|
+
const start = open.pop();
|
|
3444
|
+
if (start !== void 0) scopes.push({ start, end: i + 1 });
|
|
3445
|
+
}
|
|
3446
|
+
}
|
|
3447
|
+
return scopes.sort((a, b) => a.end - a.start - (b.end - b.start));
|
|
3448
|
+
}
|
|
3449
|
+
function isAttackRoll(expression, scopes, at) {
|
|
3450
|
+
let scoped = false;
|
|
3451
|
+
for (const scope of scopes) {
|
|
3452
|
+
if (at < scope.start || at >= scope.end) continue;
|
|
3453
|
+
scoped = true;
|
|
3454
|
+
const check2 = CHECK_TOKEN.exec(expression.slice(scope.start, scope.end));
|
|
3455
|
+
if (check2) return check2[1].toUpperCase() === "AC";
|
|
3456
|
+
}
|
|
3457
|
+
if (scoped) return false;
|
|
3458
|
+
const check = CHECK_TOKEN.exec(expression);
|
|
3459
|
+
return check !== null && check[1].toUpperCase() === "AC";
|
|
3460
|
+
}
|
|
3461
|
+
|
|
3350
3462
|
// src/pmf/mixture.ts
|
|
3351
3463
|
var Mixture = class _Mixture {
|
|
3352
3464
|
constructor(eps = EPS) {
|
|
@@ -3490,5 +3602,7 @@ exports.parse = parse;
|
|
|
3490
3602
|
exports.pmfCache = pmfCache;
|
|
3491
3603
|
exports.setCachingEnabled = setCachingEnabled;
|
|
3492
3604
|
exports.sortOutcomes = sortOutcomes;
|
|
3605
|
+
exports.tryParse = tryParse;
|
|
3606
|
+
exports.withRollType = withRollType;
|
|
3493
3607
|
//# sourceMappingURL=index.cjs.map
|
|
3494
3608
|
//# sourceMappingURL=index.cjs.map
|