Add Dice Sorting option
This commit is contained in:
parent
5f58f9cae8
commit
c9772d3ccf
|
@ -72,6 +72,16 @@ interface RangeConf {
|
|||
range: number[];
|
||||
}
|
||||
|
||||
// Sort interface
|
||||
interface SortDisabled {
|
||||
on: false;
|
||||
direction: '';
|
||||
}
|
||||
interface SortEnabled {
|
||||
on: true;
|
||||
direction: 'a' | 'd';
|
||||
}
|
||||
|
||||
// D% configuration
|
||||
export interface DPercentConf {
|
||||
on: boolean;
|
||||
|
@ -108,6 +118,7 @@ export interface RollConf {
|
|||
minCount: number;
|
||||
returnTotal: boolean;
|
||||
};
|
||||
sort: SortDisabled | SortEnabled;
|
||||
}
|
||||
|
||||
export interface SumOverride {
|
||||
|
|
|
@ -39,10 +39,16 @@ export const DiceOptions = Object.freeze({
|
|||
CompoundingExplosionEqu: '!!=',
|
||||
Matching: 'm',
|
||||
MatchingTotal: 'mt',
|
||||
Sort: 's',
|
||||
SortAsc: 'sa',
|
||||
SortDesc: 'sd',
|
||||
});
|
||||
|
||||
// Should be ordered such that 'mt' will be encountered before 'm'
|
||||
export const NumberlessDiceOptions = [
|
||||
DiceOptions.SortDesc,
|
||||
DiceOptions.SortAsc,
|
||||
DiceOptions.Sort,
|
||||
DiceOptions.MatchingTotal,
|
||||
DiceOptions.Matching,
|
||||
DiceOptions.CompoundingExplosion,
|
||||
|
|
|
@ -5,7 +5,7 @@ import { genFateRoll, genRoll } from 'artigen/dice/randomRoll.ts';
|
|||
import { getRollConf } from 'artigen/dice/getRollConf.ts';
|
||||
|
||||
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
|
||||
import { compareOrigIdx, compareRolls } from 'artigen/utils/sortFuncs.ts';
|
||||
import { compareOrigIdx, compareRolls, compareRollsReverse } from 'artigen/utils/sortFuncs.ts';
|
||||
|
||||
import { getLoopCount, loopCountCheck } from 'artigen/managers/loopManager.ts';
|
||||
import { generateRollVals } from 'artigen/utils/rollValCounter.ts';
|
||||
|
@ -370,5 +370,9 @@ export const executeRoll = (rollStr: string, modifiers: RollModifiers): [RollSet
|
|||
}
|
||||
}
|
||||
|
||||
if (rollConf.sort.on) {
|
||||
rollSet.sort(rollConf.sort.direction === 'a' ? compareRolls : compareRollsReverse);
|
||||
}
|
||||
|
||||
return [rollSet, sumOverride];
|
||||
};
|
||||
|
|
|
@ -67,6 +67,10 @@ export const getRollConf = (rollStr: string): RollConf => {
|
|||
minCount: 2,
|
||||
returnTotal: false,
|
||||
},
|
||||
sort: {
|
||||
on: false,
|
||||
direction: '',
|
||||
},
|
||||
};
|
||||
|
||||
// If the dPts is not long enough, throw error
|
||||
|
@ -404,6 +408,15 @@ export const getRollConf = (rollStr: string): RollConf => {
|
|||
rollConf.match.minCount = tNum;
|
||||
}
|
||||
break;
|
||||
case DiceOptions.Sort:
|
||||
case DiceOptions.SortAsc:
|
||||
rollConf.sort.on = true;
|
||||
rollConf.sort.direction = 'a';
|
||||
break;
|
||||
case DiceOptions.SortDesc:
|
||||
rollConf.sort.on = true;
|
||||
rollConf.sort.direction = 'd';
|
||||
break;
|
||||
default:
|
||||
// Throw error immediately if unknown op is encountered
|
||||
throw new Error(`UnknownOperation_${tSep}`);
|
||||
|
|
|
@ -2,18 +2,24 @@ import { ReturnData } from 'artigen/artigen.d.ts';
|
|||
|
||||
import { RollSet } from 'artigen/dice/dice.d.ts';
|
||||
|
||||
// compareRolls(a, b) returns -1|0|1
|
||||
// compareRolls is used to order an array of RollSets by RollSet.roll
|
||||
export const compareRolls = (a: RollSet, b: RollSet): number => {
|
||||
const internalCompareRolls = (a: RollSet, b: RollSet, dir: 1 | -1): number => {
|
||||
if (a.roll < b.roll) {
|
||||
return -1;
|
||||
return -1 * dir;
|
||||
}
|
||||
if (a.roll > b.roll) {
|
||||
return 1;
|
||||
return 1 * dir;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
// compareRolls(a, b) returns -1|0|1
|
||||
// compareRolls is used to order an array of RollSets by RollSet.roll
|
||||
export const compareRolls = (a: RollSet, b: RollSet): number => internalCompareRolls(a, b, 1);
|
||||
|
||||
// compareRolls(a, b) returns -1|0|1
|
||||
// compareRolls is used to order an array of RollSets by RollSet.roll reversed
|
||||
export const compareRollsReverse = (a: RollSet, b: RollSet): number => internalCompareRolls(a, b, -1);
|
||||
|
||||
const internalCompareTotalRolls = (a: ReturnData, b: ReturnData, dir: 1 | -1): number => {
|
||||
if (a.rollTotal < b.rollTotal) {
|
||||
return -1 * dir;
|
||||
|
|
|
@ -2,7 +2,7 @@ import config from '~config';
|
|||
|
||||
import { HelpContents, HelpPage } from 'commands/helpLibrary/helpLibrary.d.ts';
|
||||
|
||||
const name = 'Roll20 Dice Options';
|
||||
const name = 'Dice Options';
|
||||
const description =
|
||||
`\`${config.prefix}xdydzracsq!${config.postfix}\` Rolls all configs requested, you may repeat the command multiple times in the same message (just ensure you close each roll with \`${config.postfix}\`).`;
|
||||
const dict = new Map<string, HelpContents>([
|
||||
|
@ -246,6 +246,20 @@ The basic \`m\` option will only add labels without modifying the results, where
|
|||
],
|
||||
},
|
||||
],
|
||||
[
|
||||
'sorting-dice',
|
||||
{
|
||||
name: 'Sorting Dice',
|
||||
description: `**Usage:** \`xdys\`, \`xdysa\`, or \`xdysd\`
|
||||
\`s\` and \`sa\` will sort the dice in ascending order within the roll
|
||||
\`sd\` will sort the dice in descending order within the roll`,
|
||||
example: [
|
||||
'`[[10d6s]]` => [__1__ + __1__ + 2 + 2 + 3 + 3 + 3 + 5 + **6** + **6**] = **__32__**',
|
||||
'`[[10d6sa]]` => [__1__ + __1__ + 2 + 2 + 3 + 3 + 3 + 5 + **6** + **6**] = **__32__**',
|
||||
'`[[10d6sd]]` => [**6** + **6** + **6** + 5 + 4 + 4 + 2 + __1__ + __1__ + __1__] = **__36__**',
|
||||
],
|
||||
},
|
||||
],
|
||||
]);
|
||||
|
||||
export const DiceOptionsHelpPages: HelpPage = {
|
||||
|
|
Loading…
Reference in New Issue