From b4fbcf5d5766908c4111be6c5c69da7159041434 Mon Sep 17 00:00:00 2001
From: ZZYZX <zzyzx@virtual>
Date: Tue, 14 Feb 2017 20:27:10 +0200
Subject: [PATCH] Fixed: 'forbidden' lumps are not supposed to count towards
 matching while detecting map type

---
 Source/Core/Config/MapLumpInfo.cs |  6 ++++--
 Source/Core/General/MapManager.cs | 31 +++++++++++++++++++------------
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/Source/Core/Config/MapLumpInfo.cs b/Source/Core/Config/MapLumpInfo.cs
index 4865b221b..0237a76e5 100755
--- a/Source/Core/Config/MapLumpInfo.cs
+++ b/Source/Core/Config/MapLumpInfo.cs
@@ -31,6 +31,7 @@ namespace CodeImp.DoomBuilder.Config
 		public readonly bool NodeBuild;
 		public readonly bool AllowEmpty;
 		public readonly bool ScriptBuild; //mxd
+        public readonly bool Forbidden; // [ZZ]
 		internal readonly ScriptConfiguration Script;
 		
 		// Construct from IDictionary
@@ -44,7 +45,8 @@ namespace CodeImp.DoomBuilder.Config
 			this.NodeBuild = cfg.ReadSetting("maplumpnames." + name + ".nodebuild", false);
 			this.AllowEmpty = cfg.ReadSetting("maplumpnames." + name + ".allowempty", false);
 			this.ScriptBuild = cfg.ReadSetting("maplumpnames." + name + ".scriptbuild", false); //mxd
-			string scriptconfig = (this.ScriptBuild ? string.Empty : cfg.ReadSetting("maplumpnames." + name + ".script", "")); //mxd. Setting Script when "scriptbuild" is true can result in unexpected behaviour...
+            this.Forbidden = cfg.ReadSetting("maplumpnames." + name + ".forbidden", false); //mxd
+            string scriptconfig = (this.ScriptBuild ? string.Empty : cfg.ReadSetting("maplumpnames." + name + ".script", "")); //mxd. Setting Script when "scriptbuild" is true can result in unexpected behaviour...
 			
 			// Find script configuration
 			if(scriptconfig.Length > 0)
@@ -60,6 +62,6 @@ namespace CodeImp.DoomBuilder.Config
 				}
 			}
 		}
-	}
+    }
 }
 
diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs
index 5508a8cfa..8376f0571 100755
--- a/Source/Core/General/MapManager.cs
+++ b/Source/Core/General/MapManager.cs
@@ -1452,19 +1452,19 @@ namespace CodeImp.DoomBuilder
                 // try to detect the format used for this map.
                 // if more than one format matches, do... idk what actually.
                 // todo: move this code out and call it something like DetectMapConfiguration
-                List<List<string>> trylists = new List<List<string>>();
+                List<List<MapLumpInfo>> trylists = new List<List<MapLumpInfo>>();
                 foreach (ConfigurationInfo cinfo in General.Configs)
                 {
-                    List<string> maplumps = new List<string>();
+                    List<MapLumpInfo> maplumps = new List<MapLumpInfo>();
                     // parse only the map lumps section of the config.
                     Configuration cfg = cinfo.Configuration;
                     IDictionary dic = cfg.ReadSetting("maplumpnames", new Hashtable());
                     foreach (string k in dic.Keys)
-                        maplumps.Add(k);
+                        maplumps.Add(new MapLumpInfo(k, cfg));
 
                     // check if we already have this lump list. don't duplicate.
                     bool found = false;
-                    foreach (List<string> ctrylist in trylists)
+                    foreach (List<MapLumpInfo> ctrylist in trylists)
                     {
                         if (ctrylist.Count == maplumps.Count &&
                             ctrylist.SequenceEqual(maplumps))
@@ -1483,19 +1483,26 @@ namespace CodeImp.DoomBuilder
 
                 // find the most probable lump list.
                 int maxmatches = 0;
-                List<string> trylist = null;
-                foreach (List<string> lst in trylists)
+                List<MapLumpInfo> trylist = null;
+                foreach (List<MapLumpInfo> lst in trylists)
                 {
                     int matches = 0;
                     int maxcnt = lst.Count;
                     int checkindex = nextindex+1;
-                    foreach (string lmp in lst)
+                    for (int i = 0; i < lst.Count; i++)
                     {
                         if (checkindex >= target.Lumps.Count)
                             break;
-                        bool match = lst.Contains(target.Lumps[checkindex].Name);
-                        if (match) matches++;
-                        else break; // stop matching on first non-matching lump
+                        int mliIdx = lst.FindIndex(e => e.Name == target.Lumps[checkindex].Name);
+                        if (mliIdx < 0) break; // stop matching on first non-matching lump
+                        MapLumpInfo mli = lst[mliIdx];
+                        if (mli.Forbidden)
+                        {
+                            matches = 0;
+                            break; // completely stop matching on first forbidden lump - definitely not this configuration
+                        }
+
+                        matches++;
                         checkindex++;
                     }
 
@@ -1512,11 +1519,11 @@ namespace CodeImp.DoomBuilder
                     if (reallyremove)
                     {
                         int checkindex = nextindex + 1;
-                        foreach (string lmp in trylist)
+                        for (int i = 0; i < trylist.Count; i++)
                         {
                             if (checkindex >= target.Lumps.Count)
                                 break;
-                            bool match = trylist.Contains(target.Lumps[checkindex].Name);
+                            bool match = (trylist.FindIndex(e => e.Name == target.Lumps[checkindex].Name) >= 0);
                             if (match) target.RemoveAt(checkindex);
                             else break; // stop deleting on first non-matching lump
                         }
-- 
GitLab