diff --git a/src/d_player.h b/src/d_player.h index 543bd316c..5fa9c3906 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -806,7 +806,6 @@ struct player_t UINT8 flamelength; // Flame Shield dash meter, number of segments UINT16 counterdash; // Flame Shield boost without the flame, largely. Used in places where awarding thrust would affect player control. - UINT16 neutraldash; // Neutral drifting is marginally faster. UINT16 ballhogcharge; // Ballhog charge up -- the higher this value, the more projectiles boolean ballhogtap; // Ballhog released during charge: used to allow semirapid tapfire diff --git a/src/k_kart.c b/src/k_kart.c index 1ef687a53..1a25a70a9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3648,16 +3648,47 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST(player->vortexBoost/6, FRACUNIT/10, 0); // + ???% top speed, + 10% acceleration, +0% handling } - if (player->neutraldash) // Neutral drifts are marginally faster + if (player->drift != 0) // Neutral drifts are marginally faster { - ADDBOOST( - FRACUNIT/5, // + 20% top speed - FRACUNIT/4, // + 25% acceleration - 0 // 0 handling - ); - numboosts--; // No afterimage! - } + // Trying to emulate the old leniency timer being stat-based. + // I dunno if this is overkill because turning is already stat-based. + // Should this be a pure constant instead? + const INT16 max_steer_threshold = (KART_FULLTURN * 5) / 6; + INT32 steer_threshold = FixedMul((FRACUNIT * player->kartweight) / 9, max_steer_threshold); + INT32 steering = abs(player->steering); + + fixed_t frac = 0; + if (steering < steer_threshold) + { + frac = FixedDiv(steer_threshold - steering, steer_threshold); + } + + // Weaken the effect with drifts that were just started. + frac = (frac * abs(player->drift)) / 5; + + if (frac > 0) + { + if (frac > FRACUNIT) + { + // Clamp between reasonable bounds. + frac = FRACUNIT; + } + + // Get multiplier from easing function, to + // heavily reward being near exactly 0. + fixed_t multiplier = Easing_InExpo(frac, 0, FRACUNIT); + if (multiplier > 0) + { + ADDBOOST( + FixedMul(multiplier, FRACUNIT/5), // + 20% top speed + FixedMul(multiplier, FRACUNIT/4), // + 25% acceleration + 0 // 0 handling + ); + numboosts--; // No afterimage! + } + } + } if (player->trickcharge) { @@ -9364,11 +9395,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->counterdash) player->counterdash--; - if (abs(player->drift)==5 && player->cmd.turning == 0) - player->neutraldash = min(player->neutraldash + 1, 1 + player->kartweight/2); - else if (player->neutraldash) - player->neutraldash--; - if ((player->sneakertimer || player->panelsneakertimer) && player->wipeoutslow > 0 && player->wipeoutslow < wipeoutslowtime+1) player->wipeoutslow = wipeoutslowtime+1; diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index d9fcf13ee..56636fd19 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -466,8 +466,6 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->flamedash); else if (fastcmp(field,"counterdash")) lua_pushinteger(L, plr->counterdash); - else if (fastcmp(field,"neutraldash")) - lua_pushinteger(L, plr->neutraldash); else if (fastcmp(field,"flamemeter")) lua_pushinteger(L, plr->flamemeter); else if (fastcmp(field,"flamelength")) @@ -1072,8 +1070,6 @@ static int player_set(lua_State *L) plr->flamedash = luaL_checkinteger(L, 3); else if (fastcmp(field,"counterdash")) plr->counterdash = luaL_checkinteger(L, 3); - else if (fastcmp(field,"neutraldash")) - plr->neutraldash = luaL_checkinteger(L, 3); else if (fastcmp(field,"flamemeter")) plr->flamemeter = luaL_checkinteger(L, 3); else if (fastcmp(field,"flamelength")) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 030e3c1ab..51a1a94b9 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -530,7 +530,6 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].bubbleblowup); WRITEUINT16(save->p, players[i].flamedash); WRITEUINT16(save->p, players[i].counterdash); - WRITEUINT16(save->p, players[i].neutraldash); WRITEUINT16(save->p, players[i].flamemeter); WRITEUINT8(save->p, players[i].flamelength); @@ -1166,7 +1165,6 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].bubbleblowup = READUINT8(save->p); players[i].flamedash = READUINT16(save->p); players[i].counterdash = READUINT16(save->p); - players[i].neutraldash = READUINT16(save->p); players[i].flamemeter = READUINT16(save->p); players[i].flamelength = READUINT8(save->p);