diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs index f2dc991316..50c3752695 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Bit.cs @@ -3,7 +3,7 @@ using LuaInterface; namespace BizHawk.Client.Common { - public class BitLuaLibrary : LuaLibraryBase + public sealed class BitLuaLibrary : LuaLibraryBase { public BitLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs index 73f5f31343..51df768828 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs @@ -12,7 +12,7 @@ using LuaInterface; namespace BizHawk.Client.Common { - public class EmulatorLuaLibrary : LuaLibraryBase + public sealed class EmulatorLuaLibrary : LuaLibraryBase { public Action FrameAdvanceCallback { get; set; } public Action YieldCallback { get; set; } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs index 6477c91d16..f4ce4b6e3a 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs @@ -5,7 +5,7 @@ using LuaInterface; namespace BizHawk.Client.Common { - public class EventLuaLibrary : LuaLibraryBase + public sealed class EventLuaLibrary : LuaLibraryBase { private readonly LuaFunctionList _luaFunctions = new LuaFunctionList(); diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.GameInfo.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.GameInfo.cs index f1aea71516..a18438613c 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.GameInfo.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.GameInfo.cs @@ -3,7 +3,7 @@ using LuaInterface; namespace BizHawk.Client.Common { - public class GameInfoLuaLibrary : LuaLibraryBase + public sealed class GameInfoLuaLibrary : LuaLibraryBase { public GameInfoLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs index a72f3508ab..cca705ca39 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs @@ -3,7 +3,7 @@ using LuaInterface; namespace BizHawk.Client.Common { - public class JoypadLuaLibrary : LuaLibraryBase + public sealed class JoypadLuaLibrary : LuaLibraryBase { public JoypadLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.MainMemory.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.MainMemory.cs index abf0c81712..b39f49e7c7 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.MainMemory.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.MainMemory.cs @@ -4,7 +4,7 @@ using BizHawk.Emulation.Common; namespace BizHawk.Client.Common { - public class MainMemoryLuaLibrary : LuaMemoryBase + public sealed class MainMemoryLuaLibrary : LuaMemoryBase { public MainMemoryLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs index 49a33a869b..0ca02b37f9 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs @@ -4,7 +4,7 @@ using BizHawk.Emulation.Common; namespace BizHawk.Client.Common { - public class MemoryLuaLibrary : LuaMemoryBase + public sealed class MemoryLuaLibrary : LuaMemoryBase { private int _currentMemoryDomain; // Main memory by default probably (index 0 is currently always main memory but may never be) diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Movie.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Movie.cs index 757127c13f..a11b66297d 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Movie.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Movie.cs @@ -3,7 +3,7 @@ using LuaInterface; namespace BizHawk.Client.Common { - public class MovieLuaLibrary : LuaLibraryBase + public sealed class MovieLuaLibrary : LuaLibraryBase { public MovieLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.NES.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.NES.cs index efb7c9a65c..85c7b70370 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.NES.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.NES.cs @@ -8,7 +8,7 @@ using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES; namespace BizHawk.Client.Common { - public class NesLuaLibrary : LuaLibraryBase + public sealed class NesLuaLibrary : LuaLibraryBase { // TODO: // perhaps with the new core config system, one could diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.SNES.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.SNES.cs index 839803df52..ac52a50964 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.SNES.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.SNES.cs @@ -4,7 +4,7 @@ using BizHawk.Emulation.Cores.Nintendo.SNES; namespace BizHawk.Client.Common { - public class SnesLuaLibrary : LuaLibraryBase + public sealed class SnesLuaLibrary : LuaLibraryBase { public SnesLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.String.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.String.cs index aaa6c26ac3..5cef5b4c7d 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.String.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.String.cs @@ -5,7 +5,7 @@ using LuaInterface; namespace BizHawk.Client.Common { - public class StringLuaLibrary : LuaLibraryBase + public sealed class StringLuaLibrary : LuaLibraryBase { public override string Name { get { return "bizstring"; } } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs index 0145490b9e..5a2397ceb4 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs @@ -6,7 +6,7 @@ using BizHawk.Client.Common; namespace BizHawk.Client.EmuHawk { - public class EmuHawkLuaLibrary : LuaLibraryBase + public sealed class EmuHawkLuaLibrary : LuaLibraryBase { private readonly Dictionary _filterMappings = new Dictionary { diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Console.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Console.cs index d80335d3ed..1697ed7f0f 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Console.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Console.cs @@ -8,7 +8,7 @@ using LuaInterface; namespace BizHawk.Client.EmuHawk { - public class ConsoleLuaLibrary : LuaLibraryBase + public sealed class ConsoleLuaLibrary : LuaLibraryBase { public ConsoleLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs index 0019ee2b48..5d5355d00d 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs @@ -9,7 +9,7 @@ using LuaInterface; namespace BizHawk.Client.EmuHawk { - public class FormsLuaLibrary : LuaLibraryBase + public sealed class FormsLuaLibrary : LuaLibraryBase { public FormsLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs index 1747fd5397..eaf9dca757 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs @@ -8,7 +8,7 @@ using LuaInterface; namespace BizHawk.Client.EmuHawk { - public class GuiLuaLibrary : LuaLibraryBase + public sealed class GuiLuaLibrary : LuaLibraryBase { public GuiLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Input.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Input.cs index d333dfe278..0773d787fb 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Input.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Input.cs @@ -7,7 +7,7 @@ using LuaInterface; namespace BizHawk.Client.EmuHawk { - public class InputLuaLibrary : LuaLibraryBase + public sealed class InputLuaLibrary : LuaLibraryBase { public InputLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Savestate.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Savestate.cs index a6c7b2bfae..ce23c97d81 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Savestate.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Savestate.cs @@ -6,7 +6,7 @@ using BizHawk.Client.Common; namespace BizHawk.Client.EmuHawk { - public class SavestateLuaLibrary : LuaLibraryBase + public sealed class SavestateLuaLibrary : LuaLibraryBase { public SavestateLuaLibrary(Lua lua) : base(lua) { } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs index 56c54428e9..9ed5c0ce85 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs @@ -1,16 +1,17 @@ using System; +using System.Linq; using System.Threading; using BizHawk.Client.Common; using LuaInterface; +using System.Reflection; +using System.Collections.Generic; namespace BizHawk.Client.EmuHawk { public class EmuLuaLibrary { - private readonly FormsLuaLibrary _formsLibrary; - private readonly EventLuaLibrary _eventLibrary; - private readonly GuiLuaLibrary _guiLibrary; + private readonly Dictionary Libraries = new Dictionary(); private readonly LuaConsole _caller; private Lua _lua = new Lua(); @@ -21,6 +22,26 @@ namespace BizHawk.Client.EmuHawk Docs = new LuaDocumentation(); } + private FormsLuaLibrary FormsLibrary + { + get { return (FormsLuaLibrary)Libraries[typeof(FormsLuaLibrary)]; } + } + + private EventLuaLibrary EventsLibrary + { + get { return (EventLuaLibrary)Libraries[typeof(EventLuaLibrary)]; } + } + + private EmulatorLuaLibrary EmulatorLuaLibrary + { + get { return (EmulatorLuaLibrary)Libraries[typeof(EmulatorLuaLibrary)]; } + } + + public GuiLuaLibrary GuiLibrary + { + get { return (GuiLuaLibrary)Libraries[typeof(GuiLuaLibrary)]; } + } + public EmuLuaLibrary(LuaConsole passed) : this() { @@ -29,44 +50,32 @@ namespace BizHawk.Client.EmuHawk _caller = passed.Get(); // Register lua libraries - + var libs = Assembly + .Load("BizHawk.Client.Common") + .GetTypes() + .Where(t => typeof(LuaLibraryBase).IsAssignableFrom(t)) + .Where(t => t.IsSealed) + .ToList(); + + libs.AddRange( + Assembly + .GetAssembly(typeof(EmuLuaLibrary)) + .GetTypes() + .Where(t => typeof(LuaLibraryBase).IsAssignableFrom(t)) + .Where(t => t.IsSealed) + ); + + foreach (var lib in libs) + { + var instance = (LuaLibraryBase)Activator.CreateInstance(lib, _lua); + instance.LuaRegister(Docs); + Libraries.Add(lib, instance); + } + _lua.RegisterFunction("print", this, GetType().GetMethod("Print")); - // TODO: Search the assemblies for objects that inherit LuaBaseLibrary, and instantiate and register them and put them into an array, - // rather than call them all by name here - - _formsLibrary = new FormsLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput); - _formsLibrary.LuaRegister(Docs); - - _eventLibrary = new EventLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput); - _eventLibrary.LuaRegister(Docs); - - _guiLibrary = new GuiLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput); - _guiLibrary.LuaRegister(Docs); - - new BitLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new EmuHawkLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new ConsoleLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - - var emuLib = new EmulatorLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput) - { - FrameAdvanceCallback = Frameadvance, - YieldCallback = EmuYield - }; - - emuLib.LuaRegister(Docs); - - new InputLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new JoypadLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new MemoryLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new MainMemoryLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - - new MovieLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new NesLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new SavestateLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new SnesLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new StringLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); - new GameInfoLuaLibrary(_lua, ConsoleLuaLibrary.LogOutput).LuaRegister(Docs); + EmulatorLuaLibrary.FrameAdvanceCallback = Frameadvance; + EmulatorLuaLibrary.YieldCallback = EmuYield; Docs.Sort(); } @@ -76,50 +85,45 @@ namespace BizHawk.Client.EmuHawk public EventWaitHandle LuaWait { get; private set; } public bool FrameAdvanceRequested { get; private set; } - public GuiLuaLibrary GuiLibrary - { - get { return _guiLibrary; } - } - public LuaFunctionList RegisteredFunctions { - get { return _eventLibrary.RegisteredFunctions; } + get { return EventsLibrary.RegisteredFunctions; } } public void WindowClosed(IntPtr handle) { - _formsLibrary.WindowClosed(handle); + FormsLibrary.WindowClosed(handle); } public void CallSaveStateEvent(string name) { - _eventLibrary.CallSaveStateEvent(name); + EventsLibrary.CallSaveStateEvent(name); } public void CallLoadStateEvent(string name) { - _eventLibrary.CallLoadStateEvent(name); + EventsLibrary.CallLoadStateEvent(name); } public void CallFrameBeforeEvent() { - _eventLibrary.CallFrameBeforeEvent(); + EventsLibrary.CallFrameBeforeEvent(); } public void CallFrameAfterEvent() { - _eventLibrary.CallFrameAfterEvent(); + EventsLibrary.CallFrameAfterEvent(); } public void CallExitEvent(Lua thread) { - _eventLibrary.CallExitEvent(thread); + EventsLibrary.CallExitEvent(thread); } public void Close() { _lua = new Lua(); - _guiLibrary.Dispose(); + GuiLibrary.Dispose(); } public Lua SpawnCoroutine(string file) @@ -132,7 +136,7 @@ namespace BizHawk.Client.EmuHawk public ResumeResult ResumeScript(Lua script) { - _eventLibrary.CurrentThread = script; + EventsLibrary.CurrentThread = script; _currThread = script; var execResult = script.Resume(0); _currThread = null;