diff --git a/BizHawk.Emulation/Consoles/Atari/7800/Atari7800Control.cs b/BizHawk.Emulation/Consoles/Atari/7800/Atari7800Control.cs index ba785f22d7..8b6bfdf18d 100644 --- a/BizHawk.Emulation/Consoles/Atari/7800/Atari7800Control.cs +++ b/BizHawk.Emulation/Consoles/Atari/7800/Atari7800Control.cs @@ -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 Convert; + public ControlAdapter(ControllerDefinition Type, Controller Left, Controller Right, Action 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 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())); + } } }