chore: merge the launcher search paths

This commit is contained in:
Abdessamad Derraz committed 2026-11-10 13:12:22 +01:00
commit c69b31cfc0
23 files changed
+2373 -161

No files matched your search

+32
View File
@@ -52,6 +52,9 @@ systems:
- atari-system1
- efo-cedar-magnet
standalone_pools:
dir_rom: ""
notes: |
MAME 0.106 core (src/version.c:11) carrying its own video layer and driver
backports from later MAME releases. Twenty-nine BIOS root sets, each a
@@ -156,6 +159,7 @@ files:
# SNK Neo Geo MVS
- name: neogeo.zip
path: "neogeo.zip"
required: true
category: bios_zip
system: snk-neogeo-mvs
@@ -223,6 +227,7 @@ files:
# IGS PGM
- name: pgm.zip
path: "pgm.zip"
required: true
category: bios_zip
system: igs-pgm
@@ -246,6 +251,7 @@ files:
# Sega ST-V
- name: stvbios.zip
path: "stvbios.zip"
required: true
category: bios_zip
system: sega-stv
@@ -302,6 +308,7 @@ files:
# Sega Mega Play
- name: megaplay.zip
path: "megaplay.zip"
required: true
category: bios_zip
system: sega-megaplay
@@ -323,6 +330,7 @@ files:
# Sega Mega-Tech
- name: megatech.zip
path: "megatech.zip"
required: true
category: bios_zip
system: sega-megatech
@@ -335,6 +343,7 @@ files:
# DECO Cassette System
- name: decocass.zip
path: "decocass.zip"
required: true
category: bios_zip
system: deco-cassette
@@ -387,6 +396,7 @@ files:
# Nintendo PlayChoice-10
- name: playch10.zip
path: "playch10.zip"
required: true
category: bios_zip
system: nintendo-playch10
@@ -438,6 +448,7 @@ files:
# Nintendo Super System
- name: nss.zip
path: "nss.zip"
required: true
category: bios_zip
system: nintendo-nss
@@ -466,6 +477,7 @@ files:
# Super Kaneko Nova System
- name: skns.zip
path: "skns.zip"
required: true
category: bios_zip
system: super-kaneko-nova
@@ -501,6 +513,7 @@ files:
# Konami System GX
- name: konamigx.zip
path: "konamigx.zip"
required: true
category: bios_zip
system: konami-gx
@@ -513,6 +526,7 @@ files:
# Konami Baby Phoenix/GV System
- name: konamigv.zip
path: "konamigv.zip"
required: true
category: bios_zip
system: konami-gv
@@ -525,6 +539,7 @@ files:
# Century Electronics CVS
- name: cvs.zip
path: "cvs.zip"
required: true
category: bios_zip
system: century-cvs
@@ -548,6 +563,7 @@ files:
# Capcom ZN1
- name: cpzn1.zip
path: "cpzn1.zip"
required: true
category: bios_zip
system: capcom-zn1
@@ -560,6 +576,7 @@ files:
# Capcom ZN2
- name: cpzn2.zip
path: "cpzn2.zip"
required: true
category: bios_zip
system: capcom-zn2
@@ -572,6 +589,7 @@ files:
# Tecmo TPS
- name: tps.zip
path: "tps.zip"
required: true
category: bios_zip
system: tecmo-tps
@@ -584,6 +602,7 @@ files:
# Taito FX1
- name: taitofx1.zip
path: "taitofx1.zip"
required: true
category: bios_zip
system: taito-fx1
@@ -596,6 +615,7 @@ files:
# Eighting/Raizing PS Arcade 95
- name: psarc95.zip
path: "psarc95.zip"
required: true
category: bios_zip
system: eighting-zn1
@@ -608,6 +628,7 @@ files:
# Atlus PSX
- name: atluspsx.zip
path: "atluspsx.zip"
required: true
category: bios_zip
system: atlus-zn1
@@ -620,6 +641,7 @@ files:
# Atari PSX
- name: atpsx.zip
path: "atpsx.zip"
required: true
category: bios_zip
system: atari-zn1
@@ -632,6 +654,7 @@ files:
# Acclaim PSX
- name: acpsx.zip
path: "acpsx.zip"
required: true
category: bios_zip
system: acclaim-zn1
@@ -644,6 +667,7 @@ files:
# Video System PSX
- name: coh1002v.zip
path: "coh1002v.zip"
required: true
category: bios_zip
system: videosystem-zn1
@@ -656,6 +680,7 @@ files:
# Seta Aleck64
- name: aleck64.zip
path: "aleck64.zip"
required: true
category: bios_zip
system: nintendo-aleck64
@@ -668,6 +693,7 @@ files:
# Atari System 1
- name: atarisy1.zip
path: "atarisy1.zip"
required: true
category: bios_zip
system: atari-system1
@@ -691,6 +717,7 @@ files:
# EFO Cedar Magnet System
- name: cedmag.zip
path: "cedmag.zip"
required: true
category: bios_zip
system: efo-cedar-magnet
@@ -703,6 +730,7 @@ files:
# Arcadia Systems
- name: ar_bios.zip
path: "ar_bios.zip"
required: true
category: bios_zip
system: arcadia-systems
@@ -770,6 +798,7 @@ files:
# Exidy Max-A-Flex
- name: maxaflex.zip
path: "maxaflex.zip"
required: true
category: bios_zip
system: exidy-maxaflex
@@ -793,6 +822,7 @@ files:
# Brezzasoft Crystal System
- name: crysbios.zip
path: "crysbios.zip"
required: true
category: bios_zip
system: brezzasoft-crystal
@@ -805,6 +835,7 @@ files:
# I'Max Multi Amenity Cassette System
- name: macsbios.zip
path: "macsbios.zip"
required: true
category: bios_zip
system: imax-macs
@@ -823,6 +854,7 @@ files:
# Barcrest MPU4 Video
- name: bctvidbs.zip
path: "bctvidbs.zip"
required: true
category: bios_zip
system: barcrest-mpu4
+4 -2
View File
@@ -20,6 +20,8 @@ cores:
- cemu
- "cemu-sa"
systems: [nintendo-wiiu]
standalone_directories:
- "mlc_path = mlc01"
data_directories:
- ref: cemu-gameprofiles
@@ -71,7 +73,7 @@ notes: |
directory of that name (saves sorted per core). Standalone Cemu uses the
portable directory next to the executable when it exists, otherwise the
user data directory given per system in data_root, and the MLC defaults to
<user data>/mlc01. path: entries below are
<user data>/mlc01, which mlc_path in settings.xml replaces. path: entries below are
the libretro destination under the system directory, or under the save
directory for the MLC (load_from), and standalone_path: is relative to the
Cemu user data directory, which holds the MLC by default (load_from
@@ -80,7 +82,7 @@ notes: |
ref: src/libretro/CemuLibretro.cpp:2110-2170,
src/libretro/CemuLibretro.cpp:4083-4091,
src/gui/wxgui/CemuApp.cpp:89-124, src/gui/wxgui/CemuApp.cpp:126-172,
src/config/ActiveSettings.cpp:295-321
src/config/ActiveSettings.cpp:295-321, src/config/CemuConfig.cpp:25-26
keys.txt is read once from the user data path. A missing file is created
with a comment header and an example key. Each line is stripped of
+3
View File
@@ -23,6 +23,9 @@ cores:
- "dolphin-qt-gc"
- "dolphin-qt-wii"
systems: [nintendo-gamecube, nintendo-wii, sega-triforce]
standalone_directories:
- "$XDG_DATA_HOME/dolphin-emu"
- "~/.local/share/dolphin-emu"
data_root:
android:
path: "Android/data/org.dolphinemu.dolphinemu/files"
+2
View File
@@ -29,6 +29,8 @@ cores:
systems:
- ngage
- symbian
standalone_directories:
- "data-storage = data"
data_root:
android:
+54
View File
@@ -13,6 +13,9 @@ version_basis:
display_name: "GZDoom"
cores: ["GZDoom", "gzdoom-sa"]
systems: [doom, heretic, hexen, strife, chex]
standalone_pools:
"[IWADSearch.Directories] Path": ""
"[IWADSearch.Directories] RecursivePath": ""
notes: |
Doom-engine source port by Christoph Oelckers. Supports Doom, Heretic,
@@ -30,6 +33,14 @@ notes: |
The last three are skipped for shareware IWADs and with -noextras.
ref: src/d_main.cpp:2050-2071
BaseFileSearch tries the program directory first for these resources, then
the name as given, then each FileSearch.Directories path. The same search
serves -file, -deh and -bex arguments and zvox.wad. IWADs are not looked up
there: candidates come from the IWADSearch.Directories paths, and the Load
files of an IWAD block from the IWAD's own directory.
ref: src/common/utility/findfile.cpp:106-115, 224-296,
src/d_main.cpp:1802-1803, 2083, src/d_iwad.cpp:456-476, 613-624, 877-901
Game data is a user-supplied IWAD. iwadinfo.txt declares each known
IWAD with its IWADName, MustContain lumps and support files. The
search directories are scanned for the file names of its Names block
@@ -153,6 +164,7 @@ files:
- name: "doom.wad"
category: game_data
system: doom
path: "doom.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:420, 437, 659"
note: "The Ultimate DOOM and DOOM Registered both use this name and are told apart by their lumps."
@@ -160,108 +172,126 @@ files:
- name: "doom2.wad"
category: game_data
system: doom
path: "doom2.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:640, 653"
- name: "doom2f.wad"
category: game_data
system: doom
path: "doom2f.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:625, 657"
- name: "doombfg.wad"
category: game_data
system: doom
path: "doombfg.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:332, 666"
- name: "doom2bfg.wad"
category: game_data
system: doom
path: "doom2bfg.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:560, 667"
- name: "doomunity.wad"
category: game_data
system: doom
path: "doomunity.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:369, 661"
- name: "doom2unity.wad"
category: game_data
system: doom
path: "doom2unity.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:592, 655"
- name: "doomkex.wad"
category: game_data
system: doom
path: "doomkex.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:350, 662"
- name: "doom2kex.wad"
category: game_data
system: doom
path: "doom2kex.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:576, 656"
- name: "doomxbox.wad"
category: game_data
system: doom
path: "doomxbox.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:403, 660"
- name: "doom2xbox.wad"
category: game_data
system: doom
path: "doom2xbox.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:608, 654"
- name: "doom_complete.pk3"
category: game_data
system: doom
path: "doom_complete.pk3"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:389, 652"
- name: "plutonia.wad"
category: game_data
system: doom
path: "plutonia.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:545, 670"
- name: "plutoniaunity.wad"
category: game_data
system: doom
path: "plutoniaunity.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:514, 671"
- name: "plutoniakex.wad"
category: game_data
system: doom
path: "plutoniakex.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:529, 672"
- name: "tnt.wad"
category: game_data
system: doom
path: "tnt.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:499, 673"
- name: "tntunity.wad"
category: game_data
system: doom
path: "tntunity.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:468, 674"
- name: "tntkex.wad"
category: game_data
system: doom
path: "tntkex.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:483, 675"
- name: "nerve.wad"
category: game_data
system: doom
path: "nerve.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:565, 614, src/d_iwad.cpp:877-895"
note: "No Rest for the Living. Autoloaded by Doom 2 BFG and Xbox editions."
@@ -269,6 +299,7 @@ files:
- name: "nerveunity.wad"
category: game_data
system: doom
path: "nerveunity.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:598, src/d_iwad.cpp:877-895"
note: "Loaded from the IWAD directory by DOOM 2: Unity Edition."
@@ -276,6 +307,7 @@ files:
- name: "extras.wad"
category: game_data
system: doom
path: "extras.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:357, 376, 488, 534, 582, 598"
note: "Loaded from the IWAD directory by the KEX and Unity editions."
@@ -283,6 +315,7 @@ files:
- name: "soundtrack"
category: game_data
system: doom
path: "soundtrack"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:376, 598, src/d_iwad.cpp:877-895"
note: "Loaded from the IWAD directory by the DOOM and DOOM 2 Unity editions."
@@ -290,6 +323,7 @@ files:
- name: "id24res.wad"
category: game_data
system: doom
path: "id24res.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:341, 360, 379, src/d_iwad.cpp:862-875"
note: "id24 resource WAD. SupportWAD of every id IWAD block, loaded when found and i_loadsupportwad is set."
@@ -299,6 +333,7 @@ files:
- name: "freedoom1.wad"
category: game_data
system: doom
path: "freedoom1.wad"
required: false
installed_on: [retropie]
source_ref: "wadsrc_extra/static/iwadinfo.txt:307, 676"
@@ -306,6 +341,7 @@ files:
- name: "freedoom2.wad"
category: game_data
system: doom
path: "freedoom2.wad"
required: false
installed_on: [retropie]
source_ref: "wadsrc_extra/static/iwadinfo.txt:294, 677"
@@ -313,6 +349,7 @@ files:
- name: "freedm.wad"
category: game_data
system: doom
path: "freedm.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:281, 680"
@@ -321,6 +358,7 @@ files:
- name: "heretic.wad"
category: game_data
system: heretic
path: "heretic.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:241, 244, 254, 257, 681"
note: "Both Heretic and Shadow of the Serpent Riders use this name and are told apart by the EXTENDED lump."
@@ -329,6 +367,7 @@ files:
aliases: ["blasphemer.wad"]
category: game_data
system: heretic
path: "blasphem.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:228, 692-693"
@@ -337,12 +376,14 @@ files:
- name: "hexen.wad"
category: game_data
system: hexen
path: "hexen.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:188, 684"
- name: "hexdd.wad"
category: game_data
system: hexen
path: "hexdd.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:196-207, 685"
note: "Deathkings expansion. Requires hexen.wad (Required = Hexen: Beyond Heretic)."
@@ -352,12 +393,14 @@ files:
- name: "strife1.wad"
category: game_data
system: strife
path: "strife1.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:151, 688"
- name: "sve.wad"
category: game_data
system: strife
path: "sve.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:136, 140, 689"
note: "Veteran Edition. Required = Strife: Quest for the Sigil (loads voices.wad)."
@@ -365,6 +408,7 @@ files:
- name: "voices.wad"
category: game_data
system: strife
path: "voices.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:142, 155"
@@ -373,12 +417,14 @@ files:
- name: "chex.wad"
category: game_data
system: chex
path: "chex.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:123, 694"
- name: "chex3.wad"
category: game_data
system: chex
path: "chex3.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:109, 695"
@@ -387,12 +433,14 @@ files:
- name: "hacx.wad"
category: game_data
system: doom
path: "hacx.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:83, 698"
- name: "hacx2.wad"
category: game_data
system: doom
path: "hacx2.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:65-75, 699, src/d_iwad.cpp:351-394, src/common/filesystem/source/resourcefile.cpp:156-174"
note: "Identified by the MAP01 map and the HACX-E lump, whatever the container: every candidate is opened by its magic, so a zip under this name is read as a pk3. The Hacx 2.0 repository builds that zip from src/, where hacx-e.txt is the HACX-E lump and maps/MAP01.wad the first map."
@@ -400,18 +448,21 @@ files:
- name: "action2.wad"
category: game_data
system: doom
path: "action2.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:97, 696"
- name: "harm1.wad"
category: game_data
system: doom
path: "harm1.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:57, 697"
- name: "square.pk3"
category: game_data
system: doom
path: "square.pk3"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:33"
note: "Absent from the Names block: picked up only when named with -iwad."
@@ -419,17 +470,20 @@ files:
- name: "square1.pk3"
category: game_data
system: doom
path: "square1.pk3"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:45, 700"
- name: "delaweare.wad"
category: game_data
system: doom
path: "delaweare.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:22, 701"
- name: "rotwb.wad"
category: game_data
system: doom
path: "rotwb.wad"
required: false
source_ref: "wadsrc_extra/static/iwadinfo.txt:9, 702"
+1445
View File
File diff suppressed because it is too large. Load diff
+19
View File
@@ -16,6 +16,10 @@ cores:
- psxmame
systems:
- arcade
standalone_pools:
rompath: ""
"-rompath": ""
"-rp": ""
notes: |
MAME build reduced to the PlayStation based arcade boards, with the ZiNc
@@ -31,6 +35,9 @@ notes: |
zn.c, plus taitogn.c, ksys573.c and konamigv.c. emulatorlauncher runs
`mame.exe -skip_gameinfo -rompath <bios>/psxmame/bios;<game folder>
... <set>` (emulatorLauncher Generators/PSXMame.Generator.cs:20-110).
Each directory of the semicolon-separated rompath is tried in turn and a
set is read at its top (src/emu/emuopts.c:36, src/emu/fileio.c:245-249,
816-835).
A ROM missing from its set is fatal unless it is optional or has no good
dump (src/emu/romload.c:427-449, src/emu/romload.c:594). Of a set with
@@ -40,6 +47,7 @@ notes: |
files:
- name: "cpzn1.zip"
path: "cpzn1.zip"
system: arcade
required: true
category: bios_zip
@@ -52,6 +60,7 @@ files:
sha1: "486d92ff6c7f1e54f8e0ef41cd9116eca0e10e1a"
- name: "cpzn2.zip"
path: "cpzn2.zip"
system: arcade
required: true
category: bios_zip
@@ -64,6 +73,7 @@ files:
sha1: "66e7e1d4e426466b8f48a2ba055a91b475569504"
- name: "atpsx.zip"
path: "atpsx.zip"
system: arcade
required: true
category: bios_zip
@@ -76,6 +86,7 @@ files:
sha1: "815488d8563c85f97fbc3384ff21f08e4c88b7b7"
- name: "acpsx.zip"
path: "acpsx.zip"
system: arcade
required: true
category: bios_zip
@@ -88,6 +99,7 @@ files:
sha1: "7ee83d317190bb1cef2f8f01c81eaaae47150ebb"
- name: "tps.zip"
path: "tps.zip"
system: arcade
required: true
category: bios_zip
@@ -100,6 +112,7 @@ files:
sha1: "03eb2febfab3fcde716defff291babd9392de965"
- name: "vspsx.zip"
path: "vspsx.zip"
system: arcade
required: true
category: bios_zip
@@ -112,6 +125,7 @@ files:
sha1: "8f59314c1093446b9bcb06d232244da6df78e206"
- name: "taitofx1.zip"
path: "taitofx1.zip"
system: arcade
required: true
category: bios_zip
@@ -124,6 +138,7 @@ files:
sha1: "e18907cf8c6ba54d96edba0a9a00487a90219e0d"
- name: "psarc95.zip"
path: "psarc95.zip"
system: arcade
required: true
category: bios_zip
@@ -136,6 +151,7 @@ files:
sha1: "cd68532967a25f476a6d73473ec6b6f4df2e1689"
- name: "atluspsx.zip"
path: "atluspsx.zip"
system: arcade
required: true
category: bios_zip
@@ -148,6 +164,7 @@ files:
sha1: "9511d24bfe25eb180fb2db0835b131cb4a12730e"
- name: "taitogn.zip"
path: "taitogn.zip"
system: arcade
required: true
category: bios_zip
@@ -171,6 +188,7 @@ files:
sha1: "f1b10846a8423d9fe021191c5876190857c3d2a4"
- name: "sys573.zip"
path: "sys573.zip"
system: arcade
required: true
category: bios_zip
@@ -183,6 +201,7 @@ files:
sha1: "e1284add4aaddd5337bd7f4e27614460d52b5b48"
- name: "konamigv.zip"
path: "konamigv.zip"
system: arcade
required: true
category: bios_zip
+4
View File
@@ -931,6 +931,10 @@ platforms:
# retroarch/package.mk:115 at v4.8) and setsettings.sh never sets it, so
# RetroArch saves beside each game: no single place.
save_directory: null
# root's home, which every launcher script gets from /etc/profile
# (packages/sysutils/busybox/package.mk:168 and
# packages/sysutils/busybox/profile.d/98-busybox.conf:4 at v4.8).
home_directory: /storage
schedule: monthly
target_scraper: emuelec_targets
target_source: https://github.com/EmuELEC/EmuELEC/blob/dev/packages/sx05re/emuelec/package.mk
+252 -2
View File
@@ -4442,6 +4442,206 @@ launchers:
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:172-174, packages/sx05re/emulators/hatarisa/config/conf/Atari-ST-default.cfg:200,\
\ packages/sx05re/emulators/hatarisa/package.mk:39, packages/sx05re/emulators/hatarisa/scripts/hatari.start:36,\
\ 66, 73"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/artwork
passes_to: advmame.rc dir_artwork
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/artwork
passes_to: advmame.rc dir_artwork
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/diff
passes_to: advmame.rc dir_diff
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/diff
passes_to: advmame.rc dir_diff
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/hi
passes_to: advmame.rc dir_hi
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/hi
passes_to: advmame.rc dir_hi
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/image
passes_to: advmame.rc dir_image
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/image
passes_to: advmame.rc dir_image
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/inp
passes_to: advmame.rc dir_inp
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/inp
passes_to: advmame.rc dir_inp
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/memcard
passes_to: advmame.rc dir_memcard
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/memcard
passes_to: advmame.rc dir_memcard
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/nvram
passes_to: advmame.rc dir_nvram
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/nvram
passes_to: advmame.rc dir_nvram
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame
passes_to: advmame.rc dir_rom
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade
passes_to: advmame.rc dir_rom
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
@@ -4449,9 +4649,59 @@ launchers:
search_dir: /storage/roms/bios/advmame/samples
passes_to: advmame.rc dir_sample
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:9,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:9, packages/sx05re/emulators/advancemame/config/advmame.rc:12,\
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/snap
passes_to: advmame.rc dir_snap
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/snap
passes_to: advmame.rc dir_snap
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/mame/nvram
passes_to: advmame.rc dir_sta
fails_when_missing: false
depends_on_option: system != arcade
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: AdvanceMame
systems:
- arcade
build: standalone
kind: passes_path
names: []
search_dir: /storage/roms/arcade/nvram
passes_to: advmame.rc dir_sta
fails_when_missing: false
source_ref: "packages/sx05re/emuelec/bin/emuelecRunEmu.sh:213-215, packages/sx05re/emulators/advancemame/config/advmame.rc_oga:1-11,\
\ packages/sx05re/emulators/advancemame/config/advmame.rc_gf:1-11, packages/sx05re/emulators/advancemame/config/advmame.rc:4-14,\
\ packages/sx05re/emulators/advancemame/package.mk:45-49, packages/sx05re/emulators/advancemame/bin/advmame.sh:26-27,\
\ 80"
- emulator: SCUMMVMSA
build: standalone
kind: passes_path
+26 -6
View File
@@ -4718,16 +4718,26 @@ launchers:
\ == \"hbmame\", !string.IsNullOrEmpty(AppConfig[\"bios\"]) && Directory.Exists(AppConfig[\"\
bios\"])"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:93-96"
- emulator: hbmame
build: standalone
kind: passes_path
names: []
search_dir: bios/hbmame/samples
passes_to: command line -sp bios/hbmame/samples
fails_when_missing: false
depends_on_option: "messMode == null || messMode.Name == \"mame\" || messMode.Name\
\ == \"hbmame\", !string.IsNullOrEmpty(samplePath) && Directory.Exists(samplePath)"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:30, 101, 106-107"
- emulator: mame64
build: standalone
kind: passes_path
names: []
search_dir: bios/hbmame/samples when hbmame, else bios/mame/samples
passes_to: command line -sp bios/hbmame/samples when hbmame, else bios/mame/samples
search_dir: bios/mame/samples
passes_to: command line -sp bios/mame/samples
fails_when_missing: false
depends_on_option: "messMode == null || messMode.Name == \"mame\" || messMode.Name\
\ == \"hbmame\", !string.IsNullOrEmpty(samplePath) && Directory.Exists(samplePath)"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:101, 106-107"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:30, 101, 106-107"
- emulator: mame64
build: standalone
kind: passes_path
@@ -4764,16 +4774,26 @@ launchers:
depends_on_option: "messMode == null || messMode.Name == \"mame\" || messMode.Name\
\ == \"hbmame\", !string.IsNullOrEmpty(iniPath) && Directory.Exists(iniPath)"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:74-76, 167-168"
- emulator: hbmame
build: standalone
kind: passes_path
names: []
search_dir: bios/hbmame/hash
passes_to: command line -hash bios/hbmame/hash
fails_when_missing: false
depends_on_option: "messMode == null || messMode.Name == \"mame\" || messMode.Name\
\ == \"hbmame\", !string.IsNullOrEmpty(hashPath) && Directory.Exists(hashPath)"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:30, 172, 177-178"
- emulator: mame64
build: standalone
kind: passes_path
names: []
search_dir: bios/hbmame/hash when hbmame, else bios/mame/hash
passes_to: command line -hash bios/hbmame/hash when hbmame, else bios/mame/hash
search_dir: bios/mame/hash
passes_to: command line -hash bios/mame/hash
fails_when_missing: false
depends_on_option: "messMode == null || messMode.Name == \"mame\" || messMode.Name\
\ == \"hbmame\", !string.IsNullOrEmpty(hashPath) && Directory.Exists(hashPath)"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:172, 177-178"
source_ref: "emulatorLauncher/Generators/Mame64.Generator.cs:30, 172, 177-178"
- emulator: mame64
build: standalone
kind: passes_path
+71 -88
View File
@@ -16756,6 +16756,24 @@ launchers:
passes_to: "settings.ini [BIOS] SearchDirectory"
fails_when_missing: false
source_ref: "duckstation/component_prepare.sh:15, 33"
- emulator: gzdoom
build: standalone
kind: passes_path
names: []
search_dir: $roms_path/doom
passes_to: "gzdoom.ini [IWADSearch.Directories] Path"
fails_when_missing: false
source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:9, gzdoom/component_prepare.sh:23,\
\ 27-28"
- emulator: gzdoom
build: standalone
kind: passes_path
names: []
search_dir: $roms_path/doom
passes_to: "gzdoom.ini [FileSearch.Directories] Path"
fails_when_missing: false
source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:18, gzdoom/component_prepare.sh:23,\
\ 27-28"
- emulator: gzdoom
build: standalone
kind: passes_path
@@ -16765,6 +16783,15 @@ launchers:
fails_when_missing: false
source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:19, gzdoom/component_prepare.sh:23,\
\ 28"
- emulator: gzdoom
build: standalone
kind: passes_path
names: []
search_dir: $roms_path/bios/gzdoom
passes_to: "gzdoom.ini [SoundfontSearch.Directories] Path"
fails_when_missing: false
source_ref: "gzdoom/rd_assets/rd_config/gzdoom.ini:31, gzdoom/component_prepare.sh:23,\
\ 27-28"
- emulator: mame
build: standalone
kind: passes_path
@@ -16996,8 +17023,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: xroar.conf rompath
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:290, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:290, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17007,8 +17033,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragon
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:291, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:291, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17023,8 +17048,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist d64_1
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:292, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:292, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17038,8 +17062,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist d64_2
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:293, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:293, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17052,8 +17075,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist d32
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:294, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:294, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17065,8 +17087,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist d200e_1
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:295, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:295, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17078,8 +17099,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist d200e_2
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:296, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:296, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17095,8 +17115,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragon64
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:297, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:297, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17110,8 +17129,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragon64_alt
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:298, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:298, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17125,8 +17143,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragon32
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:299, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:299, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17145,8 +17162,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragon200e
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:300, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:300, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17163,8 +17179,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragon200e_alt
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:301, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:301, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17175,8 +17190,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragon200e_charset
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:302, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:302, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17190,8 +17204,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragonpro_boot
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:303, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:303, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17209,8 +17222,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragonpro_basic
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:304, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:304, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17224,8 +17236,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:305, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:305, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17238,8 +17249,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco_ext
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:306, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:306, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17253,8 +17263,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco1
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:307, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:307, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17268,8 +17277,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco1e
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:308, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:308, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17282,8 +17290,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco1e_ext
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:309, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:309, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17297,8 +17304,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco2
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:310, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:310, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17311,8 +17317,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco2_ext
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:311, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:311, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17326,8 +17331,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco2b
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:312, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:312, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17338,8 +17342,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist deluxecoco
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:313, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:313, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17349,8 +17352,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist deluxecoco1
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:314, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:314, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17360,8 +17362,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist deluxecoco2
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:315, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:315, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17372,8 +17373,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist deluxecoco3
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:316, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:316, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17384,8 +17384,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist mx1600
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:317, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:317, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17395,8 +17394,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist mx1600ext
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:318, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:318, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17406,8 +17404,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco3
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:319, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:319, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17417,8 +17414,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist coco3p
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:320, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:320, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17429,8 +17425,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist glenside_ide
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:321, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:321, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17440,8 +17435,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist mc10
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:322, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:322, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17451,8 +17445,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist alice
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:323, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:323, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17467,8 +17460,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragondos
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:324, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:324, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17481,8 +17473,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dosplus
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:325, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:325, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17495,8 +17486,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist superdos
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:326, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:326, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17508,8 +17498,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist cumana
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:327, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:327, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17535,8 +17524,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist dragondos_compat
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:328, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:328, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17547,8 +17535,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist rsdos
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:329, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:329, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17563,8 +17550,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist delta
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:330, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:330, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17574,8 +17560,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist rsdos_becker
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:331, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:331, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17586,8 +17571,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist mcx128
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:332, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:332, xroar/component_prepare.sh:13-15"
- emulator: xroar
build: standalone
kind: names_searched
@@ -17598,8 +17582,7 @@ launchers:
search_dir: "$roms_path/coco:$roms_path/dragon32:$roms_path/tanodragon:$bios_path"
passes_to: romlist mcx128_azerty
fails_when_missing: false
source_ref: "xroar/rd_assets/rd_config/xroar.conf:333, xroar/component_prepare.sh:13,\
\ 15"
source_ref: "xroar/rd_assets/rd_config/xroar.conf:333, xroar/component_prepare.sh:13-15"
- emulator: retroarch
build: libretro
kind: core_option
+16 -3
View File
@@ -1646,12 +1646,15 @@ def resolve_local_file(
layout = file_entry.get("layout_path")
if layout and layout != dest_hint:
plain = {k: v for k, v in file_entry.items() if k != "layout_path"}
# A destination outside the BIOS tree says nothing of the collection:
# EmuELEC's roms/mame/konamigv.zip is not bios/Arcade/MAME's set.
outside = file_entry.get("unprefixed") or file_entry.get("root")
answers = [
resolve_local_file(
plain, db, zip_contents, dest_hint=hint, _depth=_depth,
data_dir_registry=data_dir_registry,
)
for hint in (dest_hint, str(layout))
for hint in ((str(layout),) if outside else (dest_hint, str(layout)))
]
for found in answers:
if found[0] is not None and (
@@ -3098,12 +3101,14 @@ def standalone_layout_path(entry: dict, profile: dict) -> str | None:
``standalone_path`` when the entry has one. A profile with no libretro
build has one layout, so its ``path`` is that layout: UAE4All2 reads
kickstarts/kick13.rom below its working directory.
kickstarts/kick13.rom below its working directory. So does an entry only
the standalone build reads (``mode: standalone``), whose destination is
its ``path``: Dolphin's Load/Firmware/rtl_bt/ under its User directory.
"""
own = entry.get("standalone_path")
if own:
return own
if "libretro" in str(profile.get("type", "")):
if "libretro" in str(profile.get("type", "")) and entry.get("mode") != "standalone":
return None
return entry.get("path") or None
@@ -3230,6 +3235,14 @@ def platform_layouts(
tree, path = placed
moved = {**f, "standalone_path": path,
"layout_path": standalone_layout_path(f, profile)}
if f.get("load_from"):
# The build's own root no longer applies: RetroDECK hands
# Cemu's MLC, read from its data directory, to bios/cemu.
load_from = f["load_from"]
moved["load_from"] = {
**(load_from if isinstance(load_from, dict) else {"libretro": load_from}),
"standalone": "system_dir",
}
if tree == "install":
# Below the roms root inside the install tree (AmberELEC's
# /storage/roms): a plain dest the platform prefix skips.
+74 -16
View File
@@ -312,6 +312,11 @@ def launcher_places(config: dict) -> list[LauncherPlace]:
# component scripts $bios_path.
BIOS_ROOT_VARIABLES = ("$biosdir", "$home/RetroPie/BIOS", "${biosPath}", "$bios_path")
# The name a platform's launch code gives its roms root: RetroDECK's
# component scripts write $roms_path (retrodeck_launchers), the setting whose
# default is the roms root (config/retrodeck/retrodeck.json:5).
ROMS_ROOT_VARIABLES = ("$roms_path", "${roms_path}")
# The kinds that hand an emulator a whole directory. A scans_dir record sets
# the directory the emulator picks its file from: ROCKNIX writes ARMSX2's
# [Folders] Bios, EmuDeck PCSX2's.
@@ -341,20 +346,29 @@ INSTALL_TREE = "install"
# A folder of neither tree, which no pack and no installer can fill.
OUTSIDE_TREE = "outside"
Place = tuple[str, str]
# The binding key of a search list standing for the whole layout: the
# directories hold the layout's files themselves (XRoar's ROMs, MAME's sets),
# never its subfolders.
SEARCHED_FILES = "*"
_HOME = re.compile(r"^(?:\$\{HOME\}|\$HOME|\$home|~)(?=/|$)")
# Flatpak sets XDG_DATA_HOME to ~/.var/app/<id>/data inside the sandbox.
_FLATPAK_DATA = re.compile(r"^~/\.var/app/[^/]+/data(?=/|$)")
def normalize_handle(token: str) -> str:
def normalize_handle(token: str, home: str = "") -> str:
"""One spelling for a path, setting or function a launcher record names.
``$home``, ``$HOME``, ``${HOME}`` and ``~`` are one directory, and a
Flatpak's data directory is its ``$XDG_DATA_HOME``.
Flatpak's data directory is its ``$XDG_DATA_HOME``. ``home`` is the
platform's home directory spelled out (``home_directory``): EmuELEC
links /storage/.local/share/flycast, Flycast's ~/.local/share/flycast.
"""
token = token.strip().strip("\"'").rstrip(",;").rstrip("/")
token = token.removesuffix("()")
home = home.rstrip("/")
if home and _below(token, home) is not None:
token = "~" + token[len(home):]
token = _HOME.sub("~", token)
return _FLATPAK_DATA.sub("$XDG_DATA_HOME", token)
@@ -438,13 +452,29 @@ def native_systems(config: dict) -> dict[str, str]:
return found
def _listed_directories(raw: str) -> list[str] | None:
"""The directories of a colon-separated search path, None for one directory.
# How the launcher extractors spell the folder holding the launched game:
# RetroBat's Path.GetDirectoryName(rom) (retrobat_launchers._KNOWN), KNULLI's
# os.path.dirname(rom) and its software list folder (mameGenerator.py:113-116).
GAME_FOLDERS = ("<rom directory>", "<romDirname>", "<softDir>")
XRoar's rompath is such a list (RetroDECK writes four directories), each
entry a path or a variable spelling one. A Windows drive letter or a
backslash means a single path.
def _listed_directories(raw: str) -> list[str] | None:
"""The directories of a search path, None for one directory.
XRoar's rompath is a colon-separated list (RetroDECK writes four
directories), each entry a path or a variable spelling one. A Windows
drive letter or a backslash means a single path. MAME splits its search
paths on semicolons whatever the system (src/emu/fileio.cpp:53-58):
RetroBat passes `-rp bios;<rom directory>`, KNULLI `-rompath
<romDirname>;/userdata/bios/mame;/userdata/bios`. The game's own folder
is no folder a pack fills, so it gives no directory.
"""
if ";" in raw:
parts = [p.strip() for p in raw.split(";") if p.strip()]
kept = [p for p in parts if p not in GAME_FOLDERS]
if kept and all(not re.search(r"[\s,<>]", p) for p in kept):
return kept
return None
if ":" not in raw or "\\" in raw or re.match(r"^[A-Za-z]:", raw):
return None
parts = [p.strip() for p in raw.split(":")]
@@ -464,6 +494,7 @@ def handed_directories(config: dict) -> list[HandedDirectory]:
holds <system> gives one directory per system the platform declares.
"""
base = str(config.get("base_destination") or "bios")
home = str(config.get("home_directory") or "")
natives = native_systems(config)
declared = {d.lower() for d in declared_destinations(config)}
found: list[HandedDirectory] = []
@@ -490,7 +521,7 @@ def handed_directories(config: dict) -> list[HandedDirectory]:
if any(re.search(r"[\s,:;]", part) for part in parts):
continue
for part in parts:
directory = normalize_handle(part)
directory = normalize_handle(part, home)
if passes_to.startswith(WORKING_DIRECTORY_PASSED):
# The program runs from the directory: what its code
# reads through getcwd(), or relative to it, is below it.
@@ -499,7 +530,7 @@ def handed_directories(config: dict) -> list[HandedDirectory]:
handles = frozenset(
handle
for token in passes_to.split()
if (handle := normalize_handle(token)) and handle != directory
if (handle := normalize_handle(token, home)) and handle != directory
) | ini_keys(passes_to)
folder = _folder_in_bios(part, base)
for emulator in (e.strip() for e in str(record.get("emulator", "")).split(",")):
@@ -565,8 +596,15 @@ def folder_in_roms(directory: str, config: dict) -> str | None:
(``roms_root.path``): ROCKNIX's /storage/roms, which holds its BIOS
folder and the folders its launchers run programs from.
"""
from common import ROMS_ROOT # noqa: PLC0415
from common import ROMS_ROOT, outer_layout # noqa: PLC0415
spelled = directory.strip().rstrip("/")
for variable in ROMS_ROOT_VARIABLES:
if outer_layout(config, ROMS_ROOT) and (
spelled == variable or spelled.startswith(variable + "/")
):
rest = spelled[len(variable) + 1:]
return None if re.search(r"[\s<>$:;]", rest) else rest
return folder_in_root(directory, config, ROMS_ROOT)
@@ -716,7 +754,13 @@ def _bind(
one after the other: openMSX's filepool, XRoar's rompath. A file in any
of them is read, so the pool gives one: the directory the platform's own
list already fills (Batocera's bios/openmsx beside bios/Machines), else
the first of the BIOS tree, else the first a pack can fill.
the first of the BIOS tree, else the first a pack can fill. A list that
already holds the folder the layout's files take without the launcher
keeps them there: KNULLI starts MAME with -rompath
<romDirname>;/userdata/bios/mame;/userdata/bios, and the sets at the BIOS
root stay. A pool standing for the whole layout holds its files
directly, not its folders (SEARCHED_FILES): MAME reads hash/ and
samples/ through other settings.
"""
found: dict[str, set[Place]] = {}
pooled: dict[str, list[tuple[bool, Place]]] = {}
@@ -750,11 +794,14 @@ def _bind(
for rest, place in places or [("", (OUTSIDE_TREE, ""))]:
found.setdefault(rest, set()).add(place)
for sub, entries in pooled.items():
# The directory the platform's own list fills, else the first of the
# BIOS tree, else the first a pack fills.
# The folder the files already take, else the directory the
# platform's own list fills, else the first of the BIOS tree, else
# the first a pack fills.
unmoved = [p for _held, p in entries if p == (BIOS_TREE, sub)]
filled = [p for held, p in entries if held]
in_bios = [p for _held, p in entries if p[0] == BIOS_TREE]
found.setdefault(sub, set()).add((filled or in_bios or [p for _h, p in entries])[0])
chosen = (unmoved or filled or in_bios or [p for _h, p in entries])[0]
found.setdefault(sub or SEARCHED_FILES, set()).add(chosen)
return found
@@ -844,9 +891,15 @@ def bound_path(path: str, bindings: dict[str, Place]) -> Place | None:
The longest subfolder that contains the path wins: a link of
kickstarts/ places kickstarts/kick13.rom even when the whole layout is
bound elsewhere.
bound elsewhere. SEARCHED_FILES covers the files at the root of the
layout alone.
"""
for sub in sorted(bindings, key=len, reverse=True):
if sub == SEARCHED_FILES:
if "/" in path:
continue
root, folder = bindings[sub]
return (root, f"{folder}/{path}" if folder else path)
if sub and not path.startswith(sub + "/"):
continue
rest = path[len(sub) + 1:] if sub else path
@@ -1087,7 +1140,9 @@ class LauncherLayer:
# core asked for it: the pack puts a file there either way.
reported_at: dict[str, dict] = {}
for _emulator, _standalone, _entry, report in candidates:
if report.get("in_repo"):
# A file the layout reads outside the BIOS tree fills no
# destination of it.
if report.get("in_repo") and not report.get("unplaced"):
destination = sanitize_pack_path(report.get("path") or report.get("name", ""))
reported_at.setdefault(destination, report)
by_layout: dict[tuple[str, bool], list[tuple[dict, dict]]] = {}
@@ -1131,6 +1186,9 @@ class LauncherLayer:
continue
if isinstance(filled, dict):
added.append(filled)
# The launcher hands the emulator that file from the BIOS
# tree: read outside it no more.
settled.update(id(report) for _c, report in matched if report.get("unplaced"))
if place.stands_for_default:
# The emulator opens the launcher's file instead of its
# own name, so a copy under that name is read by nobody:
+9 -2
View File
@@ -1462,7 +1462,7 @@ def _collect_emulator_extras(
# covered elsewhere belongs to another program's file.
# Nor is one placed outside the BIOS tree by the layout.
if (fname not in covered_names or f.get("unsourceable") or f.get("unplaced")
or f.get("root") in OUTER_ROOTS or f.get("unprefixed")):
or f.get("root") in OUTER_ROOTS):
continue
# Installed with the emulator or by the platform's package,
# as the first pass already decided for the same entry.
@@ -1492,7 +1492,12 @@ def _collect_emulator_extras(
# of the directory core files go to, which the platform may not
# declare (Recalbox has its System Cards under pcenginecd/ only,
# geargrafx reads them from the root).
full_dest = prefixed_destination(dest, extras_prefix)
# A path of the install tree outside the BIOS folder keeps no
# prefix: EmuELEC's dolphin/dolphin-emu/GBA/gba_bios.bin.
full_dest = (
sanitize_pack_path(dest) if f.get("unprefixed")
else prefixed_destination(dest, extras_prefix)
)
if full_dest in seen_dests and full_dest not in taken:
continue
if full_dest in taken and full_dest not in seen and fname not in platform_names:
@@ -1538,6 +1543,8 @@ def _collect_emulator_extras(
extra["contents"] = f["contents"]
if f.get("system_dir"):
extra["system_dir"] = f["system_dir"]
if f.get("unprefixed"):
extra["unprefixed"] = True
extra["claim_order"] = (2, 0, emu_name)
if _take(extra, full_dest, seen_dests, taken):
extras.append(extra)
+3 -1
View File
@@ -37,11 +37,13 @@ class Launcher:
device: str | None = None
# The machines the platform offers under the record's systems.
machines: list[str] | None = None
# The platform systems the record is written for, none for every one.
systems: list[str] | None = None
def entry(self) -> dict[str, Any]:
"""The platform YAML form, in a fixed key order, unset keys left out."""
order = (
"emulator", "build", "kind", "slot", "names", "expands",
"emulator", "systems", "build", "kind", "slot", "names", "expands",
"case_insensitive", "search_dir", "passes_to",
"fails_when_missing", "fails_scope", "depends_on_option",
"device", "machines", "source_ref",
+49 -21
View File
@@ -38,6 +38,8 @@ EMULATORS = f"{SX05RE}/emulators"
LIBRETRO = f"{SX05RE}/libretro"
RETROARCH_MK = f"{SX05RE}/libretro_base/retroarch/package.mk"
BIOS_ROOT = "/storage/roms/bios"
# The roms root that holds it (packages/sx05re/libretro_base/retroarch/package.mk:112,117).
ROMS_ROOT = "/storage/roms"
_EMU_TEST = re.compile(r'\$\{?EMU\}?"?\s*==?\s*"([^"]+)"')
_ARM = re.compile(r'^\s*((?:"[^"]+"\|?)+)\)\s*$')
@@ -487,8 +489,18 @@ def hatari(tree: RepoTree, runs: Runs) -> list[Launcher]:
]
_ADVMAME_SYSTEM = re.compile(r'^\s*if \[\[ "\$\{1\}" = "([\w-]+)" \]\]; then$')
_ADVMAME_SED = re.compile(r'^\s*sed -i "s\|([^|]+)\|([^|]+)\|g" \$\{CONFIG_DIR\}/advmame\.rc$')
def advancemame(tree: RepoTree, runs: Runs) -> list[Launcher]:
"""Folder keys of the advmame.rc package.mk installs, one per device branch."""
"""Folder keys of the advmame.rc package.mk installs, one per device branch.
A key under the roms root is one too: dir_rom is /storage/roms/mame. The
start script rewrites the config for the system it is launched for
(advmame.sh:26-30): /roms/mame becomes /roms/arcade for arcade, so that
system reads its own record.
"""
package = f"{EMULATORS}/advancemame"
mk = _read(tree, f"{package}/package.mk")
installs = [
@@ -501,8 +513,8 @@ def advancemame(tree: RepoTree, runs: Runs) -> list[Launcher]:
by_value: dict[tuple[tuple[str, str], ...], list[tuple[str, set[int], int]]] = {}
for mk_line, file in installs:
path = f"{package}/config/{file}"
keys = [s for s in settings(tree.read(path), separator=" ") if _under(s.value)]
if not keys:
keys = [s for s in settings(tree.read(path), separator=" ") if _under(s.value, ROMS_ROOT)]
if not any(_under(s.value) for s in keys):
raise LauncherPatternMissing(path, f"key naming a folder under {BIOS_ROOT}")
value = tuple((s.key, s.value) for s in keys)
by_value.setdefault(value, []).append((path, {s.line for s in keys}, mk_line))
@@ -511,25 +523,41 @@ def advancemame(tree: RepoTree, runs: Runs) -> list[Launcher]:
((value, configs),) = by_value.items()
script = _read(tree, f"{package}/bin/advmame.sh")
run_line, _ = script.find(r"^\s*(?:\w+=\S+ )*advmame ", "advmame start")
test_line, test = script.find(_ADVMAME_SYSTEM.pattern, "system test", end=run_line)
sed_line, sed = script.find(_ADVMAME_SED.pattern, "system rewrite", test_line + 1, test_line + 1)
name = posixpath.basename(script.path)
refs = [
runs.ref(name),
*((path, lines) for path, lines, _ in configs),
(mk.path, {mk_line for _, _, mk_line in configs}),
(script.path, {run_line}),
]
return [
Launcher(
emulator=runs.emulator(name),
build="standalone",
kind="passes_path",
names=[],
source_ref=source_ref(refs),
search_dir=folder,
passes_to=f"advmame.rc {key}",
)
for key, folder in value
]
def refs(*lines: int) -> str:
return source_ref([
runs.ref(name),
*((path, lines) for path, lines, _ in configs),
(mk.path, {mk_line for _, _, mk_line in configs}),
(script.path, {run_line, *lines}),
])
found = []
for key, folder in value:
rewritten = folder.replace(sed.group(1), sed.group(2))
if rewritten != folder:
# Every system but the one the script rewrites the key for, and
# that system with the rewritten folder.
found.append(Launcher(
emulator=runs.emulator(name), build="standalone", kind="passes_path", names=[],
source_ref=refs(test_line, sed_line), search_dir=folder,
passes_to=f"advmame.rc {key}",
depends_on_option=f"system != {test.group(1)}",
))
found.append(Launcher(
emulator=runs.emulator(name), build="standalone", kind="passes_path", names=[],
source_ref=refs(test_line, sed_line), search_dir=rewritten,
passes_to=f"advmame.rc {key}", systems=[test.group(1)],
))
continue
found.append(Launcher(
emulator=runs.emulator(name), build="standalone", kind="passes_path", names=[],
source_ref=refs(), search_dir=folder, passes_to=f"advmame.rc {key}",
))
return found
def mame(tree: RepoTree, runs: Runs) -> list[Launcher]:
+41 -1
View File
@@ -3336,7 +3336,11 @@ def mame(sources: dict[str, Source]) -> list[Record]:
raise LauncherPatternMissing(own.path, "MAME folder arguments")
records = _covered(
own,
[_with_conditions(record, conditions) for record, conditions in found],
[
split
for record, conditions in found
for split in _per_emulator(own, _with_conditions(record, conditions))
],
# The bezel artwork folder is read by the launcher, not passed.
skip=(_BIOS_GUARD, r"ConfigureBezels\("),
)
@@ -3424,6 +3428,42 @@ def xroar(sources: dict[str, Source]) -> list[Record]:
return _covered(src, records)
_EMULATOR_BRANCH = re.compile(r"([^\s;<>]+) when (\w+), else ([^\s;<>]+)")
def _per_emulator(src: Source, record: Record) -> list[Record]:
"""A directory chosen by the emulator the generator runs, one record each.
Mame64.Generator.cs sets `bool hbmame = emulator == "hbmame";` and passes
`-sp bios/hbmame/samples` for it, bios/mame/samples for mame64. A choice
on any other condition is left as it reads.
"""
rendered = str(record.get("search_dir", ""))
branch = _EMULATOR_BRANCH.fullmatch(rendered)
if branch is None:
return [record]
chosen, flag, default = branch.groups()
declared = re.search(rf'bool {flag} = emulator == "([\w.-]+)";', _code(src))
if declared is None:
return [record]
ref = str(record["source_ref"])
if not ref.startswith(src.path + ":"):
raise LauncherPatternMissing(src.path, f"source of the directory choice {rendered!r}")
spans = [
(int(first), int(last or first))
for first, _, last in (s.partition("-") for s in ref[len(src.path) + 1:].split(", "))
]
spans.append(src.lines(declared.start(), declared.end()))
prefix = str(record["passes_to"]).removesuffix(rendered).strip()
out = []
for emulator, directory in ((declared.group(1), chosen), (record["emulator"], default)):
split = {k: v for k, v in record.items() if k != "source_ref"}
split.update(emulator=emulator, search_dir=directory, passes_to=f"{prefix} {directory}")
split["source_ref"] = _path_parts(src, *spans)
out.append(split)
return out
_SYSTEM_BRANCH = re.compile(r'(\S+), or (\S+) when system == "([\w.-]+)"')
+25 -8
View File
@@ -30,6 +30,10 @@ except ImportError:
BIOS = "$bios_path"
PLACEHOLDER = "RETRODECKBIOSDIR"
# The roms folder in the same presets: GZDoom's IWADSearch.Directories holds
# RETRODECKROMSDIR/doom (gzdoom/rd_assets/rd_config/gzdoom.ini:9), which
# gzdoom/component_prepare.sh:27 rewrites to $roms_path.
ROMS_PLACEHOLDER = "RETRODECKROMSDIR"
CORE_OPTIONS = "retroarch/rd_assets/rd_config/retroarch-core-options.cfg"
# The component that runs libretro cores.
LIBRETRO_COMPONENT = "retroarch"
@@ -282,7 +286,11 @@ class Component:
)
def _preset(self, script: Script, number: int, words: list[str]) -> None:
"""`sed -i "s#RETRODECKBIOSDIR#${bios_path}#g" "$cfg"` on a preset copied just above."""
"""`sed -i "s#RETRODECKBIOSDIR#${bios_path}#g" "$cfg"` on a preset copied just above.
Each line naming the BIOS or the roms folder is a record: a search
list can mix them (XRoar's rompath, GZDoom's IWAD directories).
"""
target = words[-1]
substitutions = self._substitutions(script, target)
copied = None
@@ -302,17 +310,25 @@ class Component:
stripped = line.strip()
if re.fullmatch(r"\[[^\]]+\]", stripped):
section = stripped
if PLACEHOLDER not in stripped or stripped.startswith("#"):
if stripped.startswith("#") or not any(
p in stripped for p in (PLACEHOLDER, ROMS_PLACEHOLDER)
):
continue
setting = re.match(r"^([\w.$()-]+)\s*(?:=|\s)\s*(.+)$", stripped)
if setting is None:
raise LauncherPatternMissing(f"{preset}:{line_no}", f"placeholder in {stripped}")
named = [p for p in substitutions if p in stripped]
if PLACEHOLDER not in stripped and not named:
# A roms placeholder the script leaves as written.
continue
key, value = setting.group(1), _unquote(setting.group(2))
for placeholder, variable in substitutions.items():
for placeholder, (variable, _line) in substitutions.items():
value = value.replace(placeholder, variable)
where = f"{section} {key}" if section else key
found += 1
applied = [(script.path, copied[0]), (script.path, number)]
found += PLACEHOLDER in stripped
applied = [(script.path, copied[0]), (script.path, number)] + [
(script.path, substitutions[p][1]) for p in named
]
self.record(
"passes_path", [], [(preset, line_no)] + applied,
search_dir=value, passes_to=f"{self.config_name(target)} {where}",
@@ -324,12 +340,13 @@ class Component:
raise LauncherPatternMissing(preset, f"no {PLACEHOLDER} line")
@staticmethod
def _substitutions(script: Script, target: str) -> dict[str, str]:
def _substitutions(script: Script, target: str) -> dict[str, tuple[str, int]]:
"""Each placeholder sed rewrites in ``target``: (variable, line)."""
found = {}
for line in script.lines:
for line_no, line in enumerate(script.lines, 1):
for m in re.finditer(r"s#(RETRODECK\w+)#\$\{?(\w+)\}?#g[\"']?\s+\"([^\"]+)\"", line):
if m.group(3) == target:
found[m.group(1)] = f"${m.group(2)}"
found[m.group(1)] = (f"${m.group(2)}", line_no)
return found
def romlists(
+4 -1
View File
@@ -809,7 +809,10 @@ def find_undeclared_files(
# Read below the roms directory (ROCKNIX's roms/pico-8)
# or in an emulator folder (RetroBat's emulators/pico8).
entry["root"] = f["root"]
elif launcher_layer and not save_root:
if launcher_layer and not save_root and f.get("root") not in OUTER_ROOTS:
# One read outside the BIOS tree is still served where a
# launcher links that very file: RetroDECK links Cemu's
# keys.txt to bios/cemu/keys.txt.
launcher_candidates.append((emu_name, is_standalone, f, entry))
keys = set_keys((emu_name, is_standalone), f)
if duplicate:
+185
View File
@@ -721,5 +721,190 @@ class Quasi88OnRetroPie(unittest.TestCase):
)
class FlycastOnEmuELEC(unittest.TestCase):
"""EmuELEC links /storage/.local/share/flycast to bios/dc (flycast.sh:11-14),
and root's home is /storage (busybox profile.d/98-busybox.conf:4)."""
def test_the_home_directory_is_spelled_as_home(self) -> None:
from launchers import normalize_handle
self.assertEqual(
normalize_handle("/storage/.local/share/flycast", "/storage"), "~/.local/share/flycast"
)
self.assertEqual(normalize_handle("/storage", "/storage/"), "~")
self.assertEqual(normalize_handle("/storagex/a", "/storage"), "/storagex/a")
self.assertEqual(
normalize_handle("/storage/.local/share/flycast"), "/storage/.local/share/flycast"
)
def test_the_bios_lands_in_dc(self) -> None:
profile = load_emulator_profiles(str(REPO_ROOT / "emulators"))["flycast"]
config = load_platform_config("emuelec", str(REPO_ROOT / "platforms"))
layouts = platform_layouts("flycast", profile, standalone_set(config))
(view,) = [v for v, standalone in layouts if standalone]
self.assertTrue(view["files"])
for entry in view["files"]:
self.assertEqual(entry["standalone_path"], "dc/" + entry["layout_path"])
def standalone_view(emulator: str, platform: str) -> dict:
profile = load_emulator_profiles(str(REPO_ROOT / "emulators"))[emulator]
config = load_platform_config(platform, str(REPO_ROOT / "platforms"))
(view,) = [v for v, standalone in platform_layouts(emulator, profile, standalone_set(config))
if standalone]
return view
class Eka2l1OnRetroBat(unittest.TestCase):
"""RetroBat writes data-storage = bios/eka2l1/data (Eka2l1.Generator.cs:153, 156)."""
def test_the_device_rom_lands_in_eka2l1_data(self) -> None:
view = standalone_view("eka2l1", "retrobat")
(rom,) = [e for e in view["files"] if e["name"] == "SYM.ROM"]
self.assertEqual(rom["standalone_path"], "eka2l1/data/roms/nem-4/SYM.ROM")
# Shipped beside the executable, in RetroBat's emulator folder.
for entry in view["files"]:
if entry.get("mode") == "standalone":
self.assertEqual(entry.get("unplaced"), "outside_bios_folder", entry["name"])
class CemuOnRetroDECK(unittest.TestCase):
"""RetroDECK sets mlc_path to $bios_path/cemu (cemu/component_prepare.sh:14, 29)
and keeps Cemu's user data in its Flatpak's $XDG_DATA_HOME/Cemu."""
def test_the_mlc_lands_in_cemu(self) -> None:
view = standalone_view("cemu", "retrodeck")
mlc = [e for e in view["files"] if (e.get("layout_path") or "").startswith("mlc01/")]
self.assertTrue(mlc)
for entry in mlc:
self.assertEqual(
entry["standalone_path"], "cemu/" + entry["layout_path"].removeprefix("mlc01/")
)
(otp,) = [e for e in view["files"] if e["name"] == "otp.bin"]
self.assertEqual(otp.get("unplaced"), "outside_bios_folder")
class DolphinUserDirectory(unittest.TestCase):
"""EmuELEC runs Dolphin with XDG_DATA_HOME=/storage/roms/dolphin (dolphin.sh:28),
RetroDECK links $XDG_DATA_HOME/dolphin-emu/Triforce to bios/Triforce
(dolphin/component_prepare.sh:30, 49)."""
def test_emuelec_installs_the_user_directory_below_its_roms(self) -> None:
view = standalone_view("dolphin", "emuelec")
placed = {e["name"]: e["standalone_path"] for e in view["files"] if e.get("layout_path")}
self.assertEqual(placed["segaboot.gcm"], "dolphin/dolphin-emu/Triforce/segaboot.gcm")
# A standalone-only entry's path is its place in the User directory.
self.assertEqual(
placed["rtl8723a_fw.bin"], "dolphin/dolphin-emu/Load/Firmware/rtl_bt/rtl8723a_fw.bin"
)
self.assertTrue(all(e.get("unprefixed") for e in view["files"] if e.get("layout_path")))
def test_retrodeck_places_triforce_alone(self) -> None:
view = standalone_view("dolphin", "retrodeck")
placed = {e["name"]: e["standalone_path"] for e in view["files"] if e.get("layout_path")}
self.assertEqual(placed, {"segaboot.gcm": "Triforce/segaboot.gcm"})
(ipl, *_) = [e for e in view["files"] if e["name"] == "IPL.bin"]
self.assertEqual(ipl.get("unplaced"), "outside_bios_folder")
class MameSearchPaths(unittest.TestCase):
"""MAME reads each semicolon-separated search path in turn
(src/emu/fileio.cpp:53-58, 330-392)."""
def sets(self, view: dict) -> list[dict]:
return [e for e in view["files"] if e.get("category") == "bios_zip"]
def test_retrobat_keeps_the_sets_at_the_bios_root(self) -> None:
# -rp bios;<rom directory> (Mame64.Generator.cs:93-96).
view = standalone_view("mame", "retrobat")
sets = self.sets(view)
self.assertGreater(len(sets), 1000)
for entry in sets:
self.assertEqual(entry["standalone_path"], entry["name"])
self.assertNotIn("unplaced", entry)
(bbc,) = [e for e in view["files"] if e["name"] == "bbc.zip"]
# -sp bios/mame/samples, hbmame's folder being another record
# (Mame64.Generator.cs:30, 101, 106-107).
self.assertEqual(bbc["standalone_path"], "mame/samples/bbc.zip")
def test_knulli_keeps_the_root_listed_after_bios_mame(self) -> None:
# -rompath <romDirname>;/userdata/bios/mame;/userdata/bios (mameGenerator.py:116-122).
view = standalone_view("mame", "knulli")
self.assertTrue(all(e["standalone_path"] == e["name"] for e in self.sets(view)))
(bbc,) = [e for e in view["files"] if e["name"] == "bbc.zip"]
self.assertEqual(bbc["standalone_path"], "mame/samples/bbc.zip")
def test_retropie_moves_the_sets_to_bios_mame(self) -> None:
# rompath $romdir/mame;$romdir/arcade;$biosdir/mame (mame.sh:133).
view = standalone_view("mame", "retropie")
self.assertTrue(all(
e["standalone_path"] == "mame/" + e["name"] for e in self.sets(view)
))
def test_retrodeck_reads_samples_in_mame_sa(self) -> None:
# samplepath $bios_path/mame-sa/samples (mame/component_prepare.sh:94, 117).
view = standalone_view("mame", "retrodeck")
(bbc,) = [e for e in view["files"] if e["name"] == "bbc.zip"]
self.assertEqual(bbc["standalone_path"], "mame-sa/samples/bbc.zip")
# ES-DE hands -rompath %GAMEDIR%;%ROMPATH%/<system>: no BIOS folder.
self.assertTrue(all(
e.get("unplaced") == "outside_bios_folder" for e in self.sets(view)
))
def test_psxmame_reads_bios_psxmame_bios(self) -> None:
# -rompath bios/psxmame/bios;<rom directory> (PSXMame.Generator.cs:38-48).
view = standalone_view("psxmame", "retrobat")
self.assertTrue(view["files"])
for entry in view["files"]:
self.assertEqual(entry["standalone_path"], "psxmame/bios/" + entry["name"])
class GzdoomOnRetroDECK(unittest.TestCase):
"""RetroDECK writes RETRODECKROMSDIR/doom into [IWADSearch.Directories]
(gzdoom.ini:9, component_prepare.sh:27)."""
def test_the_iwads_land_in_roms_doom(self) -> None:
view = standalone_view("gzdoom", "retrodeck")
iwads = [e for e in view["files"] if e.get("system")]
self.assertEqual(len(iwads), 43)
for entry in iwads:
self.assertEqual(entry["standalone_path"], "roms/doom/" + entry["name"])
self.assertTrue(entry.get("unprefixed"))
# The engine pk3s are read beside the executable first.
(pk3,) = [e for e in view["files"] if e["name"] == "gzdoom.pk3"]
self.assertNotIn("standalone_path", pk3)
def test_another_platform_keeps_them(self) -> None:
view = standalone_view("gzdoom", "batocera")
self.assertFalse(any(e.get("standalone_path") for e in view["files"]))
class AdvanceMameOnEmuELEC(unittest.TestCase):
"""advmame.rc sets dir_rom /storage/roms/mame, /storage/roms/arcade for
the arcade system (advmame.rc:11, advmame.sh:26-30)."""
def test_the_sets_land_in_roms_mame(self) -> None:
view = standalone_view("advancemame", "emuelec")
sets = [e for e in view["files"] if e.get("category") == "bios_zip"]
self.assertEqual(len(sets), 29)
for entry in sets:
self.assertEqual(entry["standalone_path"], "mame/" + entry["name"])
self.assertTrue(entry.get("unprefixed"))
def test_the_roms_folder_is_no_proof_of_content(self) -> None:
# bios/Arcade/MAME/konamigv.zip is MAME 0.289's set, not AdvanceMAME's.
from common import load_database, resolve_local_file
db = load_database(str(REPO_ROOT / "database.json"))
view = standalone_view("advancemame", "emuelec")
(entry,) = [e for e in view["files"] if e["name"] == "konamigv.zip"]
moved, _status = resolve_local_file(entry, db, dest_hint=entry["standalone_path"])
plain = {k: v for k, v in entry.items()
if k not in ("layout_path", "standalone_path", "unprefixed")}
root, _status = resolve_local_file(plain, db, dest_hint=entry["name"])
self.assertEqual(moved, root)
self.assertNotIn("/MAME/", moved)
if __name__ == "__main__":
unittest.main()
+17 -4
View File
@@ -313,6 +313,11 @@ ADVMAME_RC = text(
ADVMAME_SH = text(
"""
if [[ "${1}" = "arcade" ]]; then
sed -i "s|/roms/mame|/roms/arcade|g" ${CONFIG_DIR}/advmame.rc
else
sed -i "s|/roms/arcade|/roms/mame|g" ${CONFIG_DIR}/advmame.rc
fi
SDL_AUDIODRIVER=alsa advmame ${ARG} -quiet
"""
)
@@ -580,9 +585,17 @@ class StandaloneRecords(unittest.TestCase):
)
def test_advancemame_one_record_when_every_device_agrees(self):
(record,) = records(el.advancemame)
self.assertEqual(record["search_dir"], "/storage/roms/bios/advmame/samples")
self.assertNotIn("device", record)
roms, arcade, samples = records(el.advancemame)
self.assertEqual(samples["search_dir"], "/storage/roms/bios/advmame/samples")
self.assertNotIn("device", samples)
# advmame.sh rewrites /roms/mame to /roms/arcade for the arcade system.
self.assertEqual(
(roms["search_dir"], roms["passes_to"], roms["depends_on_option"]),
("/storage/roms/mame", "advmame.rc dir_rom", "system != arcade"),
)
self.assertNotIn("systems", roms)
self.assertEqual((arcade["search_dir"], arcade["systems"]), ("/storage/roms/arcade", ["arcade"]))
self.assertTrue(arcade["source_ref"].endswith("bin/advmame.sh:1-2, 6"))
def test_advancemame_devices_that_disagree_raise(self):
changed = ADVMAME_RC.replace("bios/advmame", "bios/other")
@@ -618,7 +631,7 @@ class StandaloneRecords(unittest.TestCase):
def test_every_extractor_runs_on_the_fixtures(self):
found = el.extract_launchers(tree())
self.assertEqual(len(found), 26)
self.assertEqual(len(found), 28)
class Revision(unittest.TestCase):
+1 -1
View File
@@ -289,7 +289,7 @@ class Presets(unittest.TestCase):
self.assertEqual(lists["dragon64"]["names"][-1], "dragon")
self.assertEqual(
lists["d64_1"]["source_ref"],
"xroar/rd_assets/rd_config/xroar.conf:292, xroar/component_prepare.sh:13, 15",
"xroar/rd_assets/rd_config/xroar.conf:292, xroar/component_prepare.sh:13-15",
)
def test_a_reference_to_an_unknown_romlist_raises(self):
+37 -5
View File
@@ -33,6 +33,7 @@ from common import ( # noqa: E402
system_file_index,
)
from launchers import ( # noqa: E402
SEARCHED_FILES,
bound_path,
handed_directories,
normalize_handle,
@@ -205,7 +206,38 @@ class SearchLists(unittest.TestCase):
self.assertEqual(
bind(config(passes("emu", "$roms_path/coco:$bios_path/xroar", "xroar.conf rompath")),
[], {"rompath": ""}),
{"": ("", "xroar")},
{SEARCHED_FILES: ("", "xroar")},
)
def test_a_semicolon_list_leaves_out_the_game_folder(self) -> None:
# MAME splits its search paths on semicolons (src/emu/fileio.cpp:53-58).
found = handed_directories(config(passes(
"emu", "<romDirname>;/userdata/bios/mame;/userdata/bios", "command line -rompath",
)))
self.assertEqual([h.folder for h in found], ["mame", ""])
found = handed_directories(config(passes(
"emu", "bios;<rom directory>", "command line -rp bios;<rom directory>",
)))
self.assertEqual([(h.folder, "-rp" in h.handles) for h in found], [("", True)])
def test_a_list_holding_the_files_folder_keeps_them_there(self) -> None:
# KNULLI lists bios/mame before bios: the sets at the root stay.
cfg = config(passes(
"emu", "<romDirname>;/userdata/bios/mame;/userdata/bios", "command line -rompath",
))
cfg["systems"] = {"x": {"files": [{"name": "a.rom", "destination": "mame/a.rom"}]}}
self.assertEqual(bind(cfg, [], {"-rompath": ""}), {SEARCHED_FILES: ("", "")})
# Without the root, the first folder of the BIOS tree.
cfg = config(passes("emu", "$romdir/mame;$biosdir/mame", "rompath in mame.ini"))
self.assertEqual(bind(cfg, [], {"rompath": ""}), {SEARCHED_FILES: ("", "mame")})
def test_a_whole_layout_list_holds_files_not_folders(self) -> None:
found = {SEARCHED_FILES: ("", "mame")}
self.assertEqual(bound_path("neogeo.zip", found), ("", "mame/neogeo.zip"))
self.assertIsNone(bound_path("samples/bbc.zip", found))
self.assertEqual(
bound_path("samples/bbc.zip", {**found, "samples": ("", "mame-sa/samples")}),
("", "mame-sa/samples/bbc.zip"),
)
def test_a_drive_letter_is_one_directory(self) -> None:
@@ -241,11 +273,11 @@ class PerSystem(unittest.TestCase):
POOLS = {"-rompath": ""}
def test_the_system_record_wins_for_its_system(self) -> None:
self.assertEqual(bind(self.CFG, [], self.POOLS, ("coco",)), {"": ("", "coco")})
self.assertEqual(bind(self.CFG, [], self.POOLS, ("coco",)), {SEARCHED_FILES: ("", "coco")})
def test_another_system_keeps_the_generic_record(self) -> None:
self.assertEqual(bind(self.CFG, [], self.POOLS, ("dragon32",)), {"": ("", "dragon")})
self.assertEqual(bind(self.CFG, [], self.POOLS), {"": ("", "dragon")})
self.assertEqual(bind(self.CFG, [], self.POOLS, ("dragon32",)), {SEARCHED_FILES: ("", "dragon")})
self.assertEqual(bind(self.CFG, [], self.POOLS), {SEARCHED_FILES: ("", "dragon")})
def test_native_names_are_read_as_our_ids(self) -> None:
cfg = {
@@ -270,7 +302,7 @@ class PerSystem(unittest.TestCase):
[("dragon", ["dragon64"]), ("trs80coco", ["coco"])],
)
self.assertEqual(bind(cfg, [], self.POOLS | {"-rompath": ""}, ("coco",)),
{"": ("", "trs80coco")})
{SEARCHED_FILES: ("", "trs80coco")})
self.assertEqual(bind(cfg, [], {"-rompath": ""}, ("dragon32",)), {})
def test_an_entry_is_launched_for_the_system_that_declares_its_name(self) -> None: