BizHawk/BizHawk.MultiClient/tools/VirtualPadForm.cs

281 lines
8.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace BizHawk.MultiClient
{
public partial class VirtualPadForm : Form
{
//TODO: clicky vs sticky
//Remember window position
//Remember window size
//Restore defaults
//Autoload
List<VirtualPad> Pads = new List<VirtualPad>();
public VirtualPadForm()
{
InitializeComponent();
Closing += (o, e) => SaveConfigSettings();
}
private void VirtualPadForm_Load(object sender, EventArgs e)
{
StickyBox.Checked = Global.Config.VirtualPadSticky;
if (Global.Config.VirtualPadSaveWindowPosition && Global.Config.VPadWndx >= 0 && Global.Config.VPadWndy >= 0)
{
this.Location = new Point(Global.Config.VPadWndx, Global.Config.VPadWndy);
}
LoadPads();
}
private void SaveConfigSettings()
{
Global.Config.VPadWndx = this.Location.X;
Global.Config.VPadWndy = this.Location.Y;
Pads.Clear();
}
private void LoadPads()
{
switch (Global.Emulator.SystemId)
{
case "NULL":
default:
break;
case "A26":
VirtualPadA26 ataripad1 = new VirtualPadA26();
ataripad1.Location = new Point(8, 19);
ataripad1.Controller = "P1";
VirtualPadA26 ataripad2 = new VirtualPadA26();
ataripad2.Location = new Point(188, 19);
ataripad2.Controller = "P2";
Pads.Add(ataripad1);
Pads.Add(ataripad2);
ControllerBox.Controls.Add(Pads[0]);
ControllerBox.Controls.Add(Pads[1]);
VirtualPadA26Control ataricontrols = new VirtualPadA26Control();
ataricontrols.Location = new Point(8, 109);
Pads.Add(ataricontrols);
ControllerBox.Controls.Add(Pads[2]);
break;
case "NES":
VirtualPadNES nespad1 = new VirtualPadNES();
nespad1.Location = new Point(8, 19);
nespad1.Controller = "P1";
VirtualPadNES nespad2 = new VirtualPadNES();
nespad2.Location = new Point(188, 19);
nespad2.Controller = "P2";
Pads.Add(nespad1);
Pads.Add(nespad2);
ControllerBox.Controls.Add(Pads[0]);
ControllerBox.Controls.Add(Pads[1]);
VirtualPadNESControl controlpad1 = new VirtualPadNESControl();
controlpad1.Location = new Point(8, 109);
Pads.Add(controlpad1);
ControllerBox.Controls.Add(Pads[2]);
break;
case "SMS":
case "SG":
case "GG":
VirtualPadSMS smspad1 = new VirtualPadSMS();
smspad1.Location = new Point(8, 19);
smspad1.Controller = "P1";
VirtualPadSMS smspad2 = new VirtualPadSMS();
smspad2.Location = new Point(188, 19);
smspad2.Controller = "P2";
Pads.Add(smspad1);
Pads.Add(smspad2);
ControllerBox.Controls.Add(Pads[0]);
ControllerBox.Controls.Add(Pads[1]);
VirtualPadSMSControl controlpad2 = new VirtualPadSMSControl();
controlpad2.Location = new Point(8, 109);
Pads.Add(controlpad2);
ControllerBox.Controls.Add(Pads[2]);
break;
case "PCE":
VirtualPadPCE pcepad1 = new VirtualPadPCE();
pcepad1.Location = new Point(8, 19);
pcepad1.Controller = "P1";
VirtualPadPCE pcepad2 = new VirtualPadPCE();
pcepad2.Location = new Point(188, 19);
pcepad2.Controller = "P2";
VirtualPadPCE pcepad3 = new VirtualPadPCE();
pcepad3.Location = new Point(8, 109);
pcepad3.Controller = "P3";
VirtualPadPCE pcepad4 = new VirtualPadPCE();
pcepad4.Location = new Point(188, 109);
pcepad4.Controller = "P4";
Pads.Add(pcepad1);
Pads.Add(pcepad2);
Pads.Add(pcepad3);
Pads.Add(pcepad4);
ControllerBox.Controls.Add(Pads[0]);
ControllerBox.Controls.Add(Pads[1]);
ControllerBox.Controls.Add(Pads[2]);
ControllerBox.Controls.Add(Pads[3]);
break;
case "SNES":
VirtualPadSNES snespad1 = new VirtualPadSNES();
snespad1.Location = new Point(8, 19);
snespad1.Controller = "P1";
VirtualPadSNES snespad2 = new VirtualPadSNES();
snespad2.Location = new Point(188, 19);
snespad2.Controller = "P2";
VirtualPadSNES snespad3 = new VirtualPadSNES();
snespad3.Location = new Point(8, 95);
snespad3.Controller = "P3";
VirtualPadSNES snespad4 = new VirtualPadSNES();
snespad4.Location = new Point(188, 95);
snespad4.Controller = "P4";
VirtualPadSNESControl snescontrolpad = new VirtualPadSNESControl();
snescontrolpad.Location = new Point(8, 170);
Pads.Add(snespad1);
Pads.Add(snespad2);
Pads.Add(snespad3);
Pads.Add(snespad4);
Pads.Add(snescontrolpad);
ControllerBox.Controls.Add(Pads[0]);
ControllerBox.Controls.Add(Pads[1]);
ControllerBox.Controls.Add(Pads[2]);
ControllerBox.Controls.Add(Pads[3]);
ControllerBox.Controls.Add(Pads[4]);
break;
case "GB":
case "GBC":
VirtualPadGB gbpad1 = new VirtualPadGB();
gbpad1.Location = new Point(8, 19);
gbpad1.Controller = "";
Pads.Add(gbpad1);
ControllerBox.Controls.Add(Pads[0]);
VirtualPadGBControl gbcontrolpad = new VirtualPadGBControl();
gbcontrolpad.Location = new Point(8, 109);
Pads.Add(gbcontrolpad);
ControllerBox.Controls.Add(Pads[1]);
break;
case "GEN":
VirtualPadGen3Button genpad1 = new VirtualPadGen3Button();
genpad1.Location = new Point(8, 19);
genpad1.Controller = "P1";
Pads.Add(genpad1);
ControllerBox.Controls.Add(Pads[0]);
break;
}
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
public void ClearVirtualPadHolds()
{
foreach (var controller in ControllerBox.Controls)
{
if (controller is VirtualPad)
((VirtualPad)controller).Clear();
}
}
public void Restart()
{
if (!this.IsHandleCreated || this.IsDisposed) return;
ControllerBox.Controls.Clear();
Pads.Clear();
LoadPads();
}
public void UpdateValues()
{
if (!this.IsHandleCreated || this.IsDisposed) return;
if (Global.MovieSession.Movie.IsPlaying && !Global.MovieSession.Movie.IsFinished)
{
string str = Global.MovieSession.Movie.GetInput(Global.Emulator.Frame);
if (Global.Config.TASUpdatePads == true && str != "")
{
switch (Global.Emulator.SystemId)
{
case "NES":
Pads[0].SetButtons(str.Substring(3, 8));
Pads[1].SetButtons(str.Substring(12, 8));
Pads[2].SetButtons(str[1].ToString());
break;
case "A26":
Pads[0].SetButtons(str.Substring(4, 5));
Pads[1].SetButtons(str.Substring(10, 5));
Pads[2].SetButtons(str.Substring(1, 2));
break;
case "SMS":
case "GG":
case "SG":
Pads[0].SetButtons(str.Substring(1, 6));
Pads[1].SetButtons(str.Substring(8, 6));
Pads[2].SetButtons(str.Substring(15, 2));
break;
case "PCE":
case "SGX":
Pads[0].SetButtons(str.Substring(3, 8));
Pads[1].SetButtons(str.Substring(12, 8));
Pads[2].SetButtons(str.Substring(21, 8));
Pads[3].SetButtons(str.Substring(30, 8));
break;
case "TI83":
Pads[0].SetButtons(str.Substring(2, 50));
break;
case "SNES":
Pads[0].SetButtons(str.Substring(3, 12));
Pads[1].SetButtons(str.Substring(16, 12));
Pads[2].SetButtons(str.Substring(29, 12));
Pads[3].SetButtons(str.Substring(42, 12));
break;
case "GEN":
Pads[0].SetButtons(str.Substring(3, 8));
Pads[1].SetButtons(str.Substring(12, 8));
break;
case "GB":
Pads[0].SetButtons(str.Substring(3, 8));
break;
default:
break;
}
}
}
}
private void StickyBox_CheckedChanged(object sender, EventArgs e)
{
Global.Config.VirtualPadSticky = StickyBox.Checked;
}
private void optionsToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
saveWindowPositionToolStripMenuItem.Checked = Global.Config.VirtualPadSaveWindowPosition;
autolaodToolStripMenuItem.Checked = Global.Config.AutoloadVirtualPad;
}
private void autolaodToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoloadVirtualPad ^= true;
}
private void saveWindowPositionToolStripMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VirtualPadSaveWindowPosition ^= true;
}
private void clearToolStripMenuItem_Click(object sender, EventArgs e)
{
ClearVirtualPadHolds();
}
}
}