Per-item RUNNERAUGMENT distances

This commit is contained in:
yamamama 2025-12-25 06:53:29 -05:00
parent 45a1139ef7
commit 15cd75eead
3 changed files with 74 additions and 8 deletions

View file

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

View file

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

View file

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