Files
zkldi_Tachi/common/js/config.js
T
2021-04-07 14:47:50 +01:00

1610 lines
42 KiB
JavaScript

"use strict";
// Hi, Just so you know, this code is not representative of the internal site code.
// This has been added to over the course of around 10 months at the time of writing, and is the source
// of some of my first javascript code.
// It's,, alright, but I like the versatility it brings.
Object.defineProperty(exports, "__esModule", { value: true });
const supportedGames = [
"iidx",
"museca",
"maimai",
"jubeat",
"popn",
"sdvx",
"ddr",
"bms",
"chunithm",
"gitadora",
"usc",
];
const serviceSupportedGames = {
PLI: ["iidx"],
ARC: ["iidx", "jubeat", "sdvx", "ddr"],
FLO: ["iidx"],
EAG: ["iidx"],
"e-amusement": ["iidx"],
LR2: ["bms"],
beatoraja: ["bms"],
MER: ["iidx"],
SSS: ["iidx"],
MaimaiNet: ["maimai"],
"BATCH-MANUAL": supportedGames,
"DIRECT-MANUAL": supportedGames,
MANUAL: supportedGames,
};
// internal services are services that aren't exposed to the public
// but still leverage ImportMain.
const internalServiceGames = {
"ktchi-beatoraja-IR": ["bms"],
FER: ["iidx"],
"ktchi-usc-IR": ["usc"],
};
const gameSpecificCalc = {
iidx: {
SP: ["BPI", "K%"],
DP: ["BPI"],
},
sdvx: {
Single: ["VF4", "VF5"],
},
ddr: {
SP: ["MFCP"],
DP: ["MFCP"],
},
usc: {
Single: ["VF4", "VF5"],
},
};
const gameSpecificCalcDescriptions = {
iidx: {
SP: {
BPI: "Beat Power Index: How good a score is relative to Kaiden Average (BPI 0) and the World Record (BPI 100).",
"K%": "Kaiden Percentile: How many Kaidens you're ahead of on a given chart.",
},
DP: {
BPI: "Beat Power Index: How good a score is relative to Kaiden Average (BPI 0) and the World Record (BPI 100).",
},
},
sdvx: {
Single: {
VF4: "VOLFORCE as calculated in SOUND VOLTEX IV: HEAVENLY HAVEN.",
VF5: "VOLFORCE as calculated in SOUND VOLTEX V: VIVID WAVE.",
},
},
ddr: {
SP: {
MFCP: "MFC Points as described in LIFE4.",
},
DP: {
MFCP: "MFC Points as described in LIFE4.",
},
},
usc: {
Single: {
VF4: "VOLFORCE as calculated in SOUND VOLTEX IV: HEAVENLY HAVEN.",
VF5: "VOLFORCE as calculated in SOUND VOLTEX V: VIVID WAVE.",
},
},
};
const validDifficulties = {
iidx: ["BEGINNER", "NORMAL", "HYPER", "ANOTHER", "LEGGENDARIA"],
museca: ["Green", "Yellow", "Red"],
maimai: ["Easy", "Basic", "Advanced", "Expert", "Master", "Re:Master"],
jubeat: ["BSC", "ADV", "EXT"],
popn: ["Easy", "Normal", "Hyper", "EX"],
sdvx: ["NOV", "ADV", "EXH", "MXM", "INF", "GRV", "HVN", "VVD"],
ddr: ["BEGINNER", "BASIC", "DIFFICULT", "EXPERT", "CHALLENGE"],
bms: ["BEGINNER", "NORMAL", "HYPER", "ANOTHER", "INSANE", "CUSTOM"],
chunithm: ["BASIC", "ADVANCED", "EXPERT", "MASTER", "WORLD'S END"],
gitadora: [
"BASIC",
"ADVANCED",
"EXTREME",
"MASTER",
"BASS BASIC",
"BASS ADVANCED",
"BASS EXTREME",
"BASS MASTER",
],
usc: ["NOV", "ADV", "EXH", "INF"],
};
const defaultTable = {
iidx: "Levels (N-1)",
bms: "Insane",
museca: "Levels",
jubeat: "Levels",
popn: "Levels",
sdvx: "Levels",
ddr: "Levels",
chunithm: "Levels",
gitadora: "Levels",
usc: "Levels",
maimai: "Levels",
};
const folderTables = {
iidx: ["Levels", "Levels (Omnimix)", "Levels (N-1)", "Levels (N-1 Omnimix)", "Versions"],
bms: ["Normal", "Insane", "Overjoy", "Satellite", "Stella", "Insane 2", "Joverjoy"],
museca: ["Levels", "Versions"],
jubeat: ["Levels", "Versions"],
popn: ["Levels", "Versions"],
sdvx: ["Levels", "Versions"],
ddr: ["Levels", "Versions"],
chunithm: ["Levels", "Levels (Omnimix)", "Versions"],
gitadora: ["Levels", "Versions"],
usc: ["Levels", "Versions"],
maimai: ["Levels", "Versions"],
};
const validHitData = {
iidx: ["pgreat", "great", "good", "bad", "poor"],
bms: ["pgreat", "great", "good", "bad", "poor"],
museca: ["critical", "near", "miss"],
ddr: ["marvelous", "perfect", "great", "good", "boo", "miss", "ok", "ng"],
sdvx: ["critical", "near", "miss"],
popn: ["cool", "great", "good", "bad"],
maimai: ["perfect", "great", "good", "miss"],
jubeat: ["perfect", "great", "good", "bad", "miss"],
chunithm: ["jcrit", "justice", "attack", "miss"],
gitadora: ["perfect", "great", "good", "ok", "miss"],
usc: ["critical", "near", "miss"],
};
const BASE_VALID_HIT_META = ["fast", "slow", "maxCombo"];
const validHitMeta = {
iidx: ["bp", "gauge", "gaugeHistory", "comboBreak", ...BASE_VALID_HIT_META],
museca: BASE_VALID_HIT_META,
ddr: BASE_VALID_HIT_META,
maimai: BASE_VALID_HIT_META,
jubeat: BASE_VALID_HIT_META,
popn: ["gauge", ...BASE_VALID_HIT_META],
sdvx: ["gauge", ...BASE_VALID_HIT_META],
bms: [
"bp",
"gauge",
"lbd",
"ebd",
"lpr",
"epr",
"lgd",
"egd",
"lgr",
"egr",
"lpg",
"epg",
"diedAt",
"random",
"inputDevice",
...BASE_VALID_HIT_META,
],
chunithm: [...BASE_VALID_HIT_META],
gitadora: [...BASE_VALID_HIT_META],
usc: ["gauge", ...BASE_VALID_HIT_META],
};
const validScoreMeta = {
iidx: {
optionsRandom: ["NONRAN", "RANDOM", "R-RANDOM", "S-RANDOM", "MIRROR"],
optionsAssist: [
"AUTO SCRATCH",
"5KEYS",
"LEGACY NOTE",
"ASCR + 5KEY",
"ASCR + LEGACY",
"5KEYS + LEGACY",
"FULL ASSIST",
],
optionsRange: ["SUDDEN+", "HIDDEN+", "SUD+ HID+", "LIFT", "LIFT SUD+"],
optionsGauge: ["ASSISTED EASY", "EASY", "HARD", "EX-HARD"],
pacemaker: [
"NO GRAPH",
"MY BEST",
"RIVAL 1",
"RIVAL 2",
"RIVAL 3",
"RIVAL 4",
"RIVAL 5",
"RIVAL NEXT",
"RIVAL BEST",
"RIVAL AVERAGE",
"NATIONAL BEST",
"NATIONAL AVERAGE",
"PREFECTURE BEST",
"PREFECTURE AVERAGE",
"CLASS BEST",
"CLASS AVERAGE",
"VENUE BEST",
"VENUE NEXT",
"PREVIOUS GHOST",
"PACEMAKER AAA",
"PACEMAKER AA",
"PACEMAKER A",
"PACEMAKER" /* ??? */,
"PACEMAKER NEXT",
"PACEMAKER NEXT+",
"PLAYER 1",
"PLAYER 2",
],
pacemakerName: "string",
pacemakerTarget: "integer",
deadMeasure: "integer",
deadNote: "integer",
},
museca: {},
ddr: {},
maimai: {},
jubeat: {},
popn: {},
sdvx: {},
bms: {},
chunithm: {},
gitadora: {},
usc: {
noteMod: ["NORMAL", "MIRROR", "RANDOM", "MIR-RAN"],
gaugeMod: ["NORMAL", "HARD"],
},
};
const gameColours = {
iidx: "#E7BDB3",
museca: "#C9A4A0",
maimai: "#AE8094",
sdvx: "#D6B7B1",
ddr: "#CC5079",
gitadora: "#CA9CA9",
// gfdm: "#DA836E",
jubeat: "#129A7D",
popn: "#F39CA4",
bms: "#B5DCCD",
chunithm: "#AE8094",
usc: "#D6B7B1", // TODO
};
const gameRelevantScoreBucket = {
iidx: "lamp",
museca: "grade",
maimai: "grade",
sdvx: "grade",
ddr: "lamp",
gitadora: "grade",
// gfdm: "grade",
jubeat: "grade",
popn: "grade",
bms: "lamp",
chunithm: "grade",
usc: "grade",
};
// human readable stuff for games
const gameHuman = {
iidx: "beatmania IIDX",
museca: "MÚSECA",
maimai: "maimai",
sdvx: "SOUND VOLTEX",
ddr: "DDR",
gitadora: "GITADORA",
jubeat: "jubeat",
popn: "pop'n music",
bms: "BMS",
chunithm: "CHUNITHM",
usc: "unnamed sdvx clone",
};
// human readable stuff for versions
const versionHuman = {
iidx: {
0: "1st Style",
1: "substream",
2: "2nd Style",
3: "3rd Style",
4: "4th Style",
5: "5th Style",
6: "6th Style",
7: "7th Style",
8: "8th Style",
9: "9th Style",
10: "10th Style",
11: "IIDX RED",
12: "HAPPY SKY",
13: "DISTORTED",
14: "GOLD",
15: "DJ TROOPERS",
16: "EMPRESS",
17: "SIRIUS",
18: "Resort Anthem",
19: "Lincle",
20: "tricoro",
21: "SPADA",
22: "PENDUAL",
23: "copula",
24: "SINOBUZ",
25: "CANNON BALLERS",
26: "ROOTAGE",
27: "HEROIC VERSE",
},
museca: {
1: "",
1.5: "1+1/2",
},
maimai: {
maimai: "",
maimaiplus: "PLUS",
green: "GReeN",
greenplus: "GReeN PLUS",
orange: "ORANGE",
orangeplus: "ORANGE PLUS",
pink: "PiNK",
pinkplus: "PiNK PLUS",
murasaki: "MURASAKi",
murasakiplus: "MURASAKi PLUS",
milk: "MiLK",
milkplus: "MiLK PLUS",
finale: "FiNALE",
},
jubeat: {
jubeat: "",
ripples: "ripples",
knit: "knit",
copious: "copious",
saucer: "saucer",
saucerfulfill: "saucer fulfill",
prop: "prop",
qubell: "Qubell",
clan: "clan",
festo: "festo",
},
popn: {
1: "1",
2: "2",
3: "3",
4: "4",
5: "5",
6: "6",
7: "7",
8: "8",
9: "9",
10: "10",
11: "11",
12: "12 Iroha",
13: "13 CARNIVAL",
14: "14 FEVER!",
15: "15 ADVENTURE",
16: "16 PARTY♪",
17: "17 THE MOVIE",
18: "18 Sengoku",
19: "19 TUNE STREET",
20: "20 fantasia",
park: "Sunny Park",
lapis: "Lapistoria",
eclale: "éclale",
usaneko: "Usaneko",
peace: "peace",
},
sdvx: {
booth: "BOOTH",
inf: "II -infinite infection-",
gw: "III GRAVITY WARS",
heaven: "IV HEAVENLY HAVEN",
vivid: "V VIVID WAVE",
},
ddr: {
1: "1st Mix",
2: "2nd Mix",
3: "3rd Mix",
4: "4th Mix",
5: "5th Mix",
max: "MAX",
max2: "MAX2",
extreme: "EXTREME",
snova: "SuperNOVA",
snova2: "SuperNOVA 2",
x: "X",
x2: "X2",
x3: "X3 vs. 2nd Mix",
2013: "(2013)",
2014: "(2014)",
a: "Ace",
a20: "A20",
},
chunithm: {
chuni: "",
chuniplus: "PLUS",
air: "AIR",
airplus: "AIR PLUS",
star: "STAR",
starplus: "STAR PLUS",
amazon: "AMAZON",
amazonplus: "AMAZON PLUS",
crystal: "CRYSTAL",
crystalplus: "CRYSTAL PLUS",
},
gitadora: {
xg: "XG",
xg2: "XG2",
xg3: "XG3",
gitadora: "",
overdrive: "OverDrive",
triboost: "Tri-Boost",
triboostplus: "Tri-Boost (Re:EVOLVE)",
matixx: "Matixx",
exchain: "EXCHAIN",
nextage: "NEX+AGE",
},
bms: {
0: "BMS",
},
usc: {
0: "USC",
},
};
// release orders of the games.
const gameOrders = {
iidx: [
"0",
"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",
],
museca: ["1", "1.5"],
maimai: [
"maimai",
"maimaiplus",
"green",
"greenplus",
"orange",
"orangeplus",
"pink",
"pinkplus",
"murasaki",
"murasakiplus",
"milk",
"milkplus",
"finale",
],
jubeat: [
"jubeat",
"ripples",
"knit",
"copious",
"saucer",
"saucerfulfill",
"prop",
"qubell",
"clan",
"festo",
],
popn: [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"park",
"lapis",
"eclale",
"usaneko",
"peace",
],
sdvx: ["booth", "inf", "gw", "heaven", "vivid"],
ddr: [
"1",
"2",
"3",
"4",
"5",
"max",
"max2",
"extreme",
"snova",
"snova2",
"x",
"x2",
"x3",
"2013",
"2014",
"a",
"a20",
],
bms: ["0"],
chunithm: [
"chuni",
"chuniplus",
"air",
"airplus",
"star",
"starplus",
"amazon",
"amazonplus",
"crystal",
"crystalplus",
],
gitadora: [
"gf1",
"gf2dm1",
"gf3dm2",
"gf4dm3",
"gf5dm4",
"gf6dm5",
"gf7dm6",
"gf8dm7",
"gf8dm7plus",
"gf9dm8",
"gf10dm9",
"gf11dm10",
"v",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"xg",
"xg2",
"xg3",
"gitadora",
"overdrive",
"triboost",
"triboostplus",
"matixx",
"exchain",
"nextage",
],
usc: ["0"],
};
const defaultPlaytype = {
iidx: "SP",
museca: "Single",
maimai: "Single",
jubeat: "Single",
popn: "9B",
sdvx: "Single",
ddr: "SP",
bms: "7K",
chunithm: "Single",
gitadora: "Dora",
usc: "Single",
};
const defaultDifficulty = {
iidx: "ANOTHER",
museca: "Red",
maimai: "Master",
jubeat: "EXT",
popn: "EX",
sdvx: "EXH",
ddr: "EXPERT",
bms: "CUSTOM",
chunithm: "MASTER",
gitadora: "MASTER",
usc: "EXH",
};
function humaniseGame(game, pt) {
if (!pt) {
return gameHuman[game];
}
if (validPlaytypes[game].length === 1) {
return gameHuman[game];
}
return `${gameHuman[game]} (${pt})`;
}
// todo, maybe
// const difficultyColours = {
// iidx: {
// "BEGINNER": ,
// "NORMAL": ,
// "HYPER": ,
// "ANOTHER": ,
// "LEGGENDARIA": ,
// }
// }
const validPlaytypes = {
iidx: ["SP", "DP"],
popn: ["9B"],
sdvx: ["Single"],
ddr: ["SP", "DP"],
maimai: ["Single"],
jubeat: ["Single"],
museca: ["Single"],
bms: ["7K", "14K", "5K"],
chunithm: ["Single"],
gitadora: ["Gita", "Dora"],
usc: ["Single"],
};
const validTierlistTiers = {
iidx: ["clear", "hardclear", "exhardclear"],
museca: ["clear"],
maimai: [],
jubeat: [],
popn: [],
sdvx: ["clear", "excessiveclear"],
ddr: ["clear", "perfectfullcombo"],
bms: ["easyclear", "clear", "hardclear", "fullcombo"],
chunithm: [],
gitadora: [],
usc: ["clear", "excessiveclear"],
};
// correct order for grades
const grades = {
iidx: ["F", "E", "D", "C", "B", "A", "AA", "AAA", "MAX-", "MAX"],
bms: ["F", "E", "D", "C", "B", "A", "AA", "AAA", "MAX-", "MAX"],
museca: ["没", "拙", "凡", "佳", "良", "優", "秀", "傑", "傑G"],
maimai: ["F", "E", "D", "C", "B", "A", "AA", "AAA", "S", "S+", "SS", "SS+", "SSS", "SSS+"],
jubeat: ["E", "D", "C", "B", "A", "S", "SS", "SSS", "EXC"],
popn: ["E", "D", "C", "B", "A", "AA", "AAA", "S"],
sdvx: ["D", "C", "B", "A", "A+", "AA", "AA+", "AAA", "AAA+", "S"],
ddr: [
"D",
"D+",
"C-",
"C",
"C+",
"B-",
"B",
"B+",
"A-",
"A",
"A+",
"AA-",
"AA",
"AA+",
"AAA",
"MAX",
],
chunithm: ["D", "C", "B", "BB", "BBB", "A", "AA", "AAA", "S", "SS", "SSS"],
gitadora: ["C", "B", "A", "S", "SS", "MAX"],
usc: ["D", "C", "B", "A", "A+", "AA", "AA+", "AAA", "AAA+", "S"],
};
const gradeBoundaries = {
iidx: [0, 22.22, 33.33, 44.44, 55.55, 66.66, 77.77, 88.88, 94.44, 100.0],
bms: [0, 22.22, 33.33, 44.44, 55.55, 66.66, 77.77, 88.88, 94.44, 100.0],
museca: [0, 60, 70, 80, 85, 90, 95, 97.5, 100],
// maimai is fidgety with grades - SSS+ is only possible if you get above 100%, but what the limit is depends on the chart
maimai: [0, 10, 20, 40, 60, 80, 90, 94, 97, 98, 99, 99.5, 100, 9999],
jubeat: [0, 50, 70, 80, 85, 90, 95, 98, 100],
popn: [0, 50, 62, 72, 82, 90, 95, 98],
// popn is fidgety with grades - A is the limit of grades if you fail. this NEEDS TO BE HANDLED in importhelpers. - 18/09/2020 isnt done yet lol
sdvx: [0, 70, 80, 87, 90, 93, 95, 97, 98, 99],
ddr: [0, 55, 59, 60, 65, 69, 70, 75, 79, 80, 85, 89, 90, 95, 99, 100],
chunithm: [0, 50, 60, 70, 80, 90, 92.5, 95.0, 97.5, 100, 107.5, 101],
gitadora: [0, 63, 73, 80, 95, 100],
usc: [0, 70, 80, 87, 90, 93, 95, 97, 98, 99],
};
// these are to resolve some GARBAGE in chart.js
const boundaryHCF = {
iidx: 5.555,
bms: 5.555,
museca: 2.5,
maimai: 0.5,
jubeat: 1,
popn: 1,
sdvx: 1,
ddr: 1,
chunithm: 0.5,
gitadora: 1,
usc: 1,
};
const expChartScale = {
iidx: 1,
bms: 1,
museca: 5,
maimai: 8,
jubeat: 5,
popn: 1,
sdvx: 7,
usc: 7,
ddr: 6,
chunithm: 4,
gitadora: 3,
};
// valid lamps for a game, and also in order.
const lamps = {
iidx: [
"NO PLAY",
"FAILED",
"ASSIST CLEAR",
"EASY CLEAR",
"CLEAR",
"HARD CLEAR",
"EX HARD CLEAR",
"FULL COMBO",
],
bms: [
"NO PLAY",
"FAILED",
"ASSIST CLEAR",
"EASY CLEAR",
"CLEAR",
"HARD CLEAR",
"EX HARD CLEAR",
"FULL COMBO",
],
museca: ["FAILED", "CLEAR", "CONNECT ALL", "PERFECT CONNECT ALL"],
maimai: ["FAILED", "CLEAR", "FULL COMBO", "ALL PERFECT", "ALL PERFECT+"],
jubeat: ["FAILED", "CLEAR", "FULL COMBO", "EXCELLENT"],
popn: ["FAILED", "CLEAR", "FULL COMBO", "PERFECT"],
sdvx: ["FAILED", "CLEAR", "EXCESSIVE CLEAR", "ULTIMATE CHAIN", "PERFECT ULTIMATE CHAIN"],
ddr: [
"FAILED",
"CLEAR",
"LIFE4",
"FULL COMBO",
"GREAT FULL COMBO",
"PERFECT FULL COMBO",
"MARVELOUS FULL COMBO",
],
chunithm: ["FAILED", "CLEAR", "FULL COMBO", "ALL JUSTICE", "ALL JUSTICE CRITICAL"],
gitadora: ["FAILED", "CLEAR", "FULL COMBO", "EXCELLENT"],
usc: ["FAILED", "CLEAR", "EXCESSIVE CLEAR", "ULTIMATE CHAIN", "PERFECT ULTIMATE CHAIN"],
};
// first lamp that is considered a "true clear" by the game.
// laugh now, but who'll be laughing when some nerds at sega come up with a brand new
// minimal clear grade called "SOFTER EASIER ASSIST CLEAR EPIC X3"
const clearLamp = {
iidx: "CLEAR",
bms: "EASY CLEAR",
museca: "CLEAR",
maimai: "CLEAR",
jubeat: "CLEAR",
popn: "CLEAR",
sdvx: "CLEAR",
ddr: "CLEAR",
chunithm: "CLEAR",
gitadora: "CLEAR",
usc: "CLEAR",
};
// minimum grade considered by the game (or kamaitachi) to be a clearing grade.
const clearGrade = {
iidx: "A",
bms: "A",
museca: "良",
maimai: "A",
jubeat: "A",
popn: "A",
sdvx: "AA",
ddr: "A",
chunithm: "A",
gitadora: "A",
usc: "A",
};
const judgementWindows = {
iidx: {
SP: [
{ name: "PGREAT", msBorder: 16.667, value: 2 },
{ name: "GREAT", msBorder: 33.333, value: 1 },
{ name: "GOOD", msBorder: 116.667, value: 0 },
],
DP: [
{ name: "PGREAT", msBorder: 16.667, value: 2 },
{ name: "GREAT", msBorder: 33.333, value: 1 },
{ name: "GOOD", msBorder: 116.667, value: 0 },
],
},
ddr: {
SP: [
{ name: "MARVELOUS", msBorder: 15, value: 3 },
{ name: "PERFECT", msBorder: 30, value: 2 },
{ name: "GREAT", msBorder: 59, value: 1 },
{ name: "GOOD", msBorder: 89, value: 0 },
{ name: "BAD", msBorder: 119, value: 0 },
],
DP: [
{ name: "MARVELOUS", msBorder: 15, value: 3 },
{ name: "PERFECT", msBorder: 30, value: 2 },
{ name: "GREAT", msBorder: 59, value: 1 },
{ name: "GOOD", msBorder: 89, value: 0 },
{ name: "BAD", msBorder: 119, value: 0 },
],
},
museca: {
Single: [
{ name: "CRITICAL", msBorder: 33.333, value: 2 },
{ name: "NEAR", msBorder: 66.667, value: 1 },
],
},
gitadora: {
Gita: [
{ name: "PERFECT", msBorder: 33, value: 1 },
{ name: "GREAT", msBorder: 57, value: 0.5 },
{ name: "GOOD", msBorder: 81, value: 0.2 },
{ name: "OK", msBorder: 116.667 /* not really, but yknow */, value: 0 },
],
Dora: [
{ name: "PERFECT", msBorder: 27, value: 1 },
{ name: "GREAT", msBorder: 48, value: 0.5 },
{ name: "GOOD", msBorder: 72, value: 0.2 },
{ name: "OK", msBorder: 116.667 /* not really, but yknow */, value: 0 },
],
},
};
const COLOUR_SET = {
gray: "rgba(105, 105, 105, 1)",
maroon: "rgba(85, 17, 17, 1)",
red: "rgba(170, 85, 85, 1)",
paleGreen: "rgba(142,174,79, 1)",
paleBlue: "rgba(92, 97, 153, 1)",
green: "rgba(50, 205, 50, 1)",
blue: "rgba(70, 130, 180, 1)",
gold: "rgba(255, 215, 0, 1)",
vibrantYellow: "rgba(245, 229, 27, 1)",
teal: "rgba(127, 255, 212, 1)",
white: "rgba(192, 192, 192, 1)",
purple: "rgba(153, 50, 204, 1)",
vibrantPurple: "rgba(161, 23, 230, 1)",
paleOrange: "rgba(235, 151, 78, 1)",
orange: "rgba(248, 148, 6, 1)",
vibrantOrange: "rgba(248, 175, 6, 1)",
vibrantBlue: "rgba(43, 149, 237, 1)",
vibrantGreen: "rgba(26, 232, 26, 1)",
};
const gradeColours = {
museca: {
outline: {
没: COLOUR_SET.gray,
拙: COLOUR_SET.maroon,
凡: COLOUR_SET.red,
佳: COLOUR_SET.paleGreen,
良: COLOUR_SET.paleBlue,
優: COLOUR_SET.green,
秀: COLOUR_SET.blue,
傑: COLOUR_SET.teal,
傑G: COLOUR_SET.gold,
},
},
gitadora: {
outline: {
MAX: COLOUR_SET.white,
SS: COLOUR_SET.gold,
S: COLOUR_SET.orange,
A: COLOUR_SET.green,
B: COLOUR_SET.blue,
C: COLOUR_SET.purple,
},
},
ddr: {
outline: {
D: COLOUR_SET.gray,
"D+": COLOUR_SET.maroon,
"C-": COLOUR_SET.red,
C: COLOUR_SET.purple,
"C+": COLOUR_SET.vibrantPurple,
"B-": COLOUR_SET.paleBlue,
B: COLOUR_SET.blue,
"B+": COLOUR_SET.vibrantBlue,
"A-": COLOUR_SET.paleGreen,
A: COLOUR_SET.green,
"A+": COLOUR_SET.vibrantGreen,
"AA-": COLOUR_SET.paleOrange,
AA: COLOUR_SET.orange,
"AA+": COLOUR_SET.vibrantOrange,
AAA: COLOUR_SET.gold,
},
},
jubeat: {
outline: {
E: COLOUR_SET.gray,
D: COLOUR_SET.maroon,
C: COLOUR_SET.purple,
B: COLOUR_SET.paleBlue,
A: COLOUR_SET.paleGreen,
S: COLOUR_SET.blue,
SS: COLOUR_SET.gold,
SSS: COLOUR_SET.teal,
EXC: COLOUR_SET.white,
},
},
maimai: {
outline: {
F: COLOUR_SET.gray,
E: COLOUR_SET.red,
D: COLOUR_SET.maroon,
C: COLOUR_SET.purple,
B: COLOUR_SET.paleGreen,
A: COLOUR_SET.green,
AA: COLOUR_SET.paleBlue,
AAA: COLOUR_SET.blue,
S: COLOUR_SET.gold,
"S+": COLOUR_SET.vibrantYellow,
SS: COLOUR_SET.paleOrange,
"SS+": COLOUR_SET.orange,
SSS: COLOUR_SET.teal,
"SSS+": COLOUR_SET.white,
},
},
popn: {
outline: {
F: COLOUR_SET.gray,
E: COLOUR_SET.red,
D: COLOUR_SET.maroon,
C: COLOUR_SET.purple,
B: COLOUR_SET.paleBlue,
A: COLOUR_SET.green,
AA: COLOUR_SET.paleOrange,
AAA: COLOUR_SET.gold,
S: COLOUR_SET.teal,
},
},
iidx: {
outline: {
F: COLOUR_SET.gray,
E: COLOUR_SET.red,
D: COLOUR_SET.maroon,
C: COLOUR_SET.purple,
B: COLOUR_SET.paleBlue,
A: COLOUR_SET.green,
AA: COLOUR_SET.blue,
AAA: COLOUR_SET.gold,
"MAX-": COLOUR_SET.teal,
MAX: COLOUR_SET.white,
},
},
bms: {
outline: {
F: COLOUR_SET.gray,
E: COLOUR_SET.red,
D: COLOUR_SET.maroon,
C: COLOUR_SET.purple,
B: COLOUR_SET.paleBlue,
A: COLOUR_SET.green,
AA: COLOUR_SET.blue,
AAA: COLOUR_SET.gold,
"MAX-": COLOUR_SET.teal,
MAX: COLOUR_SET.white,
},
},
sdvx: {
outline: {
D: COLOUR_SET.gray,
C: COLOUR_SET.red,
B: COLOUR_SET.maroon,
A: COLOUR_SET.paleBlue,
"A+": COLOUR_SET.blue,
AA: COLOUR_SET.paleGreen,
"AA+": COLOUR_SET.green,
AAA: COLOUR_SET.gold,
"AAA+": COLOUR_SET.vibrantYellow,
S: COLOUR_SET.teal,
},
},
usc: {
outline: {
D: COLOUR_SET.gray,
C: COLOUR_SET.red,
B: COLOUR_SET.maroon,
A: COLOUR_SET.paleBlue,
"A+": COLOUR_SET.blue,
AA: COLOUR_SET.paleGreen,
"AA+": COLOUR_SET.green,
AAA: COLOUR_SET.gold,
"AAA+": COLOUR_SET.vibrantYellow,
S: COLOUR_SET.teal,
},
},
chunithm: {
outline: {
D: COLOUR_SET.red,
C: COLOUR_SET.purple,
B: COLOUR_SET.paleBlue,
BB: COLOUR_SET.blue,
BBB: COLOUR_SET.vibrantBlue,
A: COLOUR_SET.paleGreen,
AA: COLOUR_SET.green,
AAA: COLOUR_SET.vibrantGreen,
S: COLOUR_SET.vibrantOrange,
SS: COLOUR_SET.vibrantYellow,
SSS: COLOUR_SET.teal,
},
},
};
const lampColours = {
gitadora: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.blue,
"FULL COMBO": COLOUR_SET.teal,
EXCELLENT: COLOUR_SET.gold,
},
},
ddr: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.paleGreen,
LIFE4: COLOUR_SET.orange,
"FULL COMBO": COLOUR_SET.paleBlue,
"GREAT FULL COMBO": COLOUR_SET.green,
"PERFECT FULL COMBO": COLOUR_SET.gold,
"MARVELOUS FULL COMBO": COLOUR_SET.teal,
},
},
iidx: {
outline: {
"NO PLAY": COLOUR_SET.gray,
FAILED: COLOUR_SET.red,
"ASSIST CLEAR": COLOUR_SET.purple,
"EASY CLEAR": COLOUR_SET.green,
CLEAR: COLOUR_SET.blue,
"HARD CLEAR": COLOUR_SET.orange,
"EX HARD CLEAR": COLOUR_SET.gold,
"FULL COMBO": COLOUR_SET.teal,
},
},
bms: {
outline: {
"NO PLAY": COLOUR_SET.gray,
FAILED: COLOUR_SET.red,
"ASSIST CLEAR": COLOUR_SET.purple,
"EASY CLEAR": COLOUR_SET.green,
CLEAR: COLOUR_SET.blue,
"HARD CLEAR": COLOUR_SET.orange,
"EX HARD CLEAR": COLOUR_SET.gold,
"FULL COMBO": COLOUR_SET.teal,
},
},
museca: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"CONNECT ALL": COLOUR_SET.teal,
"PERFECT CONNECT ALL": COLOUR_SET.gold,
},
},
sdvx: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"EXCESSIVE CLEAR": COLOUR_SET.orange,
"ULTIMATE CHAIN": COLOUR_SET.teal,
"PERFECT ULTIMATE CHAIN": COLOUR_SET.gold,
},
},
usc: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"EXCESSIVE CLEAR": COLOUR_SET.orange,
"ULTIMATE CHAIN": COLOUR_SET.teal,
"PERFECT ULTIMATE CHAIN": COLOUR_SET.gold,
},
},
popn: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"FULL COMBO": COLOUR_SET.teal,
PERFECT: COLOUR_SET.gold,
},
},
maimai: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"FULL COMBO": COLOUR_SET.blue,
"ALL PERFECT": COLOUR_SET.gold,
"ALL PERFECT+": COLOUR_SET.teal,
},
},
jubeat: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.paleBlue,
"FULL COMBO": COLOUR_SET.teal,
EXCELLENT: COLOUR_SET.gold,
},
},
chunithm: {
outline: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.paleGreen,
"FULL COMBO": COLOUR_SET.paleBlue,
"ALL JUSTICE": COLOUR_SET.gold,
"ALL JUSTICE CRITICAL": COLOUR_SET.white,
},
},
};
// ok
// shoutouts to stack overflow
// https://stackoverflow.com/questions/41993515/access-object-key-using-variable-in-typescript
function typedKeys(o) {
return Object.keys(o);
}
for (const colourConfig of [lampColours, gradeColours]) {
for (const game of typedKeys(colourConfig)) {
if (colourConfig.hasOwnProperty(game)) {
colourConfig[game].fill = {};
for (const key in colourConfig[game].outline) {
if (colourConfig[game].outline.hasOwnProperty(key)) {
const element = colourConfig[game].outline[key];
if (!element) {
continue;
}
let fadedEl = element.split(",");
fadedEl[fadedEl.length - 1] = "0.2)";
colourConfig[game].fill[key] = fadedEl.join(",");
}
}
}
}
}
const judgeColours = {
iidx: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
BAD: "rgba(165, 38, 211, 0.2)",
GOOD: "rgba(38, 211, 78, 0.2)",
GREAT: "rgba(241, 245, 24, 0.2)",
PGREAT: "rgba(158, 248, 255, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
BAD: "rgba(165, 38, 211, 1)",
GOOD: "rgba(38, 211, 78, 1)",
GREAT: "rgba(241, 245, 24, 1)",
PGREAT: "rgba(158, 248, 255, 1)",
},
},
bms: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
BAD: "rgba(165, 38, 211, 0.2)",
GOOD: "rgba(38, 211, 78, 0.2)",
GREAT: "rgba(241, 245, 24, 0.2)",
PGREAT: "rgba(158, 248, 255, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
BAD: "rgba(165, 38, 211, 1)",
GOOD: "rgba(38, 211, 78, 1)",
GREAT: "rgba(241, 245, 24, 1)",
PGREAT: "rgba(158, 248, 255, 1)",
},
},
ddr: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
BOO: "rgba(165, 38, 211, 0.2)",
GOOD: "rgba(38, 211, 78, 0.2)",
GREAT: COLOUR_SET.green,
PERFECT: "rgba(158, 248, 255, 0.2)",
MARVELOUS: "rgba(241, 245, 24, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
BOO: "rgba(165, 38, 211, 1)",
GOOD: "rgba(38, 211, 78, 1)",
GREAT: ChangeAlpha(COLOUR_SET.green, "1"),
PERFECT: "rgba(158, 248, 255, 1)",
MARVELOUS: "rgba(241, 245, 24, 1)",
},
},
museca: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
NEAR: "rgba(20, 210, 223, 0.2)",
CRITICAL: "rgba(241, 245, 24, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
NEAR: "rgba(20, 210, 223, 1)",
CRITICAL: "rgba(241, 245, 24, 1)",
},
},
sdvx: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
NEAR: "rgba(20, 210, 223, 0.2)",
CRITICAL: "rgba(241, 245, 24, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
NEAR: "rgba(20, 210, 223, 1)",
CRITICAL: "rgba(241, 245, 24, 1)",
},
},
usc: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
NEAR: "rgba(20, 210, 223, 0.2)",
CRITICAL: "rgba(241, 245, 24, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
NEAR: "rgba(20, 210, 223, 1)",
CRITICAL: "rgba(241, 245, 24, 1)",
},
},
popn: {
fill: {
BAD: "rgba(165, 38, 211, 0.2)",
GOOD: "rgba(239, 84, 81, 0.2)",
GREAT: "rgba(241, 245, 24, 0.2)",
PGREAT: "rgba(158, 248, 255, 0.2)",
},
outline: {
BAD: "rgba(165, 38, 211, 1)",
GOOD: "rgba(239, 84, 81, 1)",
GREAT: "rgba(241, 245, 24, 1)",
PGREAT: "rgba(158, 248, 255, 1)",
},
},
maimai: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
GOOD: "rgba(38, 211, 78, 0.2)",
GREAT: "rgba(228, 62, 225, 0.2)",
PERFECT: "rgba(241, 245, 24, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
GOOD: "rgba(38, 211, 78, 1)",
GREAT: "rgba(228, 62, 225,1)",
PERFECT: "rgba(241, 245, 24, 1)",
},
},
jubeat: {
fill: {
MISS: "rgba(211, 38, 38, 0.2)",
POOR: "rgba(165, 38, 211, 0.2)",
GOOD: "rgba(39, 190, 117,0.2)",
GREAT: "rgba(38, 211, 78, 0.2)",
PERFECT: "rgba(241, 245, 24, 0.2)",
},
outline: {
MISS: "rgba(211, 38, 38, 1)",
POOR: "rgba(165, 38, 211, 1)",
GOOD: "rgba(39, 190, 117, 1)",
GREAT: "rgba(38, 211, 78, 1)",
PERFECT: "rgba(241, 245, 24, 1)",
},
},
chunithm: {
outline: {
MISS: COLOUR_SET.gray,
ATTACK: COLOUR_SET.green,
JUSTICE: COLOUR_SET.orange,
JCRIT: COLOUR_SET.gold,
},
fill: {
MISS: ChangeAlpha(COLOUR_SET.gray, "1"),
ATTACK: ChangeAlpha(COLOUR_SET.green, "1"),
JUSTICE: ChangeAlpha(COLOUR_SET.orange, "1"),
JCRIT: ChangeAlpha(COLOUR_SET.gold, "1"),
},
},
gitadora: {
outline: {
MISS: COLOUR_SET.red,
OK: COLOUR_SET.purple,
GOOD: COLOUR_SET.blue,
GREAT: COLOUR_SET.green,
PERFECT: COLOUR_SET.gold,
},
fill: {
MISS: ChangeAlpha(COLOUR_SET.red, "1"),
OK: ChangeAlpha(COLOUR_SET.purple, "1"),
GOOD: ChangeAlpha(COLOUR_SET.blue, "1"),
GREAT: ChangeAlpha(COLOUR_SET.green, "1"),
PERFECT: ChangeAlpha(COLOUR_SET.gold, "1"),
},
},
};
const gameChartIndicators = {
iidx: ["cn", "bss", "hcn", "hbss"],
popn: ["holds"],
ddr: ["shocks", "freezes"],
museca: [],
maimai: [],
jubeat: ["holds"],
sdvx: [],
usc: [],
bms: [],
chunithm: [],
gitadora: [],
};
function GetGrade(game, percent) {
// THIS FOR LOOP IS ITERATING DOWNWARDS
// JUST INCASE YOU DON'T ACTUALLY READ IT PROPERLY
for (let i = grades[game].length; i >= 0; i--) {
let gradeName = grades[game][i];
let gradeBound = gradeBoundaries[game][i];
if (percent >= gradeBound) {
return gradeName;
}
}
// if we get all this way they've got a negative score
// idk what to write in this case so ur gonna get null and throw an error in my logs
return null;
}
const ratingParameters = {
iidx: {
failHarshnessMultiplier: 0.3,
pivotPercent: 0.7777,
clearExpMultiplier: 1,
},
bms: {
failHarshnessMultiplier: 0.5,
pivotPercent: 0.7777,
clearExpMultiplier: 0.75,
},
museca: {
failHarshnessMultiplier: 1,
pivotPercent: 0.8,
clearExpMultiplier: 1, // no real reason
},
popn: {
failHarshnessMultiplier: 1,
pivotPercent: 0.8,
clearExpMultiplier: 0.4, // no real reason
},
maimai: {
failHarshnessMultiplier: 1,
pivotPercent: 0.8,
clearExpMultiplier: 1,
},
jubeat: {
failHarshnessMultiplier: 0.9,
pivotPercent: 0.7,
clearExpMultiplier: 1,
},
sdvx: {
failHarshnessMultiplier: 1,
pivotPercent: 0.92,
clearExpMultiplier: 1.45, // testing
},
usc: {
failHarshnessMultiplier: 1,
pivotPercent: 0.92,
clearExpMultiplier: 1.45, // testing
},
ddr: {
failHarshnessMultiplier: 0.9,
pivotPercent: 0.9,
clearExpMultiplier: 1,
},
chunithm: {
failHarshnessMultiplier: 1,
pivotPercent: 0.975,
clearExpMultiplier: 1.1,
},
gitadora: {
// GENERIC PARAMS. THIS IS **NOT** THE USED CALC.
failHarshnessMultiplier: 1,
pivotPercent: 0.8,
clearExpMultiplier: 1.1,
},
};
function ChangeAlpha(string, alpha) {
let spl = string.split(",");
spl[spl.length - 1] = `${alpha})`;
return spl.join(",");
}
function DirectScoreGradeDelta(game, score, percent, chart, delta) {
let grade = GetGrade(game, percent);
if (!grade) {
throw new Error(`Invalid grade created from ${game}, ${percent}`);
}
let scoreObj = {
scoreData: {
score,
grade,
},
};
return ScoreGradeDelta(game, scoreObj, chart, delta);
}
const supportsESD = {
iidx: true,
museca: false,
bms: false,
chunithm: false,
ddr: false,
gitadora: false,
jubeat: false,
maimai: false,
popn: false,
sdvx: false,
usc: false,
};
function ScoreGradeDelta(game, score, chart, delta) {
let nextGrade = grades[game][grades[game].indexOf(score.scoreData.grade) + delta];
if (nextGrade) {
let nextGradePercent = gradeBoundaries[game][grades[game].indexOf(nextGrade)];
let nGScore = CalculateScore(game, nextGradePercent, chart);
if (nGScore) {
let delta = score.scoreData.score - nGScore;
let formattedString = `(${nextGrade})`;
if (Number.isInteger(delta)) {
formattedString += delta >= 0 ? `+${delta}` : `${delta}`;
}
else {
formattedString += delta >= 0 ? `+${delta.toFixed(2)}` : `${delta.toFixed(2)}`;
}
return {
grade: nextGrade,
delta: delta,
formattedString: formattedString,
};
}
else {
return null;
}
}
else {
return null;
}
}
function AbsoluteScoreGradeDelta(game, score, percent, absDelta) {
let grade = grades[game][absDelta];
if (grade) {
let chart = null;
if (game === "iidx" || game === "bms") {
let reversedNC = Math.floor((score / percent) * 100) / 2;
chart = {
notedata: {
notecount: reversedNC,
},
};
}
let sc = CalculateScore(game, gradeBoundaries[game][absDelta], chart);
if (sc) {
let delta = score - sc;
let formattedString = `(${grade})`;
formattedString += delta >= 0 ? `+${delta}` : `${delta}`;
return {
grade: grade,
delta: delta,
formattedString: formattedString,
};
}
else {
return null;
}
}
else {
return null;
}
}
function CalculateScore(game, percent, chart) {
let score = percent;
if (game === "iidx" || game === "bms") {
score = chart.notedata.notecount * 2 * (percent / 100);
}
else if (game === "ddr") {
score = 1000000 * (percent / 100);
}
else if (game === "museca" || game === "jubeat") {
score = 1000000 * (percent / 100);
}
else if (game === "popn") {
score = 100000 * (percent / 100);
}
else if (game === "sdvx" || game === "usc") {
score = 10000000 * (percent / 100);
}
else if (game === "chunithm") {
score = 1000000 * (percent / 100);
}
if (score) {
return score;
}
return null;
}
function PercentToScore(percent, game, chartData) {
let eScore = 0;
if (game === "iidx" || game === "bms") {
eScore = percent * chartData.notedata.notecount * 2;
}
else if (game === "museca" || game === "jubeat") {
eScore = percent * 1000000;
}
else if (game === "popn") {
eScore = percent * 100000;
}
else if (game === "sdvx" || game === "usc") {
eScore = percent * 10000000;
}
else if (game === "ddr") {
// todo
}
else if (game === "chunithm") {
eScore = percent * 1000000;
}
else if (game === "gitadora") {
eScore = percent;
}
return eScore;
}
function FormatDifficulty(chart, game) {
if (validPlaytypes[game].length > 1) {
return `${chart.playtype} ${chart.difficulty} ${chart.level}`;
}
return `${chart.difficulty}`;
}
const gamePercentMax = {
iidx: 100,
ddr: 100,
gitadora: 100,
popn: 100,
sdvx: 100,
museca: 100,
jubeat: 100,
bms: 100,
chunithm: 101,
maimai: 150,
maimaidx: 150,
usc: 100,
};
exports.default = {
supportedGames,
gameOrders,
internalServiceGames,
versionHuman,
grades,
lamps,
lampColours,
gradeColours,
serviceSupportedGames,
defaultPlaytype,
gameChartIndicators,
GetGrade,
gradeBoundaries,
gameHuman,
ratingParameters,
validPlaytypes,
ScoreGradeDelta,
judgeColours,
gameColours,
validTierlistTiers,
clearLamp,
gameRelevantScoreBucket,
judgementWindows,
PercentToScore,
ChangeAlpha,
validDifficulties,
validHitData,
validHitMeta,
boundaryHCF,
gameSpecificCalc,
expChartScale,
FormatDifficulty,
DirectScoreGradeDelta,
gameSpecificCalcDescriptions,
defaultDifficulty,
gamePercentMax,
AbsoluteScoreGradeDelta,
validScoreMeta,
clearGrade,
defaultTable,
folderTables,
supportsESD,
humaniseGame,
};
//# sourceMappingURL=config.js.map