From 99cdf9cc1185d03cfeee81f035786ca14f466ae3 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Sat, 17 Feb 2024 17:28:23 +0100 Subject: [PATCH] Documentation update for the 3.0.0 release --- CHANGELOG.md | 14 +- FAQ.md | 38 +- INSTALL.md | 1150 ++++++++++-------- THEMES-DEV.md | 2 +- THEMES.md | 139 ++- USERGUIDE-DEV.md | 24 +- USERGUIDE.md | 478 ++++---- es-app/assets/org.es_de.frontend.appdata.xml | 3 + images/es-de_application_updater.png | Bin 119481 -> 81390 bytes 9 files changed, 1043 insertions(+), 805 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4872c045d..9e0bad016 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,17 @@ # ES-DE (EmulationStation Desktop Edition) - Changelog -## Version 3.0.0 (in development) +## Version 3.0.0 -**Release date:** TBD +**Release date:** 2024-02-17 ### Release overview +The 3.0 release rebrands the application from EmulationStation Desktop Edition to simply ES-DE. And as part of this the application data directory has changed from .emulationstation to ES-DE and its internal structure has been improved. There is also a new default theme named Linear that is bundled with the application. + +Support for configurable font sizes has also been added, so assuming the theme supports it, it's now possible to select between these sizes from the _UI settings_ menu. + +A number of minor improvements and bug fixes are also part of this release. + ### Detailed list of changes * Renamed the application from EmulationStation Desktop Edition to ES-DE @@ -22,7 +28,7 @@ * Changed the custom slideshow image directory setting from ScreensaverSlideshowImageDir to ScreensaverSlideshowCustomDir * The HTTP error code will now be shown on scraper errors instead of the "File is smaller than 350 bytes" message * Removed the ScraperHaltOnInvalidMedia option and corresponding menu entry as it has been superseded by the HTTP error code logic -* Added a ScraperIgnoreHTTP404Errors option that can be manually set in es_settings.xml to ignore 404 errors (resource not found) +* Added a ScraperIgnoreHTTP404Errors option that can be manually set in es_settings.xml to ignore 404 errors (i.e. resource not found) * Added Mednafen standalone as an alternative emulator for the gb, gba, gbc and supergrafx systems * Added Mesen standalone as an alternative emulator for the gamegear, mastersystem and multivision systems on Linux, Unix and Windows * Added Mesen standalone as an alternative emulator for the sg-1000 and supergrafx systems on Linux, Unix and Windows @@ -58,6 +64,8 @@ * The relevant SDL error message is now printed to the log if a controller could not be added * Added rendering workarounds for some mobile GPUs which do not support all OpenGL operations when using the BGRA pixel format * Added the UTF8-CPP library as a dependency +* Updated SDL to 2.30.0 on Windows, macOS and the Linux AppImage builds +* Bundled the December 2023 release of the Mozilla TLS/SSL certificates ### Bug fixes diff --git a/FAQ.md b/FAQ.md index 922d4a0c6..594b8ac05 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1,20 +1,16 @@ # ES-DE (EmulationStation Desktop Edition) - Frequently Asked Questions -## What is this project and how is it related to other EmulationStation forks? +## What's the correct name for the application? ES-DE, EmulationStation etc? -This project started in 2020 as a fork of RetroPie EmulationStation and it has been in very active development ever since. Large parts of the application have been rewritten and much functionality has been added, so overall it's a quite different application by now. - -## What's the correct name? EmulationStation, ES-DE, Emulation Station, EmuStation etc? - -The correct name is EmulationStation Desktop Edition, which is for practical reasons often shortened to EmulationStation-DE or more commonly ES-DE. It's not spelled Emulation Station (i.e. two separate words) in the same manner as you don't write Sony Play Station or Nintendo Game Cube. +As of the 3.0.0 release the official name for the project and application is ES-DE or sometimes ES-DE Frontend. This stands for EmulationStation Desktop Edition as the project originated from the RetroPie fork of EmulationStation in 2020, and was originally intended for desktop computers. However the application has now changed so much that it would just cause confusion to keep the EmulationStation name. During a transition period EmulationStation Desktop Edition will be included as a subtitle on the splash screen and mentioned in some documentation entries, but long term this will be dropped entirely. The red version of the EmulationStation logo will however remain as it's part of the application legacy. ## Is this software available for free, and is it open source? -ES-DE is available for free. Voluntary donations to support the project are however very welcome. The application is released under the MIT open source license with the source code readily available to anyone via the project's [GitLab site](https://gitlab.com/es-de/emulationstation-de). +ES-DE is available for free on Windows, macOS and Linux and it's released under the MIT open source license. ## Which operating systems are supported? -ES-DE runs on Windows, macOS and BSD Unix as well as on multiple Linux distributions including Ubuntu, Fedora, Arch, Manjaro, SteamOS etc. +ES-DE runs on Windows, macOS and multiple Linux distributions including Ubuntu, Fedora, Arch, Manjaro, SteamOS etc. ## What is the relationship between ES-DE and RetroDECK? @@ -22,7 +18,7 @@ ES-DE and [RetroDECK](http://retrodeck.net) are completely separate projects, bu ## What is the relationship between ES-DE and EmuDeck? -[EmuDeck](http://www.emudeck.com) is an installer that installs ES-DE and a number of emulators. There is no relationship between the two projects apart from this, and it's generally not recommended to use EmuDeck as this will lead to a non-standard installation. There are few tangible benefits to using EmuDeck over a manual installation apart from some convenience for the initial setup. Instead it's recommended to setup your emulators manually which will allow you to configure everything exactly to your liking. That is also a fun and interesting experience. +EmuDeck is an installer that installs ES-DE and a number of emulators. There is no relationship between the two projects apart from this, and it's not recommended to use EmuDeck as this will lead to a non-standard installation and can cause a lot of other issues as well. Instead it's recommended to setup your emulators manually which will allow you to configure everything exactly to your liking. ## What game systems/platforms and emulators are supported by ES-DE? @@ -34,7 +30,7 @@ Menus in ES-DE are not lists but grids, sometimes there is only a list but somet ## Can I change the system sorting to not sort by full system names? -Yes the systems sorting configuration file can be selected via the _Systems sorting_ option in the _UI Settings_ menu. There are four such files bundled with ES-DE to sort by _"Release year", "Manufacturer, release year", "Hardware type, release year"_ and _"Manufacturer, hardware type, release year"_. If you don't want to use any of the bundled files then you can create your own custom sorting file and place it into the ~/.emulationstation/custom_systems/ directory. More details about this setup can be found in the _es_systems_sorting.xml_ section of the [Building and advanced configuration](INSTALL.md#es_systems_sortingxml) document. +Yes the systems sorting configuration file can be selected via the _Systems sorting_ option in the _UI Settings_ menu. There are four such files bundled with ES-DE to sort by _"Release year", "Manufacturer, release year", "Hardware type, release year"_ and _"Manufacturer, hardware type, release year"_. If you don't want to use any of the bundled files then you can create your own custom sorting file and place it into the ~/ES-DE/custom_systems/ directory. More details about this setup can be found in the _es_systems_sorting.xml_ section of the [Building and advanced configuration](INSTALL.md#es_systems_sortingxml) document. ## I'm missing some systems like SNES MSU-1 and WiiWare, could those get added to ES-DE? @@ -46,7 +42,7 @@ ES-DE comes preconfigured with support for many alternative emulators, see the [ ## I'm on Windows and ES-DE can't find my emulators, what is wrong? -On Windows ES-DE is shipped as a portable installation and as a regular installer. If you're using the portable installation you need to drop your emulators inside the Emulators directory. Make sure to read the README.txt file directly in the EmulationStation-DE folder for more details. For the regular installer many emulators do not provide a method to inform ES-DE where they are installed, so you will need to add their installation directories to the Path environment variable in Windows. It's strongly recommended to read the _Specific notes for Windows_ section of the [User guide](USERGUIDE.md#specific-notes-for-windows) before attempting to setup and use ES-DE on Windows. +On Windows ES-DE is shipped as a portable installation and as a regular installer. If you're using the portable installation you need to drop your emulators inside the Emulators directory. Make sure to read the README.txt file directly in the ES-DE folder for more details. For the regular installer many emulators do not provide a method to inform ES-DE where they are installed, so you will need to add their installation directories to the Path environment variable in Windows. It's strongly recommended to read the _Specific notes for Windows_ section of the [User guide](USERGUIDE.md#specific-notes-for-windows) before attempting to setup and use ES-DE on Windows. ## I'm on Windows and ES-DE refuses to start, is the application broken? @@ -54,7 +50,7 @@ You're probably missing the OpenGL drivers required to run ES-DE. Try to downloa ## I'm on Windows and there is only a black screen shown on startup or when launching a game, is there a way to fix this? -This behavior has been observed for some specific AMD GPUs in the past. In some instances there is only a black screen on startup and in some instances the application starts and runs correctly but launching a game only shows a black screen. The issue is seemingly caused by GPU driver bugs and it only affects Windows as Linux works fine with the same hardware. The workaround is to make ES-DE run in windowed mode. You accomplish this by using the --resolution flag and setting the width to one pixel wider than your screen resolution. So if for instance running at a 1280x800 display resolution, run ES-DE such as this: `EmulationStation.exe --resolution 1281 800` +This behavior has been observed for some specific AMD GPUs in the past. In some instances there is only a black screen on startup and in some instances the application starts and runs correctly but launching a game only shows a black screen. The issue is seemingly caused by GPU driver bugs and it only affects Windows as Linux works fine with the same hardware. The workaround is to make ES-DE run in windowed mode. You accomplish this by using the --resolution flag and setting the width to one pixel wider than your screen resolution. So if for instance running at a 1280x800 display resolution, run ES-DE such as this: `ES-DE.exe --resolution 1281 800` ## The emulators don't seem to be properly configured? @@ -84,13 +80,9 @@ See the question above for a possible solution. Another approach would be to hid No, by default games are not removed from the gamelists when they are hidden and are instead only marked with a much lower opacity. You need to disable the setting _Show hidden games_ from the _Other Settings_ menu to make them disappear entirely. The reason this option is not disabled by default is that new users could very easily make a mistake by hiding some files accidentally without realizing it, only to have the entries being immediately removed from the gamelist view. It's also good practice to hide all your games with this option enabled and verify that it's all correct before going ahead and disabling it. -## I'm using Linux or macOS and I can't find the .emulationstation directory, where is it located? - -The .emulationstation directory is normally located in your home directory, but on these Unix-based operating systems files and directories starting with a dot are hidden by default. So you need to enable hidden files and directories in your file manager. On macOS this is done in Finder using the Shift + Command + . (a dot) keyboard combination. On Linux it depends on which file manager you're using, but in KDE's Dolphin it's accomplished by using the Alt + . (a dot) keyboard combination or via the corresponding entry in the hamburger menu. - ## I can't find a ROM directory setting in the user interface, so how do I relocate my games? -There is no need for such a setting as ES-DE will not start unless it finds at least one game. So you simply need to move your ROM directory to its new location using your operating system's file manager or terminal and then the next time you start ES-DE you will be shown a dialog where you can enter the new directory. Optionally you can manually change the ROMDirectory setting in ~/.emulationstation/es_settings.xml +There is no need for such a setting as ES-DE will not start unless it finds at least one game. So you simply need to move your ROM directory to its new location using your operating system's file manager or terminal and then the next time you start ES-DE you will be shown a dialog where you can enter the new directory. Optionally you can manually change the ROMDirectory setting in ~/ES-DE/es_settings.xml ## What are miximages precisely and why don't they get updated when I change my miximage settings? @@ -98,7 +90,7 @@ As the name implies these are images, and more specifically they are generated b ## Is there a way to customize existing systems, and/or to add more systems than those shipped by default? -Yes it's possible to both customize existing systems that are part of the bundled configuration as well as to add more systems than those shipped with ES-DE. Almost nothing is hardcoded in the application so there is a huge flexibility when it comes to such configuration. How this is done is covered in the _Game system customizations_ section of the [User guide](USERGUIDE.md#game-system-customizations). Just make sure to never modify the es_systems.xml and es_find_rules.xml files included in the application installation directory as these will be overwritten when upgrading ES-DE in the future. Always place your customizations in ~/.emulationstation/custom_systems/ as is also described in the user guide. +Yes it's possible to both customize existing systems that are part of the bundled configuration as well as to add more systems than those shipped with ES-DE. Almost nothing is hardcoded in the application so there is a huge flexibility when it comes to such configuration. How this is done is covered in the _Game system customizations_ section of the [User guide](USERGUIDE.md#game-system-customizations). Just make sure to never modify the es_systems.xml and es_find_rules.xml files included in the application installation directory as these will be overwritten when upgrading ES-DE in the future. Always place your customizations in ~/ES-DE/custom_systems/ as is also described in the user guide. ## Can I use the Steam release of RetroArch? @@ -110,7 +102,7 @@ You would normally use the built-in theme downloader to install additional theme ## I added some EmulationStation themes manually but they don't seem to show up inside ES-DE? -Only themes made specifically for ES-DE can be used. If you want to use a theme from Batocera, Recalbox, RetroBat, RetroPie etc. then it first needs to be ported to the ES-DE theme engine. If you place a non-supported theme in the ~/.emulationtation/themes/ directory then this will be ignored on startup, meaning it will not be selectable from the _UI Settings_ menu. +EmulationStation themes are not supported by ES-DE. If you want to use a theme from Batocera, Recalbox, RetroBat, RetroPie etc. then it first needs to be ported to the ES-DE theme engine. If you place a non-supported theme in the ES-DE/themes/ directory then this will be ignored on startup, meaning it will not be selectable from the _UI Settings_ menu. ## I used to be a Batocera/Recalbox user and ES-DE can't seem to find some of my games? @@ -122,15 +114,11 @@ There is a built-in application updater that works with the Linux AppImage relea ## I can't find any game media links in the gamelist.xml files, where is this data stored? -ES-DE works differently compared to all other EmulationStation forks when it comes to handling of game media. There are no links in the gamelist.xml files, instead media files are matched against the ROM/game file names which makes for a much simpler, faster and completely portable setup. Migrating game media from other EmulationStation forks (and potentially from other frontends as well) can be accomplished quite easily. See the next question below for more information. Make sure to also read the _Migrating from other EmulationStation forks_ section of the [User guide](USERGUIDE.md#migrating-from-other-emulationstation-forks) to avoid data loss if running ES-DE with existing data from another EmulationStation fork. +ES-DE works differently compared to EmulationStation when it comes to handling of game media. There are no links in the gamelist.xml files, instead media files are matched against the ROM/game file names which makes for a much simpler, faster and completely portable setup. Migrating game media from EmulationStation (and potentially from other frontends as well) can be accomplished quite easily. Make sure to also read the _Migrating from EmulationStation_ section of the [User guide](USERGUIDE.md#migrating-from-emulationstation) to avoid data loss if running ES-DE with existing data from EmulationStation. ## It seems like gamelist.xml files in the ROM directory tree are not getting loaded? -These files are not loaded by default as of ES-DE 2.0.0, only files placed in .emulationstation/gamelists/ are processed. If you insist on retaining the old logic of also looking for gamelist.xml files in the ROM directory tree then you can enable the LegacyGamelistFileLocation setting in es_settings.xml as explained in the _Settings not configurable via the GUI_ section of the [Building and advanced configuration](INSTALL.md#settings-not-configurable-via-the-gui) document. - -## Why do I sometimes get error messages when scraping stating that files are less than 350 bytes in size? - -This issue can occur occassionally as the ScreenScraper servers sometimes return invalid responses, in this case simply pressing the _RETRY_ button often works. But there is also a ScreenScraper bug where their cache could include entries that no longer exist. When a media file is removed from the ScreenScraper database, the cached link to that file is retained for some time and will be returned as a valid media file URL to ES-DE. However, when attempting to scrape such a file, it will only contain the text string _NOMEDIA_ which will trigger this error in ES-DE. The cache bug only affects the multi-scraper API call, so a workaround is to manually scrape such games using the single-game scraper (reachable via the metadata editor). The invalid cache entries seem to disappear within 24 hours so waiting for a while and rescraping should also resolve the problem. The issue has been reported to the ScreenScraper team but it's unclear if and when it will be resolved. +These files are not loaded by default, only files placed in ES-DE/gamelists/ are processed. If you insist on also looking for gamelist.xml files in the ROM directory tree then you can enable the LegacyGamelistFileLocation setting in es_settings.xml as explained in the _Settings not configurable via the GUI_ section of the [Building and advanced configuration](INSTALL.md#settings-not-configurable-via-the-gui) document. ## Can I use an external scraper application instead of the built-in scraper? diff --git a/INSTALL.md b/INSTALL.md index 31967beed..95c18a21f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,4 +1,4 @@ -# ES-DE (EmulationStation Desktop Edition) v2.2 - Building and advanced configuration +# ES-DE (EmulationStation Desktop Edition) v3.0 - Building and advanced configuration Table of contents: @@ -160,7 +160,7 @@ make -j8 ``` Due to buggy AMD GPU drivers it could be a good idea to use the `LSAN_suppressions` file included in the repository to avoid reports of a lot of irrelevant issue, for example: ``` -LSAN_OPTIONS="suppressions=tools/LSAN_suppressions" ./emulationstation --debug --resolution 2560 1440 +LSAN_OPTIONS="suppressions=tools/LSAN_suppressions" ./es-de --debug --resolution 2560 1440 ``` This applies to LeakSanitizer specifically, which is integrated into AddressSanitizer. @@ -173,7 +173,7 @@ make -j8 It could also be a good idea to use the `TSAN_suppressions` file included in the repository to suppress issues reported by some third party libraries, for example: ``` -TSAN_OPTIONS="suppressions=tools/TSAN_suppressions" ./emulationstation --debug --resolution 2560 1440 +TSAN_OPTIONS="suppressions=tools/TSAN_suppressions" ./es-de --debug --resolution 2560 1440 ``` To enable UndefinedBehaviorSanitizer which helps with identifying bugs that may otherwise be hard to find, build with the UBSAN option: @@ -194,17 +194,17 @@ As for advanced debugging, Valgrind is a very powerful and useful tool which can The most common tool is Memcheck to check for memory leaks, which you run like this: ``` -valgrind --tool=memcheck --leak-check=full --log-file=../valgrind_run_01 ./emulationstation +valgrind --tool=memcheck --leak-check=full --log-file=../valgrind_run_01 ./es-de ``` There are numerous flags that can be used, for example this will also track reachable memory which could indicate further leaks: ``` -valgrind --tool=memcheck --leak-check=full --track-origins=yes --show-reachable=yes --log-file=../valgrind_run_01 ./emulationstation +valgrind --tool=memcheck --leak-check=full --track-origins=yes --show-reachable=yes --log-file=../valgrind_run_01 ./es-de ``` Another helpful tool is the Callgrind call-graph analyzer: ``` -valgrind --tool=callgrind --log-file=../valgrind_run_01 ./emulationstation +valgrind --tool=callgrind --log-file=../valgrind_run_01 ./es-de ``` The output file can be loaded into an application such as KCachegrind for data analysis. @@ -213,7 +213,7 @@ The output file can be loaded into an application such as KCachegrind for data a Yet another very useful Valgrind tool is the Massif heap profiler, which can be run like this: ``` -valgrind --tool=massif --massif-out-file=../massif.out.01 ./emulationstation +valgrind --tool=massif --massif-out-file=../massif.out.01 ./es-de ``` The output file can be loaded into an application such as Massif-Visualizer for analysis. @@ -301,35 +301,35 @@ sudo make install Assuming the default installation prefix /usr has been used, this is the directory structure for the installation: ``` -/usr/bin/emulationstation +/usr/bin/es-de /usr/bin/es-pdf-convert -/usr/share/applications/org.es_de.emulationstation-de.desktop -/usr/share/emulationstation/licenses/* -/usr/share/emulationstation/resources/* -/usr/share/emulationstation/themes/* -/usr/share/emulationstation/LICENSE -/usr/share/icons/hicolor/scalable/apps/org.es_de.emulationstation-de.svg -/usr/share/man/man6/emulationstation.6.gz -/usr/share/metainfo/org.es_de.emulationstation-de.appdata.xml -/usr/share/pixmaps/org.es_de.emulationstation-de.svg +/usr/share/applications/org.es_de.frontend.desktop +/usr/share/es-de/licenses/* +/usr/share/es-de/resources/* +/usr/share/es-de/themes/* +/usr/share/es-de/LICENSE +/usr/share/icons/hicolor/scalable/apps/org.es_de.frontend.svg +/usr/share/man/man6/es-de.6.gz +/usr/share/metainfo/org.es_de.frontend.appdata.xml +/usr/share/pixmaps/org.es_de.frontend.svg ``` However, when installing manually instead of building a package, it's recommended to change the install prefix to /usr/local instead of /usr. -Be aware that if using the GNOME desktop environment, /usr/share/pixmaps/emulationstation.svg must exist in order for the ES-DE icon to be shown in the Dash and task switcher. +Be aware that if using the GNOME desktop environment, /usr/share/pixmaps/org.es_de.frontend.svg must exist in order for the ES-DE icon to be shown in the Dash and task switcher. ES-DE will look in the following locations for application resources, in the listed order: -* \/.emulationstation/resources/ -* \/share/emulationstation/resources/ +* \/ES-DE/resources/ +* \/share/es-de/resources/ * \/resources/ The resources directory is critical, without it the application won't start. As well the following locations will be searched for themes, also in the listed order: -* \/.emulationstation/themes/ -* \/share/emulationstation/themes/ +* \/ES-DE/themes/ +* \/share/es-de/themes/ * \/themes/ A theme is not mandatory to start the application, but ES-DE will be basically useless without it. @@ -344,23 +344,23 @@ Creation of Debian .deb packages is enabled by default, simply run `cpack` to ge myusername@computer:~/emulationstation-de$ cpack CPack: Create package using DEB CPack: Install projects -CPack: - Run preinstall target for: emulationstation-de -CPack: - Install project: emulationstation-de [] +CPack: - Run preinstall target for: es-de +CPack: - Install project: es-de [] CPack: Create package CPackDeb: - Generating dependency list -CPack: - package: /home/myusername/emulationstation-de/emulationstation-de-2.2.0-x64.deb generated. +CPack: - package: /home/myusername/emulationstation-de/es-de_3.0.0-x64.deb generated. ``` You may want to check that the dependencies look fine, as they're (mostly) automatically generated by CMake: ``` -dpkg -I ./emulationstation-de-2.2.0-x64.deb +dpkg -I ./es-de_3.0.0-x64.deb ``` The package can now be installed using a package manager, for example apt: ``` -sudo apt install ./emulationstation-de-2.2.0-x64.deb +sudo apt install ./es-de_3.0.0-x64.deb ``` To build an RPM package instead, set the flag LINUX_CPACK_GENERATOR to RPM when running cmake, for example: @@ -375,11 +375,11 @@ Then simply run `cpack`: myusername@computer:~/emulationstation-de$ cpack CPack: Create package using RPM CPack: Install projects -CPack: - Run preinstall target for: emulationstation-de -CPack: - Install project: emulationstation-de [] +CPack: - Run preinstall target for: es-de +CPack: - Install project: es-de [] CPack: Create package -CPackRPM: Will use GENERATED spec file: /home/myusername/emulationstation-de/_CPack_Packages/Linux/RPM/SPECS/emulationstation-de.spec -CPack: - package: /home/myusername/emulationstation-de/emulationstation-de-2.2.0-x64.rpm generated. +CPackRPM: Will use GENERATED spec file: /home/myusername/emulationstation-de/_CPack_Packages/Linux/RPM/SPECS/es-de.spec +CPack: - package: /home/myusername/emulationstation-de/es-de_3.0.0-x64.rpm generated ``` On Fedora, you need to install rpmbuild before this command can be run: @@ -389,17 +389,17 @@ sudo dnf install rpm-build After the package generation you can check that the metadata looks fine using the `rpm` command: ``` -rpm -qi ./emulationstation-de-2.2.0-x64.rpm +rpm -qi ./es-de_3.0.0-x64.rpm ``` To see the automatically generated dependencies, run this: ``` -rpm -q --requires ./emulationstation-de-2.2.0-x64.rpm +rpm -q --requires ./es-de_3.0.0-x64.rpm ``` And of course, you can also install the package: ``` -sudo dnf install ./emulationstation-de-2.2.0-x64.rpm +sudo dnf install ./es-de_3.0.0-x64.rpm ``` **Creating an AppImage** @@ -574,37 +574,37 @@ make install This will be the directory structure for the installation: ``` -/Applications/EmulationStation Desktop Edition.app/Contents/Info.plist -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/EmulationStation -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/es-pdf-convert -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libSDL2-2.0.0.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libavcodec.60.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libavfilter.9.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libavformat.60.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libavutil.58.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libfontconfig.1.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libfreetype.6.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libgit2.1.6.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libjpeg.62.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libopenjp2.7.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libpoppler-cpp.0.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libpoppler.129.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libpostproc.57.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libswresample.4.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libswscale.7.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libtiff.6.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libvorbis.0.4.9.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/MacOS/libvorbisenc.2.0.12.dylib -/Applications/EmulationStation Desktop Edition.app/Contents/Resources/EmulationStation-DE.icns -/Applications/EmulationStation Desktop Edition.app/Contents/Resources/LICENSE -/Applications/EmulationStation Desktop Edition.app/Contents/Resources/licenses/* -/Applications/EmulationStation Desktop Edition.app/Contents/Resources/resources/* -/Applications/EmulationStation Desktop Edition.app/Contents/Resources/themes/* +/Applications/ES-DE.app/Contents/Info.plist +/Applications/ES-DE.app/Contents/MacOS/ES-DE +/Applications/ES-DE.app/Contents/MacOS/es-pdf-convert +/Applications/ES-DE.app/Contents/MacOS/libSDL2-2.0.0.dylib +/Applications/ES-DE.app/Contents/MacOS/libavcodec.60.dylib +/Applications/ES-DE.app/Contents/MacOS/libavfilter.9.dylib +/Applications/ES-DE.app/Contents/MacOS/libavformat.60.dylib +/Applications/ES-DE.app/Contents/MacOS/libavutil.58.dylib +/Applications/ES-DE.app/Contents/MacOS/libfontconfig.1.dylib +/Applications/ES-DE.app/Contents/MacOS/libfreetype.6.dylib +/Applications/ES-DE.app/Contents/MacOS/libgit2.1.6.dylib +/Applications/ES-DE.app/Contents/MacOS/libjpeg.62.dylib +/Applications/ES-DE.app/Contents/MacOS/libopenjp2.7.dylib +/Applications/ES-DE.app/Contents/MacOS/libpoppler-cpp.0.dylib +/Applications/ES-DE.app/Contents/MacOS/libpoppler.129.dylib +/Applications/ES-DE.app/Contents/MacOS/libpostproc.57.dylib +/Applications/ES-DE.app/Contents/MacOS/libswresample.4.dylib +/Applications/ES-DE.app/Contents/MacOS/libswscale.7.dylib +/Applications/ES-DE.app/Contents/MacOS/libtiff.6.dylib +/Applications/ES-DE.app/Contents/MacOS/libvorbis.0.4.9.dylib +/Applications/ES-DE.app/Contents/MacOS/libvorbisenc.2.0.12.dylib +/Applications/ES-DE.app/Contents/Resources/ES-DE.icns +/Applications/ES-DE.app/Contents/Resources/LICENSE +/Applications/ES-DE.app/Contents/Resources/licenses/* +/Applications/ES-DE.app/Contents/Resources/resources/* +/Applications/ES-DE.app/Contents/Resources/themes/* ``` ES-DE will look in the following locations for application resources, in the listed order: -* \/.emulationstation/resources/ +* \/ES-DE/resources/ * \/../Resources/resources/ * \/resources/ @@ -612,7 +612,7 @@ The resources directory is critical, without it the application won't start. As well the following locations will be searched for themes, also in the listed order: -* \/.emulationstation/themes/ +* \/ES-DE/themes/ * \/../Resources/themes/ * \/themes/ @@ -628,19 +628,15 @@ Simply run `cpack` to build a .dmg disk image/installer: myusername@computer:~/emulationstation-de$ cpack CPack: Create package using Bundle CPack: Install projects -CPack: - Run preinstall target for: emulationstation-de -CPack: - Install project: emulationstation-de [] +CPack: - Run preinstall target for: es-de +CPack: - Install project: es-de [] CPack: Create package -CPack: - package: /Users/myusername/emulationstation-de/EmulationStation-DE-2.2.0-x64.dmg generated. +CPack: - package: /Users/myusername/emulationstation-de/ES-DE_3.0.0-arm64.dmg generated. ``` ## Building on Windows -Although both Microsoft Visual C++ (MSVC) and GCC (MinGW) have historically been supported for building ES-DE on Windows, as of the 2.2.0 release MinGW is no longer recommended and support for it will likely be dropped in future releases. - -Although MinGW produces much higher quality code than MSVC with ES-DE running around 10% to 25% faster it's unfortunately not sustainable to keep using it. There are multiple technical issues with third party libraries like severe threading issues with FFmpeg and some libraries like Poppler not being readily available. Debugging with MinGW is also a very slow and tedious process compared to MSVC. MinGW up to 9.2.0 works more or less fine but anything more modern than this introduces issues like FFmpeg's avfilter_graph_free() call taking up to 7000 times longer to complete which makes video playback unusable. Setting filter graphs to use single threads solves some but not all issues. As well libgit2 has (probably) a race condition that causes random repository corruption that is likely only present when using MinGW. - -Clang/LLVM has also been evaluated but it suffers from at least the same threading issues as MinGW, likely because it uses libraries from the latter. It also fails to build some of the third party libraries needed by ES-DE. +Only the Microsoft Visual C++ (MSVC) compiler is supported on Windows. Although MinGW/GCC produces higher quality code with ES-DE running around 10% to 25% faster it's unfortunately not sustainable to use it. There are multiple technical issues with third party libraries like severe threading issues with FFmpeg and some libraries like Poppler not being readily available. **MSVC setup** @@ -677,21 +673,6 @@ The way the MSVC environment works is that a specific developer shell is provide It's important to choose the x64-specific shell and not the x86 variant, as ES-DE will only compile as a 64-bit application. -**MinGW (GCC) setup** - -Download the following packages and install them: - -[https://gitforwindows.org](https://gitforwindows.org) - -[https://cmake.org/download](https://cmake.org/download) - -Download the _MinGW-w64 based_ version of GCC: \ -[https://jmeubank.github.io/tdm-gcc](https://jmeubank.github.io/tdm-gcc) - -After installation, make a copy of `TDM-GCC-64\bin\mingw32-make` to `make` for your convenience. - -Only version 9.2.0 of MinGW has been confirmed to work correctly, anything newer introduces severe problems and MSVC should instead be used if a more modern compiler is required. - **Other preparations** In order to get clang-format onto the system you need to download and install Clang/LLVM: \ @@ -707,7 +688,7 @@ Configure Git. Details about its setup is beyond the scope of this document, but It's strongly recommended to set line breaks to Unix-style (line feed only) directly in the code editor. But if not done, lines breaks will anyway be converted when running clang-format on the code, as explained [here](INSTALL.md#using-clang-format-for-automatic-code-formatting). -The instructions below assume all build steps for MSVC are done in the MSVC developer console (x64 Native Tools Command Prompt for VS) and all MinGW build steps are done using the Git Bash shell. +The instructions below assume all build steps for MSVC are done in the MSVC developer console (x64 Native Tools Command Prompt for VS). **Cloning and setting up dependencies** @@ -724,29 +705,21 @@ cd emulationstation-de git checkout stable-2.2 ``` -On Windows all dependencies are kept in-tree in the `external` directory tree. Most of the libraries can be downloaded in binary form, but a few need to be built from source code. There are four scripts in the tools directory that automate this entirely. Two of them are used for the MSVC compiler and the other two for MinGW. +On Windows all dependencies are kept in-tree in the `external` directory tree. Most of the libraries can be downloaded in binary form, but a few need to be built from source code. There are two scripts in the tools directory that automate this entirely. You run them like this: -For MSVC, you run them like this: ``` cd emulationstation-de -tools\Windows_dependencies_setup_MSVC.bat -tools\Windows_dependencies_build_MSVC.bat -``` - -And for MinGW like the following: -``` -cd emulationstation-de -tools/Windows_dependencies_setup_MinGW.sh -tools/Windows_dependencies_build_MinGW.sh +tools\Windows_dependencies_setup.bat +tools\Windows_dependencies_build.bat ``` Re-running the setup script will delete and download all dependencies again, and re-running the build script will clean and rebuild from scratch. -The setup scripts for both MSVC and MinGW will download and launch an installer for OpenSSL for Windows if this has not already been installed on the build machine. Just run through the installer using the default settings and everything should work fine. +The setup scripts will download and launch an installer for OpenSSL for Windows if this has not already been installed on the build machine. Just run through the installer using the default settings and everything should work fine. Following these preparations, ES-DE should be ready to be compiled. -**Building ES-DE using MSVC** +**Building ES-DE** It's assumed that [Jom](https://wiki.qt.io/Jom) is used, but if instead using nmake then just remove _JOM_ from the -G flag argument and remove the -j flag as nmake does not support building in parallel. @@ -775,31 +748,7 @@ nmake ThreadSanitizer and UndefinedBehaviorSanitizer aren't available for the MSVC compiler. -There are a number of compiler warnings for the bundled rlottie library when building with MSVC. Unfortunately these need to be resolved upstream, but everything should still work fine so the warnings can be ignored for now. - -**Building ES-DE using MinGW** - -For a release build: - -``` -cmake -G "MinGW Makefiles" . -make -j8 -``` - -Or for a debug build: - -``` -cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Debug . -make -j8 -``` - -Change the -j flag to whatever amount of parallel threads you want to use for the compilation. - -Unfortunately AddressSanitizer, ThreadSanitizer and UndefinedBehaviorSanitizer do not seem to be supported with MinGW. - -You run a parallel build using multiple CPU cores with the `-j` flag, for example, `make -j6`. - -Note that compilation time is much longer than on Unix/Linux or macOS, and linking is incredibly slow for a debug build (around 10 times longer compared to Linux). The debug binary is also much larger than on Unix. +There are a number of compiler warnings for the bundled rlottie library. Unfortunately these need to be resolved upstream, but everything should still work fine so the warnings can be ignored for now. **TLS/SSL certificates** @@ -827,24 +776,24 @@ After the installation has been completed, go to the emulationstation-de directo $ cpack CPack: Create package using NSIS CPack: Install projects -CPack: - Run preinstall target for: emulationstation-de -CPack: - Install project: emulationstation-de [] +CPack: - Run preinstall target for: es-de +CPack: - Install project: es-de [] CPack: Create package -CPack: - package: C:/Programming/emulationstation-de/EmulationStation-DE-2.2.0-x64.exe generated. +CPack: - package: C:/Programming/emulationstation-de/ES-DE_3.0.0-x64.exe generated. ``` -The default installation directory suggested by the installer is `C:\Program Files\EmulationStation-DE` but this can of course be changed by the user. +The default installation directory suggested by the installer is `C:\Program Files\ES-DE` but this can of course be changed by the user. ES-DE will look in the following locations for application resources, in the listed order: -* \\\.emulationstation\resources\ +* \\\ES-DE\resources\ * \\resources\ The resources directory is critical, without it the application won't start. As well the following locations will be searched for themes, also in the listed order: -* \\\.emulationstation\themes\ +* \\\ES-DE\themes\ * \\themes\ A theme is not mandatory to start the application, but ES-DE will be basically useless without it. @@ -1015,9 +964,9 @@ The reason to not simply replace the BIOS and devices files with the new version ## Configuration -**~/.emulationstation/es_settings.xml** +**~/ES-DE/settings/es_settings.xml** -When ES-DE is first started, a configuration file will be created as `~/.emulationstation/es_settings.xml` +When ES-DE is first started, a configuration file will be created as `~/ES-DE/settings/es_settings.xml` This file will contain all supported settings at their default values. Normally you shouldn't need to modify this file manually, instead you should be able to use the menu inside ES-DE to update all the necessary settings. @@ -1049,16 +998,18 @@ There is also support to add the variable %ESPATH% to the ROM directory setting, ``` -**~/.emulationstation/es_input.xml** +**~/ES-DE/settings/es_input.xml** As ES-DE auto-configures the keyboard and controllers, neither the input configuration step or manual adjustments to the es_input.xml file should normally be needed. Actually, unless the button layout has been customized using the input configurator, the es_input.xml file will not even exist. -But if you have customized your button layout and your controller or keyboard stop working, you can delete the `~/.emulationstation/es_input.xml` file to remove the customizations, or you can start ES-DE with the `--force-input-config` command line option to make the input configurator appear. +But if you have customized your button layout and your controller or keyboard stop working, you can delete the `~/ES-DE/settings/es_input.xml` file to remove the customizations, or you can start ES-DE with the `--force-input-config` command line option to make the input configurator appear. The input configuration is described in the [User guide](USERGUIDE.md#input-device-configuration). ## Command line options +_There are no command line options available on Android as this operating system works completely differently than all other supported platforms._ + You can use **--help** or **-h** to view the list of command line options, as shown here. ``` @@ -1089,13 +1040,13 @@ You can use **--help** or **-h** to view the list of command line options, as sh _The --anti-aliasing option is not available if ES-DE is built using the OpenGL ES renderer and the --no-update-check option is not available for builds where the application updater is disabled._ -As you can see above, you can override the home directory path using the `--home` flag. So by running for instance the command `emulationstation --home ~/games/emulation`, ES-DE will use `~/games/emulation/.emulationstation` as its application home directory. Be aware that this option completely replaces what is considered the home directory, meaning the default ROM directory ~/ROMs would be resolved to ~/games/emulation/ROMs. The same is true for the emulator core locations if es_find_rules.xml is configured to look for them relative to the home directory. So of course RetroArch and other emulators would also need to be configured to use ~/games/emulation as its base directory in this instance. +As you can see above, you can override the home directory path using the `--home` flag. So by running for instance the command `es-de --home ~/games/emulation`, ES-DE will use `~/games/emulation/ES-DE` as its application data directory. Be aware that this option completely replaces what is considered the home directory, meaning the default ROM directory ~/ROMs would be resolved to ~/games/emulation/ROMs. The same is true for the emulator core locations if es_find_rules.xml is configured to look for them relative to the home directory. So of course RetroArch and other emulators would also need to be configured to use ~/games/emulation as its base directory in this instance. Setting --resolution to a lower or higher value than the display resolution will add a border to the application window. The exception is if defining a lower resolution than the display resolution in combination with the --fullscreen-padding flag as this will pad the screen contents on a black background. This can be combined with the --screenoffset option for exact positioning on displays where bezels or similar may obstruct part of the viewable area. The --no-update-check option only disabled the application updater for the current startup. To permanently disable this functionality use the _Check for application updates_ option in the _Other settings_ menu. The command line option is primarily intended for the unlikely event that the application updater breaks the application and makes it impossible to start. -Running with the --create-system-dirs option will generate all the game system directories in the ROMs folder. This is equivalent to starting ES-DE with no game ROMs present and pressing the _Create directories_ button. Detailed output for the directory creation will be available in es_log.txt and the application will quit immediately after the directories have been created. +Running with the --create-system-dirs option will generate all the game system directories in the ROMs folder. This is equivalent to starting ES-DE with no game ROMs present and pressing the _Create directories_ button. Detailed output for the directory creation will be available in es_log.txt and the application will quit immediately after the directories have been created. By default placeholder entries will be skipped, if you want to still create these directories then set the CreatePlaceholderSystemDirectories option to true in es_settings.xml. For the following options, the es_settings.xml file is immediately updated/saved when passing the parameter: ``` @@ -1116,6 +1067,10 @@ The --ignore-gamelist option is only active during the program session and is no There are some settings which are not configurable via the GUI as modifying these should normally not be required. To still change these, edit the es_settings.xml file directly. +**CreatePlaceholderSystemDirectories** + +If a system in es_systems.xml has a single command tag with the text _PLACEHOLDER_ anywhere in the tag (regardless of letter case) then its directory and _systeminfo.txt_ file will not get created when running with the --create-system-dirs command line option, or when using the _Create/update system directories_ entry in the _Utilities_ menu or when pressing the _Create directories_ button in the no-games startup dialog. However setting this option to true will override the behavior so the placeholder directories will still be created. + **DebugSkipInputLogging** Enabling this will skip all input event logging (button and key presses). Default value is false. @@ -1130,7 +1085,7 @@ Enabling this will skip all debug messages about missing files specifically for **LegacyGamelistFileLocation** -As of ES-DE 2.0.0 any gamelist.xml files stored in the game system directories (e.g. under `~/ROMs/`) will not get loaded, they are instead required to be placed in the `~/.emulationstation/gamelists/` directory tree. By setting this option to `true` it's however possible to retain the old behavior of first looking for gamelist.xml files in the system directories on startup. Note that even if this setting is enabled ES-DE will still always create new gamelist.xml files under `~/.emulationstation/gamelists/` which was the case also for the 1.x.x releases. +As of ES-DE 2.0.0 any gamelist.xml files stored in the game system directories (e.g. under `~/ROMs/`) will not get loaded, they are instead required to be placed in the `~/ES-DE/gamelists/` directory tree. By setting this option to `true` it's however possible to retain the old behavior of first looking for gamelist.xml files in the system directories on startup. Note that even if this setting is enabled ES-DE will still always create new gamelist.xml files under `~/ES-DE/gamelists/` which was the case also for the 1.x.x releases. **LottieMaxFileCache** @@ -1152,369 +1107,28 @@ Sets the server connection timeout for the scraper. Minimum value is 0 seconds ( Sets the transfer timeout per HTTPS request. Minimum value is 0 seconds (infinity) and maximum value is 300 seconds. Default value is 120 seconds. +**ScraperIgnoreHTTP404Errors** + +Normally the scraper will stop whenever an HTTP error code with value 400 or above is returned from the scraper service, but by default there is an exception for 404 errors (resource not found). Changing this setting to _false_ will make the scraper handle 404 errors as all other error codes, meaning it will run through the configured retry attempts and then display an error notification dialog if the resource could not be retrieved. + **UIMode_passkey** The passkey to use to change from the _Kiosk_ or _Kid_ UI modes to the _Full_ UI mode. -**UserThemeDirectory** +**UserThemeDirectory** _(All operating systems except Android)_ -Sets the user theme directory. If left blank it will default to `~/.emulationstation/themes/` - -## es_systems.xml - -The es_systems.xml file contains the game systems configuration data for ES-DE, written in XML format. This defines the system name, the full system name, the ROM path, the allowed file extensions, the launch command, the platform (for scraping) and the theme to use. - -ES-DE ships with a comprehensive `es_systems.xml` file and most users will probably never need to make any customizations. But there may be special circumstances such as wanting to use different emulators for some game systems or perhaps to add additional systems altogether. - -To accomplish this, ES-DE supports customizations via a separate es_systems.xml file that is to be placed in the `custom_systems` folder in the application home directory, i.e. `~/.emulationstation/custom_systems/es_systems.xml`. (The tilde symbol `~` translates to `$HOME` on Unix and macOS, and to `%HOMEPATH%` on Windows unless overridden via the --home command line option.) - -This custom file functionality is designed to be complementary to the bundled es_systems.xml file, meaning you should only add entries to the custom configuration file for game systems that you actually want to add or override. So to for example customize a single system, this file should only contain a single `` tag. The structure of the custom file is identical to the bundled file with the exception of an additional optional tag named ``. If this is placed in the custom es_systems.xml file, ES-DE will not load the bundled file. This is normally not recommended and should only be used for special situations. At the end of this section you can find an example of a custom es_systems.xml file. - -The bundled es_systems.xml file is located in the resources directory that is part of the application installation. For example this could be `/usr/share/emulationstation/resources/systems/unix/es_systems.xml` on Unix, `/Applications/EmulationStation Desktop Edition.app/Contents/Resources/resources/systems/macos/es_systems.xml` on macOS or `C:\Program Files\EmulationStation-DE\resources\systems\windows\es_systems.xml` on Windows. The actual location may differ from these examples of course, depending on where ES-DE has been installed. - -If you're using the AppImage release of ES-DE then the bundled es_systems.xml file is embedded in the AppImage together with the rest of the resources. - -It doesn't matter in which order you define the systems as they will be sorted by the `` tag or by the optional `` tag when displayed inside the application. But it's still a good idea to add the systems in alphabetical order to make the configuration file easier to maintain. - -Note that the `` tags are sorted in [lexicographic order](https://en.wikipedia.org/wiki/Lexicographic_order) so 11 will be sorted above 2 but 002 will be sorted above 011. Secondary sorting will always be done by the fullname tag in es_systems.xml. - -But instead of changing the sorting directly in the es_systems.xml file it could be a better idea to use the dedicated es_systems_sorting.xml file instead. How to do that is described later in this document. - -Wildcards are supported for emulator binaries, but not for directories: -```xml - -~/Applications/yuzu*.AppImage %ROM% - -~/Applications/yuzu*.App* %ROM% - -~/App*/yuzu*.AppImage %ROM% -``` - -There is a special case when it comes to file extensions where it's possible to use extensionless files if required. To accomplish this simply add a dot (.) to the list of extensions in the `` tag. Obviously this makes it impossible to use the _directories interpreted as files_ functionality as there is no file extension, but apart from that everything should work the same as for regular files. - -Keep in mind that you have to set up your emulators separately from ES-DE as the es_systems.xml file assumes that your emulator environment is properly configured. - -Below is an overview of the file layout with various examples. For the command tag, the newer es_find_rules.xml logic described later in this document removes the need for most of the legacy options, but they are still supported for special configurations and for backward compatibility with old configuration files. - -```xml - - - - - - - snes - - - Nintendo SNES (Super Nintendo) - - - Super Nintendo - - - %ROMPATH%/snes - - - .smc .SMC .sfc .SFC .swc .SWC .fig .FIG .bs .BS .bin .BIN .mgd .MGD .7z .7Z .zip .ZIP - - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - - - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% - - - %STARTDIR%=%EMUDIR% %PRECOMMAND_WINE% %EMULATOR_XENIA-WINDOWS% %ROM% - - - retroarch -L ~/.config/retroarch/cores/snes9x_libretro.so %ROM% - - - retroarch -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - - - ~/Applications/rpcs3*.AppImage --no-gui %ROM% - - - /Applications/RetroArch.app/Contents/MacOS/RetroArch -L %CORE_RETROARCH%/snes9x_libretro.dylib %ROM% - - - retroarch.exe -L %EMUPATH%\cores\snes9x_libretro.dll %ROM% - - - "C:\My Games\RetroArch\retroarch.exe" -L "%EMUPATH%\cores\snes9x_libretro.dll" %ROM% - - - "%ESPATH%\RetroArch\retroarch.exe" -L "%ESPATH%\RetroArch\cores\snes9x_libretro.dll" %ROM% - - - %HIDEWINDOW% %EMULATOR_MAME% %STARTDIR%=%EMUDIR% -rompath %ROMPATH%\arcade %BASENAME% - - - %EMULATOR_MAME% %STARTDIR%=~/.mame -rompath %ROMPATH%/arcade %BASENAME% - - - %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% - - - %HIDEWINDOW% %ESCAPESPECIALS% %RUNINBACKGROUND% cmd.exe /C %ROM% - - - snes - - - snes - - -``` - -The following variable is expanded for the `path` tag: - -`%ROMPATH%` - Replaced with the path defined in the setting ROMDirectory in es_settings.xml. - -The following variables are expanded for the `command` tag: - -`%ROM%` - Replaced with the absolute path to the selected ROM, with most special characters escaped with a backslash. - -`%ROMRAW%` - Replaced with the unescaped, absolute path to the selected ROM. If your emulator is picky about paths, you might want to use this instead of %ROM%, but enclosed in quotes. - -`%ROMPATH%` - Replaced with the path defined in the setting ROMDirectory in es_settings.xml. If combined with a path that contains blankspaces, then it must be surrounded by quotation marks, for example `%ROMPATH%"\Arcade Games"`. Note that the quotation mark must be located before the directory separator in this case. - -`%BASENAME%` - Replaced with the "base" name of the path to the selected ROM. For example the path `/foo/bar.rom` would end up as the value `bar` - -`%FILENAME%` - Replaced with the filename of the selected ROM. For example the path `/foo/bar.rom` would end up as the value `bar.rom` - -`%STARTDIR%` - The directory to start in when launching the emulator. Must be defined as a pair separated by an equal sign. This is normally not required, but some emulators and game engines like standalone MAME and OpenBOR will not work properly unless you're in the correct directory when launching a game. Either an absolute path can be used, such as `%STARTDIR%=C:\Games\mame` or some variables are available that provide various functions. The `%EMUDIR%` variable can be used to start in the directory where the emulator binary is located, i.e. `%STARTDIR%=%EMUDIR%`, the `%GAMEDIR%` variable can be used to start in the directory where the game file is located, i.e. `%STARTDIR%=%GAMEDIR%` and the `%GAMEENTRYDIR%` variable can be used which works identically to `%GAMEDIR%` with the exception that it will interpret the actual game entry as the start directory. This is useful in very rare situations like for the EasyRPG Player where the game directories are interpreted as files but where the game engine must still be started from inside the game directory. If an absolute path is set that contains blankspaces, then it must be surrounded by quotation marks, for example `%STARTDIR%="C:\Retro games\mame"`. If the directory defined by this variable does not exist, it will be created on game launch. The variable can be placed anywhere in the launch command if the %EMULATOR_ variable is used, otherwise it has to be placed after the emulator binary. - -`%INJECT%` - This allows the injection of launch arguments or environment variables stored in a text file on the filesystem. The %INJECT% variable must be defined as a pair separated by an equal sign, for example `%INJECT%=game.commands`. The `%BASENAME%` variable can also be used in conjunction with this variable, such as `%INJECT%=%BASENAME%.commands`. By default a path relative to the game file will be assumed but it's also possible to use an absolute path or the ~ (tilde) symbol which will expand to the home directory. If a path contains spaces it needs to be surrounded by quotation marks, such as `%INJECT%="C:\My games\ROMs\daphne\%BASENAME%.daphne\%BASENAME%.commands"`. The variable can be placed anywhere in the launch command and the file contents will be injected at that position. It's also possible to have multiple injections by defining the variable more than once at different locations in the launch command string. The specified file is optional, if it does not exist, is empty, or if there are insufficient permissions to read the file, then it will simply be skipped. For safety reasons the injection file can only have a maximum size of 4096 bytes and if it's larger than this it will be skipped and a warning will be written to es_log.txt. - -`%EMUPATH%` - Replaced with the path to the emulator binary. This variable is used for manually specifying emulator core locations, and a check for the existence of the core file will be done on game launch and an error displayed if it can't be found. Normally %EMUPATH% should not be used as the %CORE_ variable is the recommended method for defining core locations. - -`%EMUDIR%` - Replaced with the path to the emulator binary. This is a general purpose variable as opposed to %EMUPATH% which is intended specifically for core locations. - -`%GAMEDIR%` - Replaced with the path to the game. - -`%GAMEDIRRAW%` - Replaced with the unescaped path to the game. - -`%ESPATH%` - Replaced with the path to the ES-DE binary. Mostly useful for portable emulator installations, for example on a USB memory stick. - -`%EMULATOR_` - This utilizes the emulator find rules as defined in `es_find_rules.xml`. This is the recommended way to configure the launch command. The find rules are explained in more detail below. - -`%PRECOMMAND_` - This utilizes the emulator find rules as defined in `es_find_rules.xml` to locate a pre-command binary. It's for instance useful for running Windows emulators on Linux using Wine or Proton. The %PRECOMMAND_ entry can be located anywhere in the launch command but it should be placed before the %EMULATOR_ variable in order to work as intended. - -`%CORE_` - This utilizes the core find rules as defined in `es_find_rules.xml`. This is the recommended way to configure the launch command. - -`%RUNINBACKGROUND%` - When this variable is present, ES-DE will continue to run in the background while a game is launched. This will also prevent the gamelist video from playing, the screensaver from starting, and the game name and game description from scrolling. This functionality is required for some systems such as Valve Steam. The variable can be placed anywhere in the launch command. - -`%HIDEWINDOW%` - This variable is only available on Windows and is used primarily for hiding console windows when launching scripts (used for example by Steam games and source ports). If not defining this, the console window will be visible when launching games. The variable can be placed anywhere in the launch command. - -`%ESCAPESPECIALS%` - This variable is only available on Windows and is used to escape the characters &()^=;, for the %ROM% variable, which would otherwise make binaries like cmd.exe fail when launching scripts or links. The variable can be placed anywhere in the launch command. - -`%ENABLESHORTCUTS%` - This variable is only available on Unix and macOS and is used to enable shortcuts to games and applications. On Unix these come in the form of .desktop files and ES-DE has a simple parser which essentially extracts the command defined in the Exec key and then executes it. Although some basic file structure checks are performed, the actual command listed with the Exec key is blindly executed. In addition to this the variables %F, %f, %U and %u are removed from the Exec key entry. On macOS shortcuts in the form of .app directories and alias files are executed using the `open -W -a` command. This makes it possible to launch shortcuts to emulators and applications like Steam as well as aliases for any application. However the latter need to be renamed to the .app file extension or it won't work. When a file is matching the .desktop or .app extension respectively, the emulator command defined using the %EMULATOR% variable will be stripped. An %EMULATOR% entry is however still required for the %ENABLESHORTCUTS% variable to work as the intention is to combine shortcuts with the ability to launch shell scripts without having to setup alternative emulators. The %ROM% variable is expanded to the command to execute when using %ENABLESHORTCUTS%, which also means that this variable has to be used, and for example %ROMRAW% will not work. - -Here are some additional real world examples of system entries, the first one for Unix: - -```xml - - dos - DOS (PC) - %ROMPATH%/dos - .bat .BAT .com .COM .conf .CONF .cue .CUE .exe .EXE .iso .ISO .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_core_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_svn_libretro.so %ROM% - dos - dos - -``` - -Then one for macOS: - -```xml - - n64 - Nintendo 64 - %ROMPATH%/n64 - .n64 .N64 .v64 .V64 .z64 .Z64 .bin .BIN .u1 .U1 .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/parallel_n64_libretro.dylib %ROM% - n64 - n64 - -``` - -And finally one for Windows: - -```xml - - pcengine - NEC PC Engine - %ROMPATH%\pcengine - .bin .BIN .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mednafen_pce_libretro.dll %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mednafen_pce_fast_libretro.dll %ROM% - pcengine - pcengine - -``` - -As well, here's an example for Unix of a custom es_systems.xml file placed in ~/.emulationstation/custom_systems/ that overrides a single game system from the bundled configuration file: -```xml - - - - - nes - Nintendo Entertainment System - %ROMPATH%/nes - .nes .NES .zip .ZIP - /usr/games/fceux %ROM% - nes - nes - - -``` - -If adding the `` tag to the file, the bundled es_systems.xml file will not be processed. For this example it wouldn't be a very good idea as NES would then be the only platform that could be used in ES-DE. - -```xml - - - - - - nes - Nintendo Entertainment System - %ROMPATH%/nes - .nes .NES .zip .ZIP - /usr/games/fceux %ROM% - nes - nes - - -``` - -Here is yet another example with the addition of the `snes` system where some file extensions and alternative emulator entries have been removed, and the full name and sorting have been modified. - -```xml - - - - - nes - Nintendo Entertainment System - %ROMPATH%/nes - .nes .NES .zip .ZIP - /usr/games/fceux %ROM% - nes - nes - - - snes - Super Nintendo - Nintendo SNES (Super Nintendo) - %ROMPATH%/snes - .smc .SMC .sfc .SFC .swc .SWC .bin .BIN .mgd .MGD .7z .7Z .zip .ZIP - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% - %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% - snes - snes - - -``` - -## es_systems_sorting.xml - -This file makes it possible to apply a custom systems sorting without having to modify the es_systems.xml file directly. It should be placed in the custom_systems directory, e.g. `~/.emulationstation/custom_systems/es_systems_sorting.xml` - -Note that in order for ES-DE to load this file you'll need to set the _Systems sorting_ option in the _UI settings_ menu to _Full names or custom_. - -The structure of this file is essentially a simplified version of the es_systems.xml file, but with only the `` and `` tags present per system. - -Here's an example where three systems have been sorted by release year instead of the default full system name: - -```xml - - - - amiga - 1985 - - - c64 - 1982 - - - vic20 - 1980 - - -``` - -You only need to include systems that you want to customize sorting for, and if there's also a systemsortname tag present in the es_systems.xml file for any system, then the es_systems_sorting.xml entry will take precedence. - -Note that the `` tags are sorted in [lexicographic order](https://en.wikipedia.org/wiki/Lexicographic_order) so 11 will be sorted above 2 but 002 will be sorted above 011. - -There are also four complete sorting files bundled with ES-DE, you can find them in the resources/sorting/ directory, or you can access them [here](https://gitlab.com/es-de/emulationstation-de/-/tree/master/resources/sorting). - -These files include all systems supported by ES-DE and provide the following sorting options: - -* Release year -* Manufacturer, release year -* Hardware type, release year -* Manufacturer, hardware type, release year - -You can apply any of these sorting files via the _Systems sorting_ option in the _Other settings_ menu. Note that in order to load a es_systems_sorting.xml file placed in the custom_systems directory you'll need to set this option to _Full names or custom_. +Sets the user theme directory. If left blank it will default to `~/ES-DE/themes/` ## es_find_rules.xml This file makes it possible to define rules for where to search for the emulator binaries and emulator cores. -The file is located in the resources directory in the same location as the es_systems.xml file, but a customized copy can be placed in ~/.emulationstation/custom_systems, which will complement the bundled file. +The file is located in the resources directory in the same location as the es_systems.xml file, but a customized copy can be placed in ~/ES-DE/custom_systems, which will complement the bundled file. -Here's an example es_find_rules.xml file for Unix (this is not the complete file shipped with ES-DE as that would be too large to include here): +Here's an example es_find_rules.xml file for Linux (this is not the complete file shipped with ES-DE as that would be too large to include here): ```xml - + @@ -1550,10 +1164,6 @@ Here's an example es_find_rules.xml file for Unix (this is not the complete file /usr/lib64/libretro /usr/lib/libretro - - /usr/local/lib/libretro - - /usr/pkg/lib/libretro @@ -1763,14 +1373,497 @@ For reference, here are also example es_find_rules.xml files for macOS and Windo ``` +## es_systems.xml + +The es_systems.xml file contains the game systems configuration data for ES-DE, written in XML format. This defines the system name, the full system name, the ROM path, the allowed file extensions, the launch command, the platform (for scraping) and the theme to use. + +ES-DE ships with a comprehensive `es_systems.xml` file and most users will probably never need to make any customizations. But there may be special circumstances such as wanting to use different emulators for some game systems or perhaps to add additional systems altogether. + +To accomplish this, ES-DE supports customizations via a separate es_systems.xml file that is to be placed in the `custom_systems` folder in the application home directory, i.e. `~/ES-DE/custom_systems/es_systems.xml`. (The tilde symbol `~` translates to `$HOME` on Unix and macOS, and to `%HOMEPATH%` on Windows unless overridden via the --home command line option.) + +This custom file functionality is designed to be complementary to the bundled es_systems.xml file, meaning you should only add entries to the custom configuration file for game systems that you actually want to add or override. So to for example customize a single system, this file should only contain a single `` tag. The structure of the custom file is identical to the bundled file with the exception of an additional optional tag named ``. If this is placed in the custom es_systems.xml file, ES-DE will not load the bundled file. This is normally not recommended and should only be used for special situations. At the end of this section you can find an example of a custom es_systems.xml file. + +The bundled es_systems.xml file is located in the resources directory that is part of the application installation. For example this could be `/usr/share/es-de/resources/systems/linux/es_systems.xml` on Linux, `/Applications/ES-DE.app/Contents/Resources/resources/systems/macos/es_systems.xml` on macOS or `C:\Program Files\ES-DE\resources\systems\windows\es_systems.xml` on Windows. The actual location may differ from these examples of course, depending on where ES-DE has been installed. + +If you're using the AppImage release of ES-DE then the bundled es_systems.xml file is embedded in the AppImage together with the rest of the resources. + +It doesn't matter in which order you define the systems as they will be sorted by the `` tag or by the optional `` tag when displayed inside the application. But it's still a good idea to add the systems in alphabetical order to make the configuration file easier to maintain. + +Note that the `` tags are sorted in [lexicographic order](https://en.wikipedia.org/wiki/Lexicographic_order) so 11 will be sorted above 2 but 002 will be sorted above 011. + +But instead of changing the sorting directly in the es_systems.xml file it could be a better idea to use the dedicated es_systems_sorting.xml file instead. How to do that is described later in this document. + +Wildcards are supported for emulator binaries, but not for directories: +```xml + +~/Applications/yuzu*.AppImage %ROM% + +~/Applications/yuzu*.App* %ROM% + +~/App*/yuzu*.AppImage %ROM% +``` + +There is a special case when it comes to file extensions where it's possible to use extensionless files if required. To accomplish this simply add a dot (.) to the list of extensions in the `` tag. Obviously this makes it impossible to use the _directories interpreted as files_ functionality as there is no file extension, but apart from that everything should work the same as for regular files. + +Keep in mind that you have to set up your emulators separately from ES-DE as the es_systems.xml file assumes that your emulator environment is properly configured. + +Below is an overview of the file layout with various examples. For the command tag, the newer es_find_rules.xml logic described later in this document removes the need for most of the legacy options, but they are still supported for special configurations and for backward compatibility with old configuration files. + +```xml + + + + + + + snes + + + Nintendo SNES (Super Nintendo) + + + Super Nintendo + + + %ROMPATH%/snes + + + .smc .SMC .sfc .SFC .swc .SWC .fig .FIG .bs .BS .bin .BIN .mgd .MGD .7z .7Z .zip .ZIP + + + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% + + + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_mercury_accuracy_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mednafen_supafaust_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mesen-s_libretro.so %ROM% + + + %STARTDIR%=%EMUDIR% %PRECOMMAND_WINE% %EMULATOR_XENIA-WINDOWS% %ROM% + + + retroarch -L ~/.config/retroarch/cores/snes9x_libretro.so %ROM% + + + retroarch -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% + + + ~/Applications/rpcs3*.AppImage --no-gui %ROM% + + + /Applications/RetroArch.app/Contents/MacOS/RetroArch -L %CORE_RETROARCH%/snes9x_libretro.dylib %ROM% + + + retroarch.exe -L %EMUPATH%\cores\snes9x_libretro.dll %ROM% + + + "C:\My Games\RetroArch\retroarch.exe" -L "%EMUPATH%\cores\snes9x_libretro.dll" %ROM% + + + "%ESPATH%\RetroArch\retroarch.exe" -L "%ESPATH%\RetroArch\cores\snes9x_libretro.dll" %ROM% + + + %HIDEWINDOW% %EMULATOR_MAME% %STARTDIR%=%EMUDIR% -rompath %ROMPATH%\arcade %BASENAME% + + + %EMULATOR_MAME% %STARTDIR%=~/.mame -rompath %ROMPATH%/arcade %BASENAME% + + + %RUNINBACKGROUND% %ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM% + + + %HIDEWINDOW% %ESCAPESPECIALS% %RUNINBACKGROUND% cmd.exe /C %ROM% + + + PLACEHOLDER %ROM% + + + snes + + + snes + + +``` + +The following variable is expanded for the `path` tag: + +`%ROMPATH%` - Replaced with the path defined in the setting ROMDirectory in es_settings.xml. + +The following variables are expanded for the `command` tag: + +`%ROM%` - Replaced with the absolute path to the selected ROM, with most special characters escaped with a backslash. + +`%ROMRAW%` - Replaced with the unescaped, absolute path to the selected ROM. If your emulator is picky about paths, you might want to use this instead of %ROM%, but enclosed in quotes. + +`%ROMPATH%` - Replaced with the path defined in the setting ROMDirectory in es_settings.xml. If combined with a path that contains blankspaces, then it must be surrounded by quotation marks, for example `%ROMPATH%"\Arcade Games"`. Note that the quotation mark must be located before the directory separator in this case. + +`%BASENAME%` - Replaced with the "base" name of the path to the selected ROM. For example the path `/foo/bar.rom` would end up as the value `bar` + +`%FILENAME%` - Replaced with the filename of the selected ROM. For example the path `/foo/bar.rom` would end up as the value `bar.rom` + +`%STARTDIR%` - The directory to start in when launching the emulator. Must be defined as a pair separated by an equal sign. This is normally not required, but some emulators and game engines like standalone MAME and OpenBOR will not work properly unless you're in the correct directory when launching a game. Either an absolute path can be used, such as `%STARTDIR%=C:\Games\mame` or some variables are available that provide various functions. The `%EMUDIR%` variable can be used to start in the directory where the emulator binary is located, i.e. `%STARTDIR%=%EMUDIR%`, the `%GAMEDIR%` variable can be used to start in the directory where the game file is located, i.e. `%STARTDIR%=%GAMEDIR%` and the `%GAMEENTRYDIR%` variable can be used which works identically to `%GAMEDIR%` with the exception that it will interpret the actual game entry as the start directory. This is useful in very rare situations like for the EasyRPG Player where the game directories are interpreted as files but where the game engine must still be started from inside the game directory. If an absolute path is set that contains blankspaces, then it must be surrounded by quotation marks, for example `%STARTDIR%="C:\Retro games\mame"`. If the directory defined by this variable does not exist, it will be created on game launch. The variable can be placed anywhere in the launch command if the %EMULATOR_ variable is used, otherwise it has to be placed after the emulator binary. + +`%INJECT%` - This allows the injection of launch arguments or environment variables stored in a text file on the filesystem. The %INJECT% variable must be defined as a pair separated by an equal sign, for example `%INJECT%=game.commands`. The `%BASENAME%` variable can also be used in conjunction with this variable, such as `%INJECT%=%BASENAME%.commands`. By default a path relative to the game file will be assumed but it's also possible to use an absolute path or the ~ (tilde) symbol which will expand to the home directory. If a path contains spaces it needs to be surrounded by quotation marks, such as `%INJECT%="C:\My games\ROMs\daphne\%BASENAME%.daphne\%BASENAME%.commands"`. The variable can be placed anywhere in the launch command and the file contents will be injected at that position. It's also possible to have multiple injections by defining the variable more than once at different locations in the launch command string. The specified file is optional, if it does not exist, is empty, or if there are insufficient permissions to read the file, then it will simply be skipped. For safety reasons the injection file can only have a maximum size of 4096 bytes and if it's larger than this it will be skipped and a warning will be written to es_log.txt. + +`%EMUPATH%` - Replaced with the path to the emulator binary. This variable is used for manually specifying emulator core locations, and a check for the existence of the core file will be done on game launch and an error displayed if it can't be found. Normally %EMUPATH% should not be used as the %CORE_ variable is the recommended method for defining core locations. + +`%EMUDIR%` - Replaced with the path to the emulator binary. This is a general purpose variable as opposed to %EMUPATH% which is intended specifically for core locations. + +`%GAMEDIR%` - Replaced with the path to the game. + +`%GAMEDIRRAW%` - Replaced with the unescaped path to the game. + +`%ESPATH%` - Replaced with the path to the ES-DE binary. Mostly useful for portable emulator installations, for example on a USB memory stick. + +`%EMULATOR_` - This utilizes the emulator find rules as defined in `es_find_rules.xml`. This is the recommended way to configure the launch command. The find rules are explained in more detail below. + +`%PRECOMMAND_` - This utilizes the emulator find rules as defined in `es_find_rules.xml` to locate a pre-command binary. It's for instance useful for running Windows emulators on Linux using Wine or Proton. The %PRECOMMAND_ entry can be located anywhere in the launch command but it should be placed before the %EMULATOR_ variable in order to work as intended. + +`%CORE_` - This utilizes the core find rules as defined in `es_find_rules.xml`. This is the recommended way to configure the launch command. + +`%RUNINBACKGROUND%` - When this variable is present, ES-DE will continue to run in the background while a game is launched. This will also prevent the gamelist video from playing, the screensaver from starting, and the game name and game description from scrolling. This functionality is required for some systems such as Valve Steam. The variable can be placed anywhere in the launch command. + +`%HIDEWINDOW%` - This variable is only available on Windows and is used primarily for hiding console windows when launching scripts (used for example by Steam games and source ports). If not defining this, the console window will be visible when launching games. The variable can be placed anywhere in the launch command. + +`%ESCAPESPECIALS%` - This variable is only available on Windows and is used to escape the characters &()^=;, for the %ROM% variable, which would otherwise make binaries like cmd.exe fail when launching scripts or links. The variable can be placed anywhere in the launch command. + +`%ENABLESHORTCUTS%` - This variable is only available on Unix and macOS and is used to enable shortcuts to games and applications. On Unix these come in the form of .desktop files and ES-DE has a simple parser which essentially extracts the command defined in the Exec key and then executes it. Although some basic file structure checks are performed, the actual command listed with the Exec key is blindly executed. In addition to this the variables %F, %f, %U and %u are removed from the Exec key entry. On macOS shortcuts in the form of .app directories and alias files are executed using the `open -W -a` command. This makes it possible to launch shortcuts to emulators and applications like Steam as well as aliases for any application. However the latter need to be renamed to the .app file extension or it won't work. When a file is matching the .desktop or .app extension respectively, the emulator command defined using the %EMULATOR% variable will be stripped. An %EMULATOR% entry is however still required for the %ENABLESHORTCUTS% variable to work as the intention is to combine shortcuts with the ability to launch shell scripts without having to setup alternative emulators. The %ROM% variable is expanded to the command to execute when using %ENABLESHORTCUTS%, which also means that this variable has to be used, and for example %ROMRAW% will not work. + +Here are some additional real world examples of system entries, the first one for Unix: + +```xml + + dos + DOS (PC) + %ROMPATH%/dos + .bat .BAT .com .COM .conf .CONF .cue .CUE .exe .EXE .iso .ISO .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_core_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_pure_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/dosbox_svn_libretro.so %ROM% + dos + dos + +``` + +Then one for macOS: + +```xml + + n64 + Nintendo 64 + %ROMPATH%/n64 + .n64 .N64 .v64 .V64 .z64 .Z64 .bin .BIN .u1 .U1 .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/parallel_n64_libretro.dylib %ROM% + n64 + n64 + +``` + +And finally one for Windows: + +```xml + + pcengine + NEC PC Engine + %ROMPATH%\pcengine + .bin .BIN .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .pce .PCE .sgx .SGX .toc .TOC .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mednafen_pce_libretro.dll %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mednafen_pce_fast_libretro.dll %ROM% + pcengine + pcengine + +``` + +As well, here's an example for Linux of a custom es_systems.xml file placed in ~/ES-DE/custom_systems/ that overrides a single game system from the bundled configuration file: +```xml + + + + + nes + Nintendo Entertainment System + %ROMPATH%/nes + .nes .NES .zip .ZIP + /usr/games/fceux %ROM% + nes + nes + + +``` + +If adding the `` tag to the file, the bundled es_systems.xml file will not be processed. For this example it wouldn't be a very good idea as NES would then be the only platform that could be used in ES-DE. + +```xml + + + + + + nes + Nintendo Entertainment System + %ROMPATH%/nes + .nes .NES .zip .ZIP + /usr/games/fceux %ROM% + nes + nes + + +``` + +Here is yet another example with the addition of the `snes` system where some file extensions and alternative emulator entries have been removed, and the full name and sorting have been modified. + +```xml + + + + + nes + Nintendo Entertainment System + %ROMPATH%/nes + .nes .NES .zip .ZIP + /usr/games/fceux %ROM% + nes + nes + + + snes + Super Nintendo + Nintendo SNES (Super Nintendo) + %ROMPATH%/snes + .smc .SMC .sfc .SFC .swc .SWC .bin .BIN .mgd .MGD .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/snes9x2010_libretro.so %ROM% + %EMULATOR_RETROARCH% -L %CORE_RETROARCH%/bsnes_libretro.so %ROM% + snes + snes + + +``` + +## es_find_rules.xml and es_systems.xml on Android + +ES-DE works a bit differently on Android which is also reflected in the es_find_rules.xml and es_systems.xml configuration. Emulators on Android are launched via so-called _Intents_ which is an API rather than the typical command line approach used on Unix systems. Although ES-DE on Windows also uses an API call to launch emulators it's still closely connected to the regular operating system paradigms on how to start binaries and pass application options so the systems configuration still looks quite traditional. On Android this is not the case and there is therefore a heavy use of variables to reflect the Intent API functionality. + +To better understand the configuration in this section it could be a good idea to refer the official Android documentation:\ +https://developer.android.com/reference/android/content/Intent + +There is a command line tool in Android named _am_ which implements the _Intent_ API and can be used to test emulator launching, but this is not intended to be used by other applications and therefore ES-DE implements direct (albeit partial) support for the Intent API. Testing the modern FileProvider interface using the _am_ utility may also be difficult, or maybe impossible. + +**es_find_rules.xml** + +The es_find_rules.xml file is structured the same as for the other operating systems but there'a special _androidpackage_ find rule where you define the name of the emulator package as well as optionally which _activity_ to launch. If the activity is not defined then the default one for the package will be used. Although this may work in some instances it's usually a good idea to explicity set it. Apart from that the find rules work as on the other platforms, i.e. they will be traversed in the order they are defined. So by adding multiple _androidpackage_ entries for an emulator it's possible to look for multiple releases or forks without having to create separate emulator entries in es_systems.xml. It's also possible to override find rules by adding an ES-DE/custom_systems/es_find_rules.xml file, again the same logic applies as for all other platforms. + +The _androidpackage_ find rule entries are structured as `packagename/activity` and if only a package is defined then the forward slash can be omitted, i.e. only `packagename` is needed. + +Here's an example es_find_rules.xml file defining two emulators: + +```xml + + + + + + com.retroarch.aarch64/com.retroarch.browser.retroactivity.RetroActivityFuture + com.retroarch.ra32/com.retroarch.browser.retroactivity.RetroActivityFuture + com.retroarch/com.retroarch.browser.retroactivity.RetroActivityFuture + + + + + + org.yuzu.yuzu_emu.ea/org.yuzu.yuzu_emu.activities.EmulationActivity + org.yuzu.yuzu_emu/org.yuzu.yuzu_emu.activities.EmulationActivity + + + +``` + +**es_systems.xml** + +The es_systems.xml file on Android utilizes variables heavily to implement the _Intent_ API and these variables are covered in detail below. It's possible to override the systems configuration by adding an ES-DE/custom_systems/es_systems.xml file, the same logic applies as for all other platforms. + +`%EMULATOR_` - This utilizes the emulator find rules as defined in `es_find_rules.xml`. This is the only way to configure the launch command on Android and it works identically to the other platforms. + +`%ACTION%` - The general Intent action to be performed, you need to assign its value using an equal sign. + +`%MIMETYPE%` - Sets an explicit MIME type, which you need to assign using an equal sign such as %MIMETYPE%=text/plain. You will rarely, if ever, need to set an explicit MIME type so this variable is of limited use. By default Android will set the MIME type to application/octet-stream which is normally what you want. + +There are two main ways to pass options to emulators, using _extras_ or using the _data_ URI. There can only be a single data URI but there can be an arbitrary amount of extras. To understand more about the way this works, you can read about the _putExtra()_ and and _setData()_ functions here:\ +https://developer.android.com/reference/android/content/Intent + +`%EXTRA_` - This passes an _extra_ which contains any additional information that the emulator may support. This is provided as a key/value pair where you define the key name following the literal %EXTRA_ string and terminate it with a % sign and then assign the value using an equal sign. For example %EXTRA_LIBRETRO%=puae_libretro_android.so will pass the extra named _LIBRETRO_ with its value set to _puae_libretro_android.so_. You can pass an unlimited number of extras and you can also use various ROM variables in combination with this as described below. + +`%EXTRAARRAY_` - Defines an array of comma-separated string values following the key name. Only literal strings are supported, so this can't be used in combination with any ROM variables. As commas are used as separator characters, you'll need to escape any comma signs that you want to include in the actual value. For example %EXTRAARRAY_Parameters%=pone,p\\,two,pthree will pass the extra named _Parameters_ with the three separate array entries _pone_, _p,two_ and _pthree_. + +`%EXTRABOOL_` - Sets an extra with a boolean value, i.e. true/1 or false/0. + +`%DATA%` - Sets the data URI value for the intent using an equal sign. This is normally combined with one of the ROM variables. + +There are three approaches to passing game ROMs to emulators by using the following variables: + +`%ROM%` - Replaced with the absolute path to the selected ROM. This is a traditional method to provide the game ROM and its use will likely decrease or go away completely long term as emulators move to more modern methods. + +`%ROMSAF%` - Replaced with an Android Storage Access Framework (SAF) document URI which always starts with the _content://com.android.externalstorage.documents/_ string. You can read more about the SAF here:\ +https://developer.android.com/guide/topics/providers/document-provider + +`%ROMPROVIDER%` - This is the most modern approach to passing game ROMs to emulators. It uses the _FileProvider_ API to provide permissions to the file. This means that you don't need to setup the emulator upfront to have access to the directory where the game file is stored, access is instead temporarily granted by ES-DE. You can read more about the FileProvider API here:\ +https://developer.android.com/reference/androidx/core/content/FileProvider + +The `%ROM%` and `%ROMSAF%` variables can be used with both the `%DATA%` and `%EXTRA_` variables, but `%ROMPROVIDER%` can only be used with the `%DATA%` variable. For the `%DATA%` variable you'll just assign the ROM variable with an equal sign as there can only be a single _setData()_ API call per Intent. For the `%EXTRA_` variable you need to specify a name of the extra and then define it using an equal sign as an arbitrary amount of _putExtra()_ API calls can be used for an Intent. + +Here are some examples to clarify how this works: +``` +%DATA%=%ROM% +%DATA%=%ROMSAF% +%DATA%=%ROMPROVIDER% +%EXTRA_ROM%=%ROM% +%EXTRA_bootPath%=%ROMSAF% +%EXTRABOOL_resumeState%=false +``` + +There is also support for a couple of activity flags that affect the emulator/game launch behavior, you can read more about these flags here:\ +https://developer.android.com/reference/android/content/Intent + +The descriptions below are taken from the official documentation just linked above: + +`%ACTIVITY_CLEAR_TASK%` - If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the activity to be cleared before the activity is started. That is, the activity becomes the new root of an otherwise empty task, and any old activities are finished. + +`%ACTIVITY_CLEAR_TOP%` - If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent. + +`%ACTIVITY_NO_HISTORY%` - If set, the new activity is not kept in the history stack. As soon as the user navigates away from it, the activity is finished. This may also be set with the noHistory attribute. If set, onActivityResult() is never invoked when the current activity starts a new activity which sets a result and finishes. + +Here's an example es_systems.xml file for Android: +```xml + + + + + gc + Nintendo GameCube + %ROMPATH%/gc + .ciso .CISO .dff .DFF .dol .DOL .elf .ELF .gcm .GCM .gcz .GCZ .iso .ISO .json .JSON .m3u .M3U .rvz .RVZ .tgc .TGC .wad .WAD .wbfs .WBFS .wia .WIA .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=/data/data/%ANDROIDPACKAGE%/cores/dolphin_libretro_android.so %EXTRA_ROM%=%ROM% + %EMULATOR_DOLPHIN% %ACTION%=android.intent.action.MAIN %DATA%=%ROMPROVIDER% + gc + gc + + + n3ds + Nintendo 3DS + %ROMPATH%/n3ds + .3ds .3DS .3dsx .3DSX .app .APP .axf .AXF .cci .CCI .cxi .CXI .elf .ELF .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=/data/data/%ANDROIDPACKAGE%/cores/citra_libretro_android.so %EXTRA_ROM%=%ROM% + %EMULATOR_CITRA% %ACTIVITY_NO_HISTORY% %EXTRA_SelectedGame%=%ROMSAF% + %EMULATOR_CITRA-MMJ% %EXTRA_GamePath%=%ROM% + n3ds + n3ds + + + psx + Sony PlayStation + %ROMPATH%/psx + .bin .BIN .cbn .CBN .ccd .CCD .chd .CHD .cue .CUE .ecm .ECM .exe .EXE .img .IMG .iso .ISO .m3u .M3U .mdf .MDF .mds .MDS .minipsf .MINIPSF .pbp .PBP .psexe .PSEXE .psf .PSF .toc .TOC .z .Z .znx .ZNX .7z .7Z .zip .ZIP + %EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mednafen_psx_libretro_android.so %EXTRA_ROM%=%ROM% + %EMULATOR_DUCKSTATION% %EXTRABOOL_resumeState%=false %EXTRA_bootPath%=%ROMSAF% + psx + psx + + +``` + +## es_systems_sorting.xml + +This file makes it possible to apply custom systems sorting without having to modify the es_systems.xml file directly. It should be placed in the custom_systems directory, e.g. `~/ES-DE/custom_systems/es_systems_sorting.xml` + +Note that in order for ES-DE to load this file you'll need to set the _Systems sorting_ option in the _UI settings_ menu to _Full names or custom_. + +The structure of this file is essentially a simplified version of the es_systems.xml file, but with only the `` and `` tags present per system. + +Here's an example where three systems have been sorted by release year instead of the default full system name: + +```xml + + + + amiga + 1985 + + + c64 + 1982 + + + vic20 + 1980 + + +``` + +You only need to include systems that you want to customize sorting for, and if there's also a systemsortname tag present in the es_systems.xml file for any system, then the es_systems_sorting.xml entry will take precedence. + +Note that the `` tags are sorted in [lexicographic order](https://en.wikipedia.org/wiki/Lexicographic_order) so 11 will be sorted above 2 but 002 will be sorted above 011. Secondary sorting will always be done by the fullname tag in es_systems.xml. + +There are also four complete sorting files bundled with ES-DE, you can find them in the resources/sorting/ directory, or you can access them [here](https://gitlab.com/es-de/emulationstation-de/-/tree/master/resources/sorting). + +These files include all systems supported by ES-DE and provide the following sorting options: + +* Release year +* Manufacturer, release year +* Hardware type, release year +* Manufacturer, hardware type, release year + +You can apply any of these sorting files via the _Systems sorting_ option in the _Other settings_ menu. Note that in order to load a es_systems_sorting.xml file placed in the custom_systems directory you'll need to set this option to _Full names or custom_. + ## gamelist.xml The gamelist.xml file for a system defines the metadata for its entries, such as the game names, descriptions, release dates and ratings. -As of the fork to EmulationStation Desktop Edition, game media information no longer needs to be defined in the gamelist.xml files. Instead the application will look for any media matching the ROM filename. The media path where to look for game media is configurable either manually in `es_settings.xml` or via the GUI. If configured manually in es_settings.xml, it looks something like this: +As of the fork to ES-DE, game media information no longer needs to be defined in the gamelist.xml files. Instead the application will look for any media matching the ROM filename. The media path where to look for game media is configurable either manually in `es_settings.xml` or via the GUI. If configured manually in es_settings.xml, it looks something like this: ```xml - + ``` There is also support to add the variable %ESPATH% to the media directory setting, this will expand to the path where the ES-DE executable is started from. You should normally not need this, but the option is there for special cases. For example: @@ -1779,17 +1872,17 @@ There is also support to add the variable %ESPATH% to the media directory settin ``` -The default media directory is `~/.emulationstation/downloaded_media` +The default media directory is `~/ES-DE/downloaded_media` You can use ES-DE's scrapers to populate the gamelist.xml files, or manually update individual entries using the metadata editor. All of this is explained in the [User guide](USERGUIDE.md). -The gamelist.xml files are searched for in the ES-DE home directory, i.e. `~/.emulationstation/gamelists//gamelist.xml` +The gamelist.xml files are searched for in the ES-DE home directory, i.e. `~/ES-DE/gamelists//gamelist.xml` For example: ``` -~/.emulationstation/gamelists/c64/gamelist.xml -~/.emulationstation/gamelists/megadrive/gamelist.xml +~/ES-DE/gamelists/c64/gamelist.xml +~/ES-DE/gamelists/megadrive/gamelist.xml ``` **gamelist.xml file structure** @@ -1920,7 +2013,7 @@ Before attempting to add a custom profile for your controller you need to check ES-DE uses the [SDL](https://www.libsdl.org) (Simple DirectMedia Layer) library to handle controller input, so in order for a controller to work in ES-DE, it has to be supported by SDL. There is however a possibility to add custom controller profiles to SDL which in some cases could enable devices in ES-DE that would otherwise not be supported. This is generally a temporary solution though, as controller support is constantly getting improved natively in SDL. As a first step it's therefore recommended to open a request at the SDL [issue tracker](https://github.com/libsdl-org/SDL/issues) to have your specific controller added to a future SDL release. -Assuming the controller works in other applications than ES-DE, you can attempt to add a custom profile by creating the file `~/.emulationstation/es_controller_mappings.cfg` and enter the appropriate configuration inside this file. +Assuming the controller works in other applications than ES-DE, you can attempt to add a custom profile by creating the file `~/ES-DE/controllers/es_controller_mappings.cfg` and enter the appropriate configuration inside this file. The required format is described here:\ https://github.com/gabomdq/SDL_GameControllerDB @@ -1930,7 +2023,7 @@ https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontro But just do this as a first step to see whether you controller gets enabled. If it does, then you should remove all entries that are not relevant. That is important as this file will take precedence over the built-in controller profiles in the SDL library, so any future controller bug fixes and similar would not apply. In the past the gamecontrollerdb.txt file has also included some invalid configuration entries, so even though it may make your controller work, it could actually break some other controllers that you may want to use now or in the future. -Therefore only keep the entries in the es_controller_mappings.cfg file that are relevant for your devices. You can find each relevant controller GUID by starting ES-DE and then looking in the ~/.emulationstation/es_log.txt file. You should see entries such as the following: +Therefore only keep the entries in the es_controller_mappings.cfg file that are relevant for your devices. You can find each relevant controller GUID by starting ES-DE and then looking in the `~/ES-DE/logs/es_log.txt` file. You should see entries such as the following: ``` May 16 18:26:17 Info: Added controller with custom configuration: "X360 Controller" (GUID: 030000005e0400008e02000010010000, instance ID: 0, device index: 0) ``` @@ -1952,26 +2045,26 @@ For this example, let's assume that the removable media has the device name `F:\ These are the steps to perform: * Install ES-DE -* Copy the EmulationStation-DE installation directory to F:\ -* Create a directory named F:\EmulationStation-DE\Emulators -* Copy your emulator directories to F:\EmulationStation-DE\Emulators\ -* Copy your ROMs directory to F:\EmulationStation-DE\ -* Create an empty file named portable.txt in F:\EmulationStation-DE\ +* Copy the ES-DE installation directory to F:\ +* Create a directory named F:\ES-DE\Emulators +* Copy your emulator directories to F:\ES-DE\Emulators\ +* Copy your ROMs directory to F:\ES-DE\ +* Create an empty file named portable.txt in F:\ES-DE\ You should end up with something like this: ``` -F:\EmulationStation-DE\ -F:\EmulationStation-DE\Emulators\dosbox-staging\ -F:\EmulationStation-DE\Emulators\RetroArch-Win64\ -F:\EmulationStation-DE\Emulators\RPCS3\ -F:\EmulationStation-DE\Emulators\xemu\ -F:\EmulationStation-DE\ROMs\ -F:\EmulationStation-DE\portable.txt +F:\ES-DE\ +F:\ES-DE\Emulators\dosbox-staging\ +F:\ES-DE\Emulators\RetroArch-Win64\ +F:\ES-DE\Emulators\RPCS3\ +F:\ES-DE\Emulators\xemu\ +F:\ES-DE\ROMs\ +F:\ES-DE\portable.txt ``` -This is just an example as you may of course not use these specific emulators. There are also many more emulators supported as detailed in the `es_find_rules.xml` configuration file. As well there will be many more files and directories than those listed above inside the F:\EmulationStation-DE folder. +This is just an example as you may of course not use these specific emulators. There are also many more emulators supported as detailed in the `es_find_rules.xml` configuration file. As well there will be many more files and directories than those listed above inside the F:\ES-DE folder. -How the portable setup works is that when ES-DE finds a file named portable.txt in its executable directory, it will by default locate the .emulationstation directory directly inside this folder. It's also possible to modify portable.txt with a path relative to the ES-DE executable directory. For instance if two dots `..` are placed inside the portable.txt file, then the .emulationstation directory will be located in the parent folder, which would be directly under F:\ for this example. +How the portable setup works is that when ES-DE finds a file named portable.txt in its executable directory, it will by default locate the ES-DE application data directory directly inside this folder. It's also possible to modify portable.txt with a path relative to the ES-DE executable directory. For instance if two dots `..` are placed inside the portable.txt file, then the ES-DE application data directory will be located in the parent folder, which would be directly under F:\ for this example. If the --home command line parameter is passed when starting ES-DE, that will override the portable.txt file. @@ -1980,12 +2073,12 @@ Start ES-DE from the F:\ device and check that everything works as expected. Jus Following this, optionally copy any existing gamelist.xml files, game media files etc. to the removable media. For example: ``` -F:\EmulationStation-DE\.emulationstation\collections\ -F:\EmulationStation-DE\.emulationstation\downloaded_media\ -F:\EmulationStation-DE\.emulationstation\gamelists\ +F:\ES-DE\ES-DE\collections\ +F:\ES-DE\ES-DE\downloaded_media\ +F:\ES-DE\ES-DE\gamelists\ ``` -You could alternatively copy over your entire .emulationstation directory, but in this case make sure that you have no settings in es_settings.xml that point to a specific location on your local filesystem, such as the game ROMs or game media directories. +You could alternatively copy over your entire ES-DE application data directory, but in this case make sure that you have no settings in es_settings.xml that point to a specific location on your local filesystem, such as the game ROMs or game media directories. You now have a fully functional portable retrogaming installation! @@ -2028,7 +2121,7 @@ The following examples are for Unix systems, but it works the same way on macOS As can be seen in the table above, the events executed when a game starts and ends are named _game-start_ and _game-end_ -So let's create the folders for these events in the scripts directory. The location is `~/.emulationstation/scripts` +So let's create the folders for these events in the scripts directory. The location is `~/ES-DE/scripts` **Game log** @@ -2039,7 +2132,7 @@ Let's name the start script `game_start_logging.sh` with the following contents: ``` #!/bin/bash TIMESTAMP=$(date +%Y-%m-%d' '%H:%M:%S) -echo Starting game "\""${2}"\"" "\""${4}"\"" "(\""${1}"\")" at $TIMESTAMP >> ~/.emulationstation/game_playlog.txt +echo Starting game "\""${2}"\"" "\""${4}"\"" "(\""${1}"\")" at $TIMESTAMP >> ~/ES-DE/logs/game_playlog.txt ``` And let's name the end script `game_end_logging.sh` with the following contents: @@ -2047,14 +2140,14 @@ And let's name the end script `game_end_logging.sh` with the following contents: ``` #!/bin/bash TIMESTAMP=$(date +%Y-%m-%d' '%H:%M:%S) -echo "Ending game " "\""${2}"\"" "\""${4}"\"" "(\""${1}"\")" at $TIMESTAMP >> ~/.emulationstation/game_playlog.txt +echo "Ending game " "\""${2}"\"" "\""${4}"\"" "(\""${1}"\")" at $TIMESTAMP >> ~/ES-DE/logs/game_playlog.txt ``` After creating the two scripts, you should have something like this on the filesystem: ``` -~/.emulationstation/scripts/game-start/game_start_logging.sh -~/.emulationstation/scripts/game-end/game_end_logging.sh +~/ES-DE/scripts/game-start/game_start_logging.sh +~/ES-DE/scripts/game-end/game_end_logging.sh ``` Don't forget to make the scripts executable (e.g. "chmod 755 ./game_start_logging.sh"). @@ -2063,15 +2156,14 @@ If we now start ES-DE with the debug flag and launch a game, something like the ``` Aug 05 14:19:24 Debug: Scripting::fireEvent(): game-start "/home/myusername/ROMs/nes/Legend\ of\ Zelda,\ The.zip" "The Legend Of Zelda" "nes" "Nintendo Entertainment System" -Aug 05 14:19:24 Debug: Executing: /home/myusername/.emulationstation/scripts/game-start/game_start_logging.sh "/home/myusername/ROMs/nes/Legend\ of\ Zelda,\ The.zip" "The Legend Of Zelda" "nes" "Nintendo Entertainment System" +Aug 05 14:19:24 Debug: Executing: /home/myusername/ES-DE/scripts/game-start/game_start_logging.sh "/home/myusername/ROMs/nes/Legend\ of\ Zelda,\ The.zip" "The Legend Of Zelda" "nes" "Nintendo Entertainment System" . . Aug 05 14:27:15 Debug: Scripting::fireEvent(): game-end "/home/myusername/ROMs/nes/Legend\ of\ Zelda,\ The.zip" "The Legend Of Zelda" "nes" "Nintendo Entertainment System" "" -Aug 05 14:27:15 Debug: Executing: /home/myusername/.emulationstation/scripts/game-end/game_end_logging.sh "/home/myusername/ROMs/nes/Legend\ of\ Zelda,\ The.zip" "The Legend Of Zelda" "nes" "Nintendo Entertainment System" - +Aug 05 14:27:15 Debug: Executing: /home/myusername/ES-DE/scripts/game-end/game_end_logging.sh "/home/myusername/ROMs/nes/Legend\ of\ Zelda,\ The.zip" "The Legend Of Zelda" "nes" "Nintendo Entertainment System" ``` -Finally after running some games, ~/.emulationstation/game_playlog.txt should contain something like the following: +Finally after running some games, ~/ES-DE/logs/game_playlog.txt should contain something like the following: ``` Starting game "The Legend Of Zelda" "Nintendo Entertainment System" ("/home/myusername/ROMs/nes/Legend\ of\ Zelda,\ The.zip") at 2020-08-05 14:19:24 @@ -2099,7 +2191,7 @@ Then create the end script, which we'll name `set_resolution_4K.sh`: #!/bin/sh xrandr -s 3840x2160 sleep 0.3 -xdotool search --class emulationstation windowactivate +xdotool search --class es-de windowactivate ``` The last two lines are optional, they're used to set the focus back to ES-DE in case you're running attention-seeking applications such as Kodi which may steal focus after resolution changes. You may need to adjust the sleep time to get this to work reliably though, as the timing may differ between different computers and graphics drivers. @@ -2107,8 +2199,8 @@ The last two lines are optional, they're used to set the focus back to ES-DE in After creating the two scripts, you should have something like this on the filesystem: ``` -~/.emulationstation/scripts/game-start/set_resolution_1080p.sh -~/.emulationstation/scripts/game-end/set_resolution_4K.sh +~/ES-DE/scripts/game-start/set_resolution_1080p.sh +~/ES-DE/scripts/game-end/set_resolution_4K.sh ``` Don't forget to make the scripts executable (e.g. "chmod 755 ./set_resolution_1080p.sh"). diff --git a/THEMES-DEV.md b/THEMES-DEV.md index e29d521a4..cf78e75de 100644 --- a/THEMES-DEV.md +++ b/THEMES-DEV.md @@ -2,7 +2,7 @@ **Note:** This document is only relevant for the current ES-DE development version, if you would like to see the documentation for the latest stable release, refer to [THEMES.md](THEMES.md) instead. -If creating themes specifically for ES-DE, please add `-es-de` to the repository/directory name, as in `slate-es-de`. Themes made for ES-DE are not compatible with any other EmulationStation forks (and vice versa) and the -es-de extension makes it clear that it's an ES-DE theme. The actual theme name as defined using the `themeName` tag in capabilities.xml does of course not need to include the `-es-de` extension as that's the actual theme name that will be displayed when selecting themes from the _UI Settings_ menu. For example slate-es-de will be listed simply as _Slate_ in this menu. +If creating themes for ES-DE, please add `-es-de` to the repository/directory name to clearly indicate that it's a theme for this frontend. Two examples would be `linear-es-de` and `modern-es-de`. The actual theme name as defined using the `themeName` tag in capabilities.xml does of course not need to include the `-es-de` extension as that's the actual theme name that will be displayed when selecting themes from the _UI Settings_ menu. For example linear-es-de will be listed simply as _Linear_ in this menu. Before your start, make sure to download the _Theme engine examples_ theme that contains a number of example variants for things like vertical and horizontal carousels, wheel carousels, system view text lists, grids etc: diff --git a/THEMES.md b/THEMES.md index 50aee2746..28dea259d 100644 --- a/THEMES.md +++ b/THEMES.md @@ -1,6 +1,6 @@ -# ES-DE (EmulationStation Desktop Edition) v2.2 - Themes +# ES-DE (EmulationStation Desktop Edition) v3.0 - Themes -If creating themes specifically for ES-DE, please add `-es-de` to the repository/directory name, as in `slate-es-de`. Themes made for ES-DE are not compatible with any other EmulationStation forks (and vice versa) and the -es-de extension makes it clear that it's an ES-DE theme. The actual theme name as defined using the `themeName` tag in capabilities.xml does of course not need to include the `-es-de` extension as that's the actual theme name that will be displayed when selecting themes from the _UI Settings_ menu. For example slate-es-de will be listed simply as _Slate_ in this menu. +If creating themes for ES-DE, please add `-es-de` to the repository/directory name to clearly indicate that it's a theme for this frontend. Two examples would be `linear-es-de` and `modern-es-de`. The actual theme name as defined using the `themeName` tag in capabilities.xml does of course not need to include the `-es-de` extension as that's the actual theme name that will be displayed when selecting themes from the _UI Settings_ menu. For example linear-es-de will be listed simply as _Linear_ in this menu. Before your start, make sure to download the _Theme engine examples_ theme that contains a number of example variants for things like vertical and horizontal carousels, wheel carousels, system view text lists, grids etc: @@ -651,6 +651,95 @@ Here's an example configuration: ``` +## Font sizes + +The optional font sizes functionality makes it possible to use a set of predefined size options and connect these to theme variables that can be used to apply different text sizes and related design changes. The font sizes declared for the theme can be selected via the _Theme font size_ setting in the _UI Settings_ menu. + +To understand the basics on how to use variables, make sure to read the _Theme variables_ section elsewhere in this document. + +To use the font size entries you first need to declare them using `` tag pairs in the `capabilities.xml` file. The following sizes are available: + +| capabilities.xml name | UI Settings label | +| :-------------------- | :--------------- | +| medium | medium | +| large | large | +| small | small | +| x-large | extra large | +| x-small | extra small | + +The options will always be listed in the above order in the _UI Settings_ menu. + +Here's an example of a theme that implements three of these sizes: + +```xml + + + My theme + + medium + small + x-small + +``` + +In the theme configuration you'll also use a `` tag pair combined with a `` tag pair to define the variables you want to apply per font size. + +These `` tag pairs can be placed directly inside the `` tags, inside the `` tags or inside the `` tags. + +The mandatory name attribute is used to specificy which font size to use, and multiple values can be specified at the same time by separating them by commas or by whitespace characters (tabs, spaces or line breaks). + +Here's an example configuration: + +```xml + + + + 0.025 + 0.5 0.6437 + 0.022 + 0.016 + + + + + 0.015 + 0.45 0.6437 + 0.013 + + + + + 0.008 + 0.4 0.6437 + 0.006 + + + + 0.011 + + + + + + ${gameCounterPos} + 1 0.056 + ${gameCounterFontSize} + + + + 0.2 0.3412 + 0.2 0.040 + ${gameNameFontSize} + + + 0.33 0.3412 + 0.18 0.040 + ${publisherFontSize} + + + +``` + ## Aspect ratios The aspect ratio support works almost identically to the variants and color schemes with the main difference that the available aspect ratios are hardcoded into ES-DE. The theme can still decide which of the aspect ratios to support (or none at all in which case the theme aspect ratio is left undefined) but it can't create entirely new aspect ratio entries. @@ -876,15 +965,18 @@ The variant, color scheme and transitions names as well as their labels can be s Unlike the types just mentioned, aspectRatio entries can not be set to arbitrary values, instead they have to use a value from the _horizontal name_ or _vertical name_ columns in the following table: -| Horizontal name | Vertical name | Common resolutions | -| :--------------- | :------------- | :--------------------------------------------- | -| 16:9 | 16:9_vertical | 1280x720, 1920x1080, 2560x1440, 3840x2160 | -| 16:10 | 16:10_vertical | 1280x800, 1440x900, 1920x1200 | -| 3:2 | 3:2_vertical | 2160x1440 | -| 4:3 | 4:3_vertical | 320x240, 640x480, 800x600, 1024x768, 1600x1200 | -| 5:4 | 5:4_vertical | 1280x1024 | -| 21:9 | 21:9_vertical | 2560x1080, 3840x1600, 5120x2160 | -| 32:9 | 32:9_vertical | 3840x1080, 5120x1440 | +| Horizontal name | Vertical name | Common resolutions | +| :--------------- | :-------------- | :--------------------------------------------- | +| 16:9 | 16:9_vertical | 1280x720, 1920x1080, 2560x1440, 3840x2160 | +| 16:10 | 16:10_vertical | 1280x800, 1440x900, 1920x1200 | +| 3:2 | 3:2_vertical | 2160x1440 | +| 4:3 | 4:3_vertical | 320x240, 640x480, 800x600, 1024x768, 1600x1200 | +| 5:4 | 5:4_vertical | 1280x1024 | +| 19.5:9 | 19.5:9_vertical | 2340x1080, 2532x1170 | +| 20:9 | 20:9_vertical | 2400x1080, 1600x720 | +| 21:9 | 21:9_vertical | 2560x1080, 3840x1600, 5120x2160 | +| 32:9 | 32:9_vertical | 3840x1080, 5120x1440 | +| 1:1 | 1:1 | Any square resolution | The 21:9 and 32:9 aspect ratios are approximate as monitors of slightly different ratios are collectively marketed using these numbers. @@ -1327,10 +1419,11 @@ It's important to understand how the theme configuration files are parsed in ord 1) Transitions 2) Variables 3) Color schemes -4) Included files -5) "General" (non-variant) configuration -6) Variants -7) Aspect ratios +4) Font sizes +5) Included files +6) "General" (non-variant) configuration +7) Variants +8) Aspect ratios When including a file using the `` tag (i.e. step 4 above) then all steps listed above are executed for that included file prior to continuing to the next line after the `` tag. @@ -1339,7 +1432,7 @@ For any given step, the configuration is parsed in the exact order that it's def ## Property data types * NORMALIZED_PAIR - two decimal values delimited by a space, for example `0.25 0.5` -* PATH - path to a resource. If the first character is a tilde (`~`) then it will be expanded to the user's home directory (`$HOME` for Unix and macOS and `%HOMEPATH%` for Windows) unless overridden using the --home command line option. If the first character is a dot (`.`) then the resource will be searched for relative to the location of the theme file, for example `./myfont.ttf` or `./../core/fonts/myfont.ttf` +* PATH - path to a resource. If the first character is a tilde (`~`) then it will be expanded to the user's home directory (`$HOME` for Linux, BSD Unix and macOS and `%HOMEPATH%` for Windows) unless overridden using the --home command line option. If the first character is a dot (`.`) then the resource will be searched for relative to the location of the theme file, for example `./myfont.ttf` or `./../core/fonts/myfont.ttf` * BOOLEAN - `true`/`1` or `false`/`0` * COLOR - a hexadecimal RGB or RGBA color value consisting of 6 or 8 digits. If a 6 digit value is used then the alpha channel will be set to `FF` (completely opaque) * UNSIGNED_INTEGER - an unsigned integer value @@ -1912,6 +2005,10 @@ Properties: - Where on the element `pos` refers to. For example, an origin of `0.5 0.5` and a `pos` of `0.5 0.5` would place the textlist exactly in the middle of the screen. If the position and size attributes are themeable, origin is implied. - Minimum value per axis is `0` and maximum value per axis is `1` - Default is `0 0` +* `selectorWidth` - type: FLOAT + - Width of the selector bar. If an image has been defined using `selectorImagePath` then setting this property to zero will retain the aspect ratio for that image. + - Minimum value is `0` and maximum value is `1` + - Default is the equivalent value as the width of the overall element. * `selectorHeight` - type: FLOAT - Height of the selector bar. This is expanded downwards so you'll probably want to adjust its position using `selectorVerticalOffset` if making use of this property. - Minimum value is `0` and maximum value is `1` @@ -2073,6 +2170,10 @@ Properties: - `always` - Set element as stationary during all transitions. - `never` - Don't set element as stationary during any transitions. - Default is `never` +* `renderDuringTransitions` - type: BOOLEAN + - This special property which is only usable for slide transitions between the system and gamelist views makes it possible to for example have a background image stay seamlessly in place when transitioning, or being able to use semi-transparent stationary elements without having them render on top of each other during transitions. For this to work correctly only define `stationary` for one view and set `renderDuringTransitions` to false for the corresponding element in the other view. This way the element from the former view will keep rendering until the slide animation has been completed, after which the latter view will "take over" by rendering the element normally. + - This property can only be used if slide transitions are used, and only when moving from the system view to the gamelist view, or vice versa. + - Default is `true` * `flipHorizontal` - type: BOOLEAN - Flips the image texture horizontally. - Default is `false` @@ -2643,7 +2744,7 @@ Properties: - `sourceSystemName` - The source short system name of the game. For regular systems this value will be identical to `systemName` but for collections it will show the actual system that the game is located in instead of the collection system name. - `sourceSystemFullname` - The source full system name of the game. For regular systems this value will be identical to `systemFullname` but for collections it will show the actual system that the game is located in instead of the collection system name. * `defaultValue` - type: STRING - - This property makes it possible to override the default "unknown" text that is displayed if `metadata` has been set to `developer`, `publisher`, `genre` or `players` and there is no metadata available for the defined type. Any string can be used but you can't set it to a blank value. If you don't want to display anything when there is no metadata available, then set this property to `:space:` in which case a blankspace will be used. This property has no effect on the metadata editor where "unknown" will still be shown for blank values. + - This property makes it possible to override the default "unknown" text that is displayed if `metadata` has been set to `developer`, `publisher`, `genre` or `players` and there is no metadata available for the defined type. Any string can be used but you can't set it to a blank value. If you don't want to display anything when there is no metadata available, then set this property to `:space:` in which case a blankspace will be used. This property has no effect on the metadata editor where "unknown" will still be shown for blank values. A secondary use for this property is to set a default value if `metadata` has been set to `systemName`, `systemFullname`, `sourceSystemName` or `sourceSystemFullname` in which case the value will be used if the metadata value is blank. This is useful for defining a specific string at the root of the custom collections system. * `systemNameSuffix` - type: BOOLEAN - Whether to add the system name in square brackets after the game name when inside a collection system (automatic as well as custom collections). If `metadata` has been set to `description` then this property will only apply when inside the root of the grouped custom collections system where a summary of available games for the currently selected collection is displayed. - Default is `true` @@ -2924,6 +3025,9 @@ Properties: - `always` - Set element as stationary during all transitions. - `never` - Don't set element as stationary during any transitions. - Default is `never` +* `hideIfZero` - type: BOOLEAN + - If set to true then the element will not get rendered if the rating value is zero. + - Default is `false` * `gameselector` - type: STRING - If more than one gameselector element has been defined, this property makes it possible to state which one to use. If multiple gameselector elements have been defined and this property is missing then the first entry will be chosen and a warning message will be logged. If only a single gameselector has been defined, this property is ignored. The value of this property must match the `name` attribute value of the gameselector element. This property is only needed for the `system` view. * `gameselectorEntry` - type: UNSIGNED_INTEGER @@ -2988,7 +3092,6 @@ Properties: The helpsystem is a special element that displays a context-sensitive list of actions the user can take at any time. You should try and keep the position constant throughout every screen. Note that this element does not have a zIndex value, instead it's always rendered on top of all other elements. It also has to have its name attribute set to `help` or the configuration will not get loaded. - It's possible to set this element as right-aligned or center-aligned using a combination of the `pos` and `origin` properties. For example `1 1` and `1 1` will place it in the lower right corner of the screen. Keep in mind that the width of this element can vary depending on a number of factors, for example the _Toggle favorites_ and _Random system or game_ buttons can be enabled or disabled via the _UI Settings_ menu. Test extensively with the menu system as well, especially the virtual keyboard which displays a number of helpsystem entries. diff --git a/USERGUIDE-DEV.md b/USERGUIDE-DEV.md index 7b3d1f397..18a62fe3f 100644 --- a/USERGUIDE-DEV.md +++ b/USERGUIDE-DEV.md @@ -324,26 +324,13 @@ Instructions on how to customize the es_systems.xml file can be found in [INSTAL In addition to the above it's also possible to customize the find rules via the `es_find_rules.xml` file. The logic is essentially identical to what is described for es_systems.xml, and details regarding this file can be found in [INSTALL-DEV.md](INSTALL-DEV.md#es_find_rulesxml) as well. -## Migrating from other EmulationStation forks +## Migrating from EmulationStation **IMPORTANT!!! IMPORTANT!!! IMPORTANT!!!** -ES-DE is designed to be backward compatible to a certain degree. That is, it should be able to read data from other/previous EmulationStation versions such as the RetroPie and Batocera forks. But the opposite is not true and it's a one-way ticket for your gamelist.xml files and your custom collection files when migrating to ES-DE as they will be modified in ways that previous ES versions will see as data loss. For instance ES-DE does not use tags inside the gamelist.xml files to find game media but instead matches the media to the names of the game/ROM files. So it will not save any such tags back to the gamelist files during updates, effectively disabling the game media if the files are opened in another ES fork. +ES-DE is partially compatible with EmulationStation as both frontends originally shared the same source code. That is, ES-DE should generally be able to read data from EmulationStation. But the opposite is not true and it's a one-way ticket for your gamelist.xml files and your custom collection files when migrating to ES-DE as they will be modified in ways that EmulationStation will see as data loss. For instance ES-DE does not use tags inside the gamelist.xml files to find game media but instead matches the media to the names of the game/ROM files. So it will not save any such tags back to the gamelist files during updates, effectively disabling the game media if the files are opened in EmulationStation. -Due to this, always make backups of at least the following directories before testing ES-DE for the first time: - -``` -~/ES-DE/gameslists/ -~/ES-DE/collections/ -``` - -If you have gamelist.xml files in your ROMs directory tree then ES-DE will ignore those by default, so you need to move them to the ~/ES-DE/gamelists/ tree. - -It's also strongly adviced to not rename an old es_settings.cfg file to es_settings.xml for use in ES-DE as it may cause undefined behavior and crashes. - -If migrating from Batocera, RetroBat or Recalbox, be aware that ES-DE follows the RetroPie naming conventions for most game systems. This means that your game files may not be found unless the folders are renamed accordingly. Such an example is the Sega SG-1000 system which in Batocera, RetroBat and Recalbox has the _sg1000_ system name, but is _sg-1000_ in RetroPie and ES-DE. See the [Supported game systems](USERGUIDE-DEV.md#supported-game-systems) table at the bottom of this guide for the correct system names in ES-DE. - -Another potential issue when migrating from another EmulationStation fork is that the path tag requires a leading ./ in ES-DE while that may not be present in other forks. If you don't see any metadata for your games inside ES-DE, then simply add the ./ characters to each path tag and it should hopefully work. +Another potential issue when migrating gamelist.xml files from EmulationStation is that the path tag requires a leading ./ in ES-DE while that may not be present in files coming from EmulationStation. If you don't see any metadata for your games inside ES-DE, then simply add the ./ characters to each path tag and it should hopefully work. Example of an unreadable path tag: ``` @@ -355,6 +342,11 @@ Example of a correct path tag readable by ES-DE: ./Another World.lha ``` +And if you have gamelist.xml files in your ROMs directory tree then ES-DE will ignore those by default, so you need to move them to the ~/ES-DE/gamelists/ tree. + +If migrating from Batocera, RetroBat or Recalbox, be aware that ES-DE does not always use the same system names as those frontends. This means that your game files may not be found unless the folders are renamed accordingly. Such an example is the Sega SG-1000 system which in Batocera, RetroBat and Recalbox has the _sg1000_ system name, but is _sg-1000_ in ES-DE. See the [Supported game systems](USERGUIDE-DEV.md#supported-game-systems) table at the bottom of this guide for the correct system names in ES-DE. + + ## Removing orphaned data Manually removing game files from the ROMs directory tree instead of deleting them from ES-DE using the metadata editor will make any corresponding scraped media files, gamelist.xml entries and custom collection entries orphaned, i.e. they will refer to non-existent files. Although this is correctly handled by ES-DE and is not causing any serious issues, it does lead to unnecessary disk space usage and it does produce log warnings in es_log.txt on application startup. If a huge amount of game files have been manually removed it can also lead to performance problems. diff --git a/USERGUIDE.md b/USERGUIDE.md index b223f973d..deb4a9e09 100644 --- a/USERGUIDE.md +++ b/USERGUIDE.md @@ -1,4 +1,4 @@ -# ES-DE (EmulationStation Desktop Edition) v2.2 - User guide +# ES-DE (EmulationStation Desktop Edition) v3.0 - User guide It's generally recommended to read the [Frequently Asked Questions (FAQ)](FAQ.md) document prior to diving into the information in this guide. @@ -36,12 +36,12 @@ The installation procedure is just covered briefly here and may differ a bit for The AppImage release should be usable on most modern x86 64-bit Linux distributions. After download you may have to set the file as executable, such as this: ``` -chmod +x EmulationStation-DE-x64.AppImage +chmod +x ES-DE_x64.AppImage ``` Or if you're using the Steam Deck AppImage: ``` -chmod +x EmulationStation-DE-x64_SteamDeck.AppImage +chmod +x ES-DE_x64_SteamDeck.AppImage ``` To run AppImage files you need libfuse2 installed, but some newer distributions like Ubuntu 22.04 LTS no longer ship with this library preinstalled. You can however easily install it like this: @@ -57,11 +57,11 @@ There's not really much to say about these operating systems, just install ES-DE **On first application startup** -Upon first startup, ES-DE will create its `~/.emulationstation` home directory. +Upon first startup, ES-DE will create its `~/ES-DE` application data directory. -On Unix this means `/home//.emulationstation`, on macOS `/Users//.emulationstation` and on Windows `C:\Users\\.emulationstation` or `EmulationStation-DE\.emulationstation` depending on whether the installer release or the portable release is used. +On Linux this means `/home//ES-DE`, on macOS `/Users//ES-DE` and on Windows `C:\Users\\ES-DE` or `ES-DE\ES-DE` depending on whether the installer release or the portable release is used. -Also on first startup the configuration file `es_settings.xml` will be generated in the ES-DE home directory, containing all the application settings at their default values. Following this, a file named `es_systems.xml` will be loaded from the resources directory (which is part of the ES-DE installation). This file contains the game system definitions including which emulator to use per platform. For many systems there are also alternative emulators defined which can be applied system-wide or per game. How that works is explained later in this guide. A customized systems configuration file can also be used, as described in the next section below. +Also on first startup the configuration file `es_settings.xml` will be generated in the `ES-DE/settings` directory, containing all the application settings at their default values. Following this, a file named `es_systems.xml` will be loaded from the resources directory (which is part of the ES-DE installation). This file contains the game system definitions including which emulator to use per platform. For many systems there are also alternative emulators defined which can be applied system-wide or per game. How that works is explained later in this guide. A customized systems configuration file can also be used, as described in the next section below. In addition to es_systems.xml there's an `es_find_rules.xml` file that gets loaded as well and which contains rules on how to locate the emulators, i.e. how to find out where they've been installed. @@ -69,7 +69,7 @@ There's an application log file created in the ES-DE home directory named `es_lo After ES-DE finds at least one game file, it will populate that game system and the application will start. If there are no game files, a dialog will be shown explaining that you need to install your game files into your ROM directory. You will also be given a choice to change that ROM directory path if you don't want to use the default one. As well you have the option to generate the complete game systems directory structure based on information in es_systems.xml. -When generating the directory structure, a file named systeminfo.txt will be created in each game system folder which will provide you with some information about the system. Here's an example for the _dos_ system as seen on Unix: +When generating the directory structure, a file named systeminfo.txt will be created in each game system folder which will provide you with some information about the system. Here's an example for the _dos_ system as seen on Linux: ``` System name: dos @@ -111,18 +111,18 @@ epic: Epic Games Store famicom: Nintendo Family Computer ``` -If a custom es_systems.xml file is present in ~/.emulationstation/custom_systems/ any entries from this file will have their names trailed by the text _(custom system)_. So if the _dos_ system in the example above would be present in the custom systems configuration file, the system would be shown as _dos (custom system)_ instead of simply _dos_. This is only applicable for the systems.txt and systeminfo.txt files, the trailing text is not applied or used anywhere else in the application. +If a custom es_systems.xml file is present in ~/ES-DE/custom_systems/ any entries from this file will have their names trailed by the text _(custom system)_. So if the _dos_ system in the example above would be present in the custom systems configuration file, the system would be shown as _dos (custom system)_ instead of simply _dos_. This is only applicable for the systems.txt and systeminfo.txt files, the trailing text is not applied or used anywhere else in the application. ![alt text](images/es-de_ui_easy_setup.png "ES-DE Easy Setup") _This is the dialog shown if no game files were found. It lets you configure the ROM directory if you don't want to use the default one, and you can also generate the game systems directory structure. Note that the directory is the physical path, and that your operating system may present this as a localized path if you are using a language other than English._ ## Upgrading to a newer release -**Note:** Before upgrading ES-DE, make sure that you have not made any system customizations anywhere in the installation directory structure as these files will be overwritten during the upgrade process. All customizations should go into ~/.emulationstation/custom_systems/ as described elsewhere in this guide. None of the upgrade methods mentioned below will ever touch any files inside your .emulationstation directory tree. +**Note:** Before upgrading ES-DE, make sure that you have not made any system customizations anywhere in the installation directory structure as these files will be overwritten during the upgrade process. All customizations should go into ~/ES-DE/custom_systems/ as described elsewhere in this guide. None of the upgrade methods mentioned below will ever touch any files inside your ES-DE directory tree. -There is a built-in application updater that can automatically update the Linux AppImage releases, and as of ES-DE 2.2.0 there is also support for downloading the Windows and macOS packages. Just be aware that these will still need to be manually installed. Using the application updater is straightforward, just follow the on-screen instructions. For the AppImage releases the old file is retained by renaming it, adding its version to the filename followed by the .OLD extension, for example `EmulationStation-DE-x64_SteamDeck.AppImage_2.1.0.OLD` +There is a built-in application updater that can automatically update the Linux AppImage releases, and as of ES-DE 2.2.0 there is also support for downloading the Windows and macOS packages. Just be aware that these will still need to be manually installed. Using the application updater is straightforward, just follow the on-screen instructions. For the AppImage releases the old file is retained by renaming it, adding its version to the filename followed by the .OLD extension, for example `ES-DE_x64_SteamDeck.AppImage_3.0.0.OLD` -Note that the updater will keep whatever filename you had for your running AppImage file, which could potentially be confusing if you for example added version information to the filename. It's always recommend to keep the default AppImage filenames, i.e. `EmulationStation-DE-x64.AppImage` and `EmulationStation-DE-x64_SteamDeck.AppImage` +Note that the updater will keep whatever filename you had for your running AppImage file, which could potentially be confusing if you for example added version information to the filename. It's always recommend to keep the default AppImage filenames, i.e. `ES-DE_x64.AppImage` and `ES-DE_x64_SteamDeck.AppImage` On Windows and macOS you can specify to which directory you want to save the downloaded file. The default is `C:\Users\myusername\Downloads` on Windows and `/Users/myusername/Downloads` on macOS. @@ -143,7 +143,7 @@ AUR upgrades should be automatically handled via your package manager and it sho **macOS** -Open _Applications_ in Finder and right click on _EmulationStation Desktop Edition_ and choose _Move to Trash_. Then simply install the new release using the .dmg drag-and-drop installer. +Open _Applications_ in Finder and right click on _ES-DE_ and choose _Move to Trash_. Then simply install the new release using the .dmg drag-and-drop installer. **Windows installer** @@ -164,7 +164,7 @@ In theory it's possible to make a custom system entry and hardcode the path to a If you really insist on not placing your games into the ES-DE standard directory structure, a much better solution is to symlink the game directories into the standard directory. In this way you don't need to make a custom es_systems.xml file and any additional emulators and other configuration added to future ES-DE releases will just work after upgrading. -This is an example of symlinking the Super Nintendo game directory on Unix and macOS: +This is an example of symlinking the Super Nintendo game directory on Linux and macOS: ``` cd ~/ROMs ln -s ~/my_games/super_nintendo/ snes @@ -189,7 +189,7 @@ Note that if the setting _Only show games from gamelist.xml files_ has been enab ## Placing games and other resources on network shares -Although ES-DE does support placing game ROMs, the `.emulationstation` home directory and the `downloaded_media` directory on network shares, this can lead to serious performance problems in some instances. Especially problematic is the Microsoft SMB protocol as it offers abysmal performance for some disk operations on which ES-DE relies heavily. For small game libraries this can still be acceptable, but for libraries with hundreds or thousands of games the application startup time and overall usage will be very painful or even unusable. Similar issues could occur when using file hosting services like Google Drive. +Although ES-DE does support placing game ROMs, the `ES-DE` application data directory and the `downloaded_media` directory on network shares, this can lead to serious performance problems in some instances. Especially problematic is the Microsoft SMB protocol as it offers abysmal performance for some disk operations on which ES-DE relies heavily. For small game libraries this can still be acceptable, but for libraries with hundreds or thousands of games the application startup time and overall usage will be very painful or even unusable. Similar issues could occur when using file hosting services like Google Drive. A general recommendation is to place all game files and other data on drives connected directly to the machine where ES-DE is running. Even using low speed technology like USB thumb drives, SD cards etc. is generally fine and leads to acceptable performance in most instances. @@ -231,7 +231,7 @@ In order for ES-DE to run, graphics drivers with OpenGL support have to be insta On some GPUs with buggy drivers, ES-DE may only display a black screen on startup or when launching a game. The problem can be worked around by specifying a window size for ES-DE that is a single pixel wider than the actual screen resolution. So for example for a 1280x800 display, the resolution can be set to 1281x800 and then rendering should work correctly. This is applied using the --resolution command line option, for example: ``` -EmulationStation.exe --resolution 1281 800 +ES-DE.exe --resolution 1281 800 ``` Some computers using Intel Iris Xe GPUs refuse to start ES-DE or display excessive graphics corruption. These problems are seemingly caused by driver bugs and do not occur when using Linux with the same hardware. There is no known solution or workaround to this issue other than switching to Linux or waiting for Intel to resolve the problem with a driver update. @@ -252,7 +252,7 @@ If you want to create your own portable intallation from scratch or customize th A number of systems have alternative emulator entries named _Shortcut or script_ which allows the direct execution of .lnk shortcut files or .bat batch files. It's not possible by default to directly launch .ps1 PowerShell scripts. As running PowerShell scripts is not even enabled by default on Windows they are for sure not recommended. If you still want to use them the best approach is to execute them via either a .lnk shortcut file or a .bat wrapper script where you explicitly call powershell.exe with the -command flag. If you instead insist on running them directly from ES-DE, you'll need to add a custom system or find rule configuration where you execute powershell.exe instead of cmd.exe and you'll also need to add .ps1 as a file extension for each relevant system. -Some disk operations can have abysmal performance on Windows, and this may be especially obvious for the theme downloader. This is often caused by anti-virus software like Microsoft Defender. If it takes say 30 seconds rather than 300 milliseconds to open the theme downloader then it may be a good idea to add an exlusion for the .emulationstation\themes\ directory to Microsoft Defender. The same may also be true for other directories like the ROMs folder if disk performance is terrible. Refer to your anti-virus software documentation on how to setup such exclusions. +Some disk operations can have abysmal performance on Windows, and this may be especially obvious for the theme downloader. This is often caused by anti-virus software like Microsoft Defender. If it takes say 30 seconds rather than 300 milliseconds to open the theme downloader then it may be a good idea to add an exlusion for the ES-DE\themes\ directory to Microsoft Defender. The same may also be true for other directories like the ROMs folder if disk performance is terrible. Refer to your anti-virus software documentation on how to setup such exclusions. ## Specific notes for macOS @@ -268,13 +268,11 @@ At the time of writing there is an additional issue with the ARM release of Retr The first time you launch a RetroArch-emulated game from within ES-DE the operating system will present you with a security option with the following description: -`"EmulationStation Desktop Edition" would like to access files in your Documents folder.` +`"ES-DE" would like to access files in your Documents folder.` If you don't allow this, you will not be able to place system BIOS ROMs in the RetroArch default system directory `~/Documents/RetroArch/system` even if you've already given RetroArch access to this folder. This is so because RetroArch runs as a subprocess to ES-DE and therefore inherits the security settings from the parent application. Attempting to launch a game without enabling the access will simply display an error message in the emulator that the BIOS files are missing. This of course only applies to emulators that require BIOS ROMs, all other games should work fine regardless of this security setting. -If you accidentally refused ES-DE the folder access, you can fix this by opening _System Settings_, selecting _Privacy & Security_ and within the GUI choose _Files and Folders_. The option you need to enable is _Documents Folder_ under _EmulationStation Desktop Edition_. - -By default files and directories starting with a dot are hidden on macOS, so to show the .emulationstation directory in your home directory you need to enable hidden files in Finder. You do this using the keyboard combination Shift + Command + . (dot). +If you accidentally refused ES-DE the folder access, you can fix this by opening _System Settings_, selecting _Privacy & Security_ and within the GUI choose _Files and Folders_. The option you need to enable is _Documents Folder_ under _ES-DE_. A minor annoyance is that macOS creates metadata files starting with ._ in the filename when placing game/ROM files on some filesystem types such as exFAT. This means that you will see double entries inside ES-DE for all such games. To hide these extra files, the option _Show hidden files and folders (requires restart)_ in the _Other settings_ menu can be set to disabled. @@ -288,12 +286,16 @@ It's also possible to install ES-DE using [EmuDeck](https://www.emudeck.com) whi Unless RetroDECK is used, Flatpak releases of some emulators may need some extra permissions to be able to launch games placed on external devices such as a memory card. This is the case for instance for melonDS and RPCS3. The easiest way to do this is by using [Flatseal](https://flathub.org/apps/details/com.github.tchx84.Flatseal). The option you need to enable is generally _All system files_ in the _Filesystem_ section. If using EmuDeck some of these settings will be applied automatically via their installer. -If you are unfamiliar with Unix operating systems, make sure to at least read up on the concepts of _dotfiles_ (hidden files and directories), _home directories_ (including use of the tilde ~ character) and _symbolic links_ (symlinks): +If you are unfamiliar with Linux/Unix operating systems, make sure to at least read up on the concepts of _dotfiles_ (hidden files and directories), _home directories_ (including use of the tilde ~ character) and _symbolic links_ (symlinks): [https://en.wikipedia.org/wiki/Hidden_file_and_hidden_directory#Unix_and_Unix-like_environments](https://en.wikipedia.org/wiki/Hidden_file_and_hidden_directory#Unix_and_Unix-like_environments) \ [https://en.wikipedia.org/wiki/Home_directory#Unix](https://en.wikipedia.org/wiki/Home_directory#Unix) \ [https://en.wikipedia.org/wiki/Symbolic_link](https://en.wikipedia.org/wiki/Symbolic_link) +## Specific notes for Android + +The Android port of ES-DE is quite different than the other versions, so it has its specifics covered by a dedicated [ANDROID.md](ANDROID.md) document. + ## Specific notes for Raspberry Pi ES-DE on the Raspberry Pi requires a desktop environment, or more specifically a window manager and a sound server (like PulseAudio or PipeWire). There are no plans to add support for direct hardware access to the framebuffer or to ALSA. If you want to use your Raspberry Pi as an appliance, take a look at [RetroPie](https://retropie.org.uk), [Recalbox](https://www.recalbox.com) or [Batocera](https://batocera.org) instead. @@ -308,9 +310,9 @@ In general, 720p works fine with the RPi 4, and 1080p is tolerable but not reall The game systems configuration file `es_systems.xml` is located in the ES-DE resources directory which is part of the application installation. As such this file is not intended to be modified directly. If system customizations are required, a separate es_systems.xml file should instead be placed in the `custom_systems` folder in the ES-DE home directory. -On Unix this means `/home//.emulationstation/custom_systems/es_systems.xml`, on macOS `/Users//.emulationstation/custom_systems/es_systems.xml` and on Windows `C:\Users\\.emulationstation\custom_systems\es_systems.xml` or `EmulationStation-DE\.emulationstation\custom_systems\es_systems.xml` depending on whether the installer release or the portable release is used. +On Linux this means `/home//ES-DE/custom_systems/es_systems.xml`, on macOS `/Users//ES-DE/custom_systems/es_systems.xml` and on Windows `C:\Users\\ES-DE\custom_systems\es_systems.xml` or `ES-DE\ES-DE\custom_systems\es_systems.xml` depending on whether the installer release or the portable release is used. -If you're using the AppImage release of ES-DE then the bundled es_systems.xml file is embedded in the AppImage together with the rest of the resources. You can extract it if you need it as a reference when creating your customized entries, or you can find it [here](https://gitlab.com/es-de/emulationstation-de/-/tree/master/resources/systems/unix). +If you're using the AppImage release of ES-DE then the bundled es_systems.xml file is embedded in the AppImage together with the rest of the resources. You can extract it if you need it as a reference when creating your customized entries, or you can find it [here](https://gitlab.com/es-de/emulationstation-de/-/tree/master/resources/systems/linux). Although it's possible to make a copy of the bundled configuration file, to modify it and then place it in this directory, that is not how the system customization is designed to be used. Instead the intention is that the file in `custom_systems` complements the bundled configuration, meaning only systems that are to be customized should be included. @@ -320,26 +322,13 @@ Instructions on how to customize the es_systems.xml file can be found in [INSTAL In addition to the above it's also possible to customize the find rules via the `es_find_rules.xml` file. The logic is essentially identical to what is described for es_systems.xml, and details regarding this file can be found in [INSTALL.md](INSTALL.md#es_find_rulesxml) as well. -## Migrating from other EmulationStation forks +## Migrating from EmulationStation **IMPORTANT!!! IMPORTANT!!! IMPORTANT!!!** -ES-DE is designed to be backward compatible to a certain degree. That is, it should be able to read data from other/previous EmulationStation versions such as the RetroPie and Batocera forks. But the opposite is not true and it's a one-way ticket for your gamelist.xml files and your custom collection files when migrating to ES-DE as they will be modified in ways that previous ES versions will see as data loss. For instance ES-DE does not use tags inside the gamelist.xml files to find game media but instead matches the media to the names of the game/ROM files. So it will not save any such tags back to the gamelist files during updates, effectively disabling the game media if the files are opened in another ES fork. +ES-DE is partially compatible with EmulationStation as both frontends originally shared the same source code. That is, ES-DE should generally be able to read data from EmulationStation. But the opposite is not true and it's a one-way ticket for your gamelist.xml files and your custom collection files when migrating to ES-DE as they will be modified in ways that EmulationStation will see as data loss. For instance ES-DE does not use tags inside the gamelist.xml files to find game media but instead matches the media to the names of the game/ROM files. So it will not save any such tags back to the gamelist files during updates, effectively disabling the game media if the files are opened in EmulationStation. -Due to this, always make backups of at least the following directories before testing ES-DE for the first time: - -``` -~/.emulationstation/gameslists/ -~/.emulationstation/collections/ -``` - -If you have gamelist.xml files in your ROMs directory tree then ES-DE will ignore those by default, so you need to move them to the ~/.emulationstation/gamelists/ tree. - -It's also strongly adviced to not rename an old es_settings.cfg file to es_settings.xml for use in ES-DE as it may cause undefined behavior and crashes. - -If migrating from Batocera, RetroBat or Recalbox, be aware that ES-DE follows the RetroPie naming conventions for most game systems. This means that your game files may not be found unless the folders are renamed accordingly. Such an example is the Sega SG-1000 system which in Batocera, RetroBat and Recalbox has the _sg1000_ system name, but is _sg-1000_ in RetroPie and ES-DE. See the [Supported game systems](USERGUIDE.md#supported-game-systems) table at the bottom of this guide for the correct system names in ES-DE. - -Another potential issue when migrating from another EmulationStation fork is that the path tag requires a leading ./ in ES-DE while that may not be present in other forks. If you don't see any metadata for your games inside ES-DE, then simply add the ./ characters to each path tag and it should hopefully work. +Another potential issue when migrating gamelist.xml files from EmulationStation is that the path tag requires a leading ./ in ES-DE while that may not be present in files coming from EmulationStation. If you don't see any metadata for your games inside ES-DE, then simply add the ./ characters to each path tag and it should hopefully work. Example of an unreadable path tag: ``` @@ -351,11 +340,16 @@ Example of a correct path tag readable by ES-DE: ./Another World.lha ``` +And if you have gamelist.xml files in your ROMs directory tree then ES-DE will ignore those by default, so you need to move them to the ~/ES-DE/gamelists/ tree. + +If migrating from Batocera, RetroBat or Recalbox, be aware that ES-DE does not always use the same system names as those frontends. This means that your game files may not be found unless the folders are renamed accordingly. Such an example is the Sega SG-1000 system which in Batocera, RetroBat and Recalbox has the _sg1000_ system name, but is _sg-1000_ in ES-DE. See the [Supported game systems](USERGUIDE.md#supported-game-systems) table at the bottom of this guide for the correct system names in ES-DE. + + ## Removing orphaned data Manually removing game files from the ROMs directory tree instead of deleting them from ES-DE using the metadata editor will make any corresponding scraped media files, gamelist.xml entries and custom collection entries orphaned, i.e. they will refer to non-existent files. Although this is correctly handled by ES-DE and is not causing any serious issues, it does lead to unnecessary disk space usage and it does produce log warnings in es_log.txt on application startup. If a huge amount of game files have been manually removed it can also lead to performance problems. -In order to remove such unnecessary media files and configuration file entries, the _Orphaned data cleanup_ utility in the _Utilities_ menu can be used. This tool should be largely self-explanatory. And although it should generally be safe to use, unforeseen issues can occur so make sure to make backups of at least your `.emulationstation/gamelists` and `.emulationstation/collections` directories before attempting to use this tool. +In order to remove such unnecessary media files and configuration file entries, the _Orphaned data cleanup_ utility in the _Utilities_ menu can be used. This tool should be largely self-explanatory. And although it should generally be safe to use, unforeseen issues can occur so make sure to make backups of at least your `ES-DE/gamelists` and `ES-DE/collections` directories before attempting to use this tool. It's recommended to run this utility with the _Show hidden games_ setting enabled as orphaned gamelist.xml folder entries may otherwise not get purged. @@ -365,17 +359,17 @@ Note that there are no guarantees that any processed gamelist.xml files will be If the utility finds any data to be removed, a backup of the old files will be made. This will end up in a `CLEANUP` directory and will contain a date and time stamp. For example: ``` -~/.emulationstation/gamelists/CLEANUP/2023-07-27_142830/dos/gamelist.xml -~/.emulationstation/gamelists/CLEANUP/2023-07-27_142830/ports/gamelist.xml -~/.emulationstation/collections/CLEANUP/2023-07-27_143216/custom-Action.cfg -~/.emulationstation/collections/CLEANUP/2023-07-27_143216/custom-Fighting.cfg -~/.emulationstation/downloaded_media/CLEANUP/2023-07-27_123406/atari2600/titlescreens/H.E.R.O..png -~/.emulationstation/downloaded_media/CLEANUP/2023-07-27_123406/c64/3dboxes/Minerer 2049.crt.png +~/ES-DE/gamelists/CLEANUP/2023-07-27_142830/dos/gamelist.xml +~/ES-DE/gamelists/CLEANUP/2023-07-27_142830/ports/gamelist.xml +~/ES-DE/collections/CLEANUP/2023-07-27_143216/custom-Action.cfg +~/ES-DE/collections/CLEANUP/2023-07-27_143216/custom-Fighting.cfg +~/ES-DE/downloaded_media/CLEANUP/2023-07-27_123406/atari2600/titlescreens/H.E.R.O..png +~/ES-DE/downloaded_media/CLEANUP/2023-07-27_123406/c64/3dboxes/Minerer 2049.crt.png ``` This means that you will need to manually delete these backup directories to free up disk space when you are certain that you no longer need the data. -All files and entries that are removed are logged to `~/.emulationstation/es_log.txt` so it could be a good idea to make a backup copy of this file after running the cleanup, for future reference. +All files and entries that are removed are logged to `~/ES-DE/logs/es_log.txt` so it could be a good idea to make a backup copy of this file after running the cleanup, for future reference. Any media directories that are empty after the cleanup will also be removed by this utility. @@ -388,7 +382,7 @@ _The Orphaned data cleanup utility after successfully removing some gamelist.xml ES-DE fully supports high resolution displays such as 1440p, 4K, 6K, 8K, ultrawide monitors etc. But many emulators (e.g. RetroArch) will also run using the same resolution which may cause performance problems on slower machines or when using resource intensive shaders. Although some emulator cores will have options to set their internal resolution, they still need to be scaled up to the screen resolution. -A solution to this is to use the custom event scripts functionality to set a temporary resolution upon launching a game that will be reverted when returning to ES-DE. Such a setup is detailed in [INSTALL.md](INSTALL.md#custom-event-scripts) for Unix, but should hopefully be possible to implement similarly on Windows. When going for this setup it's important that the setting _Run in background (while game is launched)_ is disabled or ES-DE may not be able to correctly switch to the emulator window when launching games. +A solution to this is to use the custom event scripts functionality to set a temporary resolution upon launching a game that will be reverted when returning to ES-DE. Such a setup is detailed in [INSTALL.md](INSTALL.md#custom-event-scripts) for Linux, but should hopefully be possible to implement similarly on Windows. When going for this setup it's important that the setting _Run in background (while game is launched)_ is disabled or ES-DE may not be able to correctly switch to the emulator window when launching games. On macOS it's problematic to change screen resolutions on the fly or on a per-application basis as Apple has seemingly disabled most of this functionality in recent operating system releases. The only real option here is to lower the display resolution prior to launching ES-DE. @@ -402,22 +396,22 @@ Below are some examples. For consistency it's assumed that the display resolutio Running at a lower application resolution in a window: ``` -emulationstation --resolution 1280 720 +es-de --resolution 1280 720 ``` Running at a lower application resolution in padded fullscreen mode: ``` -emulationstation --resolution 1824 1026 --fullscreen-padding 1 +es-de --resolution 1824 1026 --fullscreen-padding 1 ``` Same as above but also offsetting the screen slightly to the left and downwards: ``` -emulationstation --resolution 1824 1026 --fullscreen-padding 1 --screenoffset -40 22 +es-de --resolution 1824 1026 --fullscreen-padding 1 --screenoffset -40 22 ``` Rotate application screen contents 90 degrees while running at the native 1920x1080 screen resolution: ``` -emulationstation --screenrotate 90 +es-de --screenrotate 90 ``` ## Input device configuration @@ -430,7 +424,7 @@ The actual procedure to map the inputs should be self-explanatory, just follow t Any custom configuration is applied per unique device ID (GUID). So if two identical controllers are used with ES-DE, both will have the same configuration applied. If connecting controllers of the same type but of different revisions, the GUID may differ and therefore the custom configuration would need to be applied to each device individually. -If you have issues with your input configuration, as a last resort you can reset all mappings by deleting or renaming the file `~/.emulationstation/es_input.xml` +If you have issues with your input configuration, as a last resort you can reset all mappings by deleting or renaming the file `~/ES-DE/settings/es_input.xml` ## System view (main screen) @@ -488,6 +482,8 @@ When editing text it's also possible to paste from the clipboard into ES-DE usin Default keyboard mappings are shown in brackets below. +It's assumed that the option _Swap the A/B and X/Y buttons_ in the _Input device settings_ menu is disabled as some buttons will otherwise obviously be swapped. + **Up and down**\ _(Arrow up / Arrow down)_ @@ -539,7 +535,7 @@ _(Delete)_ Starts the media viewer in the gamelist view or the screensaver in the system view (if the _Enable screensaver controls_ setting is enabled). Used by some other minor functions as explained by the help system and/or this guide. **Y button**\ -_(Insert on Unix and Windows, F13 on macOS)_ +_(Insert on Linux and Windows, F13 on macOS)_ Marks games as favorites in the gamelist view (if the _Enable toggle favorites button_ option has been enabled). Used by some other minor functions as explained by the help system and/or this guide. @@ -555,13 +551,13 @@ As of ES-DE 2.2.0 no legacy EmulationStation themes are supported, such as those There are several user-selectable theme options in the _UI Settings_ menu, most notably _Theme variant_ which is essentially a form of theme profile. This could be anything, like different ways to navigate the themes, different layouts and designs etc. Additionally the _Theme color scheme_ setting makes it possible to select between different color schemes, if supported by the theme. The two remaining options _Theme aspect ratio_ and _Theme transitions_ are also important but you can normally leave them at their default _Automatic_ values, especially the _Theme aspect ratio_ option as it will be automatically detected. Be aware that all these theme settings are optional, it's up to the theme developer whether to add support for them to their themes. -Themes are most easily installed using the built-in theme downloader, but you can also manually add them to your ES-DE home directory, i.e. `~/.emulationstation/themes/`. By just adding them there, one folder each, they will be found during startup and you can then choose between them via the _UI Settings_ menu on the main menu. If using the portable release of ES-DE on Windows, the .emulationstation folder can be found in the root of the EmulationStation-DE directory. +Themes are most easily installed using the built-in theme downloader, but you can also manually add them to your ES-DE home directory, i.e. `~/ES-DE/themes/`. By just adding them there, one folder each, they will be found during startup and you can then choose between them via the _UI Settings_ menu on the main menu. If using the portable release of ES-DE on Windows, the ES-DE application data can be found in the root of the ES-DE directory. -Although you should place additional themes in your ES-DE home directory, the default Slate and Modern themes are located in the installation folder as they come bundled with the application. For example this could be `/usr/share/emulationstation/themes/` on Unix, `/Applications/EmulationStation Desktop Edition.app/Contents/Resources/themes/` on macOS or `C:\Program Files\EmulationStation-DE\themes\` on Windows. If using the portable ES-DE release on Windows, the themes folder will be located in the root of the EmulationStation-DE directory. +Although you should place additional themes in your ES-DE home directory, the default Slate and Modern themes are located in the installation folder as they come bundled with the application. For example this could be `/usr/share/es-de/themes/` on Linux, `/Applications/ES-DE.app/Contents/Resources/themes/` on macOS or `C:\Program Files\ES-DE\themes\` on Windows. If using the portable ES-DE release on Windows, the themes folder will be located in the root of the ES-DE directory. Note that if using the AppImage release on Linux, then there is no installation folder as all files are contained inside the AppImage file. -If you would like to customize the Slate or Modern themes, simply make a copy of their directories to `~/.emulationstation/themes/` and then those copies will take precedence over the ones in the application installation directory. +If you would like to customize the Slate or Modern themes, simply make a copy of their directories to `~/ES-DE/themes/` and then those copies will take precedence over the ones in the application installation directory. Refer to the official themes list for a selection of high-quality themes (these are also available via the built-in theme downloader):\ https://gitlab.com/es-de/themes/themes-list @@ -583,7 +579,7 @@ If you have manually downloaded any of the themes from the [official themes list If you have customized a theme by for instance modifying any of its XML files, then this will be highlighted with an exclamation mark and the text _LOCAL CHANGES_ in the theme downloader interface. If you attempt to fetch updates for such a theme you will be asked a question of whether to overwrite your local changes, or whether to cancel. If you have however added additional files to the theme that are not included in the theme repository, then these will not interfere and you can go ahead and fetch theme updates without any risk of having your local files being deleted. But there is a special (although unlikely) situation, if you add files that are not part of the theme repository but that are later added by the theme developer as well, then your local copies of any such files will be ovewritten when fetching theme updates. -In worst case there could be a situation where a repository is corrupted and the theme downloader can't properly identify or handle the corruption. In this case you will have to rename or delete that directory. This could also apply to the actual themes list repository. The latter is named _themes-list_ so by just deleting this directory (i.e. `~/.emulationstation/themes/themes-list`) you'll reset the theme downloader to its initial state. +In worst case there could be a situation where a repository is corrupted and the theme downloader can't properly identify or handle the corruption. In this case you will have to rename or delete that directory. This could also apply to the actual themes list repository. The latter is named _themes-list_ so by just deleting this directory (i.e. `~/ES-DE/themes/themes-list`) you'll reset the theme downloader to its initial state. Note that the exFAT filesystem can't be used as it makes the theme downloader fail. But using this filesystem is strongly discouraged anyway as it offers very poor disk I/O performance which makes ES-DE run really slowly. @@ -684,6 +680,7 @@ The following emulators are supported in AppImage format when using the bundled | ps2 | PCSX2 | pcsx2*.AppImage | | ps2 | Play! | Play!*.AppImage | | ps3 | RPCS3 | rpcs3*.AppImage | +| psvita | Vita3K | Vita3K*.AppImage | | psx | DuckStation | DuckStation*.AppImage | | snes | Snes9x | Snes9x*.AppImage | | switch | Yuzu | yuzu*.AppImage | @@ -730,7 +727,7 @@ There is however a workaround available to launch the Flatpak first, should you For example if using the ES-DE AppImage release, this would be the command to execute: ``` -PATH=/var/lib/flatpak/exports/bin:~/.local/share/flatpak/exports/bin:$PATH ./EmulationStation-DE-x64.AppImage +PATH=/var/lib/flatpak/exports/bin:~/.local/share/flatpak/exports/bin:$PATH ./ES-DE_x64.AppImage ``` Obviously you would need to change the path to the AppImage if it's not in your current working directory. @@ -812,6 +809,12 @@ cd ~/Applications/SkyEmu chmod +x SkyEmu ``` +And for VPinballX_GL: +``` +cd ~/Applications/VPinballX +chmod +x VPinballX_GL +``` + ## Running Windows emulators on Linux using Wine or Proton On Linux it's possible to run emulators developed specifically for Microsoft Windows via the Wine compatibility layer. Support is also included for the Proton fork of Wine. @@ -918,9 +921,9 @@ But for some systems a more elaborate setup is required, and the configuration f Let's start with the simple scenario of a single ROM file per game, which is the case for the majority of platforms. For this example we're setting up ES-DE to play Nintendo Entertainment System games. -The supported file extensions are listed in [unix/es_systems.xml](resources/systems/unix/es_systems.xml), [macos/es_systems.xml](resources/systems/macos/es_systems.xml) and [windows/es_systems.xml](resources/systems/windows/es_systems.xml) but if you generated the game system directories on first application startup or later via _Create/update system directories_ in the _Utilities_ menu, then there will be a file named systeminfo.txt in each game system directory that includes the list of supported file extensions. +The supported file extensions are listed in [linux/es_systems.xml](resources/systems/linux/es_systems.xml), [macos/es_systems.xml](resources/systems/macos/es_systems.xml) and [windows/es_systems.xml](resources/systems/windows/es_systems.xml) but if you generated the game system directories on first application startup or later via _Create/update system directories_ in the _Utilities_ menu, then there will be a file named systeminfo.txt in each game system directory that includes the list of supported file extensions. -Here is a simplified example from unix/es_systems.xml: +Here is a simplified example from linux/es_systems.xml: ```xml @@ -943,20 +946,20 @@ It's highly recommended to use filenames that correspond to the full name of the Symlinks are supported for both ROM directories and individual game files, but make sure to never symlink between files within the same system directory or there may be undefined application behavior when scraping, launching games etc. -The default game folder is ~/ROMs. On Unix this defaults to `/home//ROMs`, on macOS `/Users//ROMs` and on Windows `C:\Users\\ROMs` or `EmulationStation-DE\ROMs` depending on whether the installer release or the portable release is used. If the --home command line option was used to start ES-DE, the tilde symbol will resolve to whatever directory was passed as an argument to this option. +The default game folder is ~/ROMs. On Linux this defaults to `/home//ROMs`, on macOS `/Users//ROMs` and on Windows `C:\Users\\ROMs` or `ES-DE\ROMs` depending on whether the installer release or the portable release is used. If the --home command line option was used to start ES-DE, the tilde symbol will resolve to whatever directory was passed as an argument to this option. Assuming the default ROM directory is used, we need to create a subdirectory corresponding to the \ tag in es_systems.xml, for this example it's `nes`. So it would look something like the following: ``` -/home/myusername/ROMs/nes # Unix/Linux +/home/myusername/ROMs/nes # Linux /Users/myusername/ROMs/nes # macOS C:\Users\myusername\ROMs\nes # Windows installer -EmulationStation-DE\ROMs\nes # Windows portable +ES-DE\ROMs\nes # Windows portable ``` -Now simply copy your game ROMs into this folder, and you should end up with something like this Unix example: +Now simply copy your game ROMs into this folder, and you should end up with something like this Linux example: ``` ~/ROMs/nes/Legend of Zelda, the.zip @@ -964,7 +967,7 @@ Now simply copy your game ROMs into this folder, and you should end up with some ~/ROMs/nes/Super Mario Bros. 3.zip ``` -Note that these directories are case sensitive on Unix, so creating a directory named `Nes` instead of `nes` won't work. +Note that these directories are case sensitive on Linux/Unix, so creating a directory named `Nes` instead of `nes` won't work. That's it, start ES-DE and the NES game system should be populated. You can now scrape information and media for the games, and assuming you've setup RetroArch correctly with the Mesen core, you can launch games. If you instead prefer to use any of the three alternative emulators listed above (Nestopia UE, FCEUmm or QuickNES) then you can install one of those cores instead and change your emulator preference using the _Alternative emulators_ interface in the _Other settings_ menu or on a per-game basis via the metadata editor. Note that alternative emulators are only available for some game systems. @@ -1095,9 +1098,9 @@ Not all systems are as simple to setup as what was described in the previous sec ### Apple II -On Unix/Linux the default emulator for the apple2 system is [LinApple](http://linapple.sourceforge.net) and on Windows it's [AppleWin](https://github.com/AppleWin/AppleWin). Additionally the alternative emulators [Mednafen](https://mednafen.github.io) and [MAME](https://www.mamedev.org) standalone are supported. On macOS there is a port of AppleWin available named [Mariani](https://github.com/sh95014/AppleWin) but it appears broken at the moment as it does not accept any command line parameters. So instead only Mednafen and MAME are supported on macOS. +On Linux the default emulator for the apple2 system is [LinApple](http://linapple.sourceforge.net) and on Windows it's [AppleWin](https://github.com/AppleWin/AppleWin). Additionally the alternative emulators [Mednafen](https://mednafen.github.io) and [MAME](https://www.mamedev.org) standalone are supported. On macOS there is a port of AppleWin available named [Mariani](https://github.com/sh95014/AppleWin) but it appears broken at the moment as it does not accept any command line parameters. So instead only Mednafen and MAME are supported on macOS. -Depending on which Unix/Linux operating system you're using, LinApple may not be readily available and you may have to build it from source code or obtain a binary from somewhere on the Internet. See the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where it needs to be installed. If you're using an OS with access to the AUR, such as Arch or Manjaro, then LinApple is available there. Note that you need to use the _linapple-git_ package as the regular _linapple_ package does not work correctly. +Depending on which Linux operating system you're using, LinApple may not be readily available and you may have to build it from source code or obtain a binary from somewhere on the Internet. See the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where it needs to be installed. If you're using an OS with access to the AUR, such as Arch or Manjaro, then LinApple is available there. Note that you need to use the _linapple-git_ package as the regular _linapple_ package does not work correctly. Once the LinApple or AppleWin emulator is installed no additional configuration is required, just drop your games into the ~/ROMs/apple2 folder and launch them from inside ES-DE. @@ -1274,7 +1277,7 @@ ln -s /usr/local/Cellar/mame/0.248/share/mame/hash ~/.mame/ # on x86/Int These systems are generally straightforward to setup. For regular Atari Jaguar games you'll have a single ROM or zip archive per game that you place in the root of the `~/ROMs/atarijaguar` system directory. For Atari Jaguar CD games it's recommended to go for the .cdi format and you place these directly in the root of the `~/ROMs/atarijaguarcd` directory. -The only emulator that can run Atari Jaguar CD games is [BigPEmu](https://www.richwhitehouse.com/jaguar/) and while it's officially only available for the Windows operating system it's still possible to run it on Linux. To accomplish this you need to run it via the Wine (or Proton) translation layer. +The only emulator that can run Atari Jaguar CD games is [BigPEmL](https://www.richwhitehouse.com/jaguar/) and while it's officially only available for the Windows operating system it's still possible to run it on Linux. To accomplish this you need to run it via the Wine (or Proton) translation layer. How to setup Wine is covered in the [Running Windows emulators on Linux using Wine or Proton](USERGUIDE.md#running-windows-emulators-on-linux-using-wine-or-proton) section. @@ -1473,9 +1476,9 @@ Regardless of game setup method, per-game settings can be applied. If using the These computers as well as the Dragon 64 are slight varations of the Tandy Color Computer and as these machines are largely compatible with each other they're all emulated using the [XRoar](http://www.6809.org.uk/xroar) emulator. -This emulator is available for Unix/Linux, macOS and Windows, although on Linux you may need to build it from source code depending on which distribution you're using. Refer to the XRoar website for more information. If you manually download or build the emulator yourself then see the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where you need to install it. +This emulator is available for Linux, macOS and Windows, although on Linux you may need to build it from source code depending on which distribution you're using. Refer to the XRoar website for more information. If you manually download or build the emulator yourself then see the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where you need to install it. -In order to emulate the Dragon 32 you need the ROM file `d32.rom` and to emulate the Dragon 64 or Tano Dragon you need the `d64rom1.rom` and `d64rom2.rom` files. It's unclear whether `ddos10.rom` will also be needed for some games and applications. Even without these files the emulator will probably start, but you will likely see random character on screen and few if any games will run correctly. On Unix/Linux these files need to be placed into the `~/.xroar/roms` directory and on macOS you need to place them in `~/Library/XRoar/roms`. Note that neither of these directories are automatically created by the emulator so you need to create them yourself. On Windows you simply place the ROM files into the emulator installation directory next to the xroar.exe binary. +In order to emulate the Dragon 32 you need the ROM file `d32.rom` and to emulate the Dragon 64 or Tano Dragon you need the `d64rom1.rom` and `d64rom2.rom` files. It's unclear whether `ddos10.rom` will also be needed for some games and applications. Even without these files the emulator will probably start, but you will likely see random character on screen and few if any games will run correctly. On Linux these files need to be placed into the `~/.xroar/roms` directory and on macOS you need to place them in `~/Library/XRoar/roms`. Note that neither of these directories are automatically created by the emulator so you need to create them yourself. On Windows you simply place the ROM files into the emulator installation directory next to the xroar.exe binary. Following this setup there is not much to it, launching a cartridge or cassette image file will automatically run the game. @@ -1729,7 +1732,7 @@ You could optionally create a .commands file as well to specify some additional The next step is to modify the _\.singe_ file to point to the exact game directory. -So for example on Unix, modify the file `~/ROMs/laserdisc/mononoke.singe/mononoke.singe` by changing the following line: +So for example on Linux, modify the file `~/ROMs/laserdisc/mononoke.singe/mononoke.singe` by changing the following line: ``` MYDIR = "singe/mononoke/" ``` @@ -1757,11 +1760,13 @@ There are two ways to play these games, either via emulation or via simulation. **Method 1, emulation** -Proper emulation is done via the MAME standalone emulator. The games need to be in the MAME format and follow the MAME software list naming conventions, i.e. it will not be possible to run .mgw games with this emulator. The example game _Donkey Kong_ would have the filename `gnw_dkong.zip` and you'll place this file in the `gameandwatch` or `lcdgames` directory. +Proper emulation is done via the MAME - Current RetroArch core or the MAME standalone emulator. The games need to be in the MAME format and follow the MAME software list naming conventions, i.e. it will not be possible to run .mgw games with this emulator. The example game _Donkey Kong_ would have the filename `gnw_dkong.zip` and you'll place this file in the `gameandwatch` or `lcdgames` directory. However the game is only half of what's needed to properly emulate these games as you'll also need the artwork to see an image of the actual physical device when running the game. The artwork would also come in a .zip file with the same name as the game itself, e.g. `gnw_dkong.zip` and it must be located in the MAME artwork directory so it can be found by MAME. -For the artwork location there are two options available in the form of two separate MAME emulator entries, either the default _MAME Local Artwork (Standalone)_ entry or _MAME (Standalone)_. The former will require the artwork files to be placed in a directory inside the `gameandwatch` or `lcdgames` folder, which can be quite convenient as it's then bundled with the game files. Simply create an `artwork` subdirectory and place the files there. The second emulator entry will require the artwork files to be placed in the default MAME artwork directory. This location differs between operating systems and distributions so refer to the MAME documentation on where to find this folder. Here's an example of what _Donkey Kong_ would look like when going for the default option using the `gameandwatch` system: +For the RetroArch core this means it has to be placed in the system directory, specifically in `system/mame/artwork/` + +For MAME standalone there are two options available for the artwork location in the form of two separate MAME emulator entries, either the default _MAME Local Artwork (Standalone)_ entry or _MAME (Standalone)_. The former will require the artwork files to be placed in a directory inside the `gameandwatch` or `lcdgames` folder, which can be quite convenient as it's then bundled with the game files. Simply create an `artwork` subdirectory and place the files there. The second emulator entry will require the artwork files to be placed in the default MAME artwork directory. This location differs between operating systems and distributions so refer to the MAME documentation on where to find this folder. Here's an example of what _Donkey Kong_ would look like when going for the default option using the `gameandwatch` system: ``` ~/ROMs/gameandwatch/gnw_dkong.zip @@ -1770,7 +1775,7 @@ For the artwork location there are two options available in the form of two sepa As the artwork files also come with the .zip file extension they will show up inside ES-DE as if they were game files. So it's recommended to hide the entire artwork directory using the _Hidden_ option in the metadata editor, or alternatively exclude them from the multi-scraper using the _Exclude from multi-scraper_ option. -Be aware that neither ScreenScraper nor TheGamesDB currently support the MAME software list names natively so you'll need to refine the searches or the scraper services are unlikely to return any results at all (or very inaccurate results at best). +Be aware that neither ScreenScraper nor TheGamesDB currently support the MAME software list names natively so you'll need to refine the searches or the scraper services are unlikely to return any results at all (or very inaccurate results at best). However, if you have game files that match the MD5 hashes in the ScreenScraper database, then the games will scrape correctly regardless of their names. **Method 2, simulation** @@ -2134,10 +2139,21 @@ Starting ES-DE should now show the _Super Mario 3D World_ entry for the Wii U sy ### OpenBOR -The Open Beats of Rage (OpenBOR) game engine is available on Windows and Linux. Unfortunately the macOS ports seems to have been abandoned. +The Open Beats of Rage (OpenBOR) game engine is available on Android, Windows and Linux. Unfortunately the macOS port seems to have been abandoned. These games are often but not always distributed together with the game engine as specific engine versions may be required for some games. The setup is slightly different between Windows and Linux so they are described separately here. +**Android** + +Unfortunately there does not seem to be a way to launch individual OpenBOR games from ES-DE on Android, instead the OpenBOR user interface will open on game launch and you need to manually start your game from there. This means games need to be installed upfront in OpenBOR and .openbor dummy files should be added to the `ROMs/openbor` directory. These will then appear as individual games inside ES-DE and you can add metadata to them, scrape them etc. Refer to the OpenBOR documentation on how to add your game PAKs. + +Here's an example setup: + +``` +/storage/emulated/0/ROMs/openbor/D&D - K&D - The Endless Quest LNS.openbor +/storage/emulated/0/ROMs/openbor/He-Man.openbor +``` + **Windows:** There are two different OpenBOR setup methods supported on Windows, either to place the game directories directly inside the ROMs\openbor directory or to place the games somewhere else on the filesystems and create .lnk shortcuts and place these inside the ROMs\openbor directory. @@ -2210,6 +2226,8 @@ Doing this will make the game show up as if it was a single file inside ES-DE an PICO-8 Fantasy Console is a game engine developed by [Lexaloffle Games](https://www.lexaloffle.com/pico-8.php) that you need to buy a license to use. Doing so will provide you with download links to releases for Linux, macOS and Windows. Make sure to use the 64-bit release as the 32-bit release reportedly has some technical issues. On macOS and Windows the installation is straightforward, but on Linux you need to place PICO-8 in a location recognized by ES-DE. See the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details. +On Android it's recommended to use the Fake-08 RetroArch core, although this needs to be manually downloaded. How that is done is covered briefly in the [ANDROID.md](ANDROID.md#fake-08) document. + After the emulator has been installed you are ready to add some games. There are two ways to play games using PICO-8, either to add them to ES-DE as for any other system, or using the built-in Splore tool to explore and run games all through the PICO-8 user interface. For the first approach you can download games from the [PICO-8 forum](https://www.lexaloffle.com/bbs/?cat=7) and these are quite uniquely distributed as .png images. You just download these and place them inside the ~/ROMs/pico8 directory, for example: @@ -2229,16 +2247,17 @@ This is what the complete setup could look like: ~/ROMs/pico8/xzero-3.p8.png ``` -**Using the Retro8 RetroArch core** +**Using the Fake-08 and Retro8 RetroArch cores** + +On Android the Fake-08 core provides a good alternative to the official PICO-8 engine which is not available on this operating system. ES-DE also includes support for the Retro8 RetroArch core across all platforms, but it's borderline unusable and does not seem to be actively developed any longer. + +Neither Fake-08 nor Retro8 support the .png file extension, so in order to use these cores you need to remove that extension from your game files and only keep the .p8 extension, such as this: -ES-DE also includes support for the Retro8 RetroArch core but it's borderline unusable and does not seem to be actively developed any longer. If you still want to use it, then you first need to rename your game files by removing _.png_ from the end of the filenames, like this: ``` ~/ROMs/pico8/c_e_l_e_s_t_e-0.p8 ~/ROMs/pico8/xzero-3.p8 ``` -Following this just select the _Retro8_ alternative emulator and the games will (somehow) work. - ### Ports and desktop applications _The emulators system is essentially a clone of the desktop system so it's not discussed specifically in this section._ @@ -2254,7 +2273,7 @@ For the _desktop_ system specifically, you can choose to suspend ES-DE while an Shortcuts are very easy to setup, on Windows you can simply copy any .lnk file from the Start Menu into the `ports` or `desktop` system folders and then you can launch them directly from inside ES-DE. You can also create shortcuts manually to any file by right clicking on it in Explorer and selecting _Create shortcut_. -Likewise on Unix you can copy any .desktop shortcut into these system directories and they can then be launched by ES-DE. +Likewise on Linux you can copy any .desktop shortcut into these system directories and they can then be launched by ES-DE. Here's an example on Windows: ``` @@ -2262,7 +2281,7 @@ Here's an example on Windows: ~\ROMs\ports\openxcom.lnk ``` -And here's an example on Unix: +And here's an example on Linux: ``` ~/ROMs/desktop/org.libretro.RetroArch.desktop ~/ROMs/desktop/spotify.desktop @@ -2278,7 +2297,7 @@ Here's an example using alias files on macOS: **Method 2, scripts** -For more advanced setups you may want to use scripts. While it's possible to add these files directly to the root of the system directories it's instead generally recommended to setup a separate directory per game as there may be more than a single file required. For instance you may have multiple game variants or mods or you may want to keep game data files within the ROM directory tree. Only examples for Unix are provided here, but it's the same process for Windows and macOS except that in Windows .bat batch files are used instead of shell scripts. +For more advanced setups you may want to use scripts. While it's possible to add these files directly to the root of the system directories it's instead generally recommended to setup a separate directory per game as there may be more than a single file required. For instance you may have multiple game variants or mods or you may want to keep game data files within the ROM directory tree. Only examples for Linux are provided here, but it's the same process for Windows and macOS except that in Windows .bat batch files are used instead of shell scripts. Here's a setup of GZDoom and vkQuake: ``` @@ -2359,7 +2378,7 @@ Apart from this you need to install the PS3 system firmware to use the emulator, **Method 1, shortcuts** -First install your games inside RPCS3, then right click on each entry and select _Create Shortcut_ followed by _Create Desktop Shortcut_. On Windows this will create shortcuts with the .lnk extension, on macOS they will have the .app extension and on Unix/Linux they will have the .desktop extension. +First install your games inside RPCS3, then right click on each entry and select _Create Shortcut_ followed by _Create Desktop Shortcut_. On Windows this will create shortcuts with the .lnk extension, on macOS they will have the .app extension and on Linux they will have the .desktop extension. Then simply move these files from your desktop to your ~/ROMs/ps3 directory and you're done. Here's an example of what this could look like on Linux: ``` @@ -2398,7 +2417,7 @@ When using this setup method you need to set the alternative emulator to _RPCS3 Support for the PS Vita is currently experimental due to the early stages of development for the Vita3K emulator. While there's a growing list of games that are playable, integration with ES-DE is a bit rough at the moment. Hopefully this will improve as Vita3K evolves. -On Windows the Vita3K installation is straightforward, but on Linux you may need to place the emulator in a location recognized by ES-DE. See the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details. If using a Linux distribution that provides Vita3K via the repository (such as the AUR on Arch/Manjaro) then you can skip this step and install the emulator using your OS package manager. +On Android and Windows the Vita3K installation is straightforward, but on Linux you may need to place the emulator in a location recognized by ES-DE. See the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details. If using a Linux distribution that provides Vita3K via the repository (such as the AUR on Arch/Manjaro) then you can skip this step and install the emulator using your OS package manager. Although a macOS release of Vita3K seems to be in the works this does not seem to be readily available for download so there is currently no macOS support for this system in ES-DE. @@ -2428,7 +2447,7 @@ Simply copy the Start Menu entries for your Steam games into the ~\ROMs\steam di ~\ROMs\steam\Undertale.url ``` -**Unix/Linux** +**Linux** Copy the .desktop shortcuts for your games into the ~/ROMs/steam directory. If your desktop environment does not allow you to copy them directly from the application menu then you may need to navigate to `~/.local/share/applications` using your file manager and copy the .desktop files from there. Alternatively you can also create shortcuts from inside Steam by right clicking on a game, selecting _Manage_ and then _Add desktop shortcut_. These file can then be moved from your desktop to your ~/ROMs/steam directory. This is an example of what you could end up with: @@ -2452,6 +2471,19 @@ On macOS the shortcuts come with the .app extension and are actually directories As the Nokia N-Gage was running Symbian it may seem like the _ngage_ and _symbian_ systems would be identical. There is however a difference in that N-Gage games were shipped on MMC memory cards while regular Symbian games were packaged as _Software Installation Script_ files with the .sis or .sisx extension. Although the EKA2L1 emulator is used for both systems the setup is quite different, as detailed below. +**Android** + +Unfortunately there does not seem to be a way to launch individual games from ES-DE on Android specifically, so instead the EKA2L1 user interface will open on game launch and you need to manually start your game from inside the emulator. As games need to be installed upfront in the emulator as described below it's probably a good idea to just setup dummy game files with the .symbian or .ngage file extensions inside the ES-DE ROMs directory tree. These will then appear as indvidual games inside ES-DE and you can add metadata to them, scrape them etc. + +Here's an example setup: +``` +/storage/emulated/0/ROMs/ngage/Asphalt 2.ngage +/storage/emulated/0/ROMs/ngage/Bomberman.ngage +/storage/emulated/0/ROMs/ngage/CallofDuty.ngage +/storage/emulated/0/ROMs/symbian/Animal Farm.symbian +/storage/emulated/0/ROMs/symbian/AnotherWorld.symbian +``` + **General setup** The EKA2L1 installation should be fairly straightforward, for Linux there is an official AppImage, for macOS there is a DMG installer and for Windows a zip archive release. Just be aware that the AppImage has the very generic name `ubuntu-latest.AppImage` and needs to be renamed and moved to `~/Applications/EKA2L1.AppImage` in order for ES-DE to find it. @@ -2539,9 +2571,9 @@ Finally there's an emulator entry named _EKA2L1 [Custom device] (Standalone)_ wh This computer (which is confusingly also known as _TRS-80 Color Computer_ even though it's a completely different machine than the _TRS-80_) is emulated using the [XRoar](http://www.6809.org.uk/xroar) emulator. -This emulator is available for Unix/Linux, macOS and Windows, although on Linux you may need to build it from source code depending on which distribution you're using. Refer to the XRoar website for more information. If you manually download or build the emulator yourself then see the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where you need to install it. +This emulator is available for Linux, macOS and Windows, although on Linux you may need to build it from source code depending on which distribution you're using. Refer to the XRoar website for more information. If you manually download or build the emulator yourself then see the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where you need to install it. -In order for XRoar to work correctly you need the ROM files `bas13.rom`, `disk11.rom` and `extbas11.rom`. Even without these files the emulator will probably start, but you will likely see random character on screen and few if any games will run correctly. On Unix/Linux these files need to be placed into the `~/.xroar/roms` directory and on macOS you need to place them in `~/Library/XRoar/roms`. Note that neither of these directories are automatically created by the emulator so you need to create them yourself. On Windows you simply place the ROM files into the emulator installation directory next to the xroar.exe binary. +In order for XRoar to work correctly you need the ROM files `bas13.rom`, `disk11.rom` and `extbas11.rom`. Even without these files the emulator will probably start, but you will likely see random character on screen and few if any games will run correctly. On Linux these files need to be placed into the `~/.xroar/roms` directory and on macOS you need to place them in `~/Library/XRoar/roms`. Note that neither of these directories are automatically created by the emulator so you need to create them yourself. On Windows you simply place the ROM files into the emulator installation directory next to the xroar.exe binary. Following this setup there is not much to it, launching a cartridge or cassette image file will automatically run the game. If launching a diskette image you will probably need to manually run the game file from inside the emulated operating system. Such commands are beyond the scope of this document, but the following [quick reference PDF](https://colorcomputerarchive.com/repo/Documents/Manuals/Hardware/Color%20Computer%20Disk%20System%20-%20Quick%20Reference%20Guide%20(Tandy).pdf) provides a good command overview. @@ -2553,7 +2585,7 @@ Two emulator entries are available for this system, _XRoar CoCo 2 NTSC (Standalo Tandy Corporation made the somewhat dumb decision of naming several unrelated computers as TRS-80 which has caused decades of confusion. The _Tandy TRS-80_ system in ES-DE emulates the original black-and-white TRS-80 Model I. If you want to emulate the TRS-80 Color Computer then you'll want to use the _Tandy Color Computer_ system instead. -The TRS-80 is emulated using [sdl2trs](https://gitlab.com/jengun/sdltrs) which is available for Unix/Linux and Windows, seemingly there is no macOS port. If you use a Debian-based Linux distribution there is a .deb package made by the developers and if you're using an Arch-based distribution you can install it using the AUR. For other distributions you may have to build from source code or download a pre-built binary from some other location. See the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where sdl2trs will need to be installed in that case. +The TRS-80 is emulated using [sdl2trs](https://gitlab.com/jengun/sdltrs) which is available for Linux and Windows, seemingly there is no macOS port. If you use a Debian-based Linux distribution there is a .deb package made by the developers and if you're using an Arch-based distribution you can install it using the AUR. For other distributions you may have to build from source code or download a pre-built binary from some other location. See the [Using manually downloaded emulators on Linux](USERGUIDE.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where sdl2trs will need to be installed in that case. On Windows only the 64-bit release of the emulator is supported, with the filename `sdl2trs64.exe`. @@ -2586,11 +2618,11 @@ Here's what a complete setup could look like: ### Tangerine Computer Systems Oric -These games are executed using the Oricutron emulator which is readily available on Windows but quite problematic to get hold on for Unix and macOS. +These games are executed using the Oricutron emulator which is readily available on Windows but quite problematic to get hold on for Linux and macOS. Although there is a macOS build available at the Oricutron [download page](http://www.petergordon.org.uk/oricutron/) this seems to not work properly, or it's unclear how it should be used. As such this system is unsupported on macOS, but the configuration entries still exist in the bundled es_find_rules.xml and es_systems.xml files so if you manage to get the emulator to run, ES-DE should work with these games. -Likewise on Unix there seems to be no binaries available for download so you need to build the emulator yourself. As multiple files like images and roms are needed to run this emulator, it's easiest to download and extract the Windows version which contains all this data and then build from source code and simply copy over the `Oricutron` binary (example below using Ubuntu): +Likewise on Linux there seems to be no binaries available for download so you need to build the emulator yourself. As multiple files like images and roms are needed to run this emulator, it's easiest to download and extract the Windows version which contains all this data and then build from source code and simply copy over the `Oricutron` binary (example below using Ubuntu): ``` mkdir -p ~/Applications/oricutron @@ -2759,33 +2791,33 @@ Apart from this, hopefully the scraping process should be self-explanatory. If you already have a library of game media (images, videos and PDF manuals) you can manually copy these files into ES-DE. The same procedure applies if you want to add media for individual games, for instance when the scraper did not return any results or if you didn't like the media it provided. -The default media directory is `~/.emulationstation/downloaded_media//` +The default media directory is `~/ES-DE/downloaded_media//` This directory can however be changed using the _Game media directory_ setting in the _Other settings_ menu so make sure to check this setting before attempting to follow the instructions below. If the setting is blank, then the default directory is in use. See the [Supported game systems](USERGUIDE.md#supported-game-systems) table at the bottom of this guide for a list of all system names. -An example on Unix: +An example on Linux: ``` -/home/myusername/.emulationstation/downloaded_media/c64/screenshots/ +/home/myusername/ES-DE/downloaded_media/c64/screenshots/ ``` An example on macOS: ``` -/Users/myusername/.emulationstation/downloaded_media/c64/screenshots/ +/Users/myusername/ES-DE/downloaded_media/c64/screenshots/ ``` An example on Windows (installer release): ``` -C:\Users\Myusername\.emulationstation\downloaded_media\c64\screenshots\ +C:\Users\Myusername\ES-DE\downloaded_media\c64\screenshots\ ``` An example on Windows (portable release): ``` -EmulationStation-DE\.emulationstation\downloaded_media\c64\screenshots\ +ES-DE\ES-DE\downloaded_media\c64\screenshots\ ``` The media directories per game system are: @@ -2816,8 +2848,8 @@ The media files must correspond exactly to the game files. Take for example this For this example, the filename structure needs to look like the following: ``` -~/.emulationstation/downloaded_media/c64/screenshots/Multidisk/Last Ninja 2/Last Ninja 2.jpg -~/.emulationstation/downloaded_media/c64/videos/Multidisk/Last Ninja 2/Last Ninja 2.mp4 +~/ES-DE/downloaded_media/c64/screenshots/Multidisk/Last Ninja 2/Last Ninja 2.jpg +~/ES-DE/downloaded_media/c64/videos/Multidisk/Last Ninja 2/Last Ninja 2.mp4 ``` Note that there is seemingly an exception to this logic if the _Directories interpreted as files_ functionality has been used, in which case the "file extension" added to the directory is also included in the game media filenames. Take for example the following ScummVM game: @@ -2828,15 +2860,15 @@ Note that there is seemingly an exception to this logic if the _Directories inte The media files for this directory which is interpreted as a file will be: ``` -~/.emulationstation/downloaded_media/scummvm/screenshots/dig.scummvm.png -~/.emulationstation/downloaded_media/scummvm/videos/dig.scummvm.mp4 +~/ES-DE/downloaded_media/scummvm/screenshots/dig.scummvm.png +~/ES-DE/downloaded_media/scummvm/videos/dig.scummvm.mp4 ``` This is not a bug as these are not really file extensions after all, it's just a directory with a dot in the filename that happens to look like a file extension because that's how the _Directories interpreted as files_ logic works. For images .jpg and .png file extensions are supported and for videos .avi, .mkv, .mov, .mp4 and .wmv are supported. -Remember that on Unix filenames are case sensitive, and as well the file extensions must be in lower case, such as .png instead of .PNG or .Png or the file won't be found. +Remember that on Linux filenames are case sensitive, and as well the file extensions must be in lower case, such as .png instead of .PNG or .Png or the file won't be found. It's possible to change the game media directory location from within ES-DE, for this see the option _Game media directory_ in the _Other settings_ menu. @@ -3047,10 +3079,6 @@ If file hash searching is enabled, then this specifies the maximum allowed file Affects both overwriting of metadata as well as actual game media files on the filesystem. Even with this option disabled, metadata entries which are set to their default values will be populated by the scraper. In other words, this option only affects overwriting of previously scraped data, or data manually entered via the metadata editor. Game names are considered as set to their default values if either corresponding to the physical game file on disk minus the extension (e.g. the entry _Commando_ if the file is named _Commando.zip_), or for arcade games if corresponding to the MAME names as defined in the bundled mamenames.xml. Note that this setting does not affect generated miximages, that is instead controlled by the setting _Overwrite miximages (scraper/offline generator)_ found in the miximage settings menu. -**Halt on invalid media files** - -With this setting enabled, if any media files returned by the scraper seem to be invalid, the scraping is halted and an error message is presented where it's possible to retry or cancel the scraping of the specific game. In the case of multi-scraping it's also possible to skip the game and proceed to the next one in the queue. With this setting disabled, all media files will always be accepted and saved to disk. The file verification is quite basic and future versions may improve on this by using file checksums or other file integrity checks. There is an exception in place for box back covers when using ScreenScraper. As many of these specific images are broken, there is an automatic filter built in that is always active and which removes blank images and those containing only a few lines of pixels. - **Search using file hashes (non-interactive mode)** _(ScreenScraper only)_ When running the non-interactive scraper it's possible to search using a hash value calculated from the actual game file. Assuming ScreenScraper has a match for your file in their database, this will lead to 100% accuracy as the game name will be completely ignored. If there is no match for the hash value, then a fallback will be made to the game name and the normal search logic applies. The maximum allowed file size to apply this type of search to can be set using the _Hash searches max file size_ slider. Note that file hash searching can increase scraping times significantly if applied to large game files as the entire file needs to be read and processed to calculate its hash value. And obviously file hash searching will not work for directories, scripts, shortcuts, .m3u files and so on which will have no matching entries in the ScreenScraper database. @@ -3111,6 +3139,10 @@ Themes optionally support variants which are a type of theme profiles defined by If the theme author has included multiple color schemes, then these can be selected between using this menu option. +**Theme font size** + +If the theme author has included support for multiple font/text sizes, then these can be selected between using this menu option. Possible choices are _medium, large, small, extra large_ and _extra small_. What layout changes these font size options actually make is completely up to the theme author. + **Theme aspect ratio** Themes could optionally be optimized for different screen aspect ratios. ES-DE supports 16:9, 16:10, 3:2, 4:3, 5:4, 21:9 and 32:9 in both horizontal and vertical orientation, but it's completely up to the theme author which of these are actually supported by the theme. It's normally best to leave this setting at _Automatic_ in which case ES-DE will automatically select the aspect ratio that most closely matches the screen resolution. The _Automatic_ option is however only available if the theme supports at least two aspect ratios. @@ -3129,7 +3161,7 @@ If set to _None_, the system view will be displayed on startup. Any other value **Systems sorting** -The order in which to sort the game systems. The default option is _Full names or custom_ which will sort by full system names, unless there is a ~/.emulationstation/custom_systems/es_systems_sorting.xml file present which will then be used instead. The other options are using the bundled sorting configuration files for _Release year_ or _Manufacturer, release year_ or _HW type, release year_ or _Manufacturer, HW type, release year_. If using any of these bundled sorting files, then any ~/.emulationstation/custom_systems/es_systems_sorting.xml will be ignored. When changing this setting ES-DE will automatically reload. +The order in which to sort the game systems. The default option is _Full names or custom_ which will sort by full system names, unless there is a ~/ES-DE/custom_systems/es_systems_sorting.xml file present which will then be used instead. The other options are using the bundled sorting configuration files for _Release year_ or _Manufacturer, release year_ or _HW type, release year_ or _Manufacturer, HW type, release year_. If using any of these bundled sorting files, then any ~/ES-DE/custom_systems/es_systems_sorting.xml will be ignored. When changing this setting ES-DE will automatically reload. **Game default sort order** @@ -3189,7 +3221,7 @@ With this option enabled, there will be an overlay displayed when quickly scroll **Enable virtual keyboard** -This enables a virtual (on-screen) keyboard that can be used at various places throughout the application to input text and numbers using a controller. The Shift and Alt keys can be toggled individually or combined to access many special characters. The general use of the virtual keyboard should hopefully be self-explanatory. +This enables a virtual (on-screen) keyboard that can be used at various places throughout the application to input text and numbers using a controller. The Shift and Alt keys can be toggled individually or combined to access many special characters. The general use of the virtual keyboard should hopefully be self-explanatory. On Android the virtual keyboard from the operating system will be used if this setting has been disabled. **Enable toggle favorites button** @@ -3285,7 +3317,7 @@ Whether to search the custom image directory recursively. **Custom image directory** -The directory for custom images. The tilde `~` symbol can be used which will expand to the user home directory. It's also possible to use the %ESPATH% and %ROMPATH% variables which will set the directory relative to the ES-DE binary directory or the ROM directory. +The directory for custom images. The tilde `~` symbol can be used which will expand to the user home directory. It's also possible to use the %ESPATH% and %ROMPATH% variables which will set the directory relative to the ES-DE binary directory or the ROM directory. Images in the .jpg, .png, .webp, .svg and unanimated .gif formats are supported. #### Video screensaver settings @@ -3355,13 +3387,33 @@ Settings related to the input devices, i.e. the keyboard and controllers. This setting gives the ability to choose between the controller types _Xbox, Xbox 360, PlayStation 1/2/3, PlayStation 4, PlayStation 5, Switch Pro_ and _SNES_. Doing so alters the help icons and help text as well as the icons and text for the input device configurator. The setting is only cosmetic and does not change the controller behavior or the controller button mappings. +**Touch overlay size** _(Android only)_ + +If the touch input overlay has been enabled, then this setting makes it possible to select between a _medium, large, small_ or _extra small_ overlay size. + +**Touch overlay opacity** _(Android only)_ + +Sets the opacity of the input overlay to _normal, low_ or _very low_. + +**Touch overlay fade-out time** _(Android only)_ + +How long, in seconds, to display the overlay before fading it. Tapping anywhere on the screen will bring back the overlay if it's been faded out. + +**Enable touch overlay** _(Android only)_ + +The touch overlay applies a layer of virtual buttons on top of the ES-DE window. This makes it possible to use the application on devices that lack physical buttons, such as a mobile phone or tablet. Be careful to not accidentally disable this setting as you may lock yourself out of the application. If you do that, you'll need to temporarily plug in a controller or keyboard to enable the setting again, or you could clear the ES-DE storage in the Android App settings which will force the configurator to run on next startup. + **Only accept input from first controller** If enabling this option, only the first controller detected during startup will send its input to ES-DE (the keyboard input is unaffected by this setting and will be enabled regardless). This is a good way to limit potential chaos with multiple persons fighting over which games to play. Note that disconnecting and reconnecting controllers while ES-DE is running may change what is considered the first controller. This setting does not affect the emulators in any way, it's only applied to ES-DE. Another issue is that some wireless controllers have buggy drivers and will register as two devices, meaning all button presses will be registered twice inside ES-DE. Using this option is one solution to the problem, although it's also possible to blacklist the extra controller entry, as described [here](INSTALL.md#adding-custom-controller-profiles). +**Swap the A/B and X/Y buttons** + +When enabling this setting the functions for the A/B and X/Y buttons will be swapped and the helpsystem will be updated accordingly. The primary purpose of this setting is for using controllers like Nintendo Switch Pro and some handhelds which have swapped the physical positions of these buttons. With this setting enabled you'll be able to rely on your muscle memory from using any other controller type with a normal button layout. Note that the button swap does not apply to the keyboard which leads to a slight inconsistency as the helpsystem will only match the controller and not the keyboard. + **Ignore keyboard input** -If this setting is enabled then all keyboard input will be ignored, except the quit shortcut used to shut down the application. The main reason for ignoring keyboard input is if running Steam in parallel to ES-DE and you need to use the Steam Input's _Desktop Layout_ functionality to send keyboard input using the controller. In this case double or conflicting input will be sent to ES-DE as both the controller and keyboard events are read by the application. It's however generally a better idea to disable this functionality altogether in Steam and leave the ES-DE setting untouched. If you accidentally enable this setting when using a keyboard as input device, then you'll either need to plug in a controller to disable it again, or you'll need to modify the _InputIgnoreKeyboard_ entry in the ~/.emulationstation/es_settings.xml configuration file. +If this setting is enabled then all keyboard input will be ignored, except the quit shortcut used to shut down the application. The main reason for ignoring keyboard input is if running Steam in parallel to ES-DE and you need to use the Steam Input's _Desktop Layout_ functionality to send keyboard input using the controller. In this case double or conflicting input will be sent to ES-DE as both the controller and keyboard events are read by the application. It's however generally a better idea to disable this functionality altogether in Steam and leave the ES-DE setting untouched. If you accidentally enable this setting when using a keyboard as input device, then you'll either need to plug in a controller to disable it again, or you'll need to modify the _InputIgnoreKeyboard_ entry in the ~/ES-DE/settings/es_settings.xml configuration file. **Configure keyboard and controllers** @@ -3420,13 +3472,13 @@ _The system-wide alternative emulators interface. An entry in bold and with a ge **Game media directory** -This setting defines the directory for game media, i.e. images, videos and PDF manuals that have normally been downloaded by the scraper. The default location is _~/.emulationstation/downloaded_media_ +This setting defines the directory for game media, i.e. images, videos and PDF manuals that have normally been downloaded by the scraper. The default location is _~/ES-DE/downloaded_media_ **VRAM limit** The amount of video RAM to use for the application. Defaults to 512 MiB (192 MiB on the Raspberry Pi) which works fine most of the time when using moderately demanding themes with medium-sized collections at up to 4K display resolution. For large collections (as in many different systems rather than many games per system) in combination with demanding themes which use lots of full-screen images and similar it's recommended to increase this number to 1024 MiB or possibly higher to avoid stuttering and texture pop-in. Enabling the GPU statistics overlay gives some indications regarding the amount of texture memory currently used, which is helpful to determine a reasonable value for this setting. The allowed range for the settings is 128 to 2048 MiB. If you try to set it lower or higher than this by passing such values as command line parameters or by editing the es_settings.xml file manually, ES-DE will log a warning and automatically adjust to a value within the allowable range. -**Anti-aliasing (MSAA) (requires restart)** +**Anti-aliasing (MSAA) (requires restart)** _(All operating systems except Android)_ Sets the level of anti-aliasing for the application. You can select between _disabled_, _2x_ or _4x_. Note that this is a potentially dangerous option which may prevent the application from starting altogether with some GPU drivers. If you're unable to run the application after changing this option then you can reset it via the `--anti-aliasing 0` command line option. Be aware that enabling anti-aliasing has a slight to moderate performance impact. @@ -3458,7 +3510,7 @@ For platforms and package formats where the previous setting above is available With this setting enabled, the taskbar will be hidden when launching ES-DE, and it will be restored when the application exits. This can make for a more seamless experience as the taskbar could otherwise flash by briefly when launching and returning from games. -**Run in background (while game is launched)** +**Run in background (while game is launched)** _(All operating systems except Android)_ Enabling this option makes ES-DE continue to run while a game is launched. This is normally not recommended as it leads to a slightly strange application behavior and it also removes the ability to capture return codes and log output from the emulators. Generally this option should only be enabled if there are issues with launching games while suspending ES-DE. Note however that some systems like Valve Steam will always keep ES-DE running in the background because they require it for technical reasons (i.e. those systems will override this menu option). @@ -3472,7 +3524,7 @@ If enabled, you will be able to select alternative emulators per game using the **Show hidden files and folders** -If this option is disabled, hidden files and folders within the ROM directory tree are excluded from ES-DE. On Unix and macOS this means those starting with a dot, and on Windows it's those set as hidden by using an NTFS attribute. This setting is only intended for special situations and is not to be confused with the next option below which hides files based on metadata configuration within ES-DE. When changing this setting ES-DE will automatically reload. +If this option is disabled, hidden files and folders within the ROM directory tree are excluded from ES-DE. On Linux and macOS this means those starting with a dot, and on Windows it's those set as hidden by using an NTFS attribute. This setting is only intended for special situations and is not to be confused with the next option below which hides files based on metadata configuration within ES-DE. When changing this setting ES-DE will automatically reload. **Show hidden games** @@ -3490,7 +3542,7 @@ If enabled, only games that have metadata saved to the gamelist.xml files will b MAME software list names for all arcade systems are automatically expanded to their full game names using a bundled MAME name translation file. By default any extra information from this file that is located inside brackets is removed. This includes information like region, version/revision, license, release date and more. By setting this option to disabled that information is retained. Note that this is only applicable for any game names which have not been scraped as the scaper will overwrite the expanded information with whatever value the scraper service returns. It's however possible to disable scraping of game names altogether as covered elsewhere in this guide. -**Disable desktop composition (requires restart)** _(Unix and X11/Xorg only)_ +**Disable desktop composition (requires restart)** _(Linux and X11/Xorg only)_ The window manager desktop composition can adversely affect the framerate of ES-DE, especially on weaker graphics cards and when running at higher resolution. As such the desktop compositor can be disabled when running ES-DE, although the window manager has to be configured to allow applications to do this for the option to have any effect. Note that enabling this setting can cause problems with some graphics drivers so if you experience strange flickering and similar, then make sure to keep this setting disabled. In case of such issues, make sure that the emulator is also not blocking the composition (e.g. RetroArch has a corresponding option). This setting has no effect if using Wayland, it only applies to X11/Xorg. @@ -3506,7 +3558,7 @@ Displays the framerate and VRAM statistics as an overlay. This can be useful to Enabling or disabling the menu when the UI mode is set to _Kid_. Mostly intended for testing purposes as it's not recommended to enable the menu in this restricted mode. -**Show quit menu (reboot and power off entries)** _(All operating systems except macOS)_ +**Show quit menu (reboot and power off entries)** _(All operating systems except macOS and Android)_ With this setting enabled, there is a Quit menu shown as the last entry on the main menu which provides options to quit ES-DE, to reboot the computer or to power off the computer. With this setting disabled, there will simply be an entry to quit the application instead of the complete quit menu. @@ -3526,21 +3578,21 @@ This utility will create all game system directories inside your ROM directory t This utility will rescan the ROM directory for any changes such as added or removed games and systems without having to restart the application. But don't use this utility to reload changes to gamelist.xml files that you have made outside ES-DE as this can lead to data corruption. If you need to manually edit your gamelist.xml files then do this while ES-DE is shut down. -### Quit / Quit EmulationStation +### Quit / Quit ES-DE -The _Quit_ menu or _Quit EmulationStation_ entry as described by the _Show quit menu (reboot and power off entries)_ option above. +The _Quit_ menu or _Quit ES-DE_ entry as described by the _Show quit menu (reboot and power off entries)_ option above. If the menu is enabled, these are its entries: -**Quit EmulationStation** +**Quit ES-DE** -If the option _When to save game metadata_ has been set to _On exit_, the gamelist.xml files will be updated at this point. This applies also if the Quit menu is disabled and replaced by the _Quit EmulationStation_ entry. +If the option _When to save game metadata_ has been set to _On exit_, the gamelist.xml files will be updated at this point. This applies also if the Quit menu is disabled and replaced by the _Quit ES-DE_ entry. -**Reboot system** _(All operating systems except macOS)_ +**Reboot system** _(All operating systems except macOS and Android)_ Self explanatory. -**Power off system** _(All operating systems except macOS)_ +**Power off system** _(All operating systems except macOS and Android)_ Self explanatory. @@ -3842,9 +3894,9 @@ _Example of custom collections, here configured as genres._ _When editing a custom collection and the theme uses a textlist, then a tick symbol will be displayed for any game that is part of the collection._ -The way that custom collections are implemented is very simple. There is a single configuration file per collection inside the folder `~/.emulationstation/collections` +The way that custom collections are implemented is very simple. There is a single configuration file per collection inside the folder `~/ES-DE/collections` -For this example a file will have been created named `~/.emulationstation/collections/custom-Platform.cfg` +For this example a file will have been created named `~/ES-DE/collections/custom-Platform.cfg` The file contents is simply a list of ROM files, such as the following: @@ -3860,7 +3912,7 @@ The file contents is simply a list of ROM files, such as the following: Any changes to custom collections, for example adding or removing a game, will be immediately written to the corresponding collection configuration file. -If you copy or migrate a collection from a previous version of EmulationStation or if you're setting up ES-DE on a new computer, the collection will not be enabled by just copying its configuration file to the `~/.emulationstation/collections` directory. You always need to explicitly enable each collection via the menu. +If you copy or migrate a collection from a previous version of EmulationStation or if you're setting up ES-DE on a new computer, the collection will not be enabled by just copying its configuration file to the `~/ES-DE/collections` directory. You always need to explicitly enable each collection via the menu. If you're migrating from a previous version of EmulationStation that has absolute paths in the collection files, then these will be rewritten with the %ROMPATH% variable the first time you make a change to the collection. @@ -3880,9 +3932,9 @@ The **System name** column corresponds to the directory where you should put you For the **Full name** column, text inside square brackets [] are comments and not part of the actual system name. -The **Default emulator** column lists the primary emulator as configured in es_systems.xml. If this differs between Unix, macOS and Windows then it's specified in square brackets, such as [UW] for Unix and Windows and [M] for macOS. +The **Default emulator** column lists the primary emulator as configured in es_systems.xml. If this differs between Linux, macOS and Windows then it's specified in square brackets, such as [LW] for Linux and Windows and [M] for macOS. -The **Alternative emulators** column lists additional emulators configured in es_systems.xml that can be selected per system and per game. In the same manner as the _Default emulator_ column, differences between Unix, macOS and Windows are marked using square brackets. +The **Alternative emulators** column lists additional emulators configured in es_systems.xml that can be selected per system and per game. In the same manner as the _Default emulator_ column, differences between Linux, macOS and Windows are marked using square brackets. The **Needs BIOS** column indicates if any BIOS/system ROMs are required. Additional details should be covered by the emulator documentation. @@ -3908,7 +3960,7 @@ On Windows the following emulators provide a way to inform ES-DE where they have * Yuzu Default emulator/Alternative emulators columns: \ -**[U]**: Unix/Linux, **[M]**: macOS, **[W]**: Windows +**[L]**: Linux, **[M]**: macOS, **[W]**: Windows All emulators are RetroArch cores unless marked as **(Standalone)**, **(Wine)** or **(Proton)** @@ -3919,170 +3971,170 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed | 3do | 3DO Interactive Multiplayer | Opera | | Yes | | | adam | Coleco Adam | MAME [Diskette] **(Standalone)** | MAME [Tape] **(Standalone)**,
MAME [Cartridge] **(Standalone)**,
MAME [Software list] **(Standalone)** | Yes | | | ags | Adventure Game Studio Game Engine | _Shortcut or script_ | | No | | -| amiga | Commodore Amiga | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [UM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | -| amiga1200 | Commodore Amiga 1200 | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [UM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | -| amiga600 | Commodore Amiga 600 | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [UM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | -| amigacd32 | Commodore Amiga CD32 | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [UM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | +| amiga | Commodore Amiga | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | +| amiga1200 | Commodore Amiga 1200 | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | +| amiga600 | Commodore Amiga 600 | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | +| amigacd32 | Commodore Amiga CD32 | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | | amstradcpc | Amstrad CPC | Caprice32 | CrocoDS,
CPCemu **(Standalone)**,
MAME **(Standalone)** | Yes for MAME | Single archive or disk file | | android | Google Android | BlueStacks **(Standalone)** [W] | | No | Shortcut (.lnk) file | -| apple2 | Apple II | LinApple **(Standalone)** [U],
Mednafen **(Standalone)** [M],
AppleWin **(Standalone)** [W] | Mednafen **(Standalone)** [UW],
MAME - Current,
MAME **(Standalone)** | Yes for Mednafen and MAME | See the specific _Apple II_ section elsewhere in this guide | +| apple2 | Apple II | LinApple **(Standalone)** [L],
Mednafen **(Standalone)** [M],
AppleWin **(Standalone)** [W] | Mednafen **(Standalone)** [LW],
MAME - Current,
MAME **(Standalone)** | Yes for Mednafen and MAME | See the specific _Apple II_ section elsewhere in this guide | | apple2gs | Apple IIGS | MAME - Current | MAME **(Standalone)** | Yes | See the specific _Apple IIGS_ section elsewhere in this guide | -| arcade | Arcade | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [UW],
FB Alpha 2012,
Flycast,
Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Kronos [UW],
Model 2 Emulator **(Standalone)** [W],
Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],
Supermodel **(Standalone)** [UW],
_Shortcut or script_ | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| arcade | Arcade | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [LW],
FB Alpha 2012,
Flycast,
Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Kronos [LW],
Model 2 Emulator **(Standalone)** [W],
Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],
Supermodel **(Standalone)** [LW],
_Shortcut or script_ | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | | arcadia | Emerson Arcadia 2001 | MAME - Current | MAME **(Standalone)** | No | Single archive or ROM file | | archimedes | Acorn Archimedes | MAME [Model A440/1] **(Standalone)** | MAME [Model A3000] **(Standalone)**,
MAME [Model A310] **(Standalone)**,
MAME [Model A540] **(Standalone)** | Yes | | | arduboy | Arduboy Miniature Game System | Arduous | | No | Single archive or .hex file | | astrocde | Bally Astrocade | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file | -| atari2600 | Atari 2600 | Stella | Stella 2014,
Stella **(Standalone)**,
Gopher2600 **(Standalone)** [UW],
ares **(Standalone)** | No | Single archive or ROM file | +| atari2600 | Atari 2600 | Stella | Stella 2014,
Stella **(Standalone)**,
Gopher2600 **(Standalone)** [LW],
ares **(Standalone)** | No | Single archive or ROM file | | atari5200 | Atari 5200 | a5200 | Atari800,
Atari800 **(Standalone)**,
Altirra **(Standalone)** [W] | Yes except for Altirra | Single archive or ROM file | | atari7800 | Atari 7800 ProSystem | ProSystem | MAME - Current,
MAME **(Standalone)** | Yes | Single archive or ROM file | | atari800 | Atari 800 | Atari800 | Atari800 **(Standalone)**,
Altirra **(Standalone)** [W] | Yes except for Altirra | | -| atarijaguar | Atari Jaguar | Virtual Jaguar | BigPEmu **(Standalone)** [W],
BigPEmu **(Wine)** [U],
BigPEmu **(Proton)** [U],
MAME **(Standalone)** | Yes for MAME | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide | -| atarijaguarcd | Atari Jaguar CD | BigPEmu **(Standalone)** [W],
BigPEmu **(Wine)** [U] | BigPEmu **(Proton)** [U] | No | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide | -| atarilynx | Atari Lynx | Handy | Beetle Lynx,
Mednafen **(Standalone)** | | | +| atarijaguar | Atari Jaguar | Virtual Jaguar | BigPEmu **(Standalone)** [W],
BigPEmu **(Wine)** [L],
BigPEmu **(Proton)** [L],
MAME **(Standalone)** | Yes for MAME | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide | +| atarijaguarcd | Atari Jaguar CD | BigPEmu **(Standalone)** [W],
BigPEmu **(Wine)** [L] | BigPEmu **(Proton)** [L] | No | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide | +| atarilynx | Atari Lynx | Handy | Beetle Lynx,
Mednafen **(Standalone)** | No | Single archive or ROM file | | atarist | Atari ST [also STE and Falcon] | Hatari | Hatari **(Standalone)** | Yes | Single archive or image file for single-diskette games, .m3u playlist for multi-diskette games | | atarixe | Atari XE | Atari800 | Atari800 **(Standalone)**,
Altirra **(Standalone)** [W] | Yes except for Altirra | | | atomiswave | Sammy Corporation Atomiswave | Flycast | Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Demul **(Standalone)** [W] | Depends | Single archive file | | bbcmicro | Acorn Computers BBC Micro | MAME **(Standalone)** | | Yes | Single archive or diskette image file | | c64 | Commodore 64 | VICE x64sc Accurate | VICE x64sc Accurate **(Standalone)**,
VICE x64 Fast,
VICE x64 SuperCPU,
VICE x128,
Frodo | No | Single archive or image file for tape, cartridge or single-diskette games, .m3u playlist for multi-diskette games | | cdimono1 | Philips CD-i | SAME CDi | CDi 2015 @,
MAME **(Standalone)** | Yes | Single .bin/.cue pair | -| cdtv | Commodore CDTV | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [UM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | +| cdtv | Commodore CDTV | PUAE | PUAE 2021,
FS-UAE **(Standalone)**,
Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide | | chailove | ChaiLove Game Engine | ChaiLove | | | | | channelf | Fairchild Channel F | FreeChaF | MAME - Current,
MAME **(Standalone)** | Yes | Single archive or ROM file | | coco | Tandy Color Computer | XRoar CoCo 2 NTSC **(Standalone)** | XRoar CoCo 2 PAL **(Standalone)** | Yes | See the specific _Tandy Color Computer_ section elsewhere in this guide | | colecovision | Coleco ColecoVision | blueMSX | Gearcoleco,
openMSX **(Standalone)**,
ares **(Standalone)** | Yes | Single archive or ROM file | -| consolearcade | Console Arcade Systems | MAME - Current | MAME **(Standalone)**,
Flycast,
Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Kronos [UW],
Mednafen [Sega Saturn] **(Standalone)**,
Play! **(Standalone)**,
RPCS3 Shortcut **(Standalone)**,
Triforce **(Standalone)** [UW],
xemu **(Standalone)**,
Cxbx-Reloaded **(Standalone)** [W],
_Shortcut or script_ | Depends | See the specific _Console Arcade Systems_ section elsewhere in this guide | -| cps | Capcom Play System | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [UW],
FB Alpha 2012,
FB Alpha 2012 CPS-1,
FB Alpha 2012 CPS-2,
FB Alpha 2012 CPS-3 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| cps1 | Capcom Play System I | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [UW],
FB Alpha 2012,
FB Alpha 2012 CPS-1 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| cps2 | Capcom Play System II | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [UW],
FB Alpha 2012,
FB Alpha 2012 CPS-2 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| cps3 | Capcom Play System III | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [UW],
FB Alpha 2012,
FB Alpha 2012 CPS-3 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| consolearcade | Console Arcade Systems | MAME - Current | MAME **(Standalone)**,
Flycast,
Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Kronos [LW],
Mednafen [Sega Saturn] **(Standalone)**,
Play! **(Standalone)**,
RPCS3 Shortcut **(Standalone)**,
Triforce **(Standalone)** [LW],
xemu **(Standalone)**,
Cxbx-Reloaded **(Standalone)** [W],
_Shortcut or script_ | Depends | See the specific _Console Arcade Systems_ section elsewhere in this guide | +| cps | Capcom Play System | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [LW],
FB Alpha 2012,
FB Alpha 2012 CPS-1,
FB Alpha 2012 CPS-2,
FB Alpha 2012 CPS-3 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| cps1 | Capcom Play System I | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [LW],
FB Alpha 2012,
FB Alpha 2012 CPS-1 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| cps2 | Capcom Play System II | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [LW],
FB Alpha 2012,
FB Alpha 2012 CPS-2 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| cps3 | Capcom Play System III | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [LW],
FB Alpha 2012,
FB Alpha 2012 CPS-3 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | | crvision | VTech CreatiVision | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file | | daphne | Daphne Arcade LaserDisc Emulator | Hypseus [Daphne] **(Standalone)** | Hypseus [Singe] **(Standalone)**,
MAME - Current,
MAME **(Standalone)**,
DirkSimple | Depends | See the specific _LaserDisc Games_ section elsewhere in this guide | -| desktop | Desktop Applications | _Suspend ES-DE_ | _Keep ES-DE running_,
_AppImage (Suspend ES-DE)_ [U],
_AppImage (Keep ES-DE running)_ [U] | No | See the specific _Ports and desktop applications_ section elsewhere in this guide | -| doom | Doom | PrBoom | PrBoom+ **(Standalone)**,
Boom 3 [UW],
Boom 3 xp [UW],
_Shortcut or script_ | No | | +| desktop | Desktop Applications | _Suspend ES-DE_ | _Keep ES-DE running_,
_AppImage (Suspend ES-DE)_ [L],
_AppImage (Keep ES-DE running)_ [L] | No | See the specific _Ports and desktop applications_ section elsewhere in this guide | +| doom | Doom | PrBoom | PrBoom+ **(Standalone)**,
Boom 3 [LW],
Boom 3 xp [LW],
_Shortcut or script_ | No | | | dos | DOS (PC) | DOSBox-Pure | DOSBox-Core,
DOSBox-SVN,
DOSBox-X **(Standalone)**,
DOSBox Staging **(Standalone)** | No | See the specific _DOS / PC_ section elsewhere in this guide | | dragon32 | Dragon Data Dragon 32 | XRoar Dragon 32 **(Standalone)** | XRoar Dragon 64 **(Standalone)** | Yes | See the specific _Dragon 32 and Tano Dragon_ section elsewhere in this guide | | dreamcast | Sega Dreamcast | Flycast | Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Redream **(Standalone)**,
Demul **(Standalone)** [W] | No | In separate folder interpreted as a file, with .m3u playlist if multi-disc game | | easyrpg | EasyRPG Game Engine | EasyRPG | EasyRPG Player **(Standalone)** | No | See the specific _EasyRPG Game Engine_ section elsewhere in this guide | | electron | Acorn Electron | MAME [Tape] **(Standalone)** | MAME [Diskette DFS] **(Standalone)**,
MAME [Diskette ADFS] **(Standalone)** | Yes | Single archive, or single tape or diskette image file | -| emulators | Emulators | _Suspend ES-DE_ | _Keep ES-DE running_,
_AppImage (Suspend ES-DE)_ [U],
_AppImage (Keep ES-DE running)_ [U] | No | See the specific _Ports and desktop applications_ section elsewhere in this guide | +| emulators | Emulators | _Suspend ES-DE_ | _Keep ES-DE running_,
_AppImage (Suspend ES-DE)_ [L],
_AppImage (Keep ES-DE running)_ [L] | No | See the specific _Ports and desktop applications_ section elsewhere in this guide | | epic | Epic Games Store | Epic Games Store **(Standalone)** | | No | Shortcut (.desktop/.app/.lnk) file | -| famicom | Nintendo Family Computer | Mesen | Mesen **(Standalone)** [UW],
Nestopia UE,
Nestopia UE **(Standalone)** [U],
FCEUmm,
QuickNES,
puNES **(Standalone)** [UW],
Mednafen **(Standalone)**,
ares **(Standalone)**,
ares FDS **(Standalone)**,
3dSen **(Wine)** [U],
3dSen **(Proton)** [U],
3dSen **(Standalone)** [W] | No | Single archive or ROM file. For Famicom games in 3D see the specific _Nintendo NES and Famicom in 3D_ section elsewhere in this guide | +| famicom | Nintendo Family Computer | Mesen | Mesen **(Standalone)** [LW],
Nestopia UE,
Nestopia UE **(Standalone)** [L],
FCEUmm,
QuickNES,
puNES **(Standalone)** [LW],
Mednafen **(Standalone)**,
ares **(Standalone)**,
ares FDS **(Standalone)**,
3dSen **(Wine)** [L],
3dSen **(Proton)** [L],
3dSen **(Standalone)** [W] | No | Single archive or ROM file. For Famicom games in 3D see the specific _Nintendo NES and Famicom in 3D_ section elsewhere in this guide | | fba | FinalBurn Alpha | FB Alpha 2012 | FB Alpha 2012 Neo Geo,
FB Alpha 2012 CPS-1,
FB Alpha 2012 CPS-2,
FB Alpha 2012 CPS-3 | Yes | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| fbneo | FinalBurn Neo | FinalBurn Neo | FinalBurn Neo **(Standalone)** [UW] | Yes | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| fds | Nintendo Famicom Disk System | Mesen | Mesen **(Standalone)** [UW],
Nestopia UE,
Nestopia UE **(Standalone)** [U],
FCEUmm,
Mednafen **(Standalone)**,
ares **(Standalone)** | Yes | Single archive or ROM file | -| flash | Adobe Flash | Ruffle **(Standalone)** | Lightspark **(Standalone)** [U],
ArcadeFlashWeb **(Standalone)** [W] | No | Single .swf file | +| fbneo | FinalBurn Neo | FinalBurn Neo | FinalBurn Neo **(Standalone)** [LW] | Yes | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| fds | Nintendo Famicom Disk System | Mesen | Mesen **(Standalone)** [LW],
Nestopia UE,
Nestopia UE **(Standalone)** [L],
FCEUmm,
Mednafen **(Standalone)**,
ares **(Standalone)** | Yes | Single archive or ROM file | +| flash | Adobe Flash | Ruffle **(Standalone)** | Lightspark **(Standalone)** [L],
ArcadeFlashWeb **(Standalone)** [W] | No | Single .swf file | | fm7 | Fujitsu FM-7 | MAME [FM-7 Diskette] **(Standalone)** | MAME [FM-7 Tape] **(Standalone)**,
MAME [FM-7 Software list] **(Standalone)**,
MAME [FM77AV Diskette] **(Standalone)**,
MAME [FM77AV Tape] **(Standalone)**,
MAME [FM77AV Software list] **(Standalone)** | Yes | For tape files you need to manually start the cassette player from the MAME menu after the "load" command, as well as entering the "run" command after loading is complete | -| fmtowns | Fujitsu FM Towns | MAME - Current,
MAME **(Standalone)** | Tsugaru **(Standalone)** [UW] | Yes | See the specific _Fujitsu FM Towns_ section elsewhere in this guide | +| fmtowns | Fujitsu FM Towns | MAME - Current,
MAME **(Standalone)** | Tsugaru **(Standalone)** [LW] | Yes | See the specific _Fujitsu FM Towns_ section elsewhere in this guide | | fpinball | Future Pinball | Future Pinball **(Standalone)** [W] | | No | | | gamate | Bit Corporation Gamate | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file | -| gameandwatch | Nintendo Game and Watch | MAME Local Artwork **(Standalone)** | MAME **(Standalone)**,
Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section elsewhere in this guide | +| gameandwatch | Nintendo Game and Watch | MAME - Current | MAME Local Artwork **(Standalone)**,
MAME **(Standalone)**,
Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section elsewhere in this guide | | gamecom | Tiger Electronics Game.com | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file | -| gamegear | Sega Game Gear | Genesis Plus GX | Genesis Plus GX Wide,
Gearsystem,
SMS Plus GX,
PicoDrive,
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | -| gb | Nintendo Game Boy | Gambatte | SameBoy,
SameBoy **(Standalone)**,
Gearboy,
Gearboy **(Standalone)** [UW],
TGB Dual,
Mesen-S,
Mesen **(Standalone)** [UW],
bsnes,
mGBA,
mGBA **(Standalone)**,
VBA-M,
VBA-M **(Standalone)**,
ares **(Standalone)**,
SkyEmu **(Standalone)** | No | Single archive or ROM file | -| gba | Nintendo Game Boy Advance | mGBA | mGBA **(Standalone)**,
VBA-M,
VBA-M **(Standalone)**,
VBA Next,
gpSP,
ares **(Standalone)**,
SkyEmu **(Standalone)** | Yes for ares | Single archive or ROM file | -| gbc | Nintendo Game Boy Color | Gambatte | SameBoy,
SameBoy **(Standalone)**,
Gearboy,
Gearboy **(Standalone)** [UW],
TGB Dual,
Mesen-S,
Mesen **(Standalone)** [UW],
bsnes,
mGBA,
mGBA **(Standalone)**,
VBA-M,
VBA-M **(Standalone)**,
ares **(Standalone)**,
SkyEmu **(Standalone)** | No | Single archive or ROM file | -| gc | Nintendo GameCube | Dolphin | Dolphin **(Standalone)**,
PrimeHack **(Standalone)** [UW],
Triforce **(Standalone)** [UW] | No | Disc image file for single-disc games, .m3u playlist for multi-disc games | -| genesis | Sega Genesis | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
BlastEm,
BlastEm **(Standalone)** [U],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| gamegear | Sega Game Gear | Genesis Plus GX | Genesis Plus GX Wide,
Gearsystem,
SMS Plus GX,
PicoDrive,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | No | Single archive or ROM file | +| gb | Nintendo Game Boy | Gambatte | SameBoy,
SameBoy **(Standalone)**,
Gearboy,
Gearboy **(Standalone)** [LW],
TGB Dual,
DoubleCherryGB [LW],
Mesen-S,
Mesen **(Standalone)** [LW],
bsnes,
mGBA,
mGBA **(Standalone)**,
VBA-M,
VBA-M **(Standalone)**,
Mednafen **(Standalone)**,
ares **(Standalone)**,
SkyEmu **(Standalone)** | No | Single archive or ROM file | +| gba | Nintendo Game Boy Advance | mGBA | mGBA **(Standalone)**,
VBA-M,
VBA-M **(Standalone)**,
VBA Next,
gpSP,
Mednafen **(Standalone)**,
ares **(Standalone)**,
SkyEmu **(Standalone)** | Yes for ares | Single archive or ROM file | +| gbc | Nintendo Game Boy Color | Gambatte | SameBoy,
SameBoy **(Standalone)**,
Gearboy,
Gearboy **(Standalone)** [LW],
TGB Dual,
DoubleCherryGB [LW],
Mesen-S,
Mesen **(Standalone)** [LW],
bsnes,
mGBA,
mGBA **(Standalone)**,
VBA-M,
VBA-M **(Standalone)**,
Mednafen **(Standalone)**,
ares **(Standalone)**,
SkyEmu **(Standalone)** | No | Single archive or ROM file | +| gc | Nintendo GameCube | Dolphin | Dolphin **(Standalone)**,
PrimeHack **(Standalone)** [LW],
Triforce **(Standalone)** [LW] | No | Disc image file for single-disc games, .m3u playlist for multi-disc games | +| genesis | Sega Genesis | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
BlastEm,
BlastEm **(Standalone)** [L],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | | gmaster | Hartung Game Master | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file | | gx4000 | Amstrad GX4000 | Caprice32 | CrocoDS,
MAME **(Standalone)** | No | Single archive or ROM file | | intellivision | Mattel Electronics Intellivision | FreeIntv | MAME - Current,
MAME **(Standalone)** | Yes | Single archive or ROM file | | j2me | Java 2 Micro Edition (J2ME) | SquirrelJME | KEmulator **(Standalone)** [W] | No | Single .jar file | | kodi | Kodi Home Theatre Software | Kodi **(Standalone)** | | No | Shortcut (.desktop/.app/.lnk) file | | laserdisc | LaserDisc Games | Hypseus [Daphne] **(Standalone)** | Hypseus [Singe] **(Standalone)**,
MAME - Current,
MAME **(Standalone)**,
DirkSimple | Depends | See the specific _LaserDisc Games_ section elsewhere in this guide | -| lcdgames | LCD Handheld Games | MAME Local Artwork **(Standalone)** | MAME **(Standalone)**,
Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section elsewhere in this guide | +| lcdgames | LCD Handheld Games | MAME - Current | MAME Local Artwork **(Standalone)**,
MAME **(Standalone)**,
Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section elsewhere in this guide | | lowresnx | LowRes NX Fantasy Console | LowRes NX | | No | Single ROM file | -| lutris | Lutris Open Gaming Platform | Lutris **(Standalone)** [U] | | No | See the specific _Lutris_ section elsewhere in this guide | +| lutris | Lutris Open Gaming Platform | Lutris **(Standalone)** [L] | | No | See the specific _Lutris_ section elsewhere in this guide | | lutro | Lutro Game Engine | Lutro | | | | | macintosh | Apple Macintosh | MAME Mac SE Bootable **(Standalone)** | MAME Mac SE Boot Disk **(Standalone)**,
MAME Mac Plus Bootable **(Standalone)**,
MAME Mac Plus Boot Disk **(Standalone)**,
Basilisk II **(Standalone)**,
SheepShaver **(Standalone)** | Yes | See the specific _Apple Macintosh_ section elsewhere in this guide | -| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [UW],
FB Alpha 2012,
Flycast,
Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Kronos [UW],
Model 2 Emulator **(Standalone)** [W],
Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],
Supermodel **(Standalone)** [UW],
_Shortcut or script_ | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| mame-advmame | AdvanceMAME | AdvanceMAME **(Standalone)** [UW] | | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| mastersystem | Sega Master System | Genesis Plus GX | Genesis Plus GX Wide,
SMS Plus GX,
Gearsystem,
PicoDrive,
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,
MAME 2003-Plus,
MAME 2000,
MAME **(Standalone)**,
FinalBurn Neo,
FinalBurn Neo **(Standalone)** [LW],
FB Alpha 2012,
Flycast,
Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Kronos [LW],
Model 2 Emulator **(Standalone)** [W],
Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],
Supermodel **(Standalone)** [LW],
_Shortcut or script_ | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| mame-advmame | AdvanceMAME | AdvanceMAME **(Standalone)** [LW] | | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| mastersystem | Sega Master System | Genesis Plus GX | Genesis Plus GX Wide,
SMS Plus GX,
Gearsystem,
PicoDrive,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | No | Single archive or ROM file | | megacd | Sega Mega-CD | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
ares **(Standalone)** | Yes | | | megacdjp | Sega Mega-CD [Japan] | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
ares **(Standalone)** | Yes | | -| megadrive | Sega Mega Drive | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
BlastEm,
BlastEm **(Standalone)** [U],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | -| megadrivejp | Sega Mega Drive [Japan] | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
BlastEm,
BlastEm **(Standalone)** [U],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| megadrive | Sega Mega Drive | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
BlastEm,
BlastEm **(Standalone)** [L],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| megadrivejp | Sega Mega Drive [Japan] | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
BlastEm,
BlastEm **(Standalone)** [L],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | | megaduck | Creatronic Mega Duck | SameDuck | MAME - Current,
MAME **(Standalone)** | No | Single archive or ROM file | | mess | Multi Emulator Super System | MESS 2015 | | | | -| model2 | Sega Model 2 | Model 2 Emulator **(Standalone)** [W],
MAME - Current [UM] | Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],
MAME - Current [W],
MAME **(Standalone)**,
Model 2 Emulator **(Wine)** [U],
Model 2 Emulator **(Proton)** [U] | Yes for MAME | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| model3 | Sega Model 3 | Supermodel **(Standalone)** [UW] | | No | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| model2 | Sega Model 2 | Model 2 Emulator **(Standalone)** [W],
MAME - Current [LM] | Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],
MAME - Current [W],
MAME **(Standalone)**,
Model 2 Emulator **(Wine)** [L],
Model 2 Emulator **(Proton)** [L] | Yes for MAME | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| model3 | Sega Model 3 | Supermodel **(Standalone)** [LW] | | No | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | | moto | Thomson MO/TO Series | Theodore | | | | | msx | MSX | blueMSX | fMSX,
openMSX **(Standalone)**,
openMSX No Machine **(Standalone)**,
ares **(Standalone)** | Yes | | | msx1 | MSX1 | blueMSX | fMSX,
openMSX **(Standalone)**,
openMSX No Machine **(Standalone)**,
ares **(Standalone)** | Yes | | | msx2 | MSX2 | blueMSX | fMSX,
openMSX **(Standalone)**,
openMSX No Machine **(Standalone)**,
ares **(Standalone)** | Yes | | | msxturbor | MSX Turbo R | blueMSX | openMSX **(Standalone)**,
openMSX No Machine **(Standalone)** | Yes | | | mugen | M.U.G.E.N Game Engine | Ikemen GO **(Standalone)** | | No | See the specific _M.U.G.E.N Game Engine_ section elsewhere in this guide | -| multivision | Othello Multivision | Gearsystem | | | | +| multivision | Othello Multivision | Gearsystem | Mesen **(Standalone)** [LW] | No | Single archive or ROM file | | naomi | Sega NAOMI | Flycast | Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Demul **(Standalone)** [W] | Yes | Single archive file + .chd file in subdirectory if GD-ROM game | | naomi2 | Sega NAOMI 2 | Flycast | Flycast **(Standalone)**,
Flycast Dojo **(Standalone)**,
Demul **(Standalone)** [W] | Yes | Single archive file + .chd file in subdirectory if GD-ROM game | | naomigd | Sega NAOMI GD-ROM | Flycast | Flycast **(Standalone)**,
Flycast Dojo **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game | -| n3ds | Nintendo 3DS | Citra [UW],
Citra **(Standalone)** [M] | Citra 2018 [UW],
Citra **(Standalone)** [UW] | No | Single ROM file | -| n64 | Nintendo 64 | Mupen64Plus-Next | Mupen64Plus **(Standalone)**,
ParaLLEl N64,
simple64 **(Standalone)** [UW],
Rosalie's Mupen GUI **(Standalone)** [UW],
Project64 **(Standalone)** [W],
ares **(Standalone)**,
sixtyforce **(Standalone)** [M] | No | Single archive or ROM file | -| n64dd | Nintendo 64DD | ParaLLEl N64 [UW],
Mupen64Plus-Next [M] | Mupen64Plus-Next [UW],
ParaLLEl N64 [M],
Rosalie's Mupen GUI **(Standalone)** [UW],
ares **(Standalone)** | Yes | See the specific _Nintendo 64DD_ section elsewhere in this guide | -| nds | Nintendo DS | DeSmuME | DeSmuME 2015,
DeSmuME **(Standalone)** [U],
melonDS,
melonDS **(Standalone)**,
SkyEmu **(Standalone)** | No | Single archive or ROM file | -| neogeo | SNK Neo Geo | FinalBurn Neo | FinalBurn Neo **(Standalone)** [UW],
MAME **(Standalone)** | Yes | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | -| neogeocd | SNK Neo Geo CD | NeoCD | FinalBurn Neo,
FinalBurn Neo **(Standalone)** [U],
MAME **(Standalone)** | Yes | .chd (NeoCD and MAME only) or .cue file | -| neogeocdjp | SNK Neo Geo CD [Japan] | NeoCD | FinalBurn Neo,
FinalBurn Neo **(Standalone)** [U],
MAME **(Standalone)** | Yes | .chd (NeoCD and MAME only) or .cue file | -| nes | Nintendo Entertainment System | Mesen | Mesen **(Standalone)** [UW],
Nestopia UE,
Nestopia UE **(Standalone)** [U],
FCEUmm,
QuickNES,
puNES **(Standalone)** [UW],
Mednafen **(Standalone)**,
ares **(Standalone)**,
ares FDS **(Standalone)**,
3dSen **(Wine)** [U],
3dSen **(Proton)** [U],
3dSen **(Standalone)** [W] | No | Single archive or ROM file. For NES games in 3D see the specific _Nintendo NES and Famicom in 3D_ section elsewhere in this guide | -| ngage | Nokia N-Gage | EKA2L1 [Mounted] **(Standalone)** | EKA2L1 [Installed] **(Standalone)**,
EKA2L1 [Mounted] **(Wine)** [U],
EKA2L1 [Installed] **(Wine)** [U] | Yes | See the specific _Symbian and Nokia N-Gage_ section elsewhere in this guide | -| ngp | SNK Neo Geo Pocket | Beetle NeoPop | RACE,
Mednafen **(Standalone)**,
ares **(Standalone)** | | | -| ngpc | SNK Neo Geo Pocket Color | Beetle NeoPop | RACE,
Mednafen **(Standalone)**,
ares **(Standalone)** | | | +| n3ds | Nintendo 3DS | Citra [LW],
Citra **(Standalone)** [M] | Citra 2018 [LW],
Citra **(Standalone)** [LW] | No | Single ROM file | +| n64 | Nintendo 64 | Mupen64Plus-Next | Mupen64Plus **(Standalone)**,
ParaLLEl N64,
simple64 **(Standalone)** [LW],
Rosalie's Mupen GUI **(Standalone)** [LW],
Project64 **(Standalone)** [W],
ares **(Standalone)**,
sixtyforce **(Standalone)** [M] | No | Single archive or ROM file | +| n64dd | Nintendo 64DD | ParaLLEl N64 [LW],
Mupen64Plus-Next [M] | Mupen64Plus-Next [LW],
ParaLLEl N64 [M],
Rosalie's Mupen GUI **(Standalone)** [LW],
ares **(Standalone)** | Yes | See the specific _Nintendo 64DD_ section elsewhere in this guide | +| nds | Nintendo DS | melonDS DS | melonDS @,
melonDS **(Standalone)**,
DeSmuME,
DeSmuME 2015,
DeSmuME **(Standalone)** [L],
SkyEmu **(Standalone)** | No | Single archive or ROM file | +| neogeo | SNK Neo Geo | FinalBurn Neo | FinalBurn Neo **(Standalone)** [LW],
MAME **(Standalone)** | Yes | See the specific _Arcade and Neo Geo_ section elsewhere in this guide | +| neogeocd | SNK Neo Geo CD | NeoCD | FinalBurn Neo,
FinalBurn Neo **(Standalone)** [L],
MAME **(Standalone)** | Yes | .chd (NeoCD and MAME only) or .cue file | +| neogeocdjp | SNK Neo Geo CD [Japan] | NeoCD | FinalBurn Neo,
FinalBurn Neo **(Standalone)** [L],
MAME **(Standalone)** | Yes | .chd (NeoCD and MAME only) or .cue file | +| nes | Nintendo Entertainment System | Mesen | Mesen **(Standalone)** [LW],
Nestopia UE,
Nestopia UE **(Standalone)** [L],
FCEUmm,
QuickNES,
puNES **(Standalone)** [LW],
Mednafen **(Standalone)**,
ares **(Standalone)**,
ares FDS **(Standalone)**,
3dSen **(Wine)** [L],
3dSen **(Proton)** [L],
3dSen **(Standalone)** [W] | No | Single archive or ROM file. For NES games in 3D see the specific _Nintendo NES and Famicom in 3D_ section elsewhere in this guide | +| ngage | Nokia N-Gage | EKA2L1 [Mounted] **(Standalone)** | EKA2L1 [Installed] **(Standalone)**,
EKA2L1 [Mounted] **(Wine)** [L],
EKA2L1 [Installed] **(Wine)** [L] | Yes | See the specific _Symbian and Nokia N-Gage_ section elsewhere in this guide | +| ngp | SNK Neo Geo Pocket | Beetle NeoPop | RACE,
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| ngpc | SNK Neo Geo Pocket Color | Beetle NeoPop | RACE,
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | | odyssey2 | Magnavox Odyssey 2 | O2EM | MAME - Current,
MAME **(Standalone)** | Yes | Single archive or ROM file | -| openbor | OpenBOR Game Engine | OpenBOR **(Standalone)** [UW] | | No | See the specific _OpenBOR_ section elsewhere in this guide | -| oric | Tangerine Computer Systems Oric | Oricutron **(Standalone)** [UW] | | | See the specific _Tangerine Computer Systems Oric_ section elsewhere in this guide | +| openbor | OpenBOR Game Engine | OpenBOR **(Standalone)** [LW] | | No | See the specific _OpenBOR_ section elsewhere in this guide | +| oric | Tangerine Computer Systems Oric | Oricutron **(Standalone)** [LW] | | | See the specific _Tangerine Computer Systems Oric_ section elsewhere in this guide | | palm | Palm OS | Mu | | | | | pc | IBM PC | DOSBox-Pure | DOSBox-Core,
DOSBox-SVN,
DOSBox-X **(Standalone)**,
DOSBox Staging **(Standalone)** | No | See the specific _DOS / PC_ section elsewhere in this guide | | pc88 | NEC PC-8800 Series | QUASI88 | QUASI88 **(Standalone)** | Yes | | | pc98 | NEC PC-9800 Series | Neko Project II Kai | Neko Project II | | | -| pcarcade | PC Arcade Systems | Wine **(Standalone)** [U],
_Shortcut or script_ [MW] | Proton **(Standalone)** [U],
_AppImage_ [U],
_Shortcut or script_ [U] | No | | -| pcengine | NEC PC Engine | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [UW],
ares **(Standalone)** | No | Single archive or ROM file | -| pcenginecd | NEC PC Engine CD | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [UW],
ares **(Standalone)** | Yes | | +| pcarcade | PC Arcade Systems | Wine **(Standalone)** [L],
_Shortcut or script_ [MW] | Proton **(Standalone)** [L],
_AppImage_ [L],
_Shortcut or script_ [L] | No | | +| pcengine | NEC PC Engine | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | No | Single archive or ROM file | +| pcenginecd | NEC PC Engine CD | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | Yes | | | pcfx | NEC PC-FX | Beetle PC-FX | Mednafen **(Standalone)** | Yes | | | pico8 | PICO-8 Fantasy Console | PICO-8 **(Standalone)** | PICO-8 Splore **(Standalone)**,
Retro8 | No | See the specific _PICO-8_ section elsewhere in this guide | | plus4 | Commodore Plus/4 | VICE xplus4 | VICE xplus4 **(Standalone)** | No | Single archive or image file for tape, cartridge or single-diskette games, .m3u playlist for multi-diskette games | | pokemini | Nintendo Pokémon Mini | PokeMini | | No | | -| ports | Ports | _Shortcut or script_ | _AppImage_ [U],
ECWolf (Wolfenstein 3D),
NXEngine (Cave Story),
OpenLara (Tomb Raider) [UW],
Super Bros War | Yes for ECWolf | See the specific _Ports and desktop applications_ section elsewhere in this guide | -| ps2 | Sony PlayStation 2 | LRPS2 [UW],
PCSX2 **(Standalone)** [M] | PCSX2 [UW] @,
PCSX2 **(Standalone)** [UW],
PCSX2 Legacy **(Standalone)** @,
Play! **(Standalone)**,
AetherSX2 **(Standalone)** [M] | Yes except for Play! | | +| ports | Ports | _Shortcut or script_ | _AppImage_ [L],
ECWolf (Wolfenstein 3D),
NXEngine (Cave Story),
OpenLara (Tomb Raider) [LW],
Super Bros War | Yes for ECWolf | See the specific _Ports and desktop applications_ section elsewhere in this guide | +| ps2 | Sony PlayStation 2 | LRPS2 [LW],
PCSX2 **(Standalone)** [M] | PCSX2 [LW] @,
PCSX2 **(Standalone)** [LW],
PCSX2 Legacy **(Standalone)** @,
Play! **(Standalone)**,
AetherSX2 **(Standalone)** [M] | Yes except for Play! | | | ps3 | Sony PlayStation 3 | RPCS3 Shortcut **(Standalone)** | RPCS3 Directory **(Standalone)** | Yes | See the specific _Sony PlayStation 3_ section elsewhere in this guide | | ps4 | Sony PlayStation 4 | _Placeholder_ | | | | | psp | Sony PlayStation Portable | PPSSPP | PPSSPP **(Standalone)** | No | Single disc image file | -| psvita | Sony PlayStation Vita | Vita3K **(Standalone)** [UW] | | Yes | See the specific _Sony PlayStation Vita_ section elsewhere in this guide | +| psvita | Sony PlayStation Vita | Vita3K **(Standalone)** [LW] | | Yes | See the specific _Sony PlayStation Vita_ section elsewhere in this guide | | psx | Sony PlayStation | Beetle PSX | Beetle PSX HW,
PCSX ReARMed,
SwanStation,
DuckStation **(Standalone)**,
Mednafen **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games | | pv1000 | Casio PV-1000 | MAME - Current | MAME **(Standalone)** | No | Single archive or ROM file | -| quake | Quake | TyrQuake | vitaQuake 2,
vitaQuake 2 [Rogue],
vitaQuake 2 [Xatrix],
vitaQuake 2 [Zaero],
vitaQuake 3 [UW],
_Shortcut or script_ | No | | +| quake | Quake | TyrQuake | vitaQuake 2,
vitaQuake 2 [Rogue],
vitaQuake 2 [Xatrix],
vitaQuake 2 [Zaero],
vitaQuake 3 [LW],
_Shortcut or script_ | No | | | samcoupe | MGT SAM Coupé | SimCoupé **(Standalone)** | | No | Single archive or ROM file | -| satellaview | Nintendo Satellaview | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [UW],
Mesen-S,
Mesen **(Standalone)** [UW],
ares **(Standalone)** | | | -| saturn | Sega Saturn | Beetle Saturn | Kronos [UW],
YabaSanshiro [UW],
Yabause,
Mednafen **(Standalone)**,
SSF **(Standalone)** [W] | Yes | In separate folder interpreted as a file, with .m3u playlist if multi-disc game | -| saturnjp | Sega Saturn [Japan] | Beetle Saturn | Kronos [UW],
YabaSanshiro [UW],
Yabause,
Mednafen **(Standalone)**,
SSF **(Standalone)** [W] | Yes | In separate folder interpreted as a file, with .m3u playlist if multi-disc game | +| satellaview | Nintendo Satellaview | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [LW],
Mesen-S,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | | | +| saturn | Sega Saturn | Beetle Saturn | Kronos [LW],
YabaSanshiro [LW],
Yabause,
Mednafen **(Standalone)**,
SSF **(Standalone)** [W] | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games | +| saturnjp | Sega Saturn [Japan] | Beetle Saturn | Kronos [LW],
YabaSanshiro [LW],
Yabause,
Mednafen **(Standalone)**,
SSF **(Standalone)** [W] | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games | | scummvm | ScummVM Game Engine | ScummVM | ScummVM **(Standalone)** | No | See the specific _ScummVM_ section elsewhere in this guide | | scv | Epoch Super Cassette Vision | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file | | sega32x | Sega Mega Drive 32X | PicoDrive | ares **(Standalone)** | No | Single archive or ROM file | | sega32xjp | Sega Super 32X [Japan] | PicoDrive | ares **(Standalone)** | No | Single archive or ROM file | | sega32xna | Sega Genesis 32X [North America] | PicoDrive | ares **(Standalone)** | No | Single archive or ROM file | | segacd | Sega CD | Genesis Plus GX | Genesis Plus GX Wide,
PicoDrive,
ares **(Standalone)** | Yes | | -| sfc | Nintendo SFC (Super Famicom) | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [UW],
Beetle Supafaust [UW],
Mesen-S,
Mesen **(Standalone)** [UW],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | -| sg-1000 | Sega SG-1000 | Genesis Plus GX | Genesis Plus GX Wide,
Gearsystem,
blueMSX,
ares **(Standalone)** | No | | -| sgb | Nintendo Super Game Boy | Mesen-S | Mesen **(Standalone)** [UW],
SameBoy,
mGBA,
mGBA **(Standalone)** | | Single archive or ROM file | -| snes | Nintendo SNES (Super Nintendo) | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [UW],
Beetle Supafaust [UW],
Mesen-S,
Mesen **(Standalone)** [UW],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | -| snesna | Nintendo SNES (Super Nintendo) [North America] | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [UW],
Beetle Supafaust [UW],
Mesen-S,
Mesen **(Standalone)** [UW],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| sfc | Nintendo SFC (Super Famicom) | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [LW],
Beetle Supafaust [LW],
Mesen-S,
Mesen **(Standalone)** [LW],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| sg-1000 | Sega SG-1000 | Genesis Plus GX | Genesis Plus GX Wide,
Gearsystem,
blueMSX,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | No | Single archive or ROM file | +| sgb | Nintendo Super Game Boy | Mesen-S | Mesen **(Standalone)** [LW],
SameBoy,
mGBA,
mGBA **(Standalone)** | | Single archive or ROM file | +| snes | Nintendo SNES (Super Nintendo) | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [LW],
Beetle Supafaust [LW],
Mesen-S,
Mesen **(Standalone)** [LW],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | +| snesna | Nintendo SNES (Super Nintendo) [North America] | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [LW],
Beetle Supafaust [LW],
Mesen-S,
Mesen **(Standalone)** [LW],
Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | | solarus | Solarus Game Engine | Solarus **(Standalone)** | | No | Single .solarus game file | | spectravideo | Spectravideo | blueMSX | | | | | steam | Valve Steam | Steam **(Standalone)** | | No | See the specific _Steam_ section elsewhere in this guide | -| stv | Sega Titan Video Game System | Kronos [UW],
MAME - Current [M] | MAME - Current [UW],
MAME **(Standalone)**,
Mednafen **(Standalone)** | Yes | Single archive file | -| sufami | Bandai SuFami Turbo | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [UW],
ares **(Standalone)** | | | -| supergrafx | NEC SuperGrafx | Beetle SuperGrafx | Beetle PCE,
ares **(Standalone)** | | | +| stv | Sega Titan Video Game System | Kronos [LW],
MAME - Current [M] | MAME - Current [LW],
MAME **(Standalone)**,
Mednafen **(Standalone)** | Yes | Single archive file | +| sufami | Bandai SuFami Turbo | Snes9x - Current | Snes9x 2010,
Snes9x **(Standalone)**,
bsnes,
bsnes-hd,
bsnes-mercury Accuracy,
bsnes **(Standalone)** [LW],
ares **(Standalone)** | | | +| supergrafx | NEC SuperGrafx | Beetle SuperGrafx | Beetle PCE,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | No | Single archive or ROM file | | supervision | Watara Supervision | Potator | MAME - Current,
MAME **(Standalone)** | No | Single archive or ROM file | | supracan | Funtech Super A'Can | MAME - Current | MAME **(Standalone)** | Yes/No | Single archive or ROM file. To make MAME start these games create an empty file named internal_68k.bin and zip it into supracan.zip | -| switch | Nintendo Switch | Yuzu **(Standalone)** [UW],
Ryujinx **(Standalone)** [M] | Ryujinx **(Standalone)** [UW] | Yes | | +| switch | Nintendo Switch | Yuzu **(Standalone)** [LW],
Ryujinx **(Standalone)** [M] | Ryujinx **(Standalone)** [LW] | Yes | | | symbian | Symbian | EKA2L1 [Nokia N-Gage] **(Standalone)** | EKA2L1 [Nokia N70] **(Standalone)**,
EKA2L1 [Nokia N97] **(Standalone)**,
EKA2L1 [Custom device] **(Standalone)** | Yes | See the specific _Symbian and Nokia N-Gage_ section elsewhere in this guide | | tanodragon | Tano Dragon | XRoar **(Standalone)** | | Yes | See the specific _Dragon 32 and Tano Dragon_ section elsewhere in this guide | -| tg16 | NEC TurboGrafx-16 | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [UW],
ares **(Standalone)** | No | Single archive or ROM file | -| tg-cd | NEC TurboGrafx-CD | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [UW],
ares **(Standalone)** | Yes | | +| tg16 | NEC TurboGrafx-16 | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | No | Single archive or ROM file | +| tg-cd | NEC TurboGrafx-CD | Beetle PCE | Beetle PCE FAST,
Mednafen **(Standalone)**,
Mesen **(Standalone)** [LW],
ares **(Standalone)** | Yes | | | ti99 | Texas Instruments TI-99 | MAME **(Standalone)** | | Yes | See the specific _Texas Instruments TI-99_ section elsewhere in this guide | | tic80 | TIC-80 Fantasy Computer | TIC-80 | TIC-80 **(Standalone)** | No | Single .tic file | | to8 | Thomson TO8 | Theodore | | | | -| triforce | Namco-Sega-Nintendo Triforce | Triforce **(Standalone)** [UW] | | No | | -| trs-80 | Tandy TRS-80 | sdl2trs DOS Diskette **(Standalone)** [UW] | sdl2trs Bootable Diskette **(Standalone)** [UW],
sdl2trs CMD File **(Standalone)** [UW] | Yes | See the specific _Tandy TRS-80_ section elsewhere in this guide | -| type-x | Taito Type X | Wine **(Standalone)** [U],
_Shortcut or script_ [MW] | Proton **(Standalone)** [U],
_AppImage_ [U],
_Shortcut or script_ [U] | No | | +| triforce | Namco-Sega-Nintendo Triforce | Triforce **(Standalone)** [LW] | | No | | +| trs-80 | Tandy TRS-80 | sdl2trs DOS Diskette **(Standalone)** [LW] | sdl2trs Bootable Diskette **(Standalone)** [LW],
sdl2trs CMD File **(Standalone)** [LW] | Yes | See the specific _Tandy TRS-80_ section elsewhere in this guide | +| type-x | Taito Type X | Wine **(Standalone)** [L],
_Shortcut or script_ [MW] | Proton **(Standalone)** [L],
_AppImage_ [L],
_Shortcut or script_ [L] | No | | | uzebox | Uzebox Open Source Console | Uzem | | | | | vectrex | GCE Vectrex | vecx | MAME - Current,
MAME **(Standalone)** | Yes for MAME | Single archive or ROM file | | vic20 | Commodore VIC-20 | VICE xvic | VICE xvic **(Standalone)** | No | Single archive or tape, cartridge or diskette image file | @@ -4091,18 +4143,18 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed | vpinball | Visual Pinball | Visual Pinball **(Standalone)** | | No | See the specific _Visual Pinball_ section elsewhere in this guide | | vsmile | VTech V.Smile | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file | | wasm4 | WASM-4 Fantasy Console | WASM-4 | | No | Single .wasm file | -| wii | Nintendo Wii | Dolphin | Dolphin **(Standalone)**,
PrimeHack **(Standalone)** [UW] | No | | +| wii | Nintendo Wii | Dolphin | Dolphin **(Standalone)**,
PrimeHack **(Standalone)** [LW] | No | | | wiiu | Nintendo Wii U | Cemu **(Standalone)** | | No | See the specific _Nintendo Wii U_ section elsewhere in this guide | -| windows | Microsoft Windows | _Suspend ES-DE_ | _Keep ES-DE running_,
_AppImage (Suspend ES-DE)_ [U],
_AppImage (Keep ES-DE running)_ [U] | No | Shortcut (.desktop/.app/.lnk) file, script or AppImage | -| windows3x | Microsoft Windows 3.x | DOSBox-X **(Standalone)** | DOSBox-Pure,
_Shortcut or script (Suspend ES-DE)_,
_Shortcut or script (Keep ES-DE running)_,
_AppImage (Suspend ES-DE)_ [U],
_AppImage (Keep ES-DE running)_ [U] | No | See the specific _Microsoft Windows 3.x and 9x_ section elsewhere in this guide | -| windows9x | Microsoft Windows 9x | DOSBox-X **(Standalone)** | DOSBox-Pure,
_Shortcut or script (Suspend ES-DE)_,
_Shortcut or script (Keep ES-DE running)_,
_AppImage (Suspend ES-DE)_ [U],
_AppImage (Keep ES-DE running)_ [U] | No | See the specific _Microsoft Windows 3.x and 9x_ section elsewhere in this guide | +| windows | Microsoft Windows | _Suspend ES-DE_ | _Keep ES-DE running_,
_AppImage (Suspend ES-DE)_ [L],
_AppImage (Keep ES-DE running)_ [L] | No | Shortcut (.desktop/.app/.lnk) file, script or AppImage | +| windows3x | Microsoft Windows 3.x | DOSBox-X **(Standalone)** | DOSBox-Pure,
_Shortcut or script (Suspend ES-DE)_,
_Shortcut or script (Keep ES-DE running)_,
_AppImage (Suspend ES-DE)_ [L],
_AppImage (Keep ES-DE running)_ [L] | No | See the specific _Microsoft Windows 3.x and 9x_ section elsewhere in this guide | +| windows9x | Microsoft Windows 9x | DOSBox-X **(Standalone)** | DOSBox-Pure,
_Shortcut or script (Suspend ES-DE)_,
_Shortcut or script (Keep ES-DE running)_,
_AppImage (Suspend ES-DE)_ [L],
_AppImage (Keep ES-DE running)_ [L] | No | See the specific _Microsoft Windows 3.x and 9x_ section elsewhere in this guide | | wonderswan | Bandai WonderSwan | Beetle Cygne | Mednafen **(Standalone)**,
ares **(Standalone)**,
ares [Benesse Pocket Challenge V2] **(Standalone)** | No | Single archive or ROM file | | wonderswancolor | Bandai WonderSwan Color | Beetle Cygne | Mednafen **(Standalone)**,
ares **(Standalone)** | No | Single archive or ROM file | | x1 | Sharp X1 | X Millennium | MAME [Diskette] **(Standalone)**,
MAME [Tape] **(Standalone)** | Yes for MAME | Single archive or diskette/tape file | | x68000 | Sharp X68000 | PX68k | MAME **(Standalone)** | Yes | | | xbox | Microsoft Xbox | xemu **(Standalone)** | Cxbx-Reloaded **(Standalone)** [W] | Yes for xemu | Single .iso file for xemu or unpacked .iso directory for Cxbx-Reloaded | -| xbox360 | Microsoft Xbox 360 | xenia **(Standalone)** [W],
xenia **(Wine)** [U] | xenia **(Proton)** [U],
_Shortcut or script_ [U] | No | See the specific _Microsoft Xbox 360_ section elsewhere in this guide | +| xbox360 | Microsoft Xbox 360 | xenia **(Standalone)** [W],
xenia **(Wine)** [L] | xenia **(Proton)** [L],
_Shortcut or script_ [L] | No | See the specific _Microsoft Xbox 360_ section elsewhere in this guide | | zmachine | Infocom Z-machine | Gargoyle **(Standalone)** | | No | | | zx81 | Sinclair ZX81 | EightyOne | | | | -| zxnext | Sinclair ZX Spectrum Next | #CSpect **(Standalone)** [UW],
ZEsarUX **(Standalone)** [M] | ZEsarUX **(Standalone)** [UW] | No | In separate folder interpreted as a file | -| zxspectrum | Sinclair ZX Spectrum | Fuse | Fuse **(Standalone)** | No | | +| zxnext | Sinclair ZX Spectrum Next | #CSpect **(Standalone)** [LW],
ZEsarUX **(Standalone)** [M] | ZEsarUX **(Standalone)** [LW] | No | In separate folder interpreted as a file | +| zxspectrum | Sinclair ZX Spectrum | Fuse | Fuse **(Standalone)** | No | Single archive or ROM file | diff --git a/es-app/assets/org.es_de.frontend.appdata.xml b/es-app/assets/org.es_de.frontend.appdata.xml index 6a26e499b..99e7e381b 100644 --- a/es-app/assets/org.es_de.frontend.appdata.xml +++ b/es-app/assets/org.es_de.frontend.appdata.xml @@ -38,6 +38,9 @@ + + https://gitlab.com/es-de/emulationstation-de/-/releases + https://gitlab.com/es-de/emulationstation-de/-/releases diff --git a/images/es-de_application_updater.png b/images/es-de_application_updater.png index 7dec9b83234fc917c3b90a489b179ec4ebe519f2..8ec99722795169e0f0ec96880b50dc488644307e 100644 GIT binary patch literal 81390 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

fLUrEM-zQ(tm0%tsg_9;1=w2zJ!uN)bW0 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%0ALU;yXY8qstx>-Faa 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 CxLhRw

n{T=tg?fX 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