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
This commit is contained in:
Eidolon 2024-03-16 18:48:15 -05:00
parent e1f4aef2ef
commit bcd4a9d93e

View file

@ -1266,8 +1266,12 @@ readghosttic:
while (ziptic != DW_END) // Get rid of extradata stuff 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); ziptic = READUINT8(g->p);
if (ziptic & DXD_JOINDATA) if (ziptic & DXD_JOINDATA)
{ {
@ -1275,8 +1279,17 @@ readghosttic:
if (READUINT8(g->p) != 0) if (READUINT8(g->p) != 0)
I_Error("Ghost is not a record attack ghost (bot JOINDATA)"); I_Error("Ghost is not a record attack ghost (bot JOINDATA)");
} }
if (ziptic & DXD_PLAYSTATE && READUINT8(g->p) != DXD_PST_PLAYING) if (ziptic & DXD_PLAYSTATE)
I_Error("Ghost is not a record attack ghost (has 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) if (ziptic & DXD_SKIN)
g->p++; // We _could_ read this info, but it shouldn't change anything in record attack... g->p++; // We _could_ read this info, but it shouldn't change anything in record attack...
if (ziptic & DXD_COLOR) if (ziptic & DXD_COLOR)