From 8f446bbcd35e2642d500cce7e9f3979398d448f7 Mon Sep 17 00:00:00 2001
From: MaxED <j.maxed@gmail.com>
Date: Wed, 15 Jun 2016 22:57:39 +0000
Subject: [PATCH] Fixed, "Select Similar" action: in some cases map elements
 flags were incorrectly compared resulting in map elements not being selected
 when they should have been.

---
 Source/Core/Map/Linedef.cs                      |  9 +++++++++
 Source/Core/Map/Sector.cs                       |  9 +++++++++
 Source/Core/Map/Sidedef.cs                      |  9 +++++++++
 Source/Core/Map/Thing.cs                        |  9 +++++++++
 .../BuilderModes/General/CopyStructures.cs      | 17 ++++++++++-------
 5 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/Source/Core/Map/Linedef.cs b/Source/Core/Map/Linedef.cs
index b6c92154e..98dcc8a3b 100644
--- a/Source/Core/Map/Linedef.cs
+++ b/Source/Core/Map/Linedef.cs
@@ -784,6 +784,15 @@ namespace CodeImp.DoomBuilder.Map
 		{
 			return new Dictionary<string, bool>(flags);
 		}
+
+		//mxd. This returns enabled flags
+		public HashSet<string> GetEnabledFlags()
+		{
+			HashSet<string> result = new HashSet<string>();
+			foreach(KeyValuePair<string, bool> group in flags)
+				if(group.Value) result.Add(group.Key);
+			return result;
+		}
 		
 		// This clears all flags
 		public void ClearFlags()
diff --git a/Source/Core/Map/Sector.cs b/Source/Core/Map/Sector.cs
index 0c75b6690..9c9b0095d 100644
--- a/Source/Core/Map/Sector.cs
+++ b/Source/Core/Map/Sector.cs
@@ -516,6 +516,15 @@ namespace CodeImp.DoomBuilder.Map
 			return new Dictionary<string, bool>(flags);
 		}
 
+		//mxd. This returns enabled flags
+		public HashSet<string> GetEnabledFlags()
+		{
+			HashSet<string> result = new HashSet<string>();
+			foreach(KeyValuePair<string, bool> group in flags)
+				if(group.Value) result.Add(group.Key);
+			return result;
+		} 
+
 		// This clears all flags
 		public void ClearFlags() 
 		{
diff --git a/Source/Core/Map/Sidedef.cs b/Source/Core/Map/Sidedef.cs
index b8fff9b99..9664a3ae5 100644
--- a/Source/Core/Map/Sidedef.cs
+++ b/Source/Core/Map/Sidedef.cs
@@ -323,6 +323,15 @@ namespace CodeImp.DoomBuilder.Map
 			return new Dictionary<string, bool>(flags);
 		}
 
+		//mxd. This returns enabled flags
+		public HashSet<string> GetEnabledFlags()
+		{
+			HashSet<string> result = new HashSet<string>();
+			foreach(KeyValuePair<string, bool> group in flags)
+				if(group.Value) result.Add(group.Key);
+			return result;
+		} 
+
 		// This clears all flags
 		public void ClearFlags() 
 		{
diff --git a/Source/Core/Map/Thing.cs b/Source/Core/Map/Thing.cs
index 583fae647..efb2b9d4c 100644
--- a/Source/Core/Map/Thing.cs
+++ b/Source/Core/Map/Thing.cs
@@ -603,6 +603,15 @@ namespace CodeImp.DoomBuilder.Map
 			return new Dictionary<string,bool>(flags);
 		}
 
+		//mxd. This returns enabled flags
+		public HashSet<string> GetEnabledFlags()
+		{
+			HashSet<string> result = new HashSet<string>();
+			foreach(KeyValuePair<string, bool> group in flags)
+				if(group.Value) result.Add(group.Key);
+			return result;
+		} 
+
 		// This clears all flags
 		public void ClearFlags()
 		{
diff --git a/Source/Plugins/BuilderModes/General/CopyStructures.cs b/Source/Plugins/BuilderModes/General/CopyStructures.cs
index 83dd9db7a..ceae71a0c 100644
--- a/Source/Plugins/BuilderModes/General/CopyStructures.cs
+++ b/Source/Plugins/BuilderModes/General/CopyStructures.cs
@@ -802,7 +802,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			if(flags.CeilingTexture && source.CeilTexture != target.CeilTexture) return false;
 			if(flags.Brightness && source.Brightness != target.Brightness) return false;
 			if(flags.Tag && !TagsMatch(source.Tags, target.Tags)) return false;
-			if(flags.Flags && !FlagsMatch(source.GetFlags(), target.GetFlags())) return false;
+			if(flags.Flags && !FlagsMatch(source.GetEnabledFlags(), target.GetEnabledFlags())) return false;
 
 			// Generalized effects require more tender loving care...
 			if(flags.Special && source.Effect != target.Effect)
@@ -869,7 +869,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					if(!UniFields.ValuesMatch("arg4str", source, target)) return false;
 				}
 			}
-			if(linedefflags.Flags && !FlagsMatch(source.GetFlags(), target.GetFlags())) return false;
+			if(linedefflags.Flags && !FlagsMatch(source.GetEnabledFlags(), target.GetEnabledFlags())) return false;
 
 			if(General.Map.UDMF)
 			{
@@ -905,7 +905,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			if(!General.Map.UDMF) return true;
 
 			// UDMF-specific properties
-			if(flags.Flags && !FlagsMatch(source.GetFlags(), target.GetFlags())) return false;
+			if(flags.Flags && !FlagsMatch(source.GetEnabledFlags(), target.GetEnabledFlags())) return false;
 
 			// UI fields
 			if(flags.UpperTextureScale && !UniFields.ValuesMatch("scalex_top", "scaley_top", source, target)) return false;
@@ -947,7 +947,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				}
 			}
 			if(flags.Tag && source.Tag != target.Tag) return false;
-			if(flags.Flags && !FlagsMatch(source.GetFlags(), target.GetFlags())) return false;
+			if(flags.Flags && !FlagsMatch(source.GetEnabledFlags(), target.GetEnabledFlags())) return false;
 			if(!General.Map.UDMF) return true;
 
 			// UDMF-specific properties
@@ -971,11 +971,14 @@ namespace CodeImp.DoomBuilder.BuilderModes
 
 		#endregion
 
-		private static bool FlagsMatch(Dictionary<string, bool> flags1, Dictionary<string, bool> flags2) 
+		private static bool FlagsMatch(HashSet<string> flags1, HashSet<string> flags2)
 		{
 			if(flags1.Count != flags2.Count) return false;
-			foreach(KeyValuePair<string, bool> group in flags1)
-				if(!flags2.ContainsKey(group.Key) || flags2[group.Key] != flags1[group.Key]) return false;
+			foreach(string flag in flags1)
+			{
+				if(!flags2.Contains(flag)) return false;
+			}
+
 			return true;
 		}
 
-- 
GitLab