diff --git a/src/d_clisrv.c b/src/d_clisrv.c index a7c6e0e9a..89b96a0d7 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4315,7 +4315,6 @@ static void HandlePacketFromAwayNode(SINT8 node) static boolean CheckForSpeedHacks(UINT8 p) { 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) { XBOXSTATIC char buf[2]; diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index 0340b9f40..6c14a0f4b 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -60,7 +60,6 @@ typedef enum typedef struct { 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 aiming; // vertical aiming, see G_BuildTicCmd UINT16 buttons; diff --git a/src/g_game.c b/src/g_game.c index dbc0b66db..eeb1e01fb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1256,13 +1256,12 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 p) INT32 localaiming[MAXSPLITSCREENPLAYERS]; angle_t localangle[MAXSPLITSCREENPLAYERS]; -static fixed_t forwardmove = 50<>16; -static fixed_t sidemove[2] = {2<>16, 4<>16}; +static fixed_t forwardmove = MAXPLMOVE<>16; 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) { - INT32 laim, th, tspeed, forward, side, axis; //i + INT32 laim, th, tspeed, forward, axis; //i const INT32 speed = 1; // these ones used for multiple conditions boolean turnleft, turnright, mouseaiming, analogjoystickmove, gamepadjoystickmove; @@ -1373,7 +1372,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) turnright = turnright || (axis > 0); turnleft = turnleft || (axis < 0); } - forward = side = 0; + forward = 0; // use two stage accelerative turning // 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->driftturn = (INT16)(cmd->driftturn - (angleturn[tspeed])); - side += sidemove[1]; } else if (turnleft && !(turnright)) { cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed])); cmd->driftturn = (INT16)(cmd->driftturn + (angleturn[tspeed])); - side -= sidemove[1]; } 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) cmd->angleturn = (INT16)(cmd->angleturn - (((axis * angleturn[1]) >> 10))); // ANALOG! cmd->driftturn = (INT16)(cmd->driftturn - (((axis * angleturn[1]) >> 10))); - side += ((axis * sidemove[0]) >> 10); } // Specator mouse turning @@ -1445,7 +1441,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { cmd->buttons |= BT_ACCELERATE; // JOYAXISRANGE is supposed to be 1023 (divide by 1024) - forward += ((axis * forwardmove) >> 10)*2; + forward += ((axis * forwardmove) >> 10); } axis = JoyAxis(AXISBRAKE, ssplayer); @@ -1555,21 +1551,12 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) mousex = mousey = mlooky = 0; - if (forward > MAXPLMOVE) - forward = MAXPLMOVE; - else if (forward < -MAXPLMOVE) - forward = -MAXPLMOVE; + cmd->forwardmove += (SINT8)forward; - if (side > MAXPLMOVE) - side = MAXPLMOVE; - else if (side < -MAXPLMOVE) - side = -MAXPLMOVE; - - if (forward || side) - { - cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); - cmd->sidemove = (SINT8)(cmd->sidemove + side); - } + if (cmd->forwardmove > MAXPLMOVE) + cmd->forwardmove = MAXPLMOVE; + else if (cmd->forwardmove < -MAXPLMOVE) + cmd->forwardmove = -MAXPLMOVE; //{ 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 @@ -1619,7 +1606,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) #endif //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) displayplayers[0] = consoleplayer; } @@ -4771,13 +4758,12 @@ char *G_BuildMapTitle(INT32 mapnum) // For demos #define ZT_FWD 0x01 -#define ZT_SIDE 0x02 -#define ZT_ANGLE 0x04 -#define ZT_BUTTONS 0x08 -#define ZT_AIMING 0x10 -#define ZT_DRIFT 0x20 -#define ZT_LATENCY 0x40 -#define DEMOMARKER 0x80 // demoend +#define ZT_ANGLE 0x02 +#define ZT_BUTTONS 0x04 +#define ZT_AIMING 0x08 +#define ZT_DRIFT 0x10 +#define ZT_LATENCY 0x20 +#define DEMOMARKER 0x40 // demoend UINT8 demo_extradata[MAXPLAYERS]; 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++) { dest[i].forwardmove = src[i].forwardmove; - dest[i].sidemove = src[i].sidemove; dest[i].angleturn = SHORT(src[i].angleturn); dest[i].aiming = (INT16)SHORT(src[i].aiming); dest[i].buttons = (UINT16)SHORT(src[i].buttons); @@ -5149,8 +5134,6 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) if (ziptic & ZT_FWD) oldcmd[playernum].forwardmove = READSINT8(demo_p); - if (ziptic & ZT_SIDE) - oldcmd[playernum].sidemove = READSINT8(demo_p); if (ziptic & ZT_ANGLE) oldcmd[playernum].angleturn = READINT16(demo_p); if (ziptic & ZT_BUTTONS) @@ -5190,13 +5173,6 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum) 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) { WRITEINT16(demo_p,cmd->angleturn); @@ -5710,8 +5686,6 @@ void G_GhostTicker(void) if (ziptic & ZT_FWD) g->p++; - if (ziptic & ZT_SIDE) - g->p++; if (ziptic & ZT_ANGLE) g->p += 2; if (ziptic & ZT_BUTTONS) diff --git a/src/k_bot.c b/src/k_bot.c index 285f92142..1cfef7fb9 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -474,6 +474,7 @@ fixed_t K_BotTopSpeedRubberband(player_t *player) fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict) { fixed_t rubberband = K_BotRubberband(player) - FRACUNIT; + fixed_t newfrict; if (rubberband <= 0) { @@ -481,8 +482,14 @@ fixed_t K_BotFrictionRubberband(player_t *player, fixed_t frict) return frict; } - // 128 is a magic number that felt good in-game - return FixedDiv(frict, FRACUNIT + (rubberband / 2)); + newfrict = 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 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) { @@ -743,7 +751,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) if (anglediff > 90) { // Wrong way! - cmd->forwardmove = -25; + cmd->forwardmove = -MAXPLMOVE; cmd->buttons |= BT_BRAKE; } else @@ -777,7 +785,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) cmd->buttons |= BT_ACCELERATE; // Full speed ahead! - cmd->forwardmove = 50; + cmd->forwardmove = MAXPLMOVE; if (dirdist <= rad) { diff --git a/src/k_kart.c b/src/k_kart.c index 7efcc697f..90afd4451 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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... fixed_t dist = P_AproxDistance(distx, disty); - fixed_t nx = FixedDiv(distx, dist); - fixed_t ny = FixedDiv(disty, dist); + fixed_t nx, ny; dist = dist ? dist : 1; + + nx = FixedDiv(distx, dist); + ny = FixedDiv(disty, dist); + distx = FixedMul(mobj1->radius+mobj2->radius, nx); 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->rmomy = mobj1->momy - mobj1->player->cmomy; mobj1->player->kartstuff[k_justbumped] = bumptime; + mobj1->player->kartstuff[k_spindash] = 0; 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->rmomy = mobj2->momy - mobj2->player->cmomy; mobj2->player->kartstuff[k_justbumped] = bumptime; + mobj2->player->kartstuff[k_spindash] = 0; 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); } -static tic_t K_GetSpindashChargeTime(player_t *player) +tic_t K_GetSpindashChargeTime(player_t *player) { // more charge time for higher speed // Tails = 2s, Mighty = 3s, Fang = 4s, Metal = 4s 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 // Tails = +6.25%, Fang = +20.31%, Mighty = +20.31%, Metal = +25% @@ -2266,13 +2271,32 @@ UINT16 K_GetKartFlashing(player_t *player) 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 p_speed = K_GetKartSpeed(player, true); const fixed_t p_accel = K_GetKartAccel(player); fixed_t newspeed, oldspeed, finalspeed; + fixed_t movemul = FRACUNIT; 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 @@ -2301,25 +2325,20 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove } finalspeed = newspeed - oldspeed; + movemul = abs(forwardmove * FRACUNIT) / 50; // forwardmove is: // 50 while accelerating, // 0 with no gas, and // -25 when only braking. - - if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_spindashboost]) - forwardmove = 50; - - finalspeed *= forwardmove/25; - finalspeed /= 2; - - if (forwardmove < 0 && finalspeed > mapobjectscale*2) - return finalspeed/2; - else if (forwardmove < 0) - return -mapobjectscale/2; - - if (finalspeed < 0) - finalspeed = 0; + if (forwardmove >= 0) + { + finalspeed = FixedMul(finalspeed, movemul); + } + else + { + finalspeed = FixedMul(-mapobjectscale/2, movemul); + } return finalspeed; } @@ -3579,7 +3598,7 @@ void K_DriftDustHandling(mobj_t *spawner) if (spawner->player->speed < 5*spawner->scale) return; - if (spawner->player->cmd.forwardmove < 0) + if (K_GetForwardMove(spawner->player) < 0) playerangle += ANGLE_180; 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 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); 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) 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]--; if (player->kartstuff[k_tiregrease]) @@ -6895,31 +6914,52 @@ static INT32 K_FlameShieldMax(player_t *player) boolean K_PlayerEBrake(player_t *player) { return (player->cmd.buttons & BT_EBRAKEMASK) == BT_EBRAKEMASK - && P_IsObjectOnGround(player->mo) - && !player->kartstuff[k_drift] - && !player->kartstuff[k_spinouttimer] - && !player->kartstuff[k_boostcharge] - && !(player->kartstuff[k_spindash] < 0) - && !player->kartstuff[k_justbumped] - && !player->kartstuff[k_spindashboost] - && !player->powers[pw_nocontrol]; + && P_IsObjectOnGround(player->mo) == true + && player->kartstuff[k_drift] == 0 + && player->kartstuff[k_spinouttimer] == 0 + && player->kartstuff[k_justbumped] == 0 + && player->kartstuff[k_spindash] >= 0 + && player->kartstuff[k_spindashboost] == 0 + && player->powers[pw_nocontrol] == 0; } static void K_KartSpindash(player_t *player) { + const tic_t MAXCHARGETIME = K_GetSpindashChargeTime(player); 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_spindash] = 0; + 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); + } + + if (K_PlayerEBrake(player) == false) + { + player->kartstuff[k_spindash] = 0; return; } if (player->speed < 6*mapobjectscale && player->powers[pw_flashing] == 0) { - const tic_t MAXCHARGETIME = K_GetSpindashChargeTime(player); - if (cmd->driftturn != 0 && leveltime % 8 == 0) 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 { @@ -7670,17 +7687,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_tiregrease]) player->mo->friction += ((FRACUNIT - prevfriction) / greasetics) * player->kartstuff[k_tiregrease]; - // Friction - if (!player->kartstuff[k_offroad]) - { - if (player->speed > 0 && cmd->forwardmove == 0 && !(cmd->buttons & BT_BRAKE) && player->mo->friction == 59392) - player->mo->friction += 4608; - } - - 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; + /* + if (K_PlayerEBrake(player) == true) + player->mo->friction -= 1024; + else if (player->speed > 0 && cmd->forwardmove < 0) + player->mo->friction -= 512; + */ // Karma ice physics if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) @@ -7698,14 +7710,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground) 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 > FRACUNIT) - player->mo->friction = FRACUNIT; - if (player->mo->friction < 0) - player->mo->friction = 0; - player->mo->movefactor = FixedDiv(ORIG_FRICTION, player->mo->friction); if (player->mo->movefactor < FRACUNIT) diff --git a/src/k_kart.h b/src/k_kart.h index c06f2bef3..d44be14f4 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -70,11 +70,14 @@ void K_StripItems(player_t *player); void K_StripOther(player_t *player); void K_MomentumToFacing(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_GetKartSpeed(player_t *player, boolean doboostpower); fixed_t K_GetKartAccel(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); void K_MoveKartPlayer(player_t *player, boolean onground); void K_CheckSpectateStatus(void); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 1e93e5687..436a7161b 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -767,8 +767,6 @@ static int ticcmd_get(lua_State *L) if (fastcmp(field,"forwardmove")) lua_pushinteger(L, cmd->forwardmove); - else if (fastcmp(field,"sidemove")) - lua_pushinteger(L, cmd->sidemove); else if (fastcmp(field,"angleturn")) lua_pushinteger(L, cmd->angleturn); else if (fastcmp(field,"aiming")) @@ -797,8 +795,6 @@ static int ticcmd_set(lua_State *L) if (fastcmp(field,"forwardmove")) cmd->forwardmove = (SINT8)luaL_checkinteger(L, 3); - else if (fastcmp(field,"sidemove")) - cmd->sidemove = (SINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"angleturn")) cmd->angleturn = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"aiming")) diff --git a/src/p_mobj.c b/src/p_mobj.c index c5cddef5a..734a6e3f3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1461,8 +1461,8 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy) mo->momy = FixedMul(mo->momy, ns); } else if (abs(player->rmomx) < 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)) + && abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale) + && (!(K_GetForwardMove(player) && !(twodlevel || mo->flags2 & MF2_TWOD)) && !(player->pflags & PF_SPINNING)) #ifdef ESLOPE && !(player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)))// && (abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)) #endif @@ -1476,16 +1476,8 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy) } else { - if (oldx == mo->x && oldy == mo->y) // didn't go anywhere - { - 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->momx = FixedMul(mo->momx, mo->friction); + mo->momy = FixedMul(mo->momy, mo->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) 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; //} diff --git a/src/p_user.c b/src/p_user.c index 6a91875b1..8d6014926 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4020,9 +4020,9 @@ static void P_2dMovement(player_t *player) static void P_3dMovement(player_t *player) { ticcmd_t *cmd; - angle_t movepushangle, movepushsideangle; // Analog + angle_t movepushangle; // Analog //INT32 topspeed, acceleration, thrustfactor; - fixed_t movepushforward = 0, movepushside = 0; + fixed_t movepushforward = 0; angle_t dangle; // replaces old quadrants bits //boolean dangleflip = false; // SRB2kart - toaster //fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale); @@ -4039,14 +4039,6 @@ static void P_3dMovement(player_t *player) 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) 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 @@ -4054,8 +4046,6 @@ static void P_3dMovement(player_t *player) else movepushangle = player->mo->angle; - movepushsideangle = movepushangle-ANGLE_90; - // cmomx/cmomy stands for the conveyor belt speed. 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. // 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])); @@ -4121,7 +4107,7 @@ static void P_3dMovement(player_t *player) // Forward movement 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... movepushforward = FixedMul(movepushforward, player->mo->movefactor); @@ -4134,18 +4120,6 @@ static void P_3dMovement(player_t *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) && 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! @@ -7223,8 +7197,7 @@ fixed_t t_cam4_rotate = -42; // we then throw that ticcmd garbage in the camera and make it move // redefine this -static fixed_t forwardmove[2] = {25<>16, 50<>16}; -static fixed_t sidemove[2] = {2<>16, 4<>16}; +static fixed_t forwardmove = MAXPLMOVE<>16; static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn static ticcmd_t cameracmd; @@ -7239,7 +7212,7 @@ void P_InitCameraCmd(void) 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; // these ones used for multiple conditions boolean turnleft, turnright, mouseaiming; @@ -7288,7 +7261,7 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) turnright = turnright || (axis > 0); turnleft = turnleft || (axis < 0); } - forward = side = 0; + forward = 0; // use two stage accelerative turning // on the keyboard and joystick @@ -7306,12 +7279,10 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) if (turnright && !(turnleft)) { cmd->angleturn = (INT16)(cmd->angleturn - (angleturn[tspeed])); - side += sidemove[1]; } else if (turnleft && !(turnright)) { cmd->angleturn = (INT16)(cmd->angleturn + (angleturn[tspeed])); - side -= sidemove[1]; } 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; axis = JoyAxis(AXISAIM, 1); if (InputDown(gc_aimforward, 1) || (usejoystick && axis < 0)) - forward += forwardmove[1]; + forward += forwardmove; if (InputDown(gc_aimbackward, 1) || (usejoystick && axis > 0)) - forward -= forwardmove[1]; + forward -= forwardmove; // fire with any button/key axis = JoyAxis(AXISFIRE, 1); @@ -7367,21 +7338,12 @@ static ticcmd_t *P_CameraCmd(camera_t *cam) mousex = mousey = mlooky = 0; - if (forward > MAXPLMOVE) - forward = MAXPLMOVE; - else if (forward < -MAXPLMOVE) - forward = -MAXPLMOVE; + cmd->forwardmove += (SINT8)forward; - if (side > MAXPLMOVE) - side = MAXPLMOVE; - else if (side < -MAXPLMOVE) - side = -MAXPLMOVE; - - if (forward || side) - { - cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); - cmd->sidemove = (SINT8)(cmd->sidemove + side); - } + if (cmd->forwardmove > MAXPLMOVE) + cmd->forwardmove = MAXPLMOVE; + else if (cmd->forwardmove < -MAXPLMOVE) + cmd->forwardmove = -MAXPLMOVE; 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->momx = cam->momy = cam->momz = 0; + if (cmd->forwardmove != 0) { - thrustangle = cam->angle >> ANGLETOFINESHIFT; 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 && !(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->angle += cmd->sidemove< ANGLE_MAX + //player->mo->tracer->target->health += cmd->sidemove; + //player->mo->angle += cmd->sidemove< ANGLE_MAX if (player == &players[consoleplayer]) localangle[0] = player->mo->angle; // Adjust the local control angle.