diff --git a/src/d_player.h b/src/d_player.h index b3d6e3a8e..df70e2dd1 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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. diff --git a/src/k_kart.c b/src/k_kart.c index f9116cc49..d92475783 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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 diff --git a/src/p_enemy.c b/src/p_enemy.c index 43b1115bb..9f4fa86c6 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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); diff --git a/src/p_saveg.c b/src/p_saveg.c index 6ccef8670..363d0ad75 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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);