From 45173775528b46a66e7fb9f8b7354becddbbfadd Mon Sep 17 00:00:00 2001
From: lachwright <lachlanwright17@gmail.com>
Date: Sun, 23 Feb 2020 15:38:11 +0800
Subject: [PATCH] Start CA_GLIDEANDCLIMB swimming functionality

---
 src/p_mobj.c |  9 +++++++--
 src/p_user.c | 27 +++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/p_mobj.c b/src/p_mobj.c
index f3f0b9ab01..d9d0f2b560 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 e2a7943f1b..a01267b736 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
-- 
GitLab