From bcd4a9d93ef3ebbec84a1e9addcc14ee15622033 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sat, 16 Mar 2024 18:48:15 -0500 Subject: [PATCH] Allow player extradatas past p0 in ghost demos In some cases, bogus extradata is written into Record Attack demos, which causes a crash when attempting to play RA with such a ghost. We should skip this data too, because only extra real tic data is a problem for ghost playback, not extradata. Fixes KartKrew/Kart#1175 --- src/g_demo.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/g_demo.cpp b/src/g_demo.cpp index 82dc30251..b210ea5a4 100644 --- a/src/g_demo.cpp +++ b/src/g_demo.cpp @@ -1266,8 +1266,12 @@ readghosttic: while (ziptic != DW_END) // Get rid of extradata stuff { - if (ziptic == 0) // Only support player 0 info for now + if (ziptic < MAXPLAYERS) { + UINT8 playerid = ziptic; + // We want to skip *any* player extradata because some demos have extradata for bogus players, + // but if there is tic data later for those players *then* we'll consider it invalid. + ziptic = READUINT8(g->p); if (ziptic & DXD_JOINDATA) { @@ -1275,8 +1279,17 @@ readghosttic: if (READUINT8(g->p) != 0) I_Error("Ghost is not a record attack ghost (bot JOINDATA)"); } - if (ziptic & DXD_PLAYSTATE && READUINT8(g->p) != DXD_PST_PLAYING) - I_Error("Ghost is not a record attack ghost (has PLAYSTATE)"); + if (ziptic & DXD_PLAYSTATE) + { + UINT8 playstate = READUINT8(g->p); + if (playstate != DXD_PST_PLAYING) + { +#ifdef DEVELOP + CONS_Alert(CONS_WARNING, "Ghost demo has non-playing playstate for player %d\n", playerid + 1); +#endif + ; + } + } if (ziptic & DXD_SKIN) g->p++; // We _could_ read this info, but it shouldn't change anything in record attack... if (ziptic & DXD_COLOR)