diff --git a/src/d_player.h b/src/d_player.h index dd765bb0b..993a9de4d 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/g_game.c b/src/g_game.c index 580b3bf0d..c675e9a22 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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; diff --git a/src/k_hud.c b/src/k_hud.c index 1b7894da9..2d821ddd4 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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)); } } } diff --git a/src/k_kart.c b/src/k_kart.c index 3d46bbfca..5fe2b7ef6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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); } } diff --git a/src/p_inter.c b/src/p_inter.c index e0ba88296..ea14e5f7c 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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) { diff --git a/src/p_saveg.c b/src/p_saveg.c index 27e100ccd..cd8f1d208 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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);