All files / libs/games/src/opend6 difficulty.ts

100% Statements 83/83
100% Branches 21/21
100% Functions 5/5
100% Lines 83/83

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 841x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 30x 30x 30x 25x 25x 30x 30x 20x 20x 30x 30x 15x 15x 30x 30x 10x 10x 30x 30x 5x 5x 30x 30x 30x 1x 1x 60x 60x 60x 60x 60x 60x 60x 60x 1x 1x 30x 30x 30x 30x 1x 1x 30x 30x 30x 30x 30x 30x 1x 1x 30x 30x 30x 30x 30x 30x  
export enum RollDifficultyLabel {
    VERY_EASY = "Very Easy",
    EASY = "Easy",
    MODERATE = "Moderate",
    DIFFICULT = "Difficult",
    VERY_DIFFICULT = "Very Difficult",
    HEROIC = "Heroic",
}
 
export interface IRollDifficulty {
    label: RollDifficultyLabel;
    dieCode: string;
    meanResult: number;
}
 
export interface IRollDieCode {
    modifier: number;
    number: number;
}
 
const VERY_EASY_THRESHOLD = 5;
const EASY_THRESHOLD = 10;
const MODERATE_THRESHOLD = 15;
const DIFFICULT_THRESHOLD = 20;
const VERY_DIFFICULT_THRESHOLD = 25;
 
const getDifficultyLabel = (target: number): RollDifficultyLabel => {
    let label: RollDifficultyLabel = RollDifficultyLabel.VERY_EASY;
 
    if (target > VERY_EASY_THRESHOLD) {
        label = RollDifficultyLabel.EASY;
    }
 
    if (target > EASY_THRESHOLD) {
        label = RollDifficultyLabel.MODERATE;
    }
 
    if (target > MODERATE_THRESHOLD) {
        label = RollDifficultyLabel.DIFFICULT;
    }
 
    if (target > DIFFICULT_THRESHOLD) {
        label = RollDifficultyLabel.VERY_DIFFICULT;
    }
 
    if (target > VERY_DIFFICULT_THRESHOLD) {
        label = RollDifficultyLabel.HEROIC;
    }
 
    return label;
};
 
const getDieCode = (target: number): IRollDieCode => {
    const dieNumber: number = target > 3 ? Math.floor(target / 3.5) : 0;
    const dieModifier: number = dieNumber > 0 ? Math.floor(target - dieNumber * 3.5) : 0;
 
    return {
        modifier: dieModifier,
        number: dieNumber,
    };
};
 
const getDifficultyMeanResult = (target: number): number => {
    const dieCode = getDieCode(target);
 
    return target > 3 ? dieCode.number * 3.5 + dieCode.modifier : target;
};
 
const getDifficultyDieCode = (target: number): string => {
    const dieCode = getDieCode(target);
 
    const dieModifierString: string = dieCode.modifier > 0 ? `+${dieCode.modifier}` : "";
 
    return dieCode.number > 0 ? `${dieCode.number}D${dieModifierString}` : target.toString();
};
 
export const getDifficulty = (target: number): IRollDifficulty => {
    return {
        label: getDifficultyLabel(target),
        dieCode: getDifficultyDieCode(target),
        meanResult: getDifficultyMeanResult(target),
    };
};