From 52bb3a21f66a8b7380ad6e1bb1cee1da13f7ef41 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 31 Aug 2025 23:52:07 -0400 Subject: [PATCH] Fix EXP crystal HUD --- src/k_hud.cpp | 22 ++++++++++++++++------ src/k_hud.h | 2 +- src/k_kart.c | 6 ++---- src/k_kart.h | 2 ++ src/k_podium.cpp | 4 ++-- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index f43f27f7e..c1aaf1642 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -3315,12 +3315,22 @@ static void K_drawKartEmeralds(void) } } -INT32 K_GetTransFlagFromFixed(fixed_t value) +INT32 K_GetTransFlagFromFixed(fixed_t value, boolean midrace) { - value = std::clamp(value, FRACUNIT/2, FRACUNIT*3/2); + fixed_t base = midrace ? GRADINGFACTORSOFTCAP : FRACUNIT; - // Calculate distance from 1.0 - fixed_t distance = abs(FRACUNIT - value); + value = std::clamp(value, base - FRACUNIT/2, base + FRACUNIT/2); + + // Calculate distance from "base"" + fixed_t distance = abs(base - value); + + if (midrace) + { + if (value > base) + distance = FixedMul(distance, GRADINGFACTORCAPSTRENGTH); + } + + distance = std::clamp(distance, 0, FRACUNIT/2); // Map the distance to 0-10 range (10 = closest to 1.0, 0 = farthest from 1.0) INT32 transLevel = 10 - ((distance * 10) / (FRACUNIT/2)); @@ -4220,7 +4230,7 @@ static boolean K_drawKartLaps(void) // WHAT IS THIS? // WHAT ARE YOU FUCKING TALKING ABOUT? V_DrawMappedPatch(fr, fy, V_HUDTRANS|V_SLIDEIN|splitflags, kp_exp[1], R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_MUSTARD, GTC_CACHE)); - auto transflag = K_GetTransFlagFromFixed(K_EffectiveGradingFactor(stplyr)); + auto transflag = K_GetTransFlagFromFixed(K_EffectiveGradingFactor(stplyr), true); skincolornum_t overlaycolor = K_EffectiveGradingFactor(stplyr) < FRACUNIT ? SKINCOLOR_RUBY : SKINCOLOR_ULTRAMARINE ; auto colormap = R_GetTranslationColormap(TC_RAINBOW, overlaycolor, GTC_CACHE); V_DrawMappedPatch(fr, fy, transflag|V_SLIDEIN|splitflags, kp_exp[1], colormap); @@ -4243,7 +4253,7 @@ static boolean K_drawKartLaps(void) V_DrawMappedPatch(LAPS_X+bump, LAPS_Y, V_HUDTRANS|V_SLIDEIN|splitflags, kp_exp[0], R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_MUSTARD, GTC_CACHE)); - auto transflag = K_GetTransFlagFromFixed(K_EffectiveGradingFactor(stplyr)); + auto transflag = K_GetTransFlagFromFixed(K_EffectiveGradingFactor(stplyr), true); skincolornum_t overlaycolor = K_EffectiveGradingFactor(stplyr) < FRACUNIT ? SKINCOLOR_RUBY : SKINCOLOR_ULTRAMARINE ; auto colormap = R_GetTranslationColormap(TC_RAINBOW, overlaycolor, GTC_CACHE); V_DrawMappedPatch(LAPS_X+bump, LAPS_Y, transflag|V_SLIDEIN|splitflags, kp_exp[0], colormap); diff --git a/src/k_hud.h b/src/k_hud.h index c251fc137..d0b5ba81a 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -67,7 +67,7 @@ void K_drawButton(fixed_t x, fixed_t y, INT32 flags, patch_t *button[2], boolean void K_drawButtonAnim(INT32 x, INT32 y, INT32 flags, patch_t *button[2], tic_t animtic); void K_DrawSticker(INT32 x, INT32 y, INT32 width, INT32 flags, boolean isSmall); void K_DrawMarginSticker(INT32 x, INT32 y, INT32 width, INT32 flags, boolean isSmall, boolean leftedge); -INT32 K_GetTransFlagFromFixed(fixed_t value); +INT32 K_GetTransFlagFromFixed(fixed_t value, boolean midrace); void K_DrawKartPositionNumXY( UINT8 num, diff --git a/src/k_kart.c b/src/k_kart.c index a986dc478..12c2e2658 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -153,11 +153,9 @@ fixed_t K_EffectiveGradingFactor(const player_t *player) return min; fixed_t gf = player->gradingfactor; - fixed_t SOFT_CAP = FRACUNIT; - fixed_t SOFT_CAP_FACTOR = 3*FRACUNIT; - if (gf > SOFT_CAP) - gf = SOFT_CAP + FixedDiv(gf - SOFT_CAP, SOFT_CAP_FACTOR); + if (gf > GRADINGFACTORSOFTCAP) + gf = GRADINGFACTORSOFTCAP + FixedDiv(gf - GRADINGFACTORSOFTCAP, GRADINGFACTORCAPSTRENGTH); return max(min, gf); } diff --git a/src/k_kart.h b/src/k_kart.h index 483800777..67fe083a0 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -135,6 +135,8 @@ player_t *K_DuelOpponent(player_t *player); fixed_t K_EffectiveGradingFactor(const player_t *player); #define MINGRADINGFACTOR (FRACUNIT/2) #define MINFRANTICFACTOR (8*FRACUNIT/10) +#define GRADINGFACTORSOFTCAP (FRACUNIT) +#define GRADINGFACTORCAPSTRENGTH (3*FRACUNIT) void K_TimerReset(void); void K_TimerInit(void); diff --git a/src/k_podium.cpp b/src/k_podium.cpp index 564155315..b18ec7211 100644 --- a/src/k_podium.cpp +++ b/src/k_podium.cpp @@ -745,7 +745,7 @@ void podiumData_s::Draw(void) factor = FRACUNIT - FixedDiv(factor, bluemaxoffset); } - auto transflag = K_GetTransFlagFromFixed(factor); + auto transflag = K_GetTransFlagFromFixed(factor, false); drawer_gametype .xy(0, 1) .colorize(static_cast(overlaycolor)) @@ -915,7 +915,7 @@ void podiumData_s::Draw(void) factor = FRACUNIT - FixedDiv(factor, bluemaxoffset); } - auto transflag = K_GetTransFlagFromFixed(factor); + auto transflag = K_GetTransFlagFromFixed(factor, false); drawer_totals_right .colorize(static_cast(overlaycolor)) .flags(transflag)