From 15cd75eeadabd466566fe3f7c8f7c22d6e50623e Mon Sep 17 00:00:00 2001 From: yamamama Date: Thu, 25 Dec 2025 06:53:29 -0500 Subject: [PATCH 1/5] Per-item RUNNERAUGMENT distances --- src/deh_soc.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/k_items.c | 29 +++++++++++++++++++++-------- src/k_items.h | 2 ++ 3 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 74029b519..60cbb8030 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -4163,6 +4163,8 @@ void readkartitem(MYFILE *f, kartitem_t *item) #define WARN(str, ...) deh_warning("KartResult %s: " str, result->cvar->name, __VA_ARGS__) #define WARN0(str) deh_warning("KartResult %s: " str, result->cvar->name) +static CV_PossibleValue_t kartrunneraugment_cons_t[] = {{0, "MIN"}, {30000, "MAX"}, {0, NULL}}; + void readkartresult(MYFILE *f, kartresult_t *result) { char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); @@ -4224,6 +4226,55 @@ void readkartresult(MYFILE *f, kartresult_t *result) { result->flags = get_number(word2); } + else if (fastncmp(word, "RUNNERDISTANCE", 14)) + { + const UINT8 idx = (fastcmp(word+14, "LEGACY") ? 1 : 0); + + result->baserunneraug[idx] = get_number(word2); + + if (result->augcvar[idx] == NULL) + { + char *cvname; + + if (idx) + { + cvname = malloc(strlen(result->cvar->name)+1 + 18); + sprintf(cvname, "runnerdist_%s_legacy", result->cvar->name); + strlwr(cvname); + } + else + { + cvname = malloc(strlen(result->cvar->name)+1 + 11); + sprintf(cvname, "runnerdist_%s", result->cvar->name); + strlwr(cvname); + } + + consvar_t *var = Z_Calloc(sizeof(consvar_t), PU_STATIC, &result->augcvar[idx]); + var->name = cvname; + + var->defaultvalue = malloc(strlen(va("%d", result->baserunneraug[idx]))+1); + sprintf(var->defaultvalue, "%d", result->baserunneraug[idx]); + + var->value = result->baserunneraug[idx]; + + var->flags = CV_NETVAR|CV_CHEAT; + var->PossibleValue = kartrunneraugment_cons_t; + var->func = NULL; + CV_RegisterVar(var); + + //CONS_Printf("Allocated cvar data successfully\n"); + } + else + { + // Reallocate the data and set a new default value. + realloc(result->augcvar[idx]->defaultvalue, strlen(va("%d", result->baserunneraug[idx]))+1); + sprintf(result->augcvar[idx]->defaultvalue, "%d", result->baserunneraug[idx]); + + result->augcvar[idx]->value = result->baserunneraug[idx]; + + //CONS_Printf("Reallocated cvar data successfully\n"); + } + } else if (fastncmp(word, "ODDS", 4)) { UINT8 oddstable; diff --git a/src/k_items.c b/src/k_items.c index d09cb8330..82226f94a 100644 --- a/src/k_items.c +++ b/src/k_items.c @@ -257,16 +257,27 @@ static boolean K_InStartCooldown(void) // Magic number distance for use with item roulette tiers #define ACTIVEDISTVAR (K_LegacyOddsMode() ? DISTVAR_LEGACY : DISTVAR) -#define ACTIVESPBDIST (K_LegacyOddsMode() ? SPBDISTVAR_LEGACY : SPBDISTVAR) - -#define SPBSTARTDIST (ACTIVESPBDIST) // Distance when SPB can start appearing -#define SPBFORCEDIST (7 * ACTIVESPBDIST / 2) // Distance when SPB is forced onto 2nd place (3.5x SPBDISTVAR) #define ENDDIST (12*ACTIVEDISTVAR) // Distance when the game stops giving you bananas static boolean K_RaceForceSPB(SINT8 playerpos, UINT32 pdis) { - return ((gametyperules & GTR_CIRCUIT) && playerpos == 2 && pdis > (UINT32)SPBFORCEDIST); + UINT8 idx = K_LegacyOddsMode() ? 1 : 0; + + kartresult_t *spb_res = K_GetKartResult("selfpropelledbomb"); + + if (!spb_res) + { + return false; + } + + if (spb_res->augcvar[idx] == NULL) + { + // ?! + return false; + } + + return ((gametyperules & GTR_CIRCUIT) && playerpos == 2 && pdis > (UINT32)(7 * spb_res->augcvar[idx]->value / 2)); } // 1/21/2025: I hate tiptoeing around the integer limit. @@ -773,11 +784,13 @@ static INT32 GetItemOdds(kartroulette_t *roulette, kartresult_t *result, UINT8 * return newodds; } - if (flags & KRF_RUNNERAUGMENT) + UINT8 aug_idx = K_LegacyOddsMode() ? 1 : 0; + + if ((flags & KRF_RUNNERAUGMENT) && (result->augcvar[aug_idx] != NULL)) { // These odds get stronger as 1st's frontrun increases. - const INT32 distFromStart = max(secondToFirst - SPBSTARTDIST, 0); - const INT32 distRange = SPBFORCEDIST - SPBSTARTDIST; + const INT32 distFromStart = max(secondToFirst - result->augcvar[aug_idx]->value, 0); + const INT32 distRange = (7 * result->augcvar[aug_idx]->value / 2) - result->augcvar[aug_idx]->value; const INT32 mulMax = 24; INT32 multiplier = (distFromStart * mulMax) / distRange; diff --git a/src/k_items.h b/src/k_items.h index 9098661a6..dd256a344 100644 --- a/src/k_items.h +++ b/src/k_items.h @@ -128,6 +128,8 @@ struct kartresult_t { // this block is shared by all item variants consvar_t *cvar; // contains name + consvar_t *augcvar[2]; // "Runner Augment" console variable + UINT16 baserunneraug[2]; // Base "max distance" value for KRF_RUNNERAUGMENT items kartitemtype_e type; UINT8 amount; From 3013a720a4f905f7fbf2bc73418fc8a97ac1e745 Mon Sep 17 00:00:00 2001 From: yamamama Date: Thu, 25 Dec 2025 21:46:08 -0500 Subject: [PATCH 2/5] Properly set the cvar value --- src/deh_soc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 60cbb8030..898719c00 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -4270,7 +4270,7 @@ void readkartresult(MYFILE *f, kartresult_t *result) realloc(result->augcvar[idx]->defaultvalue, strlen(va("%d", result->baserunneraug[idx]))+1); sprintf(result->augcvar[idx]->defaultvalue, "%d", result->baserunneraug[idx]); - result->augcvar[idx]->value = result->baserunneraug[idx]; + CV_StealthSet(result->augcvar[idx], result->augcvar[idx]->defaultvalue); //CONS_Printf("Reallocated cvar data successfully\n"); } From 606784ce14ef2e4a7941dfb8be48216a6aec9615 Mon Sep 17 00:00:00 2001 From: yamamama Date: Fri, 26 Dec 2025 01:36:34 -0500 Subject: [PATCH 3/5] Forgot to actually differentiate Alt. item runnerdist cvars --- src/deh_soc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 898719c00..42ec736d7 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -4236,16 +4236,18 @@ void readkartresult(MYFILE *f, kartresult_t *result) { char *cvname; + UINT16 distprefixlen = strlen(result->isalt ? "runnerdistalt" : "runnerdist"); + if (idx) { - cvname = malloc(strlen(result->cvar->name)+1 + 18); - sprintf(cvname, "runnerdist_%s_legacy", result->cvar->name); + cvname = malloc(strlen(result->cvar->name) + 9 + distprefixlen); + sprintf(cvname, "%s_%s_legacy", result->isalt ? "runnerdistalt" : "runnerdist", result->cvar->name); strlwr(cvname); } else { - cvname = malloc(strlen(result->cvar->name)+1 + 11); - sprintf(cvname, "runnerdist_%s", result->cvar->name); + cvname = malloc(strlen(result->cvar->name) + 2 + distprefixlen); + sprintf(cvname, "%s_%s", result->isalt ? "runnerdistalt" : "runnerdist", result->cvar->name); strlwr(cvname); } From 7331e41b57a5ef93192b58df73fa2cf3a0f3ca21 Mon Sep 17 00:00:00 2001 From: yamamama Date: Fri, 26 Dec 2025 17:35:26 -0500 Subject: [PATCH 4/5] Fix realloc use-after-free, better safeguard the defaultvalue overwrite --- src/deh_soc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 42ec736d7..aa66c2c8f 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -4266,10 +4266,10 @@ void readkartresult(MYFILE *f, kartresult_t *result) //CONS_Printf("Allocated cvar data successfully\n"); } - else + else if (result->augcvar[idx]->defaultvalue) { // Reallocate the data and set a new default value. - realloc(result->augcvar[idx]->defaultvalue, strlen(va("%d", result->baserunneraug[idx]))+1); + result->augcvar[idx]->defaultvalue = realloc(result->augcvar[idx]->defaultvalue, strlen(va("%d", result->baserunneraug[idx]))+1); sprintf(result->augcvar[idx]->defaultvalue, "%d", result->baserunneraug[idx]); CV_StealthSet(result->augcvar[idx], result->augcvar[idx]->defaultvalue); From cf4120be13f9a3e65ecda17a3665ad74640216ab Mon Sep 17 00:00:00 2001 From: yamamama Date: Sat, 27 Dec 2025 17:43:23 -0500 Subject: [PATCH 5/5] Kill kartspbdist The changes to KRF_RUNNERAUGMENT obsolete the need for this cvar entirely LMAO --- src/d_netcmd.c | 5 ----- src/d_netcmd.h | 2 -- src/k_items.h | 2 -- src/k_kart.c | 2 -- 4 files changed, 11 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 3794e72c2..c347435d9 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -622,11 +622,6 @@ consvar_t cv_kartantibump = CVAR_INIT ("kartantibump", "0", CV_NETVAR|CV_CALL|CV static CV_PossibleValue_t distvar_cons_t[] = {{1, "MIN"}, {MAXODDSDIST, "MAX"}, {0, NULL}}; consvar_t cv_kartoddsdist = CVAR_INIT ("kartoddsdist", "1675", CV_NETVAR|CV_CHEAT|CV_GUARD, distvar_cons_t, NULL); consvar_t cv_kartlegacyoddsdist = CVAR_INIT ("kartlegacyoddsdist", "1500", CV_NETVAR|CV_CHEAT|CV_GUARD, distvar_cons_t, NULL); - -// SPB distance -static CV_PossibleValue_t spbdist_cons_t[] = {{1, "MIN"}, {32000, "MAX"}, {0, NULL}}; -consvar_t cv_kartspbdist = CVAR_INIT ("kartspbdist", "5648", CV_NETVAR|CV_CHEAT|CV_GUARD, spbdist_cons_t, NULL); -consvar_t cv_kartlegacyspbdist = CVAR_INIT ("kartlegacyspbdist", "3324", CV_NETVAR|CV_CHEAT|CV_GUARD, spbdist_cons_t, NULL); #undef MAXODDSDIST // SPB Rush toggle; toggles on/off the more aggressive "pressure" odds when an SPB is active diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 63217f254..d793f58df 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -231,8 +231,6 @@ extern consvar_t cv_handleboostslip; extern consvar_t cv_kartoddsdist; extern consvar_t cv_kartlegacyoddsdist; -extern consvar_t cv_kartspbdist; -extern consvar_t cv_kartlegacyspbdist; extern consvar_t cv_kartspbrush; diff --git a/src/k_items.h b/src/k_items.h index dd256a344..ff8ea3e8c 100644 --- a/src/k_items.h +++ b/src/k_items.h @@ -28,8 +28,6 @@ extern "C" { // Distance variables #define DISTVAR CV_Get(&cv_kartoddsdist) #define DISTVAR_LEGACY CV_Get(&cv_kartlegacyoddsdist) -#define SPBDISTVAR CV_Get(&cv_kartspbdist) -#define SPBDISTVAR_LEGACY CV_Get(&cv_kartlegacyspbdist) typedef enum { diff --git a/src/k_kart.c b/src/k_kart.c index cc93f209b..f5c917ab2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -430,8 +430,6 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartoddsdist); CV_RegisterVar(&cv_kartlegacyoddsdist); - CV_RegisterVar(&cv_kartspbdist); - CV_RegisterVar(&cv_kartlegacyspbdist); CV_RegisterVar(&cv_kartspbrush);