diff --git a/README.md b/README.md index 94dd220..424b128 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ OmniEmu is a cross-platform emulator manager, game launcher, and ROM library for | Dolphin | GameCube, Wii | ✅ | ✅ | ✅ | | RPCS3 | PlayStation 3 | ✅ | — | ✅ | | Eden | Nintendo Switch | ✅ | ✅ | ✅ | +| Ryujinx | Nintendo Switch | ✅ | ✅ | ✅ | | PCSX2 | PlayStation 2 | ✅ | ✅ | ✅ | | DuckStation | PlayStation 1 | ✅ | ✅ | ✅ | | Mednafen | PS1, PC Engine, Lynx, Neo Geo Pocket, WonderSwan | ✅ | ✅ | ✅ | diff --git a/package-lock.json b/package-lock.json index 4858714..80f4d67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "omniemu2", - "version": "0.3.1", + "version": "0.3.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "omniemu2", - "version": "0.3.1", + "version": "0.3.3", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -20,7 +20,7 @@ "@vitejs/plugin-react": "^4.4.0", "7zip-bin": "^5.2.0", "concurrently": "^9.1.0", - "electron": "^43.1.0", + "electron": "^43.2.0", "electron-builder": "^25.1.0", "typescript": "^5.7.0", "vite": "^6.0.0" @@ -3318,9 +3318,9 @@ } }, "node_modules/electron": { - "version": "43.1.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-43.1.0.tgz", - "integrity": "sha512-DPfxpQLd4NL3BJ8DBxYAfmLUKKesF5Rx9dQx5FyczAP8bhOPScjHE48GArVeXu68LlAainuwkmQTQvdZwpIIAQ==", + "version": "43.3.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-43.3.0.tgz", + "integrity": "sha512-nLlvu0WFjftWsSaTkV2B/c4NDuJBspTyXu8vKSQ6vLvFt8uG3NgN49LLKcXddwX0GqVvAQDhciWp+4xOdTdhew==", "dev": true, "license": "MIT", "dependencies": { diff --git a/src/main/configurator.ts b/src/main/configurator.ts index 073374d..c00af72 100644 --- a/src/main/configurator.ts +++ b/src/main/configurator.ts @@ -91,6 +91,26 @@ CPU: "shader_cache": true, "audio_backend": "OpenAL", "controller": "SDL" +}`, + }, + }, + ], + ryujinx: [ + { + name: 'OmniEmu Recommended', + description: 'Best settings for Ryujinx Switch emulation', + files: { + 'Config.json': `{ + "graphics_backend": "Vulkan", + "resolution_scale": 2, + "docked_mode": true, + "max_anisotropy": 4, + "aspect_ratio": "16:9", + "enable_vsync": true, + "enable_ptc": true, + "enable_multi_thread_rendering": true, + "audio_backend": "SDL2", + "enable_discord_integration": false }`, }, }, @@ -399,6 +419,11 @@ function getConfigDir(emulatorId: string, installPath: string): string { darwin: join(require('os').homedir(), 'Library', 'Application Support', 'Eden'), linux: join(require('os').homedir(), '.config', 'Eden'), }, + ryujinx: { + win32: join(process.env.APPDATA || '', 'Ryujinx'), + darwin: join(require('os').homedir(), 'Library', 'Application Support', 'Ryujinx'), + linux: join(require('os').homedir(), '.config', 'Ryujinx'), + }, flycast: { win32: join(process.env.APPDATA || '', 'flycast'), darwin: join(require('os').homedir(), 'Library', 'Application Support', 'flycast'), @@ -551,6 +576,7 @@ const esdeEmulatorNames: Record = { melonds: 'MELONDS', flycast: 'FLYCAST', eden: 'EDEN', + ryujinx: 'RYUJINX', mednafen: 'MEDNAFEN', }; diff --git a/src/main/emulators.ts b/src/main/emulators.ts index 2dfd663..a8de93f 100644 --- a/src/main/emulators.ts +++ b/src/main/emulators.ts @@ -128,6 +128,52 @@ export const knownEmulators: EmulatorConfig[] = [ linux: 'https://eden-emu.dev/', }, }, + { + id: 'ryujinx', + name: 'Ryujinx', + description: 'Nintendo Switch emulator', + platforms: ['switch'], + defaultPath: { + win32: 'C:\\Program Files\\Ryujinx\\Ryujinx.exe', + darwin: '/Applications/Ryujinx.app/Contents/MacOS/Ryujinx', + linux: '/usr/bin/ryujinx', + }, + downloads: { + win32: [ + { + url: 'https://git.ryujinx.app/projects/Ryubing/releases/download/1.3.3/ryujinx-1.3.3-win_x64.zip', + format: 'zip', + executablePath: 'Ryujinx.exe', + arch: 'x64', + }, + ], + darwin: [ + { + url: 'https://git.ryujinx.app/projects/Ryubing/releases/download/1.3.3/ryujinx-1.3.3-macos_universal.app.tar.gz', + format: 'tar.gz', + executablePath: 'Ryujinx.app/Contents/MacOS/Ryujinx', + }, + ], + linux: [ + { + url: 'https://git.ryujinx.app/projects/Ryubing/releases/download/1.3.3/ryujinx-1.3.3-x64.AppImage', + format: 'appimage', + arch: 'x64', + }, + { + url: 'https://git.ryujinx.app/projects/Ryubing/releases/download/1.3.3/ryujinx-1.3.3-arm64.AppImage', + format: 'appimage', + arch: 'arm64', + }, + ], + }, + supported: true, + websiteUrl: { + win32: 'https://ryujinx.app/download', + darwin: 'https://ryujinx.app/download', + linux: 'https://ryujinx.app/download', + }, + }, { id: 'pcsx2', name: 'PCSX2', @@ -1031,6 +1077,13 @@ function alternativePaths(emulatorId: string): string[] { join(omniEmuDir, 'PCSX2'), join(omniEmuDir, 'pcsx2.AppImage'), ], + ryujinx: [ + join(omniEmuDir, 'Ryujinx.exe'), + join(omniEmuDir, 'ryujinx'), + join(omniEmuDir, 'Ryujinx'), + join(omniEmuDir, 'Ryujinx.AppImage'), + join(omniEmuDir, 'Ryujinx.app', 'Contents', 'MacOS', 'Ryujinx'), + ], mame: [ join(omniEmuDir, 'mame64.exe'), join(omniEmuDir, 'mame'), @@ -1299,6 +1352,8 @@ function launchArgs(emulatorId: string, romPath: string): string[] { return [romPath]; case 'eden': return [romPath]; + case 'ryujinx': + return [romPath]; case 'pcsx2': return [romPath]; case 'mame': diff --git a/src/main/saveManager.ts b/src/main/saveManager.ts index 7f3dd5b..e10bb96 100644 --- a/src/main/saveManager.ts +++ b/src/main/saveManager.ts @@ -143,6 +143,13 @@ function emulatorSaveDirs(emuId: string): SaveDirConfig | null { ? join(home, 'Library', 'Application Support', 'Eden', 'sdmc', '0000000000000000') : join(home, '.local', 'share', 'eden', 'sdmc', '0000000000000000'), }, + ryujinx: { + saves: platform === 'win32' + ? join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'Ryujinx', 'bis', 'user', 'save') + : platform === 'darwin' + ? join(home, 'Library', 'Application Support', 'Ryujinx', 'bis', 'user', 'save') + : join(home, '.config', 'Ryujinx', 'bis', 'user', 'save'), + }, pcsx2: { saves: platform === 'win32' ? join(process.env.USERPROFILE || home, 'Documents', 'PCSX2', 'memcards') @@ -321,7 +328,7 @@ export { emulatorSaveDirs }; export function guessSavePathFromLabel(label: string): string | null { const lower = label.toLowerCase(); - for (const emu of ['retroarch', 'dolphin', 'rpcs3', 'eden', 'pcsx2', 'duckstation', 'flycast', 'ppsspp']) { + for (const emu of ['retroarch', 'dolphin', 'rpcs3', 'eden', 'ryujinx', 'pcsx2', 'duckstation', 'flycast', 'ppsspp']) { if (lower.includes(emu)) return getSaveDir(emu); } return null; @@ -332,6 +339,7 @@ const EMU_SAVE_META: { id: string; name: string }[] = [ { id: 'dolphin', name: 'Dolphin' }, { id: 'rpcs3', name: 'RPCS3' }, { id: 'eden', name: 'Eden' }, + { id: 'ryujinx', name: 'Ryujinx' }, { id: 'pcsx2', name: 'PCSX2' }, { id: 'duckstation', name: 'DuckStation' }, { id: 'flycast', name: 'Flycast' },