From b2a96b20f92c5a468c13f19637dd9e0abfa7afb6 Mon Sep 17 00:00:00 2001
From: Zwip-Zwap Zapony <ZwipZwapZapony@gmail.com>
Date: Fri, 6 Oct 2023 14:56:16 +0200
Subject: [PATCH] Bouncy NiGHTS: Increment DEMOVERSION

---
 src/g_demo.c |  4 ++--
 src/g_demo.h |  1 +
 src/p_mobj.c |  8 ++++----
 src/p_user.c | 22 +++++++++++-----------
 4 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/src/g_demo.c b/src/g_demo.c
index cb168dfd97..88dd437dc1 100644
--- a/src/g_demo.c
+++ b/src/g_demo.c
@@ -55,7 +55,7 @@ static UINT8 *demobuffer = NULL;
 static UINT8 *demo_p, *demotime_p;
 static UINT8 *demoend;
 static UINT8 demoflags;
-static UINT16 demoversion;
+UINT16 demoversion;
 boolean singledemo; // quit after playing a demo from cmdline
 boolean demo_start; // don't start playing demo right away
 boolean demo_forwardmove_rng; // old demo backwards compatibility
@@ -98,7 +98,7 @@ demoghost *ghosts = NULL;
 // DEMO RECORDING
 //
 
-#define DEMOVERSION 0x0010
+#define DEMOVERSION 0x0011
 #define DEMOHEADER  "\xF0" "SRB2Replay" "\x0F"
 
 #define DF_GHOST        0x01 // This demo contains ghost data too!
diff --git a/src/g_demo.h b/src/g_demo.h
index 379c57428a..e8c0c8d956 100644
--- a/src/g_demo.h
+++ b/src/g_demo.h
@@ -25,6 +25,7 @@
 // demoplaying back and demo recording
 extern boolean demoplayback, titledemo, demorecording, timingdemo;
 extern tic_t demostarttime;
+extern UINT16 demoversion;
 
 typedef enum
 {
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 8376bd64a3..4f224d74b9 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -13,6 +13,7 @@
 
 #include "dehacked.h"
 #include "doomdef.h"
+#include "g_demo.h" // demoplayback, demoversion
 #include "g_game.h"
 #include "g_input.h"
 #include "st_stuff.h"
@@ -1791,7 +1792,6 @@ static boolean P_CheckSkyHit(mobj_t *mo)
 	return false;
 }
 
-#define BOUNCYNIGHTS true // TODO Replace "BOUNCYNIGHTS" with a per-ghost demoversion check, also taking Metal Sonic and other recordings into account
 //
 // P_XYMovement
 //
@@ -2053,7 +2053,7 @@ void P_XYMovement(mobj_t *mo)
 		P_UnsetThingPosition(mo);
 		player->angle_pos = player->old_angle_pos;
 
-		if (BOUNCYNIGHTS)
+		if (!(demoplayback && demoversion < 0x0011))
 		{
 			// Since NiGHTS mode was introduced in 2003, bouncing off walls has always snapped you to diagonal 45-degree angles
 			// But no more! It's time to bounce off the wall appropriately! ~Zwip-Zwap Zapony 2022-03-22
@@ -2975,7 +2975,7 @@ void P_PlayerZMovement(mobj_t *mo)
 
 		if (mo->player->powers[pw_carry] == CR_NIGHTSMODE)
 		{
-			if (BOUNCYNIGHTS)
+			if (!(demoplayback && demoversion < 0x0011))
 				P_NiGHTSBounceOffPlane(mo->player, mo->eflags & MFE_VERTICALFLIP); // Bouncy NiGHTS!
 			else // Bouncy NiGHTS? Slopes? What are you talking about? Wake up, it's 2003!
 			{
@@ -3069,7 +3069,7 @@ nightsdone:
 
 		if (mo->player->powers[pw_carry] == CR_NIGHTSMODE)
 		{
-			if (BOUNCYNIGHTS)
+			if (!(demoplayback && demoversion < 0x0011))
 				P_NiGHTSBounceOffPlane(mo->player, !(mo->eflags & MFE_VERTICALFLIP)); // Bouncy NiGHTS!
 			else // Bouncy NiGHTS? Slopes? What are you talking about? Wake up, it's 2003!
 			{
diff --git a/src/p_user.c b/src/p_user.c
index b66e23fd5c..c45f482537 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -19,6 +19,7 @@
 #include "d_event.h"
 #include "netcode/d_net.h"
 #include "netcode/net_command.h"
+#include "g_demo.h" // demoplayback, demoversion
 #include "g_game.h"
 #include "p_local.h"
 #include "r_fps.h"
@@ -7299,7 +7300,6 @@ void P_NiGHTSBounceOffPlane(player_t *player, boolean ceiling)
 	player->speed = (player->speed * 4) / 5; // Bouncing costs 20% speed
 }
 
-#define BOUNCYNIGHTS true // TODO Replace "BOUNCYNIGHTS" with a per-ghost demoversion check, also taking Metal Sonic and other recordings into account
 //
 // P_NiGHTSMovement
 //
@@ -7450,7 +7450,7 @@ static void P_NiGHTSMovement(player_t *player)
 	player->mo->flags |= MF_NOGRAVITY;
 
 	// Flipping the up/down movement (in reverse gravity) just feels wrong, sorry ~Zwip-Zwap Zapony 2022-03-24
-	if ((player->mo->eflags & MFE_VERTICALFLIP) && !BOUNCYNIGHTS) // But, we should still support older demos ~2022-04-24
+	if ((player->mo->eflags & MFE_VERTICALFLIP) && (demoplayback && demoversion < 0x0011)) // But, we should still support older demos ~2022-04-24
 		cmd->forwardmove = (SINT8)(-cmd->forwardmove);
 
 	if (!(player->pflags & PF_TRANSFERTOCLOSEST))
@@ -7592,14 +7592,14 @@ static void P_NiGHTSMovement(player_t *player)
 	{
 		player->pflags &= ~PF_STARTJUMP;
 
-		if (cmd->sidemove /*&& !BOUNCYNIGHTS*/) // This line and...
+		if (cmd->sidemove) // This line and...
 			moved = true; // ...this line can be removed for v2.3, as this is just for older demo support
 
 		if (player->drillmeter & 1)
 			player->drillmeter++; // I'll be nice and give them one.
 	}
 
-	if (cmd->forwardmove || (cmd->sidemove && BOUNCYNIGHTS))
+	if (cmd->forwardmove || (cmd->sidemove && !(demoplayback && demoversion < 0x0011)))
 		moved = true;
 
 	if (!player->bumpertime)
@@ -7653,7 +7653,7 @@ static void P_NiGHTSMovement(player_t *player)
 		{
 			newangle = (INT16)FixedInt(AngleFixed(R_PointToAngle2(0,0, cmd->sidemove*FRACUNIT, cmd->forwardmove*FRACUNIT)));
 
-			if ((newangle == 314) && BOUNCYNIGHTS) // Hack to compensate for directly down-right returning 314, not 315
+			if ((newangle == 314) && !(demoplayback && demoversion < 0x0011)) // Hack to compensate for directly down-right returning 314, not 315
 				newangle = 315;
 		}
 
@@ -7685,13 +7685,13 @@ static void P_NiGHTSMovement(player_t *player)
 			player->flyangle = newangle;
 
 		//Otherwise, curve towards it as much as we can
-		else if ((anglediff < 180) || ((anglediff == 180) && !BOUNCYNIGHTS))
+		else if ((anglediff < 180) || ((anglediff == 180) && (demoplayback && demoversion < 0x0011)))
 			player->flyangle += thrustfactor;
 		else if ( anglediff > 180)
 			player->flyangle -= thrustfactor;
 
 		// Specific handling for U-turns ~Zwip-Zwap Zapony 2022-03-27
-		else //if ((anglediff == 180) && BOUNCYNIGHTS)
+		else //if ((anglediff == 180) && !(demoplayback && demoversion < 0x0011))
 		{
 			// When not flying straight up or down, curve "upwards"
 			if (     player->flyangle < 90 || player->flyangle > 270) // If the player is facing right
@@ -7717,7 +7717,7 @@ static void P_NiGHTSMovement(player_t *player)
 		player->flyangle = ((player->flyangle + 360) % 360);
 	}
 
-	if (!player->speed && !cmd->forwardmove && !(cmd->sidemove && BOUNCYNIGHTS))
+	if (!player->speed && !cmd->forwardmove && !(cmd->sidemove && !(demoplayback && demoversion < 0x0011)))
 		still = true;
 
 	// No more bumper braking
@@ -7736,7 +7736,7 @@ static void P_NiGHTSMovement(player_t *player)
 			player->speed -= (player->speed/4);
 		else {
 			player->speed -= 60;
-			if ((player->speed < 0) || (!player->speed && BOUNCYNIGHTS)) // This can be simplified to "if (player->speed <= 0)" for v2.3
+			if ((player->speed < 0) || (!player->speed && !(demoplayback && demoversion < 0x0011))) // This can be simplified to "if (player->speed <= 0)" for v2.3
 			{
 				player->speed = 0;
 				still = true;
@@ -7769,7 +7769,7 @@ static void P_NiGHTSMovement(player_t *player)
 
 	if (still) // Slowly fall down when stopping in the air
 	{
-		if (BOUNCYNIGHTS)
+		if (!(demoplayback && demoversion < 0x0011))
 		{
 			fixed_t fallspeed; // Target falling speed - Negative when falling downwards
 			//fixed_t fallaccel; // Acceleration/Gravity per tic - Always positive
@@ -7925,7 +7925,7 @@ static void P_NiGHTSMovement(player_t *player)
 					visangle += 180;
 			}
 
-			if ((player->mo->eflags & MFE_VERTICALFLIP) && BOUNCYNIGHTS) // Flip the roll angle in reverse gravity
+			if ((player->mo->eflags & MFE_VERTICALFLIP) && !(demoplayback && demoversion < 0x0011)) // Flip the roll angle in reverse gravity
 				visangle *= -1;
 
 			rollangle = FixedAngle(visangle<<FRACBITS);
-- 
GitLab