@dicelette/core 1.1.4 → 1.2.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/dist/index.d.mts +182 -1
- package/dist/index.d.ts +182 -1
- package/dist/index.js +109 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +103 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -9
package/dist/index.js
CHANGED
@@ -31,6 +31,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
31
31
|
var src_exports = {};
|
32
32
|
__export(src_exports, {
|
33
33
|
COMMENT_REGEX: () => COMMENT_REGEX,
|
34
|
+
DiceTypeError: () => DiceTypeError,
|
35
|
+
EmptyObjectError: () => EmptyObjectError,
|
36
|
+
FormulaError: () => FormulaError,
|
37
|
+
MaxGreater: () => MaxGreater,
|
38
|
+
NoStatisticsError: () => NoStatisticsError,
|
39
|
+
TooManyDice: () => TooManyDice,
|
34
40
|
calculator: () => calculator,
|
35
41
|
cleanedDice: () => cleanedDice,
|
36
42
|
diceRandomParse: () => diceRandomParse,
|
@@ -52,6 +58,66 @@ module.exports = __toCommonJS(src_exports);
|
|
52
58
|
// src/dice.ts
|
53
59
|
var import_rpg_dice_roller = require("@dice-roller/rpg-dice-roller");
|
54
60
|
var import_mathjs = require("mathjs");
|
61
|
+
|
62
|
+
// src/errors.ts
|
63
|
+
var DiceTypeError = class extends Error {
|
64
|
+
dice;
|
65
|
+
cause;
|
66
|
+
method;
|
67
|
+
constructor(dice, cause, method) {
|
68
|
+
super(dice);
|
69
|
+
this.name = "Invalid_Dice_Type";
|
70
|
+
this.dice = dice;
|
71
|
+
this.cause = cause;
|
72
|
+
this.method = method;
|
73
|
+
}
|
74
|
+
};
|
75
|
+
var FormulaError = class extends Error {
|
76
|
+
formula;
|
77
|
+
cause;
|
78
|
+
method;
|
79
|
+
constructor(formula, cause, method) {
|
80
|
+
super(formula);
|
81
|
+
this.name = "Invalid_Formula";
|
82
|
+
this.formula = formula;
|
83
|
+
this.cause = cause;
|
84
|
+
this.method = method;
|
85
|
+
}
|
86
|
+
};
|
87
|
+
var MaxGreater = class extends Error {
|
88
|
+
name;
|
89
|
+
value;
|
90
|
+
max;
|
91
|
+
constructor(value, max) {
|
92
|
+
super(value.toString());
|
93
|
+
this.name = "Max_Greater";
|
94
|
+
this.value = value;
|
95
|
+
this.max = max;
|
96
|
+
}
|
97
|
+
};
|
98
|
+
var EmptyObjectError = class extends Error {
|
99
|
+
name;
|
100
|
+
constructor() {
|
101
|
+
super();
|
102
|
+
this.name = "Empty_Object";
|
103
|
+
}
|
104
|
+
};
|
105
|
+
var TooManyDice = class extends Error {
|
106
|
+
name;
|
107
|
+
constructor() {
|
108
|
+
super();
|
109
|
+
this.name = "Too_Many_Dice";
|
110
|
+
}
|
111
|
+
};
|
112
|
+
var NoStatisticsError = class extends Error {
|
113
|
+
name;
|
114
|
+
constructor() {
|
115
|
+
super();
|
116
|
+
this.name = "No_Statistics";
|
117
|
+
}
|
118
|
+
};
|
119
|
+
|
120
|
+
// src/dice.ts
|
55
121
|
var COMMENT_REGEX = /\s+(#|\/{2}|\[|\/\*)(.*)/;
|
56
122
|
var SIGN_REGEX = /[><=!]+/;
|
57
123
|
var SIGN_REGEX_SPACE = /[><=!]+(\S+)/;
|
@@ -76,7 +142,7 @@ function roll(dice) {
|
|
76
142
|
} else
|
77
143
|
compare = {
|
78
144
|
sign: compareSign,
|
79
|
-
value: parseInt(calc, 10)
|
145
|
+
value: Number.parseInt(calc, 10)
|
80
146
|
};
|
81
147
|
}
|
82
148
|
const modifier = dice.matchAll(/(\+|\-|%|\/|\^|\*|\*{2})(\d+)/gi);
|
@@ -86,7 +152,7 @@ function roll(dice) {
|
|
86
152
|
const sign = modificator.sign;
|
87
153
|
let value = modificator.value;
|
88
154
|
if (sign)
|
89
|
-
value = calculator(sign, value, parseInt(mod[2], 10));
|
155
|
+
value = calculator(sign, value, Number.parseInt(mod[2], 10));
|
90
156
|
modificator = {
|
91
157
|
sign: mod[1],
|
92
158
|
value
|
@@ -94,13 +160,13 @@ function roll(dice) {
|
|
94
160
|
} else {
|
95
161
|
modificator = {
|
96
162
|
sign: mod[1],
|
97
|
-
value: parseInt(mod[2], 10)
|
163
|
+
value: Number.parseInt(mod[2], 10)
|
98
164
|
};
|
99
165
|
}
|
100
166
|
}
|
101
167
|
if (dice.match(/\d+?#(.*)/)) {
|
102
168
|
const diceArray = dice.split("#");
|
103
|
-
const numberOfDice = parseInt(diceArray[0], 10);
|
169
|
+
const numberOfDice = Number.parseInt(diceArray[0], 10);
|
104
170
|
const diceToRoll = diceArray[1].replace(COMMENT_REGEX, "");
|
105
171
|
const commentsMatch = diceArray[1].match(COMMENT_REGEX);
|
106
172
|
const comments = commentsMatch ? commentsMatch[2] : void 0;
|
@@ -109,7 +175,7 @@ function roll(dice) {
|
|
109
175
|
try {
|
110
176
|
roller2.roll(diceToRoll);
|
111
177
|
} catch (error) {
|
112
|
-
throw new
|
178
|
+
throw new DiceTypeError(diceToRoll, "roll", error);
|
113
179
|
}
|
114
180
|
}
|
115
181
|
return {
|
@@ -125,7 +191,7 @@ function roll(dice) {
|
|
125
191
|
try {
|
126
192
|
roller.roll(diceWithoutComment);
|
127
193
|
} catch (error) {
|
128
|
-
throw new
|
194
|
+
throw new DiceTypeError(diceWithoutComment, "roll", error);
|
129
195
|
}
|
130
196
|
const commentMatch = dice.match(COMMENT_REGEX);
|
131
197
|
const comment = commentMatch ? commentMatch[2] : void 0;
|
@@ -164,7 +230,7 @@ function generateStatsDice(originalDice, stats) {
|
|
164
230
|
return replaceFormulaInDice(dice);
|
165
231
|
}
|
166
232
|
function replaceFormulaInDice(dice) {
|
167
|
-
const formula = /(?<formula>\{{2}(.+?)\}{2})/
|
233
|
+
const formula = /(?<formula>\{{2}(.+?)\}{2})/gim;
|
168
234
|
const formulaMatch = formula.exec(dice);
|
169
235
|
if (formulaMatch?.groups?.formula) {
|
170
236
|
const formula2 = formulaMatch.groups.formula.replaceAll("{{", "").replaceAll("}}", "");
|
@@ -172,7 +238,7 @@ function replaceFormulaInDice(dice) {
|
|
172
238
|
const result = (0, import_mathjs2.evaluate)(formula2);
|
173
239
|
return cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));
|
174
240
|
} catch (error) {
|
175
|
-
throw new
|
241
|
+
throw new FormulaError(formulaMatch.groups.formula, "replaceFormulaInDice", error);
|
176
242
|
}
|
177
243
|
}
|
178
244
|
return cleanedDice(dice);
|
@@ -199,18 +265,19 @@ function evalStatsDice(testDice, stats) {
|
|
199
265
|
}
|
200
266
|
try {
|
201
267
|
if (!roll(replaceFormulaInDice(dice)))
|
202
|
-
throw new
|
268
|
+
throw new DiceTypeError(dice, "evalStatsDice", "no roll result");
|
203
269
|
return testDice;
|
204
270
|
} catch (error) {
|
205
|
-
throw new
|
206
|
-
${error.message}`);
|
271
|
+
throw new DiceTypeError(dice, "evalStatsDice", error);
|
207
272
|
}
|
208
273
|
}
|
209
274
|
function diceRandomParse(value, template) {
|
210
275
|
if (!template.statistics)
|
211
276
|
return value;
|
212
277
|
value = (0, import_remove_accents2.default)(value);
|
213
|
-
const allStats = Object.keys(template.statistics).map(
|
278
|
+
const allStats = Object.keys(template.statistics).map(
|
279
|
+
(stat) => (0, import_remove_accents2.default)(stat).toLowerCase()
|
280
|
+
);
|
214
281
|
let newDice = value;
|
215
282
|
for (const stat of allStats) {
|
216
283
|
const regex = new RegExp(escapeRegex(stat), "gi");
|
@@ -232,7 +299,9 @@ function diceRandomParse(value, template) {
|
|
232
299
|
function diceTypeRandomParse(dice, template) {
|
233
300
|
if (!template.statistics)
|
234
301
|
return dice;
|
235
|
-
const firstStatNotCombinaison = Object.keys(template.statistics).find(
|
302
|
+
const firstStatNotCombinaison = Object.keys(template.statistics).find(
|
303
|
+
(stat) => !template.statistics?.[stat].combinaison
|
304
|
+
);
|
236
305
|
if (!firstStatNotCombinaison)
|
237
306
|
return dice;
|
238
307
|
const stats = template.statistics[firstStatNotCombinaison];
|
@@ -253,7 +322,7 @@ function evalCombinaison(combinaison, stats) {
|
|
253
322
|
const result = (0, import_mathjs3.evaluate)(formula);
|
254
323
|
newStats[stat] = result;
|
255
324
|
} catch (error) {
|
256
|
-
throw new
|
325
|
+
throw new FormulaError(stat, "evalCombinaison", error);
|
257
326
|
}
|
258
327
|
}
|
259
328
|
return newStats;
|
@@ -267,7 +336,7 @@ function evalOneCombinaison(combinaison, stats) {
|
|
267
336
|
try {
|
268
337
|
return (0, import_mathjs3.evaluate)(formula);
|
269
338
|
} catch (error) {
|
270
|
-
throw new
|
339
|
+
throw new FormulaError(combinaison, "evalOneCombinaison", error);
|
271
340
|
}
|
272
341
|
}
|
273
342
|
function verifyTemplateValue(template) {
|
@@ -281,7 +350,7 @@ function verifyTemplateValue(template) {
|
|
281
350
|
for (const [key, value] of Object.entries(template.statistics)) {
|
282
351
|
const dataValue = value;
|
283
352
|
if (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)
|
284
|
-
throw new
|
353
|
+
throw new MaxGreater(dataValue.min, dataValue.max);
|
285
354
|
if (dataValue.max && dataValue.max <= 0)
|
286
355
|
dataValue.max = void 0;
|
287
356
|
if (dataValue.min && dataValue.min <= 0)
|
@@ -304,7 +373,7 @@ function verifyTemplateValue(template) {
|
|
304
373
|
const cleanedDice2 = diceTypeRandomParse(template.diceType, statistiqueTemplate);
|
305
374
|
const rolled = roll(cleanedDice2);
|
306
375
|
if (!rolled)
|
307
|
-
throw new
|
376
|
+
throw new DiceTypeError(cleanedDice2, "verifyTemplateValue", "no roll result");
|
308
377
|
} catch (e) {
|
309
378
|
throw new Error(e.message);
|
310
379
|
}
|
@@ -336,9 +405,9 @@ function testDiceRegistered(template) {
|
|
336
405
|
if (!template.damage)
|
337
406
|
return;
|
338
407
|
if (Object.keys(template.damage).length === 0)
|
339
|
-
throw new
|
408
|
+
throw new EmptyObjectError();
|
340
409
|
if (Object.keys(template.damage).length > 25)
|
341
|
-
throw new
|
410
|
+
throw new TooManyDice();
|
342
411
|
for (const [name, dice] of Object.entries(template.damage)) {
|
343
412
|
if (!dice)
|
344
413
|
continue;
|
@@ -346,22 +415,30 @@ function testDiceRegistered(template) {
|
|
346
415
|
try {
|
347
416
|
const rolled = roll(randomDiceParsed);
|
348
417
|
if (!rolled)
|
349
|
-
throw new
|
418
|
+
throw new DiceTypeError(name, "testDiceRegistered", "no roll result");
|
350
419
|
} catch (error) {
|
351
|
-
throw new
|
420
|
+
throw new DiceTypeError(name, "testDiceRegistered", error);
|
352
421
|
}
|
353
422
|
}
|
354
423
|
}
|
355
424
|
function testStatCombinaison(template) {
|
356
425
|
if (!template.statistics)
|
357
426
|
return;
|
358
|
-
const onlyCombinaisonStats = Object.fromEntries(
|
359
|
-
|
427
|
+
const onlyCombinaisonStats = Object.fromEntries(
|
428
|
+
Object.entries(template.statistics).filter(
|
429
|
+
([_, value]) => value.combinaison !== void 0
|
430
|
+
)
|
431
|
+
);
|
432
|
+
const allOtherStats = Object.fromEntries(
|
433
|
+
Object.entries(template.statistics).filter(([_, value]) => !value.combinaison)
|
434
|
+
);
|
360
435
|
if (Object.keys(onlyCombinaisonStats).length === 0)
|
361
436
|
return;
|
362
|
-
const allStats = Object.keys(template.statistics).filter(
|
437
|
+
const allStats = Object.keys(template.statistics).filter(
|
438
|
+
(stat) => !template.statistics[stat].combinaison
|
439
|
+
);
|
363
440
|
if (allStats.length === 0)
|
364
|
-
throw new
|
441
|
+
throw new NoStatisticsError();
|
365
442
|
const error = [];
|
366
443
|
for (const [stat, value] of Object.entries(onlyCombinaisonStats)) {
|
367
444
|
let formula = value.combinaison;
|
@@ -379,7 +456,7 @@ function testStatCombinaison(template) {
|
|
379
456
|
}
|
380
457
|
}
|
381
458
|
if (error.length > 0)
|
382
|
-
throw new
|
459
|
+
throw new FormulaError(error.join(", "), "testStatCombinaison");
|
383
460
|
return;
|
384
461
|
}
|
385
462
|
function generateRandomStat(total = 100, max, min) {
|
@@ -400,6 +477,12 @@ function generateRandomStat(total = 100, max, min) {
|
|
400
477
|
// Annotate the CommonJS export names for ESM import in node:
|
401
478
|
0 && (module.exports = {
|
402
479
|
COMMENT_REGEX,
|
480
|
+
DiceTypeError,
|
481
|
+
EmptyObjectError,
|
482
|
+
FormulaError,
|
483
|
+
MaxGreater,
|
484
|
+
NoStatisticsError,
|
485
|
+
TooManyDice,
|
403
486
|
calculator,
|
404
487
|
cleanedDice,
|
405
488
|
diceRandomParse,
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/dice.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["export * from \"./dice\";\r\nexport * from \"./interface\";\r\nexport * from \"./utils\";\r\nexport * from \"./verify_template\";","/* eslint-disable no-useless-escape */\r\nimport { DiceRoller } from \"@dice-roller/rpg-dice-roller\";\r\nimport { evaluate } from \"mathjs\";\r\n\r\nimport { Compare, Modifier, Resultat, Sign } from \".\";\r\n\r\nexport const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\r\nconst SIGN_REGEX =/[><=!]+/;\r\nconst SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\r\n\r\n/**\r\n * Parse the string provided and turn it as a readable dice for dice parser\r\n * @param dice {string}\r\n */\r\nexport function roll(dice: string): Resultat | undefined{\r\n\t//parse dice string\r\n\tif (!dice.includes(\"d\")) return undefined;\r\n\tconst compareRegex = dice.match(SIGN_REGEX_SPACE);\r\n\tlet compare : Compare | undefined;\r\n\tif (compareRegex) {\r\n\t\tdice = dice.replace(SIGN_REGEX_SPACE, \"\");\r\n\t\tconst calc = compareRegex[1];\r\n\t\tconst sign = calc.match(/[+-\\/\\*\\^]/)?.[0];\r\n\t\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\r\n\t\tif (sign) {\r\n\t\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\");\r\n\t\t\tconst total = evaluate(toCalc);\r\n\t\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\r\n\t\t\tcompare = {\r\n\t\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\r\n\t\t\t\tvalue: total,\r\n\t\t\t};\r\n\t\t} else compare = {\r\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\r\n\t\t\tvalue: parseInt(calc, 10),\r\n\t\t};\r\n\t}\r\n\tconst modifier = dice.matchAll(/(\\+|\\-|%|\\/|\\^|\\*|\\*{2})(\\d+)/gi);\r\n\tlet modificator : Modifier | undefined;\r\n\tfor (const mod of modifier) {\r\n\t\t//calculate the modifier if multiple\r\n\t\tif (modificator) {\r\n\t\t\tconst sign = modificator.sign;\r\n\t\t\tlet value = modificator.value;\r\n\t\t\tif (sign)\r\n\t\t\t\tvalue = calculator(sign, value, parseInt(mod[2], 10));\r\n\t\t\tmodificator = {\r\n\t\t\t\tsign: mod[1] as Sign,\r\n\t\t\t\tvalue,\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tmodificator = {\r\n\t\t\t\tsign: mod[1] as Sign,\r\n\t\t\t\tvalue: parseInt(mod[2], 10),\r\n\t\t\t};\r\n\t\t}\r\n\t} \r\n\t\r\n\tif (dice.match(/\\d+?#(.*)/)) {\r\n\t\tconst diceArray = dice.split(\"#\");\r\n\t\tconst numberOfDice = parseInt(diceArray[0], 10);\r\n\t\tconst diceToRoll = diceArray[1].replace(COMMENT_REGEX, \"\");\r\n\t\tconst commentsMatch = diceArray[1].match(COMMENT_REGEX);\r\n\t\tconst comments = commentsMatch ? commentsMatch[2] : undefined;\r\n\t\tconst roller = new DiceRoller();\r\n\t\t//remove comments if any\r\n\t\tfor (let i = 0; i < numberOfDice; i++) {\r\n\t\t\ttry {\r\n\t\t\t\troller.roll(diceToRoll);\r\n\t\t\t} catch (error) {\r\n\t\t\t\tthrow new Error(`[error.invalidDice.withoutDice, common.space]: ${diceToRoll}`);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tdice: diceToRoll,\r\n\t\t\tresult: roller.output,\r\n\t\t\tcomment: comments,\r\n\t\t\tcompare: compare ? compare : undefined,\r\n\t\t\tmodifier: modificator,\r\n\t\t};\r\n\t}\r\n\tconst roller = new DiceRoller();\r\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\");\r\n\ttry {\t\r\n\t\troller.roll(diceWithoutComment);\r\n\t} catch (error) {\r\n\t\tthrow new Error(`[error.invalidDice.withoutDice, common.space]: ${diceWithoutComment}`);\r\n\t}\r\n\tconst commentMatch = dice.match(COMMENT_REGEX);\r\n\tconst comment = commentMatch ? commentMatch[2] : undefined;\r\n\treturn {\r\n\t\tdice,\r\n\t\tresult: roller.output,\r\n\t\tcomment,\r\n\t\tcompare: compare ? compare : undefined,\r\n\t\tmodifier: modificator,\r\n\t};\r\n}\r\n/**\r\n * Evaluate a formula and replace \"^\" by \"**\" if any\r\n * @param {Sign} sign\r\n * @param {number} value \r\n * @param {number} total \r\n * @returns \r\n */\r\nexport function calculator(sign: Sign, value: number, total: number): number {\r\n\tif (sign === \"^\") sign = \"**\";\r\n\treturn evaluate(`${total} ${sign} ${value}`);\r\n}\r\n\r\n\r\n\r\n","import { evaluate } from \"mathjs\";\r\nimport removeAccents from \"remove-accents\";\r\n\r\n/**\r\n * Escape regex string\r\n * @param string {string}\r\n */\r\nexport function escapeRegex(string: string) {\r\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\n\r\n/**\r\n * Replace the stat name by their value using stat and after evaluate any formula using `replaceFormulaInDice`\r\n * @param originalDice {dice}\r\n * @param stats {[name: string]: number}\r\n */\r\nexport function generateStatsDice(originalDice: string, stats?: {[name: string]: number}) {\r\n\tlet dice = originalDice;\r\n\tif (stats && Object.keys(stats).length > 0) {\r\n\t\t//damage field support adding statistic, like : 1d6 + strength\r\n\t\t//check if the value contains a statistic & calculate if it's okay\r\n\t\t//the dice will be converted before roll \r\n\t\tconst allStats = Object.keys(stats);\r\n\t\tfor (const stat of allStats) {\r\n\t\t\tconst regex = new RegExp(escapeRegex(removeAccents(stat)), \"gi\");\r\n\t\t\tif (dice.match(regex)) {\r\n\t\t\t\tconst statValue = stats[stat];\r\n\t\t\t\tdice = dice.replace(regex, statValue.toString());\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn replaceFormulaInDice(dice);\r\n\t\r\n}\r\n\r\n/**\r\n * Replace the {{}} in the dice string and evaluate the interior if any\r\n * @param dice {string}\r\n */\r\nexport function replaceFormulaInDice(dice: string) {\r\n\tconst formula = /(?<formula>\\{{2}(.+?)\\}{2})/gmi;\r\n\tconst formulaMatch = formula.exec(dice);\r\n\tif (formulaMatch?.groups?.formula) {\r\n\t\tconst formula = formulaMatch.groups.formula.replaceAll(\"{{\", \"\").replaceAll(\"}}\", \"\");\r\n\t\ttry {\r\n\t\t\tconst result = evaluate(formula);\r\n\t\t\treturn cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));\r\n\t\t} catch (error) {\r\n\t\t\tthrow new Error(`[error.invalidFormula, common.space]: ${formulaMatch.groups.formula}`);\r\n\t\t}\r\n\t}\r\n\treturn cleanedDice(dice);\r\n}\r\n\r\n/**\r\n * Replace the ++ +- -- by their proper value:\r\n * - `++` = `+`\r\n * - `+-` = `-`\r\n * - `--` = `+`\r\n * @param dice {string}\r\n */\r\nexport function cleanedDice(dice: string) {\r\n\treturn dice.replaceAll(\"+-\", \"-\").replaceAll(\"--\", \"+\").replaceAll(\"++\", \"+\");\r\n}","/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { evaluate } from \"mathjs\";\r\nimport {Random } from \"random-js\";\r\nimport removeAccents from \"remove-accents\";\r\n\r\nimport { Statistic, StatisticalTemplate } from \".\";\r\nimport { roll } from \"./dice\";\r\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\r\n\r\n/**\r\n * Verify if the provided dice work with random value\r\n * @param testDice {string}\r\n * @param stats {[name: string]: number}\r\n */\r\nexport function evalStatsDice(testDice: string, stats?: {[name: string]: number}) {\r\n\tlet dice = testDice;\r\n\tif (stats && Object.keys(stats).length > 0) {\r\n\t\tconst allStats = Object.keys(stats);\r\n\t\tfor (const stat of allStats) {\r\n\t\t\tconst regex = new RegExp(escapeRegex(removeAccents(stat)), \"gi\");\r\n\t\t\tif (testDice.match(regex)) {\r\n\t\t\t\tconst statValue = stats[stat];\r\n\t\t\t\tdice = testDice.replace(regex, statValue.toString());\r\n\t\t\t}\r\n\t\t}\r\n\t}\t\r\n\ttry {\r\n\t\tif (!roll(replaceFormulaInDice(dice))) throw new Error(`[error.invalidDice.withoutDice, common.space] ${dice}`);\r\n\t\treturn testDice;\r\n\t} catch (error) {\r\n\t\tthrow new Error(`[error.invalidDice.withoutDice, common.space]: ${testDice}\\n${(error as Error).message}`);\r\n\t}\r\n}\r\n\r\n/**\r\n * Generate a random dice and remove the formula (+ evaluate it)\r\n * Used for diceDamage only\r\n * @param value {string}\r\n * @param template {StatisticalTemplate}\r\n * @returns \r\n */\r\nexport function diceRandomParse(value: string, template: StatisticalTemplate) {\r\n\tif (!template.statistics) return value;\r\n\tvalue = removeAccents(value);\r\n\tconst allStats = Object.keys(template.statistics).map(stat => removeAccents(stat).toLowerCase());\r\n\tlet newDice = value;\r\n\tfor (const stat of allStats) {\r\n\t\tconst regex = new RegExp(escapeRegex(stat), \"gi\");\r\n\t\tif (value.match(regex)) {\r\n\t\t\tlet max: undefined | number = undefined;\r\n\t\t\tlet min: undefined | number = undefined;\r\n\t\t\tconst stats = template.statistics?.[stat];\r\n\t\t\tif (stats) {\r\n\t\t\t\tmax = template.statistics[removeAccents(stat).toLowerCase()].max;\r\n\t\t\t\tmin = template.statistics[removeAccents(stat).toLowerCase()].min;\r\n\t\t\t}\r\n\t\t\tconst total = template.total || 100;\r\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\r\n\t\t\tnewDice = value.replace(regex, randomStatValue.toString());\r\n\t\t}\r\n\t}\r\n\treturn replaceFormulaInDice(newDice);\r\n}\r\n\r\n/**\r\n * Same as damageDice but for DiceType\r\n * @param dice {string}\r\n * @param template {StatisticalTemplate}\r\n */\r\nexport function diceTypeRandomParse(dice: string, template: StatisticalTemplate) {\r\n\tif (!template.statistics) return dice;\r\n\tconst firstStatNotCombinaison = Object.keys(template.statistics).find(stat => !template.statistics?.[stat].combinaison);\r\n\tif (!firstStatNotCombinaison) return dice;\r\n\tconst stats = template.statistics[firstStatNotCombinaison];\r\n\tconst {min, max} = stats;\r\n\tconst total = template.total || 100;\r\n\tconst randomStatValue = generateRandomStat(total, max, min);\r\n\treturn replaceFormulaInDice(dice.replace(\"$\", randomStatValue.toString()));\r\n}\r\n\r\n/**\r\n * Random the combinaison and evaluate it to check if everything is valid\r\n * @param combinaison {[name: string]: string}\r\n * @param stats {[name: string]: string|number}\r\n */\r\nexport function evalCombinaison(combinaison: {[name: string]: string}, stats: {[name: string]: string | number}) {\r\n\tconst newStats: {[name: string]: number} = {};\r\n\tfor (const [stat, combin] of Object.entries(combinaison)) {\r\n\t\t//replace the stats in formula\r\n\t\tlet formula = removeAccents(combin);\r\n\t\tfor (const [statName, value] of Object.entries(stats)) {\r\n\t\t\tconst regex = new RegExp(removeAccents(statName), \"gi\");\r\n\t\t\tformula = formula.replace(regex, value.toString());\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst result = evaluate(formula);\r\n\t\t\tnewStats[stat] = result;\r\n\t\t} catch (error) {\r\n\t\t\tthrow new Error(`[error.invalidFormula, common.space]: ${stat}`);\r\n\t\t}\r\n\t}\r\n\treturn newStats;\r\n}\r\n\r\n/**\r\n * Evaluate one selected combinaison\r\n * @param combinaison {string}\r\n * @param stats {[name: string]: string|number}\r\n */\r\nexport function evalOneCombinaison(combinaison: string, stats: {[name: string]: string | number}) {\r\n\tlet formula = removeAccents(combinaison);\r\n\tfor (const [statName, value] of Object.entries(stats)) {\r\n\t\tconst regex = new RegExp(removeAccents(statName), \"gi\");\r\n\t\tformula = formula.replace(regex, value.toString());\r\n\t}\r\n\ttry {\r\n\t\treturn evaluate(formula);\r\n\t} catch (error) {\r\n\t\tthrow new Error(`[error.invalidFormula, common.space]: ${combinaison}`);\r\n\t}\r\n}\r\n\r\n/**\r\n * Parse the provided JSON and verify each field to check if everything could work when rolling\r\n * @param {any} template \r\n * @returns {StatisticalTemplate}\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function verifyTemplateValue(template: any): StatisticalTemplate {\r\n\tconst statistiqueTemplate: StatisticalTemplate = {\r\n\t\tdiceType: \"\",\r\n\t\tstatistics: {} as Statistic\r\n\t};\r\n\tif (!template.statistics) statistiqueTemplate.statistics = undefined;\r\n\telse if (template.statistics && Object.keys(template.statistics).length > 0) {\r\n\t\tfor (const [key, value] of Object.entries(template.statistics)) {\r\n\t\t\tconst dataValue = value as { max?: number, min?: number, combinaison?: string };\r\n\t\t\tif (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)\r\n\t\t\t\tthrow new Error(\"[error.maxGreater]\");\t\t\t\t\r\n\t\t\tif (dataValue.max && dataValue.max <= 0 ) dataValue.max = undefined;\r\n\t\t\tif (dataValue.min && dataValue.min <= 0 ) dataValue.min = undefined;\r\n\t\t\tlet formula = dataValue.combinaison ? removeAccents(dataValue.combinaison).toLowerCase() : undefined;\r\n\t\t\tformula = formula && formula.trim().length > 0 ? formula : undefined;\r\n\t\t\tif (!statistiqueTemplate.statistics) {\r\n\t\t\t\tstatistiqueTemplate.statistics = {} as Statistic;\r\n\t\t\t}\r\n\t\t\tstatistiqueTemplate.statistics[key] = {\r\n\t\t\t\tmax: dataValue.max,\r\n\t\t\t\tmin: dataValue.min,\r\n\t\t\t\tcombinaison: formula || undefined,\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\tif (template.diceType) {\r\n\t\ttry {\r\n\t\t\tstatistiqueTemplate.diceType = template.diceType;\r\n\t\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\r\n\t\t\tconst rolled = roll(cleanedDice);\r\n\t\t\tif (!rolled) throw new Error(\"[error.invalidDice.withoutDice]\");\r\n\t\t} catch (e) {\r\n\t\t\tthrow new Error((e as Error).message);\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\tif (template.critical && Object.keys(template.critical).length > 0){\r\n\t\tstatistiqueTemplate.critical = {\r\n\t\t\tfailure: template.critical.failure ?? undefined,\r\n\t\t\tsuccess: template.critical.success ?? undefined\r\n\t\t};\r\n\r\n\t}\r\n\tif (template.total) {\r\n\t\tif (template.total <= 0)\r\n\t\t\ttemplate.total = undefined;\r\n\t\tstatistiqueTemplate.total = template.total;\r\n\t}\r\n\tif (template.charName) statistiqueTemplate.charName = template.charName;\r\n\tif (template.damage) statistiqueTemplate.damage = template.damage;\r\n\ttry {\r\n\t\ttestDiceRegistered(statistiqueTemplate);\r\n\t\ttestStatCombinaison(statistiqueTemplate);\r\n\t} catch (error) {\r\n\t\tthrow new Error((error as Error).message);\r\n\t}\r\n\treturn statistiqueTemplate;\r\n}\r\n\r\n/**\r\n * Test each damage roll from the template.damage\r\n * @param {StatisticalTemplate} template \r\n */\r\nexport function testDiceRegistered(template: StatisticalTemplate) {\r\n\tif (!template.damage) return;\r\n\tif (Object.keys(template.damage).length === 0) throw new Error(\"[error.emptyObject]\");\r\n\tif (Object.keys(template.damage).length > 25) throw new Error(\"[error.tooManyDice]\");\r\n\tfor (const [name, dice] of Object.entries(template.damage)) {\r\n\t\tif (!dice) continue;\r\n\t\tconst randomDiceParsed = diceRandomParse(dice, template);\r\n\t\ttry {\r\n\t\t\tconst rolled = roll(randomDiceParsed);\r\n\t\t\tif (!rolled) throw new Error(`[error.invalidDice, common.space] ${name}`);\r\n\t\t} catch (error) {\r\n\t\t\tthrow new Error(`[error.invalidDice, common.space] ${name}`);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n/**\r\n * Test all combinaison with generated random value\r\n * @param {StatisticalTemplate} template \r\n */\r\nexport function testStatCombinaison(template: StatisticalTemplate) {\r\n\tif (!template.statistics) return;\r\n\tconst onlyCombinaisonStats = Object.fromEntries(Object.entries(template.statistics).filter(([_, value]) => value.combinaison !== undefined));\r\n\tconst allOtherStats = Object.fromEntries(Object.entries(template.statistics).filter(([_, value]) => !value.combinaison));\t\r\n\tif (Object.keys(onlyCombinaisonStats).length===0) return;\r\n\tconst allStats = Object.keys(template.statistics).filter(stat => !template.statistics![stat].combinaison);\r\n\tif (allStats.length === 0) \r\n\t\tthrow new Error(\"[error.noStat]\");\r\n\tconst error= [];\r\n\tfor (const [stat, value] of Object.entries(onlyCombinaisonStats)) {\r\n\t\tlet formula = value.combinaison as string;\r\n\t\tfor (const [other, data] of Object.entries(allOtherStats)) {\r\n\t\t\tconst {max, min} = data;\r\n\t\t\tconst total = template.total || 100;\r\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\r\n\t\t\tconst regex = new RegExp(other, \"gi\");\r\n\t\t\tformula = formula.replace(regex, randomStatValue.toString());\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tevaluate(formula);\r\n\t\t} catch (e) {\r\n\t\t\terror.push(stat);\r\n\t\t}\r\n\t}\r\n\tif (error.length > 0) \r\n\t\tthrow new Error(`[error.invalidFormula, common.space] ${error.join(\", \")}`);\r\n\treturn;\r\n}\r\n\r\n/**\r\n * Generate a random stat based on the template and the statistical min and max\r\n * @param {number|undefined} total\r\n * @param {number | undefined} max \r\n * @param {number | undefined} min \r\n * @returns \r\n */\r\nexport function generateRandomStat(total: number | undefined = 100, max?: number, min?: number) {\r\n\tlet randomStatValue = total + 1;\r\n\twhile (randomStatValue >= total) {\r\n\t\tconst random = new Random();\r\n\t\tif (max && min)\r\n\t\t\trandomStatValue = random.integer(min, max);\r\n\t\telse if (max)\r\n\t\t\trandomStatValue = random.integer(0, max);\r\n\t\telse if (min)\r\n\t\t\trandomStatValue = random.integer(min, total);\r\n\t\telse\r\n\t\t\trandomStatValue = random.integer(0, total);\r\n\t}\r\n\treturn randomStatValue;\r\n}\r\n\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,6BAA2B;AAC3B,oBAAyB;AAIlB,IAAM,gBAAgB;AAC7B,IAAM,aAAY;AAClB,IAAM,mBAAmB;AAMlB,SAAS,KAAK,MAAmC;AAEvD,MAAI,CAAC,KAAK,SAAS,GAAG;AAAG,WAAO;AAChC,QAAM,eAAe,KAAK,MAAM,gBAAgB;AAChD,MAAI;AACJ,MAAI,cAAc;AACjB,WAAO,KAAK,QAAQ,kBAAkB,EAAE;AACxC,UAAM,OAAO,aAAa,CAAC;AAC3B,UAAM,OAAO,KAAK,MAAM,YAAY,IAAI,CAAC;AACzC,UAAM,cAAc,aAAa,CAAC,EAAE,MAAM,UAAU,IAAI,CAAC;AACzD,QAAI,MAAM;AACT,YAAM,SAAS,KAAK,QAAQ,YAAY,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC7D,YAAM,YAAQ,wBAAS,MAAM;AAC7B,aAAO,KAAK,QAAQ,kBAAkB,GAAG,WAAW,GAAG,KAAK,EAAE;AAC9D,gBAAU;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACR;AAAA,IACD;AAAO,gBAAU;AAAA,QAChB,MAAM;AAAA,QACN,OAAO,SAAS,MAAM,EAAE;AAAA,MACzB;AAAA,EACD;AACA,QAAM,WAAW,KAAK,SAAS,iCAAiC;AAChE,MAAI;AACJ,aAAW,OAAO,UAAU;AAE3B,QAAI,aAAa;AAChB,YAAM,OAAO,YAAY;AACzB,UAAI,QAAQ,YAAY;AACxB,UAAI;AACH,gBAAQ,WAAW,MAAM,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC;AACrD,oBAAc;AAAA,QACb,MAAM,IAAI,CAAC;AAAA,QACX;AAAA,MACD;AAAA,IACD,OAAO;AACN,oBAAc;AAAA,QACb,MAAM,IAAI,CAAC;AAAA,QACX,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AAEA,MAAI,KAAK,MAAM,WAAW,GAAG;AAC5B,UAAM,YAAY,KAAK,MAAM,GAAG;AAChC,UAAM,eAAe,SAAS,UAAU,CAAC,GAAG,EAAE;AAC9C,UAAM,aAAa,UAAU,CAAC,EAAE,QAAQ,eAAe,EAAE;AACzD,UAAM,gBAAgB,UAAU,CAAC,EAAE,MAAM,aAAa;AACtD,UAAM,WAAW,gBAAgB,cAAc,CAAC,IAAI;AACpD,UAAMA,UAAS,IAAI,kCAAW;AAE9B,aAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACtC,UAAI;AACH,QAAAA,QAAO,KAAK,UAAU;AAAA,MACvB,SAAS,OAAO;AACf,cAAM,IAAI,MAAM,kDAAkD,UAAU,EAAE;AAAA,MAC/E;AAAA,IACD;AACA,WAAO;AAAA,MACN,MAAM;AAAA,MACN,QAAQA,QAAO;AAAA,MACf,SAAS;AAAA,MACT,SAAS,UAAU,UAAU;AAAA,MAC7B,UAAU;AAAA,IACX;AAAA,EACD;AACA,QAAM,SAAS,IAAI,kCAAW;AAC9B,QAAM,qBAAqB,KAAK,QAAQ,eAAe,EAAE;AACzD,MAAI;AACH,WAAO,KAAK,kBAAkB;AAAA,EAC/B,SAAS,OAAO;AACf,UAAM,IAAI,MAAM,kDAAkD,kBAAkB,EAAE;AAAA,EACvF;AACA,QAAM,eAAe,KAAK,MAAM,aAAa;AAC7C,QAAM,UAAU,eAAe,aAAa,CAAC,IAAI;AACjD,SAAO;AAAA,IACN;AAAA,IACA,QAAQ,OAAO;AAAA,IACf;AAAA,IACA,SAAS,UAAU,UAAU;AAAA,IAC7B,UAAU;AAAA,EACX;AACD;AAQO,SAAS,WAAW,MAAY,OAAe,OAAuB;AAC5E,MAAI,SAAS;AAAK,WAAO;AACzB,aAAO,wBAAS,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;AAC5C;;;AC5GA,IAAAC,iBAAyB;AACzB,4BAA0B;AAMnB,SAAS,YAAY,QAAgB;AAC3C,SAAO,OAAO,QAAQ,uBAAuB,MAAM;AACpD;AAQO,SAAS,kBAAkB,cAAsB,OAAkC;AACzF,MAAI,OAAO;AACX,MAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAI3C,UAAM,WAAW,OAAO,KAAK,KAAK;AAClC,eAAW,QAAQ,UAAU;AAC5B,YAAM,QAAQ,IAAI,OAAO,gBAAY,sBAAAC,SAAc,IAAI,CAAC,GAAG,IAAI;AAC/D,UAAI,KAAK,MAAM,KAAK,GAAG;AACtB,cAAM,YAAY,MAAM,IAAI;AAC5B,eAAO,KAAK,QAAQ,OAAO,UAAU,SAAS,CAAC;AAAA,MAChD;AAAA,IACD;AAAA,EACD;AACA,SAAO,qBAAqB,IAAI;AAEjC;AAMO,SAAS,qBAAqB,MAAc;AAClD,QAAM,UAAU;AAChB,QAAM,eAAe,QAAQ,KAAK,IAAI;AACtC,MAAI,cAAc,QAAQ,SAAS;AAClC,UAAMC,WAAU,aAAa,OAAO,QAAQ,WAAW,MAAM,EAAE,EAAE,WAAW,MAAM,EAAE;AACpF,QAAI;AACH,YAAM,aAAS,yBAASA,QAAO;AAC/B,aAAO,YAAY,KAAK,QAAQ,aAAa,OAAO,SAAS,OAAO,SAAS,CAAC,CAAC;AAAA,IAChF,SAAS,OAAO;AACf,YAAM,IAAI,MAAM,yCAAyC,aAAa,OAAO,OAAO,EAAE;AAAA,IACvF;AAAA,EACD;AACA,SAAO,YAAY,IAAI;AACxB;AASO,SAAS,YAAY,MAAc;AACzC,SAAO,KAAK,WAAW,MAAM,GAAG,EAAE,WAAW,MAAM,GAAG,EAAE,WAAW,MAAM,GAAG;AAC7E;;;AC/DA,IAAAC,iBAAyB;AACzB,uBAAsB;AACtB,IAAAC,yBAA0B;AAWnB,SAAS,cAAc,UAAkB,OAAkC;AACjF,MAAI,OAAO;AACX,MAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAC3C,UAAM,WAAW,OAAO,KAAK,KAAK;AAClC,eAAW,QAAQ,UAAU;AAC5B,YAAM,QAAQ,IAAI,OAAO,gBAAY,uBAAAC,SAAc,IAAI,CAAC,GAAG,IAAI;AAC/D,UAAI,SAAS,MAAM,KAAK,GAAG;AAC1B,cAAM,YAAY,MAAM,IAAI;AAC5B,eAAO,SAAS,QAAQ,OAAO,UAAU,SAAS,CAAC;AAAA,MACpD;AAAA,IACD;AAAA,EACD;AACA,MAAI;AACH,QAAI,CAAC,KAAK,qBAAqB,IAAI,CAAC;AAAG,YAAM,IAAI,MAAM,iDAAiD,IAAI,EAAE;AAC9G,WAAO;AAAA,EACR,SAAS,OAAO;AACf,UAAM,IAAI,MAAM,kDAAkD,QAAQ;AAAA,EAAM,MAAgB,OAAO,EAAE;AAAA,EAC1G;AACD;AASO,SAAS,gBAAgB,OAAe,UAA+B;AAC7E,MAAI,CAAC,SAAS;AAAY,WAAO;AACjC,cAAQ,uBAAAA,SAAc,KAAK;AAC3B,QAAM,WAAW,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,cAAQ,uBAAAA,SAAc,IAAI,EAAE,YAAY,CAAC;AAC/F,MAAI,UAAU;AACd,aAAW,QAAQ,UAAU;AAC5B,UAAM,QAAQ,IAAI,OAAO,YAAY,IAAI,GAAG,IAAI;AAChD,QAAI,MAAM,MAAM,KAAK,GAAG;AACvB,UAAI,MAA0B;AAC9B,UAAI,MAA0B;AAC9B,YAAM,QAAQ,SAAS,aAAa,IAAI;AACxC,UAAI,OAAO;AACV,cAAM,SAAS,eAAW,uBAAAA,SAAc,IAAI,EAAE,YAAY,CAAC,EAAE;AAC7D,cAAM,SAAS,eAAW,uBAAAA,SAAc,IAAI,EAAE,YAAY,CAAC,EAAE;AAAA,MAC9D;AACA,YAAM,QAAQ,SAAS,SAAS;AAChC,YAAM,kBAAkB,mBAAmB,OAAO,KAAK,GAAG;AAC1D,gBAAU,MAAM,QAAQ,OAAO,gBAAgB,SAAS,CAAC;AAAA,IAC1D;AAAA,EACD;AACA,SAAO,qBAAqB,OAAO;AACpC;AAOO,SAAS,oBAAoB,MAAc,UAA+B;AAChF,MAAI,CAAC,SAAS;AAAY,WAAO;AACjC,QAAM,0BAA0B,OAAO,KAAK,SAAS,UAAU,EAAE,KAAK,UAAQ,CAAC,SAAS,aAAa,IAAI,EAAE,WAAW;AACtH,MAAI,CAAC;AAAyB,WAAO;AACrC,QAAM,QAAQ,SAAS,WAAW,uBAAuB;AACzD,QAAM,EAAC,KAAK,IAAG,IAAI;AACnB,QAAM,QAAQ,SAAS,SAAS;AAChC,QAAM,kBAAkB,mBAAmB,OAAO,KAAK,GAAG;AAC1D,SAAO,qBAAqB,KAAK,QAAQ,KAAK,gBAAgB,SAAS,CAAC,CAAC;AAC1E;AAOO,SAAS,gBAAgB,aAAuC,OAA0C;AAChH,QAAM,WAAqC,CAAC;AAC5C,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,WAAW,GAAG;AAEzD,QAAI,cAAU,uBAAAA,SAAc,MAAM;AAClC,eAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,YAAM,QAAQ,IAAI,WAAO,uBAAAA,SAAc,QAAQ,GAAG,IAAI;AACtD,gBAAU,QAAQ,QAAQ,OAAO,MAAM,SAAS,CAAC;AAAA,IAClD;AACA,QAAI;AACH,YAAM,aAAS,yBAAS,OAAO;AAC/B,eAAS,IAAI,IAAI;AAAA,IAClB,SAAS,OAAO;AACf,YAAM,IAAI,MAAM,yCAAyC,IAAI,EAAE;AAAA,IAChE;AAAA,EACD;AACA,SAAO;AACR;AAOO,SAAS,mBAAmB,aAAqB,OAA0C;AACjG,MAAI,cAAU,uBAAAA,SAAc,WAAW;AACvC,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAM,QAAQ,IAAI,WAAO,uBAAAA,SAAc,QAAQ,GAAG,IAAI;AACtD,cAAU,QAAQ,QAAQ,OAAO,MAAM,SAAS,CAAC;AAAA,EAClD;AACA,MAAI;AACH,eAAO,yBAAS,OAAO;AAAA,EACxB,SAAS,OAAO;AACf,UAAM,IAAI,MAAM,yCAAyC,WAAW,EAAE;AAAA,EACvE;AACD;AAQO,SAAS,oBAAoB,UAAoC;AACvE,QAAM,sBAA2C;AAAA,IAChD,UAAU;AAAA,IACV,YAAY,CAAC;AAAA,EACd;AACA,MAAI,CAAC,SAAS;AAAY,wBAAoB,aAAa;AAAA,WAClD,SAAS,cAAc,OAAO,KAAK,SAAS,UAAU,EAAE,SAAS,GAAG;AAC5E,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AAC/D,YAAM,YAAY;AAClB,UAAI,UAAU,OAAO,UAAU,OAAO,UAAU,OAAO,UAAU;AAChE,cAAM,IAAI,MAAM,oBAAoB;AACrC,UAAI,UAAU,OAAO,UAAU,OAAO;AAAI,kBAAU,MAAM;AAC1D,UAAI,UAAU,OAAO,UAAU,OAAO;AAAI,kBAAU,MAAM;AAC1D,UAAI,UAAU,UAAU,kBAAc,uBAAAA,SAAc,UAAU,WAAW,EAAE,YAAY,IAAI;AAC3F,gBAAU,WAAW,QAAQ,KAAK,EAAE,SAAS,IAAI,UAAU;AAC3D,UAAI,CAAC,oBAAoB,YAAY;AACpC,4BAAoB,aAAa,CAAC;AAAA,MACnC;AACA,0BAAoB,WAAW,GAAG,IAAI;AAAA,QACrC,KAAK,UAAU;AAAA,QACf,KAAK,UAAU;AAAA,QACf,aAAa,WAAW;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACA,MAAI,SAAS,UAAU;AACtB,QAAI;AACH,0BAAoB,WAAW,SAAS;AACxC,YAAMC,eAAc,oBAAoB,SAAS,UAAU,mBAAmB;AAC9E,YAAM,SAAS,KAAKA,YAAW;AAC/B,UAAI,CAAC;AAAQ,cAAM,IAAI,MAAM,iCAAiC;AAAA,IAC/D,SAAS,GAAG;AACX,YAAM,IAAI,MAAO,EAAY,OAAO;AAAA,IACrC;AAAA,EACD;AAGA,MAAI,SAAS,YAAY,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS,GAAE;AAClE,wBAAoB,WAAW;AAAA,MAC9B,SAAS,SAAS,SAAS,WAAW;AAAA,MACtC,SAAS,SAAS,SAAS,WAAW;AAAA,IACvC;AAAA,EAED;AACA,MAAI,SAAS,OAAO;AACnB,QAAI,SAAS,SAAS;AACrB,eAAS,QAAQ;AAClB,wBAAoB,QAAQ,SAAS;AAAA,EACtC;AACA,MAAI,SAAS;AAAU,wBAAoB,WAAW,SAAS;AAC/D,MAAI,SAAS;AAAQ,wBAAoB,SAAS,SAAS;AAC3D,MAAI;AACH,uBAAmB,mBAAmB;AACtC,wBAAoB,mBAAmB;AAAA,EACxC,SAAS,OAAO;AACf,UAAM,IAAI,MAAO,MAAgB,OAAO;AAAA,EACzC;AACA,SAAO;AACR;AAMO,SAAS,mBAAmB,UAA+B;AACjE,MAAI,CAAC,SAAS;AAAQ;AACtB,MAAI,OAAO,KAAK,SAAS,MAAM,EAAE,WAAW;AAAG,UAAM,IAAI,MAAM,qBAAqB;AACpF,MAAI,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS;AAAI,UAAM,IAAI,MAAM,qBAAqB;AACnF,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AAC3D,QAAI,CAAC;AAAM;AACX,UAAM,mBAAmB,gBAAgB,MAAM,QAAQ;AACvD,QAAI;AACH,YAAM,SAAS,KAAK,gBAAgB;AACpC,UAAI,CAAC;AAAQ,cAAM,IAAI,MAAM,qCAAqC,IAAI,EAAE;AAAA,IACzE,SAAS,OAAO;AACf,YAAM,IAAI,MAAM,qCAAqC,IAAI,EAAE;AAAA,IAC5D;AAAA,EACD;AACD;AAQO,SAAS,oBAAoB,UAA+B;AAClE,MAAI,CAAC,SAAS;AAAY;AAC1B,QAAM,uBAAuB,OAAO,YAAY,OAAO,QAAQ,SAAS,UAAU,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,MAAM,gBAAgB,MAAS,CAAC;AAC3I,QAAM,gBAAgB,OAAO,YAAY,OAAO,QAAQ,SAAS,UAAU,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,MAAM,WAAW,CAAC;AACvH,MAAI,OAAO,KAAK,oBAAoB,EAAE,WAAS;AAAG;AAClD,QAAM,WAAW,OAAO,KAAK,SAAS,UAAU,EAAE,OAAO,UAAQ,CAAC,SAAS,WAAY,IAAI,EAAE,WAAW;AACxG,MAAI,SAAS,WAAW;AACvB,UAAM,IAAI,MAAM,gBAAgB;AACjC,QAAM,QAAO,CAAC;AACd,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,oBAAoB,GAAG;AACjE,QAAI,UAAU,MAAM;AACpB,eAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC1D,YAAM,EAAC,KAAK,IAAG,IAAI;AACnB,YAAM,QAAQ,SAAS,SAAS;AAChC,YAAM,kBAAkB,mBAAmB,OAAO,KAAK,GAAG;AAC1D,YAAM,QAAQ,IAAI,OAAO,OAAO,IAAI;AACpC,gBAAU,QAAQ,QAAQ,OAAO,gBAAgB,SAAS,CAAC;AAAA,IAC5D;AACA,QAAI;AACH,mCAAS,OAAO;AAAA,IACjB,SAAS,GAAG;AACX,YAAM,KAAK,IAAI;AAAA,IAChB;AAAA,EACD;AACA,MAAI,MAAM,SAAS;AAClB,UAAM,IAAI,MAAM,wCAAwC,MAAM,KAAK,IAAI,CAAC,EAAE;AAC3E;AACD;AASO,SAAS,mBAAmB,QAA4B,KAAK,KAAc,KAAc;AAC/F,MAAI,kBAAkB,QAAQ;AAC9B,SAAO,mBAAmB,OAAO;AAChC,UAAM,SAAS,IAAI,wBAAO;AAC1B,QAAI,OAAO;AACV,wBAAkB,OAAO,QAAQ,KAAK,GAAG;AAAA,aACjC;AACR,wBAAkB,OAAO,QAAQ,GAAG,GAAG;AAAA,aAC/B;AACR,wBAAkB,OAAO,QAAQ,KAAK,KAAK;AAAA;AAE3C,wBAAkB,OAAO,QAAQ,GAAG,KAAK;AAAA,EAC3C;AACA,SAAO;AACR;","names":["roller","import_mathjs","removeAccents","formula","import_mathjs","import_remove_accents","removeAccents","cleanedDice"]}
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/dice.ts","../src/errors.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["export * from \"./dice\";\nexport * from \"./interface\";\nexport * from \"./utils\";\nexport * from \"./verify_template\";\nexport * from \"./errors\";\n","/* eslint-disable no-useless-escape */\nimport { DiceRoller } from \"@dice-roller/rpg-dice-roller\";\nimport { evaluate } from \"mathjs\";\n\nimport type { Compare, Modifier, Resultat, Sign } from \".\";\nimport { DiceTypeError } from \"./errors\";\n\nexport const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\nconst SIGN_REGEX = /[><=!]+/;\nconst SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\n\n/**\n * Parse the string provided and turn it as a readable dice for dice parser\n * @param dice {string}\n */\nexport function roll(dice: string): Resultat | undefined {\n\t//parse dice string\n\tif (!dice.includes(\"d\")) return undefined;\n\tconst compareRegex = dice.match(SIGN_REGEX_SPACE);\n\tlet compare: Compare | undefined;\n\tif (compareRegex) {\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = dice.replace(SIGN_REGEX_SPACE, \"\");\n\t\tconst calc = compareRegex[1];\n\t\tconst sign = calc.match(/[+-\\/\\*\\^]/)?.[0];\n\t\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\n\t\tif (sign) {\n\t\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\");\n\t\t\tconst total = evaluate(toCalc);\n\t\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\n\t\t\tcompare = {\n\t\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\t\tvalue: total,\n\t\t\t};\n\t\t} else\n\t\t\tcompare = {\n\t\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\t\tvalue: Number.parseInt(calc, 10),\n\t\t\t};\n\t}\n\tconst modifier = dice.matchAll(/(\\+|\\-|%|\\/|\\^|\\*|\\*{2})(\\d+)/gi);\n\tlet modificator: Modifier | undefined;\n\tfor (const mod of modifier) {\n\t\t//calculate the modifier if multiple\n\t\tif (modificator) {\n\t\t\tconst sign = modificator.sign;\n\t\t\tlet value = modificator.value;\n\t\t\tif (sign) value = calculator(sign, value, Number.parseInt(mod[2], 10));\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t} else {\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue: Number.parseInt(mod[2], 10),\n\t\t\t};\n\t\t}\n\t}\n\n\tif (dice.match(/\\d+?#(.*)/)) {\n\t\tconst diceArray = dice.split(\"#\");\n\t\tconst numberOfDice = Number.parseInt(diceArray[0], 10);\n\t\tconst diceToRoll = diceArray[1].replace(COMMENT_REGEX, \"\");\n\t\tconst commentsMatch = diceArray[1].match(COMMENT_REGEX);\n\t\tconst comments = commentsMatch ? commentsMatch[2] : undefined;\n\t\tconst roller = new DiceRoller();\n\t\t//remove comments if any\n\t\tfor (let i = 0; i < numberOfDice; i++) {\n\t\t\ttry {\n\t\t\t\troller.roll(diceToRoll);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new DiceTypeError(diceToRoll, \"roll\", error);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tdice: diceToRoll,\n\t\t\tresult: roller.output,\n\t\t\tcomment: comments,\n\t\t\tcompare: compare ? compare : undefined,\n\t\t\tmodifier: modificator,\n\t\t};\n\t}\n\tconst roller = new DiceRoller();\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\");\n\ttry {\n\t\troller.roll(diceWithoutComment);\n\t} catch (error) {\n\t\tthrow new DiceTypeError(diceWithoutComment, \"roll\", error);\n\t}\n\tconst commentMatch = dice.match(COMMENT_REGEX);\n\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\treturn {\n\t\tdice,\n\t\tresult: roller.output,\n\t\tcomment,\n\t\tcompare: compare ? compare : undefined,\n\t\tmodifier: modificator,\n\t};\n}\n/**\n * Evaluate a formula and replace \"^\" by \"**\" if any\n * @param {Sign} sign\n * @param {number} value\n * @param {number} total\n * @returns\n */\nexport function calculator(sign: Sign, value: number, total: number): number {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tif (sign === \"^\") sign = \"**\";\n\treturn evaluate(`${total} ${sign} ${value}`);\n}\n","export class DiceTypeError extends Error {\n\tpublic readonly dice: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(dice: string, cause?: string, method?: unknown) {\n\t\tsuper(dice);\n\t\tthis.name = \"Invalid_Dice_Type\";\n\t\tthis.dice = dice;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class FormulaError extends Error {\n\tpublic readonly formula: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(formula: string, cause?: string, method?: unknown) {\n\t\tsuper(formula);\n\t\tthis.name = \"Invalid_Formula\";\n\t\tthis.formula = formula;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class MaxGreater extends Error {\n\tpublic readonly name: string;\n\tpublic readonly value: number;\n\tpublic readonly max: number;\n\n\tconstructor(value: number, max: number) {\n\t\tsuper(value.toString());\n\t\tthis.name = \"Max_Greater\";\n\t\tthis.value = value;\n\t\tthis.max = max;\n\t}\n}\n\nexport class EmptyObjectError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Empty_Object\";\n\t}\n}\n\nexport class TooManyDice extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Dice\";\n\t}\n}\n\nexport class NoStatisticsError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"No_Statistics\";\n\t}\n}\n","import { evaluate } from \"mathjs\";\nimport removeAccents from \"remove-accents\";\nimport { FormulaError } from \"./errors\";\n\n/**\n * Escape regex string\n * @param string {string}\n */\nexport function escapeRegex(string: string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Replace the stat name by their value using stat and after evaluate any formula using `replaceFormulaInDice`\n * @param originalDice {dice}\n * @param stats {[name: string]: number}\n */\nexport function generateStatsDice(\n\toriginalDice: string,\n\tstats?: { [name: string]: number }\n) {\n\tlet dice = originalDice;\n\tif (stats && Object.keys(stats).length > 0) {\n\t\t//damage field support adding statistic, like : 1d6 + strength\n\t\t//check if the value contains a statistic & calculate if it's okay\n\t\t//the dice will be converted before roll\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(removeAccents(stat)), \"gi\");\n\t\t\tif (dice.match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = dice.replace(regex, statValue.toString());\n\t\t\t}\n\t\t}\n\t}\n\treturn replaceFormulaInDice(dice);\n}\n\n/**\n * Replace the {{}} in the dice string and evaluate the interior if any\n * @param dice {string}\n */\nexport function replaceFormulaInDice(dice: string) {\n\tconst formula = /(?<formula>\\{{2}(.+?)\\}{2})/gim;\n\tconst formulaMatch = formula.exec(dice);\n\tif (formulaMatch?.groups?.formula) {\n\t\tconst formula = formulaMatch.groups.formula.replaceAll(\"{{\", \"\").replaceAll(\"}}\", \"\");\n\t\ttry {\n\t\t\tconst result = evaluate(formula);\n\t\t\treturn cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(formulaMatch.groups.formula, \"replaceFormulaInDice\", error);\n\t\t}\n\t}\n\treturn cleanedDice(dice);\n}\n\n/**\n * Replace the ++ +- -- by their proper value:\n * - `++` = `+`\n * - `+-` = `-`\n * - `--` = `+`\n * @param dice {string}\n */\nexport function cleanedDice(dice: string) {\n\treturn dice.replaceAll(\"+-\", \"-\").replaceAll(\"--\", \"+\").replaceAll(\"++\", \"+\");\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { evaluate } from \"mathjs\";\nimport { Random } from \"random-js\";\nimport removeAccents from \"remove-accents\";\n\nimport type { Statistic, StatisticalTemplate } from \".\";\nimport { roll } from \"./dice\";\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\nimport {\n\tDiceTypeError,\n\tEmptyObjectError,\n\tFormulaError,\n\tMaxGreater,\n\tNoStatisticsError,\n\tTooManyDice,\n} from \"./errors\";\n\n/**\n * Verify if the provided dice work with random value\n * @param testDice {string}\n * @param stats {[name: string]: number}\n */\nexport function evalStatsDice(testDice: string, stats?: { [name: string]: number }) {\n\tlet dice = testDice;\n\tif (stats && Object.keys(stats).length > 0) {\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(removeAccents(stat)), \"gi\");\n\t\t\tif (testDice.match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = testDice.replace(regex, statValue.toString());\n\t\t\t}\n\t\t}\n\t}\n\ttry {\n\t\tif (!roll(replaceFormulaInDice(dice)))\n\t\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", \"no roll result\");\n\t\treturn testDice;\n\t} catch (error) {\n\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", error);\n\t}\n}\n\n/**\n * Generate a random dice and remove the formula (+ evaluate it)\n * Used for diceDamage only\n * @param value {string}\n * @param template {StatisticalTemplate}\n * @returns\n */\nexport function diceRandomParse(value: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return value;\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tvalue = removeAccents(value);\n\tconst allStats = Object.keys(template.statistics).map((stat) =>\n\t\tremoveAccents(stat).toLowerCase()\n\t);\n\tlet newDice = value;\n\tfor (const stat of allStats) {\n\t\tconst regex = new RegExp(escapeRegex(stat), \"gi\");\n\t\tif (value.match(regex)) {\n\t\t\tlet max: undefined | number = undefined;\n\t\t\tlet min: undefined | number = undefined;\n\t\t\tconst stats = template.statistics?.[stat];\n\t\t\tif (stats) {\n\t\t\t\tmax = template.statistics[removeAccents(stat).toLowerCase()].max;\n\t\t\t\tmin = template.statistics[removeAccents(stat).toLowerCase()].min;\n\t\t\t}\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tnewDice = value.replace(regex, randomStatValue.toString());\n\t\t}\n\t}\n\treturn replaceFormulaInDice(newDice);\n}\n\n/**\n * Same as damageDice but for DiceType\n * @param dice {string}\n * @param template {StatisticalTemplate}\n */\nexport function diceTypeRandomParse(dice: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return dice;\n\tconst firstStatNotCombinaison = Object.keys(template.statistics).find(\n\t\t(stat) => !template.statistics?.[stat].combinaison\n\t);\n\tif (!firstStatNotCombinaison) return dice;\n\tconst stats = template.statistics[firstStatNotCombinaison];\n\tconst { min, max } = stats;\n\tconst total = template.total || 100;\n\tconst randomStatValue = generateRandomStat(total, max, min);\n\treturn replaceFormulaInDice(dice.replace(\"$\", randomStatValue.toString()));\n}\n\n/**\n * Random the combinaison and evaluate it to check if everything is valid\n * @param combinaison {[name: string]: string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalCombinaison(\n\tcombinaison: { [name: string]: string },\n\tstats: { [name: string]: string | number }\n) {\n\tconst newStats: { [name: string]: number } = {};\n\tfor (const [stat, combin] of Object.entries(combinaison)) {\n\t\t//replace the stats in formula\n\t\tlet formula = removeAccents(combin);\n\t\tfor (const [statName, value] of Object.entries(stats)) {\n\t\t\tconst regex = new RegExp(removeAccents(statName), \"gi\");\n\t\t\tformula = formula.replace(regex, value.toString());\n\t\t}\n\t\ttry {\n\t\t\tconst result = evaluate(formula);\n\t\t\tnewStats[stat] = result;\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(stat, \"evalCombinaison\", error);\n\t\t}\n\t}\n\treturn newStats;\n}\n\n/**\n * Evaluate one selected combinaison\n * @param combinaison {string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalOneCombinaison(\n\tcombinaison: string,\n\tstats: { [name: string]: string | number }\n) {\n\tlet formula = removeAccents(combinaison);\n\tfor (const [statName, value] of Object.entries(stats)) {\n\t\tconst regex = new RegExp(removeAccents(statName), \"gi\");\n\t\tformula = formula.replace(regex, value.toString());\n\t}\n\ttry {\n\t\treturn evaluate(formula);\n\t} catch (error) {\n\t\tthrow new FormulaError(combinaison, \"evalOneCombinaison\", error);\n\t}\n}\n\n/**\n * Parse the provided JSON and verify each field to check if everything could work when rolling\n * @param {any} template\n * @returns {StatisticalTemplate}\n */\n//biome-ignore lint/suspicious/noExplicitAny: I need to use any to allow any type\nexport function verifyTemplateValue(template: any): StatisticalTemplate {\n\tconst statistiqueTemplate: StatisticalTemplate = {\n\t\tdiceType: \"\",\n\t\tstatistics: {} as Statistic,\n\t};\n\tif (!template.statistics) statistiqueTemplate.statistics = undefined;\n\telse if (template.statistics && Object.keys(template.statistics).length > 0) {\n\t\tfor (const [key, value] of Object.entries(template.statistics)) {\n\t\t\tconst dataValue = value as { max?: number; min?: number; combinaison?: string };\n\t\t\tif (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)\n\t\t\t\tthrow new MaxGreater(dataValue.min, dataValue.max);\n\t\t\tif (dataValue.max && dataValue.max <= 0) dataValue.max = undefined;\n\t\t\tif (dataValue.min && dataValue.min <= 0) dataValue.min = undefined;\n\t\t\tlet formula = dataValue.combinaison\n\t\t\t\t? removeAccents(dataValue.combinaison).toLowerCase()\n\t\t\t\t: undefined;\n\t\t\tformula = formula && formula.trim().length > 0 ? formula : undefined;\n\t\t\tif (!statistiqueTemplate.statistics) {\n\t\t\t\tstatistiqueTemplate.statistics = {} as Statistic;\n\t\t\t}\n\t\t\tstatistiqueTemplate.statistics[key] = {\n\t\t\t\tmax: dataValue.max,\n\t\t\t\tmin: dataValue.min,\n\t\t\t\tcombinaison: formula || undefined,\n\t\t\t};\n\t\t}\n\t}\n\tif (template.diceType) {\n\t\ttry {\n\t\t\tstatistiqueTemplate.diceType = template.diceType;\n\t\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\n\t\t\tconst rolled = roll(cleanedDice);\n\t\t\tif (!rolled)\n\t\t\t\tthrow new DiceTypeError(cleanedDice, \"verifyTemplateValue\", \"no roll result\");\n\t\t} catch (e) {\n\t\t\tthrow new Error((e as Error).message);\n\t\t}\n\t}\n\n\tif (template.critical && Object.keys(template.critical).length > 0) {\n\t\tstatistiqueTemplate.critical = {\n\t\t\tfailure: template.critical.failure ?? undefined,\n\t\t\tsuccess: template.critical.success ?? undefined,\n\t\t};\n\t}\n\tif (template.total) {\n\t\tif (template.total <= 0) template.total = undefined;\n\t\tstatistiqueTemplate.total = template.total;\n\t}\n\tif (template.charName) statistiqueTemplate.charName = template.charName;\n\tif (template.damage) statistiqueTemplate.damage = template.damage;\n\ttry {\n\t\ttestDiceRegistered(statistiqueTemplate);\n\t\ttestStatCombinaison(statistiqueTemplate);\n\t} catch (error) {\n\t\tthrow new Error((error as Error).message);\n\t}\n\treturn statistiqueTemplate;\n}\n\n/**\n * Test each damage roll from the template.damage\n * @param {StatisticalTemplate} template\n */\nexport function testDiceRegistered(template: StatisticalTemplate) {\n\tif (!template.damage) return;\n\tif (Object.keys(template.damage).length === 0) throw new EmptyObjectError();\n\tif (Object.keys(template.damage).length > 25) throw new TooManyDice();\n\tfor (const [name, dice] of Object.entries(template.damage)) {\n\t\tif (!dice) continue;\n\t\tconst randomDiceParsed = diceRandomParse(dice, template);\n\t\ttry {\n\t\t\tconst rolled = roll(randomDiceParsed);\n\t\t\tif (!rolled) throw new DiceTypeError(name, \"testDiceRegistered\", \"no roll result\");\n\t\t} catch (error) {\n\t\t\tthrow new DiceTypeError(name, \"testDiceRegistered\", error);\n\t\t}\n\t}\n}\n\n/**\n * Test all combinaison with generated random value\n * @param {StatisticalTemplate} template\n */\nexport function testStatCombinaison(template: StatisticalTemplate) {\n\tif (!template.statistics) return;\n\tconst onlyCombinaisonStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(\n\t\t\t([_, value]) => value.combinaison !== undefined\n\t\t)\n\t);\n\tconst allOtherStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(([_, value]) => !value.combinaison)\n\t);\n\tif (Object.keys(onlyCombinaisonStats).length === 0) return;\n\tconst allStats = Object.keys(template.statistics).filter(\n\t\t(stat) => !template.statistics![stat].combinaison\n\t);\n\tif (allStats.length === 0) throw new NoStatisticsError();\n\tconst error = [];\n\tfor (const [stat, value] of Object.entries(onlyCombinaisonStats)) {\n\t\tlet formula = value.combinaison as string;\n\t\tfor (const [other, data] of Object.entries(allOtherStats)) {\n\t\t\tconst { max, min } = data;\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tconst regex = new RegExp(other, \"gi\");\n\t\t\tformula = formula.replace(regex, randomStatValue.toString());\n\t\t}\n\t\ttry {\n\t\t\tevaluate(formula);\n\t\t} catch (e) {\n\t\t\terror.push(stat);\n\t\t}\n\t}\n\tif (error.length > 0) throw new FormulaError(error.join(\", \"), \"testStatCombinaison\");\n\treturn;\n}\n\n/**\n * Generate a random stat based on the template and the statistical min and max\n * @param {number|undefined} total\n * @param {number | undefined} max\n * @param {number | undefined} min\n * @returns\n */\nexport function generateRandomStat(\n\ttotal: number | undefined = 100,\n\tmax?: number,\n\tmin?: number\n) {\n\tlet randomStatValue = total + 1;\n\twhile (randomStatValue >= total) {\n\t\tconst random = new Random();\n\t\tif (max && min) randomStatValue = random.integer(min, max);\n\t\telse if (max) randomStatValue = random.integer(0, max);\n\t\telse if (min) randomStatValue = random.integer(min, total);\n\t\telse randomStatValue = random.integer(0, total);\n\t}\n\treturn randomStatValue;\n}\n"],"mappings":"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","names":["roller","import_mathjs","removeAccents","formula","import_mathjs","import_remove_accents","removeAccents","cleanedDice"]}
|