checkpoint: insanity ascends (35)

127 errors to go
This commit is contained in:
zkldi
2023-01-19 16:39:42 +00:00
parent 2b0e65f0c8
commit 5cbb2d5f8a
131 changed files with 2106 additions and 1886 deletions
+414
View File
@@ -0,0 +1,414 @@
import { NumericSOV } from "util/sorts";
import { COLOUR_SET, GPTString, GetGPTString, PBScoreDocument, ScoreDocument } from "tachi-common";
import { GITADORA_DORA_IMPL, GITADORA_GITA_IMPL } from "./games/gitadora";
import { SDVX_IMPL, USC_IMPL } from "./games/sdvx-usc";
import { GPTClientImplementation } from "./types";
import { IIDX_DP_IMPL, IIDX_SP_IMPL } from "./games/iidx";
import { BMS_PMS_IMPL } from "./games/bms-pms";
import { bg, bgc } from "./games/_util";
type GPTClientImplementations = {
[GPT in GPTString]: GPTClientImplementation<GPT>;
};
export const GPT_CLIENT_IMPLEMENTATIONS: GPTClientImplementations = {
"iidx:SP": IIDX_SP_IMPL,
"iidx:DP": IIDX_DP_IMPL,
"chunithm:Single": {
classColours: {
colour: {
BLUE: "info",
GREEN: bg("green"),
ORANGE: bg("orange"),
RED: "danger",
PURPLE: bg("purple"),
COPPER: bg("bronze"),
SILVER: "secondary",
GOLD: "warning",
PLATINUM: bgc("silver", "black"),
RAINBOW: "success",
},
},
enumColours: {
grade: {
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,
},
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.paleGreen,
"FULL COMBO": COLOUR_SET.paleBlue,
"ALL JUSTICE": COLOUR_SET.gold,
"ALL JUSTICE CRITICAL": COLOUR_SET.white,
},
},
difficultyColours: {
BASIC: COLOUR_SET.blue,
ADVANCED: COLOUR_SET.orange,
EXPERT: COLOUR_SET.red,
MASTER: COLOUR_SET.purple,
},
ratingSystems: [],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x.scoreData.score)],
["Judgements", "Hits", NumericSOV((x) => x.scoreData.score)],
["Lamp", "Lamp", NumericSOV((x) => x.scoreData.enumIndexes.lamp)],
],
},
"jubeat:Single": {
enumColours: {
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.blue,
"FULL COMBO": COLOUR_SET.teal,
EXCELLENT: COLOUR_SET.white,
},
grade: {
E: COLOUR_SET.gray,
D: COLOUR_SET.maroon,
C: COLOUR_SET.red,
B: COLOUR_SET.blue,
A: COLOUR_SET.green,
S: COLOUR_SET.gold,
SS: COLOUR_SET.orange,
SSS: COLOUR_SET.teal,
EXC: COLOUR_SET.white,
},
},
classColours: {
colour: {
BLACK: bg("secondary"),
YELLOW_GREEN: bgc("yellowgreen", "black"),
GREEN: bg("green"),
LIGHT_BLUE: bgc("cyan", "black"),
BLUE: bg("info"),
VIOLET: bg("violet"),
PURPLE: bg("purple"),
PINK: bgc("pink", "black"),
ORANGE: bg("orange"),
GOLD: bg("warning"),
},
},
difficultyColours: {
BSC: COLOUR_SET.green,
ADV: COLOUR_SET.gold,
EXT: COLOUR_SET.red,
"HARD BSC": COLOUR_SET.darkGreen,
"HARD ADV": COLOUR_SET.orange,
"HARD EXT": COLOUR_SET.vibrantRed,
},
ratingSystems: [],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x?.scoreData.score ?? -Infinity)],
["Judgements", "Hits", NumericSOV((x) => x?.scoreData.score ?? -Infinity)],
["Lamp", "Lamp", NumericSOV((x) => x?.scoreData.enumIndexes.lamp ?? -Infinity)],
],
},
"maimaidx:Single": {
enumColours: {
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"FULL COMBO": COLOUR_SET.blue,
"FULL COMBO+": COLOUR_SET.paleBlue,
"ALL PERFECT": COLOUR_SET.gold,
"ALL PERFECT+": COLOUR_SET.teal,
},
grade: {
D: COLOUR_SET.gray,
C: COLOUR_SET.red,
B: COLOUR_SET.maroon,
BB: COLOUR_SET.purple,
BBB: 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,
},
},
classColours: {
dan: {
DAN_1: bg("warning"),
DAN_2: bg("warning"),
DAN_3: bg("warning"),
DAN_4: bg("warning"),
DAN_5: bg("warning"),
DAN_6: bg("warning"),
DAN_7: bg("warning"),
DAN_8: bg("warning"),
DAN_9: bg("warning"),
DAN_10: bg("warning"),
SHINDAN_1: bg("purple"),
SHINDAN_2: bg("purple"),
SHINDAN_3: bg("purple"),
SHINDAN_4: bg("purple"),
SHINDAN_5: bg("purple"),
SHINDAN_6: bg("purple"),
SHINDAN_7: bg("purple"),
SHINDAN_8: bg("purple"),
SHINDAN_9: bg("purple"),
SHINDAN_10: bg("purple"),
SHINKAIDEN: bg("purple"),
},
colour: {
WHITE: bgc("white", "black"),
BLUE: bgc("cyan", "black"),
GREEN: bg("green"),
YELLOW: bgc("yellow", "black"),
RED: bg("red"),
PURPLE: bg("purple"),
BRONZE: bg("brown"),
SILVER: bg("gray"),
GOLD: bg("warning"),
PLATINUM: bgc("lightgoldenrodyellow", "black"),
RAINBOW: {
background:
"linear-gradient(-45deg, #f0788a, #f48fb1, #9174c2, #79bcf2, #70a173, #f7ff99, #faca7d, #ff9d80, #f0788a)",
},
},
},
difficultyColours: {
Basic: COLOUR_SET.green,
Advanced: COLOUR_SET.orange,
Expert: COLOUR_SET.red,
Master: COLOUR_SET.purple,
"Re:Master": COLOUR_SET.white,
"DX Basic": COLOUR_SET.green,
"DX Advanced": COLOUR_SET.orange,
"DX Expert": COLOUR_SET.red,
"DX Master": COLOUR_SET.purple,
"DX Re:Master": COLOUR_SET.white,
},
ratingSystems: [],
scoreHeaders: [
["Percent", "%", NumericSOV((x) => x?.scoreData.percent)],
["Judgements", "Hits", NumericSOV((x) => x?.scoreData.percent)],
["Lamp", "Lamp", NumericSOV((x) => x?.scoreData.enumIndexes.lamp)],
],
},
"museca:Single": {
enumColours: {
grade: {
没: 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,
},
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"CONNECT ALL": COLOUR_SET.teal,
"PERFECT CONNECT ALL": COLOUR_SET.gold,
},
},
classColours: {},
difficultyColours: {
Green: COLOUR_SET.green,
Yellow: COLOUR_SET.vibrantYellow,
Red: COLOUR_SET.red,
},
ratingSystems: [],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x?.scoreData.score)],
["Near - Miss", "Nr. Ms.", NumericSOV((x) => x?.scoreData.score)],
["Lamp", "Lamp", NumericSOV((x) => x?.scoreData.enumIndexes.lamp)],
],
},
"popn:9B": {
enumColours: {
grade: {
E: COLOUR_SET.gray,
D: COLOUR_SET.maroon,
C: COLOUR_SET.red,
B: COLOUR_SET.blue,
A: COLOUR_SET.green,
AA: COLOUR_SET.orange,
AAA: COLOUR_SET.gold,
S: COLOUR_SET.teal,
},
lamp: {
FAILED: COLOUR_SET.red,
"EASY CLEAR": COLOUR_SET.green,
CLEAR: COLOUR_SET.blue,
"FULL COMBO": COLOUR_SET.teal,
PERFECT: COLOUR_SET.gold,
},
clearMedal: {
failedCircle: COLOUR_SET.red,
failedDiamond: COLOUR_SET.red,
failedStar: COLOUR_SET.red,
easyClear: COLOUR_SET.green,
clearCircle: COLOUR_SET.blue,
clearDiamond: COLOUR_SET.blue,
clearStar: COLOUR_SET.blue,
fullComboCircle: COLOUR_SET.teal,
fullComboDiamond: COLOUR_SET.teal,
fullComboStar: COLOUR_SET.teal,
perfect: COLOUR_SET.gold,
},
},
classColours: {
class: {
KITTY: bg("brown"),
STUDENT: bg("green"),
DELINQUENT: bgc("lime", "black"),
DETECTIVE: bg("purple"),
IDOL: "danger",
GENERAL: bg("darkgoldenrod"),
HERMIT: "success",
GOD: "warning",
},
},
difficultyColours: {
Easy: COLOUR_SET.blue,
Normal: COLOUR_SET.green,
Hyper: COLOUR_SET.orange,
EX: COLOUR_SET.red,
},
ratingSystems: [],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x.scoreData.score)],
["Judgements", "Hits", NumericSOV((x) => x.scoreData.score)],
["Lamp", "Lamp", NumericSOV((x) => x.scoreData.enumIndexes.clearMedal)],
],
},
"wacca:Single": {
enumColours: {
grade: {
D: COLOUR_SET.gray,
C: COLOUR_SET.maroon,
B: COLOUR_SET.red,
A: COLOUR_SET.paleGreen,
AA: COLOUR_SET.green,
AAA: COLOUR_SET.vibrantGreen,
S: COLOUR_SET.gold,
"S+": COLOUR_SET.vibrantYellow,
SS: COLOUR_SET.paleOrange,
"SS+": COLOUR_SET.orange,
SSS: COLOUR_SET.pink,
"SSS+": COLOUR_SET.vibrantPink,
MASTER: COLOUR_SET.white,
},
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.blue,
MISSLESS: COLOUR_SET.orange,
"FULL COMBO": COLOUR_SET.pink,
"ALL MARVELOUS": COLOUR_SET.gold,
},
},
classColours: {
colour: {
ASH: "secondary",
NAVY: bg("darkblue"),
YELLOW: bg("orange"),
RED: "danger",
PURPLE: bg("purple"),
BLUE: "info",
SILVER: bgc("silver", "black"),
GOLD: "warning",
RAINBOW: "success",
},
stageUp: {
I: null,
II: null,
III: null,
IV: null,
V: null,
VI: null,
VII: null,
VIII: null,
IX: null,
X: null,
XI: null,
XII: null,
XIII: null,
XIV: null,
},
},
difficultyColours: {
NORMAL: COLOUR_SET.blue,
HARD: COLOUR_SET.gold,
EXPERT: COLOUR_SET.pink,
INFERNO: COLOUR_SET.purple,
},
ratingSystems: [],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x.scoreData.score)],
["Judgements", "Hits", NumericSOV((x) => x.scoreData.score)],
["Lamp", "Lamp", NumericSOV((x) => x.scoreData.enumIndexes.lamp)],
],
},
"itg:Stamina": {
enumColours: {
grade: {
F: COLOUR_SET.gray,
D: COLOUR_SET.red,
C: COLOUR_SET.maroon,
B: COLOUR_SET.purple,
A: COLOUR_SET.green,
S: COLOUR_SET.orange,
"★": COLOUR_SET.pink,
"★★": COLOUR_SET.vibrantPink,
"★★★": COLOUR_SET.teal,
"★★★★": COLOUR_SET.white,
},
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.blue,
"FULL COMBO": COLOUR_SET.pink,
"FULL EXCELLENT COMBO": COLOUR_SET.gold,
QUAD: COLOUR_SET.white,
},
},
difficultyColours: {
// this game has dynamic difficulties. Formatting is handled elsewhere.
},
classColours: {},
ratingSystems: [],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x.scoreData.finalPercent)],
["Judgements", "Hits", NumericSOV((x) => x.scoreData.scorePercent)],
["Lamp", "Lamp", NumericSOV((x) => x.scoreData.enumIndexes.lamp)],
],
},
"gitadora:Dora": GITADORA_DORA_IMPL,
"gitadora:Gita": GITADORA_GITA_IMPL,
"bms:14K": BMS_PMS_IMPL,
"bms:7K": BMS_PMS_IMPL,
"pms:Controller": BMS_PMS_IMPL,
"pms:Keyboard": BMS_PMS_IMPL,
"sdvx:Single": SDVX_IMPL,
"usc:Controller": USC_IMPL,
"usc:Keyboard": USC_IMPL,
};
export function GetEnumColour(score: ScoreDocument | PBScoreDocument, enumName: string) {
const gptImpl = GPT_CLIENT_IMPLEMENTATIONS[GetGPTString(score.game, score.playtype)];
// @ts-expect-error lol
return gptImpl.enumColours[enumName][score.scoreData[enumName]];
}
+27
View File
@@ -0,0 +1,27 @@
import { GPTRatingSystem } from "lib/types";
import { CSSProperties } from "react";
import { GPTString } from "tachi-common";
export function CreateRatingSys<GPT extends GPTString>(
name: string,
description: string,
toNumber: GPTRatingSystem<GPT>["toNumber"],
toString: GPTRatingSystem<GPT>["toString"],
idvDifference: GPTRatingSystem<GPT>["idvDifference"] = () => false
): GPTRatingSystem<GPT> {
return {
description,
name,
toNumber,
toString,
idvDifference,
};
}
export function bg(bgColour: string): CSSProperties {
return { backgroundColor: bgColour };
}
export function bgc(bgColour: string, colour: string): CSSProperties {
return { backgroundColor: bgColour, color: colour };
}
+58
View File
@@ -0,0 +1,58 @@
import { IsNullish } from "util/misc";
import { NumericSOV } from "util/sorts";
import { GPTClientImplementation } from "lib/types";
import { COLOUR_SET, GPTStrings } from "tachi-common";
import { FormatSieglindeBMS } from "tachi-common/config/game-support/bms";
import { CreateRatingSys } from "./_util";
const BMS_PMS_IMPL: GPTClientImplementation<GPTStrings["bms" | "pms"]> = {
difficultyColours: {
CHART: COLOUR_SET.gray, // lol
},
enumColours: {
grade: {
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,
},
lamp: {
"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,
},
},
classColours: {},
ratingSystems: [
CreateRatingSys(
"Sieglinde EC",
"TODO lol",
(c) => c.data.sglEC,
(c) => (IsNullish(c.data.sglEC) ? null : FormatSieglindeBMS(c.data.sglEC!))
),
CreateRatingSys(
"Sieglinde HC",
"TODO lol",
(c) => c.data.sglHC,
(c) => (IsNullish(c.data.sglHC) ? null : FormatSieglindeBMS(c.data.sglHC!))
),
],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x.scoreData.percent)],
["Deltas", "Deltas", NumericSOV((x) => x.scoreData.percent)],
["Lamp", "Lamp", NumericSOV((x) => x.scoreData.enumIndexes.lamp)],
],
};
export const;
+86
View File
@@ -0,0 +1,86 @@
import { NumericSOV } from "util/sorts";
import { GPTClientImplementation } from "lib/types";
import { COLOUR_SET, GPTString, GPTStrings } from "tachi-common";
import { bg, bgc } from "./_util";
const GITADORA_ENUM_COLOURS: GPTClientImplementation<
"gitadora:Dora" | "gitadora:Gita"
>["enumColours"] = {
grade: {
C: COLOUR_SET.purple,
B: COLOUR_SET.blue,
A: COLOUR_SET.green,
S: COLOUR_SET.orange,
SS: COLOUR_SET.gold,
MAX: COLOUR_SET.white,
},
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.blue,
"FULL COMBO": COLOUR_SET.teal,
EXCELLENT: COLOUR_SET.gold,
},
};
const GITADORA_HEADERS: GPTClientImplementation<"gitadora:Dora" | "gitadora:Gita">["scoreHeaders"] =
[
["Percent", "Percent", NumericSOV((x) => x.scoreData.percent)],
["Judgements", "Hits", NumericSOV((x) => x.scoreData.percent)],
["Lamp", "Lamp", NumericSOV((x) => x.scoreData.enumIndexes.lamp)],
];
const GITADORA_COLOURS: GPTClientImplementation<GPTStrings["gitadora"]>["classColours"] = {
colour: {
WHITE: bgc("white", "black"),
ORANGE: bg("orange"),
ORANGE_GRD: bg("orange"),
YELLOW: "warning",
YELLOW_GRD: "warning",
GREEN: bg("green"),
GREEN_GRD: bg("green"),
BLUE: "info",
BLUE_GRD: "info",
PURPLE: bg("purple"),
PURPLE_GRD: bg("purple"),
RED: "danger",
RED_GRD: "danger",
BRONZE: bg("bronze"),
SILVER: bgc("silver", "black"),
GOLD: bg("gold"),
RAINBOW: {
background:
"linear-gradient(-45deg, #f0788a, #f48fb1, #9174c2, #79bcf2, #70a173, #f7ff99, #faca7d, #ff9d80, #f0788a)",
},
},
};
export const GITADORA_GITA_IMPL: GPTClientImplementation<"gitadora:Gita"> = {
enumColours: GITADORA_ENUM_COLOURS,
difficultyColours: {
BASIC: COLOUR_SET.blue,
ADVANCED: COLOUR_SET.orange,
EXTREME: COLOUR_SET.red,
MASTER: COLOUR_SET.purple,
"BASS BASIC": COLOUR_SET.vibrantBlue,
"BASS ADVANCED": COLOUR_SET.vibrantOrange,
"BASS EXTREME": COLOUR_SET.vibrantRed,
"BASS MASTER": COLOUR_SET.vibrantPurple,
},
ratingSystems: [],
scoreHeaders: GITADORA_HEADERS,
classColours: GITADORA_COLOURS,
};
export const GITADORA_DORA_IMPL: GPTClientImplementation<"gitadora:Dora"> = {
enumColours: GITADORA_ENUM_COLOURS,
difficultyColours: {
BASIC: COLOUR_SET.blue,
ADVANCED: COLOUR_SET.orange,
EXTREME: COLOUR_SET.red,
MASTER: COLOUR_SET.purple,
},
ratingSystems: [],
scoreHeaders: GITADORA_HEADERS,
classColours: GITADORA_COLOURS,
};
+123
View File
@@ -0,0 +1,123 @@
import { NumericSOV } from "util/sorts";
import { GPTClientImplementation } from "lib/types";
import { COLOUR_SET, GPTStrings } from "tachi-common";
import { CreateRatingSys, bg, bgc } from "./_util";
const IIDX_ENUM_COLOURS: GPTClientImplementation<GPTStrings["iidx"]>["enumColours"] = {
grade: {
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,
},
lamp: {
"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,
},
};
const IIDX_DIFF_COLOURS: GPTClientImplementation<GPTStrings["iidx"]>["difficultyColours"] = {
NORMAL: COLOUR_SET.blue,
HYPER: COLOUR_SET.orange,
ANOTHER: COLOUR_SET.red,
LEGGENDARIA: COLOUR_SET.purple,
"All Scratch NORMAL": COLOUR_SET.blue,
"All Scratch HYPER": COLOUR_SET.orange,
"All Scratch ANOTHER": COLOUR_SET.red,
"All Scratch LEGGENDARIA": COLOUR_SET.purple,
"Kichiku NORMAL": COLOUR_SET.blue,
"Kichiku HYPER": COLOUR_SET.orange,
"Kichiku ANOTHER": COLOUR_SET.red,
"Kichiku LEGGENDARIA": COLOUR_SET.purple,
"Kiraku NORMAL": COLOUR_SET.blue,
"Kiraku HYPER": COLOUR_SET.orange,
"Kiraku ANOTHER": COLOUR_SET.red,
"Kiraku LEGGENDARIA": COLOUR_SET.purple,
};
const IIDX_HEADERS: GPTClientImplementation<"iidx:SP" | "iidx:DP">["scoreHeaders"] = [
["Score", "Score", NumericSOV((x) => x.scoreData.percent)],
["Deltas", "Deltas", NumericSOV((x) => x.scoreData.percent)],
["Lamp", "Lamp", NumericSOV((x) => x.scoreData.enumIndexes.lamp)],
];
const IIDX_COLOURS: GPTClientImplementation<"iidx:SP" | "iidx:DP">["classColours"] = {
dan: {
KYU_7: bg("green"),
KYU_6: bg("green"),
KYU_5: bg("green"),
KYU_4: bg("green"),
KYU_3: bg("green"),
KYU_2: bg("green"),
KYU_1: bg("green"),
DAN_1: "info",
DAN_2: "info",
DAN_3: "info",
DAN_4: "info",
DAN_5: "info",
DAN_6: "info",
DAN_7: "info",
DAN_8: "info",
DAN_9: "danger",
DAN_10: "danger",
CHUUDEN: bgc("silver", "black"),
KAIDEN: "warning",
},
};
export const IIDX_SP_IMPL: GPTClientImplementation<"iidx:SP"> = {
difficultyColours: IIDX_DIFF_COLOURS,
enumColours: IIDX_ENUM_COLOURS,
ratingSystems: [
CreateRatingSys(
"NC Tier",
"Tierlist Ratings for Normal Clears.",
(c) => c.data.ncTier?.value,
(c) => c.data.ncTier?.text,
(c) => c.data.ncTier?.individualDifference
),
CreateRatingSys(
"HC Tier",
"Tierlist Ratings for Hard Clears.",
(c) => c.data.hcTier?.value,
(c) => c.data.hcTier?.text,
(c) => c.data.hcTier?.individualDifference
),
CreateRatingSys(
"EXHC Tier",
"Tierlist Ratings for EX-HARD Clears.",
(c) => c.data.exhcTier?.value,
(c) => c.data.exhcTier?.text,
(c) => c.data.exhcTier?.individualDifference
),
],
scoreHeaders: IIDX_HEADERS,
classColours: IIDX_COLOURS,
};
export const IIDX_DP_IMPL: GPTClientImplementation<"iidx:DP"> = {
difficultyColours: IIDX_DIFF_COLOURS,
enumColours: IIDX_ENUM_COLOURS,
ratingSystems: [
CreateRatingSys(
"DP Tier",
"The unofficial DP tiers, taken from https://zasa.sakura.ne.jp/dp/run.php.",
(c) => c.data.dpTier?.value,
(c) => c.data.dpTier?.text
),
],
scoreHeaders: IIDX_HEADERS,
classColours: IIDX_COLOURS,
};
+71
View File
@@ -0,0 +1,71 @@
import { NumericSOV } from "util/sorts";
import { GPTClientImplementation } from "lib/types";
import { COLOUR_SET, GPTStrings } from "tachi-common";
import { CreateRatingSys } from "./_util";
const SDVXLIKE_ENUM_COLOURS: GPTClientImplementation<GPTStrings["usc" | "sdvx"]>["enumColours"] = {
grade: {
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.vibrantOrange,
S: COLOUR_SET.teal,
PUC: COLOUR_SET.pink,
},
lamp: {
FAILED: COLOUR_SET.red,
CLEAR: COLOUR_SET.green,
"EXCESSIVE CLEAR": COLOUR_SET.purple,
"ULTIMATE CHAIN": COLOUR_SET.teal,
"PERFECT ULTIMATE CHAIN": COLOUR_SET.gold,
},
};
export const SDVX_IMPL: GPTClientImplementation<"sdvx:Single"> = {
enumColours: SDVXLIKE_ENUM_COLOURS,
difficultyColours: {
NOV: COLOUR_SET.purple,
ADV: COLOUR_SET.vibrantYellow,
EXH: COLOUR_SET.red,
INF: COLOUR_SET.vibrantPink,
GRV: COLOUR_SET.orange,
HVN: COLOUR_SET.teal,
VVD: COLOUR_SET.pink,
XCD: COLOUR_SET.blue,
MXM: COLOUR_SET.white,
},
ratingSystems: [
CreateRatingSys(
"Tierlist",
"The unofficial SDVX clearing tierlist",
(c) => c.data.clearTier?.value,
(c) => c.data.clearTier?.text,
(c) => c.data.clearTier?.individualDifference
),
],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x?.scoreData.score)],
["Near - Miss", "Nr. Ms.", NumericSOV((x) => x?.scoreData.score)],
["Lamp", "Lamp", NumericSOV((x) => x?.scoreData.enumIndexes.lamp)],
],
};
export const USC_IMPL: GPTClientImplementation<GPTStrings["usc"]> = {
enumColours: SDVXLIKE_ENUM_COLOURS,
difficultyColours: {
NOV: COLOUR_SET.purple,
ADV: COLOUR_SET.vibrantYellow,
EXH: COLOUR_SET.red,
INF: COLOUR_SET.vibrantPink,
},
ratingSystems: [],
scoreHeaders: [
["Score", "Score", NumericSOV((x) => x?.scoreData.score)],
["Near - Miss", "Nr. Ms.", NumericSOV((x) => x?.scoreData.score)],
["Lamp", "Lamp", NumericSOV((x) => x?.scoreData.enumIndexes.lamp)],
],
};
+79
View File
@@ -0,0 +1,79 @@
import { Header } from "components/tables/components/TachiTable";
import { CSSProperties } from "react";
import {
ChartDocument,
ClassConfigs,
Classes,
ConfScoreMetrics,
Difficulties,
ExtractedClasses,
GPTString,
PBScoreDocument,
ScoreDocument,
} from "tachi-common";
import { ExtractEnumMetricNames, GetEnumValue } from "tachi-common/types/metrics";
export type GPTEnumColours<GPT extends GPTString> = {
// @ts-expect-error this is fine please do not worry
[M in ExtractEnumMetricNames<ConfScoreMetrics[GPT]>]: Record<GetEnumValue<GPT, M>, string>;
};
export type GPTDifficultyColours<GPT extends GPTString> = Record<Difficulties[GPT], string>;
/**
* Every GPT has to have some sort of "rating system" for charts defined.
* The UI uses this to handle things like sorting on the difficulty cell.
*/
export type GPTRatingSystem<GPT extends GPTString> = {
name: string;
description: string;
toNumber: (c: ChartDocument<GPT>) => number | null | undefined;
toString: (c: ChartDocument<GPT>) => string | null | undefined;
/**
* Does this rating system say this chart has strong individual differences
* between players?
*/
idvDifference: (c: ChartDocument<GPT>) => boolean | null | undefined;
};
export type GPTClassColours<GPT extends GPTString> = {
[C in keyof ClassConfigs[GPT]]: {
// @ts-expect-error it's kinda cool how TS lets me just uhh
// ignore, errors
// in the abhorrent stringly based typesystem i have created.
// Whatever! This works.
// string => bootstrap variant
// css properties => css
// null -> no styling
[V in ClassConfigs[GPT][C]["values"][number]["id"]]:
| "warning"
| "danger"
| "secondary"
| "primary"
| "info"
| "success"
| null
| CSSProperties;
};
};
export interface GPTClientImplementation<GPT extends GPTString = GPTString> {
enumColours: GPTEnumColours<GPT>;
difficultyColours: GPTDifficultyColours<GPT>;
classColours: GPTClassColours<GPT>;
/**
* Other than chart.level and chart.levelNum, what other rating systems exist
* for this game?
*
* You can use this to add things like tierlists (chart.data.ncTier, hcTier, etc.)
*/
ratingSystems: Array<GPTRatingSystem<GPT>>;
/**
* What headers should be used when rendering scores in a table for this game?
*/
scoreHeaders: Array<Header<ScoreDocument<GPT> | PBScoreDocument<GPT>>>;
}