diff --git a/BizHawk.MultiClient/Global.cs b/BizHawk.MultiClient/Global.cs index 8a372800cf..52613cae5e 100644 --- a/BizHawk.MultiClient/Global.cs +++ b/BizHawk.MultiClient/Global.cs @@ -51,6 +51,8 @@ namespace BizHawk.MultiClient /// public static StickyXORAdapter StickyXORAdapter = new StickyXORAdapter(); + public static ClickyVirtualPadController ClickyVirtualPadController = new ClickyVirtualPadController(); + public static Controller ClientControls; public static string GetOutputControllersAsMnemonic() diff --git a/BizHawk.MultiClient/Input/ControllerBinding.cs b/BizHawk.MultiClient/Input/ControllerBinding.cs index ea3092ea62..09757039f2 100644 --- a/BizHawk.MultiClient/Input/ControllerBinding.cs +++ b/BizHawk.MultiClient/Input/ControllerBinding.cs @@ -29,7 +29,9 @@ namespace BizHawk.MultiClient return ret; } - //uses the bindings to latch our own logical button state from the source controller's button state (which are assumed to be the physical side of the binding) + /// + /// uses the bindings to latch our own logical button state from the source controller's button state (which are assumed to be the physical side of the binding) + /// public void LatchFromPhysical(IController controller) { foreach (var kvp in bindings) @@ -43,6 +45,19 @@ namespace BizHawk.MultiClient } } + + /// + /// merges pressed logical buttons from the supplied controller, effectively ORing it with the current state + /// + public void OR_FromLogical(IController controller) + { + foreach (string button in type.BoolButtons) + { + if (controller.IsPressed(button)) + stickyButtons[button] = true; + } + } + public Controller(ControllerDefinition definition) { type = definition; diff --git a/BizHawk.MultiClient/MainForm.cs b/BizHawk.MultiClient/MainForm.cs index 5c34427d37..ef4282f1e6 100644 --- a/BizHawk.MultiClient/MainForm.cs +++ b/BizHawk.MultiClient/MainForm.cs @@ -295,6 +295,8 @@ namespace BizHawk.MultiClient ProcessInput(); Global.ClientControls.LatchFromPhysical(Global.HotkeyCoalescer); Global.ActiveController.LatchFromPhysical(Global.ControllerInputCoalescer); + Global.ActiveController.OR_FromLogical(Global.ClickyVirtualPadController); + Global.ClickyVirtualPadController.FrameTick(); StepRunLoop_Core(); diff --git a/BizHawk.MultiClient/TI83tools/TI83KeyPad.cs b/BizHawk.MultiClient/TI83tools/TI83KeyPad.cs index 471bce1880..5a995cb2a6 100644 --- a/BizHawk.MultiClient/TI83tools/TI83KeyPad.cs +++ b/BizHawk.MultiClient/TI83tools/TI83KeyPad.cs @@ -123,247 +123,247 @@ namespace BizHawk.MultiClient private void button42_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("ENTER"); + Global.ClickyVirtualPadController.Click("ENTER"); } private void button43_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("DASH"); + Global.ClickyVirtualPadController.Click("DASH"); } private void button39_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("2"); + Global.ClickyVirtualPadController.Click("2"); } private void ONE_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("1"); + Global.ClickyVirtualPadController.Click("1"); } private void THREE_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("3"); + Global.ClickyVirtualPadController.Click("3"); } private void FOUR_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("4"); + Global.ClickyVirtualPadController.Click("4"); } private void FIVE_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("5"); + Global.ClickyVirtualPadController.Click("5"); } private void SIX_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("6"); + Global.ClickyVirtualPadController.Click("6"); } private void SEVEN_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("7"); + Global.ClickyVirtualPadController.Click("7"); } private void EIGHT_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("8"); + Global.ClickyVirtualPadController.Click("8"); } private void NINE_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("9"); + Global.ClickyVirtualPadController.Click("9"); } private void ON_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("ON"); + Global.ClickyVirtualPadController.Click("ON"); } private void STO_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("STO"); + Global.ClickyVirtualPadController.Click("STO"); } private void PLUS_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("PLUS"); + Global.ClickyVirtualPadController.Click("PLUS"); } private void LN_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("LN"); + Global.ClickyVirtualPadController.Click("LN"); } private void MINUS_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("MINUS"); + Global.ClickyVirtualPadController.Click("MINUS"); } private void LOG_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("LOG"); + Global.ClickyVirtualPadController.Click("LOG"); } private void MULTIPLY_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("MULTIPLY"); + Global.ClickyVirtualPadController.Click("MULTIPLY"); } private void button26_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("SQUARED"); + Global.ClickyVirtualPadController.Click("SQUARED"); } private void button25_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("COMMA"); + Global.ClickyVirtualPadController.Click("COMMA"); } private void button24_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("PARAOPEN"); + Global.ClickyVirtualPadController.Click("PARAOPEN"); } private void button23_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("PARACLOSE"); + Global.ClickyVirtualPadController.Click("PARACLOSE"); } private void button22_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("DIVIDE"); + Global.ClickyVirtualPadController.Click("DIVIDE"); } private void button17_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("NEG1"); + Global.ClickyVirtualPadController.Click("NEG1"); } private void button18_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("SIN"); + Global.ClickyVirtualPadController.Click("SIN"); } private void button19_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("COS"); + Global.ClickyVirtualPadController.Click("COS"); } private void button20_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("TAN"); + Global.ClickyVirtualPadController.Click("TAN"); } private void button21_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("EXP"); + Global.ClickyVirtualPadController.Click("EXP"); } private void button12_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("MATH"); + Global.ClickyVirtualPadController.Click("MATH"); } private void button13_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("MATRIX"); + Global.ClickyVirtualPadController.Click("MATRIX"); } private void button14_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("PRGM"); + Global.ClickyVirtualPadController.Click("PRGM"); } private void button15_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("VARS"); + Global.ClickyVirtualPadController.Click("VARS"); } private void button16_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("CLEAR"); + Global.ClickyVirtualPadController.Click("CLEAR"); } private void button11_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("ALPHA"); + Global.ClickyVirtualPadController.Click("ALPHA"); } private void button4_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("X"); + Global.ClickyVirtualPadController.Click("X"); } private void button10_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("STAT"); + Global.ClickyVirtualPadController.Click("STAT"); } private void button5_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("2ND"); + Global.ClickyVirtualPadController.Click("2ND"); } private void button2_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("MODE"); + Global.ClickyVirtualPadController.Click("MODE"); } private void button3_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("DEL"); + Global.ClickyVirtualPadController.Click("DEL"); } private void button47_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("LEFT"); + Global.ClickyVirtualPadController.Click("LEFT"); } private void button49_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("DOWN"); + Global.ClickyVirtualPadController.Click("DOWN"); } private void button48_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("RIGHT"); + Global.ClickyVirtualPadController.Click("RIGHT"); } private void button50_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("UP"); + Global.ClickyVirtualPadController.Click("UP"); } private void button1_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("Y"); + Global.ClickyVirtualPadController.Click("Y"); } private void button6_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("WINDOW"); + Global.ClickyVirtualPadController.Click("WINDOW"); } private void button7_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("ZOOM"); + Global.ClickyVirtualPadController.Click("ZOOM"); } private void button8_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("TRACE"); + Global.ClickyVirtualPadController.Click("TRACE"); } private void button9_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("GRAPH"); + Global.ClickyVirtualPadController.Click("GRAPH"); } private void PERIOD_Click(object sender, EventArgs e) { - Global.ActiveController.ForceButton("DOT"); + Global.ClickyVirtualPadController.Click("DOT"); } private void showHotkToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/BizHawk.MultiClient/movie/InputAdapters.cs b/BizHawk.MultiClient/movie/InputAdapters.cs index 1ad471c09e..1859eb129a 100644 --- a/BizHawk.MultiClient/movie/InputAdapters.cs +++ b/BizHawk.MultiClient/movie/InputAdapters.cs @@ -4,6 +4,41 @@ using System.Collections.Generic; namespace BizHawk.MultiClient { + /// + /// will hold buttons for 1 frame and then release them. (Calling Click() from your button click is what you want to do) + /// TODO - should the duration be controllable? + /// + public class ClickyVirtualPadController : IController + { + public ControllerDefinition Type { get; set; } + + public bool this[string button] { get { return IsPressed(button); } } + public float GetFloat(string name) { return 0.0f; } //TODO + public void UpdateControls(int frame) { } + public bool IsPressed(string button) + { + return Pressed.Contains(button); + } + + /// + /// call this once per frame to do the timekeeping for the hold and release + /// + public void FrameTick() + { + Pressed.Clear(); + } + + /// + /// call this to hold the button down for one frame + /// + public void Click(string button) + { + Pressed.Add(button); + } + + HashSet Pressed = new HashSet(); + } + //filters input for things called Up and Down while considering the client's AllowUD_LR option. //this is a bit gross but it is unclear how to do it more nicely public class UD_LR_ControllerAdapter : IController