From 60abb9f01059eb13752743344dfc0df20441c05f Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Sat, 2 Aug 2025 21:54:50 +0200 Subject: [PATCH] Deduplicate frame2spr2 --- src/g_demo.c | 68 ++---------------------------------------- src/lua_mobjlib.c | 75 +++++++---------------------------------------- src/r_skins.c | 65 ++++++++++++++++++++++++++++++++++++++++ src/r_skins.h | 1 + 4 files changed, 78 insertions(+), 131 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index 03cd15c65..b2f6a9b34 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -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 diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 2c1412683..049d9f397 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -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; diff --git a/src/r_skins.c b/src/r_skins.c index f904dd8dc..71f365283 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -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; diff --git a/src/r_skins.h b/src/r_skins.h index de0a0990a..c66456b4a 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -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"