From 0362a0dff481085526db2a55a06891fe3afe2632 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Thu, 18 Sep 2025 16:30:37 +0200 Subject: [PATCH] Add debugmappatch, for hot-reloading map patches --- src/d_netcmd.c | 3 +++ src/d_netcmd.h | 2 ++ src/p_setup.c | 32 ++++++++++++++++++++++---------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 4d90bc678..99618fa4a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -706,6 +706,8 @@ consvar_t cv_schedule = CVAR_INIT ("schedule", "On", CV_NETVAR|CV_CALL, CV_OnOff consvar_t cv_automate = CVAR_INIT ("automate", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_debugmappatch = CVAR_INIT ("debugmappatch", "", 0, NULL, NULL); + char timedemo_name[256]; boolean timedemo_csv; char timedemo_csv_id[256]; @@ -1312,6 +1314,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_connectawaittime); CV_RegisterVar(&cv_serverinfoscreen); + CV_RegisterVar(&cv_debugmappatch); } /** diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 385f7a3eb..a0d2ea124 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -244,6 +244,8 @@ extern consvar_t cv_director; extern consvar_t cv_schedule; +extern consvar_t cv_debugmappatch; + extern char timedemo_name[256]; extern boolean timedemo_csv; extern char timedemo_csv_id[256]; diff --git a/src/p_setup.c b/src/p_setup.c index d7aec5693..427a7ab4c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3746,21 +3746,17 @@ static boolean P_LoadMapData(const virtres_t *virt) return true; } -static boolean P_LoadMapPatchData(const lumpnum_t lumpnum) +static boolean P_LoadMapPatchData(const char *patchdata, size_t patchlen) { TracyCZone(__zone, true); size_t realnummapthings = nummapthings; // Count map data. - size_t patchlen = W_LumpLength(lumpnum); - char *patchdata = malloc(patchlen); - W_ReadLump(lumpnum, patchdata); M_TokenizerOpen(patchdata, patchlen); if (!TextmapCount(patchlen, true)) { M_TokenizerClose(); - free(patchdata); TracyCZoneEnd(__zone); return false; } @@ -3771,7 +3767,6 @@ static boolean P_LoadMapPatchData(const lumpnum_t lumpnum) // Load map data. P_LoadTextmap(true); M_TokenizerClose(); - free(patchdata); // concatenate the two mapthing arrays realmapthings = Z_Realloc(realmapthings, (nummapthings + realnummapthings) * sizeof (*mapthings), PU_LEVEL, NULL); @@ -7945,10 +7940,27 @@ static boolean P_LoadMapFromFile(void) P_MakeMapHash(curmapvirt, &maphash); // load map patch? - lumpnum_t patchlump = W_CheckNumForNameInFolder(G_BuildMapName(gamemap), "MapPatch/"); - if (patchlump != LUMPERROR) - if (!P_LoadMapPatchData(patchlump)) - CONS_Alert(CONS_ERROR, "Failed to load map patch for %s\n", G_BuildMapName(gamemap)); + char *patchdata = NULL; + size_t patchlen; + if (cv_debugmappatch.string[0]) + { + patchlen = FIL_ReadFile(cv_debugmappatch.string, (UINT8 **)(&patchdata)); + } + else + { + lumpnum_t patchlump = W_CheckNumForNameInFolder(G_BuildMapName(gamemap), "MapPatch/"); + if (patchlump != LUMPERROR) + { + patchlen = W_LumpLength(patchlump); + patchdata = Z_Malloc(patchlen, PU_STATIC, NULL); + W_ReadLump(patchlump, patchdata); + } + } + + if (patchdata != NULL && !P_LoadMapPatchData(patchdata, patchlen)) + CONS_Alert(CONS_ERROR, "Failed to load map patch for %s\n", G_BuildMapName(gamemap)); + + Z_Free(patchdata); // Copy relevant map data for NetArchive purposes. P_DeepCopySectors(&spawnsectors, §ors, numsectors);