diff --git a/server/src/lib/score-import/framework/calculated-data/calculated-data.ts b/server/src/lib/score-import/framework/calculated-data/calculated-data.ts index 8bc2e0340..a169eacbc 100644 --- a/server/src/lib/score-import/framework/calculated-data/calculated-data.ts +++ b/server/src/lib/score-import/framework/calculated-data/calculated-data.ts @@ -15,7 +15,7 @@ import { CalculateBPI, CalculateCHUNITHMRating, CalculateGITADORASkill, - CalculateKTLampRating, + CalculateKTLampRatingIIDX, CalculateKTRating, CalculateMFCP, CalculateVF6, @@ -136,7 +136,7 @@ async function CalculateDataIIDXSP( BPIData.kavg, BPIData.wr, dryScore.scoreData.score, - (chart as ChartDocument<"iidx:DP" | "iidx:SP">).data.notecount * 2, + (chart as ChartDocument<"iidx:SP">).data.notecount * 2, BPIData.coef ); @@ -147,8 +147,8 @@ async function CalculateDataIIDXSP( return { BPI: bpi, - ktRating: await CalculateKTRating(dryScore, "iidx", "SP", chart, logger), - ktLampRating: await CalculateKTLampRating(dryScore, "iidx", "SP", chart), + ktRating: CalculateKTRating(dryScore, "iidx", "SP", chart, logger), + ktLampRating: CalculateKTLampRatingIIDX(dryScore, "SP", chart as ChartDocument<"iidx:SP">), }; } @@ -168,7 +168,7 @@ async function CalculateDataIIDXDP( BPIData.kavg, BPIData.wr, dryScore.scoreData.score, - (chart as ChartDocument<"iidx:DP" | "iidx:SP">).data.notecount * 2, + (chart as ChartDocument<"iidx:DP">).data.notecount * 2, BPIData.coef ); @@ -179,8 +179,8 @@ async function CalculateDataIIDXDP( return { BPI: bpi, - ktRating: await CalculateKTRating(dryScore, "iidx", "DP", chart, logger), - ktLampRating: await CalculateKTLampRating(dryScore, "iidx", "DP", chart), + ktRating: CalculateKTRating(dryScore, "iidx", "DP", chart, logger), + ktLampRating: CalculateKTLampRatingIIDX(dryScore, "DP", chart as ChartDocument<"iidx:DP">), }; } diff --git a/server/src/lib/score-import/framework/calculated-data/stats.test.ts b/server/src/lib/score-import/framework/calculated-data/stats.test.ts index 6121ae303..8d157ad0f 100644 --- a/server/src/lib/score-import/framework/calculated-data/stats.test.ts +++ b/server/src/lib/score-import/framework/calculated-data/stats.test.ts @@ -9,6 +9,7 @@ import { CalculateBPI, CalculateCHUNITHMRating, CalculateGITADORASkill, + CalculateKTLampRatingIIDX, CalculateKTRating, CalculateMFCP, CalculateVF6, @@ -110,6 +111,98 @@ t.test("#CalculateBPI", (t) => { t.end(); }); +t.test("#CalculateKTLampRatingIIDx", (t) => { + function c( + nc: number | null, + hc: number | null, + exhc: number | null + ): ChartDocument<"iidx:SP"> { + return Object.assign({}, Testing511SPA, { + tierlistInfo: { + "kt-EXHC": { + value: exhc, + }, + "kt-HC": { + value: hc, + }, + "kt-NC": { + value: nc, + }, + }, + }); + } + + function s(lamp: Lamps["iidx:SP" | "iidx:DP"]): DryScore<"iidx:SP" | "iidx:DP"> { + return Object.assign({}, TestingIIDXSPDryScore, { + scoreData: { + lamp, + }, + }); + } + + t.equal( + CalculateKTLampRatingIIDX(s("CLEAR"), "SP", c(10.5, 10.6, 10.7)), + 10.5, + "Should return NC if the score was NC." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("HARD CLEAR"), "SP", c(10.5, 10.6, 10.7)), + 10.6, + "Should return HC if the score was HC." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("EX HARD CLEAR"), "SP", c(10.5, 10.6, 10.7)), + 10.7, + "Should return EXHC if the score was EXHC." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("CLEAR"), "SP", c(null, 10.6, 10.7)), + 0, + "Should return 0 if the score was NC but no NC was available." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("HARD CLEAR"), "SP", c(null, null, 10.7)), + 0, + "Should return 0 if the score was HC but no HC or NC was available." + ); + + tequal( + CalculateKTLampRatingIIDX(s("HARD CLEAR"), "SP", c(10.5, null, 10.7)), + 10.5, + "Should return NC if the score was HC but no HC was available." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("HARD CLEAR"), "SP", c(10.9, 10.5, 10.7)), + 10.9, + "Should return NC if the score was HC but NC was worth more." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("EX HARD CLEAR"), "SP", c(10.9, 10.5, 10.7)), + 10.9, + "Should return NC if the score was EXHC but NC was worth more." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("EX HARD CLEAR"), "SP", c(10.4, 10.9, 10.7)), + 10.9, + "Should return HC if the score was EXHC but HC was worth more." + ); + + t.equal( + CalculateKTLampRatingIIDX(s("CLEAR"), "SP", c(null, null, null)), + 10, + "Should return chart level if the chart has no tierlist data." + ); + + t.end(); +}); + t.test("#CalculateGITADORARating", (t) => { function TestGitadoraRating(percent: number, levelNum: number) { return CalculateGITADORASkill( diff --git a/server/src/lib/score-import/framework/calculated-data/stats.ts b/server/src/lib/score-import/framework/calculated-data/stats.ts index 67714211a..8f6c9e621 100644 --- a/server/src/lib/score-import/framework/calculated-data/stats.ts +++ b/server/src/lib/score-import/framework/calculated-data/stats.ts @@ -4,6 +4,7 @@ import { Game, GetGamePTConfig, Grades, + IIDX_LAMPS, integer, Lamps, Playtypes, @@ -317,13 +318,34 @@ export function CalculateKTRating( return KTRatingCalcV1(dryScore.scoreData.percent, levelNum, parameters, logger); } -export function CalculateKTLampRating( +export function CalculateKTLampRatingIIDX( dryScore: DryScore, - game: Game, playtype: Playtypes[Game], - chart: ChartDocument + chart: ChartDocument<"iidx:SP" | "iidx:DP"> ) { - return LampRatingNoTierlistInfo(dryScore, game, playtype, chart); + const ncValue = chart.tierlistInfo["kt-NC"]?.value ?? 0; + const hcValue = Math.max(chart.tierlistInfo["kt-HC"]?.value ?? 0, ncValue); + const exhcValue = Math.max(chart.tierlistInfo["kt-EXHC"]?.value ?? 0, hcValue); + + if (!exhcValue && !hcValue && !ncValue) { + return LampRatingNoTierlistInfo(dryScore, "iidx", playtype, chart); + } + + const lamp = dryScore.scoreData.lamp; + + const gptConfig = GetGamePTConfig("iidx", playtype); + + const lampIndex = gptConfig.lamps.indexOf(lamp); + + if (exhcValue && lampIndex >= IIDX_LAMPS.EX_HARD_CLEAR) { + return exhcValue; + } else if (hcValue && lampIndex >= IIDX_LAMPS.HARD_CLEAR) { + return hcValue; + } else if (ncValue && lampIndex >= IIDX_LAMPS.CLEAR) { + return ncValue; + } + + return 0; } function LampRatingNoTierlistInfo(