From 4f18f6d3cf2bf06d23aad8cc1d78b5046a4def51 Mon Sep 17 00:00:00 2001
From: lachablock <lachlanwright17@gmail.com>
Date: Thu, 18 Mar 2021 14:48:15 +1100
Subject: [PATCH] Remove PF_SPINNING upon use of any jump ability, so that
 directionchar works properly

---
 src/p_user.c | 335 ++++++++++++++++++++++++++-------------------------
 1 file changed, 169 insertions(+), 166 deletions(-)

diff --git a/src/p_user.c b/src/p_user.c
index 02592053d0..2612723134 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -5012,7 +5012,7 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
 
 static void P_DoTwinSpin(player_t *player)
 {
-	player->pflags &= ~PF_NOJUMPDAMAGE;
+	player->pflags &= ~(PF_NOJUMPDAMAGE|PF_SPINNING);
 	player->pflags |= P_GetJumpFlags(player) | PF_THOKKED;
 	S_StartSound(player->mo, sfx_s3k42);
 	player->mo->frame = 0;
@@ -5286,194 +5286,197 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
 		else if (player->pflags & PF_JUMPED)
 		{
 			if (!LUAh_AbilitySpecial(player))
-			switch (player->charability)
-			{
-				case CA_THOK:
-				case CA_HOMINGTHOK:
-				case CA_JUMPTHOK: // Credit goes to CZ64 and Sryder13 for the original
-					// Now it's Sonic's abilities turn!
-					// THOK!
-					if (!(player->pflags & PF_THOKKED) || (player->charflags & SF_MULTIABILITY))
-					{
-						// Catapult the player
-						fixed_t actionspd = player->actionspd;
+			{
+				switch (player->charability)
+				{
+					case CA_THOK:
+					case CA_HOMINGTHOK:
+					case CA_JUMPTHOK: // Credit goes to CZ64 and Sryder13 for the original
+						// Now it's Sonic's abilities turn!
+						// THOK!
+						if (!(player->pflags & PF_THOKKED) || (player->charflags & SF_MULTIABILITY))
+						{
+							// Catapult the player
+							fixed_t actionspd = player->actionspd;
 
-						if (player->charflags & SF_DASHMODE)
-							actionspd = max(player->normalspeed, FixedDiv(player->speed, player->mo->scale));
+							if (player->charflags & SF_DASHMODE)
+								actionspd = max(player->normalspeed, FixedDiv(player->speed, player->mo->scale));
 
-						if (player->mo->eflags & MFE_UNDERWATER)
-							actionspd >>= 1;
+							if (player->mo->eflags & MFE_UNDERWATER)
+								actionspd >>= 1;
 
-						if ((player->charability == CA_JUMPTHOK) && !(player->pflags & PF_THOKKED))
-						{
-							player->pflags &= ~PF_JUMPED;
-							P_DoJump(player, false);
-						}
+							if ((player->charability == CA_JUMPTHOK) && !(player->pflags & PF_THOKKED))
+							{
+								player->pflags &= ~PF_JUMPED;
+								P_DoJump(player, false);
+							}
 
-						P_InstaThrust(player->mo, player->mo->angle, FixedMul(actionspd, player->mo->scale));
+							P_InstaThrust(player->mo, player->mo->angle, FixedMul(actionspd, player->mo->scale));
 
-						if (maptol & TOL_2D)
-						{
-							player->mo->momx /= 2;
-							player->mo->momy /= 2;
-						}
-						if (player->charability == CA_HOMINGTHOK)
-						{
-							player->mo->momx /= 2;
-							player->mo->momy /= 2;
-						}
-
-						if (player->charability == CA_HOMINGTHOK)
-						{
-							P_SetTarget(&player->mo->target, P_SetTarget(&player->mo->tracer, lockonthok));
-							if (lockonthok)
+							if (maptol & TOL_2D)
 							{
-								P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
-								player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, lockonthok->x, lockonthok->y);
-								player->homing = 3*TICRATE;
+								player->mo->momx /= 2;
+								player->mo->momy /= 2;
 							}
-							else
+							if (player->charability == CA_HOMINGTHOK)
 							{
-								P_SetPlayerMobjState(player->mo, S_PLAY_FALL);
-								player->pflags &= ~PF_JUMPED;
-								player->mo->height = P_GetPlayerHeight(player);
+								player->mo->momx /= 2;
+								player->mo->momy /= 2;
 							}
-							player->pflags &= ~PF_NOJUMPDAMAGE;
-						}
 
-						player->drawangle = player->mo->angle;
+							if (player->charability == CA_HOMINGTHOK)
+							{
+								P_SetTarget(&player->mo->target, P_SetTarget(&player->mo->tracer, lockonthok));
+								if (lockonthok)
+								{
+									P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
+									player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, lockonthok->x, lockonthok->y);
+									player->homing = 3*TICRATE;
+								}
+								else
+								{
+									P_SetPlayerMobjState(player->mo, S_PLAY_FALL);
+									player->pflags &= ~PF_JUMPED;
+									player->mo->height = P_GetPlayerHeight(player);
+								}
+								player->pflags &= ~PF_NOJUMPDAMAGE;
+							}
 
-						if (player->mo->info->attacksound && !player->spectator)
-							S_StartSound(player->mo, player->mo->info->attacksound); // Play the THOK sound
+							player->drawangle = player->mo->angle;
 
-						P_SpawnThokMobj(player);
+							if (player->mo->info->attacksound && !player->spectator)
+								S_StartSound(player->mo, player->mo->info->attacksound); // Play the THOK sound
 
-						player->pflags &= ~(PF_SPINNING|PF_STARTDASH);
-						player->pflags |= PF_THOKKED;
+							P_SpawnThokMobj(player);
 
-						// Change localangle to match for simple controls? (P.S. chalupa)
-						// disabled because it seemed to disorient people and Z-targeting exists now
-						/*if (!demoplayback)
-						{
-							if (player == &players[consoleplayer] && cv_cam_turnfacingability[0].value > 0 && !(PLAYER1INPUTDOWN(gc_turnleft) || PLAYER1INPUTDOWN(gc_turnright)))
-								P_SetPlayerAngle(player, player->mo->angle);;
-							else if (player == &players[secondarydisplayplayer] && cv_cam_turnfacingability[1].value > 0 && !(PLAYER2INPUTDOWN(gc_turnleft) || PLAYER2INPUTDOWN(gc_turnright)))
-								P_SetPlayerAngle(player, player->mo->angle);
-						}*/
-					}
-					break;
+							player->pflags &= ~(PF_STARTDASH);
+							player->pflags |= PF_THOKKED;
 
-				case CA_FLY:
-				case CA_SWIM:
-					// If currently in the air from a jump, and you pressed the
-					// button again and have the ability to fly, do so!
-					if (player->charability == CA_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
-						; // Can't do anything if you're a fish out of water!
-					else if (!(player->pflags & PF_THOKKED) && !(player->powers[pw_tailsfly]))
-					{
-						P_SetPlayerMobjState(player->mo, S_PLAY_FLY); // Change to the flying animation
+							// Change localangle to match for simple controls? (P.S. chalupa)
+							// disabled because it seemed to disorient people and Z-targeting exists now
+							/*if (!demoplayback)
+							{
+								if (player == &players[consoleplayer] && cv_cam_turnfacingability[0].value > 0 && !(PLAYER1INPUTDOWN(gc_turnleft) || PLAYER1INPUTDOWN(gc_turnright)))
+									P_SetPlayerAngle(player, player->mo->angle);;
+								else if (player == &players[secondarydisplayplayer] && cv_cam_turnfacingability[1].value > 0 && !(PLAYER2INPUTDOWN(gc_turnleft) || PLAYER2INPUTDOWN(gc_turnright)))
+									P_SetPlayerAngle(player, player->mo->angle);
+							}*/
+						}
+						break;
 
-						player->powers[pw_tailsfly] = tailsflytics + 1; // Set the fly timer
+					case CA_FLY:
+					case CA_SWIM:
+						// If currently in the air from a jump, and you pressed the
+						// button again and have the ability to fly, do so!
+						if (player->charability == CA_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
+							; // Can't do anything if you're a fish out of water!
+						else if (!(player->pflags & PF_THOKKED) && !(player->powers[pw_tailsfly]))
+						{
+							P_SetPlayerMobjState(player->mo, S_PLAY_FLY); // Change to the flying animation
 
-						player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_SPINNING|PF_STARTDASH);
-						if (player->bot == 1)
-							player->pflags |= PF_THOKKED;
-						else
-							player->pflags |= (PF_THOKKED|PF_CANCARRY);
-					}
-					break;
-				case CA_GLIDEANDCLIMB:
-					// Now Knuckles-type abilities are checked.
-					if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
-					{
-						fixed_t glidespeed = FixedMul(player->actionspd, player->mo->scale);
-						fixed_t playerspeed = player->speed;
+							player->powers[pw_tailsfly] = tailsflytics + 1; // Set the fly timer
 
-						if (player->mo->eflags & MFE_UNDERWATER)
+							player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_STARTDASH);
+							if (player->bot == 1)
+								player->pflags |= PF_THOKKED;
+							else
+								player->pflags |= (PF_THOKKED|PF_CANCARRY);
+						}
+						break;
+					case CA_GLIDEANDCLIMB:
+						// Now Knuckles-type abilities are checked.
+						if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
 						{
-							glidespeed >>= 1;
-							playerspeed = 2*playerspeed/3;
-							if (!(player->powers[pw_super] || player->powers[pw_sneakers]))
+							fixed_t glidespeed = FixedMul(player->actionspd, player->mo->scale);
+							fixed_t playerspeed = player->speed;
+
+							if (player->mo->eflags & MFE_UNDERWATER)
 							{
-								player->mo->momx = (2*(player->mo->momx - player->cmomx)/3) + player->cmomx;
-								player->mo->momy = (2*(player->mo->momy - player->cmomy)/3) + player->cmomy;
+								glidespeed >>= 1;
+								playerspeed = 2*playerspeed/3;
+								if (!(player->powers[pw_super] || player->powers[pw_sneakers]))
+								{
+									player->mo->momx = (2*(player->mo->momx - player->cmomx)/3) + player->cmomx;
+									player->mo->momy = (2*(player->mo->momy - player->cmomy)/3) + player->cmomy;
+								}
 							}
-						}
 
-						player->pflags |= PF_GLIDING|PF_THOKKED;
-						player->glidetime = 0;
+							player->pflags |= PF_GLIDING|PF_THOKKED;
+							player->glidetime = 0;
 
-						P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE);
-						if (playerspeed < glidespeed)
-							P_Thrust(player->mo, player->mo->angle, glidespeed - playerspeed);
-						player->pflags &= ~(PF_SPINNING|PF_STARTDASH);
-					}
-					break;
-				case CA_DOUBLEJUMP: // Double-Jump
-					if (!(player->pflags & PF_THOKKED) || ((player->charflags & SF_MULTIABILITY) && (player->secondjump < (player->actionspd >> FRACBITS))))
-					{
-						player->pflags |= PF_THOKKED;
-						player->pflags &= ~PF_JUMPED;
-						P_DoJump(player, true);
-						player->secondjump++;
-					}
-					break;
-				case CA_FLOAT: // Float
-				case CA_SLOWFALL: // Slow descent hover
-					if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
-					{
-						if (player->charflags & SF_DASHMODE && player->dashmode >= DASHMODE_THRESHOLD)
-							P_SetPlayerMobjState(player->mo, S_PLAY_DASH);
-						else if (player->speed >= FixedMul(player->runspeed, player->mo->scale))
-							P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT_RUN);
-						else
-							P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT);
-						player->pflags |= PF_THOKKED;
-						player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE|PF_SPINNING);
-						player->secondjump = 1;
-					}
-					break;
-				case CA_TELEKINESIS:
-					if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
-					{
-						P_Telekinesis(player,
-							FixedMul(player->actionspd, player->mo->scale), // +ve thrust (pushing away from player)
-							FixedMul(384*FRACUNIT, player->mo->scale));
-					}
-					break;
-				case CA_FALLSWITCH:
-					if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
-					{
-						player->mo->momz = -player->mo->momz;
-						P_SpawnThokMobj(player);
-						player->pflags |= PF_THOKKED;
-					}
-					break;
-				case CA_AIRDRILL:
-					if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
-					{
-						player->flyangle = 56 + (60-(player->actionspd>>FRACBITS))/3;
-						player->pflags |= PF_THOKKED;
-						S_StartSound(player->mo, sfx_spndsh);
-					}
-					break;
-				case CA_BOUNCE:
-					if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
-					{
-						P_SetPlayerMobjState(player->mo, S_PLAY_BOUNCE);
-						player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE);
-						player->pflags |= PF_THOKKED|PF_BOUNCING;
-						player->mo->momx >>= 1;
-						player->mo->momy >>= 1;
-						player->mo->momz >>= 1;
-					}
-					break;
-				case CA_TWINSPIN:
-					if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
-						P_DoTwinSpin(player);
-					break;
-				default:
-					break;
+							P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE);
+							if (playerspeed < glidespeed)
+								P_Thrust(player->mo, player->mo->angle, glidespeed - playerspeed);
+							player->pflags &= ~(PF_STARTDASH);
+						}
+						break;
+					case CA_DOUBLEJUMP: // Double-Jump
+						if (!(player->pflags & PF_THOKKED) || ((player->charflags & SF_MULTIABILITY) && (player->secondjump < (player->actionspd >> FRACBITS))))
+						{
+							player->pflags |= PF_THOKKED;
+							player->pflags &= ~PF_JUMPED;
+							P_DoJump(player, true);
+							player->secondjump++;
+						}
+						break;
+					case CA_FLOAT: // Float
+					case CA_SLOWFALL: // Slow descent hover
+						if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
+						{
+							if (player->charflags & SF_DASHMODE && player->dashmode >= DASHMODE_THRESHOLD)
+								P_SetPlayerMobjState(player->mo, S_PLAY_DASH);
+							else if (player->speed >= FixedMul(player->runspeed, player->mo->scale))
+								P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT_RUN);
+							else
+								P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT);
+							player->pflags |= PF_THOKKED;
+							player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE);
+							player->secondjump = 1;
+						}
+						break;
+					case CA_TELEKINESIS:
+						if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
+						{
+							P_Telekinesis(player,
+								FixedMul(player->actionspd, player->mo->scale), // +ve thrust (pushing away from player)
+								FixedMul(384*FRACUNIT, player->mo->scale));
+						}
+						break;
+					case CA_FALLSWITCH:
+						if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
+						{
+							player->mo->momz = -player->mo->momz;
+							P_SpawnThokMobj(player);
+							player->pflags |= PF_THOKKED;
+						}
+						break;
+					case CA_AIRDRILL:
+						if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
+						{
+							player->flyangle = 56 + (60-(player->actionspd>>FRACBITS))/3;
+							player->pflags |= PF_THOKKED;
+							S_StartSound(player->mo, sfx_spndsh);
+						}
+						break;
+					case CA_BOUNCE:
+						if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
+						{
+							P_SetPlayerMobjState(player->mo, S_PLAY_BOUNCE);
+							player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE);
+							player->pflags |= PF_THOKKED|PF_BOUNCING;
+							player->mo->momx >>= 1;
+							player->mo->momy >>= 1;
+							player->mo->momz >>= 1;
+						}
+						break;
+					case CA_TWINSPIN:
+						if (!(player->pflags & PF_THOKKED) || player->charflags & SF_MULTIABILITY)
+							P_DoTwinSpin(player);
+						break;
+					default:
+						break;
+				}
+				player->pflags &= ~PF_SPINNING;
 			}
 		}
 		else if (player->pflags & PF_THOKKED)
-- 
GitLab