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;