diff --git a/src/d_player.h b/src/d_player.h index 16339b32a..74ff42cdc 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -135,11 +135,12 @@ typedef enum typedef enum { - PF2_SELFMUTE = 1<<1, - PF2_SELFDEAFEN = 1<<2, - PF2_SERVERMUTE = 1<<3, - PF2_SERVERDEAFEN = 1<<4, - PF2_STRICTFASTFALL = 1<<5, + PF2_SELFMUTE = 1<<1, + PF2_SELFDEAFEN = 1<<2, + PF2_SERVERMUTE = 1<<3, + PF2_SERVERDEAFEN = 1<<4, + PF2_STRICTFASTFALL = 1<<5, + PF2_ALWAYSDAMAGED = 1<<6, } pflags2_t; typedef enum diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 443b8fcbc..0392e0133 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1168,6 +1168,27 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) return false; } + + boolean guard1 = K_PlayerGuard(t1->player); + boolean guard2 = K_PlayerGuard(t2->player); + + // Bubble Shield physically extends past guard when inflated, + // makes some sense to suppress this behavior + if (t1->player->bubbleblowup) + guard1 = false; + if (t2->player->bubbleblowup) + guard2 = false; + + if (guard1 && guard2) + K_DoPowerClash(t1, t2); + else if (guard1) + K_DoGuardBreak(t1, t2); + else if (guard2) + K_DoGuardBreak(t2, t1); + + if (guard1 || guard2) + return false; + // Clash instead of damage if both parties have any of these conditions auto canClash = [](mobj_t *t1, mobj_t *t2) { diff --git a/src/k_kart.c b/src/k_kart.c index be13789bf..41087e46c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1182,25 +1182,6 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2) K_SpawnBumpForObjs(mobj1, mobj2); - if (mobj1->type == MT_PLAYER && mobj2->type == MT_PLAYER - && !mobj1->player->powerupVFXTimer && !mobj2->player->powerupVFXTimer) - { - boolean guard1 = K_PlayerGuard(mobj1->player); - boolean guard2 = K_PlayerGuard(mobj2->player); - - if (mobj1->player->bubbleblowup) - guard1 = false; - if (mobj2->player->bubbleblowup) - guard2 = false; - - if (guard1 && guard2) - K_DoPowerClash(mobj1, mobj2); - else if (guard1) - K_DoGuardBreak(mobj1, mobj2); - else if (guard2) - K_DoGuardBreak(mobj2, mobj1); - } - K_PlayerJustBumped(mobj1->player); K_PlayerJustBumped(mobj2->player); @@ -4620,7 +4601,9 @@ void K_DoGuardBreak(mobj_t *t1, mobj_t *t2) { angle_t thrangle = R_PointToAngle2(t2->x, t2->y, t1->x, t1->y); P_Thrust(t1, thrangle, 7*mapobjectscale); + t1->player->pflags2 |= PF2_ALWAYSDAMAGED; P_DamageMobj(t1, t2, t2, 1, DMG_TUMBLE); + t1->player->pflags2 &= ~PF2_ALWAYSDAMAGED; clash = P_SpawnMobj((t1->x/2) + (t2->x/2), (t1->y/2) + (t2->y/2), (t1->z/2) + (t2->z/2), MT_GUARDBREAK); diff --git a/src/p_inter.c b/src/p_inter.c index 04a05ce4c..251dd917a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3094,6 +3094,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da invincible = false; } + if (player->pflags2 && PF2_ALWAYSDAMAGED) + { + invincible = false; + clash = false; + } + // TODO: doing this from P_DamageMobj limits punting to objects that damage the player. // And it may be kind of yucky. // But this is easier than accounting for every condition in PIT_CheckThing!