make null drift tilt "feel" influenced by momentum

This commit is contained in:
minenice55 2026-02-07 00:41:30 -05:00
parent d35c8c37d6
commit 3306c276a1
2 changed files with 48 additions and 8 deletions

View file

@ -93,7 +93,7 @@
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291
#define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b
#define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9
#define ASSET_HASH_MAIN_PK3 0xebb499f36118246b
#define ASSET_HASH_MAIN_PK3 0x2ededa5418cb2f0c
#define ASSET_HASH_MAPPATCH_PK3 0xbbc2c6a7a685da3a
#define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461
#ifdef USE_PATCH_FILE

View file

@ -1921,10 +1921,12 @@ void K_KartMoveAnimation(player_t *player)
if (onground && drift)
{
INT16 reversejitter = 0;
INT16 nullrolloffset = 0;
if ((player->jitterlegacy) && (!skincompat))
{
// Make RR characters imitate legacy jitters.
player->mo->rollingxoffset = ((player->driftelapsed & 1) * 2) * -intsign(drift);
reversejitter = ((player->driftelapsed & 1) * 2) * -intsign(drift);
}
else
{
@ -1936,6 +1938,15 @@ void K_KartMoveAnimation(player_t *player)
else if (turndir == 1)
spr2 += 1; // Outwards drift
}
if (abs(player->nulldrifttilt) > 0)
{
//todo: a way for skins(?) to define the tyre offset
nullrolloffset = intsign(drift) * ((36 * FINESINE(abs(player->nulldrifttilt)>>ANGLETOFINESHIFT))/FRACUNIT);
player->mo->rollingyoffset = ((18 * FINESINE(abs(player->nulldrifttilt)>>ANGLETOFINESHIFT))/FRACUNIT);
}
player->mo->rollingxoffset = reversejitter - nullrolloffset;
}
else if (glanceofs)
spr2 += glanceofs+1;
@ -4197,6 +4208,12 @@ static void K_SpawnDriftSparks(player_t *player)
for (i = 0; i < 2; i++)
{
fixed_t driftExtraScale = 0;
if (player->nulldrifttilt &&
((player->drift < 0 && (i & 1)) || (player->drift > 0 && !(i & 1))))
{
// when tilting during a null-drift don't spawn the sparks for the front tyre
continue;
}
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);
@ -9473,12 +9490,14 @@ static void K_KartDrift(player_t *player, boolean onground)
// Starting left drift
player->drift = 1;
player->pflags &= ~PF_DRIFTEND;
player->nulldrifttime = 0;
}
else if ((player->driftturnsnapshot < 0) && player->speed > minspeed && (player->pflags & PF_DRIFTINPUT) && (player->drift == 0 || (player->pflags & PF_DRIFTEND)))
{
// Starting right drift
player->drift = -1;
player->pflags &= ~PF_DRIFTEND;
player->nulldrifttime = 0;
}
else if (!(player->pflags & PF_DRIFTINPUT))
{
@ -9607,9 +9626,29 @@ static void K_KartDrift(player_t *player, boolean onground)
if (player->nulldrift)
{
if (abs(player->nulldrifttilt) < ANGLE_11hh)
if (player->nulldrifttime <= 3*TICRATE/4)
{
player->nulldrifttilt = (abs(player->nulldrifttilt) + (ANGLE_11hh / 8)) * player->nulldrift;
angle_t tilt;
fixed_t dot;
vector2_t fwd = {P_ReturnThrustX(player->mo, player->mo->angle, FRACUNIT), P_ReturnThrustY(player->mo, player->mo->angle, FRACUNIT)};
vector2_t mov = {player->mo->momx, player->mo->momy};
FV2_Normalize(&mov);
dot = FRACUNIT - abs(FV2_Dot(&fwd, &mov));
tilt = FixedAngle(FixedMul(AngleFixed(ANG20), dot));
if (abs(player->nulldrifttilt) < tilt)
{
player->nulldrifttilt = (abs(player->nulldrifttilt) + tilt/10) * -player->nulldrift;
}
}
else if (player->nulldrifttilt)
{
player->nulldrifttilt -= (CLAMP(ANG20 - abs(player->nulldrifttilt), ANG1, abs(player->nulldrifttilt))/3) * intsign(player->nulldrifttilt);
if (abs(player->nulldrifttilt) < (ANGLE_11hh / 4))
{
player->nulldrifttilt = 0;
}
}
// Increment nulldrift timer.
@ -9618,11 +9657,9 @@ static void K_KartDrift(player_t *player, boolean onground)
// Let's have some faith that the driftspark thinker will set this value again
player->nulldrift = 0;
}
else
else if (player->nulldrifttilt)
{
player->nulldrifttime = 0;
player->nulldrifttilt -= player->nulldrifttilt / 4;
player->nulldrifttilt -= (CLAMP(ANG20 - abs(player->nulldrifttilt), ANG1, abs(player->nulldrifttilt))/3) * intsign(player->nulldrifttilt);
if (abs(player->nulldrifttilt) < (ANGLE_11hh / 4))
{
player->nulldrifttilt = 0;
@ -9650,7 +9687,10 @@ static void K_KartDrift(player_t *player, boolean onground)
player->pflags |= PF_BRAKEDRIFT;
}
else
{
player->pflags &= ~PF_BRAKEDRIFT;
player->nulldrifttime = 0;
}
}
static void K_KartSlipdash(player_t *player, boolean onground)