From f437d6afec08bebab2d44f0d383c316f11df4934 Mon Sep 17 00:00:00 2001
From: Vincent Robinson <robinsonvincent89@gmail.com>
Date: Mon, 26 Apr 2021 16:27:39 -0700
Subject: [PATCH] Add linedef specials for multitagging in binary maps

---
 extras/conf/SRB2-22.cfg | 18 ++++++++++++++++++
 src/p_setup.c           | 21 +++++++++++++++++++++
 src/taglist.c           |  6 ++++--
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg
index 3fd4b6ccdc..9a8484df57 100644
--- a/extras/conf/SRB2-22.cfg
+++ b/extras/conf/SRB2-22.cfg
@@ -640,6 +640,24 @@ linedeftypes
 			prefix = "(63)";
 		}
 
+		97
+		{
+			title = "Apply Tag to Front Sector";
+			prefix = "(97)";
+		}
+
+		98
+		{
+			title = "Apply Tag to Back Sector";
+			prefix = "(98)";
+		}
+
+		99
+		{
+			title = "Apply Tag to Front and Back Sectors";
+			prefix = "(99)";
+		}
+
 		540
 		{
 			title = "Floor Friction";
diff --git a/src/p_setup.c b/src/p_setup.c
index 40dd1a2847..1b060660dc 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -2950,6 +2950,24 @@ static void P_LinkMapData(void)
 	}
 }
 
+// For maps in binary format, add multi-tags from linedef specials. This must be done
+// before any linedef specials have been processed.
+static void P_AddBinaryMapTags(void)
+{
+	size_t i;
+
+	for (i = 0; i < numlines; i++)
+	{
+		// 97: Apply Tag to Front Sector
+		// 98: Apply Tag to Back Sector
+		// 99: Apply Tag to Front and Back Sectors
+		if (lines[i].special == 97 || lines[i].special == 99)
+			Tag_Add(&lines[i].frontsector->tags, Tag_FGet(&lines[i].tags));
+		if (lines[i].special == 98 || lines[i].special == 99)
+			Tag_Add(&lines[i].backsector->tags, Tag_FGet(&lines[i].tags));
+	}
+}
+
 //For maps in binary format, converts setup of specials to UDMF format.
 static void P_ConvertBinaryMap(void)
 {
@@ -3287,6 +3305,9 @@ static boolean P_LoadMapFromFile(void)
 
 	P_LinkMapData();
 
+	if (!udmf)
+		P_AddBinaryMapTags();
+
 	Taglist_InitGlobalTables();
 
 	if (!udmf)
diff --git a/src/taglist.c b/src/taglist.c
index a759f4d02b..e8b64d3f4a 100644
--- a/src/taglist.c
+++ b/src/taglist.c
@@ -27,11 +27,13 @@ taggroup_t* tags_sectors[MAXTAGS + 1];
 taggroup_t* tags_lines[MAXTAGS + 1];
 taggroup_t* tags_mapthings[MAXTAGS + 1];
 
-/// Adds a tag to a given element's taglist.
+/// Adds a tag to a given element's taglist. It will not add a duplicate.
 /// \warning This does not rebuild the global taggroups, which are used for iteration.
 void Tag_Add (taglist_t* list, const mtag_t tag)
 {
-	list->tags = Z_Realloc(list->tags, (list->count + 1) * sizeof(list->tags), PU_LEVEL, NULL);
+	if (Tag_Find(list, tag))
+		return;
+	list->tags = Z_Realloc(list->tags, (list->count + 1) * sizeof(mtag_t), PU_LEVEL, NULL);
 	list->tags[list->count++] = tag;
 }
 
-- 
GitLab