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