Elimination timer for karma bombs during overtime

Every hit on another player while you are alive awards you
five seconds of karma bomb time during overtime. When this
timer is empty, you will DIE.
This commit is contained in:
James R 2021-11-26 21:55:32 -08:00
parent b22d18aea6
commit 059058476e
6 changed files with 30 additions and 9 deletions

View file

@ -468,6 +468,7 @@ typedef struct player_s
UINT8 emeralds;
UINT8 bumpers;
INT16 karmadelay;
tic_t overtimekarma; // time to live in overtime comeback
INT16 spheres;
SINT8 glanceDir; // Direction the player is trying to look backwards in

View file

@ -2281,6 +2281,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
p->growshrinktimer = growshrinktimer;
p->bumpers = bumper;
p->karmadelay = comebacktime;
p->overtimekarma = 0;
p->eggmanblame = -1;
p->lastdraft = -1;
p->karthud[khud_fault] = khudfault;

View file

@ -2460,7 +2460,10 @@ static void K_drawKartBumpersOrKarma(void)
else
V_DrawMappedPatch(LAPS_X, LAPS_Y, V_HUDTRANS|V_SLIDEIN|splitflags, kp_bumpersticker, colormap);
V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|V_SLIDEIN|splitflags, va("%d/%d", stplyr->bumpers, maxbumper));
if (stplyr->bumpers > 0)
V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|V_SLIDEIN|splitflags, va("%d/%d", stplyr->bumpers, maxbumper));
else // TODO - BETTER HUD
V_DrawKartString(LAPS_X+47, LAPS_Y+3, V_HUDTRANS|V_SLIDEIN|splitflags, va("%d", stplyr->overtimekarma / TICRATE));
}
}
}

View file

@ -6890,18 +6890,28 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
K_KartPlayerHUDUpdate(player);
if ((battleovertime.enabled >= 10*TICRATE) && !(player->pflags & PF_ELIMINATED))
if (battleovertime.enabled && !(player->pflags & PF_ELIMINATED))
{
fixed_t distanceToBarrier = 0;
if (battleovertime.radius > 0)
if (battleovertime.enabled >= 10*TICRATE)
{
distanceToBarrier = R_PointToDist2(player->mo->x, player->mo->y, battleovertime.x, battleovertime.y) - (player->mo->radius * 2);
fixed_t distanceToBarrier = 0;
if (battleovertime.radius > 0)
{
distanceToBarrier = R_PointToDist2(player->mo->x, player->mo->y, battleovertime.x, battleovertime.y) - (player->mo->radius * 2);
}
if (distanceToBarrier > battleovertime.radius)
{
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_TIMEOVER);
}
}
if (distanceToBarrier > battleovertime.radius)
else if (player->bumpers <= 0)
{
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_TIMEOVER);
if (player->overtimekarma)
player->overtimekarma--;
else
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_TIMEOVER);
}
}

View file

@ -1972,6 +1972,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
// Destroy any remainder bumpers from the player for karma comeback damage
K_DestroyBumpers(player, player->bumpers);
}
else
{
source->player->overtimekarma += 5*TICRATE;
}
if (damagetype & DMG_STEAL)
{

View file

@ -317,6 +317,7 @@ static void P_NetArchivePlayers(void)
WRITEUINT8(save_p, players[i].emeralds);
WRITEUINT8(save_p, players[i].bumpers);
WRITEINT16(save_p, players[i].karmadelay);
WRITEUINT32(save_p, players[i].overtimekarma);
WRITEINT16(save_p, players[i].spheres);
WRITESINT8(save_p, players[i].glanceDir);
@ -573,6 +574,7 @@ static void P_NetUnArchivePlayers(void)
players[i].emeralds = READUINT8(save_p);
players[i].bumpers = READUINT8(save_p);
players[i].karmadelay = READINT16(save_p);
players[i].overtimekarma = READUINT32(save_p);
players[i].spheres = READINT16(save_p);
players[i].glanceDir = READSINT8(save_p);