diff --git a/BizHawk.Client.Common/Api/APISubsetContainer.cs b/BizHawk.Client.Common/Api/APISubsetContainer.cs index 50c9a89306..e911754846 100644 --- a/BizHawk.Client.Common/Api/APISubsetContainer.cs +++ b/BizHawk.Client.Common/Api/APISubsetContainer.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace BizHawk.Client.Common { - public sealed class APISubsetContainer : IApiContainer + public class APISubsetContainer : IApiContainer { public Dictionary Libraries { get; set; } diff --git a/BizHawk.Client.EmuHawk/Api/ApiContainer.cs b/BizHawk.Client.EmuHawk/Api/ApiContainer.cs index 67ae26a448..39437d60d2 100644 --- a/BizHawk.Client.EmuHawk/Api/ApiContainer.cs +++ b/BizHawk.Client.EmuHawk/Api/ApiContainer.cs @@ -1,33 +1,18 @@ using System; using System.Collections.Generic; -using System.Reflection; -using System.Linq; -using BizHawk.Client.ApiHawk; using BizHawk.Client.Common; namespace BizHawk.Client.EmuHawk { - public sealed class ApiContainer : IApiContainer + public sealed class ApiContainer : APISubsetContainer { - public IComm Comm => (IComm)Libraries[typeof(CommApi)]; - public IEmu Emu => (IEmu)Libraries[typeof(EmuApi)]; - public IGameInfo GameInfo => (IGameInfo)Libraries[typeof(GameInfoApi)]; - public IGui Gui => (IGui)Libraries[typeof(GuiApi)]; - public IInput Input => (IInput)Libraries[typeof(InputApi)]; - public IJoypad Joypad => (IJoypad)Libraries[typeof(JoypadApi)]; - public IMem Mem => (IMem)Libraries[typeof(MemApi)]; - public IMemEvents MemEvents => (IMemEvents)Libraries[typeof(MemEventsApi)]; - public IMemorySaveState MemorySaveState => (IMemorySaveState)Libraries[typeof(MemorySaveStateApi)]; - public IInputMovie Movie => (IInputMovie)Libraries[typeof(MovieApi)]; - public ISaveState SaveState => (ISaveState)Libraries[typeof(SaveStateApi)]; - public ISql Sql => (ISql)Libraries[typeof(SqlApi)]; - public ITool Tool => (ITool)Libraries[typeof(ToolApi)]; - public IUserData UserData => (IUserData)Libraries[typeof(UserDataApi)]; - public Dictionary Libraries { get; set; } - public ApiContainer(Dictionary libs) - { - Libraries = libs; - } + public IComm Comm => (IComm) Libraries[typeof(CommApi)]; + public IGui Gui => (IGui) Libraries[typeof(GuiApi)]; + public IInput Input => (IInput) Libraries[typeof(InputApi)]; + public ISaveState SaveState => (ISaveState) Libraries[typeof(SaveStateApi)]; + public ITool Tool => (ITool) Libraries[typeof(ToolApi)]; + + public ApiContainer(Dictionary libs) : base(libs) {} } } diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj index 9295779bce..0dd94a0568 100644 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj @@ -917,6 +917,7 @@ HexFind.cs + diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/DelegatingLuaLibraryEmu.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/DelegatingLuaLibraryEmu.cs new file mode 100644 index 0000000000..25c9a00605 --- /dev/null +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/DelegatingLuaLibraryEmu.cs @@ -0,0 +1,18 @@ +using System; + +using NLua; + +using BizHawk.Client.Common; + +namespace BizHawk.Client.EmuHawk +{ + /// As , but also includes EmuHawk APIs via a . + public abstract class DelegatingLuaLibraryEmu : DelegatingLuaLibrary + { + protected DelegatingLuaLibraryEmu(Lua lua) : base(lua) {} + + protected DelegatingLuaLibraryEmu(Lua lua, Action logOutputCallback) : base(lua, logOutputCallback) {} + + public new ApiContainer APIs { protected get; set; } + } +} diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs index f89149e2ae..d4be3dfe35 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs @@ -24,13 +24,13 @@ namespace BizHawk.Client.EmuHawk public EmuLuaLibrary(IEmulatorServiceProvider serviceProvider) : this() { - static APISubsetContainer InitApiHawkContainerInstance(IEmulatorServiceProvider sp, Action logCallback) + static ApiContainer InitApiHawkContainerInstance(IEmulatorServiceProvider sp, Action logCallback) { var ctorParamTypes = new[] { typeof(Action) }; var ctorParams = new object[] { logCallback }; var libDict = new Dictionary(); - foreach (var api in Assembly.Load("BizHawk.Client.ApiHawk").GetTypes() - .Concat(Assembly.GetAssembly(typeof(APISubsetContainer)).GetTypes()) + foreach (var api in Assembly.GetAssembly(typeof(EmuApi)).GetTypes() + .Concat(Assembly.GetAssembly(typeof(ToolApi)).GetTypes()) .Where(t => t.IsSealed && typeof(IExternalApi).IsAssignableFrom(t) && ServiceInjector.IsAvailable(sp, t))) { var ctorWithParams = api.GetConstructor(ctorParamTypes); @@ -38,7 +38,7 @@ namespace BizHawk.Client.EmuHawk ServiceInjector.UpdateServices(sp, instance); libDict.Add(api, instance); } - return ApiHawkContainerInstance = new APISubsetContainer(libDict); + return ApiHawkContainerInstance = new ApiContainer(libDict); } LuaWait = new AutoResetEvent(false); @@ -73,8 +73,11 @@ namespace BizHawk.Client.EmuHawk instance.LuaRegister(lib, Docs); instance.LogOutputCallback = ConsoleLuaLibrary.LogOutput; ServiceInjector.UpdateServices(serviceProvider, instance); - if (instance is DelegatingLuaLibrary dlgInstance) - dlgInstance.APIs = ApiHawkContainerInstance ?? InitApiHawkContainerInstance(serviceProvider, ConsoleLuaLibrary.LogOutput); + + ApiHawkContainerInstance ??= InitApiHawkContainerInstance(serviceProvider, ConsoleLuaLibrary.LogOutput); + if (instance is DelegatingLuaLibraryEmu dlgInstanceEmu) dlgInstanceEmu.APIs = ApiHawkContainerInstance; // this is necessary as the property has the `new` modifier + else if (instance is DelegatingLuaLibrary dlgInstance) dlgInstance.APIs = ApiHawkContainerInstance; + Libraries.Add(lib, instance); } } @@ -98,7 +101,7 @@ namespace BizHawk.Client.EmuHawk } /// lazily instantiated - private static APISubsetContainer ApiHawkContainerInstance; + private static ApiContainer ApiHawkContainerInstance; private Lua _lua = new Lua(); private Lua _currThread;