Fixed: 'forbidden' lumps are not supposed to count towards matching while detecting map type

This commit is contained in:
ZZYZX 2017-02-14 20:27:10 +02:00 committed by spherallic
parent 7cb80cf9f2
commit c6a2288c22
2 changed files with 22 additions and 13 deletions

View file

@ -31,6 +31,7 @@ namespace CodeImp.DoomBuilder.Config
public readonly bool NodeBuild; public readonly bool NodeBuild;
public readonly bool AllowEmpty; public readonly bool AllowEmpty;
public readonly bool ScriptBuild; //mxd public readonly bool ScriptBuild; //mxd
public readonly bool Forbidden; // [ZZ]
internal readonly ScriptConfiguration Script; internal readonly ScriptConfiguration Script;
// Construct from IDictionary // Construct from IDictionary
@ -44,6 +45,7 @@ namespace CodeImp.DoomBuilder.Config
this.NodeBuild = cfg.ReadSetting("maplumpnames." + name + ".nodebuild", false); this.NodeBuild = cfg.ReadSetting("maplumpnames." + name + ".nodebuild", false);
this.AllowEmpty = cfg.ReadSetting("maplumpnames." + name + ".allowempty", false); this.AllowEmpty = cfg.ReadSetting("maplumpnames." + name + ".allowempty", false);
this.ScriptBuild = cfg.ReadSetting("maplumpnames." + name + ".scriptbuild", false); //mxd this.ScriptBuild = cfg.ReadSetting("maplumpnames." + name + ".scriptbuild", false); //mxd
this.Forbidden = cfg.ReadSetting("maplumpnames." + name + ".forbidden", false); //mxd
string scriptconfig = cfg.ReadSetting("maplumpnames." + name + ".script", ""); string scriptconfig = cfg.ReadSetting("maplumpnames." + name + ".script", "");
// Find script configuration // Find script configuration
@ -60,6 +62,6 @@ namespace CodeImp.DoomBuilder.Config
} }
} }
} }
} }
} }

View file

@ -1455,19 +1455,19 @@ namespace CodeImp.DoomBuilder
// try to detect the format used for this map. // try to detect the format used for this map.
// if more than one format matches, do... idk what actually. // if more than one format matches, do... idk what actually.
// todo: move this code out and call it something like DetectMapConfiguration // 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) 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. // parse only the map lumps section of the config.
Configuration cfg = cinfo.Configuration; Configuration cfg = cinfo.Configuration;
IDictionary dic = cfg.ReadSetting("maplumpnames", new Hashtable()); IDictionary dic = cfg.ReadSetting("maplumpnames", new Hashtable());
foreach (string k in dic.Keys) 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. // check if we already have this lump list. don't duplicate.
bool found = false; bool found = false;
foreach (List<string> ctrylist in trylists) foreach (List<MapLumpInfo> ctrylist in trylists)
{ {
if (ctrylist.Count == maplumps.Count && if (ctrylist.Count == maplumps.Count &&
ctrylist.SequenceEqual(maplumps)) ctrylist.SequenceEqual(maplumps))
@ -1486,19 +1486,26 @@ namespace CodeImp.DoomBuilder
// find the most probable lump list. // find the most probable lump list.
int maxmatches = 0; int maxmatches = 0;
List<string> trylist = null; List<MapLumpInfo> trylist = null;
foreach (List<string> lst in trylists) foreach (List<MapLumpInfo> lst in trylists)
{ {
int matches = 0; int matches = 0;
int maxcnt = lst.Count; int maxcnt = lst.Count;
int checkindex = nextindex+1; int checkindex = nextindex+1;
foreach (string lmp in lst) for (int i = 0; i < lst.Count; i++)
{ {
if (checkindex >= target.Lumps.Count) if (checkindex >= target.Lumps.Count)
break; break;
bool match = lst.Contains(target.Lumps[checkindex].Name); int mliIdx = lst.FindIndex(e => e.Name == target.Lumps[checkindex].Name);
if (match) matches++; if (mliIdx < 0) break; // stop matching on first non-matching lump
else 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++; checkindex++;
} }
@ -1515,11 +1522,11 @@ namespace CodeImp.DoomBuilder
if (reallyremove) if (reallyremove)
{ {
int checkindex = nextindex + 1; int checkindex = nextindex + 1;
foreach (string lmp in trylist) for (int i = 0; i < trylist.Count; i++)
{ {
if (checkindex >= target.Lumps.Count) if (checkindex >= target.Lumps.Count)
break; 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); if (match) target.RemoveAt(checkindex);
else break; // stop deleting on first non-matching lump else break; // stop deleting on first non-matching lump
} }