From 0362a0dff481085526db2a55a06891fe3afe2632 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Thu, 18 Sep 2025 16:30:37 +0200 Subject: [PATCH 1/4] 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); From fd65151d50aa923dddc2ab8f1b98a75773087673 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Thu, 18 Sep 2025 21:19:06 +0200 Subject: [PATCH 2/4] Fix ghost hitlist causing zone errors (closes #118) Beware the wrath of PU_LEVEL --- src/g_demo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/g_demo.c b/src/g_demo.c index 9798ee567..ba55c2863 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -1466,7 +1466,7 @@ void G_GhostAddHit(INT32 playernum, mobj_t *victim) return; ghostext[playernum].flags |= EZT_HIT; ghostext[playernum].hits++; - ghostext[playernum].hitlist = Z_Realloc(ghostext[playernum].hitlist, ghostext[playernum].hits * sizeof(mobj_t *), PU_LEVEL, &ghostext[playernum].hitlist); + Z_Realloc(ghostext[playernum].hitlist, ghostext[playernum].hits * sizeof(mobj_t *), PU_STATIC, &ghostext[playernum].hitlist); P_SetTarget(ghostext[playernum].hitlist + (ghostext[playernum].hits-1), victim); } @@ -1648,6 +1648,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) WRITEANGLE(demobuf.p,mo->angle); P_SetTarget(ghostext[playernum].hitlist+i, NULL); } + Z_Free(ghostext[playernum].hitlist); ghostext[playernum].hits = 0; } if (ghostext[playernum].flags & EZT_SPRITE) From b6c34067bbd8bda4cb61f8064fb2d21d05f8f49d Mon Sep 17 00:00:00 2001 From: Anonimus Date: Thu, 18 Sep 2025 15:12:02 -0400 Subject: [PATCH 3/4] Universal scale for cluster distancing Should hopefully make gradienting less punishing on maps like Green Cave --- src/k_kart.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8b9d98270..7a9697293 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9364,6 +9364,30 @@ void K_KartLegacyUpdatePosition(player_t *player) player->position = position; } +/*-------------------------------------------------- + UINT32 K_UndoMapScaling(UINT32 distance) + + Takes a raw map distance and adjusts it to + be in x1 scale. + + Input Arguments:- + distance - Original distance. + + Return:- + Distance unscaled by mapobjectscale. +--------------------------------------------------*/ +static UINT32 K_UndoMapScaling(UINT32 distance) +{ + if (mapobjectscale != FRACUNIT) + { + // Bring back to normal scale. + return FixedDiv(distance, mapobjectscale); + } + + return distance; +} + + // Brute-force finds the area on the course with the highest player density in a given radius. // Based on DBSCAN, so it "chain-scans" neighboring players as well for a more accurate result. UINT32 clusterid = 0; @@ -9462,8 +9486,9 @@ void K_UpdateAllPlayerPositions(void) // First loop: Ensure all players' distance to the finish line are all accurate for (i = 0; i < MAXPLAYERS; i++) { - player_t *player = &players[i]; - if (!playeringame[i] || player->spectator || !player->mo || P_MobjWasRemoved(player->mo)) + player_t* player = &players[i]; + if (!playeringame[i] || player->spectator || !player->mo || + P_MobjWasRemoved(player->mo)) { continue; } @@ -9482,8 +9507,9 @@ void K_UpdateAllPlayerPositions(void) else K_KartUpdatePosition(&players[i]); - // Get the cluster distance. - players[i].distancefromcluster = K_UpdateDistanceFromCluster(&players[i]); + // Get the cluster distance. + players[i].distancefromcluster = + K_UndoMapScaling(K_UpdateDistanceFromCluster(&players[i])); } } } From b36b327a001bfe3053200b7f1c08bc572978902c Mon Sep 17 00:00:00 2001 From: Anonimus Date: Thu, 18 Sep 2025 15:26:36 -0400 Subject: [PATCH 4/4] UPDAYTE DE GOT TAMN HAYSH Maybe we should move hashes to a header that's easy to drop in from asset compiling? Maybe? ...please? --- src/d_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index bc532caa2..d320ecb78 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -91,7 +91,7 @@ #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 #define ASSET_HASH_MAIN_PK3 0x3d5cb0195efa4f84 -#define ASSET_HASH_MAPPATCH_PK3 0xb15b03c61e08d93b +#define ASSET_HASH_MAPPATCH_PK3 0xefe28bb9de73a31c #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000