Files
nix-steam-rom-manager/modules/steam-rom-manager/emulators.nix
mjallen18 219ce8eed1 emulators
2026-03-15 20:15:26 -05:00

756 lines
16 KiB
Nix

# 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;
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.fsuae;
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 = "";
};
};
}