# emulators.nix — single source of truth for all built-in emulator/parser metadata. # # Both default.nix (romFolder/fileTypes/executableArgs fallbacks) and options.nix # (package defaults) import this file so the two stay in sync. # # Each entry must have: # romFolder — sub-dir under romsDirectory (empty string for platform/artwork parsers) # fileTypes — list of extensions for glob pattern (empty for non-Glob parsers) # # Each entry may have: # package — nixpkgs derivation; omit for platform parsers that need no package # parserType — SRM parser type (default: "Glob") # executableArgs — default args string passed to the emulator # steamCategory — default Steam category tag string # parserInputs — attrset of extra parserInputs for non-Glob parsers pkgs: { # --------------------------------------------------------------------------- # Nintendo Switch # --------------------------------------------------------------------------- ryujinx = { # ryujinx removed from nixpkgs; ryubing is the community-maintained fork package = pkgs.ryubing; romFolder = "switch"; fileTypes = [ ".nca" ".NCA" ".nro" ".NRO" ".nso" ".NSO" ".nsp" ".NSP" ".xci" ".XCI" ]; executableArgs = "--fullscreen \"\${filePath}\""; steamCategory = "Switch"; }; # yuzu removed from nixpkgs; eden is the successor yuzu = { package = pkgs.eden; romFolder = "switch"; fileTypes = [ ".kip" ".KIP" ".nca" ".NCA" ".nro" ".NRO" ".nso" ".NSO" ".nsp" ".NSP" ".xci" ".XCI" ]; executableArgs = "-f -g \"\${filePath}\""; steamCategory = "Switch"; }; # --------------------------------------------------------------------------- # Nintendo NES # --------------------------------------------------------------------------- mesen = { package = pkgs.mesen; romFolder = "nes"; fileTypes = [ ".7z" ".7Z" ".fds" ".FDS" ".nes" ".NES" ".unif" ".UNIF" ".unf" ".UNF" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "NES"; }; # --------------------------------------------------------------------------- # Nintendo SNES # --------------------------------------------------------------------------- snes9x = { package = pkgs.snes9x-gtk; romFolder = "snes"; fileTypes = [ ".7z" ".7Z" ".bs" ".BS" ".sfc" ".SFC" ".smc" ".SMC" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "SNES"; }; # --------------------------------------------------------------------------- # Nintendo 64 # --------------------------------------------------------------------------- mupen64plus = { package = pkgs.mupen64plus; romFolder = "n64"; fileTypes = [ ".7z" ".7Z" ".n64" ".N64" ".v64" ".V64" ".z64" ".Z64" ".zip" ".ZIP" ]; executableArgs = "--fullscreen \"\${filePath}\""; steamCategory = "N64"; }; parallel-launcher = { package = pkgs.parallel-launcher; romFolder = "n64"; fileTypes = [ ".7z" ".7Z" ".n64" ".N64" ".v64" ".V64" ".z64" ".Z64" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "N64"; }; simple64 = { package = pkgs.simple64; romFolder = "n64"; fileTypes = [ ".7z" ".7Z" ".n64" ".N64" ".v64" ".V64" ".z64" ".Z64" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "N64"; }; # --------------------------------------------------------------------------- # Nintendo GameCube / Wii (Dolphin) # --------------------------------------------------------------------------- dolphin-emu = { package = pkgs.dolphin-emu; romFolder = "gc"; fileTypes = [ ".ciso" ".CISO" ".dol" ".DOL" ".elf" ".ELF" ".gcm" ".GCM" ".gcz" ".GCZ" ".iso" ".ISO" ".rvz" ".RVZ" ".wad" ".WAD" ".wbfs" ".WBFS" ".wia" ".WIA" ]; executableArgs = "-b -e \"\${filePath}\""; steamCategory = "GameCube"; }; # --------------------------------------------------------------------------- # Nintendo Wii U # --------------------------------------------------------------------------- cemu = { package = pkgs.cemu; romFolder = "wiiu"; fileTypes = [ ".wud" ".WUD" ".wux" ".WUX" ".rpx" ".RPX" ]; executableArgs = "-f -g \"\${filePath}\""; steamCategory = "Wii U"; }; # --------------------------------------------------------------------------- # Nintendo DS # --------------------------------------------------------------------------- melonDS = { package = pkgs.melonDS; romFolder = "nds"; fileTypes = [ ".7z" ".7Z" ".bin" ".BIN" ".nds" ".NDS" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "DS"; }; # --------------------------------------------------------------------------- # Nintendo 3DS # --------------------------------------------------------------------------- # citra-nightly removed from nixpkgs; azahar is the successor citra = { package = pkgs.azahar; romFolder = "3ds"; fileTypes = [ ".3ds" ".3DS" ".3dsx" ".3DSX" ".app" ".APP" ".axf" ".AXF" ".cci" ".CCI" ".cxi" ".CXI" ".elf" ".ELF" ]; executableArgs = "\"\${filePath}\""; steamCategory = "3DS"; }; # --------------------------------------------------------------------------- # Nintendo Game Boy / GBC # --------------------------------------------------------------------------- mgba = { package = pkgs.mgba; romFolder = "gb"; fileTypes = [ ".7z" ".7Z" ".gb" ".GB" ".gbc" ".GBC" ".dmg" ".DMG" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Game Boy"; }; # --------------------------------------------------------------------------- # Nintendo Game Boy Advance # --------------------------------------------------------------------------- # mgba handles GBA too; provide a dedicated entry for GBA-specific folder mgba-gba = { package = pkgs.mgba; romFolder = "gba"; fileTypes = [ ".7z" ".7Z" ".gba" ".GBA" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Game Boy Advance"; }; # --------------------------------------------------------------------------- # Sony PlayStation 1 # --------------------------------------------------------------------------- duckstation = { package = pkgs.duckstation; romFolder = "psx"; fileTypes = [ ".cue" ".CUE" ".chd" ".CHD" ".ecm" ".ECM" ".iso" ".ISO" ".m3u" ".M3U" ".mds" ".MDS" ".pbp" ".PBP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "PS1"; }; # --------------------------------------------------------------------------- # Sony PlayStation 2 # --------------------------------------------------------------------------- pcsx2 = { package = pkgs.pcsx2; romFolder = "ps2"; fileTypes = [ ".bin" ".BIN" ".chd" ".CHD" ".cso" ".CSO" ".dump" ".DUMP" ".gz" ".GZ" ".img" ".IMG" ".iso" ".ISO" ".mdf" ".MDF" ".nrg" ".NRG" ]; executableArgs = "\"\${filePath}\" --batch --fullscreen --no-gui"; steamCategory = "PS2"; }; # --------------------------------------------------------------------------- # Sony PlayStation 3 # --------------------------------------------------------------------------- rpcs3 = { package = pkgs.rpcs3; romFolder = "ps3"; # RPCS3 needs eboot.bin for extracted ISOs/installed PKGs. # Users may want to adjust the glob; this covers the ISO case. fileTypes = [ ".iso" ".ISO" ".bin" ".BIN" ".pkg" ".PKG" ]; executableArgs = "\"\${filePath}\""; steamCategory = "PS3"; }; # --------------------------------------------------------------------------- # Sony PlayStation Portable # --------------------------------------------------------------------------- ppsspp = { package = pkgs.ppsspp; romFolder = "psp"; fileTypes = [ ".elf" ".ELF" ".cso" ".CSO" ".iso" ".ISO" ".pbp" ".PBP" ".prx" ".PRX" ]; executableArgs = "\"\${filePath}\""; steamCategory = "PSP"; }; # --------------------------------------------------------------------------- # Sega Genesis / Mega Drive # --------------------------------------------------------------------------- blastem = { package = pkgs.blastem; romFolder = "genesis"; fileTypes = [ ".7z" ".7Z" ".bin" ".BIN" ".gen" ".GEN" ".md" ".MD" ".smd" ".SMD" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Genesis/Mega Drive"; }; # --------------------------------------------------------------------------- # Sega Dreamcast # --------------------------------------------------------------------------- flycast = { package = pkgs.flycast; romFolder = "dreamcast"; fileTypes = [ ".cdi" ".CDI" ".cue" ".CUE" ".chd" ".CHD" ".gdi" ".GDI" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Dreamcast"; }; # --------------------------------------------------------------------------- # Sega Saturn # --------------------------------------------------------------------------- mednaffe = { # mednaffe is a GUI frontend for mednafen; mednafen itself is the emulator. # The SRM preset launches mednaffe which wraps mednafen. package = pkgs.mednaffe; romFolder = "saturn"; fileTypes = [ ".7z" ".7Z" ".ccd" ".CCD" ".chd" ".CHD" ".cue" ".CUE" ".m3u" ".M3U" ".toc" ".TOC" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Saturn"; }; # --------------------------------------------------------------------------- # Microsoft Xbox (original) # --------------------------------------------------------------------------- xemu = { package = pkgs.xemu; romFolder = "xbox"; fileTypes = [ ".iso" ".ISO" ]; executableArgs = "-full-screen -dvd_path \"\${filePath}\""; steamCategory = "Xbox"; }; # --------------------------------------------------------------------------- # Microsoft DOS # --------------------------------------------------------------------------- dosbox = { package = pkgs.dosbox; romFolder = "dos"; fileTypes = [ ".exe" ".EXE" ".bat" ".BAT" ".com" ".COM" ".conf" ".CONF" ]; executableArgs = "\"\${filePath}\""; steamCategory = "DOS"; }; dosbox-staging = { package = pkgs.dosbox-staging; romFolder = "dos"; fileTypes = [ ".exe" ".EXE" ".bat" ".BAT" ".com" ".COM" ".conf" ".CONF" ]; executableArgs = "\"\${filePath}\""; steamCategory = "DOS"; }; dosbox-x = { package = pkgs.dosbox-x; romFolder = "dos"; fileTypes = [ ".exe" ".EXE" ".bat" ".BAT" ".com" ".COM" ".conf" ".CONF" ]; executableArgs = "\"\${filePath}\""; steamCategory = "DOS"; }; # --------------------------------------------------------------------------- # Arcade (MAME) # --------------------------------------------------------------------------- mame = { package = pkgs.mame; romFolder = "arcade"; fileTypes = [ ".7z" ".7Z" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Arcade"; }; # --------------------------------------------------------------------------- # RetroArch (multi-system) # --------------------------------------------------------------------------- retroarch = { package = pkgs.retroarch; romFolder = "retroarch"; fileTypes = [ ".7z" ".7Z" ".bin" ".BIN" ".chd" ".CHD" ".iso" ".ISO" ".zip" ".ZIP" ]; executableArgs = "-L \"\${filePath}\""; steamCategory = "RetroArch"; }; # --------------------------------------------------------------------------- # ares (multi-system — covers many classic systems) # See: https://ares-emu.net # --------------------------------------------------------------------------- ares = { package = pkgs.ares-emu; romFolder = "ares"; fileTypes = [ ".7z" ".7Z" ".zip" ".ZIP" ".bin" ".BIN" ".rom" ".ROM" ".n64" ".N64" ".v64" ".V64" ".z64" ".Z64" ".nes" ".NES" ".fds" ".FDS" ".sfc" ".SFC" ".smc" ".SMC" ".gb" ".GB" ".gbc" ".GBC" ".gba" ".GBA" ".md" ".MD" ".gen" ".GEN" ".smd" ".SMD" ".sms" ".SMS" ".gg" ".GG" ".pce" ".PCE" ".ws" ".WS" ".wsc" ".WSC" ".col" ".COL" ".a26" ".A26" ]; executableArgs = "--fullscreen \"\${filePath}\""; steamCategory = "ares"; }; # --------------------------------------------------------------------------- # ScummVM # --------------------------------------------------------------------------- scummvm = { package = pkgs.scummvm; romFolder = "scummvm"; fileTypes = [ ]; # ScummVM is typically pointed at a game directory, not files executableArgs = "--path=\"\${filePath}\" --auto-detect -x"; steamCategory = "ScummVM"; }; # --------------------------------------------------------------------------- # Atari 2600 # --------------------------------------------------------------------------- stella = { package = pkgs.stella; romFolder = "atari2600"; fileTypes = [ ".7z" ".7Z" ".a26" ".A26" ".bin" ".BIN" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Atari 2600"; }; # --------------------------------------------------------------------------- # Commodore Amiga # --------------------------------------------------------------------------- fs-uae = { package = pkgs.fs-uae; romFolder = "amiga"; fileTypes = [ ".7z" ".7Z" ".adf" ".ADF" ".adz" ".ADZ" ".dms" ".DMS" ".lha" ".LHA" ".zip" ".ZIP" ]; executableArgs = "\"\${filePath}\""; steamCategory = "Amiga"; }; # --------------------------------------------------------------------------- # Platform parsers (no ROM file scanning; no package required at runtime) # parserType must match exactly what SRM expects. # --------------------------------------------------------------------------- "Non-SRM Shortcuts" = { parserType = "Non-SRM Shortcuts"; romFolder = ""; fileTypes = [ ]; steamCategory = ""; parserInputs = { }; }; epic = { parserType = "Epic"; romFolder = ""; fileTypes = [ ]; steamCategory = "Epic"; parserInputs = { epicLauncherMode = true; epicManifests = ""; }; }; legendary = { # legendary-gl provides the `legendary` CLI tool for Epic Games package = pkgs.legendary-gl; parserType = "Legendary"; romFolder = ""; fileTypes = [ ]; steamCategory = "Legendary"; parserInputs = { legendaryInstalledFile = ""; }; }; gog = { parserType = "GOG Galaxy"; romFolder = ""; fileTypes = [ ]; steamCategory = "GOG"; parserInputs = { galaxyExeOverride = ""; gogLauncherMode = false; }; }; "itch.io" = { parserType = "itch.io"; romFolder = ""; fileTypes = [ ]; steamCategory = "itch.io"; parserInputs = { itchIoAppDataOverride = ""; }; }; }