예제 #1
0
 public InputKeyMapping(InputKeyMapping source)
 {
     this.AddRange(source);
 }
예제 #2
0
 private static void generateControllerConfig_gamecube(string path, string rom, InputKeyMapping anyMapping)
 {
     generateControllerConfig_any(path, "GCPadNew.ini", "GCPad", anyMapping, gamecubeReverseAxes, gamecubeReplacements);
 }
예제 #3
0
        private static void generateControllerConfig_any(string path, string filename, string anyDefKey, InputKeyMapping anyMapping, Dictionary <string, string> anyReverseAxes, Dictionary <string, string> anyReplacements, Dictionary <string, string> extraOptions = null)
        {
            //string path = Program.AppConfig.GetFullPath("dolphin");
            string iniFile = Path.Combine(path, "User", "Config", filename);

            int nsamepad = 0;

            Dictionary <string, int> double_pads = new Dictionary <string, int>();

            using (IniFile ini = new IniFile(iniFile, true))
            {
                foreach (var pad in Program.Controllers)
                {
                    string gcpad = anyDefKey + pad.PlayerIndex;
                    ini.ClearSection(gcpad);

                    if (pad.Config == null)
                    {
                        continue;
                    }

                    // SIDevice0 = 7 -> Keyb GCKeyNew.ini
                    // SIDevice1 = 6 -> controlleur standard GCPadNew.ini

                    string tech       = "XInput";
                    string deviceName = "Gamepad";

                    if (pad.Config.Type == "keyboard")
                    {
                        tech       = "DInput";
                        deviceName = "Keyboard Mouse";
                    }
                    else if (!pad.Config.IsXInputDevice())
                    {
                        var di = pad.Config.GetDirectInputInfo();
                        if (di == null)
                        {
                            continue;
                        }

                        tech       = "DInput";
                        deviceName = di.Name;
                    }

                    if (double_pads.ContainsKey(tech + "/" + deviceName))
                    {
                        nsamepad = double_pads[tech + "/" + deviceName];
                    }
                    else
                    {
                        nsamepad = 0;
                    }

                    double_pads[tech + "/" + deviceName] = nsamepad + 1;

                    ini.WriteValue(gcpad, "Device", tech + "/" + nsamepad.ToString() + "/" + deviceName);

                    if (extraOptions != null)
                    {
                        foreach (var xtra in extraOptions)
                        {
                            ini.WriteValue(gcpad, xtra.Key, xtra.Value);
                        }
                    }

                    foreach (var x in anyMapping)
                    {
                        string keyName = x.Value;

                        if (pad.Config.Type == "keyboard")
                        {
                            var value = x.Value;

                            if (x.Key == InputKey.a)
                            {
                                value = "Buttons/A";
                            }
                            else if (x.Key == InputKey.b)
                            {
                                value = "Buttons/B";
                            }
                            else if (x.Key == InputKey.up)
                            {
                                value = "Main Stick/Up";
                            }
                            else if (x.Key == InputKey.down)
                            {
                                value = "Main Stick/Down";
                            }
                            else if (x.Key == InputKey.left)
                            {
                                value = "Main Stick/Left";
                            }
                            else if (x.Key == InputKey.right)
                            {
                                value = "Main Stick/Right";
                            }

                            if (x.Key == InputKey.joystick1left || x.Key == InputKey.joystick1up)
                            {
                                continue;
                            }

                            var input = pad.Config[x.Key];
                            if (input == null)
                            {
                                continue;
                            }

                            var name = ToDolphinKey(input.Id);
                            ini.WriteValue(gcpad, value, name);
                        }
                        else if (tech == "XInput")
                        {
                            var mapping = pad.Config.GetXInputMapping(x.Key);
                            if (mapping != XINPUTMAPPING.UNKNOWN && xInputMapping.ContainsKey(mapping))
                            {
                                ini.WriteValue(gcpad, x.Value, xInputMapping[mapping]);
                            }

                            string reverseAxis;
                            if (anyReverseAxes.TryGetValue(x.Value, out reverseAxis))
                            {
                                mapping = pad.Config.GetXInputMapping(x.Key, true);
                                if (mapping != XINPUTMAPPING.UNKNOWN && xInputMapping.ContainsKey(mapping))
                                {
                                    ini.WriteValue(gcpad, reverseAxis, xInputMapping[mapping]);
                                }
                            }
                        }
                        else
                        {
                            var input = pad.Config[x.Key];
                            if (input == null)
                            {
                                continue;
                            }

                            if (input.Type == "button")
                            {
                                if (input.Id == 0) // Invert A & B
                                {
                                    ini.WriteValue(gcpad, x.Value, "`Button 1`");
                                }
                                else if (input.Id == 1) // Invert A & B
                                {
                                    ini.WriteValue(gcpad, x.Value, "`Button 0`");
                                }
                                else
                                {
                                    ini.WriteValue(gcpad, x.Value, "`Button " + input.Id.ToString() + "`");
                                }
                            }
                            else if (input.Type == "hat")
                            {
                                string hat = "`Hat " + input.Id + " N`";

                                if (input.Value == 2) // SDL_HAT_RIGHT
                                {
                                    hat = "`Hat " + input.Id + " E`";
                                }
                                else if (input.Value == 4) // SDL_HAT_DOWN
                                {
                                    hat = "`Hat " + input.Id + " S`";
                                }
                                else if (input.Value == 8) // SDL_HAT_LEFT
                                {
                                    hat = "`Hat " + input.Id + " W`";
                                }

                                ini.WriteValue(gcpad, x.Value, hat);
                            }
                            else if (input.Type == "axis")
                            {
                                Func <Input, bool, string> axisValue = (inp, revertAxis) =>
                                {
                                    string axis = "`Axis ";

                                    if (inp.Id == 2 || inp.Id == 5)
                                    {
                                        axis += "Z";
                                    }
                                    else if (inp.Id == 0 || inp.Id == 3)
                                    {
                                        axis += "X";
                                    }
                                    else
                                    {
                                        axis += "Y";
                                    }

                                    if (inp.Id == 3 || inp.Id == 4)
                                    {
                                        axis += "r";
                                    }

                                    if (inp.Id == 5)
                                    {
                                        revertAxis = !revertAxis;
                                    }

                                    if ((!revertAxis && inp.Value > 0) || (revertAxis && inp.Value < 0))
                                    {
                                        axis += "+";
                                    }
                                    else
                                    {
                                        axis += "-";
                                    }

                                    return(axis + "`");
                                };

                                ini.WriteValue(gcpad, x.Value, axisValue(input, false));

                                string reverseAxis;
                                if (anyReverseAxes.TryGetValue(x.Value, out reverseAxis))
                                {
                                    ini.WriteValue(gcpad, reverseAxis, axisValue(input, true));
                                }
                            }
                        }
                    }

                    if (tech == "XInput")
                    {
//                        ini.WriteValue(gcpad, "Main Stick/Modifier", "`Thumb L`");
//                      ini.WriteValue(gcpad, "C-Stick/Modifier" , "`Thumb R`");
                        ini.WriteValue(gcpad, "Main Stick/Dead Zone", "5.0000000000000000");
                        ini.WriteValue(gcpad, "C-Stick/Dead Zone", "5.0000000000000000");
                        ini.WriteValue(gcpad, "Rumble/Motor", "`Motor L``Motor R`");
                    }
                }

                ini.Save();
            }
        }
예제 #4
0
        private static void generateControllerConfig_emulatedwiimotes(string path, string rom)
        {
            var extraOptions = new Dictionary <string, string>();

            extraOptions["Source"] = "1";

            var wiiMapping = new InputKeyMapping(_wiiMapping);

            if (rom.Contains(".side.") && Program.SystemConfig["controller_mode"] != "disabled" && Program.SystemConfig["controller_mode"] != "cc")
            {
                extraOptions["Options/Sideways Wiimote"] = "1";
                wiiMapping[InputKey.x] = "Buttons/B";
                wiiMapping[InputKey.y] = "Buttons/A";
                wiiMapping[InputKey.a] = "Buttons/2";
                wiiMapping[InputKey.b] = "Buttons/1";
                //wiiMapping[InputKey.l2] = "Shake/X";
                //wiiMapping[InputKey.l2] = "Shake/Y";
                wiiMapping[InputKey.l2] = "Shake/Z";
            }

            // i: infrared, s: swing, t: tilt, n: nunchuk
            // 12 possible combinations : is si / it ti / in ni / st ts / sn ns / tn nt

            // i
            if (rom.Contains(".is.") || rom.Contains(".it.") || rom.Contains(".in.") ||
                (Program.SystemConfig.isOptSet("controller_mode") && Program.SystemConfig["controller_mode"] != "disabled" && Program.SystemConfig["controller_mode"] != "in" && Program.SystemConfig["controller_mode"] != "cc"))
            {
                wiiMapping[InputKey.joystick1up]   = "IR/Up";
                wiiMapping[InputKey.joystick1left] = "IR/Left";
            }

            if (rom.Contains(".si.") || rom.Contains(".ti.") || rom.Contains(".ni.") || Program.SystemConfig["controller_mode"] == "in")
            {
                wiiMapping[InputKey.joystick2up]   = "IR/Up";
                wiiMapping[InputKey.joystick2left] = "IR/Left";
            }

            // s
            if (rom.Contains(".si.") || rom.Contains(".st.") || rom.Contains(".sn."))
            {
                wiiMapping[InputKey.joystick1up]   = "Swing/Up";
                wiiMapping[InputKey.joystick1left] = "Swing/Left";
            }

            if (rom.Contains(".is.") || rom.Contains(".ts.") || rom.Contains(".ns.") || Program.SystemConfig["controller_mode"] == "is")
            {
                wiiMapping[InputKey.joystick2up]   = "Swing/Up";
                wiiMapping[InputKey.joystick2left] = "Swing/Left";
            }

            // t
            if (rom.Contains(".ti.") || rom.Contains(".ts.") || rom.Contains(".tn."))
            {
                wiiMapping[InputKey.joystick2up]   = "Tilt/Forward";
                wiiMapping[InputKey.joystick2left] = "Tilt/Left";
            }

            if (rom.Contains(".it.") || rom.Contains(".st.") || rom.Contains(".nt.") || Program.SystemConfig["controller_mode"] == "it")
            {
                wiiMapping[InputKey.joystick2up]   = "Tilt/Forward";
                wiiMapping[InputKey.joystick2left] = "Tilt/Left";
            }

            // n
            if (rom.Contains(".ni.") || rom.Contains(".ns.") || rom.Contains(".nt.") || Program.SystemConfig["controller_mode"] == "in")
            {
                extraOptions["Extension"]          = "Nunchuk";
                wiiMapping[InputKey.l2]            = "Nunchuk/Buttons/C";
                wiiMapping[InputKey.r2]            = "Nunchuk/Buttons/Z";
                wiiMapping[InputKey.joystick1up]   = "Nunchuk/Stick/Up";
                wiiMapping[InputKey.joystick1left] = "Nunchuk/Stick/Left";
            }

            if (rom.Contains(".in.") || rom.Contains(".sn.") || rom.Contains(".tn."))
            {
                extraOptions["Extension"]          = "Nunchuk";
                wiiMapping[InputKey.l2]            = "Nunchuk/Buttons/C";
                wiiMapping[InputKey.r2]            = "Nunchuk/Buttons/Z";
                wiiMapping[InputKey.joystick2up]   = "Nunchuk/Stick/Up";
                wiiMapping[InputKey.joystick2left] = "Nunchuk/Stick/Left";
            }

            // cc : Classic Controller Settings
            if (rom.Contains(".cc.") || Program.SystemConfig["controller_mode"] == "cc")
            {
                extraOptions["Extension"]          = "Classic";
                wiiMapping[InputKey.x]             = "Classic/Buttons/X";
                wiiMapping[InputKey.y]             = "Classic/Buttons/Y";
                wiiMapping[InputKey.b]             = "Classic/Buttons/B";
                wiiMapping[InputKey.a]             = "Classic/Buttons/A";
                wiiMapping[InputKey.select]        = "Classic/Buttons/-";
                wiiMapping[InputKey.start]         = "Classic/Buttons/+";
                wiiMapping[InputKey.pageup]        = "Classic/Triggers/L";
                wiiMapping[InputKey.pagedown]      = "Classic/Triggers/R";
                wiiMapping[InputKey.l2]            = "Classic/Buttons/ZL";
                wiiMapping[InputKey.r2]            = "Classic/Buttons/ZR";
                wiiMapping[InputKey.up]            = "Classic/D-Pad/Up";
                wiiMapping[InputKey.down]          = "Classic/D-Pad/Down";
                wiiMapping[InputKey.left]          = "Classic/D-Pad/Left";
                wiiMapping[InputKey.right]         = "Classic/D-Pad/Right";
                wiiMapping[InputKey.joystick1up]   = "Classic/Left Stick/Up";
                wiiMapping[InputKey.joystick1left] = "Classic/Left Stick/Left";
                wiiMapping[InputKey.joystick2up]   = "Classic/Right Stick/Up";
                wiiMapping[InputKey.joystick2left] = "Classic/Right Stick/Left";
            }

            generateControllerConfig_any(path, "WiimoteNew.ini", "Wiimote", wiiMapping, wiiReverseAxes, null, extraOptions);
        }