diff --git a/src/p_mobj.c b/src/p_mobj.c index f3f0b9ab0..d9d0f2b56 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -215,10 +215,15 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) return P_SetPlayerMobjState(mobj, S_PLAY_FALL); // Catch swimming versus flying - if (state == S_PLAY_FLY && player->mo->eflags & MFE_UNDERWATER) + if ((state == S_PLAY_FLY || state == S_PLAY_GLIDE) && player->mo->eflags & MFE_UNDERWATER && !player->skidtime) return P_SetPlayerMobjState(player->mo, S_PLAY_SWIM); else if (state == S_PLAY_SWIM && !(player->mo->eflags & MFE_UNDERWATER)) - return P_SetPlayerMobjState(player->mo, S_PLAY_FLY); + { + if (player->charability == CA_GLIDEANDCLIMB) + return P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE); + else + return P_SetPlayerMobjState(player->mo, S_PLAY_FLY); + } // Catch SF_NOSUPERSPIN jumps for Supers if (player->powers[pw_super] && (player->charflags & SF_NOSUPERSPIN)) diff --git a/src/p_user.c b/src/p_user.c index e2a7943f1..a01267b73 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2344,6 +2344,7 @@ boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff) if (dorollstuff) { player->skidtime = TICRATE; + P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE); player->mo->tics = -1; } else if (!player->skidtime) @@ -8583,6 +8584,32 @@ static void P_MovePlayer(player_t *player) if (!player->skidtime) // TODO: make sure this works in 2D! { + /*angle_t anglediff = angle - moveangle; + fixed_t scale = mo->scale; + fixed_t accelfactor = 4*FRACUNIT - 3*FINECOSINE(((angle-moveangle) >> ANGLETOFINESHIFT) & FINEMASK); // mamgic number BAD but this feels right + fixed_t speed = FixedHypot(momx, momy); + fixed_t minspeed; + + if (anglediff > ANGLE_180) + anglediff = InvAngle(InvAngle(anglediff) >> 4); + else + anglediff = anglediff >> 4; + + if (mo->eflags & MFE_UNDERWATER) + minspeed = FixedMul((glidespeed>>1) + player->glidetime*750, scale); + else + minspeed = FixedMul(glidespeed + player->glidetime*1500, scale); + + if (speed < minspeed) + { + momx += P_ReturnThrustX(mo, angle, FixedMul(accelfactor, scale)); + momy += P_ReturnThrustY(mo, angle, FixedMul(accelfactor, scale)); + speed = FixedHypot(momx, momy); // recalculate speed + } + + mo->momx = P_ReturnThrustX(mo, moveangle + anglediff, speed) + player->cmomx; + mo->momy = P_ReturnThrustY(mo, moveangle + anglediff, speed) + player->cmomy;*/ + fixed_t speed, scale = mo->scale; fixed_t newMagnitude, oldMagnitude = R_PointToDist2(momx, momy, 0, 0); fixed_t accelfactor = 4*FRACUNIT - 3*FINECOSINE(((angle-moveangle) >> ANGLETOFINESHIFT) & FINEMASK); // mamgic number BAD but this feels right