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