{
  "version": 3,
  "id": "duckstation",
  "name": "DuckStation",
  "revision": "2026-09-30.6",
  "origin": {
    "kind": "url",
    "url": "https://kouch.dev/emulators/duckstation.kod"
  },
  "args": [
    "-batch",
    "-nogui",
    "-fullscreen",
    "--",
    "{rom}"
  ],
  "working_dir": null,
  "env": {},
  "window_mode": "fullscreen",
  "quit": {
    "method": "close",
    "force_kill_after_ms": 8000
  },
  "on_disconnect": "hold_neutral",
  "dsu": null,
  "native_gamepads": "disable_in_emulator_config",
  "update_check": true,
  "auto_update": false,
  "systems": [
    {
      "id": "psx",
      "folder": "psx",
      "name": "PlayStation",
      "art": {
        "thumbnails": "Sony - PlayStation"
      }
    }
  ],
  "extensions": [
    "cue",
    "chd",
    "pbp",
    "m3u",
    "ecm",
    "mds",
    "ccd",
    "iso"
  ],
  "max_players": 8,
  "players": [
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    },
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    },
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    },
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    },
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    },
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    },
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    },
    {
      "dsu": null,
      "vpad": null,
      "motion": false
    }
  ],
  "hotkeys": {
    "pause": {
      "keys": [
        "f5"
      ]
    },
    "save_state": {
      "keys": [
        "f2"
      ]
    },
    "load_state": {
      "keys": [
        "f1"
      ]
    },
    "reset": null,
    "screenshot": {
      "keys": [
        "f10"
      ]
    },
    "quit": null,
    "fullscreen": {
      "keys": [
        "f11"
      ]
    }
  },
  "pause": {
    "method": "hotkey",
    "chord": {
      "keys": [
        "f5"
      ]
    }
  },
  "user_data": {
    "folders": {
      "saves": "saves",
      "states": "states",
      "screenshots": "screenshots",
      "config": "config",
      "system": "system"
    },
    "cloud": [
      "saves"
    ],
    "config_edits": [
      {
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "set": {
          "Main.SetupWizardIncomplete": "false",
          "Main.ConfirmPowerOff": "false",
          "Main.PauseOnFocusLoss": "false",
          "Main.HideCursorInFullscreen": "true",
          "Main.EnableDiscordPresence": "false",
          "AutoUpdater.CheckAtStartup": "false",
          "BIOS.SearchDirectory": "{system}",
          "MemoryCards.Directory": "{saves}/memcards",
          "MemoryCards.Card1Type": "PerGameFileTitle",
          "MemoryCards.Card2Type": "None",
          "Folders.SaveStates": "{states}",
          "Folders.Screenshots": "{screenshots}",
          "Folders.Videos": "{screenshots}/videos",
          "Folders.GameSettings": "{config}/gamesettings",
          "Folders.InputProfiles": "{config}/inputprofiles",
          "Folders.Cheats": "{config}/cheats",
          "Folders.Patches": "{config}/patches",
          "Folders.Covers": "{config}/covers",
          "Folders.Textures": "{config}/textures",
          "Folders.Cache": "{storage}/cache",
          "Folders.Shaders": "{storage}/shaders",
          "InputSources.SDL": "true",
          "InputSources.XInput": "false",
          "InputSources.RawInput": "false",
          "Hotkeys.TogglePause": "Keyboard/F5",
          "Hotkeys.OpenPauseMenu": "",
          "Hotkeys.SaveSelectedSaveState": "Keyboard/F2",
          "Hotkeys.LoadSelectedSaveState": "Keyboard/F1",
          "Hotkeys.Screenshot": "Keyboard/F10",
          "Hotkeys.ToggleFullscreen": "Keyboard/F11"
        }
      }
    ],
    "system_required": true,
    "system_files": [
      {
        "names": [],
        "patterns": [
          "*.bin"
        ],
        "sizes": [
          524288,
          4194304,
          4088048
        ],
        "kind": "file",
        "what": "Start-up ROM (BIOS)",
        "required": true,
        "features": "every game; the emulator knows the file by its contents, so its name doesn’t matter",
        "regions": [
          "NTSC-J",
          "NTSC-U",
          "PAL"
        ]
      }
    ],
    "game_files": [
      {
        "part": "saves",
        "glob": "memcards/{rom_stem}_*.mcd"
      }
    ]
  },
  "options": [
    {
      "id": "controller",
      "label": "Controller",
      "tab": "controls",
      "type": "controller",
      "default": "analog",
      "values": [
        {
          "value": "analog",
          "label": "Analog pad",
          "icon": "kouch:standard-pad",
          "needs": [],
          "edits": [
            {
              "file": "{emulator_dir}/settings.ini",
              "format": "ini",
              "set": {
                "Pad1.Type": "AnalogController",
                "Pad2.Type": "AnalogController",
                "Pad3.Type": "AnalogController",
                "Pad4.Type": "AnalogController",
                "Pad5.Type": "AnalogController",
                "Pad6.Type": "AnalogController",
                "Pad7.Type": "AnalogController",
                "Pad8.Type": "AnalogController"
              }
            }
          ]
        },
        {
          "value": "digital",
          "label": "Digital pad",
          "icon": "kouch:classic-pad",
          "needs": [],
          "edits": [
            {
              "file": "{emulator_dir}/settings.ini",
              "format": "ini",
              "set": {
                "Pad1.Type": "DigitalController",
                "Pad2.Type": "DigitalController",
                "Pad3.Type": "DigitalController",
                "Pad4.Type": "DigitalController",
                "Pad5.Type": "DigitalController",
                "Pad6.Type": "DigitalController",
                "Pad7.Type": "DigitalController",
                "Pad8.Type": "DigitalController"
              }
            }
          ]
        }
      ],
      "apply": {
        "kind": "arg",
        "args": []
      }
    },
    {
      "id": "multitap",
      "label": "Multitap",
      "tab": "multiplayer",
      "type": "choice",
      "description": "Without it only players 1 and 2 play. Some games need it on port 1; most never look at port 2.",
      "default": "Disabled",
      "values": [
        {
          "value": "Disabled",
          "label": "Off (2 players)",
          "edits": [
            {
              "file": "{emulator_dir}/settings.ini",
              "format": "ini",
              "set": {
                "ControllerPorts.MultitapMode": "Disabled",
                "Pad1.Up": "SDL-{seat_pad_1}/DPadUp",
                "Pad1.Down": "SDL-{seat_pad_1}/DPadDown",
                "Pad1.Left": "SDL-{seat_pad_1}/DPadLeft",
                "Pad1.Right": "SDL-{seat_pad_1}/DPadRight",
                "Pad1.Cross": "SDL-{seat_pad_1}/A",
                "Pad1.Circle": "SDL-{seat_pad_1}/B",
                "Pad1.Square": "SDL-{seat_pad_1}/X",
                "Pad1.Triangle": "SDL-{seat_pad_1}/Y",
                "Pad1.Select": "SDL-{seat_pad_1}/Back",
                "Pad1.Start": "SDL-{seat_pad_1}/Start",
                "Pad1.L1": "SDL-{seat_pad_1}/LeftShoulder",
                "Pad1.R1": "SDL-{seat_pad_1}/RightShoulder",
                "Pad1.L2": "SDL-{seat_pad_1}/+LeftTrigger",
                "Pad1.R2": "SDL-{seat_pad_1}/+RightTrigger",
                "Pad1.L3": "SDL-{seat_pad_1}/LeftStick",
                "Pad1.R3": "SDL-{seat_pad_1}/RightStick",
                "Pad1.LLeft": "SDL-{seat_pad_1}/-LeftX",
                "Pad1.LRight": "SDL-{seat_pad_1}/+LeftX",
                "Pad1.LUp": "SDL-{seat_pad_1}/-LeftY",
                "Pad1.LDown": "SDL-{seat_pad_1}/+LeftY",
                "Pad1.RLeft": "SDL-{seat_pad_1}/-RightX",
                "Pad1.RRight": "SDL-{seat_pad_1}/+RightX",
                "Pad1.RUp": "SDL-{seat_pad_1}/-RightY",
                "Pad1.RDown": "SDL-{seat_pad_1}/+RightY",
                "Pad1.LargeMotor": "SDL-{seat_pad_1}/LargeMotor",
                "Pad1.SmallMotor": "SDL-{seat_pad_1}/SmallMotor",
                "Pad2.Up": "SDL-{seat_pad_2}/DPadUp",
                "Pad2.Down": "SDL-{seat_pad_2}/DPadDown",
                "Pad2.Left": "SDL-{seat_pad_2}/DPadLeft",
                "Pad2.Right": "SDL-{seat_pad_2}/DPadRight",
                "Pad2.Cross": "SDL-{seat_pad_2}/A",
                "Pad2.Circle": "SDL-{seat_pad_2}/B",
                "Pad2.Square": "SDL-{seat_pad_2}/X",
                "Pad2.Triangle": "SDL-{seat_pad_2}/Y",
                "Pad2.Select": "SDL-{seat_pad_2}/Back",
                "Pad2.Start": "SDL-{seat_pad_2}/Start",
                "Pad2.L1": "SDL-{seat_pad_2}/LeftShoulder",
                "Pad2.R1": "SDL-{seat_pad_2}/RightShoulder",
                "Pad2.L2": "SDL-{seat_pad_2}/+LeftTrigger",
                "Pad2.R2": "SDL-{seat_pad_2}/+RightTrigger",
                "Pad2.L3": "SDL-{seat_pad_2}/LeftStick",
                "Pad2.R3": "SDL-{seat_pad_2}/RightStick",
                "Pad2.LLeft": "SDL-{seat_pad_2}/-LeftX",
                "Pad2.LRight": "SDL-{seat_pad_2}/+LeftX",
                "Pad2.LUp": "SDL-{seat_pad_2}/-LeftY",
                "Pad2.LDown": "SDL-{seat_pad_2}/+LeftY",
                "Pad2.RLeft": "SDL-{seat_pad_2}/-RightX",
                "Pad2.RRight": "SDL-{seat_pad_2}/+RightX",
                "Pad2.RUp": "SDL-{seat_pad_2}/-RightY",
                "Pad2.RDown": "SDL-{seat_pad_2}/+RightY",
                "Pad2.LargeMotor": "SDL-{seat_pad_2}/LargeMotor",
                "Pad2.SmallMotor": "SDL-{seat_pad_2}/SmallMotor"
              }
            }
          ]
        },
        {
          "value": "Port1Only",
          "label": "On port 1 (up to 5 players)",
          "edits": [
            {
              "file": "{emulator_dir}/settings.ini",
              "format": "ini",
              "set": {
                "ControllerPorts.MultitapMode": "Port1Only",
                "Pad1.Up": "SDL-{seat_pad_1}/DPadUp",
                "Pad1.Down": "SDL-{seat_pad_1}/DPadDown",
                "Pad1.Left": "SDL-{seat_pad_1}/DPadLeft",
                "Pad1.Right": "SDL-{seat_pad_1}/DPadRight",
                "Pad1.Cross": "SDL-{seat_pad_1}/A",
                "Pad1.Circle": "SDL-{seat_pad_1}/B",
                "Pad1.Square": "SDL-{seat_pad_1}/X",
                "Pad1.Triangle": "SDL-{seat_pad_1}/Y",
                "Pad1.Select": "SDL-{seat_pad_1}/Back",
                "Pad1.Start": "SDL-{seat_pad_1}/Start",
                "Pad1.L1": "SDL-{seat_pad_1}/LeftShoulder",
                "Pad1.R1": "SDL-{seat_pad_1}/RightShoulder",
                "Pad1.L2": "SDL-{seat_pad_1}/+LeftTrigger",
                "Pad1.R2": "SDL-{seat_pad_1}/+RightTrigger",
                "Pad1.L3": "SDL-{seat_pad_1}/LeftStick",
                "Pad1.R3": "SDL-{seat_pad_1}/RightStick",
                "Pad1.LLeft": "SDL-{seat_pad_1}/-LeftX",
                "Pad1.LRight": "SDL-{seat_pad_1}/+LeftX",
                "Pad1.LUp": "SDL-{seat_pad_1}/-LeftY",
                "Pad1.LDown": "SDL-{seat_pad_1}/+LeftY",
                "Pad1.RLeft": "SDL-{seat_pad_1}/-RightX",
                "Pad1.RRight": "SDL-{seat_pad_1}/+RightX",
                "Pad1.RUp": "SDL-{seat_pad_1}/-RightY",
                "Pad1.RDown": "SDL-{seat_pad_1}/+RightY",
                "Pad1.LargeMotor": "SDL-{seat_pad_1}/LargeMotor",
                "Pad1.SmallMotor": "SDL-{seat_pad_1}/SmallMotor",
                "Pad3.Up": "SDL-{seat_pad_2}/DPadUp",
                "Pad3.Down": "SDL-{seat_pad_2}/DPadDown",
                "Pad3.Left": "SDL-{seat_pad_2}/DPadLeft",
                "Pad3.Right": "SDL-{seat_pad_2}/DPadRight",
                "Pad3.Cross": "SDL-{seat_pad_2}/A",
                "Pad3.Circle": "SDL-{seat_pad_2}/B",
                "Pad3.Square": "SDL-{seat_pad_2}/X",
                "Pad3.Triangle": "SDL-{seat_pad_2}/Y",
                "Pad3.Select": "SDL-{seat_pad_2}/Back",
                "Pad3.Start": "SDL-{seat_pad_2}/Start",
                "Pad3.L1": "SDL-{seat_pad_2}/LeftShoulder",
                "Pad3.R1": "SDL-{seat_pad_2}/RightShoulder",
                "Pad3.L2": "SDL-{seat_pad_2}/+LeftTrigger",
                "Pad3.R2": "SDL-{seat_pad_2}/+RightTrigger",
                "Pad3.L3": "SDL-{seat_pad_2}/LeftStick",
                "Pad3.R3": "SDL-{seat_pad_2}/RightStick",
                "Pad3.LLeft": "SDL-{seat_pad_2}/-LeftX",
                "Pad3.LRight": "SDL-{seat_pad_2}/+LeftX",
                "Pad3.LUp": "SDL-{seat_pad_2}/-LeftY",
                "Pad3.LDown": "SDL-{seat_pad_2}/+LeftY",
                "Pad3.RLeft": "SDL-{seat_pad_2}/-RightX",
                "Pad3.RRight": "SDL-{seat_pad_2}/+RightX",
                "Pad3.RUp": "SDL-{seat_pad_2}/-RightY",
                "Pad3.RDown": "SDL-{seat_pad_2}/+RightY",
                "Pad3.LargeMotor": "SDL-{seat_pad_2}/LargeMotor",
                "Pad3.SmallMotor": "SDL-{seat_pad_2}/SmallMotor",
                "Pad4.Up": "SDL-{seat_pad_3}/DPadUp",
                "Pad4.Down": "SDL-{seat_pad_3}/DPadDown",
                "Pad4.Left": "SDL-{seat_pad_3}/DPadLeft",
                "Pad4.Right": "SDL-{seat_pad_3}/DPadRight",
                "Pad4.Cross": "SDL-{seat_pad_3}/A",
                "Pad4.Circle": "SDL-{seat_pad_3}/B",
                "Pad4.Square": "SDL-{seat_pad_3}/X",
                "Pad4.Triangle": "SDL-{seat_pad_3}/Y",
                "Pad4.Select": "SDL-{seat_pad_3}/Back",
                "Pad4.Start": "SDL-{seat_pad_3}/Start",
                "Pad4.L1": "SDL-{seat_pad_3}/LeftShoulder",
                "Pad4.R1": "SDL-{seat_pad_3}/RightShoulder",
                "Pad4.L2": "SDL-{seat_pad_3}/+LeftTrigger",
                "Pad4.R2": "SDL-{seat_pad_3}/+RightTrigger",
                "Pad4.L3": "SDL-{seat_pad_3}/LeftStick",
                "Pad4.R3": "SDL-{seat_pad_3}/RightStick",
                "Pad4.LLeft": "SDL-{seat_pad_3}/-LeftX",
                "Pad4.LRight": "SDL-{seat_pad_3}/+LeftX",
                "Pad4.LUp": "SDL-{seat_pad_3}/-LeftY",
                "Pad4.LDown": "SDL-{seat_pad_3}/+LeftY",
                "Pad4.RLeft": "SDL-{seat_pad_3}/-RightX",
                "Pad4.RRight": "SDL-{seat_pad_3}/+RightX",
                "Pad4.RUp": "SDL-{seat_pad_3}/-RightY",
                "Pad4.RDown": "SDL-{seat_pad_3}/+RightY",
                "Pad4.LargeMotor": "SDL-{seat_pad_3}/LargeMotor",
                "Pad4.SmallMotor": "SDL-{seat_pad_3}/SmallMotor",
                "Pad5.Up": "SDL-{seat_pad_4}/DPadUp",
                "Pad5.Down": "SDL-{seat_pad_4}/DPadDown",
                "Pad5.Left": "SDL-{seat_pad_4}/DPadLeft",
                "Pad5.Right": "SDL-{seat_pad_4}/DPadRight",
                "Pad5.Cross": "SDL-{seat_pad_4}/A",
                "Pad5.Circle": "SDL-{seat_pad_4}/B",
                "Pad5.Square": "SDL-{seat_pad_4}/X",
                "Pad5.Triangle": "SDL-{seat_pad_4}/Y",
                "Pad5.Select": "SDL-{seat_pad_4}/Back",
                "Pad5.Start": "SDL-{seat_pad_4}/Start",
                "Pad5.L1": "SDL-{seat_pad_4}/LeftShoulder",
                "Pad5.R1": "SDL-{seat_pad_4}/RightShoulder",
                "Pad5.L2": "SDL-{seat_pad_4}/+LeftTrigger",
                "Pad5.R2": "SDL-{seat_pad_4}/+RightTrigger",
                "Pad5.L3": "SDL-{seat_pad_4}/LeftStick",
                "Pad5.R3": "SDL-{seat_pad_4}/RightStick",
                "Pad5.LLeft": "SDL-{seat_pad_4}/-LeftX",
                "Pad5.LRight": "SDL-{seat_pad_4}/+LeftX",
                "Pad5.LUp": "SDL-{seat_pad_4}/-LeftY",
                "Pad5.LDown": "SDL-{seat_pad_4}/+LeftY",
                "Pad5.RLeft": "SDL-{seat_pad_4}/-RightX",
                "Pad5.RRight": "SDL-{seat_pad_4}/+RightX",
                "Pad5.RUp": "SDL-{seat_pad_4}/-RightY",
                "Pad5.RDown": "SDL-{seat_pad_4}/+RightY",
                "Pad5.LargeMotor": "SDL-{seat_pad_4}/LargeMotor",
                "Pad5.SmallMotor": "SDL-{seat_pad_4}/SmallMotor",
                "Pad2.Up": "SDL-{seat_pad_5}/DPadUp",
                "Pad2.Down": "SDL-{seat_pad_5}/DPadDown",
                "Pad2.Left": "SDL-{seat_pad_5}/DPadLeft",
                "Pad2.Right": "SDL-{seat_pad_5}/DPadRight",
                "Pad2.Cross": "SDL-{seat_pad_5}/A",
                "Pad2.Circle": "SDL-{seat_pad_5}/B",
                "Pad2.Square": "SDL-{seat_pad_5}/X",
                "Pad2.Triangle": "SDL-{seat_pad_5}/Y",
                "Pad2.Select": "SDL-{seat_pad_5}/Back",
                "Pad2.Start": "SDL-{seat_pad_5}/Start",
                "Pad2.L1": "SDL-{seat_pad_5}/LeftShoulder",
                "Pad2.R1": "SDL-{seat_pad_5}/RightShoulder",
                "Pad2.L2": "SDL-{seat_pad_5}/+LeftTrigger",
                "Pad2.R2": "SDL-{seat_pad_5}/+RightTrigger",
                "Pad2.L3": "SDL-{seat_pad_5}/LeftStick",
                "Pad2.R3": "SDL-{seat_pad_5}/RightStick",
                "Pad2.LLeft": "SDL-{seat_pad_5}/-LeftX",
                "Pad2.LRight": "SDL-{seat_pad_5}/+LeftX",
                "Pad2.LUp": "SDL-{seat_pad_5}/-LeftY",
                "Pad2.LDown": "SDL-{seat_pad_5}/+LeftY",
                "Pad2.RLeft": "SDL-{seat_pad_5}/-RightX",
                "Pad2.RRight": "SDL-{seat_pad_5}/+RightX",
                "Pad2.RUp": "SDL-{seat_pad_5}/-RightY",
                "Pad2.RDown": "SDL-{seat_pad_5}/+RightY",
                "Pad2.LargeMotor": "SDL-{seat_pad_5}/LargeMotor",
                "Pad2.SmallMotor": "SDL-{seat_pad_5}/SmallMotor"
              }
            }
          ]
        },
        {
          "value": "BothPorts",
          "label": "On both ports (up to 8 players)",
          "edits": [
            {
              "file": "{emulator_dir}/settings.ini",
              "format": "ini",
              "set": {
                "ControllerPorts.MultitapMode": "BothPorts",
                "Pad1.Up": "SDL-{seat_pad_1}/DPadUp",
                "Pad1.Down": "SDL-{seat_pad_1}/DPadDown",
                "Pad1.Left": "SDL-{seat_pad_1}/DPadLeft",
                "Pad1.Right": "SDL-{seat_pad_1}/DPadRight",
                "Pad1.Cross": "SDL-{seat_pad_1}/A",
                "Pad1.Circle": "SDL-{seat_pad_1}/B",
                "Pad1.Square": "SDL-{seat_pad_1}/X",
                "Pad1.Triangle": "SDL-{seat_pad_1}/Y",
                "Pad1.Select": "SDL-{seat_pad_1}/Back",
                "Pad1.Start": "SDL-{seat_pad_1}/Start",
                "Pad1.L1": "SDL-{seat_pad_1}/LeftShoulder",
                "Pad1.R1": "SDL-{seat_pad_1}/RightShoulder",
                "Pad1.L2": "SDL-{seat_pad_1}/+LeftTrigger",
                "Pad1.R2": "SDL-{seat_pad_1}/+RightTrigger",
                "Pad1.L3": "SDL-{seat_pad_1}/LeftStick",
                "Pad1.R3": "SDL-{seat_pad_1}/RightStick",
                "Pad1.LLeft": "SDL-{seat_pad_1}/-LeftX",
                "Pad1.LRight": "SDL-{seat_pad_1}/+LeftX",
                "Pad1.LUp": "SDL-{seat_pad_1}/-LeftY",
                "Pad1.LDown": "SDL-{seat_pad_1}/+LeftY",
                "Pad1.RLeft": "SDL-{seat_pad_1}/-RightX",
                "Pad1.RRight": "SDL-{seat_pad_1}/+RightX",
                "Pad1.RUp": "SDL-{seat_pad_1}/-RightY",
                "Pad1.RDown": "SDL-{seat_pad_1}/+RightY",
                "Pad1.LargeMotor": "SDL-{seat_pad_1}/LargeMotor",
                "Pad1.SmallMotor": "SDL-{seat_pad_1}/SmallMotor",
                "Pad3.Up": "SDL-{seat_pad_2}/DPadUp",
                "Pad3.Down": "SDL-{seat_pad_2}/DPadDown",
                "Pad3.Left": "SDL-{seat_pad_2}/DPadLeft",
                "Pad3.Right": "SDL-{seat_pad_2}/DPadRight",
                "Pad3.Cross": "SDL-{seat_pad_2}/A",
                "Pad3.Circle": "SDL-{seat_pad_2}/B",
                "Pad3.Square": "SDL-{seat_pad_2}/X",
                "Pad3.Triangle": "SDL-{seat_pad_2}/Y",
                "Pad3.Select": "SDL-{seat_pad_2}/Back",
                "Pad3.Start": "SDL-{seat_pad_2}/Start",
                "Pad3.L1": "SDL-{seat_pad_2}/LeftShoulder",
                "Pad3.R1": "SDL-{seat_pad_2}/RightShoulder",
                "Pad3.L2": "SDL-{seat_pad_2}/+LeftTrigger",
                "Pad3.R2": "SDL-{seat_pad_2}/+RightTrigger",
                "Pad3.L3": "SDL-{seat_pad_2}/LeftStick",
                "Pad3.R3": "SDL-{seat_pad_2}/RightStick",
                "Pad3.LLeft": "SDL-{seat_pad_2}/-LeftX",
                "Pad3.LRight": "SDL-{seat_pad_2}/+LeftX",
                "Pad3.LUp": "SDL-{seat_pad_2}/-LeftY",
                "Pad3.LDown": "SDL-{seat_pad_2}/+LeftY",
                "Pad3.RLeft": "SDL-{seat_pad_2}/-RightX",
                "Pad3.RRight": "SDL-{seat_pad_2}/+RightX",
                "Pad3.RUp": "SDL-{seat_pad_2}/-RightY",
                "Pad3.RDown": "SDL-{seat_pad_2}/+RightY",
                "Pad3.LargeMotor": "SDL-{seat_pad_2}/LargeMotor",
                "Pad3.SmallMotor": "SDL-{seat_pad_2}/SmallMotor",
                "Pad4.Up": "SDL-{seat_pad_3}/DPadUp",
                "Pad4.Down": "SDL-{seat_pad_3}/DPadDown",
                "Pad4.Left": "SDL-{seat_pad_3}/DPadLeft",
                "Pad4.Right": "SDL-{seat_pad_3}/DPadRight",
                "Pad4.Cross": "SDL-{seat_pad_3}/A",
                "Pad4.Circle": "SDL-{seat_pad_3}/B",
                "Pad4.Square": "SDL-{seat_pad_3}/X",
                "Pad4.Triangle": "SDL-{seat_pad_3}/Y",
                "Pad4.Select": "SDL-{seat_pad_3}/Back",
                "Pad4.Start": "SDL-{seat_pad_3}/Start",
                "Pad4.L1": "SDL-{seat_pad_3}/LeftShoulder",
                "Pad4.R1": "SDL-{seat_pad_3}/RightShoulder",
                "Pad4.L2": "SDL-{seat_pad_3}/+LeftTrigger",
                "Pad4.R2": "SDL-{seat_pad_3}/+RightTrigger",
                "Pad4.L3": "SDL-{seat_pad_3}/LeftStick",
                "Pad4.R3": "SDL-{seat_pad_3}/RightStick",
                "Pad4.LLeft": "SDL-{seat_pad_3}/-LeftX",
                "Pad4.LRight": "SDL-{seat_pad_3}/+LeftX",
                "Pad4.LUp": "SDL-{seat_pad_3}/-LeftY",
                "Pad4.LDown": "SDL-{seat_pad_3}/+LeftY",
                "Pad4.RLeft": "SDL-{seat_pad_3}/-RightX",
                "Pad4.RRight": "SDL-{seat_pad_3}/+RightX",
                "Pad4.RUp": "SDL-{seat_pad_3}/-RightY",
                "Pad4.RDown": "SDL-{seat_pad_3}/+RightY",
                "Pad4.LargeMotor": "SDL-{seat_pad_3}/LargeMotor",
                "Pad4.SmallMotor": "SDL-{seat_pad_3}/SmallMotor",
                "Pad5.Up": "SDL-{seat_pad_4}/DPadUp",
                "Pad5.Down": "SDL-{seat_pad_4}/DPadDown",
                "Pad5.Left": "SDL-{seat_pad_4}/DPadLeft",
                "Pad5.Right": "SDL-{seat_pad_4}/DPadRight",
                "Pad5.Cross": "SDL-{seat_pad_4}/A",
                "Pad5.Circle": "SDL-{seat_pad_4}/B",
                "Pad5.Square": "SDL-{seat_pad_4}/X",
                "Pad5.Triangle": "SDL-{seat_pad_4}/Y",
                "Pad5.Select": "SDL-{seat_pad_4}/Back",
                "Pad5.Start": "SDL-{seat_pad_4}/Start",
                "Pad5.L1": "SDL-{seat_pad_4}/LeftShoulder",
                "Pad5.R1": "SDL-{seat_pad_4}/RightShoulder",
                "Pad5.L2": "SDL-{seat_pad_4}/+LeftTrigger",
                "Pad5.R2": "SDL-{seat_pad_4}/+RightTrigger",
                "Pad5.L3": "SDL-{seat_pad_4}/LeftStick",
                "Pad5.R3": "SDL-{seat_pad_4}/RightStick",
                "Pad5.LLeft": "SDL-{seat_pad_4}/-LeftX",
                "Pad5.LRight": "SDL-{seat_pad_4}/+LeftX",
                "Pad5.LUp": "SDL-{seat_pad_4}/-LeftY",
                "Pad5.LDown": "SDL-{seat_pad_4}/+LeftY",
                "Pad5.RLeft": "SDL-{seat_pad_4}/-RightX",
                "Pad5.RRight": "SDL-{seat_pad_4}/+RightX",
                "Pad5.RUp": "SDL-{seat_pad_4}/-RightY",
                "Pad5.RDown": "SDL-{seat_pad_4}/+RightY",
                "Pad5.LargeMotor": "SDL-{seat_pad_4}/LargeMotor",
                "Pad5.SmallMotor": "SDL-{seat_pad_4}/SmallMotor",
                "Pad2.Up": "SDL-{seat_pad_5}/DPadUp",
                "Pad2.Down": "SDL-{seat_pad_5}/DPadDown",
                "Pad2.Left": "SDL-{seat_pad_5}/DPadLeft",
                "Pad2.Right": "SDL-{seat_pad_5}/DPadRight",
                "Pad2.Cross": "SDL-{seat_pad_5}/A",
                "Pad2.Circle": "SDL-{seat_pad_5}/B",
                "Pad2.Square": "SDL-{seat_pad_5}/X",
                "Pad2.Triangle": "SDL-{seat_pad_5}/Y",
                "Pad2.Select": "SDL-{seat_pad_5}/Back",
                "Pad2.Start": "SDL-{seat_pad_5}/Start",
                "Pad2.L1": "SDL-{seat_pad_5}/LeftShoulder",
                "Pad2.R1": "SDL-{seat_pad_5}/RightShoulder",
                "Pad2.L2": "SDL-{seat_pad_5}/+LeftTrigger",
                "Pad2.R2": "SDL-{seat_pad_5}/+RightTrigger",
                "Pad2.L3": "SDL-{seat_pad_5}/LeftStick",
                "Pad2.R3": "SDL-{seat_pad_5}/RightStick",
                "Pad2.LLeft": "SDL-{seat_pad_5}/-LeftX",
                "Pad2.LRight": "SDL-{seat_pad_5}/+LeftX",
                "Pad2.LUp": "SDL-{seat_pad_5}/-LeftY",
                "Pad2.LDown": "SDL-{seat_pad_5}/+LeftY",
                "Pad2.RLeft": "SDL-{seat_pad_5}/-RightX",
                "Pad2.RRight": "SDL-{seat_pad_5}/+RightX",
                "Pad2.RUp": "SDL-{seat_pad_5}/-RightY",
                "Pad2.RDown": "SDL-{seat_pad_5}/+RightY",
                "Pad2.LargeMotor": "SDL-{seat_pad_5}/LargeMotor",
                "Pad2.SmallMotor": "SDL-{seat_pad_5}/SmallMotor",
                "Pad6.Up": "SDL-{seat_pad_6}/DPadUp",
                "Pad6.Down": "SDL-{seat_pad_6}/DPadDown",
                "Pad6.Left": "SDL-{seat_pad_6}/DPadLeft",
                "Pad6.Right": "SDL-{seat_pad_6}/DPadRight",
                "Pad6.Cross": "SDL-{seat_pad_6}/A",
                "Pad6.Circle": "SDL-{seat_pad_6}/B",
                "Pad6.Square": "SDL-{seat_pad_6}/X",
                "Pad6.Triangle": "SDL-{seat_pad_6}/Y",
                "Pad6.Select": "SDL-{seat_pad_6}/Back",
                "Pad6.Start": "SDL-{seat_pad_6}/Start",
                "Pad6.L1": "SDL-{seat_pad_6}/LeftShoulder",
                "Pad6.R1": "SDL-{seat_pad_6}/RightShoulder",
                "Pad6.L2": "SDL-{seat_pad_6}/+LeftTrigger",
                "Pad6.R2": "SDL-{seat_pad_6}/+RightTrigger",
                "Pad6.L3": "SDL-{seat_pad_6}/LeftStick",
                "Pad6.R3": "SDL-{seat_pad_6}/RightStick",
                "Pad6.LLeft": "SDL-{seat_pad_6}/-LeftX",
                "Pad6.LRight": "SDL-{seat_pad_6}/+LeftX",
                "Pad6.LUp": "SDL-{seat_pad_6}/-LeftY",
                "Pad6.LDown": "SDL-{seat_pad_6}/+LeftY",
                "Pad6.RLeft": "SDL-{seat_pad_6}/-RightX",
                "Pad6.RRight": "SDL-{seat_pad_6}/+RightX",
                "Pad6.RUp": "SDL-{seat_pad_6}/-RightY",
                "Pad6.RDown": "SDL-{seat_pad_6}/+RightY",
                "Pad6.LargeMotor": "SDL-{seat_pad_6}/LargeMotor",
                "Pad6.SmallMotor": "SDL-{seat_pad_6}/SmallMotor",
                "Pad7.Up": "SDL-{seat_pad_7}/DPadUp",
                "Pad7.Down": "SDL-{seat_pad_7}/DPadDown",
                "Pad7.Left": "SDL-{seat_pad_7}/DPadLeft",
                "Pad7.Right": "SDL-{seat_pad_7}/DPadRight",
                "Pad7.Cross": "SDL-{seat_pad_7}/A",
                "Pad7.Circle": "SDL-{seat_pad_7}/B",
                "Pad7.Square": "SDL-{seat_pad_7}/X",
                "Pad7.Triangle": "SDL-{seat_pad_7}/Y",
                "Pad7.Select": "SDL-{seat_pad_7}/Back",
                "Pad7.Start": "SDL-{seat_pad_7}/Start",
                "Pad7.L1": "SDL-{seat_pad_7}/LeftShoulder",
                "Pad7.R1": "SDL-{seat_pad_7}/RightShoulder",
                "Pad7.L2": "SDL-{seat_pad_7}/+LeftTrigger",
                "Pad7.R2": "SDL-{seat_pad_7}/+RightTrigger",
                "Pad7.L3": "SDL-{seat_pad_7}/LeftStick",
                "Pad7.R3": "SDL-{seat_pad_7}/RightStick",
                "Pad7.LLeft": "SDL-{seat_pad_7}/-LeftX",
                "Pad7.LRight": "SDL-{seat_pad_7}/+LeftX",
                "Pad7.LUp": "SDL-{seat_pad_7}/-LeftY",
                "Pad7.LDown": "SDL-{seat_pad_7}/+LeftY",
                "Pad7.RLeft": "SDL-{seat_pad_7}/-RightX",
                "Pad7.RRight": "SDL-{seat_pad_7}/+RightX",
                "Pad7.RUp": "SDL-{seat_pad_7}/-RightY",
                "Pad7.RDown": "SDL-{seat_pad_7}/+RightY",
                "Pad7.LargeMotor": "SDL-{seat_pad_7}/LargeMotor",
                "Pad7.SmallMotor": "SDL-{seat_pad_7}/SmallMotor",
                "Pad8.Up": "SDL-{seat_pad_8}/DPadUp",
                "Pad8.Down": "SDL-{seat_pad_8}/DPadDown",
                "Pad8.Left": "SDL-{seat_pad_8}/DPadLeft",
                "Pad8.Right": "SDL-{seat_pad_8}/DPadRight",
                "Pad8.Cross": "SDL-{seat_pad_8}/A",
                "Pad8.Circle": "SDL-{seat_pad_8}/B",
                "Pad8.Square": "SDL-{seat_pad_8}/X",
                "Pad8.Triangle": "SDL-{seat_pad_8}/Y",
                "Pad8.Select": "SDL-{seat_pad_8}/Back",
                "Pad8.Start": "SDL-{seat_pad_8}/Start",
                "Pad8.L1": "SDL-{seat_pad_8}/LeftShoulder",
                "Pad8.R1": "SDL-{seat_pad_8}/RightShoulder",
                "Pad8.L2": "SDL-{seat_pad_8}/+LeftTrigger",
                "Pad8.R2": "SDL-{seat_pad_8}/+RightTrigger",
                "Pad8.L3": "SDL-{seat_pad_8}/LeftStick",
                "Pad8.R3": "SDL-{seat_pad_8}/RightStick",
                "Pad8.LLeft": "SDL-{seat_pad_8}/-LeftX",
                "Pad8.LRight": "SDL-{seat_pad_8}/+LeftX",
                "Pad8.LUp": "SDL-{seat_pad_8}/-LeftY",
                "Pad8.LDown": "SDL-{seat_pad_8}/+LeftY",
                "Pad8.RLeft": "SDL-{seat_pad_8}/-RightX",
                "Pad8.RRight": "SDL-{seat_pad_8}/+RightX",
                "Pad8.RUp": "SDL-{seat_pad_8}/-RightY",
                "Pad8.RDown": "SDL-{seat_pad_8}/+RightY",
                "Pad8.LargeMotor": "SDL-{seat_pad_8}/LargeMotor",
                "Pad8.SmallMotor": "SDL-{seat_pad_8}/SmallMotor"
              }
            }
          ]
        }
      ],
      "apply": {
        "kind": "arg",
        "args": []
      },
      "section": "Controllers"
    },
    {
      "id": "renderer",
      "label": "Renderer",
      "tab": "graphics",
      "type": "choice",
      "role": "renderer",
      "section": "Renderer",
      "restart": true,
      "default": "Automatic",
      "values": [
        {
          "value": "Automatic",
          "label": "Automatic"
        },
        {
          "value": "Vulkan",
          "label": "Vulkan"
        },
        {
          "value": "D3D12",
          "label": "Direct3D 12 (Windows)",
          "os": [
            "windows"
          ]
        },
        {
          "value": "D3D11",
          "label": "Direct3D 11 (Windows)",
          "os": [
            "windows"
          ]
        },
        {
          "value": "OpenGL",
          "label": "OpenGL"
        },
        {
          "value": "Software",
          "label": "Software (slow, most accurate)"
        }
      ],
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "GPU.Renderer"
      }
    },
    {
      "id": "resolution",
      "label": "Internal resolution",
      "tab": "graphics",
      "type": "choice",
      "role": "internal_resolution",
      "section": "Resolution",
      "default": 1,
      "values": [
        {
          "value": 1,
          "label": "Native (240p)"
        },
        {
          "value": 2,
          "label": "2× (480p)"
        },
        {
          "value": 3,
          "label": "3× (for 720p)"
        },
        {
          "value": 4,
          "label": "4× (960p)"
        },
        {
          "value": 5,
          "label": "5× (for 1080p)"
        },
        {
          "value": 6,
          "label": "6× (for 1440p)"
        },
        {
          "value": 8,
          "label": "8× (1920p)"
        },
        {
          "value": 9,
          "label": "9× (for 4K)"
        }
      ],
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "GPU.ResolutionScale"
      }
    },
    {
      "id": "msaa",
      "label": "Anti-aliasing",
      "tab": "graphics",
      "type": "choice",
      "role": "anti_aliasing",
      "section": "Resolution",
      "default": 1,
      "values": [
        {
          "value": 1,
          "label": "Off"
        },
        {
          "value": 2,
          "label": "2× MSAA"
        },
        {
          "value": 4,
          "label": "4× MSAA"
        },
        {
          "value": 8,
          "label": "8× MSAA"
        }
      ],
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "GPU.Multisamples"
      }
    },
    {
      "id": "texture_filter",
      "label": "Texture smoothing",
      "tab": "graphics",
      "type": "choice",
      "role": "enhancement",
      "section": "Image quality",
      "default": "Nearest",
      "values": [
        {
          "value": "Nearest",
          "label": "Off (original)"
        },
        {
          "value": "Bilinear",
          "label": "Bilinear"
        },
        {
          "value": "JINC2",
          "label": "JINC2"
        },
        {
          "value": "xBR",
          "label": "xBR"
        }
      ],
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "GPU.TextureFilter"
      }
    },
    {
      "id": "pgxp",
      "label": "Steadier 3D (less wobble)",
      "tab": "graphics",
      "type": "toggle",
      "role": "enhancement",
      "section": "Image quality",
      "default": false,
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "GPU.PGXPEnable",
        "on": "true",
        "off": "false"
      }
    },
    {
      "id": "widescreen",
      "label": "Widescreen (3D scenes)",
      "tab": "graphics",
      "type": "toggle",
      "role": "aspect",
      "section": "Display",
      "description": "Renders 3D scenes wider. 2D backgrounds and menus stay 4:3, and some games show glitches at the edges.",
      "default": false,
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "GPU.WidescreenHack",
        "on": "true",
        "off": "false"
      }
    },
    {
      "id": "aspect",
      "label": "Screen shape",
      "tab": "graphics",
      "type": "choice",
      "role": "aspect",
      "section": "Display",
      "default": "Auto (Game Native)",
      "values": [
        {
          "value": "Auto (Game Native)",
          "label": "The game’s own"
        },
        {
          "value": "4:3",
          "label": "4:3"
        },
        {
          "value": "16:9",
          "label": "16:9"
        },
        {
          "value": "Stretch To Fill",
          "label": "Stretch to fill"
        }
      ],
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "Display.AspectRatio"
      }
    },
    {
      "id": "vsync",
      "label": "V-Sync",
      "tab": "graphics",
      "type": "toggle",
      "role": "vsync",
      "section": "Display",
      "default": false,
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "Display.VSync",
        "on": "true",
        "off": "false"
      }
    },
    {
      "id": "volume",
      "label": "Volume",
      "tab": "audio",
      "type": "slider",
      "min": 0,
      "max": 100,
      "step": 5,
      "default": 100,
      "apply": {
        "kind": "config_edit",
        "file": "{emulator_dir}/settings.ini",
        "format": "ini",
        "key": "Audio.OutputVolume"
      }
    }
  ],
  "presets": [
    {
      "id": "performance",
      "label": "Performance",
      "description": "Native resolution, no extras.",
      "values": {
        "resolution": 1,
        "msaa": 1,
        "texture_filter": "Nearest",
        "pgxp": false
      }
    },
    {
      "id": "balanced",
      "label": "Balanced",
      "description": "Sharper 3D for a 720p screen, with geometry correction.",
      "values": {
        "resolution": 3,
        "msaa": 1,
        "texture_filter": "Nearest",
        "pgxp": true
      }
    },
    {
      "id": "quality",
      "label": "Quality",
      "description": "Sharp 3D for a 1080p screen, with anti-aliasing and geometry correction.",
      "values": {
        "resolution": 5,
        "msaa": 4,
        "texture_filter": "Nearest",
        "pgxp": true
      }
    }
  ],
  "auto": {
    "renderer": "Automatic"
  },
  "unsupported": {
    "netplay": "The emulator has no online play.",
    "mods": "Texture packs need the emulator’s experimental texture cache, which Kouch leaves off.",
    "motion": "The console’s pads had no motion sensors."
  },
  "platforms": {
    "windows": {
      "launch": {
        "kind": "exe",
        "path": "duckstation-qt-x64-ReleaseLTCG.exe"
      },
      "source": {
        "kind": "github_release",
        "repo": "stenzek/duckstation",
        "asset": "duckstation-windows-x64-release.zip",
        "url": null,
        "sha256": null,
        "install_subdir": null,
        "executable": "duckstation-qt-x64-ReleaseLTCG.exe",
        "auto_update": false,
        "feed": null,
        "keep": [
          "settings.ini"
        ],
        "tag": "v*"
      }
    },
    "linux": {
      "launch": {
        "kind": "exe",
        "path": "DuckStation.AppImage"
      },
      "source": {
        "kind": "github_release",
        "repo": "stenzek/duckstation",
        "asset": "DuckStation-x64.AppImage",
        "url": null,
        "sha256": null,
        "install_subdir": null,
        "executable": "DuckStation.AppImage",
        "auto_update": false,
        "feed": null,
        "keep": [
          "settings.ini"
        ],
        "tag": "v*"
      },
      "env": {
        "XDG_CONFIG_HOME": "{user_data}/xdg-config",
        "XDG_DATA_HOME": "{user_data}/xdg-data",
        "XDG_CACHE_HOME": "{user_data}/xdg-cache"
      }
    }
  }
}
