Add debugmappatch, for hot-reloading map patches

This commit is contained in:
GenericHeroGuy 2025-09-18 16:30:37 +02:00
parent 7c7368fe93
commit 0362a0dff4
3 changed files with 27 additions and 10 deletions

View file

@ -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);
}
/**

View file

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

View file

@ -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, &sectors, numsectors);