[PATCH} Allow min and max ringcap to be set via cvars and lua

Thanks minenice for the patch!
This commit is contained in:
NepDisk 2025-08-31 23:44:10 -04:00
parent 8d22a37b4b
commit 7b63ac3724
13 changed files with 76 additions and 22 deletions

View file

@ -450,6 +450,10 @@ consvar_t cv_karteliminatelast = CVAR_INIT ("karteliminatelast", "Yes", CV_NETVA
// Toggles for new features
consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartRings_OnChange);
static CV_PossibleValue_t ringsmin_cons_t[] = {{-32000, "MIN"}, {0, "MAX"}, {0, NULL}};
consvar_t cv_kartringsmin = CVAR_INIT ("kartringsmin", "-20", CV_NETVAR, ringsmin_cons_t, NULL);
consvar_t cv_kartringsmax = CVAR_INIT ("kartringsmax", "20", CV_NETVAR, CV_Unsigned, NULL);
// Stacking related
consvar_t cv_kartstacking = CVAR_INIT ("kartstacking", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartStacking_OnChange);
consvar_t cv_kartstacking_diminishparam = CVAR_INIT ("kartstacking_diminishparam", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL);

View file

@ -122,6 +122,8 @@ extern consvar_t cv_kartbot_basetrackcomplexity;
extern consvar_t cv_karteliminatelast;
extern consvar_t cv_kartusepwrlv;
extern consvar_t cv_kartrings;
extern consvar_t cv_kartringsmin;
extern consvar_t cv_kartringsmax;
extern consvar_t cv_kartstacking;
extern consvar_t cv_kartstacking_diminishparam;

View file

@ -650,6 +650,8 @@ struct player_t
// player's ring count
SINT8 rings;
SINT8 ringmin; // minimum rings
SINT8 ringmax; // maximum rings
UINT8 pickuprings; // Number of rings being picked up before added to the counter (prevents rings from being deleted forever over 20)
UINT8 ringdelay; // (0 to 3) - 3 tic delay between every ring usage
UINT16 ringboost; // Ring boost timer

View file

@ -2413,6 +2413,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
botStyle_e style;
INT16 rings;
INT16 minrings;
INT16 maxrings;
angle_t playerangleturn;
UINT8 botdiffincrease;
@ -2494,6 +2496,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
karmapoints = 0;
wanted = 0;
rings = 5;
minrings = cv_kartringsmin.value;
maxrings = cv_kartringsmax.value;
kickstartaccel = 0;
lastsafelap = 0;
lastsafestarpost = 0;
@ -2543,6 +2547,10 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
karmapoints = players[player].karmapoints;
wanted = players[player].wanted;
rings = players[player].rings;
minrings = players[player].ringmin;
maxrings = players[player].ringmax;
kickstartaccel = players[player].kickstartaccel;
nocontrol = players[player].nocontrol;
@ -2636,6 +2644,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
p->botvars.style = style;
p->botvars.difficulty = botdifficulty;
p->rings = rings;
p->ringmin = minrings;
p->ringmax = maxrings;
p->botvars.diffincrease = botdiffincrease;
p->botvars.rival = botrival;
p->xtralife = xtralife;

View file

@ -520,7 +520,7 @@ static BlockItReturn_t K_FindObjectsForNudging(mobj_t *thing)
break;
}
if ((RINGTOTAL(g_nudgeSearch.botmo->player) < 20 && !(g_nudgeSearch.botmo->player->pflags & PF_RINGLOCK)
if ((RINGTOTAL(g_nudgeSearch.botmo->player) < g_nudgeSearch.botmo->player->ringmax && !(g_nudgeSearch.botmo->player->pflags & PF_RINGLOCK)
&& P_CanPickupItem(g_nudgeSearch.botmo->player, 0))
&& !thing->extravalue1
&& (g_nudgeSearch.botmo->player->itemtype != KITEM_THUNDERSHIELD))

View file

@ -2533,6 +2533,8 @@ static void K_drawRingMeter(void)
UINT8 *ringmap = NULL;
boolean colorring = false;
SINT8 ringcount = stplyr->rings;
SINT8 overring = stplyr->rings % 20;
SINT8 ringmax = stplyr->ringmax;
INT32 fx = 0, fy = 0, splitflags = 0; // stuff for 3p / 4p splitscreen.
rn[0] = ((abs(ringcount) / 10) % 10);
@ -2549,7 +2551,9 @@ static void K_drawRingMeter(void)
ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_CRIMSON, GTC_CACHE);
colorring = true;
}
else if (ringcount >= 20) // Maxed out
else if (ringcount >= 20) // (placeholder) over-ring
ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_BLUE, GTC_CACHE);
else if (ringcount >= ringmax) // Maxed out
ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_YELLOW, GTC_CACHE);
if (r_splitscreen > 1)
@ -2589,12 +2593,15 @@ static void K_drawRingMeter(void)
{
V_DrawMappedPatch(fx-5, fy-11 + ringoffsety, V_HUDTRANS|splitflags, kp_ringdebtminus, ringmap);
}
#if 0
if (stplyr->rings < 0)
{
// Invert the ring count
ringcount = -ringcount;
}
#endif
// clamp and invert when needed for the bar
ringcount = CLAMP(abs(ringcount), -20, 20);
if (rn[1] == 1 && ringcount == 11)
V_DrawMappedPatch(fx+2, fy-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
@ -2620,6 +2627,13 @@ static void K_drawRingMeter(void)
barcolors[3] = 40;
indebt = true;
}
else if (stplyr->rings > 20)
{
barcolors[0] = 132;
barcolors[1] = 131;
barcolors[2] = 128;
barcolors[3] = 154;
}
if (!indebt || (indebt && (leveltime/5 & 1)))
{

View file

@ -294,6 +294,8 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_lessflicker);
CV_RegisterVar(&cv_kartrings);
CV_RegisterVar(&cv_kartringsmin);
CV_RegisterVar(&cv_kartringsmax);
// Stacking
CV_RegisterVar(&cv_kartstacking);
@ -1811,8 +1813,8 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
// Being in ring debt occasionally forces Super Ring on you if you mashed
if ((K_RingsActive() == true) && mashed && player->rings < 0 && cv_superring.value)
{
INT32 debtamount = min(20, abs(player->rings));
if (P_RandomChance((debtamount*FRACUNIT)/20))
INT32 debtamount = min(abs(player->ringmin), abs(player->rings));
if (P_RandomChance((debtamount*FRACUNIT)/abs(player->ringmin)))
{
K_KartGetItemResult(player, KITEM_SUPERRING);
player->itemblink = TICRATE;
@ -4408,11 +4410,11 @@ void K_AwardPlayerRings(player_t *player, UINT16 rings, boolean overload)
RINGTOTAL(player) + (player->superring);
/* capped at 20 rings */
if ((totalrings + rings) > 20)
if ((totalrings + rings) > player->ringmax)
{
if (totalrings >= 20)
if (totalrings >= player->ringmax)
return; // woah dont let that go negative buster
rings = (20 - totalrings);
rings = (player->ringmax - totalrings);
}
}
@ -7599,7 +7601,7 @@ static inline BlockItReturn_t PIT_AttractingRings(mobj_t *thing)
return BMIT_CONTINUE; // Too far away
}
if (RINGTOTAL(attractmo->player) >= 20 || (attractmo->player->pflags & PF_RINGLOCK))
if (RINGTOTAL(attractmo->player) >= attractmo->player->ringmax || (attractmo->player->pflags & PF_RINGLOCK))
{
// Already reached max -- just joustle rings around.
@ -8110,10 +8112,10 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
}
else
{
if (player->rings > 20)
player->rings = 20;
else if (player->rings < -20)
player->rings = -20;
if (player->rings > player->ringmax)
player->rings = player->ringmax;
else if (player->rings < player->ringmin)
player->rings = player->ringmin;
}
if (comeback == false || !(gametyperules & GTR_KARMA) || (player->pflags & PF_ELIMINATED))

View file

@ -252,6 +252,8 @@ enum player_e
player_throwdir,
player_sadtimer,
player_rings,
player_ringmin,
player_ringmax,
player_pickuprings,
player_ringdelay,
player_ringboost,
@ -447,6 +449,8 @@ static const char *const player_opt[] = {
"throwdir",
"sadtimer",
"rings",
"ringmin",
"ringmax",
"pickuprings",
"ringdelay",
"ringboost",
@ -838,6 +842,12 @@ static int player_get(lua_State *L)
case player_rings:
lua_pushinteger(L, plr->rings);
break;
case player_ringmin:
lua_pushinteger(L, plr->ringmin);
break;
case player_ringmax:
lua_pushinteger(L, plr->ringmax);
break;
case player_pickuprings:
lua_pushinteger(L, plr->pickuprings);
break;
@ -1512,6 +1522,12 @@ static int player_set(lua_State *L)
case player_rings:
plr->rings = luaL_checkinteger(L, 3);
break;
case player_ringmin:
plr->ringmin = luaL_checkinteger(L, 3);
break;
case player_ringmax:
plr->ringmax = luaL_checkinteger(L, 3);
break;
case player_pickuprings:
plr->pickuprings = luaL_checkinteger(L, 3);
break;

View file

@ -3274,7 +3274,7 @@ void A_AttractChase(mobj_t *actor)
actor->cusval = 1;
if ((actor->tracer->player->itemtype == KITEM_THUNDERSHIELD
&& RINGTOTAL(actor->tracer->player) < 20
&& RINGTOTAL(actor->tracer->player) < actor->tracer->player->ringmax
&& !(actor->tracer->player->pflags & PF_RINGLOCK))
//&& P_CheckSight(actor, actor->tracer)
)

View file

@ -679,7 +679,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
return;
// Reached the cap, don't waste 'em!
if (RINGTOTAL(player) >= 20)
if (RINGTOTAL(player) >= player->ringmax)
return;
special->momx = special->momy = special->momz = 0;

View file

@ -319,6 +319,8 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT8(save->p, players[i].sadtimer);
WRITESINT8(save->p, players[i].rings);
WRITESINT8(save->p, players[i].ringmin);
WRITESINT8(save->p, players[i].ringmax);
WRITEUINT8(save->p, players[i].pickuprings);
WRITEUINT8(save->p, players[i].ringdelay);
WRITEUINT16(save->p, players[i].ringboost);
@ -666,6 +668,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].sadtimer = READUINT8(save->p);
players[i].rings = READSINT8(save->p);
players[i].ringmin = READSINT8(save->p);
players[i].ringmax = READSINT8(save->p);
players[i].pickuprings = READUINT8(save->p);
players[i].ringdelay = READUINT8(save->p);
players[i].ringboost = READUINT16(save->p);

View file

@ -4116,13 +4116,13 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha
if (mo->player->pflags & PF_RINGLOCK)
return false;
// args[2]: don't cap rings to 20
// args[2]: don't cap rings to player's max rings
K_AwardPlayerRings(mo->player, rings, args[2]);
}
else
{
// args[2]: cap rings to -20 instead of 0
SINT8 baseline = (args[2] ? -20 : 0);
// args[2]: cap rings to player's min rings instead of 0
SINT8 baseline = (args[2] ? mo->player->ringmin : 0);
// Don't push you below baseline
if (mo->player->rings <= baseline)

View file

@ -506,10 +506,10 @@ INT32 P_GivePlayerRings(player_t *player, INT32 num_rings)
return 0;
test = player->rings + num_rings;
if (test > 20) // Caps at 20 rings, sorry!
num_rings -= (test-20);
else if (test < -20) // Chaotix ring debt!
num_rings -= (test+20);
if (test > player->ringmax) // Caps at 20 rings, sorry!
num_rings -= (test-player->ringmax);
else if (test < player->ringmin) // Chaotix ring debt!
num_rings -= (test+player->ringmin);
player->rings += num_rings;