Clean up more alt shrink code

This commit is contained in:
GenericHeroGuy 2025-11-08 17:34:29 +01:00
parent 66c894558f
commit d7f3a88d9f
4 changed files with 33 additions and 71 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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)