I tore apart the entire code to try and fix braking friction and gave up, so now it's back to v1

My rewrites clean up a LOT of weird/misleading behavior anyway, so I'm gonna push this regardless. Someone else will have to figure out another way to reimplement braking friction though -- we can't use it as is because it prevents being able to bump people.
This commit is contained in:
Sally Coolatta 2020-07-28 03:34:39 -04:00
parent b08459cbee
commit 69b6ba2f18
9 changed files with 145 additions and 200 deletions

View file

@ -4315,7 +4315,6 @@ static void HandlePacketFromAwayNode(SINT8 node)
static boolean CheckForSpeedHacks(UINT8 p) static boolean CheckForSpeedHacks(UINT8 p)
{ {
if (netcmds[maketic%TICQUEUE][p].forwardmove > MAXPLMOVE || netcmds[maketic%TICQUEUE][p].forwardmove < -MAXPLMOVE if (netcmds[maketic%TICQUEUE][p].forwardmove > MAXPLMOVE || netcmds[maketic%TICQUEUE][p].forwardmove < -MAXPLMOVE
|| netcmds[maketic%TICQUEUE][p].sidemove > MAXPLMOVE || netcmds[maketic%TICQUEUE][p].sidemove < -MAXPLMOVE
|| netcmds[maketic%TICQUEUE][p].driftturn > KART_FULLTURN || netcmds[maketic%TICQUEUE][p].driftturn < -KART_FULLTURN) || netcmds[maketic%TICQUEUE][p].driftturn > KART_FULLTURN || netcmds[maketic%TICQUEUE][p].driftturn < -KART_FULLTURN)
{ {
XBOXSTATIC char buf[2]; XBOXSTATIC char buf[2];

View file

@ -60,7 +60,6 @@ typedef enum
typedef struct typedef struct
{ {
SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50) SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50)
SINT8 sidemove; // -MAXPLMOVE to MAXPLMOVE (50)
INT16 angleturn; // <<16 for angle delta - saved as 1 byte into demos INT16 angleturn; // <<16 for angle delta - saved as 1 byte into demos
INT16 aiming; // vertical aiming, see G_BuildTicCmd INT16 aiming; // vertical aiming, see G_BuildTicCmd
UINT16 buttons; UINT16 buttons;

View file

@ -1256,13 +1256,12 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 p)
INT32 localaiming[MAXSPLITSCREENPLAYERS]; INT32 localaiming[MAXSPLITSCREENPLAYERS];
angle_t localangle[MAXSPLITSCREENPLAYERS]; angle_t localangle[MAXSPLITSCREENPLAYERS];
static fixed_t forwardmove = 50<<FRACBITS>>16; static fixed_t forwardmove = MAXPLMOVE<<FRACBITS>>16;
static fixed_t sidemove[2] = {2<<FRACBITS>>16, 4<<FRACBITS>>16};
static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
{ {
INT32 laim, th, tspeed, forward, side, axis; //i INT32 laim, th, tspeed, forward, axis; //i
const INT32 speed = 1; const INT32 speed = 1;
// these ones used for multiple conditions // these ones used for multiple conditions
boolean turnleft, turnright, mouseaiming, analogjoystickmove, gamepadjoystickmove; boolean turnleft, turnright, mouseaiming, analogjoystickmove, gamepadjoystickmove;
@ -1373,7 +1372,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
turnright = turnright || (axis > 0); turnright = turnright || (axis > 0);
turnleft = turnleft || (axis < 0); turnleft = turnleft || (axis < 0);
} }
forward = side = 0; forward = 0;
// use two stage accelerative turning // use two stage accelerative turning
// on the keyboard and joystick // on the keyboard and joystick
@ -1394,13 +1393,11 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
{ {
cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed])); cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed]));
cmd->driftturn = (INT16)(cmd->driftturn - (angleturn[tspeed])); cmd->driftturn = (INT16)(cmd->driftturn - (angleturn[tspeed]));
side += sidemove[1];
} }
else if (turnleft && !(turnright)) else if (turnleft && !(turnright))
{ {
cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed])); cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed]));
cmd->driftturn = (INT16)(cmd->driftturn + (angleturn[tspeed])); cmd->driftturn = (INT16)(cmd->driftturn + (angleturn[tspeed]));
side -= sidemove[1];
} }
if (analogjoystickmove && axis != 0) if (analogjoystickmove && axis != 0)
@ -1408,7 +1405,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
// JOYAXISRANGE should be 1023 (divide by 1024) // JOYAXISRANGE should be 1023 (divide by 1024)
cmd->angleturn = (INT16)(cmd->angleturn - (((axis * angleturn[1]) >> 10))); // ANALOG! cmd->angleturn = (INT16)(cmd->angleturn - (((axis * angleturn[1]) >> 10))); // ANALOG!
cmd->driftturn = (INT16)(cmd->driftturn - (((axis * angleturn[1]) >> 10))); cmd->driftturn = (INT16)(cmd->driftturn - (((axis * angleturn[1]) >> 10)));
side += ((axis * sidemove[0]) >> 10);
} }
// Specator mouse turning // Specator mouse turning
@ -1445,7 +1441,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
{ {
cmd->buttons |= BT_ACCELERATE; cmd->buttons |= BT_ACCELERATE;
// JOYAXISRANGE is supposed to be 1023 (divide by 1024) // JOYAXISRANGE is supposed to be 1023 (divide by 1024)
forward += ((axis * forwardmove) >> 10)*2; forward += ((axis * forwardmove) >> 10);
} }
axis = JoyAxis(AXISBRAKE, ssplayer); axis = JoyAxis(AXISBRAKE, ssplayer);
@ -1555,21 +1551,12 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
mousex = mousey = mlooky = 0; mousex = mousey = mlooky = 0;
if (forward > MAXPLMOVE) cmd->forwardmove += (SINT8)forward;
forward = MAXPLMOVE;
else if (forward < -MAXPLMOVE)
forward = -MAXPLMOVE;
if (side > MAXPLMOVE) if (cmd->forwardmove > MAXPLMOVE)
side = MAXPLMOVE; cmd->forwardmove = MAXPLMOVE;
else if (side < -MAXPLMOVE) else if (cmd->forwardmove < -MAXPLMOVE)
side = -MAXPLMOVE; cmd->forwardmove = -MAXPLMOVE;
if (forward || side)
{
cmd->forwardmove = (SINT8)(cmd->forwardmove + forward);
cmd->sidemove = (SINT8)(cmd->sidemove + side);
}
//{ SRB2kart - Drift support //{ SRB2kart - Drift support
// Not grouped with the rest of turn stuff because it needs to know what buttons you're pressing for rubber-burn turn // Not grouped with the rest of turn stuff because it needs to know what buttons you're pressing for rubber-burn turn
@ -1619,7 +1606,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
#endif #endif
//Reset away view if a command is given. //Reset away view if a command is given.
if ((cmd->forwardmove || cmd->sidemove || cmd->buttons) if ((cmd->forwardmove || cmd->buttons)
&& !r_splitscreen && displayplayers[0] != consoleplayer && ssplayer == 1) && !r_splitscreen && displayplayers[0] != consoleplayer && ssplayer == 1)
displayplayers[0] = consoleplayer; displayplayers[0] = consoleplayer;
} }
@ -4771,13 +4758,12 @@ char *G_BuildMapTitle(INT32 mapnum)
// For demos // For demos
#define ZT_FWD 0x01 #define ZT_FWD 0x01
#define ZT_SIDE 0x02 #define ZT_ANGLE 0x02
#define ZT_ANGLE 0x04 #define ZT_BUTTONS 0x04
#define ZT_BUTTONS 0x08 #define ZT_AIMING 0x08
#define ZT_AIMING 0x10 #define ZT_DRIFT 0x10
#define ZT_DRIFT 0x20 #define ZT_LATENCY 0x20
#define ZT_LATENCY 0x40 #define DEMOMARKER 0x40 // demoend
#define DEMOMARKER 0x80 // demoend
UINT8 demo_extradata[MAXPLAYERS]; UINT8 demo_extradata[MAXPLAYERS];
UINT8 demo_writerng; // 0=no, 1=yes, 2=yes but on a timeout UINT8 demo_writerng; // 0=no, 1=yes, 2=yes but on a timeout
@ -4840,7 +4826,6 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n)
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
dest[i].forwardmove = src[i].forwardmove; dest[i].forwardmove = src[i].forwardmove;
dest[i].sidemove = src[i].sidemove;
dest[i].angleturn = SHORT(src[i].angleturn); dest[i].angleturn = SHORT(src[i].angleturn);
dest[i].aiming = (INT16)SHORT(src[i].aiming); dest[i].aiming = (INT16)SHORT(src[i].aiming);
dest[i].buttons = (UINT16)SHORT(src[i].buttons); dest[i].buttons = (UINT16)SHORT(src[i].buttons);
@ -5149,8 +5134,6 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
if (ziptic & ZT_FWD) if (ziptic & ZT_FWD)
oldcmd[playernum].forwardmove = READSINT8(demo_p); oldcmd[playernum].forwardmove = READSINT8(demo_p);
if (ziptic & ZT_SIDE)
oldcmd[playernum].sidemove = READSINT8(demo_p);
if (ziptic & ZT_ANGLE) if (ziptic & ZT_ANGLE)
oldcmd[playernum].angleturn = READINT16(demo_p); oldcmd[playernum].angleturn = READINT16(demo_p);
if (ziptic & ZT_BUTTONS) if (ziptic & ZT_BUTTONS)
@ -5190,13 +5173,6 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
ziptic |= ZT_FWD; ziptic |= ZT_FWD;
} }
if (cmd->sidemove != oldcmd[playernum].sidemove)
{
WRITEUINT8(demo_p,cmd->sidemove);
oldcmd[playernum].sidemove = cmd->sidemove;
ziptic |= ZT_SIDE;
}
if (cmd->angleturn != oldcmd[playernum].angleturn) if (cmd->angleturn != oldcmd[playernum].angleturn)
{ {
WRITEINT16(demo_p,cmd->angleturn); WRITEINT16(demo_p,cmd->angleturn);
@ -5710,8 +5686,6 @@ void G_GhostTicker(void)
if (ziptic & ZT_FWD) if (ziptic & ZT_FWD)
g->p++; g->p++;
if (ziptic & ZT_SIDE)
g->p++;
if (ziptic & ZT_ANGLE) if (ziptic & ZT_ANGLE)
g->p += 2; g->p += 2;
if (ziptic & ZT_BUTTONS) if (ziptic & ZT_BUTTONS)

View file

@ -474,6 +474,7 @@ fixed_t K_BotTopSpeedRubberband(player_t *player)
fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict) fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict)
{ {
fixed_t rubberband = K_BotRubberband(player) - FRACUNIT; fixed_t rubberband = K_BotRubberband(player) - FRACUNIT;
fixed_t newfrict;
if (rubberband <= 0) if (rubberband <= 0)
{ {
@ -481,8 +482,14 @@ fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict)
return frict; return frict;
} }
// 128 is a magic number that felt good in-game newfrict = FixedDiv(frict, FRACUNIT + (rubberband / 2));
return FixedDiv(frict, FRACUNIT + (rubberband / 2));
if (newfrict < 0)
newfrict = 0;
if (newfrict > FRACUNIT)
newfrict = FRACUNIT;
return newfrict;
} }
/*-------------------------------------------------- /*--------------------------------------------------
@ -698,11 +705,12 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd)
// Start boost handler // Start boost handler
if (leveltime <= starttime) if (leveltime <= starttime)
{ {
tic_t boosthold = starttime - TICRATE; tic_t length = (TICRATE/6);
tic_t boosthold = starttime - K_GetSpindashChargeTime(player);
cmd->buttons |= BT_ACCELERATE|BT_BRAKE; cmd->buttons |= BT_EBRAKEMASK;
boosthold -= (MAXBOTDIFFICULTY - player->botvars.difficulty); boosthold -= (MAXBOTDIFFICULTY - player->botvars.difficulty) * length;
if (leveltime >= boosthold) if (leveltime >= boosthold)
{ {
@ -743,7 +751,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd)
if (anglediff > 90) if (anglediff > 90)
{ {
// Wrong way! // Wrong way!
cmd->forwardmove = -25; cmd->forwardmove = -MAXPLMOVE;
cmd->buttons |= BT_BRAKE; cmd->buttons |= BT_BRAKE;
} }
else else
@ -777,7 +785,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd)
cmd->buttons |= BT_ACCELERATE; cmd->buttons |= BT_ACCELERATE;
// Full speed ahead! // Full speed ahead!
cmd->forwardmove = 50; cmd->forwardmove = MAXPLMOVE;
if (dirdist <= rad) if (dirdist <= rad)
{ {

View file

@ -1143,10 +1143,13 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
{ // Normalize distance to the sum of the two objects' radii, since in a perfect world that would be the distance at the point of collision... { // Normalize distance to the sum of the two objects' radii, since in a perfect world that would be the distance at the point of collision...
fixed_t dist = P_AproxDistance(distx, disty); fixed_t dist = P_AproxDistance(distx, disty);
fixed_t nx = FixedDiv(distx, dist); fixed_t nx, ny;
fixed_t ny = FixedDiv(disty, dist);
dist = dist ? dist : 1; dist = dist ? dist : 1;
nx = FixedDiv(distx, dist);
ny = FixedDiv(disty, dist);
distx = FixedMul(mobj1->radius+mobj2->radius, nx); distx = FixedMul(mobj1->radius+mobj2->radius, nx);
disty = FixedMul(mobj1->radius+mobj2->radius, ny); disty = FixedMul(mobj1->radius+mobj2->radius, ny);
@ -1222,6 +1225,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
mobj1->player->rmomx = mobj1->momx - mobj1->player->cmomx; mobj1->player->rmomx = mobj1->momx - mobj1->player->cmomx;
mobj1->player->rmomy = mobj1->momy - mobj1->player->cmomy; mobj1->player->rmomy = mobj1->momy - mobj1->player->cmomy;
mobj1->player->kartstuff[k_justbumped] = bumptime; mobj1->player->kartstuff[k_justbumped] = bumptime;
mobj1->player->kartstuff[k_spindash] = 0;
if (mobj1->player->kartstuff[k_spinouttimer]) if (mobj1->player->kartstuff[k_spinouttimer])
{ {
@ -1247,6 +1251,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
mobj2->player->rmomx = mobj2->momx - mobj2->player->cmomx; mobj2->player->rmomx = mobj2->momx - mobj2->player->cmomx;
mobj2->player->rmomy = mobj2->momy - mobj2->player->cmomy; mobj2->player->rmomy = mobj2->momy - mobj2->player->cmomy;
mobj2->player->kartstuff[k_justbumped] = bumptime; mobj2->player->kartstuff[k_justbumped] = bumptime;
mobj2->player->kartstuff[k_spindash] = 0;
if (mobj2->player->kartstuff[k_spinouttimer]) if (mobj2->player->kartstuff[k_spinouttimer])
{ {
@ -2042,14 +2047,14 @@ static fixed_t K_FlameShieldDashVar(INT32 val)
return (3*FRACUNIT/4) + (((val * FRACUNIT) / TICRATE) / 2); return (3*FRACUNIT/4) + (((val * FRACUNIT) / TICRATE) / 2);
} }
static tic_t K_GetSpindashChargeTime(player_t *player) tic_t K_GetSpindashChargeTime(player_t *player)
{ {
// more charge time for higher speed // more charge time for higher speed
// Tails = 2s, Mighty = 3s, Fang = 4s, Metal = 4s // Tails = 2s, Mighty = 3s, Fang = 4s, Metal = 4s
return (player->kartspeed + 4) * (TICRATE/3); return (player->kartspeed + 4) * (TICRATE/3);
} }
static fixed_t K_GetSpindashChargeSpeed(player_t *player) fixed_t K_GetSpindashChargeSpeed(player_t *player)
{ {
// more speed for higher weight & speed // more speed for higher weight & speed
// Tails = +6.25%, Fang = +20.31%, Mighty = +20.31%, Metal = +25% // Tails = +6.25%, Fang = +20.31%, Mighty = +20.31%, Metal = +25%
@ -2266,13 +2271,32 @@ UINT16 K_GetKartFlashing(player_t *player)
return tics; return tics;
} }
fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove) SINT8 K_GetForwardMove(player_t *player)
{
SINT8 forwardmove = player->cmd.forwardmove;
if ((player->pflags & PF_STASIS) || (player->pflags & PF_SLIDING) || player->kartstuff[k_spinouttimer] || K_PlayerEBrake(player))
{
return 0;
}
if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_spindashboost])
{
return MAXPLMOVE;
}
return forwardmove;
}
fixed_t K_3dKartMovement(player_t *player, boolean onground)
{ {
const fixed_t accelmax = 4000; const fixed_t accelmax = 4000;
const fixed_t p_speed = K_GetKartSpeed(player, true); const fixed_t p_speed = K_GetKartSpeed(player, true);
const fixed_t p_accel = K_GetKartAccel(player); const fixed_t p_accel = K_GetKartAccel(player);
fixed_t newspeed, oldspeed, finalspeed; fixed_t newspeed, oldspeed, finalspeed;
fixed_t movemul = FRACUNIT;
fixed_t orig = ORIG_FRICTION; fixed_t orig = ORIG_FRICTION;
SINT8 forwardmove = K_GetForwardMove(player);
if (!onground) return 0; // If the player isn't on the ground, there is no change in speed if (!onground) return 0; // If the player isn't on the ground, there is no change in speed
@ -2301,25 +2325,20 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove
} }
finalspeed = newspeed - oldspeed; finalspeed = newspeed - oldspeed;
movemul = abs(forwardmove * FRACUNIT) / 50;
// forwardmove is: // forwardmove is:
// 50 while accelerating, // 50 while accelerating,
// 0 with no gas, and // 0 with no gas, and
// -25 when only braking. // -25 when only braking.
if (forwardmove >= 0)
if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_spindashboost]) {
forwardmove = 50; finalspeed = FixedMul(finalspeed, movemul);
}
finalspeed *= forwardmove/25; else
finalspeed /= 2; {
finalspeed = FixedMul(-mapobjectscale/2, movemul);
if (forwardmove < 0 && finalspeed > mapobjectscale*2) }
return finalspeed/2;
else if (forwardmove < 0)
return -mapobjectscale/2;
if (finalspeed < 0)
finalspeed = 0;
return finalspeed; return finalspeed;
} }
@ -3579,7 +3598,7 @@ void K_DriftDustHandling(mobj_t *spawner)
if (spawner->player->speed < 5*spawner->scale) if (spawner->player->speed < 5*spawner->scale)
return; return;
if (spawner->player->cmd.forwardmove < 0) if (K_GetForwardMove(spawner->player) < 0)
playerangle += ANGLE_180; playerangle += ANGLE_180;
anglediff = abs((signed)(playerangle - R_PointToAngle2(0, 0, spawner->player->rmomx, spawner->player->rmomy))); anglediff = abs((signed)(playerangle - R_PointToAngle2(0, 0, spawner->player->rmomx, spawner->player->rmomy)));
@ -5161,10 +5180,10 @@ static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd)
if (player->respawn.state == RESPAWNST_DROP) // Dropdashing if (player->respawn.state == RESPAWNST_DROP) // Dropdashing
targetsnd = ((cmd->buttons & BT_ACCELERATE) ? 12 : 0); targetsnd = ((cmd->buttons & BT_ACCELERATE) ? 12 : 0);
else if (K_PlayerEBrake(player)) // Spindashing else if (K_PlayerEBrake(player) == true) // Spindashing
targetsnd = ((cmd->buttons & BT_DRIFT) ? 12 : 0); targetsnd = ((cmd->buttons & BT_DRIFT) ? 12 : 0);
else else
targetsnd = (((6*cmd->forwardmove)/25) + ((player->speed / mapobjectscale)/5))/2; targetsnd = (((6*K_GetForwardMove(player))/25) + ((player->speed / mapobjectscale)/5))/2;
if (targetsnd < 0) if (targetsnd < 0)
targetsnd = 0; targetsnd = 0;
@ -5809,7 +5828,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
} }
} }
if (player->kartstuff[k_justbumped]) if (player->kartstuff[k_justbumped] > 0)
player->kartstuff[k_justbumped]--; player->kartstuff[k_justbumped]--;
if (player->kartstuff[k_tiregrease]) if (player->kartstuff[k_tiregrease])
@ -6895,31 +6914,52 @@ static INT32 K_FlameShieldMax(player_t *player)
boolean K_PlayerEBrake(player_t *player) boolean K_PlayerEBrake(player_t *player)
{ {
return (player->cmd.buttons & BT_EBRAKEMASK) == BT_EBRAKEMASK return (player->cmd.buttons & BT_EBRAKEMASK) == BT_EBRAKEMASK
&& P_IsObjectOnGround(player->mo) && P_IsObjectOnGround(player->mo) == true
&& !player->kartstuff[k_drift] && player->kartstuff[k_drift] == 0
&& !player->kartstuff[k_spinouttimer] && player->kartstuff[k_spinouttimer] == 0
&& !player->kartstuff[k_boostcharge] && player->kartstuff[k_justbumped] == 0
&& !(player->kartstuff[k_spindash] < 0) && player->kartstuff[k_spindash] >= 0
&& !player->kartstuff[k_justbumped] && player->kartstuff[k_spindashboost] == 0
&& !player->kartstuff[k_spindashboost] && player->powers[pw_nocontrol] == 0;
&& !player->powers[pw_nocontrol];
} }
static void K_KartSpindash(player_t *player) static void K_KartSpindash(player_t *player)
{ {
const tic_t MAXCHARGETIME = K_GetSpindashChargeTime(player);
ticcmd_t *cmd = &player->cmd; ticcmd_t *cmd = &player->cmd;
if (!(K_PlayerEBrake(player) || (player->kartstuff[k_spindash] && !(cmd->buttons & BT_BRAKE)))) if (player->kartstuff[k_spindash] > 0 && (cmd->buttons & (BT_DRIFT|BT_BRAKE)) != (BT_DRIFT|BT_BRAKE))
{ {
if (player->kartstuff[k_spindash]) player->kartstuff[k_spindashspeed] = (player->kartstuff[k_spindash] * FRACUNIT) / MAXCHARGETIME;
player->kartstuff[k_spindash] = 0; player->kartstuff[k_spindashboost] = TICRATE;
if (!player->kartstuff[k_tiregrease])
{
UINT8 i;
for (i = 0; i < 2; i++)
{
mobj_t *grease;
grease = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_TIREGREASE);
P_SetTarget(&grease->target, player->mo);
grease->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy);
grease->extravalue1 = i;
}
}
player->kartstuff[k_tiregrease] = 2*TICRATE;
player->kartstuff[k_spindash] = 0;
S_StartSound(player->mo, sfx_s23c);
}
if (K_PlayerEBrake(player) == false)
{
player->kartstuff[k_spindash] = 0;
return; return;
} }
if (player->speed < 6*mapobjectscale && player->powers[pw_flashing] == 0) if (player->speed < 6*mapobjectscale && player->powers[pw_flashing] == 0)
{ {
const tic_t MAXCHARGETIME = K_GetSpindashChargeTime(player);
if (cmd->driftturn != 0 && leveltime % 8 == 0) if (cmd->driftturn != 0 && leveltime % 8 == 0)
S_StartSound(player->mo, sfx_ruburn); S_StartSound(player->mo, sfx_ruburn);
@ -6948,29 +6988,6 @@ static void K_KartSpindash(player_t *player)
} }
} }
} }
else if (player->kartstuff[k_spindash])
{
player->kartstuff[k_spindashspeed] = (player->kartstuff[k_spindash] * FRACUNIT) / MAXCHARGETIME;
player->kartstuff[k_spindashboost] = TICRATE;
if (!player->kartstuff[k_tiregrease])
{
UINT8 i;
for (i = 0; i < 2; i++)
{
mobj_t *grease;
grease = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_TIREGREASE);
P_SetTarget(&grease->target, player->mo);
grease->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy);
grease->extravalue1 = i;
}
}
player->kartstuff[k_tiregrease] = 2*TICRATE;
player->kartstuff[k_spindash] = 0;
S_StartSound(player->mo, sfx_s23c);
}
} }
else else
{ {
@ -7670,17 +7687,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
if (player->kartstuff[k_tiregrease]) if (player->kartstuff[k_tiregrease])
player->mo->friction += ((FRACUNIT - prevfriction) / greasetics) * player->kartstuff[k_tiregrease]; player->mo->friction += ((FRACUNIT - prevfriction) / greasetics) * player->kartstuff[k_tiregrease];
// Friction /*
if (!player->kartstuff[k_offroad]) if (K_PlayerEBrake(player) == true)
{ player->mo->friction -= 1024;
if (player->speed > 0 && cmd->forwardmove == 0 && !(cmd->buttons & BT_BRAKE) && player->mo->friction == 59392) else if (player->speed > 0 && cmd->forwardmove < 0)
player->mo->friction += 4608; player->mo->friction -= 512;
} */
if (K_PlayerEBrake(player))
player->mo->friction -= 3072;
else if (player->speed > 0 && cmd->forwardmove < 0) // change friction while braking no matter what, otherwise it's not any more effective than just letting go off accel
player->mo->friction -= 2048;
// Karma ice physics // Karma ice physics
if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0)
@ -7698,14 +7710,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->mo->friction -= 9824; player->mo->friction -= 9824;
} }
// Friction was changed, so we must recalculate a bunch of stuff // Cap between intended values
if (player->mo->friction > FRACUNIT)
player->mo->friction = FRACUNIT;
if (player->mo->friction < 0)
player->mo->friction = 0;
// Friction was changed, so we must recalculate movefactor
if (player->mo->friction != prevfriction) if (player->mo->friction != prevfriction)
{ {
if (player->mo->friction > FRACUNIT)
player->mo->friction = FRACUNIT;
if (player->mo->friction < 0)
player->mo->friction = 0;
player->mo->movefactor = FixedDiv(ORIG_FRICTION, player->mo->friction); player->mo->movefactor = FixedDiv(ORIG_FRICTION, player->mo->friction);
if (player->mo->movefactor < FRACUNIT) if (player->mo->movefactor < FRACUNIT)

View file

@ -70,11 +70,14 @@ void K_StripItems(player_t *player);
void K_StripOther(player_t *player); void K_StripOther(player_t *player);
void K_MomentumToFacing(player_t *player); void K_MomentumToFacing(player_t *player);
boolean K_ApplyOffroad(player_t *player); boolean K_ApplyOffroad(player_t *player);
tic_t K_GetSpindashChargeTime(player_t *player);
fixed_t K_GetSpindashChargeSpeed(player_t *player);
fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed); fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed);
fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower); fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower);
fixed_t K_GetKartAccel(player_t *player); fixed_t K_GetKartAccel(player_t *player);
UINT16 K_GetKartFlashing(player_t *player); UINT16 K_GetKartFlashing(player_t *player);
fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove); SINT8 K_GetForwardMove(player_t *player);
fixed_t K_3dKartMovement(player_t *player, boolean onground);
boolean K_PlayerEBrake(player_t *player); boolean K_PlayerEBrake(player_t *player);
void K_MoveKartPlayer(player_t *player, boolean onground); void K_MoveKartPlayer(player_t *player, boolean onground);
void K_CheckSpectateStatus(void); void K_CheckSpectateStatus(void);

View file

@ -767,8 +767,6 @@ static int ticcmd_get(lua_State *L)
if (fastcmp(field,"forwardmove")) if (fastcmp(field,"forwardmove"))
lua_pushinteger(L, cmd->forwardmove); lua_pushinteger(L, cmd->forwardmove);
else if (fastcmp(field,"sidemove"))
lua_pushinteger(L, cmd->sidemove);
else if (fastcmp(field,"angleturn")) else if (fastcmp(field,"angleturn"))
lua_pushinteger(L, cmd->angleturn); lua_pushinteger(L, cmd->angleturn);
else if (fastcmp(field,"aiming")) else if (fastcmp(field,"aiming"))
@ -797,8 +795,6 @@ static int ticcmd_set(lua_State *L)
if (fastcmp(field,"forwardmove")) if (fastcmp(field,"forwardmove"))
cmd->forwardmove = (SINT8)luaL_checkinteger(L, 3); cmd->forwardmove = (SINT8)luaL_checkinteger(L, 3);
else if (fastcmp(field,"sidemove"))
cmd->sidemove = (SINT8)luaL_checkinteger(L, 3);
else if (fastcmp(field,"angleturn")) else if (fastcmp(field,"angleturn"))
cmd->angleturn = (INT16)luaL_checkinteger(L, 3); cmd->angleturn = (INT16)luaL_checkinteger(L, 3);
else if (fastcmp(field,"aiming")) else if (fastcmp(field,"aiming"))

View file

@ -1461,8 +1461,8 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
mo->momy = FixedMul(mo->momy, ns); mo->momy = FixedMul(mo->momy, ns);
} }
else if (abs(player->rmomx) < FixedMul(STOPSPEED, mo->scale) else if (abs(player->rmomx) < FixedMul(STOPSPEED, mo->scale)
&& abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale) && abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale)
&& (!(player->cmd.forwardmove && !(twodlevel || mo->flags2 & MF2_TWOD)) && !player->cmd.sidemove && !(player->pflags & PF_SPINNING)) && (!(K_GetForwardMove(player) && !(twodlevel || mo->flags2 & MF2_TWOD)) && !(player->pflags & PF_SPINNING))
#ifdef ESLOPE #ifdef ESLOPE
&& !(player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)))// && (abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)) && !(player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)))// && (abs(player->mo->standingslope->zdelta) >= FRACUNIT/2))
#endif #endif
@ -1476,16 +1476,8 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
} }
else else
{ {
if (oldx == mo->x && oldy == mo->y) // didn't go anywhere mo->momx = FixedMul(mo->momx, mo->friction);
{ mo->momy = FixedMul(mo->momy, mo->friction);
mo->momx = FixedMul(mo->momx, ORIG_FRICTION);
mo->momy = FixedMul(mo->momy, ORIG_FRICTION);
}
else
{
mo->momx = FixedMul(mo->momx, mo->friction);
mo->momy = FixedMul(mo->momy, mo->friction);
}
mo->friction = ORIG_FRICTION; mo->friction = ORIG_FRICTION;
} }
@ -1961,7 +1953,7 @@ void P_XYMovement(mobj_t *mo)
if (mo->type == MT_FLINGRING || mo->type == MT_BALLHOG || mo->type == MT_BUBBLESHIELDTRAP) if (mo->type == MT_FLINGRING || mo->type == MT_BALLHOG || mo->type == MT_BUBBLESHIELDTRAP)
return; return;
if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= K_GetKartSpeed(mo->player, false)/2) if (player && (player->kartstuff[k_spinouttimer] && !player->kartstuff[k_wipeoutslow]) && player->speed <= FixedDiv(20*mapobjectscale, player->kartstuff[k_offroad] + FRACUNIT))
return; return;
//} //}

View file

@ -4020,9 +4020,9 @@ static void P_2dMovement(player_t *player)
static void P_3dMovement(player_t *player) static void P_3dMovement(player_t *player)
{ {
ticcmd_t *cmd; ticcmd_t *cmd;
angle_t movepushangle, movepushsideangle; // Analog angle_t movepushangle; // Analog
//INT32 topspeed, acceleration, thrustfactor; //INT32 topspeed, acceleration, thrustfactor;
fixed_t movepushforward = 0, movepushside = 0; fixed_t movepushforward = 0;
angle_t dangle; // replaces old quadrants bits angle_t dangle; // replaces old quadrants bits
//boolean dangleflip = false; // SRB2kart - toaster //boolean dangleflip = false; // SRB2kart - toaster
//fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale); //fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale);
@ -4039,14 +4039,6 @@ static void P_3dMovement(player_t *player)
cmd = &player->cmd; cmd = &player->cmd;
if (player->pflags & PF_STASIS || player->kartstuff[k_spinouttimer]) // pw_introcam?
{
cmd->forwardmove = cmd->sidemove = 0;
}
if (!(player->pflags & PF_FORCESTRAFE) && !player->kartstuff[k_pogospring])
cmd->sidemove = 0;
if (player->kartstuff[k_drift] != 0) if (player->kartstuff[k_drift] != 0)
movepushangle = player->mo->angle-(ANGLE_45/5)*player->kartstuff[k_drift]; movepushangle = player->mo->angle-(ANGLE_45/5)*player->kartstuff[k_drift];
else if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeoutslow]) // if spun out, use the boost angle else if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeoutslow]) // if spun out, use the boost angle
@ -4054,8 +4046,6 @@ static void P_3dMovement(player_t *player)
else else
movepushangle = player->mo->angle; movepushangle = player->mo->angle;
movepushsideangle = movepushangle-ANGLE_90;
// cmomx/cmomy stands for the conveyor belt speed. // cmomx/cmomy stands for the conveyor belt speed.
if (player->onconveyor == 2) // Wind/Current if (player->onconveyor == 2) // Wind/Current
{ {
@ -4108,10 +4098,6 @@ static void P_3dMovement(player_t *player)
*/ */
//} //}
// When sliding, don't allow forward/back
if (player->pflags & PF_SLIDING)
cmd->forwardmove = 0;
// Do not let the player control movement if not onground. // 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 // SRB2Kart: pogo spring and speed bumps are supposed to control like you're on the ground
onground = (P_IsObjectOnGround(player->mo) || (player->kartstuff[k_pogospring])); onground = (P_IsObjectOnGround(player->mo) || (player->kartstuff[k_pogospring]));
@ -4121,7 +4107,7 @@ static void P_3dMovement(player_t *player)
// Forward movement // Forward movement
if (!(P_PlayerInPain(player) && !onground)) if (!(P_PlayerInPain(player) && !onground))
{ {
movepushforward = K_3dKartMovement(player, onground, cmd->forwardmove); movepushforward = K_3dKartMovement(player, onground);
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);
@ -4134,18 +4120,6 @@ static void P_3dMovement(player_t *player)
K_MomentumToFacing(player); K_MomentumToFacing(player);
} }
// Sideways movement
if (cmd->sidemove != 0 && !((player->exiting || mapreset) || player->kartstuff[k_spinouttimer]))
{
if (cmd->sidemove > 0)
movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, K_GetKartSpeed(player, true));
else
movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, K_GetKartSpeed(player, true));
totalthrust.x += P_ReturnThrustX(player->mo, movepushsideangle, movepushside);
totalthrust.y += P_ReturnThrustY(player->mo, movepushsideangle, movepushside);
}
if ((totalthrust.x || totalthrust.y) if ((totalthrust.x || totalthrust.y)
&& player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) { && player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) {
// Factor thrust to slope, but only for the part pushing up it! // Factor thrust to slope, but only for the part pushing up it!
@ -7223,8 +7197,7 @@ fixed_t t_cam4_rotate = -42;
// we then throw that ticcmd garbage in the camera and make it move // we then throw that ticcmd garbage in the camera and make it move
// redefine this // redefine this
static fixed_t forwardmove[2] = {25<<FRACBITS>>16, 50<<FRACBITS>>16}; static fixed_t forwardmove = MAXPLMOVE<<FRACBITS>>16;
static fixed_t sidemove[2] = {2<<FRACBITS>>16, 4<<FRACBITS>>16};
static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn
static ticcmd_t cameracmd; static ticcmd_t cameracmd;
@ -7239,7 +7212,7 @@ void P_InitCameraCmd(void)
static ticcmd_t *P_CameraCmd(camera_t *cam) static ticcmd_t *P_CameraCmd(camera_t *cam)
{ {
INT32 laim, th, tspeed, forward, side, axis; //i INT32 laim, th, tspeed, forward, axis; //i
const INT32 speed = 1; const INT32 speed = 1;
// these ones used for multiple conditions // these ones used for multiple conditions
boolean turnleft, turnright, mouseaiming; boolean turnleft, turnright, mouseaiming;
@ -7288,7 +7261,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam)
turnright = turnright || (axis > 0); turnright = turnright || (axis > 0);
turnleft = turnleft || (axis < 0); turnleft = turnleft || (axis < 0);
} }
forward = side = 0; forward = 0;
// use two stage accelerative turning // use two stage accelerative turning
// on the keyboard and joystick // on the keyboard and joystick
@ -7306,12 +7279,10 @@ static ticcmd_t *P_CameraCmd(camera_t *cam)
if (turnright && !(turnleft)) if (turnright && !(turnleft))
{ {
cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed])); cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed]));
side += sidemove[1];
} }
else if (turnleft && !(turnright)) else if (turnleft && !(turnright))
{ {
cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed])); cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed]));
side -= sidemove[1];
} }
cmd->angleturn = (INT16)(cmd->angleturn - ((mousex*(encoremode ? -1 : 1)*8))); cmd->angleturn = (INT16)(cmd->angleturn - ((mousex*(encoremode ? -1 : 1)*8)));
@ -7324,9 +7295,9 @@ static ticcmd_t *P_CameraCmd(camera_t *cam)
cmd->buttons |= BT_BRAKE; cmd->buttons |= BT_BRAKE;
axis = JoyAxis(AXISAIM, 1); axis = JoyAxis(AXISAIM, 1);
if (InputDown(gc_aimforward, 1) || (usejoystick && axis < 0)) if (InputDown(gc_aimforward, 1) || (usejoystick && axis < 0))
forward += forwardmove[1]; forward += forwardmove;
if (InputDown(gc_aimbackward, 1) || (usejoystick && axis > 0)) if (InputDown(gc_aimbackward, 1) || (usejoystick && axis > 0))
forward -= forwardmove[1]; forward -= forwardmove;
// fire with any button/key // fire with any button/key
axis = JoyAxis(AXISFIRE, 1); axis = JoyAxis(AXISFIRE, 1);
@ -7367,21 +7338,12 @@ static ticcmd_t *P_CameraCmd(camera_t *cam)
mousex = mousey = mlooky = 0; mousex = mousey = mlooky = 0;
if (forward > MAXPLMOVE) cmd->forwardmove += (SINT8)forward;
forward = MAXPLMOVE;
else if (forward < -MAXPLMOVE)
forward = -MAXPLMOVE;
if (side > MAXPLMOVE) if (cmd->forwardmove > MAXPLMOVE)
side = MAXPLMOVE; cmd->forwardmove = MAXPLMOVE;
else if (side < -MAXPLMOVE) else if (cmd->forwardmove < -MAXPLMOVE)
side = -MAXPLMOVE; cmd->forwardmove = -MAXPLMOVE;
if (forward || side)
{
cmd->forwardmove = (SINT8)(cmd->forwardmove + forward);
cmd->sidemove = (SINT8)(cmd->sidemove + side);
}
lang += (cmd->angleturn<<16); lang += (cmd->angleturn<<16);
@ -7426,11 +7388,10 @@ void P_DemoCameraMovement(camera_t *cam)
cam->aiming = R_PointToAngle2(0, cam->z, R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y), lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads. cam->aiming = R_PointToAngle2(0, cam->z, R_PointToDist2(cam->x, cam->y, lastp->mo->x, lastp->mo->y), lastp->mo->z + lastp->mo->scale*128*P_MobjFlip(lastp->mo)); // This is still unholy. Aim a bit above their heads.
} }
cam->momx = cam->momy = cam->momz = 0; cam->momx = cam->momy = cam->momz = 0;
if (cmd->forwardmove != 0) if (cmd->forwardmove != 0)
{ {
thrustangle = cam->angle >> ANGLETOFINESHIFT; thrustangle = cam->angle >> ANGLETOFINESHIFT;
cam->x += FixedMul(cmd->forwardmove*mapobjectscale, FINECOSINE(thrustangle)); cam->x += FixedMul(cmd->forwardmove*mapobjectscale, FINECOSINE(thrustangle));
@ -9493,8 +9454,8 @@ void P_PlayerAfterThink(player_t *player)
if (!(player->mo->tracer->target->flags & MF_SLIDEME) // Noclimb on chain parameters gives this if (!(player->mo->tracer->target->flags & MF_SLIDEME) // Noclimb on chain parameters gives this
&& !(twodlevel || player->mo->flags2 & MF2_TWOD)) // why on earth would you want to turn them in 2D mode? && !(twodlevel || player->mo->flags2 & MF2_TWOD)) // why on earth would you want to turn them in 2D mode?
{ {
player->mo->tracer->target->health += cmd->sidemove; //player->mo->tracer->target->health += cmd->sidemove;
player->mo->angle += cmd->sidemove<<ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX //player->mo->angle += cmd->sidemove<<ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX
if (player == &players[consoleplayer]) if (player == &players[consoleplayer])
localangle[0] = player->mo->angle; // Adjust the local control angle. localangle[0] = player->mo->angle; // Adjust the local control angle.