@dicelette/core 1.2.1 → 1.2.2
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 +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +42 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
@@ -12,6 +12,7 @@ declare function roll(dice: string): Resultat | undefined;
|
|
12
12
|
* @returns
|
13
13
|
*/
|
14
14
|
declare function calculator(sign: Sign, value: number, total: number): number;
|
15
|
+
declare function multipleFunction(dice: string): Resultat | undefined;
|
15
16
|
|
16
17
|
interface Resultat {
|
17
18
|
/**
|
@@ -34,6 +35,10 @@ interface Resultat {
|
|
34
35
|
* If any value was added to the dice throw
|
35
36
|
*/
|
36
37
|
modifier?: Modifier;
|
38
|
+
/**
|
39
|
+
* Total of the roll
|
40
|
+
*/
|
41
|
+
total?: number;
|
37
42
|
}
|
38
43
|
interface Compare {
|
39
44
|
/**
|
@@ -252,4 +257,4 @@ declare class NoStatisticsError extends Error {
|
|
252
257
|
constructor();
|
253
258
|
}
|
254
259
|
|
255
|
-
export { COMMENT_REGEX, type Compare, type Critical, DiceTypeError, EmptyObjectError, FormulaError, MaxGreater, type Modifier, NoStatisticsError, type Resultat, type Sign, type Statistic, type StatisticalTemplate, TooManyDice, TooManyStats, calculator, cleanedDice, diceRandomParse, diceTypeRandomParse, escapeRegex, evalCombinaison, evalOneCombinaison, evalStatsDice, generateRandomStat, generateStatsDice, replaceFormulaInDice, roll, testDiceRegistered, testStatCombinaison, verifyTemplateValue };
|
260
|
+
export { COMMENT_REGEX, type Compare, type Critical, DiceTypeError, EmptyObjectError, FormulaError, MaxGreater, type Modifier, NoStatisticsError, type Resultat, type Sign, type Statistic, type StatisticalTemplate, TooManyDice, TooManyStats, calculator, cleanedDice, diceRandomParse, diceTypeRandomParse, escapeRegex, evalCombinaison, evalOneCombinaison, evalStatsDice, generateRandomStat, generateStatsDice, multipleFunction, replaceFormulaInDice, roll, testDiceRegistered, testStatCombinaison, verifyTemplateValue };
|
package/dist/index.d.ts
CHANGED
@@ -12,6 +12,7 @@ declare function roll(dice: string): Resultat | undefined;
|
|
12
12
|
* @returns
|
13
13
|
*/
|
14
14
|
declare function calculator(sign: Sign, value: number, total: number): number;
|
15
|
+
declare function multipleFunction(dice: string): Resultat | undefined;
|
15
16
|
|
16
17
|
interface Resultat {
|
17
18
|
/**
|
@@ -34,6 +35,10 @@ interface Resultat {
|
|
34
35
|
* If any value was added to the dice throw
|
35
36
|
*/
|
36
37
|
modifier?: Modifier;
|
38
|
+
/**
|
39
|
+
* Total of the roll
|
40
|
+
*/
|
41
|
+
total?: number;
|
37
42
|
}
|
38
43
|
interface Compare {
|
39
44
|
/**
|
@@ -252,4 +257,4 @@ declare class NoStatisticsError extends Error {
|
|
252
257
|
constructor();
|
253
258
|
}
|
254
259
|
|
255
|
-
export { COMMENT_REGEX, type Compare, type Critical, DiceTypeError, EmptyObjectError, FormulaError, MaxGreater, type Modifier, NoStatisticsError, type Resultat, type Sign, type Statistic, type StatisticalTemplate, TooManyDice, TooManyStats, calculator, cleanedDice, diceRandomParse, diceTypeRandomParse, escapeRegex, evalCombinaison, evalOneCombinaison, evalStatsDice, generateRandomStat, generateStatsDice, replaceFormulaInDice, roll, testDiceRegistered, testStatCombinaison, verifyTemplateValue };
|
260
|
+
export { COMMENT_REGEX, type Compare, type Critical, DiceTypeError, EmptyObjectError, FormulaError, MaxGreater, type Modifier, NoStatisticsError, type Resultat, type Sign, type Statistic, type StatisticalTemplate, TooManyDice, TooManyStats, calculator, cleanedDice, diceRandomParse, diceTypeRandomParse, escapeRegex, evalCombinaison, evalOneCombinaison, evalStatsDice, generateRandomStat, generateStatsDice, multipleFunction, replaceFormulaInDice, roll, testDiceRegistered, testStatCombinaison, verifyTemplateValue };
|
package/dist/index.js
CHANGED
@@ -48,6 +48,7 @@ __export(src_exports, {
|
|
48
48
|
evalStatsDice: () => evalStatsDice,
|
49
49
|
generateRandomStat: () => generateRandomStat,
|
50
50
|
generateStatsDice: () => generateStatsDice,
|
51
|
+
multipleFunction: () => multipleFunction,
|
51
52
|
replaceFormulaInDice: () => replaceFormulaInDice,
|
52
53
|
roll: () => roll,
|
53
54
|
testDiceRegistered: () => testDiceRegistered,
|
@@ -140,7 +141,7 @@ function roll(dice) {
|
|
140
141
|
const sign = calc.match(/[+-\/\*\^]/)?.[0];
|
141
142
|
const compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];
|
142
143
|
if (sign) {
|
143
|
-
const toCalc = calc.replace(SIGN_REGEX, "").replace(/\s/g, "");
|
144
|
+
const toCalc = calc.replace(SIGN_REGEX, "").replace(/\s/g, "").replace(/;(.*)/, "");
|
144
145
|
const total = (0, import_mathjs.evaluate)(toCalc);
|
145
146
|
dice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);
|
146
147
|
compare = {
|
@@ -172,6 +173,8 @@ function roll(dice) {
|
|
172
173
|
};
|
173
174
|
}
|
174
175
|
}
|
176
|
+
if (dice.includes(";") && dice.includes("\xB5"))
|
177
|
+
return multipleFunction(dice);
|
175
178
|
if (dice.match(/\d+?#(.*)/)) {
|
176
179
|
const diceArray = dice.split("#");
|
177
180
|
const numberOfDice = Number.parseInt(diceArray[0], 10);
|
@@ -191,7 +194,8 @@ function roll(dice) {
|
|
191
194
|
result: roller2.output,
|
192
195
|
comment: comments,
|
193
196
|
compare: compare ? compare : void 0,
|
194
|
-
modifier: modificator
|
197
|
+
modifier: modificator,
|
198
|
+
total: roller2.total
|
195
199
|
};
|
196
200
|
}
|
197
201
|
const roller = new import_rpg_dice_roller.DiceRoller();
|
@@ -208,7 +212,8 @@ function roll(dice) {
|
|
208
212
|
result: roller.output,
|
209
213
|
comment,
|
210
214
|
compare: compare ? compare : void 0,
|
211
|
-
modifier: modificator
|
215
|
+
modifier: modificator,
|
216
|
+
total: roller.total
|
212
217
|
};
|
213
218
|
}
|
214
219
|
function calculator(sign, value, total) {
|
@@ -216,6 +221,39 @@ function calculator(sign, value, total) {
|
|
216
221
|
sign = "**";
|
217
222
|
return (0, import_mathjs.evaluate)(`${total} ${sign} ${value}`);
|
218
223
|
}
|
224
|
+
function multipleFunction(dice) {
|
225
|
+
const results = [];
|
226
|
+
const split = dice.split(";");
|
227
|
+
const diceResult = roll(split[0]);
|
228
|
+
if (!diceResult || !diceResult.total)
|
229
|
+
return void 0;
|
230
|
+
results.push(`${diceResult.result}`);
|
231
|
+
let total = diceResult.total;
|
232
|
+
let comments = diceResult.comment ?? "";
|
233
|
+
if (!total)
|
234
|
+
return diceResult;
|
235
|
+
for (let element of split.slice(1)) {
|
236
|
+
const commentMatch = element.match(COMMENT_REGEX);
|
237
|
+
element = element.replace(COMMENT_REGEX, "");
|
238
|
+
const comment = commentMatch ? commentMatch[2] : void 0;
|
239
|
+
if (comment)
|
240
|
+
comments += ` ${comment}`;
|
241
|
+
const toRoll = element.replace("\xB5", `${diceResult.total}`);
|
242
|
+
const formule = element.replace("\xB5", `[${diceResult.total}]`);
|
243
|
+
const diceAll = element.replace("\xB5", diceResult.dice.replace(COMMENT_REGEX, ""));
|
244
|
+
const resultat = (0, import_mathjs.evaluate)(toRoll);
|
245
|
+
results.push(`\u2713 ${diceAll}: ${formule} = ${resultat}`);
|
246
|
+
total += resultat;
|
247
|
+
}
|
248
|
+
return {
|
249
|
+
dice: split[0],
|
250
|
+
result: results.join("\n"),
|
251
|
+
comment: comments,
|
252
|
+
compare: diceResult.compare,
|
253
|
+
modifier: diceResult.modifier,
|
254
|
+
total
|
255
|
+
};
|
256
|
+
}
|
219
257
|
|
220
258
|
// src/utils.ts
|
221
259
|
var import_mathjs2 = require("mathjs");
|
@@ -504,6 +542,7 @@ function generateRandomStat(total = 100, max, min) {
|
|
504
542
|
evalStatsDice,
|
505
543
|
generateRandomStat,
|
506
544
|
generateStatsDice,
|
545
|
+
multipleFunction,
|
507
546
|
replaceFormulaInDice,
|
508
547
|
roll,
|
509
548
|
testDiceRegistered,
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
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 TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\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\tTooManyStats,\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\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\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"]}
|
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, \"\").replace(/;(.*)/, \"\");\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\tif (dice.includes(\";\") && dice.includes(\"µ\")) return multipleFunction(dice);\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\ttotal: roller.total,\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\ttotal: roller.total,\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\nexport function multipleFunction(dice: string): Resultat | undefined {\n\tconst results = [];\n\tconst split = dice.split(\";\");\n\tconst diceResult = roll(split[0]);\n\tif (!diceResult || !diceResult.total) return undefined;\n\tresults.push(`${diceResult.result}`);\n\tlet total = diceResult.total;\n\tlet comments = diceResult.comment ?? \"\";\n\tif (!total) return diceResult;\n\tfor (let element of split.slice(1)) {\n\t\t//remove comments & keep it\n\t\tconst commentMatch = element.match(COMMENT_REGEX);\n\t\telement = element.replace(COMMENT_REGEX, \"\");\n\t\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\t\tif (comment) comments += ` ${comment}`;\n\t\tconst toRoll = element.replace(\"µ\", `${diceResult.total}`);\n\t\tconst formule = element.replace(\"µ\", `[${diceResult.total}]`);\n\t\tconst diceAll = element.replace(\"µ\", diceResult.dice.replace(COMMENT_REGEX, \"\"));\n\t\tconst resultat = evaluate(toRoll);\n\t\tresults.push(`✓ ${diceAll}: ${formule} = ${resultat}`);\n\t\ttotal += resultat;\n\t}\n\n\treturn {\n\t\t\tdice: split[0],\n\t\t\tresult: results.join(\"\\n\"),\n\t\t\tcomment: comments,\n\t\t\tcompare: diceResult.compare,\n\t\t\tmodifier: diceResult.modifier,\n\t\t\ttotal\n\t\t}\n\t\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 TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\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\tTooManyStats,\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\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\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"]}
|
package/dist/index.mjs
CHANGED
@@ -82,7 +82,7 @@ function roll(dice) {
|
|
82
82
|
const sign = calc.match(/[+-\/\*\^]/)?.[0];
|
83
83
|
const compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];
|
84
84
|
if (sign) {
|
85
|
-
const toCalc = calc.replace(SIGN_REGEX, "").replace(/\s/g, "");
|
85
|
+
const toCalc = calc.replace(SIGN_REGEX, "").replace(/\s/g, "").replace(/;(.*)/, "");
|
86
86
|
const total = evaluate(toCalc);
|
87
87
|
dice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);
|
88
88
|
compare = {
|
@@ -114,6 +114,8 @@ function roll(dice) {
|
|
114
114
|
};
|
115
115
|
}
|
116
116
|
}
|
117
|
+
if (dice.includes(";") && dice.includes("\xB5"))
|
118
|
+
return multipleFunction(dice);
|
117
119
|
if (dice.match(/\d+?#(.*)/)) {
|
118
120
|
const diceArray = dice.split("#");
|
119
121
|
const numberOfDice = Number.parseInt(diceArray[0], 10);
|
@@ -133,7 +135,8 @@ function roll(dice) {
|
|
133
135
|
result: roller2.output,
|
134
136
|
comment: comments,
|
135
137
|
compare: compare ? compare : void 0,
|
136
|
-
modifier: modificator
|
138
|
+
modifier: modificator,
|
139
|
+
total: roller2.total
|
137
140
|
};
|
138
141
|
}
|
139
142
|
const roller = new DiceRoller();
|
@@ -150,7 +153,8 @@ function roll(dice) {
|
|
150
153
|
result: roller.output,
|
151
154
|
comment,
|
152
155
|
compare: compare ? compare : void 0,
|
153
|
-
modifier: modificator
|
156
|
+
modifier: modificator,
|
157
|
+
total: roller.total
|
154
158
|
};
|
155
159
|
}
|
156
160
|
function calculator(sign, value, total) {
|
@@ -158,6 +162,39 @@ function calculator(sign, value, total) {
|
|
158
162
|
sign = "**";
|
159
163
|
return evaluate(`${total} ${sign} ${value}`);
|
160
164
|
}
|
165
|
+
function multipleFunction(dice) {
|
166
|
+
const results = [];
|
167
|
+
const split = dice.split(";");
|
168
|
+
const diceResult = roll(split[0]);
|
169
|
+
if (!diceResult || !diceResult.total)
|
170
|
+
return void 0;
|
171
|
+
results.push(`${diceResult.result}`);
|
172
|
+
let total = diceResult.total;
|
173
|
+
let comments = diceResult.comment ?? "";
|
174
|
+
if (!total)
|
175
|
+
return diceResult;
|
176
|
+
for (let element of split.slice(1)) {
|
177
|
+
const commentMatch = element.match(COMMENT_REGEX);
|
178
|
+
element = element.replace(COMMENT_REGEX, "");
|
179
|
+
const comment = commentMatch ? commentMatch[2] : void 0;
|
180
|
+
if (comment)
|
181
|
+
comments += ` ${comment}`;
|
182
|
+
const toRoll = element.replace("\xB5", `${diceResult.total}`);
|
183
|
+
const formule = element.replace("\xB5", `[${diceResult.total}]`);
|
184
|
+
const diceAll = element.replace("\xB5", diceResult.dice.replace(COMMENT_REGEX, ""));
|
185
|
+
const resultat = evaluate(toRoll);
|
186
|
+
results.push(`\u2713 ${diceAll}: ${formule} = ${resultat}`);
|
187
|
+
total += resultat;
|
188
|
+
}
|
189
|
+
return {
|
190
|
+
dice: split[0],
|
191
|
+
result: results.join("\n"),
|
192
|
+
comment: comments,
|
193
|
+
compare: diceResult.compare,
|
194
|
+
modifier: diceResult.modifier,
|
195
|
+
total
|
196
|
+
};
|
197
|
+
}
|
161
198
|
|
162
199
|
// src/utils.ts
|
163
200
|
import { evaluate as evaluate2 } from "mathjs";
|
@@ -445,6 +482,7 @@ export {
|
|
445
482
|
evalStatsDice,
|
446
483
|
generateRandomStat,
|
447
484
|
generateStatsDice,
|
485
|
+
multipleFunction,
|
448
486
|
replaceFormulaInDice,
|
449
487
|
roll,
|
450
488
|
testDiceRegistered,
|
package/dist/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/dice.ts","../src/errors.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["/* 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 TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\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\tTooManyStats,\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\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\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","evaluate","formula","evaluate","evaluate","removeAccents","removeAccents","evaluate","cleanedDice"]}
|
1
|
+
{"version":3,"sources":["../src/dice.ts","../src/errors.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["/* 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, \"\").replace(/;(.*)/, \"\");\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\tif (dice.includes(\";\") && dice.includes(\"µ\")) return multipleFunction(dice);\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\ttotal: roller.total,\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\ttotal: roller.total,\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\nexport function multipleFunction(dice: string): Resultat | undefined {\n\tconst results = [];\n\tconst split = dice.split(\";\");\n\tconst diceResult = roll(split[0]);\n\tif (!diceResult || !diceResult.total) return undefined;\n\tresults.push(`${diceResult.result}`);\n\tlet total = diceResult.total;\n\tlet comments = diceResult.comment ?? \"\";\n\tif (!total) return diceResult;\n\tfor (let element of split.slice(1)) {\n\t\t//remove comments & keep it\n\t\tconst commentMatch = element.match(COMMENT_REGEX);\n\t\telement = element.replace(COMMENT_REGEX, \"\");\n\t\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\t\tif (comment) comments += ` ${comment}`;\n\t\tconst toRoll = element.replace(\"µ\", `${diceResult.total}`);\n\t\tconst formule = element.replace(\"µ\", `[${diceResult.total}]`);\n\t\tconst diceAll = element.replace(\"µ\", diceResult.dice.replace(COMMENT_REGEX, \"\"));\n\t\tconst resultat = evaluate(toRoll);\n\t\tresults.push(`✓ ${diceAll}: ${formule} = ${resultat}`);\n\t\ttotal += resultat;\n\t}\n\n\treturn {\n\t\t\tdice: split[0],\n\t\t\tresult: results.join(\"\\n\"),\n\t\t\tcomment: comments,\n\t\t\tcompare: diceResult.compare,\n\t\t\tmodifier: diceResult.modifier,\n\t\t\ttotal\n\t\t}\n\t\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 TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\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\tTooManyStats,\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\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\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","evaluate","formula","evaluate","evaluate","removeAccents","removeAccents","evaluate","cleanedDice"]}
|