Make dice viewable seperately in DS4Check

This commit is contained in:
Johannes Loher 2021-03-13 17:43:48 +01:00
parent a542dd1575
commit 9c1d2f081a
8 changed files with 157 additions and 651 deletions

View file

@ -1,3 +1,22 @@
export default function evaluateCheck(
dice: number[],
checkTargetNumber: number,
{
maximumCoupResult = 1,
minimumFumbleResult = 20,
canFumble = true,
}: { maximumCoupResult?: number; minimumFumbleResult?: number; canFumble?: boolean } = {},
): DS4SubCheckResult[] {
const diceWithSubChecks = assignSubChecksToDice(dice, checkTargetNumber, {
maximumCoupResult: maximumCoupResult,
});
return evaluateDiceWithSubChecks(diceWithSubChecks, {
maximumCoupResult: maximumCoupResult,
minimumFumbleResult: minimumFumbleResult,
canFumble: canFumble,
});
}
export function assignSubChecksToDice(
dice: number[],
checkTargetNumber: number,
@ -6,8 +25,9 @@ export function assignSubChecksToDice(
}: {
maximumCoupResult?: number;
} = {},
): { result: number; checkTargetNumber: number }[] {
const requiredNumberOfDice = Math.ceil(checkTargetNumber / 20);
): DieWithSubCheck[] {
const requiredNumberOfDice = getRequiredNumberOfDice(checkTargetNumber);
if (dice.length !== requiredNumberOfDice || requiredNumberOfDice < 1) {
throw new Error(game.i18n.localize("DS4.ErrorInvalidNumberOfDice")); // TODO: add i18n
}
@ -55,3 +75,41 @@ function shouldUseCoupForLastSubCheck(
dice[indexOfSmallestNonCoup] + checkTargetNumberForLastSubCheck > 20))
);
}
interface DieWithSubCheck {
result: number;
checkTargetNumber: number;
}
interface DS4SubCheckResult extends DieWithSubCheck, DiceTerm.Result {
success?: boolean;
failure?: boolean;
count?: number;
}
function evaluateDiceWithSubChecks(
results: DieWithSubCheck[],
{
maximumCoupResult,
minimumFumbleResult,
canFumble,
}: { maximumCoupResult: number; minimumFumbleResult: number; canFumble: boolean },
): DS4SubCheckResult[] {
return results.map((dieWithSubCheck, index) => {
const result: DS4SubCheckResult = {
...dieWithSubCheck,
active: dieWithSubCheck.result <= dieWithSubCheck.checkTargetNumber,
discarded: dieWithSubCheck.result > dieWithSubCheck.checkTargetNumber,
};
if (result.result <= maximumCoupResult) {
result.success = true;
result.count = result.checkTargetNumber;
}
if (index === 0 && canFumble && result.result >= minimumFumbleResult) result.failure = true;
return result;
});
}
export function getRequiredNumberOfDice(checkTargetNumber: number): number {
return Math.ceil(checkTargetNumber / 20);
}