* CA_BOUNCE users now play animation/sound when bouncing on enemies, monitors.

* CA_BOUNCE users harmlessly bounce off Sharps.
This commit is contained in:
toasterbabe 2016-12-24 00:11:54 +00:00
parent b84ad05061
commit 942065ba9f
5 changed files with 44 additions and 13 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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.
}

View File

@ -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;
}
}

View File

@ -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
//