From 25c3774dc1eaf00f8b06e4aea9decd088d01ddd2 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 5 Jun 2020 15:29:08 -0400 Subject: [PATCH] Let Sneakers stack with each other endlessly. PROBABLY REALLY CONTROVERSIAL, so it's in this other branch... but it's tamer than it sounds, and it's *really* fun. https://cdn.discordapp.com/attachments/275750804227489794/718541704822784061/kart0158.gif https://cdn.discordapp.com/attachments/275750804227489794/718545963408687155/kart0161.gif https://cdn.discordapp.com/attachments/275750804227489794/718543467847876689/kart0160.gif --- src/d_player.h | 7 ++--- src/dehacked.c | 2 +- src/g_game.c | 4 +-- src/k_kart.c | 70 +++++++++++++++++++++++++++++++++----------------- src/p_inter.c | 1 + src/p_mobj.c | 5 ++-- src/p_user.c | 2 +- 7 files changed, 56 insertions(+), 35 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index def13cc71..8360714be 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -316,8 +316,8 @@ typedef enum k_stealingtimer, // You are stealing an item, this is your timer 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 boost stacking) + k_sneakertimer, // Duration of a Sneaker Boost (from Sneakers or level boosters) + k_numsneakers, // Number of stacked sneaker effects k_growshrinktimer, // > 0 = Big, < 0 = small k_squishedtimer, // Squished frame timer k_rocketsneakertimer, // Rocket Sneaker duration timer @@ -391,9 +391,6 @@ typedef enum NUMKARTHUD } karthudtype_t; -// QUICKLY GET EITHER SNEAKER OR LEVEL BOOSTER SINCE THEY ARE FUNCTIONALLY IDENTICAL -#define EITHERSNEAKER(p) (p->kartstuff[k_sneakertimer] || p->kartstuff[k_levelbooster]) - // QUICKLY GET RING TOTAL, INCLUDING RINGS CURRENTLY IN THE PICKUP ANIMATION #define RINGTOTAL(p) (p->kartstuff[k_rings] + p->kartstuff[k_pickuprings]) diff --git a/src/dehacked.c b/src/dehacked.c index 369be7a5c..8564e52db 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8389,7 +8389,7 @@ static const char *const KARTSTUFF_LIST[] = { "STOLENTIMER", "SUPERRING", "SNEAKERTIMER", - "LEVELBOOSTER", + "NUMSNEAKERS", "GROWSHRINKTIMER", "SQUISHEDTIMER", "ROCKETSNEAKERTIMER", diff --git a/src/g_game.c b/src/g_game.c index cca6c50ed..ebbf60e3d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1430,7 +1430,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) || EITHERSNEAKER(player)) + if (InputDown(gc_accelerate, ssplayer) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer]) { cmd->buttons |= BT_ACCELERATE; forward = forwardmove[1]; // 50 @@ -5104,7 +5104,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) || (players[displayplayers[0]].respawn.state != RESPAWNST_NONE) // Respawning || (players[displayplayers[0]].spectator || objectplacing)) // Not a physical player && !(players[displayplayers[0]].kartstuff[k_spinouttimer] - && (players[displayplayers[0]].kartstuff[k_sneakertimer] || players[displayplayers[0]].kartstuff[k_levelbooster]))) // Spinning and boosting cancels out spinout + && players[displayplayers[0]].kartstuff[k_sneakertimer])) // Spinning and boosting cancels out spinout localangle[0] += (cmd->angleturn<<16); if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER) diff --git a/src/k_kart.c b/src/k_kart.c index 6aa1ee7fc..b6f4a4744 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1925,7 +1925,7 @@ void K_MomentumToFacing(player_t *player) boolean K_ApplyOffroad(player_t *player) { - if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || EITHERSNEAKER(player)) + if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_hyudorotimer] || player->kartstuff[k_sneakertimer]) return false; return true; } @@ -1962,29 +1962,44 @@ static void K_GetKartBoostPower(player_t *player) accelboost += (a) / numboosts; \ } - if (player->kartstuff[k_levelbooster]) // Level boosters - ADDBOOST(FRACUNIT/2, 8*FRACUNIT); // + 50% top speed, + 800% acceleration - if (player->kartstuff[k_sneakertimer]) // Sneaker - ADDBOOST(FRACUNIT/2, 8*FRACUNIT); // + 50% top speed, + 800% acceleration + { + UINT8 i; + for (i = 0; i < player->kartstuff[k_numsneakers]; i++) + { + ADDBOOST(FRACUNIT/2, 8*FRACUNIT); // + 50% top speed, + 800% acceleration + } + } if (player->kartstuff[k_invincibilitytimer]) // Invincibility - ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration + { + ADDBOOST(3*FRACUNIT/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration + } if (player->kartstuff[k_flamedash]) // Flame Shield dash + { ADDBOOST(K_FlameShieldDashVar(player->kartstuff[k_flamedash]), 3*FRACUNIT); // + infinite 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/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration + } if (player->kartstuff[k_eggmanexplode]) // Ready-to-explode - ADDBOOST(FRACUNIT/5, FRACUNIT); // + 20% top speed, + 100% acceleration + { + ADDBOOST(3*FRACUNIT/20, FRACUNIT); // + 15% top speed, + 100% acceleration + } if (player->kartstuff[k_draftpower] > 0) // Drafting { @@ -1997,9 +2012,13 @@ static void K_GetKartBoostPower(player_t *player) // 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_accelboost] = accelboost; player->kartstuff[k_numboosts] = numboosts; @@ -2122,7 +2141,7 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove // 0 with no gas, and // -25 when only braking. - if (EITHERSNEAKER(player)) + if (player->kartstuff[k_sneakertimer]) forwardmove = 50; finalspeed *= forwardmove/25; @@ -2206,7 +2225,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto K_PlayHitEmSound(source); player->kartstuff[k_sneakertimer] = 0; - //player->kartstuff[k_levelbooster] = 0; + player->kartstuff[k_numsneakers] = 0; player->kartstuff[k_driftboost] = 0; player->kartstuff[k_ringboost] = 0; @@ -2353,7 +2372,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_numsneakers] = 0; player->kartstuff[k_driftboost] = 0; player->kartstuff[k_ringboost] = 0; @@ -2480,7 +2499,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_numsneakers] = 0; player->kartstuff[k_driftboost] = 0; player->kartstuff[k_ringboost] = 0; @@ -3924,7 +3943,7 @@ void K_DoSneaker(player_t *player, INT32 type) player->karthud[khud_destboostcam] = FixedMul(FRACUNIT, FixedDiv((intendedboost - player->kartstuff[k_speedboost]), intendedboost)); } - if (!EITHERSNEAKER(player)) + if (!player->kartstuff[k_sneakertimer]) { if (type == 2) { @@ -3958,10 +3977,11 @@ void K_DoSneaker(player_t *player, INT32 type) { player->pflags |= PF_ATTACKDOWN; K_PlayBoostTaunt(player->mo); - player->kartstuff[k_sneakertimer] = sneakertime; + } - else - player->kartstuff[k_levelbooster] = sneakertime; + + player->kartstuff[k_sneakertimer] = sneakertime; + player->kartstuff[k_numsneakers]++; // set angle for spun out players: player->kartstuff[k_boostangle] = (INT32)player->mo->angle; @@ -4067,7 +4087,7 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) thrust = 72<player->kartstuff[k_pogospring] != 2) { - if (EITHERSNEAKER(mo->player)) + if (mo->player->kartstuff[k_sneakertimer]) thrust = FixedMul(thrust, (5*FRACUNIT)/4); else if (mo->player->kartstuff[k_invincibilitytimer]) thrust = FixedMul(thrust, (9*FRACUNIT)/8); @@ -5270,7 +5290,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->speed > 0) { // Speed lines - if (EITHERSNEAKER(player) || player->kartstuff[k_ringboost] + if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_ringboost] || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost] || player->kartstuff[k_eggmanexplode]) { @@ -5486,7 +5506,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { if ((P_IsObjectOnGround(player->mo) || (player->kartstuff[k_spinouttype] != 0)) - && (!EITHERSNEAKER(player))) + && (!player->kartstuff[k_sneakertimer])) { player->kartstuff[k_spinouttimer]--; if (player->kartstuff[k_wipeoutslow] > 1) @@ -5525,15 +5545,19 @@ 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_levelbooster]) - player->kartstuff[k_levelbooster]--; + if (player->kartstuff[k_sneakertimer] <= 0) + { + player->kartstuff[k_numsneakers] = 0; + } + } if (player->kartstuff[k_flamedash]) player->kartstuff[k_flamedash]--; - if (EITHERSNEAKER(player) && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1) + if (player->kartstuff[k_sneakertimer] && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1) player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1; if (player->kartstuff[k_floorboost]) @@ -6226,7 +6250,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) return turnvalue; } - if (EITHERSNEAKER(player) || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0) + if (player->kartstuff[k_sneakertimer] || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0) { turnvalue = 5*turnvalue/4; } @@ -6465,7 +6489,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - if ((!EITHERSNEAKER(player)) + if ((!player->kartstuff[k_sneakertimer]) || (!player->cmd.driftturn) || (!player->kartstuff[k_aizdriftstrat]) || (player->cmd.driftturn > 0) != (player->kartstuff[k_aizdriftstrat] > 0)) diff --git a/src/p_inter.c b/src/p_inter.c index 49d3546ce..916f11383 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3153,6 +3153,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da || inflictor->type == MT_SMK_THWOMP || inflictor->player)) { player->kartstuff[k_sneakertimer] = 0; + player->kartstuff[k_numsneakers] = 0; K_SpinPlayer(player, source, 1, inflictor, false); K_KartPainEnergyFling(player); diff --git a/src/p_mobj.c b/src/p_mobj.c index 935ecb14a..4754172f6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8348,10 +8348,9 @@ void P_MobjThinker(mobj_t *mobj) if (p) { - if (p->kartstuff[k_sneakertimer] > mobj->movecount - || p->kartstuff[k_levelbooster] > mobj->movecount) + if (p->kartstuff[k_sneakertimer] > mobj->movecount) P_SetMobjState(mobj, S_BOOSTFLAME); - mobj->movecount = max(p->kartstuff[k_sneakertimer], p->kartstuff[k_levelbooster]); + mobj->movecount = p->kartstuff[k_sneakertimer]; } } diff --git a/src/p_user.c b/src/p_user.c index cc98d46ee..ed31c1d11 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6251,7 +6251,7 @@ static void P_MovePlayer(player_t *player) //////////////////////////// // SRB2kart - Drifting smoke and fire - if ((EITHERSNEAKER(player) || player->kartstuff[k_flamedash]) + if ((player->kartstuff[k_sneakertimer] || player->kartstuff[k_flamedash]) && onground && (leveltime & 1)) K_SpawnBoostTrail(player);