Add Min flag and add -max as option for max flag
This commit is contained in:
		
							parent
							
								
									5bef3878cc
								
							
						
					
					
						commit
						4207021fa9
					
				| 
						 | 
					@ -5,7 +5,7 @@ meta {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
get {
 | 
					get {
 | 
				
			||||||
  url: http://localhost:8166/api/roll?user=[discord-user-id]&channel=[discord-channel-id]&rollstr=[artificer-roll-cmd]&documentation=All items below are optional. Flags do not need values.&nd=[no-details-flag]&snd=[super-no-details-flag]&s=[spoiler-results-flag]&m=[max-roll-flag, cannot be used with n flag]&n=[nominal-roll-flag, cannot be used with m flag]&gms=[csv-of-discord-user-ids-to-be-dmed-results]&o=[order-rolls, must be a or d]&c=[count-flag]
 | 
					  url: http://localhost:8166/api/roll?user=[discord-user-id]&channel=[discord-channel-id]&rollstr=[artificer-roll-cmd]&documentation=All items below are optional. Flags do not need values.&nd=[no-details-flag]&snd=[super-no-details-flag]&s=[spoiler-results-flag]&m or max=[max-roll-flag, cannot be used with n flag]&min=[[min-roll-flag, cannot be used with n or max&n=[nominal-roll-flag, cannot be used with max or min flag]&gms=[csv-of-discord-user-ids-to-be-dmed-results]&o=[order-rolls, must be a or d]&c=[count-flag]
 | 
				
			||||||
  body: none
 | 
					  body: none
 | 
				
			||||||
  auth: inherit
 | 
					  auth: inherit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -18,8 +18,9 @@ params:query {
 | 
				
			||||||
  nd: [no-details-flag]
 | 
					  nd: [no-details-flag]
 | 
				
			||||||
  snd: [super-no-details-flag]
 | 
					  snd: [super-no-details-flag]
 | 
				
			||||||
  s: [spoiler-results-flag]
 | 
					  s: [spoiler-results-flag]
 | 
				
			||||||
  m: [max-roll-flag, cannot be used with n flag]
 | 
					  m or max: [max-roll-flag, cannot be used with n flag]
 | 
				
			||||||
  n: [nominal-roll-flag, cannot be used with m flag]
 | 
					  min: [[min-roll-flag, cannot be used with n or max
 | 
				
			||||||
 | 
					  n: [nominal-roll-flag, cannot be used with max or min flag]
 | 
				
			||||||
  gms: [csv-of-discord-user-ids-to-be-dmed-results]
 | 
					  gms: [csv-of-discord-user-ids-to-be-dmed-results]
 | 
				
			||||||
  o: [order-rolls, must be a or d]
 | 
					  o: [order-rolls, must be a or d]
 | 
				
			||||||
  c: [count-flag]
 | 
					  c: [count-flag]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ export const getModifiers = (m: DiscordenoMessage, args: string[], command: stri
 | 
				
			||||||
    superNoDetails: false,
 | 
					    superNoDetails: false,
 | 
				
			||||||
    spoiler: '',
 | 
					    spoiler: '',
 | 
				
			||||||
    maxRoll: false,
 | 
					    maxRoll: false,
 | 
				
			||||||
 | 
					    minRoll: false,
 | 
				
			||||||
    nominalRoll: false,
 | 
					    nominalRoll: false,
 | 
				
			||||||
    gmRoll: false,
 | 
					    gmRoll: false,
 | 
				
			||||||
    gms: [],
 | 
					    gms: [],
 | 
				
			||||||
| 
						 | 
					@ -46,9 +47,13 @@ export const getModifiers = (m: DiscordenoMessage, args: string[], command: stri
 | 
				
			||||||
      case '-s':
 | 
					      case '-s':
 | 
				
			||||||
        modifiers.spoiler = '||';
 | 
					        modifiers.spoiler = '||';
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					      case '-max':
 | 
				
			||||||
      case '-m':
 | 
					      case '-m':
 | 
				
			||||||
        modifiers.maxRoll = true;
 | 
					        modifiers.maxRoll = true;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					      case '-min':
 | 
				
			||||||
 | 
					        modifiers.minRoll = true;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
      case '-n':
 | 
					      case '-n':
 | 
				
			||||||
        modifiers.nominalRoll = true;
 | 
					        modifiers.nominalRoll = true;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
| 
						 | 
					@ -106,9 +111,11 @@ export const getModifiers = (m: DiscordenoMessage, args: string[], command: stri
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // maxRoll and nominalRoll cannot both be on, throw an error
 | 
					  // maxRoll, minRoll, and nominalRoll cannot be on at same time, throw an error
 | 
				
			||||||
  if (modifiers.maxRoll && modifiers.nominalRoll) {
 | 
					  if ([modifiers.maxRoll, modifiers.minRoll, modifiers.nominalRoll].filter((b) => b).length > 1) {
 | 
				
			||||||
    m.edit(generateRollError(errorType, 'Cannot maximize and nominize the roll at the same time')).catch((e) => utils.commonLoggers.messageEditError('getModifiers.ts:106', m, e));
 | 
					    m.edit(generateRollError(errorType, 'Can only use one of the following at a time:\n`maximize`, `minimize`, `nominal`')).catch((e) =>
 | 
				
			||||||
 | 
					      utils.commonLoggers.messageEditError('getModifiers.ts:106', m, e)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (DEVMODE && config.logRolls) {
 | 
					    if (DEVMODE && config.logRolls) {
 | 
				
			||||||
      // If enabled, log rolls so we can verify the bots math
 | 
					      // If enabled, log rolls so we can verify the bots math
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,8 @@ export const apiRoll = async (query: Map<string, string>, apiUserid: bigint): Pr
 | 
				
			||||||
          noDetails: query.has('nd'),
 | 
					          noDetails: query.has('nd'),
 | 
				
			||||||
          superNoDetails: query.has('snd'),
 | 
					          superNoDetails: query.has('snd'),
 | 
				
			||||||
          spoiler: query.has('s') ? '||' : '',
 | 
					          spoiler: query.has('s') ? '||' : '',
 | 
				
			||||||
          maxRoll: query.has('m'),
 | 
					          maxRoll: query.has('m') || query.has('max'),
 | 
				
			||||||
 | 
					          minRoll: query.has('min'),
 | 
				
			||||||
          nominalRoll: query.has('n'),
 | 
					          nominalRoll: query.has('n'),
 | 
				
			||||||
          gmRoll: query.has('gms'),
 | 
					          gmRoll: query.has('gms'),
 | 
				
			||||||
          gms: query.has('gms') ? (query.get('gms') || '').split(',') : [],
 | 
					          gms: query.has('gms') ? (query.get('gms') || '').split(',') : [],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ export type RollModifiers = {
 | 
				
			||||||
  superNoDetails: boolean;
 | 
					  superNoDetails: boolean;
 | 
				
			||||||
  spoiler: string;
 | 
					  spoiler: string;
 | 
				
			||||||
  maxRoll: boolean;
 | 
					  maxRoll: boolean;
 | 
				
			||||||
 | 
					  minRoll: boolean;
 | 
				
			||||||
  nominalRoll: boolean;
 | 
					  nominalRoll: boolean;
 | 
				
			||||||
  gmRoll: boolean;
 | 
					  gmRoll: boolean;
 | 
				
			||||||
  gms: string[];
 | 
					  gms: string[];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ import config from '../../config.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { RollModifiers } from '../mod.d.ts';
 | 
					import { RollModifiers } from '../mod.d.ts';
 | 
				
			||||||
import { CountDetails, ReturnData, SolvedRoll, SolvedStep } from './solver.d.ts';
 | 
					import { CountDetails, ReturnData, SolvedRoll, SolvedStep } from './solver.d.ts';
 | 
				
			||||||
import { compareTotalRolls, escapeCharacters, loggingEnabled } from './rollUtils.ts';
 | 
					import { compareTotalRolls, compareTotalRollsReverse, escapeCharacters, loggingEnabled } from './rollUtils.ts';
 | 
				
			||||||
import { formatRoll } from './rollFormatter.ts';
 | 
					import { formatRoll } from './rollFormatter.ts';
 | 
				
			||||||
import { fullSolver } from './solver.ts';
 | 
					import { fullSolver } from './solver.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,7 @@ export const parseRoll = (fullCmd: string, modifiers: RollModifiers): SolvedRoll
 | 
				
			||||||
          i += 2;
 | 
					          i += 2;
 | 
				
			||||||
        } else if (!operators.includes(mathConf[i].toString())) {
 | 
					        } else if (!operators.includes(mathConf[i].toString())) {
 | 
				
			||||||
          // If nothing else has handled it by now, try it as a roll
 | 
					          // If nothing else has handled it by now, try it as a roll
 | 
				
			||||||
          const formattedRoll = formatRoll(mathConf[i].toString(), modifiers.maxRoll, modifiers.nominalRoll);
 | 
					          const formattedRoll = formatRoll(mathConf[i].toString(), modifiers);
 | 
				
			||||||
          mathConf[i] = formattedRoll.solvedStep;
 | 
					          mathConf[i] = formattedRoll.solvedStep;
 | 
				
			||||||
          tempCountDetails.push(formattedRoll.countDetails);
 | 
					          tempCountDetails.push(formattedRoll.countDetails);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -197,13 +197,14 @@ export const parseRoll = (fullCmd: string, modifiers: RollModifiers): SolvedRoll
 | 
				
			||||||
    let line2 = '';
 | 
					    let line2 = '';
 | 
				
			||||||
    let line3 = '';
 | 
					    let line3 = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If maximizeRoll or nominalRoll are on, mark the output as such, else use default formatting
 | 
					    // If a theoretical roll is requested, mark the output as such, else use default formatting
 | 
				
			||||||
    if (modifiers.maxRoll) {
 | 
					    if (modifiers.maxRoll || modifiers.minRoll || modifiers.nominalRoll) {
 | 
				
			||||||
      line1 = ` requested the theoretical maximum of:\n\`${config.prefix}${fullCmd}\``;
 | 
					      const theoreticalTexts = ['Maximum', 'Minimum', 'Nominal'];
 | 
				
			||||||
      line2 = 'Theoretical Maximum Results: ';
 | 
					      const theoreticalBools = [modifiers.maxRoll, modifiers.minRoll, modifiers.nominalRoll];
 | 
				
			||||||
    } else if (modifiers.nominalRoll) {
 | 
					      const theoreticalText = theoreticalTexts[theoreticalBools.indexOf(true)];
 | 
				
			||||||
      line1 = ` requested the theoretical nominal of:\n\`${config.prefix}${fullCmd}\``;
 | 
					
 | 
				
			||||||
      line2 = 'Theoretical Nominal Results: ';
 | 
					      line1 = ` requested the Theoretical ${theoreticalText} of:\n\`${config.prefix}${fullCmd}\``;
 | 
				
			||||||
 | 
					      line2 = `Theoretical ${theoreticalText} Results: `;
 | 
				
			||||||
    } else if (modifiers.order === 'a') {
 | 
					    } else if (modifiers.order === 'a') {
 | 
				
			||||||
      line1 = ` requested the following rolls to be ordered from least to greatest:\n\`${config.prefix}${fullCmd}\``;
 | 
					      line1 = ` requested the following rolls to be ordered from least to greatest:\n\`${config.prefix}${fullCmd}\``;
 | 
				
			||||||
      line2 = 'Results: ';
 | 
					      line2 = 'Results: ';
 | 
				
			||||||
| 
						 | 
					@ -211,8 +212,7 @@ export const parseRoll = (fullCmd: string, modifiers: RollModifiers): SolvedRoll
 | 
				
			||||||
    } else if (modifiers.order === 'd') {
 | 
					    } else if (modifiers.order === 'd') {
 | 
				
			||||||
      line1 = ` requested the following rolls to be ordered from greatest to least:\n\`${config.prefix}${fullCmd}\``;
 | 
					      line1 = ` requested the following rolls to be ordered from greatest to least:\n\`${config.prefix}${fullCmd}\``;
 | 
				
			||||||
      line2 = 'Results: ';
 | 
					      line2 = 'Results: ';
 | 
				
			||||||
      tempReturnData.sort(compareTotalRolls);
 | 
					      tempReturnData.sort(compareTotalRollsReverse);
 | 
				
			||||||
      tempReturnData.reverse();
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      line1 = ` rolled:\n\`${config.prefix}${fullCmd}\``;
 | 
					      line1 = ` rolled:\n\`${config.prefix}${fullCmd}\``;
 | 
				
			||||||
      line2 = 'Results: ';
 | 
					      line2 = 'Results: ';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,17 +8,18 @@ import { roll } from './roller.ts';
 | 
				
			||||||
import { rollCounter } from './counter.ts';
 | 
					import { rollCounter } from './counter.ts';
 | 
				
			||||||
import { RollFormat } from './solver.d.ts';
 | 
					import { RollFormat } from './solver.d.ts';
 | 
				
			||||||
import { loggingEnabled } from './rollUtils.ts';
 | 
					import { loggingEnabled } from './rollUtils.ts';
 | 
				
			||||||
 | 
					import { RollModifiers } from '../mod.d.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// formatRoll(rollConf, maximizeRoll, nominalRoll) returns one SolvedStep
 | 
					// formatRoll(rollConf, modifiers) returns one SolvedStep
 | 
				
			||||||
// formatRoll handles creating and formatting the completed rolls into the SolvedStep format
 | 
					// formatRoll handles creating and formatting the completed rolls into the SolvedStep format
 | 
				
			||||||
export const formatRoll = (rollConf: string, maximizeRoll: boolean, nominalRoll: boolean): RollFormat => {
 | 
					export const formatRoll = (rollConf: string, modifiers: RollModifiers): RollFormat => {
 | 
				
			||||||
  let tempTotal = 0;
 | 
					  let tempTotal = 0;
 | 
				
			||||||
  let tempDetails = '[';
 | 
					  let tempDetails = '[';
 | 
				
			||||||
  let tempCrit = false;
 | 
					  let tempCrit = false;
 | 
				
			||||||
  let tempFail = false;
 | 
					  let tempFail = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Generate the roll, passing flags thru
 | 
					  // Generate the roll, passing flags thru
 | 
				
			||||||
  const tempRollSet = roll(rollConf, maximizeRoll, nominalRoll);
 | 
					  const tempRollSet = roll(rollConf, modifiers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Loop thru all parts of the roll to document everything that was done to create the total roll
 | 
					  // Loop thru all parts of the roll to document everything that was done to create the total roll
 | 
				
			||||||
  tempRollSet.forEach((e) => {
 | 
					  tempRollSet.forEach((e) => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@ import {
 | 
				
			||||||
  // Log4Deno deps
 | 
					  // Log4Deno deps
 | 
				
			||||||
  LT,
 | 
					  LT,
 | 
				
			||||||
} from '../../deps.ts';
 | 
					} from '../../deps.ts';
 | 
				
			||||||
 | 
					import { RollModifiers } from '../mod.d.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { ReturnData, RollSet } from './solver.d.ts';
 | 
					import { ReturnData, RollSet } from './solver.d.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,23 +11,25 @@ export const loggingEnabled = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// genRoll(size) returns number
 | 
					// genRoll(size) returns number
 | 
				
			||||||
// genRoll rolls a die of size size and returns the result
 | 
					// genRoll rolls a die of size size and returns the result
 | 
				
			||||||
export const genRoll = (size: number, maximizeRoll: boolean, nominalRoll: boolean): number => {
 | 
					export const genRoll = (size: number, modifiers: RollModifiers): number => {
 | 
				
			||||||
  if (maximizeRoll) {
 | 
					  if (modifiers.maxRoll) {
 | 
				
			||||||
    return size;
 | 
					    return size;
 | 
				
			||||||
 | 
					  } else if (modifiers.minRoll) {
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    // Math.random * size will return a decimal number between 0 and size (excluding size), so add 1 and floor the result to not get 0 as a result
 | 
					    // Math.random * size will return a decimal number between 0 and size (excluding size), so add 1 and floor the result to not get 0 as a result
 | 
				
			||||||
    return nominalRoll ? size / 2 + 0.5 : Math.floor(Math.random() * size + 1);
 | 
					    return modifiers.nominalRoll ? size / 2 + 0.5 : Math.floor(Math.random() * size + 1);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// genFateRoll returns -1|0|1
 | 
					// genFateRoll returns -1|0|1
 | 
				
			||||||
// genFateRoll turns a d6 into a fate die, with sides: -1, -1, 0, 0, 1, 1
 | 
					// genFateRoll turns a d6 into a fate die, with sides: -1, -1, 0, 0, 1, 1
 | 
				
			||||||
export const genFateRoll = (maximizeRoll: boolean, nominalRoll: boolean): number => {
 | 
					export const genFateRoll = (modifiers: RollModifiers): number => {
 | 
				
			||||||
  if (nominalRoll) {
 | 
					  if (modifiers.nominalRoll) {
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    const sides = [-1, -1, 0, 0, 1, 1];
 | 
					    const sides = [-1, -1, 0, 0, 1, 1];
 | 
				
			||||||
    return sides[genRoll(6, maximizeRoll, nominalRoll) - 1];
 | 
					    return sides[genRoll(6, modifiers) - 1];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,18 +45,24 @@ export const compareRolls = (a: RollSet, b: RollSet): number => {
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// compareTotalRolls(a, b) returns -1|0|1
 | 
					const internalCompareTotalRolls = (a: ReturnData, b: ReturnData, dir: 1 | -1): number => {
 | 
				
			||||||
// compareTotalRolls is used to order an array of RollSets by RollSet.roll
 | 
					 | 
				
			||||||
export const compareTotalRolls = (a: ReturnData, b: ReturnData): number => {
 | 
					 | 
				
			||||||
  if (a.rollTotal < b.rollTotal) {
 | 
					  if (a.rollTotal < b.rollTotal) {
 | 
				
			||||||
    return -1;
 | 
					    return -1 * dir;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (a.rollTotal > b.rollTotal) {
 | 
					  if (a.rollTotal > b.rollTotal) {
 | 
				
			||||||
    return 1;
 | 
					    return 1 * dir;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// compareTotalRolls(a, b) returns -1|0|1
 | 
				
			||||||
 | 
					// compareTotalRolls is used to order an array of RollSets by RollSet.roll
 | 
				
			||||||
 | 
					export const compareTotalRolls = (a: ReturnData, b: ReturnData): number => internalCompareTotalRolls(a, b, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// compareTotalRollsReverse(a, b) returns 1|0|-1
 | 
				
			||||||
 | 
					// compareTotalRollsReverse is used to order an array of RollSets by RollSet.roll reversed
 | 
				
			||||||
 | 
					export const compareTotalRollsReverse = (a: ReturnData, b: ReturnData): number => internalCompareTotalRolls(a, b, -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// compareRolls(a, b) returns -1|0|1
 | 
					// compareRolls(a, b) returns -1|0|1
 | 
				
			||||||
// compareRolls is used to order an array of RollSets by RollSet.origIdx
 | 
					// compareRolls is used to order an array of RollSets by RollSet.origIdx
 | 
				
			||||||
export const compareOrigIdx = (a: RollSet, b: RollSet): number => {
 | 
					export const compareOrigIdx = (a: RollSet, b: RollSet): number => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@ import {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { RollConf, RollSet, RollType } from './solver.d.ts';
 | 
					import { RollConf, RollSet, RollType } from './solver.d.ts';
 | 
				
			||||||
import { compareOrigIdx, compareRolls, genFateRoll, genRoll, loggingEnabled } from './rollUtils.ts';
 | 
					import { compareOrigIdx, compareRolls, genFateRoll, genRoll, loggingEnabled } from './rollUtils.ts';
 | 
				
			||||||
 | 
					import { RollModifiers } from '../mod.d.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Call with loopCountCheck(++loopCount);
 | 
					// Call with loopCountCheck(++loopCount);
 | 
				
			||||||
// Will ensure if maxLoops is 10, 10 loops will be allowed, 11 will not.
 | 
					// Will ensure if maxLoops is 10, 10 loops will be allowed, 11 will not.
 | 
				
			||||||
| 
						 | 
					@ -20,9 +21,9 @@ const throwDoubleSepError = (sep: string): void => {
 | 
				
			||||||
  throw new Error(`DoubleSeparator_${sep}`);
 | 
					  throw new Error(`DoubleSeparator_${sep}`);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// roll(rollStr, maximizeRoll, nominalRoll) returns RollSet
 | 
					// roll(rollStr, modifiers) returns RollSet
 | 
				
			||||||
// roll parses and executes the rollStr, if needed it will also make the roll the maximum or average
 | 
					// roll parses and executes the rollStr
 | 
				
			||||||
export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolean): RollSet[] => {
 | 
					export const roll = (rollStr: string, modifiers: RollModifiers): RollSet[] => {
 | 
				
			||||||
  /* Roll Capabilities
 | 
					  /* Roll Capabilities
 | 
				
			||||||
   * Deciphers and rolls a single dice roll set
 | 
					   * Deciphers and rolls a single dice roll set
 | 
				
			||||||
   *
 | 
					   *
 | 
				
			||||||
| 
						 | 
					@ -494,7 +495,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
				
			||||||
    // Copy the template to fill out for this iteration
 | 
					    // Copy the template to fill out for this iteration
 | 
				
			||||||
    const rolling = getTemplateRoll();
 | 
					    const rolling = 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
 | 
					    // 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
 | 
				
			||||||
    rolling.roll = rollType === 'fate' ? genFateRoll(maximizeRoll, nominalRoll) : genRoll(rollConf.dieSize, maximizeRoll, nominalRoll);
 | 
					    rolling.roll = rollType === 'fate' ? genFateRoll(modifiers) : genRoll(rollConf.dieSize, modifiers);
 | 
				
			||||||
    // Set origIdx of roll
 | 
					    // Set origIdx of roll
 | 
				
			||||||
    rolling.origIdx = i;
 | 
					    rolling.origIdx = i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -534,22 +535,33 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Copy the template to fill out for this iteration
 | 
					        // Copy the template to fill out for this iteration
 | 
				
			||||||
        const newReroll = getTemplateRoll();
 | 
					        const newReroll = getTemplateRoll();
 | 
				
			||||||
        if (maximizeRoll) {
 | 
					        if (modifiers.maxRoll && !minMaxOverride) {
 | 
				
			||||||
          // If maximizeRoll is on and we've entered the reroll code, dieSize is not allowed, determine the next best option and always return that
 | 
					          // If maximizeRoll is on and we've entered the reroll code, dieSize is not allowed, determine the next best option and always return that
 | 
				
			||||||
          if (!minMaxOverride) {
 | 
					          mmMaxLoop: for (let m = rollConf.dieSize - 1; m > 0; m--) {
 | 
				
			||||||
            mmLoop: for (let m = rollConf.dieSize - 1; m > 0; m--) {
 | 
					 | 
				
			||||||
            loopCountCheck(++loopCount);
 | 
					            loopCountCheck(++loopCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!rollConf.reroll.nums.includes(m)) {
 | 
					            if (!rollConf.reroll.nums.includes(m)) {
 | 
				
			||||||
              minMaxOverride = m;
 | 
					              minMaxOverride = m;
 | 
				
			||||||
                break mmLoop;
 | 
					              break mmMaxLoop;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } else if (modifiers.minRoll && !minMaxOverride) {
 | 
				
			||||||
 | 
					          // If minimizeRoll is on and we've entered the reroll code, 1 is not allowed, determine the next best option and always return that
 | 
				
			||||||
 | 
					          mmMinLoop: for (let m = 2; m <= rollConf.dieSize; m++) {
 | 
				
			||||||
 | 
					            loopCountCheck(++loopCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!rollConf.reroll.nums.includes(m)) {
 | 
				
			||||||
 | 
					              minMaxOverride = m;
 | 
				
			||||||
 | 
					              break mmMinLoop;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (modifiers.maxRoll || modifiers.minRoll) {
 | 
				
			||||||
          newReroll.roll = minMaxOverride;
 | 
					          newReroll.roll = minMaxOverride;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          // If nominalRoll is on, set the roll to the average roll of dieSize, otherwise generate a new random roll
 | 
					          // If nominalRoll is on, set the roll to the average roll of dieSize, otherwise generate a new random roll
 | 
				
			||||||
          newReroll.roll = genRoll(rollConf.dieSize, maximizeRoll, nominalRoll);
 | 
					          newReroll.roll = genRoll(rollConf.dieSize, modifiers);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // If critScore arg is on, check if the roll should be a crit, if its off, check if the roll matches the die size
 | 
					        // If critScore arg is on, check if the roll should be a crit, if its off, check if the roll matches the die size
 | 
				
			||||||
| 
						 | 
					@ -579,7 +591,7 @@ export const roll = (rollStr: string, maximizeRoll: boolean, nominalRoll: boolea
 | 
				
			||||||
        // Copy the template to fill out for this iteration
 | 
					        // Copy the template to fill out for this iteration
 | 
				
			||||||
        const newExplodingRoll = getTemplateRoll();
 | 
					        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
 | 
					        // 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, maximizeRoll, nominalRoll);
 | 
					        newExplodingRoll.roll = genRoll(rollConf.dieSize, modifiers);
 | 
				
			||||||
        // Always mark this roll as exploding
 | 
					        // Always mark this roll as exploding
 | 
				
			||||||
        newExplodingRoll.exploding = true;
 | 
					        newExplodingRoll.exploding = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue