/** * Numbers of decimal digits to round to */ const scale = 0; /** * Calculate the score awarded when having a certain percentage on a list level * @param {Number} rank Position on the list * @param {Number} percent Percentage of completion * @param {Number} minPercent Minimum percentage required * @returns {Number} */ export function score(rank, percent, minPercent) { if (rank > 150) { return 0; } if (rank > 75 && percent < 100) { return 0; } if (rank == null) { return 0; } // Old formula /* let score = (100 / Math.sqrt((rank - 1) / 50 + 0.444444) - 50) * ((percent - (minPercent - 1)) / (100 - (minPercent - 1))); */ // New formula /*let score = Math.round((-49.9975*Math.pow(rank-1, 0.4) + 350) * ((percent - (minPercent - 1)) / (100 - (minPercent - 1)))); score = Math.max(0, score);*/ // peter griffin formula let score = Math.round((-59.9975*Math.pow(rank-1, 0.345) + 350)); score = Math.max(0, score); if (percent != 100) { return round(score * 0.1); } return Math.max(round(score), 0); } export function packScore(levels) { if (!levels || !levels.length) return 0; let total = 0; for (const level of levels) { total += score(level.listRank, 100, level.percentToQualify ?? 0); } // pack bonus multiplier let multiplier = 1; if (levels.length >= 7) multiplier = 1.4; else if (levels.length >= 5) multiplier = 1.3; else if (levels.length >= 3) multiplier = 1.2; else if (levels.length >= 2) multiplier = 1.1; return round((total * multiplier)/levels.length); } export function round(num) { if (!('' + num).includes('e')) { return +(Math.round(num + 'e+' + scale) + 'e-' + scale); } else { var arr = ('' + num).split('e'); var sig = ''; if (+arr[1] + scale > 0) { sig = '+'; } return +( Math.round(+arr[0] + 'e' + sig + (+arr[1] + scale)) + 'e-' + scale ); } }