Deduplicate frame2spr2

This commit is contained in:
GenericHeroGuy 2025-08-02 21:54:50 +02:00
parent 08726d4098
commit 60abb9f010
4 changed files with 78 additions and 131 deletions

View file

@ -408,69 +408,6 @@ static UINT8 *G_ReadZipTic(ticcmd_t *cmd, UINT8 *dp, UINT16 version)
return dp;
}
#define F(x) case x - 'A':
static void frame2spr2(ziptic_t *zt, skin_t *skin, UINT32 inframe)
{
UINT8 spr2, outframe = 0;
switch (inframe & FF_FRAMEMASK)
{
F('A') F('B')
spr2 = SPR2_STIN;
outframe = inframe & 1;
break;
F('C') F('D')
spr2 = SPR2_STIL;
outframe = inframe & 1;
break;
F('E') F('F')
spr2 = SPR2_STIR;
outframe = inframe & 1;
break;
F('G')
spr2 = SPR2_SLWN;
break;
F('H')
spr2 = SPR2_SLWL;
break;
F('I')
spr2 = SPR2_SLWR;
break;
F('J')
spr2 = SPR2_FSTN;
break;
F('K')
spr2 = SPR2_FSTL;
break;
F('L')
spr2 = SPR2_FSTR;
break;
F('M') F('N')
spr2 = SPR2_DRLN;
outframe = inframe & 1;
break;
F('O') F('P')
spr2 = SPR2_DRRN;
outframe = inframe & 1;
break;
F('Q')
spr2 = SPR2_SPIN;
break;
F('R')
spr2 = SPR2_KART;
break;
F('S')
spr2 = SPR2_SIGN;
break;
default:
spr2 = SPR2_KART;
outframe = inframe - 18; // not 19! frame 0 is squish
break;
}
zt->frame = (inframe & ~FF_FRAMEMASK) | outframe;
zt->spr2 = P_GetSkinSprite2(skin, spr2, NULL);
}
#undef F
// call G_FreeExtraZipTic, you get the idea
static UINT8 *G_ReadExtraZipTic(ziptic_t *zt, UINT8 *dp, UINT16 version, mobj_t *mo)
{
@ -509,7 +446,7 @@ static UINT8 *G_ReadExtraZipTic(ziptic_t *zt, UINT8 *dp, UINT16 version, mobj_t
{
if (kart)
{
frame2spr2(zt, mo->skin, READUINT8(dp));
zt->spr2 = P_KartFrameToSprite2(mo->skin, READUINT8(dp), &zt->frame);
zt->flags |= GZT_SPR2;
}
else
@ -1851,8 +1788,6 @@ void G_ConsGhostTic(INT32 playernum)
}
}
G_FreeExtraZipTic(&zt);
if (testmo)
{
// Re-synchronise
@ -1904,6 +1839,7 @@ void G_ConsGhostTic(INT32 playernum)
}
skip:
G_FreeExtraZipTic(&zt);
if (*demobuf.p == DEMOMARKER)
{
// end of demo data stream

View file

@ -573,69 +573,6 @@ static int mobj_get(lua_State *L)
return 1;
}
#define F(x) case x - 'A':
static void frame2spr2(mobj_t *mo, UINT32 inframe)
{
UINT8 spr2, outframe = 0;
switch (inframe & FF_FRAMEMASK)
{
F('A') F('B')
spr2 = SPR2_STIN;
outframe = inframe & 1;
break;
F('C') F('D')
spr2 = SPR2_STIL;
outframe = inframe & 1;
break;
F('E') F('F')
spr2 = SPR2_STIR;
outframe = inframe & 1;
break;
F('G')
spr2 = SPR2_SLWN;
break;
F('H')
spr2 = SPR2_SLWL;
break;
F('I')
spr2 = SPR2_SLWR;
break;
F('J')
spr2 = SPR2_FSTN;
break;
F('K')
spr2 = SPR2_FSTL;
break;
F('L')
spr2 = SPR2_FSTR;
break;
F('M') F('N')
spr2 = SPR2_DRLN;
outframe = inframe & 1;
break;
F('O') F('P')
spr2 = SPR2_DRRN;
outframe = inframe & 1;
break;
F('Q')
spr2 = SPR2_SPIN;
break;
F('R')
spr2 = SPR2_KART;
break;
F('S')
spr2 = SPR2_SIGN;
break;
default:
spr2 = SPR2_KART;
outframe = inframe - 18; // not 19! frame 0 is squish
break;
}
mo->frame = (inframe & ~FF_FRAMEMASK) | outframe;
mo->sprite2 = P_GetSkinSprite2((skin_t *)mo->skin, spr2, mo->player);
}
#undef F
#define NOSET luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly.", mobj_opt[field])
#define NOSETPOS luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly. Use " LUA_QL("P_Move") ", " LUA_QL("P_TryMove") ", or " LUA_QL("P_SetOrigin") ", or " LUA_QL("P_MoveOrigin") " instead.", mobj_opt[field])
static int mobj_set(lua_State *L)
@ -698,14 +635,22 @@ static int mobj_set(lua_State *L)
{
spritenum_t newsprite = luaL_checkinteger(L, 3);
if (lua_compatmode && mo->sprite != SPR_PLAY && newsprite == SPR_PLAY)
frame2spr2(mo, mo->frame);
{
UINT8 outframe;
mo->sprite2 = P_KartFrameToSprite2(mo->skin, mo->frame, &outframe);
mo->frame = (mo->frame & ~FF_FRAMEMASK) | outframe;
}
mo->sprite = newsprite;
break;
}
case mobj_frame:
// Check for SPR2
if (lua_compatmode && mo->sprite == SPR_PLAY)
frame2spr2(mo, (UINT32)luaL_checkinteger(L, 3));
{
UINT8 outframe;
mo->sprite2 = P_KartFrameToSprite2(mo->skin, luaL_checkinteger(L, 3), &outframe);
mo->frame = (mo->frame & ~FF_FRAMEMASK) | outframe;
}
else
mo->frame = (UINT32)luaL_checkinteger(L, 3);
break;

View file

@ -95,6 +95,71 @@ UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player)
return spr2;
}
// converts the kart player frame in inframe to the equivalent sprite2 + frame
UINT8 P_KartFrameToSprite2(skin_t *skin, UINT8 inframe, UINT8 *outframe)
{
UINT8 spr2, frame = 0;
#define F(x) case x - 'A':
switch (inframe & FF_FRAMEMASK)
{
F('A') F('B')
spr2 = SPR2_STIN;
frame = inframe & 1;
break;
F('C') F('D')
spr2 = SPR2_STIL;
frame = inframe & 1;
break;
F('E') F('F')
spr2 = SPR2_STIR;
frame = inframe & 1;
break;
F('G')
spr2 = SPR2_SLWN;
break;
F('H')
spr2 = SPR2_SLWL;
break;
F('I')
spr2 = SPR2_SLWR;
break;
F('J')
spr2 = SPR2_FSTN;
break;
F('K')
spr2 = SPR2_FSTL;
break;
F('L')
spr2 = SPR2_FSTR;
break;
F('M') F('N')
spr2 = SPR2_DRLN;
frame = inframe & 1;
break;
F('O') F('P')
spr2 = SPR2_DRRN;
frame = inframe & 1;
break;
F('Q')
spr2 = SPR2_SPIN;
break;
F('R')
spr2 = SPR2_KART;
break;
F('S')
spr2 = SPR2_SIGN;
break;
default:
spr2 = SPR2_KART;
frame = (inframe & FF_FRAMEMASK) - 18; // not 19! frame 0 is squish
break;
}
#undef F
if (outframe)
*outframe = frame;
return P_GetSkinSprite2(skin, spr2, NULL);
}
static void Sk_SetDefaultValue(skin_t *skin)
{
INT32 i;

View file

@ -96,6 +96,7 @@ void R_PatchSkins(UINT16 wadnum);
void R_AddSkins(UINT16 wadnum);
UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player);
UINT8 P_KartFrameToSprite2(skin_t *skin, UINT8 inframe, UINT8 *outframe);
#ifdef __cplusplus
} // extern "C"