BizHawk/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualPadN64.cs

224 lines
6.3 KiB
C#
Raw Normal View History

using System;
using System.Text;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk
{
public partial class VirtualPadN64 : UserControl, IVirtualPad
{
public string Controller = "P1";
private int old_X = 0;
private int old_Y = 0;
public VirtualPadN64()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
BorderStyle = BorderStyle.Fixed3D;
InitializeComponent();
}
private void UserControl1_Load(object sender, EventArgs e)
{
PU.ControllerButton = Controller + " Up";
PD.ControllerButton = Controller + " Down";
PL.ControllerButton = Controller + " Left";
PR.ControllerButton = Controller + " Right";
BA.ControllerButton = Controller + " A";
BB.ControllerButton = Controller + " B";
BZ.ControllerButton = Controller + " Z";
BS.ControllerButton = Controller + " Start";
BL.ControllerButton = Controller + " L";
BR.ControllerButton = Controller + " R";
CU.ControllerButton = Controller + " C Up";
CD.ControllerButton = Controller + " C Down";
CL.ControllerButton = Controller + " C Left";
CR.ControllerButton = Controller + " C Right";
}
public void Clear()
{
if (Global.Emulator.SystemId != "N64") return;
foreach (var button in Buttons)
{
button.Clear();
}
}
public void SetButtons(string buttons)
{
if (buttons.Length < 14) return;
if (buttons[0] == '.') PU.Checked = false; else PU.Checked = true;
if (buttons[1] == '.') PD.Checked = false; else PD.Checked = true;
if (buttons[2] == '.') PL.Checked = false; else PL.Checked = true;
if (buttons[3] == '.') PR.Checked = false; else PR.Checked = true;
if (buttons[4] == '.') BB.Checked = false; else BB.Checked = true;
if (buttons[5] == '.') BA.Checked = false; else BA.Checked = true;
if (buttons[6] == '.') BZ.Checked = false; else BZ.Checked = true;
if (buttons[7] == '.') BS.Checked = false; else BS.Checked = true;
if (buttons[8] == '.') BL.Checked = false; else BL.Checked = true;
if (buttons[9] == '.') BR.Checked = false; else BR.Checked = true;
if (buttons[10] == '.') CU.Checked = false; else CU.Checked = true;
if (buttons[11] == '.') CD.Checked = false; else CD.Checked = true;
if (buttons[12] == '.') CL.Checked = false; else CL.Checked = true;
if (buttons[13] == '.') CR.Checked = false; else CR.Checked = true;
int x = 0;
int y = 0;
if (InputValidate.IsValidSignedNumber(buttons.Substring(14, 4)))
{
x = Int32.Parse(buttons.Substring(14, 4));
}
if (InputValidate.IsValidSignedNumber(buttons.Substring(19, 4)))
{
y = Int32.Parse(buttons.Substring(19, 4));
}
set_analog(true, x, y);
}
public string GetMnemonic()
{
StringBuilder input = new StringBuilder("");
input.Append(PU.Checked ? "U" : ".");
input.Append(PD.Checked ? "D" : ".");
input.Append(PL.Checked ? "L" : ".");
input.Append(PR.Checked ? "R" : ".");
input.Append(BB.Checked ? "B" : ".");
input.Append(BA.Checked ? "A" : ".");
input.Append(BZ.Checked ? "Z" : ".");
input.Append(BS.Checked ? "S" : ".");
input.Append(BL.Checked ? "L" : ".");
input.Append(BR.Checked ? "R" : ".");
input.Append(CU.Checked ? "u" : ".");
input.Append(CD.Checked ? "d" : ".");
input.Append(CL.Checked ? "l" : ".");
input.Append(CR.Checked ? "r" : ".");
input.Append(String.Format("{0:000}", AnalogControl1.X + 128));
input.Append(String.Format("{0:000}", AnalogControl1.Y + 128));
input.Append("|");
return input.ToString();
}
private void AnalogControl1_MouseClick(object sender, MouseEventArgs e)
{
set_analog(AnalogControl1.HasValue, AnalogControl1.X, AnalogControl1.Y);
}
private void AnalogControl1_MouseMove(object sender, MouseEventArgs e)
{
set_analog(AnalogControl1.HasValue, AnalogControl1.X, AnalogControl1.Y);
}
private void ManualX_ValueChanged(object sender, EventArgs e)
{
2013-11-16 14:35:42 +00:00
SetAnalogControlFromNumerics();
}
private void ManualY_ValueChanged(object sender, EventArgs e)
{
2013-11-16 14:35:42 +00:00
SetAnalogControlFromNumerics();
}
public void set_analog(bool hasValue, int X, int Y)
{
int? x = hasValue ? X : (int?)null;
int? y = hasValue ? Y : (int?)null;
Global.StickyXORAdapter.SetFloat(Controller + " X Axis", x);
Global.StickyXORAdapter.SetFloat(Controller + " Y Axis", y);
AnalogControl1.X = X;
AnalogControl1.Y = Y;
AnalogControl1.Refresh();
old_X = X;
old_Y = Y;
ManualX.Value = X;
ManualY.Value = Y;
}
//TODO: multiplayer
public void FudgeAnalog(int? dx, int? dy)
{
int newx = AnalogControl1.X;
int newy = AnalogControl1.Y;
if (dx.HasValue)
{
newx = AnalogControl1.X + dx.Value;
if (newx > AnalogControlPanel.Max) newx = AnalogControlPanel.Max;
if (newx < AnalogControlPanel.Min) newx = AnalogControlPanel.Min;
}
if (dy.HasValue)
{
newy = AnalogControl1.Y + dy.Value;
if (newy > AnalogControlPanel.Max) newy = AnalogControlPanel.Max;
if (newy < AnalogControlPanel.Min) newy = AnalogControlPanel.Min;
}
AnalogControl1.SetPosition(newx, newy);
ManualX.Value = newx;
ManualY.Value = newy;
Refresh();
}
public List<VirtualPadButton> Buttons
{
get
{
List<VirtualPadButton> _list = new List<VirtualPadButton>();
foreach(Control c in this.Controls)
{
if (c is VirtualPadButton)
{
_list.Add((c as VirtualPadButton));
}
}
return _list;
}
}
2013-11-16 14:35:42 +00:00
private void ManualX_KeyUp(object sender, KeyEventArgs e)
{
SetAnalogControlFromNumerics();
}
private void ManualY_KeyUp(object sender, KeyEventArgs e)
{
SetAnalogControlFromNumerics();
}
public void SetAnalogControlFromNumerics()
{
int x = (int)ManualX.Value;
int y = (int)ManualY.Value;
Global.StickyXORAdapter.SetFloat(Controller + " X Axis", x);
Global.StickyXORAdapter.SetFloat(Controller + " Y Axis", y);
old_X = x;
old_Y = y;
AnalogControl1.HasValue = true;
AnalogControl1.X = x;
AnalogControl1.Y = y;
AnalogControl1.Refresh();
}
}
}