diff --git a/src/k_kart.c b/src/k_kart.c index 7bd45c029..082f4bf90 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3415,7 +3415,7 @@ static angle_t K_TumbleSlope(mobj_t *mobj, angle_t pitch, angle_t roll) return FixedMul(pitch, pitchMul) + FixedMul(roll, rollMul); } -#define STEEP_VAL (ANG60) +#define STEEP_VAL (ANGLE_45 - ANGLE_11hh) // (ANG60) void K_CheckSlopeTumble(player_t *player, angle_t oldPitch, angle_t oldRoll) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 953d641c0..e92a98639 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2808,6 +2808,47 @@ void P_PlayerZMovement(mobj_t *mo) mo->eflags &= ~MFE_JUSTHITFLOOR; P_CheckGravity(mo, true); } + + // Even out pitch & roll slowly over time when falling. + // Helps give OpenGL models a bit of the tumble tell. + if (P_MobjFlip(mo) * mo->momz < 0) + { + const angle_t evenSpeed = (ANG1 << 1) / 3; // 0.66 degrees + INT32 pitchDelta = AngleDeltaSigned(mo->pitch, 0); + INT32 rollDelta = AngleDeltaSigned(mo->roll, 0); + + if (abs(pitchDelta) <= evenSpeed) + { + mo->pitch = 0; + } + else + { + if (pitchDelta > 0) + { + mo->pitch -= evenSpeed; + } + else + { + mo->pitch += evenSpeed; + } + } + + if (abs(rollDelta) <= evenSpeed) + { + mo->roll = 0; + } + else + { + if (rollDelta > 0) + { + mo->roll -= evenSpeed; + } + else + { + mo->roll += evenSpeed; + } + } + } } if (((mo->eflags & MFE_VERTICALFLIP && mo->z < mo->floorz) || (!(mo->eflags & MFE_VERTICALFLIP) && mo->z + mo->height > mo->ceilingz))