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