From 5650dde2ac402031c691f08621873072e16b6cc1 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 11 Feb 2024 18:18:55 -0800 Subject: [PATCH 1/7] G_DoPlayDemo: fix encoremode boolean on demo playback Fixes the Title Card using the wrong sound effect --- src/g_demo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_demo.c b/src/g_demo.c index 95ebc454a..b3fc6efbe 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -3249,7 +3249,7 @@ void G_DoPlayDemo(const char *defdemoname) P_SetRandSeed(i, randseed[i]); } - G_InitNew(demoflags & DF_ENCORE, gamemap, true, true); // Doesn't matter whether you reset or not here, given changes to resetplayer. + G_InitNew((demoflags & DF_ENCORE) != 0, gamemap, true, true); // Doesn't matter whether you reset or not here, given changes to resetplayer. for (i = 0; i < numslots; i++) { From 6dc8f45df622752bd7fff47938f85c01282552ca Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 12 Feb 2024 18:04:41 -0800 Subject: [PATCH 2/7] Replays: flags UINT8 -> UINT16 --- src/g_demo.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index b3fc6efbe..b67098534 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -64,7 +64,7 @@ tic_t demostarttime; // for comparative timing purposes static char demoname[MAX_WADPATH]; static savebuffer_t demobuf = {0}; static UINT8 *demotime_p, *demoinfo_p; -static UINT8 demoflags; +static UINT16 demoflags; boolean demosynced = true; // console warning message struct demovars_s demo; @@ -2148,7 +2148,7 @@ void G_BeginRecording(void) WRITESTRINGN(demobuf.p, mapheaderinfo[gamemap-1]->lumpname, MAXMAPLUMPNAME); M_Memcpy(demobuf.p, mapmd5, 16); demobuf.p += 16; - WRITEUINT8(demobuf.p, demoflags); + WRITEUINT16(demobuf.p, demoflags); WRITESTRINGN(demobuf.p, gametypes[gametype]->name, MAXGAMETYPELENGTH); @@ -2364,7 +2364,7 @@ void G_SetDemoTime(UINT32 ptime, UINT32 plap) UINT8 G_CmpDemoTime(char *oldname, char *newname) { UINT8 *buffer,*p; - UINT8 flags; + UINT16 flags; UINT32 oldtime = UINT32_MAX, newtime = UINT32_MAX; UINT32 oldlap = UINT32_MAX, newlap = UINT32_MAX; UINT16 oldversion; @@ -2395,7 +2395,7 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname) p += 4; // PLAY SKIPSTRING(p); // gamemap p += 16; // map md5 - flags = READUINT8(p); // demoflags + flags = READUINT16(p); // demoflags SKIPSTRING(p); // gametype p++; // numlaps G_SkipDemoExtraFiles(&p); @@ -2454,7 +2454,7 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname) } p += 4; // "PLAY" SKIPSTRING(p); // gamemap p += 16; // mapmd5 - flags = READUINT8(p); + flags = READUINT16(p); SKIPSTRING(p); // gametype p++; // numlaps G_SkipDemoExtraFiles(&p); @@ -2498,7 +2498,8 @@ void G_LoadDemoInfo(menudemo_t *pdemo) { savebuffer_t info = {0}; UINT8 *extrainfo_p; - UINT8 version, subversion, pdemoflags, worknumskins, skinid; + UINT8 version, subversion, worknumskins, skinid; + UINT16 pdemoflags; democharlist_t *skinlist = NULL; UINT16 pdemoversion, count; char mapname[MAXMAPLUMPNAME],gtname[MAXGAMETYPELENGTH]; @@ -2578,7 +2579,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo) goto corrupt; } - pdemoflags = READUINT8(info.p); + pdemoflags = READUINT16(info.p); // temp? if (!(pdemoflags & DF_MULTIPLAYER)) @@ -2914,7 +2915,7 @@ void G_DoPlayDemo(const char *defdemoname) READSTRINGN(demobuf.p, mapname, sizeof(mapname)); // gamemap demobuf.p += 16; // mapmd5 - demoflags = READUINT8(demobuf.p); + demoflags = READUINT16(demobuf.p); READSTRINGN(demobuf.p, gtname, sizeof(gtname)); // gametype @@ -3288,7 +3289,7 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname) INT32 i; char name[17], color[MAXCOLORNAME+1], md5[16]; demoghost *gh; - UINT8 flags; + UINT16 flags; UINT8 *p; mapthing_t *mthing; UINT16 count, ghostversion; @@ -3346,7 +3347,7 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname) SKIPSTRING(p); // gamemap p += 16; // mapmd5 (possibly check for consistency?) - flags = READUINT8(p); + flags = READUINT16(p); if (!(flags & DF_GHOST)) { CONS_Alert(CONS_NOTICE, M_GetText("Ghost %s: No ghost data in this demo.\n"), defdemoname); @@ -3534,7 +3535,7 @@ staffbrief_t *G_GetStaffGhostBrief(UINT8 *buffer) { UINT8 *p = buffer; UINT16 ghostversion; - UINT8 flags; + UINT16 flags; INT32 i; staffbrief_t temp = {0}; staffbrief_t *ret = NULL; @@ -3575,7 +3576,7 @@ staffbrief_t *G_GetStaffGhostBrief(UINT8 *buffer) SKIPSTRING(p); // gamemap p += 16; // mapmd5 (possibly check for consistency?) - flags = READUINT8(p); + flags = READUINT16(p); if (!(flags & DF_GHOST)) { goto fail; // we don't NEED to do it here, but whatever From b2ce6aebe7b576b52fa78134370fcdeed890b367 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 12 Feb 2024 18:08:11 -0800 Subject: [PATCH 3/7] Replays: save Grand Prix info - grandprixinfo - gp - gamespeed - masterbots - eventmode - player_t - lives - totalring --- src/g_demo.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/g_demo.c b/src/g_demo.c index b67098534..e804db401 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -56,6 +56,7 @@ #include "k_follower.h" #include "k_vote.h" #include "k_credits.h" +#include "k_grandprix.h" boolean nodrawers; // for comparative timing purposes boolean noblit; // for comparative timing purposes @@ -117,6 +118,8 @@ demoghost *ghosts = NULL; #define DF_ENCORE 0x40 #define DF_MULTIPLAYER 0x80 // This demo was recorded in multiplayer mode! +#define DF_GRANDPRIX 0x0100 + #define DEMO_SPECTATOR 0x01 #define DEMO_KICKSTART 0x02 #define DEMO_SHRINKME 0x04 @@ -2126,6 +2129,9 @@ void G_BeginRecording(void) if (multiplayer) demoflags |= DF_LUAVARS; + if (grandprixinfo.gp) + demoflags |= DF_GRANDPRIX; + // Setup header. M_Memcpy(demobuf.p, DEMOHEADER, 12); demobuf.p += 12; WRITEUINT8(demobuf.p,VERSION); @@ -2186,6 +2192,13 @@ void G_BeginRecording(void) // Save netvar data CV_SaveDemoVars(&demobuf.p); + if ((demoflags & DF_GRANDPRIX)) + { + WRITEUINT8(demobuf.p, grandprixinfo.gamespeed); + WRITEUINT8(demobuf.p, grandprixinfo.masterbots == true); + WRITEUINT8(demobuf.p, grandprixinfo.eventmode); + } + // Now store some info for each in-game player // Lat' 12/05/19: Do note that for the first game you load, everything that gets saved here is total garbage; @@ -2274,6 +2287,10 @@ void G_BeginRecording(void) // And mobjtype_t is best with UINT32 too... WRITEUINT32(demobuf.p, player->followitem); + + // GP + WRITESINT8(demobuf.p, player->lives); + WRITEINT16(demobuf.p, player->totalring); } } @@ -3042,6 +3059,15 @@ void G_DoPlayDemo(const char *defdemoname) // net var data CV_LoadDemoVars(&demobuf.p); + memset(&grandprixinfo, 0, sizeof grandprixinfo); + if ((demoflags & DF_GRANDPRIX)) + { + grandprixinfo.gp = true; + grandprixinfo.gamespeed = READUINT8(demobuf.p); + grandprixinfo.masterbots = READUINT8(demobuf.p) != 0; + grandprixinfo.eventmode = READUINT8(demobuf.p); + } + // Sigh ... it's an empty demo. if (*demobuf.p == DEMOMARKER) { @@ -3217,6 +3243,10 @@ void G_DoPlayDemo(const char *defdemoname) // Followitem players[p].followitem = READUINT32(demobuf.p); + // GP + players[p].lives = READSINT8(demobuf.p); + players[p].totalring = READINT16(demobuf.p); + // Look for the next player p = READUINT8(demobuf.p); } @@ -3400,6 +3430,9 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname) p++; } + if ((flags & DF_GRANDPRIX)) + p += 3; + if (*p == DEMOMARKER) { CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Replay is empty.\n"), defdemoname); @@ -3444,6 +3477,9 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname) p += 4; // followitem (maybe change later) + p += 1; // lives + p += 2; // rings + if (READUINT8(p) != 0xFF) { CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Invalid player slot (bad terminator)\n"), defdemoname); @@ -3609,6 +3645,9 @@ staffbrief_t *G_GetStaffGhostBrief(UINT8 *buffer) p++; // stealth } + if ((flags & DF_GRANDPRIX)) + p += 3; + // Assert first player is in and then read name if (READUINT8(p) != 0) goto fail; From aa4ff315b7d158ff3aadc9b83483013f4e1b1b71 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 12 Feb 2024 18:08:44 -0800 Subject: [PATCH 4/7] Replays: bump demo version 7 -> 8 --- src/g_demo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_demo.c b/src/g_demo.c index e804db401..587054845 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -104,7 +104,7 @@ demoghost *ghosts = NULL; // DEMO RECORDING // -#define DEMOVERSION 0x0007 +#define DEMOVERSION 0x0008 #define DEMOHEADER "\xF0" "KartReplay" "\x0F" #define DF_ATTACKMASK (ATTACKING_TIME|ATTACKING_LAP|ATTACKING_SPB) // This demo contains time/lap data From b275a14ec2b91f4443dfe1c14feb34aa27e613a4 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 12 Feb 2024 18:10:26 -0800 Subject: [PATCH 5/7] Egg TV: detect Prisons mode --- src/g_demo.c | 3 +++ src/g_demo.h | 1 + src/menus/class-egg-tv/EggTVData.cpp | 4 ++-- src/menus/class-egg-tv/EggTVData.hpp | 22 +++++++++++++++++++--- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index 587054845..87e43d750 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2667,6 +2667,9 @@ void G_LoadDemoInfo(menudemo_t *pdemo) if (pdemoflags & DF_ENCORE) pdemo->kartspeed |= DF_ENCORE; + if (pdemoflags & DF_GRANDPRIX) + pdemo->gp = true; + // Read standings! count = 0; diff --git a/src/g_demo.h b/src/g_demo.h index 501f8da72..808f3ff25 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -89,6 +89,7 @@ struct menudemo_t { INT16 gametype; SINT8 kartspeed; // Add OR DF_ENCORE for encore mode, idk UINT8 numlaps; + UINT8 gp; struct { UINT8 ranking; diff --git a/src/menus/class-egg-tv/EggTVData.cpp b/src/menus/class-egg-tv/EggTVData.cpp index 78078e9c5..f8fdd66c2 100644 --- a/src/menus/class-egg-tv/EggTVData.cpp +++ b/src/menus/class-egg-tv/EggTVData.cpp @@ -237,7 +237,7 @@ EggTVData::Replay::Replay(Folder::Cache::ReplayRef& ref) : ref_(&ref) if (info.gametype == GT_RACE) { - gametype_ = Gametype(GT_RACE, Gametype::Race { + gametype_ = Gametype(GT_RACE, info.gp, Gametype::Race { info.numlaps, kartspeed_cons_t[(info.kartspeed & ~(DF_ENCORE)) + 1].strvalue, (info.kartspeed & DF_ENCORE) != 0, @@ -245,7 +245,7 @@ EggTVData::Replay::Replay(Folder::Cache::ReplayRef& ref) : ref_(&ref) } else { - gametype_ = Gametype(info.gametype); + gametype_ = Gametype(info.gametype, info.gp); } for (const auto& data : info.standings) diff --git a/src/menus/class-egg-tv/EggTVData.hpp b/src/menus/class-egg-tv/EggTVData.hpp index b898ee45a..d7de9517d 100644 --- a/src/menus/class-egg-tv/EggTVData.hpp +++ b/src/menus/class-egg-tv/EggTVData.hpp @@ -193,12 +193,12 @@ public: }; explicit Gametype() {} - explicit Gametype(INT16 gt, Race race) : gametype_(get(gt)), var_(race) {} - explicit Gametype(INT16 gt) : gametype_(get(gt)) {} + explicit Gametype(INT16 gt, bool gp) : gametype_(get(gt)), name_(get_name(gt, gp)) {} + explicit Gametype(INT16 gt, bool gp, Race race) : Gametype(gt, gp) { var_ = race; } bool valid() const { return gametype_; } - std::string_view name() const { return valid() ? gametype_->name : ""; } + std::string_view name() const { return name_; } UINT32 rules() const { return valid() ? gametype_->rules : 0u; } bool ranks_time() const { return !ranks_points(); } @@ -208,8 +208,24 @@ public: private: const gametype_t* gametype_ = nullptr; + std::string_view name_; std::variant var_; + std::string_view get_name(INT16 gt, bool gp) const + { + if (!valid()) + { + return ""; + } + + if ((rules() & GTR_PRISONS) && gp) + { + return "Prison Break"; + } + + return gametype_->name; + } + static gametype_t* get(INT16 gt) { return gt >= 0 && gt < numgametypes ? gametypes[gt] : nullptr; } }; From 822d67e42259090d3072461049b6c96816538234 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 12 Feb 2024 18:11:07 -0800 Subject: [PATCH 6/7] Egg TV: rename "Special" mode to "Sealed Star" --- src/menus/class-egg-tv/EggTVData.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/menus/class-egg-tv/EggTVData.hpp b/src/menus/class-egg-tv/EggTVData.hpp index d7de9517d..fa7491ded 100644 --- a/src/menus/class-egg-tv/EggTVData.hpp +++ b/src/menus/class-egg-tv/EggTVData.hpp @@ -218,6 +218,11 @@ public: return ""; } + if (gt == GT_SPECIAL) + { + return "Sealed Star"; + } + if ((rules() & GTR_PRISONS) && gp) { return "Prison Break"; From 8bf2343a5d8a325724c8c75ca2e2e6d566590715 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 12 Feb 2024 18:13:09 -0800 Subject: [PATCH 7/7] Egg TV: Prisons, Sealed Star and Versus icons --- src/menus/class-egg-tv/EggTVGraphics.hpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/menus/class-egg-tv/EggTVGraphics.hpp b/src/menus/class-egg-tv/EggTVGraphics.hpp index 643da3b45..cdfc404a2 100644 --- a/src/menus/class-egg-tv/EggTVGraphics.hpp +++ b/src/menus/class-egg-tv/EggTVGraphics.hpp @@ -92,10 +92,9 @@ public: std::unordered_map gametype = { {"Race", "RHGT1"}, {"Battle", "RHGT2"}, - - // TODO: requires support in the demo format - //{"Prisons", "RHGT3"}, - //{"Special", "RHGT4"}, + {"Prison Break", "RHGT3"}, + {"Sealed Star", "RHGT4"}, + {"Versus", "RHGT5"}, }; patch fav = "RHFAV";