Add additional safeties on rerolling, cleanse other numlists
This commit is contained in:
		
							parent
							
								
									73e4ca94b7
								
							
						
					
					
						commit
						e69806c443
					
				| 
						 | 
				
			
			@ -330,6 +330,9 @@ export const parseRoll = (fullCmd: string, modifiers: RollModifiers): SolvedRoll
 | 
			
		|||
        }
 | 
			
		||||
        errorMsg += ' cannot be zero';
 | 
			
		||||
        break;
 | 
			
		||||
      case 'NoRerollOnAllSides':
 | 
			
		||||
        errorMsg = 'Error: Cannot reroll all sides of a die, must have at least one side that does not get rerolled';
 | 
			
		||||
        break;
 | 
			
		||||
      case 'CritScoreMinGtrMax':
 | 
			
		||||
        errorMsg = 'Formatting Error: CritScore maximum cannot be greater than minimum, check formatting and flip min/max';
 | 
			
		||||
        break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -221,7 +221,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
        case 'r=':
 | 
			
		||||
          // Configure Reroll (this can happen multiple times)
 | 
			
		||||
          rollConf.reroll.on = true;
 | 
			
		||||
          rollConf.reroll.nums.push(tNum);
 | 
			
		||||
          !rollConf.reroll.nums.includes(tNum) && rollConf.reroll.nums.push(tNum);
 | 
			
		||||
          break;
 | 
			
		||||
        case 'ro>':
 | 
			
		||||
          rollConf.reroll.once = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -233,7 +233,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing r> ${i}`);
 | 
			
		||||
            rollConf.reroll.nums.push(i);
 | 
			
		||||
            !rollConf.reroll.nums.includes(i) && rollConf.reroll.nums.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case 'ro<':
 | 
			
		||||
| 
						 | 
				
			
			@ -246,14 +246,14 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing r< ${i}`);
 | 
			
		||||
            rollConf.reroll.nums.push(i);
 | 
			
		||||
            !rollConf.reroll.nums.includes(i) && rollConf.reroll.nums.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case 'cs':
 | 
			
		||||
        case 'cs=':
 | 
			
		||||
          // Configure CritScore for one number (this can happen multiple times)
 | 
			
		||||
          rollConf.critScore.on = true;
 | 
			
		||||
          rollConf.critScore.range.push(tNum);
 | 
			
		||||
          !rollConf.critScore.range.includes(tNum) && rollConf.critScore.range.push(tNum);
 | 
			
		||||
          break;
 | 
			
		||||
        case 'cs>':
 | 
			
		||||
          // Configure CritScore for all numbers greater than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
| 
						 | 
				
			
			@ -262,7 +262,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing cs> ${i}`);
 | 
			
		||||
            rollConf.critScore.range.push(i);
 | 
			
		||||
            !rollConf.critScore.range.includes(i) && rollConf.critScore.range.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case 'cs<':
 | 
			
		||||
| 
						 | 
				
			
			@ -272,14 +272,14 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing cs< ${i}`);
 | 
			
		||||
            rollConf.critScore.range.push(i);
 | 
			
		||||
            !rollConf.critScore.range.includes(i) && rollConf.critScore.range.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case 'cf':
 | 
			
		||||
        case 'cf=':
 | 
			
		||||
          // Configure CritFail for one number (this can happen multiple times)
 | 
			
		||||
          rollConf.critFail.on = true;
 | 
			
		||||
          rollConf.critFail.range.push(tNum);
 | 
			
		||||
          !rollConf.critFail.range.includes(tNum) && rollConf.critFail.range.push(tNum);
 | 
			
		||||
          break;
 | 
			
		||||
        case 'cf>':
 | 
			
		||||
          // Configure CritFail for all numbers greater than or equal to tNum (this could happen multiple times, but why)
 | 
			
		||||
| 
						 | 
				
			
			@ -288,7 +288,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing cf> ${i}`);
 | 
			
		||||
            rollConf.critFail.range.push(i);
 | 
			
		||||
            !rollConf.critFail.range.includes(i) && rollConf.critFail.range.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case 'cf<':
 | 
			
		||||
| 
						 | 
				
			
			@ -298,7 +298,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing cf< ${i}`);
 | 
			
		||||
            rollConf.critFail.range.push(i);
 | 
			
		||||
            !rollConf.critFail.range.includes(i) && rollConf.critFail.range.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case '!':
 | 
			
		||||
| 
						 | 
				
			
			@ -309,7 +309,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
          rollConf.exploding.on = true;
 | 
			
		||||
          if (afterNumIdx > 0) {
 | 
			
		||||
            // User gave a number to explode on, save it
 | 
			
		||||
            rollConf.exploding.nums.push(tNum);
 | 
			
		||||
            !rollConf.exploding.nums.includes(tNum) && rollConf.exploding.nums.push(tNum);
 | 
			
		||||
          } else {
 | 
			
		||||
            // User did not give number, use cs
 | 
			
		||||
            afterNumIdx = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -321,7 +321,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
        case '!!=':
 | 
			
		||||
          // Configure Exploding (this can happen multiple times)
 | 
			
		||||
          rollConf.exploding.on = true;
 | 
			
		||||
          rollConf.exploding.nums.push(tNum);
 | 
			
		||||
          !rollConf.exploding.nums.includes(tNum) && rollConf.exploding.nums.push(tNum);
 | 
			
		||||
          break;
 | 
			
		||||
        case '!>':
 | 
			
		||||
        case '!o>':
 | 
			
		||||
| 
						 | 
				
			
			@ -333,7 +333,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing !> ${i}`);
 | 
			
		||||
            rollConf.exploding.nums.push(i);
 | 
			
		||||
            !rollConf.exploding.nums.includes(i) && rollConf.exploding.nums.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case '!<':
 | 
			
		||||
| 
						 | 
				
			
			@ -346,7 +346,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
            loopCountCheck(++loopCount);
 | 
			
		||||
 | 
			
		||||
            loggingEnabled && log(LT.LOG, `${loopCount} Handling ${rollType} ${rollStr} | Parsing !< ${i}`);
 | 
			
		||||
            rollConf.exploding.nums.push(i);
 | 
			
		||||
            !rollConf.exploding.nums.includes(i) && rollConf.exploding.nums.push(i);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        default:
 | 
			
		||||
| 
						 | 
				
			
			@ -381,6 +381,13 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Filter rollConf num lists to only include valid numbers
 | 
			
		||||
  const validNumFilter = (curNum: number) => curNum <= rollConf.dieSize && curNum > 0;
 | 
			
		||||
  rollConf.reroll.nums = rollConf.reroll.nums.filter(validNumFilter);
 | 
			
		||||
  rollConf.critScore.range = rollConf.critScore.range.filter(validNumFilter);
 | 
			
		||||
  rollConf.critFail.range = rollConf.critFail.range.filter(validNumFilter);
 | 
			
		||||
  rollConf.exploding.nums = rollConf.exploding.nums.filter(validNumFilter);
 | 
			
		||||
 | 
			
		||||
  // Verify the parse, throwing errors for every invalid config
 | 
			
		||||
  if (rollConf.dieCount < 0) {
 | 
			
		||||
    throw new Error('NoZerosAllowed_base');
 | 
			
		||||
| 
						 | 
				
			
			@ -414,6 +421,9 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
			
		|||
  if (rollConf.reroll.on && rollConf.reroll.nums.includes(0)) {
 | 
			
		||||
    throw new Error('NoZerosAllowed_reroll');
 | 
			
		||||
  }
 | 
			
		||||
  if (rollConf.reroll.on && rollConf.reroll.nums.length === rollConf.dieSize) {
 | 
			
		||||
    throw new Error('NoRerollOnAllSides');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Roll the roll
 | 
			
		||||
  const rollSet = [];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue