Fix drift drawangle offset

This commit is contained in:
GenericHeroGuy 2025-01-28 19:01:19 +01:00
parent 2094639167
commit 83f6d55738
5 changed files with 31 additions and 38 deletions

View file

@ -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
//

View file

@ -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);

View file

@ -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"))

View file

@ -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;
}

View file

@ -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;
}
}