@mcptoolshop/roll 1.0.0 → 2.0.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 +64 -0
- package/README.md +105 -137
- package/dist/analyze/distribution.d.ts.map +1 -1
- package/dist/analyze/distribution.js +249 -33
- package/dist/analyze/distribution.js.map +1 -1
- package/dist/bridge/handler.d.ts +14 -0
- package/dist/bridge/handler.d.ts.map +1 -0
- package/dist/bridge/handler.js +163 -0
- package/dist/bridge/handler.js.map +1 -0
- package/dist/bridge/protocol.d.ts +53 -0
- package/dist/bridge/protocol.d.ts.map +1 -0
- package/dist/bridge/protocol.js +8 -0
- package/dist/bridge/protocol.js.map +1 -0
- package/dist/bridge/server.d.ts +3 -0
- package/dist/bridge/server.d.ts.map +1 -0
- package/dist/bridge/server.js +71 -0
- package/dist/bridge/server.js.map +1 -0
- package/dist/display/format.d.ts.map +1 -1
- package/dist/display/format.js +28 -3
- package/dist/display/format.js.map +1 -1
- package/dist/engine/pipeline.d.ts +27 -0
- package/dist/engine/pipeline.d.ts.map +1 -0
- package/dist/engine/pipeline.js +304 -0
- package/dist/engine/pipeline.js.map +1 -0
- package/dist/engine/roller.d.ts +3 -0
- package/dist/engine/roller.d.ts.map +1 -1
- package/dist/engine/roller.js +82 -125
- package/dist/engine/roller.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +182 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +106 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/parser/ast.d.ts +7 -1
- package/dist/parser/ast.d.ts.map +1 -1
- package/dist/parser/lexer.d.ts.map +1 -1
- package/dist/parser/lexer.js +138 -45
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +107 -15
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokens.d.ts +14 -0
- package/dist/parser/tokens.d.ts.map +1 -1
- package/dist/parser/tokens.js +22 -0
- package/dist/parser/tokens.js.map +1 -1
- package/dist/tables/conditions.d.ts +7 -0
- package/dist/tables/conditions.d.ts.map +1 -0
- package/dist/tables/conditions.js +65 -0
- package/dist/tables/conditions.js.map +1 -0
- package/dist/tables/engine.d.ts +10 -0
- package/dist/tables/engine.d.ts.map +1 -0
- package/dist/tables/engine.js +147 -0
- package/dist/tables/engine.js.map +1 -0
- package/dist/tables/schema.d.ts +89 -0
- package/dist/tables/schema.d.ts.map +1 -0
- package/dist/tables/schema.js +3 -0
- package/dist/tables/schema.js.map +1 -0
- package/dist/tables/validate.d.ts +4 -0
- package/dist/tables/validate.d.ts.map +1 -0
- package/dist/tables/validate.js +98 -0
- package/dist/tables/validate.js.map +1 -0
- package/package.json +12 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { matchesCompare } from "../engine/pipeline.js";
|
|
1
2
|
import { monteCarloDistribution } from "./montecarlo.js";
|
|
2
3
|
const MAX_EXACT_STATES = 10_000_000;
|
|
3
4
|
function sideCount(sides) {
|
|
@@ -7,6 +8,7 @@ function sideCount(sides) {
|
|
|
7
8
|
return 3;
|
|
8
9
|
return sides;
|
|
9
10
|
}
|
|
11
|
+
// ─── Single-die distributions ────────────────────────────────────────────────
|
|
10
12
|
/** Distribution for a single die roll. */
|
|
11
13
|
function singleDieDistribution(sides) {
|
|
12
14
|
const dist = new Map();
|
|
@@ -24,6 +26,108 @@ function singleDieDistribution(sides) {
|
|
|
24
26
|
}
|
|
25
27
|
return dist;
|
|
26
28
|
}
|
|
29
|
+
/** Single-die distribution after reroll modifiers.
|
|
30
|
+
* Unlimited reroll: faces matching the compare point have zero probability;
|
|
31
|
+
* their mass redistributes uniformly to remaining faces via geometric series.
|
|
32
|
+
* Reroll-once: two-step probability. */
|
|
33
|
+
function singleDieWithReroll(sides, mods) {
|
|
34
|
+
const s = sideCount(sides);
|
|
35
|
+
const isFate = sides === "F";
|
|
36
|
+
const base = singleDieDistribution(sides);
|
|
37
|
+
// Get all faces
|
|
38
|
+
const faces = [];
|
|
39
|
+
if (isFate) {
|
|
40
|
+
faces.push(-1, 0, 1);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
for (let i = 1; i <= s; i++)
|
|
44
|
+
faces.push(i);
|
|
45
|
+
}
|
|
46
|
+
let dist = new Map(base);
|
|
47
|
+
for (const mod of mods) {
|
|
48
|
+
if (mod.kind !== "reroll" && mod.kind !== "reroll_once")
|
|
49
|
+
continue;
|
|
50
|
+
if (!mod.compare)
|
|
51
|
+
continue;
|
|
52
|
+
const newDist = new Map();
|
|
53
|
+
const matchingFaces = faces.filter((f) => matchesCompare(f, mod.compare));
|
|
54
|
+
const nonMatchingFaces = faces.filter((f) => !matchesCompare(f, mod.compare));
|
|
55
|
+
if (nonMatchingFaces.length === 0) {
|
|
56
|
+
// All faces match — infinite reroll would never terminate, return uniform
|
|
57
|
+
return dist;
|
|
58
|
+
}
|
|
59
|
+
if (mod.kind === "reroll") {
|
|
60
|
+
// Unlimited reroll: matching faces have 0 probability.
|
|
61
|
+
// Total probability of non-matching faces: each gets its base prob + share of removed mass.
|
|
62
|
+
// Result: uniform over non-matching faces.
|
|
63
|
+
const pEach = 1 / nonMatchingFaces.length;
|
|
64
|
+
for (const face of nonMatchingFaces) {
|
|
65
|
+
newDist.set(face, pEach);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Reroll once: if face matches, reroll one time.
|
|
70
|
+
// P(end on face f) = P(roll f initially, f doesn't match) + P(roll matching, then roll f)
|
|
71
|
+
const pMatch = matchingFaces.length / s;
|
|
72
|
+
const pFace = 1 / s;
|
|
73
|
+
for (const face of faces) {
|
|
74
|
+
const isMatch = matchesCompare(face, mod.compare);
|
|
75
|
+
if (isMatch) {
|
|
76
|
+
// Can only end here if initial roll was a match AND reroll also lands here
|
|
77
|
+
newDist.set(face, pMatch * pFace);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// End here from: direct roll + (match then reroll to here)
|
|
81
|
+
newDist.set(face, pFace + pMatch * pFace);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
dist = newDist;
|
|
86
|
+
}
|
|
87
|
+
return dist;
|
|
88
|
+
}
|
|
89
|
+
/** Single-die distribution after min/max clamping. */
|
|
90
|
+
function singleDieWithMinMax(baseDist, mods) {
|
|
91
|
+
let dist = new Map(baseDist);
|
|
92
|
+
for (const mod of mods) {
|
|
93
|
+
if (mod.kind === "min" && mod.value !== undefined) {
|
|
94
|
+
const floor = mod.value;
|
|
95
|
+
const newDist = new Map();
|
|
96
|
+
let piledMass = 0;
|
|
97
|
+
for (const [v, p] of dist) {
|
|
98
|
+
if (v < floor) {
|
|
99
|
+
piledMass += p;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
newDist.set(v, (newDist.get(v) ?? 0) + p);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (piledMass > 0) {
|
|
106
|
+
newDist.set(floor, (newDist.get(floor) ?? 0) + piledMass);
|
|
107
|
+
}
|
|
108
|
+
dist = newDist;
|
|
109
|
+
}
|
|
110
|
+
if (mod.kind === "max" && mod.value !== undefined) {
|
|
111
|
+
const ceiling = mod.value;
|
|
112
|
+
const newDist = new Map();
|
|
113
|
+
let piledMass = 0;
|
|
114
|
+
for (const [v, p] of dist) {
|
|
115
|
+
if (v > ceiling) {
|
|
116
|
+
piledMass += p;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
newDist.set(v, (newDist.get(v) ?? 0) + p);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (piledMass > 0) {
|
|
123
|
+
newDist.set(ceiling, (newDist.get(ceiling) ?? 0) + piledMass);
|
|
124
|
+
}
|
|
125
|
+
dist = newDist;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return dist;
|
|
129
|
+
}
|
|
130
|
+
// ─── Convolution ─────────────────────────────────────────────────────────────
|
|
27
131
|
/** Convolve two distributions (sum of independent random variables). */
|
|
28
132
|
function convolve(a, b) {
|
|
29
133
|
const result = new Map();
|
|
@@ -38,12 +142,21 @@ function convolve(a, b) {
|
|
|
38
142
|
/** Distribution for NdM via iterative convolution. */
|
|
39
143
|
function convolveDice(count, sides) {
|
|
40
144
|
const single = singleDieDistribution(sides);
|
|
41
|
-
let dist = new Map([[0, 1]]);
|
|
145
|
+
let dist = new Map([[0, 1]]);
|
|
146
|
+
for (let i = 0; i < count; i++) {
|
|
147
|
+
dist = convolve(dist, single);
|
|
148
|
+
}
|
|
149
|
+
return dist;
|
|
150
|
+
}
|
|
151
|
+
/** Convolve a single-die distribution N times. */
|
|
152
|
+
function convolveN(single, count) {
|
|
153
|
+
let dist = new Map([[0, 1]]);
|
|
42
154
|
for (let i = 0; i < count; i++) {
|
|
43
155
|
dist = convolve(dist, single);
|
|
44
156
|
}
|
|
45
157
|
return dist;
|
|
46
158
|
}
|
|
159
|
+
// ─── Exact strategies ────────────────────────────────────────────────────────
|
|
47
160
|
/** Distribution with keep/drop via full enumeration. */
|
|
48
161
|
function enumerateKeepDrop(node) {
|
|
49
162
|
const s = sideCount(node.sides);
|
|
@@ -53,15 +166,24 @@ function enumerateKeepDrop(node) {
|
|
|
53
166
|
const isFate = node.sides === "F";
|
|
54
167
|
const dist = new Map();
|
|
55
168
|
const prob = 1 / totalStates;
|
|
56
|
-
// Enumerate all outcomes
|
|
57
169
|
const rolls = new Array(node.count);
|
|
58
170
|
function enumerate(depth) {
|
|
59
171
|
if (depth === node.count) {
|
|
60
|
-
// Apply keep/drop
|
|
61
|
-
|
|
62
|
-
|
|
172
|
+
// Apply reroll + min/max per die, then keep/drop on the result
|
|
173
|
+
let values = rolls.slice();
|
|
174
|
+
// Apply min/max per die
|
|
175
|
+
for (const mod of node.modifiers) {
|
|
176
|
+
if (mod.kind === "min" && mod.value !== undefined) {
|
|
177
|
+
values = values.map((v) => Math.max(v, mod.value));
|
|
178
|
+
}
|
|
179
|
+
if (mod.kind === "max" && mod.value !== undefined) {
|
|
180
|
+
values = values.map((v) => Math.min(v, mod.value));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
184
|
+
let kept = sorted.slice();
|
|
63
185
|
for (const mod of node.modifiers) {
|
|
64
|
-
if (mod.kind
|
|
186
|
+
if (mod.kind !== "kh" && mod.kind !== "kl" && mod.kind !== "dh" && mod.kind !== "dl")
|
|
65
187
|
continue;
|
|
66
188
|
const n = mod.value ?? 1;
|
|
67
189
|
switch (mod.kind) {
|
|
@@ -79,7 +201,30 @@ function enumerateKeepDrop(node) {
|
|
|
79
201
|
break;
|
|
80
202
|
}
|
|
81
203
|
}
|
|
82
|
-
|
|
204
|
+
// Compute total based on result mode
|
|
205
|
+
let total;
|
|
206
|
+
if (node.resultMode === "success_count") {
|
|
207
|
+
const csMods = node.modifiers.filter((m) => m.kind === "cs_count");
|
|
208
|
+
const cfMods = node.modifiers.filter((m) => m.kind === "cf_count");
|
|
209
|
+
total = 0;
|
|
210
|
+
for (const v of kept) {
|
|
211
|
+
for (const mod of csMods) {
|
|
212
|
+
if (mod.compare && matchesCompare(v, mod.compare)) {
|
|
213
|
+
total++;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
for (const mod of cfMods) {
|
|
218
|
+
if (mod.compare && matchesCompare(v, mod.compare)) {
|
|
219
|
+
total--;
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
total = kept.reduce((a, b) => a + b, 0);
|
|
227
|
+
}
|
|
83
228
|
dist.set(total, (dist.get(total) ?? 0) + prob);
|
|
84
229
|
return;
|
|
85
230
|
}
|
|
@@ -100,34 +245,34 @@ function enumerateKeepDrop(node) {
|
|
|
100
245
|
enumerate(0);
|
|
101
246
|
return dist;
|
|
102
247
|
}
|
|
103
|
-
/** Distribution for exploding dice via iterative depth expansion. */
|
|
104
|
-
function
|
|
248
|
+
/** Distribution for exploding/compounding/penetrating dice via iterative depth expansion. */
|
|
249
|
+
function explosionDistribution(node) {
|
|
105
250
|
if (node.sides === "F")
|
|
106
251
|
return null;
|
|
107
252
|
const s = sideCount(node.sides);
|
|
108
|
-
const explodeMod = node.modifiers.find((m) => m.kind === "explode");
|
|
253
|
+
const explodeMod = node.modifiers.find((m) => m.kind === "explode" || m.kind === "compound" || m.kind === "penetrate");
|
|
109
254
|
if (!explodeMod)
|
|
110
255
|
return null;
|
|
111
|
-
const threshold = explodeMod.value ?? s;
|
|
256
|
+
const threshold = explodeMod.compare?.value ?? s;
|
|
257
|
+
const isCompound = explodeMod.kind === "compound";
|
|
258
|
+
const isPenetrate = explodeMod.kind === "penetrate";
|
|
112
259
|
const maxExplosions = 10;
|
|
113
260
|
function singleExploding() {
|
|
114
261
|
const dist = new Map();
|
|
115
262
|
const pFace = 1 / s;
|
|
116
|
-
// Build depth-by-depth: accumulated tracks (sum → probability) for chains
|
|
117
|
-
// that haven't terminated yet
|
|
118
263
|
let accumulated = new Map([[0, 1]]);
|
|
119
264
|
for (let depth = 0; depth <= maxExplosions; depth++) {
|
|
120
265
|
const nextAccumulated = new Map();
|
|
121
266
|
for (const [accSum, accProb] of accumulated) {
|
|
122
267
|
for (let face = 1; face <= s; face++) {
|
|
123
|
-
|
|
268
|
+
// Penetrating: explosions subtract 1 (min 1) from the new roll
|
|
269
|
+
const effectiveFace = isPenetrate && depth > 0 ? Math.max(1, face - 1) : face;
|
|
270
|
+
const total = accSum + effectiveFace;
|
|
124
271
|
const p = accProb * pFace;
|
|
125
272
|
if (face < threshold || depth === maxExplosions) {
|
|
126
|
-
// Terminating roll (or forced cap)
|
|
127
273
|
dist.set(total, (dist.get(total) ?? 0) + p);
|
|
128
274
|
}
|
|
129
275
|
else {
|
|
130
|
-
// Exploding — carry forward
|
|
131
276
|
nextAccumulated.set(total, (nextAccumulated.get(total) ?? 0) + p);
|
|
132
277
|
}
|
|
133
278
|
}
|
|
@@ -138,14 +283,73 @@ function explodingDistribution(node) {
|
|
|
138
283
|
}
|
|
139
284
|
return dist;
|
|
140
285
|
}
|
|
286
|
+
// For compounding, the distribution shape is the same as exploding
|
|
287
|
+
// (sum of chain of rolls) — the difference is engine-side (one die vs many).
|
|
288
|
+
// The probability distribution is identical.
|
|
141
289
|
const single = singleExploding();
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
290
|
+
return convolveN(single, node.count);
|
|
291
|
+
}
|
|
292
|
+
/** Distribution for simple reroll (no keep/drop, no explode). */
|
|
293
|
+
function rerollDistribution(node) {
|
|
294
|
+
const hasReroll = node.modifiers.some((m) => m.kind === "reroll" || m.kind === "reroll_once");
|
|
295
|
+
if (!hasReroll)
|
|
296
|
+
return null;
|
|
297
|
+
const single = singleDieWithReroll(node.sides, node.modifiers);
|
|
298
|
+
return convolveN(single, node.count);
|
|
299
|
+
}
|
|
300
|
+
/** Distribution for simple min/max (no keep/drop, no explode, no reroll). */
|
|
301
|
+
function minMaxDistribution(node) {
|
|
302
|
+
const hasMinMax = node.modifiers.some((m) => m.kind === "min" || m.kind === "max");
|
|
303
|
+
if (!hasMinMax)
|
|
304
|
+
return null;
|
|
305
|
+
const base = singleDieDistribution(node.sides);
|
|
306
|
+
const clamped = singleDieWithMinMax(base, node.modifiers);
|
|
307
|
+
return convolveN(clamped, node.count);
|
|
308
|
+
}
|
|
309
|
+
/** Distribution for success counting pools (no keep/drop, no explode).
|
|
310
|
+
* Each die independently produces +1 (success), -1 (failure), or 0 (neutral).
|
|
311
|
+
* The distribution is over net count, computed via convolution. */
|
|
312
|
+
function successCountDistribution(node) {
|
|
313
|
+
if (node.resultMode !== "success_count")
|
|
314
|
+
return null;
|
|
315
|
+
const csMods = node.modifiers.filter((m) => m.kind === "cs_count");
|
|
316
|
+
const cfMods = node.modifiers.filter((m) => m.kind === "cf_count");
|
|
317
|
+
if (csMods.length === 0)
|
|
318
|
+
return null;
|
|
319
|
+
// Build single-die distribution accounting for reroll + min/max first
|
|
320
|
+
let baseDist;
|
|
321
|
+
const hasReroll = node.modifiers.some((m) => m.kind === "reroll" || m.kind === "reroll_once");
|
|
322
|
+
if (hasReroll) {
|
|
323
|
+
baseDist = singleDieWithReroll(node.sides, node.modifiers);
|
|
145
324
|
}
|
|
146
|
-
|
|
325
|
+
else {
|
|
326
|
+
baseDist = singleDieDistribution(node.sides);
|
|
327
|
+
}
|
|
328
|
+
const hasMinMax = node.modifiers.some((m) => m.kind === "min" || m.kind === "max");
|
|
329
|
+
if (hasMinMax) {
|
|
330
|
+
baseDist = singleDieWithMinMax(baseDist, node.modifiers);
|
|
331
|
+
}
|
|
332
|
+
// Map each face to its contribution: +1 (success), -1 (failure), or 0
|
|
333
|
+
const outcomeDist = new Map();
|
|
334
|
+
for (const [face, prob] of baseDist) {
|
|
335
|
+
let contribution = 0;
|
|
336
|
+
for (const mod of csMods) {
|
|
337
|
+
if (mod.compare && matchesCompare(face, mod.compare)) {
|
|
338
|
+
contribution++;
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
for (const mod of cfMods) {
|
|
343
|
+
if (mod.compare && matchesCompare(face, mod.compare)) {
|
|
344
|
+
contribution--;
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
outcomeDist.set(contribution, (outcomeDist.get(contribution) ?? 0) + prob);
|
|
349
|
+
}
|
|
350
|
+
return convolveN(outcomeDist, node.count);
|
|
147
351
|
}
|
|
148
|
-
|
|
352
|
+
// ─── Distribution algebra ────────────────────────────────────────────────────
|
|
149
353
|
function shiftDistribution(dist, offset) {
|
|
150
354
|
const result = new Map();
|
|
151
355
|
for (const [v, p] of dist) {
|
|
@@ -153,16 +357,14 @@ function shiftDistribution(dist, offset) {
|
|
|
153
357
|
}
|
|
154
358
|
return result;
|
|
155
359
|
}
|
|
156
|
-
/** Scale distribution by constant. */
|
|
157
360
|
function scaleDistribution(dist, factor) {
|
|
158
361
|
const result = new Map();
|
|
159
362
|
for (const [v, p] of dist) {
|
|
160
|
-
const scaled =
|
|
363
|
+
const scaled = v * factor;
|
|
161
364
|
result.set(scaled, (result.get(scaled) ?? 0) + p);
|
|
162
365
|
}
|
|
163
366
|
return result;
|
|
164
367
|
}
|
|
165
|
-
/** Floor-divide distribution by constant. */
|
|
166
368
|
function divideDistribution(dist, divisor) {
|
|
167
369
|
if (divisor === 0)
|
|
168
370
|
return new Map([[0, 1]]);
|
|
@@ -173,6 +375,7 @@ function divideDistribution(dist, divisor) {
|
|
|
173
375
|
}
|
|
174
376
|
return result;
|
|
175
377
|
}
|
|
378
|
+
// ─── Main entry ──────────────────────────────────────────────────────────────
|
|
176
379
|
/** Compute the full probability distribution for an AST. Falls back to Monte Carlo for complex cases. */
|
|
177
380
|
export function computeDistribution(ast) {
|
|
178
381
|
const result = tryExact(ast);
|
|
@@ -186,14 +389,31 @@ function tryExact(node) {
|
|
|
186
389
|
return new Map([[node.value, 1]]);
|
|
187
390
|
case "dice": {
|
|
188
391
|
const hasKeepDrop = node.modifiers.some((m) => m.kind === "kh" || m.kind === "kl" || m.kind === "dh" || m.kind === "dl");
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
392
|
+
const hasExplosion = node.modifiers.some((m) => m.kind === "explode" || m.kind === "compound" || m.kind === "penetrate");
|
|
393
|
+
const hasReroll = node.modifiers.some((m) => m.kind === "reroll" || m.kind === "reroll_once");
|
|
394
|
+
const hasMinMax = node.modifiers.some((m) => m.kind === "min" || m.kind === "max");
|
|
395
|
+
const isSuccessCount = node.resultMode === "success_count";
|
|
396
|
+
// Success counting pool (no keep/drop, no explosion)
|
|
397
|
+
if (isSuccessCount && !hasKeepDrop && !hasExplosion) {
|
|
398
|
+
return successCountDistribution(node);
|
|
192
399
|
}
|
|
400
|
+
// Keep/drop present — full enumeration (handles reroll + min/max internally)
|
|
193
401
|
if (hasKeepDrop) {
|
|
194
402
|
return enumerateKeepDrop(node);
|
|
195
403
|
}
|
|
196
|
-
//
|
|
404
|
+
// Explosion variants (no keep/drop)
|
|
405
|
+
if (hasExplosion) {
|
|
406
|
+
return explosionDistribution(node);
|
|
407
|
+
}
|
|
408
|
+
// Reroll (no keep/drop, no explosion)
|
|
409
|
+
if (hasReroll) {
|
|
410
|
+
return rerollDistribution(node);
|
|
411
|
+
}
|
|
412
|
+
// Min/max (no keep/drop, no explosion, no reroll)
|
|
413
|
+
if (hasMinMax) {
|
|
414
|
+
return minMaxDistribution(node);
|
|
415
|
+
}
|
|
416
|
+
// Plain NdM
|
|
197
417
|
return convolveDice(node.count, node.sides);
|
|
198
418
|
}
|
|
199
419
|
case "binary": {
|
|
@@ -201,7 +421,6 @@ function tryExact(node) {
|
|
|
201
421
|
const right = tryExact(node.right);
|
|
202
422
|
if (!left || !right)
|
|
203
423
|
return null;
|
|
204
|
-
// Optimize: if one side is a constant
|
|
205
424
|
if (right.size === 1) {
|
|
206
425
|
const [rv] = [...right.keys()];
|
|
207
426
|
switch (node.op) {
|
|
@@ -221,24 +440,21 @@ function tryExact(node) {
|
|
|
221
440
|
case "+":
|
|
222
441
|
return shiftDistribution(right, lv);
|
|
223
442
|
case "-": {
|
|
224
|
-
// lv - right → negate right, shift by lv
|
|
225
443
|
const negated = scaleDistribution(right, -1);
|
|
226
444
|
return shiftDistribution(negated, lv);
|
|
227
445
|
}
|
|
228
446
|
case "*":
|
|
229
447
|
return scaleDistribution(right, lv);
|
|
230
448
|
case "/":
|
|
231
|
-
return null;
|
|
449
|
+
return null;
|
|
232
450
|
}
|
|
233
451
|
}
|
|
234
|
-
// Both sides are distributions — convolve for +/-, fall back for */÷
|
|
235
452
|
if (node.op === "+")
|
|
236
453
|
return convolve(left, right);
|
|
237
454
|
if (node.op === "-") {
|
|
238
455
|
const negated = scaleDistribution(right, -1);
|
|
239
456
|
return convolve(left, negated);
|
|
240
457
|
}
|
|
241
|
-
// Multiplication/division of two distributions — Monte Carlo
|
|
242
458
|
return null;
|
|
243
459
|
}
|
|
244
460
|
case "unary_minus": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/analyze/distribution.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/analyze/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { JsonRpcRequest, JsonRpcResponse } from "./protocol.js";
|
|
2
|
+
export declare class BridgeHandler {
|
|
3
|
+
private rng;
|
|
4
|
+
private tables;
|
|
5
|
+
/** Set a deterministic seed for all subsequent rolls. */
|
|
6
|
+
setSeed(seed: number): void;
|
|
7
|
+
/** Reset to cryptographic RNG. */
|
|
8
|
+
resetRng(): void;
|
|
9
|
+
/** Parse a raw JSON string into a request and handle it. */
|
|
10
|
+
handleRaw(raw: string): JsonRpcResponse;
|
|
11
|
+
/** Handle a parsed JSON-RPC request. */
|
|
12
|
+
handle(request: JsonRpcRequest): JsonRpcResponse;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/bridge/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAShB,MAAM,eAAe,CAAC;AAiBvB,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,MAAM,CAA0C;IAExD,yDAAyD;IACzD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,kCAAkC;IAClC,QAAQ,IAAI,IAAI;IAIhB,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IAmBvC,wCAAwC;IACxC,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe;CAiIjD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { RPC_METHOD_NOT_FOUND, RPC_INVALID_PARAMS, RPC_INTERNAL_ERROR, RPC_PARSE_ERROR, RPC_INVALID_REQUEST, } from "./protocol.js";
|
|
2
|
+
import { parse } from "../parser/parser.js";
|
|
3
|
+
import { evaluate } from "../engine/roller.js";
|
|
4
|
+
import { computeDistribution } from "../analyze/distribution.js";
|
|
5
|
+
import { computeStats, probabilityAtLeast } from "../analyze/stats.js";
|
|
6
|
+
import { cryptoRng, seededRng } from "../engine/random.js";
|
|
7
|
+
import { rollGameTable } from "../tables/engine.js";
|
|
8
|
+
export class BridgeHandler {
|
|
9
|
+
rng = cryptoRng;
|
|
10
|
+
tables = new Map();
|
|
11
|
+
/** Set a deterministic seed for all subsequent rolls. */
|
|
12
|
+
setSeed(seed) {
|
|
13
|
+
this.rng = seededRng(seed);
|
|
14
|
+
}
|
|
15
|
+
/** Reset to cryptographic RNG. */
|
|
16
|
+
resetRng() {
|
|
17
|
+
this.rng = cryptoRng;
|
|
18
|
+
}
|
|
19
|
+
/** Parse a raw JSON string into a request and handle it. */
|
|
20
|
+
handleRaw(raw) {
|
|
21
|
+
let request;
|
|
22
|
+
try {
|
|
23
|
+
request = JSON.parse(raw);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { jsonrpc: "2.0", id: 0, error: { code: RPC_PARSE_ERROR, message: "Parse error" } };
|
|
27
|
+
}
|
|
28
|
+
if (!request.jsonrpc || request.jsonrpc !== "2.0" || !request.method || request.id === undefined) {
|
|
29
|
+
return {
|
|
30
|
+
jsonrpc: "2.0",
|
|
31
|
+
id: request.id ?? 0,
|
|
32
|
+
error: { code: RPC_INVALID_REQUEST, message: "Invalid request" },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return this.handle(request);
|
|
36
|
+
}
|
|
37
|
+
/** Handle a parsed JSON-RPC request. */
|
|
38
|
+
handle(request) {
|
|
39
|
+
const { id, method, params } = request;
|
|
40
|
+
try {
|
|
41
|
+
switch (method) {
|
|
42
|
+
case "ping":
|
|
43
|
+
return ok(id, { ok: true });
|
|
44
|
+
case "shutdown":
|
|
45
|
+
return ok(id, { shutdown: true });
|
|
46
|
+
case "seed": {
|
|
47
|
+
const p = params;
|
|
48
|
+
if (typeof p?.seed !== "number") {
|
|
49
|
+
return err(id, RPC_INVALID_PARAMS, "Missing seed parameter");
|
|
50
|
+
}
|
|
51
|
+
this.setSeed(p.seed);
|
|
52
|
+
return ok(id, { seeded: true });
|
|
53
|
+
}
|
|
54
|
+
case "roll": {
|
|
55
|
+
const p = params;
|
|
56
|
+
if (!p?.expression) {
|
|
57
|
+
return err(id, RPC_INVALID_PARAMS, "Missing expression parameter");
|
|
58
|
+
}
|
|
59
|
+
const rng = p.seed !== undefined ? seededRng(p.seed) : this.rng;
|
|
60
|
+
const ast = parse(p.expression);
|
|
61
|
+
const result = evaluate(ast, rng);
|
|
62
|
+
result.expression = p.expression;
|
|
63
|
+
return ok(id, result);
|
|
64
|
+
}
|
|
65
|
+
case "roll_batch": {
|
|
66
|
+
const p = params;
|
|
67
|
+
if (!p?.expressions || !Array.isArray(p.expressions)) {
|
|
68
|
+
return err(id, RPC_INVALID_PARAMS, "Missing expressions array");
|
|
69
|
+
}
|
|
70
|
+
const rng = p.seed !== undefined ? seededRng(p.seed) : this.rng;
|
|
71
|
+
const results = p.expressions.map((expr) => {
|
|
72
|
+
const ast = parse(expr);
|
|
73
|
+
const result = evaluate(ast, rng);
|
|
74
|
+
result.expression = expr;
|
|
75
|
+
return result;
|
|
76
|
+
});
|
|
77
|
+
return ok(id, results);
|
|
78
|
+
}
|
|
79
|
+
case "analyze": {
|
|
80
|
+
const p = params;
|
|
81
|
+
if (!p?.expression) {
|
|
82
|
+
return err(id, RPC_INVALID_PARAMS, "Missing expression parameter");
|
|
83
|
+
}
|
|
84
|
+
const ast = parse(p.expression);
|
|
85
|
+
const dist = computeDistribution(ast);
|
|
86
|
+
const stats = computeStats(dist);
|
|
87
|
+
// Convert Map to array of tuples for JSON serialization
|
|
88
|
+
const distribution = [...dist.entries()].sort((a, b) => a[0] - b[0]);
|
|
89
|
+
return ok(id, { stats, distribution });
|
|
90
|
+
}
|
|
91
|
+
case "at_least": {
|
|
92
|
+
const p = params;
|
|
93
|
+
if (!p?.expression || typeof p?.target !== "number") {
|
|
94
|
+
return err(id, RPC_INVALID_PARAMS, "Missing expression or target parameter");
|
|
95
|
+
}
|
|
96
|
+
const ast = parse(p.expression);
|
|
97
|
+
const dist = computeDistribution(ast);
|
|
98
|
+
const probability = probabilityAtLeast(dist, p.target);
|
|
99
|
+
return ok(id, { probability, target: p.target });
|
|
100
|
+
}
|
|
101
|
+
case "compare": {
|
|
102
|
+
const p = params;
|
|
103
|
+
if (!p?.expressions || p.expressions.length !== 2) {
|
|
104
|
+
return err(id, RPC_INVALID_PARAMS, "Need exactly 2 expressions");
|
|
105
|
+
}
|
|
106
|
+
const results = p.expressions.map((expr) => {
|
|
107
|
+
const ast = parse(expr);
|
|
108
|
+
const dist = computeDistribution(ast);
|
|
109
|
+
return { expression: expr, stats: computeStats(dist) };
|
|
110
|
+
});
|
|
111
|
+
return ok(id, results);
|
|
112
|
+
}
|
|
113
|
+
case "table_load": {
|
|
114
|
+
const p = params;
|
|
115
|
+
if (!p?.collection) {
|
|
116
|
+
return err(id, RPC_INVALID_PARAMS, "Missing collection parameter");
|
|
117
|
+
}
|
|
118
|
+
const collection = p.collection;
|
|
119
|
+
// Index by each table name
|
|
120
|
+
for (const table of collection.tables) {
|
|
121
|
+
this.tables.set(table.table, collection);
|
|
122
|
+
}
|
|
123
|
+
return ok(id, {
|
|
124
|
+
loaded: collection.tables.map((t) => t.table),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
case "table_list": {
|
|
128
|
+
return ok(id, { tables: [...this.tables.keys()] });
|
|
129
|
+
}
|
|
130
|
+
case "table_roll": {
|
|
131
|
+
const p = params;
|
|
132
|
+
if (!p?.table) {
|
|
133
|
+
return err(id, RPC_INVALID_PARAMS, "Missing table parameter");
|
|
134
|
+
}
|
|
135
|
+
const collection = this.tables.get(p.table);
|
|
136
|
+
if (!collection) {
|
|
137
|
+
return err(id, RPC_INVALID_PARAMS, `Table "${p.table}" not loaded`);
|
|
138
|
+
}
|
|
139
|
+
const context = (p.context ?? {});
|
|
140
|
+
const count = p.count ?? 1;
|
|
141
|
+
const results = [];
|
|
142
|
+
for (let i = 0; i < count; i++) {
|
|
143
|
+
results.push(...rollGameTable(collection, p.table, context, this.rng));
|
|
144
|
+
}
|
|
145
|
+
return ok(id, results);
|
|
146
|
+
}
|
|
147
|
+
default:
|
|
148
|
+
return err(id, RPC_METHOD_NOT_FOUND, `Unknown method: ${method}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
153
|
+
return err(id, RPC_INTERNAL_ERROR, message);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function ok(id, result) {
|
|
158
|
+
return { jsonrpc: "2.0", id, result };
|
|
159
|
+
}
|
|
160
|
+
function err(id, code, message) {
|
|
161
|
+
return { jsonrpc: "2.0", id, error: { code, message } };
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=handler.js.map
|