From 1042f746f4b2d470b72fb9d98243d72ff04f44be Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Sat, 16 Nov 2019 23:27:38 +1000 Subject: [PATCH] Migrate JoypadLuaLibrary to ApiHawk delegation `joypad.getimmediate()` now returns float controls as well as bools --- .../Api/Classes/JoypadApi.cs | 12 +- .../lua/EmuLuaLibrary.Joypad.cs | 161 ++---------------- 2 files changed, 28 insertions(+), 145 deletions(-) diff --git a/BizHawk.Client.Common/Api/Classes/JoypadApi.cs b/BizHawk.Client.Common/Api/Classes/JoypadApi.cs index fc55cc59b1..e1bd636566 100644 --- a/BizHawk.Client.Common/Api/Classes/JoypadApi.cs +++ b/BizHawk.Client.Common/Api/Classes/JoypadApi.cs @@ -7,6 +7,15 @@ namespace BizHawk.Client.Common { public sealed class JoypadApi : IJoypad { + public JoypadApi(Action logCallback) + { + LogCallback = logCallback; + } + + public JoypadApi() : this(Console.WriteLine) {} + + private readonly Action LogCallback; + public Dictionary Get(int? controller = null) { var buttons = new Dictionary(); @@ -42,7 +51,6 @@ namespace BizHawk.Client.Common return buttons; } - // TODO: what about float controls? public Dictionary GetImmediate() { var buttons = new Dictionary(); @@ -79,7 +87,7 @@ namespace BizHawk.Client.Common } catch (Exception) { - Console.WriteLine($"invalid mnemonic string: {inputLogEntry}"); + LogCallback($"invalid mnemonic string: {inputLogEntry}"); } } diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs index 3588c8fff8..cdb69c37f0 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Joypad.cs @@ -1,10 +1,12 @@ using System; +using System.Collections.Generic; + using NLua; // ReSharper disable UnusedMember.Global namespace BizHawk.Client.Common { - public sealed class JoypadLuaLibrary : LuaLibraryBase + public sealed class JoypadLuaLibrary : DelegatingLuaLibrary { public JoypadLuaLibrary(Lua lua) : base(lua) { } @@ -18,169 +20,42 @@ namespace BizHawk.Client.Common [LuaMethod("get", "returns a lua table of the controller buttons pressed. If supplied, it will only return a table of buttons for the given controller")] public LuaTable Get(int? controller = null) { - var buttons = Lua.NewTable(); - var adapter = Global.AutofireStickyXORAdapter; - foreach (var button in adapter.Source.Definition.BoolButtons) - { - if (!controller.HasValue) - { - buttons[button] = adapter.IsPressed(button); - } - else if (button.Length >= 3 && button.Substring(0, 2) == $"P{controller}") - { - buttons[button.Substring(3)] = adapter.IsPressed($"P{controller} {button.Substring(3)}"); - } - } - - foreach (var button in adapter.Source.Definition.FloatControls) - { - if (controller == null) - { - buttons[button] = adapter.GetFloat(button); - } - else if (button.Length >= 3 && button.Substring(0, 2) == $"P{controller}") - { - buttons[button.Substring(3)] = adapter.GetFloat($"P{controller} {button.Substring(3)}"); - } - } - - buttons["clear"] = null; - buttons["getluafunctionslist"] = null; - buttons["output"] = null; - - return buttons; + var result = APIs.Joypad.Get(controller); + var table = Lua.NewTable(); + foreach (var kvp in result) table[kvp.Key] = kvp.Value; + return table; } - // TODO: what about float controls? [LuaMethodExample("local nljoyget = joypad.getimmediate( );")] [LuaMethod("getimmediate", "returns a lua table of any controller buttons currently pressed by the user")] public LuaTable GetImmediate() { - var buttons = Lua.NewTable(); - foreach (var button in Global.ActiveController.Definition.BoolButtons) - { - buttons[button] = Global.ActiveController.IsPressed(button); - } - - return buttons; + var result = APIs.Joypad.GetImmediate(); + var table = Lua.NewTable(); + foreach (var kvp in result) table[kvp.Key] = kvp.Value; + return table; } [LuaMethodExample("joypad.setfrommnemonicstr( \"| 0, 0, 0, 100,...R..B....|\" );")] [LuaMethod("setfrommnemonicstr", "sets the given buttons to their provided values for the current frame, string will be interpretted the same way an entry from a movie input log would be")] - public void SetFromMnemonicStr(string inputLogEntry) - { - try - { - var lg = Global.MovieSession.MovieControllerInstance(); - lg.SetControllersAsMnemonic(inputLogEntry); - - foreach (var button in lg.Definition.BoolButtons) - { - Global.LuaAndAdaptor.SetButton(button, lg.IsPressed(button)); - } - - foreach (var floatButton in lg.Definition.FloatControls) - { - Global.LuaAndAdaptor.SetFloat(floatButton, lg.GetFloat(floatButton)); - } - } - catch (Exception) - { - Log($"invalid mnemonic string: {inputLogEntry}"); - } - } + public void SetFromMnemonicStr(string inputLogEntry) => APIs.Joypad.SetFromMnemonicStr(inputLogEntry); [LuaMethodExample("joypad.set( { [\"Left\"] = true, [ \"A\" ] = true, [ \"B\" ] = true } );")] [LuaMethod("set", "sets the given buttons to their provided values for the current frame")] public void Set(LuaTable buttons, int? controller = null) { - try - { - foreach (var button in buttons.Keys) - { - var invert = false; - bool? theValue; - var theValueStr = buttons[button].ToString(); - - if (!string.IsNullOrWhiteSpace(theValueStr)) - { - if (theValueStr.ToLower() == "false") - { - theValue = false; - } - else if (theValueStr.ToLower() == "true") - { - theValue = true; - } - else - { - invert = true; - theValue = null; - } - } - else - { - theValue = null; - } - - var toPress = button.ToString(); - if (controller.HasValue) - { - toPress = $"P{controller} {button}"; - } - - if (!invert) - { - if (theValue.HasValue) // Force - { - Global.LuaAndAdaptor.SetButton(toPress, theValue.Value); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - else // Unset - { - Global.LuaAndAdaptor.UnSet(toPress); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - } - else // Inverse - { - Global.LuaAndAdaptor.SetInverse(toPress); - Global.ActiveController.Overrides(Global.LuaAndAdaptor); - } - } - } - catch - { - /*Eat it*/ - } + var dict = new Dictionary(); + foreach (var k in buttons.Keys) dict[k.ToString()] = (bool) buttons[k]; + APIs.Joypad.Set(dict, controller); } [LuaMethodExample("joypad.setanalog( { [ \"Tilt X\" ] = true, [ \"Tilt Y\" ] = false } );")] [LuaMethod("setanalog", "sets the given analog controls to their provided values for the current frame. Note that unlike set() there is only the logic of overriding with the given value.")] public void SetAnalog(LuaTable controls, object controller = null) { - try - { - foreach (var name in controls.Keys) - { - var theValueStr = controls[name].ToString(); - float? theValue = null; - - if (!string.IsNullOrWhiteSpace(theValueStr)) - { - if (float.TryParse(theValueStr, out var f)) - { - theValue = f; - } - } - - Global.StickyXORAdapter.SetFloat(controller == null ? name.ToString() : $"P{controller} {name}", theValue); - } - } - catch - { - /*Eat it*/ - } + var dict = new Dictionary(); + foreach (var k in controls.Keys) dict[k.ToString()] = (float) controls[k]; + APIs.Joypad.SetAnalog(dict, controller); } } }