diff --git a/src/k_kart.c b/src/k_kart.c index ad44d2312..9e69369b1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8655,6 +8655,24 @@ static void K_KartDrift(player_t *player, boolean onground) else player->pflags &= ~PF_BRAKEDRIFT; } + +INT32 K_GetDriftAngleOffset(player_t *player) +{ + INT32 a = 0; + boolean compat = wadfiles[skins[player->skin].wadnum]->compatmode; + if (player->aizdriftturn) + { + a = player->aizdriftturn; + if (compat) + a /= 4; // don't turn too much in compatmode + } + else if (player->drift != 0) + { + a = (ANGLE_45 / 5) * player->drift; + } + return a; +} + // // K_KartUpdatePosition // diff --git a/src/k_kart.h b/src/k_kart.h index 548f887fc..de36bfae7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -97,6 +97,7 @@ INT32 K_GetKartDriftSparkValue(player_t *player); INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage); void K_SpawnDriftBoostExplosion(player_t *player, int stage); void K_SpawnDriftElectricSparks(player_t *player); +INT32 K_GetDriftAngleOffset(player_t *player); void K_KartUpdatePosition(player_t *player); void K_KartLegacyUpdatePosition(player_t *player); void K_UpdateAllPlayerPositions(void); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 0bda8d475..1480bb119 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -18,6 +18,7 @@ #include "g_game.h" #include "p_local.h" #include "d_clisrv.h" +#include "k_kart.h" // K_GetDriftAngleOffset #include "lua_script.h" #include "lua_libs.h" @@ -217,9 +218,7 @@ static int player_get(lua_State *L) lua_pushangle(L, plr->viewrollangle); else if (fastcmp(field,"aiming")) lua_pushangle(L, plr->aiming); - else if (fastcmp(field,"drawangle")) - lua_pushangle(L, plr->drawangle); - else if (fastcmp(field,"frameangle")) + else if (fastcmp(field,"drawangle") || (lua_compatmode && fastcmp(field,"frameangle"))) lua_pushangle(L, plr->drawangle); else if (fastcmp(field,"powers")) LUA_PushUserdata(L, plr->powers, META_POWERS); @@ -569,10 +568,14 @@ static int player_set(lua_State *L) } } } - else if (fastcmp(field,"drawangle")) - plr->drawangle = luaL_checkangle(L, 3); - else if (fastcmp(field,"frameangle")) - plr->drawangle = luaL_checkangle(L, 3); + else if (fastcmp(field,"drawangle") || (lua_compatmode && fastcmp(field,"frameangle"))) + { + angle_t angle = luaL_checkangle(L, 3); + if (lua_compatmode && plr->mo && angle == plr->mo->angle) + // attempt to fix e.g. acrobasics not accounting for drift when resetting frameangle + angle += K_GetDriftAngleOffset(plr); + plr->drawangle = angle; + } else if (fastcmp(field,"pflags")) plr->pflags = luaL_checkinteger(L, 3); else if (fastcmp(field,"panim")) diff --git a/src/p_user.c b/src/p_user.c index 48c9c53b7..1299bfb08 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2185,9 +2185,7 @@ void P_MovePlayer(player_t *player) if (player->pogospring) player->drawangle += ANGLE_22h; else - { - player->drawangle = player->mo->angle; - } + player->drawangle = player->mo->angle + K_GetDriftAngleOffset(player); player->mo->rollangle = 0; } diff --git a/src/r_fps.c b/src/r_fps.c index 1fedc1831..dc894dd5f 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -279,31 +279,6 @@ angle_t R_InterpolateAngle(angle_t from, angle_t to) void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out) { - // Yucky hack to make sure these values don't affect drawangle value. Blame lua compat concerns. - // v1 had its art assets show a different angle on drift while v2 does not. This recreates that effect without touching drawangle or the art assets - // This makes sure that scripts that set drawangle/frameangle to match player angle won't eat the drift frames. - angle_t addangle = 0; - if (mobj->sprite == SPR_PLAY) - { - if (mobj->player && mobj->player->aizdriftturn) - { - addangle += mobj->player->aizdriftturn; - if (mobj->skin && wadfiles[((skin_t *)mobj->skin)->wadnum]->compatmode) - // don't turn too much in compatmode - addangle = (INT32)addangle / 4; - } - if (mobj->state == &states[S_KART_DRIFT_L] - || mobj->state == &states[S_KART_DRIFT_L_OUT] - || mobj->state == &states[S_KART_DRIFT_L_IN] - ) - addangle += (ANGLE_45 / 5) * 5; - else if (mobj->state == &states[S_KART_DRIFT_R] - || mobj->state == &states[S_KART_DRIFT_R_OUT] - || mobj->state == &states[S_KART_DRIFT_R_IN] - ) - addangle += (ANGLE_45 / 5) * -5; - } - if (frac == FRACUNIT) { out->x = mobj->x; @@ -311,7 +286,7 @@ void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out) out->z = mobj->z; out->scale = mobj->scale; out->subsector = mobj->subsector; - out->angle = mobj->player ? mobj->player->drawangle + addangle : mobj->angle; + out->angle = mobj->player ? mobj->player->drawangle : mobj->angle; out->spritexscale = mobj->spritexscale; out->spriteyscale = mobj->spriteyscale; out->spritexoffset = mobj->spritexoffset; @@ -336,12 +311,10 @@ void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out) if (mobj->player) { out->angle = mobj->resetinterp ? mobj->player->drawangle : R_LerpAngle(mobj->player->old_drawangle, mobj->player->drawangle, frac); - out->angle += addangle; } else { out->angle = mobj->resetinterp ? mobj->angle : R_LerpAngle(mobj->old_angle, mobj->angle, frac); - out->angle += addangle; } }