From 0beaae5f55567430f39243c79695b1fcf3e37551 Mon Sep 17 00:00:00 2001 From: minenice55 Date: Tue, 27 Jan 2026 02:07:47 -0500 Subject: [PATCH] start spindash/ssmt --- src/d_netcmd.c | 4 ++++ src/d_netcmd.h | 4 ++++ src/d_player.h | 7 ++++++- src/k_kart.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/k_kart.h | 4 ++++ src/p_inter.c | 2 ++ 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1c00dac5e..ea3f00b28 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -549,6 +549,10 @@ consvar_t cv_kartstacking_ring_accelboost = CVAR_INIT ("vanillaboost_ring_accelb 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_ssmt_speedboost = CVAR_INIT ("vanillaboost_ssmt_speedboost", "0.1", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_ssmt_accelboost = CVAR_INIT ("vanillaboost_ssmt_accelboost", "65535.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_ssmt_handleboost = CVAR_INIT ("vanillaboost_ssmt_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, 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); consvar_t cv_kartstacking_slope_brakemod = CVAR_INIT ("vanillaboost_slope_brakemod", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_slope_speedboost_max = CVAR_INIT ("vanillaboost_slope_speedboost_max", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 92aa7df48..1123d3a71 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -167,6 +167,10 @@ 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_ssmt_speedboost; +extern consvar_t cv_kartstacking_ssmt_accelboost; +extern consvar_t cv_kartstacking_ssmt_handleboost; + extern consvar_t cv_kartstacking_slope_decay; extern consvar_t cv_kartstacking_slope_brakemod; extern consvar_t cv_kartstacking_slope_speedboost_max; diff --git a/src/d_player.h b/src/d_player.h index b6b7bb4e6..2ecf2cf8b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -103,8 +103,9 @@ typedef enum PF_SHRINKACTIVE = 1<<26, // "Shrink me" cheat is in effect. (Can't be disabled mid-race) PF_JUSTFLIPPED = 1<<27, // Just got flipped over, handle the bump interaction. + + PF_CHARGINGSSMT = 1<<28, // Player was charging SSMT last tick - // up to 1<<28 is free PF_USEDOWN = 1<<29, // For lua compat, don't use! PF_ATTACKDOWN = 1<<30, // For lua compat, don't use! PF_SLIDING = 1<<31, // For lua compat, don't use! @@ -598,6 +599,9 @@ struct player_t // Potentially influenced by player lag. tic_t driftdelay; + tic_t ssmtcharge; // Time spent charging SSMT + UINT16 ssmtboost; // SSMT boost timer (weak boost that ignores offroad) + fixed_t spinoutrot; // When a player spins out, this value increments modulus 360. SINT8 aizdriftstrat; // (-1 to 1) - Let go of your drift while boosting? Helper for the SICK STRATZ (sliptiding!) you have just unlocked @@ -619,6 +623,7 @@ struct player_t fixed_t prevspeedboost; // Max speed boost value from the last frame fixed_t accelboost; // Boost value smoothing for acceleration fixed_t handleboost; // Boost value smoothing for handling + fixed_t forcedtopspeed; // Force this top speed while charging SSMT 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. UINT8 numsneakers; // Number of stacked sneakers diff --git a/src/k_kart.c b/src/k_kart.c index 22e880273..f65770105 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2832,6 +2832,11 @@ static void K_GetKartBoostPower(player_t *player) K_DoBoost(player, RINGSPEEDBOOST, RINGACCELBOOST, RINGHANDLEBOOST, RINGSTACKABLE, RINGSTACKABLE); // + 20% top speed, + 400% acceleration } + if (player->ssmtboost) // Ring Boost + { + K_DoBoost(player, SSMTSPEEDBOOST, SSMTACCELBOOST, SSMTHANDLEBOOST, false, true); // + 10% top speed, + ♾️% acceleration + } + if (player->slopeboost || player->slopeaccel) { K_DoBoost(player, player->slopeboost, player->slopeaccel, 0, SLOPESTACKABLE, false); // + ???% top speed, + 300% acceleration @@ -2964,6 +2969,9 @@ fixed_t K_GetKartSpeed(const player_t *player, boolean doboostpower, boolean dor boolean karmabomb = ((gametyperules & GTR_BUMPERS) && player->bumper <= 0); fixed_t finalspeed; + if (player->forcedtopspeed > 0) + return FixedMul(player->forcedtopspeed, player->mo->scale); + if (doboostpower && !player->pogospring && !P_IsObjectOnGround(player->mo) && (player->airdriftspeed == 0)) return (75*mapobjectscale); // air speed cap @@ -3093,7 +3101,7 @@ SINT8 K_GetForwardMove(const player_t *player) player->flipovertimer) // pw_introcam? { forwardmove = 0; - if (player->sneakertimer) + if (player->sneakertimer || player->ssmtboost) forwardmove = MAXPLMOVE; } @@ -7041,6 +7049,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Speed lines if (player->sneakertimer || player->ringboost || player->driftboost || player->startboost + || player->ssmtboost || player->walltransferboost || player->bubbleboost) { @@ -7239,6 +7248,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->realsneakertimer) player->realsneakertimer--; + if (player->ssmtboost) + player->ssmtboost--; + if (player->sneakertimer && player->wipeoutslow > 0 && player->wipeoutslow < wipeoutslowtime+1) player->wipeoutslow = wipeoutslowtime+1; @@ -9611,6 +9623,41 @@ static void K_KartSlipdash(player_t *player, boolean onground) } } +static void K_StandStillMiniTurbo(player_t *player, boolean onground) +{ + if (player->speed <= 8*player->mo->scale && onground) + { + if (player->cmd.buttons & BT_ACCELERATE|BT_BRAKE) + { + player->pflags |= PF_CHARGINGSSMT; + player->forcedtopspeed = 8*FRACUNIT; + player->ssmtcharge += 1; + K_SpawnDashDustRelease(player, true); + if (player->ssmtcharge >= 3*TICRATE/2) + { + K_SpawnBoostTrail(player); + } + + return; + } + else if (player->pflags & PF_CHARGINGSSMT) + { + player->pflags &= ~PF_CHARGINGSSMT; + player->forcedtopspeed = 0; + if (player->ssmtcharge >= 3*TICRATE/2) + { + player->ssmtboost = TICRATE; + } + player->ssmtcharge = 0; + + return; + } + } + player->pflags &= ~PF_CHARGINGSSMT; + player->forcedtopspeed = 0; + player->ssmtcharge = 0; +} + INT32 K_GetDriftAngleOffset(player_t *player) { INT32 a = 0; @@ -11058,10 +11105,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_KartSlipdash(player, onground); + K_StandStillMiniTurbo(player, onground); + // Quick Turning // You can't turn your kart when you're not moving. // So now it's time to burn some rubber! - if (player->speed < 2 && leveltime > starttime && player->cmd.buttons & BT_ACCELERATE && player->cmd.buttons & BT_BRAKE && player->cmd.turning != 0) + if (player->speed < 2 && leveltime > starttime && (player->cmd.buttons & BT_ACCELERATE|BT_BRAKE) && player->cmd.turning != 0) { if (leveltime % 8 == 0) S_StartSound(player->mo, sfx_s224); diff --git a/src/k_kart.h b/src/k_kart.h index 8eb01ef09..564ebec8e 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -163,6 +163,10 @@ extern vector3_t clusterpoint, clusterdtf; #define RINGHANDLEBOOST CV_Get(&cv_kartstacking_ring_handleboost) #define RINGSTACKABLE CV_Get(&cv_kartstacking_ring_stackable) +#define SSMTSPEEDBOOST CV_Get(&cv_kartstacking_ssmt_speedboost) +#define SSMTACCELBOOST CV_Get(&cv_kartstacking_ssmt_accelboost) +#define SSMTHANDLEBOOST CV_Get(&cv_kartstacking_ssmt_handleboost) + #define SLOPEDECAY CV_Get(&cv_kartstacking_slope_decay) #define SLOPEBRAKEMOD CV_Get(&cv_kartstacking_slope_brakemod) #define SLOPESPEEDBOOSTMAX CV_Get(&cv_kartstacking_slope_speedboost_max) diff --git a/src/p_inter.c b/src/p_inter.c index 7d9613a14..ce51ade36 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2337,6 +2337,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da } player->driftboost = 0; + player->ssmtboost = 0; + player->ssmtcharge = 0; player->airdriftspeed = 0; player->ringboost = 0; player->glanceDir = 0;