diff --git a/src/g_demo.c b/src/g_demo.c index b2f6a9b34..eabf6dade 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -72,6 +72,7 @@ static char demoname[MAX_WADPATH]; static savebuffer_t demobuf = {0}; static UINT8 *demotime_p, *demoinfo_p; static UINT8 demoflags; +UINT32 raflags = 0; // Time to do some hacky shit.... boolean demosynced = true; // console warning message struct demovars_s demo; @@ -110,7 +111,7 @@ demoghost *ghosts = NULL; // DEMO RECORDING // -#define DEMOVERSION 0x0008 +#define DEMOVERSION 0x0009 #define DEMOHEADER "\xF0" "KartReplay" "\x0F" #define DF_GHOST 0x01 // This demo contains ghost data too! @@ -244,6 +245,7 @@ typedef struct char maptitle[MAXMAPLUMPNAME]; UINT64 mapchecksum; UINT8 demoflags; + UINT32 raflags; UINT8 gametype; UINT8 numlaps; @@ -657,6 +659,7 @@ static headerstatus_e G_ReadDemoHeader(UINT8 *dp, demoheader_t *header) UINT8 *startdp = dp; UINT8 attack; boolean kart = false, oldkart = false; + boolean raflag = true; // these may not be present in old demo formats, so initialize them // also initialize them so the header can be free'd without issues @@ -665,6 +668,7 @@ static headerstatus_e G_ReadDemoHeader(UINT8 *dp, demoheader_t *header) header->numcvars = 0; header->mapmusrng = 0; header->numlaps = 0; + header->raflags = 0; if (memcmp(dp, DEMOHEADER, 12)) return HEADER_BADMAGIC; @@ -679,12 +683,19 @@ static headerstatus_e G_ReadDemoHeader(UINT8 *dp, demoheader_t *header) 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. @@ -719,6 +730,11 @@ static headerstatus_e G_ReadDemoHeader(UINT8 *dp, demoheader_t *header) header->demoflags = READUINT8(dp); + if (raflag) + { + header->raflags = READUINT32(dp); + } + if (oldkart) { if (header->demoflags & DF_MULTIPLAYER) @@ -2701,6 +2717,27 @@ void G_BeginRecording(void) if (multiplayer) demoflags |= DF_LUAVARS; + // RAFlag stuff + if (!dedicated && modeattacking != ATTACKING_NONE) + { + if (cv_dummyattackingrings.value) + raflags |= RAF_RINGS; + if (cv_dummyattackingstacking.value) + raflags |= RAF_STACKING; + if (cv_dummyattackingchaining.value) + raflags |= RAF_CHAINING; + if (cv_dummyattackingslipdash.value) + raflags |= RAF_SLIPDASH; + if (cv_dummyattackingpurpledrift.value) + raflags |= RAF_PURPLEDRIFT; + if (cv_dummyattackingslopeboost.value) + raflags |= RAF_SLOPEBOOST; + } + else + { + raflags = 0; + } + // Setup header. M_Memcpy(demobuf.p, DEMOHEADER, 12); demobuf.p += 12; WRITEUINT8(demobuf.p,VERSION); @@ -2720,6 +2757,7 @@ void G_BeginRecording(void) WRITEUINT64(demobuf.p, maphash); WRITEUINT8(demobuf.p, demoflags); + WRITEUINT32(demobuf.p, raflags); WRITEUINT8(demobuf.p, gametype & 0xFF); WRITEUINT8(demobuf.p, numlaps); @@ -3515,6 +3553,7 @@ void G_DoPlayDemo(char *defdemoname) gamemap = G_MapNumber(header.maptitle)+1; demoflags = header.demoflags; + raflags = header.raflags; gametype = header.gametype; G_SetGametype(gametype); numlaps = header.numlaps; @@ -3578,6 +3617,7 @@ void G_DoPlayDemo(char *defdemoname) modeattacking = (demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT; multiplayer = !!(demoflags & DF_MULTIPLAYER); + demo.netgame = (multiplayer && !(demoflags & DF_NONETMP)); CON_ToggleOff(); diff --git a/src/g_demo.h b/src/g_demo.h index 45e0838fa..ef592664d 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -31,6 +31,18 @@ extern consvar_t cv_resyncdemo; extern tic_t demostarttime; +extern UINT32 raflags; +typedef enum +{ + RAF_RINGS = 1<<0, + RAF_STACKING = 1<<1, + RAF_CHAINING = 1<<2, + RAF_SLIPDASH = 1<<3, + RAF_PURPLEDRIFT = 1<<4, + RAF_SLOPEBOOST = 1<<5, + // up to 1<<31 is free +} raflags_t; + // Publicly-accessible demo vars struct demovars_s { char titlename[65]; diff --git a/src/p_setup.c b/src/p_setup.c index 5f5819970..8b094ab40 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -8117,12 +8117,31 @@ static void P_InitLevelSettings(boolean reloadinggamestate) gamespeed = KARTSPEED_HARD; franticitems = false; comeback = false; - ringsactive = cv_dummyattackingrings.value; - purpledriftactive = cv_dummyattackingpurpledrift.value; - stackingactive = cv_dummyattackingstacking.value; - chainingactive = cv_dummyattackingchaining.value; - slipdashactive = cv_dummyattackingslipdash.value; - slopeboostactive = cv_dummyattackingslopeboost.value; + if (demo.playback) + { + // raflags + if (raflags & RAF_RINGS) + ringsactive = true; + if (raflags & RAF_STACKING) + stackingactive = true; + if (raflags & RAF_CHAINING) + chainingactive = true; + if (raflags & RAF_SLIPDASH) + slipdashactive = true; + if (raflags & RAF_PURPLEDRIFT) + purpledriftactive = true; + if (raflags & RAF_SLOPEBOOST) + slopeboostactive = true; + } + else + { + ringsactive = cv_dummyattackingrings.value; + purpledriftactive = cv_dummyattackingpurpledrift.value; + stackingactive = cv_dummyattackingstacking.value; + chainingactive = cv_dummyattackingchaining.value; + slipdashactive = cv_dummyattackingslipdash.value; + slopeboostactive = cv_dummyattackingslopeboost.value; + } } else {