diff --git a/src/g_game.c b/src/g_game.c index 88a3841ed..5300fe241 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2866,7 +2866,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) // Keep Shrink status, remove Grow status // Alt. Shrink is a powerup, so don't keep that. - if (K_IsLegacyShrunk(&players[player])) + if (players[player].growshrinktimer < 0 && !K_IsKartItemAlternate(KITEM_SHRINK)) growshrinktimer = players[player].growshrinktimer; else growshrinktimer = 0; diff --git a/src/k_items.c b/src/k_items.c index 6549d65ae..b1e072919 100644 --- a/src/k_items.c +++ b/src/k_items.c @@ -1481,6 +1481,10 @@ INT32 KO_SPBRaceOdds(INT32 odds, const kartroulette_t *roulette, const kartresul return odds; } +#define ALTSHRINK_EPSILON (320 * FRACUNIT) +#define NEIGHBOR_IFRAMES (TICRATE / 2) +#define BASE_IFRAMES (2 * TICRATE) + static void K_DoGrowShrink(player_t *player, boolean shrinking) { player->mo->scalespeed = mapobjectscale/TICRATE; @@ -1500,6 +1504,16 @@ static void K_DoGrowShrink(player_t *player, boolean shrinking) player->growshrinktimer = (gametyperules & GTR_CLOSERPLAYERS ? 8 : 12) * ((shrinking) ? -TICRATE : TICRATE); } + if (shrinking) + { + // Find neighbors + INT32 n = K_CountNeighboringPlayers(player, ALTSHRINK_EPSILON, &(vector3_t){}); + + // For every neighbor, add some iframes for a clean breakaway. + UINT32 iframes = BASE_IFRAMES + n * NEIGHBOR_IFRAMES; + player->flashing = iframes > UINT16_MAX ? UINT16_MAX : iframes; + } + if (player->invincibilitytimer > 0) { ; // invincibility has priority in P_RestoreMusic, no point in starting here @@ -2100,7 +2114,7 @@ void K_PlayerItemThink(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { player->itemamount--; - if (K_IsLegacyShrunk(player)) + if (player->growshrinktimer < 0 && !K_IsKartItemAlternate(KITEM_SHRINK)) { // If you're shrunk, then "grow" will just make you normal again... K_RemoveGrowShrink(player); @@ -2130,7 +2144,6 @@ void K_PlayerItemThink(player_t *player, boolean onground) if (K_IsKartItemAlternate(KITEM_SHRINK)) { K_DoGrowShrink(player, true); - K_AltShrinkIFrames(player); S_StartSound(player->mo, sfx_kc46); } @@ -2338,60 +2351,14 @@ void K_PlayerItemThink(player_t *player, boolean onground) } } -/** \brief Returns true or false if the player is shrunk. - - \param player (player_t) Player to test shrunken status for - - \return Is this player shrunk? -*/ -boolean K_IsShrunk(const player_t *player) +INT16 K_GetShrinkTime(const player_t *player) { - return (player->growshrinktimer < 0); + return player->growshrinktimer * -1; } -INT16 K_GetShrinkTime(player_t *player) +boolean K_IsAltShrunk(const player_t *player) { - return (player->growshrinktimer * -1); -} - -fixed_t K_AccomodateShrinkScaling(fixed_t x) -{ - return FixedDiv(x, SHRINK_SCALE); -} - -/** \brief Depending on the Shrink type set, this returns true or false if the player is shrunk. - - \param player (player_t) Player to test shrunken status for - \param legacy (boolean) Legacy shrink? - - \return void -*/ -boolean K_IsShrunkMode(const player_t *player, boolean legacy) -{ - boolean shrunk = K_IsShrunk(player); - boolean legacytype = (!K_IsKartItemAlternate(KITEM_SHRINK)); - - if (legacy) - { - return ((shrunk) && (legacytype)); - } - - return ((shrunk) && (!legacytype)); -} - -#define ALTSHRINK_EPSILON (320 * FRACUNIT) -#define NEIGHBOR_IFRAMES (TICRATE / 2) -#define BASE_IFRAMES (2 * TICRATE) - -void K_AltShrinkIFrames(player_t *player) -{ - vector3_t tempclusterpoint; - - // Find neighbors - INT32 N = K_CountNeighboringPlayers(player, ALTSHRINK_EPSILON, &tempclusterpoint); - - // For every neighbor, add some iframes for a clean breakaway. - player->flashing = (UINT16)min((INT32)(UINT16_MAX), BASE_IFRAMES + (NEIGHBOR_IFRAMES * N)); + return player->growshrinktimer < 0 && K_IsKartItemAlternate(KITEM_SHRINK); } #define PITY_SHRINKINCREASE_BASE (3) @@ -2400,7 +2367,7 @@ void K_AltShrinkIFrames(player_t *player) void K_AltShrinkPityIncrease(player_t *player) { // Increase your shrink timer by a little bit for every player you run into. - INT32 shrinktime = (UINT32)(K_GetShrinkTime(player)); + INT32 shrinktime = K_GetShrinkTime(player); fixed_t dimin = FRACUNIT; diff --git a/src/k_items.h b/src/k_items.h index f94ca21d8..b6967531d 100644 --- a/src/k_items.h +++ b/src/k_items.h @@ -171,17 +171,12 @@ useoddsfunc_f KO_SPBRaceOdds; void K_DoThunderShield(player_t *player); void K_BreakBubbleShield(player_t* player); -void K_PlayerItemThink(player_t *player, boolean onground); - -boolean K_IsShrunk(const player_t *player); -INT16 K_GetShrinkTime(player_t *player); -fixed_t K_AccomodateShrinkScaling(fixed_t x); -boolean K_IsShrunkMode(const player_t *player, boolean legacy); -#define K_IsLegacyShrunk(player) (K_IsShrunkMode(player, true)) -#define K_IsAltShrunk(player) (K_IsShrunkMode(player, false)) -void K_AltShrinkIFrames(player_t *player); +INT16 K_GetShrinkTime(const player_t *player); +boolean K_IsAltShrunk(const player_t *player); void K_AltShrinkPityIncrease(player_t *player); +void K_PlayerItemThink(player_t *player, boolean onground); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/k_kart.c b/src/k_kart.c index 892345c9a..2f1c87158 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1568,7 +1568,7 @@ static void K_RespawnChecker(player_t *player) } else if (player->respawn == 1) { - if (K_IsShrunk(player)) + if (player->growshrinktimer < 0) { player->mo->scalespeed = mapobjectscale/TICRATE; player->mo->destscale = (6*mapobjectscale)/8; @@ -2638,8 +2638,8 @@ static void K_GetKartBoostPower(player_t *player) if (K_IsAltShrunk(player)) // Alt. Shrink { - fixed_t shrinkspeed = K_AccomodateShrinkScaling(SHRINKSPEEDBOOST); - fixed_t shrinkaccel = K_AccomodateShrinkScaling(SHRINKACCELBOOST); + fixed_t shrinkspeed = FixedDiv(SHRINKSPEEDBOOST, SHRINK_SCALE); + fixed_t shrinkaccel = FixedDiv(SHRINKACCELBOOST, SHRINK_SCALE); K_DoBoost(player, FixedMul(shrinkspeed, GROW_SCALE), FixedMul(shrinkaccel, GROW_SCALE), SHRINKSTACKABLE, SHRINKSTACKABLE); // + 45% top speed, + 200% acceleration } @@ -3303,7 +3303,7 @@ void K_RemoveGrowShrink(player_t *player) { if (player->growshrinktimer > 0) // Play Shrink noise S_StartSound(player->mo, sfx_kc59); - else if (K_IsShrunk(player)) // Play Grow noise + else if (player->growshrinktimer < 0) // Play Grow noise S_StartSound(player->mo, sfx_kc5a); K_KartResetPlayerColor(player); @@ -3331,7 +3331,7 @@ void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source) player->squishedtimer = TICRATE; // Reduce Shrink timer for Legacy Shrink - if (K_IsLegacyShrunk(player)) + if (player->growshrinktimer < 0 && !K_IsKartItemAlternate(KITEM_SHRINK)) { player->growshrinktimer += TICRATE; if (player->growshrinktimer >= 0) @@ -7066,7 +7066,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { if (player->growshrinktimer > 0) player->growshrinktimer--; - if (K_IsShrunk(player)) + if (player->growshrinktimer < 0) player->growshrinktimer++; // Back to normal @@ -7400,7 +7400,7 @@ void K_KartResetPlayerColor(player_t *player) if (player->growshrinktimer % 5 == 0) { player->mo->colorized = true; - player->mo->color = (K_IsShrunk(player) ? SKINCOLOR_CREAMSICLE : SKINCOLOR_PERIWINKLE); + player->mo->color = player->growshrinktimer < 0 ? SKINCOLOR_CREAMSICLE : SKINCOLOR_PERIWINKLE; fullbright = true; goto finalise; } @@ -10221,7 +10221,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->itemtype == KITEM_SPB || player->itemtype == KITEM_SHRINK - || K_IsLegacyShrunk(player)) + || (player->growshrinktimer < 0 && !K_IsKartItemAlternate(KITEM_SHRINK))) indirectitemcooldown = 20*TICRATE; if (player->hyudorotimer > 0)