Add a cancel system to Alt Invincibility

Can be cancelled now, similarly to Grow
This commit is contained in:
Anonimus 2025-06-19 22:05:35 -04:00
parent b81fcaf7c7
commit 207e5011dc
4 changed files with 39 additions and 2 deletions

View file

@ -710,10 +710,13 @@ struct player_t
INT16 growshrinktimer; // > 0 = Big, < 0 = small
INT16 growcancel; // Duration of grow canceling
INT16 squishedtimer; // Duration of being squished
UINT16 rocketsneakertimer; // Rocket Sneaker duration timer
UINT16 invincibilitytimer; // Invincibility timer
UINT16 maxinvincibilitytime; // Initial time for Invincibility, used for the item bar.
UINT16 maxinvincibilitytime; // (Alternate) Initial time for Invincibility, used for the item bar.
UINT16 invincibilitybottleneck; // (Alternate) Prevents breakaways by gradienting towards a heavier decrement.
INT16 invincibilitycancel; // (Alternate) Duration of Invincibility canceling.
UINT8 eggmanexplode; // Fake item recieved, explode in a few seconds
SINT8 eggmanblame; // (-1 to 15) - Fake item recieved, who set this fake

View file

@ -1254,6 +1254,12 @@ static void K_drawKartItem(void)
itembar = stplyr->invincibilitytimer;
maxl = max(1, stplyr->maxinvincibilitytime);
if (stplyr->invincibilitycancel > 0)
{
flamebar = stplyr->invincibilitycancel;
flamemaxl = 26;
}
if (leveltime & 1)
localpatch = localinv;
else

View file

@ -7862,6 +7862,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
{
player->invincibilitybottleneck = 0; // No need for bottlenecking.
player->maxinvincibilitytime = 0;
player->invincibilitycancel = -1;
}
if (player->checkskip)
@ -10381,6 +10382,8 @@ void K_StripOther(player_t *player)
player->roulettetype = KROULETTETYPE_NORMAL;
player->invincibilitytimer = 0;
player->invincibilitycancel = -1;
if (player->growshrinktimer)
{
K_RemoveGrowShrink(player);
@ -10786,7 +10789,28 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
// Invincibility
else if (K_InvincibilitySlotHogging(player))
{
// Does nothing, for now.
// (Alternate) Cancel Invincibility
if (player->invincibilitycancel >= 0)
{
if (buttons & BT_ATTACK)
{
player->invincibilitycancel++;
if (player->invincibilitycancel > 25)
{
// Don't fully cancel due to how the music handling works.
player->invincibilitytimer = 1;
}
}
else
player->invincibilitycancel = 0;
}
else
{
if ((buttons & BT_ATTACK) || (player->oldcmd.buttons & BT_ATTACK))
player->invincibilitycancel = -1;
else
player->invincibilitycancel = 0;
}
}
else if (player->itemamount == 0)
{

View file

@ -343,11 +343,13 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEINT16(save->p, players[i].growshrinktimer);
WRITEINT16(save->p, players[i].growcancel);
WRITEUINT16(save->p, players[i].rocketsneakertimer);
WRITEUINT16(save->p, players[i].invincibilitytimer);
WRITEUINT16(save->p, players[i].maxinvincibilitytime);
WRITEUINT16(save->p, players[i].invincibilitybottleneck);
WRITEINT16(save->p, players[i].invincibilitycancel);
WRITEUINT8(save->p, players[i].eggmanexplode);
WRITESINT8(save->p, players[i].eggmanblame);
@ -687,11 +689,13 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].growshrinktimer = READINT16(save->p);
players[i].growcancel = READINT16(save->p);
players[i].rocketsneakertimer = READUINT16(save->p);
players[i].invincibilitytimer = READUINT16(save->p);
players[i].maxinvincibilitytime = READUINT16(save->p);
players[i].invincibilitybottleneck = READUINT16(save->p);
players[i].invincibilitycancel = READINT16(save->p);
players[i].eggmanexplode = READUINT8(save->p);
players[i].eggmanblame = READSINT8(save->p);