From 21e1ebc0bca5b07f2d1481f1d86117704775da0c Mon Sep 17 00:00:00 2001 From: minenice55 Date: Tue, 27 Jan 2026 18:13:54 -0500 Subject: [PATCH] reorder some logic, more effects and visual cues --- src/d_netcmd.c | 2 +- src/k_kart.c | 121 ++++++++++++++++++++++++++++++++++++------------- src/p_mobj.c | 2 +- src/p_user.c | 6 +-- 4 files changed, 95 insertions(+), 36 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 2ec00e0cb..d5fe821de 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -550,7 +550,7 @@ consvar_t cv_kartstacking_ring_handleboost = CVAR_INIT ("vanillaboost_ring_handl 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", "10.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_ssmt_accelboost = CVAR_INIT ("vanillaboost_ssmt_accelboost", "25.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_ssmt_handleboost = CVAR_INIT ("vanillaboost_ssmt_handleboost", "0.25", 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); diff --git a/src/k_kart.c b/src/k_kart.c index f8b75534f..fad8513d2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9150,7 +9150,7 @@ UINT8 K_GetKartDriftSparkStageForValue(const player_t *player, INT32 value) } } -static void K_SpawnDriftEFX(player_t *player,SINT8 level) +static void K_SpawnDriftEFX(player_t *player, SINT8 level) { mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BOOSTFLAME); P_SetMobjState(overlay, S_DRIFTBOOSTFLAME); @@ -9285,6 +9285,10 @@ static void K_KartDrift(player_t *player, boolean onground) // This fixes this problem. if (player->pogospring == 2 && player->mo->scale > mapobjectscale) minspeed = FixedMul(10<pflags & PF_CHARGINGSSMT) + minspeed = (player->speed+1); // air thrust drag if (K_AirThrustActive()) @@ -9482,7 +9486,7 @@ static void K_KartDrift(player_t *player, boolean onground) // Stop drifting // experiment: wall transfers should allow zero speed // reasoning: when driving right into a half pipe face-on, there is no h-speed for the entire launch - if (player->walltransfered || player->dashRingPullTics || player->dashRingPushTics) + if ((player->walltransfered || player->dashRingPullTics || player->dashRingPushTics) && !(player->pflags & PF_CHARGINGSSMT)) { minspeed = 0; } @@ -9629,46 +9633,94 @@ static void K_KartSlipdash(player_t *player, boolean onground) } } +static boolean K_PlayerCanStartSsmt(player_t *player) +{ + return (player->speed <= 12*player->mo->scale && (!(player->pflags & PF_CHARGINGSSMT)) && + (player->cmd.buttons & BT_ACCELERATE) && (player->cmd.buttons & BT_BRAKE)); +} + +static boolean K_PlayerCanChargeSsmt(player_t *player) +{ + return (P_IsObjectOnGround(player->mo) && leveltime > starttime); +} + static void K_StandStillMiniTurbo(player_t *player, boolean onground) { - if (player->speed <= 12*player->mo->scale && onground && leveltime > starttime) + if (K_PlayerCanChargeSsmt(player)) { - if ((player->cmd.buttons & BT_ACCELERATE) && (player->cmd.buttons & BT_BRAKE)) + if (K_PlayerCanStartSsmt(player)) { player->pflags |= PF_CHARGINGSSMT; - player->forcedtopspeed = 12*FRACUNIT; - player->ssmtcharge += 1; - if (leveltime % 8 == 0) - { - K_SpawnDashDustRelease(player, true); - S_StartSound(player->mo, sfx_s224); - } - if (player->ssmtcharge >= 3*TICRATE/2) - { - K_SpawnBoostTrail(player); - } - - return; + S_StartSound(player->mo, sfx_cdfm20); } - else if (player->pflags & PF_CHARGINGSSMT) + if (player->pflags & PF_CHARGINGSSMT) { - player->pflags &= ~PF_CHARGINGSSMT; - player->forcedtopspeed = 0; - if (player->ssmtcharge >= 3*TICRATE/2) + if ((player->cmd.buttons & BT_ACCELERATE) && (player->cmd.buttons & BT_BRAKE)) { - player->outruntime = TICRATE/4; - player->ssmtboost = TICRATE/2; - player->tiregrease = TICRATE; - S_StartSound(player->mo, sfx_s23c); - } - player->ssmtcharge = 0; + player->ssmtcharge += 1; + player->forcedtopspeed = FixedMul(K_GetKartSpeedFromStat(player->kartspeed, false) + 2, player->mo->scale) / 3; + K_SpawnWipeoutTrail(player->mo, (player->ssmtcharge < 3*TICRATE/2)); - return; + if (leveltime % 6 == 0) + { + if (player->ssmtcharge < 3*TICRATE/2) + { + S_StartSound(player->mo, sfx_s225); + } + } + if (player->ssmtcharge >= 3*TICRATE/2) + { + if (player->ssmtcharge == 3*TICRATE/2) + { + S_StartSound(player->mo, sfx_s3ka2); + } + if (leveltime & 1) + { + fixed_t newx; + fixed_t newy; + mobj_t *spark; + angle_t travelangle; + travelangle = player->mo->angle; + for (INT32 i = 0; i < 2; i++) + { + newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); + newy = player->mo->y + P_ReturnThrustY(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); + spark = P_SpawnMobj(newx, newy, player->mo->z, MT_DRIFTSPARK); + spark->momx = player->mo->momx/2; + spark->momy = player->mo->momy/2; + + P_SetTarget(&spark->target, player->mo); + spark->angle = travelangle; + spark->color = SKINCOLOR_WHITE; + + P_SetMobjState(spark, S_DRIFTSPARK_A1); + K_MatchGenericExtraFlags(spark, player->mo); + } + } + } + } + else + { + player->pflags &= ~PF_CHARGINGSSMT; + player->forcedtopspeed = 0; + if (player->ssmtcharge >= 3*TICRATE/2) + { + player->outruntime = TICRATE/3; + player->ssmtboost = TICRATE/2; + player->tiregrease = TICRATE; + S_StartSound(player->mo, sfx_s23c); + K_SpawnDashDustRelease(player, true); + } + player->ssmtcharge = 0; + } } } - player->pflags &= ~PF_CHARGINGSSMT; - player->forcedtopspeed = 0; - player->ssmtcharge = 0; + else + { + player->pflags &= ~PF_CHARGINGSSMT; + player->forcedtopspeed = 0; + player->ssmtcharge = 0; + } } INT32 K_GetDriftAngleOffset(player_t *player) @@ -10677,6 +10729,13 @@ static void K_AdjustPlayerFriction(player_t *player) player->mo->friction = prevfriction; + if (player->pflags & PF_CHARGINGSSMT) + { + player->mo->friction += 1280; + + K_RecalculateMovefactor(player->mo); + } + // Reduce friction after exiting a loop. if (player->tiregrease) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 2a35f9c72..49281650d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8923,7 +8923,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (p) { - if (mobj->extravalue1) + if (mobj->extravalue1 > 0) { if (p->driftboost > mobj->movecount) { diff --git a/src/p_user.c b/src/p_user.c index fa1006847..086b19833 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2296,13 +2296,13 @@ void P_MovePlayer(player_t *player) // Drifting sound // Start looping the sound now. - if (leveltime % 50 == 0 && onground && player->drift != 0) + if (leveltime % 50 == 0 && onground && (player->drift != 0 || (player->pflags & PF_CHARGINGSSMT))) S_StartSound(player->mo, sfx_drift); // Leveltime being 50 might take a while at times. We'll start it up once, isntantly. - else if (!S_SoundPlaying(player->mo, sfx_drift) && onground && player->drift != 0) + else if (!S_SoundPlaying(player->mo, sfx_drift) && onground && (player->drift != 0 || (player->pflags & PF_CHARGINGSSMT))) S_StartSound(player->mo, sfx_drift); // Ok, we'll stop now. - else if (player->drift == 0 || !onground) + else if ((player->drift == 0 && !(player->pflags & PF_CHARGINGSSMT)) || (!onground)) S_StopSoundByID(player->mo, sfx_drift); K_MoveKartPlayer(player, onground);