Skip to content

Commit 066692f

Browse files
committed
New & updated features, documentation and fixes
- Updated Neo Geo Support via RetroArch Geolith Core - ZIP ROM Detection - MAME Support for Arcade ROMs - New CHD Converter & MAME DAT Editor - New RetroArch Utilities - New MAME Integration View - New Accessible Settings - New ROM Organizer & Copy or Move choice - New Analogue Pocket/NT/SuperNT/MegaSG/3D tools - Emulator Config Generator Improvements - Settings & UI Cleanup - Project Structure Reorganization - Fixes
1 parent 86e497a commit 066692f

145 files changed

Lines changed: 28308 additions & 2063 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ env:
1010
DOTNET_VERSION: '8.0.x'
1111
DOTNET_CLI_TELEMETRY_OPTOUT: true
1212
DOTNET_NOLOGO: true
13-
APP_VERSION: '2.0.0'
13+
APP_VERSION: '3.0.0'
1414
SDL2_VERSION: '2.30.12'
1515

1616
jobs:

README.md

Lines changed: 164 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<img src="/Screenshots/Screenshot.png" width="75%">
88
<img src="/Screenshots/BigPictureMode.png" width="75%">
99

10-
A cross-platform desktop utility for managing, inspecting, modifying & launching retro game ROMs.
10+
A cross-platform desktop utility for managing, inspecting, and patching retro game ROMs.
1111

1212
[![License: BSD-2-Clause](https://img.shields.io/badge/License-BSD_2--Clause-blue.svg)](LICENSE)
1313
[![.NET](https://img.shields.io/badge/.NET-8.0-purple.svg)](https://dotnet.microsoft.com/download/dotnet/8.0)
@@ -69,7 +69,14 @@ Framework-dependent builds require the [.NET 8 Runtime](https://dotnet.microsoft
6969

7070
For detailed user guides and reference material, see the [full documentation](docs/README.md).
7171

72-
- [ROM Browser & RetroArch Integration Guide](docs/features/rom-browser-guide.md) — step-by-step guide to browsing, managing, and launching ROMs with RetroArch
72+
### Quick Links
73+
74+
- **[Installation Guide](docs/getting-started/installation.md)** — download and install on Windows, Linux, or macOS
75+
- **[First Steps](docs/getting-started/first-steps.md)** — get up and running in minutes
76+
- **[ROM Browser Guide](docs/guides/rom-browser-guide.md)** — step-by-step guide to browsing, managing, and launching ROMs
77+
- **[Big Picture Mode](docs/guides/big-picture-mode.md)** — fullscreen, controller-friendly ROM library
78+
- **[Keyboard Shortcuts](docs/configuration/keyboard-shortcuts.md)** — all shortcuts in one place
79+
- **[Troubleshooting](docs/troubleshooting.md)** — common issues and solutions
7380

7481
## Features
7582

@@ -441,7 +448,8 @@ For detailed user guides and reference material, see the [full documentation](do
441448
- Auto-detect or manually configure the RetroArch executable path
442449
- Scan for installed libretro cores and identify missing ones
443450
- Download all missing cores from the official RetroArch buildbot
444-
- Supports Windows, Linux, and macOS platforms
451+
- Supports Windows (x64), Linux (x64, ARM64), and macOS (Intel, Apple Silicon)
452+
- Handles Flatpak and Snap RetroArch installations on Linux
445453
- Download progress with cancel support
446454

447455
</details>
@@ -537,106 +545,199 @@ For detailed user guides and reference material, see the [full documentation](do
537545

538546
</details>
539547

548+
### RetroArch
549+
550+
<details>
551+
<summary><strong>RetroArch Playlist Creator</strong></summary>
552+
553+
- Create RetroArch playlists (.lpl) from a directory of ROM files
554+
- Select from all supported systems with automatic database name mapping
555+
- Load and edit existing RetroArch playlists
556+
- Add or remove individual playlist entries
557+
- Download thumbnails (box art, snapshots, title screens) from the [Libretro Thumbnails](https://github.com/libretro-thumbnails) database
558+
- Selectable thumbnail categories with overwrite option
559+
- Save playlists in RetroArch's JSON .lpl format
560+
- Automatic playlist and thumbnail directory detection for Windows, Linux, and macOS
561+
562+
</details>
563+
564+
<details>
565+
<summary><strong>RetroArch Shortcut Creator</strong></summary>
566+
567+
- Create desktop shortcuts that launch a ROM directly in RetroArch with a specific libretro core
568+
- Windows `.lnk` shortcuts (created via PowerShell), Linux `.desktop` files, macOS `.command` scripts
569+
- Select system and core from a dropdown of all available cores
570+
- Optional custom icon, fullscreen mode, and extra RetroArch arguments
571+
- Override RetroArch path per shortcut
572+
- Automatic core directory detection (including Flatpak, Snap, and Homebrew locations)
573+
- Shell-safe argument escaping on Linux and macOS
574+
575+
</details>
576+
577+
<details>
578+
<summary><strong>RetroAchievements Writer</strong></summary>
579+
580+
- Create and edit achievement definition files compatible with [RetroAchievements.org](https://retroachievements.org)
581+
- Standard RACache local achievement JSON format for import into the RetroAchievements web toolkit
582+
- Add achievements with title, description, points, memory address conditions, type, author, and badge ID
583+
- Achievement types: Standard, Missable, Progression, Win Condition
584+
- Supports 78 console IDs (NES, SNES, N64, Mega Drive, Game Boy, PlayStation, and many more)
585+
- Validate achievement sets for completeness and correctness
586+
- Export as plain-text local format for RAIntegration / RALibretro
587+
- Load and save achievement sets as JSON files
588+
589+
</details>
590+
591+
### Analogue
592+
593+
<details>
594+
<summary><strong>Analogue Pocket</strong></summary>
595+
596+
- Browse and manage openFPGA cores installed on the Analogue Pocket SD card
597+
- Export Pocket screenshots (BMP) to a destination folder
598+
- Backup and restore save files with directory structure preserved
599+
- Manage and delete save states with multi-select and batch delete
600+
- Extract and export Game Boy Camera photos from `.sav` files as grayscale BMP images
601+
- Auto-copy files from a source folder to the Pocket SD card matching the directory structure
602+
- Generate placeholder library images for ROMs that don't have one (160×144 BMP with game name)
603+
- Browse game platform folders under Assets
604+
- SD card validation to verify correct Pocket directory structure
605+
606+
</details>
607+
608+
<details>
609+
<summary><strong>Analogue Mega SG</strong></summary>
610+
611+
- Generate custom 8×8 pixel fonts for the Mega SG on-screen menu
612+
- Create fonts from a 128×128 BMP source image (16×16 grid of 8×8 characters) or use the built-in default font
613+
- Convert save files between formats with endianness swapping, power-of-two padding, and trailing byte trimming
614+
- Analyze save file type (EEPROM, SRAM, Flash) from file size
615+
- Convert between `.sav` and `.srm` save formats
616+
617+
</details>
618+
619+
<details>
620+
<summary><strong>Analogue NT / Super NT</strong></summary>
621+
622+
- Generate custom 8×8 pixel fonts for the Analogue NT and Super NT on-screen menus
623+
- Create fonts from a 128×128 BMP source image or use the built-in default font
624+
- Repair NES ROM headers using a safe temp-file workflow (writes to temp file first, then replaces original)
625+
626+
</details>
627+
628+
<details>
629+
<summary><strong>Analogue 3D</strong></summary>
630+
631+
- Manage N64 Game Pak ROMs on the Analogue 3D SD card
632+
- Scan and list all Game Paks with metadata (internal name, game code, file size)
633+
- Per-game display settings: resolution, aspect ratio, smoothing, crop overscan
634+
- Per-game hardware settings: Expansion Pak, Rumble Pak, CPU overclock, Controller Pak mode
635+
- Set or remove custom label artwork (PNG) for each Game Pak
636+
- Atomic settings writes (temp file + rename) to prevent SD card corruption
637+
- SD card validation to verify correct Analogue 3D directory structure
638+
639+
</details>
640+
540641
## Supported Systems
541642

542643
| System | Extensions |
543644
|---|---|
544-
| Nintendo Entertainment System (NES) | `.nes` |
545-
| Super Nintendo (SNES) | `.smc`, `.sfc` |
546-
| Nintendo 64 | `.z64`, `.n64`, `.v64` |
547-
| Nintendo 64DD | `.ndd` |
548-
| Nintendo DS | `.nds` |
549-
| Nintendo 3DS | `.3ds`, `.cia` |
550-
| Game Boy | `.gb` |
551-
| Game Boy Color | `.gbc` |
552-
| Game Boy Advance | `.gba` |
553-
| Nintendo Virtual Boy | `.vb`, `.vboy` |
554-
| Sega Master System | `.sms` |
555-
| Sega Mega Drive / Genesis | `.md`, `.gen`, `.bin` |
556-
| Sega CD | `.iso`, `.cue` |
557-
| Sega 32X | `.32x` |
558-
| Sega Game Gear | `.gg` |
645+
| Amiga CD32 | `.iso`, `.cue` |
646+
| Amstrad CPC | `.dsk`, `.cdt`, `.sna` |
647+
| Arcade (MAME) | `.zip` |
559648
| Atari 2600 | `.a26` |
560649
| Atari 5200 | `.a52` |
561650
| Atari 7800 | `.a78` |
562651
| Atari 800 / XL / XE | `.atr`, `.xex`, `.car`, `.cas` |
563652
| Atari Jaguar | `.j64`, `.jag` |
564653
| Atari Lynx | `.lnx`, `.lyx` |
565-
| PC Engine / TurboGrafx-16 | `.pce`, `.tg16` |
566-
| SNK Neo Geo | `.neo` |
567-
| SNK Neo Geo CD | `.iso`, `.cue` |
568-
| SNK Neo Geo Pocket / Pocket Color | `.ngp`, `.ngc` |
569654
| Coleco ColecoVision | `.col`, `.cv` |
655+
| Fairchild Channel F | `.chf` |
656+
| Game Boy | `.gb` |
657+
| Game Boy Advance | `.gba` |
658+
| Game Boy Color | `.gbc` |
570659
| Mattel Intellivision | `.int` |
660+
| Memotech MTX | `.mtx`, `.run` |
571661
| MSX | `.mx1` |
572662
| MSX2 | `.mx2` |
573663
| NEC PC-88 | `.d88`, `.t88` |
574-
| Amstrad CPC | `.dsk`, `.cdt`, `.sna` |
664+
| Nintendo 3DS | `.3ds`, `.cia` |
665+
| Nintendo 64 | `.z64`, `.n64`, `.v64` |
666+
| Nintendo 64DD | `.ndd` |
667+
| Nintendo DS | `.nds` |
668+
| Nintendo Entertainment System (NES) | `.nes` |
669+
| Nintendo GameCube | `.gcm`, `.iso` |
670+
| Nintendo Virtual Boy | `.vb`, `.vboy` |
671+
| Nintendo Wii | `.iso` |
575672
| Oric / Atmos / TeleStrat | `.tap` |
576-
| Thomson MO5 | `.mo5`, `.k7`, `.fd` |
577-
| Watara Supervision | `.sv` |
578-
| Radio Shack Color Computer | `.ccc` |
579673
| Panasonic 3DO | `.3do`, `.iso`, `.cue` |
674+
| PC Engine / TurboGrafx-16 | `.pce`, `.tg16` |
580675
| Philips CD-i | `.iso`, `.cue` |
581-
| Amiga CD32 | `.iso`, `.cue` |
582-
| Sega Saturn | `.iso`, `.cue` |
676+
| Radio Shack Color Computer | `.ccc` |
677+
| Sega 32X | `.32x` |
678+
| Sega CD | `.iso`, `.cue` |
583679
| Sega Dreamcast | `.cdi`, `.gdi`, `.iso`, `.cue` |
584-
| Nintendo GameCube | `.gcm`, `.iso` |
585-
| Nintendo Wii | `.iso` |
586-
| Arcade (MAME) | `.zip` |
587-
| Fairchild Channel F | `.chf` |
680+
| Sega Game Gear | `.gg` |
681+
| Sega Master System | `.sms` |
682+
| Sega Mega Drive / Genesis | `.md`, `.gen`, `.bin` |
683+
| Sega Saturn | `.iso`, `.cue` |
684+
| SNK Neo Geo | `.neo` |
685+
| SNK Neo Geo CD | `.iso`, `.cue` |
686+
| SNK Neo Geo Pocket / Pocket Color | `.ngp`, `.ngc` |
687+
| Super Nintendo (SNES) | `.smc`, `.sfc` |
688+
| Thomson MO5 | `.mo5`, `.k7`, `.fd` |
588689
| Tiger Game Com | `.tgc` |
589-
| Memotech MTX | `.mtx`, `.run` |
690+
| Watara Supervision | `.sv` |
590691

591692
### System Feature Coverage
592693

593694
| System | Header Parsing | Security Analysis | Dump Verification | Cheat Codes | Header Fixing |
594695
|---|---|---|---|---|---|
595-
| NES ||||||
596-
| SNES ||||||
597-
| N64 ||||||
598-
| N64DD ||||||
599-
| Nintendo DS ||||||
600-
| Nintendo 3DS ||||||
601-
| Game Boy ||||||
602-
| Game Boy Color ||||||
603-
| Game Boy Advance ||||||
604-
| Virtual Boy ||||||
605-
| Sega Master System ||||||
606-
| Mega Drive / Genesis ||||||
607-
| Sega CD ||||||
608-
| Sega 32X ||||||
609-
| Sega Game Gear ||||||
696+
| Amiga CD32 ||||||
697+
| Amstrad CPC ||||||
698+
| Arcade (MAME) ||||||
610699
| Atari 2600 ||||||
611700
| Atari 5200 ||||||
612701
| Atari 7800 ||||||
613702
| Atari 800 ||||||
614703
| Atari Jaguar ||||||
615704
| Atari Lynx ||||||
616-
| PC Engine ||||||
617-
| Neo Geo ||||||
618-
| Neo Geo CD ||||||
619-
| Neo Geo Pocket ||||||
620705
| ColecoVision ||||||
706+
| Color Computer ||||||
707+
| Fairchild Channel F ||||||
708+
| Game Boy ||||||
709+
| Game Boy Advance ||||||
710+
| Game Boy Color ||||||
621711
| Intellivision ||||||
712+
| Mega Drive / Genesis ||||||
713+
| Memotech MTX ||||||
622714
| MSX / MSX2 ||||||
715+
| N64 ||||||
716+
| N64DD ||||||
623717
| NEC PC-88 ||||||
624-
| Amstrad CPC ||||||
718+
| Neo Geo ||||||
719+
| Neo Geo CD ||||||
720+
| Neo Geo Pocket ||||||
721+
| NES ||||||
722+
| Nintendo 3DS ||||||
723+
| Nintendo DS ||||||
724+
| Nintendo GameCube ||||||
725+
| Nintendo Wii ||||||
625726
| Oric ||||||
626-
| Thomson MO5 ||||||
627-
| Watara Supervision ||||||
628-
| Color Computer ||||||
629727
| Panasonic 3DO ||||||
728+
| PC Engine ||||||
630729
| Philips CD-i ||||||
631-
| Amiga CD32 |||| | |
632-
| Sega Saturn ||||||
730+
| Sega 32X |||| | |
731+
| Sega CD ||||||
633732
| Sega Dreamcast ||||||
634-
| Nintendo GameCube ||||||
635-
| Nintendo Wii ||||||
636-
| Arcade (MAME) ||||||
637-
| Fairchild Channel F ||||||
733+
| Sega Game Gear ||||||
734+
| Sega Master System ||||||
735+
| Sega Saturn ||||||
736+
| SNES ||||||
737+
| Thomson MO5 ||||||
638738
| Tiger Game Com ||||||
639-
| Memotech MTX ||||||
739+
| Virtual Boy ||||||
740+
| Watara Supervision ||||||
640741

641742
## Localization
642743

RetroMultiTools/App.axaml.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public override void OnFrameworkInitializationCompleted()
5555

5656
if (AppSettings.Instance.CheckForUpdatesOnStartup)
5757
{
58-
CheckForUpdatesAsync(_mainWindow, desktop);
58+
_ = CheckForUpdatesAsync(_mainWindow, desktop);
5959
}
6060
}
6161
base.OnFrameworkInitializationCompleted();
@@ -120,14 +120,29 @@ private void BuildNativeMenu()
120120
("metascraper", loc["Nav_MetadataScraper"]),
121121
("romrenamer", loc["Nav_RomRenamer"]));
122122

123+
// RetroArch
124+
AddNavSubmenu(nativeMenu, loc["Nav_RetroArch"],
125+
("raintegration", loc["Nav_RetroArchIntegration"]),
126+
("raachievements", loc["Nav_RetroAchievementsWriter"]),
127+
("raplaylist", loc["Nav_RetroArchPlaylist"]),
128+
("rashortcut", loc["Nav_RetroArchShortcut"]));
129+
123130
// MAME
124131
AddNavSubmenu(nativeMenu, loc["Nav_Mame"],
132+
("mameintegration", loc["Nav_MameIntegration"]),
125133
("mameauditor", loc["Nav_MameAuditor"]),
126134
("mamechd", loc["Nav_MameChd"]),
127135
("mamerebuilder", loc["Nav_MameRebuilder"]),
128136
("mamedir2dat", loc["Nav_MameDir2Dat"]),
129137
("mamesamples", loc["Nav_MameSamples"]));
130138

139+
// Analogue
140+
AddNavSubmenu(nativeMenu, loc["Nav_Analogue"],
141+
("analoguepocket", loc["Nav_AnaloguePocket"]),
142+
("analoguentsupernt", loc["Nav_AnalogueNtSuperNt"]),
143+
("analoguemegasg", loc["Nav_AnalogueMegaSg"]),
144+
("analogue3d", loc["Nav_Analogue3D"]));
145+
131146
// Help menu with Settings
132147
var helpMenu = new NativeMenuItem(loc["Menu_Help"])
133148
{
@@ -204,7 +219,7 @@ private void BuildTrayIcon()
204219

205220
private const int UpdateCheckDelayMs = 2000;
206221

207-
private static async void CheckForUpdatesAsync(Window owner, IClassicDesktopStyleApplicationLifetime desktop)
222+
private static async Task CheckForUpdatesAsync(Window owner, IClassicDesktopStyleApplicationLifetime desktop)
208223
{
209224
try
210225
{

0 commit comments

Comments
 (0)