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

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

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 84  2x 2x   2x 2x 2x 2x 2x 2x 2x   2x 30x           2x 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,
    };
};