rework, deduplicated code

This commit is contained in:
Ean Milligan (Bastion) 2022-06-29 03:16:19 -04:00
parent 6dd0bd0e8e
commit 11e42c77fd
2 changed files with 22 additions and 65 deletions

View File

@ -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;
};

View File

@ -5,8 +5,7 @@ import {
LT, LT,
} from '../../deps.ts'; } from '../../deps.ts';
import { RollSet, RollConf } from './solver.d.ts'; import { RollSet, RollConf, RollType } from './solver.d.ts';
import { rollCWOD } from './customRollers/cwod.ts';
import { compareOrigidx, compareRolls, genRoll, loggingEnabled } from './rollUtils.ts'; import { compareOrigidx, compareRolls, genRoll, loggingEnabled } from './rollUtils.ts';
// roll(rollStr, maximiseRoll, nominalRoll) returns RollSet // roll(rollStr, maximiseRoll, nominalRoll) returns RollSet
@ -25,6 +24,7 @@ export const roll = (rollStr: string, maximiseRoll: boolean, nominalRoll: boolea
const dpts = rollStr.split('d'); const dpts = rollStr.split('d');
// Initialize the configuration to store the parsed data // Initialize the configuration to store the parsed data
let rollType: RollType = 'roll20';
const rollConf: RollConf = { const rollConf: RollConf = {
dieCount: 0, dieCount: 0,
dieSize: 0, dieSize: 0,
@ -90,15 +90,32 @@ export const roll = (rollStr: string, maximiseRoll: boolean, nominalRoll: boolea
throw new Error('YouNeedAD'); throw new Error('YouNeedAD');
} }
// Manual Parsing for custom roll types
let manualParse = false;
if (rawDC.endsWith('cwo')) { 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 Count: ${rollConf.dieCount}`);
loggingEnabled && log(LT.LOG, `Handling roll20 ${rollStr} | Parsed Die Size: ${rollConf.dieSize}`); loggingEnabled && log(LT.LOG, `Handling roll20 ${rollStr} | Parsed Die Size: ${rollConf.dieSize}`);
// Finish parsing the roll // 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 // 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) { if (remains.search(/\D/) !== 0 || remains.indexOf('l') === 0 || remains.indexOf('h') === 0) {
remains = `d${remains}`; remains = `d${remains}`;
@ -337,7 +354,7 @@ export const roll = (rollStr: string, maximiseRoll: boolean, nominalRoll: boolea
// Initialize a templet rollSet to copy multiple times // Initialize a templet rollSet to copy multiple times
const templateRoll: RollSet = { const templateRoll: RollSet = {
type: 'roll20', type: rollType,
origidx: 0, origidx: 0,
roll: 0, roll: 0,
dropped: false, dropped: false,