From b3863c57be9bcf6edaa3ff8821965b6b3e77aca9 Mon Sep 17 00:00:00 2001
From: MascaraSnake <jonassauer27@gmail.com>
Date: Thu, 30 Dec 2021 18:50:02 +0100
Subject: [PATCH] Replace verticalflip in sector_t with a sector flag that's
 accessible via Lua and UDMF

---
 extras/conf/udb/Includes/SRB222_misc.cfg | 1 +
 src/deh_lua.c                            | 2 +-
 src/deh_tables.c                         | 3 ++-
 src/deh_tables.h                         | 2 +-
 src/lua_maplib.c                         | 1 +
 src/p_mobj.c                             | 4 ++--
 src/p_saveg.c                            | 3 +++
 src/p_setup.c                            | 3 ++-
 src/p_spec.c                             | 8 +++++---
 src/r_defs.h                             | 4 ++--
 10 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg
index 4139fa967..36518be9f 100644
--- a/extras/conf/udb/Includes/SRB222_misc.cfg
+++ b/extras/conf/udb/Includes/SRB222_misc.cfg
@@ -79,6 +79,7 @@ sectorflags
 	triggerspecial_touch = "Trigger on Edge Touch";
 	triggerspecial_headbump = "Trigger on Headbump";
 	invertprecip = "Invert Precipitation";
+	gravityflip = "Flip Objects in Reverse Gravity";
 	heatwave = "Heat Wave";
 }
 
diff --git a/src/deh_lua.c b/src/deh_lua.c
index 28030052a..e360febaf 100644
--- a/src/deh_lua.c
+++ b/src/deh_lua.c
@@ -340,7 +340,7 @@ static inline int lib_getenum(lua_State *L)
 	}
 	else if (fastncmp("MSF_", word, 3)) {
 		p = word + 4;
-		for (i = 0; i < 5; i++)
+		for (i = 0; i < 6; i++)
 			if (MSF_LIST[i] && fastcmp(p, MSF_LIST[i])) {
 				lua_pushinteger(L, ((lua_Integer)1 << i));
 				return 1;
diff --git a/src/deh_tables.c b/src/deh_tables.c
index b6a9e0225..095aae0f2 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -4472,11 +4472,12 @@ const char *const ML_LIST[16] = {
 };
 
 // Sector flags
-const char *const MSF_LIST[5] = {
+const char *const MSF_LIST[6] = {
 	"FLIPSPECIAL_FLOOR",
 	"FLIPSPECIAL_CEILING",
 	"TRIGGERSPECIAL_TOUCH",
 	"TRIGGERSPECIAL_HEADBUMP",
+	"GRAVITYFLIP",
 	"HEATWAVE",
 };
 
diff --git a/src/deh_tables.h b/src/deh_tables.h
index 982c6ff4a..2e514a5b1 100644
--- a/src/deh_tables.h
+++ b/src/deh_tables.h
@@ -65,7 +65,7 @@ extern const char *const MAPTHINGFLAG_LIST[4];
 extern const char *const PLAYERFLAG_LIST[];
 extern const char *const GAMETYPERULE_LIST[];
 extern const char *const ML_LIST[16]; // Linedef flags
-extern const char* const MSF_LIST[5]; // Sector flags
+extern const char* const MSF_LIST[6]; // Sector flags
 extern const char *COLOR_ENUMS[];
 extern const char *const POWERS_LIST[];
 extern const char *const HUDITEMS_LIST[];
diff --git a/src/lua_maplib.c b/src/lua_maplib.c
index 0a147acbb..74f45535f 100644
--- a/src/lua_maplib.c
+++ b/src/lua_maplib.c
@@ -753,6 +753,7 @@ static int sector_set(lua_State *L)
 		return LUA_ErrSetDirectly(L, "sector_t", "taglist");
 	case sector_flags:
 		sector->flags = luaL_checkinteger(L, 3);
+		CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP);
 		break;
 	case sector_gravity:
 		sector->gravity = luaL_checkfixed(L, 3);
diff --git a/src/p_mobj.c b/src/p_mobj.c
index aea7964be..bdfee2616 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -1463,7 +1463,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
 
 			gravityadd = -FixedMul(gravity, gravfactor);
 
-			if (rover->master->frontsector->verticalflip && gravityadd > 0)
+			if ((rover->master->frontsector->flags & MSF_GRAVITYFLIP) && gravityadd > 0)
 				mo->eflags |= MFE_VERTICALFLIP;
 
 			no3dfloorgrav = false;
@@ -1475,7 +1475,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
 	{
 		gravityadd = -FixedMul(gravity, P_GetSectorGravityFactor(mo->subsector->sector));
 
-		if (mo->subsector->sector->verticalflip && gravityadd > 0)
+		if ((mo->subsector->sector->flags & MSF_GRAVITYFLIP) && gravityadd > 0)
 			mo->eflags |= MFE_VERTICALFLIP;
 	}
 
diff --git a/src/p_saveg.c b/src/p_saveg.c
index 66df83603..d7a9750b7 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -1213,7 +1213,10 @@ static void UnArchiveSectors(void)
 			sectors[i].ceilinglightabsolute = READUINT8(save_p);
 		}
 		if (diff3 & SD_FLAG)
+		{
 			sectors[i].flags = READUINT32(save_p);
+			CheckForReverseGravity |= (sectors[i].flags & MSF_GRAVITYFLIP);
+		}
 		if (diff3 & SD_GRAVITY)
 			sectors[i].gravity = READFIXED(save_p);
 
diff --git a/src/p_setup.c b/src/p_setup.c
index 2bcde2b92..70c6276d0 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -1000,7 +1000,6 @@ static void P_InitializeSector(sector_t *ss)
 	ss->extra_colormap = NULL;
 
 	ss->gravityptr = NULL;
-	ss->verticalflip = false;
 
 	ss->cullheight = NULL;
 
@@ -1674,6 +1673,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val)
 		sectors[i].flags |= MSF_TRIGGERSPECIAL_HEADBUMP;
 	else if (fastcmp(param, "invertprecip") && fastcmp("true", val))
 		sectors[i].flags |= MSF_INVERTPRECIP;
+	else if (fastcmp(param, "gravityflip") && fastcmp("true", val))
+		sectors[i].flags |= MSF_GRAVITYFLIP;
 	else if (fastcmp(param, "heatwave") && fastcmp("true", val))
 		sectors[i].flags |= MSF_HEATWAVE;
 	else if (fastcmp(param, "friction"))
diff --git a/src/p_spec.c b/src/p_spec.c
index 846ce9376..604921445 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -5994,6 +5994,8 @@ void P_SpawnSpecials(boolean fromnetsave)
 	sector = sectors;
 	for (i = 0; i < numsectors; i++, sector++)
 	{
+		CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP);
+
 		if (!sector->special)
 			continue;
 
@@ -6116,11 +6118,11 @@ void P_SpawnSpecials(boolean fromnetsave)
 					sectors[s].gravityptr = &sectors[sec].floorheight; // This allows it to change in realtime!
 
 					if (lines[i].flags & ML_NOCLIMB)
-						sectors[s].verticalflip = true;
+						sectors[s].flags |= MSF_GRAVITYFLIP;
 					else
-						sectors[s].verticalflip = false;
+						sectors[s].flags &= ~MSF_GRAVITYFLIP;
 
-					CheckForReverseGravity = sectors[s].verticalflip;
+					CheckForReverseGravity |= (sectors[s].flags & MSF_GRAVITYFLIP);
 				}
 				break;
 
diff --git a/src/r_defs.h b/src/r_defs.h
index 0fd13b707..c565473dd 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -284,7 +284,8 @@ typedef enum
 	MSF_TRIGGERSPECIAL_HEADBUMP =  1<<3,
 	// invertprecip - inverts presence of precipitation
 	MSF_INVERTPRECIP            =  1<<4,
-	MSF_HEATWAVE                =  1<<5, // heat wave effect
+	MSF_GRAVITYFLIP             =  1<<5,
+	MSF_HEATWAVE                =  1<<6,
 } sectorflags_t;
 
 
@@ -368,7 +369,6 @@ typedef struct sector_s
 
 	fixed_t gravity; // per-sector gravity factor
 	fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector
-	boolean verticalflip; // If gravity < 0, then allow flipped physics
 	sectorflags_t flags;
 
 	INT32 friction;
-- 
GitLab