All files / games/opend6-dices/src difficulty.ts

100% Statements 38/38
100% Branches 22/22
100% Functions 6/6
100% Lines 38/38

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 842x 2x 2x 2x 2x 2x 2x                           2x 30x             2x 2x 2x 2x 2x   2x 30x   30x 25x     30x 20x     30x 15x     30x 10x     30x 5x     30x     2x 30x   30x     2x 30x   30x   30x     2x 60x 60x   60x          
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;
}
 
export const getDifficulty = (target: number): IRollDifficulty => {
    return {
        label: getDifficultyLabel(target),
        dieCode: getDifficultyDieCode(target),
        meanResult: getDifficultyMeanResult(target),
    };
};
 
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 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();
};
 
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,
    };
};