Customize ES Systems

EmulationStation displays systems based on a file called es_systems.cfg, located at /usr/share/emulationstation. In the past, you had to edit this file and use the command batocera-save-overlay. This had issues when updating as all overlays have to be removed, meaning you'd have to redo these steps every update.

Batocera FIXME introduced the ability to copy the file to /userdata/system/configs/emulationstation/es_system.cfg and edit it there, however this meant you would have to compare and copy the file every update, as well as appending your changes and working out if something had broken (as Batocera adds new systems nearly every major release and changes the launch methods for other systems too).

Batocera FIXME and higher now treats extra /userdata/system/configs/emulationstation/es_systems_<custom_name>.cfg as overlays to the original /usr/share/emulationstation/es_systems.cfg file. This has the benefit of only requiring you to maintain the list of your personally added system entries/changes to particular attributes, as opposed to needing to scour through the entire document every update.

If you upgrade from a previous Batocera version to v31 or higher, you need to update your es_systems*.cfg files to reflect the change of Python version. As you can see below, starting with Batocera v31, the location for the emulator launcher is /usr/lib/python3.9/site-packages/configgen/emulatorlauncher.py and not /usr/lib/python2.7/site-packages/configgen/emulatorlauncher.py as it used to be in previous versions. There is no Python 2.7 on Batocera v31 or higher.

You can create a file named es_systems_<custom_name>.cfg where <custom_name> is a name you wish to use for it. This file needs to follow the same conventions as the original es_systems.cfg, but does not need to include the entirety of the file. For example:

es_systems_3do.cfg
<?xml version="1.0"?>
<systemList>
  <!-- This line is a comment, not necessary for the system. These will explain things, and can be safely removed. -->
  <system>
        <!-- The full name of the system, the one that will appear in menus and such. -->
        <fullname>3DO Interactive Multiplayer</fullname>
        <!-- The short name, the one used for the path to the system's ROMs and other internal uses. -->
        <name>3do</name>
        <!-- Metadata. The company/companies that made the system, also known as "Brand". Metadata tags like this aren't truly necessary, but can make organization easier. -->
        <manufacturer>Panasonic - Sanyo - Goldstar</manufacturer>
        <!-- Metadata. Release date. -->
        <release>1993</release>
        <!-- The type of hardware. Batocera doesn't particularly use this for anything, but it might be useful to specify here for future changes. -->
        <hardware>console</hardware>
        <!-- Extremely important, the path to look for this system's ROMs in. This should always start with /userdata/roms/. -->
        <path>/userdata/roms/3do</path>
        <!-- The file extensions of ROMs that should be scanned into ES's gamelist.xml when the user rescans their gamelist. Delimited by whitespaces. You must include the period mark (.) and proper capitalization. -->
        <extension>.iso .chd .cue</extension>
        <!-- Ordinarily this is the command line used to directly run the program, but Batocera relies on config generators to do so. This simply calls that generator, along with some other information. -->
        <command>python /usr/lib/python3.9/site-packages/configgen/emulatorlauncher.py %CONTROLLERSCONFIG% -system %SYSTEM% -rom %ROM%</command>
        <!-- The platform to use when scraping for metadata for this system's games. The full list of available platforms are in https://github.com/batocera-linux/batocera-emulationstation/blob/master/es-app/src/PlatformId.cpp -->
        <platform>3do</platform>
        <!-- The theme to load from the current theme-set, if supported. Usually, this is identical to the shortname. Check your theme's readme for more info. -->
        <theme>3do</theme>
        <emulators>
        <!-- These are the emulators used for the system. This is handled entirely by Batocera, and is not necessary for a custom es systems, but is shown here for reference. -->
            <emulator name="libretro">
                <cores>
                    <core default="true">opera</core>
                </cores>
            </emulator>
        </emulators>
  </system>
</systemList>

would only affect the 3DO system on your Batocera, with the rest of the systems still referring to /usr/share/emulationstation/es_systems.cfg for their system CFG. When both files contain the same systems, es_systems_<custom_name>.cfg will take priority.

In case you'd like to have complete control over ES systems CFG, you can still use the two previous methods to completely override it (ie. using overlays or copying the entirety of es_systems.cfg to /userdata/system/configs/emulationstation/es_systems.cfg without appending a custom system name to its filename).

Batocera is smart enough to only apply the changes you make. Such as, if the only thing you need to change for a system is its ROM path, you can use the following in your /userdata/system/configs/emulationstation/es_systems_pico8.cfg:

es_systems_pico8.cfg
<?xml version="1.0" encoding="UTF-8"?>
<systemList>
  <system>
        <name>pico8</name>        
        <path>/userdata/roms/pico8real</path>
  </system>
</systemList>

Here, it'll use the folder /userdata/roms/pico8real/ to look for Pico-8 games instead of the regular one.

  • emulationstation/customize_systems.txt
  • Last modified: 11 days ago
  • by atari