Add Barrier Power-Up

- Guard is always up, not activated by e-brake or spheres
- Guard can still be broken by player contact
- No instawhip cooldown from Guard being up
- No sphere loss while Guard is up
- Guard appears at max size
This commit is contained in:
James R 2023-06-29 19:01:56 -07:00
parent e67ab6a116
commit ba114022b9
4 changed files with 36 additions and 4 deletions

View file

@ -464,6 +464,7 @@ typedef struct {
// player_t struct for power-ups // player_t struct for power-ups
struct powerupvars_t { struct powerupvars_t {
UINT16 superTimer; UINT16 superTimer;
UINT16 barrierTimer;
mobj_t *flickyController; mobj_t *flickyController;
}; };

View file

@ -45,6 +45,7 @@
#include "k_specialstage.h" #include "k_specialstage.h"
#include "k_roulette.h" #include "k_roulette.h"
#include "k_podium.h" #include "k_podium.h"
#include "k_powerup.h"
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard) // 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; 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--; player->spheres--;
} }
else 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) if (player->powerup.superTimer > 0)
{ {
player->powerup.superTimer--; player->powerup.superTimer--;
@ -8339,7 +8345,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->pflags &= ~PF_DRIFTINPUT; player->pflags &= ~PF_DRIFTINPUT;
} }
if (K_PlayerGuard(player)) if (K_PlayerGuard(player) && !K_PowerUpRemaining(player, POWERUP_BARRIER))
player->instaShieldCooldown = max(player->instaShieldCooldown, INSTAWHIP_DROPGUARD); player->instaShieldCooldown = max(player->instaShieldCooldown, INSTAWHIP_DROPGUARD);
// Roulette Code // Roulette Code
@ -10062,7 +10068,17 @@ boolean K_PlayerEBrake(player_t *player)
boolean K_PlayerGuard(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) SINT8 K_Sliptiding(player_t *player)
@ -10849,7 +10865,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
else else
{ {
player->instaShieldCooldown = INSTAWHIP_COOLDOWN; player->instaShieldCooldown = INSTAWHIP_COOLDOWN;
player->guardCooldown = INSTAWHIP_COOLDOWN;
if (!K_PowerUpRemaining(player, POWERUP_BARRIER))
{
player->guardCooldown = INSTAWHIP_COOLDOWN;
}
S_StartSound(player->mo, sfx_iwhp); S_StartSound(player->mo, sfx_iwhp);
mobj_t *whip = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTAWHIP); mobj_t *whip = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTAWHIP);
P_SetTarget(&player->whip, whip); P_SetTarget(&player->whip, whip);

View file

@ -11,6 +11,9 @@ tic_t K_PowerUpRemaining(const player_t* player, kartitems_t powerup)
case POWERUP_SMONITOR: case POWERUP_SMONITOR:
return player->powerup.superTimer; return player->powerup.superTimer;
case POWERUP_BARRIER:
return player->powerup.barrierTimer;
case POWERUP_SUPERFLICKY: case POWERUP_SUPERFLICKY:
return Obj_SuperFlickySwarmTime(player->powerup.flickyController); 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; player->powerup.superTimer += time;
break; break;
case POWERUP_BARRIER:
player->powerup.barrierTimer += time;
break;
case POWERUP_SUPERFLICKY: case POWERUP_SUPERFLICKY:
if (K_PowerUpRemaining(player, 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_SMONITOR, player->powerup.superTimer);
simple_drop(POWERUP_BARRIER, player->powerup.barrierTimer);
if (K_PowerUpRemaining(player, POWERUP_SUPERFLICKY)) if (K_PowerUpRemaining(player, POWERUP_SUPERFLICKY))
{ {

View file

@ -637,6 +637,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
// powerupvars_t // powerupvars_t
WRITEUINT16(save->p, players[i].powerup.superTimer); 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 // powerupvars_t
players[i].powerup.superTimer = READUINT16(save->p); 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 //players[i].viewheight = P_GetPlayerViewHeight(players[i]); // scale cannot be factored in at this point
} }