mirror of
https://github.com/zkldi/Tachi.git
synced 2026-10-04 21:08:09 +03:00
checkpoint: insanity ascends (35)
127 errors to go
This commit is contained in:
@@ -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]];
|
||||
}
|
||||
@@ -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 };
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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)],
|
||||
],
|
||||
};
|
||||
@@ -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>>>;
|
||||
}
|
||||
Reference in New Issue
Block a user