diff --git a/src/d_player.h b/src/d_player.h index 008b4f731..ca73652f9 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -464,6 +464,7 @@ typedef struct { // player_t struct for power-ups struct powerupvars_t { UINT16 superTimer; + UINT16 barrierTimer; mobj_t *flickyController; }; diff --git a/src/k_kart.c b/src/k_kart.c index 9d12f203c..0db4a2046 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -45,6 +45,7 @@ #include "k_specialstage.h" #include "k_roulette.h" #include "k_podium.h" +#include "k_powerup.h" // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // gamespeed is cc (0 for easy, 1 for normal, 2 for hard) @@ -7997,7 +7998,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->spheredigestion = spheredigestion; } - if (K_PlayerGuard(player) && (player->ebrakefor%6 == 0)) + if (K_PlayerGuard(player) && !K_PowerUpRemaining(player, POWERUP_BARRIER) && (player->ebrakefor%6 == 0)) player->spheres--; } else @@ -8090,6 +8091,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } + if (player->powerup.barrierTimer > 0) + { + player->powerup.barrierTimer--; + } + if (player->powerup.superTimer > 0) { player->powerup.superTimer--; @@ -8339,7 +8345,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->pflags &= ~PF_DRIFTINPUT; } - if (K_PlayerGuard(player)) + if (K_PlayerGuard(player) && !K_PowerUpRemaining(player, POWERUP_BARRIER)) player->instaShieldCooldown = max(player->instaShieldCooldown, INSTAWHIP_DROPGUARD); // Roulette Code @@ -10062,7 +10068,17 @@ boolean K_PlayerEBrake(player_t *player) boolean K_PlayerGuard(player_t *player) { - return (K_PlayerEBrake(player) && player->spheres > 0 && player->guardCooldown == 0); + if (player->guardCooldown != 0) + { + return false; + } + + if (K_PowerUpRemaining(player, POWERUP_BARRIER)) + { + return true; + } + + return (K_PlayerEBrake(player) && player->spheres > 0); } SINT8 K_Sliptiding(player_t *player) @@ -10849,7 +10865,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else { player->instaShieldCooldown = INSTAWHIP_COOLDOWN; - player->guardCooldown = INSTAWHIP_COOLDOWN; + + if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) + { + player->guardCooldown = INSTAWHIP_COOLDOWN; + } + S_StartSound(player->mo, sfx_iwhp); mobj_t *whip = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTAWHIP); P_SetTarget(&player->whip, whip); diff --git a/src/k_powerup.cpp b/src/k_powerup.cpp index 1b42fa8da..5abcc2a42 100644 --- a/src/k_powerup.cpp +++ b/src/k_powerup.cpp @@ -11,6 +11,9 @@ tic_t K_PowerUpRemaining(const player_t* player, kartitems_t powerup) case POWERUP_SMONITOR: return player->powerup.superTimer; + case POWERUP_BARRIER: + return player->powerup.barrierTimer; + case POWERUP_SUPERFLICKY: return Obj_SuperFlickySwarmTime(player->powerup.flickyController); @@ -28,6 +31,10 @@ void K_GivePowerUp(player_t* player, kartitems_t powerup, tic_t time) player->powerup.superTimer += time; break; + case POWERUP_BARRIER: + player->powerup.barrierTimer += time; + break; + case POWERUP_SUPERFLICKY: if (K_PowerUpRemaining(player, POWERUP_SUPERFLICKY)) { @@ -58,6 +65,7 @@ void K_DropPowerUps(player_t* player) }; simple_drop(POWERUP_SMONITOR, player->powerup.superTimer); + simple_drop(POWERUP_BARRIER, player->powerup.barrierTimer); if (K_PowerUpRemaining(player, POWERUP_SUPERFLICKY)) { diff --git a/src/p_saveg.c b/src/p_saveg.c index 55d228f4b..ce68fa36c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -637,6 +637,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) // powerupvars_t WRITEUINT16(save->p, players[i].powerup.superTimer); + WRITEUINT16(save->p, players[i].powerup.barrierTimer); } } @@ -1064,6 +1065,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) // powerupvars_t players[i].powerup.superTimer = READUINT16(save->p); + players[i].powerup.barrierTimer = READUINT16(save->p); //players[i].viewheight = P_GetPlayerViewHeight(players[i]); // scale cannot be factored in at this point }