Implement ring spam nerf

Less impactful in vanilla + rings. With Chaining and Stacking on however this makes a big difference since it prevents you from having a large stack count forever if you can keep chugging rings
This commit is contained in:
NepDisk 2025-06-11 19:02:06 -04:00
parent 457527d77a
commit 6a122b0600
4 changed files with 31 additions and 4 deletions

View file

@ -675,6 +675,7 @@ struct player_t
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
UINT16 ringtime; // The current Ring boost timer if it wasn't capped. Used for spam prevention measures.
UINT16 superring; // Spawn rings on top of you every tic!
UINT8 nextringaward; // When should we spawn our next superring ring?
UINT8 ringvolume; // When consuming lots of rings, lower the sound a little.

View file

@ -7524,12 +7524,18 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->ringdelay--;
if (P_PlayerInPain(player))
{
player->ringboost = 0;
player->ringtime = 0;
}
else if (player->ringboost)
{
K_HandleRingDeincrement(player, chainingactive);
}
if (!player->ringboost && !player->chaintimer)
player->ringtime = 0;
if (player->sneakertimer)
player->sneakertimer = K_ChainOrDeincrementTime(player, player->sneakertimer, 1, false);
@ -9075,6 +9081,7 @@ static void K_UpdatePlayerWaypoints(player_t *const player)
INT32 K_GetKartRingPower(player_t *player, boolean boosted)
{
fixed_t ringPower = ((9 - player->kartspeed) + (9 - player->kartweight)) * (FRACUNIT/2);
UINT16 finalPower = 0;
if (boosted == true)
{
@ -9087,7 +9094,20 @@ INT32 K_GetKartRingPower(player_t *player, boolean boosted)
ringPower += 1;
}
return max(ringPower / FRACUNIT, 1);
finalPower = max(ringPower / FRACUNIT, 1);
// the base is 4 tics
finalPower += 3;
// If you use more then 20 rings at a time, you start gaining less ring timer..
if (player->ringtime == finalPower*20)
S_StartSound(NULL, sfx_cdfm66);
else if (player->ringtime > finalPower*20)
{
finalPower = 2;
}
return finalPower;
}
// Returns false if this player being placed here causes them to collide with any other player

View file

@ -3171,7 +3171,8 @@ void A_AttractChase(mobj_t *actor)
{
// Base add is 4 tics for 9,9, adds 1 tic for each point closer to the 1,1 end
actor->target->player->ringboost += K_GetKartRingPower(actor->target->player, true) + 3;
actor->target->player->ringboost += K_GetKartRingPower(actor->target->player, true);
actor->target->player->ringtime += K_GetKartRingPower(actor->target->player, true);
S_StartSoundAtVolume(actor->target, sfx_s1b5, actor->target->player->ringvolume);
if (actor->target->player->rings <= 10)
@ -3204,7 +3205,10 @@ void A_AttractChase(mobj_t *actor)
if (actor->extravalue1 >= 16)
{
if (!P_GivePlayerRings(actor->target->player, 1)) // returns 0 if addition failed
actor->target->player->ringboost += K_GetKartRingPower(actor->target->player, true) + 3;
{
actor->target->player->ringboost += K_GetKartRingPower(actor->target->player, true);
actor->target->player->ringtime += K_GetKartRingPower(actor->target->player, true);
}
if (actor->target->player->ringboost > (4*TICRATE + TICRATE/2))
actor->target->player->ringboost = (4*TICRATE + TICRATE/2);

View file

@ -315,6 +315,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT8(save->p, players[i].pickuprings);
WRITEUINT8(save->p, players[i].ringdelay);
WRITEUINT16(save->p, players[i].ringboost);
WRITEUINT16(save->p, players[i].ringtime);
WRITEUINT16(save->p, players[i].superring);
WRITEUINT8(save->p, players[i].nextringaward);
WRITEUINT8(save->p, players[i].ringvolume);
@ -652,7 +653,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].rings = READSINT8(save->p);
players[i].pickuprings = READUINT8(save->p);
players[i].ringdelay = READUINT8(save->p);
players[i].ringboost = READUINT16(save->p);;
players[i].ringboost = READUINT16(save->p);
players[i].ringtime = READUINT16(save->p);;
players[i].superring = READUINT16(save->p);
players[i].nextringaward = READUINT8(save->p);
players[i].ringvolume = READUINT8(save->p);