From 605920365e717211f3d97d17c78b1d88271acaec Mon Sep 17 00:00:00 2001 From: moonheart08 Date: Sat, 10 Dec 2022 17:46:20 -0600 Subject: [PATCH 1/2] A! --- OpenDreamRuntime/AtomManager.cs | 2 +- OpenDreamRuntime/DreamManager.cs | 17 ++++++++++++---- OpenDreamRuntime/DreamThread.cs | 7 +++++++ OpenDreamRuntime/Objects/DreamIcon.cs | 2 +- OpenDreamRuntime/Objects/DreamObjectTree.cs | 15 +++++++++++++- .../MetaObjects/DreamMetaObjectAtom.cs | 1 + OpenDreamRuntime/Procs/AsyncNativeProc.cs | 15 +++++++++++--- OpenDreamRuntime/Procs/DMOpcodeHandlers.cs | 9 ++++----- OpenDreamRuntime/Procs/DMProc.cs | 20 ++++++++++++++++--- .../Procs/DebugAdapter/DreamDebugManager.cs | 2 +- OpenDreamRuntime/Procs/NativeProc.cs | 13 ++++++++++++ 11 files changed, 84 insertions(+), 19 deletions(-) diff --git a/OpenDreamRuntime/AtomManager.cs b/OpenDreamRuntime/AtomManager.cs index 90a1476f2c4..5626a1b86c1 100644 --- a/OpenDreamRuntime/AtomManager.cs +++ b/OpenDreamRuntime/AtomManager.cs @@ -172,7 +172,7 @@ public IconAppearance CreateAppearanceFromDefinition(DreamObjectDefinition def) } } - internal interface IAtomManager { + public interface IAtomManager { public Dictionary OverlaysListToAtom { get; } public Dictionary UnderlaysListToAtom { get; } diff --git a/OpenDreamRuntime/DreamManager.cs b/OpenDreamRuntime/DreamManager.cs index d6cbfc07b4b..fa7bf7e2482 100644 --- a/OpenDreamRuntime/DreamManager.cs +++ b/OpenDreamRuntime/DreamManager.cs @@ -4,6 +4,7 @@ using OpenDreamRuntime.Objects; using OpenDreamRuntime.Objects.MetaObjects; using OpenDreamRuntime.Procs; +using OpenDreamRuntime.Procs.DebugAdapter; using OpenDreamRuntime.Procs.Native; using OpenDreamRuntime.Resources; using OpenDreamShared; @@ -20,10 +21,13 @@ partial class DreamManager : IDreamManager { [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IDreamMapManager _dreamMapManager = default!; + [Dependency] private readonly IDreamDebugManager _dreamDebugManager = default!; [Dependency] private readonly IProcScheduler _procScheduler = default!; [Dependency] private readonly DreamResourceManager _dreamResourceManager = default!; + [Dependency] private readonly ITaskManager _taskManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; - public DreamObjectTree ObjectTree { get; private set; } = new(); + public DreamObjectTree ObjectTree { get; private set; } public DreamObject WorldInstance { get; private set; } public Exception? LastDMException { get; set; } @@ -44,22 +48,27 @@ partial class DreamManager : IDreamManager { //TODO This arg is awful and temporary until RT supports cvar overrides in unit tests public void PreInitialize(string jsonPath) { + InitializeConnectionManager(); _dreamResourceManager.Initialize(); if (!LoadJson(jsonPath)) { - IoCManager.Resolve().RunOnMainThread(() => { IoCManager.Resolve().Shutdown("Error while loading the compiled json. The opendream.json_path CVar may be empty, or points to a file that doesn't exist"); }); + _taskManager.RunOnMainThread(() => { IoCManager.Resolve().Shutdown("Error while loading the compiled json. The opendream.json_path CVar may be empty, or points to a file that doesn't exist"); }); } } public void StartWorld() { + ObjectTree = new(); // cheesy, sorts out a load order conflict. // It is now OK to call user code, like /New procs. Initialized = true; - InitializedTick = IoCManager.Resolve().CurTick; + InitializedTick = _gameTiming.CurTick; // Call global with waitfor=FALSE if (_compiledJson.GlobalInitProc is ProcDefinitionJson initProcDef) { - var globalInitProc = new DMProc(DreamPath.Root, "(global init)", null, null, null, initProcDef.Bytecode, initProcDef.MaxStackSize, initProcDef.Attributes, initProcDef.VerbName, initProcDef.VerbCategory, initProcDef.VerbDesc, initProcDef.Invisibility); + var globalInitProc = new DMProc(DreamPath.Root, "(global init)", null, null, null, initProcDef.Bytecode, + initProcDef.MaxStackSize, initProcDef.Attributes, initProcDef.VerbName, initProcDef.VerbCategory, + initProcDef.VerbDesc, initProcDef.Invisibility, this, _dreamMapManager, _dreamDebugManager, + _dreamResourceManager); globalInitProc.Spawn(WorldInstance, new DreamProcArguments()); } diff --git a/OpenDreamRuntime/DreamThread.cs b/OpenDreamRuntime/DreamThread.cs index e18b6229297..74e4ae9eb1e 100644 --- a/OpenDreamRuntime/DreamThread.cs +++ b/OpenDreamRuntime/DreamThread.cs @@ -3,6 +3,8 @@ using System.Threading.Tasks; using OpenDreamRuntime.Objects; using OpenDreamRuntime.Procs; +using OpenDreamRuntime.Procs.DebugAdapter; +using OpenDreamRuntime.Resources; using OpenDreamShared.Dream; using OpenDreamShared.Dream.Procs; @@ -31,6 +33,11 @@ public abstract class DreamProc { public string? VerbDesc { get; } public sbyte? Invisibility { get; } + internal abstract IDreamManager DreamManager { get; } + internal abstract IDreamMapManager DreamMapManager { get; } + internal abstract IDreamDebugManager DreamDebugManager { get; } + internal abstract DreamResourceManager DreamResourceManager { get; } + protected DreamProc(DreamPath owningType, string name, DreamProc superProc, ProcAttributes attributes, List? argumentNames, List? argumentTypes, string? verbName, string? verbCategory, string? verbDesc, sbyte? invisibility) { OwningType = owningType; Name = name; diff --git a/OpenDreamRuntime/Objects/DreamIcon.cs b/OpenDreamRuntime/Objects/DreamIcon.cs index 70ffce57ba2..555913a226e 100644 --- a/OpenDreamRuntime/Objects/DreamIcon.cs +++ b/OpenDreamRuntime/Objects/DreamIcon.cs @@ -302,7 +302,7 @@ public DreamIconOperationBlend(BlendType type, DreamValue blending, int xOffset, _xOffset = xOffset; _yOffset = yOffset; - var resourceManager = IoCManager.Resolve(); + var resourceManager = IoCManager.Resolve(); //TODO: Find a way to get rid of this! (var blendingResource, _blendingDescription) = DreamMetaObjectIcon.GetIconResourceAndDescription(resourceManager, blending); _blending = resourceManager.LoadImage(blendingResource); diff --git a/OpenDreamRuntime/Objects/DreamObjectTree.cs b/OpenDreamRuntime/Objects/DreamObjectTree.cs index ec07fbe3064..a98db3f39e3 100644 --- a/OpenDreamRuntime/Objects/DreamObjectTree.cs +++ b/OpenDreamRuntime/Objects/DreamObjectTree.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using OpenDreamRuntime.Objects.MetaObjects; using OpenDreamRuntime.Procs; +using OpenDreamRuntime.Procs.DebugAdapter; using OpenDreamRuntime.Resources; using OpenDreamShared.Dream; using OpenDreamShared.Dream.Procs; @@ -32,6 +33,15 @@ public TreeEntry(DreamPath path, int id) { private Dictionary _pathToType = new(); private Dictionary _globalProcIds; + [Dependency] internal readonly IDreamManager DreamManager = default!; + [Dependency] internal readonly IDreamMapManager DreamMapManager = default!; + [Dependency] internal readonly IDreamDebugManager DreamDebugManager = default!; + [Dependency] internal readonly DreamResourceManager DreamResourceManager = default!; + + public DreamObjectTree() { + IoCManager.InjectDependencies(this); + } + public void LoadJson(DreamCompiledJson json) { Strings = json.Strings; @@ -272,7 +282,10 @@ public DreamProc LoadProcJson(DreamTypeJson[] types, ProcDefinitionJson procDefi } DreamPath owningType = new DreamPath(types[procDefinition.OwningTypeId].Path); - var proc = new DMProc(owningType, procDefinition.Name, null, argumentNames, argumentTypes, bytecode, procDefinition.MaxStackSize, procDefinition.Attributes, procDefinition.VerbName, procDefinition.VerbCategory, procDefinition.VerbDesc, procDefinition.Invisibility); + var proc = new DMProc(owningType, procDefinition.Name, null, argumentNames, argumentTypes, bytecode, + procDefinition.MaxStackSize, procDefinition.Attributes, procDefinition.VerbName, + procDefinition.VerbCategory, procDefinition.VerbDesc, procDefinition.Invisibility, DreamManager, + DreamMapManager, DreamDebugManager, DreamResourceManager); proc.Source = procDefinition.Source; proc.Line = procDefinition.Line; return proc; diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectAtom.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectAtom.cs index baf851857f4..5476f8ac3e3 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectAtom.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectAtom.cs @@ -2,6 +2,7 @@ using OpenDreamRuntime.Rendering; using OpenDreamRuntime.Resources; using OpenDreamShared.Dream; +using Robust.Shared.Serialization.Manager; namespace OpenDreamRuntime.Objects.MetaObjects { sealed class DreamMetaObjectAtom : IDreamMetaObject { diff --git a/OpenDreamRuntime/Procs/AsyncNativeProc.cs b/OpenDreamRuntime/Procs/AsyncNativeProc.cs index fde5fa117fa..4e6ce204f38 100644 --- a/OpenDreamRuntime/Procs/AsyncNativeProc.cs +++ b/OpenDreamRuntime/Procs/AsyncNativeProc.cs @@ -1,6 +1,8 @@ using System.Text; using System.Threading.Tasks; using OpenDreamRuntime.Objects; +using OpenDreamRuntime.Procs.DebugAdapter; +using OpenDreamRuntime.Resources; using OpenDreamShared.Dream; using OpenDreamShared.Dream.Procs; @@ -151,15 +153,22 @@ public override void AppendStackFrame(StringBuilder builder) private Dictionary _defaultArgumentValues; private Func> _taskFunc; - private AsyncNativeProc() - : base(DreamPath.Root, "", null, ProcAttributes.DisableWaitfor, null, null, null, null, null, null) - {} + [Dependency] private readonly IDreamManager _dreamManager; + internal override IDreamManager DreamManager => _dreamManager; + [Dependency] private readonly IDreamMapManager _dreamMapManager; + internal override IDreamMapManager DreamMapManager => _dreamMapManager; + [Dependency] private readonly IDreamDebugManager _dreamDebugManager; + internal override IDreamDebugManager DreamDebugManager => _dreamDebugManager; + [Dependency] private readonly DreamResourceManager _dreamResourceManager; + internal override DreamResourceManager DreamResourceManager => _dreamResourceManager; public AsyncNativeProc(DreamPath owningType, string name, DreamProc superProc, List argumentNames, List argumentTypes, Dictionary defaultArgumentValues, Func> taskFunc, string? verbName, string? verbCategory, string? verbDesc, sbyte? invisibility) : base(owningType, name, superProc, ProcAttributes.None, argumentNames, argumentTypes, verbName, verbCategory, verbDesc, invisibility) { + IoCManager.InjectDependencies(this); // i gave up on passing in the iocs as args here due to access related issues, IDreamDebugManager is internal. _defaultArgumentValues = defaultArgumentValues; _taskFunc = taskFunc; + } public override ProcState CreateState(DreamThread thread, DreamObject src, DreamObject usr, DreamProcArguments arguments) diff --git a/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs b/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs index 9cfaa95ed15..30162b8ffc9 100644 --- a/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs +++ b/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs @@ -156,8 +156,7 @@ private static IEnumerable GetEnumerableContents(DreamValue value) { if (!loc.TryGetValueAsDreamObjectOfType(DreamPath.Turf, out var turf)) throw new Exception($"Invalid turf loc {loc}"); - IDreamMapManager dreamMapManager = IoCManager.Resolve(); - dreamMapManager.SetTurf(turf, objectDef, arguments); + state.Proc.DreamMapManager.SetTurf(turf, objectDef, arguments); state.Push(loc); return null; @@ -549,7 +548,7 @@ private static void HandleSuffixPronoun(ref StringBuilder formattedString, ReadO public static ProcStatus? PushResource(DMProcState state) { string resourcePath = state.ReadString(); - state.Push(new DreamValue(IoCManager.Resolve().LoadResource(resourcePath))); + state.Push(new DreamValue(state.Proc.DreamResourceManager.LoadResource(resourcePath))); return null; } @@ -1331,7 +1330,7 @@ private static void HandleSuffixPronoun(ref StringBuilder formattedString, ReadO var dllName = source.GetValueAsString(); var procName = state.Pop().GetValueAsString(); // DLL Invoke - var entryPoint = DllHelper.ResolveDllTarget(IoCManager.Resolve(), dllName, procName); + var entryPoint = DllHelper.ResolveDllTarget(state.Proc.DreamResourceManager, dllName, procName); Span argV = stackalloc nint[arguments.ArgumentCount]; argV.Fill(0); @@ -1742,7 +1741,7 @@ private static void PerformOutput(DreamValue a, DreamValue b) { if (x.TryGetValueAsInteger(out var xInt) && y.TryGetValueAsInteger(out var yInt) && z.TryGetValueAsInteger(out var zInt)) { - IoCManager.Resolve().TryGetTurfAt((xInt, yInt), zInt, out var turf); + state.Proc.DreamMapManager.TryGetTurfAt((xInt, yInt), zInt, out var turf); state.Push(new DreamValue(turf)); } else diff --git a/OpenDreamRuntime/Procs/DMProc.cs b/OpenDreamRuntime/Procs/DMProc.cs index 500f0e54350..2392c77850f 100644 --- a/OpenDreamRuntime/Procs/DMProc.cs +++ b/OpenDreamRuntime/Procs/DMProc.cs @@ -3,6 +3,7 @@ using OpenDreamRuntime.Objects; using OpenDreamRuntime.Objects.MetaObjects; using OpenDreamRuntime.Procs.DebugAdapter; +using OpenDreamRuntime.Resources; using OpenDreamShared.Dream; using OpenDreamShared.Dream.Procs; @@ -15,9 +16,22 @@ sealed class DMProc : DreamProc { public string? Source { get; set; } public int Line { get; set; } - public DMProc(DreamPath owningType, string name, DreamProc superProc, List argumentNames, List argumentTypes, byte[] bytecode, int maxStackSize, ProcAttributes attributes, string? verbName, string? verbCategory, string? verbDesc, sbyte? invisibility) + private readonly IDreamManager _dreamManager; + internal override IDreamManager DreamManager => _dreamManager; + private readonly IDreamMapManager _dreamMapManager; + internal override IDreamMapManager DreamMapManager => _dreamMapManager; + private readonly IDreamDebugManager _dreamDebugManager; + internal override IDreamDebugManager DreamDebugManager => _dreamDebugManager; + private readonly DreamResourceManager _dreamResourceManager; + internal override DreamResourceManager DreamResourceManager => _dreamResourceManager; + + public DMProc(DreamPath owningType, string name, DreamProc superProc, List argumentNames, List argumentTypes, byte[] bytecode, int maxStackSize, ProcAttributes attributes, string? verbName, string? verbCategory, string? verbDesc, sbyte? invisibility, IDreamManager dreamManager, IDreamMapManager dreamMapManager, IDreamDebugManager dreamDebugManager, DreamResourceManager dreamResourceManager) : base(owningType, name, superProc, attributes, argumentNames, argumentTypes, verbName, verbCategory, verbDesc, invisibility) { + _dreamManager = dreamManager; + _dreamMapManager = dreamMapManager; + _dreamDebugManager = dreamDebugManager; + _dreamResourceManager = dreamResourceManager; Bytecode = bytecode; _maxStackSize = maxStackSize; } @@ -140,8 +154,8 @@ sealed class DMProcState : ProcState }; #endregion - public readonly IDreamManager DreamManager = IoCManager.Resolve(); - public readonly IDreamDebugManager DebugManager = IoCManager.Resolve(); + public IDreamManager DreamManager => _proc.DreamManager; + public IDreamDebugManager DebugManager => _proc.DreamDebugManager; /// This stores our 'src' value. May be null! public DreamObject? Instance; diff --git a/OpenDreamRuntime/Procs/DebugAdapter/DreamDebugManager.cs b/OpenDreamRuntime/Procs/DebugAdapter/DreamDebugManager.cs index 5431661809e..1e7962713df 100644 --- a/OpenDreamRuntime/Procs/DebugAdapter/DreamDebugManager.cs +++ b/OpenDreamRuntime/Procs/DebugAdapter/DreamDebugManager.cs @@ -434,7 +434,7 @@ private void HandleRequestVariables(DebugAdapterClient client, RequestVariables } } -interface IDreamDebugManager { +internal interface IDreamDebugManager { bool Stopped { get; } public void Initialize(int port); diff --git a/OpenDreamRuntime/Procs/NativeProc.cs b/OpenDreamRuntime/Procs/NativeProc.cs index b19e53fda10..7e772578d90 100644 --- a/OpenDreamRuntime/Procs/NativeProc.cs +++ b/OpenDreamRuntime/Procs/NativeProc.cs @@ -1,6 +1,8 @@ using System.Reflection; using System.Text; using OpenDreamRuntime.Objects; +using OpenDreamRuntime.Procs.DebugAdapter; +using OpenDreamRuntime.Resources; using OpenDreamShared.Dream; using OpenDreamShared.Dream.Procs; @@ -69,9 +71,20 @@ public override void AppendStackFrame(StringBuilder builder) private Dictionary _defaultArgumentValues; public HandlerFn Handler { get; } + [Dependency] private readonly IDreamManager _dreamManager; + internal override IDreamManager DreamManager => _dreamManager; + [Dependency] private readonly IDreamMapManager _dreamMapManager; + internal override IDreamMapManager DreamMapManager => _dreamMapManager; + [Dependency] private readonly IDreamDebugManager _dreamDebugManager; + internal override IDreamDebugManager DreamDebugManager => _dreamDebugManager; + [Dependency] private readonly DreamResourceManager _dreamResourceManager; + internal override DreamResourceManager DreamResourceManager => _dreamResourceManager; + + public NativeProc(DreamPath owningType, string name, DreamProc superProc, List argumentNames, List argumentTypes, Dictionary defaultArgumentValues, HandlerFn handler, string? verbName, string? verbCategory, string? verbDesc, sbyte? invisibility) : base(owningType, name, superProc, ProcAttributes.None, argumentNames, argumentTypes, verbName, verbCategory, verbDesc, invisibility) { + IoCManager.InjectDependencies(this); // i gave up on passing in the iocs as args here due to access related issues, IDreamDebugManager is internal. _defaultArgumentValues = defaultArgumentValues; Handler = handler; } From a74664665e81c6c4dc45450f07902c206ce0c18f Mon Sep 17 00:00:00 2001 From: moonheart08 Date: Sat, 10 Dec 2022 17:59:02 -0600 Subject: [PATCH 2/2] fixe --- OpenDreamRuntime/DreamManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenDreamRuntime/DreamManager.cs b/OpenDreamRuntime/DreamManager.cs index fa7bf7e2482..1a7d34177c1 100644 --- a/OpenDreamRuntime/DreamManager.cs +++ b/OpenDreamRuntime/DreamManager.cs @@ -48,7 +48,7 @@ partial class DreamManager : IDreamManager { //TODO This arg is awful and temporary until RT supports cvar overrides in unit tests public void PreInitialize(string jsonPath) { - + ObjectTree = new(); // cheesy, sorts out a load order conflict. InitializeConnectionManager(); _dreamResourceManager.Initialize(); @@ -58,7 +58,6 @@ public void PreInitialize(string jsonPath) { } public void StartWorld() { - ObjectTree = new(); // cheesy, sorts out a load order conflict. // It is now OK to call user code, like /New procs. Initialized = true; InitializedTick = _gameTiming.CurTick;