diff --git a/src/d_player.h b/src/d_player.h index 1a55cfb0d..84bd491a3 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/k_hud.c b/src/k_hud.c index a3c918e97..b34d32a42 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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 diff --git a/src/k_kart.c b/src/k_kart.c index 99ab47115..7686b1c8f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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) { diff --git a/src/p_saveg.c b/src/p_saveg.c index a64557d51..53f436a82 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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);