From 942065ba9f0b6ca469ab305482362e9ac48eafc4 Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Sat, 24 Dec 2016 00:11:54 +0000 Subject: [PATCH] * CA_BOUNCE users now play animation/sound when bouncing on enemies, monitors. * CA_BOUNCE users harmlessly bounce off Sharps. --- src/p_inter.c | 13 +++++++++++-- src/p_local.h | 1 + src/p_map.c | 4 ++++ src/p_mobj.c | 13 ++----------- src/p_user.c | 26 ++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 16f128da9..dc2f973b2 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -382,6 +382,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) else toucher->momz = -toucher->momz; } + if (player->pflags & PF_BOUNCING) + P_DoAbilityBounce(player, false); toucher->momx = -toucher->momx; toucher->momy = -toucher->momy; P_DamageMobj(special, toucher, toucher, 1, 0); @@ -416,8 +418,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) else if (special->type == MT_SHARP && ((special->state == &states[special->info->xdeathstate]) || (toucher->z > special->z + special->height/2))) { - // Cannot hit sharp from above or when red and angry - P_DamageMobj(toucher, special, special, 1, 0); + if (player->pflags & PF_BOUNCING) + { + toucher->momz = -toucher->momz; + P_DoAbilityBounce(player, false); + } + else // Cannot hit sharp from above or when red and angry + P_DamageMobj(toucher, special, special, 1, 0); } else if (((player->pflags & PF_NIGHTSMODE) && (player->pflags & PF_DRILLING)) || ((player->pflags & PF_JUMPED) && (player->pflags & PF_FORCEJUMPDAMAGE || !(player->charflags & SF_NOJUMPSPIN) || (player->charability == CA_TWINSPIN && player->panim == PA_ABILITY))) @@ -433,6 +440,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) else toucher->momz = -toucher->momz; } + if (player->pflags & PF_BOUNCING) + P_DoAbilityBounce(player, false); P_DamageMobj(special, toucher, toucher, 1, 0); } diff --git a/src/p_local.h b/src/p_local.h index df9b20a54..ea97acb89 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -155,6 +155,7 @@ boolean P_AutoPause(void); void P_DoJumpShield(player_t *player); void P_DoBubbleBounce(player_t *player); +void P_DoAbilityBounce(player_t *player, boolean changemomz); void P_BlackOw(player_t *player); void P_ElementalFire(player_t *player, boolean cropcircle); diff --git a/src/p_map.c b/src/p_map.c index a490c7f3b..a80e906ef 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1084,7 +1084,11 @@ static boolean PIT_CheckThing(mobj_t *thing) *momz = -*momz; // Therefore, you should be thrust in the opposite direction, vertically. } if (!(elementalpierce == 1 && thing->flags & MF_GRENADEBOUNCE)) // prevent gold monitor clipthrough. + { + if (player->pflags & PF_BOUNCING) + P_DoAbilityBounce(player); return false; + } else *z -= *momz; // to ensure proper collision. } diff --git a/src/p_mobj.c b/src/p_mobj.c index a6e012c73..c9225c081 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3318,17 +3318,8 @@ static void P_PlayerZMovement(mobj_t *mo) if (mo->player->pflags & PF_BOUNCING && !P_CheckDeathPitCollide(mo)) { - fixed_t prevmomz = P_MobjFlip(mo)*abs(mo->momz); - if (mo->eflags & MFE_UNDERWATER) - { - prevmomz /= 2; - } - S_StartSound(mo, sfx_boingf); - P_DoJump(mo->player, false); - P_SetPlayerMobjState(mo, S_PLAY_BOUNCE_LANDING); - mo->player->pflags |= PF_BOUNCING|PF_THOKKED; - mo->player->jumping = 0; - mo->momz = (FixedMul(mo->momz, 3*FRACUNIT/2) + prevmomz)/2; + mo->momz *= -1; + P_DoAbilityBounce(mo->player, true); clipmomz = false; } } diff --git a/src/p_user.c b/src/p_user.c index a71491c7d..cdd87af3e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4005,6 +4005,32 @@ void P_DoBubbleBounce(player_t *player) player->mo->momz = FixedMul(player->mo->momz, 5*FRACUNIT/4); } +// +// P_DoAbilityBounce +// +// CA_BOUNCE landing handling +// +void P_DoAbilityBounce(player_t *player, boolean changemomz) +{ + fixed_t prevmomz; + if (player->mo->state-states == S_PLAY_BOUNCE_LANDING) + return; + if (changemomz) + { + prevmomz = P_MobjFlip(player->mo)*player->mo->momz; + if (prevmomz < 0) + prevmomz = 0; + else if (player->mo->eflags & MFE_UNDERWATER) + prevmomz /= 2; + P_DoJump(player, false); + player->jumping = 0; + player->mo->momz = (FixedMul(player->mo->momz, 3*FRACUNIT/2) + prevmomz)/2; + } + S_StartSound(player->mo, sfx_boingf); + P_SetPlayerMobjState(player->mo, S_PLAY_BOUNCE_LANDING); + player->pflags |= PF_BOUNCING|PF_THOKKED; +} + // // P_Telekinesis //