83 lines
2.0 KiB
JavaScript
83 lines
2.0 KiB
JavaScript
/**
|
|
* 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
|
|
);
|
|
}
|
|
}
|