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