diff --git a/source/core/gameinput.cpp b/source/core/gameinput.cpp index 2ddb44958..8afad0fd2 100644 --- a/source/core/gameinput.cpp +++ b/source/core/gameinput.cpp @@ -65,7 +65,7 @@ static inline DAngle getscaledangle(const DAngle angle, const double scale, cons return (angle.Normalized180() * getTicrateScale(scale)) + DAngle::fromDeg(push); } -static bool scaletozero(DAngle& angle, const double scale, const double push = (7646143. / 110386328.)) +bool scaletozero(DAngle& angle, const double scale, const double push) { const auto sgn = angle.Sgn(); diff --git a/source/core/gameinput.h b/source/core/gameinput.h index e2416ad3c..ab079c880 100644 --- a/source/core/gameinput.h +++ b/source/core/gameinput.h @@ -174,3 +174,4 @@ extern GameInput gameInput; class FSerializer; FSerializer& Serialize(FSerializer& arc, const char* keyname, PlayerAngles& w, PlayerAngles* def); void processCrouchToggle(bool& toggle, ESyncBits& actions, const bool crouchable, const bool disabletoggle); +bool scaletozero(DAngle& angle, const double scale, const double push = (7646143. / 110386328.)); diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index adebc2656..5fae9d171 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -721,11 +721,11 @@ static unsigned outVehicleFlags(player_struct* p, ESyncBits& actions) // //--------------------------------------------------------------------------- -static void doVehicleTilting(player_struct* const p, const int turndir, const bool canTilt) +static void doVehicleTilting(player_struct* const p, const bool canTilt) { - constexpr auto amt = DAngle::fromBuild(1); p->oTiltStatus = p->TiltStatus; - p->TiltStatus = clamp(p->TiltStatus + (turndir && canTilt ? amt : -amt * p->TiltStatus.Sgn()), -amt, amt); + p->TiltStatus += DAngle::fromDeg(p->sync.avel * 0.375 * canTilt); + scaletozero(p->TiltStatus, 10.); } //--------------------------------------------------------------------------- @@ -958,7 +958,7 @@ static void onMotorcycle(int snum, ESyncBits &actions) auto pact = p->GetActor(); unsigned flags = outVehicleFlags(p, actions); - doVehicleTilting(p, Sgn(p->sync.avel) * Sgn(p->MotoSpeed), !p->on_ground || p->sync.avel); + doVehicleTilting(p, !p->on_ground || p->sync.avel); if (p->MotoSpeed < 0 || p->moto_underwater) p->MotoSpeed = 0; @@ -1054,7 +1054,7 @@ static void onBoat(int snum, ESyncBits &actions) p->MotoSpeed = 0; unsigned flags = outVehicleFlags(p, actions); - doVehicleTilting(p, Sgn(p->sync.avel), (p->MotoSpeed != 0 && (p->sync.avel || p->moto_drink)) || !p->NotOnWater); + doVehicleTilting(p, (p->MotoSpeed != 0 && (p->sync.avel || p->moto_drink)) || !p->NotOnWater); doVehicleSounds(p, pact, flags, 87, 88, 89, 90); if (!p->NotOnWater)