diff --git a/src/d_player.h b/src/d_player.h index 003cf8087..2dd19dd44 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -524,6 +524,7 @@ struct player_t UINT8 spindashboost; // Spindash release boost timer fixed_t fastfall; // Fast fall momentum + fixed_t fastfallBase; // Fast fall base speed multiplier UINT8 numboosts; // Count of how many boosts are being stacked, for after image spawning fixed_t boostpower; // Base boost value, for offroad diff --git a/src/k_kart.c b/src/k_kart.c index 81886b60f..05f093459 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9946,6 +9946,13 @@ static void K_KartSpindash(player_t *player) // Update fastfall. player->fastfall = player->mo->momz; player->spindash = 0; + + if (player->fastfallBase == 0) + { + // Factors 3D momentum. + player->fastfallBase = FixedHypot(player->speed, player->mo->momz); + } + return; } else if (player->fastfall != 0) @@ -10057,6 +10064,7 @@ boolean K_FastFallBounce(player_t *player) player->mo->momz = bounce * P_MobjFlip(player->mo); player->fastfall = 0; + player->fastfallBase = 0; return true; } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 327641362..76325ebc9 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -282,6 +282,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->spindashboost); else if (fastcmp(field,"fastfall")) lua_pushfixed(L, plr->fastfall); + else if (fastcmp(field,"fastfallBase")) + lua_pushfixed(L, plr->fastfallBase); else if (fastcmp(field,"numboosts")) lua_pushinteger(L, plr->numboosts); else if (fastcmp(field,"boostpower")) @@ -664,6 +666,8 @@ static int player_set(lua_State *L) plr->spindashboost = luaL_checkinteger(L, 3); else if (fastcmp(field,"fastfall")) plr->fastfall = luaL_checkfixed(L, 3); + else if (fastcmp(field,"fastfallBase")) + plr->fastfallBase = luaL_checkfixed(L, 3); else if (fastcmp(field,"numboosts")) plr->numboosts = luaL_checkinteger(L, 3); else if (fastcmp(field,"boostpower")) diff --git a/src/p_mobj.c b/src/p_mobj.c index a020137a1..f1990a186 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1148,7 +1148,11 @@ fixed_t P_GetMobjGravity(mobj_t *mo) else if (mo->player->fastfall != 0) { // Fast falling - gravityadd *= 4; + + const fixed_t unit = 64 * mapobjectscale; + const fixed_t mult = 3*FRACUNIT + (3 * FixedDiv(mo->player->fastfallBase, unit)); + + gravityadd = FixedMul(gravityadd, mult); } } else diff --git a/src/p_saveg.c b/src/p_saveg.c index 8f142fa20..eca813e50 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -311,6 +311,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].spindashboost); WRITEFIXED(save->p, players[i].fastfall); + WRITEFIXED(save->p, players[i].fastfallBase); WRITEUINT8(save->p, players[i].numboosts); WRITEFIXED(save->p, players[i].boostpower); @@ -686,6 +687,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].spindashboost = READUINT8(save->p); players[i].fastfall = READFIXED(save->p); + players[i].fastfallBase = READFIXED(save->p); players[i].numboosts = READUINT8(save->p); players[i].boostpower = READFIXED(save->p); diff --git a/src/p_user.c b/src/p_user.c index 6c89dddc0..7e7e3ef85 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -482,6 +482,7 @@ void P_ResetPlayer(player_t *player) player->trickpanel = 0; player->glanceDir = 0; player->fastfall = 0; + player->fastfallBase = 0; if (player->mo != NULL && P_MobjWasRemoved(player->mo) == false) {