diff --git a/.github/workflows/continuous_integration_other.yml b/.github/workflows/continuous_integration_other.yml index 5aa3460e72b3474c5dd32f8ad1bf601c73766bd4..a0d14782e35aa753c1d1f9a15f27261451a1faba 100644 --- a/.github/workflows/continuous_integration_other.yml +++ b/.github/workflows/continuous_integration_other.yml @@ -10,10 +10,10 @@ jobs: fail-fast: false matrix: config: - - { - name: "macOS", - os: macos-latest - } +# - { +# name: "macOS", +# os: macos-latest +# } - { name: "Linux", os: ubuntu-latest diff --git a/Build/Configurations/Includes/ZDoom_misc.cfg b/Build/Configurations/Includes/ZDoom_misc.cfg index bb6165f1a948959312c7561c4d3c6904882c79c9..9056202b4e89a33a62ce27db7dd2ad5808e2c328 100755 --- a/Build/Configurations/Includes/ZDoom_misc.cfg +++ b/Build/Configurations/Includes/ZDoom_misc.cfg @@ -908,16 +908,8 @@ universalfields type = 1; default = 1.0; } - - lm_gridsize - { - type = 1; - default = 32.0; - thingtypespecific = true; - managed = false; - } - lm_sampledistance + lm_sampledist { type = 0; default = 8; diff --git a/Source/Core/Windows/ConfigForm.cs b/Source/Core/Windows/ConfigForm.cs index 114ebbed3ccc48cc0af6958e700c5fcf49d52581..8dc5d3905cf27a4a57c41c41ca09565410d0f568 100755 --- a/Source/Core/Windows/ConfigForm.cs +++ b/Source/Core/Windows/ConfigForm.cs @@ -808,8 +808,6 @@ namespace CodeImp.DoomBuilder.Windows private void cbEngineSelector_SelectedIndexChanged(object sender, EventArgs e) { if(cbEngineSelector.SelectedIndex == -1) return; - - preventchanges = true; //set new values configinfo.CurrentEngineIndex = cbEngineSelector.SelectedIndex; @@ -834,8 +832,6 @@ namespace CodeImp.DoomBuilder.Windows skill.Value = skilllevel - 1; //mxd. WHY??? skill.Value = skilllevel; customparameters.Checked = configinfo.CustomParameters; - - preventchanges = false; } //mxd diff --git a/Source/Core/ZDoom/ZScriptStateStructure.cs b/Source/Core/ZDoom/ZScriptStateStructure.cs index 5a7a141d1bf5bc96f8a57b095e9fc41a27d1fb29..98fdea5e89cf5e72d2f81b2da43c6f24e369e828 100755 --- a/Source/Core/ZDoom/ZScriptStateStructure.cs +++ b/Source/Core/ZDoom/ZScriptStateStructure.cs @@ -59,6 +59,7 @@ namespace CodeImp.DoomBuilder.ZDoom // todo: parse stuff // string[] control_keywords = new string[] { "goto", "loop", "wait", "fail", "stop" }; + string[] data_types = new string[] { "double", "int", "uint" }; while (true) { @@ -151,20 +152,54 @@ namespace CodeImp.DoomBuilder.ZDoom token = tokenizer.ExpectToken(ZScriptTokenType.Identifier); if (token != null && token.IsValid) { - duration = -1; - tokenizer.SkipWhitespace(); - token = tokenizer.ExpectToken(ZScriptTokenType.OpenParen); - if (token != null && token.IsValid) - { - List<ZScriptToken> tokens = parser.ParseExpression(true); - tokenizer.SkipWhitespace(); - token = tokenizer.ExpectToken(ZScriptTokenType.CloseParen); - if (token == null || !token.IsValid) - { - parser.ReportError("Expected ), got " + ((Object)token ?? "<null>").ToString()); - return; - } - } + // Known data type? Then it's hopefully the .min or .max value (like int.min or int.max) + if (data_types.Contains(token.Value)) + { + token = tokenizer.ExpectToken(ZScriptTokenType.Dot); + if(token == null || !token.IsValid) + { + parser.ReportError("Expected ., got " + ((Object)token ?? "<null>").ToString()); + return; + } + + token = tokenizer.ExpectToken(ZScriptTokenType.Identifier); + if (token == null || !token.IsValid) + { + parser.ReportError("Expected an identifier, got " + ((Object)token ?? "<null>").ToString()); + return; + } + + if (token.Value == "min") + { + duration = int.MinValue; + } + else if (token.Value == "max") + { + duration = int.MaxValue; + } + else + { + parser.ReportError("Expected min or max, got " + ((Object)token ?? "<null>").ToString()); + return; + } + } + else // No known data type + { + duration = -1; + tokenizer.SkipWhitespace(); + token = tokenizer.ExpectToken(ZScriptTokenType.OpenParen); + if (token != null && token.IsValid) + { + List<ZScriptToken> tokens = parser.ParseExpression(true); + tokenizer.SkipWhitespace(); + token = tokenizer.ExpectToken(ZScriptTokenType.CloseParen); + if (token == null || !token.IsValid) + { + parser.ReportError("Expected ), got " + ((Object)token ?? "<null>").ToString()); + return; + } + } + } } else { diff --git a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs index 36cd0bd18dfd6c0a348249774f094d69d48e494c..ba570077e4fd1e620f0dd7a3ef0909f6218eaca7 100755 --- a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs @@ -362,7 +362,11 @@ namespace CodeImp.DoomBuilder.BuilderModes if(curdistance < closest2) closest2 = curdistance; // Return closer one - return (int)(closest1 - closest2); + // biwa: the difference between closest1 and closest2 can exceed the capacity of int, and that + // sometimes seem to cause problems, resulting in the sorting to throw an ArgumentException + // because of inconsistent results. Making sure to only return -1, 0, or 1 seems to fix the issue + // See https://github.com/UltimateDoomBuilder/UltimateDoomBuilder/issues/1053 + return (closest1 - closest2) < 0 ? -1 : ((closest1 - closest2) > 0 ? 1 : 0); }); return result; diff --git a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs index f4a60abd17fea8a69c30d0f603fa0ba9d14d0a30..449da33b89b9ef6f4e823859a2922fa3bc5141dc 100755 --- a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs @@ -722,7 +722,11 @@ namespace CodeImp.DoomBuilder.BuilderModes } // Return closer one - return (int)(closest1 - closest2); + // biwa: the difference between closest1 and closest2 can exceed the capacity of int, and that + // sometimes seem to cause problems, resulting in the sorting to throw an ArgumentException + // because of inconsistent results. Making sure to only return -1, 0, or 1 seems to fix the issue + // See https://github.com/UltimateDoomBuilder/UltimateDoomBuilder/issues/1053 + return (closest1 - closest2) < 0 ? -1 : ((closest1 - closest2) > 0 ? 1 : 0); }); return result; diff --git a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs index 6d8f25472b125ccab9891ba8f6f033303dc1d054..e26e11dcbe2254f3586b53b93b7e7e1c1e22c1bf 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs @@ -1012,7 +1012,11 @@ namespace CodeImp.DoomBuilder.BuilderModes double closest2 = Vector2D.DistanceSq(t2.Position, targetpoint); // Return closer one - return (int)(closest1 - closest2); + // biwa: the difference between closest1 and closest2 can exceed the capacity of int, and that + // sometimes seem to cause problems, resulting in the sorting to throw an ArgumentException + // because of inconsistent results. Making sure to only return -1, 0, or 1 seems to fix the issue + // See https://github.com/UltimateDoomBuilder/UltimateDoomBuilder/issues/1053 + return (closest1 - closest2) < 0 ? -1 : ((closest1 - closest2) > 0 ? 1 : 0); }); return result;