From 33348e7c92045edc2022aafd631ad83a22730b39 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Tue, 16 Sep 2025 21:08:32 +0200 Subject: [PATCH] Refactor and tweak afterimages, clean up drift release (closes #98) I pinky promise I did NOT break drifting --- src/d_player.h | 4 ++ src/k_hud.c | 47 +++++------------ src/k_kart.c | 134 ++++++++++++++++++++++--------------------------- 3 files changed, 77 insertions(+), 108 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 153e2278c..04436637b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -280,6 +280,10 @@ typedef enum khud_splitcolor, // Skincolor of the leading player khud_splitposition, // Who are we comparing to? + // Drifting + khud_afterimagetime, // tics left for displaying afterimage + khud_afterimagevalue, // what value the drift ended at + NUMKARTHUD } karthudtype_t; diff --git a/src/k_hud.c b/src/k_hud.c index 06b35a9c6..9797ec61a 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -5936,9 +5936,6 @@ static INT32 driftskins[] = SKINCOLOR_VIOLET, }; -static INT32 afterval[MAXPLAYERS]; -static tic_t aftertime[MAXPLAYERS]; - enum driftgauge_e { DGAUGE_NONE = 0, @@ -6049,22 +6046,10 @@ static UINT8 driftrainbow[] = { static UINT8 wifibars[] = { 6, 11, 16, 21 }; -void K_ResetAfterImageValues(void) -{ - for (INT32 i = 0; i < MAXPLAYERS; i++) - { - afterval[i] = 0; - aftertime[i] = 0; - } -} - // Based off https://github.com/GenericHeroGuy/ringracers-scripts/blob/master/src/sglua/Lua/HUD/driftgauge.lua // Original script by GenericHeroGuy, graphics by Spee void K_DrawDriftGauge(void) { - // Reset stuff on level load - if (leveltime <= 1) - K_ResetAfterImageValues(); // Actually have it enabled? if (!cv_driftgauge.value) return; @@ -6105,12 +6090,6 @@ void K_DrawDriftGauge(void) if (cv_driftgauge.value == DGAUGE_LEGACYSMALL) basex += 10*FRACUNIT; - INT32 afterimage = max(0, (INT32)(aftertime[stplyrnum] - leveltime)); - if (afterimage) - goto doafterimage; - else if (!stplyr->drift) - return; - INT32 driftval = K_GetKartDriftSparkValue(stplyr); INT32 driftcharge = min(driftval*4, stplyr->driftcharge); boolean rainbow = driftcharge >= driftval*4; @@ -6118,6 +6097,15 @@ void K_DrawDriftGauge(void) const UINT8 backlevel = rainbow ? 4 : max(0, level - 1); UINT8 *cmap = R_GetTranslationColormap(TC_RAINBOW, rainbow ? 1 + (leveltime % FIRSTSUPERCOLOR) : driftskins[level], GTC_CACHE); + INT32 afterimage = stplyr->karthud[khud_afterimagetime]; + if (!stplyr->drift) + { + if (afterimage) + goto doafterimage; + else + return; + } + if (basepatch) { UINT8 *backcmap, *basecmap = K_UseColorHud() ? R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE) : NULL; @@ -6206,11 +6194,11 @@ void K_DrawDriftGauge(void) doafterimage:; // right, also draw a cool number - INT32 charge = afterimage ? afterval[stplyrnum] : driftcharge*100 / driftval; + INT32 charge = (afterimage ? stplyr->karthud[khud_afterimagevalue] : driftcharge)*100 / driftval; if (afterimage) { - flags |= V_TRANSLUCENT*2 - (V_10TRANS * (aftertime[stplyrnum] - leveltime)); - cmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SILVER, GTC_CACHE); + flags |= V_TRANSLUCENT*2 - (V_10TRANS * afterimage); + cmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_GREY, GTC_CACHE); } if (gauge->meterfont == OPPRNK_FONT) @@ -6240,15 +6228,4 @@ doafterimage:; meterfont, va("%03d", charge) );*/ - - // and trigger the afterimage - if (afterimage) - ; - else if (stplyr->pflags & PF_DRIFTEND) - { - afterval[stplyrnum] = charge; - aftertime[stplyrnum] = leveltime + 10; - } - else - aftertime[stplyrnum] = 0; } diff --git a/src/k_kart.c b/src/k_kart.c index 340637554..bce64a793 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6191,6 +6191,9 @@ void K_KartPlayerHUDUpdate(player_t *player) } else player->karthud[khud_cardanimation] = 0; + + if (player->karthud[khud_afterimagetime]) + player->karthud[khud_afterimagetime]--; } #undef RINGANIM_DELAYMAX @@ -8609,13 +8612,16 @@ UINT8 K_GetKartDriftSparkStageForValue(const player_t *player, INT32 value) { const INT32 dsv = K_GetKartDriftSparkValue(player); + if (value < 0) + return 0; + switch (value / dsv) { case 0: return 0; - default: return 1; + case 1: return 1; case 2: return 2; case 3: return K_PurpleDriftActive() ? 3 : 2; - case 4: return 4; + default: return 4; } } @@ -8660,10 +8666,8 @@ static void K_KartDrift(player_t *player, boolean onground) { fixed_t minspeed = (10 * player->mo->scale); fixed_t driftadditive = 24; - INT32 dsone = K_GetKartDriftSparkValue(player); - INT32 dstwo = dsone*2; - INT32 dsthree = K_PurpleDriftActive() ? dsone*3 : dsone*4; - INT32 dsfour = dsone*4; + const INT32 dsv = K_GetKartDriftSparkValue(player); + const UINT8 driftstage = K_GetKartDriftSparkStageForValue(player, player->driftcharge); UINT16 buttons = K_GetKartButtons(player); // Grown players taking yellow spring panels will go below minspeed for one tic, @@ -8676,73 +8680,60 @@ static void K_KartDrift(player_t *player, boolean onground) // Holding the Jump button will enable drifting. // Drift Release (Moved here so you can't "chain" drifts) - if ((player->drift != -5 && player->drift != 5) - && player->driftcharge < dsone - && onground) + if (player->drift != -5 && player->drift != 5) { - player->driftcharge = 0; - } - else if ((player->drift != -5 && player->drift != 5) - && (player->driftcharge >= dsone && player->driftcharge < dstwo) - && onground) - { - if (player->driftboost < 20) - player->driftboost = 20; - S_StartSound(player->mo, sfx_s23c); - K_SpawnDriftEFX(player, 1); - player->driftcharge = 0; - } - else if ((player->drift != -5 && player->drift != 5) - && (player->driftcharge >= dstwo && player->driftcharge < dsthree) - && onground) - { - if (player->driftboost < 50) - player->driftboost = 50; + if (driftstage && onground) + { + UINT8 boost = 0; - if (cv_kartdriftsounds.value) - S_StartSound(player->mo, sfx_kc5b); - S_StartSound(player->mo, sfx_s23c); + if (!cv_kartdriftsounds.value || driftstage < 3) + S_StartSound(player->mo, sfx_s23c); - K_SpawnDriftEFX(player, 2); - player->driftcharge = 0; - } - else if ((player->drift != -5 && player->drift != 5) - && player->driftcharge < dsfour - && onground) - { - if (player->driftboost < 80) - player->driftboost = 80; - if (cv_kartdriftsounds.value) - { - S_StartSound(player->mo, sfx_kc5b); - S_StartSound(player->mo, sfx_kc3c); - S_StartSound(player->mo, sfx_s3k47); - } - else - { - S_StartSound(player->mo, sfx_s23c); - } - K_SpawnDriftEFX(player, 3); - player->driftcharge = 0; - } - else if ((player->drift != -5 && player->drift != 5) - && player->driftcharge >= dsfour - && onground) - { - if (player->driftboost < 125) - player->driftboost = 125; - if (cv_kartdriftsounds.value) - { - S_StartSound(player->mo, sfx_kc5b); - S_StartSound(player->mo, sfx_kc4d); - } - else - { - S_StartSound(player->mo, sfx_s23c); + switch (driftstage) + { + case 1: + boost = 20; + break; + case 2: + boost = 50; + if (cv_kartdriftsounds.value) + S_StartSound(player->mo, sfx_kc5b); + break; + case 3: + boost = 80; + if (cv_kartdriftsounds.value) + { + S_StartSound(player->mo, sfx_kc5b); + S_StartSound(player->mo, sfx_kc3c); + S_StartSound(player->mo, sfx_s3k47); + } + break; + case 4: + boost = 125; + if (cv_kartdriftsounds.value) + { + S_StartSound(player->mo, sfx_kc5b); + S_StartSound(player->mo, sfx_kc4d); + } + break; + } + + if (player->driftboost < boost) + player->driftboost = boost; + + K_SpawnDriftEFX(player, driftstage); } - K_SpawnDriftEFX(player, 4); - player->driftcharge = 0; + // afterimage, when you release the drift + if (player->pflags & PF_DRIFTEND || (!onground && player->driftcharge)) + { + if (!player->karthud[khud_afterimagetime]) + player->karthud[khud_afterimagevalue] = min(player->driftcharge, dsv*4); + player->karthud[khud_afterimagetime] = 10; + } + + if (onground) + player->driftcharge = 0; } // Drifting: left or right? @@ -8811,10 +8802,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->pflags |= PF_GETSPARKS; // Sound whenever you get a different tier of sparks - if ((player->driftcharge < dsone && player->driftcharge+driftadditive >= dsone) - || (player->driftcharge < dstwo && player->driftcharge+driftadditive >= dstwo) - || (player->driftcharge < dsthree && player->driftcharge+driftadditive >= dsthree) - || (player->driftcharge < dsfour && player->driftcharge+driftadditive >= dsfour)) + if (driftstage < K_GetKartDriftSparkStageForValue(player, player->driftcharge+driftadditive)) { if (P_IsDisplayPlayer(player)) // UGHGHGH... S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); // Ugh... @@ -8829,7 +8817,7 @@ static void K_KartDrift(player_t *player, boolean onground) // Spawn Sparks regardless of size if (!P_PlayerInPain(player) && player->drift != 0) { - if (player->driftcharge >= dsone) + if (driftstage) K_SpawnDriftSparks(player); }