From fca82f5c91e00ce64499800e5cc91b8e601bbde3 Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Sat, 11 Sep 2021 22:11:07 +0200
Subject: [PATCH] Dehacked: added support for editor keys Dehacked: Dehacked
 files are now properly loaded from directories

---
 Source/Core/Config/ThingTypeInfo.cs     |  3 +++
 Source/Core/Data/PK3StructuredReader.cs |  4 +--
 Source/Core/Dehacked/DehackedParser.cs  |  7 +++--
 Source/Core/Dehacked/DehackedThing.cs   | 36 +++++++++++++++++++------
 4 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/Source/Core/Config/ThingTypeInfo.cs b/Source/Core/Config/ThingTypeInfo.cs
index ac0c9f461..a41d84a4f 100755
--- a/Source/Core/Config/ThingTypeInfo.cs
+++ b/Source/Core/Config/ThingTypeInfo.cs
@@ -650,6 +650,9 @@ namespace CodeImp.DoomBuilder.Config
 			blocking = thing.Bits.Contains("solid") ? 1 : 0;
 			hangs = thing.Bits.Contains("spawnceiling");
 
+			if (thing.Props.ContainsKey("$editor angled"))
+				arrow = thing.Angled == ThingAngled.YES;
+
 			if (thing.Color >= 0 && thing.Color <= 19)
 				color = thing.Color;
 
diff --git a/Source/Core/Data/PK3StructuredReader.cs b/Source/Core/Data/PK3StructuredReader.cs
index 421d24fa3..3d86e0d1e 100755
--- a/Source/Core/Data/PK3StructuredReader.cs
+++ b/Source/Core/Data/PK3StructuredReader.cs
@@ -500,12 +500,12 @@ namespace CodeImp.DoomBuilder.Data
 			string pathname = Path.GetDirectoryName(pname);
 
 			if (filename.IndexOf('.') > -1)
-			{
 				allfilenames = GetFileAtPath(filename, pathname, "DEHACKED");
-			}
 			else
 				allfilenames = GetAllFilesWithTitle(pathname, filename, false);
 
+			result.Add(new TextResourceData(this, LoadFile(allfilenames[allfilenames.Length - 1]), allfilenames[allfilenames.Length - 1], true));
+
 			return result;
 		}
 
diff --git a/Source/Core/Dehacked/DehackedParser.cs b/Source/Core/Dehacked/DehackedParser.cs
index bc16f7ce9..fa9948396 100644
--- a/Source/Core/Dehacked/DehackedParser.cs
+++ b/Source/Core/Dehacked/DehackedParser.cs
@@ -359,8 +359,11 @@ namespace CodeImp.DoomBuilder.Dehacked
 			{
 				line = GetLine();
 
-				if (string.IsNullOrWhiteSpace(line)) break;
-				if (line.StartsWith("#")) continue;
+				if (string.IsNullOrWhiteSpace(line))
+					break;
+				else if (line.StartsWith("#$"))
+					line = line.Substring(1);
+				else if (line.StartsWith("#")) continue;
 
 				if (!GetKeyValueFromLine(line, out fieldkey, out fieldvalue))
 					return false;
diff --git a/Source/Core/Dehacked/DehackedThing.cs b/Source/Core/Dehacked/DehackedThing.cs
index 2e87845b1..f44b37d23 100644
--- a/Source/Core/Dehacked/DehackedThing.cs
+++ b/Source/Core/Dehacked/DehackedThing.cs
@@ -30,6 +30,13 @@ using System.Collections.Generic;
 
 namespace CodeImp.DoomBuilder.Dehacked
 {
+	public enum ThingAngled
+	{
+		UNCHANGED,
+		YES,
+		NO
+	}
+
 	public class DehackedThing
 	{
 		#region ================== Variables
@@ -46,6 +53,7 @@ namespace CodeImp.DoomBuilder.Dehacked
 		private string category;
 		private int color;
 		private bool bright;
+		private ThingAngled angled;
 
 		#endregion
 
@@ -63,6 +71,7 @@ namespace CodeImp.DoomBuilder.Dehacked
 		public string Category { get { return category; } }
 		public int Color { get { return color; } }
 		public bool Bright { get { return bright; } }
+		public ThingAngled Angled { get { return angled; } }
 
 		#endregion
 
@@ -73,6 +82,8 @@ namespace CodeImp.DoomBuilder.Dehacked
 			this.number = number;
 			this.name = name;
 			color = -1;
+			sprite = null;
+			angled = ThingAngled.UNCHANGED;
 
 			props = new Dictionary<string, string>();
 			bits = new List<string>();
@@ -117,7 +128,7 @@ namespace CodeImp.DoomBuilder.Dehacked
 						int.TryParse(value, out doomednum);
 						break;
 					case "initial frame":
-						if (int.TryParse(value, out initialframe))
+						if (sprite == null && int.TryParse(value, out initialframe))
 						{
 							if (frames.ContainsKey(initialframe))
 							{
@@ -174,13 +185,22 @@ namespace CodeImp.DoomBuilder.Dehacked
 								bits.Add(mnemonic.Trim().ToLowerInvariant());
 						}
 						break;
-					//case "$category":
-					//	category = value;
-					//	break;
-					//case "$color":
-					//	if (!int.TryParse(value, out color))
-					//		color = 18; // Default light brown
-					//	break;
+					case "$editor category":
+						category = value;
+						break;
+					case "$editor color id":
+						if (!int.TryParse(value, out color))
+							color = 18; // Default light brown
+						break;
+					case "$editor sprite":
+						sprite = value;
+						break;
+					case "$editor angled":
+						if (value.ToLowerInvariant() == "true")
+							angled = ThingAngled.YES;
+						else
+							angled = ThingAngled.NO;
+						break;
 				}
 			}
 		}
-- 
GitLab