From 5f5f8053fec5df71f035fd4a1c73f42c6d964a5f Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Mon, 13 Nov 2023 11:46:55 -0300 Subject: [PATCH] Update sprite2 serialize Increase demo version Fix code not using P_GetSkinSpritedef Fix code not using correct data type for player sprite --- src/f_finale.c | 2 +- src/g_demo.c | 20 ++++++++++---------- src/info.h | 3 --- src/m_menu.c | 2 +- src/p_mobj.c | 21 ++++++++++++++++----- src/p_saveg.c | 6 +++--- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 68e9c3216..c986bc947 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -3527,7 +3527,7 @@ void F_TitleDemoTicker(void) // ========== static skin_t *contskins[2]; -static UINT8 cont_spr2[2][6]; +static UINT16 cont_spr2[2][6]; static UINT8 *contcolormaps[2]; void F_StartContinue(void) diff --git a/src/g_demo.c b/src/g_demo.c index 237316e9a..90574afd5 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -98,7 +98,7 @@ demoghost *ghosts = NULL; // DEMO RECORDING // -#define DEMOVERSION 0x0010 +#define DEMOVERSION 0x0011 #define DEMOHEADER "\xF0" "SRB2Replay" "\x0F" #define DF_GHOST 0x01 // This demo contains ghost data too! @@ -409,7 +409,7 @@ void G_WriteGhostTic(mobj_t *ghost) { oldghost.sprite2 = ghost->sprite2; ziptic |= GZT_SPR2; - WRITEUINT8(demo_p,oldghost.sprite2); + WRITEUINT16(demo_p,oldghost.sprite2); } // Check for sprite set changes @@ -509,7 +509,7 @@ void G_WriteGhostTic(mobj_t *ghost) temp = ghost->player->followmobj->z-ghost->z; WRITEFIXED(demo_p,temp); if (followtic & FZT_SKIN) - WRITEUINT8(demo_p,ghost->player->followmobj->sprite2); + WRITEUINT16(demo_p,ghost->player->followmobj->sprite2); WRITEUINT16(demo_p,ghost->player->followmobj->sprite); WRITEUINT8(demo_p,(ghost->player->followmobj->frame & FF_FRAMEMASK)); WRITEUINT16(demo_p,ghost->player->followmobj->color); @@ -722,7 +722,7 @@ void G_GhostTicker(void) if (ziptic & GZT_FRAME) g->oldmo.frame = READUINT8(g->p); if (ziptic & GZT_SPR2) - g->oldmo.sprite2 = READUINT8(g->p); + g->oldmo.sprite2 = (g->version < 0x0011) ? READUINT8(g->p) : READUINT16(g->p); // Update ghost P_UnsetThingPosition(g->mo); @@ -924,7 +924,7 @@ void G_GhostTicker(void) follow->z = g->mo->z + temp; P_SetThingPosition(follow); if (followtic & FZT_SKIN) - follow->sprite2 = READUINT8(g->p); + follow->sprite2 = (g->version < 0x0011) ? READUINT8(g->p) : READUINT16(g->p); else follow->sprite2 = 0; follow->sprite = READUINT16(g->p); @@ -1039,7 +1039,7 @@ void G_ReadMetalTic(mobj_t *metal) oldmetal.frame = G_ConvertOldFrameFlags(oldmetal.frame); } if (ziptic & GZT_SPR2) - oldmetal.sprite2 = READUINT8(metal_p); + oldmetal.sprite2 = (g->version < 0x0011) ? READUINT8(metal_p) : READUINT16(metal_p); // Set movement, position, and angle // oldmetal contains where you're supposed to be. @@ -1172,7 +1172,7 @@ void G_ReadMetalTic(mobj_t *metal) follow->z = metal->z + temp; P_SetThingPosition(follow); if (followtic & FZT_SKIN) - follow->sprite2 = READUINT8(metal_p); + follow->sprite2 = (g->version < 0x0011) ? READUINT8(metal_p) : READUINT16(metal_p); else follow->sprite2 = 0; follow->sprite = READUINT16(metal_p); @@ -1180,7 +1180,7 @@ void G_ReadMetalTic(mobj_t *metal) if (metalversion < 0x000f) follow->frame = G_ConvertOldFrameFlags(follow->frame); follow->angle = metal->angle; - follow->color = (metalversion==0x000c) ? READUINT8(metal_p) : READUINT16(metal_p); + follow->color = (metalversion == 0x000c) ? READUINT8(metal_p) : READUINT16(metal_p); if (!(followtic & FZT_SPAWNED)) { @@ -1281,7 +1281,7 @@ void G_WriteMetalTic(mobj_t *metal) { oldmetal.sprite2 = metal->sprite2; ziptic |= GZT_SPR2; - WRITEUINT8(demo_p,oldmetal.sprite2); + WRITEUINT16(demo_p,oldmetal.sprite2); } // Check for sprite set changes @@ -1356,7 +1356,7 @@ void G_WriteMetalTic(mobj_t *metal) temp = metal->player->followmobj->z-metal->z; WRITEFIXED(demo_p,temp); if (followtic & FZT_SKIN) - WRITEUINT8(demo_p,metal->player->followmobj->sprite2); + WRITEUINT16(demo_p,metal->player->followmobj->sprite2); WRITEUINT16(demo_p,metal->player->followmobj->sprite); WRITEUINT32(demo_p,metal->player->followmobj->frame); // NOT & FF_FRAMEMASK here, so 32 bits WRITEUINT16(demo_p,metal->player->followmobj->color); diff --git a/src/info.h b/src/info.h index 3f19ce77b..72627aafc 100644 --- a/src/info.h +++ b/src/info.h @@ -1076,9 +1076,6 @@ typedef enum sprite NUMSPRITES } spritenum_t; -// Make sure to be conscious of FF_FRAMEMASK and the fact sprite2 is stored as a UINT8 whenever you change this table. -// Currently, FF_FRAMEMASK is 0xff, or 255 - but the second half is used by FF_SPR2SUPER, so the limitation is 0x7f. -// Since this is zero-based, there can be at most 128 different SPR2_'s without changing that. typedef enum playersprite { SPR2_STND = 0, diff --git a/src/m_menu.c b/src/m_menu.c index 629f53d24..6357392b2 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -11984,7 +11984,7 @@ static void M_HandleConnectIP(INT32 choice) static fixed_t multi_tics; static UINT8 multi_frame; -static UINT8 multi_spr2; +static UINT16 multi_spr2; static boolean multi_paused; static boolean multi_invcolor; diff --git a/src/p_mobj.c b/src/p_mobj.c index 73fd5bfac..0ff83a347 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -83,9 +83,15 @@ void P_AddCachedAction(mobj_t *mobj, INT32 statenum) // static void P_SetupStateAnimation(mobj_t *mobj, state_t *st) { - INT32 animlength = (mobj->sprite == SPR_PLAY && mobj->skin) - ? (INT32)(((skin_t *)mobj->skin)->sprites[mobj->sprite2].numframes) - 1 - : st->var1; + INT32 animlength; + + if (mobj->sprite == SPR_PLAY && mobj->skin) + { + spritedef_t *spritedef = P_GetSkinSpritedef(mobj->skin, mobj->sprite2); + animlength = (INT32)(spritedef->numframes); + } + else + animlength = st->var1; if (!(st->frame & FF_ANIMATE)) return; @@ -136,8 +142,13 @@ FUNCINLINE static ATTRINLINE void P_CycleStateAnimation(mobj_t *mobj) } // sprite2 version of above - if (mobj->skin && (((++mobj->frame) & FF_FRAMEMASK) >= (UINT32)(((skin_t *)mobj->skin)->sprites[mobj->sprite2].numframes))) - mobj->frame &= ~FF_FRAMEMASK; + if (mobj->skin) + { + spritedef_t *spritedef = P_GetSkinSpritedef(mobj->skin, mobj->sprite2); + UINT32 anim_length = (UINT32)(spritedef->numframes); + if (((++mobj->frame) & FF_FRAMEMASK) >= anim_length) + mobj->frame &= ~FF_FRAMEMASK; + } } // diff --git a/src/p_saveg.c b/src/p_saveg.c index 1e7ee40ad..afef0d2d4 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1898,7 +1898,7 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (diff & MD_SPRITE) { WRITEUINT16(save_p, mobj->sprite); if (mobj->sprite == SPR_PLAY) - WRITEUINT8(save_p, mobj->sprite2); + WRITEUINT16(save_p, mobj->sprite2); } if (diff & MD_FRAME) { @@ -2926,12 +2926,12 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) if (diff & MD_SPRITE) { mobj->sprite = READUINT16(save_p); if (mobj->sprite == SPR_PLAY) - mobj->sprite2 = READUINT8(save_p); + mobj->sprite2 = READUINT16(save_p); } else { mobj->sprite = mobj->state->sprite; if (mobj->sprite == SPR_PLAY) - mobj->sprite2 = mobj->state->frame&FF_FRAMEMASK; + mobj->sprite2 = P_GetStateSprite2(mobj->state); } if (diff & MD_FRAME) {