* You can now bounce off of springs without unbouncing.

* You can now bounce off the bottom of goop areas.
* Fixed that long-standing bug where you could accelerate whilst rolling.
This commit is contained in:
toasterbabe 2017-02-09 23:24:47 +00:00
parent 7b4688732b
commit 8cdcb2c416
3 changed files with 32 additions and 14 deletions

View file

@ -203,7 +203,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
} }
} }
pflags = object->player->pflags & (PF_JUMPED|PF_SPINNING|PF_THOKKED|PF_SHIELDABILITY); // I still need these. pflags = object->player->pflags & (PF_JUMPED|PF_SPINNING|PF_THOKKED|PF_SHIELDABILITY|PF_BOUNCING); // I still need these.
jumping = object->player->jumping; jumping = object->player->jumping;
secondjump = object->player->secondjump; secondjump = object->player->secondjump;
P_ResetPlayer(object->player); P_ResetPlayer(object->player);
@ -213,13 +213,10 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
object->player->pflags |= PF_JUMPED; object->player->pflags |= PF_JUMPED;
P_SetPlayerMobjState(object, S_PLAY_JUMP); P_SetPlayerMobjState(object, S_PLAY_JUMP);
} }
else if (P_MobjFlip(object)*vertispeed > 0) else if (!vertispeed || (pflags & PF_BOUNCING)) // horizontal spring or bouncing
P_SetPlayerMobjState(object, S_PLAY_SPRING);
else if (P_MobjFlip(object)*vertispeed < 0)
P_SetPlayerMobjState(object, S_PLAY_FALL);
else // horizontal spring
{ {
if (pflags & (PF_JUMPED|PF_SPINNING) && (object->player->panim == PA_ROLL || object->player->panim == PA_JUMP || object->player->panim == PA_FALL)) if ((pflags & PF_BOUNCING)
|| (pflags & (PF_JUMPED|PF_SPINNING) && (object->player->panim == PA_ROLL || object->player->panim == PA_JUMP || object->player->panim == PA_FALL)))
{ {
object->player->pflags |= pflags; object->player->pflags |= pflags;
object->player->jumping = jumping; object->player->jumping = jumping;
@ -228,6 +225,10 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
else else
P_SetPlayerMobjState(object, S_PLAY_WALK); P_SetPlayerMobjState(object, S_PLAY_WALK);
} }
else if (P_MobjFlip(object)*vertispeed > 0)
P_SetPlayerMobjState(object, S_PLAY_SPRING);
else
P_SetPlayerMobjState(object, S_PLAY_FALL);
} }
return true; return true;
} }

View file

@ -1924,9 +1924,12 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
// spinning friction // spinning friction
if (player->pflags & PF_SPINNING && (player->rmomx || player->rmomy) && !(player->pflags & PF_STARTDASH)) if (player->pflags & PF_SPINNING && (player->rmomx || player->rmomy) && !(player->pflags & PF_STARTDASH))
{ {
const fixed_t ns = FixedDiv(549*ORIG_FRICTION,500*FRACUNIT); if (twodlevel || player->mo->flags2 & MF2_TWOD) // Otherwise handled in P_3DMovement
mo->momx = FixedMul(mo->momx, ns); {
mo->momy = FixedMul(mo->momy, ns); const fixed_t ns = FixedDiv(549*ORIG_FRICTION,500*FRACUNIT);
mo->momx = FixedMul(mo->momx, ns);
mo->momy = FixedMul(mo->momy, ns);
}
} }
else if (abs(player->rmomx) < FixedMul(STOPSPEED, mo->scale) else if (abs(player->rmomx) < FixedMul(STOPSPEED, mo->scale)
&& abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale) && abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale)

View file

@ -1185,7 +1185,7 @@ boolean P_IsObjectInGoop(mobj_t *mo)
// //
boolean P_IsObjectOnGround(mobj_t *mo) boolean P_IsObjectOnGround(mobj_t *mo)
{ {
if (P_IsObjectInGoop(mo)) if (P_IsObjectInGoop(mo) && !(mo->player && mo->player->pflags & PF_BOUNCING))
{ {
/* /*
// It's a crazy hack that checking if you're on the ground // It's a crazy hack that checking if you're on the ground
@ -3998,8 +3998,8 @@ void P_DoAbilityBounce(player_t *player, boolean changemomz)
return; return;
if (changemomz) if (changemomz)
{ {
prevmomz = P_MobjFlip(player->mo)*player->mo->momz; prevmomz = player->mo->momz;
if (prevmomz < 0) if (P_MobjFlip(player->mo)*prevmomz < 0)
prevmomz = 0; prevmomz = 0;
else if (player->mo->eflags & MFE_UNDERWATER) else if (player->mo->eflags & MFE_UNDERWATER)
prevmomz /= 2; prevmomz /= 2;
@ -4532,6 +4532,8 @@ static void P_2dMovement(player_t *player)
player->skidtime = 0; player->skidtime = 0;
} }
} }
if (player->pflags & PF_BOUNCING)
player->pflags &= ~PF_BOUNCING;
if (player->pflags & PF_SPINNING && !player->exiting) if (player->pflags & PF_SPINNING && !player->exiting)
{ {
player->pflags &= ~PF_SPINNING; player->pflags &= ~PF_SPINNING;
@ -4691,6 +4693,7 @@ static void P_3dMovement(player_t *player)
angle_t dangle; // replaces old quadrants bits angle_t dangle; // replaces old quadrants bits
fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale); fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale);
boolean analogmove = false; boolean analogmove = false;
boolean spin = (player->pflags & PF_SPINNING && (player->rmomx || player->rmomy) && !(player->pflags & PF_STARTDASH));
fixed_t oldMagnitude, newMagnitude; fixed_t oldMagnitude, newMagnitude;
#ifdef ESLOPE #ifdef ESLOPE
vector3_t totalthrust; vector3_t totalthrust;
@ -4720,6 +4723,8 @@ static void P_3dMovement(player_t *player)
player->skidtime = 0; player->skidtime = 0;
} }
} }
if (player->pflags & PF_BOUNCING)
player->pflags &= ~PF_BOUNCING;
if (player->pflags & PF_SPINNING && !player->exiting) if (player->pflags & PF_SPINNING && !player->exiting)
{ {
player->pflags &= ~PF_SPINNING; player->pflags &= ~PF_SPINNING;
@ -4838,6 +4843,15 @@ static void P_3dMovement(player_t *player)
topspeed = normalspd; topspeed = normalspd;
} }
if (spin) // Prevent gaining speed whilst rolling!
{
const fixed_t ns = FixedDiv(549*ORIG_FRICTION,500*FRACUNIT); // P_XYFriction
if (onground)
topspeed = FixedMul(oldMagnitude, ns);
else
topspeed = oldMagnitude;
}
// Better maneuverability while flying // Better maneuverability while flying
if (player->powers[pw_tailsfly]) if (player->powers[pw_tailsfly])
{ {
@ -5015,7 +5029,7 @@ static void P_3dMovement(player_t *player)
if (newMagnitude > topspeed) if (newMagnitude > topspeed)
{ {
fixed_t tempmomx, tempmomy; fixed_t tempmomx, tempmomy;
if (oldMagnitude > topspeed) if (oldMagnitude > topspeed && !spin)
{ {
if (newMagnitude > oldMagnitude) if (newMagnitude > oldMagnitude)
{ {