From 58ddfc9da08d18c2bbd58b4af4d46f99bf6159b8 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Mon, 11 Aug 2025 15:29:23 +0200 Subject: [PATCH] Change demoheader to BlanReplay, add G_CompatLevel --- src/g_demo.c | 69 +++++++++++++++++++++++++++++++++------------------- src/g_demo.h | 1 + src/p_tick.c | 4 +-- 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index a573e2b51..2e61ea89d 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -112,7 +112,7 @@ demoghost *ghosts = NULL; // #define DEMOVERSION 0x0009 -#define DEMOHEADER "\xF0" "KartReplay" "\x0F" +#define DEMOHEADER "\xF0" "BlanReplay" "\x0F" #define DF_GHOST 0x01 // This demo contains ghost data too! #define DF_TIMEATTACK 0x02 // This demo is from Time Attack and contains its final completion time & best lap! @@ -672,36 +672,44 @@ static headerstatus_e G_ReadDemoHeader(UINT8 *dp, demoheader_t *header) header->raflags = 0; header->empty = false; - if (memcmp(dp, DEMOHEADER, 12)) - return HEADER_BADMAGIC; dp += 12; - header->version = READUINT8(dp); header->subversion = READUINT8(dp); header->demoversion = READUINT16(dp); - switch (header->demoversion) + if (!memcmp(startdp, DEMOHEADER, 12)) // BlanReplay { - case DEMOVERSION: // latest always supported - break; + switch (header->demoversion) + { + case DEMOVERSION: // latest always supported + break; - case 0x0008: // BlanKart (Pre-RA mod flags) - raflag = false; - break; - - case 0x0001: // SRB2Kart 1.0.x (only staff ghosts supported) - oldkart = kart = true; - raflag = false; - break; - - case 0x0002: // SRB2Kart 1.1+ - kart = true; - raflag = false; - break; - - default: // too old, cannot support. - return HEADER_BADVERSION; + default: // too old, cannot support. + return HEADER_BADVERSION; + } } + else if (!memcmp(startdp, "\xF0" "KartReplay" "\x0F", 12)) + { + raflag = false; + switch (header->demoversion) + { + case 0x0001: // SRB2Kart 1.0.x (only staff ghosts supported) + oldkart = kart = true; + break; + + case 0x0002: // SRB2Kart 1.1+ + kart = true; + break; + + case 0x0008: // BlanKart (Pre-RA mod flags) + break; + + default: // too old, cannot support. + return HEADER_BADVERSION; + } + } + else + return HEADER_BADMAGIC; if (oldkart) header->demotitle[0] = '\0'; @@ -947,6 +955,17 @@ static void G_FreeDemoHeader(demoheader_t *header) // and now, the rest of g_demo.c +boolean G_CompatLevel(UINT16 level) +{ + if (demo.playback) + { + // Check gameplay differences for older ghosts + return (demo.version <= level); + } + + return false; +} + static mobj_t oldmetal, oldghost[MAXPLAYERS]; void G_SaveMetal(UINT8 **buffer) @@ -1850,7 +1869,7 @@ void G_ConsGhostTic(INT32 playernum) else ghostext[playernum].desyncframes = 0; - if (demo.version != 0x0001 && + if (!G_CompatLevel(0x0001) && (players[playernum].itemtype != ghostext[playernum].kartitem || players[playernum].itemamount != ghostext[playernum].kartamount || players[playernum].bumper != ghostext[playernum].kartbumpers)) @@ -3745,7 +3764,7 @@ void G_DoPlayDemo(char *defdemoname) LUA_ClearState(); // No modeattacking check, DF_LUAVARS won't be present here. - LUA_UnArchive(&demobuf, false, demo.version <= 0x0002); + LUA_UnArchive(&demobuf, false, G_CompatLevel(0x0002)); } splitscreen = 0; diff --git a/src/g_demo.h b/src/g_demo.h index ef592664d..228822085 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -101,6 +101,7 @@ struct menudemo_t { } standings[MAXPLAYERS]; }; +boolean G_CompatLevel(UINT16 level); extern mobj_t *metalplayback; diff --git a/src/p_tick.c b/src/p_tick.c index 979c06930..76e90552e 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -721,7 +721,7 @@ void P_Ticker(boolean run) } if (demo.playback) { - if (demo.version == 0x0001 && !multiplayer) + if (G_CompatLevel(0x0001) && !multiplayer) G_ReadDemoTiccmd(&players[0].cmd, 0); else { @@ -899,7 +899,7 @@ void P_Ticker(boolean run) } else if (demo.playback) // Use Ghost data for consistency checks. { - if (!multiplayer && demo.version == 0x0001) + if (!multiplayer && G_CompatLevel(0x0001)) G_ConsGhostTic(0); else G_ConsAllGhostTics();