Make drift and sliptide angle turn renderer based, to recreate v1 kart drift

v1 had its art assets show a different angle on drift while v2 does not. This recreates that effect without touching drawangle/frameangle and the art assets
This makes sure that scripts that set drawangle/frameangle to match player angle won't eat the drift frames.
This commit is contained in:
NepDisk 2024-10-07 14:40:46 -04:00
parent 4f9f23f75c
commit 7886c6efb4
4 changed files with 19 additions and 17 deletions

View file

@ -8265,7 +8265,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->pflags &= ~PF_USERINGS;
}
if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && !mapreset && leveltime > introtime)
if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && !(player->exiting || mapreset) && leveltime > introtime)
{
// First, the really specific, finicky items that function without the item being directly in your item slot.
{

View file

@ -51,10 +51,6 @@ automatically.
X (PreThinkFrame)/* frame (before mobj and player thinkers) */,\
X (ThinkFrame),/* frame (after mobj and player thinkers) */\
X (PostThinkFrame),/* frame (at end of tick, ie after overlays, precipitation, specials) */\
X (JumpSpecial),/* P_DoJumpStuff (Any-jumping) */\
X (AbilitySpecial),/* P_DoJumpStuff (Double-jumping) */\
X (SpinSpecial),/* P_DoSpinAbility (Spin button effect) */\
X (JumpSpinSpecial),/* P_DoJumpStuff (Spin button effect (mid-air)) */\
X (BotTiccmd),/* B_BuildTiccmd */\
X (PlayerMsg),/* chat messages */\
X (HurtMsg),/* imhurttin */\

View file

@ -2202,17 +2202,6 @@ void P_MovePlayer(player_t *player)
else
{
player->drawangle = player->mo->angle;
if (player->aizdriftturn)
{
player->drawangle += player->aizdriftturn;
}
else if (player->drift != 0)
{
INT32 a = (ANGLE_45 / 5) * player->drift;
player->drawangle += a;
}
}
player->mo->rollangle = 0;

View file

@ -270,6 +270,22 @@ 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->player)
{
if (mobj->player->aizdriftturn)
{
addangle += mobj->player->aizdriftturn;
}
else if (mobj->player->drift != 0)
{
addangle += (ANGLE_45 / 5) * mobj->player->drift;
}
}
if (frac == FRACUNIT)
{
out->x = mobj->x;
@ -277,7 +293,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 : mobj->angle;
out->angle = mobj->player ? mobj->player->drawangle + addangle : mobj->angle;
out->spritexscale = mobj->spritexscale;
out->spriteyscale = mobj->spriteyscale;
out->spritexoffset = mobj->spritexoffset;
@ -302,6 +318,7 @@ 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
{