diff --git a/src/f_finale.c b/src/f_finale.c index 68e9c3216948704d2e7f6ff0716edcdda08e2291..c986bc9472d8a0fca97f71fc0203ded608e9a34f 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 237316e9a2bcb1efdd2f2528fa52e707ca0b984f..90574afd572038c7f4fa6a46789fd38774790788 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 3f19ce77bf9385a6c0d082cee777c14936ad7429..72627aafccd5837597b64ee0b5db673a4a3075bc 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 629f53d2460f70b00da78e0d1a31a6ce71892373..6357392b23826155b61770979bd3efb633743d2f 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 73fd5bfac404e1924c2bf5ddb7b73652d57d0100..0ff83a347317b8d8718ad02b8dfe02d4e6217e33 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 1e7ee40ad27f918d8a536a4ae2f931f95c608ac3..afef0d2d4857b9ec7d4411f086bdb0c0b89dea34 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) {