From 1897f9d1e74a548753585759d3ea758b26cf9fd6 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 18:52:45 -0400 Subject: [PATCH] Fix weird stacking speed dropoff issue Thanks so much Indev! --- src/d_player.h | 1 + src/k_kart.c | 8 ++++---- src/p_saveg.c | 2 ++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 73b6550d4..a08cc392a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -635,6 +635,7 @@ struct player_t fixed_t boostpower; // Base boost value, for offroad fixed_t speedboost; // Boost value smoothing for max speed + fixed_t prevspeedboost; // Max speed boost value from the last frame fixed_t accelboost; // Boost value smoothing for acceleration angle_t boostangle; // angle set when not spun out OR boosted to determine what direction you should keep going at if you're spun out and boosted. boostinfo_t boostinfo; // Stores values used for setting speed and accel boosts. diff --git a/src/k_kart.c b/src/k_kart.c index 33e7aff26..2f5c67dc8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3589,7 +3589,6 @@ static void K_GetKartBoostPower(player_t *player) fixed_t finalspeedboost = 0; fixed_t finalaccelboost = 0; UINT8 finalgrade = 0; - fixed_t prevspeedboost = player->speedboost; if (player->spinouttimer && player->wipeoutslow == 1) // Slow down after you've been bumped { @@ -3686,19 +3685,19 @@ static void K_GetKartBoostPower(player_t *player) player->speedboost = max(finalspeedboost, player->speedboost)/2; player->accelboost = max(finalaccelboost, player->accelboost)/2; } - else if (finalspeedboost >= prevspeedboost) + else if (finalspeedboost >= player->prevspeedboost) { player->speedboost = max(player->speedboost, finalspeedboost); player->accelboost = max(player->accelboost, finalaccelboost); } else if ((player->aizdriftstrat && abs((player->drift) < 5)) || (K_GetKartButtons(player) & BT_BRAKE)) { - player->speedboost = max(prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST)); + player->speedboost = max(player->prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST)); player->accelboost = finalaccelboost; } else { - player->speedboost = prevspeedboost - SPEEDBOOSTDROPOFF; + player->speedboost = max(player->speedboost + (finalspeedboost - player->speedboost) / (TICRATE/2), player->speedboost - SPEEDBOOSTDROPOFF); player->accelboost = finalaccelboost; } } @@ -3718,6 +3717,7 @@ static void K_GetKartBoostPower(player_t *player) player->numboosts = finalgrade; K_ClearBoost(player); + player->prevspeedboost = player->speedboost; } // Returns value based on being Grown or Shrunk otherwise returns FRACUNIT diff --git a/src/p_saveg.c b/src/p_saveg.c index 94edc68fd..2040d4e8c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -277,6 +277,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEFIXED(save->p, players[i].boostpower); WRITEFIXED(save->p, players[i].speedboost); + WRITEFIXED(save->p, players[i].prevspeedboost); WRITEFIXED(save->p, players[i].accelboost); WRITEANGLE(save->p, players[i].boostangle); WRITEUINT8(save->p, players[i].numsneakers); @@ -605,6 +606,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].boostpower = READFIXED(save->p); players[i].speedboost = READFIXED(save->p); + players[i].prevspeedboost = READFIXED(save->p); players[i].accelboost = READFIXED(save->p); players[i].boostangle = READANGLE(save->p); players[i].numsneakers = READUINT8(save->p);