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 aizdrifttilt;
|
||||||
INT32 aizdriftturn;
|
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
|
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
|
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;
|
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);
|
countersteer = FixedMul(countersteer, 3*FRACUNIT/2);
|
||||||
}
|
}
|
||||||
|
|
@ -7672,7 +7672,11 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
||||||
turnfixed = FixedMul(turnfixed, FRACUNIT + player->handleboost);
|
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);
|
turnfixed = FixedMul(turnfixed, 3*FRACUNIT/2);
|
||||||
}
|
}
|
||||||
|
|
@ -7683,6 +7687,19 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
||||||
return (turnfixed / FRACUNIT);
|
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)
|
INT32 K_GetKartDriftSparkValue(player_t *player)
|
||||||
{
|
{
|
||||||
return (26*4 + player->kartspeed*2 + (9 - player->kartweight))*8;
|
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
|
// Water gets ice physics too
|
||||||
if (player->mo->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))
|
if (player->mo->eflags & MFE_TOUCHWATER)
|
||||||
{
|
{
|
||||||
player->mo->friction += 614;
|
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);
|
boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y);
|
||||||
void K_UpdateSteeringValue(player_t *player, INT16 destSteering);
|
void K_UpdateSteeringValue(player_t *player, INT16 destSteering);
|
||||||
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
|
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
|
||||||
|
INT32 K_GetUnderwaterTurnAdjust(player_t *player);
|
||||||
INT32 K_GetKartDriftSparkValue(player_t *player);
|
INT32 K_GetKartDriftSparkValue(player_t *player);
|
||||||
INT32 K_StairJankFlip(INT32 value);
|
INT32 K_StairJankFlip(INT32 value);
|
||||||
INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage);
|
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].aizdrifttilt);
|
||||||
WRITEINT32(save_p, players[i].aizdriftturn);
|
WRITEINT32(save_p, players[i].aizdriftturn);
|
||||||
|
|
||||||
|
WRITEINT32(save_p, players[i].underwatertilt);
|
||||||
|
|
||||||
WRITEFIXED(save_p, players[i].offroad);
|
WRITEFIXED(save_p, players[i].offroad);
|
||||||
WRITEUINT8(save_p, players[i].waterskip);
|
WRITEUINT8(save_p, players[i].waterskip);
|
||||||
|
|
||||||
|
|
@ -495,6 +497,8 @@ static void P_NetUnArchivePlayers(void)
|
||||||
players[i].aizdrifttilt = READINT32(save_p);
|
players[i].aizdrifttilt = READINT32(save_p);
|
||||||
players[i].aizdriftturn = READINT32(save_p);
|
players[i].aizdriftturn = READINT32(save_p);
|
||||||
|
|
||||||
|
players[i].underwatertilt = READINT32(save_p);
|
||||||
|
|
||||||
players[i].offroad = READFIXED(save_p);
|
players[i].offroad = READFIXED(save_p);
|
||||||
players[i].waterskip = READUINT8(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...
|
if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration...
|
||||||
movepushforward = FixedMul(movepushforward, player->mo->movefactor);
|
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.x += P_ReturnThrustX(player->mo, movepushangle, movepushforward);
|
||||||
totalthrust.y += P_ReturnThrustY(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)
|
else if (player->drift != 0)
|
||||||
{
|
{
|
||||||
INT32 a = (ANGLE_45 / 5) * player->drift;
|
INT32 a = (ANGLE_45 / 5) * player->drift;
|
||||||
|
|
||||||
|
if (player->mo->eflags & MFE_UNDERWATER)
|
||||||
|
a /= 2;
|
||||||
|
|
||||||
player->drawangle += a;
|
player->drawangle += a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,11 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer)
|
||||||
|
|
||||||
angle_t rollAngle = 0;
|
angle_t rollAngle = 0;
|
||||||
|
|
||||||
if (sliptideLift)
|
if (player->mo->eflags & MFE_UNDERWATER)
|
||||||
|
{
|
||||||
|
rollAngle -= player->underwatertilt;
|
||||||
|
}
|
||||||
|
else if (sliptideLift)
|
||||||
{
|
{
|
||||||
/* (from side) tilt downward if turning
|
/* (from side) tilt downward if turning
|
||||||
toward camera, upward if away. */
|
toward camera, upward if away. */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue