diff --git a/src/k_odds.c b/src/k_odds.c index 877c510d8..5e6c2ab7b 100644 --- a/src/k_odds.c +++ b/src/k_odds.c @@ -168,16 +168,16 @@ tic_t ItemBGone[NUMKARTRESULTS][2] = { 0, 0 }, // Mine { 10, 0 }, // Ballhog { 20, 0 }, // Self-Propelled Bomb - { 10, 0 }, // Grow + { 3, 0 }, // Grow { 20, 0 }, // Shrink { 0, 0 }, // Thunder Shield - { 0, 0 }, // Hyudoro + { 20, 0 }, // Hyudoro { 0, 0 }, // Pogo Spring { 0, 0 }, // Kitchen Sink { 0, 0 }, // Super Ring { 0, 0 }, // Land Mine { 5, 0 }, // Bubble Shield - { 10, 0 }, // Flame Shield + { 8, 0 }, // Flame Shield { 0, 0 }, // Sneaker x2 { 0, 0 }, // Sneaker x3 { 0, 0 }, // Banana x3 @@ -487,6 +487,69 @@ static INT32 K_KartGetInvincibilityOdds(UINT32 dist) return min(MAXINVODDS, finodds); } +#ifdef PARANOIA +static const char* K_GetShieldName(kartshields_t s) +{ + switch (s) + { + case KSHIELD_THUNDER: + return "KSHIELD_THUNDER"; + break; + case KSHIELD_BUBBLE: + return "KSHIELD_BUBBLE"; + break; + case KSHIELD_FLAME: + return "KSHIELD_FLAME"; + break; + case KSHIELD_NONE: + default: + return "KSHIELD_NONE"; + break; + } +} +#endif + +// Assigns general cooldowns to shield items. +void K_KartHandleShieldCooldown(SINT8 item) +{ + INT32 i; + + UINT8 pingame = 0, pexiting = 0; + + INT32 shieldtype = KSHIELD_NONE; + shieldtype = K_GetShieldFromItem(item); + + if (shieldtype == KSHIELD_NONE) + { + // Not a shield! + return; + } + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + + if (!(gametyperules & GTR_BUMPERS) || players[i].bumper) + pingame++; + + if (players[i].exiting) + pexiting++; + + if (((shieldtype == K_GetShieldFromItem(players[i].itemtype)) + || (shieldtype == K_GetShieldFromPlayer(&players[i])))) + { + // If this shield has a cooldown, force-apply the cooldown preeemptively for + // the entire time the shield is being held by a player. + if (K_GetBGone(item, true) > 0) + { + K_SetBGoneToBase(item); + break; + } + } + } +} + /** \brief Item Roulette for Kart \param player player object passed from P_KartPlayerThink diff --git a/src/k_odds.h b/src/k_odds.h index 42860b19e..c5ad73f59 100644 --- a/src/k_odds.h +++ b/src/k_odds.h @@ -50,6 +50,7 @@ extern tic_t ItemBGone[NUMKARTRESULTS][2]; void K_SetBGone(SINT8 item, tic_t time); void K_SetBGoneToBase(SINT8 item); tic_t K_GetBGone(SINT8 item, boolean base); +void K_KartHandleShieldCooldown(SINT8 item); UINT32 K_CalculateInitalPDIS(const player_t *player, UINT8 pingame); UINT32 K_CalculatePDIS(const player_t *player, UINT8 numPlayers, boolean *spbrush); diff --git a/src/p_tick.c b/src/p_tick.c index 8672a10b8..e48ac83e2 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -935,6 +935,14 @@ void P_Ticker(boolean run) } } + if (gametyperules & GTR_RACEODDS) + { + // Shield cooldowns + K_KartHandleShieldCooldown(KITEM_THUNDERSHIELD); + K_KartHandleShieldCooldown(KITEM_BUBBLESHIELD); + K_KartHandleShieldCooldown(KITEM_FLAMESHIELD); + } + K_BossInfoTicker(); if (gametyperules & GTR_WANTED)