From 0ce492e10383086cc3a830d6596699dc32b10b9d Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 29 Jul 2020 12:15:11 -0400 Subject: [PATCH] Fix sliptiding being weakened after all of the boost stacking changes, by making handling bonuses stack using the same rules --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 68 +++++++++++++++++++++++++------------------------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index f1df7ccfb..b9c44ed0e 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -297,6 +297,7 @@ typedef enum k_boostpower, // Base boost value, for offroad k_speedboost, // Boost value smoothing for max speed k_accelboost, // Boost value smoothing for acceleration + k_handleboost, // Boost value smoothing for handling k_draftpower, // Drafting power (from 0 to FRACUNIT), doubles your top speed & acceleration at max k_draftleeway, // Leniency timer before removing draft power k_lastdraft, // Last player being drafted diff --git a/src/dehacked.c b/src/dehacked.c index 3474951d1..2eed6a870 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8846,6 +8846,7 @@ static const char *const KARTSTUFF_LIST[] = { "BOOSTPOWER", "SPEEDBOOST", "ACCELBOOST", + "HANDLEBOOST", "DRAFTPOWER", "DRAFTLEEWAY", "LASTDRAFT", diff --git a/src/k_kart.c b/src/k_kart.c index 0af1ec658..54d9e99b1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2065,7 +2065,7 @@ fixed_t K_GetSpindashChargeSpeed(player_t *player) // Light weights have stronger boost stacking -- aka, better metabolism than heavies XD #define METABOLISM -// sets k_boostpower, k_speedboost, and k_accelboost to whatever we need it to be +// sets k_boostpower, k_speedboost, k_accelboost, and k_handleboost to whatever we need it to be static void K_GetKartBoostPower(player_t *player) { #ifdef METABOLISM @@ -2074,7 +2074,7 @@ static void K_GetKartBoostPower(player_t *player) #endif // METABOLISM fixed_t boostpower = FRACUNIT; - fixed_t speedboost = 0, accelboost = 0; + fixed_t speedboost = 0, accelboost = 0, handleboost = 0; UINT8 numboosts = 0; if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] == 1) // Slow down after you've been bumped @@ -2092,18 +2092,20 @@ static void K_GetKartBoostPower(player_t *player) #ifdef METABOLISM -#define ADDBOOST(s,a) { \ +#define ADDBOOST(s,a,h) { \ numboosts++; \ speedboost += FixedDiv(s, FRACUNIT + (metabolism * (numboosts-1))); \ accelboost += FixedDiv(a, FRACUNIT + (metabolism * (numboosts-1))); \ + handleboost += FixedDiv(h, FRACUNIT + (metabolism * (numboosts-1))); \ } #else -#define ADDBOOST(s,a) { \ +#define ADDBOOST(s,a,h) { \ numboosts++; \ speedboost += s / numboosts; \ accelboost += a / numboosts; \ + handleboost += h / numboosts; \ } #endif // METABOLISM @@ -2113,18 +2115,24 @@ static void K_GetKartBoostPower(player_t *player) UINT8 i; for (i = 0; i < player->kartstuff[k_numsneakers]; i++) { - ADDBOOST(FRACUNIT/2, 8*FRACUNIT); // + 50% top speed, + 800% acceleration + ADDBOOST(FRACUNIT/2, 8*FRACUNIT, FRACUNIT/4); // + 50% top speed, + 800% acceleration, +25% handling } } if (player->kartstuff[k_invincibilitytimer]) // Invincibility { - ADDBOOST(3*FRACUNIT/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration + ADDBOOST(3*FRACUNIT/8, 3*FRACUNIT, FRACUNIT/4); // + 37.5% top speed, + 300% acceleration, +25% handling + } + + if (player->kartstuff[k_growshrinktimer] > 0) // Grow + { + ADDBOOST(0, 0, FRACUNIT/4); // + 0% top speed, + 0% acceleration, +25% handling } if (player->kartstuff[k_flamedash]) // Flame Shield dash { - ADDBOOST(K_FlameShieldDashVar(player->kartstuff[k_flamedash]), 3*FRACUNIT); // + infinite top speed, + 300% acceleration + fixed_t dash = K_FlameShieldDashVar(player->kartstuff[k_flamedash]); + ADDBOOST(dash, 3*FRACUNIT, FixedDiv(dash, FRACUNIT/2) / 4); // + infinite top speed, + 300% acceleration, + infinite handling } if (player->kartstuff[k_spindashboost]) // Spindash boost @@ -2134,28 +2142,29 @@ static void K_GetKartBoostPower(player_t *player) // character & charge dependent ADDBOOST( FixedMul(MAXCHARGESPEED, player->kartstuff[k_spindashspeed]), // + 0 to K_GetSpindashChargeSpeed()% top speed - (4*FRACUNIT) + (36*player->kartstuff[k_spindashspeed]) // + 400% to 4000% acceleration + (4*FRACUNIT) + (36*player->kartstuff[k_spindashspeed]), // + 400% to 4000% acceleration + 0 // + 0% handling ); } if (player->kartstuff[k_startboost]) // Startup Boost { - ADDBOOST(FRACUNIT/2, 4*FRACUNIT); // + 50% top speed, + 400% acceleration + ADDBOOST(FRACUNIT/2, 4*FRACUNIT, 0); // + 50% top speed, + 400% acceleration, +0% handling } if (player->kartstuff[k_driftboost]) // Drift Boost { - ADDBOOST(FRACUNIT/4, 4*FRACUNIT); // + 25% top speed, + 400% acceleration + ADDBOOST(FRACUNIT/4, 4*FRACUNIT, 0); // + 25% top speed, + 400% acceleration, +0% handling } if (player->kartstuff[k_ringboost]) // Ring Boost { - ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration + ADDBOOST(FRACUNIT/5, 4*FRACUNIT, 0); // + 20% top speed, + 400% acceleration, +0% handling } if (player->kartstuff[k_eggmanexplode]) // Ready-to-explode { - ADDBOOST(3*FRACUNIT/20, FRACUNIT); // + 15% top speed, + 100% acceleration + ADDBOOST(3*FRACUNIT/20, FRACUNIT, 0); // + 15% top speed, + 100% acceleration, +0% handling } if (player->kartstuff[k_draftpower] > 0) // Drafting @@ -2178,6 +2187,8 @@ static void K_GetKartBoostPower(player_t *player) } player->kartstuff[k_accelboost] = accelboost; + player->kartstuff[k_handleboost] = handleboost; + player->kartstuff[k_numboosts] = numboosts; } @@ -6416,7 +6427,7 @@ static INT16 K_GetKartDriftValue(player_t *player, fixed_t countersteer) if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)) { - countersteer = 3*countersteer/2; + countersteer = FixedMul(countersteer, 3*FRACUNIT/2); } return basedrift + (FixedMul(driftadjust * FRACUNIT, countersteer) / FRACUNIT); @@ -6427,6 +6438,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) fixed_t p_maxspeed; fixed_t p_speed; fixed_t weightadjust; + fixed_t turnfixed = turnvalue * FRACUNIT; if ((player->mo == NULL || P_MobjWasRemoved(player->mo))) { @@ -6457,16 +6469,13 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) if (K_PlayerUsesBotMovement(player)) { - turnvalue = 5*turnvalue/4; // Base increase to turning - turnvalue = FixedMul( - turnvalue * FRACUNIT, - K_BotRubberband(player) - ) / FRACUNIT; + turnfixed = FixedMul(turnfixed, 5*FRACUNIT/4); // Base increase to turning + turnfixed = FixedMul(turnfixed, K_BotRubberband(player)); } if (player->kartstuff[k_drift] != 0 && P_IsObjectOnGround(player->mo)) { - fixed_t countersteer = FixedDiv(turnvalue*FRACUNIT, KART_FULLTURN*FRACUNIT); + fixed_t countersteer = FixedDiv(turnfixed, KART_FULLTURN*FRACUNIT); // If we're drifting we have a completely different turning value @@ -6475,32 +6484,23 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) countersteer = FRACUNIT; } - turnvalue = K_GetKartDriftValue(player, countersteer); - - return turnvalue; + return K_GetKartDriftValue(player, countersteer); } - if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0) + if (player->kartstuff[k_handleboost] > 0) { - turnvalue = 5*turnvalue/4; - } - - if (player->kartstuff[k_flamedash] > 0) - { - fixed_t multiplier = K_FlameShieldDashVar(player->kartstuff[k_flamedash]); - multiplier = FRACUNIT + (FixedDiv(multiplier, FRACUNIT/2) / 4); - turnvalue = FixedMul(turnvalue * FRACUNIT, multiplier) / FRACUNIT; + turnfixed = FixedMul(turnfixed, FRACUNIT + player->kartstuff[k_handleboost]); } if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)) { - turnvalue = 3*turnvalue/2; + turnfixed = FixedMul(turnfixed, 3*FRACUNIT/2); } // Weight has a small effect on turning - turnvalue = FixedMul(turnvalue * FRACUNIT, weightadjust) / FRACUNIT; + turnfixed = FixedMul(turnfixed, weightadjust); - return turnvalue; + return (turnfixed / FRACUNIT); } INT32 K_GetKartDriftSparkValue(player_t *player)