generalize alt invinc to apply to any item

(with some work)
This commit is contained in:
minenice55 2025-11-04 21:55:30 -05:00
parent 281a8b544a
commit 2c04bb2ef5
17 changed files with 109 additions and 39 deletions

View file

@ -188,10 +188,14 @@ extern CV_PossibleValue_t CV_Natural[];
#define KARTGP_MASTER 4 // Not a speed setting, gives hard speed with maxed out bots
#define KARTGP_NIGHTMARE 5 // Not a speed setting, gives expert speed with maxed out bots
extern CV_PossibleValue_t kartspeed_cons_t[], gpdifficulty_cons_t[];
// Invincibility types.
// Invincibility types
#define KARTINVIN_LEGACY 0
#define KARTINVIN_ALTERN 1
// Alt item type (alias of kartinvin_x for now until refactor complete)
#define KARTITEM_NORMAL 0
#define KARTITEM_ALTERN 1
extern consvar_t cv_execversion;
extern consvar_t cv_resetnetvars;

View file

@ -594,9 +594,10 @@ consvar_t cv_kartspbdist = CVAR_INIT ("kartspbdist", "4432", CV_NETVAR|CV_CHEAT|
consvar_t cv_kartlegacyspbdist = CVAR_INIT ("kartlegacyspbdist", "2216", CV_NETVAR|CV_CHEAT|CV_GUARD, spbdist_cons_t, NULL);
#undef MAXODDSDIST
// Invincibility modifiers
static CV_PossibleValue_t invintype_cons_t[] = {{0, "Legacy"}, {1, "Alternative"}, {0, NULL}};
consvar_t cv_kartinvintype = CVAR_INIT ("kartinvintype", "Legacy", CV_NETVAR|CV_CALL, invintype_cons_t, KartInvinType_OnChange);
// Alt Item Modifiers
static CV_PossibleValue_t altitemtype_cons_t[] = {{KARTITEM_NORMAL, "Legacy"}, {KARTITEM_ALTERN, "Alternative"}, {0, NULL}};
consvar_t cv_kartinvintype = CVAR_INIT ("kartinvintype", "Legacy", CV_NETVAR|CV_CALL, altitemtype_cons_t, KartInvinType_OnChange);
consvar_t cv_karteggmantype = CVAR_INIT ("karteggmantype", "Legacy", CV_NETVAR|CV_CALL, altitemtype_cons_t, KartEggmanType_OnChange);
// How far the player must be from the cluster to begin frequently rolling Invincibility.
static CV_PossibleValue_t invindist_cons_t[] = {{1, "MIN"}, {32000, "MAX"}, {0, NULL}};
@ -7831,6 +7832,24 @@ static void KartInvinType_OnChange(void)
}
}
static void KartEggmanType_OnChange(void)
{
if (K_CanChangeRules(false) == false)
{
return;
}
if (leveltime < starttime)
{
CONS_Printf(M_GetText("Eggman Monitor type has been changed to \"%s\".\n"), cv_karteggmantype.string);
eggmantype = (UINT8)cv_karteggmantype.value;
}
else
{
CONS_Printf(M_GetText("Eggman Monitor type will be changed to \"%s\" next round.\n"), cv_karteggmantype.string);
}
}
static void KartBumpSpark_OnChange(void)
{
if (K_CanChangeRules(false) == false)

View file

@ -1686,6 +1686,9 @@ struct int_const_s const INT_CONST[] = {
// invintype
{"KARTINVIN_LEGACY", KARTINVIN_LEGACY},
{"KARTINVIN_ALTERN", KARTINVIN_ALTERN},
// alt item type (alias of invintype for now until refactor complete)
{"KARTITEM_NORMAL", KARTITEM_NORMAL},
{"KARTITEM_ALTERN", KARTITEM_ALTERN},
// k_waypoint.h values
{"DEFAULT_WAYPOINT_RADIUS",DEFAULT_WAYPOINT_RADIUS},

View file

@ -91,7 +91,7 @@ extern "C" {
// Special Hashing.
//#define NOFILEHASH
//#define NOVERIFYIWADS
#define NOVERIFYIWADS
// Uncheck this to compile debugging code
//#define RANGECHECK

View file

@ -665,11 +665,13 @@ extern INT32 cheats;
// SRB2kart
extern UINT8 numlaps;
extern UINT8 gamespeed;
extern UINT8 invintype;
extern boolean franticitems;
extern boolean encoremode, prevencoremode;
extern boolean comeback;
extern UINT8 invintype;
extern UINT8 eggmantype;
extern SINT8 mostwanted;
extern SINT8 battlewanted[4];
extern tic_t wantedcalcdelay;

View file

@ -295,11 +295,13 @@ INT32 cheats; //for multiplayer cheat commands
// Cvars that we don't want changed mid-game
UINT8 numlaps; // Removed from Cvar hell
UINT8 gamespeed; // Game's current speed (or difficulty, or cc, or etc); 0 for easy, 1 for normal, 2 for hard
UINT8 invintype; // How Invincibility functions. 0 for Legacy/Vanilla, 1 for Alternative.
boolean encoremode = false; // Encore Mode currently enabled?
boolean prevencoremode;
boolean franticitems; // Frantic items currently enabled?
boolean comeback; // Battle Mode's karma comeback is on/off
// alt item values
UINT8 invintype; // How Invincibility functions. 0 for Legacy/Vanilla, 1 for Alternative.
UINT8 eggmantype; // How Eggman Monitor functions. 0 for Legacy/Vanilla, 1 for Alternative (Egg Mine).
// Voting system
INT16 votelevels[12][2]; // Levels that were rolled by the host

View file

@ -602,7 +602,11 @@ _(SMOLDERING) // New explosion
_(BOOMEXPLODE)
_(BOOMPARTICLE)
_(LANDMINE) // Land Mine
// Land Mine
_(LANDMINE)
// Egg Mine
_(EGGMINE_CAPSULE)
_(EGGMINE_SHIELD)
_(BALLHOG) // Ballhog
_(BALLHOGBOOM)

View file

@ -2816,6 +2816,11 @@ _(SLOWBOOM10)
_(LANDMINE)
_(LANDMINE_EXPLODE)
// Egg mine
_(EGGMINE)
_(EGGMINE_POP)
_(EGGMINE_SHIELD)
// Ballhog
_(BALLHOG1)
_(BALLHOG2)

View file

@ -573,12 +573,13 @@ static void K_BubbleShieldCollideDrain(player_t *player, mobj_t *bubble, INT16 d
static boolean K_BubbleReflectingTrapItem(const mobj_t *t)
{
return t->type == MT_BANANA || (t->type == MT_ORBINAUT && t->flags2 & MF2_AMBUSH) || t->type == MT_JAWZ_DUD ||
t->type == MT_EGGMANITEM || t->type == MT_SSMINE || t->type == MT_SSMINE_SHIELD || t->type == MT_LANDMINE;
t->type == MT_EGGMANITEM || t->type == MT_SSMINE || t->type == MT_SSMINE_SHIELD || t->type == MT_LANDMINE ||
t->type == MT_EGGMINE_CAPSULE || t->type == MT_EGGMINE_SHIELD;
}
static boolean K_StrongPlayerBump(const player_t *player)
{
return (((K_GetKartInvinType() == KARTINVIN_LEGACY) && (player->invincibilitytimer))
return (((!K_IsKartItemAlternate(KITEM_INVINCIBILITY)) && (player->invincibilitytimer))
|| (player->growshrinktimer > 0));
}
@ -636,7 +637,7 @@ boolean K_BubbleShieldCanReflect(mobj_t *t)
{
return (t->type == MT_ORBINAUT || t->type == MT_JAWZ || t->type == MT_JAWZ_DUD
|| t->type == MT_BANANA || t->type == MT_EGGMANITEM || t->type == MT_BALLHOG
|| t->type == MT_SSMINE || t->type == MT_LANDMINE || t->type == MT_SINK
|| t->type == MT_SSMINE || t->type == MT_LANDMINE || t->type == MT_EGGMINE_CAPSULE || t->type == MT_SINK
|| t->type == MT_KART_LEFTOVER
|| t->type == MT_PLAYER);
}
@ -656,6 +657,7 @@ static INT16 K_GetBubbleDamage(mobj_t* itm)
{
case MT_EGGMANITEM:
case MT_BALLHOG:
case MT_EGGMINE_CAPSULE:
// Experiment: Let Bubble Shields hard-counter Ballhogs and Eggboxes.
dmg = 0;
break;
@ -820,7 +822,7 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
boolean t2Condition = false;
// Rim suggestion: Flipover damage is negligible at best, just cull it from Invincibility as a whole.
if (K_GetKartInvinType() == KARTINVIN_LEGACY)
if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))
{
t1Condition = (t1->player->invincibilitytimer > 0);
t2Condition = (t2->player->invincibilitytimer > 0);
@ -832,7 +834,7 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
K_DoInstashield(t2->player);
return false;
}
else if (K_GetKartInvinType() == KARTINVIN_LEGACY)
else if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))
{
if (t1Condition == true && t2Condition == false)
{

View file

@ -1433,7 +1433,7 @@ static void K_drawKartItem(void)
else
localpatch = kp_nodraw;
}
else if ((stplyr->invincibilitytimer) && (K_GetKartInvinType() == KARTINVIN_ALTERN))
else if ((stplyr->invincibilitytimer) && (K_IsKartItemAlternate(KITEM_INVINCIBILITY)))
{
itembar = FixedDiv(stplyr->invincibilitytimer, max(1, stplyr->maxinvincibilitytime));
@ -2102,7 +2102,7 @@ static boolean K_drawKartPositionFaces(void)
V_DrawMappedPatch(FACE_X + offsets.x, Y + offsets.y, V_HUDTRANS|V_SNAPTOLEFT, facerank, colormap);
if ((players[rankplayer[i]].invincibilitytimer) && (K_GetKartInvinType() == KARTINVIN_ALTERN))
if ((players[rankplayer[i]].invincibilitytimer) && (K_IsKartItemAlternate(KITEM_INVINCIBILITY)))
{
colormap = R_GetTranslationColormap(TC_BLINK, K_AltInvincibilityColor(leveltime / 2), GTC_CACHE);
invinchudtrans = K_InvincibilityHUDVisibility(players[rankplayer[i]].invincibilitytimer);
@ -2488,7 +2488,7 @@ static void K_DrawServerMods(INT32 x, INT32 y)
{"Bump Drift", 0, NULL, K_GetBumpSpark() > 0, true},
{"Bump Spark", 0, NULL, K_GetBumpSpark() > BUMPSPARK_NOCHARGE, true},
{"Bump Spring", 0, &cv_kartbumpspring, -1, true},
{"Alt. Invin.", 0, NULL, K_GetKartInvinType() == KARTINVIN_ALTERN, true}
{"Alt. Invin.", 0, NULL, K_IsKartItemAlternate(KITEM_INVINCIBILITY), true}
};
for (j = 0; j < 2; j++)
@ -4335,9 +4335,9 @@ static void K_drawKartMinimap(void)
invingradient = K_InvincibilityGradient(players[i].invincibilitytimer);
if ((players[i].invincibilitytimer) && ((invingradient > (FRACUNIT/2)) || (K_GetKartInvinType() == KARTINVIN_LEGACY)))
if ((players[i].invincibilitytimer) && ((invingradient > (FRACUNIT/2)) || (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))))
{
usecolor = ((K_GetKartInvinType() == KARTINVIN_ALTERN) ? K_AltInvincibilityColor(leveltime / 2) : K_RainbowColor(leveltime / 2));
usecolor = ((K_IsKartItemAlternate(KITEM_INVINCIBILITY)) ? K_AltInvincibilityColor(leveltime / 2) : K_RainbowColor(leveltime / 2));
colorizeplayer = true;
}
else
@ -4370,7 +4370,7 @@ static void K_drawKartMinimap(void)
K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, workingPic, colormap, &iconoffsets);
#ifdef ROTSPRITE
if ((K_GetKartInvinType() == KARTINVIN_ALTERN) &&
if ((K_IsKartItemAlternate(KITEM_INVINCIBILITY)) &&
(players[i].invincibilitytimer) && (invingradient))
{
// Draw Alt. Invin. sparkles
@ -4665,7 +4665,7 @@ static void K_drawKartMinimap(void)
if ((players[localplayers[i]].invincibilitytimer) &&
((invingradient > (FRACUNIT / 2)) ||
(K_GetKartInvinType() == KARTINVIN_LEGACY)))
(!K_IsKartItemAlternate(KITEM_INVINCIBILITY))))
{
usecolor = (K_RainbowColor(leveltime / 2));
colorizeplayer = true;
@ -4735,7 +4735,7 @@ static void K_drawKartMinimap(void)
K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, workingPic, colormap, &iconoffsets);
#ifdef ROTSPRITE
if ((!nocontest) && (K_GetKartInvinType() == KARTINVIN_ALTERN) &&
if ((!nocontest) && (K_IsKartItemAlternate(KITEM_INVINCIBILITY)) &&
(players[localplayers[i]].invincibilitytimer) && (invingradient))
{
// Draw Alt. Invin. sparkles

View file

@ -912,7 +912,7 @@ static fixed_t K_CheckOffroadCollide(mobj_t *mo)
static fixed_t K_OffroadGradient(player_t *player, fixed_t offroad)
{
// At 50% or lower Invincibility, offroad creeps up on you.
fixed_t invinoffroad = (K_GetKartInvinType() == KARTINVIN_LEGACY) ? ((player->invincibilitytimer) ? FRACUNIT : 0) : min(FRACUNIT, K_InvincibilityGradient(player->invincibilitytimer) << 1);
fixed_t invinoffroad = (!K_IsKartItemAlternate(KITEM_INVINCIBILITY)) ? ((player->invincibilitytimer) ? FRACUNIT : 0) : min(FRACUNIT, K_InvincibilityGradient(player->invincibilitytimer) << 1);
fixed_t fac = CLAMP(FRACUNIT - invinoffroad, 0, FRACUNIT);
return FixedMul(offroad, fac);
@ -2412,7 +2412,7 @@ UINT16 K_GetInvincibilityTime(player_t *player)
UINT32 i, pingame;
fixed_t distmul = FRACUNIT;
if (K_GetKartInvinType() == KARTINVIN_LEGACY)
if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))
return BASEINVINTIME;
pingame = 0;
@ -2449,7 +2449,7 @@ UINT16 K_GetInvincibilityTime(player_t *player)
static fixed_t K_GetInvincibilitySpeed(UINT16 time)
{
if (K_GetKartInvinType() == KARTINVIN_LEGACY)
if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))
return INVINSPEEDBOOSTLGC;
fixed_t t = min(FRACUNIT, K_InvincibilityGradient(time));
@ -2458,7 +2458,7 @@ static fixed_t K_GetInvincibilitySpeed(UINT16 time)
static fixed_t K_GetInvincibilityAccel(UINT16 time)
{
if (K_GetKartInvinType() == KARTINVIN_LEGACY)
if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))
return INVINACCELBOOSTLGC;
fixed_t t = min(FRACUNIT, K_InvincibilityGradient(time));
@ -5035,7 +5035,7 @@ void K_DoInvincibility(player_t *player, tic_t time)
overlay->destscale = player->mo->scale;
P_SetScale(overlay, player->mo->scale);
if (K_GetKartInvinType() == KARTINVIN_ALTERN)
if (K_IsKartItemAlternate(KITEM_INVINCIBILITY))
{
mobj_t *aura = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY);
P_SetTarget(&aura->target, player->mo);
@ -5045,7 +5045,7 @@ void K_DoInvincibility(player_t *player, tic_t time)
}
}
if (K_GetKartInvinType() == KARTINVIN_ALTERN)
if (K_IsKartItemAlternate(KITEM_INVINCIBILITY))
{
// Rim suggestion: Don't allow already invincible players to chain.
if (K_InvincibilityGradient(player->invincibilitytimer) < (FRACUNIT/2))
@ -7286,7 +7286,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->invincibilitytimer)
{
INT16 invinfac = 1;
if ((K_GetKartInvinType() == KARTINVIN_ALTERN) && (player->invincibilitytimer > 2))
if ((K_IsKartItemAlternate(KITEM_INVINCIBILITY)) && (player->invincibilitytimer > 2))
{
UINT32 invindist = INVINDIST >> 2;
@ -7684,7 +7684,7 @@ void K_KartResetPlayerColor(player_t *player)
{
boolean skip = false;
if (K_GetKartInvinType() == KARTINVIN_LEGACY)
if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))
{
fullbright = true;
@ -10221,7 +10221,7 @@ void K_UnsetItemOut(player_t *player)
static boolean K_InvincibilitySlotHogging(player_t *player)
{
if (K_GetKartInvinType() == KARTINVIN_LEGACY)
if (!K_IsKartItemAlternate(KITEM_INVINCIBILITY))
return false;
return ((player->invincibilitytimer) != 0);
@ -10263,7 +10263,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|| player->itemroulette
|| player->rocketsneakertimer
|| player->eggmanexplode
|| ((K_GetKartInvinType() == KARTINVIN_ALTERN) && player->invincibilitytimer)
|| ((K_IsKartItemAlternate(KITEM_INVINCIBILITY)) && player->invincibilitytimer)
|| (player->growshrinktimer > 0)
|| player->flametimer
|| (leveltime < starttime)
@ -11455,6 +11455,24 @@ boolean K_GetKartInvinType(void)
return invintype;
}
boolean K_IsKartItemAlternate(UINT8 itemtype)
{
switch (itemtype)
{
case KITEM_INVINCIBILITY:
return invintype == KARTITEM_ALTERN;
break;
case KITEM_EGGMAN:
return eggmantype == KARTITEM_ALTERN;
break;
default:
return false;
break;
}
return false;
}
boolean K_UsingLegacyCheckpoints(void)
{
if (K_UsingPatchedMap() && waypointcap != NULL)

View file

@ -345,6 +345,7 @@ boolean K_AirDropActive(void);
boolean K_ItemLitterActive(void);
boolean K_ItemPushingActive(void);
boolean K_GetKartInvinType(void);
boolean K_IsKartItemAlternate(UINT8 itemtype);
INT32 K_GetBumpSpark(void);
boolean K_BoostChain(player_t *player, INT32 timer, boolean chainsound);
INT32 K_ChainOrDeincrementTime(player_t *player, INT32 timer, INT32 deincrement, boolean chainsound);

View file

@ -108,7 +108,7 @@ static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][MAXODDS] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Pogo Spring
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Kitchen Sink
{ 7, 11, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Super Ring
{ 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Land Mine
{ 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Land Mine / Egg Mine
{ 0, 0, 0, 12, 15, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Bubble Shield
{ 0, 0, 0, 0, 0, 0, 2, 4, 12, 24, 27, 12, 7, 4, 0, 0}, // Flame Shield
{ 0, 0, 0, 0, 0, 0, 8, 20, 40, 12, 0, 0, 0, 0, 0, 0}, // Sneaker x2
@ -140,7 +140,7 @@ static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS][2] =
{ 3, 0 }, // Pogo Spring
{ 0, 0 }, // Kitchen Sink
{ 0, 0 }, // Super Ring
{ 2, 0 }, // Land Mine
{ 2, 0 }, // Land Mine / Egg Mine
{ 1, 0 }, // Bubble Shield
{ 1, 0 }, // Flame Shield
{ 0, 0 }, // Sneaker x2
@ -173,7 +173,7 @@ static UINT8 K_KartItemOddsSpecial[NUMKARTRESULTS-1][4] =
{ 0, 0, 0, 0 }, // Pogo Spring
{ 0, 0, 0, 0 }, // Kitchen Sink
{ 0, 0, 0, 0 }, // Super Ring
{ 0, 0, 0, 0 }, // Land Mine
{ 0, 0, 0, 0 }, // Land Mine / Egg Mine
{ 0, 0, 0, 0 }, // Bubble Shield
{ 0, 0, 0, 0 }, // Flame Shield
{ 0, 1, 1, 0 }, // Sneaker x2
@ -209,7 +209,7 @@ tic_t ItemBGone[NUMKARTRESULTS][2] =
{ 0, 0 }, // Pogo Spring
{ 0, 0 }, // Kitchen Sink
{ 0, 0 }, // Super Ring
{ 0, 0 }, // Land Mine
{ 0, 0 }, // Land Mine / Egg Mine
{ 5, 0 }, // Bubble Shield
{ 8, 0 }, // Flame Shield
{ 0, 0 }, // Sneaker x2
@ -758,7 +758,7 @@ INT32 K_KartGetItemOdds(
notNearEnd = true;
break;
case KITEM_INVINCIBILITY:
if ((K_GetKartInvinType() == KARTINVIN_ALTERN) && (gametyperules & GTR_RACEODDS))
if ((K_IsKartItemAlternate(KITEM_INVINCIBILITY)) && (gametyperules & GTR_RACEODDS))
{
// It's a power item, yes, but we don't want mashing to lessen
// its chances, so we lie to the game's face.

View file

@ -147,7 +147,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon)
if (player->stealingtimer || player->stolentimer
|| player->rocketsneakertimer
|| player->eggmanexplode
|| ((K_GetKartInvinType() == KARTINVIN_ALTERN) && (player->invincibilitytimer))
|| ((K_IsKartItemAlternate(KITEM_INVINCIBILITY)) && (player->invincibilitytimer))
|| (player->growshrinktimer > 0)
|| player->flametimer)
return false;

View file

@ -1229,6 +1229,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
case MT_EGGMANITEM:
case MT_SSMINE:
case MT_LANDMINE:
case MT_EGGMINE_CAPSULE:
case MT_SINK:
if (mo->extravalue2 > 0)
{
@ -6514,6 +6515,7 @@ boolean P_IsKartFieldItem(INT32 type)
case MT_JAWZ_DUD:
case MT_SSMINE:
case MT_LANDMINE:
case MT_EGGMINE_CAPSULE:
case MT_BALLHOG:
case MT_BUBBLESHIELDTRAP:
case MT_SINK:
@ -8014,6 +8016,7 @@ static boolean P_MobjDeadThink(mobj_t *mobj)
case MT_BANANA:
case MT_EGGMANITEM:
case MT_LANDMINE:
case MT_EGGMINE_CAPSULE:
case MT_SPB:
if (P_IsObjectOnGround(mobj))
{
@ -8806,6 +8809,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (mobj->threshold > 0)
mobj->threshold--;
break;
case MT_EGGMINE_CAPSULE:
// todo
// decrement fuse while on ground
// when fuse runs out pop open and spawn a land mine
break;
case MT_SPBEXPLOSION:
mobj->health--;
break;
@ -10921,6 +10929,8 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
case MT_SSMINE:
case MT_SSMINE_SHIELD:
case MT_LANDMINE:
case MT_EGGMINE_CAPSULE:
case MT_EGGMINE_SHIELD:
case MT_BALLHOG:
case MT_SINK:
case MT_ROCKETSNEAKER:

View file

@ -2286,7 +2286,7 @@ void P_MovePlayer(player_t *player)
if ((player->invincibilitytimer > 0) &&
(((leveltime %
max(1, 10 - FixedMul(9, K_InvincibilityGradient(player->invincibilitytimer)))) == 0) ||
(K_GetKartInvinType() == KARTINVIN_LEGACY)))
(!K_IsKartItemAlternate(KITEM_INVINCIBILITY))))
{
K_SpawnSparkleTrail(player->mo);
}

View file

@ -84,7 +84,7 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer)
// Hacky boolean to check if we're the rainbow Invincibility overlay
boolean R_IsOverlayingInvinciblePlayer(mobj_t* mobj)
{
return ((K_GetKartInvinType() == KARTINVIN_ALTERN) && (mobj->type == MT_OVERLAY) &&
return ((K_IsKartItemAlternate(KITEM_INVINCIBILITY)) && (mobj->type == MT_OVERLAY) &&
(mobj->target) && (mobj->extravalue2) && (mobj->target->player) &&
(mobj->target->player->invincibilitytimer));
}