Updated to ES-DE 3.0.3

This commit is contained in:
XargonWan 2024-06-15 19:23:32 +09:00
commit d6e1bf606c
902 changed files with 5007 additions and 1347 deletions

View file

@ -1,6 +1,6 @@
# ES-DE Frontend (development version) - Android documentation
This document contains information specific to the Android release, for more general ES-DE documentation refer to the [User guide](USERGUIDE.md) as well as the general [FAQ](FAQ.md).
This document contains information specific to the Android release, for more general ES-DE documentation refer to the [User guide](USERGUIDE-DEV.md) as well as the general [FAQ](FAQ.md).
It's also generally recommended to read the [Frequently Asked Questions (FAQ) for Android](FAQ-ANDROID.md) document prior to diving into the information in this document.
@ -31,7 +31,7 @@ If you need to re-run the configurator for some reason then the easiest way is t
By default the touch input overlay will be enabled which makes it possible to use ES-DE without a controller or physical keyboard by overlaying virtual buttons on top of the ES-DE interface. If you are using a device which has a built-in controller you may however want to disable this feature. That is done via the _Enable touch overlay_ option in the _Input device settings_ menu on the main menu. Just be aware that disabling this option on a device where you have no other input method than touch will lock you out of the application.
If you accidentally disable the touch overlay you can force the configurator to run as explained in the previous section above, this will always reset the touch overlay setting. Another option would of course be to temporarily plug in a controller or keyboard to enable the setting via its menu entry. A third option would be to manually edit the es_settings.xml file in the ES-DE application data directory. The setting you are after is named _InputTouchOverlay_ which should be changed from _false_ to _true_.
If you accidentally disable the touch overlay you can force the configurator to run as explained in the previous section above, this will reset the touch overlay setting as long as you have at least pressed the _Begin setup_ button. Another option would of course be to temporarily plug in a controller or keyboard to enable the setting via its menu entry. A third option would be to manually edit the es_settings.xml file in the ES-DE application data directory. The setting you are after is named _InputTouchOverlay_ which should be changed from _false_ to _true_.
Apart from this there are numerous options for the touch overlay, like the ability to change its size, opacity and fade-out time. Setting the fade-out to zero will make it permanently visible. See the [User guide](USERGUIDE-DEV.md) for a complete reference of all app settings and features.
@ -55,14 +55,13 @@ Some emulators like RetroArch are still using an older storage access method and
The following emulators are configured for FileProvider access:
* 2600.emu
* DroidArcadia
* FPseNG (still needs scoped storage to be setup in emulator)
* FPse (still needs scoped storage to be setup in emulator)
* GBA.emu
* GBC.emu
* Lynx.emu
* MD.emu (genesis, mastersystem, megadrive, megadrivejp)
* MAME4droid 2024
* MAME4droid
* NES.emu
* NGP.emu
* PCE.emu (pcengine, supergrafx and tg16 systems)
@ -156,16 +155,37 @@ This is obviously a non-portable collection.
You can relocate as many systems as you want, you just need to place them all within the systemList tag pairs in ES-DE/custom_systems/es_systems.xml.
## Issues with the Ayn Odin 2
## Launching native Android apps and games
There is one serious issue that seems to be specific to the Ayn Odin 2, and that is that a number of standalone emulators can't be launched. When attempting to run such an emulator an error popup with the game name followed by "ERROR CODE -1" is displayed. The affected emulators are ColEm, fMSX, iNES, MasterGear, My Boy!, My OldBoy!, Redream and Speccy.
As of ES-DE 3.0.2 there is experimental support for launching native Android apps and games from inside ES-DE. For the time being it does however require that you use a separate app to import your apps and games into ES-DE. But following this initial setup launching native apps and games works just like launching games for any other system.
There are also some issues with sound quality on the Odin 2, such as large fluctuations in volume where some sounds are quite loud and some are quite silent. There are also some strange aliasing effects when playing samples rapidly.
First head to this GitHub repository and download the ES Applauncher APK:\
https://github.com/schattenphoenix/es_applauncher/releases
Many thanks to Alex Pferdmenges for developing this app!
After installing the APK on your device and giving it the necessary permissions you'll see a list of your apps and you can classify the ones you want as games, and you can disable the ones you want to skip via the _Game_ and _Disable_ checkboxes on the right side of the screen. You can also choose to extract the icons for these apps and store them into one of the media folders inside the ES-DE/downloaded_media directory. The _Media dir_ dropdown at the top of the screen lets you select the media type. It's generally recommended to use _screenshots_ or _covers_ or you can skip this step altogether as most of these icons are pretty low resolution anyway.
To populate the _androidapps_ and _androidgames_ system directories press the save icon in the upper right corner of the screen and select your ROMs directory from the selector interface. For example this could be _ROMs_ directly on internal storage, or on your SD card. Just press the _Use this folder_ button and the directories and files will be generated for you. Now you can start ES-DE and launch these apps and games directly.
Note that it seems like ES Applauncher has issues working correctly on some Android 10 devices.
It's also possible to scrape Android apps and games using ScreenScraper, but at the time of writing the amount of entries in their database is somehow limited. It's therefore encouraged to participate in improving this situation by contributing metadata and media to their database, this will benefit everyone in the long run.
A built-in import tool for native Android apps and games is also planned for a future ES-DE release.
## Running ES-DE as the Android home app
To run ES-DE as the home app (launcher) you'll select it accordingly from the Apps section of the Android Settings app. When in this mode the ability to quit the app is completely disabled as it doesn't make sense to exit the home app. Therefore the _Quit ES-DE_ entry on the main menu is removed and the _Back button/back swipe exits app_ option in the _Other settings_ menu and its corresponding functionality is disabled.
Apart from this it works as you'd expect, ES-DE will start automatically when rebooting the device and pressing the home button will return to ES-DE regardless of which app you have running.
If the operating system runs out of memory when a game is running it will kill ES-DE even if it's set as home app. If this happens ES-DE will reload whenever you return from the game or if you press the home button. This is simply how Android works.
It's generally a very good idea to import your native Android apps into ES-DE prior to setting it as the home app, this way you can easily access things like the Settings app. Note however that even if you somehow lock yourself out of the system by setting ES-DE as the home app and not having any native apps added you can still always access the Settings app via the Android notification shade. On most devices you access this by swiping down from the top of the screen. After swiping down, just select the cogwheel icon to start the Settings app. From there you can change the home app to something else than ES-DE, should you need to.
## Known ES-DE problems
In addition to the issues specific to the Ayn Odin 2 there are a couple of other problems that will hopefully be resolved in the near future:
* Poor performance/low frame rate after startup on some devices, which seems to happen randomly and is usually resolved by itself within 10 to 30 seconds.
* The Android soft keyboard causes rendering issues when navigating using a controller or physical keyboard, as such the ES-DE built-in keyboard is enabled by default for the time being. For testing purposes the Android soft keyboard can be enabled via the _Enable virtual keyboard_ option in the _UI settings_ menu. If only using touch input the issue is not present. This problem is believed to be caused by a bug in the SDL library so it probably needs to be resolved there.
* Using a mounted USB storage device for the ES-DE and/or ROMs directories will lead to the configurator exiting after finishing the setup instead of launching ES-DE. Restarting ES-DE manually will lead to a successful startup. If the option to create the system directories was selected in the configurator then this will have to be executed again from inside ES-DE. Note that using a mounted USB storage device leads to a very crippled setup anyway, as for example RetroArch can't read any games from such devices (i.e. from the /mnt/media_rw/ directory tree). Only emulators supporting scoped storage will be usable in such a setup.
@ -176,9 +196,10 @@ Below are specific instructions and considerations for all supported emulators.
### RetroArch
The RetroArch release from the Google Play store is problematic. It does not contain all emulator cores and a number of people have reported issues launching games from ES-DE (apparently it doesn't work at all on some devices). For these reasons it's strongly recommended to use the 64-bit release from the RetroArch website instead, or to install it from the Amazon Appstore or the F-Droid store.
The RetroArch release from the Google Play store is problematic. It does not contain all emulator cores and a number of people have reported issues launching games from ES-DE (apparently it doesn't work at all on some devices). For these reasons it's strongly recommended to use the 64-bit release from the RetroArch website instead, or to install it from the Samsung Galaxy Store, Amazon Appstore or the F-Droid store.
https://retroarch.com \
https://galaxystore.samsung.com/detail/com.retroarch \
https://www.amazon.com/dp/B09753XRVF \
https://f-droid.org/en/packages/com.retroarch
@ -194,8 +215,9 @@ https://github.com/Trixarian/NetherSX2-patch
### Citra
The Citra emulator is no longer in active development and it's unclear where it can be obtained and whether it will be worked on in the future. The Citra MMJ fork is still available for download from their GitHub site.
The original Citra emulator project is no longer alive, but there is a fork that should work as a drop-in replacement. The Citra MMJ fork is also a viable alternative. Both of these emulators are available for download from their GitHub sites.
https://github.com/PabloMK7/citra/releases \
https://github.com/weihuoya/citra/releases
### ColEm
@ -213,7 +235,7 @@ The Play store version is somehow up to date and could be used, otherwise the F-
https://play.google.com/store/apps/details?id=org.dolphinemu.dolphinemu \
https://f-droid.org/en/packages/org.dolphinemu.dolphinemu \
https://dolphin-emu.org/download/
https://dolphin-emu.org/download
### Dolphin MMJR and MMJR2
@ -229,6 +251,12 @@ This emulator can be installed from the Play store as a paid app. Note that it d
https://play.google.com/store/apps/details?id=com.dsemu.drastic
### DroidArcadia
This emulator can be downloaded directly from their website.
http://amigan.1emu.net/releases
### DuckStation
The Play store version of this emulator is getting frequent updates and is therefore recommended.
@ -296,10 +324,26 @@ This emulator can be installed from the Play store.
https://play.google.com/store/apps/details?id=com.fms.ines.free
### IrataJaguar
This Atari Jaguar emulator can be downloaded from their website. Just be aware that it's very old and has not been updated for modern Android releases, so it may be finicky on some devices or it may not work at all.
After installing the emulator, open it and go to the settings tab, then choose "Select ISO and BIOS directory" and navigate to the ROMs/atarijaguar folder. It seems like you also need to start the game from inside the emulator before you can run it from ES-DE. Starting a game will create a savestate file. If you now exit the emulator and run the game from ES-DE you'll see a list of savestate files, just select the correct one to start the game.
http://www.arts-union.ru/node/23
### Lime3DS
This emulator which is forked from Citra can be downloaded from their GitHub site.
https://github.com/Lime3DS/Lime3DS/releases
### MAME4droid 2024 and MAME4droid
These emulators can be installed from the Play store. It's strongly recommended to go for the _MAME4droid 2024_ version as this is updated with a recent MAME release while the older _MAME4droid_ is using an ancient MAME release.
Note that for MAME4droid 2024 there's an exception when it comes to setting up the ROM path. Instead of selecting each separate system directory (as is done on most other standalone emulators) you must select the root of the ROMs directory tree. To change the ROM path open _Settings_ in MAME4droid 2024, then select _General_ and then _Change ROMs path_. After restarting the emulator choose _External storage_ and then the ROMs directory which contains all your ES-DE system directories. If you instead choose a specific system directory like ROMs/arcade or ROMs/neogeo then only that specific system will work when launching games from ES-DE.
https://play.google.com/store/apps/details?id=com.seleuco.mame4d2024 \
https://play.google.com/store/apps/details?id=com.seleuco.mame4droid
@ -331,7 +375,7 @@ https://github.com/mupen64plus-ae/mupen64plus-ae/actions
### My Boy! and My OldBoy!
These emulators can be installed from the Play store as paid apps. There are also free/Lite versions availble for these emulators but they have not been updated in years and don't run on modern devices. As such they are not supported by ES-DE.
These emulators can be installed from the Play store as paid apps. There are also free/Lite versions available for these emulators but they have not been updated in years and don't run on modern devices. As such they are not supported by ES-DE.
https://play.google.com/store/apps/details?id=com.fastemulator.gba \
https://play.google.com/store/apps/details?id=com.fastemulator.gbc
@ -359,9 +403,13 @@ https://github.com/wheremyfoodat/Panda3DS/releases
### Pizza Boy GBA and Pizza Boy GBC
The Pizza Boy GBA and Pizza Boy GBC emulators used to be available on the Play store but have since been taken down. There used to be Basic (free) versions and Pro (paid) versions. It's unclear what the status is for these emulators and if they are still in active development. It's also unclear where they can be downloaded.
The Pizza Boy GBA and Pizza Boy GBC emulators can be installed from the Play store. There are Basic (free) versions and Pro (paid) versions available.
As of writing this, the Basic version of the GBA emulator does not seem to be able to launch games from ES-DE, but the Pro version is working fine. Both the Basic and Pro versions of the GBC emulator are working correctly.
As of writing this, the latest available Basic version of the GBA emulator does not seem to be able to launch games from ES-DE, but the Pro version is working fine. Both the Basic and Pro versions of the GBC emulator are working correctly.
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboygba \
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboygbapro \
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboy \
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboypro
### Play!
@ -400,6 +448,12 @@ This emulator can be installed for free from the Play store and can later be upg
https://play.google.com/store/apps/details?id=io.recompiled.redream
### ScummVM
ScummVM can be installed from the Play store. There are also daily builds available on their GitHub site. Such a build may be required to be able to launch games from ES-DE until the Play store version has been updated.
https://play.google.com/store/apps/details?id=org.scummvm.scummvm\
https://buildbot.scummvm.org/#/dailybuilds
### Skyline
@ -416,6 +470,14 @@ Although this emulator supports both the Sinclar ZX Spectrum and MGT SAM Coupé
https://play.google.com/store/apps/details?id=com.fms.speccy \
https://play.google.com/store/apps/details?id=com.fms.speccy.deluxe
### Visual Pinball
Although Visual Pinball is working fine on Android it's not possible to properly integrate it with a frontend, you'll instead need to install your tables inside the app and create dummy .vpinball files for your games in ROMs/vpinball and after launching a table from ES-DE you need to manually start it from inside the Visual Pinball GUI. There are more detailed setup instructions in the Visual Pinball section of the User guide.
You can download Visual Pinball from their GitHub automatic build system.
https://github.com/vpinball/vpinball/actions
### Vita3K
This PlayStation Vita emulator can be downloaded from their GitHub site. Refer to the User guide for detailed game setup instructions.
@ -424,9 +486,8 @@ https://github.com/Vita3K/Vita3K-Android/releases
### Yaba Sanshiro 2
This emulator can be installed from the Play store, there is a paid Pro version as well. At the time of writing only the Pro version works when launching games from ES-DE. Also note that .bin/.cue files can't be launched for the time being, only .chd files seem to work. This needs to be fixed in the emulator so nothing can be done in ES-DE to work around that limitation.
This emulator can be installed from the Play store. Note that only the paid Pro version supports game launching from ES-DE. Also note that .bin/.cue files can't be launched for the time being, only .chd files seem to work. This needs to be fixed in the emulator so nothing can be done in ES-DE to work around that limitation.
https://play.google.com/store/apps/details?id=org.devmiyax.yabasanshioro2 \
https://play.google.com/store/apps/details?id=org.devmiyax.yabasanshioro2.pro
## Device compatibility
@ -436,16 +497,18 @@ This is clearly not a complete list of Android devices, but rather those we know
| Manufacturer | Model | Android release | Supported | Known issues | Comment |
| :----------- | :---------------------- | :-------------- | :-------- | :------------------ | :------------------------- |
| Abxylute | One | 12 | Yes | None | |
| Alldocube | iPlay50 mini Pro | 13 | Yes | None | |
| Anbernic | RG353V | 11 | Yes | None | |
| Anbernic | RG405M | 12 | Yes | None | Limited RAM capacity for this device makes it unsuitable for demanding themes and large game collections |
| Anbernic | RG405V | 12 | Yes | None | Limited RAM capacity for this device makes it unsuitable for demanding themes and large game collections |
| Anbernic | RG505 | 12 | Yes | None | Limited RAM capacity for this device makes it unsuitable for demanding themes and large game collections |
| Anbernic | RG556 | 13 | Yes | None | |
| Anbernic | RG ARC | 12 | Yes | None | LineageOS |
| Ayaneo | Pocket Air | 12 | Yes | None | |
| AYANEO | Pocket Air | 12 | Yes | None | |
| AYANEO | Pocket S | 13 | Yes | None | |
| Ayn | Odin (Base/Pro) | 10 | Yes | None | |
| Ayn | Odin Lite | 11 | Yes | None | |
| Ayn | Odin 2 (Base/Pro/Max) | 13 | Yes | Can't launch some emulators,<br>Minor audio issues | Bugs in the firmware/OS image |
| Ayn | Odin 2 (Base/Pro/Max) | 13 | Yes | Minor audio issues | |
| Google | Pixel 2 XL | 11 | Yes | None | |
| Google | Pixel 3 XL | 12 | Yes | None | |
| Google | Pixel 4a | 13 | Yes | None | |
@ -465,6 +528,7 @@ This is clearly not a complete list of Android devices, but rather those we know
| Huawei | MatePad 11 (2021) | 13 | Yes | None | |
| Infinix | Zero 30 5G | 13 | Yes | None | |
| Kinhank | G1 | 11 | No | Unable to install | Possibly 32-bit operating system? |
| Kinhank | Super Console X5 Pro | 12 (TV) | No | Fails at configurator/onboarding | Seems to run a custom 64-bit Android TV OS |
| Lenovo | Legion Y700 (2022) | 12 | Yes | None | |
| Lenovo | Legion Y700 (2023) | 13 | Yes | None | |
| Lenovo | Xiaoxin Pad Pro 2021 | 11 | Yes | None | |
@ -549,93 +613,95 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| System name | Full name | Default emulator | Alternative emulators | Needs BIOS | Recommended game setup |
| :-------------------- | :--------------------------------------------- | :-------------------------------- | :-------------------------------- | :----------- | :----------------------------------- |
| 3do | 3DO Interactive Multiplayer | Opera | Real3DOPlayer **(Standalone)** | Yes | |
| adam | Coleco Adam | ColEm **(Standalone)** | | No | |
| adam | Coleco Adam | MAME4droid 2024 [Diskette] **(Standalone)** | MAME4droid 2024 [Tape] **(Standalone)**,<br>MAME4droid 2024 [Cartridge] **(Standalone)**,<br>MAME4droid 2024 [Software list] **(Standalone)**,<br>ColEm **(Standalone)** | Yes for MAME4droid 2024 | |
| ags | Adventure Game Studio Game Engine | _Placeholder_ | | | |
| amiga | Commodore Amiga | PUAE | PUAE 2021 | Yes | |
| amiga1200 | Commodore Amiga 1200 | PUAE | PUAE 2021 | Yes | |
| amiga600 | Commodore Amiga 600 | PUAE | PUAE 2021 | Yes | |
| amigacd32 | Commodore Amiga CD32 | PUAE | PUAE 2021 | Yes | |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS | No | Single archive or disk file |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS,<br>MAME4droid 2024 **(Standalone)** | Yes for MAME4droid 2024 | Single archive or disk file |
| android | Google Android | _Placeholder_ | | | |
| apple2 | Apple II | _Placeholder_ | | | |
| apple2gs | Apple IIGS | _Placeholder_ | | | |
| arcade | Arcade | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | |
| arcadia | Emerson Arcadia 2001 | _Placeholder_ | | | |
| archimedes | Acorn Archimedes | _Placeholder_ | | | |
| androidapps | Android Apps | _Native apps_ | | No | |
| androidgames | Android Games | _Native apps_ | | No | |
| apple2 | Apple II | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Apple II_ section in the user guide |
| apple2gs | Apple IIGS | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Apple IIGS_ section in the user guide |
| arcade | Arcade | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | See the specific _Arcade and Neo Geo_ section in the user guide |
| arcadia | Emerson Arcadia 2001 | DroidArcadia **(Standalone**) | MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| archimedes | Acorn Archimedes | MAME4droid 2024 [Model A440/1] **(Standalone)** | MAME4droid 2024 [Model A3000] **(Standalone)**,<br>MAME4droid 2024 [Model A310] **(Standalone)**,<br>MAME4droid 2024 [Model A540] **(Standalone)** | Yes | |
| arduboy | Arduboy Miniature Game System | Arduous | | No | Single archive or .hex file |
| astrocde | Bally Astrocade | _Placeholder_ | | | |
| astrocde | Bally Astrocade | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| atari2600 | Atari 2600 | Stella | Stella 2014,<br>2600.emu **(Standalone)** | No | Single archive or ROM file |
| atari5200 | Atari 5200 | a5200 | Atari800 | Yes | Single archive or ROM file |
| atari7800 | Atari 7800 ProSystem | ProSystem | | Yes | Single archive or ROM file |
| atari7800 | Atari 7800 ProSystem | ProSystem | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| atari800 | Atari 800 | Atari800 | | Yes | |
| atarijaguar | Atari Jaguar | Virtual Jaguar | | No | |
| atarijaguar | Atari Jaguar | Virtual Jaguar | IrataJaguar **(Standalone)**,<br>MAME4droid 2024 **(Standalone)** | Yes for MAME4droid 2024 | Single archive or ROM file |
| atarijaguarcd | Atari Jaguar CD | _Placeholder_ | | | |
| atarilynx | Atari Lynx | Handy | Beetle Lynx,<br>Lynx.emu **(Standalone)** | No | Single archive or ROM file |
| atarist | Atari ST [also STE and Falcon] | Hatari | | Yes | Single archive or image file for single-diskette games, .m3u playlist for multi-diskette games |
| atarixe | Atari XE | Atari800 | | Yes | |
| atomiswave | Sammy Corporation Atomiswave | Flycast | Flycast **(Standalone)** | Depends | Single archive file |
| bbcmicro | Acorn Computers BBC Micro | _Placeholder_ | | | |
| bbcmicro | Acorn Computers BBC Micro | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or diskette image file |
| c64 | Commodore 64 | VICE x64sc Accurate | VICE x64 Fast,<br>VICE x64 SuperCPU,<br>VICE x128,<br>C64.emu **(Standalone)** | 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 | | Yes | Single .bin/.cue pair |
| cdimono1 | Philips CD-i | SAME CDi | MAME4droid 2024 **(Standalone)** | Yes | Single .bin/.cue pair |
| cdtv | Commodore CDTV | PUAE | PUAE 2021 | Yes | |
| chailove | ChaiLove Game Engine | ChaiLove | | | |
| channelf | Fairchild Channel F | FreeChaF | | Yes | Single archive or ROM file |
| coco | Tandy Color Computer | _Placeholder_ | | | |
| channelf | Fairchild Channel F | FreeChaF | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| coco | Tandy Color Computer | MAME4droid 2024 [Cartridge] **(Standalone)** | MAME4droid 2024 [Tape] **(Standalone)** | Yes | See the specific _Tandy Color Computer_ section in the user guide |
| colecovision | Coleco ColecoVision | blueMSX | Gearcoleco,<br>MSX.emu **(Standalone)**,<br>ColEm **(Standalone)** | Yes | Single archive or ROM file |
| consolearcade | Console Arcade Systems | _Placeholder_ | | | |
| consolearcade | Console Arcade Systems | MAME - Current | MAME4droid 2024 **(Standalone)**,<br>Flycast,<br>Flycast **(Standalone)**,<br>Play! **(Standalone)** | Depends | See the specific _Console Arcade Systems_ section in the user guide |
| cps | Capcom Play System | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>FB Alpha 2012 CPS-3 | Depends | |
| cps1 | Capcom Play System I | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1 | Depends | |
| cps2 | Capcom Play System II | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-2 | Depends | |
| cps3 | Capcom Play System III | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-3 | Depends | |
| crvision | VTech CreatiVision | _Placeholder_ | | | |
| daphne | Daphne Arcade LaserDisc Emulator | DirkSimple | | No | |
| crvision | VTech CreatiVision | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| daphne | Daphne Arcade LaserDisc Emulator | MAME4droid 2024 **(Standalone)** | DirkSimple | Depends | See the specific _LaserDisc Games_ section in the user guide |
| desktop | Desktop Applications | _Placeholder_ | | | |
| doom | Doom | PrBoom | | No | |
| dos | DOS (PC) | DOSBox-Pure | DOSBox-Core,<br>DOSBox-SVN | No | |
| dragon32 | Dragon Data Dragon 32 | _Placeholder_ | | | |
| dreamcast | Sega Dreamcast | Flycast | Flycast **(Standalone)**,<br>Redream **(Standalone)** | No | In separate folder interpreted as a file, with .m3u playlist if multi-disc game |
| easyrpg | EasyRPG Game Engine | EasyRPG | | No | |
| electron | Acorn Electron | _Placeholder_ | | | |
| emulators | Emulators | _Placeholder_ | | | |
| electron | Acorn Electron | MAME4droid 2024 [Tape] **(Standalone)** | MAME4droid 2024 [Diskette DFS] **(Standalone)**,<br>MAME4droid 2024 [Diskette ADFS] **(Standalone)** | Yes | Single archive, or single tape or diskette image file |
| emulators | Emulators | _Native apps_ | | No | |
| epic | Epic Games Store | _Placeholder_ | | | |
| famicom | Nintendo Family Computer | Mesen | Nestopia UE,<br>FCEUmm,<br>QuickNES,<br>NES.emu **(Standalone)**,<br>iNES **(Standalone)**,<br>Nesoid **(Standalone)** | No | Single archive or ROM file |
| fba | FinalBurn Alpha | FB Alpha 2012 | FB Alpha 2012 Neo Geo,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>FB Alpha 2012 CPS-3 | Yes | |
| fbneo | FinalBurn Neo | FinalBurn Neo | | Yes | |
| fds | Nintendo Famicom Disk System | Mesen | Nestopia UE,<br>FCEUmm,<br>NES.emu **(Standalone)**,<br>iNES **(Standalone)**,<br>Nesoid **(Standalone)** | Yes | Single archive or ROM file |
| flash | Adobe Flash | Ruffle **(Standalone)** | | No | Single .swf file |
| fm7 | Fujitsu FM-7 | _Placeholder_ | | | |
| fmtowns | Fujitsu FM Towns | _Placeholder_ | | | |
| fm7 | Fujitsu FM-7 | MAME4droid 2024 [FM-7 Diskette] **(Standalone)** | MAME4droid 2024 [FM-7 Tape] **(Standalone)**,<br>MAME4droid 2024 [FM-7 Software list] **(Standalone)**,<br>MAME4droid 2024 [FM77AV Diskette] **(Standalone)**,<br>MAME4droid 2024 [FM77AV Tape] **(Standalone)**,<br>MAME4droid 2024 [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 | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Fujitsu FM Towns_ section in the user guide |
| fpinball | Future Pinball | _Placeholder_ | | | |
| gamate | Bit Corporation Gamate | _Placeholder_ | | | |
| gameandwatch | Nintendo Game and Watch | Multi (MESS) | MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | Single archive or ROM file |
| gamecom | Tiger Electronics Game.com | _Placeholder_ | | | |
| gamate | Bit Corporation Gamate | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| gameandwatch | Nintendo Game and Watch | Multi (MESS) | MAME4droid 2024 Local Artwork **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section in the user guide |
| gamecom | Tiger Electronics Game.com | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| gamegear | Sega Game Gear | Genesis Plus GX | Genesis Plus GX Wide,<br>Gearsystem,<br>SMS Plus GX,<br>PicoDrive,<br>MasterGear **(Standalone)** | No | Single archive or ROM file |
| gb | Nintendo Game Boy | Gambatte | SameBoy,<br>Gearboy,<br>TGB Dual,<br>DoubleCherryGB,<br>Mesen-S,<br>bsnes,<br>mGBA,<br>VBA-M,<br>GBC.emu **(Standalone)**,<br>My OldBoy! **(Standalone**),<br>Pizza Boy GBC **(Standalone)** | No | Single archive or ROM file |
| gba | Nintendo Game Boy Advance | mGBA | VBA-M,<br>VBA Next,<br>gpSP,<br>GBA.emu **(Standalone)**,<br>My Boy! **(Standalone)**,<br>Pizza Boy GBA **(Standalone)** | No | Single archive or ROM file |
| gbc | Nintendo Game Boy Color | Gambatte | SameBoy,<br>Gearboy,<br>TGB Dual,<br>DoubleCherryGB,<br>Mesen-S,<br>bsnes,<br>mGBA,<br>VBA-M,<br>GBC.emu **(Standalone)**,<br>My OldBoy! **(Standalone**),<br>Pizza Boy GBC **(Standalone)** | No | Single archive or ROM file |
| gc | Nintendo GameCube | Dolphin | Dolphin **(Standalone)**,<br>Dolphin MMJR **(Standalone)**,<br>Dolphin MMJR2 **(Standalone)** | No | Disc image file for single-disc games, .m3u playlist for multi-disc games |
| genesis | Sega Genesis | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | No | Single archive or ROM file |
| gmaster | Hartung Game Master | _Placeholder_ | | | |
| gx4000 | Amstrad GX4000 | Caprice32 | CrocoDS | No | Single archive or ROM file |
| intellivision | Mattel Electronics Intellivision | FreeIntv | | Yes | Single archive or ROM file |
| gmaster | Hartung Game Master | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| gx4000 | Amstrad GX4000 | Caprice32 | CrocoDS,<br>MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| intellivision | Mattel Electronics Intellivision | FreeIntv | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| j2me | Java 2 Micro Edition (J2ME) | SquirrelJME | | No | Single .jar file |
| kodi | Kodi Home Theatre Software | _Placeholder_ | | | |
| laserdisc | LaserDisc Games | DirkSimple | | No | |
| lcdgames | LCD Handheld Games | Multi (MESS) | MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | Single archive or ROM file |
| laserdisc | LaserDisc Games | MAME4droid 2024 **(Standalone)** | DirkSimple | Depends | See the specific _LaserDisc Games_ section in the user guide |
| lcdgames | LCD Handheld Games | Multi (MESS) | MAME4droid 2024 Local Artwork **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section in the user guide |
| lowresnx | LowRes NX Fantasy Console | LowRes NX | | No | Single ROM file |
| lutris | Lutris Open Gaming Platform | _Placeholder_ | | | |
| lutro | Lutro Game Engine | Lutro | | | |
| macintosh | Apple Macintosh | _Placeholder_ | | | |
| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | |
| macintosh | Apple Macintosh | MAME4droid 2024 Mac SE Bootable **(Standalone)** | MAME4droid 2024 Mac SE Boot Disk **(Standalone)**,<br>MAME4droid 2024 Mac Plus Bootable **(Standalone)**,<br>MAME4droid 2024 Mac Plus Boot Disk **(Standalone)** | Yes | See the specific _Apple Macintosh_ section in the user guide |
| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | See the specific _Arcade and Neo Geo_ section in the user guide |
| mame-advmame | AdvanceMAME | _Placeholder_ | | | |
| mastersystem | Sega Master System | Genesis Plus GX | Genesis Plus GX Wide,<br>SMS Plus GX,<br>Gearsystem,<br>PicoDrive,<br>MD.emu **(Standalone)**,<br>MasterGear **(Standalone)** | No | Single archive or ROM file |
| megacd | Sega Mega-CD | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | Yes | |
| megacdjp | Sega Mega-CD [Japan] | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | Yes | |
| megadrive | Sega Mega Drive | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | No | Single archive or ROM file |
| megadrivejp | Sega Mega Drive [Japan] | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | No | Single archive or ROM file |
| megaduck | Creatronic Mega Duck | SameDuck | | No | Single archive or ROM file |
| mess | Multi Emulator Super System | Multi (MESS) | | | |
| model2 | Sega Model 2 | MAME - Current | | Yes | |
| megaduck | Creatronic Mega Duck | SameDuck | MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| mess | Multi Emulator Super System | Multi (MESS) | | Depends | |
| model2 | Sega Model 2 | MAME - Current | MAME4droid 2024 **(Standalone)** | Yes | See the specific _Arcade and Neo Geo_ section in the user guide |
| model3 | Sega Model 3 | _Placeholder_ | | | |
| moto | Thomson MO/TO Series | Theodore | | | |
| msx | MSX | blueMSX | fMSX,<br>fMSX **(Standalone)**,<br>MSX.emu **(Standalone)** | Yes except for fMSX standalone | |
@ -647,20 +713,20 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| naomi | Sega NAOMI | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomi2 | Sega NAOMI 2 | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomigd | Sega NAOMI GD-ROM | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| n3ds | Nintendo 3DS | Citra | Citra **(Standalone)**,<br>Citra Canary **(Standalone)**,<br>Citra MMJ **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n3ds | Nintendo 3DS | Citra | Citra **(Standalone)**,<br>Citra Canary **(Standalone)**,<br>Citra MMJ **(Standalone)**,<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n64 | Nintendo 64 | Mupen64Plus-Next | M64Plus FZ **(Standalone)**,<br>Mupen64Plus AE **(Standalone)**,<br>ParaLLEl N64 | No | Single archive or ROM file |
| n64dd | Nintendo 64DD | Mupen64Plus-Next | M64Plus FZ **(Standalone)**,<br>Mupen64Plus AE **(Standalone)**,<br>ParaLLEl N64 | Yes | |
| nds | Nintendo DS | melonDS DS | melonDS **(Standalone)**,<br>melonDS Nightly **(Standalone)**,<br>DeSmuME,<br>DeSmuME 2015,<br>DraStic **(Standalone)** | No | Single archive or ROM file |
| neogeo | SNK Neo Geo | FinalBurn Neo | Geolith,<br>NEO.emu **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)** | Yes | Single archive or ROM file |
| neogeocd | SNK Neo Geo CD | NeoCD | FinalBurn Neo | Yes | |
| neogeocdjp | SNK Neo Geo CD [Japan] | NeoCD | FinalBurn Neo | Yes | |
| nds | Nintendo DS | melonDS DS | melonDS,<br>melonDS **(Standalone)**,<br>melonDS Nightly **(Standalone)**,<br>DeSmuME,<br>DeSmuME 2015,<br>DraStic **(Standalone)** | No | Single archive or ROM file |
| neogeo | SNK Neo Geo | FinalBurn Neo | Geolith,<br>NEO.emu **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)** | Yes | See the specific _Arcade and Neo Geo_ section in the user guide |
| neogeocd | SNK Neo Geo CD | NeoCD | FinalBurn Neo,<br>MAME4droid 2024 **(Standalone)** | Yes | .chd (NeoCD and MAME4droid 2024 only) or .cue file |
| neogeocdjp | SNK Neo Geo CD [Japan] | NeoCD | FinalBurn Neo,<br>MAME4droid 2024 **(Standalone)** | Yes | .chd (NeoCD and MAME4droid 2024 only) or .cue file |
| nes | Nintendo Entertainment System | Mesen | Nestopia UE,<br>FCEUmm,<br>QuickNES,<br>NES.emu **(Standalone)**,<br>iNES **(Standalone)**,<br>Nesoid **(Standalone)** | No | Single archive or ROM file |
| ngage | Nokia N-Gage | EKA2L1 **(Standalone)** | | Yes | See the specific _Symbian and Nokia N-Gage_ section in the User guide |
| ngp | SNK Neo Geo Pocket | Beetle NeoPop | RACE,<br>NGP.emu **(Standalone)** | No | Single archive or ROM file |
| ngpc | SNK Neo Geo Pocket Color | Beetle NeoPop | RACE,<br>NGP.emu **(Standalone)** | No | Single archive or ROM file |
| odyssey2 | Magnavox Odyssey 2 | O2EM | | Yes | Single archive or ROM file |
| odyssey2 | Magnavox Odyssey 2 | O2EM | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| openbor | OpenBOR Game Engine | OpenBOR **(Standalone)** | | No | See the specific _OpenBOR_ section in the User guide |
| oric | Tangerine Computer Systems Oric | _Placeholder_ | | | |
| oric | Tangerine Computer Systems Oric | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Tangerine Computer Systems Oric_ section in the user guide |
| palm | Palm OS | Mu | | | |
| pc | IBM PC | DOSBox-Pure | DOSBox-Core,<br>DOSBox-SVN | No | |
| pc88 | NEC PC-8800 Series | QUASI88 | | Yes | |
@ -679,14 +745,14 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| psp | Sony PlayStation Portable | PPSSPP | PPSSPP **(Standalone)** | No | Single disc image file |
| psvita | Sony PlayStation Vita | Vita3K **(Standalone)** | | Yes | See the specific _Sony PlayStation Vita_ section in the User guide |
| psx | Sony PlayStation | Beetle PSX | Beetle PSX HW,<br>PCSX ReARMed,<br>SwanStation,<br>DuckStation **(Standalone)**,<br>ePSXe **(Standalone)**,<br>FPseNG **(Standalone)**,<br>FPse **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
| pv1000 | Casio PV-1000 | _Placeholder_ | | | |
| pv1000 | Casio PV-1000 | MAME4droid 2024 **(Standalone)** | | No | Single archive or ROM file |
| quake | Quake | TyrQuake | vitaQuake 2,<br>vitaQuake 2 [Rogue],<br>vitaQuake 2 [Xatrix],<br>vitaQuake 2 [Zaero] | No | |
| samcoupe | MGT SAM Coupé | Speccy **(Standalone)** | | No | Single archive or ROM file |
| satellaview | Nintendo Satellaview | Snes9x - Current | Snes9x 2010,<br>Snes9x 2005 Plus,<br>Snes9x EX+ **(Standalone)**,<br>bsnes,<br>bsnes-hd,<br>bsnes-mercury Accuracy,<br>Mesen-S | | |
| saturn | Sega Saturn | Beetle Saturn | YabaSanshiro,<br>Yaba Sanshiro 2 **(Standalone)**,<br>Yabause,<br>Saturn.emu **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
| saturnjp | Sega Saturn [Japan] | Beetle Saturn | YabaSanshiro,<br>Yaba Sanshiro 2 **(Standalone)**,<br>Yabause,<br>Saturn.emu **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
| scummvm | ScummVM Game Engine | ScummVM | | No | |
| scv | Epoch Super Cassette Vision | _Placeholder_ | | | |
| scummvm | ScummVM Game Engine | ScummVM | ScummVM **(Standalone)** | No | See the specific _ScummVM_ section in the user guide |
| scv | Epoch Super Cassette Vision | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| sega32x | Sega Mega Drive 32X | PicoDrive | | No | Single archive or ROM file |
| sega32xjp | Sega Super 32X [Japan] | PicoDrive | | No | Single archive or ROM file |
| sega32xna | Sega Genesis 32X [North America] | PicoDrive | | No | Single archive or ROM file |
@ -702,26 +768,26 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| stv | Sega Titan Video Game System | MAME - Current | MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)** | Yes | Single archive file |
| sufami | Bandai SuFami Turbo | Snes9x - Current | Snes9x 2010,<br>Snes9x 2005 Plus,<br>Snes9x EX+ **(Standalone)**,<br>bsnes,<br>bsnes-hd,<br>bsnes-mercury Accuracy | | |
| supergrafx | NEC SuperGrafx | Beetle SuperGrafx | Beetle PCE,<br>PCE.emu **(Standalone)** | No | Single archive or ROM file |
| supervision | Watara Supervision | Potator | | No | Single archive or ROM file |
| supracan | Funtech Super A'Can | _Placeholder_ | | | |
| supervision | Watara Supervision | Potator | MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| supracan | Funtech Super A'Can | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file. You need a supracan.zip archive that contains a valid internal_68k.bin file and an empty file named umc6650.bin |
| switch | Nintendo Switch | Skyline **(Standalone)** | | Yes | |
| symbian | Symbian | EKA2L1 **(Standalone)** | | Yes | See the specific _Symbian and Nokia N-Gage_ section in the User guide |
| tanodragon | Tano Dragon | _Placeholder_ | | | |
| tg16 | NEC TurboGrafx-16 | Beetle PCE | Beetle PCE FAST,<br>Beetle SuperGrafx,<br>PCE.emu **(Standalone)** | No | Single archive or ROM file |
| tg-cd | NEC TurboGrafx-CD | Beetle PCE | Beetle PCE FAST,<br>Beetle SuperGrafx,<br>PCE.emu **(Standalone)** | Yes | |
| ti99 | Texas Instruments TI-99 | _Placeholder_ | | | |
| ti99 | Texas Instruments TI-99 | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Texas Instruments TI-99_ section in the user guide |
| tic80 | TIC-80 Fantasy Computer | TIC-80 | | No | Single .tic file |
| to8 | Thomson TO8 | Theodore | | | |
| triforce | Namco-Sega-Nintendo Triforce | _Placeholder_ | | | |
| trs-80 | Tandy TRS-80 | _Placeholder_ | | | |
| type-x | Taito Type X | _Placeholder_ | | | |
| uzebox | Uzebox Open Source Console | Uzem | | | |
| vectrex | GCE Vectrex | vecx | | No | Single archive or ROM file |
| vectrex | GCE Vectrex | vecx | MAME4droid 2024 **(Standalone)** | Yes for MAME4droid 2024 | Single archive or ROM file |
| vic20 | Commodore VIC-20 | VICE xvic | | No | Single archive or tape, cartridge or diskette image file |
| videopac | Philips Videopac G7000 | O2EM | | Yes | Single archive or ROM file |
| videopac | Philips Videopac G7000 | O2EM | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| virtualboy | Nintendo Virtual Boy | Beetle VB | | No | |
| vpinball | Visual Pinball | _Placeholder_ | | | |
| vsmile | VTech V.Smile | _Placeholder_ | | | |
| vpinball | Visual Pinball | Visual Pinball **(Standalone)** | | No | See the specific _Visual Pinball_ section in the user guide |
| vsmile | VTech V.Smile | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| wasm4 | WASM-4 Fantasy Console | WASM-4 | | No | Single .wasm file |
| wii | Nintendo Wii | Dolphin | Dolphin **(Standalone)**,<br>Dolphin MMJR **(Standalone)**,<br>Dolphin MMJR2 **(Standalone)** | No | |
| wiiu | Nintendo Wii U | _Placeholder_ | | | |
@ -730,11 +796,11 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| windows9x | Microsoft Windows 9x | DOSBox-Pure | | No | |
| wonderswan | Bandai WonderSwan | Beetle Cygne | Swan.emu **(Standalone)** | No | Single archive or ROM file |
| wonderswancolor | Bandai WonderSwan Color | Beetle Cygne | Swan.emu **(Standalone)** | No | Single archive or ROM file |
| x1 | Sharp X1 | X Millennium | | No | Single archive or diskette/tape file |
| x68000 | Sharp X68000 | PX68k | | Yes | |
| x1 | Sharp X1 | X Millennium | MAME4droid 2024 [Diskette] **(Standalone)**,<br>MAME4droid 2024 [Tape] **(Standalone)** | Yes for MAME4droid 2024 | Single archive or diskette/tape file |
| x68000 | Sharp X68000 | PX68k | MAME4droid 2024 **(Standalone)** | Yes | |
| xbox | Microsoft Xbox | _Placeholder_ | | | |
| xbox360 | Microsoft Xbox 360 | _Placeholder_ | | | |
| zmachine | Infocom Z-machine | _Placeholder_ | | | |
| zmachine | Infocom Z-machine | MojoZork | | No | |
| zx81 | Sinclair ZX81 | EightyOne | | | |
| zxnext | Sinclair ZX Spectrum Next | _Placeholder_ | | | |
| zxspectrum | Sinclair ZX Spectrum | Fuse | Speccy **(Standalone)** | No | Single archive or ROM file |

View file

@ -31,9 +31,9 @@ If you need to re-run the configurator for some reason then the easiest way is t
By default the touch input overlay will be enabled which makes it possible to use ES-DE without a controller or physical keyboard by overlaying virtual buttons on top of the ES-DE interface. If you are using a device which has a built-in controller you may however want to disable this feature. That is done via the _Enable touch overlay_ option in the _Input device settings_ menu on the main menu. Just be aware that disabling this option on a device where you have no other input method than touch will lock you out of the application.
If you accidentally disable the touch overlay you can force the configurator to run as explained in the previous section above, this will always reset the touch overlay setting. Another option would of course be to temporarily plug in a controller or keyboard to enable the setting via its menu entry. A third option would be to manually edit the es_settings.xml file in the ES-DE application data directory. The setting you are after is named _InputTouchOverlay_ which should be changed from _false_ to _true_.
If you accidentally disable the touch overlay you can force the configurator to run as explained in the previous section above, this will reset the touch overlay setting as long as you have at least pressed the _Begin setup_ button. Another option would of course be to temporarily plug in a controller or keyboard to enable the setting via its menu entry. A third option would be to manually edit the es_settings.xml file in the ES-DE application data directory. The setting you are after is named _InputTouchOverlay_ which should be changed from _false_ to _true_.
Apart from this there are numerous options for the touch overlay, like the ability to change its size, opacity and fade-out time. Setting the fade-out to zero will make it permanently visible. See the [User guide](USERGUIDE-DEV.md) for a complete reference of all app settings and features.
Apart from this there are numerous options for the touch overlay, like the ability to change its size, opacity and fade-out time. Setting the fade-out to zero will make it permanently visible. See the [User guide](USERGUIDE.md) for a complete reference of all app settings and features.
## Retention of files and data
@ -55,14 +55,13 @@ Some emulators like RetroArch are still using an older storage access method and
The following emulators are configured for FileProvider access:
* 2600.emu
* DroidArcadia
* FPseNG (still needs scoped storage to be setup in emulator)
* FPse (still needs scoped storage to be setup in emulator)
* GBA.emu
* GBC.emu
* Lynx.emu
* MD.emu
* MAME4droid 2024
* MAME4droid
* MD.emu (genesis, mastersystem, megadrive, megadrivejp)
* NES.emu
* NGP.emu
* PCE.emu (pcengine, supergrafx and tg16 systems)
@ -156,16 +155,37 @@ This is obviously a non-portable collection.
You can relocate as many systems as you want, you just need to place them all within the systemList tag pairs in ES-DE/custom_systems/es_systems.xml.
## Issues with the Ayn Odin 2
## Launching native Android apps and games
There is one serious issue that seems to be specific to the Ayn Odin 2, and that is that a number of standalone emulators can't be launched. When attempting to run such an emulator an error popup with the game name followed by "ERROR CODE -1" is displayed. The affected emulators are ColEm, fMSX, iNES, MasterGear, My Boy!, My OldBoy!, Redream and Speccy.
As of ES-DE 3.0.2 there is experimental support for launching native Android apps and games from inside ES-DE. For the time being it does however require that you use a separate app to import your apps and games into ES-DE. But following this initial setup launching native apps and games works just like launching games for any other system.
There are also some issues with sound quality on the Odin 2, such as large fluctuations in volume where some sounds are quite loud and some are quite silent. There are also some strange aliasing effects when playing samples rapidly.
First head to this GitHub repository and download the ES Applauncher APK:\
https://github.com/schattenphoenix/es_applauncher/releases
Many thanks to Alex Pferdmenges for developing this app!
After installing the APK on your device and giving it the necessary permissions you'll see a list of your apps and you can classify the ones you want as games, and you can disable the ones you want to skip via the _Game_ and _Disable_ checkboxes on the right side of the screen. You can also choose to extract the icons for these apps and store them into one of the media folders inside the ES-DE/downloaded_media directory. The _Media dir_ dropdown at the top of the screen lets you select the media type. It's generally recommended to use _screenshots_ or _covers_ or you can skip this step altogether as most of these icons are pretty low resolution anyway.
To populate the _androidapps_ and _androidgames_ system directories press the save icon in the upper right corner of the screen and select your ROMs directory from the selector interface. For example this could be _ROMs_ directly on internal storage, or on your SD card. Just press the _Use this folder_ button and the directories and files will be generated for you. Now you can start ES-DE and launch these apps and games directly.
Note that it seems like ES Applauncher has issues working correctly on some Android 10 devices.
It's also possible to scrape Android apps and games using ScreenScraper, but at the time of writing the amount of entries in their database is somehow limited. It's therefore encouraged to participate in improving this situation by contributing metadata and media to their database, this will benefit everyone in the long run.
A built-in import tool for native Android apps and games is also planned for a future ES-DE release.
## Running ES-DE as the Android home app
To run ES-DE as the home app (launcher) you'll select it accordingly from the Apps section of the Android Settings app. When in this mode the ability to quit the app is completely disabled as it doesn't make sense to exit the home app. Therefore the _Quit ES-DE_ entry on the main menu is removed and the _Back button/back swipe exits app_ option in the _Other settings_ menu and its corresponding functionality is disabled.
Apart from this it works as you'd expect, ES-DE will start automatically when rebooting the device and pressing the home button will return to ES-DE regardless of which app you have running.
If the operating system runs out of memory when a game is running it will kill ES-DE even if it's set as home app. If this happens ES-DE will reload whenever you return from the game or if you press the home button. This is simply how Android works.
It's generally a very good idea to import your native Android apps into ES-DE prior to setting it as the home app, this way you can easily access things like the Settings app. Note however that even if you somehow lock yourself out of the system by setting ES-DE as the home app and not having any native apps added you can still always access the Settings app via the Android notification shade. On most devices you access this by swiping down from the top of the screen. After swiping down, just select the cogwheel icon to start the Settings app. From there you can change the home app to something else than ES-DE, should you need to.
## Known ES-DE problems
In addition to the issues specific to the Ayn Odin 2 there are a couple of other problems that will hopefully be resolved in the near future:
* Poor performance/low frame rate after startup on some devices, which seems to happen randomly and is usually resolved by itself within 10 to 30 seconds.
* The Android soft keyboard causes rendering issues when navigating using a controller or physical keyboard, as such the ES-DE built-in keyboard is enabled by default for the time being. For testing purposes the Android soft keyboard can be enabled via the _Enable virtual keyboard_ option in the _UI settings_ menu. If only using touch input the issue is not present. This problem is believed to be caused by a bug in the SDL library so it probably needs to be resolved there.
* Using a mounted USB storage device for the ES-DE and/or ROMs directories will lead to the configurator exiting after finishing the setup instead of launching ES-DE. Restarting ES-DE manually will lead to a successful startup. If the option to create the system directories was selected in the configurator then this will have to be executed again from inside ES-DE. Note that using a mounted USB storage device leads to a very crippled setup anyway, as for example RetroArch can't read any games from such devices (i.e. from the /mnt/media_rw/ directory tree). Only emulators supporting scoped storage will be usable in such a setup.
@ -176,9 +196,10 @@ Below are specific instructions and considerations for all supported emulators.
### RetroArch
The RetroArch release from the Google Play store is problematic. It does not contain all emulator cores and a number of people have reported issues launching games from ES-DE (apparently it doesn't work at all on some devices). For these reasons it's strongly recommended to use the 64-bit release from the RetroArch website instead, or to install it from the Amazon Appstore or the F-Droid store.
The RetroArch release from the Google Play store is problematic. It does not contain all emulator cores and a number of people have reported issues launching games from ES-DE (apparently it doesn't work at all on some devices). For these reasons it's strongly recommended to use the 64-bit release from the RetroArch website instead, or to install it from the Samsung Galaxy Store, Amazon Appstore or the F-Droid store.
https://retroarch.com \
https://galaxystore.samsung.com/detail/com.retroarch \
https://www.amazon.com/dp/B09753XRVF \
https://f-droid.org/en/packages/com.retroarch
@ -194,8 +215,9 @@ https://github.com/Trixarian/NetherSX2-patch
### Citra
The Citra emulator is no longer in active development and it's unclear where it can be obtained and whether it will be worked on in the future. The Citra MMJ fork is still available for download from their GitHub site.
The original Citra emulator project is no longer alive, but there is a fork that should work as a drop-in replacement. The Citra MMJ fork is also a viable alternative. Both of these emulators are available for download from their GitHub sites.
https://github.com/PabloMK7/citra/releases \
https://github.com/weihuoya/citra/releases
### ColEm
@ -213,7 +235,7 @@ The Play store version is somehow up to date and could be used, otherwise the F-
https://play.google.com/store/apps/details?id=org.dolphinemu.dolphinemu \
https://f-droid.org/en/packages/org.dolphinemu.dolphinemu \
https://dolphin-emu.org/download/
https://dolphin-emu.org/download
### Dolphin MMJR and MMJR2
@ -229,6 +251,12 @@ This emulator can be installed from the Play store as a paid app. Note that it d
https://play.google.com/store/apps/details?id=com.dsemu.drastic
### DroidArcadia
This emulator can be downloaded directly from their website.
http://amigan.1emu.net/releases
### DuckStation
The Play store version of this emulator is getting frequent updates and is therefore recommended.
@ -296,10 +324,26 @@ This emulator can be installed from the Play store.
https://play.google.com/store/apps/details?id=com.fms.ines.free
### IrataJaguar
This Atari Jaguar emulator can be downloaded from their website. Just be aware that it's very old and has not been updated for modern Android releases, so it may be finicky on some devices or it may not work at all.
After installing the emulator, open it and go to the settings tab, then choose "Select ISO and BIOS directory" and navigate to the ROMs/atarijaguar folder. It seems like you also need to start the game from inside the emulator before you can run it from ES-DE. Starting a game will create a savestate file. If you now exit the emulator and run the game from ES-DE you'll see a list of savestate files, just select the correct one to start the game.
http://www.arts-union.ru/node/23
### Lime3DS
This emulator which is forked from Citra can be downloaded from their GitHub site.
https://github.com/Lime3DS/Lime3DS/releases
### MAME4droid 2024 and MAME4droid
These emulators can be installed from the Play store. It's strongly recommended to go for the _MAME4droid 2024_ version as this is updated with a recent MAME release while the older _MAME4droid_ is using an ancient MAME release.
Note that for MAME4droid 2024 there's an exception when it comes to setting up the ROM path. Instead of selecting each separate system directory (as is done on most other standalone emulators) you must select the root of the ROMs directory tree. To change the ROM path open _Settings_ in MAME4droid 2024, then select _General_ and then _Change ROMs path_. After restarting the emulator choose _External storage_ and then the ROMs directory which contains all your ES-DE system directories. If you instead choose a specific system directory like ROMs/arcade or ROMs/neogeo then only that specific system will work when launching games from ES-DE.
https://play.google.com/store/apps/details?id=com.seleuco.mame4d2024 \
https://play.google.com/store/apps/details?id=com.seleuco.mame4droid
@ -331,7 +375,7 @@ https://github.com/mupen64plus-ae/mupen64plus-ae/actions
### My Boy! and My OldBoy!
These emulators can be installed from the Play store as paid apps. There are also free/Lite versions availble for these emulators but they have not been updated in years and don't run on modern devices. As such they are not supported by ES-DE.
These emulators can be installed from the Play store as paid apps. There are also free/Lite versions available for these emulators but they have not been updated in years and don't run on modern devices. As such they are not supported by ES-DE.
https://play.google.com/store/apps/details?id=com.fastemulator.gba \
https://play.google.com/store/apps/details?id=com.fastemulator.gbc
@ -345,7 +389,7 @@ https://github.com/proninyaroslav/nesoid/releases
### OpenBOR
Although OpenBOR is working fine on Android it's not possible to properly integrate it with a frontend, you'll instead need to install your game PAKs into the `/sdcard/OpenBOR/Paks` directory and create dummy .openbor files for your games in `ROMs/openbor` and after launching a game from ES-DE you need to manually start it from inside the OpenBOR GUI. There are more detailed setup instructions in the _OpenBOR_ section of the [User guide](USERGUIDE-DEV.md#openbor).
Although OpenBOR is working fine on Android it's not possible to properly integrate it with a frontend, you'll instead need to install your game PAKs into the `/sdcard/OpenBOR/Paks` directory and create dummy .openbor files for your games in `ROMs/openbor` and after launching a game from ES-DE you need to manually start it from inside the OpenBOR GUI. There are more detailed setup instructions in the _OpenBOR_ section of the [User guide](USERGUIDE.md#openbor).
You can download OpenBOR from their GitHub site, the version named _OpenBOR v3.0 Build 6391_ has for example been proven to work well.
@ -359,9 +403,13 @@ https://github.com/wheremyfoodat/Panda3DS/releases
### Pizza Boy GBA and Pizza Boy GBC
The Pizza Boy GBA and Pizza Boy GBC emulators used to be available on the Play store but have since been taken down. There used to be Basic (free) versions and Pro (paid) versions. It's unclear what the status is for these emulators and if they are still in active development. It's also unclear where they can be downloaded.
The Pizza Boy GBA and Pizza Boy GBC emulators can be installed from the Play store. There are Basic (free) versions and Pro (paid) versions available.
As of writing this, the Basic version of the GBA emulator does not seem to be able to launch games from ES-DE, but the Pro version is working fine. Both the Basic and Pro versions of the GBC emulator are working correctly.
As of writing this, the latest available Basic version of the GBA emulator does not seem to be able to launch games from ES-DE, but the Pro version is working fine. Both the Basic and Pro versions of the GBC emulator are working correctly.
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboygba \
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboygbapro \
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboy \
https://play.google.com/store/apps/details?id=it.dbtecno.pizzaboypro
### Play!
@ -400,6 +448,12 @@ This emulator can be installed for free from the Play store and can later be upg
https://play.google.com/store/apps/details?id=io.recompiled.redream
### ScummVM
ScummVM can be installed from the Play store. There are also daily builds available on their GitHub site. Such a build may be required to be able to launch games from ES-DE until the Play store version has been updated.
https://play.google.com/store/apps/details?id=org.scummvm.scummvm\
https://buildbot.scummvm.org/#/dailybuilds
### Skyline
@ -416,12 +470,26 @@ Although this emulator supports both the Sinclar ZX Spectrum and MGT SAM Coupé
https://play.google.com/store/apps/details?id=com.fms.speccy \
https://play.google.com/store/apps/details?id=com.fms.speccy.deluxe
### Visual Pinball
Although Visual Pinball is working fine on Android it's not possible to properly integrate it with a frontend, you'll instead need to install your tables inside the app and create dummy .vpinball files for your games in ROMs/vpinball and after launching a table from ES-DE you need to manually start it from inside the Visual Pinball GUI. There are more detailed setup instructions in the Visual Pinball section of the User guide.
You can download Visual Pinball from their GitHub automatic build system.
https://github.com/vpinball/vpinball/actions
### Vita3K
This PlayStation Vita emulator can be downloaded from their GitHub site. Refer to the User guide for detailed game setup instructions.
https://github.com/Vita3K/Vita3K-Android/releases
### Yaba Sanshiro 2
This emulator can be installed from the Play store. Note that only the paid Pro version supports game launching from ES-DE. Also note that .bin/.cue files can't be launched for the time being, only .chd files seem to work. This needs to be fixed in the emulator so nothing can be done in ES-DE to work around that limitation.
https://play.google.com/store/apps/details?id=org.devmiyax.yabasanshioro2.pro
## Device compatibility
This is clearly not a complete list of Android devices, but rather those we know have been tested with ES-DE and for which there is a known status.
@ -429,16 +497,18 @@ This is clearly not a complete list of Android devices, but rather those we know
| Manufacturer | Model | Android release | Supported | Known issues | Comment |
| :----------- | :---------------------- | :-------------- | :-------- | :------------------ | :------------------------- |
| Abxylute | One | 12 | Yes | None | |
| Alldocube | iPlay50 mini Pro | 13 | Yes | None | |
| Anbernic | RG353V | 11 | Yes | None | |
| Anbernic | RG405M | 12 | Yes | None | Limited RAM capacity for this device makes it unsuitable for demanding themes and large game collections |
| Anbernic | RG405V | 12 | Yes | None | Limited RAM capacity for this device makes it unsuitable for demanding themes and large game collections |
| Anbernic | RG505 | 12 | Yes | None | Limited RAM capacity for this device makes it unsuitable for demanding themes and large game collections |
| Anbernic | RG556 | 13 | Yes | None | |
| Anbernic | RG ARC | 12 | Yes | None | LineageOS |
| Ayaneo | Pocket Air | 12 | Yes | None | |
| AYANEO | Pocket Air | 12 | Yes | None | |
| AYANEO | Pocket S | 13 | Yes | None | |
| Ayn | Odin (Base/Pro) | 10 | Yes | None | |
| Ayn | Odin Lite | 11 | Yes | None | |
| Ayn | Odin 2 (Base/Pro/Max) | 13 | Yes | Can't launch some emulators,<br>Minor audio issues | Bugs in the firmware/OS image |
| Ayn | Odin 2 (Base/Pro/Max) | 13 | Yes | Minor audio issues | |
| Google | Pixel 2 XL | 11 | Yes | None | |
| Google | Pixel 3 XL | 12 | Yes | None | |
| Google | Pixel 4a | 13 | Yes | None | |
@ -458,6 +528,7 @@ This is clearly not a complete list of Android devices, but rather those we know
| Huawei | MatePad 11 (2021) | 13 | Yes | None | |
| Infinix | Zero 30 5G | 13 | Yes | None | |
| Kinhank | G1 | 11 | No | Unable to install | Possibly 32-bit operating system? |
| Kinhank | Super Console X5 Pro | 12 (TV) | No | Fails at configurator/onboarding | Seems to run a custom 64-bit Android TV OS |
| Lenovo | Legion Y700 (2022) | 12 | Yes | None | |
| Lenovo | Legion Y700 (2023) | 13 | Yes | None | |
| Lenovo | Xiaoxin Pad Pro 2021 | 11 | Yes | None | |
@ -542,93 +613,95 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| System name | Full name | Default emulator | Alternative emulators | Needs BIOS | Recommended game setup |
| :-------------------- | :--------------------------------------------- | :-------------------------------- | :-------------------------------- | :----------- | :----------------------------------- |
| 3do | 3DO Interactive Multiplayer | Opera | Real3DOPlayer **(Standalone)** | Yes | |
| adam | Coleco Adam | ColEm **(Standalone)** | | No | |
| adam | Coleco Adam | MAME4droid 2024 [Diskette] **(Standalone)** | MAME4droid 2024 [Tape] **(Standalone)**,<br>MAME4droid 2024 [Cartridge] **(Standalone)**,<br>MAME4droid 2024 [Software list] **(Standalone)**,<br>ColEm **(Standalone)** | Yes for MAME4droid 2024 | |
| ags | Adventure Game Studio Game Engine | _Placeholder_ | | | |
| amiga | Commodore Amiga | PUAE | PUAE 2021 | Yes | |
| amiga1200 | Commodore Amiga 1200 | PUAE | PUAE 2021 | Yes | |
| amiga600 | Commodore Amiga 600 | PUAE | PUAE 2021 | Yes | |
| amigacd32 | Commodore Amiga CD32 | PUAE | PUAE 2021 | Yes | |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS | No | Single archive or disk file |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS,<br>MAME4droid 2024 **(Standalone)** | Yes for MAME4droid 2024 | Single archive or disk file |
| android | Google Android | _Placeholder_ | | | |
| apple2 | Apple II | _Placeholder_ | | | |
| apple2gs | Apple IIGS | _Placeholder_ | | | |
| arcade | Arcade | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | |
| arcadia | Emerson Arcadia 2001 | _Placeholder_ | | | |
| archimedes | Acorn Archimedes | _Placeholder_ | | | |
| androidapps | Android Apps | _Native apps_ | | No | |
| androidgames | Android Games | _Native apps_ | | No | |
| apple2 | Apple II | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Apple II_ section in the user guide |
| apple2gs | Apple IIGS | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Apple IIGS_ section in the user guide |
| arcade | Arcade | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | See the specific _Arcade and Neo Geo_ section in the user guide |
| arcadia | Emerson Arcadia 2001 | DroidArcadia **(Standalone**) | MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| archimedes | Acorn Archimedes | MAME4droid 2024 [Model A440/1] **(Standalone)** | MAME4droid 2024 [Model A3000] **(Standalone)**,<br>MAME4droid 2024 [Model A310] **(Standalone)**,<br>MAME4droid 2024 [Model A540] **(Standalone)** | Yes | |
| arduboy | Arduboy Miniature Game System | Arduous | | No | Single archive or .hex file |
| astrocde | Bally Astrocade | _Placeholder_ | | | |
| astrocde | Bally Astrocade | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| atari2600 | Atari 2600 | Stella | Stella 2014,<br>2600.emu **(Standalone)** | No | Single archive or ROM file |
| atari5200 | Atari 5200 | a5200 | Atari800 | Yes | Single archive or ROM file |
| atari7800 | Atari 7800 ProSystem | ProSystem | | Yes | Single archive or ROM file |
| atari7800 | Atari 7800 ProSystem | ProSystem | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| atari800 | Atari 800 | Atari800 | | Yes | |
| atarijaguar | Atari Jaguar | Virtual Jaguar | | No | |
| atarijaguar | Atari Jaguar | Virtual Jaguar | IrataJaguar **(Standalone)**,<br>MAME4droid 2024 **(Standalone)** | Yes for MAME4droid 2024 | Single archive or ROM file |
| atarijaguarcd | Atari Jaguar CD | _Placeholder_ | | | |
| atarilynx | Atari Lynx | Handy | Beetle Lynx,<br>Lynx.emu **(Standalone)** | No | Single archive or ROM file |
| atarist | Atari ST [also STE and Falcon] | Hatari | | Yes | Single archive or image file for single-diskette games, .m3u playlist for multi-diskette games |
| atarixe | Atari XE | Atari800 | | Yes | |
| atomiswave | Sammy Corporation Atomiswave | Flycast | Flycast **(Standalone)** | Depends | Single archive file |
| bbcmicro | Acorn Computers BBC Micro | _Placeholder_ | | | |
| bbcmicro | Acorn Computers BBC Micro | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or diskette image file |
| c64 | Commodore 64 | VICE x64sc Accurate | VICE x64 Fast,<br>VICE x64 SuperCPU,<br>VICE x128,<br>C64.emu **(Standalone)** | 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 | | Yes | Single .bin/.cue pair |
| cdimono1 | Philips CD-i | SAME CDi | MAME4droid 2024 **(Standalone)** | Yes | Single .bin/.cue pair |
| cdtv | Commodore CDTV | PUAE | PUAE 2021 | Yes | |
| chailove | ChaiLove Game Engine | ChaiLove | | | |
| channelf | Fairchild Channel F | FreeChaF | | Yes | Single archive or ROM file |
| coco | Tandy Color Computer | _Placeholder_ | | | |
| channelf | Fairchild Channel F | FreeChaF | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| coco | Tandy Color Computer | MAME4droid 2024 [Cartridge] **(Standalone)** | MAME4droid 2024 [Tape] **(Standalone)** | Yes | See the specific _Tandy Color Computer_ section in the user guide |
| colecovision | Coleco ColecoVision | blueMSX | Gearcoleco,<br>MSX.emu **(Standalone)**,<br>ColEm **(Standalone)** | Yes | Single archive or ROM file |
| consolearcade | Console Arcade Systems | _Placeholder_ | | | |
| cps | Capcom Play System | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>FB Alpha 2012 CPS-3 | Depends | |
| cps1 | Capcom Play System I | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1 | Depends | |
| cps2 | Capcom Play System II | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-2 | Depends | |
| cps3 | Capcom Play System III | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-3 | Depends | |
| crvision | VTech CreatiVision | _Placeholder_ | | | |
| daphne | Daphne Arcade LaserDisc Emulator | DirkSimple | | No | |
| consolearcade | Console Arcade Systems | MAME - Current | MAME4droid 2024 **(Standalone)**,<br>Flycast,<br>Flycast **(Standalone)**,<br>Play! **(Standalone)** | Depends | See the specific _Console Arcade Systems_ section in the user guide |
| cps | Capcom Play System | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>FB Alpha 2012 CPS-3 | Depends | |
| cps1 | Capcom Play System I | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1 | Depends | |
| cps2 | Capcom Play System II | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-2 | Depends | |
| cps3 | Capcom Play System III | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-3 | Depends | |
| crvision | VTech CreatiVision | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| daphne | Daphne Arcade LaserDisc Emulator | MAME4droid 2024 **(Standalone)** | DirkSimple | Depends | See the specific _LaserDisc Games_ section in the user guide |
| desktop | Desktop Applications | _Placeholder_ | | | |
| doom | Doom | PrBoom | | No | |
| dos | DOS (PC) | DOSBox-Pure | DOSBox-Core,<br>DOSBox-SVN | No | |
| dragon32 | Dragon Data Dragon 32 | _Placeholder_ | | | |
| dreamcast | Sega Dreamcast | Flycast | Flycast **(Standalone)**,<br>Redream **(Standalone)** | No | In separate folder interpreted as a file, with .m3u playlist if multi-disc game |
| easyrpg | EasyRPG Game Engine | EasyRPG | | No | |
| electron | Acorn Electron | _Placeholder_ | | | |
| emulators | Emulators | _Placeholder_ | | | |
| electron | Acorn Electron | MAME4droid 2024 [Tape] **(Standalone)** | MAME4droid 2024 [Diskette DFS] **(Standalone)**,<br>MAME4droid 2024 [Diskette ADFS] **(Standalone)** | Yes | Single archive, or single tape or diskette image file |
| emulators | Emulators | _Native apps_ | | No | |
| epic | Epic Games Store | _Placeholder_ | | | |
| famicom | Nintendo Family Computer | Mesen | Nestopia UE,<br>FCEUmm,<br>QuickNES,<br>NES.emu **(Standalone)**,<br>iNES **(Standalone)**,<br>Nesoid **(Standalone)** | No | Single archive or ROM file |
| fba | FinalBurn Alpha | FB Alpha 2012 | FB Alpha 2012 Neo Geo,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>FB Alpha 2012 CPS-3 | Yes | |
| fbneo | FinalBurn Neo | FinalBurn Neo | | Yes | |
| fds | Nintendo Famicom Disk System | Mesen | Nestopia UE,<br>FCEUmm,<br>NES.emu **(Standalone)**,<br>iNES **(Standalone)**,<br>Nesoid **(Standalone)** | Yes | Single archive or ROM file |
| flash | Adobe Flash | Ruffle **(Standalone)** | | No | Single .swf file |
| fm7 | Fujitsu FM-7 | _Placeholder_ | | | |
| fmtowns | Fujitsu FM Towns | _Placeholder_ | | | |
| fm7 | Fujitsu FM-7 | MAME4droid 2024 [FM-7 Diskette] **(Standalone)** | MAME4droid 2024 [FM-7 Tape] **(Standalone)**,<br>MAME4droid 2024 [FM-7 Software list] **(Standalone)**,<br>MAME4droid 2024 [FM77AV Diskette] **(Standalone)**,<br>MAME4droid 2024 [FM77AV Tape] **(Standalone)**,<br>MAME4droid 2024 [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 | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Fujitsu FM Towns_ section in the user guide |
| fpinball | Future Pinball | _Placeholder_ | | | |
| gamate | Bit Corporation Gamate | _Placeholder_ | | | |
| gameandwatch | Nintendo Game and Watch | Multi (MESS) | MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | Single archive or ROM file |
| gamecom | Tiger Electronics Game.com | _Placeholder_ | | | |
| gamate | Bit Corporation Gamate | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| gameandwatch | Nintendo Game and Watch | Multi (MESS) | MAME4droid 2024 Local Artwork **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section in the user guide |
| gamecom | Tiger Electronics Game.com | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| gamegear | Sega Game Gear | Genesis Plus GX | Genesis Plus GX Wide,<br>Gearsystem,<br>SMS Plus GX,<br>PicoDrive,<br>MasterGear **(Standalone)** | No | Single archive or ROM file |
| gb | Nintendo Game Boy | Gambatte | SameBoy,<br>Gearboy,<br>TGB Dual,<br>DoubleCherryGB,<br>Mesen-S,<br>bsnes,<br>mGBA,<br>VBA-M,<br>GBC.emu **(Standalone)**,<br>My OldBoy! **(Standalone**),<br>Pizza Boy GBC **(Standalone)** | No | Single archive or ROM file |
| gba | Nintendo Game Boy Advance | mGBA | VBA-M,<br>VBA Next,<br>gpSP,<br>GBA.emu **(Standalone)**,<br>My Boy! **(Standalone)**,<br>Pizza Boy GBA **(Standalone)** | No | Single archive or ROM file |
| gbc | Nintendo Game Boy Color | Gambatte | SameBoy,<br>Gearboy,<br>TGB Dual,<br>DoubleCherryGB,<br>Mesen-S,<br>bsnes,<br>mGBA,<br>VBA-M,<br>GBC.emu **(Standalone)**,<br>My OldBoy! **(Standalone**),<br>Pizza Boy GBC **(Standalone)** | No | Single archive or ROM file |
| gc | Nintendo GameCube | Dolphin | Dolphin **(Standalone)**,<br>Dolphin MMJR **(Standalone)**,<br>Dolphin MMJR2 **(Standalone)** | No | Disc image file for single-disc games, .m3u playlist for multi-disc games |
| genesis | Sega Genesis | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | No | Single archive or ROM file |
| gmaster | Hartung Game Master | _Placeholder_ | | | |
| gx4000 | Amstrad GX4000 | Caprice32 | CrocoDS | No | Single archive or ROM file |
| intellivision | Mattel Electronics Intellivision | FreeIntv | | Yes | Single archive or ROM file |
| gmaster | Hartung Game Master | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| gx4000 | Amstrad GX4000 | Caprice32 | CrocoDS,<br>MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| intellivision | Mattel Electronics Intellivision | FreeIntv | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| j2me | Java 2 Micro Edition (J2ME) | SquirrelJME | | No | Single .jar file |
| kodi | Kodi Home Theatre Software | _Placeholder_ | | | |
| laserdisc | LaserDisc Games | DirkSimple | | No | |
| lcdgames | LCD Handheld Games | Multi (MESS) | MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | Single archive or ROM file |
| laserdisc | LaserDisc Games | MAME4droid 2024 **(Standalone)** | DirkSimple | Depends | See the specific _LaserDisc Games_ section in the user guide |
| lcdgames | LCD Handheld Games | Multi (MESS) | MAME4droid 2024 Local Artwork **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>Handheld Electronic (GW) | No | See the specific _LCD handheld games_ section in the user guide |
| lowresnx | LowRes NX Fantasy Console | LowRes NX | | No | Single ROM file |
| lutris | Lutris Open Gaming Platform | _Placeholder_ | | | |
| lutro | Lutro Game Engine | Lutro | | | |
| macintosh | Apple Macintosh | _Placeholder_ | | | |
| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | |
| macintosh | Apple Macintosh | MAME4droid 2024 Mac SE Bootable **(Standalone)** | MAME4droid 2024 Mac SE Boot Disk **(Standalone)**,<br>MAME4droid 2024 Mac Plus Bootable **(Standalone)**,<br>MAME4droid 2024 Mac Plus Boot Disk **(Standalone)** | Yes | See the specific _Apple Macintosh_ section in the user guide |
| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)**,<br>NEO.emu **(Standalone)**,<br>FinalBurn Neo,<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)** | Depends | See the specific _Arcade and Neo Geo_ section in the user guide |
| mame-advmame | AdvanceMAME | _Placeholder_ | | | |
| mastersystem | Sega Master System | Genesis Plus GX | Genesis Plus GX Wide,<br>SMS Plus GX,<br>Gearsystem,<br>PicoDrive,<br>MD.emu **(Standalone)**,<br>MasterGear **(Standalone)** | No | Single archive or ROM file |
| megacd | Sega Mega-CD | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | Yes | |
| megacdjp | Sega Mega-CD [Japan] | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | Yes | |
| megadrive | Sega Mega Drive | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | No | Single archive or ROM file |
| megadrivejp | Sega Mega Drive [Japan] | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>MD.emu **(Standalone)** | No | Single archive or ROM file |
| megaduck | Creatronic Mega Duck | SameDuck | | No | Single archive or ROM file |
| mess | Multi Emulator Super System | Multi (MESS) | | | |
| model2 | Sega Model 2 | MAME - Current | | Yes | |
| megaduck | Creatronic Mega Duck | SameDuck | MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| mess | Multi Emulator Super System | Multi (MESS) | | Depends | |
| model2 | Sega Model 2 | MAME - Current | MAME4droid 2024 **(Standalone)** | Yes | See the specific _Arcade and Neo Geo_ section in the user guide |
| model3 | Sega Model 3 | _Placeholder_ | | | |
| moto | Thomson MO/TO Series | Theodore | | | |
| msx | MSX | blueMSX | fMSX,<br>fMSX **(Standalone)**,<br>MSX.emu **(Standalone)** | Yes except for fMSX standalone | |
@ -640,20 +713,20 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| naomi | Sega NAOMI | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomi2 | Sega NAOMI 2 | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomigd | Sega NAOMI GD-ROM | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| n3ds | Nintendo 3DS | Citra | Citra **(Standalone)**,<br>Citra Canary **(Standalone)**,<br>Citra MMJ **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n3ds | Nintendo 3DS | Citra | Citra **(Standalone)**,<br>Citra Canary **(Standalone)**,<br>Citra MMJ **(Standalone)**,<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n64 | Nintendo 64 | Mupen64Plus-Next | M64Plus FZ **(Standalone)**,<br>Mupen64Plus AE **(Standalone)**,<br>ParaLLEl N64 | No | Single archive or ROM file |
| n64dd | Nintendo 64DD | Mupen64Plus-Next | M64Plus FZ **(Standalone)**,<br>Mupen64Plus AE **(Standalone)**,<br>ParaLLEl N64 | Yes | |
| nds | Nintendo DS | melonDS DS | melonDS **(Standalone)**,<br>melonDS Nightly **(Standalone)**,<br>DeSmuME,<br>DeSmuME 2015,<br>DraStic **(Standalone)** | No | Single archive or ROM file |
| neogeo | SNK Neo Geo | FinalBurn Neo | Geolith,<br>NEO.emu **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)** | Yes | Single archive or ROM file |
| neogeocd | SNK Neo Geo CD | NeoCD | FinalBurn Neo | Yes | |
| neogeocdjp | SNK Neo Geo CD [Japan] | NeoCD | FinalBurn Neo | Yes | |
| nds | Nintendo DS | melonDS DS | melonDS,<br>melonDS **(Standalone)**,<br>melonDS Nightly **(Standalone)**,<br>DeSmuME,<br>DeSmuME 2015,<br>DraStic **(Standalone)** | No | Single archive or ROM file |
| neogeo | SNK Neo Geo | FinalBurn Neo | Geolith,<br>NEO.emu **(Standalone)**,<br>MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)** | Yes | See the specific _Arcade and Neo Geo_ section in the user guide |
| neogeocd | SNK Neo Geo CD | NeoCD | FinalBurn Neo,<br>MAME4droid 2024 **(Standalone)** | Yes | .chd (NeoCD and MAME4droid 2024 only) or .cue file |
| neogeocdjp | SNK Neo Geo CD [Japan] | NeoCD | FinalBurn Neo,<br>MAME4droid 2024 **(Standalone)** | Yes | .chd (NeoCD and MAME4droid 2024 only) or .cue file |
| nes | Nintendo Entertainment System | Mesen | Nestopia UE,<br>FCEUmm,<br>QuickNES,<br>NES.emu **(Standalone)**,<br>iNES **(Standalone)**,<br>Nesoid **(Standalone)** | No | Single archive or ROM file |
| ngage | Nokia N-Gage | EKA2L1 **(Standalone)** | | Yes | See the specific _Symbian and Nokia N-Gage_ section in the User guide |
| ngp | SNK Neo Geo Pocket | Beetle NeoPop | RACE,<br>NGP.emu **(Standalone)** | No | Single archive or ROM file |
| ngpc | SNK Neo Geo Pocket Color | Beetle NeoPop | RACE,<br>NGP.emu **(Standalone)** | No | Single archive or ROM file |
| odyssey2 | Magnavox Odyssey 2 | O2EM | | Yes | Single archive or ROM file |
| odyssey2 | Magnavox Odyssey 2 | O2EM | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| openbor | OpenBOR Game Engine | OpenBOR **(Standalone)** | | No | See the specific _OpenBOR_ section in the User guide |
| oric | Tangerine Computer Systems Oric | _Placeholder_ | | | |
| oric | Tangerine Computer Systems Oric | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Tangerine Computer Systems Oric_ section in the user guide |
| palm | Palm OS | Mu | | | |
| pc | IBM PC | DOSBox-Pure | DOSBox-Core,<br>DOSBox-SVN | No | |
| pc88 | NEC PC-8800 Series | QUASI88 | | Yes | |
@ -672,14 +745,14 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| psp | Sony PlayStation Portable | PPSSPP | PPSSPP **(Standalone)** | No | Single disc image file |
| psvita | Sony PlayStation Vita | Vita3K **(Standalone)** | | Yes | See the specific _Sony PlayStation Vita_ section in the User guide |
| psx | Sony PlayStation | Beetle PSX | Beetle PSX HW,<br>PCSX ReARMed,<br>SwanStation,<br>DuckStation **(Standalone)**,<br>ePSXe **(Standalone)**,<br>FPseNG **(Standalone)**,<br>FPse **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
| pv1000 | Casio PV-1000 | _Placeholder_ | | | |
| pv1000 | Casio PV-1000 | MAME4droid 2024 **(Standalone)** | | No | Single archive or ROM file |
| quake | Quake | TyrQuake | vitaQuake 2,<br>vitaQuake 2 [Rogue],<br>vitaQuake 2 [Xatrix],<br>vitaQuake 2 [Zaero] | No | |
| samcoupe | MGT SAM Coupé | Speccy **(Standalone)** | | No | Single archive or ROM file |
| satellaview | Nintendo Satellaview | Snes9x - Current | Snes9x 2010,<br>Snes9x 2005 Plus,<br>Snes9x EX+ **(Standalone)**,<br>bsnes,<br>bsnes-hd,<br>bsnes-mercury Accuracy,<br>Mesen-S | | |
| saturn | Sega Saturn | Beetle Saturn | YabaSanshiro,<br>Yabause,<br>Saturn.emu **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
| saturnjp | Sega Saturn [Japan] | Beetle Saturn | YabaSanshiro,<br>Yabause,<br>Saturn.emu **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
| scummvm | ScummVM Game Engine | ScummVM | | No | |
| scv | Epoch Super Cassette Vision | _Placeholder_ | | | |
| saturn | Sega Saturn | Beetle Saturn | YabaSanshiro,<br>Yaba Sanshiro 2 **(Standalone)**,<br>Yabause,<br>Saturn.emu **(Standalone)** | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
| saturnjp | Sega Saturn [Japan] | Beetle Saturn | YabaSanshiro,<br>Yaba Sanshiro 2 **(Standalone)**,<br>Yabause,<br>Saturn.emu **(Standalone)** | 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 in the user guide |
| scv | Epoch Super Cassette Vision | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| sega32x | Sega Mega Drive 32X | PicoDrive | | No | Single archive or ROM file |
| sega32xjp | Sega Super 32X [Japan] | PicoDrive | | No | Single archive or ROM file |
| sega32xna | Sega Genesis 32X [North America] | PicoDrive | | No | Single archive or ROM file |
@ -695,26 +768,26 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| stv | Sega Titan Video Game System | MAME - Current | MAME4droid 2024 **(Standalone)**,<br>MAME4droid **(Standalone)** | Yes | Single archive file |
| sufami | Bandai SuFami Turbo | Snes9x - Current | Snes9x 2010,<br>Snes9x 2005 Plus,<br>Snes9x EX+ **(Standalone)**,<br>bsnes,<br>bsnes-hd,<br>bsnes-mercury Accuracy | | |
| supergrafx | NEC SuperGrafx | Beetle SuperGrafx | Beetle PCE,<br>PCE.emu **(Standalone)** | No | Single archive or ROM file |
| supervision | Watara Supervision | Potator | | No | Single archive or ROM file |
| supracan | Funtech Super A'Can | _Placeholder_ | | | |
| supervision | Watara Supervision | Potator | MAME4droid 2024 **(Standalone)** | No | Single archive or ROM file |
| supracan | Funtech Super A'Can | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file. You need a supracan.zip archive that contains a valid internal_68k.bin file and an empty file named umc6650.bin |
| switch | Nintendo Switch | Skyline **(Standalone)** | | Yes | |
| symbian | Symbian | EKA2L1 **(Standalone)** | | Yes | See the specific _Symbian and Nokia N-Gage_ section in the User guide |
| tanodragon | Tano Dragon | _Placeholder_ | | | |
| tg16 | NEC TurboGrafx-16 | Beetle PCE | Beetle PCE FAST,<br>Beetle SuperGrafx,<br>PCE.emu **(Standalone)** | No | Single archive or ROM file |
| tg-cd | NEC TurboGrafx-CD | Beetle PCE | Beetle PCE FAST,<br>Beetle SuperGrafx,<br>PCE.emu **(Standalone)** | Yes | |
| ti99 | Texas Instruments TI-99 | _Placeholder_ | | | |
| ti99 | Texas Instruments TI-99 | MAME4droid 2024 **(Standalone)** | | Yes | See the specific _Texas Instruments TI-99_ section in the user guide |
| tic80 | TIC-80 Fantasy Computer | TIC-80 | | No | Single .tic file |
| to8 | Thomson TO8 | Theodore | | | |
| triforce | Namco-Sega-Nintendo Triforce | _Placeholder_ | | | |
| trs-80 | Tandy TRS-80 | _Placeholder_ | | | |
| type-x | Taito Type X | _Placeholder_ | | | |
| uzebox | Uzebox Open Source Console | Uzem | | | |
| vectrex | GCE Vectrex | vecx | | No | Single archive or ROM file |
| vectrex | GCE Vectrex | vecx | MAME4droid 2024 **(Standalone)** | Yes for MAME4droid 2024 | Single archive or ROM file |
| vic20 | Commodore VIC-20 | VICE xvic | | No | Single archive or tape, cartridge or diskette image file |
| videopac | Philips Videopac G7000 | O2EM | | Yes | Single archive or ROM file |
| videopac | Philips Videopac G7000 | O2EM | MAME4droid 2024 **(Standalone)** | Yes | Single archive or ROM file |
| virtualboy | Nintendo Virtual Boy | Beetle VB | | No | |
| vpinball | Visual Pinball | _Placeholder_ | | | |
| vsmile | VTech V.Smile | _Placeholder_ | | | |
| vpinball | Visual Pinball | Visual Pinball **(Standalone)** | | No | See the specific _Visual Pinball_ section in the user guide |
| vsmile | VTech V.Smile | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
| wasm4 | WASM-4 Fantasy Console | WASM-4 | | No | Single .wasm file |
| wii | Nintendo Wii | Dolphin | Dolphin **(Standalone)**,<br>Dolphin MMJR **(Standalone)**,<br>Dolphin MMJR2 **(Standalone)** | No | |
| wiiu | Nintendo Wii U | _Placeholder_ | | | |
@ -723,11 +796,11 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| windows9x | Microsoft Windows 9x | DOSBox-Pure | | No | |
| wonderswan | Bandai WonderSwan | Beetle Cygne | Swan.emu **(Standalone)** | No | Single archive or ROM file |
| wonderswancolor | Bandai WonderSwan Color | Beetle Cygne | Swan.emu **(Standalone)** | No | Single archive or ROM file |
| x1 | Sharp X1 | X Millennium | | No | Single archive or diskette/tape file |
| x68000 | Sharp X68000 | PX68k | | Yes | |
| x1 | Sharp X1 | X Millennium | MAME4droid 2024 [Diskette] **(Standalone)**,<br>MAME4droid 2024 [Tape] **(Standalone)** | Yes for MAME4droid 2024 | Single archive or diskette/tape file |
| x68000 | Sharp X68000 | PX68k | MAME4droid 2024 **(Standalone)** | Yes | |
| xbox | Microsoft Xbox | _Placeholder_ | | | |
| xbox360 | Microsoft Xbox 360 | _Placeholder_ | | | |
| zmachine | Infocom Z-machine | _Placeholder_ | | | |
| zmachine | Infocom Z-machine | MojoZork | | No | |
| zx81 | Sinclair ZX81 | EightyOne | | | |
| zxnext | Sinclair ZX Spectrum Next | _Placeholder_ | | | |
| zxspectrum | Sinclair ZX Spectrum | Fuse | Speccy **(Standalone)** | No | Single archive or ROM file |

View file

@ -1,33 +1,133 @@
# ES-DE Frontend - Changelog
## Version 3.1.0 (in development)
## Version 3.0.3 / 3.0.3-26
**Release date:** TBD
**Release date:** 2024-06-14
### Release overview
* Added the MAME 2003 RetroArch core as an alternative emulator for the arcade, cps, cps1, cps2, cps3 and mame systems
* (Linux/Unix) Changed the application summary from "Emulator Frontend" to "Gaming Frontend"
* Changed the application description to "ES-DE Frontend" for the -h/--help command line option
This release enables a lot of new systems on Android which brings this platform much closer to the desktop ports as far as system support is concerned. It also brings experimental support for setting ES-DE as the Android home app. Outside of Android a number of new features have been added to the theme engine, ES-DE can now be built for KMS/direct framebuffer access on Linux and several new emulators have been added. A couple of bugs have been fixed as well, in addition to some other minor improvements.
### Detailed list of changes
* (Android) Added experimental support for running ES-DE as the home app
* (Android) The touch overlay is no longer reset by the onboarding configurator unless the "Begin setup" button was pressed
* (Linux) Added a DEINIT_ON_LAUNCH CMake build flag to support KMS/direct framebuffer access
* Added support for the new Lime3DS binary names on Linux, macOS and Windows
* (Linux) Added support for the Flatpak release of Lime3DS
* (Android) Added support for the Apple II (apple2) game system
* (Android) Added support for the Apple IIGS (apple2gs) game system
* (Android) Added support for the Emerson Arcadia 2001 (arcadia) game system
* (Android) Added support for the Acorn Archimedes (archimedes) game system
* (Android) Added support for the Bally Astrocade (astrocde) game system
* (Android) Added support for the Acorn Computers BBC Micro (bbcmicro) game system
* (Android) Added support for the Tandy Color Computer (coco) game system
* (Android) Added support for the Console Arcade Systems (consolearcade) game system
* (Android) Added support for the VTech CreatiVision (crvision) game system
* (Android) Added support for the Acorn Electron (electron) game system
* (Android) Added support for the Emulators (emulators) game system
* (Android) Added support for the Fujitsu FM-7 (fm7) game system
* (Android) Added support for the Fujitsu FM Towns (fmtowns) game system
* (Android) Added support for the Bit Corporation Gamate (gamate) game system
* (Android) Added support for the Tiger Electronics Game.com (gamecom) game system
* (Android) Added support for the Hartung Game Master (gmaster) game system
* (Android) Added support for the Apple Macintosh (macintosh) game system
* (Android) Added support for the Tangerine Computer Systems Oric (oric) game system
* (Android) Added support for the Casio PV-1000 (pv1000) game system
* (Android) Added support for the Epoch Super Cassette Vision (scv) game system
* (Android) Added support for the Funtech Super A'Can (supracan) game system
* (Android) Added support for the Texas Instruments TI-99 (ti99) game system
* (Android) Added support for the Visual Pinball (vpinball) game system
* (Android) Added support for the VTech V.Smile (vsmile) game system
* (Android) Added support for the Infocom Z-machine (zmachine) game system
* (Android) Added MAME4droid 2024 standalone as the default emulator for the adam, daphne and laserdisc systems
* (Android) Added MAME4droid 2024 standalone as an alternative emulator for the amstradcpc, atari7800, atarijaguar and cdimono1 systems
* (Android) Added MAME4droid 2024 standalone as an alternative emulator for the channelf, gx4000, intellivision and megaduck systems
* (Android) Added MAME4droid 2024 standalone as an alternative emulator for the model2, neogeocd, neogeocdjp and odyssey2 systems
* (Android) Added MAME4droid 2024 standalone as an alternative emulator for the supervision, vectrex, videopac and x68000 systems
* (Android) Added MAME4droid 2024 Local Artwork standalone as an alternative emulator for the gameandwatch and lcdgames systems
* (Android) Added MAME4droid 2024 [Diskette] standalone and MAME4droid 2024 [Tape] standalone as alternative emulators for the x1 system
* (Android) Defined explicit ROM paths for MAME4droid 2024 for the arcade, cps, cps1, cps2, cps3, mame, neogeo and stv systems
* (Android) Added ScummVM standalone as an alternative emulator for the scummvm system
* (Android) Added IrataJaguar standalone as an alternative emulator for the atarijaguar system
* (Android) Added the melonDS RetroArch core as an alternative emulator for the nds system
* Added the MojoZork RetroArch core as the default emulator for the zmachine system
* Added MAME standalone as the default emulator for the oric system on Linux, macOS and Windows
* Added MAME [Cartridge] standalone and MAME [Tape] standalone as alternative emulator entries for the coco system
* Added ACE-DL standalone as an alternative emulator for the amstradcpc system on Linux, macOS and Windows
* Added ColEm standalone as an alternative emulator for the adam and colecovision systems on Linux and Windows
* (Windows) Added WinArcadia standalone as an alternative emulator for the arcadia system
* (Windows) Added XM6 Pro-68k standalone as an alternative emulator for the x68000 system
* (Linux) Added XM6 Pro-68k Wine and XM6 Pro-68k Proton as alternative emulators for the x68000 system
* Added the "-gameio joy" option to the MAME and MAME standalone alternative emulator entries for the apple2 and apple2gs systems
* Added the "-analogue acornjoy" option to the MAME standalone emulator entry for the bbcmicro system
* Added the .elf, .tmd and .wuhb file extensions to the wiiu system on Linux, macOS and Windows
* Added support for combining a %ROM% variable with the %INJECT% variable
* (Android) Added %GAMEDIRRAW%, %ROMPATHRAW% and %ROMRAW% variables that can be used with the %EXTRA% and %EXTRAARRAY% variables
* (linear-es-de) Added startup slide animations to the default transitions animation profile
* (linear-es-de) Changed system to system transitions from fade to instant for the fade animation profile
* Added a "selectedItemOffset" property to the carousel element
* Added a "selectedBackgroundMargins" property to the textlist element
* Added a "selectedBackgroundCornerRadius" property to the textlist element
* Added a "backgroundMargins" property to the text element
* Added a "backgroundCornerRadius" property to the text element
* Added an "imageCropPos" property to the carousel element
* Added an "imageCropPos" property to the grid element
* Added a "cropPos" property to the image element
* Added a "cropPos" property to the video element
* SDL_HINT_APP_NAME is now explicitly set to "ES-DE" to display the correct name in the OS sound settings interface and similar
* (macOS) Changed the minimum required OS version from 10.15 "Catalina" to 11 "Big Sur"
### Bug fixes
## Version 3.0.1-xx (Android intermediate) (in development)
* Adding trailing directory separators to the MediaDirectory setting could make the Orphaned data cleanup utility remove too many files
* (Windows) Filenames containing multi-byte Unicode characters could not be used with the %INJECT% variable
* The texture size was sometimes calculated incorrectly for the video element when using the cropSize property
* Transition animations could sometimes partially play when switching themes with a system selected for the gamelist on startup setting
* There could be minor textlist selector clipping issues if the selector had a text background color set
**Release date:** TBD
## Version 3.0.2 / 3.0.2-21
**Release date:** 2024-05-13
### Release overview
This release improves scraping speed under some circumstances, adds experimental support on Android for launching native apps and games, adds support for a couple of new emulators and brings a number of additional minor improvements.
### Detailed list of changes
* Improved multithreading for the network code which significantly increases scraping speed under some circumstances
* (Android) Added experimental support for launching native apps and games
* Added Lime3DS standalone as an alternative emulator for the n3ds system
* (Linux) Added the native release of BigPEmu standalone as an alternative emulator for the atarijaguar system
* (Linux) Added the native release of BigPEmu standalone as the default emulator for the atarijaguarcd system
* Added the MAME 2003 RetroArch core as an alternative emulator for the arcade, cps, cps1, cps2, cps3 and mame systems
* (Android) Added Yaba Sanshiro 2 standalone as an alternative emulator for the saturn and saturnjp systems
* (Android) Changed from %ROMPROVIDER% to %ROMSAF% for MD.emu (only for megacd, megacdjp and segacd)
* (Android) Added support for the Antutu build of Citra MMJ
* Added the MAME 2003 RetroArch core as an alternative emulator for the arcade, cps, cps1, cps2, cps3 and mame systems
* (Android) Added a "Back button/back swipe exits app" menu option
* (Android) Increased the maximum waiting time for the storage mount retry loop from 4 to 4.5 seconds
* Changed the supported file extensions for the cdtv system to be the same as for the amiga systems
* Added the .car file extension to the atarixe system
* The game media directory is now created on application startup instead of when first starting the scraper
* (Linux/Unix) Changed the application summary from "Emulator Frontend" to "Gaming Frontend"
* (Windows) Changed some log entries to use backslashes instead of forward slashes as directory separators
* Windows carriage return characters are now filtered out when reading custom collection files and inject files
* Changed the application description to "ES-DE Frontend" for the -h/--help command line option
* Added support for marking themes as deprecated in the theme downloader
* Added support for the androidapps and androidgames systems to the Linear, Modern and Slate themes
* (modern-es-de) Converted all carousel icons from JPG to WebP format
* Added a User-Agent string when making non-scraper HTTP requests
* Added support for building against libgit2 v1.8.0 and later
* Updated SDL to 2.30.2 on Android, Windows, macOS and the Linux AppImage builds
* (Windows) Updated OpenSSL to 3.3.0
* Updated the MAME index files to include ROMs up to MAME version 0.265
* Bundled the March 2024 release of the Mozilla TLS/SSL certificates
### Bug fixes
* On Android 10 the Orphaned data cleanup utility removed media files which should not have been removed
* The application couldn't be built with an older SDL release than 2.0.14
## Version 3.0.1 / 3.0.1-19

View file

@ -1,6 +1,6 @@
# SPDX-License-Identifier: MIT
#
# ES-DE
# ES-DE Frontend
# CMakeLists.txt
#
# Main CMake configuration file.
@ -12,14 +12,14 @@ cmake_minimum_required(VERSION 3.13)
if(APPLE)
# Set this to the minimum supported macOS version, and also update
# es-app/assets/ES-DE_Info.plist accordingly.
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE STRING "macOS deployment target")
set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0 CACHE STRING "macOS deployment target")
# This optional variable is used for code signing the DMG installer.
set(MACOS_CODESIGN_IDENTITY "" CACHE STRING "macOS code signing certificate identity")
endif()
project(es-de)
# Application version, update this when making a new release.
set(ES_VERSION 3.0.1)
set(ES_VERSION 3.0.3)
# Set this to ON to show verbose compiler output (e.g. compiler flags, include directories etc.)
set(CMAKE_VERBOSE_MAKEFILE OFF CACHE BOOL "Show verbose compiler output" FORCE)
@ -44,6 +44,7 @@ option(RPI "Set to ON to enable a Raspberry Pi specific build" OFF)
option(BUNDLED_CERTS "Set to ON to use bundled TLS/SSL certificates" OFF)
option(CEC "Set to ON to enable CEC" OFF)
option(VIDEO_HW_DECODING "Set to ON to enable FFmpeg HW decoding" OFF)
option(DEINIT_ON_LAUNCH "Set to ON to deinitialize on game launch" OFF)
option(CLANG_TIDY "Set to ON to build using the clang-tidy static analyzer" OFF)
option(ASAN "Set to ON to build with AddressSanitizer" OFF)
option(TSAN "Set to ON to build with ThreadSanitizer" OFF)
@ -357,6 +358,15 @@ if(VIDEO_HW_DECODING)
message("-- Building with FFmpeg HW decoding")
endif()
if(DEINIT_ON_LAUNCH)
if(CMAKE_SYSTEM_NAME MATCHES Linux)
add_compile_definitions(DEINIT_ON_LAUNCH)
message("-- Building with deinitialization on game launch")
else()
message(FATAL_ERROR "-- Deinitialization on game launch can only be used on Linux")
endif()
endif()
if(AUR_BUILD OR FLATPAK_BUILD OR RETRODECK OR RPI)
set(APPLICATION_UPDATER OFF)
endif()

View file

@ -12,7 +12,7 @@ First it's branding, it would be very confusing to have different names for the
## Is it available for free, and is it open source?
The Android release specifically is not free, it's a paid app available for purchase through [Patreon](https://www.patreon.com/es_de). And although approximately 99% of the app is open source there are some portions of the code that is closed source.
The Android release specifically is not free, it's a paid app available for purchase through [Patreon](https://www.patreon.com/es_de) or the [Samsung Galaxy Store](https://galaxystore.samsung.com/detail/org.es_de.frontend.galaxy). And although approximately 99% of the app is open source there are some portions of the code that is closed source.
## I bought ES-DE on Patreon, how do I get access to future releases?
@ -26,6 +26,10 @@ You only need to buy it once, and then you can use it on all your devices. There
Although the overwhelming majority of people have successfully got ES-DE to run on their devices (assuming they are fulfilling the basic requirements of 64-bit Android 10 or later) there are some devices that have been problematic. Unfortunately Android is not really a standardized operating system and hardware manufacturers are sometimes applying custom patches and such which may prevent ES-DE from working correctly. We will refund everyone up to one month from the purchase date if they are unable to get ES-DE to run on their device, just send a DM on Patreon and we will issue a refund as soon as possible.
## I received an update email to my Gmail account but the APK download link doesn't seem to work?
There seems to be an issue with Gmail (both web version and app) that a few people have run into. Clicking on some external download links will result in extremely slow downloads or the download failing completely. The solution is to copy the download link from the email and paste it into the address bar of a web browser, i.e. outside of the Gmail web interface or outside the Gmail app. That should resolve the issue and the APK should download correctly.
## Will I lose any settings or data when upgrading to a new release?
No, you will not lose any settings or data when you upgrade. Just download the latest version and sideload it on your device to apply the update.
@ -38,12 +42,19 @@ The second reason is that the APK is corrupt or not complete. When we make relea
## Can I set ES-DE as my home app/launcher?
Kind of, ES-DE can't natively be set as your launcher but you can use a third party app to make this work such as [AnyHome](https://play.google.com/store/apps/details?id=com.draco.anyhome&hl=en_US&gl=US). It's not necessarily recommended though as ES-DE is not a native Android application, it's written in C++ and essentially works as a game engine with a game loop that constantly runs. For this reason it consumes more resources and battery than a native launcher app. An alternative approach would be to use a native launcher with ES-DE, this makes for a nice game console experience. To achieve this the following app is recommended:
https://play.google.com/store/apps/details?id=com.k2.consolelauncher
Yes, as of version 3.0.3 there is experimental support for setting ES-DE as the home app. Read the _Running ES-DE as the Android home app_ section of the [Android documentation](ANDROID.md#running-es-de-as-the-android-home-app) for more information about this functionality. There are currently some minor glitches like sometimes needing to start ES-DE twice after switching between regular mode and home app mode, but apart from that it should hopefully work fine.
## Can I launch Android applications and games from inside ES-DE?
## Can I launch Android apps and games from inside ES-DE?
Not at the moment. Although there is an _android_ system in ES-DE it's not in use at the moment, but this functionality is planned for a future release.
Yes, as of ES-DE 3.0.2 there is experimental support for launching native Android apps and games. Read the _Launching native Android apps and games_ section of the [Android documentation](ANDROID.md#launching-native-android-apps-and-games) to see how this is accomplished. As you can read there a separate app is needed to import your games into ES-DE, but this functionality will be built into ES-DE itself in a future release.
## Every time I reboot my device ES-DE is starting the onboarding process, why is this happening?
If you have set ES-DE as your home app then for some devices the onboarding configurator is displayed after booting your device. This happens because of an issue in the Android operating system where apps are started before the SD card has been mounted. When ES-DE starts it will obviously try to access the ES-DE and ROMs directories that it needs to function, but if either of these have been placed on an SD card that is not available, then the application assumes that the storage has been permanently removed and runs the onboarding process again. This is normal and intended behavior. On app startup ES-DE will however check if the SD card has been mounted, and it will wait up to 4.5 seconds for the storage to become available before it gives up and displays the configurator. For the overwhelming amount of cases this time is enough to handle reboots without issues, but some SD cards of larger sizes apparently need more time than this to get mounted, which triggers the failure mode. Note that you don't need to run through the entire onboarding process if this happens, it's enough to just press B or the back button, just make sure to wait a sufficient amount of time for the SD card to first get mounted. Unfortunately this issues is impossible to resolve on the application layer, it's an operating system defect and it needs to be fixed by Google. Setting a higher retry time than 4.5 seconds will make Android report ES-DE as non-responding, so that's unfortunately not a viable solution either.
## Can I use ES-DE with Samsung DeX?
While ES-DE would in theory work fine with DeX this is unfortunately not supported as Samsung has a policy to not allow apps that can be set as home apps/launchers to run via DeX. This is a Samsung limitation that they would need to resolve.
## What game systems/platforms and emulators are supported by ES-DE?
@ -73,8 +84,6 @@ Also be aware that there are some slight variations when it comes to how emulato
ERROR CODE -1 is a general failure mode which could be caused by multiple things. Some emulators react like this when there's a permission issue and they can't access the game file. See the previous question above for how to deal with such permission problems. And some emulators return this error when the file you attempt to launch has an unsupported file extension. For example MD.emu does not support .bin files, but if you rename these files to the .gen extension then game launching works as expected.
If you own an Ayn Odin 2 then this error will also occur when attempting to launch the ColEm, fMSX, iNES, MasterGear, My Boy!, My OldBoy!, Redream and Speccy emulators. This seems to be caused by bugs in their firmware/OS image and needs to be resolved by Ayn.
A black screen on game launch is also a possible variation of this failure mode, it depends on how the emulator handles errors whether there will be a black screen or whether it will abort and report the launch failure to ES-DE.
## Sometimes after I return from a game ES-DE is restarting, did it crash?
@ -83,7 +92,7 @@ No Android may stop applications that are not currently focused if it needs to r
## ES-DE takes a very long time to start, is there a way to improve this?
Unfortunately disk I/O performance on Android leaves a lot to be desired compared to desktop operating systems. Google has repeatedly prioritized other things over performance which leads to disk speed being poor on this operating system. The biggest offender is the choice of FAT filesystems such as exFAT for external storage which offer abysmal performance for some file operations on which ES-DE relies heavily. Generally speaking a small to medium ROM collection can normally be placed on a FAT-formatted device such as an SD card but the ES-DE directory and more importantly the _downloaded_media_ directory should always be placed on internal storage. For large game collections ES-DE could turn borderline unusable if the ES-DE directory is placed on an SD card or USB memory stick. It's also possible to enable the _Only show games from gamelist.xml files_ option in the _Other settings_ menu to skip checking for game files on startup, but this has multiple implications such as what's displayed inside ES-DE not necessarily reflecting reality any longer. And obviously you'll need gamelist.xml entries for all games you want to show up inside ES-DE. So this option is really a last resort and is generally only recommended for testing purposes. In summary huge game collections are discouraged on Android due to limitations in the operating system itself. Setting up a collection of tens of thousands of games is for sure achievable with ES-DE on Linux, macOS or Windows but it's not really feasible on Android.
Unfortunately disk I/O performance on Android leaves a lot to be desired compared to desktop operating systems. Google has prioritized other things over performance which leads to disk speed being poor overall on this operating system. The main offender is the choice of FAT filesystems such as exFAT for external storage which offer very poor performance for some file operations on which ES-DE relies heavily. Generally speaking a small to medium ROM collection can normally be placed on a FAT-formatted device such as an SD card but the ES-DE directory and more importantly the _downloaded_media_ directory should always be placed on internal storage. For large game collections ES-DE could turn borderline unusable if the ES-DE directory is placed on an SD card or USB memory stick. It's also possible to enable the _Only show games from gamelist.xml files_ option in the _Other settings_ menu to skip checking for game files on startup, but this has multiple implications such as what's displayed inside ES-DE not necessarily reflecting reality any longer. And obviously you'll need gamelist.xml entries for all games you want to show up inside ES-DE. So this option is really a last resort and is generally only recommended for testing purposes. In summary huge game collections are discouraged on Android due to limitations in the operating system itself. Setting up a collection of tens of thousands of games is for sure achievable with ES-DE on Linux, macOS or Windows but it's not really feasible on Android.
## On game launch RetroArch runs an old game instead of the one I just selected, how do I prevent this?
@ -94,10 +103,14 @@ https://www.youtube.com/watch?v=k5WWacfIn6Y
ES-DE runs on a wide range on devices, for example handheld consoles like the Ayn Odin and the Retroid Pocket models, on mobile phones, on tablets and on Android TV devices like the Nvidia Shield Pro. It supports a wide range of screen resolutions and aspect ratios. A 64-bit version of Android 10 or later is required.
## Can I use the Android soft keyboard to enter text using touch and swiping
Yes this is somehow possible, by disabling the _Enable virtual keyboard_ setting in the _UI settings_ menu the soft keyboard built into Android can be used. There is however a bug in the SDL library that causes rendering issues in ES-DE when combining this with controller input. More specifically a green border is shown around the screen and the bottom portion of the screen is not getting rendered at all. If this happens you need to restart ES-DE, and for this reason the ES-DE built-in virtual keyboard is enabled by default. If you are however only using touch input with ES-DE then using the Android soft keyboard should work fine.
## Will touch gesture support get added?
ES-DE is not a good match for gesture navigation, there are a lot of contextual navigation and quite a number of possible actions at any given time. So it would probably get quite confusing to attempt to learn gestures for all these actions. For this reason it was decided to instead implement a touch overlay with virtual buttons. This is also what most emulators use for their input so ES-DE will match the emulators in this regard. However, if you are using a controller with ES-DE then none of this applies and you can go ahead and disable the touch overlay from the _Input device settings_ menu.
## Why does ES-DE need to have permissions to manage my storage?
ES-DE needs the storage permissions (MANAGE_EXTERNAL_STORAGE) to manage storage because it's well.. a storage manager. It handles your library of games and media which can easily be tens or even hundreds of thousands of files, and this may span across multiple storage devices as for instance scraped media could be relocated to an SD card or the ROMs moved to another device than the application data directory. During development substantial work was spent on attempting to work around the Android security model without having storage manager permission. Although this was partially successful it never worked 100% due to additional restrictions introduced in Android 13. The approach was to pipe file operations from the native C++ code via JNI to Java and translate them to SAF/MediaStore file operations. And be aware that ES-DE depends on a large amount of C and C++ libraries that have no awareness of or support for the Storage Access Framework or Media Store subsystems in Android. Even if it would have worked 100% this would have lead to unacceptable performance issues as a lot of translations were needed, for instance Java uses "filtered" UTF8 Unicode while C++ doesn't so everything would need to be translated by the UTF8-CPP library. In addition to this an undocumented feature of the FileProvider API is that you can't provide access to files you don't own, even if you have read/write access to them using scoped storage permissions. As the FileProvider API is the future of emulator launching since it removes the need to setup scoped storage access individually in each emulator, it would break a very important feature to not have storage manager access. There are more issues on top of what has just been described, but these are the most important considerations.
ES-DE needs the storage permissions (MANAGE_EXTERNAL_STORAGE) to manage storage because it's well.. a storage manager. It handles your library of games and media which can easily be tens or even hundreds of thousands of files, and this may span across multiple storage devices as for instance scraped media could be relocated to an SD card or the ROMs moved to another device than the application data directory. During development substantial work was spent on attempting to work around the Android security model without having storage manager permission. Although this was partially successful it never worked 100% due to additional restrictions introduced in Android 13. The approach was to pipe file operations from the native C++ code via JNI to Java and translate them to SAF/MediaStore file operations. And be aware that ES-DE depends on a large amount of C and C++ libraries that have no awareness of or support for the Storage Access Framework or Media Store subsystems in Android. Even if it would have worked 100% this would have lead to unacceptable performance issues as a lot of translations were needed, for instance Java uses "filtered" UTF8 Unicode while C++ doesn't so everything would need to be translated by the UTF8-CPP library. In addition to this an undocumented feature of the FileProvider API is that you can't provide access to files you don't own, even if you have read/write access to them using scoped storage permissions. As the FileProvider API is very useful for emulator launching since it removes the need to setup scoped storage access individually in each emulator, it would break a very important feature to not have storage manager access. There are more issues on top of what has just been described, but these are the most important considerations.

4
FAQ.md
View file

@ -144,8 +144,8 @@ The second reason for double input is buggy controller drivers. This seems to on
## I'm missing a feature, how can I make a request to have it added?
First check the project [Kanban](https://gitlab.com/es-de/emulationstation-de/-/boards/1823720) board which contains an overview of planned future features and search for the functionality you would like to see added. Chances are there is already a card on the board describing what you intended to request. You can also check the [Roadmap](ROADMAP.md) document which contains a list of planned major features. If you can't find the feature you're looking for, then you can request it either via adding an issue directly to the Kanban board, or by asking for it in our [Discord](https://discord.gg/EVVX4DqWAP) server.
First check the project [Kanban](https://gitlab.com/es-de/emulationstation-de/-/boards/1823720) board which contains an overview of planned future features and search for the functionality you would like to see added. Chances are there is already a card on the board describing what you intended to request. You can also check the [Roadmap](ROADMAP.md) document which contains a list of planned major features. If you can't find the feature you're looking for, then you can request it either via adding an issue directly to the Kanban board, or by asking for it in our [Discord](https://discord.gg/42jqqNcHf9) server.
## I want to setup a gaming appliance based on a single-board computer, can I use ES-DE for this?
This is not the goal of ES-DE, the application requires a desktop environment to run. If you want to run a frontend on a single-board computer without using Xorg or Wayland then there are better options out there. But many people run ES-DE on arcade cabinets and similar which is definitely possible, it just requires a desktop-class operating system.
Yes this is possible, although this is not the primary use case for ES-DE. As the application is not intended to be the sole user interface for the computer there is no built-in functionality to manage operating system settings and emulator settings for instance. ES-DE also generally requires a desktop environment to run, which means a window manager and a sound server. You can however use KMS/direct framebuffer access on Linux if you build with the DEINIT_ON_LAUNCH flag as explained in the _Building on Unix_ section of the [INSTALL.md](INSTALL.md#building-on-unix) document. This would in theory allow ES-DE to be a drop-in replacement for RetroPie EmulationStation for example.

View file

@ -55,9 +55,11 @@ sudo pacman -S gcc clang make cmake pkgconf sdl2 ffmpeg freeimage freetype2 libg
All of the required packages can be installed with apt-get:
```
sudo apt-get install clang-format cmake libsdl2-dev libavcodec-dev libavfilter-dev libavformat-dev libavutil-dev libfreeimage-dev libgit2-dev libcurl4-gnutls-dev libpugixml-dev libpoppler-cpp-dev
sudo apt-get install clang-format cmake libraspberrypi-dev libsdl2-dev libavcodec-dev libavfilter-dev libavformat-dev libavutil-dev libfreeimage-dev libfreetype6-dev libgit2-dev libcurl4-gnutls-dev libpugixml-dev libpoppler-cpp-dev
```
For a 64-bit build it's very important that you include libraspberrypi-dev because if this package is not installed then the file /usr/include/bcm_host.h is not present on the filesystem. This leads to CMake not detecting that it's indeed a Raspberry Pi and it will attempt to make a regular Linux build instead.
To build with CEC support you also need to install these packages:
```
sudo apt-get install libcec-dev libp8-platform-dev
@ -65,7 +67,7 @@ sudo apt-get install libcec-dev libp8-platform-dev
The Raspberry Pi 4/400 is the minimum recommended version and earlier boards have not been tested. The GPU memory should be set to at least 256 MB using `raspi-config` and the GL driver must be set to `GL (Fake KMS)` or the performance will be horrible.
Note that low-level ALSA sound support has been removed from ES-DE which means that a sound server like PulseAudio or PipeWire is required. Likewise a display server (Xorg or Wayland) is required, direct framebuffer access is not supported.
Note that low-level ALSA sound support has been removed from ES-DE which means that a sound server like PulseAudio or PipeWire is required. By default a display server (Xorg or Wayland) is also required but by using the DEINIT_ON_LAUNCH build option as explained later in this document KMS/direct framebuffer access can be used.
Only the OpenGL ES 3.0 renderer works on Raspberry Pi and it's enabled by default.
@ -133,6 +135,14 @@ make
Note that the application updater is always disabled when building for the AUR, RetroDECK, Raspberry Pi or BSD Unix.
On Linux specifically you can build with the DEINIT_ON_LAUNCH option which will deinit the renderer, application window and audio when an emulator is launched. This makes it possible to use ES-DE with KMS/direct framebuffer access to for example make ES-DE a drop-in replacement for RetroPie EmulationStation:
```
cmake -DDEINIT_ON_LAUNCH=on .
make
```
When this flag is enabled the menu option _Run in background (while game is launched)_ in the Other settings menu is disabled and all functionality related to running ES-DE in the background is also disabled.
By default the master branch will be used, which is where development takes place. To instead build a stable release, switch to the `stable-x.x` branch for the version, for example:
```
@ -1561,7 +1571,7 @@ The following variables are expanded for the `command` tag:
`%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.
`%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` and the `%ROM%` variable is another possibility, such as `%INJECT%=%ROM%`. The latter will expand to the absolute path of the game file and inject its file contents, and this also works when combined with the directories interpreted as files functionality. 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.
@ -1752,13 +1762,13 @@ The es_systems.xml file on Android utilizes variables heavily to implement the _
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.
`%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. It's also possible to use the `%GAMEDIRRAW%`, `%ROMPATHRAW%` and `%ROMRAW%` variables inside an `%EXTRA_` variable definition, which will expand to the the directory of the game file, the ROM directory and the path to the game file respectively.
`%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_.
`%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_. It's also possible to use the `%GAMEDIRRAW%`, `%ROMPATHRAW%` and `%ROMRAW%` variables inside an `%EXTRAARRAY_` variable definition, which will expand to the the directory of the game file, the ROM directory and the path to the game file respectively.
`%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.
`%DATA%` - Sets the data URI value for the intent using an equal sign. This is normally combined with one of the ROM variables but it's also possible to define an explicit value or to inject the content of a file and pass that to the variable. This can for instance be accomplished with `%DATA%=%INJECT%=%ROM%` which will expand to the absolute path of the game file and inject its file content. This also works when combined with the directories interpreted as files functionality. Alternatively the `%BASENAME%` variable can be used instead, as in `%DATA%=%BASENAME%` or `%DATA%=%BASENAME%.extension` but this can't be combined with the directories interpreted as files functionality.
There are three approaches to passing game ROMs to emulators by using the following variables:
@ -1782,6 +1792,20 @@ Here are some examples to clarify how this works:
%EXTRABOOL_resumeState%=false
```
`%ANDROIDAPP%` - This is a special variable that is used to launch native Android apps and games. It must be defined as a pair separated by an equal sign. Most commonly it will be combined with the `%FILEINJECT%` variable which will inject the content of the game file, but it's also possible to define an explicit package name after the equal sign. Additionally you can specify which activity to use by adding it after a forward slash character. If no activity is defined then the default for the package will be used. The content of the inject file should look identical to an explicit entry, i.e. it can be just the package name or the package name and the activity.
Here are some examples to clarify how this works:
```
%ANDROIDAPP%=%FILEINJECT%
%ANDROIDAPP%=org.ppsspp.ppssppgold
%ANDROIDAPP%=org.ppsspp.ppssppgold/org.ppsspp.ppsspp.PpssppActivity
```
The content of an inject file could look simply like the following:
```
org.ppsspp.ppssppgold
```
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

View file

@ -53,9 +53,11 @@ sudo pacman -S gcc clang make cmake pkgconf sdl2 ffmpeg freeimage freetype2 libg
All of the required packages can be installed with apt-get:
```
sudo apt-get install clang-format cmake libsdl2-dev libavcodec-dev libavfilter-dev libavformat-dev libavutil-dev libfreeimage-dev libgit2-dev libcurl4-gnutls-dev libpugixml-dev libpoppler-cpp-dev
sudo apt-get install clang-format cmake libraspberrypi-dev libsdl2-dev libavcodec-dev libavfilter-dev libavformat-dev libavutil-dev libfreeimage-dev libfreetype6-dev libgit2-dev libcurl4-gnutls-dev libpugixml-dev libpoppler-cpp-dev
```
For a 64-bit build it's very important that you include libraspberrypi-dev because if this package is not installed then the file /usr/include/bcm_host.h is not present on the filesystem. This leads to CMake not detecting that it's indeed a Raspberry Pi and it will attempt to make a regular Linux build instead.
To build with CEC support you also need to install these packages:
```
sudo apt-get install libcec-dev libp8-platform-dev
@ -63,7 +65,7 @@ sudo apt-get install libcec-dev libp8-platform-dev
The Raspberry Pi 4/400 is the minimum recommended version and earlier boards have not been tested. The GPU memory should be set to at least 256 MB using `raspi-config` and the GL driver must be set to `GL (Fake KMS)` or the performance will be horrible.
Note that low-level ALSA sound support has been removed from ES-DE which means that a sound server like PulseAudio or PipeWire is required. Likewise a display server (Xorg or Wayland) is required, direct framebuffer access is not supported.
Note that low-level ALSA sound support has been removed from ES-DE which means that a sound server like PulseAudio or PipeWire is required. By default a display server (Xorg or Wayland) is also required but by using the DEINIT_ON_LAUNCH build option as explained later in this document KMS/direct framebuffer access can be used.
Only the OpenGL ES 3.0 renderer works on Raspberry Pi and it's enabled by default.
@ -131,6 +133,14 @@ make
Note that the application updater is always disabled when building for the AUR, RetroDECK, Raspberry Pi or BSD Unix.
On Linux specifically you can build with the DEINIT_ON_LAUNCH option which will deinit the renderer, application window and audio when an emulator is launched. This makes it possible to use ES-DE with KMS/direct framebuffer access to for example make ES-DE a drop-in replacement for RetroPie EmulationStation:
```
cmake -DDEINIT_ON_LAUNCH=on .
make
```
When this flag is enabled the menu option _Run in background (while game is launched)_ in the Other settings menu is disabled and all functionality related to running ES-DE in the background is also disabled.
By default the master branch will be used, which is where development takes place. To instead build a stable release, switch to the `stable-x.x` branch for the version, for example:
```
@ -1559,7 +1569,7 @@ The following variables are expanded for the `command` tag:
`%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.
`%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` and the `%ROM%` variable is another possibility, such as `%INJECT%=%ROM%`. The latter will expand to the absolute path of the game file and inject its file contents, and this also works when combined with the directories interpreted as files functionality. 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.
@ -1750,13 +1760,13 @@ The es_systems.xml file on Android utilizes variables heavily to implement the _
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.
`%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. It's also possible to use the `%GAMEDIRRAW%`, `%ROMPATHRAW%` and `%ROMRAW%` variables inside an `%EXTRA_` variable definition, which will expand to the the directory of the game file, the ROM directory and the path to the game file respectively.
`%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_.
`%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_. It's also possible to use the `%GAMEDIRRAW%`, `%ROMPATHRAW%` and `%ROMRAW%` variables inside an `%EXTRAARRAY_` variable definition, which will expand to the the directory of the game file, the ROM directory and the path to the game file respectively.
`%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.
`%DATA%` - Sets the data URI value for the intent using an equal sign. This is normally combined with one of the ROM variables but it's also possible to define an explicit value or to inject the content of a file and pass that to the variable. This can for instance be accomplished with `%DATA%=%INJECT%=%ROM%` which will expand to the absolute path of the game file and inject its file content. This also works when combined with the directories interpreted as files functionality. Alternatively the `%BASENAME%` variable can be used instead, as in `%DATA%=%BASENAME%` or `%DATA%=%BASENAME%.extension` but this can't be combined with the directories interpreted as files functionality.
There are three approaches to passing game ROMs to emulators by using the following variables:
@ -1780,6 +1790,20 @@ Here are some examples to clarify how this works:
%EXTRABOOL_resumeState%=false
```
`%ANDROIDAPP%` - This is a special variable that is used to launch native Android apps and games. It must be defined as a pair separated by an equal sign. Most commonly it will be combined with the `%FILEINJECT%` variable which will inject the content of the game file, but it's also possible to define an explicit package name after the equal sign. Additionally you can specify which activity to use by adding it after a forward slash character. If no activity is defined then the default for the package will be used. The content of the inject file should look identical to an explicit entry, i.e. it can be just the package name or the package name and the activity.
Here are some examples to clarify how this works:
```
%ANDROIDAPP%=%FILEINJECT%
%ANDROIDAPP%=org.ppsspp.ppssppgold
%ANDROIDAPP%=org.ppsspp.ppssppgold/org.ppsspp.ppsspp.PpssppActivity
```
The content of an inject file could look simply like the following:
```
org.ppsspp.ppssppgold
```
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

View file

@ -1,6 +1,6 @@
# ES-DE Frontend
ES-DE (formerly EmulationStation Desktop Edition) is a frontend for browsing and launching games from your multi-platform collection.
ES-DE (EmulationStation Desktop Edition) is a frontend for browsing and launching games from your multi-platform collection.
It's officially supported on Linux, macOS, Windows and Android but can also be used on BSD Unix and the Raspberry Pi if you build it yourself from source code.
@ -14,7 +14,7 @@ YouTube:\
https://www.youtube.com/@ES-DE_Frontend
Discord:\
https://discord.gg/EVVX4DqWAP
https://discord.gg/42jqqNcHf9
The goal of this project is to make a high quality frontend that is easy to use, requires minimal setup and configuration, looks nice, and is available across a wide range of operating systems.
@ -29,7 +29,7 @@ https://gitlab.com/es-de/themes/themes-list
Visit https://es-de.org to download the latest ES-DE release or go to the [package registry](https://gitlab.com/es-de/emulationstation-de/-/packages) where you can also find most previous releases.
The Android port of ES-DE is a paid app, which you can get on [Patreon](https://www.patreon.com/es_de).
The Android port of ES-DE is a paid app, which you can get on [Patreon](https://www.patreon.com/es_de) or on the [Samsung Galaxy Store](https://galaxystore.samsung.com/detail/org.es_de.frontend.galaxy).
If you're using a Raspberry Pi or if you run FreeBSD, NetBSD or OpenBSD then you need to compile from source code as no prebuilt packages are provided for these platforms. A detailed build guide is available in [INSTALL.md](INSTALL.md).

View file

@ -5,14 +5,13 @@ ES-DE is developed using an agile methodology so which features to include per r
A more detailed breakdown can be found on the [Kanban](https://gitlab.com/es-de/emulationstation-de/-/boards) board, and for previous releases the [Changelog](CHANGELOG.md) contains all relevant details.
**General functionality**
* (Android) Support for running native Android apps
* RetroAchievements.org integration
* "Time played" counter per game, similar to how it works in Steam
* Bulk metadata editor
* Background music
* Controller button mappings from inside ES-DE (similar to pad2key in Batocera)
* Localization/multi-language support
* Auto-import tools for Steam, Lutris etc.
* Auto-import tools for Android apps, Steam, Lutris etc.
**User interface**
@ -36,6 +35,4 @@ A more detailed breakdown can be found on the [Kanban](https://gitlab.com/es-de/
* Proper audio mixer
* Improved multi-threading
* Reduced amount of gamelist reloading to retain cached textures and improve overall performance
* Replace the built-in Unicode functions and lookup tables with those of the ICU library
* Text shaping support using the HarfBuzz library
* Replacement for the abandoned FreeImage library

View file

@ -1523,7 +1523,12 @@ Properties:
- This property can only be used when `type` is `horizontal` or `vertical`
* `selectedItemMargins` - type: NORMALIZED_PAIR
- By default items are evenly spaced across the carousel area, but this property makes it possible to define margins (extra space or less space) around the currently selected item. The first value in the pair defines the margin to the left of the item if it's a horizontal carousel or above the item if it's a vertical carousel, and the second value of the pair sets the right or bottom margin for the selected item depending on the carousel orientation.
- Minimum value per margin is `-1` and maximum value per margin is `1`
- Minimum value per axis is `-1` and maximum value per axis is `1`
- Default is `0 0`
- This property can only be used when `type` is `horizontal` or `vertical`
* `selectedItemOffset` - type: NORMALIZED_PAIR
- Offsets the selected item. The first value of the pair is the horizontal offset and the second value is the vertical offset. Applied after all other positioning calculations.
- Minimum value per axis is `-1` and maximum value per axis is `1`
- Default is `0 0`
- This property can only be used when `type` is `horizontal` or `vertical`
* `itemSize` - type: NORMALIZED_PAIR
@ -1554,6 +1559,11 @@ Properties:
- Controls how to fit the image within the aspect ratio defined by `itemSize`. To scale and preserve the original aspect ratio, set the value to `contain`, to stretch/squash the image to fill the entire area set it to `fill` and to crop the image to fill the entire area set it to `cover`
- Valid values are `contain`, `fill` or `cover`
- Default is `contain`
* `imageCropPos` - type: NORMALIZED_PAIR
- If the image has been cropped by setting `imageFit` to `cover` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `imageFit` has been set to `cover`
* `imageInterpolation` - type: STRING
- Interpolation method to use when scaling and rotating images. Nearest neighbor (`nearest`) preserves sharp pixels and linear filtering (`linear`) makes the image smoother. This property has limited effect on scalable vector graphics (SVG) images unless rotation is applied.
- Valid values are `nearest` or `linear`
@ -1828,6 +1838,11 @@ Properties:
- Controls how to fit the image within the aspect ratio defined by `itemSize`. To scale and preserve the original aspect ratio, set the value to `contain`, to stretch/squash the image to fill the entire area set it to `fill` and to crop the image to fill the entire area set it to `cover`
- Valid values are `contain`, `fill` or `cover`
- Default is `contain`
* `imageCropPos` - type: NORMALIZED_PAIR
- If the image has been cropped by setting `imageFit` to `cover` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `imageFit` has been set to `cover`
* `imageInterpolation` - type: STRING
- Interpolation method to use when scaling images. Nearest neighbor (`nearest`) preserves sharp pixels and linear filtering (`linear`) makes the image smoother. This property has limited effect on scalable vector graphics (SVG) images.
- Valid values are `nearest` or `linear`
@ -2056,6 +2071,16 @@ Properties:
* `selectedSecondaryBackgroundColor` - type: COLOR
- Background color of the highlighted entry for the secondary entry type. This follows the sizing of the selector bar and is expanded downwards so you'll probably want to adjust its position using `selectorVerticalOffset` if you have defined a custom selector height using `selectorHeight`
- Default is the same value as `selectedBackgroundColor`
* `selectedBackgroundMargins` - type: NORMALIZED_PAIR
- Adds margins to the selected text background, assuming it has a color set. The first value of the pair is the left margin and the second value is the right margin, which means it's possible to set these margins completely independently. Margins are applied after all other positioning and sizing calculations and they are rendered outside the text debug rectangle boundaries.
- Minimum value per axis is `0` and maximum value per axis is `0.5`
- Default is `0 0`
- This property can only be used if `selectedBackgroundColor` or `selectedSecondaryBackgroundColor` has a value defined.
* `selectedBackgroundCornerRadius` - type: FLOAT
- Setting this property higher than zero applies rounded corners to the text background, assuming it has a color set. The radius is a percentage of the screen width. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the text background height. It means that setting this property sufficiently high will produce perfectly rounded sides for the text background. You normally want to combine this property with `selectedBackgroundMargins` to add some extra margins.
- Minimum value is `0` and maximum value is `0.5`
- Default is `0` (corners are not rounded)
- This property can only be used if `selectedBackgroundColor` or `selectedSecondaryBackgroundColor` has a value defined.
* `textHorizontalScrolling` - type: BOOLEAN
- If this property is enabled then text that does not fit within the element width (minus margins) will scroll horizontally. If the property is disabled, the text will instead be truncated with an ellipsis (...). Using this property will automatically convert all line breaks to spaces so that a single line of text is always displayed.
- Valid values are `vertical` or `horizontal`
@ -2152,8 +2177,13 @@ Properties:
- The image will be resized as large as possible so that it fits within this size while maintaining its aspect ratio. Use this instead of `size` when you don't know what kind of image you're using so it doesn't get grossly oversized on one axis. This property takes precedence over `cropSize` if that has also been defined.
- Minimum value per axis is `0.001` and maximum value per axis is `3`
* `cropSize` - type: NORMALIZED_PAIR
- The image will be resized and cropped to the exact size defined by this property while maintaining its aspect ratio. The crop is always applied centered.
- The image will be resized and cropped to the exact size defined by this property while maintaining its aspect ratio. The crop is always applied centered unless `cropPos` has been set.
- Minimum value per axis is `0.001` and maximum value per axis is `3`
* `cropPos` - type: NORMALIZED_PAIR
- If the image has been cropped using `cropSize` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `cropSize` is used.
* `origin` - type: NORMALIZED_PAIR
- 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 element 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`
@ -2286,8 +2316,13 @@ Properties:
- The static image and video will be resized as large as possible so that they fit within this size while maintaining their aspect ratios. Use this instead of `size` when you don't know what kind of video you're using so it doesn't get grossly oversized on one axis. This property takes precedence over `cropSize` if that has also been defined.
- Minimum value per axis is `0.01` and maximum value per axis is `2`
* `cropSize` - type: NORMALIZED_PAIR
- The static image and video will be resized and cropped to the exact size defined by this property while maintaining their aspect ratios. The crop is always applied centered. Can't be combined with the `scanlines` property.
- The static image and video will be resized and cropped to the exact size defined by this property while maintaining their aspect ratios. The crop is always applied centered unless `cropPos` has been set. Can't be combined with the `scanlines` property.
- Minimum value per axis is `0.01` and maximum value per axis is `2`
* `cropPos` - type: NORMALIZED_PAIR
- If the static image and video has been cropped using `cropSize` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `cropSize` is used.
* `origin` - type: NORMALIZED_PAIR
- 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 element 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`
@ -2815,6 +2850,16 @@ Properties:
- Default is `000000FF`
* `backgroundColor` - type: COLOR
- Default is `00000000`
* `backgroundMargins` - type: NORMALIZED_PAIR
- Adds margins to the text background, assuming it has a color set. The first value of the pair is the left margin and the second value is the right margin, which means it's possible to set these margins completely independently. Margins are applied after all other positioning and sizing calculations and they are rendered outside the text debug rectangle boundaries.
- Minimum value per axis is `0` and maximum value per axis is `0.5`
- Default is `0 0`
- This property can only be used if `backgroundColor` has a value defined.
* `backgroundCornerRadius` - type: FLOAT
- Setting this property higher than zero applies rounded corners to the text background, assuming it has a color set. The radius is a percentage of the screen width. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the text background height. It means that setting this property sufficiently high will produce perfectly rounded sides for the text background. You normally want to combine this property with `backgroundMargins` to add some extra margins.
- Minimum value is `0` and maximum value is `0.5`
- Default is `0` (corners are not rounded)
- This property can only be used if `backgroundColor` has a value defined.
* `letterCase` - type: STRING
- Valid values are `none`, `uppercase`, `lowercase` or `capitalize`
- Default is `none` (original letter case is retained)

View file

@ -1521,7 +1521,12 @@ Properties:
- This property can only be used when `type` is `horizontal` or `vertical`
* `selectedItemMargins` - type: NORMALIZED_PAIR
- By default items are evenly spaced across the carousel area, but this property makes it possible to define margins (extra space or less space) around the currently selected item. The first value in the pair defines the margin to the left of the item if it's a horizontal carousel or above the item if it's a vertical carousel, and the second value of the pair sets the right or bottom margin for the selected item depending on the carousel orientation.
- Minimum value per margin is `-1` and maximum value per margin is `1`
- Minimum value per axis is `-1` and maximum value per axis is `1`
- Default is `0 0`
- This property can only be used when `type` is `horizontal` or `vertical`
* `selectedItemOffset` - type: NORMALIZED_PAIR
- Offsets the selected item. The first value of the pair is the horizontal offset and the second value is the vertical offset. Applied after all other positioning calculations.
- Minimum value per axis is `-1` and maximum value per axis is `1`
- Default is `0 0`
- This property can only be used when `type` is `horizontal` or `vertical`
* `itemSize` - type: NORMALIZED_PAIR
@ -1552,6 +1557,11 @@ Properties:
- Controls how to fit the image within the aspect ratio defined by `itemSize`. To scale and preserve the original aspect ratio, set the value to `contain`, to stretch/squash the image to fill the entire area set it to `fill` and to crop the image to fill the entire area set it to `cover`
- Valid values are `contain`, `fill` or `cover`
- Default is `contain`
* `imageCropPos` - type: NORMALIZED_PAIR
- If the image has been cropped by setting `imageFit` to `cover` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `imageFit` has been set to `cover`
* `imageInterpolation` - type: STRING
- Interpolation method to use when scaling and rotating images. Nearest neighbor (`nearest`) preserves sharp pixels and linear filtering (`linear`) makes the image smoother. This property has limited effect on scalable vector graphics (SVG) images unless rotation is applied.
- Valid values are `nearest` or `linear`
@ -1826,6 +1836,11 @@ Properties:
- Controls how to fit the image within the aspect ratio defined by `itemSize`. To scale and preserve the original aspect ratio, set the value to `contain`, to stretch/squash the image to fill the entire area set it to `fill` and to crop the image to fill the entire area set it to `cover`
- Valid values are `contain`, `fill` or `cover`
- Default is `contain`
* `imageCropPos` - type: NORMALIZED_PAIR
- If the image has been cropped by setting `imageFit` to `cover` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `imageFit` has been set to `cover`
* `imageInterpolation` - type: STRING
- Interpolation method to use when scaling images. Nearest neighbor (`nearest`) preserves sharp pixels and linear filtering (`linear`) makes the image smoother. This property has limited effect on scalable vector graphics (SVG) images.
- Valid values are `nearest` or `linear`
@ -2054,6 +2069,16 @@ Properties:
* `selectedSecondaryBackgroundColor` - type: COLOR
- Background color of the highlighted entry for the secondary entry type. This follows the sizing of the selector bar and is expanded downwards so you'll probably want to adjust its position using `selectorVerticalOffset` if you have defined a custom selector height using `selectorHeight`
- Default is the same value as `selectedBackgroundColor`
* `selectedBackgroundMargins` - type: NORMALIZED_PAIR
- Adds margins to the selected text background, assuming it has a color set. The first value of the pair is the left margin and the second value is the right margin, which means it's possible to set these margins completely independently. Margins are applied after all other positioning and sizing calculations and they are rendered outside the text debug rectangle boundaries.
- Minimum value per axis is `0` and maximum value per axis is `0.5`
- Default is `0 0`
- This property can only be used if `selectedBackgroundColor` or `selectedSecondaryBackgroundColor` has a value defined.
* `selectedBackgroundCornerRadius` - type: FLOAT
- Setting this property higher than zero applies rounded corners to the text background, assuming it has a color set. The radius is a percentage of the screen width. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the text background height. It means that setting this property sufficiently high will produce perfectly rounded sides for the text background. You normally want to combine this property with `selectedBackgroundMargins` to add some extra margins.
- Minimum value is `0` and maximum value is `0.5`
- Default is `0` (corners are not rounded)
- This property can only be used if `selectedBackgroundColor` or `selectedSecondaryBackgroundColor` has a value defined.
* `textHorizontalScrolling` - type: BOOLEAN
- If this property is enabled then text that does not fit within the element width (minus margins) will scroll horizontally. If the property is disabled, the text will instead be truncated with an ellipsis (...). Using this property will automatically convert all line breaks to spaces so that a single line of text is always displayed.
- Valid values are `vertical` or `horizontal`
@ -2150,8 +2175,13 @@ Properties:
- The image will be resized as large as possible so that it fits within this size while maintaining its aspect ratio. Use this instead of `size` when you don't know what kind of image you're using so it doesn't get grossly oversized on one axis. This property takes precedence over `cropSize` if that has also been defined.
- Minimum value per axis is `0.001` and maximum value per axis is `3`
* `cropSize` - type: NORMALIZED_PAIR
- The image will be resized and cropped to the exact size defined by this property while maintaining its aspect ratio. The crop is always applied centered.
- The image will be resized and cropped to the exact size defined by this property while maintaining its aspect ratio. The crop is always applied centered unless `cropPos` has been set.
- Minimum value per axis is `0.001` and maximum value per axis is `3`
* `cropPos` - type: NORMALIZED_PAIR
- If the image has been cropped using `cropSize` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `cropSize` is used.
* `origin` - type: NORMALIZED_PAIR
- 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 element 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`
@ -2284,8 +2314,13 @@ Properties:
- The static image and video will be resized as large as possible so that they fit within this size while maintaining their aspect ratios. Use this instead of `size` when you don't know what kind of video you're using so it doesn't get grossly oversized on one axis. This property takes precedence over `cropSize` if that has also been defined.
- Minimum value per axis is `0.01` and maximum value per axis is `2`
* `cropSize` - type: NORMALIZED_PAIR
- The static image and video will be resized and cropped to the exact size defined by this property while maintaining their aspect ratios. The crop is always applied centered. Can't be combined with the `scanlines` property.
- The static image and video will be resized and cropped to the exact size defined by this property while maintaining their aspect ratios. The crop is always applied centered unless `cropPos` has been set. Can't be combined with the `scanlines` property.
- Minimum value per axis is `0.01` and maximum value per axis is `2`
* `cropPos` - type: NORMALIZED_PAIR
- If the static image and video has been cropped using `cropSize` then this property makes it possible to position the texture within the cropped area. The first value of the pair is the X axis where `0` means align to the left and `1` means align to the right, and the second value of the pair is the Y axis where `0` means align on top and `1` means align at the bottom. Any arbitrary floating point values between 0 and 1 can be used for granular positioning.
- Minimum value per axis is `0` and maximum value per axis is `1`
- Default is `0.5 0.5` (texture is centered)
- This property can only be used if `cropSize` is used.
* `origin` - type: NORMALIZED_PAIR
- 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 element 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`
@ -2813,6 +2848,16 @@ Properties:
- Default is `000000FF`
* `backgroundColor` - type: COLOR
- Default is `00000000`
* `backgroundMargins` - type: NORMALIZED_PAIR
- Adds margins to the text background, assuming it has a color set. The first value of the pair is the left margin and the second value is the right margin, which means it's possible to set these margins completely independently. Margins are applied after all other positioning and sizing calculations and they are rendered outside the text debug rectangle boundaries.
- Minimum value per axis is `0` and maximum value per axis is `0.5`
- Default is `0 0`
- This property can only be used if `backgroundColor` has a value defined.
* `backgroundCornerRadius` - type: FLOAT
- Setting this property higher than zero applies rounded corners to the text background, assuming it has a color set. The radius is a percentage of the screen width. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the text background height. It means that setting this property sufficiently high will produce perfectly rounded sides for the text background. You normally want to combine this property with `backgroundMargins` to add some extra margins.
- Minimum value is `0` and maximum value is `0.5`
- Default is `0` (corners are not rounded)
- This property can only be used if `backgroundColor` has a value defined.
* `letterCase` - type: STRING
- Valid values are `none`, `uppercase`, `lowercase` or `capitalize`
- Default is `none` (original letter case is retained)

View file

@ -302,9 +302,9 @@ The Android port of ES-DE is quite different than the other versions, so it has
## 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.
By default ES-DE on the Raspberry Pi requires a desktop environment to run, or more specifically a window manager and a sound server (like PulseAudio or PipeWire). It is however possible to use KMS/direct framebuffer access if the DEINIT_ON_LAUNCH flag is used when building ES-DE, as documented in the _Building on Unix_ section of the [INSTALL-DEV.md](INSTALL-DEV.md#building-on-unix) document.
Also note that there are no prebuilt packages for the Raspberry Pi, so you will need to compile ES-DE yourself. Fortunately this is easy to do and the process is documented [here](INSTALL-DEV.md#building-on-unix).
Note that there are no prebuilt packages for the Raspberry Pi, so you will need to compile ES-DE yourself. Fortunately this is easy to do and the process is documented [here](INSTALL-DEV.md#building-on-unix).
The Raspberry Pi 4/400 is the minimum recommended version and earlier boards have not been tested.
@ -679,6 +679,7 @@ The following emulators are supported in AppImage format when using the bundled
| macintosh | Basilisk II | BasiliskII*.AppImage |
| macintosh | SheepShaver | SheepShaver*.AppImage |
| n3ds | Citra | citra-qt*.AppImage |
| n3ds | Lime3DS | lime3ds-gui*.AppImage |
| n3ds | Panda3DS | Alber-*.AppImage |
| n64/n64dd | Rosalie's Mupen GUI | RMG*.AppImage |
| ngage/symbian | EKA2L1 | EKA2L1*.AppImage |
@ -761,10 +762,13 @@ The following manually downloaded emulators are supported when using the bundled
| System name | Emulator | Filename |
| :-------------------------------------- | :--------------- | :-------------------------------- |
| adam/colecovision | ColEm | colem/colem |
| amiga/amiga1200/amiga600/amigacd32/cdtv | Amiberry | amiberry/amiberry |
| amstradcpc | ACE-DL | AceDL/AceDL |
| amstradcpc | CPCemu | cpcemu/cpcemu |
| apple2 | LinApple | linapple/linapple |
| atari2600 | Gopher2600 | gopher2600/gopher2600_linux_amd64 |
| atarijaguar/atarijaguarcd | BigPEmu | bigpemu/bigpemu |
| coco/dragon32/tanodragon | XRoar | xroar/xroar |
| daphne | Hypseus Singe | hypseus-singe/hypseus.bin |
| dreamcast | Redream | redream/redream |
@ -879,6 +883,7 @@ The following Windows emulators are supported, and the setup for most of these i
| atarijaguar/atarijaguarcd | BigPEmu | BigPEmu/BigPEmu.exe |
| famicom/nes | 3dSen | 3dSen/3dSen.exe |
| model2 | Model 2 Emulator | m2emulator/EMULATOR.EXE |
| x68000 | XM6 Pro-68k | XM6 Pro-68k/XM6.exe |
| xbox360 | xenia | xenia/xenia.exe |
| xbox360 | xenia | xenia/xenia_canary.exe |
@ -1100,6 +1105,8 @@ Not all systems are as simple to setup as what was described in the previous sec
### Apple II
On Android only MAME4droid 2024 is supported for the apple2 system. Make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID-DEV.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
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 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-DEV.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.
@ -1121,7 +1128,9 @@ https://docs.mamedev.org/usingmame/defaultkeys.html
### Apple IIGS
The Apple IIGS computer is emulated using MAME. There is a dedicated emulator available for this system named [GSplus](https://apple2.gs/plus) but it appears to not be able to parse command line parameters correctly so disk images can't be supplied to it. As such it's currently unsupported.
The Apple IIGS computer is emulated using MAME. On desktop operating systems there is a dedicated emulator available for this system named [GSplus](https://apple2.gs/plus) but it appears to not be able to parse command line parameters correctly so disk images can't be supplied to it. As such it's currently unsupported.
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID-DEV.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
In order to run Apple IIGS games in MAME, you need to place the following ROM file in the ~/ROMs/apple2gs directory:
```
@ -1133,7 +1142,9 @@ https://docs.mamedev.org/usingmame/defaultkeys.html
### Apple Macintosh
There are two approaches to emulating these computers, the first is using games booted from diskettes and the second is to setup an entire OS installation as a hard disk image and run the games from there. The first approach is only applicable for older models like the Macintosh SE and Macintosh Plus (i.e. the era prior to hard drives becoming prevalent), and the second approach can be used for more modern models.
On Android only MAME4droid 2024 is supported for the macintosh system. Make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID-DEV.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
There are two approaches to emulating these computers, the first is using games booted from diskettes and the second is to setup an entire OS installation as a hard disk image and run the games from there (this latter approach is not supported on Android). The first approach is only applicable for older models like the Macintosh SE and Macintosh Plus (i.e. the era prior to hard drives becoming prevalent), and the second approach can be used for more modern models.
**Method 1, booting from diskette images**
@ -1144,6 +1155,8 @@ Booting from diskettes is the default approach and MAME standalone is used for t
* MAME Mac Plus Bootable (Standalone)
* MAME Mac Plus Boot Disk (Standalone)
Note that on Android these emulator entries are named slightly differently as the MAME4droid 2024 emulator is used on this operating system.
To use these you need the MAME files adbmodem.zip, macse.zip and macplus.zip placed in the `~/ROMs/macintosh/` directory.
The _Bootable_ entries are straightforward, these are games that are self-contained on a single diskette and that can simply be booted as-is. The _Boot Disk_ entries are games that can't be booted directly but instead require a separate boot diskette. To run these you need to place a disk image named `boot.dsk` together with the game files and ES-DE will then insert this into the first floppy drive on game launch and place the game diskette in the second floppy drive. Once Mac OS has started up you can then start the game from inside the operating system. Basically any bootable diskette can be used as long as it's 400K or 800K in size and runs a Mac OS release compatible with the game you intend to play. For example the _System Tools_ diskette from the System 6.0.8 installation media works fine for this purpose.
@ -1191,6 +1204,8 @@ Note that scraper support is currently very poor for this system, so you may nee
### Arcade and Neo Geo
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID-DEV.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
**General**
For all the supported MAME variants as well as Final Burn Alpha/FinalBurn Neo and Neo Geo, single file archives should be used. These files should retain the MAME software list filenames as ES-DE ships with MAME lookup tables, meaning the software list names are automatically expanded to full game names.
@ -1278,7 +1293,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 [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.
The only emulator that can run Atari Jaguar CD games is [BigPEmu](https://www.richwhitehouse.com/jaguar/) which is available for Linux and Windows. On Linux you can also run the Windows release of this emulator, should you want to. 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-DEV.md#running-windows-emulators-on-linux-using-wine-or-proton) section.
@ -1297,7 +1312,7 @@ That's basically it, for the atarijaguar system just make sure to select _BigPEm
There are many settings in Wine that may affect compatibility, performance etc. but covering all that is beyond the scope of this guide.
In addition to the above instructions there's an unofficial YouTube video available on how to setup BigPEmu with ES-DE:\
In addition to the above instructions there's an unofficial YouTube video available on how to setup the Windows release of BigPEmu with ES-DE:\
https://www.youtube.com/watch?v=GuPAjgICc-4
### Commodore Amiga and CDTV
@ -1390,6 +1405,8 @@ https://github.com/BlitterStudio/amiberry/wiki/Kickstart-ROMs-%28BIOS%29
### Console Arcade Systems
Note that on Android specifically some of the arcade boards mentioned below are not supported as there are simply no suitable emulators available.
The _consolearcade_ system is intended for the various arcade boards that were based on home console platforms. For many of the older systems MAME can be used for emulation, but some of the more modern systems require the use of other emulators, which is precisely what is provided by this system.
The following arcade boards have been considered:
@ -1509,13 +1526,13 @@ Setup for the standalone EasyRPG Player is identical with the exception that run
### Fujitsu FM Towns
This system is emulated using MAME or Tsugaru.
This system is emulated using MAME or Tsugaru on desktop operating systems and MAME4droid 2024 on Android.
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID-DEV.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
**MAME**
As of the time of writing MAME has somehow preliminary FM Towns support, but it seems to work well enough for most games and support will likely improve over time.
Only CD-ROM games are supported and the .chd format is recommended. It's not adviced to go for game files using MAME software list names as these can't be scraped by either ScreenScraper or TheGames DB. It's instead better to use files with full game names.
When using MAME only CD-ROM games are supported and the .chd format is recommended. It's not adviced to go for game files using MAME software list names as these can't be scraped by either ScreenScraper or TheGames DB. It's instead better to use files with full game names.
You also need the `fmtowns.zip` BIOS archive placed in ~/ROMs/fmtowns/ for the games to run.
@ -1582,6 +1599,8 @@ To map the controller to the keyboard and to set a 33 MHz CPU speed, the file co
### LaserDisc Games
Note that on Android the Hypseus Singe emulator is not available. However the setup for MAME (using MAME4droid 2024) and DirkSimple still applies. If using Android also make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID-DEV.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
There are three ways to run LaserDisc games in ES-DE, via MAME, via Hypseus Singe or via the DirkSimple RetroArch core. There are also two separate systems available, _daphne_ and _laserdisc_. The latter is recommended as the _daphne_ system is mostly existing for legacy reasons and may be removed in a future ES-DE release. The configuration for these two systems is identical as they are essentially clones.
At the time of writing MAME and Hypseus Singe are mostly mutually exlusive as MAME tends to primarily support the games that Hypseus Singe doesn't support. In the future this is likely to change with MAME getting support for more LaserDisc games.
@ -2338,6 +2357,8 @@ On Linux it's also possible to launch AppImages directly without having to call
### ScummVM
Note that the Android release of ScummVM standalone differs from the releases for desktop operating systems in that all games need to be installed in the app before they can be launched from ES-DE. There are some very specific configuration steps that need to be followed to get this to work, but they are thoroughly described in the ScummVM user interface the first time you launch the app, and there is also a built-in help system that you can peruse. Apart from that the setup is identical to the other platforms.
ScummVM overlaps a bit with DOS when it comes to the logic of setting it up. It's recommended to keep games in separate folders, so if you have a game distributed as a ZIP file, uncompress it to its own directory.
Although ScummVM supports launching of .exe files, ES-DE is currently not configured as such and it's instead recommended to create a .scummvm file in each game directory and launch that. This makes for a cleaner setup as you don't need to run game configuration utilities like INSTALL.EXE or SETUP.EXE directly as you would with DOSBox. Rather the game configuration is done within the ScummVM emulator.
@ -2570,7 +2591,15 @@ Finally there's an emulator entry named _EKA2L1 [Custom device] (Standalone)_ wh
### Tandy Color Computer
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 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 MAME standalone or the [XRoar](http://www.6809.org.uk/xroar) emulator.
**MAME**
To use MAME you simply need the `coco.zip` and `coco_fdc.zip` BIOS files in the ROMs/coco directory and your games should work. Note however that only cartridge and tape files can be used with MAME (via two separate emulator entries), and not diskettes.
When running tape files there is quite some loading time involved, so it's recommended to fast-forward through the loading process. How this is done differs per platform but usually it's via the page down key on Linux and via the insert key on Windows. For this to work you may first need to disable UI controls in MAME via the scroll lock key. For MAME4droid 2024 you can hold the Start and A buttons to fast-forward. For additional details about this functionality refer to the MAME documentation.
**XRoar**
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-DEV.md#using-manually-downloaded-emulators-on-linux) section of this guide for more details on where you need to install it.
@ -2619,11 +2648,17 @@ 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 Linux and macOS.
These games can be run using either MAME standalone or the Oricutron emulator. The latter is readily available on Windows but quite problematic to get hold on for Linux and macOS. It's also not available for Android at all.
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.
**MAME**
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):
To use MAME you simply need the `oric1.zip` BIOS file in the ROMs/oric directory and your games should work. Note however that only tape files can be used with MAME, and not diskettes. To run diskette files you will need to use Oricutron instead.
When running tape files there is quite some loading time involved, so it's recommended to fast-forward through the loading process. How this is done differs per platform but usually it's via the page down key on Linux and via the insert key on Windows. For this to work you may first need to disable UI controls in MAME via the scroll lock key. For MAME4droid 2024 you can hold the Start and A buttons to fast-forward. For additional details about this functionality refer to the MAME documentation.
**Oricutron**
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. 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
@ -2644,6 +2679,8 @@ Once the emulator is up and running there is not really much else to consider, s
The TI-99 is emulated via MAME, and only the standalone release of this emulator is supported. Unfortunately it seems as if the Homebrew build on macOS is broken as no TI-99 games can be launched. 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.
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID-DEV.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
Emulating the TI-99 can be quite confusing as games are available in various incompatible formats, and most emulators are particular when it comes to what file types they support. In ES-DE only cartridge-based games are supported, so you can't for instance play games distributed as floppy disk images. And only games packaged for MAME using the MAME software list name standard can be used. This includes .7z and .zip files as well as .rpk cartridge images. It's strongly recommended to go for the MAME TI-99 ROM set that consists only of .zip files as these have the highest chance of working correctly.
In addition to the game files you need the `ti99_4a.zip` archive which contains the TI-99 system ROMs. This file has to be placed in the root of the `~/ROMs/ti99` directory.
@ -2655,6 +2692,19 @@ Scraping can also be a bit challenging as MAME software list names are used and
### Visual Pinball
**Android**
Unfortunately there does not seem to be a way to launch individual Visual Pinball tables from ES-DE on Android, instead the Visual Pinball user interface will open on game launch and you need to manually start your table from there. This means tables need to be installed upfront in Visual Pinball and .vpinball dummy files should be added to the `ROMs/vpinball` directory. These will then appear as individual games inside ES-DE and you can add metadata to them, scrape them etc.
Here's an example setup:
```
/storage/emulated/0/ROMs/vpinball/Apollo 13.vpinball
/storage/emulated/0/ROMs/vpinball/Judge Dredd.vpinball
```
**Linux, macOS and Windows**
The pinball simulator Visual Pinball can be a bit tricky to setup as it supports a wide range of tables. Some of these require [PinMAME](https://github.com/vpinball/pinmame) and some don't. Some simulated tables are older electromechnical design and some are of more modern solid state designs. Some are recreations of real physical games and some are purely virtual and don't exist in physical form. In many cases there is not a definitive release for a table and you may need to assemble various files to get to a fully working game.
As pinball games is a complex topic it will only be covered briefly here, refer to the official Visual Pinball [documentation](https://github.com/vpinball/vpinball/blob/standalone/standalone/README.md) for more details.
@ -3550,6 +3600,10 @@ MAME software list names for all arcade systems are automatically expanded to th
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.
**Back button/back swipe exits app** _(Android only)_
Whether to exit the application when swiping back or pressing the back button.
**Debug mode**
Enabling this option will output detailed debug messages to es_log.txt and it also makes it possible to use the debug overlays and shortcuts which are documented in more depth in [INSTALL-DEV.md](INSTALL-DEV.md#debug-mode). Enabling this setting is equivalent to passing the --debug command line option. Make sure to only enable this setting when you really need it as it will slow down the application and cause the es_log.txt file to grow substantially. When passing the --debug command line option this setting will be grayed out in the menu.
@ -3712,11 +3766,11 @@ This is the name that will be shown when browsing the gamelist. If no sortname h
**Sortname** _(files only)_
This entry makes it possible to change the sorting of a game without having to change its name. For instance it can be used to sort _Mille Miglia_ as _1000 Miglia_ or _The Punisher_ as _Punisher, The_. Note that the _Jump to..._ quick selector on the gamelist options menu will base its index on the first character of the sortname if it exists for a game, which could be slightly confusing in some instances when quick jumping in the gamelist. The _sortname_ entry also affects custom collections, although for these it's possible to override the value as described below. This entry only applies if the sort order has been set to _Name, ascending_ or _Name, descending_.
This entry makes it possible to change the sorting of a game without having to change its name. For instance it can be used to sort _Mille Miglia_ as _1000 Miglia_ or _The Punisher_ as _Punisher, The_. Note that the _Jump to..._ quick selector on the gamelist options menu will base its index on the first character of the sortname if it exists for a game, which could be slightly confusing in some instances when quick jumping in the gamelist. The _sortname_ entry also affects custom collections, although for these it's possible to override the value as described below. This entry only applies if the sort order has been set to _Name, ascending_ or _Name, descending_. All sorting is in lexicographic order.
**Custom collections sortname** _(only visible when editing a game from within a custom collection)_
This entry works exactly like _sortname_ but will only affect the sorting for custom collections, meaning the normal system gamelists and the automatic collections (_All games, Favorites_ and _Last played_) will not be affected by this value. If there is both a _sortname_ and a _custom collections sortname_ defined, the latter will take precedence. This also means that the _Jump to..._ quick selector will use the custom collections sortname for its letter index even if there is a different value defined for the regular sortname field. Note that _custom collections sortname_ is completely optional and is only intended for overriding the regular _sortname_ field. Also note that it will affect all custom collections where the game is present; it's not possible to set a different value per collection.
This entry works exactly like _sortname_ but will only affect the sorting for custom collections, meaning the normal system gamelists and the automatic collections (_All games, Favorites_ and _Last played_) will not be affected by this value. If there is both a _sortname_ and a _custom collections sortname_ defined, the latter will take precedence. This also means that the _Jump to..._ quick selector will use the custom collections sortname for its letter index even if there is a different value defined for the regular sortname field. Note that _custom collections sortname_ is completely optional and is only intended for overriding the regular _sortname_ field. Also note that it will affect all custom collections where the game is present; it's not possible to set a different value per collection. All sorting is in lexicographic order.
**Description**
@ -3975,18 +4029,20 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| System name | Full name | Default emulator | Alternative emulators | Needs BIOS | Recommended game setup |
| :-------------------- | :--------------------------------------------- | :-------------------------------- | :-------------------------------- | :----------- | :----------------------------------- |
| 3do | 3DO Interactive Multiplayer | Opera | | Yes | |
| adam | Coleco Adam | MAME [Diskette] **(Standalone)** | MAME [Tape] **(Standalone)**,<br>MAME [Cartridge] **(Standalone)**,<br>MAME [Software list] **(Standalone)** | Yes | |
| adam | Coleco Adam | MAME [Diskette] **(Standalone)** | MAME [Tape] **(Standalone)**,<br>MAME [Cartridge] **(Standalone)**,<br>MAME [Software list] **(Standalone)**,<br>ColEm **(Standalone)** [LW] | Yes | |
| ags | Adventure Game Studio Game Engine | _Shortcut or script_ | | No | |
| amiga | Commodore Amiga | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amiga1200 | Commodore Amiga 1200 | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amiga600 | Commodore Amiga 600 | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amigacd32 | Commodore Amiga CD32 | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS,<br>CPCemu **(Standalone)**,<br>MAME **(Standalone)** | Yes for MAME | Single archive or disk file |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS,<br>CPCemu **(Standalone)**,<br>ACE-DL **(Standalone)**,<br>MAME **(Standalone)** | Yes for MAME | Single archive or disk file |
| android | Google Android | BlueStacks **(Standalone)** [W] | | No | Shortcut (.lnk) file |
| androidapps | Android Apps | _Placeholder_ | | | |
| androidgames | Android Games | _Placeholder_ | | | |
| apple2 | Apple II | LinApple **(Standalone)** [L],<br>Mednafen **(Standalone)** [M],<br>AppleWin **(Standalone)** [W] | Mednafen **(Standalone)** [LW],<br>MAME - Current,<br>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,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Kronos [LW],<br>Model 2 Emulator **(Standalone)** [W],<br>Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],<br>Supermodel **(Standalone)** [LW],<br> _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 |
| arcadia | Emerson Arcadia 2001 | MAME - Current | MAME **(Standalone)**,<br>WinArcadia **(Standalone)** | No | Single archive or ROM file |
| archimedes | Acorn Archimedes | MAME [Model A440/1] **(Standalone)** | MAME [Model A3000] **(Standalone)**,<br>MAME [Model A310] **(Standalone)**,<br>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 |
@ -3994,8 +4050,8 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| atari5200 | Atari 5200 | a5200 | Atari800,<br>Atari800 **(Standalone)**,<br>Altirra **(Standalone)** [W] | Yes except for Altirra | Single archive or ROM file |
| atari7800 | Atari 7800 ProSystem | ProSystem | MAME - Current,<br>MAME **(Standalone)** | Yes | Single archive or ROM file |
| atari800 | Atari 800 | Atari800 | Atari800 **(Standalone)**,<br>Altirra **(Standalone)** [W] | Yes except for Altirra | |
| atarijaguar | Atari Jaguar | Virtual Jaguar | BigPEmu **(Standalone)** [W],<br>BigPEmu **(Wine)** [L],<br>BigPEmu **(Proton)** [L],<br>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],<br>BigPEmu **(Wine)** [L] | BigPEmu **(Proton)** [L] | No | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide |
| atarijaguar | Atari Jaguar | Virtual Jaguar | BigPEmu **(Standalone)** [LW],<br>BigPEmu **(Wine)** [L],<br>BigPEmu **(Proton)** [L],<br>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)** [LW] | BigPEmu **(Wine)** [L],<br>BigPEmu **(Proton)** [L] | No | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide |
| atarilynx | Atari Lynx | Handy | Beetle Lynx,<br>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)**,<br>Altirra **(Standalone)** [W] | Yes except for Altirra | |
@ -4006,8 +4062,8 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| cdtv | Commodore CDTV | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>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,<br>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,<br>openMSX **(Standalone)**,<br>ares **(Standalone)** | Yes | Single archive or ROM file |
| coco | Tandy Color Computer | XRoar CoCo 2 NTSC **(Standalone)** | XRoar CoCo 2 PAL **(Standalone)**,<br>MAME [Cartridge] **(Standalone)**,<br>MAME [Tape] **(Standalone)** | Yes | See the specific _Tandy Color Computer_ section elsewhere in this guide |
| colecovision | Coleco ColecoVision | blueMSX | Gearcoleco,<br>openMSX **(Standalone)**,<br>ares **(Standalone)**,<br>ColEm **(Standalone)** [LW] | Yes | Single archive or ROM file |
| consolearcade | Console Arcade Systems | MAME - Current | MAME **(Standalone)**,<br>Flycast,<br>Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Kronos [LW],<br>Mednafen [Sega Saturn] **(Standalone)**,<br>Play! **(Standalone)**,<br>RPCS3 Shortcut **(Standalone)**,<br>Triforce **(Standalone)** [LW],<br>xemu **(Standalone)**,<br>Cxbx-Reloaded **(Standalone)** [W],<br> _Shortcut or script_ | Depends | See the specific _Console Arcade Systems_ section elsewhere in this guide |
| cps | Capcom Play System | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>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,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide |
@ -4073,7 +4129,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| naomi | Sega NAOMI | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Demul **(Standalone)** [W] | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomi2 | Sega NAOMI 2 | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Demul **(Standalone)** [W] | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomigd | Sega NAOMI GD-ROM | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| n3ds | Nintendo 3DS | Citra [LW],<br>Citra **(Standalone)** [M] | Citra 2018 [LW],<br>Citra **(Standalone)** [LW],<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n3ds | Nintendo 3DS | Citra [LW],<br>Citra **(Standalone)** [M] | Citra 2018 [LW],<br>Citra **(Standalone)** [LW],<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n64 | Nintendo 64 | Mupen64Plus-Next | Mupen64Plus **(Standalone)**,<br>ParaLLEl N64,<br>simple64 **(Standalone)** [LW],<br>Rosalie's Mupen GUI **(Standalone)** [LW],<br>Project64 **(Standalone)** [W],<br>ares **(Standalone)**,<br>sixtyforce **(Standalone)** [M] | No | Single archive or ROM file |
| n64dd | Nintendo 64DD | ParaLLEl N64 [LW],<br>Mupen64Plus-Next [M] | Mupen64Plus-Next [LW],<br>ParaLLEl N64 [M],<br>Rosalie's Mupen GUI **(Standalone)** [LW],<br>ares **(Standalone)** | Yes | See the specific _Nintendo 64DD_ section elsewhere in this guide |
| nds | Nintendo DS | melonDS DS | melonDS @,<br>melonDS **(Standalone)**,<br>DeSmuME,<br>DeSmuME 2015,<br>DeSmuME **(Standalone)** [L],<br>SkyEmu **(Standalone)** | No | Single archive or ROM file |
@ -4086,7 +4142,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| ngpc | SNK Neo Geo Pocket Color | Beetle NeoPop | RACE,<br>Mednafen **(Standalone)**,<br>ares **(Standalone)** | No | Single archive or ROM file |
| odyssey2 | Magnavox Odyssey 2 | O2EM | MAME - Current,<br>MAME **(Standalone)** | Yes | Single archive or ROM file |
| 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 |
| oric | Tangerine Computer Systems Oric | MAME **(Standalone)** | Oricutron **(Standalone)** | Yes | See the specific _Tangerine Computer Systems Oric_ section elsewhere in this guide |
| palm | Palm OS | Mu | | | |
| pc | IBM PC | DOSBox-Pure | DOSBox-Core,<br>DOSBox-SVN,<br>DOSBox-X **(Standalone)**,<br>DOSBox Staging **(Standalone)** | No | See the specific _DOS / PC_ section elsewhere in this guide |
| pc88 | NEC PC-8800 Series | QUASI88 | QUASI88 **(Standalone)** | Yes | |
@ -4129,7 +4185,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| sufami | Bandai SuFami Turbo | Snes9x - Current | Snes9x 2010,<br>Snes9x 2005 Plus,<br>Snes9x **(Standalone)**,<br>bsnes,<br>bsnes-hd,<br>bsnes-mercury Accuracy,<br>bsnes **(Standalone)** [LW],<br>ares **(Standalone)** | | |
| supergrafx | NEC SuperGrafx | Beetle SuperGrafx | Beetle PCE,<br>Mednafen **(Standalone)**,<br>Mesen **(Standalone)** [LW],<br>ares **(Standalone)** | No | Single archive or ROM file |
| supervision | Watara Supervision | Potator | MAME - Current,<br>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 |
| supracan | Funtech Super A'Can | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file. You need a supracan.zip archive that contains a valid internal_68k.bin file and an empty file named umc6650.bin |
| switch | Nintendo Switch | Ryujinx **(Standalone)** | | Yes | |
| symbian | Symbian | EKA2L1 [Nokia N-Gage] **(Standalone)** | EKA2L1 [Nokia N70] **(Standalone)**,<br>EKA2L1 [Nokia N97] **(Standalone)**,<br>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 |
@ -4157,10 +4213,10 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| wonderswan | Bandai WonderSwan | Beetle Cygne | Mednafen **(Standalone)**,<br>ares **(Standalone)**,<br>ares [Benesse Pocket Challenge V2] **(Standalone)** | No | Single archive or ROM file |
| wonderswancolor | Bandai WonderSwan Color | Beetle Cygne | Mednafen **(Standalone)**,<br>ares **(Standalone)** | No | Single archive or ROM file |
| x1 | Sharp X1 | X Millennium | MAME [Diskette] **(Standalone)**,<br>MAME [Tape] **(Standalone)** | Yes for MAME | Single archive or diskette/tape file |
| x68000 | Sharp X68000 | PX68k | MAME **(Standalone)** | Yes | |
| x68000 | Sharp X68000 | PX68k | MAME **(Standalone)**,<br>XM6 Pro-68k **(Standalone)** [W],<br>XM6 Pro-68k **(Wine)** [L],<br>XM6 Pro-68k **(Proton)** [L] | Yes except for XM6 Pro-68k | |
| 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],<br>xenia **(Wine)** [L] | xenia **(Proton)** [L],<br> _Shortcut or script_ [L] | No | See the specific _Microsoft Xbox 360_ section elsewhere in this guide |
| zmachine | Infocom Z-machine | Gargoyle **(Standalone)** | | No | |
| zmachine | Infocom Z-machine | MojoZork | Gargoyle **(Standalone)** | No | |
| zx81 | Sinclair ZX81 | EightyOne | | | |
| zxnext | Sinclair ZX Spectrum Next | #CSpect **(Standalone)** [LW],<br>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 |

View file

@ -300,9 +300,9 @@ The Android port of ES-DE is quite different than the other versions, so it has
## 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.
By default ES-DE on the Raspberry Pi requires a desktop environment to run, or more specifically a window manager and a sound server (like PulseAudio or PipeWire). It is however possible to use KMS/direct framebuffer access if the DEINIT_ON_LAUNCH flag is used when building ES-DE, as documented in the _Building on Unix_ section of the [INSTALL.md](INSTALL.md#building-on-unix) document.
Also note that there are no prebuilt packages for the Raspberry Pi, so you will need to compile ES-DE yourself. Fortunately this is easy to do and the process is documented [here](INSTALL.md#building-on-unix).
Note that there are no prebuilt packages for the Raspberry Pi, so you will need to compile ES-DE yourself. Fortunately this is easy to do and the process is documented [here](INSTALL.md#building-on-unix).
The Raspberry Pi 4/400 is the minimum recommended version and earlier boards have not been tested.
@ -677,6 +677,7 @@ The following emulators are supported in AppImage format when using the bundled
| macintosh | Basilisk II | BasiliskII*.AppImage |
| macintosh | SheepShaver | SheepShaver*.AppImage |
| n3ds | Citra | citra-qt*.AppImage |
| n3ds | Lime3DS | lime3ds-gui*.AppImage |
| n3ds | Panda3DS | Alber-*.AppImage |
| n64/n64dd | Rosalie's Mupen GUI | RMG*.AppImage |
| ngage/symbian | EKA2L1 | EKA2L1*.AppImage |
@ -759,10 +760,13 @@ The following manually downloaded emulators are supported when using the bundled
| System name | Emulator | Filename |
| :-------------------------------------- | :--------------- | :-------------------------------- |
| adam/colecovision | ColEm | colem/colem |
| amiga/amiga1200/amiga600/amigacd32/cdtv | Amiberry | amiberry/amiberry |
| amstradcpc | ACE-DL | AceDL/AceDL |
| amstradcpc | CPCemu | cpcemu/cpcemu |
| apple2 | LinApple | linapple/linapple |
| atari2600 | Gopher2600 | gopher2600/gopher2600_linux_amd64 |
| atarijaguar/atarijaguarcd | BigPEmu | bigpemu/bigpemu |
| coco/dragon32/tanodragon | XRoar | xroar/xroar |
| daphne | Hypseus Singe | hypseus-singe/hypseus.bin |
| dreamcast | Redream | redream/redream |
@ -877,6 +881,7 @@ The following Windows emulators are supported, and the setup for most of these i
| atarijaguar/atarijaguarcd | BigPEmu | BigPEmu/BigPEmu.exe |
| famicom/nes | 3dSen | 3dSen/3dSen.exe |
| model2 | Model 2 Emulator | m2emulator/EMULATOR.EXE |
| x68000 | XM6 Pro-68k | XM6 Pro-68k/XM6.exe |
| xbox360 | xenia | xenia/xenia.exe |
| xbox360 | xenia | xenia/xenia_canary.exe |
@ -1098,6 +1103,8 @@ Not all systems are as simple to setup as what was described in the previous sec
### Apple II
On Android only MAME4droid 2024 is supported for the apple2 system. Make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
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 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.
@ -1119,7 +1126,9 @@ https://docs.mamedev.org/usingmame/defaultkeys.html
### Apple IIGS
The Apple IIGS computer is emulated using MAME. There is a dedicated emulator available for this system named [GSplus](https://apple2.gs/plus) but it appears to not be able to parse command line parameters correctly so disk images can't be supplied to it. As such it's currently unsupported.
The Apple IIGS computer is emulated using MAME. On desktop operating systems there is a dedicated emulator available for this system named [GSplus](https://apple2.gs/plus) but it appears to not be able to parse command line parameters correctly so disk images can't be supplied to it. As such it's currently unsupported.
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
In order to run Apple IIGS games in MAME, you need to place the following ROM file in the ~/ROMs/apple2gs directory:
```
@ -1131,7 +1140,9 @@ https://docs.mamedev.org/usingmame/defaultkeys.html
### Apple Macintosh
There are two approaches to emulating these computers, the first is using games booted from diskettes and the second is to setup an entire OS installation as a hard disk image and run the games from there. The first approach is only applicable for older models like the Macintosh SE and Macintosh Plus (i.e. the era prior to hard drives becoming prevalent), and the second approach can be used for more modern models.
On Android only MAME4droid 2024 is supported for the macintosh system. Make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
There are two approaches to emulating these computers, the first is using games booted from diskettes and the second is to setup an entire OS installation as a hard disk image and run the games from there (this latter approach is not supported on Android). The first approach is only applicable for older models like the Macintosh SE and Macintosh Plus (i.e. the era prior to hard drives becoming prevalent), and the second approach can be used for more modern models.
**Method 1, booting from diskette images**
@ -1142,6 +1153,8 @@ Booting from diskettes is the default approach and MAME standalone is used for t
* MAME Mac Plus Bootable (Standalone)
* MAME Mac Plus Boot Disk (Standalone)
Note that on Android these emulator entries are named slightly differently as the MAME4droid 2024 emulator is used on this operating system.
To use these you need the MAME files adbmodem.zip, macse.zip and macplus.zip placed in the `~/ROMs/macintosh/` directory.
The _Bootable_ entries are straightforward, these are games that are self-contained on a single diskette and that can simply be booted as-is. The _Boot Disk_ entries are games that can't be booted directly but instead require a separate boot diskette. To run these you need to place a disk image named `boot.dsk` together with the game files and ES-DE will then insert this into the first floppy drive on game launch and place the game diskette in the second floppy drive. Once Mac OS has started up you can then start the game from inside the operating system. Basically any bootable diskette can be used as long as it's 400K or 800K in size and runs a Mac OS release compatible with the game you intend to play. For example the _System Tools_ diskette from the System 6.0.8 installation media works fine for this purpose.
@ -1189,6 +1202,8 @@ Note that scraper support is currently very poor for this system, so you may nee
### Arcade and Neo Geo
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
**General**
For all the supported MAME variants as well as Final Burn Alpha/FinalBurn Neo and Neo Geo, single file archives should be used. These files should retain the MAME software list filenames as ES-DE ships with MAME lookup tables, meaning the software list names are automatically expanded to full game names.
@ -1276,7 +1291,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 [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.
The only emulator that can run Atari Jaguar CD games is [BigPEmu](https://www.richwhitehouse.com/jaguar/) which is available for Linux and Windows. On Linux you can also run the Windows release of this emulator, should you want to. 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.
@ -1295,7 +1310,7 @@ That's basically it, for the atarijaguar system just make sure to select _BigPEm
There are many settings in Wine that may affect compatibility, performance etc. but covering all that is beyond the scope of this guide.
In addition to the above instructions there's an unofficial YouTube video available on how to setup BigPEmu with ES-DE:\
In addition to the above instructions there's an unofficial YouTube video available on how to setup the Windows release of BigPEmu with ES-DE:\
https://www.youtube.com/watch?v=GuPAjgICc-4
### Commodore Amiga and CDTV
@ -1388,6 +1403,8 @@ https://github.com/BlitterStudio/amiberry/wiki/Kickstart-ROMs-%28BIOS%29
### Console Arcade Systems
Note that on Android specifically some of the arcade boards mentioned below are not supported as there are simply no suitable emulators available.
The _consolearcade_ system is intended for the various arcade boards that were based on home console platforms. For many of the older systems MAME can be used for emulation, but some of the more modern systems require the use of other emulators, which is precisely what is provided by this system.
The following arcade boards have been considered:
@ -1507,13 +1524,13 @@ Setup for the standalone EasyRPG Player is identical with the exception that run
### Fujitsu FM Towns
This system is emulated using MAME or Tsugaru.
This system is emulated using MAME or Tsugaru on desktop operating systems and MAME4droid 2024 on Android.
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
**MAME**
As of the time of writing MAME has somehow preliminary FM Towns support, but it seems to work well enough for most games and support will likely improve over time.
Only CD-ROM games are supported and the .chd format is recommended. It's not adviced to go for game files using MAME software list names as these can't be scraped by either ScreenScraper or TheGames DB. It's instead better to use files with full game names.
When using MAME only CD-ROM games are supported and the .chd format is recommended. It's not adviced to go for game files using MAME software list names as these can't be scraped by either ScreenScraper or TheGames DB. It's instead better to use files with full game names.
You also need the `fmtowns.zip` BIOS archive placed in ~/ROMs/fmtowns/ for the games to run.
@ -1580,6 +1597,8 @@ To map the controller to the keyboard and to set a 33 MHz CPU speed, the file co
### LaserDisc Games
Note that on Android the Hypseus Singe emulator is not available. However the setup for MAME (using MAME4droid 2024) and DirkSimple still applies. If using Android also make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
There are three ways to run LaserDisc games in ES-DE, via MAME, via Hypseus Singe or via the DirkSimple RetroArch core. There are also two separate systems available, _daphne_ and _laserdisc_. The latter is recommended as the _daphne_ system is mostly existing for legacy reasons and may be removed in a future ES-DE release. The configuration for these two systems is identical as they are essentially clones.
At the time of writing MAME and Hypseus Singe are mostly mutually exlusive as MAME tends to primarily support the games that Hypseus Singe doesn't support. In the future this is likely to change with MAME getting support for more LaserDisc games.
@ -2336,6 +2355,8 @@ On Linux it's also possible to launch AppImages directly without having to call
### ScummVM
Note that the Android release of ScummVM standalone differs from the releases for desktop operating systems in that all games need to be installed in the app before they can be launched from ES-DE. There are some very specific configuration steps that need to be followed to get this to work, but they are thoroughly described in the ScummVM user interface the first time you launch the app, and there is also a built-in help system that you can peruse. Apart from that the setup is identical to the other platforms.
ScummVM overlaps a bit with DOS when it comes to the logic of setting it up. It's recommended to keep games in separate folders, so if you have a game distributed as a ZIP file, uncompress it to its own directory.
Although ScummVM supports launching of .exe files, ES-DE is currently not configured as such and it's instead recommended to create a .scummvm file in each game directory and launch that. This makes for a cleaner setup as you don't need to run game configuration utilities like INSTALL.EXE or SETUP.EXE directly as you would with DOSBox. Rather the game configuration is done within the ScummVM emulator.
@ -2488,7 +2509,6 @@ Here's an example 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.
After you have the emulator up and running you need to install ROMs for the devices you want to emulate. For the _ngage_ system you want to use the RH-29 ROM, and for the _symbian_ system ES-DE comes preconfigured with emulator entries for the RH-29 (Nokia N-Gage), RM-84 (Nokia N70) and RM-507 (Nokia N97) models. In addition to those there's a custom device entry that is explained in more depth later below. The details of ROM installation and how to setup the emulator is covered by this official YouTube video by the EKA2L1 team:
https://www.youtube.com/watch?v=rFUlsSGkRjc&list=PLkrpMo4_xadtJ_Kqvc5BSTSi39ollsAbR
@ -2569,7 +2589,15 @@ Finally there's an emulator entry named _EKA2L1 [Custom device] (Standalone)_ wh
### Tandy Color Computer
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 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 MAME standalone or the [XRoar](http://www.6809.org.uk/xroar) emulator.
**MAME**
To use MAME you simply need the `coco.zip` and `coco_fdc.zip` BIOS files in the ROMs/coco directory and your games should work. Note however that only cartridge and tape files can be used with MAME (via two separate emulator entries), and not diskettes.
When running tape files there is quite some loading time involved, so it's recommended to fast-forward through the loading process. How this is done differs per platform but usually it's via the page down key on Linux and via the insert key on Windows. For this to work you may first need to disable UI controls in MAME via the scroll lock key. For MAME4droid 2024 you can hold the Start and A buttons to fast-forward. For additional details about this functionality refer to the MAME documentation.
**XRoar**
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.
@ -2618,11 +2646,17 @@ 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 Linux and macOS.
These games can be run using either MAME standalone or the Oricutron emulator. The latter is readily available on Windows but quite problematic to get hold on for Linux and macOS. It's also not available for Android at all.
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.
**MAME**
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):
To use MAME you simply need the `oric1.zip` BIOS file in the ROMs/oric directory and your games should work. Note however that only tape files can be used with MAME, and not diskettes. To run diskette files you will need to use Oricutron instead.
When running tape files there is quite some loading time involved, so it's recommended to fast-forward through the loading process. How this is done differs per platform but usually it's via the page down key on Linux and via the insert key on Windows. For this to work you may first need to disable UI controls in MAME via the scroll lock key. For MAME4droid 2024 you can hold the Start and A buttons to fast-forward. For additional details about this functionality refer to the MAME documentation.
**Oricutron**
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. 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
@ -2643,6 +2677,8 @@ Once the emulator is up and running there is not really much else to consider, s
The TI-99 is emulated via MAME, and only the standalone release of this emulator is supported. Unfortunately it seems as if the Homebrew build on macOS is broken as no TI-99 games can be launched. 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.
If using Android then make sure you've read the _MAME4droid 2024 and MAME4droid_ section of the [Android documentation](ANDROID.md#mame4droid-2024-and-mame4droid) and that your ROM directory is configured correctly inside the emulator.
Emulating the TI-99 can be quite confusing as games are available in various incompatible formats, and most emulators are particular when it comes to what file types they support. In ES-DE only cartridge-based games are supported, so you can't for instance play games distributed as floppy disk images. And only games packaged for MAME using the MAME software list name standard can be used. This includes .7z and .zip files as well as .rpk cartridge images. It's strongly recommended to go for the MAME TI-99 ROM set that consists only of .zip files as these have the highest chance of working correctly.
In addition to the game files you need the `ti99_4a.zip` archive which contains the TI-99 system ROMs. This file has to be placed in the root of the `~/ROMs/ti99` directory.
@ -2654,6 +2690,19 @@ Scraping can also be a bit challenging as MAME software list names are used and
### Visual Pinball
**Android**
Unfortunately there does not seem to be a way to launch individual Visual Pinball tables from ES-DE on Android, instead the Visual Pinball user interface will open on game launch and you need to manually start your table from there. This means tables need to be installed upfront in Visual Pinball and .vpinball dummy files should be added to the `ROMs/vpinball` directory. These will then appear as individual games inside ES-DE and you can add metadata to them, scrape them etc.
Here's an example setup:
```
/storage/emulated/0/ROMs/vpinball/Apollo 13.vpinball
/storage/emulated/0/ROMs/vpinball/Judge Dredd.vpinball
```
**Linux, macOS and Windows**
The pinball simulator Visual Pinball can be a bit tricky to setup as it supports a wide range of tables. Some of these require [PinMAME](https://github.com/vpinball/pinmame) and some don't. Some simulated tables are older electromechnical design and some are of more modern solid state designs. Some are recreations of real physical games and some are purely virtual and don't exist in physical form. In many cases there is not a definitive release for a table and you may need to assemble various files to get to a fully working game.
As pinball games is a complex topic it will only be covered briefly here, refer to the official Visual Pinball [documentation](https://github.com/vpinball/vpinball/blob/standalone/standalone/README.md) for more details.
@ -3549,6 +3598,10 @@ MAME software list names for all arcade systems are automatically expanded to th
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.
**Back button/back swipe exits app** _(Android only)_
Whether to exit the application when swiping back or pressing the back button.
**Debug mode**
Enabling this option will output detailed debug messages to es_log.txt and it also makes it possible to use the debug overlays and shortcuts which are documented in more depth in [INSTALL.md](INSTALL.md#debug-mode). Enabling this setting is equivalent to passing the --debug command line option. Make sure to only enable this setting when you really need it as it will slow down the application and cause the es_log.txt file to grow substantially. When passing the --debug command line option this setting will be grayed out in the menu.
@ -3711,11 +3764,11 @@ This is the name that will be shown when browsing the gamelist. If no sortname h
**Sortname** _(files only)_
This entry makes it possible to change the sorting of a game without having to change its name. For instance it can be used to sort _Mille Miglia_ as _1000 Miglia_ or _The Punisher_ as _Punisher, The_. Note that the _Jump to..._ quick selector on the gamelist options menu will base its index on the first character of the sortname if it exists for a game, which could be slightly confusing in some instances when quick jumping in the gamelist. The _sortname_ entry also affects custom collections, although for these it's possible to override the value as described below. This entry only applies if the sort order has been set to _Name, ascending_ or _Name, descending_.
This entry makes it possible to change the sorting of a game without having to change its name. For instance it can be used to sort _Mille Miglia_ as _1000 Miglia_ or _The Punisher_ as _Punisher, The_. Note that the _Jump to..._ quick selector on the gamelist options menu will base its index on the first character of the sortname if it exists for a game, which could be slightly confusing in some instances when quick jumping in the gamelist. The _sortname_ entry also affects custom collections, although for these it's possible to override the value as described below. This entry only applies if the sort order has been set to _Name, ascending_ or _Name, descending_. All sorting is in lexicographic order.
**Custom collections sortname** _(only visible when editing a game from within a custom collection)_
This entry works exactly like _sortname_ but will only affect the sorting for custom collections, meaning the normal system gamelists and the automatic collections (_All games, Favorites_ and _Last played_) will not be affected by this value. If there is both a _sortname_ and a _custom collections sortname_ defined, the latter will take precedence. This also means that the _Jump to..._ quick selector will use the custom collections sortname for its letter index even if there is a different value defined for the regular sortname field. Note that _custom collections sortname_ is completely optional and is only intended for overriding the regular _sortname_ field. Also note that it will affect all custom collections where the game is present; it's not possible to set a different value per collection.
This entry works exactly like _sortname_ but will only affect the sorting for custom collections, meaning the normal system gamelists and the automatic collections (_All games, Favorites_ and _Last played_) will not be affected by this value. If there is both a _sortname_ and a _custom collections sortname_ defined, the latter will take precedence. This also means that the _Jump to..._ quick selector will use the custom collections sortname for its letter index even if there is a different value defined for the regular sortname field. Note that _custom collections sortname_ is completely optional and is only intended for overriding the regular _sortname_ field. Also note that it will affect all custom collections where the game is present; it's not possible to set a different value per collection. All sorting is in lexicographic order.
**Description**
@ -3974,18 +4027,20 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| System name | Full name | Default emulator | Alternative emulators | Needs BIOS | Recommended game setup |
| :-------------------- | :--------------------------------------------- | :-------------------------------- | :-------------------------------- | :----------- | :----------------------------------- |
| 3do | 3DO Interactive Multiplayer | Opera | | Yes | |
| adam | Coleco Adam | MAME [Diskette] **(Standalone)** | MAME [Tape] **(Standalone)**,<br>MAME [Cartridge] **(Standalone)**,<br>MAME [Software list] **(Standalone)** | Yes | |
| adam | Coleco Adam | MAME [Diskette] **(Standalone)** | MAME [Tape] **(Standalone)**,<br>MAME [Cartridge] **(Standalone)**,<br>MAME [Software list] **(Standalone)**,<br>ColEm **(Standalone)** [LW] | Yes | |
| ags | Adventure Game Studio Game Engine | _Shortcut or script_ | | No | |
| amiga | Commodore Amiga | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amiga1200 | Commodore Amiga 1200 | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amiga600 | Commodore Amiga 600 | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amigacd32 | Commodore Amiga CD32 | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS,<br>CPCemu **(Standalone)**,<br>MAME **(Standalone)** | Yes for MAME | Single archive or disk file |
| amstradcpc | Amstrad CPC | Caprice32 | CrocoDS,<br>CPCemu **(Standalone)**,<br>ACE-DL **(Standalone)**,<br>MAME **(Standalone)** | Yes for MAME | Single archive or disk file |
| android | Google Android | BlueStacks **(Standalone)** [W] | | No | Shortcut (.lnk) file |
| androidapps | Android Apps | _Placeholder_ | | | |
| androidgames | Android Games | _Placeholder_ | | | |
| apple2 | Apple II | LinApple **(Standalone)** [L],<br>Mednafen **(Standalone)** [M],<br>AppleWin **(Standalone)** [W] | Mednafen **(Standalone)** [LW],<br>MAME - Current,<br>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,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Kronos [LW],<br>Model 2 Emulator **(Standalone)** [W],<br>Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],<br>Supermodel **(Standalone)** [LW],<br> _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 |
| arcade | Arcade | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Kronos [LW],<br>Model 2 Emulator **(Standalone)** [W],<br>Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],<br>Supermodel **(Standalone)** [LW],<br> _Shortcut or script_ | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide |
| arcadia | Emerson Arcadia 2001 | MAME - Current | MAME **(Standalone)**,<br>WinArcadia **(Standalone)** | No | Single archive or ROM file |
| archimedes | Acorn Archimedes | MAME [Model A440/1] **(Standalone)** | MAME [Model A3000] **(Standalone)**,<br>MAME [Model A310] **(Standalone)**,<br>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 |
@ -3993,8 +4048,8 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| atari5200 | Atari 5200 | a5200 | Atari800,<br>Atari800 **(Standalone)**,<br>Altirra **(Standalone)** [W] | Yes except for Altirra | Single archive or ROM file |
| atari7800 | Atari 7800 ProSystem | ProSystem | MAME - Current,<br>MAME **(Standalone)** | Yes | Single archive or ROM file |
| atari800 | Atari 800 | Atari800 | Atari800 **(Standalone)**,<br>Altirra **(Standalone)** [W] | Yes except for Altirra | |
| atarijaguar | Atari Jaguar | Virtual Jaguar | BigPEmu **(Standalone)** [W],<br>BigPEmu **(Wine)** [L],<br>BigPEmu **(Proton)** [L],<br>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],<br>BigPEmu **(Wine)** [L] | BigPEmu **(Proton)** [L] | No | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide |
| atarijaguar | Atari Jaguar | Virtual Jaguar | BigPEmu **(Standalone)** [LW],<br>BigPEmu **(Wine)** [L],<br>BigPEmu **(Proton)** [L],<br>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)** [LW] | BigPEmu **(Wine)** [L],<br>BigPEmu **(Proton)** [L] | No | See the specific _Atari Jaguar and Atari Jaguar CD_ section elsewhere in this guide |
| atarilynx | Atari Lynx | Handy | Beetle Lynx,<br>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)**,<br>Altirra **(Standalone)** [W] | Yes except for Altirra | |
@ -4005,13 +4060,13 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| cdtv | Commodore CDTV | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>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,<br>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,<br>openMSX **(Standalone)**,<br>ares **(Standalone)** | Yes | Single archive or ROM file |
| coco | Tandy Color Computer | XRoar CoCo 2 NTSC **(Standalone)** | XRoar CoCo 2 PAL **(Standalone)**,<br>MAME [Cartridge] **(Standalone)**,<br>MAME [Tape] **(Standalone)** | Yes | See the specific _Tandy Color Computer_ section elsewhere in this guide |
| colecovision | Coleco ColecoVision | blueMSX | Gearcoleco,<br>openMSX **(Standalone)**,<br>ares **(Standalone)**,<br>ColEm **(Standalone)** [LW] | Yes | Single archive or ROM file |
| consolearcade | Console Arcade Systems | MAME - Current | MAME **(Standalone)**,<br>Flycast,<br>Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Kronos [LW],<br>Mednafen [Sega Saturn] **(Standalone)**,<br>Play! **(Standalone)**,<br>RPCS3 Shortcut **(Standalone)**,<br>Triforce **(Standalone)** [LW],<br>xemu **(Standalone)**,<br>Cxbx-Reloaded **(Standalone)** [W],<br> _Shortcut or script_ | Depends | See the specific _Console Arcade Systems_ section elsewhere in this guide |
| cps | Capcom Play System | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>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,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>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,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>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,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-3 | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide |
| cps | Capcom Play System | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>FB Alpha 2012 CPS-1,<br>FB Alpha 2012 CPS-2,<br>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,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>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,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>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,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>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)**,<br>MAME - Current,<br>MAME **(Standalone)**,<br>DirkSimple | Depends | See the specific _LaserDisc Games_ section elsewhere in this guide |
| desktop | Desktop Applications | _Suspend ES-DE_ | _Keep ES-DE running_,<br> _AppImage (Suspend ES-DE)_ [L],<br> _AppImage (Keep ES-DE running)_ [L] | No | See the specific _Ports and desktop applications_ section elsewhere in this guide |
@ -4051,7 +4106,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| 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)**,<br>MAME Mac Plus Bootable **(Standalone)**,<br>MAME Mac Plus Boot Disk **(Standalone)**,<br>Basilisk II **(Standalone)**,<br>SheepShaver **(Standalone)** | Yes | See the specific _Apple Macintosh_ section elsewhere in this guide |
| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Kronos [LW],<br>Model 2 Emulator **(Standalone)** [W],<br>Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],<br>Supermodel **(Standalone)** [LW],<br> _Shortcut or script_ | Depends | See the specific _Arcade and Neo Geo_ section elsewhere in this guide |
| mame | Multiple Arcade Machine Emulator | MAME - Current | MAME 2010,<br>MAME 2003-Plus,<br>MAME 2003,<br>MAME 2000,<br>MAME **(Standalone)**,<br>FinalBurn Neo,<br>FinalBurn Neo **(Standalone)** [LW],<br>FB Alpha 2012,<br>Geolith,<br>Flycast,<br>Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Kronos [LW],<br>Model 2 Emulator **(Standalone)** [W],<br>Model 2 Emulator [Suspend ES-DE] **(Standalone)** [W],<br>Supermodel **(Standalone)** [LW],<br> _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,<br>SMS Plus GX,<br>Gearsystem,<br>PicoDrive,<br>Mednafen **(Standalone)**,<br>Mesen **(Standalone)** [LW],<br>ares **(Standalone)** | No | Single archive or ROM file |
| megacd | Sega Mega-CD | Genesis Plus GX | Genesis Plus GX Wide,<br>PicoDrive,<br>ares **(Standalone)** | Yes | |
@ -4072,7 +4127,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| naomi | Sega NAOMI | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Demul **(Standalone)** [W] | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomi2 | Sega NAOMI 2 | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Demul **(Standalone)** [W] | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| naomigd | Sega NAOMI GD-ROM | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
| n3ds | Nintendo 3DS | Citra [LW],<br>Citra **(Standalone)** [M] | Citra 2018 [LW],<br>Citra **(Standalone)** [LW],<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n3ds | Nintendo 3DS | Citra [LW],<br>Citra **(Standalone)** [M] | Citra 2018 [LW],<br>Citra **(Standalone)** [LW],<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
| n64 | Nintendo 64 | Mupen64Plus-Next | Mupen64Plus **(Standalone)**,<br>ParaLLEl N64,<br>simple64 **(Standalone)** [LW],<br>Rosalie's Mupen GUI **(Standalone)** [LW],<br>Project64 **(Standalone)** [W],<br>ares **(Standalone)**,<br>sixtyforce **(Standalone)** [M] | No | Single archive or ROM file |
| n64dd | Nintendo 64DD | ParaLLEl N64 [LW],<br>Mupen64Plus-Next [M] | Mupen64Plus-Next [LW],<br>ParaLLEl N64 [M],<br>Rosalie's Mupen GUI **(Standalone)** [LW],<br>ares **(Standalone)** | Yes | See the specific _Nintendo 64DD_ section elsewhere in this guide |
| nds | Nintendo DS | melonDS DS | melonDS @,<br>melonDS **(Standalone)**,<br>DeSmuME,<br>DeSmuME 2015,<br>DeSmuME **(Standalone)** [L],<br>SkyEmu **(Standalone)** | No | Single archive or ROM file |
@ -4085,7 +4140,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| ngpc | SNK Neo Geo Pocket Color | Beetle NeoPop | RACE,<br>Mednafen **(Standalone)**,<br>ares **(Standalone)** | No | Single archive or ROM file |
| odyssey2 | Magnavox Odyssey 2 | O2EM | MAME - Current,<br>MAME **(Standalone)** | Yes | Single archive or ROM file |
| 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 |
| oric | Tangerine Computer Systems Oric | MAME **(Standalone)** | Oricutron **(Standalone)** | Yes | See the specific _Tangerine Computer Systems Oric_ section elsewhere in this guide |
| palm | Palm OS | Mu | | | |
| pc | IBM PC | DOSBox-Pure | DOSBox-Core,<br>DOSBox-SVN,<br>DOSBox-X **(Standalone)**,<br>DOSBox Staging **(Standalone)** | No | See the specific _DOS / PC_ section elsewhere in this guide |
| pc88 | NEC PC-8800 Series | QUASI88 | QUASI88 **(Standalone)** | Yes | |
@ -4128,7 +4183,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| sufami | Bandai SuFami Turbo | Snes9x - Current | Snes9x 2010,<br>Snes9x 2005 Plus,<br>Snes9x **(Standalone)**,<br>bsnes,<br>bsnes-hd,<br>bsnes-mercury Accuracy,<br>bsnes **(Standalone)** [LW],<br>ares **(Standalone)** | | |
| supergrafx | NEC SuperGrafx | Beetle SuperGrafx | Beetle PCE,<br>Mednafen **(Standalone)**,<br>Mesen **(Standalone)** [LW],<br>ares **(Standalone)** | No | Single archive or ROM file |
| supervision | Watara Supervision | Potator | MAME - Current,<br>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 |
| supracan | Funtech Super A'Can | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file. You need a supracan.zip archive that contains a valid internal_68k.bin file and an empty file named umc6650.bin |
| switch | Nintendo Switch | Ryujinx **(Standalone)** | | Yes | |
| symbian | Symbian | EKA2L1 [Nokia N-Gage] **(Standalone)** | EKA2L1 [Nokia N70] **(Standalone)**,<br>EKA2L1 [Nokia N97] **(Standalone)**,<br>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 |
@ -4156,10 +4211,10 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
| wonderswan | Bandai WonderSwan | Beetle Cygne | Mednafen **(Standalone)**,<br>ares **(Standalone)**,<br>ares [Benesse Pocket Challenge V2] **(Standalone)** | No | Single archive or ROM file |
| wonderswancolor | Bandai WonderSwan Color | Beetle Cygne | Mednafen **(Standalone)**,<br>ares **(Standalone)** | No | Single archive or ROM file |
| x1 | Sharp X1 | X Millennium | MAME [Diskette] **(Standalone)**,<br>MAME [Tape] **(Standalone)** | Yes for MAME | Single archive or diskette/tape file |
| x68000 | Sharp X68000 | PX68k | MAME **(Standalone)** | Yes | |
| x68000 | Sharp X68000 | PX68k | MAME **(Standalone)**,<br>XM6 Pro-68k **(Standalone)** [W],<br>XM6 Pro-68k **(Wine)** [L],<br>XM6 Pro-68k **(Proton)** [L] | Yes except for XM6 Pro-68k | |
| 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],<br>xenia **(Wine)** [L] | xenia **(Proton)** [L],<br> _Shortcut or script_ [L] | No | See the specific _Microsoft Xbox 360_ section elsewhere in this guide |
| zmachine | Infocom Z-machine | Gargoyle **(Standalone)** | | No | |
| zmachine | Infocom Z-machine | MojoZork | Gargoyle **(Standalone)** | No | |
| zx81 | Sinclair ZX81 | EightyOne | | | |
| zxnext | Sinclair ZX Spectrum Next | #CSpect **(Standalone)** [LW],<br>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 |

View file

@ -1,6 +1,6 @@
# SPDX-License-Identifier: MIT
#
# ES-DE
# ES-DE Frontend
# CMakeLists.txt (es-app)
#
# CMake configuration for es-app
@ -11,7 +11,6 @@ project(es-de)
set(ES_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/src/ApplicationUpdater.h
${CMAKE_CURRENT_SOURCE_DIR}/src/ApplicationVersion.h
${CMAKE_CURRENT_SOURCE_DIR}/src/CollectionSystemsManager.h
${CMAKE_CURRENT_SOURCE_DIR}/src/FileData.h
${CMAKE_CURRENT_SOURCE_DIR}/src/FileFilterIndex.h
@ -162,9 +161,9 @@ if(WIN32)
../freetype.dll
../git2.dll
../glew32.dll
../libcrypto-1_1-x64.dll
../libcrypto-3-x64.dll
../libcurl-x64.dll
../libssl-1_1-x64.dll
../libssl-3-x64.dll
../lunasvg.dll
../pugixml.dll
../rlottie.dll

View file

@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>3.0.1</string>
<string>3.0.3</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
@ -11,7 +11,7 @@
<key>CFBundleExecutable</key>
<string>ES-DE</string>
<key>CFBundleGetInfoString</key>
<string>ES-DE 3.0.1</string>
<string>ES-DE 3.0.3</string>
<key>CFBundleIconFile</key>
<string>ES-DE.icns</string>
<key>CFBundleName</key>
@ -21,15 +21,15 @@
<key>CFBundleSignature</key>
<string>ESDE</string>
<key>CFBundleShortVersionString</key>
<string>3.0.1</string>
<string>3.0.3</string>
<key>CFBundleVersion</key>
<string>3.0.1</string>
<string>3.0.3</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.education</string>
<key>LSMinimumSystemVersion</key>
<string>10.15.0</string>
<string>11.0.0</string>
<key>LSUIPresentationMode</key>
<integer>3</integer>
<key>NSHighResolutionCapable</key>

View file

@ -2,7 +2,7 @@ ES-DE Frontend - Portable installation on Windows
-------------------------------------------------
ES-DE release:
3.0.1
3.0.3
The latest version can be downloaded from https://es-de.org
@ -42,6 +42,7 @@ Preconfigured emulator locations:
Emulators\RetroArch-Win64\retroarch.exe
Emulators\RetroArch\retroarch.exe
Emulators\3dSen\3dSen.exe
Emulators\AceDL\AceDL.exe
Emulators\AdvanceMAME\advmame.exe
Emulators\Altirra\Altirra64.exe
Emulators\Altirra\Altirra.exe
@ -55,6 +56,7 @@ Emulators\bsnes\bsnes.exe
Emulators\cemu\Cemu.exe
Emulators\Citra\canary-mingw\citra-qt.exe
Emulators\Citra\nightly-mingw\citra-qt.exe
Emulators\ColEm\ColEm.exe
Emulators\cpcemu\cpcemu.exe
Emulators\CSpect\CSpect.exe
Emulators\Cxbx-Reloaded\cxbx.exe
@ -80,6 +82,7 @@ Emulators\gopher2600\gopher2600_windows_amd64.exe
Emulators\hatari\hatari.exe
Emulators\Hypseus Singe\hypseus.exe
Emulators\KEmulator\KEmulator.exe
Emulators\lime3ds\lime3ds-gui.exe
Emulators\m2emulator\EMULATOR.EXE
Emulators\mame\mame.exe
Emulators\mednafen\mednafen.exe
@ -131,8 +134,10 @@ Emulators\VICE\bin\xvic.exe
Emulators\VPinballX\VPinballX_GL64.exe
Emulators\VPinballX\VPinballX64.exe
Emulators\Vita3K\Vita3K.exe
Emulators\WinArcadia\WinArcadia.exe
Emulators\xemu\xemu.exe
Emulators\xenia\xenia.exe
Emulators\xenia_canary\xenia_canary.exe
Emulators\XM6 Pro-68k\XM6.exe
Emulators\xroar\xroar.exe
Emulators\ZEsarUX\zesarux.exe

Binary file not shown.

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>org.es_de.frontend</id>
<name>ES-DE</name>
<name>ES-DE Frontend</name>
<summary>Gaming frontend</summary>
<description>
<p>ES-DE is a frontend for browsing and launching games from your
@ -38,6 +38,12 @@
</screenshot>
</screenshots>
<releases>
<release version="3.0.3" date="2024-06-14">
<url>https://gitlab.com/es-de/emulationstation-de/-/releases</url>
</release>
<release version="3.0.2" date="2024-05-13">
<url>https://gitlab.com/es-de/emulationstation-de/-/releases</url>
</release>
<release version="3.0.1" date="2024-03-16">
<url>https://gitlab.com/es-de/emulationstation-de/-/releases</url>
</release>

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// CollectionSystemsManager.cpp
//
// Manages collections of the following two types:
@ -160,6 +160,8 @@ void CollectionSystemsManager::saveCustomCollection(SystemData* sys)
configFileIn.open(getCustomCollectionConfigPath(name));
#endif
for (std::string gameEntry; getline(configFileIn, gameEntry);) {
// Remove Windows carriage return characters.
gameEntry = Utils::String::replace(gameEntry, "\r", "");
std::string gamePath {Utils::String::replace(gameEntry, "%ROMPATH%", rompath)};
gamePath = Utils::String::replace(gamePath, "//", "/");
// Only add the entry if it doesn't exist, i.e. only add missing files.
@ -1064,6 +1066,8 @@ void CollectionSystemsManager::reactivateCustomCollectionEntry(FileData* game)
std::ifstream input {path};
#endif
for (std::string gameKey; getline(input, gameKey);) {
// Remove Windows carriage return characters.
gameKey = Utils::String::replace(gameKey, "\r", "");
if (gameKey == gamePath) {
setEditMode(it->first, false);
toggleGameInCollection(game);
@ -1331,7 +1335,8 @@ void CollectionSystemsManager::populateCustomCollection(CollectionSystemData* sy
// it's possible to use either absolute ROM paths in the collection files or using
// the path variable. The absolute ROM paths are only used for backward compatibility
// with old custom collections. All custom collections saved by ES-DE will use the
// %ROMPATH% variable instead.
// %ROMPATH% variable instead. Also remove Windows carriage return characters.
gameKey = Utils::String::replace(gameKey, "\r", "");
gameKey = Utils::String::replace(gameKey, "%ROMPATH%", rompath);
gameKey = Utils::String::replace(gameKey, "//", "/");

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// CollectionSystemsManager.h
//
// Manages collections of the following two types:

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// FileData.cpp
//
// Provides game file data structures and functions to access and sort this information.
@ -10,6 +10,7 @@
#include "FileData.h"
#include "AudioManager.h"
#include "CollectionSystemsManager.h"
#include "FileFilterIndex.h"
#include "FileSorts.h"
@ -968,6 +969,7 @@ void FileData::launchGame()
size_t coreFilePos {0};
bool foundCoreFile {false};
std::vector<std::string> emulatorCorePaths;
bool isAndroidApp {false};
#if defined(__ANDROID__)
std::string androidPackage;
@ -1085,8 +1087,79 @@ void FileData::launchGame()
}
// Check that the emulator actually exists, and if so, get its path.
const std::pair<std::string, FileData::findEmulatorResult> emulator {
findEmulator(command, false)};
std::pair<std::string, FileData::findEmulatorResult> emulator;
#if defined(__ANDROID__)
// Native Android apps and games.
if (command.find("%ANDROIDAPP%=") != std::string::npos) {
std::string packageName;
size_t startPos {command.find("%ANDROIDAPP%=")};
size_t endPos {command.find(" ", startPos)};
if (endPos == std::string::npos)
endPos = command.length();
packageName = command.substr(startPos + 13, endPos - startPos - 13);
isAndroidApp = true;
if (packageName == "%FILEINJECT%") {
LOG(LogDebug) << "Injecting app info from file \"" + fileName + "\"";
std::string appString;
std::ifstream injectFileStream;
injectFileStream.open(romRaw);
for (std::string line; getline(injectFileStream, line);) {
// Remove Windows carriage return characters.
line = Utils::String::replace(line, "\r", "");
appString += line;
if (appString.size() > 4096)
break;
}
injectFileStream.close();
if (appString.empty()) {
LOG(LogDebug) << "FileData::launchGame(): File empty or insufficient permissions, "
"nothing to inject";
packageName = "";
}
else if (appString.size() > 4096) {
LOG(LogWarning) << "FileData::launchGame(): Injection file exceeding maximum "
"allowed size of 4096 bytes, skipping \""
<< fileName << "\"";
packageName = "";
}
else {
packageName = appString;
}
}
if (packageName != "" && packageName != "%FILEINJECT%") {
LOG(LogInfo) << "Game entry is an Android app: " << packageName;
size_t separatorPos {packageName.find('/')};
if (separatorPos != std::string::npos) {
androidActivity = packageName.substr(separatorPos + 1);
packageName = packageName.substr(0, separatorPos);
}
if (Utils::Platform::Android::checkEmulatorInstalled(packageName, androidActivity)) {
emulator = std::make_pair(packageName,
FileData::findEmulatorResult::FOUND_ANDROID_PACKAGE);
}
else {
emulator = std::make_pair(packageName, FileData::findEmulatorResult::NOT_FOUND);
}
}
else {
emulator = std::make_pair(packageName, FileData::findEmulatorResult::NOT_FOUND);
}
}
else {
emulator = findEmulator(command, false);
}
#else
emulator = findEmulator(command, false);
#endif
// Show an error message if there was no matching emulator entry in es_find_rules.xml.
if (emulator.second == FileData::findEmulatorResult::NO_RULES) {
@ -1102,7 +1175,12 @@ void FileData::launchGame()
return;
}
else if (emulator.second == FileData::findEmulatorResult::NOT_FOUND) {
if (isAndroidApp) {
LOG(LogError) << "Couldn't launch app as it does not seem to be installed";
}
else {
LOG(LogError) << "Couldn't launch game, emulator not found";
}
LOG(LogError) << "Raw emulator launch command:";
LOG(LogError) << commandRaw;
@ -1115,14 +1193,37 @@ void FileData::launchGame()
if (endPos != std::string::npos)
emulatorName = command.substr(startPos + 10, endPos - startPos - 10);
}
#if defined(__ANDROID__)
else if ((startPos = command.find("%ANDROIDAPP%=")) != std::string::npos) {
endPos = command.find(" ", startPos);
if (endPos == std::string::npos)
endPos = command.length();
if (emulatorName == "")
window->queueInfoPopup("ERROR: COULDN'T FIND EMULATOR, HAS IT BEEN PROPERLY INSTALLED?",
emulatorName = command.substr(startPos + 13, endPos - startPos - 13);
}
#endif
if (isAndroidApp) {
if (emulatorName == "" || emulatorName == "%FILEINJECT%") {
window->queueInfoPopup("ERROR: COULDN'T FIND APP, HAS IT BEEN PROPERLY INSTALLED?",
6000);
else
}
else {
window->queueInfoPopup("ERROR: COULDN'T FIND APP '" + emulatorName +
"', HAS IT BEEN PROPERLY INSTALLED?",
6000);
}
}
else {
if (emulatorName == "") {
window->queueInfoPopup(
"ERROR: COULDN'T FIND EMULATOR, HAS IT BEEN PROPERLY INSTALLED?", 6000);
}
else {
window->queueInfoPopup("ERROR: COULDN'T FIND EMULATOR '" + emulatorName +
"', HAS IT BEEN PROPERLY INSTALLED?",
6000);
}
}
window->setAllowTextScrolling(true);
window->setAllowFileAnimation(true);
@ -1473,18 +1574,30 @@ void FileData::launchGame()
injectFile = Utils::String::replace(injectFile, "\\", "/");
injectFile = Utils::String::replace(injectFile, "%BASENAME%",
Utils::String::replace(baseName, "\"", ""));
if (injectFile == "%ROM%") {
injectFile = Utils::String::replace(injectFile, "%ROM%",
Utils::String::replace(romRaw, "\"", ""));
}
else {
if (injectFile.size() < 3 || !(injectFile[1] == ':' && injectFile[2] == '/'))
injectFile =
Utils::FileSystem::getParent(Utils::String::replace(romPath, "\"", "")) + "/" +
injectFile;
Utils::FileSystem::getParent(Utils::String::replace(romPath, "\"", "")) +
"/" + injectFile;
}
injectFile = Utils::String::replace(injectFile, "/", "\\");
#else
injectFile = Utils::String::replace(injectFile, "%BASENAME%",
Utils::String::replace(baseName, "\\", ""));
if (injectFile == "%ROM%") {
injectFile = Utils::String::replace(injectFile, "%ROM%",
Utils::String::replace(romRaw, "\\", ""));
}
else {
if (injectFile.front() != '/')
injectFile =
Utils::FileSystem::getParent(Utils::String::replace(romPath, "\\", "")) + "/" +
injectFile;
Utils::FileSystem::getParent(Utils::String::replace(romPath, "\\", "")) +
"/" + injectFile;
}
#endif
if (Utils::FileSystem::isRegularFile(injectFile) ||
Utils::FileSystem::isSymlink(injectFile)) {
@ -1492,9 +1605,18 @@ void FileData::launchGame()
<< "\"";
std::string arguments;
std::ifstream injectFileStream;
#if defined(_WIN64)
injectFileStream.open(Utils::String::stringToWideString(injectFile));
#else
injectFileStream.open(injectFile);
for (std::string line; getline(injectFileStream, line);)
#endif
for (std::string line; getline(injectFileStream, line);) {
// Remove Windows carriage return characters.
line = Utils::String::replace(line, "\r", "");
arguments += line;
if (arguments.size() > 4096)
break;
}
injectFileStream.close();
if (arguments.empty()) {
@ -1504,8 +1626,7 @@ void FileData::launchGame()
}
else if (arguments.size() > 4096) {
LOG(LogWarning) << "FileData::launchGame(): Injection file exceeding maximum "
"allowed size of "
"4096 bytes, skipping \""
"allowed size of 4096 bytes, skipping \""
<< injectFile << "\"";
}
else {
@ -1634,6 +1755,10 @@ void FileData::launchGame()
Utils::FileSystem::getEscapedPath(getROMDirectory()));
#else
command = Utils::String::replace(command, "%ANDROIDPACKAGE%", androidPackage);
// Escaped quotation marks should only be used for Extras on Android so it should be safe to
// just change them to temporary variables and convert them back to the escaped quotation
// marks when parsing the Extras.
command = Utils::String::replace(command, "\\\"", "%QUOTATION%");
const std::vector<std::string> androidVariabels {
"%ACTION%=", "%CATEGORY%=", "%MIMETYPE%=", "%DATA%="};
@ -1741,6 +1866,21 @@ void FileData::launchGame()
}
if (extraName != "" && extraValue != "") {
// Expand the unescaped game directory path and ROM directory as well as
// the raw path to the game file if the corresponding variables have been
// used in the Extra definition. We also change back any temporary quotation
// mark variables to actual escaped quotation marks so they can be passed
// in the Intent.
extraValue = Utils::String::replace(extraValue, "%QUOTATION%", "\\\"");
extraValue =
Utils::String::replace(extraValue, "%GAMEDIRRAW%",
Utils::FileSystem::getParent(
Utils::String::replace(romPath, "\\", "")));
extraValue =
Utils::String::replace(extraValue, "%ROMPATHRAW%", getROMDirectory());
extraValue = Utils::String::replace(extraValue, "%ROMRAW%", romRaw);
extraValue = Utils::String::replace(extraValue, "//", "/");
if (variable == "%EXTRA_")
androidExtrasString[extraName] = extraValue;
else if (variable == "%EXTRAARRAY_")
@ -1791,6 +1931,10 @@ void FileData::launchGame()
// Trim any leading and trailing whitespace characters as they could cause launch issues.
command = Utils::String::trim(command);
#if defined(DEINIT_ON_LAUNCH)
runInBackground = false;
#endif
// swapBuffers() is called here to turn the screen black to eliminate some potential
// flickering and to avoid showing the game launch message briefly when returning
// from the game.
@ -1862,7 +2006,18 @@ void FileData::launchGame()
androidData, mEnvData->mStartPath, romRaw, androidExtrasString, androidExtrasStringArray,
androidExtrasBool, androidActivityFlags);
#else
#if defined(DEINIT_ON_LAUNCH)
// Deinit both the AudioManager and the window which allows emulators to launch in KMS mode.
AudioManager::getInstance().deinit();
window->deinit();
returnValue = Utils::Platform::launchGameUnix(command, startDirectory, false);
AudioManager::getInstance().init();
window->init();
#else
returnValue = Utils::Platform::launchGameUnix(command, startDirectory, runInBackground);
#endif
#endif
// Notify the user in case of a failed game launch using a popup window.
if (returnValue != 0) {

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// FileData.h
//
// Provides game file data structures and functions to access and sort this information.

View file

@ -40,6 +40,7 @@
#if defined(__ANDROID__)
#include "InputOverlay.h"
#include "utils/PlatformUtilAndroid.h"
#endif
#include <SDL2/SDL_events.h>
@ -80,6 +81,9 @@ GuiMenu::GuiMenu()
Settings::getInstance()->getString("UIMode") != "kiosk") {
#if defined(__APPLE__)
addEntry("QUIT RETRODECK", mMenuColorPrimary, false, [this] { openQuitMenu(); });
#elif defined(__ANDROID__)
if (!AndroidVariables::sIsHomeApp)
addEntry("QUIT RETRODECK", mMenuColorPrimary, false, [this] { openQuitMenu(); });
#else
if (Settings::getInstance()->getBool("ShowQuitMenu"))
addEntry("QUIT", mMenuColorPrimary, true, [this] { openQuitMenu(); });
@ -1655,7 +1659,7 @@ void GuiMenu::openOtherOptions()
});
#endif
#if !defined(__ANDROID__)
#if !defined(__ANDROID__) && !defined(DEINIT_ON_LAUNCH)
// Run ES in the background when a game has been launched.
auto runInBackground = std::make_shared<SwitchComponent>();
runInBackground->setState(Settings::getInstance()->getBool("RunInBackground"));
@ -1792,6 +1796,34 @@ void GuiMenu::openOtherOptions()
});
#endif
#if defined(__ANDROID__)
if (!AndroidVariables::sIsHomeApp) {
// Whether swiping or pressing back should exit the application.
auto backEventAppExit = std::make_shared<SwitchComponent>();
backEventAppExit->setState(Settings::getInstance()->getBool("BackEventAppExit"));
s->addWithLabel("BACK BUTTON/BACK SWIPE EXITS APP", backEventAppExit);
s->addSaveFunc([backEventAppExit, s] {
if (backEventAppExit->getState() !=
Settings::getInstance()->getBool("BackEventAppExit")) {
Settings::getInstance()->setBool("BackEventAppExit", backEventAppExit->getState());
s->setNeedsSaving();
}
});
}
else {
// If we're running as the Android home app then we don't allow the application to quit,
// so simply add a disabled dummy switch in this case.
auto backEventAppExit = std::make_shared<SwitchComponent>();
s->addWithLabel("BACK BUTTON/BACK SWIPE EXITS APP", backEventAppExit);
backEventAppExit->setEnabled(false);
backEventAppExit->setState(false);
backEventAppExit->setOpacity(DISABLED_OPACITY);
backEventAppExit->getParent()
->getChild(backEventAppExit->getChildIndex() - 1)
->setOpacity(DISABLED_OPACITY);
}
#endif
if (Settings::getInstance()->getBool("DebugFlag")) {
// If the --debug command line option was passed then create a dummy entry.
auto debugMode = std::make_shared<SwitchComponent>();

View file

@ -22,7 +22,6 @@ GuiOrphanedDataCleanup::GuiOrphanedDataCleanup(std::function<void()> reloadCallb
, mGrid {glm::ivec2 {4, 11}}
, mReloadCallback {reloadCallback}
, mCursorPos {0}
, mMediaDirectory {FileData::getMediaDirectory()}
, mMediaTypes {"3dboxes", "backcovers", "covers", "fanart",
"manuals", "marquees", "miximages", "physicalmedia",
"screenshots", "titlescreens", "videos"}
@ -36,6 +35,23 @@ GuiOrphanedDataCleanup::GuiOrphanedDataCleanup(std::function<void()> reloadCallb
, mCaseSensitiveFilesystem {true}
, mCleanupType {CleanupType::MEDIA}
{
// Make sure we always have a single trailing directory separator for the media directory.
mMediaDirectory = FileData::getMediaDirectory();
mMediaDirectory.erase(std::find_if(mMediaDirectory.rbegin(), mMediaDirectory.rend(),
[](char c) { return c != '/'; })
.base(),
mMediaDirectory.end());
mMediaDirectory.erase(std::find_if(mMediaDirectory.rbegin(), mMediaDirectory.rend(),
[](char c) { return c != '\\'; })
.base(),
mMediaDirectory.end());
#if defined(_WIN64)
mMediaDirectory.append("\\");
#else
mMediaDirectory.append("/");
#endif
addChild(&mBackground);
addChild(&mGrid);

View file

@ -112,7 +112,7 @@ void GuiSettings::save()
ViewController::getInstance()->reloadAll();
if (mNeedsGoToStart)
ViewController::getInstance()->goToStart(true);
ViewController::getInstance()->goToStart(false);
// Special case from GuiCollectionSystemsOptions where we didn't yet know whether a matching
// theme existed when creating a new custom collection.

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// GuiThemeDownloader.cpp
//
// Theme downloader.
@ -395,7 +395,9 @@ bool GuiThemeDownloader::fetchRepository(const std::string& repositoryName, bool
LOG(LogError) << "GuiThemeDownloader: " << runtimeError.what() << gitError->message;
mRepositoryError = RepositoryError::FETCH_ERROR;
mMessage = gitError->message;
#if LIBGIT2_VER_MAJOR < 2 && LIBGIT2_VER_MINOR < 8
git_error_clear();
#endif
git_remote_free(gitRemote);
git_repository_free(repository);
mPromise.set_value(true);
@ -663,6 +665,9 @@ void GuiThemeDownloader::parseThemesList()
if (theme.HasMember("newEntry") && theme["newEntry"].IsBool())
themeEntry.newEntry = theme["newEntry"].GetBool();
if (theme.HasMember("deprecated") && theme["deprecated"].IsBool())
themeEntry.deprecated = theme["deprecated"].GetBool();
if (theme.HasMember("variants") && theme["variants"].IsArray()) {
const rapidjson::Value& variants {theme["variants"]};
for (int i {0}; i < static_cast<int>(variants.Size()); ++i)
@ -746,6 +751,11 @@ void GuiThemeDownloader::populateGUI()
std::shared_ptr<TextComponent> themeNameElement {std::make_shared<TextComponent>(
themeName, Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary)};
if (theme.deprecated)
themeNameElement->setOpacity(0.4f);
else
themeNameElement->setOpacity(1.0f);
ThemeGUIEntry guiEntry;
guiEntry.themeName = themeNameElement;
mThemeGUIEntries.emplace_back(guiEntry);
@ -907,11 +917,21 @@ void GuiThemeDownloader::updateGUI()
void GuiThemeDownloader::updateInfoPane()
{
assert(static_cast<size_t>(mList->size()) == mThemes.size());
if (!mThemes[mList->getCursorId()].screenshots.empty())
if (!mThemes[mList->getCursorId()].screenshots.empty()) {
mScreenshot->setImage(mThemeDirectory + "themes-list/" +
mThemes[mList->getCursorId()].screenshots.front().image);
else
if (mThemes[mList->getCursorId()].deprecated) {
mScreenshot->setSaturation(0.0f);
mScreenshot->setBrightness(-0.2f);
}
else {
mScreenshot->setSaturation(1.0f);
mScreenshot->setBrightness(0.0f);
}
}
else {
mScreenshot->setImage("");
}
if (mThemes[mList->getCursorId()].isCloned) {
mDownloadStatus->setText(ViewController::TICKMARK_CHAR + " INSTALLED");
@ -954,7 +974,11 @@ void GuiThemeDownloader::updateInfoPane()
mColorSchemesCount->setText(std::to_string(mThemes[mList->getCursorId()].colorSchemes.size()));
mAspectRatiosCount->setText(std::to_string(mThemes[mList->getCursorId()].aspectRatios.size()));
mFontSizesCount->setText(std::to_string(mThemes[mList->getCursorId()].fontSizes.size()));
mAuthor->setText("CREATED BY " + Utils::String::toUpper(mThemes[mList->getCursorId()].author));
if (mThemes[mList->getCursorId()].deprecated)
mAuthor->setText("THIS THEME ENTRY WILL BE REMOVED IN THE NEAR FUTURE");
else
mAuthor->setText("CREATED BY " +
Utils::String::toUpper(mThemes[mList->getCursorId()].author));
}
void GuiThemeDownloader::setupFullscreenViewer()
@ -1419,7 +1443,9 @@ bool GuiThemeDownloader::cloneRepository(const std::string& repositoryName, cons
<< gitError->message << "\"";
mRepositoryError = RepositoryError::CLONE_ERROR;
mMessage = gitError->message;
#if LIBGIT2_VER_MAJOR < 2 && LIBGIT2_VER_MINOR < 8
git_error_clear();
#endif
mPromise.set_value(true);
return true;
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// GuiThemeDownloader.h
//
// Theme downloader.
@ -68,6 +68,7 @@ private:
std::vector<std::string> transitions;
std::vector<Screenshot> screenshots;
bool newEntry;
bool deprecated;
bool invalidRepository;
bool corruptRepository;
bool shallowRepository;
@ -76,6 +77,7 @@ private:
bool isCloned;
ThemeEntry()
: newEntry {false}
, deprecated {false}
, invalidRepository {false}
, corruptRepository {false}
, shallowRepository {false}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE is a frontend for browsing and launching games from your multi-platform game collection.
// ES-DE is a frontend for browsing and launching games from your multi-platform collection.
//
// The column limit is 100 characters.
// All ES-DE C++ source code is formatted using clang-format.
@ -558,6 +558,8 @@ int main(int argc, char* argv[])
std::locale::global(std::locale("C"));
SDL_SetHint(SDL_HINT_APP_NAME, "ES-DE");
#if defined(__APPLE__)
// This is a workaround to disable the incredibly annoying save state functionality in
// macOS which forces a restore of the previous window state. The problem is that this
@ -610,17 +612,15 @@ int main(int argc, char* argv[])
// unusable in any emulator that is launched.
SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI, "0");
bool resetTouchOverlay {false};
// If ES-DE is set as the home app/launcher we may be in a situation where we get started
// before the external storage has been mounted. If the application data directory or the
// ROMs directory have been located on this storage then the configurator will get executed.
// To prevent the likelyhood of this happening we wait up to 40 * 100 milliseconds, then
// To prevent the likelyhood of this happening we wait up to 45 * 100 milliseconds, then
// we give up. This is not an airtight solution but it hopefully decreases the risk of
// this failure occuring. Under normal circumstances the storage would be mounted when
// the application is starting, so no delay would occur.
if (SDL_AndroidGetExternalStorageState() == 0) {
for (int i {0}; i < 40; ++i) {
for (int i {0}; i < 45; ++i) {
__android_log_print(ANDROID_LOG_VERBOSE, ANDROID_APPLICATION_ID,
"Storage not mounted, waiting 100 ms until next attempt");
SDL_Delay(100);
@ -637,9 +637,6 @@ int main(int argc, char* argv[])
if (Utils::Platform::Android::checkConfigurationNeeded())
exit(0);
// Always enable the touch overlay after running the configurator.
resetTouchOverlay = true;
}
Utils::Platform::Android::setDataDirectories();
@ -701,6 +698,14 @@ int main(int argc, char* argv[])
LOG(LogInfo) << applicationName << " " << PROGRAM_VERSION_STRING << "-"
<< ANDROID_VERSION_CODE << " (r" << PROGRAM_RELEASE_NUMBER << "), built "
<< PROGRAM_BUILT_STRING;
if (AndroidVariables::sIsHomeApp) {
LOG(LogInfo) << "Running as the Android home app";
}
else {
LOG(LogInfo) << "Running as a regular Android app";
}
#else
LOG(LogInfo) << applicationName << " " << PROGRAM_VERSION_STRING << " (r"
<< PROGRAM_RELEASE_NUMBER << "), built " << PROGRAM_BUILT_STRING;
@ -744,7 +749,12 @@ int main(int argc, char* argv[])
// Create the settings folder in the application data directory.
const std::string settingsDir {Utils::FileSystem::getAppDataDirectory() + "/settings"};
if (!Utils::FileSystem::isDirectory(settingsDir)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating settings directory \""
<< Utils::String::replace(settingsDir, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating settings directory \"" << settingsDir << "\"...";
#endif
Utils::FileSystem::createDirectory(settingsDir);
if (!Utils::FileSystem::isDirectory(settingsDir)) {
LOG(LogError) << "Couldn't create directory, permission problems?";
@ -790,7 +800,8 @@ int main(int argc, char* argv[])
}
#if defined(__ANDROID__)
if (resetTouchOverlay) {
// Reset the touch overlay if at least the second screen of the configurator was reached.
if (AndroidVariables::sResetTouchOverlay) {
Settings::getInstance()->setBool("InputTouchOverlay", true);
Settings::getInstance()->saveFile();
}
@ -819,7 +830,12 @@ int main(int argc, char* argv[])
// Create the gamelists folder in the application data directory.
const std::string gamelistsDir {Utils::FileSystem::getAppDataDirectory() + "/gamelists"};
if (!Utils::FileSystem::exists(gamelistsDir)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating gamelists directory \""
<< Utils::String::replace(gamelistsDir, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating gamelists directory \"" << gamelistsDir << "\"...";
#endif
Utils::FileSystem::createDirectory(gamelistsDir);
if (!Utils::FileSystem::exists(gamelistsDir)) {
LOG(LogWarning) << "Couldn't create directory, permission problems?";
@ -827,6 +843,23 @@ int main(int argc, char* argv[])
}
}
{
// Create the game media folder.
const std::string mediaDirectory {FileData::getMediaDirectory()};
if (!Utils::FileSystem::exists(mediaDirectory)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating game media directory \""
<< Utils::String::replace(mediaDirectory, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating game media directory \"" << mediaDirectory << "\"...";
#endif
Utils::FileSystem::createDirectory(mediaDirectory);
if (!Utils::FileSystem::exists(mediaDirectory)) {
LOG(LogWarning) << "Couldn't create directory, permission problems?";
}
}
}
{
#if defined(__ANDROID__)
const std::string themeDir {Utils::FileSystem::getAppDataDirectory() + "/themes"};
@ -861,8 +894,12 @@ int main(int argc, char* argv[])
userThemeDirectory = userThemeDirSetting;
if (!Utils::FileSystem::exists(userThemeDirectory)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating themes directory \""
<< Utils::String::replace(userThemeDirectory, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating themes directory \"" << userThemeDirectory << "\"...";
#endif
Utils::FileSystem::createDirectory(userThemeDirectory);
if (!Utils::FileSystem::exists(userThemeDirectory)) {
LOG(LogWarning) << "Couldn't create directory, permission problems?";
@ -891,7 +928,12 @@ int main(int argc, char* argv[])
// for custom event scripts so it's also created as a convenience.
const std::string scriptsDir {Utils::FileSystem::getAppDataDirectory() + "/scripts"};
if (!Utils::FileSystem::exists(scriptsDir)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating scripts directory \""
<< Utils::String::replace(scriptsDir, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating scripts directory \"" << scriptsDir << "\"...";
#endif
Utils::FileSystem::createDirectory(scriptsDir);
if (!Utils::FileSystem::exists(scriptsDir)) {
LOG(LogWarning) << "Couldn't create directory, permission problems?";
@ -906,7 +948,12 @@ int main(int argc, char* argv[])
const std::string slideshowDir {Utils::FileSystem::getAppDataDirectory() +
"/screensavers/custom_slideshow"};
if (!Utils::FileSystem::exists(screensaversDir)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating screensavers directory \""
<< Utils::String::replace(screensaversDir, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating screensavers directory \"" << screensaversDir << "\"...";
#endif
Utils::FileSystem::createDirectory(screensaversDir);
if (!Utils::FileSystem::exists(screensaversDir)) {
LOG(LogWarning) << "Couldn't create directory, permission problems?";
@ -923,7 +970,12 @@ int main(int argc, char* argv[])
}
#endif
if (!Utils::FileSystem::exists(slideshowDir)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating custom_slideshow directory \""
<< Utils::String::replace(slideshowDir, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating custom_slideshow directory \"" << slideshowDir << "\"...";
#endif
Utils::FileSystem::createDirectory(slideshowDir);
if (!Utils::FileSystem::exists(slideshowDir)) {
LOG(LogWarning) << "Couldn't create directory, permission problems?";
@ -937,7 +989,12 @@ int main(int argc, char* argv[])
const std::string controllersDir {Utils::FileSystem::getAppDataDirectory() +
"/controllers"};
if (!Utils::FileSystem::exists(controllersDir)) {
#if defined(_WIN64)
LOG(LogInfo) << "Creating controllers directory \""
<< Utils::String::replace(controllersDir, "/", "\\") << "\"...";
#else
LOG(LogInfo) << "Creating controllers directory \"" << controllersDir << "\"...";
#endif
Utils::FileSystem::createDirectory(controllersDir);
if (!Utils::FileSystem::exists(controllersDir)) {
LOG(LogWarning) << "Couldn't create directory, permission problems?";
@ -1121,6 +1178,8 @@ int main(int argc, char* argv[])
#if defined(APPLICATION_UPDATER)
if (ApplicationUpdater::getInstance().getResults())
ViewController::getInstance()->updateAvailableDialog();
else
HttpReq::cleanupCurlMulti();
#endif
#if defined(_WIN64)

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// ViewController.cpp
//
// Handles overall system navigation including animations and transitions.
@ -139,11 +139,22 @@ void ViewController::setMenuColors()
void ViewController::legacyAppDataDialog()
{
const std::string upgradeMessage {
const std::string upgradeMessage
{
"AS OF ES-DE 3.0 THE APPLICATION DATA DIRECTORY HAS CHANGED FROM \".emulationstation\" "
"to \"ES-DE\"\nPLEASE RENAME YOUR CURRENT DATA DIRECTORY:\n" +
#if defined(_WIN64)
Utils::String::replace(Utils::FileSystem::getAppDataDirectory(), "/", "\\") +
"\nTO THE FOLLOWING:\n" +
Utils::String::replace(
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()), "/", "\\") +
"\\ES-DE"
};
#else
Utils::FileSystem::getAppDataDirectory() + "\nTO THE FOLLOWING:\n" +
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()) + "/ES-DE"};
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()) + "/ES-DE"
};
#endif
mWindow->pushGui(new GuiMsgBox(
HelpStyle(), upgradeMessage.c_str(), "OK", [] {}, "", nullptr, "", nullptr, nullptr, true,
@ -317,7 +328,12 @@ void ViewController::updateAvailableDialog()
0.535f * (1.778f / mRenderer->getScreenAspectRatio()))));
}
},
"CANCEL", [] { return; }, "", nullptr, nullptr, true, true,
"CANCEL",
[] {
HttpReq::cleanupCurlMulti();
return;
},
"", nullptr, nullptr, true, true,
(mRenderer->getIsVerticalOrientation() ?
0.70f :
0.45f * (1.778f / mRenderer->getScreenAspectRatio()))));

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// ViewController.h
//
// Handles overall system navigation including animations and transitions.

View file

@ -1,6 +1,6 @@
# SPDX-License-Identifier: MIT
#
# ES-DE
# ES-DE Frontend
# CMakeLists.txt (es-core)
#
# CMake configuration for es-core
@ -9,6 +9,7 @@
project(core)
set(CORE_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/src/ApplicationVersion.h
${CMAKE_CURRENT_SOURCE_DIR}/src/AsyncHandle.h
${CMAKE_CURRENT_SOURCE_DIR}/src/AudioManager.h
${CMAKE_CURRENT_SOURCE_DIR}/src/CECInput.h

View file

@ -1,25 +1,25 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// ApplicationVersion.h
//
#ifndef ES_APP_APPLICATION_VERSION_H
#define ES_APP_APPLICATION_VERSION_H
#ifndef ES_CORE_APPLICATION_VERSION_H
#define ES_CORE_APPLICATION_VERSION_H
// These numbers and strings need to be manually updated for a new version.
// Do this version number update as the very last commit for the new release version.
// clang-format off
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 0
#define PROGRAM_VERSION_MAINTENANCE 1
#define PROGRAM_RELEASE_NUMBER 42
#define PROGRAM_VERSION_MAINTENANCE 3
#define PROGRAM_RELEASE_NUMBER 44
// clang-format on
#define PROGRAM_VERSION_STRING "3.0.1"
#define PROGRAM_VERSION_STRING "3.0.3"
#define PROGRAM_BUILT_STRING __DATE__ " - " __TIME__
#define RESOURCE_VERSION_STRING "3,0,1\0"
#define RESOURCE_VERSION_STRING "3,0,3\0"
#define RESOURCE_VERSION PROGRAM_VERSION_MAJOR, PROGRAM_VERSION_MINOR, PROGRAM_VERSION_MAINTENANCE
#endif // ES_APP_APPLICATION_VERSION_H
#endif // ES_CORE_APPLICATION_VERSION_H

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// AudioManager.cpp
//
// Low-level audio functions (using SDL2).
@ -113,6 +113,9 @@ void AudioManager::init()
void AudioManager::deinit()
{
if (sAudioDevice == 0)
return;
SDL_LockAudioDevice(sAudioDevice);
SDL_FreeAudioStream(sConversionStream);
SDL_UnlockAudioDevice(sAudioDevice);
@ -120,6 +123,7 @@ void AudioManager::deinit()
SDL_CloseAudio();
SDL_QuitSubSystem(SDL_INIT_AUDIO);
sConversionStream = nullptr;
sAudioDevice = 0;
}
@ -132,7 +136,7 @@ void AudioManager::mixAudio(void* /*unused*/, Uint8* stream, int len)
SDL_memset(stream, 0, len);
// Iterate through all our samples.
std::vector<std::shared_ptr<Sound>>::const_iterator soundIt = sSoundVector.cbegin();
std::vector<std::shared_ptr<Sound>>::const_iterator soundIt {sSoundVector.cbegin()};
while (soundIt != sSoundVector.cend()) {
std::shared_ptr<Sound> sound {*soundIt};
if (sound->isPlaying()) {

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// AudioManager.h
//
// Low-level audio functions (using SDL2).
@ -49,10 +49,10 @@ private:
static void mixAudio(void* unused, Uint8* stream, int len);
static inline SDL_AudioStream* sConversionStream;
static inline SDL_AudioStream* sConversionStream {nullptr};
static inline std::vector<std::shared_ptr<Sound>> sSoundVector;
static inline std::atomic<bool> sMuteStream = false;
static inline bool sHasAudioDevice = true;
static inline std::atomic<bool> sMuteStream {false};
static inline bool sHasAudioDevice {true};
};
#endif // ES_CORE_AUDIO_MANAGER_H

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// HttpReq.cpp
//
// HTTP requests using libcurl.
@ -9,11 +9,13 @@
#include "HttpReq.h"
#include "ApplicationVersion.h"
#include "Log.h"
#include "Settings.h"
#include "resources/ResourceManager.h"
#include "utils/FileSystemUtil.h"
#include <algorithm>
#include <assert.h>
std::string HttpReq::urlEncode(const std::string& s)
@ -37,42 +39,41 @@ std::string HttpReq::urlEncode(const std::string& s)
}
HttpReq::HttpReq(const std::string& url, bool scraperRequest)
: mStatus(REQ_IN_PROGRESS)
, mHandle(nullptr)
: mStatus {REQ_IN_PROGRESS}
, mHandle {nullptr}
, mTotalBytes {0}
, mDownloadedBytes {0}
, mScraperRequest {scraperRequest}
{
// The multi-handle is cleaned up via a call from GuiScraperSearch after the scraping
// has been completed for a game, meaning the handle is valid for all curl requests
// performed for the current game.
// The multi-handle is cleaned up via an explicit call to cleanupCurlMulti() from any object
// that uses HttpReq. For example from GuiScraperSearch after scraping has been completed.
if (!sMultiHandle)
sMultiHandle = curl_multi_init();
mHandle = curl_easy_init();
#if defined(USE_BUNDLED_CERTIFICATES)
// Use the bundled curl TLS/SSL certificates (which actually come from the Mozilla project).
// This is enabled by default on Windows. Although there is a possibility to use the OS
// provided Schannel certificates I haven't been able to get this to work, and it also seems
// to be problematic on older Windows versions.
// The bundled certificates are also required on Linux when building an AppImage package as
// distributions such as Debian, Ubuntu, Linux Mint and Manjaro place the TLS certificates in
// a different directory than for example Fedora and openSUSE. This makes curl unusable on
// these latter operating systems unless the bundled file is used.
curl_easy_setopt(mHandle, CURLOPT_CAINFO,
ResourceManager::getInstance()
.getResourcePath(":/certificates/curl-ca-bundle.crt")
.c_str());
#endif
if (mHandle == nullptr) {
mStatus = REQ_IO_ERROR;
onError("curl_easy_init failed");
return;
}
// Set the url.
if (!mPollThread) {
sStopPoll = false;
mPollThread = std::make_unique<std::thread>(&HttpReq::pollCurl, this);
}
#if defined(USE_BUNDLED_CERTIFICATES)
// Use the bundled curl TLS/SSL certificates (which come from the Mozilla project).
// This is used on Windows and also on Android as there is no way for curl to access
// the system certificates on this OS.
curl_easy_setopt(mHandle, CURLOPT_CAINFO,
ResourceManager::getInstance()
.getResourcePath(":/certificates/curl-ca-bundle.crt")
.c_str());
#endif
// Set the URL.
CURLcode err {curl_easy_setopt(mHandle, CURLOPT_URL, url.c_str())};
if (err != CURLE_OK) {
mStatus = REQ_IO_ERROR;
@ -80,6 +81,32 @@ HttpReq::HttpReq(const std::string& url, bool scraperRequest)
return;
}
if (!mScraperRequest) {
// Set User-Agent.
std::string userAgent {"ES-DE Frontend/"};
userAgent.append(PROGRAM_VERSION_STRING).append(" (");
#if defined(__ANDROID__)
userAgent.append("Android");
#elif defined(_WIN64)
userAgent.append("Windows");
#elif defined(__APPLE__)
userAgent.append("macOS");
#elif defined(__linux__)
userAgent.append("Linux");
#elif defined(__unix__)
userAgent.append("Unix");
#else
userAgent.append("Unknown");
#endif
userAgent.append(")");
CURLcode err {curl_easy_setopt(mHandle, CURLOPT_USERAGENT, userAgent.c_str())};
if (err != CURLE_OK) {
mStatus = REQ_IO_ERROR;
onError(curl_easy_strerror(err));
return;
}
}
long connectionTimeout;
if (mScraperRequest) {
@ -172,7 +199,7 @@ HttpReq::HttpReq(const std::string& url, bool scraperRequest)
}
// Enable the curl progress meter.
err = curl_easy_setopt(mHandle, CURLOPT_NOPROGRESS, 0);
err = curl_easy_setopt(mHandle, CURLOPT_NOPROGRESS, mScraperRequest ? 1 : 0);
if (err != CURLE_OK) {
mStatus = REQ_IO_ERROR;
onError(curl_easy_strerror(err));
@ -188,12 +215,14 @@ HttpReq::HttpReq(const std::string& url, bool scraperRequest)
}
// Progress meter callback.
if (!mScraperRequest) {
err = curl_easy_setopt(mHandle, CURLOPT_XFERINFOFUNCTION, HttpReq::transferProgress);
if (err != CURLE_OK) {
mStatus = REQ_IO_ERROR;
onError(curl_easy_strerror(err));
return;
}
}
// Fail on HTTP status codes >= 400.
err = curl_easy_setopt(mHandle, CURLOPT_FAILONERROR, 1L);
@ -203,52 +232,156 @@ HttpReq::HttpReq(const std::string& url, bool scraperRequest)
return;
}
// Add the handle to our multi.
CURLMcode merr {curl_multi_add_handle(sMultiHandle, mHandle)};
if (merr != CURLM_OK) {
mStatus = REQ_IO_ERROR;
onError(curl_multi_strerror(merr));
return;
}
// Add the handle to the multi. This is done in pollCurl(), running in a separate thread.
std::unique_lock<std::mutex> handleLock {sHandleMutex};
sAddHandleQueue.push(mHandle);
handleLock.unlock();
curl_multi_wakeup(sMultiHandle);
std::unique_lock<std::mutex> requestLock {sRequestMutex};
sRequests[mHandle] = this;
requestLock.unlock();
}
HttpReq::~HttpReq()
{
if (mHandle) {
std::unique_lock<std::mutex> requestLock {sRequestMutex};
sRequests.erase(mHandle);
requestLock.unlock();
CURLMcode merr {curl_multi_remove_handle(sMultiHandle, mHandle)};
std::unique_lock<std::mutex> handleLock {sHandleMutex};
sRemoveHandleQueue.push(mHandle);
handleLock.unlock();
if (merr != CURLM_OK) {
LOG(LogError) << "Error removing curl_easy handle from curl_multi: "
<< curl_multi_strerror(merr);
}
curl_easy_cleanup(mHandle);
curl_multi_wakeup(sMultiHandle);
}
}
HttpReq::Status HttpReq::status()
std::string HttpReq::getContent() const
{
if (mStatus == REQ_IN_PROGRESS) {
assert(mStatus == REQ_SUCCESS);
return mContent.str();
}
int HttpReq::transferProgress(
void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
{
if (dltotal == 0 && dlnow == 0)
return CURLE_OK;
// We need all the check logic below to make sure we're not attempting to write into
// a request that has just been removed by the main thread.
bool validEntry {false};
std::unique_lock<std::mutex> requestLock {sRequestMutex};
if (std::find_if(sRequests.cbegin(), sRequests.cend(), [&clientp](auto&& entry) {
return entry.second == clientp;
}) != sRequests.cend())
validEntry = true;
if (validEntry) {
// Note that it's not guaranteed that the server will actually provide the total size.
if (dltotal > 0)
static_cast<HttpReq*>(clientp)->mTotalBytes = static_cast<long>(dltotal);
if (dlnow > 0)
static_cast<HttpReq*>(clientp)->mDownloadedBytes = static_cast<long>(dlnow);
}
requestLock.unlock();
return CURLE_OK;
}
size_t HttpReq::writeContent(void* buff, size_t size, size_t nmemb, void* req_ptr)
{
// We need all the check logic below to make sure we're not attempting to write into
// a request that has just been removed by the main thread.
bool validEntry {false};
std::unique_lock<std::mutex> requestLock {sRequestMutex};
if (std::find_if(sRequests.cbegin(), sRequests.cend(), [&req_ptr](auto&& entry) {
return entry.second == req_ptr;
}) != sRequests.cend())
validEntry = true;
if (validEntry) {
// size = size of an element, nmemb = number of elements.
std::stringstream& ss {static_cast<HttpReq*>(req_ptr)->mContent};
ss.write(static_cast<char*>(buff), size * nmemb);
}
requestLock.unlock();
// Return value is number of elements successfully read.
return nmemb;
}
void HttpReq::pollCurl()
{
int numfds {0};
do {
if (!sStopPoll)
curl_multi_poll(sMultiHandle, nullptr, 0, 2000, &numfds);
// Check if any easy handles should be added or removed.
std::unique_lock<std::mutex> handleLock {sHandleMutex};
if (sAddHandleQueue.size() > 0) {
// Add the handle to our multi.
CURLMcode merr {curl_multi_add_handle(sMultiHandle, sAddHandleQueue.front())};
std::unique_lock<std::mutex> requestLock {sRequestMutex};
HttpReq* req {sRequests[sAddHandleQueue.front()]};
if (merr != CURLM_OK) {
if (req != nullptr) {
req->mStatus = REQ_IO_ERROR;
req->onError(curl_multi_strerror(merr));
LOG(LogError) << "onError(): " << curl_multi_strerror(merr);
}
}
else {
if (req != nullptr)
req->mStatus = REQ_IN_PROGRESS;
}
sAddHandleQueue.pop();
requestLock.unlock();
}
if (sRemoveHandleQueue.size() > 0) {
// Remove the handle from our multi.
CURLMcode merr {curl_multi_remove_handle(sMultiHandle, sRemoveHandleQueue.front())};
if (merr != CURLM_OK) {
LOG(LogError) << "Error removing curl easy handle from curl multi: "
<< curl_multi_strerror(merr);
}
curl_easy_cleanup(sRemoveHandleQueue.front());
sRemoveHandleQueue.pop();
}
handleLock.unlock();
if (sMultiHandle != nullptr && !sStopPoll) {
int handleCount {0};
std::unique_lock<std::mutex> handleLock {sHandleMutex};
CURLMcode merr {curl_multi_perform(sMultiHandle, &handleCount)};
handleLock.unlock();
if (merr != CURLM_OK && merr != CURLM_CALL_MULTI_PERFORM) {
mStatus = REQ_IO_ERROR;
onError(curl_multi_strerror(merr));
return mStatus;
LOG(LogError) << "Error reading data from multi: " << curl_multi_strerror(merr);
}
int msgsLeft;
CURLMsg* msg;
while ((msg = curl_multi_info_read(sMultiHandle, &msgsLeft)) != nullptr) {
while (!sStopPoll && (msg = curl_multi_info_read(sMultiHandle, &msgsLeft)) != nullptr) {
if (msg->msg == CURLMSG_DONE) {
std::unique_lock<std::mutex> requestLock {sRequestMutex};
HttpReq* req {sRequests[msg->easy_handle]};
if (req == nullptr) {
LOG(LogError) << "Cannot find easy handle!";
requestLock.unlock();
continue;
}
@ -268,51 +401,23 @@ HttpReq::Status HttpReq::status()
req->mContent << "You have exceeded your daily scrape quota";
req->mStatus = REQ_SUCCESS;
}
else if (responseCode == 404 && mScraperRequest &&
else if (responseCode == 404 && req->mScraperRequest &&
Settings::getInstance()->getBool("ScraperIgnoreHTTP404Errors")) {
req->mStatus = REQ_RESOURCE_NOT_FOUND;
}
else {
req->mStatus = REQ_BAD_STATUS_CODE;
req->onError("Server returned HTTP error code " +
std::to_string(responseCode));
req->mStatus = REQ_BAD_STATUS_CODE;
}
}
else {
req->mStatus = REQ_IO_ERROR;
req->onError(curl_easy_strerror(msg->data.result));
}
requestLock.unlock();
}
}
}
return mStatus;
}
std::string HttpReq::getContent() const
{
assert(mStatus == REQ_SUCCESS);
return mContent.str();
}
int HttpReq::transferProgress(
void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
{
// Note that it's not guaranteed that the server will actually provide the total size.
if (dltotal > 0)
static_cast<HttpReq*>(clientp)->mTotalBytes = static_cast<long>(dltotal);
if (dlnow > 0)
static_cast<HttpReq*>(clientp)->mDownloadedBytes = static_cast<long>(dlnow);
return CURLE_OK;
}
size_t HttpReq::writeContent(void* buff, size_t size, size_t nmemb, void* req_ptr)
{
// size = size of an element, nmemb = number of elements.
std::stringstream& ss {static_cast<HttpReq*>(req_ptr)->mContent};
ss.write(static_cast<char*>(buff), size * nmemb);
// Return value is number of elements successfully read.
return nmemb;
} while (!sStopPoll || !sAddHandleQueue.empty() || !sRemoveHandleQueue.empty());
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// HttpReq.h
//
// HTTP requests using libcurl.
@ -14,7 +14,10 @@
#include <atomic>
#include <map>
#include <mutex>
#include <queue>
#include <sstream>
#include <thread>
class HttpReq
{
@ -35,8 +38,7 @@ public:
// clang-format on
};
// Process any received data and return the status afterwards.
Status status();
Status status() { return mStatus; }
std::string getErrorMsg() { return mErrorMsg; }
std::string getContent() const;
@ -44,9 +46,15 @@ public:
long getDownloadedBytes() { return mDownloadedBytes; }
static std::string urlEncode(const std::string& s);
// Called explicitly from any object that uses HttpReq.
static void cleanupCurlMulti()
{
if (sMultiHandle != nullptr) {
sStopPoll = true;
curl_multi_wakeup(sMultiHandle);
mPollThread->join();
mPollThread.reset();
curl_multi_cleanup(sMultiHandle);
sMultiHandle = nullptr;
}
@ -60,14 +68,24 @@ private:
void onError(const std::string& msg) { mErrorMsg = msg; }
static inline std::map<CURL*, HttpReq*> sRequests;
static inline CURLM* sMultiHandle;
// Poll constantly to maintain network throughput even during VSyncs and other waiting states.
void pollCurl();
Status mStatus;
static inline CURLM* sMultiHandle;
static inline std::map<CURL*, HttpReq*> sRequests;
static inline std::queue<CURL*> sAddHandleQueue;
static inline std::queue<CURL*> sRemoveHandleQueue;
std::atomic<Status> mStatus;
CURL* mHandle;
static inline std::unique_ptr<std::thread> mPollThread;
static inline std::mutex sHandleMutex;
static inline std::mutex sRequestMutex;
std::stringstream mContent;
std::string mErrorMsg;
static inline std::atomic<bool> sStopPoll = false;
std::atomic<long> mTotalBytes;
std::atomic<long> mDownloadedBytes;
bool mScraperRequest;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// InputManager.cpp
//
// Low-level input handling.
@ -26,6 +26,7 @@
#if defined(__ANDROID__)
#define TOUCH_GUID_STRING "-3"
#include "utils/PlatformUtilAndroid.h"
#endif
namespace
@ -477,8 +478,11 @@ bool InputManager::parseEvent(const SDL_Event& event)
return false;
#if defined(__ANDROID__)
// Quit application if the back button is pressed.
if (event.key.keysym.sym == SDLK_AC_BACK) {
// Quit application if the back button is pressed or if the back gesture is used,
// unless we're set as the Android home app.
if (event.key.keysym.sym == SDLK_AC_BACK &&
Settings::getInstance()->getBool("BackEventAppExit") &&
!AndroidVariables::sIsHomeApp) {
SDL_Event quit {};
quit.type = SDL_QUIT;
SDL_PushEvent(&quit);
@ -492,7 +496,7 @@ bool InputManager::parseEvent(const SDL_Event& event)
#if defined(__APPLE__)
if (quitShortcut != "CmdQ") {
#elif defined(__ANDROID__)
if (true) {
if (!AndroidVariables::sIsHomeApp) {
#else
if (quitShortcut != "AltF4") {
#endif
@ -792,9 +796,15 @@ void InputManager::addControllerByDeviceIndex(Window* window, int deviceIndex)
std::make_unique<InputConfig>(joyID, SDL_GameControllerName(mControllers[joyID]), guid);
bool customConfig {loadInputConfig(mInputConfigs[joyID].get())};
#if SDL_MAJOR_VERSION > 2 || (SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION > 0) || \
(SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL >= 14)
const std::string serialNumber {SDL_GameControllerGetSerial(controller) == nullptr ?
"" :
SDL_GameControllerGetSerial(controller)};
#else
const std::string serialNumber;
#endif
if (customConfig) {
LOG(LogInfo) << "Added controller with custom configuration: \""
@ -844,9 +854,14 @@ void InputManager::removeControllerByJoystickID(Window* window, SDL_JoystickID j
return;
}
#if SDL_MAJOR_VERSION > 2 || (SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION > 0) || \
(SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL >= 14)
const std::string serialNumber {SDL_GameControllerGetSerial(mControllers[joyID]) == nullptr ?
"" :
SDL_GameControllerGetSerial(mControllers[joyID])};
#else
const std::string serialNumber;
#endif
LOG(LogInfo) << "Removed controller \"" << SDL_GameControllerName(mControllers[joyID])
<< "\" (GUID: " << guid

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// InputManager.h
//
// Low-level input handling.

View file

@ -303,6 +303,9 @@ void Settings::setDefaults()
mBoolMap["MAMENameStripExtraInfo"] = {true, true};
#if defined(__unix__) && !defined(__ANDROID__)
mBoolMap["DisableComposition"] = {false, false};
#endif
#if defined(__ANDROID__)
mBoolMap["BackEventAppExit"] = {true, true};
#endif
mBoolMap["DebugMode"] = {false, false};
mBoolMap["DisplayGPUStatistics"] = {false, false};

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// ThemeData.cpp
//
// Finds available themes on the file system and loads and parses these.
@ -127,6 +127,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"itemsAfterCenter", UNSIGNED_INTEGER},
{"itemStacking", STRING},
{"selectedItemMargins", NORMALIZED_PAIR},
{"selectedItemOffset", NORMALIZED_PAIR},
{"itemSize", NORMALIZED_PAIR},
{"itemScale", FLOAT},
{"itemRotation", FLOAT},
@ -134,6 +135,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"itemAxisHorizontal", BOOLEAN},
{"itemAxisRotation", FLOAT},
{"imageFit", STRING},
{"imageCropPos", NORMALIZED_PAIR},
{"imageInterpolation", STRING},
{"imageCornerRadius", FLOAT},
{"imageColor", COLOR},
@ -201,6 +203,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"unfocusedItemSaturation", FLOAT},
{"unfocusedItemDimming", FLOAT},
{"imageFit", STRING},
{"imageCropPos", NORMALIZED_PAIR},
{"imageInterpolation", STRING},
{"imageRelativeScale", FLOAT},
{"imageCornerRadius", FLOAT},
@ -264,6 +267,8 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"selectedSecondaryColor", COLOR},
{"selectedBackgroundColor", COLOR},
{"selectedSecondaryBackgroundColor", COLOR},
{"selectedBackgroundMargins", NORMALIZED_PAIR},
{"selectedBackgroundCornerRadius", FLOAT},
{"textHorizontalScrolling", BOOLEAN},
{"textHorizontalScrollSpeed", FLOAT},
{"textHorizontalScrollDelay", FLOAT},
@ -285,8 +290,9 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"image",
{{"pos", NORMALIZED_PAIR},
{"size", NORMALIZED_PAIR},
{"cropSize", NORMALIZED_PAIR},
{"maxSize", NORMALIZED_PAIR},
{"cropSize", NORMALIZED_PAIR},
{"cropPos", NORMALIZED_PAIR},
{"origin", NORMALIZED_PAIR},
{"rotation", FLOAT},
{"rotationOrigin", NORMALIZED_PAIR},
@ -319,8 +325,9 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"video",
{{"pos", NORMALIZED_PAIR},
{"size", NORMALIZED_PAIR},
{"cropSize", NORMALIZED_PAIR},
{"maxSize", NORMALIZED_PAIR},
{"cropSize", NORMALIZED_PAIR},
{"cropPos", NORMALIZED_PAIR},
{"origin", NORMALIZED_PAIR},
{"rotation", FLOAT},
{"rotationOrigin", NORMALIZED_PAIR},
@ -437,6 +444,8 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"verticalAlignment", STRING},
{"color", COLOR},
{"backgroundColor", COLOR},
{"backgroundMargins", NORMALIZED_PAIR},
{"backgroundCornerRadius", FLOAT},
{"letterCase", STRING},
{"lineSpacing", FLOAT},
{"opacity", FLOAT},

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// ThemeData.h
//
// Finds available themes on the file system and loads and parses these.

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// ImageComponent.cpp
//
// Handles images: loading, resizing, cropping, color shifting etc.
@ -23,6 +23,8 @@ ImageComponent::ImageComponent(bool forceLoad, bool dynamic)
, mFlipY {false}
, mTargetIsMax {false}
, mTargetIsCrop {false}
, mCropPos {0.5f, 0.5f}
, mCropOffset {0.0f, 0.0f}
, mTileWidth {0.0f}
, mTileHeight {0.0f}
, mColorShift {0xFFFFFFFF}
@ -231,18 +233,27 @@ void ImageComponent::coverFitCrop()
mTopLeftCrop = {0.0f, 0.0f};
mBottomRightCrop = {1.0f, 1.0f};
mCropOffset = {0.0f, 0.0f};
if (std::round(mSize.y) > std::round(mTargetSize.y)) {
const float cropSize {1.0f - (std::round(mTargetSize.y) / std::round(mSize.y))};
cropTop(cropSize / 2.0f);
cropBottom(cropSize / 2.0f);
mSize.y = mSize.y - (mSize.y * cropSize);
if (mCropPos.y != 0.5f) {
const float cropPosY {mCropPos.y + 0.5f};
mCropOffset.y = (cropSize * cropPosY) - cropSize;
}
}
else {
const float cropSize {1.0f - (std::round(mTargetSize.x) / std::round(mSize.x))};
cropLeft(cropSize / 2.0f);
cropRight(cropSize / 2.0f);
mSize.x = mSize.x - (mSize.x * cropSize);
if (mCropPos.x != 0.5f) {
const float cropPosX {mCropPos.x + 0.5f};
mCropOffset.x = (cropSize * cropPosX) - cropSize;
}
}
}
@ -537,6 +548,8 @@ void ImageComponent::applyTheme(const std::shared_ptr<ThemeData>& theme,
glm::vec2 imageCropSize {elem->get<glm::vec2>("cropSize")};
imageCropSize.x = glm::clamp(imageCropSize.x, 0.001f, 3.0f);
imageCropSize.y = glm::clamp(imageCropSize.y, 0.001f, 3.0f);
if (elem->has("cropPos"))
mCropPos = glm::clamp(elem->get<glm::vec2>("cropPos"), 0.0f, 1.0f);
setCroppedSize(imageCropSize * scale);
}
}
@ -840,10 +853,10 @@ void ImageComponent::updateVertices()
if (mTileHeight == 0.0f) {
// clang-format off
mVertices[0] = {{topLeft.x, topLeft.y }, {mTopLeftCrop.x, py - mTopLeftCrop.y }, 0};
mVertices[1] = {{topLeft.x, bottomRight.y}, {mTopLeftCrop.x, 1.0f - mBottomRightCrop.y}, 0};
mVertices[2] = {{bottomRight.x, topLeft.y }, {mBottomRightCrop.x * px, py - mTopLeftCrop.y }, 0};
mVertices[3] = {{bottomRight.x, bottomRight.y}, {mBottomRightCrop.x * px, 1.0f - mBottomRightCrop.y}, 0};
mVertices[0] = {{topLeft.x, topLeft.y }, {mTopLeftCrop.x + mCropOffset.x, py - mTopLeftCrop.y - mCropOffset.y }, 0};
mVertices[1] = {{topLeft.x, bottomRight.y}, {mTopLeftCrop.x + mCropOffset.x, 1.0f - mBottomRightCrop.y - mCropOffset.y}, 0};
mVertices[2] = {{bottomRight.x, topLeft.y }, {(mBottomRightCrop.x * px) + mCropOffset.x, py - mTopLeftCrop.y - mCropOffset.y }, 0};
mVertices[3] = {{bottomRight.x, bottomRight.y}, {(mBottomRightCrop.x * px) + mCropOffset.x, 1.0f - mBottomRightCrop.y - mCropOffset.y}, 0};
// clang-format on
}
else {

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// ImageComponent.h
//
// Handles images: loading, resizing, cropping, color shifting etc.
@ -74,6 +74,9 @@ public:
// cover image type (as the name may seem to imply).
void coverFitCrop();
// Texture position when using cover fit (cropping).
void setCropPos(const glm::vec2 cropPos) { mCropPos = cropPos; }
// This crops any entirely transparent areas around the actual image.
// The arguments restrict how much the end result is allowed to be scaled.
void cropTransparentPadding(const float maxSizeX, const float maxSizeY);
@ -129,6 +132,8 @@ private:
bool mTargetIsMax;
bool mTargetIsCrop;
glm::vec2 mCropPos;
glm::vec2 mCropOffset;
float mTileWidth;
float mTileHeight;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// TextComponent.cpp
//
// Displays text.
@ -18,6 +18,8 @@ TextComponent::TextComponent()
, mRenderer {Renderer::getInstance()}
, mColor {0x000000FF}
, mBgColor {0x00000000}
, mBackgroundMargins {0.0f, 0.0f}
, mBackgroundCornerRadius {0.0f}
, mColorOpacity {1.0f}
, mBgColorOpacity {0.0f}
, mRenderBackground {false}
@ -63,6 +65,8 @@ TextComponent::TextComponent(const std::string& text,
, mRenderer {Renderer::getInstance()}
, mColor {0x000000FF}
, mBgColor {0x00000000}
, mBackgroundMargins {0.0f, 0.0f}
, mBackgroundCornerRadius {0.0f}
, mColorOpacity {1.0f}
, mBgColorOpacity {0.0f}
, mRenderBackground {false}
@ -249,8 +253,21 @@ void TextComponent::render(const glm::mat4& parentTrans)
auto renderFunc = [this](glm::mat4 trans, bool secondPass) {
if (mRenderBackground && !secondPass)
mRenderer->drawRect(0.0f, 0.0f, mSize.x, mSize.y, mBgColor, mBgColor, false,
mOpacity * mThemeOpacity, mDimming);
if (mBackgroundMargins.x > 0.0f) {
trans = glm::translate(trans, glm::vec3 {-mBackgroundMargins.x, 0.0f, 0.0f});
mRenderer->setMatrix(trans);
}
mRenderer->drawRect(0.0f, 0.0f, mSize.x + mBackgroundMargins.x + mBackgroundMargins.y,
mSize.y, mBgColor, mBgColor, false, mOpacity * mThemeOpacity, mDimming,
Renderer::BlendFactor::SRC_ALPHA,
Renderer::BlendFactor::ONE_MINUS_SRC_ALPHA, mBackgroundCornerRadius);
if (mBackgroundMargins.x > 0.0f) {
trans = glm::translate(trans, glm::vec3 {mBackgroundMargins.x, 0.0f, 0.0f});
mRenderer->setMatrix(trans);
}
if (mTextCache) {
const float textHeight {mTextCache->metrics.size.y};
float yOff {0.0f};
@ -718,6 +735,18 @@ void TextComponent::applyTheme(const std::shared_ptr<ThemeData>& theme,
}
}
if (elem->has("backgroundMargins")) {
const glm::vec2 backgroundMargins {
glm::clamp(elem->get<glm::vec2>("backgroundMargins"), 0.0f, 0.5f)};
mBackgroundMargins = backgroundMargins * Renderer::getScreenWidth();
}
if (elem->has("backgroundCornerRadius")) {
mBackgroundCornerRadius =
glm::clamp(elem->get<float>("backgroundCornerRadius"), 0.0f, 0.5f) *
mRenderer->getScreenWidth();
}
if (properties & LETTER_CASE && elem->has("letterCaseSystemNameSuffix")) {
const std::string& letterCase {elem->get<std::string>("letterCaseSystemNameSuffix")};
if (letterCase == "uppercase") {

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// TextComponent.h
//
// Displays text.
@ -155,6 +155,8 @@ private:
std::string mDefaultValue;
unsigned int mColor;
unsigned int mBgColor;
glm::vec2 mBackgroundMargins;
float mBackgroundCornerRadius;
float mColorOpacity;
float mBgColorOpacity;
bool mRenderBackground;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// VideoComponent.cpp
//
// Base class for playing videos.
@ -26,6 +26,8 @@ VideoComponent::VideoComponent()
, mVideoCornerRadius {0.0f}
, mColorGradientHorizontal {true}
, mTargetSize {0.0f, 0.0f}
, mCropPos {0.5f, 0.5f}
, mCropOffset {0.0f, 0.0f}
, mVideoAreaPos {0.0f, 0.0f}
, mVideoAreaSize {0.0f, 0.0f}
, mTopLeftCrop {0.0f, 0.0f}
@ -161,6 +163,8 @@ void VideoComponent::applyTheme(const std::shared_ptr<ThemeData>& theme,
glm::vec2 videoCropSize {elem->get<glm::vec2>("cropSize")};
videoCropSize.x = glm::clamp(videoCropSize.x, 0.01f, 2.0f);
videoCropSize.y = glm::clamp(videoCropSize.y, 0.01f, 2.0f);
if (elem->has("cropPos"))
mCropPos = glm::clamp(elem->get<glm::vec2>("cropPos"), 0.0f, 1.0f);
setCroppedSize(videoCropSize * scale);
mVideoAreaSize = videoCropSize * scale;
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// VideoComponent.h
//
// Base class for playing videos.
@ -115,6 +115,8 @@ protected:
float mVideoCornerRadius;
bool mColorGradientHorizontal;
glm::vec2 mTargetSize;
glm::vec2 mCropPos;
glm::vec2 mCropOffset;
glm::vec2 mVideoAreaPos;
glm::vec2 mVideoAreaSize;
glm::vec2 mTopLeftCrop;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// VideoFFmpegComponent.cpp
//
// Video player based on FFmpeg.
@ -88,6 +88,7 @@ void VideoFFmpegComponent::setCroppedSize(const glm::vec2& size)
mTargetSize = size;
mTargetIsMax = false;
mTargetIsCrop = true;
mStaticImage.setCropPos(mCropPos);
mStaticImage.setCroppedSize(size);
resize();
}
@ -122,6 +123,9 @@ void VideoFFmpegComponent::resize()
// Size texture to allow for cropped video to fill the entire area.
const float cropFactor {
std::max(mTargetSize.x / textureSize.x, mTargetSize.y / textureSize.y)};
mTopLeftCrop = {0.0f, 0.0f};
mBottomRightCrop = {1.0f, 1.0f};
mCropOffset = {0.0f, 0.0f};
mSize = textureSize * cropFactor;
if (std::round(mSize.y) > std::round(mTargetSize.y)) {
@ -129,12 +133,20 @@ void VideoFFmpegComponent::resize()
mTopLeftCrop.y = cropSize / 2.0f;
mBottomRightCrop.y = 1.0f - (cropSize / 2.0f);
mSize.y = mSize.y - (mSize.y * cropSize);
if (mCropPos.y != 0.5f) {
const float cropPosY {mCropPos.y + 0.5f};
mCropOffset.y = (cropSize * cropPosY) - cropSize;
}
}
else {
const float cropSize {1.0f - (mTargetSize.x / std::round(mSize.x))};
mTopLeftCrop.x = cropSize / 2.0f;
mBottomRightCrop.x = 1.0f - (cropSize / 2.0f);
mSize.x = mSize.x - (mSize.x * cropSize);
if (mCropPos.x != 0.5f) {
const float cropPosX {mCropPos.x + 0.5f};
mCropOffset.x = cropSize - (cropSize * cropPosX);
}
}
}
else {
@ -201,10 +213,10 @@ void VideoFFmpegComponent::render(const glm::mat4& parentTrans)
return;
// clang-format off
vertices[0] = {{0.0f, 0.0f }, {mTopLeftCrop.x, 1.0f - mBottomRightCrop.y}, 0xFFFFFFFF};
vertices[1] = {{0.0f, mSize.y}, {mTopLeftCrop.x, 1.0f - mTopLeftCrop.y }, 0xFFFFFFFF};
vertices[2] = {{mSize.x, 0.0f }, {mBottomRightCrop.x * 1.0f, 1.0f - mBottomRightCrop.y}, 0xFFFFFFFF};
vertices[3] = {{mSize.x, mSize.y}, {mBottomRightCrop.x * 1.0f, 1.0f - mTopLeftCrop.y }, 0xFFFFFFFF};
vertices[0] = {{0.0f, 0.0f }, {mTopLeftCrop.x - mCropOffset.x, 1.0f - mBottomRightCrop.y + mCropOffset.y}, 0xFFFFFFFF};
vertices[1] = {{0.0f, mSize.y}, {mTopLeftCrop.x - mCropOffset.x, 1.0f - mTopLeftCrop.y + mCropOffset.y }, 0xFFFFFFFF};
vertices[2] = {{mSize.x, 0.0f }, {(mBottomRightCrop.x * 1.0f) - mCropOffset.x, 1.0f - mBottomRightCrop.y + mCropOffset.y}, 0xFFFFFFFF};
vertices[3] = {{mSize.x, mSize.y}, {(mBottomRightCrop.x * 1.0f) - mCropOffset.x, 1.0f - mTopLeftCrop.y + mCropOffset.y }, 0xFFFFFFFF};
// clang-format on
vertices[0].color = mColorShift;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// VideoFFmpegComponent.h
//
// Video player based on FFmpeg.

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// CarouselComponent.h
//
// Carousel, usable in both the system and gamelist views.
@ -159,6 +159,7 @@ private:
int mItemsAfterCenter;
ItemStacking mItemStacking;
glm::vec2 mSelectedItemMargins;
glm::vec2 mSelectedItemOffset;
glm::vec2 mItemSize;
float mItemScale;
float mItemRotation;
@ -192,6 +193,7 @@ private:
bool mHasUnfocusedItemSaturation;
float mUnfocusedItemDimming;
ImageFit mImagefit;
glm::vec2 mImageCropPos;
unsigned int mCarouselColor;
unsigned int mCarouselColorEnd;
bool mColorGradientHorizontal;
@ -234,6 +236,7 @@ CarouselComponent<T>::CarouselComponent()
, mItemsAfterCenter {8}
, mItemStacking {ItemStacking::CENTERED}
, mSelectedItemMargins {0.0f, 0.0f}
, mSelectedItemOffset {0.0f, 0.0f}
, mItemSize {glm::vec2 {Renderer::getScreenWidth() * 0.25f,
Renderer::getScreenHeight() * 0.155f}}
, mItemScale {1.2f}
@ -268,6 +271,7 @@ CarouselComponent<T>::CarouselComponent()
, mHasUnfocusedItemSaturation {false}
, mUnfocusedItemDimming {1.0f}
, mImagefit {ImageFit::CONTAIN}
, mImageCropPos {0.5f, 0.5f}
, mCarouselColor {0}
, mCarouselColorEnd {0}
, mColorGradientHorizontal {true}
@ -305,12 +309,16 @@ void CarouselComponent<T>::addEntry(Entry& entry, const std::shared_ptr<ThemeDat
auto item = std::make_shared<ImageComponent>(false, dynamic);
item->setLinearInterpolation(mLinearInterpolation);
item->setMipmapping(true);
if (mImagefit == ImageFit::CONTAIN)
if (mImagefit == ImageFit::CONTAIN) {
item->setMaxSize(glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
else if (mImagefit == ImageFit::FILL)
}
else if (mImagefit == ImageFit::FILL) {
item->setResize(glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
else if (mImagefit == ImageFit::COVER)
}
else if (mImagefit == ImageFit::COVER) {
item->setCropPos(mImageCropPos);
item->setCroppedSize(glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
}
item->setCornerRadius(mImageCornerRadius);
item->setImage(entry.data.imagePath);
if (mImageBrightness != 0.0)
@ -332,15 +340,19 @@ void CarouselComponent<T>::addEntry(Entry& entry, const std::shared_ptr<ThemeDat
mDefaultImage = std::make_shared<ImageComponent>(false, dynamic);
mDefaultImage->setLinearInterpolation(mLinearInterpolation);
mDefaultImage->setMipmapping(true);
if (mImagefit == ImageFit::CONTAIN)
if (mImagefit == ImageFit::CONTAIN) {
mDefaultImage->setMaxSize(
glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
else if (mImagefit == ImageFit::FILL)
}
else if (mImagefit == ImageFit::FILL) {
mDefaultImage->setResize(
glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
else if (mImagefit == ImageFit::COVER)
}
else if (mImagefit == ImageFit::COVER) {
mDefaultImage->setCropPos(mImageCropPos);
mDefaultImage->setCroppedSize(
glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
}
mDefaultImage->setCornerRadius(mImageCornerRadius);
mDefaultImage->setImage(entry.data.defaultImagePath);
if (mImageBrightness != 0.0)
@ -409,12 +421,16 @@ void CarouselComponent<T>::updateEntry(Entry& entry, const std::shared_ptr<Theme
auto item = std::make_shared<ImageComponent>(false, true);
item->setLinearInterpolation(mLinearInterpolation);
item->setMipmapping(true);
if (mImagefit == ImageFit::CONTAIN)
if (mImagefit == ImageFit::CONTAIN) {
item->setMaxSize(glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
else if (mImagefit == ImageFit::FILL)
}
else if (mImagefit == ImageFit::FILL) {
item->setResize(glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
else if (mImagefit == ImageFit::COVER)
}
else if (mImagefit == ImageFit::COVER) {
item->setCropPos(mImageCropPos);
item->setCroppedSize(glm::round(mItemSize * (mItemScale >= 1.0f ? mItemScale : 1.0f)));
}
item->setCornerRadius(mImageCornerRadius);
item->setImage(entry.data.imagePath);
if (mImageBrightness != 0.0)
@ -512,7 +528,7 @@ template <typename T> void CarouselComponent<T>::onDemandTextureLoad()
itemInclusion += 1;
}
for (int i = center - itemInclusion - itemInclusionBefore;
for (int i {center - itemInclusion - itemInclusionBefore};
i < center + itemInclusion + itemInclusionAfter; ++i) {
int cursor {i};
@ -918,13 +934,25 @@ template <typename T> void CarouselComponent<T>::render(const glm::mat4& parentT
selectedItemMargins *= std::fabs(distance);
}
float itemHorizontalOffset {0.0f};
float itemVerticallOffset {0.0f};
if ((mSelectedItemOffset.x != 0.0f || mSelectedItemOffset.y != 0.0f) &&
std::fabs(distance) < 1.0f) {
itemHorizontalOffset = (1.0f - std::fabs(distance)) * mSelectedItemOffset.x;
itemVerticallOffset = (1.0f - std::fabs(distance)) * mSelectedItemOffset.y;
}
glm::mat4 itemTrans {carouselTrans};
if (singleEntry)
itemTrans = glm::translate(carouselTrans, glm::vec3 {xOff, yOff, 0.0f});
else
itemTrans = glm::translate(
itemTrans, glm::vec3 {(i * itemSpacing.x) + xOff + selectedItemMargins.x,
(i * itemSpacing.y) + yOff + selectedItemMargins.y, 0.0f});
itemTrans,
glm::vec3 {(i * itemSpacing.x) + xOff + itemHorizontalOffset +
selectedItemMargins.x,
(i * itemSpacing.y) + yOff + itemVerticallOffset + selectedItemMargins.y,
0.0f});
if (mType == CarouselType::HORIZONTAL_WHEEL)
itemTrans = glm::rotate(itemTrans, glm::radians(-90.0f), glm::vec3 {0.0f, 0.0f, 1.0f});
@ -1377,6 +1405,14 @@ void CarouselComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
else
mSelectedItemMargins = selectedItemMargins * Renderer::getScreenHeight();
}
if (elem->has("selectedItemOffset")) {
const glm::vec2 selectedItemOffset {
glm::clamp(elem->get<glm::vec2>("selectedItemOffset"), -1.0f, 1.0f)};
if (mType == CarouselType::HORIZONTAL)
mSelectedItemOffset = selectedItemOffset * Renderer::getScreenWidth();
else
mSelectedItemOffset = selectedItemOffset * Renderer::getScreenHeight();
}
}
if (elem->has("itemSize")) {
@ -1422,6 +1458,8 @@ void CarouselComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
}
else if (imageFit == "cover") {
mImagefit = ImageFit::COVER;
if (elem->has("imageCropPos"))
mImageCropPos = glm::clamp(elem->get<glm::vec2>("imageCropPos"), 0.0f, 1.0f);
}
else {
mImagefit = ImageFit::CONTAIN;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// GridComponent.h
//
// Grid, usable in both the system and gamelist views.
@ -161,6 +161,7 @@ private:
bool mHasUnfocusedItemSaturation;
float mUnfocusedItemDimming;
ImageFit mImagefit;
glm::vec2 mImageCropPos;
bool mImageLinearInterpolation;
float mImageRelativeScale;
float mImageCornerRadius;
@ -239,6 +240,7 @@ GridComponent<T>::GridComponent()
, mHasUnfocusedItemSaturation {false}
, mUnfocusedItemDimming {1.0f}
, mImagefit {ImageFit::CONTAIN}
, mImageCropPos {0.5f, 0.5f}
, mImageLinearInterpolation {true}
, mImageRelativeScale {1.0f}
, mImageCornerRadius {0.0f}
@ -304,12 +306,16 @@ void GridComponent<T>::addEntry(Entry& entry, const std::shared_ptr<ThemeData>&
auto item = std::make_shared<ImageComponent>(false, dynamic);
item->setLinearInterpolation(mImageLinearInterpolation);
item->setMipmapping(true);
if (mImagefit == ImageFit::CONTAIN)
if (mImagefit == ImageFit::CONTAIN) {
item->setMaxSize(glm::round(mItemSize * mImageRelativeScale));
else if (mImagefit == ImageFit::FILL)
}
else if (mImagefit == ImageFit::FILL) {
item->setResize(glm::round(mItemSize * mImageRelativeScale));
else if (mImagefit == ImageFit::COVER)
}
else if (mImagefit == ImageFit::COVER) {
item->setCropPos(mImageCropPos);
item->setCroppedSize(glm::round(mItemSize * mImageRelativeScale));
}
item->setCornerRadius(mImageCornerRadius);
item->setImage(entry.data.imagePath);
if (mImageBrightness != 0.0)
@ -336,12 +342,16 @@ void GridComponent<T>::addEntry(Entry& entry, const std::shared_ptr<ThemeData>&
mDefaultImage = std::make_shared<ImageComponent>(false, dynamic);
mDefaultImage->setLinearInterpolation(mImageLinearInterpolation);
mDefaultImage->setMipmapping(true);
if (mImagefit == ImageFit::CONTAIN)
if (mImagefit == ImageFit::CONTAIN) {
mDefaultImage->setMaxSize(glm::round(mItemSize * mImageRelativeScale));
else if (mImagefit == ImageFit::FILL)
}
else if (mImagefit == ImageFit::FILL) {
mDefaultImage->setResize(glm::round(mItemSize * mImageRelativeScale));
else if (mImagefit == ImageFit::COVER)
}
else if (mImagefit == ImageFit::COVER) {
mDefaultImage->setCropPos(mImageCropPos);
mDefaultImage->setCroppedSize(glm::round(mItemSize * mImageRelativeScale));
}
mDefaultImage->setCornerRadius(mImageCornerRadius);
mDefaultImage->setImage(entry.data.defaultImagePath);
if (mImageBrightness != 0.0)
@ -393,12 +403,16 @@ void GridComponent<T>::updateEntry(Entry& entry, const std::shared_ptr<ThemeData
auto item = std::make_shared<ImageComponent>(false, true);
item->setLinearInterpolation(mImageLinearInterpolation);
item->setMipmapping(true);
if (mImagefit == ImageFit::CONTAIN)
if (mImagefit == ImageFit::CONTAIN) {
item->setMaxSize(glm::round(mItemSize * mImageRelativeScale));
else if (mImagefit == ImageFit::FILL)
}
else if (mImagefit == ImageFit::FILL) {
item->setResize(glm::round(mItemSize * mImageRelativeScale));
else if (mImagefit == ImageFit::COVER)
}
else if (mImagefit == ImageFit::COVER) {
item->setCropPos(mImageCropPos);
item->setCroppedSize(glm::round(mItemSize * mImageRelativeScale));
}
item->setCornerRadius(mImageCornerRadius);
item->setImage(entry.data.imagePath);
if (mImageBrightness != 0.0)
@ -1042,6 +1056,8 @@ void GridComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
}
else if (imageFit == "cover") {
mImagefit = ImageFit::COVER;
if (elem->has("imageCropPos"))
mImageCropPos = glm::clamp(elem->get<glm::vec2>("imageCropPos"), 0.0f, 1.0f);
}
else {
mImagefit = ImageFit::CONTAIN;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// PrimaryComponent.h
//
// Base class for the primary components (carousel, grid and textlist).

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// TextListComponent.h
//
// Text list, usable in both the system and gamelist views.
@ -137,6 +137,8 @@ private:
unsigned int mSelectedSecondaryColor;
unsigned int mSelectedBackgroundColor;
unsigned int mSelectedSecondaryBackgroundColor;
glm::vec2 mSelectedBackgroundMargins;
float mSelectedBackgroundCornerRadius;
bool mHorizontalScrolling;
float mHorizontalScrollSpeed;
float mHorizontalScrollDelay;
@ -176,6 +178,8 @@ TextListComponent<T>::TextListComponent()
, mSelectedSecondaryColor {0x00FF00FF}
, mSelectedBackgroundColor {0x00000000}
, mSelectedSecondaryBackgroundColor {0x00000000}
, mSelectedBackgroundMargins {0.0f, 0.0f}
, mSelectedBackgroundCornerRadius {0.0f}
, mHorizontalScrolling {true}
, mHorizontalScrollSpeed {1.0f}
, mHorizontalScrollDelay {3000.0f}
@ -349,10 +353,19 @@ template <typename T> void TextListComponent<T>::render(const glm::mat4& parentT
dim.x = (trans[0].x * dim.x + trans[3].x) - trans[3].x;
dim.y = (trans[1].y * dim.y + trans[3].y) - trans[3].y;
float horizontalOffset {0.0f};
if (mAlignment == PrimaryAlignment::ALIGN_LEFT && mSelectorHorizontalOffset < 0.0f)
horizontalOffset = mSelectorHorizontalOffset;
else if (mAlignment == PrimaryAlignment::ALIGN_RIGHT && mSelectorHorizontalOffset > 0.0f)
horizontalOffset = mSelectorHorizontalOffset;
mRenderer->pushClipRect(
glm::ivec2 {static_cast<int>(std::round(trans[3].x + mHorizontalMargin)),
glm::ivec2 {static_cast<int>(std::round(trans[3].x + horizontalOffset + mHorizontalMargin +
-mSelectedBackgroundMargins.x)),
static_cast<int>(std::round(trans[3].y))},
glm::ivec2 {static_cast<int>(std::round(dim.x - mHorizontalMargin * 2.0f)),
glm::ivec2 {static_cast<int>(std::round((dim.x - mHorizontalMargin * 2.0f) +
mSelectedBackgroundMargins.x +
mSelectedBackgroundMargins.y)),
static_cast<int>(std::round(dim.y))});
for (int i {startEntry}; i < listCutoff; ++i) {
@ -409,9 +422,27 @@ template <typename T> void TextListComponent<T>::render(const glm::mat4& parentT
mRenderer->setMatrix(drawTrans);
if (i == mCursor && backgroundColor != 0x00000000) {
mRenderer->drawRect(mSelectorHorizontalOffset, mSelectorVerticalOffset,
entry.data.entryName->getSize().x, mSelectorHeight, backgroundColor,
backgroundColor);
if (mSelectorHorizontalOffset != 0.0f || mSelectedBackgroundMargins.x != 0.0f) {
drawTrans = glm::translate(
drawTrans, glm::vec3 {mSelectorHorizontalOffset - mSelectedBackgroundMargins.x,
0.0f, 0.0f});
mRenderer->setMatrix(drawTrans);
}
mRenderer->drawRect(0.0f, mSelectorVerticalOffset,
entry.data.entryName->getSize().x + mSelectedBackgroundMargins.x +
mSelectedBackgroundMargins.y,
mSelectorHeight, backgroundColor, backgroundColor, false, 1.0f,
1.0f, Renderer::BlendFactor::SRC_ALPHA,
Renderer::BlendFactor::ONE_MINUS_SRC_ALPHA,
mSelectedBackgroundCornerRadius);
if (mSelectorHorizontalOffset != 0.0f || mSelectedBackgroundMargins.x != 0.0f) {
drawTrans = glm::translate(
drawTrans, glm::vec3 {-mSelectorHorizontalOffset + mSelectedBackgroundMargins.x,
0.0f, 0.0f});
mRenderer->setMatrix(drawTrans);
}
}
entry.data.entryName->render(drawTrans);
@ -487,6 +518,18 @@ void TextListComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
mSelectedSecondaryBackgroundColor = mSelectedBackgroundColor;
}
if (elem->has("selectedBackgroundMargins")) {
const glm::vec2 selectedBackgroundMargins {
glm::clamp(elem->get<glm::vec2>("selectedBackgroundMargins"), 0.0f, 0.5f)};
mSelectedBackgroundMargins = selectedBackgroundMargins * Renderer::getScreenWidth();
}
if (elem->has("selectedBackgroundCornerRadius")) {
mSelectedBackgroundCornerRadius =
glm::clamp(elem->get<float>("selectedBackgroundCornerRadius"), 0.0f, 0.5f) *
mRenderer->getScreenWidth();
}
if (elem->has("textHorizontalScrolling"))
mHorizontalScrolling = elem->get<bool>("textHorizontalScrolling");

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// Renderer.cpp
//
// Generic rendering functions.
@ -466,7 +466,8 @@ void Renderer::drawRect(const float x,
const float opacity,
const float dimming,
const BlendFactor srcBlendFactor,
const BlendFactor dstBlendFactor)
const BlendFactor dstBlendFactor,
const float cornerRadius)
{
Vertex vertices[4];
@ -494,6 +495,11 @@ void Renderer::drawRect(const float x,
vertices->opacity = opacity;
vertices->dimming = dimming;
if (cornerRadius > 0.0f) {
vertices->shaderFlags = vertices->shaderFlags | Renderer::ShaderFlags::ROUNDED_CORNERS;
vertices->cornerRadius = cornerRadius;
}
bindTexture(0, 0);
drawTriangleStrips(vertices, 4, srcBlendFactor, dstBlendFactor);
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// Renderer.h
//
// Generic rendering functions.
@ -174,10 +174,11 @@ public:
const unsigned int color,
const unsigned int colorEnd,
const bool horizontalGradient = false,
const float opacity = 1.0,
const float dimming = 1.0,
const float opacity = 1.0f,
const float dimming = 1.0f,
const BlendFactor srcBlendFactor = BlendFactor::SRC_ALPHA,
const BlendFactor dstBlendFactor = BlendFactor::ONE_MINUS_SRC_ALPHA);
const BlendFactor dstBlendFactor = BlendFactor::ONE_MINUS_SRC_ALPHA,
const float cornerRadius = 0.0f);
const glm::mat4& getProjectionMatrix() { return mProjectionMatrix; }
const glm::mat4& getProjectionMatrixNormal() { return mProjectionMatrixNormal; }

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// Font.h
//
// Loading, unloading, caching and rendering of fonts.
@ -639,18 +639,16 @@ void Font::rebuildTextures()
// Load the glyph bitmap through FT.
FT_Load_Char(face, it->first, FT_LOAD_RENDER);
FontTexture* tex {it->second.texture};
const glm::ivec2 glyphSize {glyphSlot->bitmap.width, glyphSlot->bitmap.rows};
const glm::ivec2 cursor {
static_cast<int>(it->second.texPos.x * it->second.texture->textureSize.x),
static_cast<int>(it->second.texPos.y * it->second.texture->textureSize.y)};
// Find the position/size.
glm::ivec2 cursor {static_cast<int>(it->second.texPos.x * tex->textureSize.x),
static_cast<int>(it->second.texPos.y * tex->textureSize.y)};
glm::ivec2 glyphSize {static_cast<int>(it->second.texSize.x * tex->textureSize.x),
static_cast<int>(it->second.texSize.y * tex->textureSize.y)};
// Upload to texture.
// Upload glyph bitmap to texture.
if (glyphSize.x > 0 && glyphSize.y > 0) {
mRenderer->updateTexture(tex->textureId, 0, Renderer::TextureType::RED, cursor.x,
cursor.y, glyphSize.x, glyphSize.y, glyphSlot->bitmap.buffer);
mRenderer->updateTexture(it->second.texture->textureId, 0, Renderer::TextureType::RED,
cursor.x, cursor.y, glyphSize.x, glyphSize.y,
glyphSlot->bitmap.buffer);
}
}
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
//
// ES-DE
// ES-DE Frontend
// Font.h
//
// Loading, unloading, caching and rendering of fonts.

View file

@ -1,6 +1,6 @@
# SPDX-License-Identifier: MIT
#
# EmulationStation Desktop Edition
# ES-DE Frontend
# CMakeLists.txt (es-pdf-converter)
#
# CMake configuration for es-pdf-convert

View file

@ -1,55 +1,55 @@
{
"comment": "Latest release of ES-DE (EmulationStation Desktop Edition)",
"comment": "Latest release of ES-DE Frontend",
"website": "https://es-de.org/",
"repository": "https://gitlab.com/es-de/",
"stable": {
"version": "3.0.1",
"release": "42",
"date": "2024-03-16",
"androidVersionName": "3.0.1-19",
"androidVersionCode": "19",
"androidDate": "2024-03-16",
"version": "3.0.3",
"release": "44",
"date": "2024-06-14",
"androidVersionName": "3.0.2-21",
"androidVersionCode": "21",
"androidDate": "2024-05-13",
"packages": [
{
"name": "WindowsPortable",
"filename": "ES-DE_3.0.1-x64_Portable.zip",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/117882093/download",
"md5": "161a5700a4027183e3b2a994d6020fba",
"filename": "ES-DE_3.0.3-x64_Portable.zip",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/132901075/download",
"md5": "bb8c5b83ce42e111ed1905c3fb3913d6",
"message": ""
},
{
"name": "WindowsInstaller",
"filename": "ES-DE_3.0.1-x64.exe",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/117882078/download",
"md5": "6b21884508c8ce795320b41c569c77ee",
"filename": "ES-DE_3.0.3-x64.exe",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/132901031/download",
"md5": "6446d55cdcdf4db5ab69b46048e24206",
"message": ""
},
{
"name": "macOSApple",
"filename": "ES-DE_3.0.1-arm64.dmg",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/117882005/download",
"md5": "1ccb1a3ba1096eeff3b3451acaad2596",
"filename": "ES-DE_3.0.3-arm64.dmg",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/132900941/download",
"md5": "3863d8902894499992c6aa79f1d6d710",
"message": ""
},
{
"name": "macOSIntel",
"filename": "ES-DE_3.0.1-x64.dmg",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/117882072/download",
"md5": "ffb7ad08377668016d31afca3d4b762b",
"filename": "ES-DE_3.0.3-x64.dmg",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/132900999/download",
"md5": "1602ffd2ed49c70c8c17f7da8d8ffdc5",
"message": ""
},
{
"name": "LinuxAppImage",
"filename": "ES-DE_x64.AppImage",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/117882100/download",
"md5": "bfef621f7f421a1066202620a9494e79",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/132901118/download",
"md5": "bf41f2e1faa75f148c9b7b764470cd45",
"message": ""
},
{
"name": "LinuxSteamDeckAppImage",
"filename": "ES-DE_x64_SteamDeck.AppImage",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/117882116/download",
"md5": "6433f2b350ab6c8318220191aa36eb8e",
"url": "https://gitlab.com/es-de/emulationstation-de/-/package_files/132901183/download",
"md5": "10e160abf040179ce4119bd5a013623b",
"message": ""
}
]

View file

@ -1,4 +1,4 @@
<!-- Last updated with information from MAME driver file mame0258.xml -->
<!-- Last updated with information from MAME driver file mame0265.xml -->
<bios>3dobios</bios>
<bios>airlbios</bios>
<bios>aleck64</bios>
@ -8,6 +8,7 @@
<bios>ar_bios</bios>
<bios>aristmk5</bios>
<bios>aristmk6</bios>
<bios>aristmk7</bios>
<bios>atarisy1</bios>
<bios>atluspsx</bios>
<bios>atpsx</bios>

View file

@ -1,4 +1,4 @@
<!-- Last updated with information from MAME driver file mame0258.xml -->
<!-- Last updated with information from MAME driver file mame0265.xml -->
<device>22vp931</device>
<device>3c505</device>
<device>3xtwin</device>
@ -74,6 +74,7 @@
<device>a2ulttrm</device>
<device>a2uniprint</device>
<device>a2vidtrm</device>
<device>a2vistaa800</device>
<device>a2vtc1</device>
<device>a2vtc2</device>
<device>a2vulcan</device>
@ -153,6 +154,7 @@
<device>aha1542</device>
<device>aha1740</device>
<device>aha1742a</device>
<device>aha2940au</device>
<device>alice_mcx128</device>
<device>alto2_cpu</device>
<device>altos2_kbd</device>
@ -197,6 +199,7 @@
<device>arc_midimax</device>
<device>arc_nexus_a500</device>
<device>arc_rom_aka05</device>
<device>arc_rom_r225</device>
<device>arc_rs423</device>
<device>arc_scan256</device>
<device>arc_scanjunior3</device>
@ -225,6 +228,7 @@
<device>atom_discpack</device>
<device>ax208</device>
<device>ax208p</device>
<device>banshee_x86</device>
<device>basf7100_kbd</device>
<device>bbc_24bbc</device>
<device>bbc_2ndserial</device>
@ -260,6 +264,7 @@
<device>bbc_opus8272</device>
<device>bbc_opusa</device>
<device>bbc_pdram</device>
<device>bbc_pms64k</device>
<device>bbc_ramdisc</device>
<device>bbc_raven20</device>
<device>bbc_stl1770_1</device>
@ -280,6 +285,7 @@
<device>bbc_tube_65c102</device>
<device>bbc_tube_80186</device>
<device>bbc_tube_80286</device>
<device>bbc_tube_a500d</device>
<device>bbc_tube_a500</device>
<device>bbc_tube_arm7</device>
<device>bbc_tube_arm</device>
@ -387,6 +393,7 @@
<device>cit101_kbd</device>
<device>cit220p_kbd</device>
<device>clgd542x</device>
<device>clgd5446_pci</device>
<device>clgd5465_laguna</device>
<device>cmdhd</device>
<device>cmdrc2</device>
@ -443,10 +450,13 @@
<device>cuda302</device>
<device>cuda</device>
<device>cudalite</device>
<device>cv8lc</device>
<device>cw7501</device>
<device>d2fdc</device>
<device>d9060</device>
<device>d9090</device>
<device>db50xg</device>
<device>db60xg</device>
<device>dc320b</device>
<device>dc320e</device>
<device>dc820b</device>
@ -518,6 +528,7 @@
<device>electron_sidewndr</device>
<device>electron_voxbox</device>
<device>enh2000</device>
<device>enp10</device>
<device>ep64_exdos</device>
<device>epson_pf10</device>
<device>epson_qx_option_multifont</device>
@ -529,6 +540,7 @@
<device>ev346</device>
<device>ex1280</device>
<device>ex800</device>
<device>executive10_102_kbd</device>
<device>exorterm155_device</device>
<device>f4431_kbd</device>
<device>fccpu20</device>
@ -552,6 +564,8 @@
<device>fsd1</device>
<device>fsd2</device>
<device>g80_1500</device>
<device>geforce256ddr</device>
<device>geforce256</device>
<device>gfxultra</device>
<device>gfxultrap</device>
<device>gfxultrp</device>
@ -561,16 +575,25 @@
<device>hardbox</device>
<device>hcpu30</device>
<device>hd44780_a00</device>
<device>hd44780</device>
<device>hd44780u</device>
<device>hd61830</device>
<device>hd63484</device>
<device>hdc</device>
<device>hdc_ec1841</device>
<device>he191_3425</device>
<device>heath_gp19_tlb</device>
<device>heath_igc_super19_tlb_device</device>
<device>heath_igc_tlb_device</device>
<device>heath_igc_ultra_tlb_device</device>
<device>heath_igc_watz_tlb_device</device>
<device>heath_imaginator_tlb</device>
<device>heath_super19_tlb</device>
<device>heath_superset_tlb</device>
<device>heath_tlb</device>
<device>heath_ultra_tlb</device>
<device>heath_watz_tlb</device>
<device>hk68v10</device>
<device>hp82900</device>
<device>hp82937</device>
<device>hp82939</device>
@ -587,6 +610,7 @@
<device>i8245</device>
<device>ibm_mfc</device>
<device>ibm_vga</device>
<device>idpart_video</device>
<device>ie15_device</device>
<device>ie15kbd</device>
<device>ie15_keyboard</device>
@ -645,6 +669,7 @@
<device>keytronic_pc3270_at</device>
<device>keytronic_pc3270</device>
<device>km035</device>
<device>ks0066</device>
<device>ks0066_f00</device>
<device>ks0066_f05</device>
<device>labtam_3232</device>
@ -742,16 +767,19 @@
<device>mtx_cfx</device>
<device>mtx_sdxbas</device>
<device>mtx_sdxcpm</device>
<device>mu5lcd</device>
<device>mulcd</device>
<device>mvme120</device>
<device>mvme121</device>
<device>mvme122</device>
<device>mvme123</device>
<device>mvme147</device>
<device>mvme180</device>
<device>mvme181</device>
<device>mvme187</device>
<device>mvme327a</device>
<device>mvme350</device>
<device>mzr8105</device>
<device>nabupc_keyboard</device>
<device>namco50</device>
<device>namco51</device>
@ -789,6 +817,7 @@
<device>nb_rtpd</device>
<device>nb_sp8s3</device>
<device>nb_spdq</device>
<device>nb_thungx</device>
<device>nb_vikbw</device>
<device>nb_wspt</device>
<device>neogs</device>
@ -801,7 +830,9 @@
<device>np600a3</device>
<device>nsmdsad</device>
<device>nsmdsa</device>
<device>nss_tvinterface</device>
<device>o2_voice</device>
<device>omniwave</device>
<device>omti8621isa</device>
<device>oric_jasmin</device>
<device>oric_microdisc</device>
@ -809,11 +840,13 @@
<device>osa_maestroa</device>
<device>osa_maestro</device>
<device>osa_sparc</device>
<device>oti64111_pci</device>
<device>p1_fdc</device>
<device>p1_hdc</device>
<device>p1_rom</device>
<device>p72</device>
<device>pa7246</device>
<device>partner_gdp</device>
<device>pc1512kb</device>
<device>pc1640_iga</device>
<device>pc80s31</device>
@ -834,12 +867,17 @@
<device>pd3_lviw</device>
<device>pd3_mclr</device>
<device>pd3_pc16</device>
<device>pdc20262</device>
<device>pdc</device>
<device>pds30_emac</device>
<device>pds_hyper</device>
<device>pdslc_macconlc</device>
<device>pds_sefp</device>
<device>pet_softbox</device>
<device>pet_superpet</device>
<device>pg200</device>
<device>plg100_vl</device>
<device>plg150_ap</device>
<device>plus4_sid</device>
<device>polyvti</device>
<device>pr8210</device>
@ -848,6 +886,7 @@
<device>profighterqb</device>
<device>profighterq</device>
<device>profighterx</device>
<device>promotion3210</device>
<device>ps2_keybc</device>
<device>psion_3fax</device>
<device>psion_3link_ser</device>
@ -856,6 +895,7 @@
<device>pvga1a</device>
<device>pvga1a_jk</device>
<device>px320a</device>
<device>qg640</device>
<device>ql_cumanafdi</device>
<device>ql_gold</device>
<device>ql_kdi</device>
@ -880,6 +920,7 @@
<device>qsound</device>
<device>qsound_hle</device>
<device>qts1</device>
<device>quadro</device>
<device>qx10_keyboard_ascii</device>
<device>qx10_keyboard</device>
<device>qx10_keyboard_hasci</device>
@ -895,6 +936,8 @@
<device>rivatnt2_m64</device>
<device>rivatnt2_ultra</device>
<device>rivatnt</device>
<device>robotron_k7070</device>
<device>robotron_k7071</device>
<device>rolm_pdc</device>
<device>rolm_smioc</device>
<device>rtpc_kbd</device>
@ -929,6 +972,7 @@
<device>sbus_hme</device>
<device>sbus_sunpc</device>
<device>sc119</device>
<device>scorpion_ic</device>
<device>sdtandy_fdc</device>
<device>sed1200da</device>
<device>sed1200db</device>
@ -936,8 +980,10 @@
<device>sed1200fa</device>
<device>sed1200fb</device>
<device>sed1278_0b</device>
<device>sed1278</device>
<device>sed1330</device>
<device>sega837_14438</device>
<device>segaai_soundbox</device>
<device>segabill</device>
<device>segadimm</device>
<device>seganetw</device>
@ -948,10 +994,12 @@
<device>seta11leg</device>
<device>sfd10001</device>
<device>sfd1001</device>
<device>sgi_ip4</device>
<device>sgi_kbd</device>
<device>side116</device>
<device>simutrek</device>
<device>sis630_gui</device>
<device>sis6326_agp</device>
<device>sis900_eth</device>
<device>slutprov</device>
<device>smoc501</device>
@ -1011,6 +1059,7 @@
<device>spectrum_swiftdisc</device>
<device>spectrum_usource</device>
<device>spectrum_uspeech</device>
<device>spectrum_vtx5000</device>
<device>spectrum_wafa</device>
<device>s_smp</device>
<device>stereo_fx</device>
@ -1018,17 +1067,38 @@
<device>st_kbd</device>
<device>sv603</device>
<device>sv806</device>
<device>sw1000xg</device>
<device>swtpc8212_device</device>
<device>sx1541</device>
<device>sys68k_cpu1</device>
<device>sys68k_cpu20</device>
<device>sys68k_cpu21a</device>
<device>sys68k_cpu21b</device>
<device>sys68k_cpu21</device>
<device>sys68k_cpu21s</device>
<device>sys68k_cpu21ya</device>
<device>sys68k_cpu21yb</device>
<device>sys68k_cpu30be</device>
<device>sys68k_cpu30</device>
<device>sys68k_cpu30lite</device>
<device>sys68k_cpu30xa</device>
<device>sys68k_cpu30x</device>
<device>sys68k_cpu30za</device>
<device>sys68k_cpu33</device>
<device>sys68k_iscsi1</device>
<device>sys68k_isio1</device>
<device>t5182</device>
<device>tanbus_ra32k</device>
<device>tanbus_ra32krom</device>
<device>tanbus_tandos</device>
<device>tanbus_tanex</device>
<device>tanbus_vid8082</device>
<device>tandberg_tdv2100_disp_logic</device>
<device>tandberg_tdv2100_keyboard</device>
<device>tandy2kb</device>
<device>technica</device>
<device>tek410x_kbd</device>
<device>tek_msu_fdc</device>
<device>tetriskr_cga</device>
<device>tgui9680</device>
<device>ti99_bwg</device>
@ -1071,6 +1141,7 @@
<device>uts_extw</device>
<device>v102_kbd</device>
<device>v1050kb</device>
<device>v50_kbd</device>
<device>v550_kbd</device>
<device>vanta</device>
<device>vector4_kbd</device>
@ -1083,6 +1154,9 @@
<device>victor9k_kb</device>
<device>virgedx_pci</device>
<device>virge_pci</device>
<device>vision864</device>
<device>vision964</device>
<device>vision968</device>
<device>voicebox</device>
<device>votrax</device>
<device>votrsc01a</device>
@ -1110,7 +1184,9 @@
<device>wd90c31_lr</device>
<device>wd90c33_zz</device>
<device>wd90c90_jk</device>
<device>wd9710_pci</device>
<device>wdxt_gen</device>
<device>wg130</device>
<device>wordpro</device>
<device>wyse700</device>
<device>x68k_cz6bs1</device>
@ -1123,6 +1199,7 @@
<device>ymf281</device>
<device>z8671</device>
<device>z8682</device>
<device>zip100_ide</device>
<device>zorba_kbd</device>
<device>zorro_a2091</device>
<device>zorro_a590</device>
@ -1130,3 +1207,4 @@
<device>zorro_ar2</device>
<device>zorro_ar3</device>
<device>zorro_buddha</device>
<device>zxbus_neogs</device>

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Tue Dec 12 04:12:04 2023 GMT
## Certificate data from Mozilla as of: Mon Mar 11 15:25:27 2024 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@ -14,7 +14,7 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 1970dd65858925d68498d2356aea6d03f764422523c5887deca8ce3ba9e1f845
## SHA256: 4d96bd539f4719e9ace493757afbe4a23ee8579de1c97fbebc50bba3c12e8c1e
##
@ -3532,3 +3532,50 @@ dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ
iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN
lM47ni3niAIi9G7oyOzWPPO5std3eqx7
-----END CERTIFICATE-----
Telekom Security TLS ECC Root 2020
==================================
-----BEGIN CERTIFICATE-----
MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE
RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl
a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz
NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg
R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG
SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1
2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC
MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ
Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU
ga/sf+Rn27iQ7t0l
-----END CERTIFICATE-----
Telekom Security TLS RSA Root 2023
==================================
-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG
EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU
ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy
NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp
dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC
KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP
GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx
UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo
l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9
FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v
zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg
rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML
KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S
WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV
HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+
sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp
kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy
/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4
mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz
aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa
oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8
wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE-----

View file

@ -37,6 +37,14 @@
<name>android</name>
<systemsortname>OS - 2008</systemsortname>
</system>
<system>
<name>androidapps</name>
<systemsortname>Folder - 0000</systemsortname>
</system>
<system>
<name>androidgames</name>
<systemsortname>Folder - 0000</systemsortname>
</system>
<system>
<name>apple2</name>
<systemsortname>Computer - 1977</systemsortname>

View file

@ -37,6 +37,14 @@
<name>android</name>
<systemsortname>Google - OS - 2008</systemsortname>
</system>
<system>
<name>androidapps</name>
<systemsortname>Various - Folder - 0000</systemsortname>
</system>
<system>
<name>androidgames</name>
<systemsortname>Various - Folder - 0000</systemsortname>
</system>
<system>
<name>apple2</name>
<systemsortname>Apple - Computer - 1977</systemsortname>

View file

@ -37,6 +37,14 @@
<name>android</name>
<systemsortname>Google - 2008</systemsortname>
</system>
<system>
<name>androidapps</name>
<systemsortname>Various - 0000</systemsortname>
</system>
<system>
<name>androidgames</name>
<systemsortname>Various - 0000</systemsortname>
</system>
<system>
<name>apple2</name>
<systemsortname>Apple - 1977</systemsortname>

View file

@ -37,6 +37,14 @@
<name>android</name>
<systemsortname>2008</systemsortname>
</system>
<system>
<name>androidapps</name>
<systemsortname>0000</systemsortname>
</system>
<system>
<name>androidgames</name>
<systemsortname>0000</systemsortname>
</system>
<system>
<name>apple2</name>
<systemsortname>1977</systemsortname>

View file

@ -6,7 +6,7 @@
<!-- 64-bit and 32-bit releases from the retroarch.com website -->
<entry>com.retroarch.aarch64/com.retroarch.browser.retroactivity.RetroActivityFuture</entry>
<entry>com.retroarch.ra32/com.retroarch.browser.retroactivity.RetroActivityFuture</entry>
<!-- Amazon Appstore and Google Play releases -->
<!-- Samsung Galaxy Store, Amazon Appstore and Google Play releases -->
<entry>com.retroarch/com.retroarch.browser.retroactivity.RetroActivityFuture</entry>
</rule>
</emulator>
@ -73,6 +73,12 @@
<entry>org.dolphinemu.mmjr/org.dolphinemu.dolphinemu.ui.main.MainActivity</entry>
</rule>
</emulator>
<emulator name="DROIDARCADIA">
<!-- Emerson Arcadia 2001 emulator DroidArcadia -->
<rule type="androidpackage">
<entry>com.amigan.droidarcadia/.MainActivity</entry>
</rule>
</emulator>
<emulator name="DRASTIC">
<!-- Nintendo DS emulator DraStic -->
<rule type="androidpackage">
@ -140,6 +146,18 @@
<entry>com.fms.ines.free/com.fms.emulib.TVActivity</entry>
</rule>
</emulator>
<emulator name="IRATAJAGUAR">
<!-- Atari Jaguar emulator IrataJaguar -->
<rule type="androidpackage">
<entry>ru.vastness.altmer.iratajaguar/.EmulatorActivity</entry>
</rule>
</emulator>
<emulator name="LIME3DS">
<!-- Nintendo 3DS emulator Lime3DS -->
<rule type="androidpackage">
<entry>io.github.lime3ds.android/.activities.EmulationActivity</entry>
</rule>
</emulator>
<emulator name="LYNX-EMU">
<!-- Atari Lynx emulator Lynx.emu -->
<rule type="androidpackage">
@ -307,6 +325,13 @@
<entry>com.explusalpha.SaturnEmu/com.imagine.BaseActivity</entry>
</rule>
</emulator>
<emulator name="SCUMMVM">
<!-- ScummVM game engine -->
<rule type="androidpackage">
<entry>org.scummvm.scummvm.debug/org.scummvm.scummvm.SplashActivity</entry>
<entry>org.scummvm.scummvm/org.scummvm.scummvm.SplashActivity</entry>
</rule>
</emulator>
<emulator name="SKYLINE">
<!-- Nintendo Switch emulator Skyline -->
<rule type="androidpackage">
@ -332,6 +357,12 @@
<entry>com.explusalpha.SwanEmu/com.imagine.BaseActivity</entry>
</rule>
</emulator>
<emulator name="VISUAL-PINBALL">
<!-- Pinball simulator Visual Pinball -->
<rule type="androidpackage">
<entry>org.vpinball.app/.VpxLauncherActivity</entry>
</rule>
</emulator>
<emulator name="VITA3K">
<!-- Sony PlayStation Vita emulator Vita3K -->
<rule type="androidpackage">

View file

@ -16,6 +16,10 @@
<fullname>Coleco Adam</fullname>
<path>%ROMPATH%/adam</path>
<extension>.1dd .1DD .bin .BIN .col .COL .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .ddp .DDP .dfi .DFI .dsk .DSK .hfe .HFE .imd .IMD .mfi .MFI .mfm .MFM .rom .ROM .td0 .TD0 .wav .WAV .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 [Diskette] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/adam' -flop1 '%ROMRAW%'" %DATA%=adam</command>
<command label="MAME4droid 2024 [Tape] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/adam' -cass1 '%ROMRAW%'" %DATA%=adam</command>
<command label="MAME4droid 2024 [Cartridge] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/adam' -cart1 '%ROMRAW%'" %DATA%=adam</command>
<command label="MAME4droid 2024 [Software list] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/adam'" %DATA%=%ROMPROVIDER%</command>
<command label="ColEm (Standalone)">%EMULATOR_COLEM% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
<platform>adam</platform>
<theme>adam</theme>
@ -76,6 +80,7 @@
<extension>.cdt .CDT .cpr .CPR .dsk .DSK .kcr .KCR .m3u .M3U .sna .SNA .tap .TAR .voc .VOC .7z .7Z .zip .ZIP</extension>
<command label="Caprice32">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=cap32_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="CrocoDS">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=crocods_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/amstradcpc' -flop1 '%ROMRAW%'" %DATA%=cpc6128</command>
<platform>amstradcpc</platform>
<theme>amstradcpc</theme>
</system>
@ -88,12 +93,30 @@
<platform>android</platform>
<theme>android</theme>
</system>
<system>
<name>androidapps</name>
<fullname>Android Apps</fullname>
<path>%ROMPATH%/androidapps</path>
<extension>.app .APP</extension>
<command label="Android App">%ANDROIDAPP%=%FILEINJECT%</command>
<platform>android</platform>
<theme>androidapps</theme>
</system>
<system>
<name>androidgames</name>
<fullname>Android Games</fullname>
<path>%ROMPATH%/androidgames</path>
<extension>.app .APP</extension>
<command label="Android Game">%ANDROIDAPP%=%FILEINJECT%</command>
<platform>android</platform>
<theme>androidgames</theme>
</system>
<system>
<name>apple2</name>
<fullname>Apple II</fullname>
<path>%ROMPATH%/apple2</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.do .DO .dsk .DSK .nib .NIB .po .PO</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/apple2' -gameio joy -flop1 '%ROMRAW%'" %DATA%=apple2e</command>
<platform>apple2</platform>
<theme>apple2</theme>
</system>
@ -101,8 +124,8 @@
<name>apple2gs</name>
<fullname>Apple IIGS</fullname>
<path>%ROMPATH%/apple2gs</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.2mg .2MG .7z .7z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/apple2gs' -gameio joy -flop3 '%ROMRAW%'" %DATA%=apple2gs</command>
<platform>apple2gs</platform>
<theme>apple2gs</theme>
</system>
@ -116,7 +139,7 @@
<command label="MAME 2003-Plus">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_plus_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2003">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2000">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2000_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/arcade'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="NEO.emu (Standalone)">%EMULATOR_NEO-EMU% %DATA%=%ROMSAF%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
@ -131,8 +154,9 @@
<name>arcadia</name>
<fullname>Emerson Arcadia 2001</fullname>
<path>%ROMPATH%/arcadia</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="DroidArcadia">%EMULATOR_DROIDARCADIA% %MIMETYPE%=application/zip %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/arcadia' -cart '%ROMRAW%'" %DATA%=arcadia</command>
<platform>arcadia</platform>
<theme>arcadia</theme>
</system>
@ -140,8 +164,11 @@
<name>archimedes</name>
<fullname>Acorn Archimedes</fullname>
<path>%ROMPATH%/archimedes</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.1dd .1DD .360 .adf .ADF .adl .ADL .adm .ADM .ads .ADS .apd .APD .bbc .BBC .chd .CHD .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .dfi .DFI .dsd .DSD .dsk .DSK .hfe .HFE .ima .IMA .imd .IMD .img .IMG .ipf .IPF .jfd .JFD .mfi .MFI .mfm .MFM .msa .MSA .ssd .SSD .st .ST .td0 .TD0 .ufi .UFI .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 [Model A440/1] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/archimedes' -flop1 '%ROMRAW%'" %DATA%=aa4401</command>
<command label="MAME4droid 2024 [Model A3000] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/archimedes' -flop1 '%ROMRAW%'" %DATA%=aa3000</command>
<command label="MAME4droid 2024 [Model A310] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/archimedes' -flop1 '%ROMRAW%'" %DATA%=aa310</command>
<command label="MAME4droid 2024 [Model A540] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/archimedes' -flop1 '%ROMRAW%'" %DATA%=aa540</command>
<platform>archimedes</platform>
<theme>archimedes</theme>
</system>
@ -159,7 +186,7 @@
<fullname>Bally Astrocade</fullname>
<path>%ROMPATH%/astrocde</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/astrocde' -cart '%ROMRAW%'" %DATA%=astrocde</command>
<platform>astrocde</platform>
<theme>astrocade</theme>
</system>
@ -190,6 +217,7 @@
<path>%ROMPATH%/atari7800</path>
<extension>.a78 .A78 .bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="ProSystem">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=prosystem_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/atari7800' -cart '%ROMRAW%'" %DATA%=a7800</command>
<platform>atari7800</platform>
<theme>atari7800</theme>
</system>
@ -208,6 +236,8 @@
<path>%ROMPATH%/atarijaguar</path>
<extension>.abs .ABS .bin .BIN .cdi .CDI .cof .COF .cue .CUE .j64 .J64 .jag .JAG .prg .PRG .rom .ROM .7z .7Z .zip .ZIP</extension>
<command label="Virtual Jaguar">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=virtualjaguar_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="IrataJaguar (Standalone)">%EMULATOR_IRATAJAGUAR% %DATA%=%ROMSAF%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/atarijaguar' -cart '%ROMRAW%'" %DATA%=jaguar</command>
<platform>atarijaguar</platform>
<theme>atarijaguar</theme>
</system>
@ -244,7 +274,7 @@
<name>atarixe</name>
<fullname>Atari XE</fullname>
<path>%ROMPATH%/atarixe</path>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<command label="Atari800">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=atari800_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<platform>atarixe</platform>
<theme>atarixe</theme>
@ -263,8 +293,8 @@
<name>bbcmicro</name>
<fullname>Acorn Computers BBC Micro</fullname>
<path>%ROMPATH%/bbcmicro</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/bbcmicro' -autoboot_delay '2' -autoboot_command '*cat\n\n*exec !boot\n' -analogue acornjoy -flop1 '%ROMRAW%'" %DATA%=bbcb</command>
<platform>bbcmicro</platform>
<theme>bbcmicro</theme>
</system>
@ -287,6 +317,7 @@
<path>%ROMPATH%/cdimono1</path>
<extension>.chd .CHD .cue .CUE .iso .ISO</extension>
<command label="SAME CDi">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=same_cdi_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/cdimono1' -cdrom '%ROMRAW%'" %DATA%=cdimono1</command>
<platform>cdimono1</platform>
<theme>cdimono1</theme>
</system>
@ -294,7 +325,7 @@
<name>cdtv</name>
<fullname>Commodore CDTV</fullname>
<path>%ROMPATH%/cdtv</path>
<extension>.ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .7z .7Z .zip .ZIP</extension>
<extension>.adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP</extension>
<command label="PUAE">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=puae_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="PUAE 2021">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=puae2021_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<platform>cdtv</platform>
@ -315,6 +346,7 @@
<path>%ROMPATH%/channelf</path>
<extension>.bin .BIN .chf .CHF .7z .7Z .zip .ZIP</extension>
<command label="FreeChaF">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=freechaf_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/channelf' -cart '%ROMRAW%'" %DATA%=channelf</command>
<platform>channelf</platform>
<theme>channelf</theme>
</system>
@ -322,8 +354,9 @@
<name>coco</name>
<fullname>Tandy Color Computer</fullname>
<path>%ROMPATH%/coco</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.cas .CAS .ccc .CCC .dsk .DSK .rom .ROM</extension>
<command label="MAME4droid 2024 [Cartridge] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/coco' -cart '%ROMRAW%'" %DATA%=coco</command>
<command label="MAME4droid 2024 [Tape] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/coco' -autoboot_delay '2' -autoboot_command 'cloadm:exec\n' -cass '%ROMRAW%'" %DATA%=coco</command>
<platform>coco</platform>
<theme>coco</theme>
</system>
@ -343,7 +376,12 @@
<name>consolearcade</name>
<fullname>Console Arcade Systems</fullname>
<path>%ROMPATH%/consolearcade</path>
<extension>.7z .7Z .zip .ZIP</extension>
<extension>.arcadedef .iso .ISO .7z .7Z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mamearcade_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/consolearcade'" %DATA%=%ROMPROVIDER%</command>
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
<command label="Play! (Standalone)">%EMULATOR_PLAY!% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
<command>PLACEHOLDER %ROM%</command>
<platform>arcade</platform>
<theme>consolearcade</theme>
@ -358,7 +396,7 @@
<command label="MAME 2003-Plus">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_plus_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2003">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2000">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2000_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/cps'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="FB Alpha 2012">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbalpha2012_libretro_android.so %EXTRA_ROM%=%ROM%</command>
@ -378,7 +416,7 @@
<command label="MAME 2003-Plus">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_plus_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2003">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2000">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2000_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/cps1'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="FB Alpha 2012">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbalpha2012_libretro_android.so %EXTRA_ROM%=%ROM%</command>
@ -396,7 +434,7 @@
<command label="MAME 2003-Plus">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_plus_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2003">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2000">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2000_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/cps2'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="FB Alpha 2012">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbalpha2012_libretro_android.so %EXTRA_ROM%=%ROM%</command>
@ -414,7 +452,7 @@
<command label="MAME 2003-Plus">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_plus_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2003">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2000">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2000_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/cps3'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="FB Alpha 2012">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbalpha2012_libretro_android.so %EXTRA_ROM%=%ROM%</command>
@ -426,8 +464,8 @@
<name>crvision</name>
<fullname>VTech CreatiVision</fullname>
<path>%ROMPATH%/crvision</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.bin .BIN .rom .ROM .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/crvision' -cart '%ROMRAW%'" %DATA%=crvision</command>
<platform>crvision</platform>
<theme>crvision</theme>
</system>
@ -435,7 +473,8 @@
<name>daphne</name>
<fullname>Daphne Arcade LaserDisc Emulator</fullname>
<path>%ROMPATH%/daphne</path>
<extension>.dirksimple .ogv .OGV</extension>
<extension>.dirksimple .ogv .OGV .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/daphne'" %DATA%=%ROMPROVIDER%</command>
<command label="DirkSimple">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=dirksimple_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<platform>daphne, arcade</platform>
<theme>daphne</theme>
@ -502,8 +541,10 @@
<name>electron</name>
<fullname>Acorn Electron</fullname>
<path>%ROMPATH%/electron</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.1dd .1DD .adf .ADF .adl .ADL .adm .ADM .ads .ADS .bbc .BBC .bin .BIN .cqi .CQI .cqm .CQM .csw .CSW .d77 .D77 .d88 .D88 .dfi .DFI .dsd .DSD .dsk .DSK .hfe .HFE .imd .IMD .img .IMG .mfi .MFI .mfm .MFM .rom .ROM .ssd .SSD .td0 .TD0 .uef .UEF .wav .WAV .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 [Tape] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/electron' -autoboot_delay '2' -autoboot_command '*T.\nCH.\"\"\n' -cass1 '%ROMRAW%'" %DATA%=electron64</command>
<command label="MAME4droid 2024 [Diskette DFS] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/electron' -exp plus1 -cart1 seds -autoboot_delay '2' -autoboot_command '*CAT\n\n\n\n\n\n*EXEC !BOOT\n' -flop1 '%ROMRAW%'" %DATA%=electron64</command>
<command label="MAME4droid 2024 [Diskette ADFS] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/electron' -exp plus3 -exp:plus3:fdc:1 35dd -autoboot_delay '2' -autoboot_command '*CAT\n\n\n\n\n\n*RUN !BOOT\n' -flop1 '%ROMRAW%'" %DATA%=electron64</command>
<platform>electron</platform>
<theme>electron</theme>
</system>
@ -511,9 +552,9 @@
<name>emulators</name>
<fullname>Emulators</fullname>
<path>%ROMPATH%/emulators</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>pcwindows</platform>
<extension>.app .APP</extension>
<command label="Android Emulators">%ANDROIDAPP%=%FILEINJECT%</command>
<platform>android</platform>
<theme>emulators</theme>
</system>
<system>
@ -589,8 +630,13 @@
<name>fm7</name>
<fullname>Fujitsu FM-7</fullname>
<path>%ROMPATH%/fm7</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.1dd .1DD .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .dfi .DFI .dsk .DSK .hfe .HFE .imd .IMD .mfi .MFI .mfm .MFM .t77 .T77 .td0 .TD0 .wav .WAV .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 [FM-7 Diskette] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/fm7' -flop1 '%ROMRAW%'" %DATA%=fm7</command>
<command label="MAME4droid 2024 [FM-7 Tape] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/fm7' -autoboot_delay '5' -autoboot_command 'load\n\n\nrun\n' -cass1 '%ROMRAW%'" %DATA%=fm7</command>
<command label="MAME4droid 2024 [FM-7 Software list] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/fm7'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 [FM77AV Diskette] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/fm7' -flop1 '%ROMRAW%'" %DATA%=fm77av</command>
<command label="MAME4droid 2024 [FM77AV Tape] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/fm7' -autoboot_delay '5' -autoboot_command 'load\n\n\nrun\n' -cass1 '%ROMRAW%'" %DATA%=fm77av</command>
<command label="MAME4droid 2024 [FM77AV Software list] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/fm7'" %DATA%=%ROMPROVIDER%</command>
<platform>fm7</platform>
<theme>fm7</theme>
</system>
@ -598,8 +644,8 @@
<name>fmtowns</name>
<fullname>Fujitsu FM Towns</fullname>
<path>%ROMPATH%/fmtowns</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.cdr .CDR .chd .CHD .cue .CUE .gdi .GDI .iso .ISO</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/fmtowns' -cdrom '%ROMRAW%'" %DATA%=fmtownshr</command>
<platform>fmtowns</platform>
<theme>fmtowns</theme>
</system>
@ -616,8 +662,8 @@
<name>gamate</name>
<fullname>Bit Corporation Gamate</fullname>
<path>%ROMPATH%/gamate</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/gamate' -cart '%ROMRAW%'" %DATA%=gamate</command>
<platform>gamate</platform>
<theme>gamate</theme>
</system>
@ -627,6 +673,7 @@
<path>%ROMPATH%/gameandwatch</path>
<extension>.mgw .MGW .7z .7Z .zip .ZIP</extension>
<command label="Multi (MESS)">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mamemess_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 Local Artwork (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-artpath '%ROMPATHRAW%/gameandwatch/artwork'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="Handheld Electronic (GW)">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=gw_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<platform>gameandwatch</platform>
@ -636,8 +683,8 @@
<name>gamecom</name>
<fullname>Tiger Electronics Game.com</fullname>
<path>%ROMPATH%/gamecom</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.tgc .TGC .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/gamecom' -cartridge1 '%ROMRAW%'" %DATA%=gamecom</command>
<platform>gamecom</platform>
<theme>gamecom</theme>
</system>
@ -738,8 +785,8 @@
<name>gmaster</name>
<fullname>Hartung Game Master</fullname>
<path>%ROMPATH%/gmaster</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/gmaster' -cart '%ROMRAW%'" %DATA%=gmaster</command>
<platform>gmaster</platform>
<theme>gmaster</theme>
</system>
@ -750,6 +797,7 @@
<extension>.bin .BIN .cdt .CDT .cpr .CPR .dsk .DSK .kcr .KCR .m3u .M3U .sna .SNA .tap .TAR .voc .VOC .7z .7Z .zip .ZIP</extension>
<command label="Caprice32">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=cap32_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="CrocoDS">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=crocods_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/gx4000' -cart '%ROMRAW%'" %DATA%=gx4000</command>
<platform>gx4000</platform>
<theme>gx4000</theme>
</system>
@ -759,6 +807,7 @@
<path>%ROMPATH%/intellivision</path>
<extension>.bin .BIN .int .INT .rom .ROM .7z .7Z .zip .ZIP</extension>
<command label="FreeIntv">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=freeintv_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/intellivision' -cart '%ROMRAW%'" %DATA%=intv</command>
<platform>intellivision</platform>
<theme>intellivision</theme>
</system>
@ -784,7 +833,8 @@
<name>laserdisc</name>
<fullname>LaserDisc Games</fullname>
<path>%ROMPATH%/laserdisc</path>
<extension>.dirksimple .ogv .OGV</extension>
<extension>.dirksimple .ogv .OGV .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/laserdisc'" %DATA%=%ROMPROVIDER%</command>
<command label="DirkSimple">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=dirksimple_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<platform>daphne, arcade</platform>
<theme>laserdisc</theme>
@ -795,6 +845,7 @@
<path>%ROMPATH%/lcdgames</path>
<extension>.mgw .MGW .7z .7Z .zip .ZIP</extension>
<command label="Multi (MESS)">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mamemess_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 Local Artwork (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-artpath '%ROMPATHRAW%/lcdgames/artwork'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="Handheld Electronic (GW)">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=gw_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<platform>lcdgames, gameandwatch</platform>
@ -831,8 +882,11 @@
<name>macintosh</name>
<fullname>Apple Macintosh</fullname>
<path>%ROMPATH%/macintosh</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.dsk .DSK</extension>
<command label="MAME4droid 2024 Mac SE Bootable (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/macintosh' -flop1 '%ROMRAW%'" %DATA%=macse</command>
<command label="MAME4droid 2024 Mac SE Boot Disk (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/macintosh' -flop1 %GAMEDIRRAW%/boot.dsk -flop2 '%ROMRAW%'" %DATA%=macse</command>
<command label="MAME4droid 2024 Mac Plus Bootable (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/macintosh' -flop1 '%ROMRAW%'" %DATA%=macplus</command>
<command label="MAME4droid 2024 Mac Plus Boot Disk (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/macintosh' -flop1 %GAMEDIRRAW%/boot.dsk -flop2 '%ROMRAW%'" %DATA%=macplus</command>
<platform>macintosh</platform>
<theme>macintosh</theme>
</system>
@ -846,7 +900,7 @@
<command label="MAME 2003-Plus">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_plus_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2003">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2003_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME 2000">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mame2000_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/mame'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="NEO.emu (Standalone)">%EMULATOR_NEO-EMU% %DATA%=%ROMSAF%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
@ -935,6 +989,7 @@
<path>%ROMPATH%/megaduck</path>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="SameDuck">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=sameduck_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/megaduck' -cart '%ROMRAW%'" %DATA%=megaduck</command>
<platform>megaduck</platform>
<theme>megaduck</theme>
</system>
@ -953,6 +1008,7 @@
<path>%ROMPATH%/model2</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mamearcade_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/model2'" %DATA%=%ROMPROVIDER%</command>
<platform>arcade</platform>
<theme>model2</theme>
</system>
@ -1048,6 +1104,7 @@
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
<command label="Citra Canary (Standalone)">%EMULATOR_CITRA-CANARY% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
<command label="Citra MMJ (Standalone)">%EMULATOR_CITRA-MMJ% %EXTRA_GamePath%=%ROM%</command>
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %DATA%=%ROMPROVIDER%</command>
<platform>n3ds</platform>
<theme>n3ds</theme>
@ -1112,6 +1169,7 @@
<path>%ROMPATH%/nds</path>
<extension>.app .APP .bin .BIN .nds .NDS .7z .7Z .zip .ZIP</extension>
<command label="melonDS DS">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=melondsds_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="melonDS">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=melonds_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% %ACTION%=me.magnum.melonds.LAUNCH_ROM %EXTRA_uri%=%ROMSAF%</command>
<command label="melonDS Nightly (Standalone)">%EMULATOR_MELONDS-NIGHTLY% %ACTION%=me.magnum.melonds.nightly.LAUNCH_ROM %EXTRA_uri%=%ROMSAF%</command>
<command label="DeSmuME">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=desmume_libretro_android.so %EXTRA_ROM%=%ROM%</command>
@ -1128,7 +1186,7 @@
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="Geolith">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=geolith_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="NEO.emu (Standalone)">%EMULATOR_NEO-EMU% %DATA%=%ROMSAF%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/neogeo'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<platform>neogeo</platform>
<theme>neogeo</theme>
@ -1140,6 +1198,7 @@
<extension>.chd .CHD .cue .CUE</extension>
<command label="NeoCD">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=neocd_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/neogeocd' -cdrm '%ROMRAW%'" %DATA%=neocdz</command>
<platform>neogeocd</platform>
<theme>neogeocd</theme>
</system>
@ -1150,6 +1209,7 @@
<extension>.chd .CHD .cue .CUE</extension>
<command label="NeoCD">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=neocd_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="FinalBurn Neo">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbneo_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/neogeocdjp' -cdrm '%ROMRAW%'" %DATA%=neocdz</command>
<platform>neogeocd</platform>
<theme>neogeocdjp</theme>
</system>
@ -1205,6 +1265,7 @@
<path>%ROMPATH%/odyssey2</path>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="O2EM">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=o2em_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/odyssey2' -cart '%ROMRAW%'" %DATA%=odyssey2</command>
<platform>odyssey2</platform>
<theme>odyssey2</theme>
</system>
@ -1221,8 +1282,8 @@
<name>oric</name>
<fullname>Tangerine Computer Systems Oric</fullname>
<path>%ROMPATH%/oric</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.dsk .DSK .ort .ORT .tap .TAP .wav .WAV</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/oric' -autoboot_delay '4' -autoboot_command 'cload\"\"\n' -cass '%ROMRAW%'" %DATA%=oric1</command>
<platform>oric</platform>
<theme>oric</theme>
</system>
@ -1414,8 +1475,8 @@
<name>pv1000</name>
<fullname>Casio PV-1000</fullname>
<path>%ROMPATH%/pv1000</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/pv1000' -cart '%ROMRAW%'" %DATA%=pv1000</command>
<platform>pv1000</platform>
<theme>pv1000</theme>
</system>
@ -1489,6 +1550,7 @@
<path>%ROMPATH%/scummvm</path>
<extension>.scummvm .SCUMMVM .svm .SVM</extension>
<command label="ScummVM">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=scummvm_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="ScummVM (Standalone)">%EMULATOR_SCUMMVM% %ACTION%=android.intent.action.MAIN %CATEGORY%=android.intent.action.MAIN %DATA%=%INJECT%=%ROM%</command>
<platform>scummvm</platform>
<theme>scummvm</theme>
</system>
@ -1496,8 +1558,8 @@
<name>scv</name>
<fullname>Epoch Super Cassette Vision</fullname>
<path>%ROMPATH%/scv</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.0 .bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/scv' -cart '%ROMRAW%'" %DATA%=scv</command>
<platform>scv</platform>
<theme>scv</theme>
</system>
@ -1648,7 +1710,7 @@
<path>%ROMPATH%/stv</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mamearcade_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/stv'" %DATA%=%ROMPROVIDER%</command>
<command label="MAME4droid (Standalone)">%EMULATOR_MAME4DROID% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<platform>arcade</platform>
<theme>stv</theme>
@ -1685,6 +1747,7 @@
<path>%ROMPATH%/supervision</path>
<extension>.bin .BIN .sv .SV .7z .7Z .zip .ZIP</extension>
<command label="Potator">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=potator_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/supervision' -cart '%ROMRAW%'" %DATA%=svision</command>
<platform>supervision</platform>
<theme>supervision</theme>
</system>
@ -1692,8 +1755,8 @@
<name>supracan</name>
<fullname>Funtech Super A'Can</fullname>
<path>%ROMPATH%/supracan</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/supracan' -cart '%ROMRAW%'" %DATA%=supracan</command>
<platform>supracan</platform>
<theme>supracan</theme>
</system>
@ -1752,8 +1815,8 @@
<name>ti99</name>
<fullname>Texas Instruments TI-99</fullname>
<path>%ROMPATH%/ti99</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.rpk .RPK .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/ti99' -ioport peb -ioport:peb:slot3 speech -cart '%ROMRAW%'" %DATA%=ti99_4a</command>
<platform>ti99</platform>
<theme>ti99</theme>
</system>
@ -1817,6 +1880,7 @@
<path>%ROMPATH%/vectrex</path>
<extension>.bin .BIN .gam .GAM .vc .VC .vec .VEC .7z .7Z .zip .ZIP</extension>
<command label="vecx">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=vecx_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/vectrex' -cart '%ROMRAW%'" %DATA%=vectrex</command>
<platform>vectrex</platform>
<theme>vectrex</theme>
</system>
@ -1835,6 +1899,7 @@
<path>%ROMPATH%/videopac</path>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="O2EM">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=o2em_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/videopac' -cart '%ROMRAW%'" %DATA%=videopac</command>
<platform>odyssey2</platform>
<theme>videopac</theme>
</system>
@ -1851,8 +1916,8 @@
<name>vpinball</name>
<fullname>Visual Pinball</fullname>
<path>%ROMPATH%/vpinball</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.vpinball .VPINBALL .vpt .VPT .vpx .VPX</extension>
<command label="Visual Pinball (Standalone)">%EMULATOR_VISUAL-PINBALL% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
<platform>vpinball</platform>
<theme>vpinball</theme>
</system>
@ -1860,8 +1925,8 @@
<name>vsmile</name>
<fullname>VTech V.Smile</fullname>
<path>%ROMPATH%/vsmile</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/vsmile' -cart '%ROMRAW%'" %DATA%=vsmile</command>
<platform>vsmile</platform>
<theme>vsmile</theme>
</system>
@ -1948,6 +2013,8 @@
<path>%ROMPATH%/x1</path>
<extension>.2d .2D .2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dup .DUP .dx1 .DX1 .hdm .HDM .tap .TAP .tfd .TFD .xdf .XDF .7z .7Z .zip .ZIP</extension>
<command label="X Millennium">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=x1_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 [Diskette] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/x1' -flop1 '%ROMRAW%'" %DATA%=x1</command>
<command label="MAME4droid 2024 [Tape] (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/x1' -cass1 '%ROMRAW%'" %DATA%=x1</command>
<platform>x1</platform>
<theme>x1</theme>
</system>
@ -1957,6 +2024,7 @@
<path>%ROMPATH%/x68000</path>
<extension>.2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dim .DIM .dup .DUP .hdf .HDF .hdm .HDM .img .IMG .m3u .M3U .xdf .XDF .7z .7Z .zip .ZIP</extension>
<command label="PX68k">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=px68k_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/x68000' -flop1 '%ROMRAW%'" %DATA%=x68000</command>
<platform>x68000</platform>
<theme>x68000</theme>
</system>
@ -1982,8 +2050,8 @@
<name>zmachine</name>
<fullname>Infocom Z-machine</fullname>
<path>%ROMPATH%/zmachine</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<extension>.dat .DAT .z1 .Z1 .z2 .Z2 .z3 .Z3 .z4 .Z4 .z5 .Z5 .z6 .Z6 .z7 .Z7 .z8 .Z8 .zlb .ZLB .zblorb .ZBLORB</extension>
<command label="MojoZork">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mojozork_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<platform>zmachine</platform>
<theme>zmachine</theme>
</system>

View file

@ -53,6 +53,18 @@
<entry>~/bin/3dSen/3dSen.exe</entry>
</rule>
</emulator>
<emulator name="ACE-DL">
<!-- Amstrad CPC emulator ACE-DL -->
<rule type="systempath">
<entry>AceDL</entry>
</rule>
<rule type="staticpath">
<entry>~/Applications/AceDL/AceDL</entry>
<entry>~/.local/share/applications/AceDL/AceDL</entry>
<entry>~/.local/bin/AceDL/AceDL</entry>
<entry>~/bin/AceDL/AceDL</entry>
</rule>
</emulator>
<emulator name="ADVANCEMAME">
<!-- Arcade emulator AdvanceMAME -->
<rule type="systempath">
@ -110,6 +122,18 @@
<entry>~/.local/share/flatpak/exports/bin/net.cebix.basilisk</entry>
</rule>
</emulator>
<emulator name="BIGPEMU">
<!-- Atari Jaguar emulator BigPEmu -->
<rule type="systempath">
<entry>bigpemu</entry>
</rule>
<rule type="staticpath">
<entry>~/Applications/bigpemu/bigpemu</entry>
<entry>~/.local/share/applications/bigpemu/bigpemu</entry>
<entry>~/.local/bin/bigpemu/bigpemu</entry>
<entry>~/bin/bigpemu/bigpemu</entry>
</rule>
</emulator>
<emulator name="BIGPEMU-WINDOWS">
<!-- Atari Jaguar emulator BigPEmu -->
<rule type="staticpath">
@ -181,6 +205,18 @@
<entry>~/.local/share/flatpak/exports/bin/org.citra_emu.citra</entry>
</rule>
</emulator>
<emulator name="COLEM">
<!-- Coleco ColecoVision and Adam emulator ColEm -->
<rule type="systempath">
<entry>colem</entry>
</rule>
<rule type="staticpath">
<entry>~/Applications/colem/colem</entry>
<entry>~/.local/share/applications/colem/colem</entry>
<entry>~/.local/bin/colem/colem</entry>
<entry>~/bin/colem/colem</entry>
</rule>
</emulator>
<emulator name="CPCEMU">
<!-- Amstrad CPC emulator CPCemu -->
<rule type="systempath">
@ -449,6 +485,25 @@
<entry>~/bin/lightspark/lightspark</entry>
</rule>
</emulator>
<emulator name="LIME3DS">
<!-- Nintendo 3DS emulator Lime3DS -->
<rule type="systempath">
<entry>lime3ds-gui</entry>
<entry>lime-qt</entry>
</rule>
<rule type="staticpath">
<entry>~/Applications/lime3ds-gui*.AppImage</entry>
<entry>~/.local/share/applications/lime3ds-gui*.AppImage</entry>
<entry>~/.local/bin/lime3ds-gui*.AppImage</entry>
<entry>~/bin/lime3ds-gui*.AppImage</entry>
<entry>~/Applications/lime-qt*.AppImage</entry>
<entry>~/.local/share/applications/lime-qt*.AppImage</entry>
<entry>~/.local/bin/lime-qt*.AppImage</entry>
<entry>~/bin/lime-qt*.AppImage</entry>
<entry>/var/lib/flatpak/exports/bin/io.github.lime3ds.Lime3DS</entry>
<entry>~/.local/share/flatpak/exports/bin/io.github.lime3ds.Lime3DS</entry>
</rule>
</emulator>
<emulator name="LINAPPLE">
<!-- Apple II emulator LinApple -->
<rule type="systempath">
@ -1058,6 +1113,15 @@
<entry>~/bin/xenia/xenia_canary.exe</entry>
</rule>
</emulator>
<emulator name="XM6PRO68K-WINDOWS">
<!-- Sharp X68000 emulator XM6 Pro-68k -->
<rule type="staticpath">
<entry>~/Applications/XM6 Pro-68k/XM6.exe</entry>
<entry>~/.local/share/applications/XM6 Pro-68k/XM6.exe</entry>
<entry>~/.local/bin/XM6 Pro-68k/XM6.exe</entry>
<entry>~/bin/XM6 Pro-68k/XM6.exe</entry>
</rule>
</emulator>
<emulator name="XROAR">
<!-- Dragon and Tandy 8-bit computer emulator XRoar -->
<rule type="systempath">

View file

@ -15,10 +15,11 @@
<fullname>Coleco Adam</fullname>
<path>%ROMPATH%/adam</path>
<extension>.1dd .1DD .bin .BIN .col .COL .cqi .CQI .cqm .CQM .d77 .D77 .d88 .D88 .ddp .DDP .dfi .DFI .dsk .DSK .hfe .HFE .imd .IMD .mfi .MFI .mfm .MFM .rom .ROM .td0 .TD0 .wav .WAV .7z .7Z .zip .ZIP</extension>
<command label="MAME [Diskette] (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam -flop1 %ROM%</command>
<command label="MAME [Tape] (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cass1 %ROM%</command>
<command label="MAME [Cartridge] (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cart1 %ROM%</command>
<command label="MAME [Software list] (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam %BASENAME%</command>
<command label="MAME [Diskette] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam -flop1 %ROM%</command>
<command label="MAME [Tape] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cass1 %ROM%</command>
<command label="MAME [Cartridge] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam -cart1 %ROM%</command>
<command label="MAME [Software list] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/adam adam %BASENAME%</command>
<!-- <command label="ColEm (Standalone)">%EMULATOR_COLEM% %INJECT%=%BASENAME%.commands -adam %ROM%</command> -->
<platform>adam</platform>
<theme>adam</theme>
</system>
@ -88,8 +89,9 @@
<extension>.cdt .CDT .cpr .CPR .dsk .DSK .kcr .KCR .m3u .M3U .sna .SNA .tap .TAR .voc .VOC .7z .7Z .zip .ZIP</extension>
<command label="Caprice32">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cap32_libretro.so %ROM%</command>
<command label="CrocoDS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/crocods_libretro.so %ROM%</command>
<command label="CPCemu (Standalone)">%STARTDIR%=~/.CPCemu %EMULATOR_CPCEMU% %ROM%</command>
<command label="MAME (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/amstradcpc cpc6128 -flop1 %ROM%</command>
<!-- <command label="CPCemu (Standalone)">%STARTDIR%=~/.CPCemu %EMULATOR_CPCEMU% %ROM%</command> -->
<!-- <command label="ACE-DL (Standalone)">%EMULATOR_ACE-DL% %INJECT%=%BASENAME%.commands %ROM%</command> -->
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/amstradcpc cpc6128 -flop1 %ROM%</command>
<platform>amstradcpc</platform>
<theme>amstradcpc</theme>
</system>
@ -102,6 +104,24 @@
<platform>android</platform>
<theme>android</theme>
</system>
<system>
<name>androidapps</name>
<fullname>Android Apps</fullname>
<path>%ROMPATH%/androidapps</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidapps</theme>
</system>
<system>
<name>androidgames</name>
<fullname>Android Games</fullname>
<path>%ROMPATH%/androidgames</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidgames</theme>
</system>
<system>
<name>apple2</name>
<fullname>Apple II</fullname>
@ -109,8 +129,8 @@
<extension>.do .DO .dsk .DSK .nib .NIB .po .PO</extension>
<!-- <command label="LinApple (Standalone)">%EMULATOR_LINAPPLE% -f -b &ndash;&ndash;d1 %ROM%</command> -->
<!-- <command label="Mednafen (Standalone)">%EMULATOR_MEDNAFEN% -force_module apple2 %ROM%</command> -->
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -flop1 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -gameio joy -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -gameio joy -flop1 %ROM%</command>
<platform>apple2</platform>
<theme>apple2</theme>
</system>
@ -119,8 +139,8 @@
<fullname>Apple IIGS</fullname>
<path>%ROMPATH%/apple2gs</path>
<extension>.2mg .2MG .7z .7z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -flop3 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -gameio joy -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -gameio joy -flop3 %ROM%</command>
<platform>apple2gs</platform>
<theme>apple2gs</theme>
</system>
@ -240,9 +260,10 @@
<path>%ROMPATH%/atarijaguar</path>
<extension>.abs .ABS .bin .BIN .cdi .CDI .cof .COF .cue .CUE .j64 .J64 .jag .JAG .prg .PRG .rom .ROM .7z .7Z .zip .ZIP</extension>
<command label="Virtual Jaguar">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/virtualjaguar_libretro.so %ROM%</command>
<command label="MAME (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/atarijaguar jaguar -cart %ROM%</command>
<!--<command label="BigPEmu (Wine)">%STARTDIR%=%EMUDIR% %PRECOMMAND_WINE% %EMULATOR_BIGPEMU-WINDOWS% %ROM%</command>-->
<!--<command label="BigPEmu (Proton)">%STARTDIR%=%EMUDIR% %PRECOMMAND_PROTON% %EMULATOR_BIGPEMU-WINDOWS% %ROM%</command>-->
<!-- <command label="BigPEmu">%EMULATOR_BIGPEMU% %ROM%</command> -->
<!-- <command label="BigPEmu (Wine)">%STARTDIR%=%EMUDIR% %PRECOMMAND_WINE% %EMULATOR_BIGPEMU-WINDOWS% %ROM%</command> -->
<!-- <command label="BigPEmu (Proton)">%STARTDIR%=%EMUDIR% %PRECOMMAND_PROTON% %EMULATOR_BIGPEMU-WINDOWS% %ROM%</command> -->
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/atarijaguar jaguar -cart %ROM%</command>
<platform>atarijaguar</platform>
<theme>atarijaguar</theme>
</system>
@ -252,6 +273,7 @@
<fullname>Atari Jaguar CD</fullname>
<path>%ROMPATH%/atarijaguarcd</path>
<extension>.abs .ABS .bin .BIN .cdi .CDI .cof .COF .cue .CUE .j64 .J64 .jag .JAG .prg .PRG .rom .ROM .7z .7Z .zip .ZIP</extension>
<command label="BigPEmu">%EMULATOR_BIGPEMU% %ROM%</command>
<command label="BigPEmu (Wine)">%STARTDIR%=%EMUDIR% %PRECOMMAND_WINE% %EMULATOR_BIGPEMU-WINDOWS% %ROM%</command>
<command label="BigPEmu (Proton)">%STARTDIR%=%EMUDIR% %PRECOMMAND_PROTON% %EMULATOR_BIGPEMU-WINDOWS% %ROM%</command>
<platform>atarijaguarcd</platform>
@ -283,7 +305,7 @@
<name>atarixe</name>
<fullname>Atari XE</fullname>
<path>%ROMPATH%/atarixe</path>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<command label="Atari800">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM%</command>
<!-- <command label="Atari800 (Standalone)">%EMULATOR_ATARI800% %ROM%</command> -->
<platform>atarixe</platform>
@ -305,7 +327,7 @@
<fullname>Acorn Computers BBC Micro</fullname>
<path>%ROMPATH%/bbcmicro</path>
<extension>.dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP</extension>
<command label="MAME (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -flop1 %ROM%</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -analogue acornjoy -flop1 %ROM%</command>
<platform>bbcmicro</platform>
<theme>bbcmicro</theme>
</system>
@ -338,7 +360,7 @@
<name>cdtv</name>
<fullname>Commodore CDTV</fullname>
<path>%ROMPATH%/cdtv</path>
<extension>.ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .7z .7Z .zip .ZIP</extension>
<extension>.adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP</extension>
<command label="PUAE">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM%</command>
<command label="PUAE 2021">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM%</command>
<!-- <command label="FS-UAE (Standalone)">%EMULATOR_FS-UAE% &ndash;&ndashconfig:amiga-model=CDTV %ROM%</command> -->
@ -374,6 +396,8 @@
<extension>.cas .CAS .ccc .CCC .dsk .DSK .rom .ROM</extension>
<command label="XRoar CoCo 2 NTSC (Standalone)">%EMULATOR_XROAR% -fs -default-machine coco2bus %ROM%</command>
<command label="XRoar CoCo 2 PAL (Standalone)">%EMULATOR_XROAR% -fs -default-machine coco2b %ROM%</command>
<command label="MAME [Cartridge] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/coco coco -cart %ROM%</command>
<command label="MAME [Tape] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/coco coco -autoboot_delay "2" -autoboot_command "cloadm:exec\n" -cass %ROM%</command>
<platform>coco</platform>
<theme>coco</theme>
</system>
@ -387,6 +411,7 @@
<command label="Gearcoleco">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/gearcoleco_libretro.so %ROM%</command>
<!-- <command label="openMSX (Standalone)">%EMULATOR_OPENMSX% -machine ColecoVision_SGM %INJECT%=%BASENAME%.commands -cart %ROM%</command> -->
<!-- <command label="ares (Standalone)">%EMULATOR_ARES% &ndash;&ndash;fullscreen &ndash;&ndash;system "ColecoVision" %ROM%</command> -->
<!-- <command label="ColEm (Standalone)">%EMULATOR_COLEM% %INJECT%=%BASENAME%.commands -cv %ROM%</command> -->
<platform>colecovision</platform>
<theme>colecovision</theme>
</system>
@ -1205,7 +1230,8 @@
<command label="Citra">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra_libretro.so %ROM%</command>
<command label="Citra 2018">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra2018_libretro.so %ROM%</command>
<command label="Citra (via Ponzu)">%EMULATOR_CITRA% %ROM%</command>
<!-- <command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command> -->
<!--<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>-->
<!--<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>-->
<platform>n3ds</platform>
<theme>n3ds</theme>
</system>
@ -1400,6 +1426,7 @@
<fullname>Tangerine Computer Systems Oric</fullname>
<path>%ROMPATH%/oric</path>
<extension>.dsk .DSK .ort .ORT .tap .TAP .wav .WAV</extension>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/oric oric1 -autoboot_delay "4" -autoboot_command "cload\"\"\n" -cass %ROM%</command>
<command label="Oricutron (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_ORICUTRON% %ROM%</command>
<platform>oric</platform>
<theme>oric</theme>
@ -2149,7 +2176,7 @@
<name>wiiu</name>
<fullname>Nintendo Wii U</fullname>
<path>%ROMPATH%/wiiu</path>
<extension>.rpx .RPX .wua .WUA .wud .WUD .wux .WUX</extension>
<extension>.elf .ELF .rpx .RPX .tmd .TMD .wua .WUA .wud .WUD .wuhb .WUHB .wux .WUX</extension>
<command label="Cemu (Standalone)">%EMULATOR_CEMU% -g %ROM%</command>
<platform>wiiu</platform>
<theme>wiiu</theme>
@ -2234,7 +2261,9 @@
<path>%ROMPATH%/x68000</path>
<extension>.2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dim .DIM .dup .DUP .hdf .HDF .hdm .HDM .img .IMG .m3u .M3U .xdf .XDF .7z .7Z .zip .ZIP</extension>
<command label="PX68k">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/px68k_libretro.so %ROM%</command>
<command label="MAME (Standalone)">%EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/x68000 x68000 -flop1 %ROM%</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -inipath /var/config/mame/ini -rompath %GAMEDIR%\;%ROMPATH%/x68000 x68000 -flop1 %ROM%</command>
<!-- <command label="XM6 Pro-68k (Wine)">%STARTDIR%=%GAMEDIR% %PRECOMMAND_WINE% %EMULATOR_XM6PRO68K-WINDOWS% "%FILENAME%"</command> -->
<!-- <command label="XM6 Pro-68k (Proton)">%STARTDIR%=%GAMEDIR% %PRECOMMAND_PROTON% %EMULATOR_XM6PRO68K-WINDOWS% "%FILENAME%"</command> -->
<platform>x68000</platform>
<theme>x68000</theme>
</system>
@ -2266,6 +2295,7 @@
<fullname>Infocom Z-machine</fullname>
<path>%ROMPATH%/zmachine</path>
<extension>.dat .DAT .z1 .Z1 .z2 .Z2 .z3 .Z3 .z4 .Z4 .z5 .Z5 .z6 .Z6 .z7 .Z7 .z8 .Z8 .zlb .ZLB .zblorb .ZBLORB</extension>
<command label="MojoZork">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mojozork_libretro.so %ROM%</command>
<command label="Gargoyle (Standalone)">%EMULATOR_GARGOYLE% %ROM%</command>
<platform>zmachine</platform>
<theme>zmachine</theme>

View file

@ -21,6 +21,12 @@
<entry>/Applications/RetroArch.app/Contents/Resources/cores</entry>
</rule>
</core>
<emulator name="ACE-DL">
<!-- Amstrad CPC emulator ACE-DL -->
<rule type="staticpath">
<entry>/Applications/AceDL.app/Contents/MacOS/AceDL</entry>
</rule>
</emulator>
<emulator name="AETHERSX2">
<!-- Sony PlayStation 2 emulator AetherSX2 -->
<rule type="staticpath">
@ -160,6 +166,13 @@
<entry>hypseus.bin</entry>
</rule>
</emulator>
<emulator name="LIME3DS">
<!-- Nintendo 3DS emulator Lime3DS -->
<rule type="staticpath">
<entry>/Applications/lime3ds-gui.app/Contents/MacOS/lime3ds-gui</entry>
<entry>/Applications/lime-qt.app/Contents/MacOS/lime-qt</entry>
</rule>
</emulator>
<emulator name="MAME">
<!-- Arcade emulator MAME -->
<rule type="staticpath">

View file

@ -87,6 +87,7 @@
<command label="Caprice32">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/cap32_libretro.dylib %ROM%</command>
<command label="CrocoDS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/crocods_libretro.dylib %ROM%</command>
<command label="CPCemu (Standalone)">%STARTDIR%="~/Library/Application Support/CPCemu" %EMULATOR_CPCEMU% %ROM%</command>
<command label="ACE-DL (Standalone)">%EMULATOR_ACE-DL% %INJECT%=%BASENAME%.commands %ROM%</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/amstradcpc cpc6128 -flop1 %ROM%</command>
<platform>amstradcpc</platform>
<theme>amstradcpc</theme>
@ -100,14 +101,32 @@
<platform>android</platform>
<theme>android</theme>
</system>
<system>
<name>androidapps</name>
<fullname>Android Apps</fullname>
<path>%ROMPATH%/androidapps</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidapps</theme>
</system>
<system>
<name>androidgames</name>
<fullname>Android Games</fullname>
<path>%ROMPATH%/androidgames</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidgames</theme>
</system>
<system>
<name>apple2</name>
<fullname>Apple II</fullname>
<path>%ROMPATH%/apple2</path>
<extension>.do .DO .dsk .DSK .nib .NIB .po .PO</extension>
<command label="Mednafen (Standalone)">%EMULATOR_MEDNAFEN% -force_module apple2 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.dylib "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -flop1 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.dylib "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -gameio joy -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -gameio joy -flop1 %ROM%</command>
<platform>apple2</platform>
<theme>apple2</theme>
</system>
@ -116,8 +135,8 @@
<fullname>Apple IIGS</fullname>
<path>%ROMPATH%/apple2gs</path>
<extension>.2mg .2MG .7z .7z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.dylib "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -flop3 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.dylib "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -gameio joy -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -gameio joy -flop3 %ROM%</command>
<platform>apple2gs</platform>
<theme>apple2gs</theme>
</system>
@ -271,7 +290,7 @@
<name>atarixe</name>
<fullname>Atari XE</fullname>
<path>%ROMPATH%/atarixe</path>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<command label="Atari800">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.dylib %ROM%</command>
<command label="Atari800 (Standalone)">%EMULATOR_ATARI800% %ROM%</command>
<platform>atarixe</platform>
@ -293,7 +312,7 @@
<fullname>Acorn Computers BBC Micro</fullname>
<path>%ROMPATH%/bbcmicro</path>
<extension>.dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP</extension>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -flop1 %ROM%</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -analogue acornjoy -flop1 %ROM%</command>
<platform>bbcmicro</platform>
<theme>bbcmicro</theme>
</system>
@ -326,7 +345,7 @@
<name>cdtv</name>
<fullname>Commodore CDTV</fullname>
<path>%ROMPATH%/cdtv</path>
<extension>.ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .7z .7Z .zip .ZIP</extension>
<extension>.adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP</extension>
<command label="PUAE">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.dylib %ROM%</command>
<command label="PUAE 2021">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.dylib %ROM%</command>
<command label="FS-UAE (Standalone)">%EMULATOR_FS-UAE% --config:amiga-model=CDTV %ROM%</command>
@ -361,6 +380,8 @@
<extension>.cas .CAS .ccc .CCC .dsk .DSK .rom .ROM</extension>
<command label="XRoar CoCo 2 NTSC (Standalone)">%EMULATOR_XROAR% -fs -default-machine coco2bus %ROM%</command>
<command label="XRoar CoCo 2 PAL (Standalone)">%EMULATOR_XROAR% -fs -default-machine coco2b %ROM%</command>
<command label="MAME [Cartridge] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/coco coco -cart %ROM%</command>
<command label="MAME [Tape] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/coco coco -autoboot_delay "2" -autoboot_command "cloadm:exec\n" -cass %ROM%</command>
<platform>coco</platform>
<theme>coco</theme>
</system>
@ -1142,6 +1163,7 @@
<path>%ROMPATH%/n3ds</path>
<extension>.3ds .3DS .3dsx .3DSX .app .APP .axf .AXF .cci .CCI .cxi .CXI .elf .ELF .7z .7Z .zip .ZIP</extension>
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ROM%</command>
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>
<platform>n3ds</platform>
<theme>n3ds</theme>
@ -1324,6 +1346,7 @@
<fullname>Tangerine Computer Systems Oric</fullname>
<path>%ROMPATH%/oric</path>
<extension>.dsk .DSK .ort .ORT .tap .TAP .wav .WAV</extension>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/oric oric1 -autoboot_delay "4" -autoboot_command "cload\"\"\n" -cass %ROM%</command>
<command label="Oricutron (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_ORICUTRON% %ROM%</command>
<platform>oric</platform>
<theme>oric</theme>
@ -2025,7 +2048,7 @@
<name>wiiu</name>
<fullname>Nintendo Wii U</fullname>
<path>%ROMPATH%/wiiu</path>
<extension>.rpx .RPX .wua .WUA .wud .WUD .wux .WUX</extension>
<extension>.elf .ELF .rpx .RPX .tmd .TMD .wua .WUA .wud .WUD .wuhb .WUHB .wux .WUX</extension>
<command label="Cemu (Standalone)">%EMULATOR_CEMU% -g %ROM%</command>
<platform>wiiu</platform>
<theme>wiiu</theme>
@ -2131,6 +2154,7 @@
<fullname>Infocom Z-machine</fullname>
<path>%ROMPATH%/zmachine</path>
<extension>.dat .DAT .z1 .Z1 .z2 .Z2 .z3 .Z3 .z4 .Z4 .z5 .Z5 .z6 .Z6 .z7 .Z7 .z8 .Z8 .zlb .ZLB .zblorb .ZBLORB</extension>
<command label="MojoZork">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mojozork_libretro.dylib %ROM%</command>
<command label="Gargoyle (Standalone)">%EMULATOR_GARGOYLE% %ROM%</command>
<platform>zmachine</platform>
<theme>zmachine</theme>

View file

@ -251,6 +251,12 @@
<entry>~/bin/lightspark/lightspark</entry>
</rule>
</emulator>
<emulator name="LIME3DS">
<!-- Nintendo 3DS emulator Lime3DS -->
<rule type="systempath">
<entry>lime3ds-gui</entry>
</rule>
</emulator>
<emulator name="LINAPPLE">
<!-- Apple II emulator LinApple -->
<rule type="systempath">

View file

@ -100,6 +100,24 @@
<platform>android</platform>
<theme>android</theme>
</system>
<system>
<name>androidapps</name>
<fullname>Android Apps</fullname>
<path>%ROMPATH%/androidapps</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidapps</theme>
</system>
<system>
<name>androidgames</name>
<fullname>Android Games</fullname>
<path>%ROMPATH%/androidgames</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidgames</theme>
</system>
<system>
<name>apple2</name>
<fullname>Apple II</fullname>
@ -107,8 +125,8 @@
<extension>.do .DO .dsk .DSK .nib .NIB .po .PO</extension>
<command label="LinApple (Standalone)">%EMULATOR_LINAPPLE% -f -b --d1 %ROM%</command>
<command label="Mednafen (Standalone)">%EMULATOR_MEDNAFEN% -force_module apple2 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -flop1 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2\" -gameio joy -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2 apple2e -gameio joy -flop1 %ROM%</command>
<platform>apple2</platform>
<theme>apple2</theme>
</system>
@ -117,8 +135,8 @@
<fullname>Apple IIGS</fullname>
<path>%ROMPATH%/apple2gs</path>
<extension>.2mg .2MG .7z .7z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -flop3 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mame_libretro.so "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%/apple2gs\" -gameio joy -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/apple2gs apple2gs -gameio joy -flop3 %ROM%</command>
<platform>apple2gs</platform>
<theme>apple2gs</theme>
</system>
@ -275,7 +293,7 @@
<name>atarixe</name>
<fullname>Atari XE</fullname>
<path>%ROMPATH%/atarixe</path>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<command label="Atari800">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/atari800_libretro.so %ROM%</command>
<command label="Atari800 (Standalone)">%EMULATOR_ATARI800% %ROM%</command>
<platform>atarixe</platform>
@ -297,7 +315,7 @@
<fullname>Acorn Computers BBC Micro</fullname>
<path>%ROMPATH%/bbcmicro</path>
<extension>.dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP</extension>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -flop1 %ROM%</command>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -analogue acornjoy -flop1 %ROM%</command>
<platform>bbcmicro</platform>
<theme>bbcmicro</theme>
</system>
@ -330,7 +348,7 @@
<name>cdtv</name>
<fullname>Commodore CDTV</fullname>
<path>%ROMPATH%/cdtv</path>
<extension>.ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .7z .7Z .zip .ZIP</extension>
<extension>.adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP</extension>
<command label="PUAE">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae_libretro.so %ROM%</command>
<command label="PUAE 2021">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/puae2021_libretro.so %ROM%</command>
<command label="FS-UAE (Standalone)">%EMULATOR_FS-UAE% --config:amiga-model=CDTV %ROM%</command>
@ -365,6 +383,8 @@
<extension>.cas .CAS .ccc .CCC .dsk .DSK .rom .ROM</extension>
<command label="XRoar CoCo 2 NTSC (Standalone)">%EMULATOR_XROAR% -fs -default-machine coco2bus %ROM%</command>
<command label="XRoar CoCo 2 PAL (Standalone)">%EMULATOR_XROAR% -fs -default-machine coco2b %ROM%</command>
<command label="MAME [Cartridge] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/coco coco -cart %ROM%</command>
<command label="MAME [Tape] (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/coco coco -autoboot_delay "2" -autoboot_command "cloadm:exec\n" -cass %ROM%</command>
<platform>coco</platform>
<theme>coco</theme>
</system>
@ -1177,6 +1197,7 @@
<command label="Citra">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra_libretro.so %ROM%</command>
<command label="Citra 2018">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra2018_libretro.so %ROM%</command>
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ROM%</command>
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>
<platform>n3ds</platform>
<theme>n3ds</theme>
@ -1368,6 +1389,7 @@
<fullname>Tangerine Computer Systems Oric</fullname>
<path>%ROMPATH%/oric</path>
<extension>.dsk .DSK .ort .ORT .tap .TAP .wav .WAV</extension>
<command label="MAME (Standalone)">%STARTDIR%=~/.mame %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%/oric oric1 -autoboot_delay "4" -autoboot_command "cload\"\"\n" -cass %ROM%</command>
<command label="Oricutron (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_ORICUTRON% %ROM%</command>
<platform>oric</platform>
<theme>oric</theme>
@ -2097,7 +2119,7 @@
<name>wiiu</name>
<fullname>Nintendo Wii U</fullname>
<path>%ROMPATH%/wiiu</path>
<extension>.rpx .RPX .wua .WUA .wud .WUD .wux .WUX</extension>
<extension>.elf .ELF .rpx .RPX .tmd .TMD .wua .WUA .wud .WUD .wuhb .WUHB .wux .WUX</extension>
<command label="Cemu (Standalone)">%EMULATOR_CEMU% -g %ROM%</command>
<platform>wiiu</platform>
<theme>wiiu</theme>
@ -2203,6 +2225,7 @@
<fullname>Infocom Z-machine</fullname>
<path>%ROMPATH%/zmachine</path>
<extension>.dat .DAT .z1 .Z1 .z2 .Z2 .z3 .Z3 .z4 .Z4 .z5 .Z5 .z6 .Z6 .z7 .Z7 .z8 .Z8 .zlb .ZLB .zblorb .ZBLORB</extension>
<command label="MojoZork">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/mojozork_libretro.so %ROM%</command>
<command label="Gargoyle (Standalone)">%EMULATOR_GARGOYLE% %ROM%</command>
<platform>zmachine</platform>
<theme>zmachine</theme>

View file

@ -52,6 +52,16 @@
<entry>%ESPATH%\..\Emulators\3dSen\3dSen.exe</entry>
</rule>
</emulator>
<emulator name="ACE-DL">
<!-- Amstrad CPC emulator ACE-DL -->
<rule type="systempath">
<entry>AceDL.exe</entry>
</rule>
<rule type="staticpath">
<entry>%ESPATH%\Emulators\AceDL\AceDL.exe</entry>
<entry>%ESPATH%\..\Emulators\AceDL\AceDL.exe</entry>
</rule>
</emulator>
<emulator name="ADVANCEMAME">
<!-- Arcade emulator AdvanceMAME -->
<rule type="systempath">
@ -169,6 +179,16 @@
<entry>%ESPATH%\..\Emulators\Citra\canary-mingw\citra-qt.exe</entry>
</rule>
</emulator>
<emulator name="COLEM">
<!-- Coleco ColecoVision and Adam emulator ColEm -->
<rule type="systempath">
<entry>ColEm.exe</entry>
</rule>
<rule type="staticpath">
<entry>%ESPATH%\Emulators\ColEm\ColEm.exe</entry>
<entry>%ESPATH%\..\Emulators\ColEm\ColEm.exe</entry>
</rule>
</emulator>
<emulator name="CPCEMU">
<!-- Amstrad CPC emulator CPCemu -->
<rule type="winregistryvalue">
@ -402,6 +422,19 @@
<entry>%ESPATH%\..\Emulators\KEmulator\KEmulator.exe</entry>
</rule>
</emulator>
<emulator name="LIME3DS">
<!-- Nintendo 3DS emulator Lime3DS -->
<rule type="systempath">
<entry>lime3ds-gui.exe</entry>
<entry>lime-qt.exe</entry>
</rule>
<rule type="staticpath">
<entry>%ESPATH%\Emulators\lime3ds\lime3ds-gui.exe</entry>
<entry>%ESPATH%\..\Emulators\lime3ds\lime3ds-gui.exe</entry>
<entry>%ESPATH%\Emulators\lime-qt\lime-qt.exe</entry>
<entry>%ESPATH%\..\Emulators\lime-qt\lime-qt.exe</entry>
</rule>
</emulator>
<emulator name="M2EMULATOR">
<!-- Sega Model 2 Emulator -->
<rule type="systempath">
@ -919,6 +952,16 @@
<entry>%ESPATH%\..\Emulators\Vita3K\Vita3K.exe</entry>
</rule>
</emulator>
<emulator name="WINARCADIA">
<!-- Emerson Arcadia 2001 emulator WinArcadia -->
<rule type="systempath">
<entry>WinArcadia.exe</entry>
</rule>
<rule type="staticpath">
<entry>%ESPATH%\Emulators\WinArcadia\WinArcadia.exe</entry>
<entry>%ESPATH%\..\Emulators\WinArcadia\WinArcadia.exe</entry>
</rule>
</emulator>
<emulator name="XEMU">
<!-- Microsoft Xbox emulator xemu -->
<rule type="systempath">
@ -942,6 +985,16 @@
<entry>%ESPATH%\..\Emulators\xenia_canary\xenia_canary.exe</entry>
</rule>
</emulator>
<emulator name="XM6PRO68K">
<!-- Sharp X68000 emulator XM6 Pro-68k -->
<rule type="systempath">
<entry>XM6.exe</entry>
</rule>
<rule type="staticpath">
<entry>%ESPATH%\Emulators\XM6 Pro-68k\XM6.exe</entry>
<entry>%ESPATH%\..\Emulators\XM6 Pro-68k\XM6.exe</entry>
</rule>
</emulator>
<emulator name="XROAR">
<!-- Dragon and Tandy 8-bit computer emulator XRoar -->
<rule type="systempath">

View file

@ -28,6 +28,13 @@
<entry>%ESPATH%\..\Emulators\3dSen\3dSen.exe</entry>
</rule>
</emulator>
<emulator name="ACE-DL">
<!-- Amstrad CPC emulator ACE-DL -->
<rule type="staticpath">
<entry>%ESPATH%\Emulators\AceDL\AceDL.exe</entry>
<entry>%ESPATH%\..\Emulators\AceDL\AceDL.exe</entry>
</rule>
</emulator>
<emulator name="ADVANCEMAME">
<!-- Arcade emulator AdvanceMAME -->
<rule type="staticpath">
@ -109,6 +116,13 @@
<entry>%ESPATH%\..\Emulators\Citra\canary-mingw\citra-qt.exe</entry>
</rule>
</emulator>
<emulator name="COLEM">
<!-- Coleco ColecoVision and Adam emulator ColEm -->
<rule type="staticpath">
<entry>%ESPATH%\Emulators\ColEm\ColEm.exe</entry>
<entry>%ESPATH%\..\Emulators\ColEm\ColEm.exe</entry>
</rule>
</emulator>
<emulator name="CPCEMU">
<!-- Amstrad CPC emulator CPCemu -->
<rule type="staticpath">
@ -267,6 +281,15 @@
<entry>%ESPATH%\..\Emulators\KEmulator\KEmulator.exe</entry>
</rule>
</emulator>
<emulator name="LIME3DS">
<!-- Nintendo 3DS emulator Lime3DS -->
<rule type="staticpath">
<entry>%ESPATH%\Emulators\lime3ds\lime3ds-gui.exe</entry>
<entry>%ESPATH%\..\Emulators\lime3ds\lime3ds-gui.exe</entry>
<entry>%ESPATH%\Emulators\lime-qt\lime-qt.exe</entry>
<entry>%ESPATH%\..\Emulators\lime-qt\lime-qt.exe</entry>
</rule>
</emulator>
<emulator name="M2EMULATOR">
<!-- Sega Model 2 Emulator -->
<rule type="staticpath">
@ -614,6 +637,13 @@
<entry>%ESPATH%\..\Emulators\Vita3K\Vita3K.exe</entry>
</rule>
</emulator>
<emulator name="WINARCADIA">
<!-- Emerson Arcadia 2001 emulator WinArcadia -->
<rule type="staticpath">
<entry>%ESPATH%\Emulators\WinArcadia\WinArcadia.exe</entry>
<entry>%ESPATH%\..\Emulators\WinArcadia\WinArcadia.exe</entry>
</rule>
</emulator>
<emulator name="XEMU">
<!-- Microsoft Xbox emulator xemu -->
<rule type="staticpath">
@ -630,6 +660,13 @@
<entry>%ESPATH%\..\Emulators\xenia_canary\xenia_canary.exe</entry>
</rule>
</emulator>
<emulator name="XM6PRO68K">
<!-- Sharp X68000 emulator XM6 Pro-68k -->
<rule type="staticpath">
<entry>%ESPATH%\Emulators\XM6 Pro-68k\XM6.exe</entry>
<entry>%ESPATH%\..\Emulators\XM6 Pro-68k\XM6.exe</entry>
</rule>
</emulator>
<emulator name="XROAR">
<!-- Dragon and Tandy 8-bit computer emulator XRoar -->
<rule type="staticpath">

View file

@ -19,6 +19,7 @@
<command label="MAME [Tape] (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\adam adam -cass1 %ROM%</command>
<command label="MAME [Cartridge] (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\adam adam -cart1 %ROM%</command>
<command label="MAME [Software list] (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\adam adam %BASENAME%</command>
<command label="ColEm (Standalone)">%EMULATOR_COLEM% %INJECT%=%BASENAME%.commands -adam %ROM%</command>
<platform>adam</platform>
<theme>adam</theme>
</system>
@ -83,6 +84,7 @@
<command label="Caprice32">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\cap32_libretro.dll %ROM%</command>
<command label="CrocoDS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\crocods_libretro.dll %ROM%</command>
<command label="CPCemu (Standalone)">%EMULATOR_CPCEMU% %ROM%</command>
<command label="ACE-DL (Standalone)">%EMULATOR_ACE-DL% %INJECT%=%BASENAME%.commands %ROM%</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\amstradcpc cpc6128 -flop1 %ROM%</command>
<platform>amstradcpc</platform>
<theme>amstradcpc</theme>
@ -96,6 +98,24 @@
<platform>android</platform>
<theme>android</theme>
</system>
<system>
<name>androidapps</name>
<fullname>Android Apps</fullname>
<path>%ROMPATH%\androidapps</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidapps</theme>
</system>
<system>
<name>androidgames</name>
<fullname>Android Games</fullname>
<path>%ROMPATH%\androidgames</path>
<extension>.7z .7Z .zip .ZIP</extension>
<command>PLACEHOLDER %ROM%</command>
<platform>android</platform>
<theme>androidgames</theme>
</system>
<system>
<name>apple2</name>
<fullname>Apple II</fullname>
@ -103,8 +123,8 @@
<extension>.do .DO .dsk .DSK .nib .NIB .po .PO</extension>
<command label="AppleWin (Standalone)">%EMULATOR_APPLEWIN% -f -d1 %ROM%</command>
<command label="Mednafen (Standalone)">%EMULATOR_MEDNAFEN% -force_module apple2 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mame_libretro.dll "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%\apple2\" -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\apple2 apple2e -flop1 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mame_libretro.dll "apple2e -rompath \"%GAMEDIRRAW%;%ROMPATH%\apple2\" -gameio joy -flop1 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\apple2 apple2e -gameio joy -flop1 %ROM%</command>
<platform>apple2</platform>
<theme>apple2</theme>
</system>
@ -113,8 +133,8 @@
<fullname>Apple IIGS</fullname>
<path>%ROMPATH%\apple2gs</path>
<extension>.2mg .2MG .7z .7z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mame_libretro.dll "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%\apple2gs\" -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\apple2gs apple2gs -flop3 %ROM%</command>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mame_libretro.dll "apple2gs -rompath \"%GAMEDIRRAW%;%ROMPATH%\apple2gs\" -gameio joy -flop3 \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\apple2gs apple2gs -gameio joy -flop3 %ROM%</command>
<platform>apple2gs</platform>
<theme>apple2gs</theme>
</system>
@ -151,6 +171,7 @@
<extension>.bin .BIN .7z .7Z .zip .ZIP</extension>
<command label="MAME - Current">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mame_libretro.dll "arcadia -rompath \"%GAMEDIRRAW%;%ROMPATH%\arcadia\" -cart \"%ROMRAW%\""</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\arcadia arcadia -cart %ROM%</command>
<command label="WinArcadia (Standalone)">%EMULATOR_WINARCADIA% %ROM%</command>
<platform>arcadia</platform>
<theme>arcadia</theme>
</system>
@ -277,7 +298,7 @@
<name>atarixe</name>
<fullname>Atari XE</fullname>
<path>%ROMPATH%\atarixe</path>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<extension>.a52 .A52 .atr .ATR .atx .ATX .bin .BIN .car .CAR .cas .CAS .cdm .CDM .xex .XEX .xfd .XFD .7z .7Z .zip .ZIP</extension>
<command label="Atari800">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\atari800_libretro.dll %ROM%</command>
<command label="Atari800 (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_ATARI800% %ROM%</command>
<command label="Altirra (Standalone)">%EMULATOR_ALTIRRA% %INJECT%=%BASENAME%.commands %ROM%</command>
@ -301,7 +322,7 @@
<fullname>Acorn Computers BBC Micro</fullname>
<path>%ROMPATH%\bbcmicro</path>
<extension>.dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP</extension>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -flop1 %ROM%</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -analogue acornjoy -flop1 %ROM%</command>
<platform>bbcmicro</platform>
<theme>bbcmicro</theme>
</system>
@ -334,7 +355,7 @@
<name>cdtv</name>
<fullname>Commodore CDTV</fullname>
<path>%ROMPATH%\cdtv</path>
<extension>.ccd .CCD .chd .CHD .cue .CUE .iso .ISO .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .7z .7Z .zip .ZIP</extension>
<extension>.adf .ADF .adz .ADZ .ccd .CCD .chd .CHD .cue .CUE .dms .DMS .fdi .FDI .hdf .HDF .hdz .HDZ .ipf .IPF .iso .ISO .lha .LHA .m3u .M3U .mds .MDS .nrg .NRG .rp9 .RP9 .uae .UAE .7z .7Z .zip .ZIP</extension>
<command label="PUAE">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\puae_libretro.dll %ROM%</command>
<command label="PUAE 2021">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\puae2021_libretro.dll %ROM%</command>
<command label="FS-UAE (Standalone)">%EMULATOR_FS-UAE% --config:amiga-model=CDTV %ROM%</command>
@ -368,6 +389,8 @@
<extension>.cas .CAS .ccc .CCC .dsk .DSK .rom .ROM</extension>
<command label="XRoar CoCo 2 NTSC (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_XROAR% -fs -default-machine coco2bus %ROM%</command>
<command label="XRoar CoCo 2 PAL (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_XROAR% -fs -default-machine coco2b %ROM%</command>
<command label="MAME [Cartridge] (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\coco coco -cart %ROM%</command>
<command label="MAME [Tape] (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\coco coco -autoboot_delay "2" -autoboot_command "cloadm:exec\n" -cass %ROM%</command>
<platform>coco</platform>
<theme>coco</theme>
</system>
@ -380,6 +403,7 @@
<command label="Gearcoleco">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\gearcoleco_libretro.dll %ROM%</command>
<command label="openMSX (Standalone)">%EMULATOR_OPENMSX% -machine ColecoVision_SGM %INJECT%=%BASENAME%.commands -cart %ROM%</command>
<command label="ares (Standalone)">%EMULATOR_ARES% --fullscreen --system "ColecoVision" %ROM%</command>
<command label="ColEm (Standalone)">%EMULATOR_COLEM% %INJECT%=%BASENAME%.commands -cv %ROM%</command>
<platform>colecovision</platform>
<theme>colecovision</theme>
</system>
@ -1187,6 +1211,7 @@
<command label="Citra">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\citra_libretro.dll %ROM%</command>
<command label="Citra 2018">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\citra2018_libretro.dll %ROM%</command>
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ROM%</command>
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>
<platform>n3ds</platform>
<theme>n3ds</theme>
@ -1378,6 +1403,7 @@
<fullname>Tangerine Computer Systems Oric</fullname>
<path>%ROMPATH%\oric</path>
<extension>.dsk .DSK .ort .ORT .tap .TAP .wav .WAV</extension>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\oric oric1 -autoboot_delay "4" -autoboot_command "cload\"\"\n" -cass %ROM%</command>
<command label="Oricutron (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_ORICUTRON% %ROM%</command>
<platform>oric</platform>
<theme>oric</theme>
@ -2111,7 +2137,7 @@
<name>wiiu</name>
<fullname>Nintendo Wii U</fullname>
<path>%ROMPATH%\wiiu</path>
<extension>.rpx .RPX .wua .WUA .wud .WUD .wux .WUX</extension>
<extension>.elf .ELF .rpx .RPX .tmd .TMD .wua .WUA .wud .WUD .wuhb .WUHB .wux .WUX</extension>
<command label="Cemu (Standalone)">%EMULATOR_CEMU% -f -g %ROM%</command>
<platform>wiiu</platform>
<theme>wiiu</theme>
@ -2191,6 +2217,7 @@
<extension>.2hd .2HD .88d .88D .cmd .CMD .d88 .D88 .dim .DIM .dup .DUP .hdf .HDF .hdm .HDM .img .IMG .m3u .M3U .xdf .XDF .7z .7Z .zip .ZIP</extension>
<command label="PX68k">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\px68k_libretro.dll %ROM%</command>
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\x68000 x68000 -flop1 %ROM%</command>
<command label="XM6 Pro-68k (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_XM6PRO68K% %ROM%</command>
<platform>x68000</platform>
<theme>x68000</theme>
</system>
@ -2218,6 +2245,7 @@
<fullname>Infocom Z-machine</fullname>
<path>%ROMPATH%\zmachine</path>
<extension>.dat .DAT .z1 .Z1 .z2 .Z2 .z3 .Z3 .z4 .Z4 .z5 .Z5 .z6 .Z6 .z7 .Z7 .z8 .Z8 .zlb .ZLB .zblorb .ZBLORB</extension>
<command label="MojoZork">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mojozork_libretro.dll %ROM%</command>
<command label="Gargoyle (Standalone)">%STARTDIR%=%EMUDIR% %EMULATOR_GARGOYLE% %ROM%</command>
<platform>zmachine</platform>
<theme>zmachine</theme>

View file

@ -70,6 +70,8 @@
<systemToGamelist>slide</systemToGamelist>
<gamelistToGamelist>instant</gamelistToGamelist>
<gamelistToSystem>slide</gamelistToSystem>
<startupToSystem>slide</startupToSystem>
<startupToGamelist>slide</startupToGamelist>
</transitions>
<transitions name="instant">
@ -86,7 +88,7 @@
<transitions name="fade">
<label>fade</label>
<selectable>true</selectable>
<systemToSystem>fade</systemToSystem>
<systemToSystem>instant</systemToSystem>
<systemToGamelist>fade</systemToGamelist>
<gamelistToGamelist>fade</gamelistToGamelist>
<gamelistToSystem>fade</gamelistToSystem>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100%" height="100%" viewBox="0 0 168 62" version="1.1" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" xmlns="http://www.w3.org/2000/svg">
<path d="M 126.235 11.068 C 125.651 11.068 125.17 10.587 125.17 10.003 C 125.17 9.42 125.651 8.939 126.235 8.939 C 126.819 8.939 127.299 9.42 127.299 10.003 C 127.299 10.587 126.819 11.068 126.235 11.068 M 114.515 11.068 C 113.931 11.068 113.45 10.587 113.45 10.003 C 113.45 9.42 113.931 8.939 114.515 8.939 C 115.099 8.939 115.579 9.42 115.579 10.003 C 115.579 10.587 115.099 11.068 114.515 11.068 M 126.612 4.681 L 128.741 1.011 C 128.779 0.945 128.799 0.869 128.799 0.793 C 128.799 0.552 128.6 0.353 128.359 0.353 C 128.2 0.353 128.053 0.44 127.976 0.579 L 125.825 4.293 C 124.116 3.512 122.259 3.111 120.38 3.118 C 118.5 3.113 116.64 3.51 114.925 4.282 L 112.774 0.567 C 112.696 0.431 112.55 0.346 112.393 0.346 C 112.151 0.346 111.953 0.545 111.953 0.786 C 111.953 0.861 111.972 0.934 112.009 1 L 114.127 4.67 C 110.41 6.697 107.962 10.474 107.629 14.694 L 133.098 14.694 C 132.775 10.476 130.329 6.7 126.612 4.681" style="fill:white;fill-rule:nonzero;"/>
<path d="M 38.983 4.72 C 40.363 4.72 41.51 5.432 42.055 6.2 L 42.055 4.909 L 44.159 4.909 L 44.159 14.493 L 42.645 14.493 C 42.311 14.493 42.044 14.226 42.044 13.892 L 42.044 13.202 C 41.51 13.981 40.363 14.694 38.983 14.694 C 36.356 14.694 34.363 12.445 34.363 9.707 C 34.363 6.968 36.356 4.72 38.983 4.72 M 39.362 6.634 C 37.658 6.634 36.501 7.981 36.501 9.707 C 36.501 11.432 37.647 12.779 39.362 12.779 C 41.065 12.779 42.222 11.432 42.222 9.707 C 42.222 7.981 41.076 6.634 39.362 6.634" style="fill:white;fill-rule:nonzero;"/>
<path d="M 46.553 4.909 L 48.668 4.909 L 48.668 6.211 C 49.246 5.254 50.337 4.72 51.584 4.72 C 53.81 4.72 55.246 6.289 55.246 8.727 L 55.246 14.493 L 53.732 14.493 C 53.398 14.493 53.131 14.226 53.131 13.892 L 53.131 9.072 C 53.131 7.558 52.363 6.634 51.139 6.634 C 49.736 6.634 48.668 7.725 48.668 9.773 L 48.668 14.493 L 47.154 14.493 C 46.82 14.493 46.553 14.226 46.553 13.892 L 46.553 4.909 Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M 61.536 4.72 C 62.916 4.72 64.063 5.432 64.608 6.2 L 64.608 0.122 L 66.712 0.122 L 66.712 14.504 L 65.198 14.504 C 64.864 14.504 64.597 14.237 64.597 13.903 L 64.597 13.213 C 64.063 13.981 62.905 14.694 61.525 14.694 C 58.897 14.694 56.905 12.445 56.905 9.707 C 56.916 6.968 58.909 4.72 61.536 4.72 M 61.914 6.634 C 60.211 6.634 59.053 7.981 59.053 9.707 C 59.053 11.432 60.2 12.779 61.914 12.779 C 63.617 12.779 64.775 11.432 64.775 9.707 C 64.775 7.981 63.617 6.634 61.914 6.634" style="fill:white;fill-rule:nonzero;"/>
<path d="M 69.083 4.909 L 71.209 4.909 L 71.209 6.612 C 71.576 5.521 72.645 4.809 73.736 4.809 C 74.003 4.809 74.27 4.831 74.56 4.887 L 74.56 7.057 C 74.192 6.946 73.892 6.879 73.502 6.879 C 72.289 6.879 71.198 7.892 71.198 9.818 L 71.198 14.493 L 69.684 14.493 C 69.35 14.493 69.083 14.226 69.083 13.892 L 69.083 4.909 Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M 80.259 14.694 C 77.42 14.694 75.239 12.49 75.239 9.707 C 75.239 6.924 77.42 4.72 80.259 4.72 C 83.097 4.72 85.279 6.924 85.279 9.707 C 85.279 12.49 83.097 14.694 80.259 14.694 M 80.259 12.734 C 81.951 12.734 83.131 11.41 83.131 9.707 C 83.131 8.004 81.94 6.679 80.259 6.679 C 78.556 6.679 77.365 8.004 77.365 9.707 C 77.365 11.41 78.556 12.734 80.259 12.734" style="fill:white;fill-rule:nonzero;"/>
<path d="M 88.04 2.816 C 87.272 2.816 86.626 2.182 86.626 1.403 C 86.626 0.635 87.283 0 88.04 0 C 88.83 0 89.442 0.635 89.442 1.403 C 89.442 2.193 88.83 2.816 88.04 2.816 M 86.994 4.909 L 89.097 4.909 L 89.097 14.493 L 87.595 14.493 C 87.261 14.493 86.994 14.226 86.994 13.892 L 86.994 4.909 Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M 95.453 4.72 C 96.834 4.72 97.98 5.432 98.526 6.2 L 98.526 0.122 L 100.63 0.122 L 100.63 14.504 L 99.116 14.504 C 98.782 14.504 98.515 14.237 98.515 13.903 L 98.515 13.213 C 97.98 13.981 96.823 14.694 95.442 14.694 C 92.815 14.694 90.823 12.445 90.823 9.707 C 90.834 6.968 92.826 4.72 95.453 4.72 M 95.843 6.634 C 94.14 6.634 92.982 7.981 92.982 9.707 C 92.982 11.432 94.129 12.779 95.843 12.779 C 97.546 12.779 98.704 11.432 98.704 9.707 C 98.704 7.981 97.546 6.634 95.843 6.634" style="fill:white;fill-rule:nonzero;"/>
<path d="M 35.282 50.685 C 31.499 50.685 28.31 49.275 25.713 46.456 C 23.154 43.638 21.874 40.226 21.874 36.22 C 21.874 32.215 23.154 28.803 25.713 25.984 C 28.31 23.165 31.499 21.755 35.282 21.755 C 37.174 21.755 38.917 22.182 40.512 23.035 C 42.106 23.851 43.33 24.852 44.183 26.04 L 44.183 22.312 L 50.303 22.312 L 50.303 50.128 L 44.183 50.128 L 44.183 46.401 C 43.33 47.588 42.106 48.608 40.512 49.46 C 38.917 50.277 37.174 50.685 35.282 50.685 Z M 30.442 42.563 C 32 44.268 33.984 45.121 36.394 45.121 C 38.805 45.121 40.789 44.268 42.347 42.563 C 43.905 40.856 44.684 38.742 44.684 36.22 C 44.684 33.698 43.905 31.584 42.347 29.878 C 40.789 28.172 38.805 27.319 36.394 27.319 C 33.984 27.319 32 28.172 30.442 29.878 C 28.884 31.584 28.105 33.698 28.105 36.22 C 28.105 38.742 28.884 40.856 30.442 42.563 Z M 63.669 61.756 L 57.549 61.756 L 57.549 22.312 L 63.669 22.312 L 63.669 26.04 C 64.522 24.852 65.746 23.851 67.34 23.035 C 68.972 22.182 70.734 21.755 72.625 21.755 C 76.409 21.755 79.58 23.165 82.139 25.984 C 84.735 28.803 86.033 32.215 86.033 36.22 C 86.033 40.226 84.735 43.638 82.139 46.456 C 79.58 49.275 76.409 50.685 72.625 50.685 C 70.734 50.685 68.972 50.277 67.34 49.46 C 65.746 48.608 64.522 47.588 63.669 46.401 L 63.669 61.756 Z M 71.513 45.121 C 73.924 45.121 75.908 44.268 77.465 42.563 C 79.023 40.856 79.802 38.742 79.802 36.22 C 79.802 33.698 79.023 31.584 77.465 29.878 C 75.908 28.172 73.924 27.319 71.513 27.319 C 69.065 27.319 67.062 28.172 65.505 29.878 C 63.947 31.584 63.168 33.698 63.168 36.22 C 63.168 38.742 63.947 40.856 65.505 42.563 C 67.062 44.268 69.065 45.121 71.513 45.121 Z M 97.34 61.756 L 91.221 61.756 L 91.221 22.312 L 97.34 22.312 L 97.34 26.04 C 98.193 24.852 99.418 23.851 101.012 23.035 C 102.644 22.182 104.406 21.755 106.297 21.755 C 110.081 21.755 113.252 23.165 115.81 25.984 C 118.406 28.803 119.705 32.215 119.705 36.22 C 119.705 40.226 118.406 43.638 115.81 46.456 C 113.252 49.275 110.081 50.685 106.297 50.685 C 104.406 50.685 102.644 50.277 101.012 49.46 C 99.418 48.608 98.193 47.588 97.34 46.401 L 97.34 61.756 Z M 105.185 45.121 C 107.596 45.121 109.58 44.268 111.137 42.563 C 112.695 40.856 113.474 38.742 113.474 36.22 C 113.474 33.698 112.695 31.584 111.137 29.878 C 109.58 28.172 107.596 27.319 105.185 27.319 C 102.737 27.319 100.734 28.172 99.176 29.878 C 97.618 31.584 96.84 33.698 96.84 36.22 C 96.84 38.742 97.618 40.856 99.176 42.563 C 100.734 44.268 102.737 45.121 105.185 45.121 Z M 134.684 50.685 C 131.383 50.685 128.601 49.868 126.339 48.237 C 124.113 46.605 122.927 44.417 122.778 41.672 L 129.12 41.672 C 129.566 44.417 131.476 45.789 134.851 45.789 C 136.223 45.789 137.318 45.547 138.133 45.066 C 138.949 44.546 139.357 43.805 139.357 42.84 C 139.357 41.876 139.042 41.116 138.412 40.56 C 137.781 40.003 136.723 39.539 135.241 39.169 L 130.678 37.944 C 125.931 36.684 123.558 33.884 123.558 29.544 C 123.558 27.208 124.503 25.334 126.395 23.925 C 128.286 22.479 130.789 21.755 133.905 21.755 C 136.91 21.755 139.376 22.516 141.304 24.037 C 143.233 25.557 144.308 27.578 144.531 30.1 L 138.412 30.1 C 137.818 27.801 136.297 26.651 133.85 26.651 C 132.625 26.651 131.643 26.911 130.901 27.43 C 130.159 27.912 129.788 28.598 129.788 29.489 C 129.788 31.083 131.031 32.196 133.516 32.826 L 138.189 34.051 C 143.122 35.312 145.588 38.111 145.588 42.451 C 145.588 45.084 144.568 47.124 142.528 48.571 C 140.525 49.98 137.911 50.685 134.684 50.685 Z" style="fill:white;fill-rule:nonzero;"/>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="100%" height="100%" viewBox="0 0 168 62" version="1.1" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" xmlns="http://www.w3.org/2000/svg">
<path d="M 126.235 11.068 C 125.651 11.068 125.17 10.587 125.17 10.003 C 125.17 9.42 125.651 8.939 126.235 8.939 C 126.819 8.939 127.299 9.42 127.299 10.003 C 127.299 10.587 126.819 11.068 126.235 11.068 M 114.515 11.068 C 113.931 11.068 113.45 10.587 113.45 10.003 C 113.45 9.42 113.931 8.939 114.515 8.939 C 115.099 8.939 115.579 9.42 115.579 10.003 C 115.579 10.587 115.099 11.068 114.515 11.068 M 126.612 4.681 L 128.741 1.011 C 128.779 0.945 128.799 0.869 128.799 0.793 C 128.799 0.552 128.6 0.353 128.359 0.353 C 128.2 0.353 128.053 0.44 127.976 0.579 L 125.825 4.293 C 124.116 3.512 122.259 3.111 120.38 3.118 C 118.5 3.113 116.64 3.51 114.925 4.282 L 112.774 0.567 C 112.696 0.431 112.55 0.346 112.393 0.346 C 112.151 0.346 111.953 0.545 111.953 0.786 C 111.953 0.861 111.972 0.934 112.009 1 L 114.127 4.67 C 110.41 6.697 107.962 10.474 107.629 14.694 L 133.098 14.694 C 132.775 10.476 130.329 6.7 126.612 4.681" style="fill:white;fill-rule:nonzero;"/>
<path d="M 38.983 4.72 C 40.363 4.72 41.51 5.432 42.055 6.2 L 42.055 4.909 L 44.159 4.909 L 44.159 14.493 L 42.645 14.493 C 42.311 14.493 42.044 14.226 42.044 13.892 L 42.044 13.202 C 41.51 13.981 40.363 14.694 38.983 14.694 C 36.356 14.694 34.363 12.445 34.363 9.707 C 34.363 6.968 36.356 4.72 38.983 4.72 M 39.362 6.634 C 37.658 6.634 36.501 7.981 36.501 9.707 C 36.501 11.432 37.647 12.779 39.362 12.779 C 41.065 12.779 42.222 11.432 42.222 9.707 C 42.222 7.981 41.076 6.634 39.362 6.634" style="fill:white;fill-rule:nonzero;"/>
<path d="M 46.553 4.909 L 48.668 4.909 L 48.668 6.211 C 49.246 5.254 50.337 4.72 51.584 4.72 C 53.81 4.72 55.246 6.289 55.246 8.727 L 55.246 14.493 L 53.732 14.493 C 53.398 14.493 53.131 14.226 53.131 13.892 L 53.131 9.072 C 53.131 7.558 52.363 6.634 51.139 6.634 C 49.736 6.634 48.668 7.725 48.668 9.773 L 48.668 14.493 L 47.154 14.493 C 46.82 14.493 46.553 14.226 46.553 13.892 L 46.553 4.909 Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M 61.536 4.72 C 62.916 4.72 64.063 5.432 64.608 6.2 L 64.608 0.122 L 66.712 0.122 L 66.712 14.504 L 65.198 14.504 C 64.864 14.504 64.597 14.237 64.597 13.903 L 64.597 13.213 C 64.063 13.981 62.905 14.694 61.525 14.694 C 58.897 14.694 56.905 12.445 56.905 9.707 C 56.916 6.968 58.909 4.72 61.536 4.72 M 61.914 6.634 C 60.211 6.634 59.053 7.981 59.053 9.707 C 59.053 11.432 60.2 12.779 61.914 12.779 C 63.617 12.779 64.775 11.432 64.775 9.707 C 64.775 7.981 63.617 6.634 61.914 6.634" style="fill:white;fill-rule:nonzero;"/>
<path d="M 69.083 4.909 L 71.209 4.909 L 71.209 6.612 C 71.576 5.521 72.645 4.809 73.736 4.809 C 74.003 4.809 74.27 4.831 74.56 4.887 L 74.56 7.057 C 74.192 6.946 73.892 6.879 73.502 6.879 C 72.289 6.879 71.198 7.892 71.198 9.818 L 71.198 14.493 L 69.684 14.493 C 69.35 14.493 69.083 14.226 69.083 13.892 L 69.083 4.909 Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M 80.259 14.694 C 77.42 14.694 75.239 12.49 75.239 9.707 C 75.239 6.924 77.42 4.72 80.259 4.72 C 83.097 4.72 85.279 6.924 85.279 9.707 C 85.279 12.49 83.097 14.694 80.259 14.694 M 80.259 12.734 C 81.951 12.734 83.131 11.41 83.131 9.707 C 83.131 8.004 81.94 6.679 80.259 6.679 C 78.556 6.679 77.365 8.004 77.365 9.707 C 77.365 11.41 78.556 12.734 80.259 12.734" style="fill:white;fill-rule:nonzero;"/>
<path d="M 88.04 2.816 C 87.272 2.816 86.626 2.182 86.626 1.403 C 86.626 0.635 87.283 0 88.04 0 C 88.83 0 89.442 0.635 89.442 1.403 C 89.442 2.193 88.83 2.816 88.04 2.816 M 86.994 4.909 L 89.097 4.909 L 89.097 14.493 L 87.595 14.493 C 87.261 14.493 86.994 14.226 86.994 13.892 L 86.994 4.909 Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M 95.453 4.72 C 96.834 4.72 97.98 5.432 98.526 6.2 L 98.526 0.122 L 100.63 0.122 L 100.63 14.504 L 99.116 14.504 C 98.782 14.504 98.515 14.237 98.515 13.903 L 98.515 13.213 C 97.98 13.981 96.823 14.694 95.442 14.694 C 92.815 14.694 90.823 12.445 90.823 9.707 C 90.834 6.968 92.826 4.72 95.453 4.72 M 95.843 6.634 C 94.14 6.634 92.982 7.981 92.982 9.707 C 92.982 11.432 94.129 12.779 95.843 12.779 C 97.546 12.779 98.704 11.432 98.704 9.707 C 98.704 7.981 97.546 6.634 95.843 6.634" style="fill:white;fill-rule:nonzero;"/>
<path d="M 14.321 61.755 C 10.59 61.755 7.517 60.841 5.103 59.012 C 2.725 57.183 1.353 54.805 0.988 51.879 L 6.914 51.879 C 7.975 55.025 10.498 56.598 14.486 56.598 C 16.644 56.598 18.418 55.884 19.808 54.458 C 21.235 53.068 21.948 51.093 21.948 48.532 L 21.948 45.294 C 21.07 46.538 19.844 47.563 18.272 48.368 C 16.699 49.172 14.998 49.574 13.169 49.574 C 9.474 49.574 6.347 48.239 3.786 45.569 C 1.262 42.862 0 39.552 0 35.638 C 0 31.76 1.262 28.486 3.786 25.816 C 6.347 23.109 9.474 21.755 13.169 21.755 C 14.998 21.755 16.699 22.158 18.272 22.963 C 19.844 23.731 21.07 24.737 21.948 25.981 L 21.948 22.304 L 27.984 22.304 L 27.984 48.038 C 27.984 52.574 26.685 55.994 24.088 58.298 C 21.527 60.603 18.272 61.755 14.321 61.755 Z M 8.45 41.673 C 10.023 43.246 11.961 44.033 14.266 44.033 C 16.57 44.033 18.51 43.246 20.082 41.673 C 21.655 40.064 22.442 38.052 22.442 35.638 C 22.442 33.224 21.655 31.229 20.082 29.657 C 18.51 28.047 16.57 27.243 14.266 27.243 C 11.961 27.243 10.023 28.047 8.45 29.657 C 6.877 31.229 6.091 33.224 6.091 35.638 C 6.091 38.052 6.877 40.064 8.45 41.673 Z M 46.323 50.288 C 42.593 50.288 39.447 48.898 36.886 46.117 C 34.362 43.338 33.1 39.973 33.1 36.022 C 33.1 32.071 34.362 28.706 36.886 25.926 C 39.447 23.145 42.593 21.755 46.323 21.755 C 48.189 21.755 49.909 22.176 51.482 23.018 C 53.054 23.822 54.262 24.81 55.103 25.981 L 55.103 22.304 L 61.138 22.304 L 61.138 49.739 L 55.103 49.739 L 55.103 46.063 C 54.262 47.233 53.054 48.239 51.482 49.08 C 49.909 49.885 48.189 50.288 46.323 50.288 Z M 41.55 42.277 C 43.086 43.959 45.044 44.801 47.421 44.801 C 49.798 44.801 51.756 43.959 53.292 42.277 C 54.829 40.594 55.597 38.509 55.597 36.022 C 55.597 33.534 54.829 31.449 53.292 29.767 C 51.756 28.084 49.798 27.243 47.421 27.243 C 45.044 27.243 43.086 28.084 41.55 29.767 C 40.014 31.449 39.245 33.534 39.245 36.022 C 39.245 38.509 40.014 40.594 41.55 42.277 Z M 103.237 49.739 L 103.237 34.321 C 103.237 32.089 102.816 30.352 101.975 29.108 C 101.17 27.865 99.963 27.243 98.354 27.243 C 96.415 27.243 94.86 27.992 93.69 29.492 C 92.519 30.992 91.897 33.095 91.825 35.802 L 91.825 49.739 L 85.789 49.739 L 85.789 34.321 C 85.789 32.089 85.368 30.352 84.527 29.108 C 83.722 27.865 82.514 27.243 80.905 27.243 C 78.893 27.243 77.284 28.029 76.077 29.602 C 74.906 31.175 74.321 33.388 74.321 36.241 L 74.321 49.739 L 68.286 49.739 L 68.286 22.304 L 74.321 22.304 L 74.321 26.035 C 76.003 23.182 78.601 21.755 82.113 21.755 C 86.246 21.755 89.081 23.566 90.617 27.187 C 91.385 25.468 92.556 24.133 94.129 23.182 C 95.738 22.231 97.494 21.755 99.397 21.755 C 102.469 21.755 104.883 22.798 106.64 24.883 C 108.395 26.968 109.273 29.785 109.273 33.333 L 109.273 49.739 L 103.237 49.739 Z M 128.107 50.288 C 124.01 50.288 120.644 48.953 118.011 46.282 C 115.377 43.575 114.06 40.155 114.06 36.022 C 114.06 31.888 115.359 28.486 117.956 25.816 C 120.553 23.109 123.956 21.755 128.162 21.755 C 132.405 21.755 135.826 23.237 138.422 26.2 C 141.02 29.126 142.172 32.894 141.879 37.503 L 120.041 37.503 C 120.114 39.624 120.919 41.399 122.455 42.825 C 123.992 44.252 125.949 44.965 128.327 44.965 C 131.692 44.965 133.997 43.685 135.24 41.125 L 141.55 41.125 C 140.709 43.795 139.1 45.99 136.722 47.709 C 134.344 49.429 131.472 50.288 128.107 50.288 Z M 127.998 26.804 C 126.022 26.804 124.321 27.371 122.895 28.504 C 121.505 29.602 120.608 31.175 120.206 33.224 L 135.405 33.224 C 134.965 31.102 134.069 29.511 132.716 28.45 C 131.363 27.352 129.789 26.804 127.998 26.804 Z M 156.708 50.288 C 153.452 50.288 150.709 49.483 148.477 47.874 C 146.282 46.264 145.112 44.106 144.965 41.399 L 151.221 41.399 C 151.66 44.106 153.544 45.459 156.872 45.459 C 158.226 45.459 159.305 45.221 160.109 44.746 C 160.914 44.233 161.317 43.503 161.317 42.551 C 161.317 41.6 161.006 40.85 160.384 40.302 C 159.762 39.753 158.719 39.295 157.257 38.93 L 152.757 37.722 C 148.075 36.479 145.734 33.717 145.734 29.438 C 145.734 27.133 146.667 25.285 148.533 23.895 C 150.398 22.469 152.867 21.755 155.94 21.755 C 158.903 21.755 161.335 22.505 163.237 24.005 C 165.139 25.505 166.2 27.498 166.42 29.986 L 160.384 29.986 C 159.799 27.718 158.299 26.584 155.885 26.584 C 154.677 26.584 153.709 26.84 152.977 27.352 C 152.245 27.828 151.879 28.504 151.879 29.382 C 151.879 30.955 153.105 32.052 155.556 32.675 L 160.165 33.882 C 165.03 35.126 167.463 37.887 167.463 42.167 C 167.463 44.764 166.456 46.776 164.444 48.203 C 162.469 49.593 159.891 50.288 156.708 50.288 Z" style="fill:white;fill-rule:nonzero;"/>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show more