use a nicer physical model for kart tilt gravity

also can remove the momentum cap with this
This commit is contained in:
minenice55 2026-04-27 14:34:44 -04:00
parent 5b714e9ccf
commit 3fbc6dd0df
2 changed files with 19 additions and 18 deletions

View file

@ -730,11 +730,13 @@ static inline BlockItReturn_t PIT_AttractionShieldAttack(mobj_t *thing)
return BMIT_CONTINUE; return BMIT_CONTINUE;
} }
#if 0
if (P_CheckSight(lightningSource, thing) == false) if (P_CheckSight(lightningSource, thing) == false)
{ {
// Not in sight // Not in sight
return BMIT_CONTINUE; return BMIT_CONTINUE;
} }
#endif
if (thing->type == MT_SPB) // If you destroy a SPB, you don't get the luxury of a cooldown. if (thing->type == MT_SPB) // If you destroy a SPB, you don't get the luxury of a cooldown.
{ {

View file

@ -9477,7 +9477,7 @@ static void K_HandleAirDriftDrag(player_t *player, boolean onground)
// no float-to-fixed here because this is in the deterministic path // no float-to-fixed here because this is in the deterministic path
#define FIXEDRADTODEG (3754879) //57.2958 #define FIXEDRADTODEG (3754879) //57.2958
#define PLAYERTILTCAP (90*FRACUNIT) #define PLAYERTILTCAP (90*FRACUNIT)
#define PLAYERTILTMOMENTUMCAP (8*M_PI_FIXED) #define PLAYERTILTMOMENTUMCAP (12*M_PI_FIXED)
/// @brief simulates applying a torque by applying a force at an offset from the player's centre, is a purely visual effect /// @brief simulates applying a torque by applying a force at an offset from the player's centre, is a purely visual effect
/// @param player player to apply angular momentum to /// @param player player to apply angular momentum to
@ -9503,46 +9503,45 @@ static void K_HandleKartTilt(player_t *player)
{ {
SINT8 startsign = intsign(player->karttilt); SINT8 startsign = intsign(player->karttilt);
fixed_t lineargravity = P_GetMobjGravity(player->mo); fixed_t lineargravity = P_GetMobjGravity(player->mo);
fixed_t angulargravity = 0; fixed_t angulargravity = abs(lineargravity) * (P_IsObjectOnGround(player->mo) ? 12 : 3);
fixed_t angaccelgravity = 0; fixed_t angaccelgravity = 0;
fixed_t tiltfactor = abs(FSIN(FixedAngle(CLAMP(player->karttilt, -89*FRACUNIT, 89*FRACUNIT))));
if (player->karttilt == 0 && player->karttiltmomentum == 0) if (player->karttilt == 0 && player->karttiltmomentum == 0)
{ {
return; return;
} }
angulargravity = abs(lineargravity) * (P_IsObjectOnGround(player->mo) ? 12 : 5); // w = sqrt(3*g*sin(a) / L)
// O = (linear velocity) / (distance from CoM) angaccelgravity = FixedSqrt(FixedDiv(FixedMul(3 * angulargravity, tiltfactor), 2 * player->mo->radius));
angaccelgravity = FixedDiv(angulargravity, abs(FixedMul(player->mo->radius, FRACUNIT + abs(FSIN(FixedAngle(player->karttilt))))));
player->karttiltmomentum += angaccelgravity * -intsign(player->karttilt); player->karttiltmomentum += angaccelgravity * -intsign(player->karttilt);
if (abs(player->karttiltmomentum) >= PLAYERTILTMOMENTUMCAP) // if (abs(player->karttiltmomentum) >= PLAYERTILTMOMENTUMCAP)
{ // {
player->karttiltmomentum = PLAYERTILTMOMENTUMCAP * intsign(player->karttiltmomentum); // player->karttiltmomentum = PLAYERTILTMOMENTUMCAP * intsign(player->karttiltmomentum);
} // }
player->karttilt = CLAMP(player->karttilt + FixedMul(player->karttiltmomentum, FIXEDRADTODEG)/TICRATE, -PLAYERTILTCAP + 1, PLAYERTILTCAP - 1); player->karttilt = CLAMP(player->karttilt + FixedMul(player->karttiltmomentum, FIXEDRADTODEG)/TICRATE, -PLAYERTILTCAP + 1, PLAYERTILTCAP - 1);
// angular drag // angular drag
if (player->mo->eflags & MFE_UNDERWATER) if (player->mo->eflags & MFE_UNDERWATER)
{ {
player->karttiltmomentum = FixedMul(player->karttiltmomentum, 80*FRACUNIT/100); player->karttiltmomentum = FixedMul(player->karttiltmomentum, 90*FRACUNIT/100);
} }
else else
{ {
player->karttiltmomentum = FixedMul(player->karttiltmomentum, 95*FRACUNIT/100); player->karttiltmomentum = FixedMul(player->karttiltmomentum, 98*FRACUNIT/100);
} }
// CONS_Printf("angulargravity: %4.3f\n", FixedToFloat(angulargravity));
// CONS_Printf("angaccelgravity: %4.3f\n", FixedToFloat(angaccelgravity)); // CONS_Printf("angaccelgravity: %4.3f\n", FixedToFloat(angaccelgravity));
// CONS_Printf("tilt angle: %4.3f\n", FixedToFloat(player->karttilt)); // CONS_Printf("tilt angle: %4.3f\n", FixedToFloat(player->karttilt));
// CONS_Printf("tilt angle momentum (rad/s): %4.3f\n", FixedToFloat(player->karttiltmomentum)); // CONS_Printf("tilt angle momentum (rad/s): %4.3f\n", FixedToFloat(player->karttiltmomentum));
// CONS_Printf("tilt angle momentum (deg/s): %4.3f\n", FixedToFloat(player->karttiltmomentum) * (M_PI/180.0));
if ((player->karttilt < 0 && startsign > 0) || if ((player->karttilt < 0 && startsign > 0) ||
(player->karttilt > 0 && startsign < 0)) (player->karttilt > 0 && startsign < 0))
{ {
player->karttiltmomentum = abs(75*player->karttiltmomentum/100) * intsign(player->karttilt); player->karttiltmomentum = abs((P_IsObjectOnGround(player->mo) ? 33 : 75)*player->karttiltmomentum/100) * intsign(player->karttilt);
player->karttiltmomentum /= 2;
if (abs(player->karttiltmomentum) < FRACUNIT/2) if (abs(player->karttiltmomentum) < FRACUNIT/2)
{ {
player->karttiltmomentum = 0; player->karttiltmomentum = 0;
@ -12101,11 +12100,11 @@ void K_KartPlayerBumpyRoad(player_t *player)
if (player->speed > 4*mapobjectscale && abs(player->karttilt) < FRACUNIT/4) if (player->speed > 4*mapobjectscale && abs(player->karttilt) < FRACUNIT/4)
{ {
fixed_t baseimpulse; fixed_t baseimpulse;
fixed_t rate = CLAMP(FixedDiv(player->speed, K_GetKartSpeed(player, false, false)), 8*FRACUNIT/10, 11*FRACUNIT/10); fixed_t rate = CLAMP(FixedDiv(player->speed, K_GetKartSpeed(player, false, false)), 8*FRACUNIT/10, FRACUNIT);
player->bumpyroadside = (player->bumpyroadside ? -player->bumpyroadside : 1); player->bumpyroadside = (player->bumpyroadside ? -player->bumpyroadside : 1);
baseimpulse = FixedMul(4*mapobjectscale * player->bumpyroadside, rate);
player->karttilt = FixedMul((3*FRACUNIT/2) * player->bumpyroadside, rate); player->karttilt = FixedMul((3*FRACUNIT/2) * player->bumpyroadside, rate);
baseimpulse = (mapobjectscale) * -player->bumpyroadside;
K_AddTiltImpulse(player, player->mo->height/2, baseimpulse); K_AddTiltImpulse(player, player->mo->height/2, baseimpulse);
if (P_IsDisplayPlayer(player)) if (P_IsDisplayPlayer(player))