Merge branch 'softer-stumble' into 'master'

Smoothlanding leniency (resolves #602)

Closes #602

See merge request KartKrew/Kart!1428
This commit is contained in:
James R 2023-08-28 07:49:20 +00:00
commit b8b286b177
6 changed files with 34 additions and 11 deletions

View file

@ -3921,7 +3921,7 @@ void K_StumblePlayer(player_t *player)
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT); P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
// Reset slope. // Reset slope.
player->mo->pitch = player->mo->roll = 0; P_ResetPitchRoll(player->mo);
} }
boolean K_CheckStumble(player_t *player, angle_t oldPitch, angle_t oldRoll, boolean fromAir) boolean K_CheckStumble(player_t *player, angle_t oldPitch, angle_t oldRoll, boolean fromAir)
@ -3939,6 +3939,14 @@ boolean K_CheckStumble(player_t *player, angle_t oldPitch, angle_t oldRoll, bool
return false; return false;
} }
if (fromAir && player->airtime < STUMBLE_AIRTIME
&& player->airtime > 1) // ACHTUNG HACK, sorry. Ground-to-ground transitions sometimes have 1-tic airtime because collision blows
{
// Short airtime with no reaction window, probably a track traversal setpiece.
// Don't punish for these.
return false;
}
if ((player->mo->pitch == oldPitch) if ((player->mo->pitch == oldPitch)
&& (player->mo->roll == oldRoll)) && (player->mo->roll == oldRoll))
{ {
@ -4102,6 +4110,9 @@ void K_UpdateStumbleIndicator(player_t *player)
mobj->renderflags &= ~RF_HORIZONTALFLIP; mobj->renderflags &= ~RF_HORIZONTALFLIP;
} }
if (air && player->airtime < STUMBLE_AIRTIME)
delta = 0;
steepRange = ANGLE_90 - steepVal; steepRange = ANGLE_90 - steepVal;
delta = max(0, abs(delta) - ((signed)steepVal)); delta = max(0, abs(delta) - ((signed)steepVal));
trans = ((FixedDiv(AngleFixed(delta), AngleFixed(steepRange)) * (NUMTRANSMAPS - 2)) + (FRACUNIT/2)) / FRACUNIT; trans = ((FixedDiv(AngleFixed(delta), AngleFixed(steepRange)) * (NUMTRANSMAPS - 2)) + (FRACUNIT/2)) / FRACUNIT;
@ -4252,7 +4263,7 @@ static void K_HandleTumbleBounce(player_t *player)
player->tumbleHeight = 10; player->tumbleHeight = 10;
player->pflags |= PF_TUMBLELASTBOUNCE; player->pflags |= PF_TUMBLELASTBOUNCE;
player->mo->rollangle = 0; // p_user.c will stop rotating the player automatically player->mo->rollangle = 0; // p_user.c will stop rotating the player automatically
player->mo->pitch = player->mo->roll = 0; // Prevent Kodachrome Void infinite P_ResetPitchRoll(player->mo); // Prevent Kodachrome Void infinite
} }
} }
@ -6155,8 +6166,7 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
mo->momz = FixedDiv(mo->momz, FixedSqrt(3*FRACUNIT)); mo->momz = FixedDiv(mo->momz, FixedSqrt(3*FRACUNIT));
} }
mo->pitch = 0; P_ResetPitchRoll(mo);
mo->roll = 0;
if (sound) if (sound)
{ {
@ -10444,6 +10454,7 @@ static void K_KartSpindash(player_t *player)
// Update fastfall. // Update fastfall.
player->fastfall = player->mo->momz; player->fastfall = player->mo->momz;
player->spindash = 0; player->spindash = 0;
P_ResetPitchRoll(player->mo);
if (player->fastfallBase == 0) if (player->fastfallBase == 0)
{ {

View file

@ -40,8 +40,10 @@ Make sure this matches the actual number of states
#define RR_PROJECTILE_FUSE (8*TICRATE) #define RR_PROJECTILE_FUSE (8*TICRATE)
#define STUMBLE_STEEP_VAL ANG60 // 2023-08-26 +ang20 to Sal's OG values to make them friendlier - Tyron
#define STUMBLE_STEEP_VAL_AIR (ANG30 + ANG10) #define STUMBLE_STEEP_VAL (ANG60 + ANG20)
#define STUMBLE_STEEP_VAL_AIR (ANG30 + ANG10 + ANG20)
#define STUMBLE_AIRTIME TICRATE
#define MAXRINGVOLUME 255 #define MAXRINGVOLUME 255
#define MINRINGVOLUME 100 #define MINRINGVOLUME 100

View file

@ -161,6 +161,7 @@ static void DashRingLaunch(player_t *player, mobj_t *ring)
player->dashRingPushTics = DASHRING_PUSH_TICS; player->dashRingPushTics = DASHRING_PUSH_TICS;
player->mo->rollangle = 0; player->mo->rollangle = 0;
P_ResetPitchRoll(player->mo);
player->flashing = 0; player->flashing = 0;
player->fastfall = 0; player->fastfall = 0;
K_TumbleInterrupt(player); K_TumbleInterrupt(player);

View file

@ -569,6 +569,7 @@ void P_ExplodeMissile(mobj_t *mo);
void P_CheckGravity(mobj_t *mo, boolean affect); void P_CheckGravity(mobj_t *mo, boolean affect);
void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope); void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope);
void P_SetPitchRoll(mobj_t *mo, angle_t pitch, angle_t yaw); void P_SetPitchRoll(mobj_t *mo, angle_t pitch, angle_t yaw);
void P_ResetPitchRoll(mobj_t *mo);
fixed_t P_ScaleFromMap(fixed_t n, fixed_t scale); fixed_t P_ScaleFromMap(fixed_t n, fixed_t scale);
fixed_t P_GetMobjHead(const mobj_t *); fixed_t P_GetMobjHead(const mobj_t *);
fixed_t P_GetMobjFeet(const mobj_t *); fixed_t P_GetMobjFeet(const mobj_t *);

View file

@ -1333,7 +1333,7 @@ void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope)
} }
else else
{ {
mo->pitch = mo->roll = 0; P_ResetPitchRoll(mo);
} }
} }
@ -1348,6 +1348,15 @@ void P_SetPitchRoll(mobj_t *mo, angle_t pitch, angle_t yaw)
mo->pitch = FixedMul(pitch, FINECOSINE (yaw)); mo->pitch = FixedMul(pitch, FINECOSINE (yaw));
} }
//
// P_ResetPitchRoll
//
void P_ResetPitchRoll(mobj_t *mo)
{
mo->pitch = 0;
mo->roll = 0;
}
#define STOPSPEED (FRACUNIT) #define STOPSPEED (FRACUNIT)
// //
@ -7191,7 +7200,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
} }
case MT_FLOATINGITEM: case MT_FLOATINGITEM:
{ {
mobj->pitch = mobj->roll = 0; P_ResetPitchRoll(mobj);
if (mobj->flags & MF_NOCLIPTHING) if (mobj->flags & MF_NOCLIPTHING)
{ {
if (P_CheckDeathPitCollide(mobj)) if (P_CheckDeathPitCollide(mobj))

View file

@ -488,8 +488,7 @@ void P_ResetPlayer(player_t *player)
if (player->mo != NULL && P_MobjWasRemoved(player->mo) == false) if (player->mo != NULL && P_MobjWasRemoved(player->mo) == false)
{ {
player->mo->pitch = 0; P_ResetPitchRoll(player->mo);
player->mo->roll = 0;
} }
} }