Improve accuracy of movement code even more

This commit is contained in:
NepDisk 2025-07-03 22:56:59 -04:00
parent e2edae253f
commit af6e43dcd8
4 changed files with 36 additions and 30 deletions

View file

@ -4097,6 +4097,26 @@ SINT8 K_GetForwardMove(player_t *player)
return forwardmove;
}
SINT8 K_GetSideMove(player_t *player)
{
SINT8 sidemove = player->cmd.sidemove;
if ((player->exiting || mapreset) ||
player->pflags & PF_STASIS ||
player->spinouttimer ||
player->flipovertimer) // pw_introcam?
{
sidemove = 0;
}
if (!player->pogospring)
{
sidemove = 0;
}
return sidemove;
}
fixed_t K_GetNewSpeed(player_t *player)
{
const fixed_t accelmax = 4000;
@ -4137,10 +4157,9 @@ fixed_t K_GetNewSpeed(player_t *player)
return finalspeed;
}
fixed_t K_3dKartMovement(player_t *player, boolean onground)
fixed_t K_3dKartMovement(player_t *player, boolean onground, SINT8 forwardmove)
{
fixed_t finalspeed = K_GetNewSpeed(player);
SINT8 forwardmove = K_GetForwardMove(player);
if (!onground) return 0; // If the player isn't on the ground, there is no change in speed

View file

@ -271,8 +271,9 @@ void K_UpdateShrinkCheat(player_t *player);
boolean K_KartKickstart(player_t *player);
UINT16 K_GetKartButtons(player_t *player);
SINT8 K_GetForwardMove(player_t *player);
SINT8 K_GetSideMove(player_t *player);
fixed_t K_GetNewSpeed(player_t *player);
fixed_t K_3dKartMovement(player_t *player, boolean onground);
fixed_t K_3dKartMovement(player_t *player, boolean onground, SINT8 fowardmove);
SINT8 K_Sliptiding(player_t *player);
fixed_t K_PlayerBaseFriction(player_t *player, fixed_t original);
void K_MoveKartPlayer(player_t *player, boolean onground);

View file

@ -4134,11 +4134,14 @@ static int lib_k3dKartMovement(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
boolean onground = lua_optboolean(L, 2);
SINT8 fowardmove = luaL_checkinteger(L, 3);
//HUDSAFE
if (!player)
return LUA_ErrInvalid(L, "player_t");
lua_pushinteger(L, K_3dKartMovement(player, onground));
if (lua_isnil(L, 3))
fowardmove = K_GetForwardMove(player);
lua_pushinteger(L, K_3dKartMovement(player, onground, fowardmove));
return 1;
}

View file

@ -1794,10 +1794,8 @@ static void P_3dMovement(player_t *player)
cmd = &player->cmd;
if (!player->pogospring)
cmd->sidemove = 0;
cmd->forwardmove = K_GetForwardMove(player);
cmd->sidemove = K_GetSideMove(player);
// Get the old momentum; this will be needed at the end of the function! -SH
oldMagnitude = R_PointToDist2(player->mo->momx - player->cmomx, player->mo->momy - player->cmomy, 0, 0);
@ -1814,6 +1812,7 @@ static void P_3dMovement(player_t *player)
{
movepushangle = player->mo->angle;
}
movepushsideangle = movepushangle-ANGLE_90;
// cmomx/cmomy stands for the conveyor belt speed.
@ -1825,9 +1824,7 @@ static void P_3dMovement(player_t *player)
}
else if (player->onconveyor == 4 && !P_IsObjectOnGround(player->mo)) // Actual conveyor belt
player->cmomx = player->cmomy = 0;
else if (player->onconveyor != 2 && player->onconveyor != 4
&& player->onconveyor != 1
)
else if (player->onconveyor != 2 && player->onconveyor != 4 && player->onconveyor != 1)
player->cmomx = player->cmomy = 0;
player->rmomx = player->mo->momx - player->cmomx;
@ -1845,34 +1842,20 @@ static void P_3dMovement(player_t *player)
dangle = InvAngle(dangle);
}
// anything else will leave both at 0, so no need to do anything else
//{ SRB2kart 220217 - Toaster Code for misplaced thrust
#if 0
if (!player->drift) // Not Drifting
{
angle_t difference = dangle/2;
boolean reverse = (dangle >= ANGLE_90);
if (dangleflip)
difference = InvAngle(difference);
if (reverse)
difference += ANGLE_180;
P_InstaThrust(player->mo, player->mo->angle + difference, player->speed);
}
#endif
//}
// When sliding, don't allow forward/back
if (player->carry & CR_SLIDING)
cmd->forwardmove = 0;
// Do not let the player control movement if not onground.
// SRB2Kart: pogo spring and speed bumps are supposed to control like you're on the ground
onground = (P_IsObjectOnGround(player->mo) || (player->pogospring));
player->aiming = cmd->aiming<<FRACBITS;
// Forward movement
if (!((player->exiting || mapreset) || (P_PlayerInPain(player) && !onground)))
{
movepushforward = K_3dKartMovement(player, onground);
movepushforward = K_3dKartMovement(player, onground, cmd->forwardmove);
// allow very small movement while in air for gameplay
if (!onground)