Add Support for the RA mods system into demos

This commit is contained in:
NepDisk 2025-08-06 11:26:02 -04:00
parent 8a895d4813
commit 2b09090dfb
3 changed files with 78 additions and 7 deletions

View file

@ -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();

View file

@ -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];

View file

@ -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
{