rework, deduplicated code
This commit is contained in:
parent
6dd0bd0e8e
commit
11e42c77fd
|
@ -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;
|
|
||||||
};
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue