From d031776ed35e532f986db3b6c8643569a7a3f1f4 Mon Sep 17 00:00:00 2001 From: yamamama Date: Sat, 20 Dec 2025 00:58:53 -0500 Subject: [PATCH] Introduce handleboost Copying the system directly from RR 2.4 --- src/d_netcmd.c | 18 +++++++++++++ src/d_netcmd.h | 13 +++++++++ src/d_player.h | 1 + src/k_kart.c | 66 ++++++++++++++++++++++++++++++++++----------- src/k_kart.h | 13 ++++++++- src/lua_baselib.c | 7 ++--- src/lua_playerlib.c | 8 ++++++ src/p_saveg.c | 1 + 8 files changed, 107 insertions(+), 20 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 8f8e69497..2cb745a8e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -484,48 +484,64 @@ consvar_t cv_kartstacking_sneaker_normalspeedboost = CVAR_INIT ("vanillaboost_sn consvar_t cv_kartstacking_sneaker_hardspeedboost = CVAR_INIT ("vanillaboost_sneaker_hardspeedboost", "0.2756", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_sneaker_expertspeedboost = CVAR_INIT ("vanillaboost_sneaker_expertspeedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_sneaker_accelboost = CVAR_INIT ("vanillaboost_sneaker_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_handleboost = CVAR_INIT ("vanillaboost_sneaker_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_sneaker_maxgrade = CVAR_INIT ("vanillaboost_sneaker_maxgrade", "3", CV_NETVAR|CV_CHEAT|CV_GUARD, CV_Natural, NULL); consvar_t cv_kartstacking_sneaker_stackable = CVAR_INIT ("vanillaboost_sneaker_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_panel_separate = CVAR_INIT ("vanillaboost_panel_separate", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_panel_maxgrade = CVAR_INIT ("vanillaboost_panel_maxgrade", "2", CV_NETVAR|CV_CHEAT|CV_GUARD, CV_Natural, NULL); +// +// Invincibility +// +// Classic boosts consvar_t cv_kartstacking_invincibility_classicspeedboost = CVAR_INIT ("vanillaboost_invincibility_classicspeedboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_invincibility_classicaccelboost = CVAR_INIT ("vanillaboost_invincibility_classicaccelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_invincibility_classichandleboost = CVAR_INIT ("vanillaboost_invincibility_classichandleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +// Alternate boosts consvar_t cv_kartstacking_invincibility_alternatespeedboost = CVAR_INIT ("vanillaboost_invincibility_alternatespeedboost", "0.68", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_invincibility_alternateaccelboost = CVAR_INIT ("vanillaboost_invincibility_alternateaccelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_invincibility_alternatehandleboost = CVAR_INIT ("vanillaboost_invincibility_alternatehandleboost", "1.5", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_invincibility_stackable = CVAR_INIT ("vanillaboost_invincibility_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_grow_speedboost = CVAR_INIT ("vanillaboost_grow_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_grow_accelboost = CVAR_INIT ("vanillaboost_grow_accelboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_grow_handleboost = CVAR_INIT ("vanillaboost_grow_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_grow_stackable = CVAR_INIT ("vanillaboost_grow_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_altshrink_speedboost = CVAR_INIT ("vanillaboost_altshrink_speedboost", "0.50", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_altshrink_accelboost = CVAR_INIT ("vanillaboost_altshrink_accelboost", "0.15", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_altshrink_handleboost = CVAR_INIT ("vanillaboost_altshrink_handleboost", "2.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_altshrink_stackable = CVAR_INIT ("vanillaboost_altshrink_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_bubble_speedboost = CVAR_INIT ("vanillaboost_bubble_speedboost", "0.35", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_bubble_accelboost = CVAR_INIT ("vanillaboost_bubble_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_bubble_handleboost = CVAR_INIT ("vanillaboost_bubble_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_bubble_stackable = CVAR_INIT ("vanillaboost_bubble_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_handleboost = CVAR_INIT ("vanillaboost_flame_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_stackable = CVAR_INIT ("vanillaboost_flame_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_start_speedboost = CVAR_INIT ("vanillaboost_start_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_start_accelboost = CVAR_INIT ("vanillaboost_start_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_start_handleboost = CVAR_INIT ("vanillaboost_start_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_start_stackable = CVAR_INIT ("vanillaboost_start_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_walltransfer_speedboost = CVAR_INIT ("vanillaboost_walltransfer_speedboost", "0.10", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_walltransfer_accelboost = CVAR_INIT ("vanillaboost_walltransfer_accelboost", "5.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_walltransfer_handleboost = CVAR_INIT ("vanillaboost_walltransfer_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_walltransfer_stackable = CVAR_INIT ("vanillaboost_walltransfer_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_drift_speedboost = CVAR_INIT ("vanillaboost_drift_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_drift_accelboost = CVAR_INIT ("vanillaboost_drift_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_drift_handleboost = CVAR_INIT ("vanillaboost_drift_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_drift_stackable = CVAR_INIT ("vanillaboost_drift_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_ring_speedboost = CVAR_INIT ("vanillaboost_ring_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_ring_accelboost = CVAR_INIT ("vanillaboost_ring_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_ring_handleboost = CVAR_INIT ("vanillaboost_ring_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_ring_stackable = CVAR_INIT ("vanillaboost_ring_stackable", "On", CV_NETVAR|CV_CHEAT|CV_GUARD, CV_OnOff, NULL); consvar_t cv_kartstacking_slope_decay = CVAR_INIT ("vanillaboost_slope_decay", "0.004", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); @@ -594,6 +610,8 @@ consvar_t cv_kartitempush = CVAR_INIT ("kartitempush", "Off", CV_NETVAR|CV_CALL| consvar_t cv_kartforcelegacyodds = CVAR_INIT ("kartforcelegacyodds", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_handleboostslip = CVAR_INIT ("karthandleboostsliptide", "On", CV_NETVAR, CV_OnOff, NULL); + #define ANTIBUMP_MAX (UINT32_MAX / TICRATE) static CV_PossibleValue_t antibump_cons_t[] = {{0, "MIN"}, {ANTIBUMP_MAX, "MAX"}, {0, NULL}}; consvar_t cv_kartantibump = CVAR_INIT ("kartantibump", "0", CV_NETVAR|CV_CALL|CV_NOINIT, antibump_cons_t, KartAntiBump_OnChange); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 85a661424..63217f254 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -111,6 +111,7 @@ extern consvar_t cv_kartstacking_sneaker_normalspeedboost; extern consvar_t cv_kartstacking_sneaker_hardspeedboost; extern consvar_t cv_kartstacking_sneaker_expertspeedboost; extern consvar_t cv_kartstacking_sneaker_accelboost; +extern consvar_t cv_kartstacking_sneaker_handleboost; extern consvar_t cv_kartstacking_sneaker_maxgrade; extern consvar_t cv_kartstacking_sneaker_stackable; extern consvar_t cv_kartstacking_panel_separate; @@ -119,41 +120,51 @@ extern consvar_t cv_kartstacking_panel_maxgrade; extern consvar_t cv_kartstacking_invincibility_classicspeedboost; extern consvar_t cv_kartstacking_invincibility_classicaccelboost; +extern consvar_t cv_kartstacking_invincibility_classichandleboost; extern consvar_t cv_kartstacking_invincibility_alternatespeedboost; extern consvar_t cv_kartstacking_invincibility_alternateaccelboost; +extern consvar_t cv_kartstacking_invincibility_alternatehandleboost; extern consvar_t cv_kartstacking_invincibility_stackable; extern consvar_t cv_kartstacking_flame_speedval; extern consvar_t cv_kartstacking_flame_accelboost; +extern consvar_t cv_kartstacking_flame_handleboost; extern consvar_t cv_kartstacking_flame_stackable; extern consvar_t cv_kartstacking_grow_speedboost; extern consvar_t cv_kartstacking_grow_accelboost; +extern consvar_t cv_kartstacking_grow_handleboost; extern consvar_t cv_kartstacking_grow_stackable; extern consvar_t cv_kartstacking_bubble_speedboost; extern consvar_t cv_kartstacking_bubble_accelboost; +extern consvar_t cv_kartstacking_bubble_handleboost; extern consvar_t cv_kartstacking_bubble_stackable; extern consvar_t cv_kartaltshrinktime; extern consvar_t cv_kartstacking_altshrink_speedboost; extern consvar_t cv_kartstacking_altshrink_accelboost; +extern consvar_t cv_kartstacking_altshrink_handleboost; extern consvar_t cv_kartstacking_altshrink_stackable; extern consvar_t cv_kartstacking_start_speedboost; extern consvar_t cv_kartstacking_start_accelboost; +extern consvar_t cv_kartstacking_start_handleboost; extern consvar_t cv_kartstacking_start_stackable; extern consvar_t cv_kartstacking_walltransfer_speedboost; extern consvar_t cv_kartstacking_walltransfer_accelboost; +extern consvar_t cv_kartstacking_walltransfer_handleboost; extern consvar_t cv_kartstacking_walltransfer_stackable; extern consvar_t cv_kartstacking_drift_speedboost; extern consvar_t cv_kartstacking_drift_accelboost; +extern consvar_t cv_kartstacking_drift_handleboost; extern consvar_t cv_kartstacking_drift_stackable; extern consvar_t cv_kartstacking_ring_speedboost; extern consvar_t cv_kartstacking_ring_accelboost; +extern consvar_t cv_kartstacking_ring_handleboost; extern consvar_t cv_kartstacking_ring_stackable; extern consvar_t cv_kartstacking_slope_decay; @@ -216,6 +227,8 @@ extern consvar_t cv_kartantibump; extern consvar_t cv_kartforcelegacyodds; +extern consvar_t cv_handleboostslip; + extern consvar_t cv_kartoddsdist; extern consvar_t cv_kartlegacyoddsdist; extern consvar_t cv_kartspbdist; diff --git a/src/d_player.h b/src/d_player.h index fec0d3e09..489114a4f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -419,6 +419,7 @@ struct boostinfo_t { fixed_t stackspeedboost; fixed_t nonstackspeedboost; fixed_t accelboost; + fixed_t handleboost; UINT8 grade; }; diff --git a/src/k_kart.c b/src/k_kart.c index 1869eebc9..a817a4472 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2557,12 +2557,21 @@ fixed_t K_GetInvincibilityAccel(UINT16 time) return Easing_OutCubic(t, 0, INVINACCELBOOSTALT); } +fixed_t K_GetInvincibilityHandling(UINT16 time) +{ + if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY)) + return INVINHANDLEBOOSTCLS; + + fixed_t t = min(FRACUNIT, K_InvincibilityGradient(time)); + return Easing_OutCubic(t, 0, INVINHANDLEBOOSTALT); +} + static fixed_t diminish(fixed_t speedboost) { return FixedSqrt(speedboost + DIMINISHPARAM) - FixedSqrt(DIMINISHPARAM); } -void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, boolean stack, boolean visible) +void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, fixed_t handleboost, boolean stack, boolean visible) { if (stack && K_StackingActive()) { @@ -2580,6 +2589,8 @@ void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, boolean player->boostinfo.accelboost = max(player->boostinfo.accelboost, accelboost); } + player->boostinfo.handleboost = max(player->boostinfo.handleboost, handleboost); + if (visible) { player->boostinfo.grade = CLAMP(player->boostinfo.grade+1, 0, stackingactive ? UINT8_MAX : 1); @@ -2591,6 +2602,7 @@ void K_ClearBoost(player_t *player) player->boostinfo.stackspeedboost = 0; player->boostinfo.nonstackspeedboost = 0; player->boostinfo.accelboost = 0; + player->boostinfo.handleboost = 0; player->boostinfo.grade = 0; } @@ -2733,12 +2745,12 @@ static void K_GetKartBoostPower(player_t *player) for (i = 0; i < numsneakers; i++) { - K_DoBoost(player, sneakerspeedboost, ACCELSTACK ? 0 : SNEAKERACCELBOOST, SNEAKERSTACKABLE, SNEAKERSTACKABLE); // + ???% top speed, + 800% acceleration + K_DoBoost(player, sneakerspeedboost, ACCELSTACK ? 0 : SNEAKERACCELBOOST, SNEAKERHANDLEBOOST, SNEAKERSTACKABLE, SNEAKERSTACKABLE); // + ???% top speed, + 800% acceleration } if (ACCELSTACK) { - K_DoBoost(player, 0, SNEAKERACCELBOOST, true, false); // + 800% acceleration + K_DoBoost(player, 0, SNEAKERACCELBOOST, 0, true, false); // + 800% acceleration } } @@ -2746,15 +2758,16 @@ static void K_GetKartBoostPower(player_t *player) { fixed_t invspeedboost = K_GetInvincibilitySpeed(player->invincibilitytimer); fixed_t invaccelboost = K_GetInvincibilityAccel(player->invincibilitytimer); + fixed_t invhandleboost = K_GetInvincibilityHandling(player->invincibilitytimer); // Legacy: + 37.5% top speed, + 300% acceleration // Alternative: + ???% top speed, + ???% acceleration - K_DoBoost(player, invspeedboost, invaccelboost, INVINSTACKABLE, INVINSTACKABLE); + K_DoBoost(player, invspeedboost, invaccelboost, invhandleboost, INVINSTACKABLE, INVINSTACKABLE); } if (player->growshrinktimer > 0) // Grow { - K_DoBoost(player, GROWSPEEDBOOST, GROWACCELBOOST, GROWSTACKABLE, GROWSTACKABLE); // + 20% top speed, + 0% acceleration + K_DoBoost(player, GROWSPEEDBOOST, GROWACCELBOOST, GROWHANDLEBOOST, GROWSTACKABLE, GROWSTACKABLE); // + 20% top speed, + 0% acceleration } if (K_IsAltShrunk(player)) // Alt. Shrink @@ -2764,43 +2777,43 @@ static void K_GetKartBoostPower(player_t *player) shrinkspeed = FixedMul(shrinkspeed, boostpower); - K_DoBoost(player, shrinkspeed, shrinkaccel, SHRINKSTACKABLE, SHRINKSTACKABLE); // + 50% top speed, + 15% acceleration + K_DoBoost(player, shrinkspeed, shrinkaccel, SHRINKHANDLEBOOST, SHRINKSTACKABLE, SHRINKSTACKABLE); // + 50% top speed, + 15% acceleration } if (player->bubbleboost) // Bubble Shield popping boost { - K_DoBoost(player, BUBBLESPEEDBOOST, BUBBLEACCELBOOST, BUBBLESTACKABLE, BUBBLESTACKABLE); // + 35% top speed, + 800% acceleration + K_DoBoost(player, BUBBLESPEEDBOOST, BUBBLEACCELBOOST, BUBBLEHANDLEBOOST, BUBBLESTACKABLE, BUBBLESTACKABLE); // + 35% top speed, + 800% acceleration } if (player->flamestore) // Flame Shield dash { fixed_t dash = K_FlameShieldDashVar(player->flamedash); - K_DoBoost(player, FLAMESPEEDVAL + dash, FLAMEACCELBOOST, FLAMESTACKABLE, FLAMESTACKABLE); + K_DoBoost(player, FLAMESPEEDVAL + dash, FLAMEACCELBOOST, FLAMEHANDLEBOOST, FLAMESTACKABLE, FLAMESTACKABLE); } if (player->startboost) // Startup Boost { - K_DoBoost(player, STARTSPEEDBOOST, STARTACCELBOOST, STARTSTACKABLE, STARTSTACKABLE); // + 25% top speed, + 600% acceleration + K_DoBoost(player, STARTSPEEDBOOST, STARTACCELBOOST, STARTHANDLEBOOST, STARTSTACKABLE, STARTSTACKABLE); // + 25% top speed, + 600% acceleration } if (player->walltransferboost) // Wall Transfer Boost { - K_DoBoost(player, WALLTRANSFERSPEEDBOOST, WALLTRANSFERACCELBOOST, WALLTRANSFERSTACKABLE, WALLTRANSFERSTACKABLE); // + 10% top speed, + 500% acceleration + K_DoBoost(player, WALLTRANSFERSPEEDBOOST, WALLTRANSFERACCELBOOST, WALLTRANSFERHANDLEBOOST, WALLTRANSFERSTACKABLE, WALLTRANSFERSTACKABLE); // + 10% top speed, + 500% acceleration } if (player->driftboost) // Drift Boost { - K_DoBoost(player, DRIFTSPEEDBOOST, DRIFTACCELBOOST, DRIFTSTACKABLE, DRIFTSTACKABLE); // + 25% top speed, + 400% acceleration + K_DoBoost(player, DRIFTSPEEDBOOST, DRIFTACCELBOOST, DRIFTHANDLEBOOST, DRIFTSTACKABLE, DRIFTSTACKABLE); // + 25% top speed, + 400% acceleration } if (player->ringboost) // Ring Boost { - K_DoBoost(player, RINGSPEEDBOOST, RINGACCELBOOST, RINGSTACKABLE, RINGSTACKABLE); // + 20% top speed, + 400% acceleration + K_DoBoost(player, RINGSPEEDBOOST, RINGACCELBOOST, RINGHANDLEBOOST, RINGSTACKABLE, RINGSTACKABLE); // + 20% top speed, + 400% acceleration } if (player->slopeboost || player->slopeaccel) { - K_DoBoost(player, player->slopeboost, player->slopeaccel, SLOPESTACKABLE, false); // + ???% top speed, + 300% acceleration + K_DoBoost(player, player->slopeboost, player->slopeaccel, 0, SLOPESTACKABLE, false); // + ???% top speed, + 300% acceleration } // This should always remain the last boost before drafting @@ -8960,12 +8973,17 @@ INT16 K_GetKartTurnValue(const player_t *player, INT16 turnvalue) return turnvalue; } + if (player->boostinfo.handleboost > 0) + { + turnvalue = FixedMul(turnvalue, FRACUNIT + player->boostinfo.handleboost); + } + turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning if (K_SlipdashActive() && K_Sliptiding(player)) // slight handling boost based on weight turnvalue = FixedMul(turnvalue, FRACUNIT + (10 - player->kartweight)*FRACUNIT/48); - if (player->invincibilitytimer || player->sneakertimer || player->bubbleboost || + if (player->sneakertimer || player->bubbleboost || player->growshrinktimer > 0 || K_IsAltShrunk(player)) { turnvalue = FixedMul(turnvalue, FixedDiv(5 * FRACUNIT, 4 * FRACUNIT)); @@ -9109,6 +9127,22 @@ boolean K_InterceptArrowBullet(player_t *player) return ((player->invincibilitytimer && !K_IsKartItemAlternate(KITEM_INVINCIBILITY)) || (player->growshrinktimer > 0) || (player->flamestore)); } +// 1.25 fracunits; the (hardcoded) handleboost of a Sneaker. +#define HANDLEBOOSTTHRESHOLD (5 * FRACUNIT / 4) + +// Generalized sliptide conditions. +static boolean K_OtherSliptideCondition(player_t* player) +{ + if (!player) + return false; + + return ( + K_AltInvinSliptideCondition(player) || K_AltShrinkSliptideCondition(player) || + (cv_handleboostslip.value && (player->boostinfo.handleboost >= HANDLEBOOSTTHRESHOLD))); +} + +#undef HANDLEBOOSTTHRESHOLD + static void K_HandleAirDriftDrag(player_t *player, boolean onground) { if (onground && player->airdriftspeed > 0) @@ -9346,7 +9380,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->pflags &= ~(PF_BRAKEDRIFT|PF_GETSPARKS); } - if ( (!(player->sneakertimer || player->flamestore || player->bubbleboost || K_AltInvinSliptideCondition(player) || K_AltShrinkSliptideCondition(player))) + if ( (!(player->sneakertimer || player->flamestore || player->bubbleboost || K_OtherSliptideCondition(player))) || (!player->cmd.turning) || (!player->aizdriftstrat) || (player->cmd.turning > 0) != (player->aizdriftstrat > 0)) @@ -9433,7 +9467,7 @@ static void K_KartSlipdash(player_t *player, boolean onground) S_StopSoundByID(player->mo, sfx_cdfm17); S_StartSoundAtVolume(player->mo, player->slipdashcharge > FRACUNIT/3 ? sfx_cdfm62 : sfx_s23c, driftbonus ? 200 : 255); P_Thrust(player->mo, player->mo->angle, FixedMul(K_GetKartSpeed(player, false, false), 2*player->slipdashcharge/3)); - K_DoBoost(player, (2*player->slipdashcharge/3)/2, 0, false, false); + K_DoBoost(player, (2*player->slipdashcharge/3)/2, 0, 0, false, false); for (i = -1; i <= 1; i += 2) { diff --git a/src/k_kart.h b/src/k_kart.h index b984bff25..d0746b71d 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -108,6 +108,7 @@ extern vector3_t clusterpoint, clusterdtf; #define HARDSNEAKERSPEEDBOOST CV_Get(&cv_kartstacking_sneaker_hardspeedboost) #define EXPERTSNEAKERSPEEDBOOST CV_Get(&cv_kartstacking_sneaker_expertspeedboost) #define SNEAKERACCELBOOST CV_Get(&cv_kartstacking_sneaker_accelboost) +#define SNEAKERHANDLEBOOST CV_Get(&cv_kartstacking_sneaker_handleboost) #define MAXSNEAKERSTACK CV_Get(&cv_kartstacking_sneaker_maxgrade) #define SNEAKERSTACKABLE CV_Get(&cv_kartstacking_sneaker_stackable) #define SEPARATEPANELS CV_Get(&cv_kartstacking_panel_separate) @@ -115,41 +116,51 @@ extern vector3_t clusterpoint, clusterdtf; #define INVINSPEEDBOOSTCLS CV_Get(&cv_kartstacking_invincibility_classicspeedboost) #define INVINACCELBOOSTCLS CV_Get(&cv_kartstacking_invincibility_classicaccelboost) +#define INVINHANDLEBOOSTCLS CV_Get(&cv_kartstacking_invincibility_classichandleboost) #define INVINSPEEDBOOSTALT CV_Get(&cv_kartstacking_invincibility_alternatespeedboost) #define INVINACCELBOOSTALT CV_Get(&cv_kartstacking_invincibility_alternateaccelboost) +#define INVINHANDLEBOOSTALT CV_Get(&cv_kartstacking_invincibility_alternatehandleboost) #define INVINSTACKABLE CV_Get(&cv_kartstacking_invincibility_stackable) #define GROWSPEEDBOOST CV_Get(&cv_kartstacking_grow_speedboost) #define GROWACCELBOOST CV_Get(&cv_kartstacking_grow_accelboost) +#define GROWHANDLEBOOST CV_Get(&cv_kartstacking_grow_handleboost) #define GROWSTACKABLE CV_Get(&cv_kartstacking_grow_stackable) #define BUBBLESPEEDBOOST CV_Get(&cv_kartstacking_bubble_speedboost) #define BUBBLEACCELBOOST CV_Get(&cv_kartstacking_bubble_accelboost) +#define BUBBLEHANDLEBOOST CV_Get(&cv_kartstacking_bubble_handleboost) #define BUBBLESTACKABLE CV_Get(&cv_kartstacking_bubble_stackable) #define FLAMESPEEDVAL CV_Get(&cv_kartstacking_flame_speedval) #define FLAMEACCELBOOST CV_Get(&cv_kartstacking_flame_accelboost) +#define FLAMEHANDLEBOOST CV_Get(&cv_kartstacking_flame_handleboost) #define FLAMESTACKABLE CV_Get(&cv_kartstacking_flame_stackable) #define ALTSHRINKTIME CV_Get(&cv_kartaltshrinktime) #define SHRINKSPEEDBOOST CV_Get(&cv_kartstacking_altshrink_speedboost) #define SHRINKACCELBOOST CV_Get(&cv_kartstacking_altshrink_accelboost) +#define SHRINKHANDLEBOOST CV_Get(&cv_kartstacking_altshrink_handleboost) #define SHRINKSTACKABLE CV_Get(&cv_kartstacking_altshrink_stackable) #define STARTSPEEDBOOST CV_Get(&cv_kartstacking_start_speedboost) #define STARTACCELBOOST CV_Get(&cv_kartstacking_start_accelboost) +#define STARTHANDLEBOOST CV_Get(&cv_kartstacking_start_handleboost) #define STARTSTACKABLE CV_Get(&cv_kartstacking_start_stackable) #define WALLTRANSFERSPEEDBOOST CV_Get(&cv_kartstacking_walltransfer_speedboost) #define WALLTRANSFERACCELBOOST CV_Get(&cv_kartstacking_walltransfer_accelboost) +#define WALLTRANSFERHANDLEBOOST CV_Get(&cv_kartstacking_walltransfer_handleboost) #define WALLTRANSFERSTACKABLE CV_Get(&cv_kartstacking_walltransfer_stackable) #define DRIFTSPEEDBOOST CV_Get(&cv_kartstacking_drift_speedboost) #define DRIFTACCELBOOST CV_Get(&cv_kartstacking_drift_accelboost) +#define DRIFTHANDLEBOOST CV_Get(&cv_kartstacking_drift_handleboost) #define DRIFTSTACKABLE CV_Get(&cv_kartstacking_drift_stackable) #define RINGSPEEDBOOST CV_Get(&cv_kartstacking_ring_speedboost) #define RINGACCELBOOST CV_Get(&cv_kartstacking_ring_accelboost) +#define RINGHANDLEBOOST CV_Get(&cv_kartstacking_ring_handleboost) #define RINGSTACKABLE CV_Get(&cv_kartstacking_ring_stackable) #define SLOPEDECAY CV_Get(&cv_kartstacking_slope_decay) @@ -371,7 +382,7 @@ boolean K_UsingPatchedMap(void); INT32 K_CheckpointThreshold(boolean roundup); fixed_t K_BoostRescale(fixed_t value,fixed_t oldmin,fixed_t oldmax,fixed_t newmin,fixed_t newmax); -void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, boolean stack, boolean visible); +void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, fixed_t handleboost, boolean stack, boolean visible); void K_ClearBoost(player_t *player); boolean K_NotFreePlay(void); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 0d7bd43a2..5d3b23003 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4423,13 +4423,14 @@ static int lib_kDoBoost(lua_State *L) player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); fixed_t speedboost = luaL_checkfixed(L, 2); fixed_t accelboost = luaL_checkfixed(L, 3); - boolean stacking = lua_optboolean(L, 4); - boolean visible = lua_isnoneornil(L, 5) ? true : luaL_checkboolean(L, 5); + fixed_t handleboost = luaL_checkfixed(L, 4); + boolean stacking = lua_optboolean(L, 5); + boolean visible = lua_isnoneornil(L, 6) ? true : luaL_checkboolean(L, 6); //HUDSAFE if (!player) return LUA_ErrInvalid(L, "player_t"); - K_DoBoost(player, speedboost, accelboost, stacking, visible); + K_DoBoost(player, speedboost, accelboost, handleboost, stacking, visible); return 0; } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 0d00a7e1b..966535d86 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -2920,6 +2920,7 @@ enum boostinfo boostinfo_stackspeedboost = 0, boostinfo_nonstackspeedboost, boostinfo_accelboost, + boostinfo_handleboost, boostinfo_grade, }; @@ -2927,6 +2928,7 @@ static const char *const boostinfo_opt[] = { "stackspeedboost", "nonstackspeedboost", "accelboost", + "handleboost", "grade", NULL, }; @@ -2950,6 +2952,9 @@ static int boostinfo_get(lua_State *L) case boostinfo_accelboost: lua_pushfixed(L, boostinfo->accelboost); break; + case boostinfo_handleboost: + lua_pushfixed(L, boostinfo->handleboost); + break; case boostinfo_grade: lua_pushinteger(L, boostinfo->grade); break; @@ -2984,6 +2989,9 @@ static int boostinfo_set(lua_State *L) case boostinfo_accelboost: boostinfo->accelboost = luaL_checkfixed(L, 3); break; + case boostinfo_handleboost: + boostinfo->handleboost = luaL_checkfixed(L, 3); + break; case boostinfo_grade: boostinfo->grade = (UINT8)luaL_checkinteger(L, 3); break; diff --git a/src/p_saveg.c b/src/p_saveg.c index a88418a5d..315689b5c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -639,6 +639,7 @@ static void P_NetSyncPlayers(savebuffer_t *save) SYNC(players[i].boostinfo.stackspeedboost); SYNC(players[i].boostinfo.nonstackspeedboost); SYNC(players[i].boostinfo.accelboost); + SYNC(players[i].boostinfo.handleboost); SYNC(players[i].boostinfo.grade); SYNC(players[i].tripwireState);