From 5cb54f29fe4820b30543235ef74b0998281dca46 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 2 Mar 2023 22:01:56 -0800 Subject: [PATCH] Sync player mobj health to bumper count Fixes players killed twice if P_DamageMobj is called with DMG_TIMEOVER and gametyperules GTR_BUMPERS. Moves death condition out of K_HandleBumperChanges and lets losing last bumper organically kill the player by decreasing their health. --- src/k_battle.c | 11 ++++++++--- src/k_kart.c | 20 +++++++++++--------- src/k_kart.h | 4 ++-- src/p_inter.c | 28 ++++++++++++++-------------- src/p_mobj.c | 5 +++++ 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/k_battle.c b/src/k_battle.c index b34c7a151..37bb33f4f 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -183,10 +183,8 @@ void K_CheckEmeralds(player_t *player) continue; } - players[i].bumpers = 0; + P_DoPlayerExit(&players[i]); } - - K_CheckBumpers(); } UINT16 K_GetChaosEmeraldColor(UINT32 emeraldType) @@ -791,7 +789,14 @@ void K_BattleInit(boolean singleplayercontext) { if (!playeringame[i] || players[i].spectator) continue; + players[i].bumpers = maxbumpers; + + if (players[i].mo) + { + players[i].mo->health = maxbumpers; + } + K_SpawnPlayerBattleBumpers(players+i); } } diff --git a/src/k_kart.c b/src/k_kart.c index 4284c286d..253c79715 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4181,35 +4181,35 @@ void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers) { player->pflags |= (PF_NOCONTEST|PF_ELIMINATED); } - - P_KillMobj(player->mo, NULL, NULL, DMG_NORMAL); } K_CalculateBattleWanted(); K_CheckBumpers(); } -void K_DestroyBumpers(player_t *player, UINT8 amount) +UINT8 K_DestroyBumpers(player_t *player, UINT8 amount) { UINT8 oldBumpers = player->bumpers; if (!(gametyperules & GTR_BUMPERS)) { - return; + return 0; } amount = min(amount, player->bumpers); if (amount == 0) { - return; + return 0; } player->bumpers -= amount; K_HandleBumperChanges(player, oldBumpers); + + return amount; } -void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) +UINT8 K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) { UINT8 oldPlayerBumpers = player->bumpers; UINT8 oldVictimBumpers = victim->bumpers; @@ -4218,14 +4218,14 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) if (!(gametyperules & GTR_BUMPERS)) { - return; + return 0; } amount = min(amount, victim->bumpers); if (amount == 0) { - return; + return 0; } while ((tookBumpers < amount) && (victim->bumpers > 0)) @@ -4280,7 +4280,7 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) if (tookBumpers == 0) { // No change occured. - return; + return 0; } // Play steal sound @@ -4288,6 +4288,8 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) K_HandleBumperChanges(player, oldPlayerBumpers); K_HandleBumperChanges(victim, oldVictimBumpers); + + return tookBumpers; } #define MINEQUAKEDIST 4096 diff --git a/src/k_kart.h b/src/k_kart.h index 04610be45..66ad64b50 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -103,8 +103,8 @@ void K_UpdateStumbleIndicator(player_t *player); INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_DebtStingPlayer(player_t *player, mobj_t *source); void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers); -void K_DestroyBumpers(player_t *player, UINT8 amount); -void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount); +UINT8 K_DestroyBumpers(player_t *player, UINT8 amount); +UINT8 K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount); void K_MineFlashScreen(mobj_t *source); void K_SpawnMineExplosion(mobj_t *source, UINT8 color, tic_t delay); void K_RunFinishLineBeam(void); diff --git a/src/p_inter.c b/src/p_inter.c index 3d69eec25..abd3c3c69 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2146,6 +2146,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da const boolean hardhit = (type == DMG_EXPLODE || type == DMG_KARMA || type == DMG_TUMBLE); // This damage type can do evil stuff like ALWAYS combo INT16 ringburst = 5; + // Do not die from damage outside of bumpers health system + damage = 0; + // Check if the player is allowed to be damaged! // If not, then spawn the instashield effect instead. if (!force) @@ -2275,12 +2278,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_TryHurtSoundExchange(target, source); K_BattleAwardHit(source->player, player, inflictor, takeBumpers); - K_TakeBumpersFromPlayer(source->player, player, takeBumpers); + damage = K_TakeBumpersFromPlayer(source->player, player, takeBumpers); if (type == DMG_KARMA) { // Destroy any remainder bumpers from the player for karma comeback damage - K_DestroyBumpers(player, player->bumpers); + damage = K_DestroyBumpers(player, player->bumpers); } else { @@ -2303,7 +2306,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da } else { - K_DestroyBumpers(player, takeBumpers); + damage = K_DestroyBumpers(player, takeBumpers); } if (!(damagetype & DMG_STEAL)) @@ -2389,15 +2392,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (type != DMG_STUMBLE) { player->instashield = 15; - K_SetHitLagForObjects(target, inflictor, laglength, true); } if (inflictor && !P_MobjWasRemoved(inflictor) && inflictor->type == MT_BANANA) { player->flipDI = true; } - - return true; } } else @@ -2433,16 +2433,16 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da //K_SetHitLagForObjects(target, inflictor, laglength, true); - if (player) - P_ResetPlayer(target->player); - else + if (!player) + { P_SetMobjState(target, target->info->painstate); - if (!P_MobjWasRemoved(target)) - { - // if not intent on another player, - // chase after this one - P_SetTarget(&target->target, source); + if (!P_MobjWasRemoved(target)) + { + // if not intent on another player, + // chase after this one + P_SetTarget(&target->target, source); + } } return true; diff --git a/src/p_mobj.c b/src/p_mobj.c index 3f0481a94..0f1b6de78 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11829,6 +11829,11 @@ void P_SpawnPlayer(INT32 playernum) p->bumpers = K_StartingBumperCount(); K_SpawnPlayerBattleBumpers(p); } + + if (p->bumpers > 0) + { + mobj->health = p->bumpers; + } } // I'm not refactoring the loop at the top of this file.