From 8ccf5f3b891d8555de3d7f3225696a89d3fb9499 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 28 Aug 2025 20:10:07 +0100 Subject: [PATCH] Shuffle some of player death handling in p_inter.c around Permits a dying player to have its wavedash indicator actually removed (was made very obvious by the new sliptide segment in Drifting) --- src/p_inter.c | 88 ++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 549e61d66..f8d3f162a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1922,6 +1922,44 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget } } + if (target->player->spectator == false) + { + UINT32 skinflags = (demo.playback) + ? demo.skinlist[demo.currentskinid[(target->player-players)]].flags + : skins[target->player->skin]->flags; + + if (skinflags & SF_IRONMAN) + { + target->skin = skins[target->player->skin]; + target->player->charflags = skinflags; + K_SpawnMagicianParticles(target, 5); + S_StartSound(target, sfx_slip); + } + + target->renderflags &= ~RF_DONTDRAW; + } + + K_DropEmeraldsFromPlayer(target->player, target->player->emeralds); + + target->player->carry = CR_NONE; + + K_KartResetPlayerColor(target->player); + + P_ResetPlayer(target->player); + +#define PlayerPointerRemove(field) \ + if (P_MobjWasRemoved(field) == false) \ + { \ + P_RemoveMobj(field); \ + P_SetTarget(&field, NULL); \ + } + + PlayerPointerRemove(target->player->stumbleIndicator); + PlayerPointerRemove(target->player->wavedashIndicator); + PlayerPointerRemove(target->player->trickIndicator); + +#undef PlayerPointerRemove + if (gametyperules & GTR_BUMPERS) { if (battleovertime.enabled >= 10*TICRATE) // Overtime Barrier is armed @@ -2684,7 +2722,6 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, if (modeattacking & ATTACKING_SPB) { - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); return true; } @@ -2700,6 +2737,9 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, // disappearifies, but still gotta put items back in play break; + case DMG_TIMEOVER: + player->pflags |= PF_ELIMINATED; + //FALLTHRU default: // Everything else REALLY kills if (leveltime < starttime) @@ -2709,52 +2749,6 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, break; } - if (player->spectator == false) - { - UINT32 skinflags = (demo.playback) - ? demo.skinlist[demo.currentskinid[(player-players)]].flags - : skins[player->skin]->flags; - - if (skinflags & SF_IRONMAN) - { - player->mo->skin = skins[player->skin]; - player->charflags = skinflags; - K_SpawnMagicianParticles(player->mo, 5); - S_StartSound(player->mo, sfx_slip); - } - - player->mo->renderflags &= ~RF_DONTDRAW; - } - - K_DropEmeraldsFromPlayer(player, player->emeralds); - //K_SetHitLagForObjects(player->mo, inflictor, source, MAXHITLAGTICS, true); - - player->carry = CR_NONE; - - K_KartResetPlayerColor(player); - - P_ResetPlayer(player); - - P_SetPlayerMobjState(player->mo, player->mo->info->deathstate); - -#define PlayerPointerRemove(field) \ - if (P_MobjWasRemoved(field) == false) \ - { \ - P_RemoveMobj(field); \ - P_SetTarget(&field, NULL); \ - } - - PlayerPointerRemove(player->stumbleIndicator); - PlayerPointerRemove(player->wavedashIndicator); - PlayerPointerRemove(player->trickIndicator); - -#undef PlayerPointerRemove - - if (type == DMG_TIMEOVER) - { - player->pflags |= PF_ELIMINATED; - } - return true; }