From fe4aef43b7e81282c7b7a8fb47f021b24c3339e0 Mon Sep 17 00:00:00 2001
From: spherallic <spherallic@gmail.com>
Date: Thu, 21 Sep 2023 01:36:59 +0200
Subject: [PATCH] Allow editing thing info through Lua

---
 Source/Core/Data/DataManager.cs      |  5 ++++
 Source/Core/SRB2/LuaMobjStructure.cs | 12 ++++++---
 Source/Core/SRB2/LuaParser.cs        | 37 +++++++++++++++++++++-------
 3 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index 5e8281c66..f1bcbb881 100755
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -1936,6 +1936,11 @@ namespace CodeImp.DoomBuilder.Data
 					{
 						// Update the thing
 						thingtypes[actor.DoomEdNum].ModifyByDecorateActor(actor);
+
+						// Re-assign category in case it changed
+						thingtypes[actor.DoomEdNum].Category.RemoveThing(thingtypes[actor.DoomEdNum]);
+						ThingCategory tc = GetThingCategory(null, thingcategories, GetCategoryInfo(actor));
+						tc.AddThing(thingtypes[actor.DoomEdNum]);
 					}
 					else
 					{
diff --git a/Source/Core/SRB2/LuaMobjStructure.cs b/Source/Core/SRB2/LuaMobjStructure.cs
index 3b4ba4c9c..c8c671fc6 100644
--- a/Source/Core/SRB2/LuaMobjStructure.cs
+++ b/Source/Core/SRB2/LuaMobjStructure.cs
@@ -14,7 +14,7 @@ namespace CodeImp.DoomBuilder.ZDoom
 	{
         #region ================== DECORATE Actor Structure parsing
 
-        internal LuaMobjStructure(ZDTextParser zdparser, string objname)
+        internal LuaMobjStructure(ZDTextParser zdparser, string objname, int editnum)
         {
 			classname = string.Empty;
 
@@ -22,12 +22,15 @@ namespace CodeImp.DoomBuilder.ZDoom
             bool done = false; //mxd
 			General.WriteLogLine(objname);
 
-			if (string.IsNullOrEmpty(objname))
+			if (string.IsNullOrEmpty(objname) && editnum == 0)
             {
-                parser.ReportError("Expected actor class name");
+                parser.ReportError("Lua object structure has no object name or map thing number");
                 return;
             }
 
+			if (editnum > 0)
+				doomednum = editnum;
+
 			// Now parse the contents of actor structure
 
 			while (parser.SkipWhitespace(true))
@@ -38,6 +41,7 @@ namespace CodeImp.DoomBuilder.ZDoom
 				switch (token)
 				{
 					case "}":
+					case "$}":
 						// Actor scope ends here, break out of this parse loop
 						done = true;
 						break;
@@ -94,7 +98,7 @@ namespace CodeImp.DoomBuilder.ZDoom
 									props["yscale"] = values;
 									break;
 								case "doomednum":
-									doomednum = int.Parse(values[0]);
+									doomednum = (editnum > 0) ? editnum : int.Parse(values[0]);
 									goto default;
 								case "height":
 								case "radius":
diff --git a/Source/Core/SRB2/LuaParser.cs b/Source/Core/SRB2/LuaParser.cs
index c2b842644..571f1e42f 100644
--- a/Source/Core/SRB2/LuaParser.cs
+++ b/Source/Core/SRB2/LuaParser.cs
@@ -121,29 +121,48 @@ namespace CodeImp.DoomBuilder.ZDoom
 			{
 				// Read a token
 				string token = ReadToken();
+
 				if (!string.IsNullOrEmpty(token))
 				{
-					if (!token.StartsWith("mobjinfo[") || !token.EndsWith("]")) continue;
-					string objname = token.Substring(9).TrimEnd(new char[] { ']' });
+					string objname = null;
+					int editnum = 0;
 
-					SkipWhitespace(true);
-					token = ReadToken();
-					if (token != "=")
+					if (token.Contains("$EditInfo"))
 					{
-						continue;
+						SkipWhitespace(true);
+						token = ReadToken();
+
+						bool valid = int.TryParse(token, out editnum);
+						if (!valid || editnum <= 0)
+						{
+							continue;
+						}
+					}
+					else
+					{
+						if (!token.StartsWith("mobjinfo[") || !token.EndsWith("]")) continue;
+						objname = token.Substring(9).TrimEnd(new char[] { ']' });
+
+						SkipWhitespace(true);
+						token = ReadToken();
+
+						if (token != "=")
+						{
+							continue;
+						}
 					}
 
 					SkipWhitespace(true);
 					token = ReadToken();
+
 					if (token != "{")
 					{
 						ReportError("Invalid object definition, missing {");
 						return false;
 					}
+
 					// Read actor structure
-					ActorStructure mobj = new LuaMobjStructure(this, objname);
-					if (mobj.props.ContainsKey("doomednum"))
-						General.WriteLogLine("Mobj doomednum = " + mobj.props["doomednum"][0]);
+					ActorStructure mobj = new LuaMobjStructure(this, objname, editnum);
 					if (this.HasError) return false;
 
 					mobjs[mobj.DoomEdNum] = mobj;
-- 
GitLab