From 7b63ac37240154b8c6fe074b4505b534d36e2898 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 31 Aug 2025 23:44:10 -0400 Subject: [PATCH] [PATCH} Allow min and max ringcap to be set via cvars and lua Thanks minenice for the patch! --- src/d_netcmd.c | 4 ++++ src/d_netcmd.h | 2 ++ src/d_player.h | 2 ++ src/g_game.c | 10 ++++++++++ src/k_botsearch.cpp | 2 +- src/k_hud.c | 18 ++++++++++++++++-- src/k_kart.c | 22 ++++++++++++---------- src/lua_playerlib.c | 16 ++++++++++++++++ src/p_enemy.c | 2 +- src/p_inter.c | 2 +- src/p_saveg.c | 4 ++++ src/p_spec.c | 6 +++--- src/p_user.c | 8 ++++---- 13 files changed, 76 insertions(+), 22 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 15fe4a1dc..7b39a0482 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -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); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 0c3c06f75..375af51de 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -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; diff --git a/src/d_player.h b/src/d_player.h index 45e97f00a..caa2ab80d 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/g_game.c b/src/g_game.c index 2f0d72dad..f7e6581f1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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; diff --git a/src/k_botsearch.cpp b/src/k_botsearch.cpp index 37ae6146d..1597596c4 100644 --- a/src/k_botsearch.cpp +++ b/src/k_botsearch.cpp @@ -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)) diff --git a/src/k_hud.c b/src/k_hud.c index 920931ebb..cfb244c40 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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))) { diff --git a/src/k_kart.c b/src/k_kart.c index ef7f8915d..f7db22080 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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)) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 28d0c5593..ef628ee42 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -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; diff --git a/src/p_enemy.c b/src/p_enemy.c index a2e13b40a..b1f5416b4 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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) ) diff --git a/src/p_inter.c b/src/p_inter.c index 4fb861357..41fb3bfd1 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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; diff --git a/src/p_saveg.c b/src/p_saveg.c index d5089dc23..01c31f0f5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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); diff --git a/src/p_spec.c b/src/p_spec.c index 1610cd711..f19f70b8d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -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) diff --git a/src/p_user.c b/src/p_user.c index 612229f0e..8b6f272cd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -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;