2014-06-22 23:32:37 +00:00
|
|
|
|
using System.Collections.Generic;
|
2014-06-23 00:05:22 +00:00
|
|
|
|
using System.ComponentModel;
|
2014-06-22 23:32:37 +00:00
|
|
|
|
using System.Drawing;
|
2014-06-24 23:32:30 +00:00
|
|
|
|
using System.Windows.Forms;
|
2014-06-22 14:29:46 +00:00
|
|
|
|
|
2014-06-23 00:05:22 +00:00
|
|
|
|
using BizHawk.Client.Common;
|
|
|
|
|
using BizHawk.Emulation.Cores.Nintendo.NES;
|
|
|
|
|
|
2014-06-22 14:29:46 +00:00
|
|
|
|
namespace BizHawk.Client.EmuHawk
|
|
|
|
|
{
|
2014-06-23 23:46:44 +00:00
|
|
|
|
[SchemaAttributes("NES")]
|
2014-06-22 23:32:37 +00:00
|
|
|
|
public class NesSchema : IVirtualPadSchema
|
2014-06-22 14:29:46 +00:00
|
|
|
|
{
|
2014-06-22 23:32:37 +00:00
|
|
|
|
public IEnumerable<VirtualPad> GetPads()
|
|
|
|
|
{
|
2014-06-23 00:05:22 +00:00
|
|
|
|
if (Global.Emulator is NES)
|
|
|
|
|
{
|
|
|
|
|
var ss = (NES.NESSyncSettings)Global.Emulator.GetSyncSettings();
|
|
|
|
|
|
2014-06-24 23:32:30 +00:00
|
|
|
|
if (ss.Controls.Famicom)
|
2014-06-23 00:05:22 +00:00
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
yield return new VirtualPad(StandardController(1));
|
|
|
|
|
yield return new VirtualPad(Famicom2ndController());
|
2014-06-23 00:05:22 +00:00
|
|
|
|
|
2014-06-24 23:32:30 +00:00
|
|
|
|
switch (ss.Controls.FamicomExpPort)
|
2014-06-23 00:05:22 +00:00
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
2014-06-23 00:05:22 +00:00
|
|
|
|
}
|
2014-06-24 23:32:30 +00:00
|
|
|
|
else
|
2014-06-23 00:05:22 +00:00
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
int currentControlerNo = 1;
|
|
|
|
|
switch (ss.Controls.NesLeftPort)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case "UnpluggedNES":
|
|
|
|
|
case "UnpluggedFam":
|
|
|
|
|
break;
|
|
|
|
|
case "ControllerNES":
|
|
|
|
|
yield return new VirtualPad(StandardController(1));
|
|
|
|
|
currentControlerNo++;
|
|
|
|
|
break;
|
|
|
|
|
case "Zapper":
|
|
|
|
|
yield return new VirtualPad(Zapper(1));
|
|
|
|
|
currentControlerNo++;
|
|
|
|
|
break;
|
|
|
|
|
case "ArkanoidNES":
|
|
|
|
|
yield return new VirtualPad(ArkanoidPaddle(1));
|
|
|
|
|
currentControlerNo++;
|
|
|
|
|
break;
|
|
|
|
|
case "FourScore":
|
|
|
|
|
yield return new VirtualPad(StandardController(1));
|
|
|
|
|
yield return new VirtualPad(StandardController(2));
|
|
|
|
|
currentControlerNo += 2;
|
|
|
|
|
break;
|
2014-06-25 00:11:59 +00:00
|
|
|
|
case "PowerPad":
|
|
|
|
|
yield return new VirtualPad(PowerPad(1));
|
|
|
|
|
currentControlerNo++;
|
|
|
|
|
break;
|
2014-06-24 23:32:30 +00:00
|
|
|
|
}
|
2014-06-23 00:05:22 +00:00
|
|
|
|
|
2014-06-24 23:32:30 +00:00
|
|
|
|
switch (ss.Controls.NesRightPort)
|
2014-06-23 00:05:22 +00:00
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
default:
|
|
|
|
|
case "UnpluggedNES":
|
|
|
|
|
break;
|
|
|
|
|
case "ControllerNES":
|
|
|
|
|
yield return new VirtualPad(StandardController(currentControlerNo));
|
|
|
|
|
break;
|
|
|
|
|
case "Zapper":
|
|
|
|
|
yield return new VirtualPad(Zapper(currentControlerNo));
|
|
|
|
|
break;
|
|
|
|
|
case "ArkanoidNES":
|
|
|
|
|
yield return new VirtualPad(ArkanoidPaddle(currentControlerNo));
|
|
|
|
|
break;
|
|
|
|
|
case "FourScore":
|
|
|
|
|
yield return new VirtualPad(StandardController(currentControlerNo));
|
|
|
|
|
yield return new VirtualPad(StandardController(currentControlerNo + 1));
|
|
|
|
|
currentControlerNo += 2;
|
|
|
|
|
break;
|
2014-06-25 00:11:59 +00:00
|
|
|
|
case "PowerPad":
|
|
|
|
|
yield return new VirtualPad(PowerPad(currentControlerNo));
|
|
|
|
|
break;
|
2014-06-24 23:32:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (currentControlerNo == 0)
|
|
|
|
|
{
|
|
|
|
|
yield return null;
|
|
|
|
|
}
|
2014-06-23 00:05:22 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else // Quicknes only supports 2 controllers and no other configuration
|
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
yield return new VirtualPad(StandardController(1));
|
|
|
|
|
yield return new VirtualPad(StandardController(2));
|
2014-06-23 00:05:22 +00:00
|
|
|
|
}
|
2014-06-22 23:32:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static PadSchema StandardController(int controller)
|
2014-06-22 14:29:46 +00:00
|
|
|
|
{
|
|
|
|
|
return new PadSchema
|
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
DisplayName = "Player " + controller,
|
2014-06-22 14:29:46 +00:00
|
|
|
|
IsConsole = false,
|
|
|
|
|
DefaultSize = new Size(174, 74),
|
2014-06-24 23:32:30 +00:00
|
|
|
|
MaxSize = new Size(174, 74),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Buttons = new[]
|
|
|
|
|
{
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Up",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.BlueUp,
|
2014-06-24 23:32:30 +00:00
|
|
|
|
Location = new Point(23, 15),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Down",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.BlueDown,
|
2014-06-24 23:32:30 +00:00
|
|
|
|
Location = new Point(23, 36),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Left",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.Back,
|
|
|
|
|
Location = new Point(2, 24),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Right",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.Forward,
|
2014-06-24 23:32:30 +00:00
|
|
|
|
Location = new Point(44, 24),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " B",
|
|
|
|
|
DisplayName = "B",
|
2014-06-24 23:32:30 +00:00
|
|
|
|
Location = new Point(124, 24),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " A",
|
|
|
|
|
DisplayName = "A",
|
2014-06-24 23:32:30 +00:00
|
|
|
|
Location = new Point(147, 24),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Select",
|
|
|
|
|
DisplayName = "s",
|
2014-06-24 23:32:30 +00:00
|
|
|
|
Location = new Point(72, 24),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Start",
|
|
|
|
|
DisplayName = "S",
|
2014-06-24 23:32:30 +00:00
|
|
|
|
Location = new Point(93, 24),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static PadSchema Famicom2ndController()
|
|
|
|
|
{
|
|
|
|
|
int controller = 2;
|
|
|
|
|
return new PadSchema
|
|
|
|
|
{
|
|
|
|
|
DisplayName = "Player 2",
|
|
|
|
|
IsConsole = false,
|
|
|
|
|
DefaultSize = new Size(174, 74),
|
|
|
|
|
MaxSize = new Size(174, 74),
|
|
|
|
|
Buttons = new[]
|
|
|
|
|
{
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Up",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.BlueUp,
|
|
|
|
|
Location = new Point(23, 15),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Down",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.BlueDown,
|
|
|
|
|
Location = new Point(23, 36),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Left",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.Back,
|
|
|
|
|
Location = new Point(2, 24),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Right",
|
|
|
|
|
DisplayName = "",
|
|
|
|
|
Icon = Properties.Resources.Forward,
|
|
|
|
|
Location = new Point(44, 24),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " B",
|
|
|
|
|
DisplayName = "B",
|
|
|
|
|
Location = new Point(124, 24),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " A",
|
|
|
|
|
DisplayName = "A",
|
|
|
|
|
Location = new Point(147, 24),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Microphone",
|
|
|
|
|
DisplayName = "Mic",
|
|
|
|
|
Location = new Point(72, 24),
|
2014-06-22 14:29:46 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-22 23:32:37 +00:00
|
|
|
|
private static PadSchema Zapper(int controller)
|
2014-06-22 14:29:46 +00:00
|
|
|
|
{
|
2014-06-22 21:50:27 +00:00
|
|
|
|
return new PadSchema
|
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
DisplayName = "Zapper",
|
2014-06-22 21:50:27 +00:00
|
|
|
|
IsConsole = false,
|
|
|
|
|
DefaultSize = new Size(356, 260),
|
2014-06-24 23:32:30 +00:00
|
|
|
|
MaxSize = new Size(356, 260),
|
2014-06-22 21:50:27 +00:00
|
|
|
|
Buttons = new[]
|
|
|
|
|
{
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Zapper X",
|
2014-06-25 00:11:59 +00:00
|
|
|
|
Location = new Point(14, 17),
|
2014-06-22 21:50:27 +00:00
|
|
|
|
Type = PadSchema.PadInputType.TargetedPair,
|
|
|
|
|
TargetSize = new Size(256, 240),
|
|
|
|
|
SecondaryNames = new []
|
|
|
|
|
{
|
|
|
|
|
"P" + controller + " Zapper Y",
|
|
|
|
|
"P" + controller + " Fire",
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Fire",
|
|
|
|
|
DisplayName = "Fire",
|
2014-06-25 00:11:59 +00:00
|
|
|
|
Location = new Point(284, 17),
|
2014-06-22 21:50:27 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
2014-06-22 14:29:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-24 12:58:08 +00:00
|
|
|
|
private static PadSchema ArkanoidPaddle(int controller)
|
2014-06-22 14:29:46 +00:00
|
|
|
|
{
|
2014-06-24 12:58:08 +00:00
|
|
|
|
return new PadSchema
|
|
|
|
|
{
|
2014-06-24 23:32:30 +00:00
|
|
|
|
DisplayName = "Arkanoid Paddle",
|
2014-06-24 12:58:08 +00:00
|
|
|
|
IsConsole = false,
|
|
|
|
|
DefaultSize = new Size(380, 110),
|
2014-06-24 23:32:30 +00:00
|
|
|
|
MaxSize = new Size(380, 110),
|
2014-06-24 12:58:08 +00:00
|
|
|
|
Buttons = new[]
|
|
|
|
|
{
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Paddle",
|
|
|
|
|
DisplayName = "Arkanoid Paddle",
|
2014-06-25 00:11:59 +00:00
|
|
|
|
Location = new Point(14, 17),
|
2014-06-24 12:58:08 +00:00
|
|
|
|
Type = PadSchema.PadInputType.FloatSingle,
|
2014-06-25 00:11:59 +00:00
|
|
|
|
TargetSize = new Size(380, 69),
|
2014-06-24 12:58:08 +00:00
|
|
|
|
MaxValue = 160
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " Fire",
|
|
|
|
|
DisplayName = "Fire",
|
2014-06-25 00:11:59 +00:00
|
|
|
|
Location = new Point(14, 85),
|
2014-06-24 12:58:08 +00:00
|
|
|
|
Type = PadSchema.PadInputType.Boolean
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
2014-06-22 14:29:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO
|
2014-06-24 12:58:08 +00:00
|
|
|
|
private static PadSchema PowerPad(int controller)
|
2014-06-22 14:29:46 +00:00
|
|
|
|
{
|
2014-06-25 00:11:59 +00:00
|
|
|
|
return new PadSchema
|
|
|
|
|
{
|
|
|
|
|
DisplayName = "Power Pad",
|
|
|
|
|
IsConsole = false,
|
|
|
|
|
DefaultSize = new Size(154, 114),
|
|
|
|
|
Buttons = new[]
|
|
|
|
|
{
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP1",
|
|
|
|
|
DisplayName = "1 ",
|
|
|
|
|
Location = new Point(14, 17),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP2",
|
|
|
|
|
DisplayName = "2 ",
|
|
|
|
|
Location = new Point(45, 17),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP3",
|
|
|
|
|
DisplayName = "3 ",
|
|
|
|
|
Location = new Point(76, 17),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP4",
|
|
|
|
|
DisplayName = "4 ",
|
|
|
|
|
Location = new Point(107, 17),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP5",
|
|
|
|
|
DisplayName = "5 ",
|
|
|
|
|
Location = new Point(14, 48),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP6",
|
|
|
|
|
DisplayName = "6 ",
|
|
|
|
|
Location = new Point(45, 48),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP7",
|
|
|
|
|
DisplayName = "7 ",
|
|
|
|
|
Location = new Point(76, 48),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP8",
|
|
|
|
|
DisplayName = "8 ",
|
|
|
|
|
Location = new Point(107, 48),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP9",
|
|
|
|
|
DisplayName = "9 ",
|
|
|
|
|
Location = new Point(14, 79),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP10",
|
|
|
|
|
DisplayName = "10",
|
|
|
|
|
Location = new Point(45, 79),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP11",
|
|
|
|
|
DisplayName = "11",
|
|
|
|
|
Location = new Point(76, 79),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
},
|
|
|
|
|
new PadSchema.ButtonScema
|
|
|
|
|
{
|
|
|
|
|
Name = "P" + controller + " PP12",
|
|
|
|
|
DisplayName = "12",
|
|
|
|
|
Location = new Point(107, 79),
|
|
|
|
|
Type = PadSchema.PadInputType.Boolean,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
2014-06-22 14:29:46 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|