From 331110e6cff7d15606e03908fd45ee6f1742e766 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sat, 21 Jun 2025 02:22:50 -0400 Subject: [PATCH] Use rank percentage for Sealed Star entry, not grade --- src/doomstat.h | 2 ++ src/g_game.c | 2 +- src/k_hud.cpp | 3 +++ src/k_rank.cpp | 50 ++++++++++++++++++++++++++++--------------------- src/k_rank.h | 1 + src/y_inter.cpp | 8 ++++---- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/doomstat.h b/src/doomstat.h index 97c58c441..748b0773e 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -198,6 +198,8 @@ typedef enum GRADE_S } gp_rank_e; +#define SEALED_STAR_ENTRY (370*FRACUNIT/400) + struct cupwindata_t { UINT8 best_placement; diff --git a/src/g_game.c b/src/g_game.c index cb6ea7697..4909e9bd2 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4381,7 +4381,7 @@ void G_GetNextMap(void) && grandprixinfo.gamespeed >= KARTSPEED_NORMAL) { // On A rank pace? Then you get a chance for S rank! - permitrank = (K_CalculateGPGrade(&grandprixinfo.rank) >= GRADE_A); + permitrank = (K_CalculateGPPercent(&grandprixinfo.rank) >= SEALED_STAR_ENTRY); // If you're on Master, a win floats you to rank-restricted levels for free. // (This is a different class of challenge!) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 1bf954bec..5ad7d4d43 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -7119,6 +7119,7 @@ static void K_DrawGPRankDebugger(void) } grade = K_CalculateGPGrade(&grandprixinfo.rank); + fixed_t percent = K_CalculateGPPercent(&grandprixinfo.rank); V_DrawThinString(0, 0, V_SNAPTOTOP|V_SNAPTOLEFT, va("POS: %d / %d", grandprixinfo.rank.position, RANK_NEUTRAL_POSITION)); @@ -7132,6 +7133,8 @@ static void K_DrawGPRankDebugger(void) va("RINGS: %d / %d", grandprixinfo.rank.rings, grandprixinfo.rank.totalRings)); V_DrawThinString(0, 60, V_SNAPTOTOP|V_SNAPTOLEFT, va("EMERALD: %s", (grandprixinfo.rank.specialWon == true) ? "YES" : "NO")); + V_DrawThinString(0, 70, V_SNAPTOTOP|V_SNAPTOLEFT, + va("PERCENT: %.2f", FixedToFloat(percent))); switch (grade) { diff --git a/src/k_rank.cpp b/src/k_rank.cpp index c2e222158..0f981f5ff 100644 --- a/src/k_rank.cpp +++ b/src/k_rank.cpp @@ -548,13 +548,10 @@ void K_UpdateGPRank(gpRank_t *rankData) rankData->Update(); } -/*-------------------------------------------------- - gp_rank_e K_CalculateGPGrade(gpRank_t *rankData) - - See header file for description. ---------------------------------------------------*/ gp_rank_e K_CalculateGPGrade(gpRank_t *rankData) { + INT32 retGrade = GRADE_E; + { extern consvar_t cv_debugrank; @@ -564,6 +561,8 @@ gp_rank_e K_CalculateGPGrade(gpRank_t *rankData) } } + fixed_t percent = K_CalculateGPPercent(rankData); + static const fixed_t gradePercents[GRADE_A] = { 7*FRACUNIT/20, // D: 35% or higher 10*FRACUNIT/20, // C: 50% or higher @@ -571,8 +570,31 @@ gp_rank_e K_CalculateGPGrade(gpRank_t *rankData) 17*FRACUNIT/20 // A: 85% or higher }; - INT32 retGrade = GRADE_E; + for (retGrade = GRADE_E; retGrade < GRADE_A; retGrade++) + { + if (percent < gradePercents[retGrade]) + { + break; + } + } + if (rankData->specialWon == true) + { + // Winning the Special Stage gives you + // a free grade increase. + retGrade++; + } + + return static_cast(retGrade); +} + +/*-------------------------------------------------- + gp_rank_e K_CalculateGPGrade(gpRank_t *rankData) + + See header file for description. +--------------------------------------------------*/ +fixed_t K_CalculateGPPercent(gpRank_t *rankData) +{ rankData->scorePosition = 0; rankData->scoreGPPoints = 0; rankData->scoreExp = 0; @@ -625,22 +647,8 @@ gp_rank_e K_CalculateGPGrade(gpRank_t *rankData) rankData->scoreContinues; const fixed_t percent = FixedDiv(rankData->scoreTotal, total); - for (retGrade = GRADE_E; retGrade < GRADE_A; retGrade++) - { - if (percent < gradePercents[retGrade]) - { - break; - } - } - if (rankData->specialWon == true) - { - // Winning the Special Stage gives you - // a free grade increase. - retGrade++; - } - - return static_cast(retGrade); + return percent; } /*-------------------------------------------------- diff --git a/src/k_rank.h b/src/k_rank.h index aa28727e3..943cb40c0 100644 --- a/src/k_rank.h +++ b/src/k_rank.h @@ -159,6 +159,7 @@ void K_UpdateGPRank(gpRank_t *rankData); --------------------------------------------------*/ gp_rank_e K_CalculateGPGrade(gpRank_t *rankData); +fixed_t K_CalculateGPPercent(gpRank_t *rankData); /*-------------------------------------------------- diff --git a/src/y_inter.cpp b/src/y_inter.cpp index 0f966e2e9..449324357 100644 --- a/src/y_inter.cpp +++ b/src/y_inter.cpp @@ -400,14 +400,14 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) if (roundqueue.position == roundqueue.size-1) { // On A rank pace? Then you get a chance for S rank! - gp_rank_e rankforline = K_CalculateGPGrade(&grandprixinfo.rank); + fixed_t rankforline = K_CalculateGPPercent(&grandprixinfo.rank); - data.showrank = (rankforline >= GRADE_A); + data.showrank = (rankforline >= SEALED_STAR_ENTRY); data.linemeter = - (std::min(rankforline, GRADE_A) + (std::min(rankforline, SEALED_STAR_ENTRY) * (2 * TICRATE) - ) / GRADE_A; + ) / SEALED_STAR_ENTRY; // G_NextMap will float you to rank-restricted stages on Master wins. // Fudge the rank display.