rg-stats
Version:
A library for calculating various rhythm game stats.
39 lines (33 loc) • 1.48 kB
text/typescript
import { ThrowIf } from "../util/throw-if";
/**
* Calculates the rating for a CHUNITHM score.
* This is accurate up to SUN.
*
* @param score - The score the user got. This is a value between 0 and 1.01million.
* @param internalChartLevel - The internal chart level. This is a decimal value stored by the game internally.
*/
export function calculate(score: number, internalChartLevel: number) {
const levelBase = internalChartLevel * 100;
ThrowIf(score > 1_010_000, "Score cannot be greater than 1.01Million.", { score });
ThrowIf.negative(score, "Score cannot be negative.", { score });
ThrowIf.negative(internalChartLevel, "Chart level cannot be negative.", { internalChartLevel });
let val = 0;
if (score >= 1_009_000) {
val = levelBase + 215;
} else if (score >= 1_007_500) {
val = levelBase + 200 + (score - 1_007_500) / 100;
} else if (score >= 1_005_000) {
val = levelBase + 150 + ((score - 1_005_000) * 10) / 500;
} else if (score >= 1_000_000) {
val = levelBase + 100 + ((score - 1_000_000) * 5) / 500;
} else if (score >= 975_000) {
val = levelBase + ((score - 975_000) * 2) / 500;
} else if (score >= 900_000) {
val = levelBase - 500 + ((score - 900_000) * 2) / 300;
} else if (score >= 800_000) {
val = (levelBase - 500) / 2 + ((score - 800_000) * ((levelBase - 500) / 2)) / 100_000;
} else if (score >= 500_000) {
val = (((levelBase - 500) / 2) * (score - 500_000)) / 300_000;
}
return Math.max(Math.floor(val) / 100, 0);
}