osumodcalculator
Version:
osu! calculator for converting values to DT & HT and other things
225 lines (224 loc) • 6.59 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModInts = void 0;
exports.toInt = toInt;
exports.intToAcronym = intToAcronym;
exports.nameToAcronym = nameToAcronym;
exports.acronymToName = acronymToName;
exports.removeDupe = removeDupe;
exports.order = order;
exports.removeIncompatible = removeIncompatible;
exports.fix = fix;
exports.fromString = fromString;
const _1 = require(".");
/**
* Mod acronyms as an enum
*/
var ModInts;
(function (ModInts) {
ModInts[ModInts["NM"] = 0] = "NM";
ModInts[ModInts["NF"] = 1] = "NF";
ModInts[ModInts["EZ"] = 2] = "EZ";
ModInts[ModInts["TD"] = 4] = "TD";
ModInts[ModInts["HD"] = 8] = "HD";
ModInts[ModInts["HR"] = 16] = "HR";
ModInts[ModInts["SD"] = 32] = "SD";
ModInts[ModInts["DT"] = 64] = "DT";
ModInts[ModInts["RL"] = 128] = "RL";
ModInts[ModInts["HT"] = 256] = "HT";
ModInts[ModInts["NC"] = 512] = "NC";
ModInts[ModInts["FL"] = 1024] = "FL";
ModInts[ModInts["AT"] = 2048] = "AT";
ModInts[ModInts["SO"] = 4096] = "SO";
ModInts[ModInts["AP"] = 8192] = "AP";
ModInts[ModInts["PF"] = 16384] = "PF";
ModInts[ModInts["4K"] = 32768] = "4K";
ModInts[ModInts["5K"] = 65536] = "5K";
ModInts[ModInts["6K"] = 131072] = "6K";
ModInts[ModInts["7K"] = 262144] = "7K";
ModInts[ModInts["8K"] = 524288] = "8K";
ModInts[ModInts["FI"] = 1048576] = "FI";
ModInts[ModInts["RD"] = 2097152] = "RD";
ModInts[ModInts["CN"] = 4194304] = "CN";
ModInts[ModInts["TP"] = 8388608] = "TP";
ModInts[ModInts["9K"] = 16777216] = "9K";
ModInts[ModInts["CP"] = 33554432] = "CP";
ModInts[ModInts["1K"] = 67108864] = "1K";
ModInts[ModInts["3K"] = 134217728] = "3K";
ModInts[ModInts["2K"] = 268435456] = "2K";
ModInts[ModInts["SV2"] = 536870912] = "SV2";
ModInts[ModInts["MR"] = 1073741824] = "MR";
})(ModInts || (exports.ModInts = ModInts = {}));
/**
* STABLE MODS ONLY
*
* Converts each mod to their enum value and adds them together
*
* @includeExample src/examples/mod.ts:4-5
*/
function toInt(mods) {
let modInt = 0;
const map = _1.Mods.map(x => [x.acronym, x.enum]).filter(x => x[1] != -1);
const searchmap = map.map(x => x[0]);
for (const mod of mods) {
if (searchmap.includes(mod)) {
const idx = searchmap.indexOf(mod);
const v = map[idx][1];
modInt += v;
}
}
return modInt;
}
/**
* STABLE MODS ONLY
*
* Converts an enum into the acronym of each mod
*
* @includeExample src/examples/mod.ts:8-9
*/
function intToAcronym(modInt) {
const mods = [];
for (const mod of _1.Mods) {
if (mod.enum != -1 && modInt & mod.enum) {
mods.push(mod.acronym);
}
}
removeIncompatible(mods);
return mods;
}
/**
* mod acronyms in order (subjective)
*/
function getOrderedMods() {
return ['EZ', 'HD', 'FI', 'HT', 'DC', 'DT', 'NC', 'HR', 'FL', 'SD', 'PF', 'NF', 'AT', 'CN', 'RX', 'AP', 'TP', 'SO', 'TD', '1K', '2K', '3K', '4K', '5K', '6K', '7K', '8K', '9K', '10K', 'CO', 'RD', 'MR', 'SV2',
'BL', 'ST', 'DA', 'CL', 'AL', 'ST', 'TR', 'WG', 'SI', 'GR', 'DF', 'WU', 'WD', 'TR', 'BR', 'AD', 'MU', 'NS', 'MG', 'RP', 'AS', 'FF'
];
}
/**
* Converts mod names to their respective acronyms
*
* mods are NOT case sensitive
*
* @includeExample src/examples/mod.ts:12-13
*/
function nameToAcronym(mods) {
mods = mods.map(x => x.toLowerCase());
const acronyms = [];
const map = _1.Mods.map(x => [x.name.toLowerCase(), x.acronym]);
const searchmap = map.map(x => x[0]);
for (const mod of mods) {
if (searchmap.includes(mod)) {
const index = searchmap.indexOf(mod);
acronyms.push(map[index][1]);
}
}
return acronyms;
}
/**
* Converts mod acronyms to their respective names
*
* mods are NOT case sensitive
*
* @includeExample src/examples/mod.ts:16-17
*/
function acronymToName(mods) {
mods = mods.map(x => x.toUpperCase());
const fullnames = [];
const map = _1.Mods.map(x => [x.acronym, x.name]);
const searchmap = map.map(x => x[0]);
for (const mod of mods) {
if (searchmap.includes(mod)) {
const index = searchmap.indexOf(mod);
fullnames.push(map[index][1]);
}
}
return fullnames;
}
/**
* remove duplicate mods
*
* @includeExample src/examples/mod.ts:20-21
*/
function removeDupe(mods) {
const nodupe = [];
for (const mod of mods) {
if (!nodupe.includes(mod)) {
nodupe.push(mod);
}
}
return nodupe;
}
/**
* orders mods
*
* @includeExample src/examples/mod.ts:24-25
*/
function order(mods) {
const nt = [];
for (const om of getOrderedMods()) {
for (const mod of mods) {
if (om === mod) {
nt.push(mod);
}
}
}
return nt;
}
/**
* removes incompatible mods such as ez+hr and mods from other mods
*
* @includeExample src/examples/mod.ts:28-29
*/
function removeIncompatible(mods, mode = 'osu') {
const ignore = [];
const map = _1.Mods.map(x => x.acronym);
const fr = [];
for (const mod of mods) {
const idx = map.indexOf(mod);
const checkMod = _1.Mods[idx];
if (!ignore.includes(mod) && (checkMod.restrictMode && checkMod.restrictMode.includes(mode) || !checkMod.restrictMode || checkMod.restrictMode.length == 0)) {
for (const ig of checkMod.incompatible) {
if (ig.startsWith('(')) {
if ((!ig.includes('!' + mode) && ig.includes(mode)) ||
(ig.includes('!') && !ig.includes(mode))) {
ignore.push(ig.split(')')[1]);
}
}
else {
ignore.push(ig);
}
}
fr.push(mod);
}
}
return fr;
}
/**
* re-orders, removes duplicates, removes incompabitle
*
* @includeExample src/examples/mod.ts:32-34
*/
function fix(mods, mode = 'osu') {
const nodupe = removeDupe(mods);
const inc = removeIncompatible(nodupe, mode);
const nt = order(inc);
return nt;
}
/**
* convert string into mods
*
* make sure each mod is 2 characters
*
* @includeExample src/examples/mod.ts:37-38
*/
function fromString(str) {
const temp = str.replace(/(.{2})/g, "$1 ").split(' ');
const map = _1.Mods.map(x => x.acronym);
const output = [];
temp.forEach(mod => {
if (map.includes(mod)) {
output.push(mod);
}
});
return output;
}