atari 7800: did controller stuff until i got annoyed

This commit is contained in:
goyuken 2012-12-15 00:58:55 +00:00
parent a9bf3cf58a
commit 1895103a9c
1 changed files with 163 additions and 2 deletions

View File

@ -49,7 +49,7 @@ namespace BizHawk.Emulation
"P4 Paddle"
}
};
public static ControllerDefinition Keypads = new ControllerDefinition
public static ControllerDefinition Keypad = new ControllerDefinition
{
Name = "Atari 7800 Keypad Controller",
BoolButtons =
@ -133,7 +133,7 @@ namespace BizHawk.Emulation
"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Trigger", "P2 Trigger 2"
}
};
public static ControllerDefinition LightGunController = new ControllerDefinition
public static ControllerDefinition Lightgun = new ControllerDefinition
{
Name = "Atari 7800 Light Gun Controller",
BoolButtons =
@ -154,5 +154,166 @@ namespace BizHawk.Emulation
"P2 VPos", "P2 HPos"
}
};
struct ControlAdapter
{
public ControllerDefinition Type;
public Controller Left;
public Controller Right;
public Action<IController, InputState> Convert;
public ControlAdapter(ControllerDefinition Type, Controller Left, Controller Right, Action<IController, InputState> Convert)
{
this.Type = Type;
this.Left = Left;
this.Right = Right;
this.Convert = Convert;
}
}
static readonly ControlAdapter[] Adapters = new[]
{
new ControlAdapter(Joystick, Controller.Joystick, Controller.Joystick, ConvertJoystick),
new ControlAdapter(Paddles, Controller.Paddles, Controller.Paddles, ConvertPaddles),
new ControlAdapter(Keypad, Controller.Keypad, Controller.Keypad, ConvertKeypad),
new ControlAdapter(Driving, Controller.Driving, Controller.Driving, ConvertDriving),
new ControlAdapter(BoosterGrip, Controller.BoosterGrip, Controller.BoosterGrip, ConvertBoosterGrip),
new ControlAdapter(ProLineJoystick, Controller.ProLineJoystick, Controller.ProLineJoystick, ConvertProLineJoystick),
new ControlAdapter(Lightgun, Controller.Lightgun, Controller.Lightgun, ConvertLightgun),
};
static void ConvertConsoleButtons(IController c, InputState s)
{
s.RaiseInput(0, MachineInput.Reset, c["Reset"]);
s.RaiseInput(0, MachineInput.Select, c["Select"]);
s.RaiseInput(0, MachineInput.Color, c["BW"]);
s.RaiseInput(0, MachineInput.LeftDifficulty, c["Left Difficulty"]);
s.RaiseInput(0, MachineInput.RightDifficulty, c["Right Difficulty"]);
}
static void ConvertDirections(IController c, InputState s, int p)
{
string ps = string.Format("P{0} ", p + 1);
s.RaiseInput(p, MachineInput.Up, c[ps + "Up"]);
s.RaiseInput(p, MachineInput.Down, c[ps + "Down"]);
s.RaiseInput(p, MachineInput.Left, c[ps + "Left"]);
s.RaiseInput(p, MachineInput.Right, c[ps + "Right"]);
}
static void ConvertTrigger(IController c, InputState s, int p)
{
string ps = string.Format("P{0} ", p + 1);
s.RaiseInput(p, MachineInput.Fire, c[ps + "Trigger"]);
}
static void ConvertJoystick(IController c, InputState s)
{
s.ClearAllInput();
ConvertConsoleButtons(c, s);
ConvertDirections(c, s, 0);
ConvertDirections(c, s, 1);
ConvertTrigger(c, s, 0);
ConvertTrigger(c, s, 1);
}
static void ConvertPaddles(IController c, InputState s)
{
s.ClearAllInput();
ConvertConsoleButtons(c, s);
for (int i = 0; i < 4; i++)
{
string ps = string.Format("P{0} ", i + 1);
ConvertTrigger(c, s, i);
s.RaisePaddleInput(i, 700000, (int)c.GetFloat(ps + "Trigger"));
}
}
static void ConvertKeypad(IController c, InputState s)
{
s.ClearAllInput();
ConvertConsoleButtons(c, s);
for (int i = 0; i < 4; i++)
{
string ps = string.Format("P{0} ", i + 1);
s.RaiseInput(i, MachineInput.NumPad1, c[ps + "Keypad1"]);
s.RaiseInput(i, MachineInput.NumPad2, c[ps + "Keypad2"]);
s.RaiseInput(i, MachineInput.NumPad3, c[ps + "Keypad3"]);
s.RaiseInput(i, MachineInput.NumPad4, c[ps + "Keypad4"]);
s.RaiseInput(i, MachineInput.NumPad5, c[ps + "Keypad5"]);
s.RaiseInput(i, MachineInput.NumPad6, c[ps + "Keypad6"]);
s.RaiseInput(i, MachineInput.NumPad7, c[ps + "Keypad7"]);
s.RaiseInput(i, MachineInput.NumPad8, c[ps + "Keypad8"]);
s.RaiseInput(i, MachineInput.NumPad9, c[ps + "Keypad9"]);
s.RaiseInput(i, MachineInput.NumPadMult, c[ps + "KeypadA"]);
s.RaiseInput(i, MachineInput.NumPad0, c[ps + "Keypad0"]);
s.RaiseInput(i, MachineInput.NumPadHash, c[ps + "KeypadP"]);
}
}
static MachineInput[] drvlut = new[]
{
MachineInput.Driving0,
MachineInput.Driving1,
MachineInput.Driving2,
MachineInput.Driving3
};
static void ConvertDriving(IController c, InputState s)
{
s.ClearAllInput();
ConvertConsoleButtons(c, s);
ConvertTrigger(c, s, 0);
ConvertTrigger(c, s, 1);
s.RaiseInput(0, drvlut[(int)c.GetFloat("P1 Driving")], true);
s.RaiseInput(1, drvlut[(int)c.GetFloat("P2 Driving")], true);
}
static void ConvertBoosterGrip(IController c, InputState s)
{
s.ClearAllInput();
ConvertConsoleButtons(c, s);
ConvertDirections(c, s, 0);
ConvertDirections(c, s, 1);
// weird mapping is intentional
s.RaiseInput(0, MachineInput.Fire, c["P1 Trigger"]);
s.RaiseInput(0, MachineInput.Fire2, c["P1 Trigger 2"]);
s.RaiseInput(1, MachineInput.Fire2, c["P1 Trigger 3"]);
s.RaiseInput(1, MachineInput.Fire, c["P2 Trigger"]);
s.RaiseInput(2, MachineInput.Fire2, c["P2 Trigger 2"]);
s.RaiseInput(3, MachineInput.Fire2, c["P2 Trigger 3"]);
}
static void ConvertProLineJoystick(IController c, InputState s)
{
s.ClearAllInput();
ConvertConsoleButtons(c, s);
ConvertDirections(c, s, 0);
ConvertDirections(c, s, 1);
s.RaiseInput(0, MachineInput.Fire, c["P1 Trigger"]);
s.RaiseInput(0, MachineInput.Fire2, c["P1 Trigger 2"]);
s.RaiseInput(1, MachineInput.Fire, c["P2 Trigger"]);
s.RaiseInput(1, MachineInput.Fire2, c["P2 Trigger 2"]);
}
static void ConvertLightgun(IController c, InputState s)
{
s.ClearAllInput();
ConvertConsoleButtons(c, s);
ConvertTrigger(c, s, 0);
ConvertTrigger(c, s, 1);
s.RaiseLightgunPos(0, (int)c.GetFloat("P1 VPos"), (int)c.GetFloat("P1 HPos"));
s.RaiseLightgunPos(1, (int)c.GetFloat("P2 VPos"), (int)c.GetFloat("P2 HPos"));
}
public Action<IController, InputState> Convert { get; private set; }
public ControllerDefinition ControlType { get; private set; }
public Atari7800Control(MachineBase mac)
{
var l = mac.InputState.LeftControllerJack;
var r = mac.InputState.RightControllerJack;
foreach (var a in Adapters)
{
if (a.Left == l && a.Right == r)
{
Convert = a.Convert;
ControlType = a.Type;
return;
}
}
throw new Exception(string.Format("Couldn't connect Atari 7800 controls \"{0}\" and \"{1}\"", l.ToString(), r.ToString()));
}
}
}