Fix drift drawangle offset
This commit is contained in:
parent
2094639167
commit
83f6d55738
5 changed files with 31 additions and 38 deletions
18
src/k_kart.c
18
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
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
29
src/r_fps.c
29
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue