diff --git a/src/d_player.h b/src/d_player.h index 4cb1b1539..70220414b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -953,6 +953,8 @@ struct player_t UINT8 lastsafelap; + fixed_t topAccel; // Reduced on straight wall collisions to give players extra recovery time + mobj_t *stumbleIndicator; mobj_t *wavedashIndicator; mobj_t *trickIndicator; diff --git a/src/g_game.c b/src/g_game.c index 2b232a6c6..d4c062fca 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2363,6 +2363,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->ringvolume = 255; + p->topAccel = MAXTOPACCEL; + p->botvars.rubberband = FRACUNIT; p->spectatorReentry = spectatorReentry; diff --git a/src/k_kart.c b/src/k_kart.c index 6e5434a85..540a7cd4e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3531,7 +3531,7 @@ fixed_t K_GetKartAccel(const player_t *player) // Marble Garden Top gets 1200% accel if (player->curshield == KSHIELD_TOP) { - k_accel *= 12; + k_accel = FixedMul(k_accel, player->topAccel); } if (K_PodiumSequence() == true) @@ -3646,7 +3646,17 @@ SINT8 K_GetForwardMove(const player_t *player) } else { - forwardmove = MAXPLMOVE; + // forwardmove = MAXPLMOVE; + + UINT8 minmove = MAXPLMOVE/10; + fixed_t assistmove = (MAXPLMOVE - minmove) * FRACUNIT; + + angle_t topdelta = player->mo->angle - K_MomentumAngle(player->mo); + fixed_t topmult = FINECOSINE(topdelta >> ANGLETOFINESHIFT); + topmult = (topmult/2) + (FRACUNIT/2); + assistmove = FixedMul(topmult, assistmove); + + forwardmove = minmove + FixedInt(assistmove); } } @@ -8718,6 +8728,17 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } + // Players that bounce far off walls get reduced Top accel, to give them some time to get their bearings. + if ((player->mo->eflags & MFE_JUSTBOUNCEDWALL) && player->curshield == KSHIELD_TOP) + { + angle_t topdelta = player->mo->angle - K_MomentumAngle(player->mo); + fixed_t topmult = FINECOSINE(topdelta >> ANGLETOFINESHIFT); + topmult = (topmult/2) + (FRACUNIT/2); // 0 to original + player->topAccel = FixedMul(topmult, player->topAccel); + } + + player->topAccel = min(player->topAccel + TOPACCELREGEN, MAXTOPACCEL); + if (player->stealingtimer == 0 && player->rocketsneakertimer && onground == true) diff --git a/src/k_kart.h b/src/k_kart.h index 6b54f9a37..2c5857b78 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -52,6 +52,9 @@ Make sure this matches the actual number of states #define RINGVOLUMEUSEPENALTY 15 #define RINGVOLUMEREGEN 1 +#define MAXTOPACCEL (12*FRACUNIT) +#define TOPACCELREGEN (FRACUNIT/16) + // Mispredicted turns can generate phantom sliptide inputs for a few tics. // Delay the wavedash visuals until we're reasonably sure that it's a deliberate turn. #define HIDEWAVEDASHCHARGE (60) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index d873a4f28..ae4d93343 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -345,6 +345,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->finalfailsafe); else if (fastcmp(field,"lastsafelap")) lua_pushinteger(L, plr->lastsafelap); + else if (fastcmp(field,"topAccel")) + lua_pushinteger(L, plr->topAccel); else if (fastcmp(field,"instaWhipCharge")) lua_pushinteger(L, plr->instaWhipCharge); else if (fastcmp(field,"defenseLockout")) @@ -865,6 +867,8 @@ static int player_set(lua_State *L) plr->finalfailsafe = luaL_checkinteger(L, 3); else if (fastcmp(field,"lastsafelap")) plr->lastsafelap = luaL_checkinteger(L, 3); + else if (fastcmp(field,"topAccel")) + plr->topAccel = luaL_checkinteger(L, 3); else if (fastcmp(field,"instaWhipCharge")) plr->instaWhipCharge = luaL_checkinteger(L, 3); else if (fastcmp(field,"defenseLockout")) diff --git a/src/p_saveg.c b/src/p_saveg.c index 25252ca02..e1ed123f9 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -571,6 +571,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].lastsafelap); + WRITEFIXED(save->p, players[i].topAccel); + WRITEMEM(save->p, players[i].public_key, PUBKEYLENGTH); WRITEUINT8(save->p, players[i].instaWhipCharge); @@ -1142,6 +1144,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].lastsafelap = READUINT8(save->p); + players[i].topAccel = READFIXED(save->p); + READMEM(save->p, players[i].public_key, PUBKEYLENGTH); players[i].instaWhipCharge = READUINT8(save->p);