From 11e42c77fdd553ecc07d78620c8cb0d894e3fcc4 Mon Sep 17 00:00:00 2001 From: "Ean Milligan (Bastion)" Date: Wed, 29 Jun 2022 03:16:19 -0400 Subject: [PATCH] rework, deduplicated code --- src/solver/customRollers/cwod.ts | 60 -------------------------------- src/solver/roller.ts | 27 +++++++++++--- 2 files changed, 22 insertions(+), 65 deletions(-) delete mode 100644 src/solver/customRollers/cwod.ts diff --git a/src/solver/customRollers/cwod.ts b/src/solver/customRollers/cwod.ts deleted file mode 100644 index 054e6fe..0000000 --- a/src/solver/customRollers/cwod.ts +++ /dev/null @@ -1,60 +0,0 @@ -import config from '../../../config.ts'; -import { - // Log4Deno deps - log, - LT, -} from '../../../deps.ts'; -import { RollSet } from '../solver.d.ts'; -import { genRoll, loggingEnabled } from '../rollUtils.ts'; - -export const rollCWOD = (rollStr: string): RollSet[] => { - // Parse the roll - const cwodParts = rollStr.split('cwod'); - const cwodConf = { - dieCount: parseInt(cwodParts[0] || '1'), - difficulty: parseInt(cwodParts[1] || '10'), - }; - - // Begin counting the number of loops to prevent from getting into an infinite loop - let loopCount = 0; - - // Roll the roll - const rollSet = []; - - const templateRoll: RollSet = { - type: 'cwod', - origidx: 0, - roll: 0, - dropped: false, - rerolled: false, - exploding: false, - critHit: false, - critFail: false, - }; - - for (let i = 0; i < cwodConf.dieCount; i++) { - loggingEnabled && log(LT.LOG, `Handling cwod ${rollStr} | Initial rolling ${i} of ${JSON.stringify(cwodConf)}`); - // If loopCount gets too high, stop trying to calculate infinity - if (loopCount > config.limits.maxLoops) { - throw new Error('MaxLoopsExceeded'); - } - - // Copy the template to fill out for this iteration - const rolling = JSON.parse(JSON.stringify(templateRoll)); - - // Roll this die - rolling.roll = genRoll(10, false, false); - rolling.origidx = i; - - // Set success/fail flags - rolling.critHit = rolling.roll >= cwodConf.difficulty; - rolling.critFail = rolling.roll === 1; - - // Add in the new roll - rollSet.push(rolling); - - loopCount++; - } - - return rollSet; -}; \ No newline at end of file diff --git a/src/solver/roller.ts b/src/solver/roller.ts index 1141507..e9e4daf 100644 --- a/src/solver/roller.ts +++ b/src/solver/roller.ts @@ -5,8 +5,7 @@ import { LT, } from '../../deps.ts'; -import { RollSet, RollConf } from './solver.d.ts'; -import { rollCWOD } from './customRollers/cwod.ts'; +import { RollSet, RollConf, RollType } from './solver.d.ts'; import { compareOrigidx, compareRolls, genRoll, loggingEnabled } from './rollUtils.ts'; // roll(rollStr, maximiseRoll, nominalRoll) returns RollSet @@ -25,6 +24,7 @@ export const roll = (rollStr: string, maximiseRoll: boolean, nominalRoll: boolea const dpts = rollStr.split('d'); // Initialize the configuration to store the parsed data + let rollType: RollType = 'roll20'; const rollConf: RollConf = { dieCount: 0, dieSize: 0, @@ -90,15 +90,32 @@ export const roll = (rollStr: string, maximiseRoll: boolean, nominalRoll: boolea throw new Error('YouNeedAD'); } + // Manual Parsing for custom roll types + let manualParse = false; if (rawDC.endsWith('cwo')) { - return rollCWOD(rollStr); + // CWOD dice parsing + rollType = 'cwod'; + manualParse = true; + + // Get CWOD parts, setting count and getting difficulty + const cwodParts = rollStr.split('cwod'); + rollConf.dieCount = parseInt(cwodParts[0] || '1'); + rollConf.dieSize = 10; + + // Use critScore to set the difficulty + rollConf.critScore.on = true; + const difficulty = parseInt(cwodParts[1] || '10') + for (let i = difficulty; i <= rollConf.dieSize; i++) { + loggingEnabled && log(LT.LOG, `handling cwod ${rollStr} | Parsing difficulty ${i}`); + rollConf.critScore.range.push(i); + } } loggingEnabled && log(LT.LOG, `Handling roll20 ${rollStr} | Parsed Die Count: ${rollConf.dieCount}`); loggingEnabled && log(LT.LOG, `Handling roll20 ${rollStr} | Parsed Die Size: ${rollConf.dieSize}`); // Finish parsing the roll - if (remains.length > 0) { + if (manualParse || remains.length > 0) { // Determine if the first item is a drop, and if it is, add the d back in if (remains.search(/\D/) !== 0 || remains.indexOf('l') === 0 || remains.indexOf('h') === 0) { remains = `d${remains}`; @@ -337,7 +354,7 @@ export const roll = (rollStr: string, maximiseRoll: boolean, nominalRoll: boolea // Initialize a templet rollSet to copy multiple times const templateRoll: RollSet = { - type: 'roll20', + type: rollType, origidx: 0, roll: 0, dropped: false,