reorder some logic, more effects and visual cues

This commit is contained in:
minenice55 2026-01-27 18:13:54 -05:00
parent d068c1dfc5
commit 21e1ebc0bc
4 changed files with 95 additions and 36 deletions

View file

@ -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);

View file

@ -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<<FRACBITS, mapobjectscale);
// horrible
if (player->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)
{

View file

@ -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)
{

View file

@ -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);