fully fix fate dice
This commit is contained in:
		
							parent
							
								
									b6b1f872d2
								
							
						
					
					
						commit
						3ea48838f4
					
				| 
						 | 
				
			
			@ -92,6 +92,8 @@ export const executeRoll = (rollStr: string, modifiers: RollModifiers): Executed
 | 
			
		|||
 | 
			
		||||
    flagRoll(rollConf, rolling);
 | 
			
		||||
 | 
			
		||||
    loggingEnabled && log(LT.LOG, `${getLoopCount()} Roll done ${JSON.stringify(rolling)}`);
 | 
			
		||||
 | 
			
		||||
    // Push the newly created roll and loop again
 | 
			
		||||
    rollSet.push(rolling);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -138,11 +140,13 @@ export const executeRoll = (rollStr: string, modifiers: RollModifiers): Executed
 | 
			
		|||
          newReroll.roll = minMaxOverride;
 | 
			
		||||
        } else {
 | 
			
		||||
          // If nominalRoll is on, set the roll to the average roll of dieSize, otherwise generate a new random roll
 | 
			
		||||
          newReroll.roll = genRoll(rollConf.dieSize, modifiers, rollConf.dPercent);
 | 
			
		||||
          newReroll.roll = rollConf.type === 'fate' ? genFateRoll(modifiers) : genRoll(rollConf.dieSize, modifiers, rollConf.dPercent);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        flagRoll(rollConf, newReroll);
 | 
			
		||||
 | 
			
		||||
        loggingEnabled && log(LT.LOG, `${getLoopCount()} Roll done ${JSON.stringify(newReroll)}`);
 | 
			
		||||
 | 
			
		||||
        // Slot this new roll in after the current iteration so it can be processed in the next loop
 | 
			
		||||
        rollSet.splice(i + 1, 0, newReroll);
 | 
			
		||||
      } else if (
 | 
			
		||||
| 
						 | 
				
			
			@ -157,13 +161,15 @@ export const executeRoll = (rollStr: string, modifiers: RollModifiers): Executed
 | 
			
		|||
        // Copy the template to fill out for this iteration
 | 
			
		||||
        const newExplodingRoll = getTemplateRoll();
 | 
			
		||||
        // If maximizeRoll is on, set the roll to the dieSize, else if nominalRoll is on, set the roll to the average roll of dieSize, else generate a new random roll
 | 
			
		||||
        newExplodingRoll.roll = genRoll(rollConf.dieSize, modifiers, rollConf.dPercent);
 | 
			
		||||
        newExplodingRoll.roll = rollConf.type === 'fate' ? genFateRoll(modifiers) : genRoll(rollConf.dieSize, modifiers, rollConf.dPercent);
 | 
			
		||||
        newExplodingRoll.size = rollConf.dieSize;
 | 
			
		||||
        // Always mark this roll as exploding
 | 
			
		||||
        newExplodingRoll.exploding = true;
 | 
			
		||||
 | 
			
		||||
        flagRoll(rollConf, newExplodingRoll);
 | 
			
		||||
 | 
			
		||||
        loggingEnabled && log(LT.LOG, `${getLoopCount()} Roll done ${JSON.stringify(newExplodingRoll)}`);
 | 
			
		||||
 | 
			
		||||
        // Slot this new roll in after the current iteration so it can be processed in the next loop
 | 
			
		||||
        rollSet.splice(i + 1, 0, newExplodingRoll);
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
 | 
			
		||||
      loggingEnabled && log(LT.LOG, `${getLoopCount()} Handling ${rollConf.type} ${rollStr} | Parsing remains ${remains}`);
 | 
			
		||||
      // Find the next number in the remains to be able to cut out the rule name
 | 
			
		||||
      let afterSepIdx = remains.search(/\d/);
 | 
			
		||||
      let afterSepIdx = remains.search(/[-\d]/);
 | 
			
		||||
      if (afterSepIdx < 0) {
 | 
			
		||||
        afterSepIdx = remains.length;
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -220,6 +220,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
      const tempSep = remains.slice(0, afterSepIdx);
 | 
			
		||||
      let noNumberAfter = false;
 | 
			
		||||
      NumberlessDiceOptions.some((opt) => {
 | 
			
		||||
        loopCountCheck();
 | 
			
		||||
        if (tempSep.startsWith(opt) && tempSep !== opt) {
 | 
			
		||||
          afterSepIdx = opt.length;
 | 
			
		||||
          noNumberAfter = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -232,13 +233,15 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
      const tSep = remains.slice(0, afterSepIdx);
 | 
			
		||||
      remains = remains.slice(afterSepIdx);
 | 
			
		||||
      // Find the next non-number in the remains to be able to cut out the count/num
 | 
			
		||||
      let afterNumIdx = noNumberAfter ? 0 : remains.search(/\D/);
 | 
			
		||||
      let afterNumIdx = noNumberAfter ? 0 : remains.search(/(?![-\d])/);
 | 
			
		||||
      if (afterNumIdx < 0) {
 | 
			
		||||
        afterNumIdx = remains.length;
 | 
			
		||||
      }
 | 
			
		||||
      // Save the count/num to tNum leaving it in remains for the time being
 | 
			
		||||
      const tNum = parseInt(remains.slice(0, afterNumIdx));
 | 
			
		||||
 | 
			
		||||
      loggingEnabled && log(LT.LOG, `${getLoopCount()} tSep: ${tSep} ${afterSepIdx}, tNum: ${tNum} ${afterNumIdx}`);
 | 
			
		||||
 | 
			
		||||
      // Switch on rule name
 | 
			
		||||
      switch (tSep) {
 | 
			
		||||
        case DiceOptions.Drop:
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +306,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
        case DiceOptions.RerollLt:
 | 
			
		||||
          // Configure reroll for all numbers less than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
          rollConf.reroll.on = true;
 | 
			
		||||
          ltAddToRange(tSep, rollConf.reroll.nums, tNum);
 | 
			
		||||
          ltAddToRange(tSep, rollConf.reroll.nums, tNum, rollConf.type);
 | 
			
		||||
          break;
 | 
			
		||||
        case DiceOptions.CritSuccess:
 | 
			
		||||
        case DiceOptions.CritSuccessEqu:
 | 
			
		||||
| 
						 | 
				
			
			@ -319,7 +322,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
        case DiceOptions.CritSuccessLt:
 | 
			
		||||
          // Configure CritScore for all numbers less than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
          rollConf.critScore.on = true;
 | 
			
		||||
          ltAddToRange(tSep, rollConf.critScore.range, tNum);
 | 
			
		||||
          ltAddToRange(tSep, rollConf.critScore.range, tNum, rollConf.type);
 | 
			
		||||
          break;
 | 
			
		||||
        case DiceOptions.CritFail:
 | 
			
		||||
        case DiceOptions.CritFailEqu:
 | 
			
		||||
| 
						 | 
				
			
			@ -335,7 +338,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
        case DiceOptions.CritFailLt:
 | 
			
		||||
          // Configure CritFail for all numbers less than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
          rollConf.critFail.on = true;
 | 
			
		||||
          ltAddToRange(tSep, rollConf.critFail.range, tNum);
 | 
			
		||||
          ltAddToRange(tSep, rollConf.critFail.range, tNum, rollConf.type);
 | 
			
		||||
          break;
 | 
			
		||||
        case DiceOptions.Exploding:
 | 
			
		||||
        case DiceOptions.ExplodeOnce:
 | 
			
		||||
| 
						 | 
				
			
			@ -370,7 +373,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
        case DiceOptions.CompoundingExplosionLt:
 | 
			
		||||
          // Configure Exploding for all numbers less than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
          rollConf.exploding.on = true;
 | 
			
		||||
          ltAddToRange(tSep, rollConf.exploding.nums, tNum);
 | 
			
		||||
          ltAddToRange(tSep, rollConf.exploding.nums, tNum, rollConf.type);
 | 
			
		||||
          break;
 | 
			
		||||
        case DiceOptions.MatchingTotal:
 | 
			
		||||
          rollConf.match.returnTotal = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -416,7 +419,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
        case DiceOptions.SuccessLt:
 | 
			
		||||
          // Configure success for all numbers less than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
          rollConf.success.on = true;
 | 
			
		||||
          ltAddToRange(tSep, rollConf.success.range, tNum);
 | 
			
		||||
          ltAddToRange(tSep, rollConf.success.range, tNum, rollConf.type);
 | 
			
		||||
          break;
 | 
			
		||||
        case DiceOptions.Fail:
 | 
			
		||||
        case DiceOptions.FailEqu:
 | 
			
		||||
| 
						 | 
				
			
			@ -432,7 +435,7 @@ export const getRollConf = (rollStr: string): RollConf => {
 | 
			
		|||
        case DiceOptions.FailLt:
 | 
			
		||||
          // Configure fail for all numbers less than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
          rollConf.fail.on = true;
 | 
			
		||||
          ltAddToRange(tSep, rollConf.fail.range, tNum);
 | 
			
		||||
          ltAddToRange(tSep, rollConf.fail.range, tNum, rollConf.type);
 | 
			
		||||
          break;
 | 
			
		||||
        default:
 | 
			
		||||
          // Throw error immediately if unknown op is encountered
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,8 @@ export const tokenizeMath = (cmd: string, modifiers: RollModifiers, previousResu
 | 
			
		|||
    .replace(cmdSplitRegex, '')
 | 
			
		||||
    .replace(internalWrapRegex, '')
 | 
			
		||||
    .replace(/ /g, '')
 | 
			
		||||
    .split(/(\*\*)|([-+()*/^]|(?<![d%])%)|(x\d+(\.\d*)?)/g)
 | 
			
		||||
    // breaks the string on the following: (\*\*) ** for exponents ([+()*/^] for basic algebra (?<![d%])% for breaking on d%%%% dice correctly (?<![rsfop!=<>])- for breaking on - correctly with fate dice) (x\d+(\.\d*)?) x# for variables
 | 
			
		||||
    .split(/(\*\*)|([+()*/^]|(?<![d%])%|(?<![rsfop!=<>])-)|(x\d+(\.\d*)?)/g)
 | 
			
		||||
    .filter((x) => x);
 | 
			
		||||
  loggingEnabled && log(LT.LOG, `Split roll into mathConf ${JSON.stringify(mathConf)}`);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,7 @@
 | 
			
		|||
import { log, LogTypes as LT } from '@Log4Deno';
 | 
			
		||||
 | 
			
		||||
import { RollType } from 'artigen/dice/dice.d.ts';
 | 
			
		||||
 | 
			
		||||
import { getLoopCount, loopCountCheck } from 'artigen/managers/loopManager.ts';
 | 
			
		||||
 | 
			
		||||
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +20,7 @@ const internalAddMultipleToRange = (tSep: string, range: Array<number>, start: n
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
// Add numbers less than or equal to tNum to range
 | 
			
		||||
export const ltAddToRange = (tSep: string, range: Array<number>, tNum: number) => internalAddMultipleToRange(tSep, range, 0, tNum);
 | 
			
		||||
export const ltAddToRange = (tSep: string, range: Array<number>, tNum: number, rollType: RollType) => internalAddMultipleToRange(tSep, range, rollType === 'fate' ? -1 : 0, tNum);
 | 
			
		||||
 | 
			
		||||
// Add numbers greater than or equal to tNum to range
 | 
			
		||||
export const gtrAddToRange = (tSep: string, range: Array<number>, tNum: number, dieSize: number) => internalAddMultipleToRange(tSep, range, tNum, dieSize);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue