From 456ae573ed5f44cb31cf7f9b63a4c67a4c7ceccf Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Thu, 9 May 2024 20:01:09 +0200
Subject: [PATCH] ZScript parser: added support for min and max value constants
 in the states block. Fixes #1019

---
 Source/Core/ZDoom/ZScriptStateStructure.cs | 63 +++++++++++++++++-----
 1 file changed, 49 insertions(+), 14 deletions(-)

diff --git a/Source/Core/ZDoom/ZScriptStateStructure.cs b/Source/Core/ZDoom/ZScriptStateStructure.cs
index 5a7a141d1..98fdea5e8 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
                 {
-- 
GitLab