diff --git a/src/d_player.h b/src/d_player.h index 74b1e4885..14a3000ad 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -333,6 +333,7 @@ typedef enum k_stolentimer, // You are being stolen from, this is your timer k_superring, // Spawn rings on top of you every tic! k_sneakertimer, // Duration of the Sneaker Boost itself + k_levelbooster, // Duration of a level booster's boost (same as sneaker, but separated for ) k_growshrinktimer, // > 0 = Big, < 0 = small k_squishedtimer, // Squished frame timer k_rocketsneakertimer, // Rocket Sneaker duration timer @@ -365,6 +366,10 @@ typedef enum NUMKARTSTUFF } kartstufftype_t; + +// QUICKLY GET EITHER SNEAKER OR LEVEL BOOSTER SINCE THEY ARE FUNCTIONALLY IDENTICAL +#define EITHERSNEAKER(p) (p->kartstuff[k_sneakertimer] || p->kartstuff[k_levelbooster]) + //} #define WEP_AUTO 1 diff --git a/src/g_game.c b/src/g_game.c index eb3929d4b..20cae62a1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1404,7 +1404,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { // forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward. axis = JoyAxis(AXISMOVE, ssplayer); - if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer]) + if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || EITHERSNEAKER(player)) { cmd->buttons |= BT_ACCELERATE; forward = forwardmove[1]; // 50 @@ -1557,7 +1557,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) || (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn || (player->kartstuff[k_respawn]) // Respawning || (player->spectator || objectplacing)) // Not a physical player - && !(player->kartstuff[k_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out turning + && !(player->kartstuff[k_spinouttimer] && EITHERSNEAKER(player))) // Spinning and boosting cancels out turning lang += (cmd->angleturn<<16); cmd->angleturn = (INT16)(lang >> 16); @@ -4606,7 +4606,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) || (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn || (players[displayplayer].kartstuff[k_respawn]) // Respawning || (players[displayplayer].spectator || objectplacing)) // Not a physical player - && !(players[displayplayer].kartstuff[k_spinouttimer] && players[displayplayer].kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout + && !(players[displayplayer].kartstuff[k_spinouttimer] && (players[displayplayer].kartstuff[k_sneakertimer] || players[displayplayer].kartstuff[k_levelbooster]))) // Spinning and boosting cancels out spinout localangle += (cmd->angleturn<<16); if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER) diff --git a/src/k_kart.c b/src/k_kart.c index 3fd1333a4..e3ac7302a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1943,8 +1943,10 @@ void K_MomentumToFacing(player_t *player) // sets k_boostpower, k_speedboost, and k_accelboost to whatever we need it to be static void K_GetKartBoostPower(player_t *player) { + fixed_t sneaker = 0; fixed_t boostpower = FRACUNIT; fixed_t speedboost = 0, accelboost = 0; + UINT8 boostfactor = 1; if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] == 1) // Slow down after you've been bumped { @@ -1952,81 +1954,66 @@ static void K_GetKartBoostPower(player_t *player) return; } + // LOVELY magic numbers... + switch (gamespeed) + { + case 0: + sneaker = 53740+768; + break; + case 2: + sneaker = 17294+768; + break; + default: + sneaker = 32768; + break; + } + // Offroad is separate, it's difficult to factor it in with a variable value anyway. - if (!(player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || player->kartstuff[k_sneakertimer]) + if (!(player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || EITHERSNEAKER(player)) && player->kartstuff[k_offroad] >= 0) boostpower = FixedDiv(boostpower, player->kartstuff[k_offroad] + FRACUNIT); if (player->kartstuff[k_bananadrag] > TICRATE) boostpower = (4*boostpower)/5; - // Banana drag/offroad dust - if (boostpower < FRACUNIT - && player->mo && P_IsObjectOnGround(player->mo) - && player->speed > 0 - && !player->spectator) - { - K_SpawnWipeoutTrail(player->mo, true); - if (leveltime % 6 == 0) - S_StartSound(player->mo, sfx_cdfm70); - } +#define ADDBOOST(s,a) { \ + speedboost += (s) / boostfactor; \ + accelboost += (a) / boostfactor; \ + boostfactor++; \ +} + + if (player->kartstuff[k_levelbooster]) // Level boosters + ADDBOOST(sneaker, 8*FRACUNIT); // + 800% acceleration, varying top speed if (player->kartstuff[k_sneakertimer]) // Sneaker - { - switch (gamespeed) - { - case 0: - speedboost = max(speedboost, 53740+768); - break; - case 2: - speedboost = max(speedboost, 17294+768); - break; - default: - speedboost = max(speedboost, 32768); - break; - } - accelboost = max(accelboost, 8*FRACUNIT); // + 800% - } + ADDBOOST(sneaker, 8*FRACUNIT); // + 800% acceleration, varying top speed if (player->kartstuff[k_invincibilitytimer]) // Invincibility - { - speedboost = max(speedboost, (3*FRACUNIT)/8); // + 37.5% - accelboost = max(accelboost, 3*FRACUNIT); // + 300% - } + ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration + + if (player->kartstuff[k_startboost]) // Startup Boost + ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 600% acceleration + + if (player->kartstuff[k_driftboost]) // Drift Boost + ADDBOOST(FRACUNIT/4, 4*FRACUNIT); // + 25% top speed, + 400% acceleration + + if (player->kartstuff[k_ringboost]) // Ring Boost + ADDBOOST(FRACUNIT/4, 4*FRACUNIT); // + 20% top speed, + 200% acceleration if (player->kartstuff[k_growshrinktimer] > 0) // Grow { - speedboost = max(speedboost, FRACUNIT/5); // + 20% + // Grow's design is weird with booster stacking. + // We'll see how to replace its design BEFORE v2 gets released. + speedboost += (FRACUNIT/5); // + 20% } - if (player->kartstuff[k_ringboost]) // Ring Boost - { - speedboost = max(speedboost, FRACUNIT/5); // + 20% - accelboost = max(accelboost, 2*FRACUNIT); // + 200% - } - - if (player->kartstuff[k_driftboost]) // Drift Boost - { - speedboost = max(speedboost, FRACUNIT/4); // + 25% - accelboost = max(accelboost, 4*FRACUNIT); // + 400% - } - - if (player->kartstuff[k_startboost]) // Startup Boost - { - speedboost = max(speedboost, FRACUNIT/4); // + 25% - accelboost = max(accelboost, 6*FRACUNIT); // + 300% - } - - // don't average them anymore, this would make a small boost and a high boost less useful - // just take the highest we want instead - player->kartstuff[k_boostpower] = boostpower; // value smoothing if (speedboost > player->kartstuff[k_speedboost]) player->kartstuff[k_speedboost] = speedboost; else - player->kartstuff[k_speedboost] += (speedboost - player->kartstuff[k_speedboost])/(TICRATE/2); + player->kartstuff[k_speedboost] += (speedboost - player->kartstuff[k_speedboost]) / (TICRATE/2); player->kartstuff[k_accelboost] = accelboost; } @@ -2235,7 +2222,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto if (source && source != player->mo && source->player) K_PlayHitEmSound(source); - //player->kartstuff[k_sneakertimer] = 0; + player->kartstuff[k_sneakertimer] = 0; + //player->kartstuff[k_levelbooster] = 0; player->kartstuff[k_driftboost] = 0; player->kartstuff[k_ringboost] = 0; @@ -2378,6 +2366,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor) #endif player->kartstuff[k_sneakertimer] = 0; + player->kartstuff[k_levelbooster] = 0; player->kartstuff[k_driftboost] = 0; player->kartstuff[k_ringboost] = 0; @@ -2504,6 +2493,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b player->mo->momx = player->mo->momy = 0; player->kartstuff[k_sneakertimer] = 0; + player->kartstuff[k_levelbooster] = 0; player->kartstuff[k_driftboost] = 0; player->kartstuff[k_ringboost] = 0; @@ -3673,7 +3663,7 @@ void K_DoSneaker(player_t *player, INT32 type) player->kartstuff[k_destboostcam] = FixedMul(FRACUNIT, FixedDiv((intendedboost - player->kartstuff[k_speedboost]), intendedboost)); } - if (!player->kartstuff[k_sneakertimer]) + if (!EITHERSNEAKER(player)) { if (type == 2) { @@ -3701,14 +3691,15 @@ void K_DoSneaker(player_t *player, INT32 type) } } - player->kartstuff[k_sneakertimer] = sneakertime; - if (type != 0) { player->pflags |= PF_ATTACKDOWN; K_PlayBoostTaunt(player->mo); player->powers[pw_flashing] = 0; // Stop flashing after boosting + player->kartstuff[k_sneakertimer] = sneakertime; } + else + player->kartstuff[k_levelbooster] = sneakertime; } static void K_DoShrink(player_t *user) @@ -3787,10 +3778,10 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) thrust = 72<player->kartstuff[k_pogospring] != 2) { - if (mo->player->kartstuff[k_sneakertimer]) - thrust = FixedMul(thrust, 5*FRACUNIT/4); + if (EITHERSNEAKER(mo->player)) + thrust = FixedMul(thrust, (5*FRACUNIT)/4); else if (mo->player->kartstuff[k_invincibilitytimer]) - thrust = FixedMul(thrust, 9*FRACUNIT/8); + thrust = FixedMul(thrust, (9*FRACUNIT)/8); } } else @@ -4634,8 +4625,20 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_UpdateEngineSounds(player, cmd); // Thanks, VAda! K_GetKartBoostPower(player); + // Banana drag/offroad dust + if (player->mo && !player->spectator + && P_IsObjectOnGround(player->mo) && player->speed > 0 + && player->kartstuff[k_boostpower] < FRACUNIT) + { + K_SpawnWipeoutTrail(player->mo, true); + if (leveltime % 6 == 0) + S_StartSound(player->mo, sfx_cdfm70); + } + // Speed lines - if ((player->kartstuff[k_sneakertimer] || player->kartstuff[k_ringboost] || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost]) && player->speed > 0) + if ((EITHERSNEAKER(player) || player->kartstuff[k_ringboost] + || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost]) + && player->speed > 0) { mobj_t *fast = P_SpawnMobj(player->mo->x + (P_RandomRange(-36,36) * player->mo->scale), player->mo->y + (P_RandomRange(-36,36) * player->mo->scale), @@ -4755,7 +4758,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { if ((P_IsObjectOnGround(player->mo) || (player->kartstuff[k_spinouttype] != 0)) - && (player->kartstuff[k_sneakertimer] == 0)) + && (!EITHERSNEAKER(player))) { player->kartstuff[k_spinouttimer]--; if (player->kartstuff[k_wipeoutslow] > 1) @@ -4797,11 +4800,13 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->kartstuff[k_ringboost]--; if (player->kartstuff[k_sneakertimer]) - { player->kartstuff[k_sneakertimer]--; - if (player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1) - player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1; - } + + if (player->kartstuff[k_levelbooster]) + player->kartstuff[k_levelbooster]--; + + if (EITHERSNEAKER(player) && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1) + player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1; if (player->kartstuff[k_floorboost]) player->kartstuff[k_floorboost]--; @@ -5084,7 +5089,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning - if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_sneakertimer] || player->kartstuff[k_growshrinktimer] > 0) + if (EITHERSNEAKER(player) || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0) turnvalue = FixedMul(turnvalue, FixedDiv(5*FRACUNIT, 4*FRACUNIT)); return turnvalue; @@ -5212,7 +5217,11 @@ static void K_KartDrift(player_t *player, boolean onground) } // Disable drift-sparks until you're going fast enough - if (player->kartstuff[k_getsparks] == 0 || (player->kartstuff[k_offroad] && !player->kartstuff[k_invincibilitytimer] && !player->kartstuff[k_hyudorotimer] && !player->kartstuff[k_sneakertimer])) + if (player->kartstuff[k_getsparks] == 0 + || (player->kartstuff[k_offroad] + && !player->kartstuff[k_invincibilitytimer] + && !player->kartstuff[k_hyudorotimer] + && !EITHERSNEAKER(player))) driftadditive = 0; if (player->speed > minspeed*2) player->kartstuff[k_getsparks] = 1; @@ -5243,7 +5252,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_getsparks] = 0; } - if ((!player->kartstuff[k_sneakertimer]) + if ((!EITHERSNEAKER(player)) || (!player->cmd.driftturn) || (player->cmd.driftturn > 0) != (player->kartstuff[k_aizdriftstrat] > 0)) { diff --git a/src/p_mobj.c b/src/p_mobj.c index c00bcc216..32bc2514c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8270,9 +8270,10 @@ void P_MobjThinker(mobj_t *mobj) if (p) { - if (p->kartstuff[k_sneakertimer] > mobj->movecount) + if (p->kartstuff[k_sneakertimer] > mobj->movecount + || p->kartstuff[k_levelbooster] > mobj->movecount) P_SetMobjState(mobj, S_BOOSTFLAME); - mobj->movecount = p->kartstuff[k_sneakertimer]; + mobj->movecount = max(p->kartstuff[k_sneakertimer], p->kartstuff[k_levelbooster]); } } diff --git a/src/p_spec.c b/src/p_spec.c index 24f56c432..5a72d3d1e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7303,7 +7303,7 @@ void T_Friction(friction_t *f) // (or at least MF_PUSHABLEs, which is all I care about anyway) if ((!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) && thing->z == thing->floorz) && (thing->player && (thing->player->kartstuff[k_invincibilitytimer] == 0 && thing->player->kartstuff[k_hyudorotimer] == 0 - && thing->player->kartstuff[k_sneakertimer] == 0 && thing->player->kartstuff[k_growshrinktimer] <= 0))) + && !EITHERSNEAKER(thing->player) && thing->player->kartstuff[k_growshrinktimer] <= 0))) { if (f->roverfriction) { diff --git a/src/p_user.c b/src/p_user.c index fa198c1b6..c03b431d6 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4762,7 +4762,7 @@ static void P_3dMovement(player_t *player) if ((player->exiting || mapreset) || player->pflags & PF_STASIS || player->kartstuff[k_spinouttimer]) // pw_introcam? { cmd->forwardmove = cmd->sidemove = 0; - if (player->kartstuff[k_sneakertimer]) + if (EITHERSNEAKER(player)) cmd->forwardmove = 50; } @@ -6596,7 +6596,7 @@ static void P_MovePlayer(player_t *player) || (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn || (player->kartstuff[k_respawn]) // Respawning || (player->spectator || objectplacing)) // Not a physical player - && !(player->kartstuff[k_spinouttimer] && player->kartstuff[k_sneakertimer])) // Spinning and boosting cancels out turning + && !(player->kartstuff[k_spinouttimer] && EITHERSNEAKER(player))) // Spinning and boosting cancels out turning { player->lturn_max[leveltime%MAXPREDICTTICS] = K_GetKartTurnValue(player, KART_FULLTURN)+1; player->rturn_max[leveltime%MAXPREDICTTICS] = K_GetKartTurnValue(player, -KART_FULLTURN)-1; @@ -6993,7 +6993,7 @@ static void P_MovePlayer(player_t *player) //////////////////////////// // SRB2kart - Drifting smoke and fire - if (player->kartstuff[k_sneakertimer] > 0 && onground && (leveltime & 1)) + if (EITHERSNEAKER(player) && onground && (leveltime & 1)) K_SpawnBoostTrail(player); if (player->kartstuff[k_invincibilitytimer] > 0) @@ -9251,7 +9251,7 @@ void P_PlayerThink(player_t *player) #if 1 // "Blur" a bit when you have speed shoes and are going fast enough if ((player->powers[pw_super] || player->powers[pw_sneakers] - || player->kartstuff[k_driftboost] || player->kartstuff[k_ringboost] || player->kartstuff[k_sneakertimer] || player->kartstuff[k_startboost]) + || EITHERSNEAKER(player) || player->kartstuff[k_driftboost] || player->kartstuff[k_ringboost] || player->kartstuff[k_startboost]) && !player->kartstuff[k_invincibilitytimer] // SRB2kart && (player->speed + abs(player->mo->momz)) > FixedMul(20*FRACUNIT,player->mo->scale)) {