From f6f43943d7d4a7475687092d73464f8ab6646230 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Fri, 24 Jan 2025 18:26:49 +0100 Subject: [PATCH] Networked compatmode --- src/d_netcmd.c | 32 +++++++++++++++++++++++++++----- src/d_netfil.c | 8 +++++++- src/d_netfil.h | 1 + src/g_demo.c | 6 +++++- src/p_setup.c | 10 +++++----- src/p_setup.h | 5 +++-- src/w_wad.c | 8 +++++--- src/w_wad.h | 11 +++++++++-- 8 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 2a488a17c..4b3059ea5 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4381,9 +4381,24 @@ static void Command_Addfile(void) const char *addedfiles[argc]; // list of filenames already processed size_t numfilesadded = 0; // the amount of filenames processed - if (argc < 2) + size_t docompat = COM_CheckPartialParm("-c"); + size_t nocompat = COM_CheckPartialParm("-n"); + wadcompat_t compat = WC_AUTO; + + if (docompat && nocompat) { - CONS_Printf(M_GetText("addfile [filename2...] [...]: Load add-ons\n")); + CONS_Printf(M_GetText("Please specify only one of -c or -n\n")); + return; + } + else if (docompat) + compat = WC_ON; + else if (nocompat) + compat = WC_OFF; + + if (argc < 2 + (docompat || nocompat)) + { + CONS_Printf(M_GetText("addfile [-c|-n] [filename2...]: Load add-ons\n" + "-c forces compatmode, -n disables it.\n")); return; } @@ -4398,6 +4413,9 @@ static void Command_Addfile(void) int musiconly; // W_VerifyNMUSlumps isn't boolean boolean fileadded = false; + if (curarg == docompat || curarg == nocompat) + continue; + fn = COM_Argv(curarg); // For the amount of filenames previously processed... @@ -4445,7 +4463,7 @@ static void Command_Addfile(void) // Add file on your client directly if it is trivial, or you aren't in a netgame. if (!(netgame || multiplayer) || musiconly) { - P_AddWadFile(fn); + P_AddWadFile(fn, compat); addedfiles[numfilesadded++] = fn; continue; } @@ -4504,6 +4522,8 @@ static void Command_Addfile(void) WRITEMEM(buf_p, md5sum, 16); } + WRITEUINT8(buf_p, compat); + addedfiles[numfilesadded++] = fn; if (IsPlayerAdmin(consoleplayer) && (!server)) // Request to add file @@ -4524,6 +4544,7 @@ static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum) READSTRINGN(*cp, filename, 240); READMEM(*cp, md5sum, 16); + wadcompat_t compat = READUINT8(*cp); // Only the server processes this message. if (client) @@ -4569,7 +4590,7 @@ static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum) return; } - COM_BufAddText(va("addfile %s\n", filename)); + COM_BufAddText(va("addfile %s %s\n", compat == WC_ON ? "-c" : (compat == WC_OFF ? "-n" : ""), filename)); } static void Got_Addfilecmd(UINT8 **cp, INT32 playernum) @@ -4580,6 +4601,7 @@ static void Got_Addfilecmd(UINT8 **cp, INT32 playernum) READSTRINGN(*cp, filename, 240); READMEM(*cp, md5sum, 16); + wadcompat_t compat = READUINT8(*cp); if (playernum != serverplayer) { @@ -4591,7 +4613,7 @@ static void Got_Addfilecmd(UINT8 **cp, INT32 playernum) ncs = findfile(filename,md5sum,true); - if (ncs != FS_FOUND || !P_AddWadFile(filename)) + if (ncs != FS_FOUND || !P_AddWadFile(filename, compat)) { Command_ExitGame_f(); if (ncs == FS_FOUND) diff --git a/src/d_netfil.c b/src/d_netfil.c index 8b1636963..5d76a5ef6 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -214,6 +214,7 @@ UINT8 *PutFileNeeded(UINT16 firstfile) WRITEUINT32(p, wadfiles[i]->filesize); WRITESTRINGN(p, wadfilename, MAX_WADPATH); WRITEMEM(p, wadfiles[i]->md5sum, 16); + WRITEUINT8(p, wadfiles[i]->compatmode); } if (netbuffer->packettype == PT_MOREFILESNEEDED) netbuffer->u.filesneededcfg.num = count; @@ -247,6 +248,7 @@ void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr, UINT16 fi fileneeded[i].file = NULL; // The file isn't open yet READSTRINGN(p, fileneeded[i].filename, MAX_WADPATH); // The next bytes are the file name READMEM(p, fileneeded[i].md5sum, 16); // The last 16 bytes are the file checksum + fileneeded[i].compatmode = READUINT8(p); } } @@ -581,6 +583,10 @@ INT32 CL_CheckFiles(void) if (memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16)) return 2; + // compatmode has to match too! + if (wadfiles[j]->compatmode != fileneeded[i].compatmode) + return 2; + // It's accounted for! let's keep going. CONS_Debug(DBG_NETPLAY, "'%s' accounted for\n", fileneeded[i].filename); fileneeded[i].status = FS_OPEN; @@ -652,7 +658,7 @@ boolean CL_LoadServerFiles(void) continue; // Already loaded else if (fileneeded[i].status == FS_FOUND) { - P_PartialAddWadFile(fileneeded[i].filename); + P_PartialAddWadFile(fileneeded[i].filename, fileneeded[i].compatmode ? WC_ON : WC_OFF); G_SetGameModified(true, false); fileneeded[i].status = FS_OPEN; return false; diff --git a/src/d_netfil.h b/src/d_netfil.h index 2b751a59e..50d130f68 100644 --- a/src/d_netfil.h +++ b/src/d_netfil.h @@ -48,6 +48,7 @@ struct fileneeded_t UINT8 md5sum[16]; filestatus_t status; // The value returned by recsearch boolean justdownloaded; // To prevent late fragments from causing an I_Error + boolean compatmode; // Used only for download FILE *file; diff --git a/src/g_demo.c b/src/g_demo.c index e8f771747..cf64499e0 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2053,6 +2053,7 @@ void G_BeginRecording(void) nameonly(( filename = va("%s", wadfiles[i]->filename) )); WRITESTRINGN(demobuf.p, filename, MAX_WADPATH); WRITEMEM(demobuf.p, wadfiles[i]->md5sum, 16); + WRITEUINT8(demobuf.p, wadfiles[i]->compatmode); totalfiles++; } @@ -2285,6 +2286,7 @@ static void G_LoadDemoExtraFiles(UINT8 **pp) boolean toomany = false; boolean alreadyloaded; UINT8 i, j; + boolean compatmode; totalfiles = READUINT8((*pp)); for (i = 0; i < totalfiles; ++i) @@ -2297,6 +2299,7 @@ static void G_LoadDemoExtraFiles(UINT8 **pp) SKIPSTRING((*pp)); } READMEM((*pp), md5sum, 16); + compatmode = READUINT8((*pp)); if (!toomany) { @@ -2339,7 +2342,7 @@ static void G_LoadDemoExtraFiles(UINT8 **pp) } else { - P_PartialAddWadFile(filename); + P_PartialAddWadFile(filename, compatmode ? WC_ON : WC_OFF); } } } @@ -2385,6 +2388,7 @@ static UINT8 G_CheckDemoExtraFiles(UINT8 **pp, boolean quick) SKIPSTRING((*pp)); } READMEM((*pp), md5sum, 16); + (void)READUINT8((*pp)); // compatmode if (!toomany) { diff --git a/src/p_setup.c b/src/p_setup.c index 266c03405..3ff6eecba 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -8583,7 +8583,7 @@ boolean P_RunSOC(const char *socfilename) lumpnum_t lump; if (strstr(socfilename, ".soc") != NULL) - return P_AddWadFile(socfilename); + return P_AddWadFile(socfilename, WC_AUTO); lump = W_CheckNumForName(socfilename); if (lump == LUMPERROR) @@ -8665,11 +8665,11 @@ static lumpinfo_t* FindFolder(const char *folName, UINT16 *start, UINT16 *end, l // Add a wadfile to the active wad files, // replace sounds, musics, patches, textures, sprites and maps // -boolean P_AddWadFile(const char *wadfilename) +boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat) { UINT16 wadnum; - if ((wadnum = P_PartialAddWadFile(wadfilename)) == UINT16_MAX) + if ((wadnum = P_PartialAddWadFile(wadfilename, compat)) == UINT16_MAX) return false; P_MultiSetupWadFiles(true); @@ -8680,7 +8680,7 @@ boolean P_AddWadFile(const char *wadfilename) // Add a WAD file and do the per-WAD setup stages. // Call P_MultiSetupWadFiles as soon as possible after any number of these. // -UINT16 P_PartialAddWadFile(const char *wadfilename) +UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat) { size_t i, j, sreplaces = 0, mreplaces = 0, digmreplaces = 0; UINT16 numlumps, wadnum; @@ -8702,7 +8702,7 @@ UINT16 P_PartialAddWadFile(const char *wadfilename) // UINT16 mapPos, mapNum = 0; // Init file. - if ((numlumps = W_InitFile(wadfilename, false, false)) == INT16_MAX) + if ((numlumps = W_InitFile(wadfilename, false, false, compat)) == INT16_MAX) { refreshdirmenu |= REFRESHDIR_NOTLOADED; return UINT16_MAX; diff --git a/src/p_setup.h b/src/p_setup.h index 6858d7d20..02ebd29a6 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -18,6 +18,7 @@ #include "doomstat.h" #include "r_defs.h" #include "k_terrain.h" +#include "w_wad.h" #ifdef __cplusplus extern "C" { @@ -110,12 +111,12 @@ void P_PostLoadLevel(void); #ifdef HWRENDER void HWR_LoadLevel(void); #endif -boolean P_AddWadFile(const char *wadfilename); +boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat); // WARNING: The following functions should be grouped as follows: // any amount of PartialAdds followed by MultiSetups until returned true, // as soon as possible. -UINT16 P_PartialAddWadFile(const char *wadfilename); +UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat); // Run a single stage of multisetup, or all of them if fullsetup set. // fullsetup true: run everything // otherwise diff --git a/src/w_wad.c b/src/w_wad.c index 9843958d1..1d374c611 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -739,7 +739,7 @@ static UINT16 W_InitFileError (const char *filename, boolean exitworthy) // // Can now load dehacked files (.soc) // -UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup) +UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup, wadcompat_t compat) { FILE *handle; lumpinfo_t *lumpinfo = NULL; @@ -880,7 +880,9 @@ UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup) #endif // HWRENDER // check if compatmode is needed - switch (wadfile->type) + if (compat != WC_AUTO) + wadfile->compatmode = compat == WC_ON ? true : false; + else switch (wadfile->type) { case RET_WAD: wadfile->compatmode = CheckCompatWad(numwadfiles - 1); @@ -941,7 +943,7 @@ INT32 W_InitMultipleFiles(char **filenames, boolean addons) G_SetGameModified(true, false); //CONS_Debug(DBG_SETUP, "Loading %s\n", *filenames); - rc = W_InitFile(*filenames, !addons, true); + rc = W_InitFile(*filenames, !addons, true, WC_AUTO); if (rc == INT16_MAX) CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), *filenames); overallrc &= (rc != INT16_MAX) ? 1 : 0; diff --git a/src/w_wad.h b/src/w_wad.h index 445fe56bc..3b5375ca4 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -128,9 +128,16 @@ struct wadfile_t UINT8 md5sum[16]; boolean important; // also network - !W_VerifyNMUSlumps - boolean compatmode; // TODO: network this too! + boolean compatmode; }; +typedef enum wadcompat +{ + WC_AUTO, // haha WC + WC_ON, + WC_OFF, +} wadcompat_t; + #define WADFILENUM(lumpnum) (UINT16)((lumpnum)>>16) // wad flumpnum>>16) // wad file number in upper word #define LUMPNUM(lumpnum) (UINT16)((lumpnum)&0xFFFF) // lump number for this pwad @@ -144,7 +151,7 @@ void W_Shutdown(void); // Opens a WAD file. Returns the FILE * handle for the file, or NULL if not found or could not be opened FILE *W_OpenWadFile(const char **filename, boolean useerrors); // Load and add a wadfile to the active wad files, returns numbers of lumps, INT16_MAX on error -UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup); +UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup, wadcompat_t compat); // W_InitMultipleFiles returns 1 if all is okay, 0 otherwise, // so that it stops with a message if a file was not found, but not if all is okay.