Merge pull request 'Per-item RUNNERAUGMENT distances' (#209) from runneraug_improvements into next
Reviewed-on: https://codeberg.org/NepDisk/blankart/pulls/209
This commit is contained in:
commit
1b69314d81
6 changed files with 76 additions and 19 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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,57 @@ 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;
|
||||
|
||||
UINT16 distprefixlen = strlen(result->isalt ? "runnerdistalt" : "runnerdist");
|
||||
|
||||
if (idx)
|
||||
{
|
||||
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) + 2 + distprefixlen);
|
||||
sprintf(cvname, "%s_%s", result->isalt ? "runnerdistalt" : "runnerdist", 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 if (result->augcvar[idx]->defaultvalue)
|
||||
{
|
||||
// Reallocate the data and set a new default value.
|
||||
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);
|
||||
|
||||
//CONS_Printf("Reallocated cvar data successfully\n");
|
||||
}
|
||||
}
|
||||
else if (fastncmp(word, "ODDS", 4))
|
||||
{
|
||||
UINT8 oddstable;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
@ -128,6 +126,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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue