diff --git a/src/k_battle.c b/src/k_battle.c index 51f423deb..8d3477da4 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -105,6 +105,9 @@ void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount) if (!source || !source->mo) return; + if (source->exiting) + return; + if (amount == 1) st = S_BATTLEPOINT1A; else if (amount == 2) diff --git a/src/k_kart.c b/src/k_kart.c index b315e190c..3250952b7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5337,8 +5337,8 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) void K_GivePointsToPlayer(player_t *player, player_t *victim, UINT8 amount) { + K_SpawnBattlePoints(player, victim, amount); // first just in case player score ends the game P_AddPlayerScore(player, amount); - K_SpawnBattlePoints(player, victim, amount); } #define MINEQUAKEDIST 4096 diff --git a/src/p_inter.c b/src/p_inter.c index 28bf905a8..2a9515b9b 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1142,22 +1142,29 @@ static void P_AddBrokenPrison(mobj_t *target, mobj_t *inflictor, mobj_t *source) if (!battleprisons) return; + // Check to see if everyone's out. + { + UINT8 i = 0; + + for (; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator || players[i].exiting) + continue; + break; + } + + if (i == MAXPLAYERS) + { + // Nobody can claim credit for this just-too-late hit! + P_DoAllPlayersExit(0, false); // softlock prevention + return; + } + } + + // If you CAN recieve points, get them! if ((gametyperules & GTR_POINTLIMIT) && (source && source->player)) { - /*mobj_t * ring; - for (i = 0; i < 2; i++) - { - dir += (ANGLE_MAX/3); - ring = P_SpawnMobj(target->x, target->y, target->z, MT_RING); - ring->angle = dir; - P_InstaThrust(ring, dir, 16*ring->scale); - ring->momz = 8 * target->scale * P_MobjFlip(target); - P_SetTarget(&ring->tracer, source); - source->player->pickuprings++; - }*/ - - P_AddPlayerScore(source->player, 1); - K_SpawnBattlePoints(source->player, NULL, 1); + K_GivePointsToPlayer(source->player, NULL, 1); } targetdamaging_t targetdamaging = UFOD_GENERIC; @@ -1202,13 +1209,18 @@ static void P_AddBrokenPrison(mobj_t *target, mobj_t *inflictor, mobj_t *source) gamedata->prisoneggstothispickup--; } + // Standard progression. if (++numtargets >= maptargets) { + // Yipue! + P_DoAllPlayersExit(0, true); } else { S_StartSound(NULL, sfx_s221); + + // Time limit recovery if (timelimitintics) { UINT16 bonustime = 10*TICRATE; @@ -1255,7 +1267,7 @@ static void P_AddBrokenPrison(mobj_t *target, mobj_t *inflictor, mobj_t *source) secretextratime = TICRATE/2; } - + // Prison Egg challenge drops (CDs, etc) #ifdef DEVELOP extern consvar_t cv_debugprisoncd; #endif