From e8774cf7b229e5ffde43d5294d88db53fb699eac Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 5 Feb 2021 22:50:33 -0500 Subject: [PATCH 1/7] Charging nothing for no time now actually gives you nothing --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index fd485a5cf..50783a586 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2128,7 +2128,7 @@ static void K_GetKartBoostPower(player_t *player) // character & charge dependent ADDBOOST( FixedMul(MAXCHARGESPEED, player->kartstuff[k_spindashspeed]), // + 0 to K_GetSpindashChargeSpeed()% top speed - (4*FRACUNIT) + (36*player->kartstuff[k_spindashspeed]), // + 400% to 4000% acceleration + (40*player->kartstuff[k_spindashspeed]), // + 0% to 4000% acceleration 0 // + 0% handling ); } From 758427463692f85a7eb8018b640f79efa1a57149 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 5 Feb 2021 23:28:22 -0500 Subject: [PATCH 2/7] Spring/spindash grease & invincibility gives you slope resistence --- src/k_kart.c | 7 +++++++ src/k_kart.h | 1 + src/p_user.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 50783a586..c7234f24b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2030,6 +2030,13 @@ boolean K_ApplyOffroad(player_t *player) return true; } +boolean K_SlopeResistance(player_t *player) +{ + if (player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_sneakertimer] || player->kartstuff[k_tiregrease]) + return true; + return false; +} + static fixed_t K_FlameShieldDashVar(INT32 val) { // 1 second = 75% + 50% top speed diff --git a/src/k_kart.h b/src/k_kart.h index 9f18b4661..1a1a932f3 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -82,6 +82,7 @@ void K_StripItems(player_t *player); void K_StripOther(player_t *player); void K_MomentumToFacing(player_t *player); boolean K_ApplyOffroad(player_t *player); +boolean K_SlopeResistance(player_t *player); INT16 K_GetSpindashChargeTime(player_t *player); fixed_t K_GetSpindashChargeSpeed(player_t *player); fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed); diff --git a/src/p_user.c b/src/p_user.c index 0df4aa756..587294d3f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1851,7 +1851,7 @@ static void P_3dMovement(player_t *player) totalthrust.x = totalthrust.y = 0; // I forget if this is needed totalthrust.z = FRACUNIT*P_MobjFlip(player->mo)/3; // A bit of extra push-back on slopes - if (player->kartstuff[k_sneakertimer] > 0) + if (K_SlopeResistance(player) == true) { totalthrust.z = -(totalthrust.z); } From af7adf76c4e37413e7e7d0d9a536d74cebf1310a Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 5 Feb 2021 23:28:47 -0500 Subject: [PATCH 3/7] Make spindash speed differences x2 stronger --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index c7234f24b..4df3f314f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2055,7 +2055,7 @@ fixed_t K_GetSpindashChargeSpeed(player_t *player) // more speed for higher weight & speed // Tails = +6.25%, Fang = +20.31%, Mighty = +20.31%, Metal = +25% // (can be higher than this value when overcharged) - return (player->kartspeed + player->kartweight) * (FRACUNIT/64); + return (player->kartspeed + player->kartweight) * (FRACUNIT/32); } From fea9cd2ad09d5c1c4fe1bab7e6a7760b6739181c Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 5 Feb 2021 23:29:51 -0500 Subject: [PATCH 4/7] Make spindash strength curve exponential instead of linear Heavily encourages full charge instead of tapping --- src/k_kart.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4df3f314f..40260f51f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2131,11 +2131,12 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_spindashboost]) // Spindash boost { const fixed_t MAXCHARGESPEED = K_GetSpindashChargeSpeed(player); + const fixed_t exponent = FixedMul(player->kartstuff[k_spindashspeed], player->kartstuff[k_spindashspeed]); // character & charge dependent ADDBOOST( - FixedMul(MAXCHARGESPEED, player->kartstuff[k_spindashspeed]), // + 0 to K_GetSpindashChargeSpeed()% top speed - (40*player->kartstuff[k_spindashspeed]), // + 0% to 4000% acceleration + FixedMul(MAXCHARGESPEED, exponent), // + 0 to K_GetSpindashChargeSpeed()% top speed + (40 * exponent), // + 0% to 4000% acceleration 0 // + 0% handling ); } From ee68862d1f0403d4e5394383cf6b6d5ed788c304 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 6 Feb 2021 00:08:28 -0500 Subject: [PATCH 5/7] Drift protection Before, doing a spindash input while turning, but not being at a low enough speed, would make you start drifting. Now, it checks if you're trying to E-Brake first before interpreting it as a drift input. If you were already drifting, then attempting accel+brake will still be brake-drift, so that technique is unaffected. --- src/d_clisrv.c | 4 ++++ src/d_clisrv.h | 1 + src/d_player.h | 2 ++ src/k_kart.c | 34 ++++++++++++++++++++++------------ src/lua_playerlib.c | 4 ++++ src/p_saveg.c | 6 ++++++ 6 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 1ebf4960a..26c5fbbf2 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -616,6 +616,8 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->kartstuff[j] = LONG(players[i].kartstuff[j]); rsp->airtime = (tic_t)LONG(players[i].airtime); + rsp->driftInput = players[i].driftInput; + rsp->trickpanel = (UINT8)players[i].trickpanel; rsp->trickdelay = (boolean)players[i].trickdelay; rsp->trickmomx = (fixed_t)LONG(players[i].trickmomx); @@ -774,6 +776,8 @@ static void resynch_read_player(resynch_pak *rsp) players[i].kartstuff[j] = LONG(rsp->kartstuff[j]); players[i].airtime = (tic_t)LONG(rsp->airtime); + players[i].driftInput = (boolean)rsp->driftInput; + players[i].trickpanel = (UINT8)rsp->trickpanel; players[i].trickdelay = (boolean)rsp->trickdelay; players[i].trickmomx = (fixed_t)LONG(rsp->trickmomx); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 8e7e9aee9..5af4f10c2 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -280,6 +280,7 @@ typedef struct // SRB2kart INT32 kartstuff[NUMKARTSTUFF]; tic_t airtime; + boolean driftInput; UINT8 trickpanel; boolean trickdelay; fixed_t trickmomx; diff --git a/src/d_player.h b/src/d_player.h index 1c352e3ea..34e445c66 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -527,10 +527,12 @@ typedef struct player_s // SRB2kart stuff INT32 kartstuff[NUMKARTSTUFF]; INT32 karthud[NUMKARTHUD]; + UINT32 distancetofinish; waypoint_t *nextwaypoint; respawnvars_t respawn; // Respawn info tic_t airtime; // Keep track of how long you've been in the air + boolean driftInput; // Whenever or not try drifting. UINT8 trickpanel; // Trick panel state boolean trickdelay; // Prevent tricks until control stick is neutral diff --git a/src/k_kart.c b/src/k_kart.c index 40260f51f..11fd1b49c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6143,9 +6143,18 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } if (cmd->buttons & BT_DRIFT) - player->kartstuff[k_jmp] = 1; + { + // Only allow drifting while NOT trying to do an spindash input. + if ((cmd->buttons & BT_EBRAKEMASK) != BT_EBRAKEMASK) + { + player->driftInput = true; + } + // else, keep the previous value, because it might be brake-drifting. + } else - player->kartstuff[k_jmp] = 0; + { + player->driftInput = false; + } // Roulette Code K_KartItemRoulette(player, cmd); @@ -6750,13 +6759,14 @@ void K_SpawnDriftBoostExplosion(player_t *player, int stage) static void K_KartDrift(player_t *player, boolean onground) { - fixed_t minspeed = (10 * player->mo->scale); - INT32 dsone = K_GetKartDriftSparkValue(player); - INT32 dstwo = dsone*2; - INT32 dsthree = dstwo*2; + const fixed_t minspeed = (10 * player->mo->scale); - // Drifting is actually straffing + automatic turning. - // Holding the Jump button will enable drifting. + const INT32 dsone = K_GetKartDriftSparkValue(player); + const INT32 dstwo = dsone*2; + const INT32 dsthree = dstwo*2; + + // Drifting is actually straffing[sic] + automatic turning. + // Holding the Drift button will enable drifting. // Drift Release (Moved here so you can't "chain" drifts) if (player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) @@ -6817,21 +6827,21 @@ static void K_KartDrift(player_t *player, boolean onground) } // Drifting: left or right? - if ((player->cmd.turning > 0) && player->speed > minspeed && player->kartstuff[k_jmp] == 1 + if ((player->cmd.turning > 0) && player->speed > minspeed && player->driftInput == true && (player->kartstuff[k_drift] == 0 || player->kartstuff[k_driftend] == 1)) // && player->kartstuff[k_drift] != 1) { // Starting left drift player->kartstuff[k_drift] = 1; player->kartstuff[k_driftend] = player->kartstuff[k_driftcharge] = 0; } - else if ((player->cmd.turning < 0) && player->speed > minspeed && player->kartstuff[k_jmp] == 1 + else if ((player->cmd.turning < 0) && player->speed > minspeed && player->driftInput == true && (player->kartstuff[k_drift] == 0 || player->kartstuff[k_driftend] == 1)) // && player->kartstuff[k_drift] != -1) { // Starting right drift player->kartstuff[k_drift] = -1; player->kartstuff[k_driftend] = player->kartstuff[k_driftcharge] = 0; } - else if (player->kartstuff[k_jmp] == 0) // || player->kartstuff[k_turndir] == 0) + else if (player->driftInput == false) // || player->kartstuff[k_turndir] == 0) { // drift is not being performed so if we're just finishing set driftend and decrement counters if (player->kartstuff[k_drift] > 0) @@ -6855,7 +6865,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; player->kartstuff[k_getsparks] = 0; } - else if (player->kartstuff[k_jmp] == 1 && player->kartstuff[k_drift] != 0) + else if (player->driftInput == true && player->kartstuff[k_drift] != 0) { // Incease/decrease the drift value to continue drifting in that direction fixed_t driftadditive = 24; diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 823d751d8..2f7e78f79 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -218,6 +218,8 @@ static int player_get(lua_State *L) LUA_PushUserdata(L, plr->karthud, META_KARTHUD); else if (fastcmp(field,"airtime")) lua_pushinteger(L, plr->airtime); + else if (fastcmp(field,"driftInput")) + lua_pushboolean(L, plr->driftInput); else if (fastcmp(field,"tumbleBounces")) lua_pushinteger(L, plr->tumbleBounces); else if (fastcmp(field,"tumbleHeight")) @@ -527,6 +529,8 @@ static int player_set(lua_State *L) return NOSET; else if (fastcmp(field,"airtime")) plr->airtime = (tic_t)luaL_checkinteger(L, 3); + else if (fastcmp(field,"driftInput")) + plr->driftInput = luaL_checkboolean(L, 3); else if (fastcmp(field,"tumbleBounces")) plr->tumbleBounces = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"tumbleHeight")) diff --git a/src/p_saveg.c b/src/p_saveg.c index 79b99e98f..23f14c4e7 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -255,7 +255,10 @@ static void P_NetArchivePlayers(void) WRITEUINT32(save_p, players[i].distancetofinish); WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].nextwaypoint)); + WRITEUINT32(save_p, players[i].airtime); + WRITEUINT8(save_p, players[i].driftInput); + WRITEUINT8(save_p, players[i].trickpanel); WRITEUINT8(save_p, players[i].trickdelay); WRITEUINT32(save_p, players[i].trickmomx); @@ -455,7 +458,10 @@ static void P_NetUnArchivePlayers(void) players[i].distancetofinish = READUINT32(save_p); players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save_p); + players[i].airtime = READUINT32(save_p); + players[i].driftInput = (boolean)READUINT8(save_p); + players[i].trickpanel = READUINT8(save_p); players[i].trickdelay = READUINT8(save_p); players[i].trickmomx = READUINT32(save_p); From 5e098cddcd39d3c84499436169841556bfcd7a1a Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 6 Feb 2021 05:22:30 -0500 Subject: [PATCH 6/7] This comment is extremely funny --- src/k_kart.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 11fd1b49c..d923619a3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6765,8 +6765,9 @@ static void K_KartDrift(player_t *player, boolean onground) const INT32 dstwo = dsone*2; const INT32 dsthree = dstwo*2; - // Drifting is actually straffing[sic] + automatic turning. - // Holding the Drift button will enable drifting. + // Drifting is actually straffing + automatic turning. + // Holding the Jump button will enable drifting. + // (This comment is extremely funny) // Drift Release (Moved here so you can't "chain" drifts) if (player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) From 0a950df133ce9a42f31d49a9c410665a9224dd6c Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 6 Feb 2021 05:46:53 -0500 Subject: [PATCH 7/7] Reset k_spindash when hurt --- src/k_kart.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index d923619a3..50fc2bbf4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7218,6 +7218,11 @@ static void K_KartSpindash(player_t *player) ticcmd_t *cmd = &player->cmd; boolean spawnWind = (leveltime % 2 == 0); + if (player->mo->hitlag > 0 || P_PlayerInPain(player)) + { + player->kartstuff[k_spindash] = 0; + } + if (player->kartstuff[k_spindash] > 0 && (cmd->buttons & (BT_DRIFT|BT_BRAKE)) != (BT_DRIFT|BT_BRAKE)) { player->kartstuff[k_spindashspeed] = (player->kartstuff[k_spindash] * FRACUNIT) / MAXCHARGETIME;