@swrpg-online/dice 1.3.0 → 1.4.1
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 +54 -5
- package/dist/bundle.cjs.js +1 -1
- package/dist/bundle.cjs.js.map +1 -1
- package/dist/bundle.esm.js +1 -1
- package/dist/bundle.esm.js.map +1 -1
- package/dist/bundle.umd.js +1 -1
- package/dist/bundle.umd.js.map +1 -1
- package/dist/cli.js +127 -1
- package/dist/dice.js +184 -487
- package/dist/diceFaces.d.ts +17 -0
- package/dist/diceFaces.js +90 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +13 -1
- package/dist/pools.d.ts +31 -4
- package/dist/pools.js +34 -5
- package/dist/types.d.ts +29 -0
- package/package.json +2 -2
package/dist/dice.js
CHANGED
|
@@ -2,495 +2,167 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.roll = exports.DEFAULT_MAX_TOTAL_DICE = exports.DEFAULT_MAX_DICE_PER_TYPE = void 0;
|
|
4
4
|
const hints_1 = require("./hints");
|
|
5
|
+
const diceFaces_1 = require("./diceFaces");
|
|
5
6
|
// Default dice limits for performance and security
|
|
6
7
|
exports.DEFAULT_MAX_DICE_PER_TYPE = 100;
|
|
7
8
|
exports.DEFAULT_MAX_TOTAL_DICE = 500;
|
|
8
9
|
const rollDie = (sides) => Math.floor(Math.random() * sides) + 1;
|
|
9
10
|
const boostDieResult = (roll) => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
};
|
|
22
|
-
case 4:
|
|
23
|
-
return {
|
|
24
|
-
successes: 1,
|
|
25
|
-
failures: 0,
|
|
26
|
-
advantages: 1,
|
|
27
|
-
threats: 0,
|
|
28
|
-
triumphs: 0,
|
|
29
|
-
despair: 0,
|
|
30
|
-
lightSide: 0,
|
|
31
|
-
darkSide: 0,
|
|
32
|
-
};
|
|
33
|
-
case 5:
|
|
34
|
-
return {
|
|
35
|
-
successes: 0,
|
|
36
|
-
failures: 0,
|
|
37
|
-
advantages: 2,
|
|
38
|
-
threats: 0,
|
|
39
|
-
triumphs: 0,
|
|
40
|
-
despair: 0,
|
|
41
|
-
lightSide: 0,
|
|
42
|
-
darkSide: 0,
|
|
43
|
-
};
|
|
44
|
-
case 6:
|
|
45
|
-
return {
|
|
46
|
-
successes: 0,
|
|
47
|
-
failures: 0,
|
|
48
|
-
advantages: 1,
|
|
49
|
-
threats: 0,
|
|
50
|
-
triumphs: 0,
|
|
51
|
-
despair: 0,
|
|
52
|
-
lightSide: 0,
|
|
53
|
-
darkSide: 0,
|
|
54
|
-
};
|
|
55
|
-
default:
|
|
56
|
-
return {
|
|
57
|
-
successes: 0,
|
|
58
|
-
failures: 0,
|
|
59
|
-
advantages: 0,
|
|
60
|
-
threats: 0,
|
|
61
|
-
triumphs: 0,
|
|
62
|
-
despair: 0,
|
|
63
|
-
lightSide: 0,
|
|
64
|
-
darkSide: 0,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
11
|
+
const face = diceFaces_1.BOOST_DIE_FACES[roll];
|
|
12
|
+
return {
|
|
13
|
+
successes: face.successes || 0,
|
|
14
|
+
failures: face.failures || 0,
|
|
15
|
+
advantages: face.advantages || 0,
|
|
16
|
+
threats: face.threats || 0,
|
|
17
|
+
triumphs: face.triumphs || 0,
|
|
18
|
+
despair: face.despairs || 0,
|
|
19
|
+
lightSide: face.lightSide || 0,
|
|
20
|
+
darkSide: face.darkSide || 0,
|
|
21
|
+
};
|
|
67
22
|
};
|
|
68
23
|
const setBackDieResult = (roll) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
darkSide: 0,
|
|
81
|
-
};
|
|
82
|
-
case 5:
|
|
83
|
-
case 6:
|
|
84
|
-
return {
|
|
85
|
-
successes: 0,
|
|
86
|
-
failures: 0,
|
|
87
|
-
advantages: 0,
|
|
88
|
-
threats: 1,
|
|
89
|
-
triumphs: 0,
|
|
90
|
-
despair: 0,
|
|
91
|
-
lightSide: 0,
|
|
92
|
-
darkSide: 0,
|
|
93
|
-
};
|
|
94
|
-
default:
|
|
95
|
-
return {
|
|
96
|
-
successes: 0,
|
|
97
|
-
failures: 0,
|
|
98
|
-
advantages: 0,
|
|
99
|
-
threats: 0,
|
|
100
|
-
triumphs: 0,
|
|
101
|
-
despair: 0,
|
|
102
|
-
lightSide: 0,
|
|
103
|
-
darkSide: 0,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
24
|
+
const face = diceFaces_1.SETBACK_DIE_FACES[roll];
|
|
25
|
+
return {
|
|
26
|
+
successes: face.successes || 0,
|
|
27
|
+
failures: face.failures || 0,
|
|
28
|
+
advantages: face.advantages || 0,
|
|
29
|
+
threats: face.threats || 0,
|
|
30
|
+
triumphs: face.triumphs || 0,
|
|
31
|
+
despair: face.despairs || 0,
|
|
32
|
+
lightSide: face.lightSide || 0,
|
|
33
|
+
darkSide: face.darkSide || 0,
|
|
34
|
+
};
|
|
106
35
|
};
|
|
107
36
|
const abilityDieResult = (roll) => {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
darkSide: 0,
|
|
120
|
-
};
|
|
121
|
-
case 4:
|
|
122
|
-
return {
|
|
123
|
-
successes: 2,
|
|
124
|
-
failures: 0,
|
|
125
|
-
advantages: 0,
|
|
126
|
-
threats: 0,
|
|
127
|
-
triumphs: 0,
|
|
128
|
-
despair: 0,
|
|
129
|
-
lightSide: 0,
|
|
130
|
-
darkSide: 0,
|
|
131
|
-
};
|
|
132
|
-
case 5:
|
|
133
|
-
case 6:
|
|
134
|
-
return {
|
|
135
|
-
successes: 0,
|
|
136
|
-
failures: 0,
|
|
137
|
-
advantages: 1,
|
|
138
|
-
threats: 0,
|
|
139
|
-
triumphs: 0,
|
|
140
|
-
despair: 0,
|
|
141
|
-
lightSide: 0,
|
|
142
|
-
darkSide: 0,
|
|
143
|
-
};
|
|
144
|
-
case 7:
|
|
145
|
-
return {
|
|
146
|
-
successes: 1,
|
|
147
|
-
failures: 0,
|
|
148
|
-
advantages: 1,
|
|
149
|
-
threats: 0,
|
|
150
|
-
triumphs: 0,
|
|
151
|
-
despair: 0,
|
|
152
|
-
lightSide: 0,
|
|
153
|
-
darkSide: 0,
|
|
154
|
-
};
|
|
155
|
-
case 8:
|
|
156
|
-
return {
|
|
157
|
-
successes: 0,
|
|
158
|
-
failures: 0,
|
|
159
|
-
advantages: 2,
|
|
160
|
-
threats: 0,
|
|
161
|
-
triumphs: 0,
|
|
162
|
-
despair: 0,
|
|
163
|
-
lightSide: 0,
|
|
164
|
-
darkSide: 0,
|
|
165
|
-
};
|
|
166
|
-
default:
|
|
167
|
-
return {
|
|
168
|
-
successes: 0,
|
|
169
|
-
failures: 0,
|
|
170
|
-
advantages: 0,
|
|
171
|
-
threats: 0,
|
|
172
|
-
triumphs: 0,
|
|
173
|
-
despair: 0,
|
|
174
|
-
lightSide: 0,
|
|
175
|
-
darkSide: 0,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
37
|
+
const face = diceFaces_1.ABILITY_DIE_FACES[roll];
|
|
38
|
+
return {
|
|
39
|
+
successes: face.successes || 0,
|
|
40
|
+
failures: face.failures || 0,
|
|
41
|
+
advantages: face.advantages || 0,
|
|
42
|
+
threats: face.threats || 0,
|
|
43
|
+
triumphs: face.triumphs || 0,
|
|
44
|
+
despair: face.despairs || 0,
|
|
45
|
+
lightSide: face.lightSide || 0,
|
|
46
|
+
darkSide: face.darkSide || 0,
|
|
47
|
+
};
|
|
178
48
|
};
|
|
179
49
|
const difficultyDieResult = (roll) => {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
};
|
|
192
|
-
case 3:
|
|
193
|
-
return {
|
|
194
|
-
successes: 0,
|
|
195
|
-
failures: 2,
|
|
196
|
-
advantages: 0,
|
|
197
|
-
threats: 0,
|
|
198
|
-
triumphs: 0,
|
|
199
|
-
despair: 0,
|
|
200
|
-
lightSide: 0,
|
|
201
|
-
darkSide: 0,
|
|
202
|
-
};
|
|
203
|
-
case 4:
|
|
204
|
-
case 5:
|
|
205
|
-
case 6:
|
|
206
|
-
return {
|
|
207
|
-
successes: 0,
|
|
208
|
-
failures: 0,
|
|
209
|
-
advantages: 0,
|
|
210
|
-
threats: 1,
|
|
211
|
-
triumphs: 0,
|
|
212
|
-
despair: 0,
|
|
213
|
-
lightSide: 0,
|
|
214
|
-
darkSide: 0,
|
|
215
|
-
};
|
|
216
|
-
case 7:
|
|
217
|
-
return {
|
|
218
|
-
successes: 0,
|
|
219
|
-
failures: 0,
|
|
220
|
-
advantages: 0,
|
|
221
|
-
threats: 2,
|
|
222
|
-
triumphs: 0,
|
|
223
|
-
despair: 0,
|
|
224
|
-
lightSide: 0,
|
|
225
|
-
darkSide: 0,
|
|
226
|
-
};
|
|
227
|
-
case 8:
|
|
228
|
-
return {
|
|
229
|
-
successes: 0,
|
|
230
|
-
failures: 1,
|
|
231
|
-
advantages: 0,
|
|
232
|
-
threats: 1,
|
|
233
|
-
triumphs: 0,
|
|
234
|
-
despair: 0,
|
|
235
|
-
lightSide: 0,
|
|
236
|
-
darkSide: 0,
|
|
237
|
-
};
|
|
238
|
-
default:
|
|
239
|
-
return {
|
|
240
|
-
successes: 0,
|
|
241
|
-
failures: 0,
|
|
242
|
-
advantages: 0,
|
|
243
|
-
threats: 0,
|
|
244
|
-
triumphs: 0,
|
|
245
|
-
despair: 0,
|
|
246
|
-
lightSide: 0,
|
|
247
|
-
darkSide: 0,
|
|
248
|
-
};
|
|
249
|
-
}
|
|
50
|
+
const face = diceFaces_1.DIFFICULTY_DIE_FACES[roll];
|
|
51
|
+
return {
|
|
52
|
+
successes: face.successes || 0,
|
|
53
|
+
failures: face.failures || 0,
|
|
54
|
+
advantages: face.advantages || 0,
|
|
55
|
+
threats: face.threats || 0,
|
|
56
|
+
triumphs: face.triumphs || 0,
|
|
57
|
+
despair: face.despairs || 0,
|
|
58
|
+
lightSide: face.lightSide || 0,
|
|
59
|
+
darkSide: face.darkSide || 0,
|
|
60
|
+
};
|
|
250
61
|
};
|
|
251
62
|
const proficiencyDieResult = (roll) => {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
darkSide: 0,
|
|
264
|
-
};
|
|
265
|
-
case 4:
|
|
266
|
-
case 5:
|
|
267
|
-
return {
|
|
268
|
-
successes: 2,
|
|
269
|
-
failures: 0,
|
|
270
|
-
advantages: 0,
|
|
271
|
-
threats: 0,
|
|
272
|
-
triumphs: 0,
|
|
273
|
-
despair: 0,
|
|
274
|
-
lightSide: 0,
|
|
275
|
-
darkSide: 0,
|
|
276
|
-
};
|
|
277
|
-
case 6:
|
|
278
|
-
return {
|
|
279
|
-
successes: 0,
|
|
280
|
-
failures: 0,
|
|
281
|
-
advantages: 1,
|
|
282
|
-
threats: 0,
|
|
283
|
-
triumphs: 0,
|
|
284
|
-
despair: 0,
|
|
285
|
-
lightSide: 0,
|
|
286
|
-
darkSide: 0,
|
|
287
|
-
};
|
|
288
|
-
case 7:
|
|
289
|
-
case 8:
|
|
290
|
-
case 9:
|
|
291
|
-
return {
|
|
292
|
-
successes: 1,
|
|
293
|
-
failures: 0,
|
|
294
|
-
advantages: 1,
|
|
295
|
-
threats: 0,
|
|
296
|
-
triumphs: 0,
|
|
297
|
-
despair: 0,
|
|
298
|
-
lightSide: 0,
|
|
299
|
-
darkSide: 0,
|
|
300
|
-
};
|
|
301
|
-
case 10:
|
|
302
|
-
case 11:
|
|
303
|
-
return {
|
|
304
|
-
successes: 0,
|
|
305
|
-
failures: 0,
|
|
306
|
-
advantages: 2,
|
|
307
|
-
threats: 0,
|
|
308
|
-
triumphs: 0,
|
|
309
|
-
despair: 0,
|
|
310
|
-
lightSide: 0,
|
|
311
|
-
darkSide: 0,
|
|
312
|
-
};
|
|
313
|
-
case 12:
|
|
314
|
-
return {
|
|
315
|
-
successes: 0,
|
|
316
|
-
failures: 0,
|
|
317
|
-
advantages: 0,
|
|
318
|
-
threats: 0,
|
|
319
|
-
triumphs: 1,
|
|
320
|
-
despair: 0,
|
|
321
|
-
lightSide: 0,
|
|
322
|
-
darkSide: 0,
|
|
323
|
-
};
|
|
324
|
-
default:
|
|
325
|
-
return {
|
|
326
|
-
successes: 0,
|
|
327
|
-
failures: 0,
|
|
328
|
-
advantages: 0,
|
|
329
|
-
threats: 0,
|
|
330
|
-
triumphs: 0,
|
|
331
|
-
despair: 0,
|
|
332
|
-
lightSide: 0,
|
|
333
|
-
darkSide: 0,
|
|
334
|
-
};
|
|
335
|
-
}
|
|
63
|
+
const face = diceFaces_1.PROFICIENCY_DIE_FACES[roll];
|
|
64
|
+
return {
|
|
65
|
+
successes: face.successes || 0,
|
|
66
|
+
failures: face.failures || 0,
|
|
67
|
+
advantages: face.advantages || 0,
|
|
68
|
+
threats: face.threats || 0,
|
|
69
|
+
triumphs: face.triumphs || 0,
|
|
70
|
+
despair: face.despairs || 0,
|
|
71
|
+
lightSide: face.lightSide || 0,
|
|
72
|
+
darkSide: face.darkSide || 0,
|
|
73
|
+
};
|
|
336
74
|
};
|
|
337
75
|
const challengeDieResult = (roll) => {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
darkSide: 0,
|
|
350
|
-
};
|
|
351
|
-
case 4:
|
|
352
|
-
case 5:
|
|
353
|
-
return {
|
|
354
|
-
successes: 0,
|
|
355
|
-
failures: 2,
|
|
356
|
-
advantages: 0,
|
|
357
|
-
threats: 0,
|
|
358
|
-
triumphs: 0,
|
|
359
|
-
despair: 0,
|
|
360
|
-
lightSide: 0,
|
|
361
|
-
darkSide: 0,
|
|
362
|
-
};
|
|
363
|
-
case 6:
|
|
364
|
-
case 7:
|
|
365
|
-
return {
|
|
366
|
-
successes: 0,
|
|
367
|
-
failures: 0,
|
|
368
|
-
advantages: 0,
|
|
369
|
-
threats: 1,
|
|
370
|
-
triumphs: 0,
|
|
371
|
-
despair: 0,
|
|
372
|
-
lightSide: 0,
|
|
373
|
-
darkSide: 0,
|
|
374
|
-
};
|
|
375
|
-
case 8:
|
|
376
|
-
case 9:
|
|
377
|
-
return {
|
|
378
|
-
successes: 0,
|
|
379
|
-
failures: 1,
|
|
380
|
-
advantages: 0,
|
|
381
|
-
threats: 1,
|
|
382
|
-
triumphs: 0,
|
|
383
|
-
despair: 0,
|
|
384
|
-
lightSide: 0,
|
|
385
|
-
darkSide: 0,
|
|
386
|
-
};
|
|
387
|
-
case 10:
|
|
388
|
-
case 11:
|
|
389
|
-
return {
|
|
390
|
-
successes: 0,
|
|
391
|
-
failures: 0,
|
|
392
|
-
advantages: 0,
|
|
393
|
-
threats: 2,
|
|
394
|
-
triumphs: 0,
|
|
395
|
-
despair: 0,
|
|
396
|
-
lightSide: 0,
|
|
397
|
-
darkSide: 0,
|
|
398
|
-
};
|
|
399
|
-
case 12:
|
|
400
|
-
return {
|
|
401
|
-
successes: 0,
|
|
402
|
-
failures: 0,
|
|
403
|
-
advantages: 0,
|
|
404
|
-
threats: 0,
|
|
405
|
-
triumphs: 0,
|
|
406
|
-
despair: 1,
|
|
407
|
-
lightSide: 0,
|
|
408
|
-
darkSide: 0,
|
|
409
|
-
};
|
|
410
|
-
default:
|
|
411
|
-
return {
|
|
412
|
-
successes: 0,
|
|
413
|
-
failures: 0,
|
|
414
|
-
advantages: 0,
|
|
415
|
-
threats: 0,
|
|
416
|
-
triumphs: 0,
|
|
417
|
-
despair: 0,
|
|
418
|
-
lightSide: 0,
|
|
419
|
-
darkSide: 0,
|
|
420
|
-
};
|
|
421
|
-
}
|
|
76
|
+
const face = diceFaces_1.CHALLENGE_DIE_FACES[roll];
|
|
77
|
+
return {
|
|
78
|
+
successes: face.successes || 0,
|
|
79
|
+
failures: face.failures || 0,
|
|
80
|
+
advantages: face.advantages || 0,
|
|
81
|
+
threats: face.threats || 0,
|
|
82
|
+
triumphs: face.triumphs || 0,
|
|
83
|
+
despair: face.despairs || 0,
|
|
84
|
+
lightSide: face.lightSide || 0,
|
|
85
|
+
darkSide: face.darkSide || 0,
|
|
86
|
+
};
|
|
422
87
|
};
|
|
423
88
|
const forceDieResult = (roll) => {
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
threats: 0,
|
|
461
|
-
triumphs: 0,
|
|
462
|
-
despair: 0,
|
|
463
|
-
lightSide: 0,
|
|
464
|
-
darkSide: 1,
|
|
465
|
-
};
|
|
466
|
-
case 12:
|
|
467
|
-
return {
|
|
468
|
-
successes: 0,
|
|
469
|
-
failures: 0,
|
|
470
|
-
advantages: 0,
|
|
471
|
-
threats: 0,
|
|
472
|
-
triumphs: 0,
|
|
473
|
-
despair: 0,
|
|
474
|
-
lightSide: 0,
|
|
475
|
-
darkSide: 2,
|
|
476
|
-
};
|
|
477
|
-
default:
|
|
478
|
-
return {
|
|
479
|
-
successes: 0,
|
|
480
|
-
failures: 0,
|
|
481
|
-
advantages: 0,
|
|
482
|
-
threats: 0,
|
|
483
|
-
triumphs: 0,
|
|
484
|
-
despair: 0,
|
|
485
|
-
lightSide: 0,
|
|
486
|
-
darkSide: 0,
|
|
487
|
-
};
|
|
89
|
+
const face = diceFaces_1.FORCE_DIE_FACES[roll];
|
|
90
|
+
return {
|
|
91
|
+
successes: face.successes || 0,
|
|
92
|
+
failures: face.failures || 0,
|
|
93
|
+
advantages: face.advantages || 0,
|
|
94
|
+
threats: face.threats || 0,
|
|
95
|
+
triumphs: face.triumphs || 0,
|
|
96
|
+
despair: face.despairs || 0,
|
|
97
|
+
lightSide: face.lightSide || 0,
|
|
98
|
+
darkSide: face.darkSide || 0,
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Applies dice upgrades and downgrades to a pool.
|
|
103
|
+
* Upgrades are applied first, then downgrades.
|
|
104
|
+
*
|
|
105
|
+
* @param pool - The dice pool to modify
|
|
106
|
+
* @returns A new dice pool with upgrades/downgrades applied
|
|
107
|
+
*/
|
|
108
|
+
const applyDiceModifications = (pool) => {
|
|
109
|
+
const modifiedPool = { ...pool };
|
|
110
|
+
// Apply upgrades first (per game rules)
|
|
111
|
+
if (pool.upgradeAbility && pool.upgradeAbility > 0) {
|
|
112
|
+
let upgradesToApply = pool.upgradeAbility;
|
|
113
|
+
const currentAbility = modifiedPool.abilityDice || 0;
|
|
114
|
+
// Upgrade existing ability dice to proficiency
|
|
115
|
+
const upgradedDice = Math.min(currentAbility, upgradesToApply);
|
|
116
|
+
modifiedPool.abilityDice = currentAbility - upgradedDice;
|
|
117
|
+
modifiedPool.proficiencyDice =
|
|
118
|
+
(modifiedPool.proficiencyDice || 0) + upgradedDice;
|
|
119
|
+
upgradesToApply -= upgradedDice;
|
|
120
|
+
// Add remaining upgrades as new proficiency dice
|
|
121
|
+
if (upgradesToApply > 0) {
|
|
122
|
+
modifiedPool.proficiencyDice =
|
|
123
|
+
(modifiedPool.proficiencyDice || 0) + upgradesToApply;
|
|
124
|
+
}
|
|
488
125
|
}
|
|
126
|
+
if (pool.upgradeDifficulty && pool.upgradeDifficulty > 0) {
|
|
127
|
+
let upgradesToApply = pool.upgradeDifficulty;
|
|
128
|
+
const currentDifficulty = modifiedPool.difficultyDice || 0;
|
|
129
|
+
// Upgrade existing difficulty dice to challenge
|
|
130
|
+
const upgradedDice = Math.min(currentDifficulty, upgradesToApply);
|
|
131
|
+
modifiedPool.difficultyDice = currentDifficulty - upgradedDice;
|
|
132
|
+
modifiedPool.challengeDice =
|
|
133
|
+
(modifiedPool.challengeDice || 0) + upgradedDice;
|
|
134
|
+
upgradesToApply -= upgradedDice;
|
|
135
|
+
// Add remaining upgrades as new challenge dice
|
|
136
|
+
if (upgradesToApply > 0) {
|
|
137
|
+
modifiedPool.challengeDice =
|
|
138
|
+
(modifiedPool.challengeDice || 0) + upgradesToApply;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Apply downgrades after upgrades
|
|
142
|
+
if (pool.downgradeProficiency && pool.downgradeProficiency > 0) {
|
|
143
|
+
const currentProficiency = modifiedPool.proficiencyDice || 0;
|
|
144
|
+
const downgradesToApply = Math.min(currentProficiency, pool.downgradeProficiency);
|
|
145
|
+
// Downgrade proficiency dice to ability dice
|
|
146
|
+
modifiedPool.proficiencyDice = currentProficiency - downgradesToApply;
|
|
147
|
+
modifiedPool.abilityDice =
|
|
148
|
+
(modifiedPool.abilityDice || 0) + downgradesToApply;
|
|
149
|
+
// Excess downgrades are ignored (per requirements)
|
|
150
|
+
}
|
|
151
|
+
if (pool.downgradeChallenge && pool.downgradeChallenge > 0) {
|
|
152
|
+
const currentChallenge = modifiedPool.challengeDice || 0;
|
|
153
|
+
const downgradesToApply = Math.min(currentChallenge, pool.downgradeChallenge);
|
|
154
|
+
// Downgrade challenge dice to difficulty dice
|
|
155
|
+
modifiedPool.challengeDice = currentChallenge - downgradesToApply;
|
|
156
|
+
modifiedPool.difficultyDice =
|
|
157
|
+
(modifiedPool.difficultyDice || 0) + downgradesToApply;
|
|
158
|
+
// Excess downgrades are ignored (per requirements)
|
|
159
|
+
}
|
|
160
|
+
return modifiedPool;
|
|
489
161
|
};
|
|
490
|
-
const sumResults = (results, options) => {
|
|
162
|
+
const sumResults = (results, automaticSymbols, options) => {
|
|
491
163
|
const sums = results.reduce((acc, curr) => ({
|
|
492
|
-
successes: acc.successes + curr.successes,
|
|
493
|
-
failures: acc.failures + curr.failures,
|
|
164
|
+
successes: acc.successes + curr.successes + curr.triumphs,
|
|
165
|
+
failures: acc.failures + curr.failures + curr.despair,
|
|
494
166
|
advantages: acc.advantages + curr.advantages,
|
|
495
167
|
threats: acc.threats + curr.threats,
|
|
496
168
|
triumphs: acc.triumphs + curr.triumphs,
|
|
@@ -498,14 +170,14 @@ const sumResults = (results, options) => {
|
|
|
498
170
|
lightSide: acc.lightSide + (curr.lightSide || 0),
|
|
499
171
|
darkSide: acc.darkSide + (curr.darkSide || 0),
|
|
500
172
|
}), {
|
|
501
|
-
successes: 0,
|
|
502
|
-
failures: 0,
|
|
503
|
-
advantages: 0,
|
|
504
|
-
threats: 0,
|
|
505
|
-
triumphs: 0,
|
|
506
|
-
despair: 0,
|
|
507
|
-
lightSide: 0,
|
|
508
|
-
darkSide: 0,
|
|
173
|
+
successes: ((automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.successes) || 0) + ((automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.triumphs) || 0),
|
|
174
|
+
failures: ((automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.failures) || 0) + ((automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.despairs) || 0),
|
|
175
|
+
advantages: (automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.advantages) || 0,
|
|
176
|
+
threats: (automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.threats) || 0,
|
|
177
|
+
triumphs: (automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.triumphs) || 0,
|
|
178
|
+
despair: (automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.despairs) || 0,
|
|
179
|
+
lightSide: (automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.lightSide) || 0,
|
|
180
|
+
darkSide: (automaticSymbols === null || automaticSymbols === void 0 ? void 0 : automaticSymbols.darkSide) || 0,
|
|
509
181
|
});
|
|
510
182
|
let netSuccesses = 0;
|
|
511
183
|
let netFailures = 0;
|
|
@@ -519,11 +191,24 @@ const sumResults = (results, options) => {
|
|
|
519
191
|
else {
|
|
520
192
|
netFailures = sums.failures - sums.successes;
|
|
521
193
|
}
|
|
194
|
+
// Advantages and threats cancel each other out
|
|
195
|
+
let netAdvantages = 0;
|
|
196
|
+
let netThreats = 0;
|
|
197
|
+
if (sums.advantages === sums.threats) {
|
|
198
|
+
netAdvantages = 0;
|
|
199
|
+
netThreats = 0;
|
|
200
|
+
}
|
|
201
|
+
else if (sums.advantages > sums.threats) {
|
|
202
|
+
netAdvantages = sums.advantages - sums.threats;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
netThreats = sums.threats - sums.advantages;
|
|
206
|
+
}
|
|
522
207
|
const result = {
|
|
523
208
|
successes: netSuccesses,
|
|
524
209
|
failures: netFailures,
|
|
525
|
-
advantages:
|
|
526
|
-
threats:
|
|
210
|
+
advantages: netAdvantages,
|
|
211
|
+
threats: netThreats,
|
|
527
212
|
triumphs: sums.triumphs,
|
|
528
213
|
despair: sums.despair,
|
|
529
214
|
lightSide: sums.lightSide,
|
|
@@ -545,13 +230,15 @@ const sumResults = (results, options) => {
|
|
|
545
230
|
*/
|
|
546
231
|
const roll = (pool, options) => {
|
|
547
232
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
548
|
-
|
|
549
|
-
const
|
|
550
|
-
const
|
|
551
|
-
const
|
|
552
|
-
const
|
|
553
|
-
const
|
|
554
|
-
const
|
|
233
|
+
// Apply dice modifications (upgrades/downgrades)
|
|
234
|
+
const modifiedPool = applyDiceModifications(pool);
|
|
235
|
+
const boostCount = (_a = modifiedPool.boostDice) !== null && _a !== void 0 ? _a : 0;
|
|
236
|
+
const abilityCount = (_b = modifiedPool.abilityDice) !== null && _b !== void 0 ? _b : 0;
|
|
237
|
+
const proficiencyCount = (_c = modifiedPool.proficiencyDice) !== null && _c !== void 0 ? _c : 0;
|
|
238
|
+
const setBackCount = (_d = modifiedPool.setBackDice) !== null && _d !== void 0 ? _d : 0;
|
|
239
|
+
const difficultyCount = (_e = modifiedPool.difficultyDice) !== null && _e !== void 0 ? _e : 0;
|
|
240
|
+
const challengeCount = (_f = modifiedPool.challengeDice) !== null && _f !== void 0 ? _f : 0;
|
|
241
|
+
const forceCount = (_g = modifiedPool.forceDice) !== null && _g !== void 0 ? _g : 0;
|
|
555
242
|
// Get limits from options or use defaults
|
|
556
243
|
const maxDicePerType = (_h = options === null || options === void 0 ? void 0 : options.maxDicePerType) !== null && _h !== void 0 ? _h : exports.DEFAULT_MAX_DICE_PER_TYPE;
|
|
557
244
|
const maxTotalDice = (_j = options === null || options === void 0 ? void 0 : options.maxTotalDice) !== null && _j !== void 0 ? _j : exports.DEFAULT_MAX_TOTAL_DICE;
|
|
@@ -670,7 +357,17 @@ const roll = (pool, options) => {
|
|
|
670
357
|
result: forceDieResult(roll),
|
|
671
358
|
});
|
|
672
359
|
}
|
|
673
|
-
const
|
|
360
|
+
const automaticSymbols = {
|
|
361
|
+
successes: pool.automaticSuccesses,
|
|
362
|
+
failures: pool.automaticFailures,
|
|
363
|
+
advantages: pool.automaticAdvantages,
|
|
364
|
+
threats: pool.automaticThreats,
|
|
365
|
+
triumphs: pool.automaticTriumphs,
|
|
366
|
+
despairs: pool.automaticDespairs,
|
|
367
|
+
lightSide: pool.automaticLightSide,
|
|
368
|
+
darkSide: pool.automaticDarkSide,
|
|
369
|
+
};
|
|
370
|
+
const summary = sumResults(detailedResults.map((r) => r.result), automaticSymbols, options);
|
|
674
371
|
if (options === null || options === void 0 ? void 0 : options.hints) {
|
|
675
372
|
const applicableHints = hints_1.hints.filter((hint) => {
|
|
676
373
|
const { cost } = hint;
|