From 165b6c2435b524c8f0194b742ef51e5877dc2f1d Mon Sep 17 00:00:00 2001
From: lachwright <lachlanwright17@gmail.com>
Date: Fri, 1 May 2020 08:26:23 +0800
Subject: [PATCH] Dashmode fixes: - Don't force the player's default
 normalspeed and jumpfactor while not in dashmode - Properly trim the fuse for
 followmobj ghosts spawned during dashmode - Add deliberate dashmode ghosts
 for Metal's jet fume

---
 src/g_game.c |  5 +++++
 src/p_mobj.c |  8 ++++++++
 src/p_user.c | 19 +++++++++++++++++--
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/src/g_game.c b/src/g_game.c
index 92d71fbaeb..1fb817bf83 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -2377,6 +2377,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
 	fixed_t height;
 	fixed_t spinheight;
 	INT32 exiting;
+	tic_t dashmode;
 	INT16 numboxes;
 	INT16 totalring;
 	UINT8 laps;
@@ -2411,6 +2412,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
 	if (!(netgame || multiplayer))
 		pflags |= (players[player].pflags & (PF_GODMODE|PF_NOCLIP|PF_INVIS));
 
+	dashmode = players[player].dashmode;
+
 	numboxes = players[player].numboxes;
 	laps = players[player].laps;
 	totalring = players[player].totalring;
@@ -2509,6 +2512,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
 	p->spinheight = spinheight;
 	p->exiting = exiting;
 
+	p->dashmode = dashmode;
+
 	p->numboxes = numboxes;
 	p->laps = laps;
 	p->totalring = totalring;
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 29fe1a57c2..45a6ffe5bf 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -11393,6 +11393,14 @@ void P_SpawnPlayer(INT32 playernum)
 	p->realtime = leveltime;
 	p->followitem = skins[p->skin].followitem;
 
+	// Make sure player's stats are reset if they were in dashmode!
+	if (p->dashmode)
+	{
+		p->dashmode = 0;
+		p->normalspeed = skins[p->skin].normalspeed;
+		p->jumpfactor = skins[p->skin].jumpfactor;
+	}
+
 	//awayview stuff
 	p->awayviewmobj = NULL;
 	p->awayviewtics = 0;
diff --git a/src/p_user.c b/src/p_user.c
index b2f40fe706..c7f772fb02 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -11485,6 +11485,13 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume)
 	fume->y = mo->y + P_ReturnThrustY(fume, angle, dist);
 	fume->z = mo->z + ((mo->height - fume->height) >> 1);
 	P_SetThingPosition(fume);
+
+	// If dashmode is high enough, spawn a trail
+	if (!(fume->flags2 & MF2_DONTDRAW) && player->normalspeed >= skins[player->skin].normalspeed*2)
+	{
+		mobj_t *ghost = P_SpawnGhostMobj(fume);
+		ghost->tics = 4;
+	}
 }
 
 //
@@ -12279,6 +12286,7 @@ void P_PlayerThink(player_t *player)
 	// Dash mode - thanks be to VelocitOni
 	if ((player->charflags & SF_DASHMODE) && !player->gotflag && !player->powers[pw_carry] && !player->exiting && !(maptol & TOL_NIGHTS) && !metalrecording) // woo, dashmode! no nights tho.
 	{
+		tic_t prevdashmode = dashmode;
 		boolean totallyradical = player->speed >= FixedMul(player->runspeed, player->mo->scale);
 		boolean floating = (player->secondjump == 1);
 
@@ -12303,8 +12311,11 @@ void P_PlayerThink(player_t *player)
 
 		if (dashmode < DASHMODE_THRESHOLD) // Exits Dash Mode if you drop below speed/dash counter tics. Not in the above block so it doesn't keep disabling in midair.
 		{
-			player->normalspeed = skins[player->skin].normalspeed; // Reset to default if not capable of entering dash mode.
-			player->jumpfactor = skins[player->skin].jumpfactor;
+			if (prevdashmode >= DASHMODE_THRESHOLD)
+			{
+				player->normalspeed = skins[player->skin].normalspeed; // Reset to default if not capable of entering dash mode.
+				player->jumpfactor = skins[player->skin].jumpfactor;
+			}
 		}
 		else if (P_IsObjectOnGround(player->mo)) // Activate dash mode if we're on the ground.
 		{
@@ -12319,6 +12330,10 @@ void P_PlayerThink(player_t *player)
 		{
 			mobj_t *ghost = P_SpawnGhostMobj(player->mo); // Spawns afterimages
 			ghost->fuse = 2; // Makes the images fade quickly
+			if (ghost->tracer)
+			{
+				ghost->tracer->fuse = ghost->fuse;
+			}
 		}
 	}
 	else if (dashmode)
-- 
GitLab