412 lines
10 KiB
C#
412 lines
10 KiB
C#
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
|
|
using BizHawk.Emulation.Common;
|
|
using BizHawk.Emulation.Cores.Nintendo.SNES;
|
|
using BizHawk.Emulation.Cores.Nintendo.SNES9X;
|
|
|
|
namespace BizHawk.Client.EmuHawk
|
|
{
|
|
[Schema("SNES")]
|
|
public class SnesSchema : IVirtualPadSchema
|
|
{
|
|
public IEnumerable<PadSchema> GetPadSchemas(IEmulator core)
|
|
{
|
|
if (core is LibsnesCore)
|
|
{
|
|
return GetBsnesPadSchemas(core);
|
|
}
|
|
|
|
return GetSnes9xPadSchemas(core);
|
|
}
|
|
private IEnumerable<PadSchema> GetSnes9xPadSchemas(IEmulator core)
|
|
{
|
|
// Only standard controller is supported on the left port
|
|
yield return StandardController(1);
|
|
|
|
Snes9x.SyncSettings syncSettings = ((Snes9x)core).GetSyncSettings();
|
|
LibSnes9x.RightPortDevice rightPort = syncSettings.RightPort;
|
|
|
|
switch (rightPort)
|
|
{
|
|
default:
|
|
case LibSnes9x.RightPortDevice.Joypad:
|
|
yield return StandardController(2);
|
|
break;
|
|
case LibSnes9x.RightPortDevice.Justifier:
|
|
yield return Justifier(2);
|
|
break;
|
|
case LibSnes9x.RightPortDevice.Mouse:
|
|
yield return Mouse(2);
|
|
break;
|
|
case LibSnes9x.RightPortDevice.Multitap:
|
|
yield return StandardController(2);
|
|
yield return StandardController(3);
|
|
yield return StandardController(4);
|
|
yield return StandardController(5);
|
|
break;
|
|
case LibSnes9x.RightPortDevice.SuperScope:
|
|
yield return SuperScope(2);
|
|
break;
|
|
}
|
|
|
|
yield return ConsoleButtons();
|
|
}
|
|
|
|
private IEnumerable<PadSchema> GetBsnesPadSchemas(IEmulator core)
|
|
{
|
|
var syncsettings = ((LibsnesCore)core).GetSyncSettings();
|
|
|
|
var ports = new[]
|
|
{
|
|
syncsettings.LeftPort,
|
|
syncsettings.RightPort
|
|
};
|
|
|
|
int offset = 0;
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
int playerNum = i + offset + 1;
|
|
switch (ports[i])
|
|
{
|
|
default:
|
|
case LibsnesControllerDeck.ControllerType.Unplugged:
|
|
offset -= 1;
|
|
break;
|
|
case LibsnesControllerDeck.ControllerType.Gamepad:
|
|
yield return StandardController(playerNum);
|
|
break;
|
|
case LibsnesControllerDeck.ControllerType.Multitap:
|
|
for (int j = 0; j < 4; j++)
|
|
{
|
|
yield return StandardController(playerNum + j);
|
|
}
|
|
|
|
offset += 3;
|
|
break;
|
|
case LibsnesControllerDeck.ControllerType.Mouse:
|
|
yield return Mouse(playerNum);
|
|
break;
|
|
case LibsnesControllerDeck.ControllerType.SuperScope:
|
|
yield return SuperScope(playerNum);
|
|
break;
|
|
case LibsnesControllerDeck.ControllerType.Justifier:
|
|
for (int j = 0; j < 2; j++)
|
|
{
|
|
yield return Justifier(playerNum);
|
|
offset += j;
|
|
}
|
|
|
|
break;
|
|
case LibsnesControllerDeck.ControllerType.Payload:
|
|
yield return Payload(playerNum);
|
|
break;
|
|
}
|
|
}
|
|
|
|
yield return ConsoleButtons();
|
|
}
|
|
|
|
private static PadSchema StandardController(int controller, int rowOffset = 0)
|
|
{
|
|
return new PadSchema
|
|
{
|
|
IsConsole = false,
|
|
DefaultSize = new Size(200, 90),
|
|
Buttons = new[]
|
|
{
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Up",
|
|
DisplayName = "",
|
|
Icon = Properties.Resources.BlueUp,
|
|
Location = new Point(34, 17),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Down",
|
|
DisplayName = "",
|
|
Icon = Properties.Resources.BlueDown,
|
|
Location = new Point(34, 61),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Left",
|
|
DisplayName = "",
|
|
Icon = Properties.Resources.Back,
|
|
Location = new Point(22, 39),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Right",
|
|
DisplayName = "",
|
|
Icon = Properties.Resources.Forward,
|
|
Location = new Point(44, 39),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} L",
|
|
DisplayName = "L",
|
|
Location = new Point(2, 10),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} R",
|
|
DisplayName = "R",
|
|
Location = new Point(174, 10),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Select",
|
|
DisplayName = "s",
|
|
Location = new Point(70, 39),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Start",
|
|
DisplayName = "S",
|
|
Location = new Point(92, 39),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Y",
|
|
DisplayName = "Y",
|
|
Location = new Point(121, 39),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} B",
|
|
DisplayName = "B",
|
|
Location = new Point(145, 52),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} X",
|
|
DisplayName = "X",
|
|
Location = new Point(122, 15),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} A",
|
|
DisplayName = "A",
|
|
Location = new Point(146, 25),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
private static PadSchema Mouse(int controller)
|
|
{
|
|
return new PadSchema
|
|
{
|
|
IsConsole = false,
|
|
DefaultSize = new Size(345, 225),
|
|
Buttons = new[]
|
|
{
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Mouse X",
|
|
MinValue = -128,
|
|
MidValue = 0,
|
|
MaxValue = 127,
|
|
MinValueSec = 127,
|
|
MidValueSec = 0,
|
|
MaxValueSec = -128,
|
|
DisplayName = "",
|
|
Location = new Point(6, 14),
|
|
Type = PadSchema.PadInputType.AnalogStick
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Mouse Left",
|
|
DisplayName = "Left",
|
|
Location = new Point(275, 15),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Mouse Right",
|
|
DisplayName = "Right",
|
|
Location = new Point(275, 45),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
private static PadSchema SuperScope(int controller)
|
|
{
|
|
return new PadSchema
|
|
{
|
|
DisplayName = "Superscope",
|
|
IsConsole = false,
|
|
DefaultSize = new Size(356, 290),
|
|
MaxSize = new Size(356, 290),
|
|
Buttons = new[]
|
|
{
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Scope X",
|
|
Location = new Point(14, 17),
|
|
Type = PadSchema.PadInputType.TargetedPair,
|
|
TargetSize = new Size(256, 240),
|
|
SecondaryNames = new[]
|
|
{
|
|
$"P{controller} Scope Y",
|
|
}
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Trigger",
|
|
DisplayName = "Trigger",
|
|
Location = new Point(284, 17),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Cursor",
|
|
DisplayName = "Cursor",
|
|
Location = new Point(284, 47),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Turbo",
|
|
DisplayName = "Turbo",
|
|
Location = new Point(284, 77),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Pause",
|
|
DisplayName = "Pause",
|
|
Location = new Point(284, 107),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
private static PadSchema Justifier(int controller)
|
|
{
|
|
return new PadSchema
|
|
{
|
|
DisplayName = "Justifier",
|
|
IsConsole = false,
|
|
DefaultSize = new Size(356, 290),
|
|
MaxSize = new Size(356, 290),
|
|
Buttons = new[]
|
|
{
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Justifier X",
|
|
Location = new Point(14, 17),
|
|
Type = PadSchema.PadInputType.TargetedPair,
|
|
TargetSize = new Size(256, 240),
|
|
SecondaryNames = new[]
|
|
{
|
|
$"P{controller} Justifier Y",
|
|
}
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Trigger",
|
|
DisplayName = "Trigger",
|
|
Location = new Point(284, 17),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} Start",
|
|
DisplayName = "Start",
|
|
Location = new Point(284, 47),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
private static PadSchema Payload(int controller)
|
|
{
|
|
return new PadSchema
|
|
{
|
|
DisplayName = "Payload",
|
|
IsConsole = false,
|
|
DefaultSize = new Size(460, 85),
|
|
Buttons = PayLoadButtons(controller)
|
|
};
|
|
}
|
|
|
|
private static IEnumerable<PadSchema.ButtonSchema> PayLoadButtons(int controller)
|
|
{
|
|
int startX = 5;
|
|
int startY = 15;
|
|
int buttonSpacingX = 28;
|
|
int buttonSpacingY = 30;
|
|
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
yield return new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} B{i}",
|
|
DisplayName = i.ToString(),
|
|
Location = new Point(startX + (i * buttonSpacingX), startY),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
};
|
|
}
|
|
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
yield return new PadSchema.ButtonSchema
|
|
{
|
|
Name = $"P{controller} B{i + 16}",
|
|
DisplayName = (i + 16).ToString(),
|
|
Location = new Point(startX + (i * buttonSpacingX), startY + buttonSpacingY),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
};
|
|
}
|
|
}
|
|
|
|
private static PadSchema ConsoleButtons()
|
|
{
|
|
return new PadSchema
|
|
{
|
|
DisplayName = "Console",
|
|
IsConsole = true,
|
|
DefaultSize = new Size(150, 50),
|
|
Buttons = new[]
|
|
{
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = "Reset",
|
|
DisplayName = "Reset",
|
|
Location = new Point(10, 15),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
},
|
|
new PadSchema.ButtonSchema
|
|
{
|
|
Name = "Power",
|
|
DisplayName = "Power",
|
|
Location = new Point(58, 15),
|
|
Type = PadSchema.PadInputType.Boolean
|
|
}
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|