diff --git a/src/p_inter.c b/src/p_inter.c index 3b8707e62..ce5209a41 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -295,7 +295,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; #endif - elementalpierce = (((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) && (player->pflags & PF_SHIELDABILITY)); + elementalpierce = (((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL || (player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (player->pflags & PF_SHIELDABILITY)); if (special->flags & MF_BOSS) { diff --git a/src/p_map.c b/src/p_map.c index bb904cc3d..6c4ea979a 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1052,7 +1052,8 @@ static boolean PIT_CheckThing(mobj_t *thing) else if (thing->z - FixedMul(FRACUNIT, thing->scale) <= tmthing->z + tmthing->height && thing->z + thing->height + FixedMul(FRACUNIT, thing->scale) >= tmthing->z) { - boolean elementalpierce = (((tmthing->player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) + boolean elementalpierce = (((tmthing->player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL + || (tmthing->player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (tmthing->player->pflags & PF_SHIELDABILITY)); if (thing->flags & MF_MONITOR && (tmthing->player->pflags & (PF_SPINNING|PF_GLIDING) diff --git a/src/p_mobj.c b/src/p_mobj.c index 8da0a2360..87f40b2fc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3252,6 +3252,14 @@ static void P_PlayerZMovement(mobj_t *mo) : 5*FRACUNIT/2, false); P_SetPlayerMobjState(mo, S_PLAY_FALL); + mo->momx = mo->momy = 0; + clipmomz = false; + } + else if ((mo->player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) // Bubble shield's bounce attack. + { + S_StartSound(mo, sfx_s3k44); + P_DoJump(mo->player, false); + mo->momz = FixedMul(mo->momz, 5*FRACUNIT/4); clipmomz = false; } } @@ -3642,7 +3650,7 @@ void P_MobjCheckWater(mobj_t *mobj) p->powers[pw_underwater] = underwatertics + 1; } - if ((mobj->eflags & MFE_GOOWATER) && (p->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL && (p->pflags & PF_SHIELDABILITY)) + if ((mobj->eflags & MFE_GOOWATER) && ((p->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL || (p->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (p->pflags & PF_SHIELDABILITY)) p->pflags &= ~PF_SHIELDABILITY; } diff --git a/src/p_user.c b/src/p_user.c index adaacfaba..93823542d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7033,7 +7033,7 @@ static void P_MovePlayer(player_t *player) // Flame shield activation case SH_FLAMEAURA: player->pflags |= PF_THOKKED|PF_SHIELDABILITY; - P_Thrust(player->mo, player->mo->angle, 30*player->mo->scale - FixedMul(FixedSqrt(player->speed), FixedSqrt(player->mo->scale))); + P_Thrust(player->mo, player->mo->angle, FixedMul(30*FRACUNIT - FixedSqrt(FixedDiv(player->speed, player->mo->scale)), player->mo->scale)); S_StartSound(player->mo, sfx_s3k43); default: break;