From 18e8ebf394c880153ff8b062e18dad27a10e2ea2 Mon Sep 17 00:00:00 2001
From: MascaraSnake <jonassauer27@gmail.com>
Date: Thu, 9 Dec 2021 20:37:39 +0100
Subject: [PATCH] Add emerald check trigger linedef types and deprecate the
 emerald check sector type

---
 extras/conf/SRB2-22.cfg                      | 22 +++++++-
 extras/conf/udb/Includes/SRB222_linedefs.cfg | 57 +++++++++++++++++---
 extras/conf/udb/Includes/SRB222_misc.cfg     |  9 ++++
 extras/conf/udb/Includes/SRB222_sectors.cfg  |  4 +-
 src/p_setup.c                                | 15 +++++-
 src/p_spec.c                                 | 41 +++++++++++---
 src/p_spec.h                                 | 12 ++---
 7 files changed, 134 insertions(+), 26 deletions(-)

diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg
index 0d5b7ab921..7c53d99f68 100644
--- a/extras/conf/SRB2-22.cfg
+++ b/extras/conf/SRB2-22.cfg
@@ -431,7 +431,7 @@ sectortypes
 	48 = "Trigger Line Ex. (Floor Touch, All Players)";
 	64 = "Trigger Line Ex. (Anywhere in Sector)";
 	80 = "Trigger Line Ex. (Floor Touch)";
-	96 = "Trigger Line Ex. (Emerald Check)";
+	96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
 	112 = "Trigger Line Ex. (NiGHTS Mare)";
 	128 = "Check for Linedef Executor on FOFs";
 	144 = "Egg Capsule";
@@ -486,7 +486,7 @@ gen_sectortypes
 		48 = "Trigger Line Ex. (Floor Touch, All Players)";
 		64 = "Trigger Line Ex. (Anywhere in Sector)";
 		80 = "Trigger Line Ex. (Floor Touch)";
-		96 = "Trigger Line Ex. (Emerald Check)";
+		96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
 		112 = "Trigger Line Ex. (NiGHTS Mare)";
 		128 = "Check for Linedef Executor on FOFs";
 		144 = "Egg Capsule";
@@ -1982,6 +1982,24 @@ linedeftypes
 			prefix = "(336)";
 		}
 
+		337
+		{
+			title = "Emerald Check - Continuous";
+			prefix = "(337)";
+		}
+
+		338
+		{
+			title = "Emerald Check - Each Time";
+			prefix = "(338)";
+		}
+
+		339
+		{
+			title = "Emerald Check - Once";
+			prefix = "(339)";
+		}
+
 		399
 		{
 			title = "Level Load";
diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg
index 7635f03be8..940d4b650f 100644
--- a/extras/conf/udb/Includes/SRB222_linedefs.cfg
+++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg
@@ -754,6 +754,21 @@ doom
 			title = "Object Dye - Once";
 			prefix = "(336)";
 		}
+		337
+		{
+			title = "Emerald Check - Continuous";
+			prefix = "(337)";
+		}
+		338
+		{
+			title = "Emerald Check - Each Time";
+			prefix = "(338)";
+		}
+		339
+		{
+			title = "Emerald Check - Once";
+			prefix = "(339)";
+		}
 		399
 		{
 			title = "Level Load";
@@ -2647,14 +2662,7 @@ udmf
 			{
 				title = "Check if";
 				type = 11;
-				enum
-				{
-					0 = "Has all";
-					1 = "Has any";
-					2 = "Has exactly";
-					3 = "Doesn't have all";
-					4 = "Doesn't have any";
-				}
+				enum = "flagcheck";
 			}
 		}
 
@@ -3063,6 +3071,39 @@ udmf
 			}
 		}
 
+		337
+		{
+			title = "Emerald Check";
+			prefix = "(337)";
+			arg0
+			{
+				title = "Trigger type";
+				type = 11;
+				enum = "triggertype";
+			}
+			arg1
+			{
+				title = "Emeralds";
+				type = 12;
+				enum
+				{
+					1 = "Emerald 1";
+					2 = "Emerald 2";
+					4 = "Emerald 3";
+					8 = "Emerald 4";
+					16 = "Emerald 5";
+					32 = "Emerald 6";
+					64 = "Emerald 7";
+				}
+			}
+			arg2
+			{
+				title = "Check if";
+				type = 11;
+				enum = "flagcheck";
+			}
+		}
+
 		399
 		{
 			title = "Level Load";
diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg
index 1e11ad2558..f4a60581af 100644
--- a/extras/conf/udb/Includes/SRB222_misc.cfg
+++ b/extras/conf/udb/Includes/SRB222_misc.cfg
@@ -516,6 +516,15 @@ enums
 		0 = "Red";
 		1 = "Blue";
 	}
+
+	flagcheck
+	{
+		0 = "Has all";
+		1 = "Has any";
+		2 = "Has exactly";
+		3 = "Doesn't have all";
+		4 = "Doesn't have any";
+	}
 }
 
 //Default things filters
diff --git a/extras/conf/udb/Includes/SRB222_sectors.cfg b/extras/conf/udb/Includes/SRB222_sectors.cfg
index d0b7ba0828..e02bfd7ccf 100644
--- a/extras/conf/udb/Includes/SRB222_sectors.cfg
+++ b/extras/conf/udb/Includes/SRB222_sectors.cfg
@@ -21,7 +21,7 @@ sectortypes
 	48 = "Trigger Line Ex. (Floor Touch, All Players)";
 	64 = "Trigger Line Ex. (Anywhere in Sector)";
 	80 = "Trigger Line Ex. (Floor Touch)";
-	96 = "Trigger Line Ex. (Emerald Check)";
+	96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
 	112 = "Trigger Line Ex. (NiGHTS Mare)";
 	128 = "Check for Linedef Executor on FOFs";
 	144 = "Egg Capsule";
@@ -74,7 +74,7 @@ gen_sectortypes
 		48 = "Trigger Line Ex. (Floor Touch, All Players)";
 		64 = "Trigger Line Ex. (Anywhere in Sector)";
 		80 = "Trigger Line Ex. (Floor Touch)";
-		96 = "Trigger Line Ex. (Emerald Check)";
+		96 = "Trigger Line Ex. (Emerald Check) <deprecated>";
 		112 = "Trigger Line Ex. (NiGHTS Mare)";
 		128 = "Check for Linedef Executor on FOFs";
 		144 = "Egg Capsule";
diff --git a/src/p_setup.c b/src/p_setup.c
index 95e3c487b7..6a1218f412 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -3752,7 +3752,7 @@ static void P_ConvertBinaryMap(void)
 		case 308: //Race only - once
 			lines[i].args[0] = TMT_ONCE;
 			lines[i].args[1] = GTR_RACE;
-			lines[i].args[2] = TMG_HASANY;
+			lines[i].args[2] = TMF_HASANY;
 			break;
 		case 309: //CTF red team - continuous
 		case 310: //CTF red team - each time
@@ -3915,6 +3915,19 @@ static void P_ConvertBinaryMap(void)
 			}
 			lines[i].special = 334;
 			break;
+		case 337: //Emerald check - continuous
+		case 338: //Emerald check - each time
+		case 339: //Emerald check - once
+			if (lines[i].special == 339)
+				lines[i].args[0] = TMT_ONCE;
+			else if (lines[i].special == 338)
+				lines[i].args[0] = (lines[i].flags & ML_BOUNCY) ? TMT_EACHTIMEENTERANDEXIT : TMT_EACHTIMEENTER;
+			else
+				lines[i].args[0] = TMT_CONTINUOUS;
+			lines[i].args[1] = EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7;
+			lines[i].args[2] = TMF_HASALL;
+			lines[i].special = 337;
+			break;
 		case 400: //Set tagged sector's floor height/texture
 		case 401: //Set tagged sector's ceiling height/texture
 			lines[i].args[0] = tag;
diff --git a/src/p_spec.c b/src/p_spec.c
index 340427b800..7c3f01333e 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -1590,6 +1590,24 @@ static boolean P_CheckPushables(line_t *triggerline, sector_t *caller)
 	}
 }
 
+static boolean P_CheckEmeralds(INT32 checktype, UINT16 target)
+{
+	switch (checktype)
+	{
+		case TMF_HASALL:
+		default:
+			return (emeralds & target) == target;
+		case TMF_HASANY:
+			return !!(emeralds & target);
+		case TMF_HASEXACTLY:
+			return emeralds == target;
+		case TMF_DOESNTHAVEALL:
+			return (emeralds & target) != target;
+		case TMF_DOESNTHAVEANY:
+			return !(emeralds & target);
+	}
+}
+
 static void P_ActivateLinedefExecutor(line_t *line, mobj_t *actor, sector_t *caller)
 {
 	if (line->special < 400 || line->special >= 500)
@@ -1720,6 +1738,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 	{
 		if (GETSECSPECIAL(caller->special, 2) == 6)
 		{
+			CONS_Alert(CONS_WARNING, M_GetText("Deprecated emerald check sector type detected. Please use linedef types 337-339 instead.\n"));
 			if (!(ALL7EMERALDS(emeralds)))
 				return false;
 		}
@@ -1822,6 +1841,11 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 				if (!!(triggerline->args[1]) ^ (triggercolor != color))
 					return false;
 			}
+			break;
+		case 337: // emerald check
+			if (!P_CheckEmeralds(triggerline->args[2], (UINT16)triggerline->args[1]))
+				return false;
+			break;
 		default:
 			break;
 	}
@@ -1858,7 +1882,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 			|| specialtype == 317 // Unlockable trigger
 			|| specialtype == 319 // Unlockable
 			|| specialtype == 331 // Player skin
-			|| specialtype == 334) // Object dye
+			|| specialtype == 334 // Object dye
+			|| specialtype == 337) // Emerald check
 			&& triggerline->args[0] == TMT_ONCE)
 			triggerline->special = 0;
 	}
@@ -1907,7 +1932,8 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller)
 			|| lines[masterline].special == 317 // Condition set trigger
 			|| lines[masterline].special == 319 // Unlockable trigger
 			|| lines[masterline].special == 331 // Player skin
-			|| lines[masterline].special == 334) // Object dye
+			|| lines[masterline].special == 334 // Object dye
+			|| lines[masterline].special == 337) // Emerald check
 			&& lines[masterline].args[0] > TMT_EACHTIMEMASK)
 			continue;
 
@@ -5872,16 +5898,16 @@ static boolean P_CheckGametypeRules(INT32 checktype, UINT32 target)
 {
 	switch (checktype)
 	{
-		case TMG_HASALL:
+		case TMF_HASALL:
 		default:
 			return (gametyperules & target) == target;
-		case TMG_HASANY:
+		case TMF_HASANY:
 			return !!(gametyperules & target);
-		case TMG_HASEXACTLY:
+		case TMF_HASEXACTLY:
 			return gametyperules == target;
-		case TMG_DOESNTHAVEALL:
+		case TMF_DOESNTHAVEALL:
 			return (gametyperules & target) != target;
-		case TMG_DOESNTHAVEANY:
+		case TMF_DOESNTHAVEANY:
 			return !(gametyperules & target);
 	}
 }
@@ -6694,6 +6720,7 @@ void P_SpawnSpecials(boolean fromnetsave)
 			case 319: // Unlockable trigger
 			case 331: // Player skin
 			case 334: // Object dye
+			case 337: // Emerald check
 				if (lines[i].args[0] > TMT_EACHTIMEMASK)
 					P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT);
 				break;
diff --git a/src/p_spec.h b/src/p_spec.h
index c60bdda66b..ac42cd4643 100644
--- a/src/p_spec.h
+++ b/src/p_spec.h
@@ -124,12 +124,12 @@ typedef enum
 
 typedef enum
 {
-	TMG_HASALL        = 0,
-	TMG_HASANY        = 1,
-	TMG_HASEXACTLY    = 2,
-	TMG_DOESNTHAVEALL = 3,
-	TMG_DOESNTHAVEANY = 4,
-} textmapgametypecheck_t;
+	TMF_HASALL        = 0,
+	TMF_HASANY        = 1,
+	TMF_HASEXACTLY    = 2,
+	TMF_DOESNTHAVEALL = 3,
+	TMF_DOESNTHAVEANY = 4,
+} textmapflagcheck_t;
 
 typedef enum
 {
-- 
GitLab