From c90e7fd4c1c14d4bd2ee0d874e1179edf2d01804 Mon Sep 17 00:00:00 2001 From: ike709 Date: Sun, 27 Mar 2022 03:14:56 -0500 Subject: [PATCH 1/8] Implements DreamMetaObjectIcon, Width(), Height() --- DMCompiler/DMStandard/Types/Icon.dm | 11 +- OpenDreamRuntime/DreamManager.cs | 1 + .../MetaObjects/DreamMetaObjectIcon.cs | 106 ++++++++++++++++++ .../MetaObjects/DreamMetaObjectRegex.cs | 2 +- .../Procs/Native/DreamProcNative.cs | 4 + .../Procs/Native/DreamProcNativeIcon.cs | 23 ++++ 6 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs create mode 100644 OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs diff --git a/DMCompiler/DMStandard/Types/Icon.dm b/DMCompiler/DMStandard/Types/Icon.dm index 164dcdc92c..ae3029c6f0 100644 --- a/DMCompiler/DMStandard/Types/Icon.dm +++ b/DMCompiler/DMStandard/Types/Icon.dm @@ -1,12 +1,13 @@ /icon parent_type = /datum + var/icon New(icon, icon_state, dir, frame, moving) proc/Blend(icon, function = ICON_ADD, x = 1, y = 1) set opendream_unimplemented = TRUE CRASH("/icon.Blend() is not implemented") - + proc/Crop(x1, y1, x2, y2) set opendream_unimplemented = TRUE CRASH("/icon.Crop() is not implemented") @@ -18,14 +19,12 @@ proc/Flip(dir) set opendream_unimplemented = TRUE CRASH("/icon.Flip() is not implemented") - + proc/GetPixel(x, y, icon_state, dir = 0, frame = 0, moving = -1) set opendream_unimplemented = TRUE CRASH("/icon.GetPixel() is not implemented") proc/Height() - set opendream_unimplemented = TRUE - CRASH("/icon.Height() is not implemented") proc/IconStates(mode = 0) return icon_states(src, mode) @@ -59,8 +58,6 @@ CRASH("/icon.Turn() is not implemented") proc/Width() - set opendream_unimplemented = TRUE - CRASH("/icon.Width() is not implemented") proc/icon(...) - return new /icon(arglist(args)) \ No newline at end of file + return new /icon(arglist(args)) diff --git a/OpenDreamRuntime/DreamManager.cs b/OpenDreamRuntime/DreamManager.cs index 0654944dac..c3c95ee56c 100644 --- a/OpenDreamRuntime/DreamManager.cs +++ b/OpenDreamRuntime/DreamManager.cs @@ -119,6 +119,7 @@ private void SetMetaObjects() { ObjectTree.SetMetaObject(DreamPath.Turf, new DreamMetaObjectTurf()); ObjectTree.SetMetaObject(DreamPath.Movable, new DreamMetaObjectMovable()); ObjectTree.SetMetaObject(DreamPath.Mob, new DreamMetaObjectMob()); + ObjectTree.SetMetaObject(DreamPath.Icon, new DreamMetaObjectIcon()); } public void SetGlobalNativeProc(NativeProc.HandlerFn func) { diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs new file mode 100644 index 0000000000..84ce052ba6 --- /dev/null +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -0,0 +1,106 @@ +using System.Collections.Generic; +using System.IO; +using OpenDreamRuntime.Procs; +using OpenDreamRuntime.Resources; +using OpenDreamShared.Dream; +using OpenDreamShared.Resources; + +namespace OpenDreamRuntime.Objects.MetaObjects { + sealed class DreamMetaObjectIcon : DreamMetaObjectDatum + { + [Dependency] private readonly DreamResourceManager _rscMan = default; + public struct DreamIcon { + public DreamResource Resource; + public string? State; + public AtomDirection Direction = AtomDirection.South; + public int Frame = 0; + public int? Moving; + public DMIParser.ParsedDMIDescription Description; + } + + public static Dictionary ObjectToDreamIcon = new(); + + public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments) { + base.OnObjectCreated(dreamObject, creationArguments); + + DreamValue icon = creationArguments.GetArgument(0, "icon"); + DreamValue state = creationArguments.GetArgument(1, "icon_state"); + DreamValue dir = creationArguments.GetArgument(2, "dir"); + DreamValue frame = creationArguments.GetArgument(3, "frame"); + DreamValue moving = creationArguments.GetArgument(4, "moving"); + + DreamIcon dreamIcon; + + if (icon.TryGetValueAsDreamObjectOfType(DreamPath.Icon, out DreamObject copyFrom)) { + dreamIcon = ObjectToDreamIcon[copyFrom]; + } else if (icon.TryGetValueAsString(out string fileString)) + { + var ext = Path.GetExtension(fileString); + switch (ext) + { + case ".dmi": + dreamIcon = new DreamIcon() {Resource = _rscMan.LoadResource(fileString)}; + Stream dmiStream = new MemoryStream(dreamIcon.Resource.ResourceData); + dreamIcon.Description = DMIParser.ParseDMI(dmiStream); + dreamObject.SetVariableValue("icon", new DreamValue(dreamIcon.Resource.ResourcePath)); + break; + case ".png": + case ".jpg": + case ".rsi": + case ".gif": + case ".bmp": + throw new NotImplementedException($"Unimplemented icon type '{ext}'"); + default: + throw new Exception($"Invalid icon file {fileString}"); + } + + } else if (icon.TryGetValueAsDreamResource(out var rsc)) + { + dreamIcon = new DreamIcon() {Resource = rsc}; + Stream dmiStream = new MemoryStream(dreamIcon.Resource.ResourceData); + dreamIcon.Description = DMIParser.ParseDMI(dmiStream); + dreamObject.SetVariableValue("icon", new DreamValue(dreamIcon.Resource.ResourcePath)); + } else { + throw new Exception("Invalid icon file " + icon); + } + + if (state.TryGetValueAsString(out var iconState)) + { + dreamIcon.State = iconState; + } + + if (dir.TryGetValueAsInteger(out var dirVal) && (AtomDirection)dirVal != AtomDirection.None) + { + dreamIcon.Direction = (AtomDirection)dirVal; + } + + if (frame.TryGetValueAsInteger(out var frameVal)) + { + dreamIcon.Frame = frameVal; + } + + if (moving != DreamValue.Null) + { + if (!moving.TryGetValueAsInteger(out var movingVal) || movingVal != 0) + { + dreamIcon.Moving = 1; + } + else + { + dreamIcon.Moving = 0; + } + } + + //dreamObject.ObjectDefinition. + + ObjectToDreamIcon.Add(dreamObject, dreamIcon); + + } + + public override void OnObjectDeleted(DreamObject dreamObject) { + ObjectToDreamIcon.Remove(dreamObject); + + base.OnObjectDeleted(dreamObject); + } + } +} diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs index 1f366dfaa5..4183959e18 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs @@ -4,7 +4,7 @@ using OpenDreamShared.Dream; namespace OpenDreamRuntime.Objects.MetaObjects { - class DreamMetaObjectRegex : DreamMetaObjectDatum { + sealed class DreamMetaObjectRegex : DreamMetaObjectDatum { public struct DreamRegex { public Regex Regex; public bool IsGlobal; diff --git a/OpenDreamRuntime/Procs/Native/DreamProcNative.cs b/OpenDreamRuntime/Procs/Native/DreamProcNative.cs index 66310da908..83d825d490 100644 --- a/OpenDreamRuntime/Procs/Native/DreamProcNative.cs +++ b/OpenDreamRuntime/Procs/Native/DreamProcNative.cs @@ -117,6 +117,10 @@ public static void SetupNativeProcs(DreamObjectTree objectTree) { regex.SetNativeProc(DreamProcNativeRegex.NativeProc_Find); regex.SetNativeProc(DreamProcNativeRegex.NativeProc_Replace); + DreamObjectDefinition icon = objectTree.GetObjectDefinition(DreamPath.Icon); + icon.SetNativeProc(DreamProcNativeIcon.NativeProc_Width); + icon.SetNativeProc(DreamProcNativeIcon.NativeProc_Height); + //DreamObjectDefinition savefile = objectTree.GetObjectDefinitionFromPath(DreamPath.Savefile); //savefile.SetNativeProc(DreamProcNativeSavefile.NativeProc_Flush); diff --git a/OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs b/OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs new file mode 100644 index 0000000000..c0f4685c3e --- /dev/null +++ b/OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs @@ -0,0 +1,23 @@ +using System; +using OpenDreamRuntime.Objects; +using OpenDreamRuntime.Objects.MetaObjects; + +namespace OpenDreamRuntime.Procs.Native { + static class DreamProcNativeIcon { + [DreamProc("Width")] + public static DreamValue NativeProc_Width(DreamObject instance, DreamObject usr, DreamProcArguments arguments) { + DreamMetaObjectIcon.DreamIcon dreamIcon = DreamMetaObjectIcon.ObjectToDreamIcon[instance]; + + return new DreamValue(dreamIcon.Description.Width); + } + + [DreamProc("Height")] + public static DreamValue NativeProc_Height(DreamObject instance, DreamObject usr, DreamProcArguments arguments) { + DreamMetaObjectIcon.DreamIcon dreamIcon = DreamMetaObjectIcon.ObjectToDreamIcon[instance]; + + return new DreamValue(dreamIcon.Description.Height); + } + + + } +} From 73aa45fe970f535e40f9e421aec8ed876a8f3e78 Mon Sep 17 00:00:00 2001 From: ike709 Date: Tue, 29 Mar 2022 22:53:59 -0500 Subject: [PATCH 2/8] Cleanup --- .../MetaObjects/DreamMetaObjectIcon.cs | 96 +++++++++++-------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs index 84ce052ba6..609bc98b36 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -12,10 +12,61 @@ sealed class DreamMetaObjectIcon : DreamMetaObjectDatum public struct DreamIcon { public DreamResource Resource; public string? State; - public AtomDirection Direction = AtomDirection.South; - public int Frame = 0; - public int? Moving; + public AtomDirection Direction; + public int Frame; + public byte? Moving; public DMIParser.ParsedDMIDescription Description; + + public DreamIcon(DreamResource rsc, DreamValue? state, DreamValue? dir, DreamValue? frame, DreamValue? moving) + { + Resource = rsc; + Description = DMIParser.ParseDMI(new MemoryStream(rsc.ResourceData)); + + // TODO confirm BYOND behavior of invalid types + + if (state is not null && state.Value.TryGetValueAsString(out var iconState)) + { + State = iconState; + } + else + { + State = null; + } + + if (dir is not null && dir.Value.TryGetValueAsInteger(out var dirVal) && (AtomDirection)dirVal != AtomDirection.None) + { + Direction = (AtomDirection)dirVal; + } + else + { + Direction = AtomDirection.South; + } + + if (frame is not null && frame.Value.TryGetValueAsInteger(out var frameVal)) + { + Frame = frameVal; + } + else + { + Frame = 0; + } + + if (moving != DreamValue.Null) + { + if (moving is not null && (!moving.Value.TryGetValueAsInteger(out var movingVal) || movingVal != 0)) + { + Moving = 1; + } + else + { + Moving = 0; + } + } + else + { + Moving = null; + } + } } public static Dictionary ObjectToDreamIcon = new(); @@ -36,17 +87,17 @@ public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments } else if (icon.TryGetValueAsString(out string fileString)) { var ext = Path.GetExtension(fileString); - switch (ext) + switch (ext) // TODO implement other icon file types { case ".dmi": - dreamIcon = new DreamIcon() {Resource = _rscMan.LoadResource(fileString)}; + dreamIcon = new DreamIcon(_rscMan.LoadResource(fileString), state, dir, frame, moving); Stream dmiStream = new MemoryStream(dreamIcon.Resource.ResourceData); dreamIcon.Description = DMIParser.ParseDMI(dmiStream); dreamObject.SetVariableValue("icon", new DreamValue(dreamIcon.Resource.ResourcePath)); break; case ".png": case ".jpg": - case ".rsi": + case ".rsi": // RT-specific, not in BYOND case ".gif": case ".bmp": throw new NotImplementedException($"Unimplemented icon type '{ext}'"); @@ -56,43 +107,12 @@ public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments } else if (icon.TryGetValueAsDreamResource(out var rsc)) { - dreamIcon = new DreamIcon() {Resource = rsc}; - Stream dmiStream = new MemoryStream(dreamIcon.Resource.ResourceData); - dreamIcon.Description = DMIParser.ParseDMI(dmiStream); + dreamIcon = new DreamIcon(rsc, state, dir, frame, moving); dreamObject.SetVariableValue("icon", new DreamValue(dreamIcon.Resource.ResourcePath)); } else { throw new Exception("Invalid icon file " + icon); } - if (state.TryGetValueAsString(out var iconState)) - { - dreamIcon.State = iconState; - } - - if (dir.TryGetValueAsInteger(out var dirVal) && (AtomDirection)dirVal != AtomDirection.None) - { - dreamIcon.Direction = (AtomDirection)dirVal; - } - - if (frame.TryGetValueAsInteger(out var frameVal)) - { - dreamIcon.Frame = frameVal; - } - - if (moving != DreamValue.Null) - { - if (!moving.TryGetValueAsInteger(out var movingVal) || movingVal != 0) - { - dreamIcon.Moving = 1; - } - else - { - dreamIcon.Moving = 0; - } - } - - //dreamObject.ObjectDefinition. - ObjectToDreamIcon.Add(dreamObject, dreamIcon); } From 5ed5999501f3543ab7f5e42690f75a81770577d7 Mon Sep 17 00:00:00 2001 From: ike709 Date: Wed, 30 Mar 2022 19:11:24 -0500 Subject: [PATCH 3/8] Clean it up but do it well --- .../MetaObjects/DreamMetaObjectIcon.cs | 78 +++++++++++-------- .../Procs/Native/DreamProcNativeIcon.cs | 8 +- OpenDreamShared/Resources/DMIParser.cs | 6 +- 3 files changed, 54 insertions(+), 38 deletions(-) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs index 609bc98b36..5e94607e0a 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -8,21 +8,40 @@ namespace OpenDreamRuntime.Objects.MetaObjects { sealed class DreamMetaObjectIcon : DreamMetaObjectDatum { - [Dependency] private readonly DreamResourceManager _rscMan = default; - public struct DreamIcon { - public DreamResource Resource; - public string? State; - public AtomDirection Direction; - public int Frame; - public byte? Moving; - public DMIParser.ParsedDMIDescription Description; - - public DreamIcon(DreamResource rsc, DreamValue? state, DreamValue? dir, DreamValue? frame, DreamValue? moving) + [Dependency] private readonly DreamResourceManager _rscMan = default!; + + public enum DreamIconMovingMode : byte + { + Both = 0, + Movement = 1, + NonMovement = 2, + + } + + public static Dictionary ObjectToDreamIcon = new(); + + public struct DreamIconObject { + // Actual DMI data + public DMIParser.ParsedDMIDescription Description; // TODO Eventually this should probably be removed in favor of just directly storing the data for the subset of the DMI that we actually care about + + // These vars correspond to the args in icon/new() and the resulting /icon obj, not the actual DMI data + public string Icon; + public string? State; // Specific icon_state. Null is all states. + public AtomDirection? Direction; // Specific dir. Null is all dirs. + public byte? Frame; //1-indexed. Specific frame. Null is all frames. + public DreamIconMovingMode Moving; + + public DreamIconObject(DreamResource rsc, DreamValue? state, DreamValue? dir, DreamValue? frame, DreamValue? moving) { - Resource = rsc; + if (rsc is ConsoleOutputResource) + { + throw new Exception("Invalid icon file"); + } + Description = DMIParser.ParseDMI(new MemoryStream(rsc.ResourceData)); + Icon = rsc.ResourcePath; - // TODO confirm BYOND behavior of invalid types + // TODO confirm BYOND behavior of invalid args for icon, dir, and frame if (state is not null && state.Value.TryGetValueAsString(out var iconState)) { @@ -39,38 +58,37 @@ public DreamIcon(DreamResource rsc, DreamValue? state, DreamValue? dir, DreamVal } else { - Direction = AtomDirection.South; + Direction = null; } if (frame is not null && frame.Value.TryGetValueAsInteger(out var frameVal)) { - Frame = frameVal; + //TODO: Figure out how many frames an icon can have and see if this needs to be bigger than a byte + Frame = Convert.ToByte(frameVal - 1); //1-indexed } else { - Frame = 0; + Frame = null; } - if (moving != DreamValue.Null) + if (moving is not null && moving != DreamValue.Null) { - if (moving is not null && (!moving.Value.TryGetValueAsInteger(out var movingVal) || movingVal != 0)) + if (moving.Value.TryGetValueAsInteger(out var movingVal) && movingVal == 0) { - Moving = 1; + Moving = DreamIconMovingMode.NonMovement; } else { - Moving = 0; + Moving = DreamIconMovingMode.Movement; } } else { - Moving = null; + Moving = DreamIconMovingMode.Both; } } } - public static Dictionary ObjectToDreamIcon = new(); - public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments) { base.OnObjectCreated(dreamObject, creationArguments); @@ -80,20 +98,18 @@ public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments DreamValue frame = creationArguments.GetArgument(3, "frame"); DreamValue moving = creationArguments.GetArgument(4, "moving"); - DreamIcon dreamIcon; + DreamIconObject dreamIconObject; if (icon.TryGetValueAsDreamObjectOfType(DreamPath.Icon, out DreamObject copyFrom)) { - dreamIcon = ObjectToDreamIcon[copyFrom]; + dreamIconObject = ObjectToDreamIcon[copyFrom]; } else if (icon.TryGetValueAsString(out string fileString)) { var ext = Path.GetExtension(fileString); switch (ext) // TODO implement other icon file types { case ".dmi": - dreamIcon = new DreamIcon(_rscMan.LoadResource(fileString), state, dir, frame, moving); - Stream dmiStream = new MemoryStream(dreamIcon.Resource.ResourceData); - dreamIcon.Description = DMIParser.ParseDMI(dmiStream); - dreamObject.SetVariableValue("icon", new DreamValue(dreamIcon.Resource.ResourcePath)); + dreamIconObject = new DreamIconObject(_rscMan.LoadResource(fileString), state, dir, frame, moving); + dreamObject.SetVariableValue("icon", new DreamValue(fileString)); break; case ".png": case ".jpg": @@ -107,13 +123,13 @@ public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments } else if (icon.TryGetValueAsDreamResource(out var rsc)) { - dreamIcon = new DreamIcon(rsc, state, dir, frame, moving); - dreamObject.SetVariableValue("icon", new DreamValue(dreamIcon.Resource.ResourcePath)); + dreamIconObject = new DreamIconObject(rsc, state, dir, frame, moving); + dreamObject.SetVariableValue("icon", new DreamValue(rsc.ResourcePath)); } else { throw new Exception("Invalid icon file " + icon); } - ObjectToDreamIcon.Add(dreamObject, dreamIcon); + ObjectToDreamIcon.Add(dreamObject, dreamIconObject); } diff --git a/OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs b/OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs index c0f4685c3e..d4920cbe9d 100644 --- a/OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs +++ b/OpenDreamRuntime/Procs/Native/DreamProcNativeIcon.cs @@ -6,16 +6,16 @@ namespace OpenDreamRuntime.Procs.Native { static class DreamProcNativeIcon { [DreamProc("Width")] public static DreamValue NativeProc_Width(DreamObject instance, DreamObject usr, DreamProcArguments arguments) { - DreamMetaObjectIcon.DreamIcon dreamIcon = DreamMetaObjectIcon.ObjectToDreamIcon[instance]; + DreamMetaObjectIcon.DreamIconObject dreamIconObject = DreamMetaObjectIcon.ObjectToDreamIcon[instance]; - return new DreamValue(dreamIcon.Description.Width); + return new DreamValue(dreamIconObject.Description.Width); } [DreamProc("Height")] public static DreamValue NativeProc_Height(DreamObject instance, DreamObject usr, DreamProcArguments arguments) { - DreamMetaObjectIcon.DreamIcon dreamIcon = DreamMetaObjectIcon.ObjectToDreamIcon[instance]; + DreamMetaObjectIcon.DreamIconObject dreamIconObject = DreamMetaObjectIcon.ObjectToDreamIcon[instance]; - return new DreamValue(dreamIcon.Description.Height); + return new DreamValue(dreamIconObject.Description.Height); } diff --git a/OpenDreamShared/Resources/DMIParser.cs b/OpenDreamShared/Resources/DMIParser.cs index dbee73025c..e81484c7bc 100644 --- a/OpenDreamShared/Resources/DMIParser.cs +++ b/OpenDreamShared/Resources/DMIParser.cs @@ -22,7 +22,7 @@ public static class DMIParser { AtomDirection.Northwest }; - public class ParsedDMIDescription { + public sealed class ParsedDMIDescription { public string Source; public float Version; public int Width, Height; @@ -55,7 +55,7 @@ public ParsedDMIState GetState(string stateName = null) { } } - public class ParsedDMIState { + public sealed class ParsedDMIState { public string Name; public Dictionary Directions = new(); public bool Loop = true; @@ -68,7 +68,7 @@ public ParsedDMIFrame[] GetFrames(AtomDirection direction = AtomDirection.South) } } - public class ParsedDMIFrame { + public sealed class ParsedDMIFrame { public int X, Y; public float Delay; } From 634c7bf838a147b348a44203e75f5aa60794a1ef Mon Sep 17 00:00:00 2001 From: ike709 Date: Tue, 10 May 2022 21:59:50 -0500 Subject: [PATCH 4/8] Update OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs Co-authored-by: wixoa --- OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs index 5e94607e0a..66b48fdc2f 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -33,7 +33,7 @@ public struct DreamIconObject { public DreamIconObject(DreamResource rsc, DreamValue? state, DreamValue? dir, DreamValue? frame, DreamValue? moving) { - if (rsc is ConsoleOutputResource) + if (Path.GetExtension(rsc.ResourcePath) != ".dmi") { throw new Exception("Invalid icon file"); } From e9c1c22174ec18481b751ac2eeccc06ad0c4da7e Mon Sep 17 00:00:00 2001 From: ike709 Date: Tue, 10 May 2022 21:59:57 -0500 Subject: [PATCH 5/8] Update OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs Co-authored-by: wixoa --- OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs index 66b48fdc2f..15881e0b90 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -109,7 +109,6 @@ public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments { case ".dmi": dreamIconObject = new DreamIconObject(_rscMan.LoadResource(fileString), state, dir, frame, moving); - dreamObject.SetVariableValue("icon", new DreamValue(fileString)); break; case ".png": case ".jpg": From b45ae9f19741809edbe0c4d5f5fff2191c90bce2 Mon Sep 17 00:00:00 2001 From: ike709 Date: Tue, 10 May 2022 22:00:01 -0500 Subject: [PATCH 6/8] Update OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs Co-authored-by: wixoa --- OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs index 15881e0b90..97956211ff 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -123,7 +123,6 @@ public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments } else if (icon.TryGetValueAsDreamResource(out var rsc)) { dreamIconObject = new DreamIconObject(rsc, state, dir, frame, moving); - dreamObject.SetVariableValue("icon", new DreamValue(rsc.ResourcePath)); } else { throw new Exception("Invalid icon file " + icon); } From 5ef8075a5cad638af8323ab377b86609376fbca9 Mon Sep 17 00:00:00 2001 From: ike709 Date: Tue, 10 May 2022 22:01:01 -0500 Subject: [PATCH 7/8] de-nullify --- .../Objects/MetaObjects/DreamMetaObjectIcon.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs index 97956211ff..1e5ca6f157 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -31,7 +31,7 @@ public struct DreamIconObject { public byte? Frame; //1-indexed. Specific frame. Null is all frames. public DreamIconMovingMode Moving; - public DreamIconObject(DreamResource rsc, DreamValue? state, DreamValue? dir, DreamValue? frame, DreamValue? moving) + public DreamIconObject(DreamResource rsc, DreamValue state, DreamValue dir, DreamValue frame, DreamValue moving) { if (Path.GetExtension(rsc.ResourcePath) != ".dmi") { @@ -43,7 +43,7 @@ public DreamIconObject(DreamResource rsc, DreamValue? state, DreamValue? dir, Dr // TODO confirm BYOND behavior of invalid args for icon, dir, and frame - if (state is not null && state.Value.TryGetValueAsString(out var iconState)) + if (state.Value.TryGetValueAsString(out var iconState)) { State = iconState; } @@ -52,7 +52,7 @@ public DreamIconObject(DreamResource rsc, DreamValue? state, DreamValue? dir, Dr State = null; } - if (dir is not null && dir.Value.TryGetValueAsInteger(out var dirVal) && (AtomDirection)dirVal != AtomDirection.None) + if (dir.Value.TryGetValueAsInteger(out var dirVal) && (AtomDirection)dirVal != AtomDirection.None) { Direction = (AtomDirection)dirVal; } @@ -61,7 +61,7 @@ public DreamIconObject(DreamResource rsc, DreamValue? state, DreamValue? dir, Dr Direction = null; } - if (frame is not null && frame.Value.TryGetValueAsInteger(out var frameVal)) + if (frame.Value.TryGetValueAsInteger(out var frameVal)) { //TODO: Figure out how many frames an icon can have and see if this needs to be bigger than a byte Frame = Convert.ToByte(frameVal - 1); //1-indexed @@ -71,7 +71,7 @@ public DreamIconObject(DreamResource rsc, DreamValue? state, DreamValue? dir, Dr Frame = null; } - if (moving is not null && moving != DreamValue.Null) + if (moving != DreamValue.Null) { if (moving.Value.TryGetValueAsInteger(out var movingVal) && movingVal == 0) { From ca6a530f64ce6bc500ce2bc0384d5b9efb8b1f66 Mon Sep 17 00:00:00 2001 From: ike709 Date: Tue, 10 May 2022 22:05:59 -0500 Subject: [PATCH 8/8] fix --- .../Objects/MetaObjects/DreamMetaObjectIcon.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs index 1e5ca6f157..6fb77976c4 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectIcon.cs @@ -43,7 +43,7 @@ public DreamIconObject(DreamResource rsc, DreamValue state, DreamValue dir, Drea // TODO confirm BYOND behavior of invalid args for icon, dir, and frame - if (state.Value.TryGetValueAsString(out var iconState)) + if (state.TryGetValueAsString(out var iconState)) { State = iconState; } @@ -52,7 +52,7 @@ public DreamIconObject(DreamResource rsc, DreamValue state, DreamValue dir, Drea State = null; } - if (dir.Value.TryGetValueAsInteger(out var dirVal) && (AtomDirection)dirVal != AtomDirection.None) + if (dir.TryGetValueAsInteger(out var dirVal) && (AtomDirection)dirVal != AtomDirection.None) { Direction = (AtomDirection)dirVal; } @@ -61,7 +61,7 @@ public DreamIconObject(DreamResource rsc, DreamValue state, DreamValue dir, Drea Direction = null; } - if (frame.Value.TryGetValueAsInteger(out var frameVal)) + if (frame.TryGetValueAsInteger(out var frameVal)) { //TODO: Figure out how many frames an icon can have and see if this needs to be bigger than a byte Frame = Convert.ToByte(frameVal - 1); //1-indexed @@ -73,7 +73,7 @@ public DreamIconObject(DreamResource rsc, DreamValue state, DreamValue dir, Drea if (moving != DreamValue.Null) { - if (moving.Value.TryGetValueAsInteger(out var movingVal) && movingVal == 0) + if (moving.TryGetValueAsInteger(out var movingVal) && movingVal == 0) { Moving = DreamIconMovingMode.NonMovement; }