mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Update underwater physics
- Reduce steering effect and remove increased friction. - Strafe into turns and tilt the inside wheels up.
This commit is contained in:
parent
be34cd699b
commit
2a74ee07f1
6 changed files with 72 additions and 4 deletions
|
|
@ -394,6 +394,8 @@ typedef struct player_s
|
|||
INT32 aizdrifttilt;
|
||||
INT32 aizdriftturn;
|
||||
|
||||
INT32 underwatertilt;
|
||||
|
||||
fixed_t offroad; // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed
|
||||
UINT8 waterskip; // Water skipping counter
|
||||
|
||||
|
|
|
|||
23
src/k_kart.c
23
src/k_kart.c
|
|
@ -7565,7 +7565,7 @@ static INT16 K_GetKartDriftValue(player_t *player, fixed_t countersteer)
|
|||
basedrift += (basedrift / greasetics) * player->tiregrease;
|
||||
}
|
||||
|
||||
if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))
|
||||
if (player->mo->eflags & (MFE_TOUCHWATER))
|
||||
{
|
||||
countersteer = FixedMul(countersteer, 3*FRACUNIT/2);
|
||||
}
|
||||
|
|
@ -7672,7 +7672,11 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
|||
turnfixed = FixedMul(turnfixed, FRACUNIT + player->handleboost);
|
||||
}
|
||||
|
||||
if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))
|
||||
if (player->mo->eflags & MFE_UNDERWATER)
|
||||
{
|
||||
turnfixed /= 2;
|
||||
}
|
||||
else if (player->mo->eflags & MFE_TOUCHWATER)
|
||||
{
|
||||
turnfixed = FixedMul(turnfixed, 3*FRACUNIT/2);
|
||||
}
|
||||
|
|
@ -7683,6 +7687,19 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
|||
return (turnfixed / FRACUNIT);
|
||||
}
|
||||
|
||||
INT32 K_GetUnderwaterTurnAdjust(player_t *player)
|
||||
{
|
||||
if (player->mo->eflags & MFE_UNDERWATER)
|
||||
{
|
||||
INT32 steer = (K_GetKartTurnValue(player,
|
||||
player->steering) << TICCMD_REDUCE);
|
||||
return FixedMul(steer, 8 * FixedDiv(player->speed,
|
||||
2 * K_GetKartSpeed(player, false) / 3));
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 K_GetKartDriftSparkValue(player_t *player)
|
||||
{
|
||||
return (26*4 + player->kartspeed*2 + (9 - player->kartweight))*8;
|
||||
|
|
@ -8449,7 +8466,7 @@ void K_AdjustPlayerFriction(player_t *player)
|
|||
*/
|
||||
|
||||
// Water gets ice physics too
|
||||
if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))
|
||||
if (player->mo->eflags & MFE_TOUCHWATER)
|
||||
{
|
||||
player->mo->friction += 614;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ void K_UpdateDistanceFromFinishLine(player_t *const player);
|
|||
boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y);
|
||||
void K_UpdateSteeringValue(player_t *player, INT16 destSteering);
|
||||
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
|
||||
INT32 K_GetUnderwaterTurnAdjust(player_t *player);
|
||||
INT32 K_GetKartDriftSparkValue(player_t *player);
|
||||
INT32 K_StairJankFlip(INT32 value);
|
||||
INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage);
|
||||
|
|
|
|||
|
|
@ -239,6 +239,8 @@ static void P_NetArchivePlayers(void)
|
|||
WRITEINT32(save_p, players[i].aizdrifttilt);
|
||||
WRITEINT32(save_p, players[i].aizdriftturn);
|
||||
|
||||
WRITEINT32(save_p, players[i].underwatertilt);
|
||||
|
||||
WRITEFIXED(save_p, players[i].offroad);
|
||||
WRITEUINT8(save_p, players[i].waterskip);
|
||||
|
||||
|
|
@ -495,6 +497,8 @@ static void P_NetUnArchivePlayers(void)
|
|||
players[i].aizdrifttilt = READINT32(save_p);
|
||||
players[i].aizdriftturn = READINT32(save_p);
|
||||
|
||||
players[i].underwatertilt = READINT32(save_p);
|
||||
|
||||
players[i].offroad = READFIXED(save_p);
|
||||
players[i].waterskip = READUINT8(save_p);
|
||||
|
||||
|
|
|
|||
40
src/p_user.c
40
src/p_user.c
|
|
@ -1769,6 +1769,42 @@ static void P_3dMovement(player_t *player)
|
|||
if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration...
|
||||
movepushforward = FixedMul(movepushforward, player->mo->movefactor);
|
||||
|
||||
{
|
||||
INT32 a = K_GetUnderwaterTurnAdjust(player);
|
||||
INT32 adj = 0;
|
||||
|
||||
if (a)
|
||||
{
|
||||
adj = a / 4;
|
||||
|
||||
if (abs(player->underwatertilt + adj) > abs(a))
|
||||
adj = (a - player->underwatertilt);
|
||||
|
||||
if (abs(a) < abs(player->underwatertilt))
|
||||
adj = 0;
|
||||
|
||||
movepushangle += a;
|
||||
}
|
||||
|
||||
if (adj)
|
||||
{
|
||||
player->underwatertilt += adj;
|
||||
|
||||
if (abs(player->underwatertilt) > ANG30)
|
||||
{
|
||||
player->underwatertilt =
|
||||
player->underwatertilt > 0 ? ANG30
|
||||
: -(ANG30);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player->underwatertilt =
|
||||
FixedMul(player->underwatertilt,
|
||||
7*FRACUNIT/8);
|
||||
}
|
||||
}
|
||||
|
||||
totalthrust.x += P_ReturnThrustX(player->mo, movepushangle, movepushforward);
|
||||
totalthrust.y += P_ReturnThrustY(player->mo, movepushangle, movepushforward);
|
||||
}
|
||||
|
|
@ -2055,6 +2091,10 @@ void P_MovePlayer(player_t *player)
|
|||
else if (player->drift != 0)
|
||||
{
|
||||
INT32 a = (ANGLE_45 / 5) * player->drift;
|
||||
|
||||
if (player->mo->eflags & MFE_UNDERWATER)
|
||||
a /= 2;
|
||||
|
||||
player->drawangle += a;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,11 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer)
|
|||
|
||||
angle_t rollAngle = 0;
|
||||
|
||||
if (sliptideLift)
|
||||
if (player->mo->eflags & MFE_UNDERWATER)
|
||||
{
|
||||
rollAngle -= player->underwatertilt;
|
||||
}
|
||||
else if (sliptideLift)
|
||||
{
|
||||
/* (from side) tilt downward if turning
|
||||
toward camera, upward if away. */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue