From 3ee8bbbfc487c6184a41522cd70fb285a596f87f Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 23 Nov 2022 18:01:23 +0000 Subject: [PATCH] Adjust various EZT_s. - EZT_KART is now EZT_ITEMDATA. - Uses the new one-byte widths to reduce spurious filesize use for item type, item amount, and bumpers. - EZT_IRONMAN is now EZT_STATDATA. - Now includes kartspeed, kartweight, and charflags to be tolerant to restat. --- src/g_demo.c | 126 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 51 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index 4f56dfd36..dc816856f 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -94,11 +94,13 @@ static struct { // EZT_SCALE fixed_t scale, lastscale; - // EZT_KART - INT32 kartitem, kartamount, kartbumpers; + // EZT_ITEMDATA + SINT8 itemtype; + UINT8 itemamount, bumpers; - // EZT_IRONMAN - UINT8 skinid; + // EZT_STATDATA + UINT8 skinid, kartspeed, kartweight; + UINT32 charflags; UINT8 desyncframes; // Don't try to resync unless we've been off for two frames, to monkeypatch a few trouble spots @@ -176,14 +178,14 @@ static ticcmd_t oldcmd[MAXPLAYERS]; #define GZT_EXTRA 0x40 #define GZT_FOLLOW 0x80 // Followmobj -// GZT_EXTRA flags -#define EZT_COLOR 0x001 // Changed color (Super transformation, Mario fireflowers/invulnerability, etc.) -#define EZT_FLIP 0x002 // Reversed gravity -#define EZT_SCALE 0x004 // Changed size -#define EZT_HIT 0x008 // Damaged a mobj -#define EZT_SPRITE 0x010 // Changed sprite set completely out of PLAY (NiGHTS, SOCs, whatever) -#define EZT_KART 0x020 // Changed current held item/quantity and bumpers for battle -#define EZT_IRONMAN 0x040 // Changed object skin +// GZT_EXTRA flags (currently UINT8) +#define EZT_COLOR 0x01 // Changed color (Super transformation, Mario fireflowers/invulnerability, etc.) +#define EZT_FLIP 0x02 // Reversed gravity +#define EZT_SCALE 0x04 // Changed size +#define EZT_HIT 0x08 // Damaged a mobj +#define EZT_SPRITE 0x10 // Changed sprite set completely out of PLAY (NiGHTS, SOCs, whatever) +#define EZT_ITEMDATA 0x20 // Changed current held item/quantity and bumpers for battle +#define EZT_STATDATA 0x40 // Changed skin/stats // GZT_FOLLOW flags #define FZT_SPAWNED 0x01 // just been spawned @@ -352,9 +354,9 @@ void G_ReadDemoExtraData(void) SetPlayerSkinByNum(p, demo.skinlist[skinid].mapping); demo.currentskinid[p] = skinid; - players[p].kartspeed = demo.skinlist[skinid].kartspeed; - players[p].kartweight = demo.skinlist[skinid].kartweight; - players[p].charflags = demo.skinlist[skinid].flags; + players[p].kartspeed = ghostext[p].kartspeed = demo.skinlist[skinid].kartspeed; + players[p].kartweight = ghostext[p].kartweight = demo.skinlist[skinid].kartweight; + players[p].charflags = ghostext[p].charflags = demo.skinlist[skinid].flags; } if (extradata & DXD_COLOR) { @@ -835,23 +837,29 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) } if (ghost->player && ( - ghostext[playernum].kartitem != ghost->player->itemtype || - ghostext[playernum].kartamount != ghost->player->itemamount || - ghostext[playernum].kartbumpers != ghost->player->bumpers + ghostext[playernum].itemtype != ghost->player->itemtype || + ghostext[playernum].itemamount != ghost->player->itemamount || + ghostext[playernum].bumpers != ghost->player->bumpers )) { - ghostext[playernum].flags |= EZT_KART; - ghostext[playernum].kartitem = ghost->player->itemtype; - ghostext[playernum].kartamount = ghost->player->itemamount; - ghostext[playernum].kartbumpers = ghost->player->bumpers; + ghostext[playernum].flags |= EZT_ITEMDATA; + ghostext[playernum].itemtype = ghost->player->itemtype; + ghostext[playernum].itemamount = ghost->player->itemamount; + ghostext[playernum].bumpers = ghost->player->bumpers; } if (ghost->player && ( - ghostext[playernum].skinid != (UINT8)(((skin_t *)ghost->skin)-skins) + ghostext[playernum].skinid != (UINT8)(((skin_t *)ghost->skin)-skins) || + ghostext[playernum].kartspeed != ghost->player->kartspeed || + ghostext[playernum].kartweight != ghost->player->kartweight || + ghostext[playernum].charflags != ghost->player->charflags )) { - ghostext[playernum].flags |= EZT_IRONMAN; + ghostext[playernum].flags |= EZT_STATDATA; ghostext[playernum].skinid = (UINT8)(((skin_t *)ghost->skin)-skins); + ghostext[playernum].kartspeed = ghost->player->kartspeed; + ghostext[playernum].kartweight = ghost->player->kartweight; + ghostext[playernum].charflags = ghost->player->charflags; } if (ghostext[playernum].flags) @@ -895,14 +903,19 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) } if (ghostext[playernum].flags & EZT_SPRITE) WRITEUINT16(demo_p,oldghost[playernum].sprite); - if (ghostext[playernum].flags & EZT_KART) + if (ghostext[playernum].flags & EZT_ITEMDATA) { - WRITEINT32(demo_p, ghostext[playernum].kartitem); - WRITEINT32(demo_p, ghostext[playernum].kartamount); - WRITEINT32(demo_p, ghostext[playernum].kartbumpers); + WRITESINT8(demo_p, ghostext[playernum].itemtype); + WRITEUINT8(demo_p, ghostext[playernum].itemamount); + WRITEUINT8(demo_p, ghostext[playernum].bumpers); } - if (ghostext[playernum].flags & EZT_IRONMAN) + if (ghostext[playernum].flags & EZT_STATDATA) + { WRITEUINT8(demo_p,ghostext[playernum].skinid); + WRITEUINT8(demo_p,ghostext[playernum].kartspeed); + WRITEUINT8(demo_p,ghostext[playernum].kartweight); + WRITEUINT32(demo_p, ghostext[playernum].charflags); + } ghostext[playernum].flags = 0; } @@ -1073,17 +1086,20 @@ void G_ConsGhostTic(INT32 playernum) } if (xziptic & EZT_SPRITE) demo_p += sizeof(UINT16); - if (xziptic & EZT_KART) + if (xziptic & EZT_ITEMDATA) { - ghostext[playernum].kartitem = READINT32(demo_p); - ghostext[playernum].kartamount = READINT32(demo_p); - ghostext[playernum].kartbumpers = READINT32(demo_p); + ghostext[playernum].itemtype = READSINT8(demo_p); + ghostext[playernum].itemamount = READUINT8(demo_p); + ghostext[playernum].bumpers = READUINT8(demo_p); } - if (xziptic & EZT_IRONMAN) + if (xziptic & EZT_STATDATA) { ghostext[playernum].skinid = READUINT8(demo_p); if (ghostext[playernum].skinid >= demo.numskins) ghostext[playernum].skinid = 0; + ghostext[playernum].kartspeed = READUINT8(demo_p); + ghostext[playernum].kartweight = READUINT8(demo_p); + ghostext[playernum].charflags = READUINT32(demo_p); } } @@ -1142,29 +1158,33 @@ void G_ConsGhostTic(INT32 playernum) else ghostext[playernum].desyncframes = 0; - if (players[playernum].itemtype != ghostext[playernum].kartitem - || players[playernum].itemamount != ghostext[playernum].kartamount - || players[playernum].bumpers != ghostext[playernum].kartbumpers) + if (players[playernum].itemtype != ghostext[playernum].itemtype + || players[playernum].itemamount != ghostext[playernum].itemamount + || players[playernum].bumpers != ghostext[playernum].bumpers) { if (demosynced) CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (item/bumpers)!\n")); demosynced = false; - players[playernum].itemtype = ghostext[playernum].kartitem; - players[playernum].itemamount = ghostext[playernum].kartamount; - players[playernum].bumpers = ghostext[playernum].kartbumpers; + players[playernum].itemtype = ghostext[playernum].itemtype; + players[playernum].itemamount = ghostext[playernum].itemamount; + players[playernum].bumpers = ghostext[playernum].bumpers; } - if (demo.skinlist[ghostext[playernum].skinid].mapping != (UINT8)(((skin_t *)testmo->skin)-skins)) + if (players[playernum].kartspeed != ghostext[playernum].kartspeed + || players[playernum].kartweight != ghostext[playernum].kartweight + || players[playernum].charflags != ghostext[playernum].charflags || + demo.skinlist[ghostext[playernum].skinid].mapping != (UINT8)(((skin_t *)testmo->skin)-skins)) { if (demosynced) - CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (Character)!\n")); + CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (Character/stats)!\n")); demosynced = false; testmo->skin = &skins[demo.skinlist[ghostext[playernum].skinid].mapping]; - players[playernum].kartspeed = demo.skinlist[ghostext[playernum].skinid].kartspeed; - players[playernum].kartweight = demo.skinlist[ghostext[playernum].skinid].kartweight; - players[playernum].charflags = demo.skinlist[ghostext[playernum].skinid].flags; + players[playernum].kartspeed = ghostext[playernum].kartspeed; + players[playernum].kartweight = ghostext[playernum].kartweight; + players[playernum].charflags = ghostext[playernum].charflags; + } } @@ -1332,14 +1352,15 @@ void G_GhostTicker(void) } if (xziptic & EZT_SPRITE) g->mo->sprite = READUINT16(g->p); - if (xziptic & EZT_KART) - g->p += 12; // kartitem, kartamount, kartbumpers - if (xziptic & EZT_IRONMAN) + if (xziptic & EZT_ITEMDATA) + g->p += 3; // itemtype, itemamount, bumpers + if (xziptic & EZT_STATDATA) { UINT8 skinid = READUINT8(g->p); if (skinid >= g->numskins) skinid = 0; g->mo->skin = &skins[g->skinlist[skinid].mapping]; + g->p += 6; // kartspeed, kartweight, charflags } } @@ -2475,6 +2496,9 @@ void G_BeginRecording(void) ghostext[i].lastcolor = ghostext[i].color = GHC_NORMAL; ghostext[i].lastscale = ghostext[i].scale = FRACUNIT; ghostext[i].skinid = players[i].skin; + ghostext[i].kartspeed = players[i].kartspeed; + ghostext[i].kartweight = players[i].kartweight; + ghostext[i].charflags = players[i].charflags; if (players[i].mo) { @@ -3356,9 +3380,9 @@ void G_DoPlayDemo(char *defdemoname) // Set saved attribute values // No cheat checking here, because even if they ARE wrong... // it would only break the replay if we clipped them. - players[p].kartspeed = demo.skinlist[demo.currentskinid[p]].kartspeed; - players[p].kartweight = demo.skinlist[demo.currentskinid[p]].kartweight; - players[p].charflags = demo.skinlist[demo.currentskinid[p]].flags; + players[p].kartspeed = ghostext[p].kartspeed = demo.skinlist[demo.currentskinid[p]].kartspeed; + players[p].kartweight = ghostext[p].kartweight = demo.skinlist[demo.currentskinid[p]].kartweight; + players[p].charflags = ghostext[p].charflags = demo.skinlist[demo.currentskinid[p]].flags; players[p].lastfakeskin = lastfakeskin[p]; }