From fec835a5444a0cc571c2583e762aca3392658055 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 3 Aug 2025 17:47:10 -0400 Subject: [PATCH] Remove DXD_START, add demo header info for attack starts --- src/g_demo.cpp | 38 ++++++++++++++++++++++++++++++++------ src/g_demo.h | 5 +++-- src/k_kart.c | 3 +-- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/g_demo.cpp b/src/g_demo.cpp index 172309016..a769f59dd 100644 --- a/src/g_demo.cpp +++ b/src/g_demo.cpp @@ -118,7 +118,7 @@ size_t copy_fixed_buf(void* p, const void* s, size_t n) static char demoname[MAX_WADPATH]; static savebuffer_t demobuf = {0}; -static UINT8 *demotime_p, *demoinfo_p; +static UINT8 *demotime_p, *demoinfo_p, *demoattack_p; static UINT16 demoflags; boolean demosynced = true; // console warning message @@ -1249,6 +1249,9 @@ void G_ConsGhostTic(INT32 playernum) void G_GhostTicker(void) { demoghost *g,*p; + + tic_t fastforward = 0; + for (g = ghosts, p = NULL; g; g = g->next) { UINT16 ziptic; @@ -1258,10 +1261,11 @@ void G_GhostTicker(void) { continue; } - // Pause jhosts that cross until the timer starts. - if (g->linecrossed && leveltime < starttime && G_TimeAttackStart()) + if (g->attackstart != INT32_MAX && leveltime < starttime && leveltime >= g->attackstart && G_TimeAttackStart()) + { continue; + } readghosttic: #define follow g->mo->tracer @@ -1327,8 +1331,6 @@ fadeghost: g->p += g->sizes.skin_name + g->sizes.color_name; if (ziptic & DXD_WEAPONPREF) g->p++; // ditto - if (ziptic & DXD_START) - g->linecrossed = true; } else if (ziptic == DW_RNG) { @@ -1597,8 +1599,17 @@ skippedghosttic: I_Error("Ghost is not a record attack ghost GHOSTEND"); //@TODO lmao don't blow up like this // If the timer started, skip ahead until the ghost starts too. - if (starttime <= leveltime && !g->linecrossed && G_TimeAttackStart()) + if (!fastforward && linecrossed && g->attackstart != INT32_MAX && leveltime < g->attackstart && G_TimeAttackStart()) + { + fastforward = g->attackstart - leveltime; + g->attackstart = INT32_MAX; + } + + if (fastforward) + { + fastforward--; goto readghosttic; + } p = g; #undef follow @@ -2054,6 +2065,10 @@ void G_BeginRecording(void) demoinfo_p = demobuf.p; WRITEUINT32(demobuf.p, 0); + // If special attack-start timing applies, we need to know where to skip the ghost to + demoattack_p = demobuf.p; + WRITEUINT32(demobuf.p, INT32_MAX); + // Save netvar data CV_SaveDemoVars(&demobuf.p); @@ -2219,6 +2234,11 @@ void srb2::write_current_demo_end_marker() *(UINT32 *)demoinfo_p = demobuf.p - demobuf.buffer; } +void G_SetDemoAttackTiming(tic_t time) +{ + *(UINT32 *)demoattack_p = time; +} + void G_SetDemoTime(UINT32 ptime, UINT32 plap) { if (!demo.recording || !demotime_p) @@ -2573,6 +2593,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo, boolean allownonmultiplayer) } extrainfo_p = info.buffer + READUINT32(info.p); // The extra UINT32 read is for a blank 4 bytes? + info.p += 4; // attack start // Pared down version of CV_LoadNetVars to find the kart speed pdemo->kartspeed = KARTSPEED_NORMAL; // Default to normal speed @@ -3072,6 +3093,7 @@ void G_DoPlayDemoEx(const char *defdemoname, lumpnum_t deflumpnum) } demobuf.p += 4; // Extrainfo location + demobuf.p += 4; // Attack start // ...*map* not loaded? if (!gamemap || (gamemap > nummapheaders) || !mapheaderinfo[gamemap-1] || mapheaderinfo[gamemap-1]->lumpnum == LUMPERROR) @@ -3487,6 +3509,7 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname) } p += 4; // Extra data location reference + UINT32 attackstart = READUINT32(p); // net var data count = READUINT16(p); @@ -3578,6 +3601,8 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname) gh->numskins = worknumskins; gh->skinlist = skinlist; + gh->attackstart = attackstart; + ghosts = gh; gh->version = ghostversion; @@ -3729,6 +3754,7 @@ staffbrief_t *G_GetStaffGhostBrief(UINT8 *buffer) } p += 4; // Extrainfo location marker + p += 4; // Attack start info // Ehhhh don't need ghostversion here (?) so I'll reuse the var here ghostversion = READUINT16(p); diff --git a/src/g_demo.h b/src/g_demo.h index 4ce05c2a3..39292d54e 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -159,7 +159,6 @@ extern UINT8 demo_writerng; #define DXD_NAME 0x08 // name changed #define DXD_COLOR 0x10 // color changed #define DXD_FOLLOWER 0x20 // follower was changed -#define DXD_START 0x40 // Crossed the line in TA #define DXD_ADDPLAYER (DXD_JOINDATA|DXD_PLAYSTATE|DXD_COLOR|DXD_NAME|DXD_SKIN|DXD_FOLLOWER) @@ -203,7 +202,7 @@ struct demoghost { UINT8 fadein; UINT16 version; UINT8 numskins; - boolean linecrossed; + tic_t attackstart; boolean done; democharlist_t *skinlist; mobj_t oldmo, *mo; @@ -238,6 +237,8 @@ void G_DeferedPlayDemo(const char *demo); void G_SaveDemo(void); void G_ResetDemoRecording(void); +void G_SetDemoAttackTiming(tic_t time); + boolean G_CheckDemoTitleEntry(void); typedef enum diff --git a/src/k_kart.c b/src/k_kart.c index 570597437..ba26f506d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9673,9 +9673,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) */ starttime = leveltime; + G_SetDemoAttackTiming(leveltime); - if (demo.recording) - demo_extradata[player-players] |= DXD_START; Music_Stop("position"); }