commit 67f387b5a47118fed433c2a164353b67df1b2380 Author: XargonWan Date: Mon Mar 14 12:01:23 2022 +0100 First upload diff --git a/es_input.cfg b/es_input.cfg new file mode 100644 index 00000000..28efc546 --- /dev/null +++ b/es_input.cfg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/es_settings.cfg b/es_settings.cfg new file mode 100644 index 00000000..0e05a386 --- /dev/null +++ b/es_settings.cfg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/es_systems.cfg b/es_systems.cfg new file mode 100644 index 00000000..4393dab7 --- /dev/null +++ b/es_systems.cfg @@ -0,0 +1,2168 @@ + + + + 3do + 3DO + Panasonic + 1993 + console + ~/retrodeck/storage/roms/3do + .iso .ISO .bin .BIN .chd .CHD .cue .CUE + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + 3do + 3do + + + + opera + + + + + + amiga + Amiga + Commodore + 1985 + computer + ~/retrodeck/storage/roms/amiga + .zip .ZIP .adf .ADF .uae .UAE .ipf .IPF .dms .DMS .adz .ADZ .lha .LHA .m3u .M3U .hdf .HDF .hdz .HDZ + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + amiga + amiga + + + + puae + uae4arm + + + + + AMIBERRY + + + + + + amigacd32 + Amiga CD32 + Commodore + 1994 + console + ~/retrodeck/storage/roms/amigacd32 + .iso .ISO .cue .CUE .lha .LHA .chd .CHD + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + amigacd32 + amigacd32 + + + + puae + uae4arm + + + + + + amstradcpc + Amstrad CPC + Amstrad + 1984 + computer + ~/retrodeck/storage/roms/amstradcpc + .dsk .DSK .sna .SNA .tap .TAP .cdt .CDT .kcr .KCR .voc .VOC .m3u .M3U .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + amstradcpc + amstradcpc + + + + crocods + cap32 + + + + + + arcade + Arcade + Arcade + arcade + ~/retrodeck/storage/roms/arcade + .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + arcade + arcade + + + + mame2003_plus + mame2000 + mame2010 + mame2015 + mame + fbneo + fbalpha2012 + fbalpha2019 + + + + + AdvanceMame + + + + + + atari2600 + Atari 2600 + Atari + 1977 + console + ~/retrodeck/storage/roms/atari2600 + .a26 .A26 .bin .BIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + atari2600 + atari2600 + + + + stella + stella2014 + + + + + + atari5200 + Atari 5200 + Atari + 1982 + console + ~/retrodeck/storage/roms/atari5200 + .rom .ROM .xfd .XFD .atr .ATR .atx .ATX .cdm .CDM .cas .CAS .car .CAR .bin .BIN .a52 .A52 .xex .XEX .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + atari5200 + atari5200 + + + + atari800 + + + + + + atari7800 + Atari 7800 + Atari + 1986 + console + ~/retrodeck/storage/roms/atari7800 + .a78 .A78 .bin .BIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + atari7800 + atari7800 + + + + prosystem + + + + + + atari800 + Atari 800 + Atari + 1979 + console + ~/retrodeck/storage/roms/atari800 + .rom .ROM .xfd .XFD .atr .ATR .atx .ATX .cdm .CDM .cas .CAS .car .CAR .bin .BIN .a52 .A52 .xex .XEX .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + atari800 + atari800 + + + + atari800 + + + + + + atarist + Atari ST + Atari + 1985 + computer + ~/retrodeck/storage/roms/atarist + .st .ST .msa .MSA .stx .STX .dim .DIM .ipf .IPF .m3u .M3U .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + atarist + atarist + + + + hatari + + + + + HATARISA + + + + + + atomiswave + Atomiswave + Sammy + 2003 + arcade + ~/retrodeck/storage/roms/atomiswave + .lst .LST .bin .BIN .dat .DAT .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + atomiswave arcade + atomiswave + + + + flycast + + + + + flycast + + + + + + channelf + Channel F + Fairchild + 1976 + console + ~/retrodeck/storage/roms/channelf + .bin .BIN .chf .CHF .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + channelf + channelf + + + + freechaf + + + + + + colecovision + ColecoVision + Coleco + 1982 + console + ~/retrodeck/storage/roms/coleco + .bin .BIN .col .COL .rom .ROM .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + colecovision + colecovision + + + + bluemsx + gearcoleco + smsplus + + + + + + c128 + Commodore 128 + Commodore + 1985 + computer + ~/retrodeck/storage/roms/c128 + .d64 .D64 .d71 .D71 .d80 .D80 .d81 .D81 .d82 .D82 .g64 .G64 .g41 .G41 .x64 .X64 .t64 .T64 .tap .TAP .prg .PRG .p00 .P00 .crt .CRT .bin .BIN .d6z .D6Z .d7z .D7Z .d8z .D8Z .g6z .G6Z .g4z .G4Z .x6z .X6Z .cmd .CMD .m3u .M3U .vsf .VSF .nib .NIB . + .NBZ .zip .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + c128 + c128 + + + + vice_x128 + + + + + + c16 + Commodore 16 + Commodore + 1984 + computer + ~/retrodeck/storage/roms/c16 + .d64 .D64 .d71 .D71 .d80 .D80 .d81 .D81 .d82 .D82 .g64 .G64 .g41 .G41 .x64 .X64 .t64 .T64 .tap .TAP .prg .PRG .p00 .P00 .crt .CRT .bin .BIN .d6z .D6Z .d7z .D7Z .d8z .D8Z .g6z .G6Z .g4z .G4Z .x6z .X6Z .cmd .CMD .m3u .M3U .vsf .VSF .nib .NIB .nbz .NBZ .zip .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + c16 + c16 + + + + vice_xplus4 + + + + + + c64 + Commodore 64 + Commodore + 1982 + computer + ~/retrodeck/storage/roms/c64 + .d64 .D64 .d71 .D71 .d80 .D80 .d81 .D81 .d82 .D82 .g64 .G64 .g41 .G41 .x64 .X64 .t64 .T64 .tap .TAP .prg .PRG .p00 .P00 .crt .CRT .bin .BIN .d6z .D6Z .d7z .D7Z .d8z .D8Z .g6z .G6Z .g4z .G4Z .x6z .X6Z .cmd .CMD .m3u .M3U .vsf .VSF .nib .NIB .nbz .NBZ .zip .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + c64 + c64 + + + + vice_x64 + + + + + + vic20 + Commodore VIC-20 + Commodore + 1980 + computer + ~/retrodeck/storage/roms/vic20 + .20 .40 .60 .a0 .A0 .b0 .B0 .d64 .D64 .d71 .D71 .d80 .D80 .d81 .D81 .d82 .D82 .g64 .G64 .g41 .G41 .x64 .X64 .t64 .T64 .tap .TAP .prg .PRG .p00 .P00 .crt .CRT .bin .BIN .gz .GZ .d6z .D6Z .d7z .D7Z .d8z .D8Z .g6z .G6Z .g4z .G4Z .x6z .X6Z .cmd .CMD .m3u .M3U .vsf .VSF .nib .NIB .nbz .NBZ .zip .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + vic20 + vic20 + + + + vice_xvic + + + + + + laserdisc + LaserDisc + Arcade + arcade + ~/retrodeck/storage/roms/laserdisc + .daphne .DAPHNE .ld .LD + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + arcade daphne americanlasergames actionmax + laserdisc + + + + hyseus_singe + + + + + + dreamcast + Dreamcast + Sega + 1998 + console + ~/retrodeck/storage/roms/dreamcast + .cdi .CDI .gdi .GDI .chd .CHD .m3u .M3U + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + dreamcast + dreamcast + + + + flycast + + + + + flycast + + + + + + easyrpg + EasyRPG + Various + 2003 + game engine + ~/retrodeck/storage/roms/easyrpg + .zip .ZIP .easyrpg .EASYRPG .ldb .LDB + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + easyrpg + easyrpg + + + + easyrpg + + + + + + famicom + Famicom + Nintendo + 1983 + console + ~/retrodeck/storage/roms/famicom + .nes .NES .unif .UNIF .unf .UNF .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + nes + famicom + + + + fceumm + nestopia + quicknes + + + + + + fds + Famicom Disk System + Nintendo + 1986 + console + ~/retrodeck/storage/roms/fds + .fds .FDS .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + fds + fds + + + + fceumm + nestopia + quicknes + + + + + + fbn + Final Burn Neo + Arcade + arcade + ~/retrodeck/storage/roms/fbneo + .7z .zip .7Z .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + arcade + fbn + + + + fbneo + mame2003 + mame2010 + mame2015 + mame + fbalpha2012 + fbalpha2019 + + + + + + gameandwatch + Game and Watch + Nintendo + 1980 + portable + ~/retrodeck/storage/roms/gameandwatch + .mgw .MGW .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gameandwatch + gameandwatch + + + + gw + + + + + + gb + Game Boy + Nintendo + 1989 + portable + ~/retrodeck/storage/roms/gb + .gb .GB .gbc .GBC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gb + gb + + + + gambatte + sameboy + gearboy + tgbdual + mgba + vbam + + + + + mgba + vbam + + + + + + gbh + Game Boy (Hacks) + Nintendo + 1989 + portable + ~/retrodeck/storage/roms/gbh + .gb .GB .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gb + gbh + + + + gambatte + sameboy + gearboy + tgbdual + mgba + vbam + + + + + mgba + vbam + + + + + + gba + Game Boy Advance + Nintendo + 2001 + portable + ~/retrodeck/storage/roms/gba + .gba .GBA .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gba + gba + + + + mgba + gpsp + vbam + vba_next + beetle_gba + + + + + mgba + vbam + + + + + + gbah + Game Boy Advance (Hacks) + Nintendo + 2001 + portable + ~/retrodeck/storage/roms/gbah + .gba .GBA .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gba + gbah + + + + mgba + gpsp + vbam + vba_next + beetle_gba + + + + + mgba + vbam + + + + + + gbc + Game Boy Color + Nintendo + 1998 + portable + ~/retrodeck/storage/roms/gbc + .gb .GB .gbc .GBC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gbc + gbc + + + + gambatte + sameboy + gearboy + tgbdual + mgba + vbam + + + + + mgba + vbam + + + + + + gbch + Game Boy Color (Hacks) + Nintendo + 1998 + portable + ~/retrodeck/storage/roms/gbch + .gb .GB .gbc .GBC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gbc + gbch + + + + gambatte + sameboy + gearboy + tgbdual + mgba + vbam + + + + + mgba + vbam + + + + + + gamegear + Game Gear + Sega + 1990 + portable + ~/retrodeck/storage/roms/gamegear + .bin .BIN .gg .GG .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gamegear + gamegear + + + + gearsystem + genesis_plus_gx + picodrive + smsplus + + + + + + ggh + Game Gear (Hacks) + Sega + 1990 + portable + ~/retrodeck/storage/roms/gamegearh + .bin .BIN .gg .GG .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + gamegear + ggh + + + + gearsystem + genesis_plus_gx + picodrive + smsplus + + + + + + intellivision + Intellivision + Mattel + 1979 + console + ~/retrodeck/storage/roms/intellivision + .int .INT .bin .BIN .rom .ROM .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + intellivision + intellivision + + + + freeintv + + + + + + j2me + J2ME + Sun Microsystems + 2002 + portable + ~/retrodeck/storage/roms/j2me + .jar .JAR + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + j2me + j2me + + + + freej2me + + + + + + atarilynx + Lynx + Atari + 1989 + portable + ~/retrodeck/storage/roms/atarilynx + .lnx .LNX .o .O .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + atarilynx + atarilynx + + + + handy + beetle_lynx + + + + + + mame + MAME + Arcade + arcade + ~/retrodeck/storage/roms/mame + .7z .7Z .zip .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + arcade + mame + + + + mame2003_plus + mame2000 + mame2010 + mame2015 + mame + fbneo + fbalpha2012 + fbalpha2019 + + + + + AdvanceMame + + + + + + pc + MS-DOS + Microsoft + 1981 + computer + ~/retrodeck/storage/roms/dos + .com .COM .bat .BAT .exe .EXE .dosz .DOSZ + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pc + pc + + + + dosbox_pure + dosbox_svn + + + + + + snesmsu1 + MSU-1 + Nintendo + 2012 + console + ~/retrodeck/storage/roms/snesmsu1 + .smc .SMC .fig .FIG .sfc .SFC .swc .SWC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + snesmsu1 snes + snesmsu1 + + + + snes9x + beetle_supafaust + + + + + + msx + MSX + Microsoft + 1983 + computer + ~/retrodeck/storage/roms/msx + .dsk .DSK .mx1 .MX1 .mx2 .MX2 .rom .ROM .zip .ZIP .7z .7Z .M3U .m3u + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + msx + msx + + + + bluemsx + fmsx + + + + + + msx2 + MSX2 + Microsoft + 1985 + computer + ~/retrodeck/storage/roms/msx2 + .dsk .DSK .mx1 .MX1 .mx2 .MX2 .rom .ROM .zip .ZIP .7z .7Z .M3U .m3u + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + msx + msx2 + + + + bluemsx + fmsx + + + + + + naomi + Naomi + Sega + 1998 + arcade + ~/retrodeck/storage/roms/naomi + .lst .LST .bin .BIN .dat .DAT .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + naomi arcade + naomi + + + + flycast + + + + + flycast + + + + + + neogeo + Neo Geo + SNK + 1990 + console + ~/retrodeck/storage/roms/neogeo + .7z .7Z .zip .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + neogeo + neogeo + + + + fbneo + mame2003_plus + fbalpha2012 + fbalpha2019 + mame2010 + mame2015 + mame + + + + + + neocd + Neo Geo CD + SNK + 1990 + console + ~/retrodeck/storage/roms/neocd + .cue .CUE .iso .ISO .chd .CHD + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + neogeocd + neogeocd + + + + neocd + fbneo + + + + + + ngp + Neo Geo Pocket + SNK + 1998 + portable + ~/retrodeck/storage/roms/ngp + .ngc .NGC .ngp .NGP .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + ngp + ngp + + + + beetle_ngp + race + + + + + + ngpc + Neo Geo Pocket Color + SNK + 1999 + portable + ~/retrodeck/storage/roms/ngpc + .ngc .NGC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + ngpc + ngpc + + + + beetle_ngp + race + + + + + + n64 + Nintendo 64 + Nintendo + 1996 + console + ~/retrodeck/storage/roms/n64 + .z64 .Z64 .n64 .N64 .v64 .V64 .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + n64 + n64 + + + + parallel_n64 + parallel_n64_gln64 + mupen64plus + mupen64plus_next + + + + + parallel_n64 + parallel_n64_gln64 + + + + + m64p_gl64mk2 + m64p_rice + + + + + + nds + Nintendo DS + Nintendo + 2005 + portable + ~/retrodeck/storage/roms/nds + .nds .zip .NDS .ZIP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + nds + nds + + + + drastic + + + + + + nes + Nintendo Entertainment System + Nintendo + 1985 + console + ~/retrodeck/storage/roms/nes + .nes .NES .unif .UNIF .unf .UNF .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + nes + nes + + + + fceumm + nestopia + quicknes + + + + + + nesh + Nintendo Entertainment System (Hacks) + Nintendo + 1985 + console + ~/retrodeck/storage/roms/nesh + .nes .NES .unif .UNIF .unf .UNF .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + nes + nesh + + + + fceumm + nestopia + quicknes + + + + + + odyssey2 + Odyssey² + Magnavox + 1979 + console + ~/retrodeck/storage/roms/odyssey + .bin .BIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + odyssey2 + odyssey2 + + + + o2em + + + + + + openbor + OpenBOR + Various + 2008 + game engine + ~/retrodeck/storage/roms/openbor + .pak .PAK + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + openbor + openbor + + + + OPENBOR + + + + + + pc-8800 + PC-8800 + NEC + 1981 + computer + ~/retrodeck/storage/roms/pc88 + .d88 .D88 .m3u .M3U + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pc88 + pc88 + + + + quasi88 + + + + + + pc-9800 + PC-9800 + NEC + 1983 + computer + ~/retrodeck/storage/roms/pc98 + .d98 .zip .98d .fdi .fdd .2hd .tfd .d88 .88d .hdm .xdf .dup .hdi .thd .nhd .hdd .hdn + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pc98 + pc98 + + + + np2kai + nekop2 + + + + + + pcengine + PC Engine + NEC + 1987 + console + ~/retrodeck/storage/roms/pcengine + .pce .PCE .bin .BIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pcengine + pcengine + + + + beetle_pce_fast + beetle_supergrafx + + + + + + pcenginecd + PC Engine CD + NEC + 1988 + console + ~/retrodeck/storage/roms/pcenginecd + .cue .CUE .ccd .CCD .chd .CHD .toc .TOC .m3u .M3U + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pcenginecd + pce-cd + + + + beetle_pce_fast + beetle_supergrafx + + + + + + pcfx + PC-FX + NEC + 1994 + console + ~/retrodeck/storage/roms/pcfx + .chd .CHD .cue .CUE .ccd .CCD .toc .TOC + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pcfx + pcfx + + + + beetle_pcfx + + + + + + pico-8 + PICO-8 + Lexaloffle + 2015 + console + ~/retrodeck/storage/roms/pico-8 + .sh .p8 .png .SH .P8 .PNG + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers %CONTROLLERSCONFIG% + pico-8 + pico-8 + + + + pico8_dyn + + + + + + piece + P/ece + Aquaplus + 2001 + console + ~/retrodeck/storage/roms/piece + .pex .pfi + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + piece + piece + + + + piemu + + + + + + psx + PlayStation + Sony + 1994 + console + ~/retrodeck/storage/roms/psx + .bin .BIN .cue .CUE .img .IMG .mdf .MDF .pbp .PBP .toc .TOC .cbn .CBN .m3u .M3U .ccd .CCD .chd .CHD .iso .ISO + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + psx + psx + + + + pcsx_rearmed + duckstation + swanstation + + + + + pcsx_rearmed + swanstation + + + + + + psp + PlayStation Portable + Sony + 2004 + portable + ~/retrodeck/storage/roms/psp + .iso .ISO .cso .CSO .pbp .PBP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + psp + psp + + + + PPSSPPSDL + + + + + ppsspp + + + + + + pspminis + PSP Minis + Sony + 2004 + portable + ~/retrodeck/storage/roms/pspminis + .iso .ISO .cso .CSO .pbp .PBP + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + psp + pspminis + + + + PPSSPPSDL + + + + + ppsspp + + + + + + pokemini + Pokémon Mini + Nintendo + 2001 + portable + ~/retrodeck/storage/roms/pokemini + .min .MIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pokemini + pokemini + + + + pokemini + + + + + + homebrew + Homebrew + Various + unknown + various + ~/retrodeck/storage/roms/homebrew + .sh .SH + ~/retrodeck/usr/bin/bash %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers="%CONTROLLERSCONFIG%" + pc + homebrew + + + ports + Ports + Various + unknown + various + ~/retrodeck/storage/roms/ports + .sh .SH + ~/retrodeck/usr/bin/bash %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers="%CONTROLLERSCONFIG%" + pc + ports + + + sc-3000 + SC-3000 + Sega + 1983 + computer + ~/retrodeck/storage/roms/sc-3000 + .bin .BIN .sg .SG .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + sc-3000 + sc-3000 + + + + bluemsx + + + + + + scummvm + ScummVM + Various + 2001 + game engine + ~/retrodeck/storage/.config/scummvm/games + .sh .SH .svm .SVM .scummvm + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pc + scummvm + + + + scummvm + + + + + SCUMMVMSA + + + + + + sega32x + Sega 32X + Sega + 1994 + console + ~/retrodeck/storage/roms/sega32x + .32x .32X .smd .SMD .bin .BIN .md .MD .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + sega32x + sega32x + + + + picodrive + + + + + + segacd + Sega CD + Sega + 1991 + console + ~/retrodeck/storage/roms/segacd + .chd .CHD .cue .CUE .iso .ISO .m3u .M3U + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + segacd + segacd + + + + genesis_plus_gx + picodrive + + + + + + megacd + Sega Mega-CD + Sega + 1991 + console + ~/retrodeck/storage/roms/megacd + .chd .CHD .cue .CUE .iso .ISO .m3u .M3U + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + segacd + megacd + + + + genesis_plus_gx + picodrive + + + + + + genesis + Sega Genesis + Sega + 1989 + console + ~/retrodeck/storage/roms/genesis + .bin .BIN .gen .GEN .md .MD .sg .SG .smd .SMD .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + genesis + genesis + + + + genesis_plus_gx + genesis_plus_gx_wide + picodrive + + + + + + genh + Sega Genesis (Hacks) + Sega + 1989 + console + ~/retrodeck/storage/roms/genh + .bin .BIN .gen .GEN .md .MD .sg .SG .smd .SMD .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + genesis + genh + + + + genesis_plus_gx + genesis_plus_gx_wide + picodrive + + + + + + mastersystem + Sega Master System + Sega + 1985 + console + ~/retrodeck/storage/roms/mastersystem + .bin .BIN .sms .SMS .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + mastersystem + mastersystem + + + + gearsystem + genesis_plus_gx + picodrive + smsplus + + + + + + megadrive + Sega Mega Drive + Sega + 1990 + console + ~/retrodeck/storage/roms/megadrive + .bin .BIN .gen .GEN .md .MD .sg .SG .smd .SMD .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + megadrive + megadrive + + + + genesis_plus_gx + genesis_plus_gx_wide + picodrive + + + + + + megaduck + Mega Duck + Welback Holdings + 1993 + portable + ~/retrodeck/storage/roms/megaduck + .bin .BIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + megaduck + megaduck + + + + sameduck + + + + + + saturn + Sega Saturn + Sega + 1994 + console + ~/retrodeck/storage/roms/saturn + .cue .CUE .chd .CHD .iso .ISO + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + saturn + saturn + + + + yabasanshiro + + + + + yabasanshiro + + + + + + sg-1000 + SG-1000 + Sega + 1983 + console + ~/retrodeck/storage/roms/sg-1000 + .bin .BIN .sg .SG .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + sg-1000 + sg-1000 + + + + gearsystem + genesis_plus_gx + picodrive + + + + + + x1 + Sharp X1 + Sharp + 1982 + computer + ~/retrodeck/storage/roms/x1 + .dx1 .DX1 .2d .2D .2hd .2HD .tfd .TFD .d88 .D88 .88d .88D .hdm .HDM .xdf .XDF .dup .DUP .tap .TAP .cmd .CMD .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + x1 + x1 + + + + x1 + + + + + + zxspectrum + Sinclair ZX Spectrum + Sinclair + 1982 + computer + ~/retrodeck/storage/roms/zxspectrum + .tzx .TZX .tap .TAP .z80 .Z80 .rzx .RZX .scl .SCL .trd .TRD .dsk .DSK .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + zxspectrum + zxspectrum + + + + fuse + + + + + + zx81 + Sinclair ZX81 + Sinclair + 1981 + computer + ~/retrodeck/storage/roms/zx81 + .tzx .TZX .p .P .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + zx81 + zx81 + + + + 81 + + + + + + supergrafx + Super Grafx + NEC + 1989 + console + ~/retrodeck/storage/roms/sgfx + .pce .PCE .sgx .SGX .cue .CUE .ccd .CCD .chd .CHD .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + supergrafx + supergrafx + + + + beetle_supergrafx + + + + + + snes + Super Nintendo + Nintendo + 1991 + console + ~/retrodeck/storage/roms/snes + .smc .SMC .fig .FIG .sfc .SFC .swc .SWC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + snes + snes + + + + snes9x + snes9x2010 + snes9x2002 + snes9x2005_plus + beetle_supafaust + + + + + + snesh + Super Nintendo (Hacks) + Nintendo + 1991 + console + ~/retrodeck/storage/roms/snesh + .smc .SMC .fig .FIG .sfc .SFC .swc .SWC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + snes + snesh + + + + snes9x + snes9x2010 + snes9x2002 + snes9x2005_plus + beetle_supafaust + + + + + + sfc + Super Famicom + Nintendo + 1990 + console + ~/retrodeck/storage/roms/sfc + .smc .SMC .fig .FIG .sfc .SFC .swc .SWC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + snes + sfc + + + + snes9x + snes9x2010 + snes9x2002 + snes9x2005_plus + beetle_supafaust + + + + + + satellaview + Satellaview + Nintendo + 1995 + console + ~/retrodeck/storage/roms/satellaview + .smc .SMC .fig .FIG .bs .BS .sfc .SFC .bsx .BSX .swc .SWC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + satellaview + satellaview + + + + snes9x + snes9x2010 + snes9x2002 + snes9x2005_plus + + + + + + sufami + SuFami Turbo + Bandai + 1996 + console + ~/retrodeck/storage/roms/sufami + .st .ST .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + sufami + sufami + + + + snes9x + + + + + + solarus + Solarus + Solarus + 2020 + game engine + ~/retrodeck/storage/roms/solarus + .solarus + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + solarus + solarus + + + + solarus + + + + + + supervision + Watara Supervision + Watara + 1992 + portable + ~/retrodeck/storage/roms/supervision + .sv .SV .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + supervision + supervision + + + + potator + + + + + + tic-80 + TIC-80 + Nesbox + 2017 + computer + ~/retrodeck/storage/roms/tic-80 + .tic .TIC + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + tic80 + tic-80 + + + + tic80 + + + + + + tg16 + TurboGrafx-16 + NEC + 1989 + console + ~/retrodeck/storage/roms/tg16 + .pce .PCE .bin .BIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pcengine + tg16 + + + + beetle_pce_fast + beetle_supergrafx + + + + + + tg16cd + TurboGrafx-CD + NEC + 1989 + console + ~/retrodeck/storage/roms/tg16cd + .cue .CUE .ccd .CCD .chd .CHD .toc .TOC .m3u .M3U + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pcenginecd + tg16cd + + + + beetle_pce_fast + beetle_supergrafx + + + + + + uzebox + Uzebox + belogic + 2008 + console + ~/retrodeck/storage/roms/uzebox + .uze .UZE + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + uzebox + uzebox + + + + uzem + + + + + + vectrex + Vectrex + Milton Bradley + 1982 + console + ~/retrodeck/storage/roms/vectrex + .bin .BIN .gam .GAM .vec .VEC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + vectrex + vectrex + + + + vecx + + + + + + videopac + VideoPac + Philips + 1978 + console + ~/retrodeck/storage/roms/videopac + .bin .BIN .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + videopac + videopac + + + + o2em + + + + + + virtualboy + Virtual Boy + Nintendo + 1995 + console + ~/retrodeck/storage/roms/virtualboy + .vb .VB .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + virtualboy + virtualboy + + + + beetle_vb + + + + + + wonderswan + Wonderswan + Bandai + 1999 + portable + ~/retrodeck/storage/roms/wonderswan + .ws .WS .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + wonderswan + wonderswan + + + + beetle_wswan + + + + + + wonderswancolor + Wonderswan Color + Bandai + 2000 + portable + ~/retrodeck/storage/roms/wonderswancolor + .wsc .WSC .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + wonderswancolor + wonderswancolor + + + + beetle_wswan + + + + + + x68000 + x68000 + Sharp + 1987 + computer + ~/retrodeck/storage/roms/x68000 + .dim .DIM .img .IMG .d88 .D88 .88d .88D .hdm .HDM .dup .DUP .2hd .2HD .xdf .XDF .hdf .HDF .cmd .CMD .m3u .M3U .zip .ZIP .7z .7Z + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + x68000 + x68000 + + + + px68k + + + + + + ecwolf + Wolfenstein 3D + id Software + 1992 + game engine + ~/retrodeck/storage/roms/ecwolf + .ecwolf + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pc + ecwolf + + + + ecwolf + + + + + + doom + Doom + id Software + 1993 + game engine + ~/retrodeck/storage/roms/doom + .doom + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pc + doom + + + + gzdoom + + + + + lzdoom + + + + + prboom + + + + + + build + Build Engine + 3D Realms + 1995 + game engine + ~/retrodeck/storage/roms/build + .build + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + pc + build + + + + raze + + + + + + mplayer + MPlayer + Various + unknown + system + ~/retrodeck/storage/roms/mplayer + .mp4 .MP4 .mkv .MKV .avi .AVI .mov .MOV .wmv .WMV .m3u .M3U .mpg .MPG .ytb .YTB .twi .TWI .sh .SH + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform %SYSTEM% --emulator %EMULATOR% --core %CORE% --controllers "%CONTROLLERSCONFIG%" + mplayer + mplayer + + + + mpv + + + + + + tools +  Tools + Various + unknown + system + ~/retrodeck/storage/.config/distribution/modules + .sh + ~/retrodeck/usr/bin/runemu.py --rom %ROM% --platform tools --controllers "%CONTROLLERSCONFIG%" + tools + tools + + + Screenshots + imageviewer + Various + unknown + system + /roms/screenshots + .jpg .jpeg .png .bmp .psd .tga .gif .hdr .pic .ppm .pgm .mkv .pdf .mp4 .avi + ~/retrodeck/usr/bin/true + imageviewer + imageviewer + + diff --git a/export_func.sh b/export_func.sh new file mode 100755 index 00000000..691e462e --- /dev/null +++ b/export_func.sh @@ -0,0 +1,195 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) +# Copyright (C) 2020-present Fewtarius + +# This content was taken from 99-distribution.conf and made as a shell script for steam deck +# TODO: remove absolute paths and put the variables INSTALL_DIR + +export PATH="$PATH:/usr/local/bin:/usr/bin:/storage/bin" + +export SDL_GAMECONTROLLERCONFIG_FILE="~/retrodeck/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt" + +EE_DIR="~/retrodeck/storage/.config/distribution" +EE_CONF="${EE_DIR}/configs/distribution.conf" +ES_CONF="~/retrodeck/storage/.emulationstation/es_settings.cfg" +EE_DEVICE=$(cat ~/retrodeck/storage/.config/.OS_ARCH) +JSLISTENCONF="~/retrodeck/storage/.config/distribution/configs/jslisten.cfg" + +get_ee_setting() { +# Argument $1 is the setting name, EmuELEC settings alway start with ee_ e.g. ee_novideo +# Usage: get_ee_setting setting [platform] [rom] +# Only the setting argument is required +# Priority is: GAME, PLATFORM, GLOBAL, EE_SETTING if at any point one returns 0 it means its dissabled, if it returns empty it will continue onto the next one. + +SETTING="${1}" +PLATFORM="${2}" +ROM="${3}" + +#ROM +ROM=$(echo [\"${ROM}\"] | sed -e 's|\[|\\\[|g' | sed -e 's|\]|\\\]|g' | sed -e 's|(|\\\(|g' | sed -e 's|)|\\\)|g') +PAT="^${PLATFORM}${ROM}[.-]${SETTING}=(.*)" + EES=$(cat "${EE_CONF}" | grep -oE "${PAT}") + EES="${EES##*=}" + +if [ -z "${EES}" ]; then +#PLATFORM +PAT="^${PLATFORM}[.-]${SETTING}=(.*)" + EES=$(cat "${EE_CONF}" | grep -oE "${PAT}") + EES="${EES##*=}" +fi + +if [ -z "${EES}" ]; then +#GLOBAL +PAT="^global[.-]${SETTING}=(.*)" + EES=$(cat "${EE_CONF}" | grep -oE "${PAT}") + EES="${EES##*=}" +fi + +if [ -z "${EES}" ]; then +#EE_SETTINGS +PAT="^${SETTING}=(.*)" + EES=$(cat "${EE_CONF}" | grep -oE "${PAT}") + EES="${EES##*=}" +fi + +echo "${EES}" +} + +set_ee_setting() { +# argument $1 is the setting name e.g. nes.integerscale. $2 is the value, e.g "1" + sed -i "/$1=/d" "${EE_CONF}" + [ $2 == "disable" ] && echo "#${1}=" >> "${EE_CONF}" || echo "${1}=${2}" >> "${EE_CONF}" +} + +get_es_setting() { + echo $(sed -n "s|\s*<${1} name=\"${2}\" value=\"\(.*\)\" />|\1|p" ${ES_CONF}) +} + + +normperf() { + # A foo function as in steam deck is not needed, however sometime it's called and I am lazy to edit everything, sorry -Xargon + return +} + +maxperf() { + # A foo function as in steam deck is not needed, however sometime it's called and I am lazy to edit everything, sorry -Xargon + return +} + + +ee_check_bios() { + +PLATFORM="${1}" +CORE="${2}" +EMULATOR="${3}" +ROMNAME="${4}" +LOG="${5}" + +if [[ -z "$LOG" ]]; then + LOG="/tmp/logs/exec.log" + cat /etc/motd > "$LOG" +fi + +MISSINGBIOS="$(batocera-systems --strictfilter ${PLATFORM})" +if [ "$?" == "2" ]; then + +# formating so it looks nice :) +PLATFORMNAME="${MISSINGBIOS##*>}" # read from -P onwards +PLATFORMNAME="${PLATFORMNAME%%MISSING*}" # until a space is found +PLATFORMNAME=$(echo $PLATFORMNAME | sed -e 's/\\n//g') + +if [[ -f "${LOG}" ]]; then +echo "${CORE} ${EMULATOR} ${ROMNAME}" >> $LOG +echo "${PLATFORMNAME} missing BIOS - Could not find all BIOS: " >> $LOG +echo "please make sure you copied the files into the corresponding folder " >> $LOG +echo "${MISSINGBIOS}" >> $LOG +fi + MISSINGBIOS=$(echo "$MISSINGBIOS" | sed -e 's/$/\\n/g') + + /usr/bin/error.sh "${PLATFORMNAME} missing BIOS" "Could not find all BIOS/files in /storage/roms, the game may not work:\n\n ${MISSINGBIOS}\n\nPlease make sure you copied the files into the corresponding folder." + error_process="$!" + pkill -P $error_process +fi +} + +message_stream () { + local MESSAGE=$1 + local DELAY=$2 + local LOADBUFFER=0 + local ANSI=0 + for (( i=0; i<${#MESSAGE}; i++ )) + do + CHAR="${MESSAGE:$i:1}" + # Is this an escape character? + if [ "${CHAR}" == "\\" ] + then + LOADBUFFER=1 + BUFFER="$BUFFER${CHAR}" + continue + fi + + # Is this ANSI? (\e[*[a-Z]) + if [ "${BUFFER}" == "\e[" ] && [ "${LOADBUFFER}" -eq 1 ] + then + ANSI=1 + BUFFER="$BUFFER${CHAR}" + continue + fi + + if [ "${LOADBUFFER}" -eq 1 ] && [ "${ANSI}" -eq 1 ] + then + # If it isn't ANSI it's a control char like \n + if [[ "${CHAR}" =~ [a-Z] ]] + then + echo -ne "${BUFFER}${CHAR}" >/dev/console + unset BUFFER + LOADBUFFER=0 + ANSI=0 + fi + else + # otherwise it's text + echo -ne "${BUFFER}${CHAR}" >/dev/console + unset BUFFER + LOADBUFFER=0 + ANSI=0 + fi + sleep ${DELAY} + done +} + +spinny_cursor() { + message_stream "$1" 0 + for (( c=0; c<=$2; c++ )) + do + echo -ne '\e[2D' '-' > /dev/console + sleep .01 + echo -ne '\e[2D' '\\' > /dev/console + sleep .01 + echo -ne '\e[2D' '|' > /dev/console + sleep .01 + echo -ne '\e[2D' '/' > /dev/console + sleep .01 + done + echo -ne '\e[80D\e[K' > /dev/console +} + +jslisten() { + # A foo function as in steam deck is not needed, however sometime it's called and I am lazy to edit everything, sorry -Xargon + return +} + + +# 351EDECK specific code + +export -f get_ee_setting +export -f set_ee_setting +export -f get_es_setting +export -f maxperf +export -f normperf +export -f ee_check_bios +export -f message_stream +export -f spinny_cursor +#export -f jslisten +#export -f init_port diff --git a/install-retrodeck.sh b/install-retrodeck.sh new file mode 100755 index 00000000..9982b7a6 --- /dev/null +++ b/install-retrodeck.sh @@ -0,0 +1,248 @@ +#!/bin/bash + +INSTALL_DIR=~/retrodeck +CORES_LINK=https://buildbot.libretro.com/stable/1.10.1/linux/x86_64/RetroArch_cores.7z +PREVIOUS_DIR=$PWD + +echo "Welcome to the RetroDECK installer." +echo "RetroDECK will be installed in $INSTALL_DIR." + +# TODO-MAYBE: give the option to change the installation directory? + +echo "WARNING: RetroDECK will replace your retroarch.cfg, the former one will be renamed moved in ~/.config/retroarch/retroarch.cfg.bak." +echo "Whenever a choice is prompted just accept it to continue (yes/enter), root password will be asked." +# but maybe it will not affect the original retroarch, let's see +# maybe --root option of pacman may be useful to install my own copy of retroarch without messing the one already installed +read -n 1 -r -s -p $'Press enter to continue...\n' +echo "Installing RetroDECK in $INSTALL_DIR, please stand by." + +cd $INSTALL_DIR + +# TODO: download everything from retrodeck github +# git clone --recursive https://github.com/XargonWan/RetroDECK retrodeck + +# Initalizing rom folders +if [ test ! -d "$INSTALL_DIR/storage/roms/" ]; then + mkdir -p $INSTALL_DIR/storage/roms/ +fi +if [ test ! -d "$INSTALL_DIR/roms" ]; then + ln -s $INSTALL_DIR/storage/roms $INSTALL_DIR/roms +fi +mkdir -p $INSTALL_DIR/roms/3do +mkdir -p $INSTALL_DIR/roms/amiga +mkdir -p $INSTALL_DIR/roms/amigacd32 +mkdir -p $INSTALL_DIR/roms/amstradcpc +mkdir -p $INSTALL_DIR/roms/arcade +mkdir -p $INSTALL_DIR/roms/atari2600 +mkdir -p $INSTALL_DIR/roms/atari5200 +mkdir -p $INSTALL_DIR/roms/atari7800 +mkdir -p $INSTALL_DIR/roms/atarist +mkdir -p $INSTALL_DIR/roms/atari800 +mkdir -p $INSTALL_DIR/roms/atomiswave +mkdir -p $INSTALL_DIR/roms/channelf +mkdir -p $INSTALL_DIR/roms/colecovision +mkdir -p $INSTALL_DIR/roms/c64 +mkdir -p $INSTALL_DIR/roms/c128 +mkdir -p $INSTALL_DIR/roms/vic20 +mkdir -p $INSTALL_DIR/roms/laserdisc +mkdir -p $INSTALL_DIR/roms/dreamcast +mkdir -p $INSTALL_DIR/roms/easyrpg +mkdir -p $INSTALL_DIR/roms/famicom +mkdir -p $INSTALL_DIR/roms/fbn +mkdir -p $INSTALL_DIR/roms/gb +mkdir -p $INSTALL_DIR/roms/gbh +mkdir -p $INSTALL_DIR/roms/gameandwatch +mkdir -p $INSTALL_DIR/roms/gba +mkdir -p $INSTALL_DIR/roms/fds +mkdir -p $INSTALL_DIR/roms/c16 +mkdir -p $INSTALL_DIR/roms/ggh +mkdir -p $INSTALL_DIR/roms/gbah +mkdir -p $INSTALL_DIR/roms/intellivision +mkdir -p $INSTALL_DIR/roms/gbch +mkdir -p $INSTALL_DIR/roms/atarilynx +mkdir -p $INSTALL_DIR/roms/mame +mkdir -p $INSTALL_DIR/roms/dos +mkdir -p $INSTALL_DIR/roms/snesmsu1 +mkdir -p $INSTALL_DIR/roms/msx +mkdir -p $INSTALL_DIR/roms/msx2 +mkdir -p $INSTALL_DIR/roms/naomi +mkdir -p $INSTALL_DIR/roms/neogeo +mkdir -p $INSTALL_DIR/roms/ngp +mkdir -p $INSTALL_DIR/roms/nds +mkdir -p $INSTALL_DIR/roms/n64 +mkdir -p $INSTALL_DIR/roms/nes +mkdir -p $INSTALL_DIR/roms/nesh +mkdir -p $INSTALL_DIR/roms/ngpc +mkdir -p $INSTALL_DIR/roms/neocd +mkdir -p $INSTALL_DIR/roms/pc-9800 +mkdir -p $INSTALL_DIR/roms/pcengine +mkdir -p $INSTALL_DIR/roms/pcenginecd +mkdir -p $INSTALL_DIR/roms/pcfx +mkdir -p $INSTALL_DIR/roms/openbor +mkdir -p $INSTALL_DIR/roms/piece +mkdir -p $INSTALL_DIR/roms/odyssey2 +mkdir -p $INSTALL_DIR/roms/psp +mkdir -p $INSTALL_DIR/roms/pspminis +mkdir -p $INSTALL_DIR/roms/pokemini +mkdir -p $INSTALL_DIR/roms/homebrew +mkdir -p $INSTALL_DIR/roms/ports +mkdir -p $INSTALL_DIR/roms/sc-3000 +mkdir -p $INSTALL_DIR/roms/scummvm +mkdir -p $INSTALL_DIR/roms/psx +mkdir -p $INSTALL_DIR/roms/segacd +mkdir -p $INSTALL_DIR/roms/sega32x +mkdir -p $INSTALL_DIR/roms/genesis +mkdir -p $INSTALL_DIR/roms/genh +mkdir -p $INSTALL_DIR/roms/mastersystem +mkdir -p $INSTALL_DIR/roms/megadrive +mkdir -p $INSTALL_DIR/roms/megaduck +mkdir -p $INSTALL_DIR/roms/saturn +mkdir -p $INSTALL_DIR/roms/sg-1000 +mkdir -p $INSTALL_DIR/roms/x1 +mkdir -p $INSTALL_DIR/roms/zxspectrum +mkdir -p $INSTALL_DIR/roms/zx81 +mkdir -p $INSTALL_DIR/roms/pc-8800 +mkdir -p $INSTALL_DIR/roms/snes +mkdir -p $INSTALL_DIR/roms/supergrafx +mkdir -p $INSTALL_DIR/roms/pico-8 +mkdir -p $INSTALL_DIR/roms/megacd +mkdir -p $INSTALL_DIR/roms/snesh +mkdir -p $INSTALL_DIR/roms/satellaview +mkdir -p $INSTALL_DIR/roms/sfc +mkdir -p $INSTALL_DIR/roms/sufami +mkdir -p $INSTALL_DIR/roms/tic-80 +mkdir -p $INSTALL_DIR/roms/tg16 +mkdir -p $INSTALL_DIR/roms/solarus +mkdir -p $INSTALL_DIR/roms/vectrex +mkdir -p $INSTALL_DIR/roms/gbc +mkdir -p $INSTALL_DIR/roms/videopac +mkdir -p $INSTALL_DIR/roms/virtualboy +mkdir -p $INSTALL_DIR/roms/wonderswan +mkdir -p $INSTALL_DIR/roms/wonderswancolor +mkdir -p $INSTALL_DIR/roms/ecwolf +mkdir -p $INSTALL_DIR/roms/x68000 +mkdir -p $INSTALL_DIR/roms/build +mkdir -p $INSTALL_DIR/roms/tools +mkdir -p $INSTALL_DIR/roms/imageviewer +mkdir -p $INSTALL_DIR/roms/gamegear +mkdir -p $INSTALL_DIR/roms/tg16cd +mkdir -p $INSTALL_DIR/roms/j2me +mkdir -p $INSTALL_DIR/roms/uzebox +mkdir -p $INSTALL_DIR/roms/supervision +mkdir -p $INSTALL_DIR/roms/doom + +# Initializing directories +mkdir -p $INSTALL_DIR/storage/.config/ +mkdir -p $INSTALL_DIR/usr/ +mkdir -p $INSTALL_DIR/emulators +ln -s $INSTALL_DIR/emulationstation ~/.emulationstation + + +# Defining architecture +rm -f $INSTALL_DIR/storage/.config/.OS_ARCH +touch $INSTALL_DIR/storage/.config/.OS_ARCH +echo "DECK" >> $INSTALL_DIR/storage/.config/.OS_ARCH + +# Installing RetroArch +sudo pacman -S retroarch +# Setting up RetroArch +mkdir -p ~/.config/retroarch/ +mv ~/.config/retroarch/retroarch.cfg ~/.config/retroarch/retroarch.cfg.bak +mv $INSTALL_DIR/retroarch.cfg ~/.config/retroarch/ +# TODO: download controller config + +# Installing libretro cores +cd $INSTALL_DIR/emulators + +if test -f "$INSTALL_DIR/emulators/RetroArch_cores.7z"; then + read -p "The RetroArch cores seems to be already downloaded, do you want to re-download them? [Y/n]: " -n 1 -r + if [[ ! $REPLY =~ ^[Nn]$ ]]; then + break + else + rm -rf RetroArch* + wget $CORES_LINK + fi +else + wget $CORES_LINK +fi + +7z x RetroArch_cores.7z +mv $INSTALL_DIR/emulators/RetroArch-Linux-x86_64/RetroArch-Linux-x86_64.AppImage.home/.config/retroarch/cores $INSTALL_DIR/emulators/ + +# TODO: Installing standalone emulators + +# Installing 351elec-emulationstation +cd $INSTALL_DIR +git clone --recursive https://github.com/351ELEC/351elec-emulationstation emulationstation +cd emulationstation +sudo pacman -S base-devel cmake freeimage sdl2_mixer sdl2 rapidjson boost +cmake -DENABLE_EMUELEC=1 -DGLES2=0 -DDISABLE_KODI=1 -DENABLE_FILEMANAGER=0 -DCEC=0 -DRG552=1 +make -j$(nproc) +cp $INSTALL_DIR/es_systems.cfg $INSTALL_DIR/emulationstation/ +cp $INSTALL_DIR/es_settings.cfg $INSTALL_DIR/emulationstation/ +cp $INSTALL_DIR/es_input.cfg $INSTALL_DIR/emulationstation/ + +# Installing default theme +mkdir -p $INSTALL_DIR/emulationstation/themes +cd $INSTALL_DIR/emulationstation/themes +git clone --recursive https://github.com/anthonycaccese/es-theme-art-book-next + + +# Downloading needed files +# TODO 351elec-es-packages batocera-config batocera-scraper batocera-settings runemu.py setsettings.py + +# Creating desktop element +rm -f ~/Desktop/RetroDECK.desktop +touch ~/Desktop/RetroDECK.desktop +cat << EOF >> ~/Desktop/RetroDECK.desktop +[Desktop Entry] +Comment=An enbedded emulation system. +Exec=$INSTALL_DIR/retrodeck.sh +GenericName=RetroDECK +Icon=$INSTALL_DIR/res/icon128.png +MimeType= +Name=RetroDECK +Path=$INSTALL_DIR/ +StartupNotify=true +Terminal=false +TerminalOptions= +Type=Application +X-DBUS-ServiceName= +X-DBUS-StartupType= +X-KDE-SubstituteUID=false +X-KDE-Username= +EOF + +# Creating start script +rm -rf $INSTALL_DIR/retrodeck.sh +touch $INSTALL_DIR/retrodeck.sh +cat << EOF >> $INSTALL_DIR/retrodeck.sh +#!/bin/bash + +$INSTALL_DIR/export_func.sh + +mkdir -p /tmp/logs + +if [ test -d "/tmp/cores" ]; then break +else + ln -s $INSTALL_DIR/emulators/cores /tmp/cores +fi + +$INSTALL_DIR/emulationstation/emulationstation +EOF + +chmod 777 $INSTALL_DIR/retrodeck.sh +chmod 777 $INSTALL_DIR/export_func.sh + +# Cleaning up +# TODO: these removal must be made when I am sure tghis file is safe on github +#rm -rf $INSTALL_DIR/emulators/RetroArch-Linux-x86_64 +#rm -rf $INSTALL_DIR/emulators/RetroArch_cores.7z +#rm $INSTALL_DIR/es_systems.cfg $INSTALL_DIR/emulationstation/ +#rm $INSTALL_DIR/es_settings.cfg $INSTALL_DIR/emulationstation/ +#rm $INSTALL_DIR/es_input.cfg $INSTALL_DIR/emulationstation/ + +echo "Installation terminated, you can run RetroDECK from the desktop link or add it on your Steam Library." +# TODO: maybe I can add it to the steam library directly, I think I have to close steam and design a banner + +cd $PREVIOUS_DIR diff --git a/res/icon128.png b/res/icon128.png new file mode 100644 index 00000000..0564c245 Binary files /dev/null and b/res/icon128.png differ diff --git a/res/logo.png b/res/logo.png new file mode 100644 index 00000000..3e839d33 Binary files /dev/null and b/res/logo.png differ diff --git a/storage/.config/distribution/configs/distribution.conf b/storage/.config/distribution/configs/distribution.conf new file mode 100644 index 00000000..daa9ff97 --- /dev/null +++ b/storage/.config/distribution/configs/distribution.conf @@ -0,0 +1,232 @@ +## ------------ A - 351ELEC configuration ------------ # + +## Enable D-Pad to analogue at boot until we create a proper toggle +global.analogue=1 + +## Enable SSH at boot +ee_ssh.enabled=1 + +## Enable SAMBA at boot +ee_samba.enabled=1 + +## Enable Bluetooth at boot +ee_bluetooth.enabled=0 + +## Use maxperf, enable max settings for GPU and performance governer, this setting can be set globally, per platform or per game on the ES menu +global.maxperf=0 + +## Always show boot video +#ee_bootvideo.enabled=0 + +## Set video mode +ee_videomode=720p60hz + +## What to start at boot Emulationstation or Retroarch +ee_boot=Emulationstation + +## Enable splash screens +ee_splash.enabled=0 + +## set to 1 if you have long loading times after quitting a game, you will lose sound mixing in ES, this only affects S905/S912 devices as all others use alsa. +#ee_alsa.always=0 + +## Force splash screens to display for X seconds +#ee_splash.delay=0 + +## Some external HDDs take longer to mount than ES to load, if your external ROMS do not mount in time, increase this timer +#ee_load.delay=0 + +# Enable Advance mame auto gamepad configuration 1,0 (default 1) +advmame_auto_gamepad=0 + +## EmulationStation menu style +## default -> default all options menu +## none -> no menu except the game search menu +## bartop -> less menu, only needed for bartops +#system.es.menu=default + +# ------------ B - Network ------------ # +## Set system hostname +system.hostname=351ELEC +## Activate wifi (0,1) +wifi.enabled=1 +## Wifi SSID (string) +#wifi.ssid= +## Wifi KEY (string) +## after rebooting the "new key" is replace by a hidden value "enc:xxxxx" +## you can edit the "enc:xxxxx" value to replace by a clear value, it will be updated again at the following reboot +## Escape your special chars (# ; $) with a backslash : $ => \$ +#wifi.key= + +# secondary wifi (not configurable via the user interface) +#wifi2.ssid=new ssid +#wifi2.key=new key + +# third wifi (not configurable via the user interface) +#wifi3.ssid=new ssid +#wifi3.key=new key + +# ------------ C - Audio ------------ # +## Set the audio device (auto, hdmi, jack, speakers, headphones) mostly for OdroidGoAdvance +## Set system volume (0..100) +## Enable or disable system sounds in ES (0,1) +audio.bgmusic=1 + +# -------------- D - Controllers ----------------- # +# Enable support for standard bluetooth controllers +controllers.bluetooth.enabled=1 + +# ------------ F - Language and keyboard ------------ # +## Set the language of the system (fr_FR,en_US,en_GB,de_DE,pt_BR,es_ES,it_IT,eu_ES,tr_TR,zh_CN) +system.language=en_US +## Set you local time +## Select your timezone from : ls /usr/share/zoneinfo/ (string) +system.timezone=Europe/London + +# ------------ G - UPDATES ------------ # +## Automatically check for updates at start (0,1) +updates.enabled=1 +updates.type=release + +# fan profile - controls fan speed (values: default/performance/quiet) +# Not used for DECK +# fan.profile=default + +# ------------ H - HERE IT IS - GLOBAL EMULATOR CONFIGURATION ------------ # +## The global value will be used for all emulators, except if the value +## is redefined in the emulator + +## Bezel on by default +global.bezel=default + +## Retroarch menu driver, ozone (default), rgui or xmb +global.retroarch.menu_driver=ozone + +## Shader set +## Automatically select shaders for all systems +## (none, retro, scanlines) + +## Once enabled, your screen will be cropped, and you will have a pixel perfect image (0,1) +global.integerscale=1 + +## Set gpslp shader for all emulators (prefer shadersets above). Absolute path (string) +#global.shaders= + +## Set ratio for all emulators (auto,4/3,16/9,16/10,custom) +global.ratio=4/3 + +## Set autosave/load savestate for all emulators (0,1,2,3) +global.autosave=2 + +## Set incremental savestates for all emulators (0,1) +global.incrementalsavestates=0 + +## Set runahead frames for all emulators (0,1,2,3,4,5,6) +global.runahead=0 + +## Set secondinstance for runahead for all emulators (0,1) +global.secondinstance=0 + +## Enable retroarchievements (0,1) +## Set your www.retroachievements.org username/password +## Escape your special chars (# ; $) with a backslash : $ => \$ +global.retroachievements=1 +global.retroachievements.hardcore=0 +global.retroachievements.leaderboards=disabled +global.retroachievements.challengeindicators=0 +global.retroachievements.richpresence=0 +global.retroachievements.testunofficial=0 +global.retroachievements.soundenable=0 +global.retroachievements.verbose=0 +global.retroachievements.screenshot=1 +global.retroachievements.username= +global.retroachievements.password= + +## Enable RetroArch AI game translation service +#global.ai_service_enabled=0 +#global.ai_service_url= +#global.ai_target_lang= + +## Configurations generated by Emulationstation +audio.display_titles=1 +audio.persystem=0 +global.netplay=0 +global.netplay.port=55435 +global.netplay.relay=none +audio.device=headphone +audio.volume=75 +brightness.level=50 +system.brightness=50 + +## Device Overclock +overclock=0 + +# ------------ I - EMULATORS CHOICES ----------- # +## You can override the global configuration here +## Here is the snes example +#snes.shaders=mysnesshader.gplsp + +3do.maxperf=1 +3do.rewind=0 +arcade.maxperf=1 +arcade.autosave=0 +atari2600.ratio=squarepixel +atarilynx.ratio=squarepixel +atarilynx.shaderset=handheld/lcd3x.glslp +atomiswave.maxperf=1 +dreamcast.maxperf=1 +fbn.ratio=squarepixel +gamegear.bezel.overlay.grid=1 +gamegear.bezel.overlay.shadow=1 +gamegear.ratio=squarepixel +gb.bezel.overlay.grid=1 +gb.bezel.overlay.shadow=1 +gb.ratio=squarepixel +gba.ratio=squarepixel +gba.shaderset=handheld/lcd3x.glslp +gbah.ratio=squarepixel +gbah.shaderset=handheld/lcd3x.glslp +gbc.bezel.overlay.grid=1 +gbc.bezel.overlay.shadow=1 +gbc.ratio=squarepixel +gbch.bezel.overlay.grid=1 +gbch.bezel.overlay.shadow=1 +gbch.ratio=squarepixel +gbh.bezel.overlay.grid=1 +gbh.bezel.overlay.shadow=1 +gbh.ratio=squarepixel +ggh.bezel.overlay.grid=1 +ggh.bezel.overlay.shadow=1 +ggh.ratio=squarepixel +j2me.maxperf=1 +megadrive.ratio=squarepixel +mame.autosave=0 +mame.maxperf=1 +n64.maxperf=1 +nds.maxperf=1 +naomi.maxperf=1 +ngp.ratio=squarepixel +ngp.shaderset=handheld/lcd3x.glslp +ngpc.ratio=squarepixel +ngpc.shaderset=handheld/lcd3x.glslp +pc.maxperf=1 +pcfx.maxperf=1 +pokemini.ratio=3/2 +psp.maxperf=1 +psp.ratio=squarepixel +pspminis.maxperf=1 +pspminis.ratio=squarepixel +psx.integerscaleoverscale=1 +saturn.ratio=squarepixel +segacd.ratio=squarepixel +supervision.bezel.overlay.grid=1 +supervision.bezel.overlay.shadow=1 +supervision.ratio=squarepixel +uzebox.integerscale=1 +vectrex.ratio=3/4 +virtualboy.maxperf=1 +virtualboy.ratio=squarepixel +wonderswan.ratio=squarepixel +wonderswan.shaderset=handheld/lcd3x.glslp +wonderswancolor.ratio=squarepixel +wonderswancolor.shaderset=handheld/lcd3x.glslp \ No newline at end of file diff --git a/storage/.config/retroarch/retroarch.cfg b/storage/.config/retroarch/retroarch.cfg new file mode 100644 index 00000000..9e8195fa --- /dev/null +++ b/storage/.config/retroarch/retroarch.cfg @@ -0,0 +1,3195 @@ +accessibility_enable = "false" +accessibility_narrator_speech_speed = "5" +ai_service_enable = "false" +ai_service_mode = "1" +ai_service_pause = "false" +ai_service_source_lang = "0" +ai_service_target_lang = "0" +ai_service_url = "http://localhost:4404/" +all_users_control_menu = "false" +apply_cheats_after_load = "false" +apply_cheats_after_toggle = "false" +aspect_ratio_index = "21" +assets_directory = "/usr/share/retroarch/assets" +audio_block_frames = "0" +audio_device = "" +audio_driver = "pulse" +audio_dsp_plugin = "" +audio_enable = "true" +audio_enable_menu = "false" +audio_enable_menu_bgm = "false" +audio_enable_menu_cancel = "false" +audio_enable_menu_notice = "false" +audio_enable_menu_ok = "false" +audio_fastforward_mute = "false" +audio_filter_dir = "/usr/share/retroarch/filters/64bit/audio" +audio_latency = "64" +audio_max_timing_skew = "0.050000" +audio_mixer_mute_enable = "false" +audio_mixer_volume = "0.000000" +audio_mute_enable = "false" +audio_out_rate = "48000" +audio_rate_control = "true" +audio_rate_control_delta = "0.005000" +audio_resampler = "sinc" +audio_resampler_quality = "3" +audio_sync = "true" +audio_volume = "0.000000" +auto_overrides_enable = "true" +auto_remaps_enable = "true" +auto_screenshot_filename = "true" +auto_shaders_enable = "true" +autosave_interval = "10" +block_sram_overwrite = "false" +bluetooth_driver = "null" +builtin_imageviewer_enable = "true" +builtin_mediaplayer_enable = "true" +bundle_assets_dst_path = "" +bundle_assets_dst_path_subdir = "" +bundle_assets_extract_enable = "false" +bundle_assets_extract_last_version = "0" +bundle_assets_extract_version_current = "0" +bundle_assets_src_path = "" +cache_directory = "" +camera_allow = "false" +camera_device = "" +camera_driver = "video4linux2" +cheat_database_path = "~/.config/retroarch/cheats" +check_firmware_before_loading = "false" +cheevos_auto_screenshot = "true" +cheevos_badges_enable = "false" +cheevos_challenge_indicators = "false" +cheevos_custom_host = "" +cheevos_enable = "true" +cheevos_hardcore_mode_enable = "false" +cheevos_leaderboards_enable = "false" +cheevos_password = "" +cheevos_richpresence_enable = "false" +cheevos_start_active = "false" +cheevos_test_unofficial = "false" +cheevos_token = "" +cheevos_unlock_sound_enable = "false" +cheevos_username = "" +cheevos_verbose_enable = "false" +config_save_on_exit = "true" +content_database_path = "~/.config/retroarch/database/rdb" +content_favorites_directory = "default" +content_favorites_path = "~/retrodeck/storage/.config/retroarch/content_favorites.lpl" +content_favorites_size = "200" +content_history_directory = "default" +content_history_path = "~/retrodeck/storage/.config/retroarch/content_history.lpl" +content_history_size = "200" +content_image_history_directory = "default" +content_image_history_path = "~/retrodeck/storage/.config/retroarch/content_image_history.lpl" +content_music_history_directory = "default" +content_music_history_path = "~/retrodeck/storage/.config/retroarch/content_music_history.lpl" +content_runtime_log = "true" +content_runtime_log_aggregate = "false" +content_show_add = "true" +content_show_add_entry = "2" +content_show_explore = "true" +content_show_favorites = "true" +content_show_history = "true" +content_show_images = "true" +content_show_music = "true" +content_show_netplay = "true" +content_show_playlists = "true" +content_show_settings = "true" +content_show_settings_password = "" +content_show_video = "true" +content_video_directory = "default" +content_video_history_path = "~/retrodeck/storage/.config/retroarch/content_video_history.lpl" +core_assets_directory = "~/.config/retroarch/downloads" +core_info_cache_enable = "false" +core_option_category_enable = "true" +core_options_path = "" +core_set_supports_no_game_enable = "true" +core_updater_auto_backup = "true" +core_updater_auto_backup_history_size = "1" +core_updater_auto_extract_archive = "true" +core_updater_buildbot_assets_url = "http://buildbot.libretro.com/assets/" +core_updater_buildbot_cores_url = "http://buildbot.libretro.com/nightly/linux/x86_64/latest/" +core_updater_show_experimental_cores = "false" +crt_switch_center_adjust = "0" +crt_switch_hires_menu = "false" +crt_switch_porch_adjust = "0" +crt_switch_resolution = "0" +crt_switch_resolution_super = "2560" +crt_switch_resolution_use_custom_refresh_rate = "false" +crt_switch_timings = "" +crt_video_refresh_rate = "60.000000" +current_resolution_id = "0" +cursor_directory = "~/.config/retroarch/database/cursors" +custom_viewport_height = "799" +custom_viewport_width = "1279" +custom_viewport_x = "1" +custom_viewport_y = "1" +desktop_menu_enable = "true" +discord_allow = "false" +discord_app_id = "475456035851599874" +driver_switch_enable = "true" +dynamic_wallpapers_directory = "default" +enable_device_vibration = "false" +facebook_stream_key = "" +fastforward_ratio = "0.000000" +filter_by_current_core = "false" +flicker_filter_enable = "false" +flicker_filter_index = "0" +fps_show = "false" +fps_update_interval = "256" +frame_time_counter_reset_after_fastforwarding = "false" +frame_time_counter_reset_after_load_state = "false" +frame_time_counter_reset_after_save_state = "false" +framecount_show = "false" +frontend_log_level = "1" +game_specific_options = "true" +gamemode_enable = "false" +gamma_correction = "0" +global_core_options = "false" +history_list_enable = "true" +input_ai_service = "nul" +input_ai_service_axis = "nul" +input_ai_service_btn = "nul" +input_ai_service_mbtn = "nul" +input_analog_deadzone = "0.000000" +input_analog_sensitivity = "1.000000" +input_audio_mute = "f9" +input_audio_mute_axis = "nul" +input_audio_mute_btn = "nul" +input_audio_mute_mbtn = "nul" +input_auto_game_focus = "0" +input_auto_mouse_grab = "false" +input_autodetect_enable = "true" +input_axis_threshold = "0.500000" +input_bind_hold = "2" +input_bind_timeout = "5" +input_cheat_index_minus = "t" +input_cheat_index_minus_axis = "nul" +input_cheat_index_minus_btn = "nul" +input_cheat_index_minus_mbtn = "nul" +input_cheat_index_plus = "y" +input_cheat_index_plus_axis = "nul" +input_cheat_index_plus_btn = "nul" +input_cheat_index_plus_mbtn = "nul" +input_cheat_toggle = "u" +input_cheat_toggle_axis = "nul" +input_cheat_toggle_btn = "nul" +input_cheat_toggle_mbtn = "nul" +input_close_content = "nul" +input_close_content_axis = "nul" +input_close_content_btn = "nul" +input_close_content_mbtn = "nul" +input_descriptor_hide_unbound = "false" +input_descriptor_label_show = "true" +input_desktop_menu_toggle = "f5" +input_desktop_menu_toggle_axis = "nul" +input_desktop_menu_toggle_btn = "nul" +input_desktop_menu_toggle_mbtn = "nul" +input_device_p1 = "0" +input_device_p10 = "0" +input_device_p11 = "0" +input_device_p12 = "0" +input_device_p13 = "0" +input_device_p14 = "0" +input_device_p15 = "0" +input_device_p16 = "0" +input_device_p2 = "0" +input_device_p3 = "0" +input_device_p4 = "0" +input_device_p5 = "0" +input_device_p6 = "0" +input_device_p7 = "0" +input_device_p8 = "0" +input_device_p9 = "0" +input_disk_eject_toggle = "nul" +input_disk_eject_toggle_axis = "nul" +input_disk_eject_toggle_btn = "nul" +input_disk_eject_toggle_mbtn = "nul" +input_disk_next = "nul" +input_disk_next_axis = "nul" +input_disk_next_btn = "nul" +input_disk_next_mbtn = "nul" +input_disk_prev = "nul" +input_disk_prev_axis = "nul" +input_disk_prev_btn = "nul" +input_disk_prev_mbtn = "nul" +input_driver = "x" +input_duty_cycle = "3" +input_enable_hotkey = "nul" +input_enable_hotkey_axis = "nul" +input_enable_hotkey_btn = "nul" +input_enable_hotkey_mbtn = "nul" +input_exit_emulator = "escape" +input_exit_emulator_axis = "nul" +input_exit_emulator_btn = "nul" +input_exit_emulator_mbtn = "nul" +input_fps_toggle = "f3" +input_fps_toggle_axis = "nul" +input_fps_toggle_btn = "nul" +input_fps_toggle_mbtn = "nul" +input_frame_advance = "k" +input_frame_advance_axis = "nul" +input_frame_advance_btn = "nul" +input_frame_advance_mbtn = "nul" +input_game_focus_toggle = "scroll_lock" +input_game_focus_toggle_axis = "nul" +input_game_focus_toggle_btn = "nul" +input_game_focus_toggle_mbtn = "nul" +input_grab_mouse_toggle = "f11" +input_grab_mouse_toggle_axis = "nul" +input_grab_mouse_toggle_btn = "nul" +input_grab_mouse_toggle_mbtn = "nul" +input_hold_fast_forward = "l" +input_hold_fast_forward_axis = "nul" +input_hold_fast_forward_btn = "nul" +input_hold_fast_forward_mbtn = "nul" +input_hold_slowmotion = "e" +input_hold_slowmotion_axis = "nul" +input_hold_slowmotion_btn = "nul" +input_hold_slowmotion_mbtn = "nul" +input_hotkey_block_delay = "5" +input_joypad_driver = "udev" +input_keyboard_layout = "" +input_libretro_device_p1 = "1" +input_libretro_device_p10 = "1" +input_libretro_device_p11 = "1" +input_libretro_device_p12 = "1" +input_libretro_device_p13 = "1" +input_libretro_device_p14 = "1" +input_libretro_device_p15 = "1" +input_libretro_device_p16 = "1" +input_libretro_device_p2 = "1" +input_libretro_device_p3 = "1" +input_libretro_device_p4 = "1" +input_libretro_device_p5 = "1" +input_libretro_device_p6 = "1" +input_libretro_device_p7 = "1" +input_libretro_device_p8 = "1" +input_libretro_device_p9 = "1" +input_load_state = "f4" +input_load_state_axis = "nul" +input_load_state_btn = "nul" +input_load_state_mbtn = "nul" +input_max_users = "5" +input_menu_toggle = "f1" +input_menu_toggle_axis = "nul" +input_menu_toggle_btn = "nul" +input_menu_toggle_gamepad_combo = "0" +input_menu_toggle_mbtn = "nul" +input_movie_record_toggle = "o" +input_movie_record_toggle_axis = "nul" +input_movie_record_toggle_btn = "nul" +input_movie_record_toggle_mbtn = "nul" +input_netplay_fade_chat_toggle = "nul" +input_netplay_fade_chat_toggle_axis = "nul" +input_netplay_fade_chat_toggle_btn = "nul" +input_netplay_fade_chat_toggle_mbtn = "nul" +input_netplay_game_watch = "i" +input_netplay_game_watch_axis = "nul" +input_netplay_game_watch_btn = "nul" +input_netplay_game_watch_mbtn = "nul" +input_netplay_host_toggle = "nul" +input_netplay_host_toggle_axis = "nul" +input_netplay_host_toggle_btn = "nul" +input_netplay_host_toggle_mbtn = "nul" +input_netplay_ping_toggle = "nul" +input_netplay_ping_toggle_axis = "nul" +input_netplay_ping_toggle_btn = "nul" +input_netplay_ping_toggle_mbtn = "nul" +input_netplay_player_chat = "tilde" +input_netplay_player_chat_axis = "nul" +input_netplay_player_chat_btn = "nul" +input_netplay_player_chat_mbtn = "nul" +input_nowinkey_enable = "false" +input_osk_toggle = "f12" +input_osk_toggle_axis = "nul" +input_osk_toggle_btn = "nul" +input_osk_toggle_mbtn = "nul" +input_overlay = "" +input_overlay_aspect_adjust_landscape = "0.000000" +input_overlay_aspect_adjust_portrait = "0.000000" +input_overlay_auto_rotate = "false" +input_overlay_auto_scale = "false" +input_overlay_behind_menu = "false" +input_overlay_enable = "false" +input_overlay_enable_autopreferred = "true" +input_overlay_hide_in_menu = "true" +input_overlay_hide_when_gamepad_connected = "false" +input_overlay_next = "nul" +input_overlay_next_axis = "nul" +input_overlay_next_btn = "nul" +input_overlay_next_mbtn = "nul" +input_overlay_opacity = "0.700000" +input_overlay_scale_landscape = "1.000000" +input_overlay_scale_portrait = "1.000000" +input_overlay_show_inputs = "2" +input_overlay_show_inputs_port = "0" +input_overlay_show_mouse_cursor = "true" +input_overlay_x_offset_landscape = "0.000000" +input_overlay_x_offset_portrait = "0.000000" +input_overlay_x_separation_landscape = "0.000000" +input_overlay_x_separation_portrait = "0.000000" +input_overlay_y_offset_landscape = "0.000000" +input_overlay_y_offset_portrait = "0.000000" +input_overlay_y_separation_landscape = "0.000000" +input_overlay_y_separation_portrait = "0.000000" +input_pause_toggle = "p" +input_pause_toggle_axis = "nul" +input_pause_toggle_btn = "nul" +input_pause_toggle_mbtn = "nul" +input_player10_a = "nul" +input_player10_a_axis = "nul" +input_player10_a_btn = "nul" +input_player10_a_mbtn = "nul" +input_player10_analog_dpad_mode = "0" +input_player10_b = "nul" +input_player10_b_axis = "nul" +input_player10_b_btn = "nul" +input_player10_b_mbtn = "nul" +input_player10_down = "nul" +input_player10_down_axis = "nul" +input_player10_down_btn = "nul" +input_player10_down_mbtn = "nul" +input_player10_gun_aux_a = "nul" +input_player10_gun_aux_a_axis = "nul" +input_player10_gun_aux_a_btn = "nul" +input_player10_gun_aux_a_mbtn = "nul" +input_player10_gun_aux_b = "nul" +input_player10_gun_aux_b_axis = "nul" +input_player10_gun_aux_b_btn = "nul" +input_player10_gun_aux_b_mbtn = "nul" +input_player10_gun_aux_c = "nul" +input_player10_gun_aux_c_axis = "nul" +input_player10_gun_aux_c_btn = "nul" +input_player10_gun_aux_c_mbtn = "nul" +input_player10_gun_dpad_down = "nul" +input_player10_gun_dpad_down_axis = "nul" +input_player10_gun_dpad_down_btn = "nul" +input_player10_gun_dpad_down_mbtn = "nul" +input_player10_gun_dpad_left = "nul" +input_player10_gun_dpad_left_axis = "nul" +input_player10_gun_dpad_left_btn = "nul" +input_player10_gun_dpad_left_mbtn = "nul" +input_player10_gun_dpad_right = "nul" +input_player10_gun_dpad_right_axis = "nul" +input_player10_gun_dpad_right_btn = "nul" +input_player10_gun_dpad_right_mbtn = "nul" +input_player10_gun_dpad_up = "nul" +input_player10_gun_dpad_up_axis = "nul" +input_player10_gun_dpad_up_btn = "nul" +input_player10_gun_dpad_up_mbtn = "nul" +input_player10_gun_offscreen_shot = "nul" +input_player10_gun_offscreen_shot_axis = "nul" +input_player10_gun_offscreen_shot_btn = "nul" +input_player10_gun_offscreen_shot_mbtn = "nul" +input_player10_gun_select = "nul" +input_player10_gun_select_axis = "nul" +input_player10_gun_select_btn = "nul" +input_player10_gun_select_mbtn = "nul" +input_player10_gun_start = "nul" +input_player10_gun_start_axis = "nul" +input_player10_gun_start_btn = "nul" +input_player10_gun_start_mbtn = "nul" +input_player10_gun_trigger = "nul" +input_player10_gun_trigger_axis = "nul" +input_player10_gun_trigger_btn = "nul" +input_player10_gun_trigger_mbtn = "1" +input_player10_joypad_index = "9" +input_player10_l = "nul" +input_player10_l2 = "nul" +input_player10_l2_axis = "nul" +input_player10_l2_btn = "nul" +input_player10_l2_mbtn = "nul" +input_player10_l3 = "nul" +input_player10_l3_axis = "nul" +input_player10_l3_btn = "nul" +input_player10_l3_mbtn = "nul" +input_player10_l_axis = "nul" +input_player10_l_btn = "nul" +input_player10_l_mbtn = "nul" +input_player10_l_x_minus = "nul" +input_player10_l_x_minus_axis = "nul" +input_player10_l_x_minus_btn = "nul" +input_player10_l_x_minus_mbtn = "nul" +input_player10_l_x_plus = "nul" +input_player10_l_x_plus_axis = "nul" +input_player10_l_x_plus_btn = "nul" +input_player10_l_x_plus_mbtn = "nul" +input_player10_l_y_minus = "nul" +input_player10_l_y_minus_axis = "nul" +input_player10_l_y_minus_btn = "nul" +input_player10_l_y_minus_mbtn = "nul" +input_player10_l_y_plus = "nul" +input_player10_l_y_plus_axis = "nul" +input_player10_l_y_plus_btn = "nul" +input_player10_l_y_plus_mbtn = "nul" +input_player10_left = "nul" +input_player10_left_axis = "nul" +input_player10_left_btn = "nul" +input_player10_left_mbtn = "nul" +input_player10_mouse_index = "9" +input_player10_r = "nul" +input_player10_r2 = "nul" +input_player10_r2_axis = "nul" +input_player10_r2_btn = "nul" +input_player10_r2_mbtn = "nul" +input_player10_r3 = "nul" +input_player10_r3_axis = "nul" +input_player10_r3_btn = "nul" +input_player10_r3_mbtn = "nul" +input_player10_r_axis = "nul" +input_player10_r_btn = "nul" +input_player10_r_mbtn = "nul" +input_player10_r_x_minus = "nul" +input_player10_r_x_minus_axis = "nul" +input_player10_r_x_minus_btn = "nul" +input_player10_r_x_minus_mbtn = "nul" +input_player10_r_x_plus = "nul" +input_player10_r_x_plus_axis = "nul" +input_player10_r_x_plus_btn = "nul" +input_player10_r_x_plus_mbtn = "nul" +input_player10_r_y_minus = "nul" +input_player10_r_y_minus_axis = "nul" +input_player10_r_y_minus_btn = "nul" +input_player10_r_y_minus_mbtn = "nul" +input_player10_r_y_plus = "nul" +input_player10_r_y_plus_axis = "nul" +input_player10_r_y_plus_btn = "nul" +input_player10_r_y_plus_mbtn = "nul" +input_player10_right = "nul" +input_player10_right_axis = "nul" +input_player10_right_btn = "nul" +input_player10_right_mbtn = "nul" +input_player10_select = "nul" +input_player10_select_axis = "nul" +input_player10_select_btn = "nul" +input_player10_select_mbtn = "nul" +input_player10_start = "nul" +input_player10_start_axis = "nul" +input_player10_start_btn = "nul" +input_player10_start_mbtn = "nul" +input_player10_turbo = "nul" +input_player10_turbo_axis = "nul" +input_player10_turbo_btn = "nul" +input_player10_turbo_mbtn = "nul" +input_player10_up = "nul" +input_player10_up_axis = "nul" +input_player10_up_btn = "nul" +input_player10_up_mbtn = "nul" +input_player10_x = "nul" +input_player10_x_axis = "nul" +input_player10_x_btn = "nul" +input_player10_x_mbtn = "nul" +input_player10_y = "nul" +input_player10_y_axis = "nul" +input_player10_y_btn = "nul" +input_player10_y_mbtn = "nul" +input_player11_a = "nul" +input_player11_a_axis = "nul" +input_player11_a_btn = "nul" +input_player11_a_mbtn = "nul" +input_player11_analog_dpad_mode = "0" +input_player11_b = "nul" +input_player11_b_axis = "nul" +input_player11_b_btn = "nul" +input_player11_b_mbtn = "nul" +input_player11_down = "nul" +input_player11_down_axis = "nul" +input_player11_down_btn = "nul" +input_player11_down_mbtn = "nul" +input_player11_gun_aux_a = "nul" +input_player11_gun_aux_a_axis = "nul" +input_player11_gun_aux_a_btn = "nul" +input_player11_gun_aux_a_mbtn = "nul" +input_player11_gun_aux_b = "nul" +input_player11_gun_aux_b_axis = "nul" +input_player11_gun_aux_b_btn = "nul" +input_player11_gun_aux_b_mbtn = "nul" +input_player11_gun_aux_c = "nul" +input_player11_gun_aux_c_axis = "nul" +input_player11_gun_aux_c_btn = "nul" +input_player11_gun_aux_c_mbtn = "nul" +input_player11_gun_dpad_down = "nul" +input_player11_gun_dpad_down_axis = "nul" +input_player11_gun_dpad_down_btn = "nul" +input_player11_gun_dpad_down_mbtn = "nul" +input_player11_gun_dpad_left = "nul" +input_player11_gun_dpad_left_axis = "nul" +input_player11_gun_dpad_left_btn = "nul" +input_player11_gun_dpad_left_mbtn = "nul" +input_player11_gun_dpad_right = "nul" +input_player11_gun_dpad_right_axis = "nul" +input_player11_gun_dpad_right_btn = "nul" +input_player11_gun_dpad_right_mbtn = "nul" +input_player11_gun_dpad_up = "nul" +input_player11_gun_dpad_up_axis = "nul" +input_player11_gun_dpad_up_btn = "nul" +input_player11_gun_dpad_up_mbtn = "nul" +input_player11_gun_offscreen_shot = "nul" +input_player11_gun_offscreen_shot_axis = "nul" +input_player11_gun_offscreen_shot_btn = "nul" +input_player11_gun_offscreen_shot_mbtn = "nul" +input_player11_gun_select = "nul" +input_player11_gun_select_axis = "nul" +input_player11_gun_select_btn = "nul" +input_player11_gun_select_mbtn = "nul" +input_player11_gun_start = "nul" +input_player11_gun_start_axis = "nul" +input_player11_gun_start_btn = "nul" +input_player11_gun_start_mbtn = "nul" +input_player11_gun_trigger = "nul" +input_player11_gun_trigger_axis = "nul" +input_player11_gun_trigger_btn = "nul" +input_player11_gun_trigger_mbtn = "1" +input_player11_joypad_index = "10" +input_player11_l = "nul" +input_player11_l2 = "nul" +input_player11_l2_axis = "nul" +input_player11_l2_btn = "nul" +input_player11_l2_mbtn = "nul" +input_player11_l3 = "nul" +input_player11_l3_axis = "nul" +input_player11_l3_btn = "nul" +input_player11_l3_mbtn = "nul" +input_player11_l_axis = "nul" +input_player11_l_btn = "nul" +input_player11_l_mbtn = "nul" +input_player11_l_x_minus = "nul" +input_player11_l_x_minus_axis = "nul" +input_player11_l_x_minus_btn = "nul" +input_player11_l_x_minus_mbtn = "nul" +input_player11_l_x_plus = "nul" +input_player11_l_x_plus_axis = "nul" +input_player11_l_x_plus_btn = "nul" +input_player11_l_x_plus_mbtn = "nul" +input_player11_l_y_minus = "nul" +input_player11_l_y_minus_axis = "nul" +input_player11_l_y_minus_btn = "nul" +input_player11_l_y_minus_mbtn = "nul" +input_player11_l_y_plus = "nul" +input_player11_l_y_plus_axis = "nul" +input_player11_l_y_plus_btn = "nul" +input_player11_l_y_plus_mbtn = "nul" +input_player11_left = "nul" +input_player11_left_axis = "nul" +input_player11_left_btn = "nul" +input_player11_left_mbtn = "nul" +input_player11_mouse_index = "10" +input_player11_r = "nul" +input_player11_r2 = "nul" +input_player11_r2_axis = "nul" +input_player11_r2_btn = "nul" +input_player11_r2_mbtn = "nul" +input_player11_r3 = "nul" +input_player11_r3_axis = "nul" +input_player11_r3_btn = "nul" +input_player11_r3_mbtn = "nul" +input_player11_r_axis = "nul" +input_player11_r_btn = "nul" +input_player11_r_mbtn = "nul" +input_player11_r_x_minus = "nul" +input_player11_r_x_minus_axis = "nul" +input_player11_r_x_minus_btn = "nul" +input_player11_r_x_minus_mbtn = "nul" +input_player11_r_x_plus = "nul" +input_player11_r_x_plus_axis = "nul" +input_player11_r_x_plus_btn = "nul" +input_player11_r_x_plus_mbtn = "nul" +input_player11_r_y_minus = "nul" +input_player11_r_y_minus_axis = "nul" +input_player11_r_y_minus_btn = "nul" +input_player11_r_y_minus_mbtn = "nul" +input_player11_r_y_plus = "nul" +input_player11_r_y_plus_axis = "nul" +input_player11_r_y_plus_btn = "nul" +input_player11_r_y_plus_mbtn = "nul" +input_player11_right = "nul" +input_player11_right_axis = "nul" +input_player11_right_btn = "nul" +input_player11_right_mbtn = "nul" +input_player11_select = "nul" +input_player11_select_axis = "nul" +input_player11_select_btn = "nul" +input_player11_select_mbtn = "nul" +input_player11_start = "nul" +input_player11_start_axis = "nul" +input_player11_start_btn = "nul" +input_player11_start_mbtn = "nul" +input_player11_turbo = "nul" +input_player11_turbo_axis = "nul" +input_player11_turbo_btn = "nul" +input_player11_turbo_mbtn = "nul" +input_player11_up = "nul" +input_player11_up_axis = "nul" +input_player11_up_btn = "nul" +input_player11_up_mbtn = "nul" +input_player11_x = "nul" +input_player11_x_axis = "nul" +input_player11_x_btn = "nul" +input_player11_x_mbtn = "nul" +input_player11_y = "nul" +input_player11_y_axis = "nul" +input_player11_y_btn = "nul" +input_player11_y_mbtn = "nul" +input_player12_a = "nul" +input_player12_a_axis = "nul" +input_player12_a_btn = "nul" +input_player12_a_mbtn = "nul" +input_player12_analog_dpad_mode = "0" +input_player12_b = "nul" +input_player12_b_axis = "nul" +input_player12_b_btn = "nul" +input_player12_b_mbtn = "nul" +input_player12_down = "nul" +input_player12_down_axis = "nul" +input_player12_down_btn = "nul" +input_player12_down_mbtn = "nul" +input_player12_gun_aux_a = "nul" +input_player12_gun_aux_a_axis = "nul" +input_player12_gun_aux_a_btn = "nul" +input_player12_gun_aux_a_mbtn = "nul" +input_player12_gun_aux_b = "nul" +input_player12_gun_aux_b_axis = "nul" +input_player12_gun_aux_b_btn = "nul" +input_player12_gun_aux_b_mbtn = "nul" +input_player12_gun_aux_c = "nul" +input_player12_gun_aux_c_axis = "nul" +input_player12_gun_aux_c_btn = "nul" +input_player12_gun_aux_c_mbtn = "nul" +input_player12_gun_dpad_down = "nul" +input_player12_gun_dpad_down_axis = "nul" +input_player12_gun_dpad_down_btn = "nul" +input_player12_gun_dpad_down_mbtn = "nul" +input_player12_gun_dpad_left = "nul" +input_player12_gun_dpad_left_axis = "nul" +input_player12_gun_dpad_left_btn = "nul" +input_player12_gun_dpad_left_mbtn = "nul" +input_player12_gun_dpad_right = "nul" +input_player12_gun_dpad_right_axis = "nul" +input_player12_gun_dpad_right_btn = "nul" +input_player12_gun_dpad_right_mbtn = "nul" +input_player12_gun_dpad_up = "nul" +input_player12_gun_dpad_up_axis = "nul" +input_player12_gun_dpad_up_btn = "nul" +input_player12_gun_dpad_up_mbtn = "nul" +input_player12_gun_offscreen_shot = "nul" +input_player12_gun_offscreen_shot_axis = "nul" +input_player12_gun_offscreen_shot_btn = "nul" +input_player12_gun_offscreen_shot_mbtn = "nul" +input_player12_gun_select = "nul" +input_player12_gun_select_axis = "nul" +input_player12_gun_select_btn = "nul" +input_player12_gun_select_mbtn = "nul" +input_player12_gun_start = "nul" +input_player12_gun_start_axis = "nul" +input_player12_gun_start_btn = "nul" +input_player12_gun_start_mbtn = "nul" +input_player12_gun_trigger = "nul" +input_player12_gun_trigger_axis = "nul" +input_player12_gun_trigger_btn = "nul" +input_player12_gun_trigger_mbtn = "1" +input_player12_joypad_index = "11" +input_player12_l = "nul" +input_player12_l2 = "nul" +input_player12_l2_axis = "nul" +input_player12_l2_btn = "nul" +input_player12_l2_mbtn = "nul" +input_player12_l3 = "nul" +input_player12_l3_axis = "nul" +input_player12_l3_btn = "nul" +input_player12_l3_mbtn = "nul" +input_player12_l_axis = "nul" +input_player12_l_btn = "nul" +input_player12_l_mbtn = "nul" +input_player12_l_x_minus = "nul" +input_player12_l_x_minus_axis = "nul" +input_player12_l_x_minus_btn = "nul" +input_player12_l_x_minus_mbtn = "nul" +input_player12_l_x_plus = "nul" +input_player12_l_x_plus_axis = "nul" +input_player12_l_x_plus_btn = "nul" +input_player12_l_x_plus_mbtn = "nul" +input_player12_l_y_minus = "nul" +input_player12_l_y_minus_axis = "nul" +input_player12_l_y_minus_btn = "nul" +input_player12_l_y_minus_mbtn = "nul" +input_player12_l_y_plus = "nul" +input_player12_l_y_plus_axis = "nul" +input_player12_l_y_plus_btn = "nul" +input_player12_l_y_plus_mbtn = "nul" +input_player12_left = "nul" +input_player12_left_axis = "nul" +input_player12_left_btn = "nul" +input_player12_left_mbtn = "nul" +input_player12_mouse_index = "11" +input_player12_r = "nul" +input_player12_r2 = "nul" +input_player12_r2_axis = "nul" +input_player12_r2_btn = "nul" +input_player12_r2_mbtn = "nul" +input_player12_r3 = "nul" +input_player12_r3_axis = "nul" +input_player12_r3_btn = "nul" +input_player12_r3_mbtn = "nul" +input_player12_r_axis = "nul" +input_player12_r_btn = "nul" +input_player12_r_mbtn = "nul" +input_player12_r_x_minus = "nul" +input_player12_r_x_minus_axis = "nul" +input_player12_r_x_minus_btn = "nul" +input_player12_r_x_minus_mbtn = "nul" +input_player12_r_x_plus = "nul" +input_player12_r_x_plus_axis = "nul" +input_player12_r_x_plus_btn = "nul" +input_player12_r_x_plus_mbtn = "nul" +input_player12_r_y_minus = "nul" +input_player12_r_y_minus_axis = "nul" +input_player12_r_y_minus_btn = "nul" +input_player12_r_y_minus_mbtn = "nul" +input_player12_r_y_plus = "nul" +input_player12_r_y_plus_axis = "nul" +input_player12_r_y_plus_btn = "nul" +input_player12_r_y_plus_mbtn = "nul" +input_player12_right = "nul" +input_player12_right_axis = "nul" +input_player12_right_btn = "nul" +input_player12_right_mbtn = "nul" +input_player12_select = "nul" +input_player12_select_axis = "nul" +input_player12_select_btn = "nul" +input_player12_select_mbtn = "nul" +input_player12_start = "nul" +input_player12_start_axis = "nul" +input_player12_start_btn = "nul" +input_player12_start_mbtn = "nul" +input_player12_turbo = "nul" +input_player12_turbo_axis = "nul" +input_player12_turbo_btn = "nul" +input_player12_turbo_mbtn = "nul" +input_player12_up = "nul" +input_player12_up_axis = "nul" +input_player12_up_btn = "nul" +input_player12_up_mbtn = "nul" +input_player12_x = "nul" +input_player12_x_axis = "nul" +input_player12_x_btn = "nul" +input_player12_x_mbtn = "nul" +input_player12_y = "nul" +input_player12_y_axis = "nul" +input_player12_y_btn = "nul" +input_player12_y_mbtn = "nul" +input_player13_a = "nul" +input_player13_a_axis = "nul" +input_player13_a_btn = "nul" +input_player13_a_mbtn = "nul" +input_player13_analog_dpad_mode = "0" +input_player13_b = "nul" +input_player13_b_axis = "nul" +input_player13_b_btn = "nul" +input_player13_b_mbtn = "nul" +input_player13_down = "nul" +input_player13_down_axis = "nul" +input_player13_down_btn = "nul" +input_player13_down_mbtn = "nul" +input_player13_gun_aux_a = "nul" +input_player13_gun_aux_a_axis = "nul" +input_player13_gun_aux_a_btn = "nul" +input_player13_gun_aux_a_mbtn = "nul" +input_player13_gun_aux_b = "nul" +input_player13_gun_aux_b_axis = "nul" +input_player13_gun_aux_b_btn = "nul" +input_player13_gun_aux_b_mbtn = "nul" +input_player13_gun_aux_c = "nul" +input_player13_gun_aux_c_axis = "nul" +input_player13_gun_aux_c_btn = "nul" +input_player13_gun_aux_c_mbtn = "nul" +input_player13_gun_dpad_down = "nul" +input_player13_gun_dpad_down_axis = "nul" +input_player13_gun_dpad_down_btn = "nul" +input_player13_gun_dpad_down_mbtn = "nul" +input_player13_gun_dpad_left = "nul" +input_player13_gun_dpad_left_axis = "nul" +input_player13_gun_dpad_left_btn = "nul" +input_player13_gun_dpad_left_mbtn = "nul" +input_player13_gun_dpad_right = "nul" +input_player13_gun_dpad_right_axis = "nul" +input_player13_gun_dpad_right_btn = "nul" +input_player13_gun_dpad_right_mbtn = "nul" +input_player13_gun_dpad_up = "nul" +input_player13_gun_dpad_up_axis = "nul" +input_player13_gun_dpad_up_btn = "nul" +input_player13_gun_dpad_up_mbtn = "nul" +input_player13_gun_offscreen_shot = "nul" +input_player13_gun_offscreen_shot_axis = "nul" +input_player13_gun_offscreen_shot_btn = "nul" +input_player13_gun_offscreen_shot_mbtn = "nul" +input_player13_gun_select = "nul" +input_player13_gun_select_axis = "nul" +input_player13_gun_select_btn = "nul" +input_player13_gun_select_mbtn = "nul" +input_player13_gun_start = "nul" +input_player13_gun_start_axis = "nul" +input_player13_gun_start_btn = "nul" +input_player13_gun_start_mbtn = "nul" +input_player13_gun_trigger = "nul" +input_player13_gun_trigger_axis = "nul" +input_player13_gun_trigger_btn = "nul" +input_player13_gun_trigger_mbtn = "1" +input_player13_joypad_index = "12" +input_player13_l = "nul" +input_player13_l2 = "nul" +input_player13_l2_axis = "nul" +input_player13_l2_btn = "nul" +input_player13_l2_mbtn = "nul" +input_player13_l3 = "nul" +input_player13_l3_axis = "nul" +input_player13_l3_btn = "nul" +input_player13_l3_mbtn = "nul" +input_player13_l_axis = "nul" +input_player13_l_btn = "nul" +input_player13_l_mbtn = "nul" +input_player13_l_x_minus = "nul" +input_player13_l_x_minus_axis = "nul" +input_player13_l_x_minus_btn = "nul" +input_player13_l_x_minus_mbtn = "nul" +input_player13_l_x_plus = "nul" +input_player13_l_x_plus_axis = "nul" +input_player13_l_x_plus_btn = "nul" +input_player13_l_x_plus_mbtn = "nul" +input_player13_l_y_minus = "nul" +input_player13_l_y_minus_axis = "nul" +input_player13_l_y_minus_btn = "nul" +input_player13_l_y_minus_mbtn = "nul" +input_player13_l_y_plus = "nul" +input_player13_l_y_plus_axis = "nul" +input_player13_l_y_plus_btn = "nul" +input_player13_l_y_plus_mbtn = "nul" +input_player13_left = "nul" +input_player13_left_axis = "nul" +input_player13_left_btn = "nul" +input_player13_left_mbtn = "nul" +input_player13_mouse_index = "12" +input_player13_r = "nul" +input_player13_r2 = "nul" +input_player13_r2_axis = "nul" +input_player13_r2_btn = "nul" +input_player13_r2_mbtn = "nul" +input_player13_r3 = "nul" +input_player13_r3_axis = "nul" +input_player13_r3_btn = "nul" +input_player13_r3_mbtn = "nul" +input_player13_r_axis = "nul" +input_player13_r_btn = "nul" +input_player13_r_mbtn = "nul" +input_player13_r_x_minus = "nul" +input_player13_r_x_minus_axis = "nul" +input_player13_r_x_minus_btn = "nul" +input_player13_r_x_minus_mbtn = "nul" +input_player13_r_x_plus = "nul" +input_player13_r_x_plus_axis = "nul" +input_player13_r_x_plus_btn = "nul" +input_player13_r_x_plus_mbtn = "nul" +input_player13_r_y_minus = "nul" +input_player13_r_y_minus_axis = "nul" +input_player13_r_y_minus_btn = "nul" +input_player13_r_y_minus_mbtn = "nul" +input_player13_r_y_plus = "nul" +input_player13_r_y_plus_axis = "nul" +input_player13_r_y_plus_btn = "nul" +input_player13_r_y_plus_mbtn = "nul" +input_player13_right = "nul" +input_player13_right_axis = "nul" +input_player13_right_btn = "nul" +input_player13_right_mbtn = "nul" +input_player13_select = "nul" +input_player13_select_axis = "nul" +input_player13_select_btn = "nul" +input_player13_select_mbtn = "nul" +input_player13_start = "nul" +input_player13_start_axis = "nul" +input_player13_start_btn = "nul" +input_player13_start_mbtn = "nul" +input_player13_turbo = "nul" +input_player13_turbo_axis = "nul" +input_player13_turbo_btn = "nul" +input_player13_turbo_mbtn = "nul" +input_player13_up = "nul" +input_player13_up_axis = "nul" +input_player13_up_btn = "nul" +input_player13_up_mbtn = "nul" +input_player13_x = "nul" +input_player13_x_axis = "nul" +input_player13_x_btn = "nul" +input_player13_x_mbtn = "nul" +input_player13_y = "nul" +input_player13_y_axis = "nul" +input_player13_y_btn = "nul" +input_player13_y_mbtn = "nul" +input_player14_a = "nul" +input_player14_a_axis = "nul" +input_player14_a_btn = "nul" +input_player14_a_mbtn = "nul" +input_player14_analog_dpad_mode = "0" +input_player14_b = "nul" +input_player14_b_axis = "nul" +input_player14_b_btn = "nul" +input_player14_b_mbtn = "nul" +input_player14_down = "nul" +input_player14_down_axis = "nul" +input_player14_down_btn = "nul" +input_player14_down_mbtn = "nul" +input_player14_gun_aux_a = "nul" +input_player14_gun_aux_a_axis = "nul" +input_player14_gun_aux_a_btn = "nul" +input_player14_gun_aux_a_mbtn = "nul" +input_player14_gun_aux_b = "nul" +input_player14_gun_aux_b_axis = "nul" +input_player14_gun_aux_b_btn = "nul" +input_player14_gun_aux_b_mbtn = "nul" +input_player14_gun_aux_c = "nul" +input_player14_gun_aux_c_axis = "nul" +input_player14_gun_aux_c_btn = "nul" +input_player14_gun_aux_c_mbtn = "nul" +input_player14_gun_dpad_down = "nul" +input_player14_gun_dpad_down_axis = "nul" +input_player14_gun_dpad_down_btn = "nul" +input_player14_gun_dpad_down_mbtn = "nul" +input_player14_gun_dpad_left = "nul" +input_player14_gun_dpad_left_axis = "nul" +input_player14_gun_dpad_left_btn = "nul" +input_player14_gun_dpad_left_mbtn = "nul" +input_player14_gun_dpad_right = "nul" +input_player14_gun_dpad_right_axis = "nul" +input_player14_gun_dpad_right_btn = "nul" +input_player14_gun_dpad_right_mbtn = "nul" +input_player14_gun_dpad_up = "nul" +input_player14_gun_dpad_up_axis = "nul" +input_player14_gun_dpad_up_btn = "nul" +input_player14_gun_dpad_up_mbtn = "nul" +input_player14_gun_offscreen_shot = "nul" +input_player14_gun_offscreen_shot_axis = "nul" +input_player14_gun_offscreen_shot_btn = "nul" +input_player14_gun_offscreen_shot_mbtn = "nul" +input_player14_gun_select = "nul" +input_player14_gun_select_axis = "nul" +input_player14_gun_select_btn = "nul" +input_player14_gun_select_mbtn = "nul" +input_player14_gun_start = "nul" +input_player14_gun_start_axis = "nul" +input_player14_gun_start_btn = "nul" +input_player14_gun_start_mbtn = "nul" +input_player14_gun_trigger = "nul" +input_player14_gun_trigger_axis = "nul" +input_player14_gun_trigger_btn = "nul" +input_player14_gun_trigger_mbtn = "1" +input_player14_joypad_index = "13" +input_player14_l = "nul" +input_player14_l2 = "nul" +input_player14_l2_axis = "nul" +input_player14_l2_btn = "nul" +input_player14_l2_mbtn = "nul" +input_player14_l3 = "nul" +input_player14_l3_axis = "nul" +input_player14_l3_btn = "nul" +input_player14_l3_mbtn = "nul" +input_player14_l_axis = "nul" +input_player14_l_btn = "nul" +input_player14_l_mbtn = "nul" +input_player14_l_x_minus = "nul" +input_player14_l_x_minus_axis = "nul" +input_player14_l_x_minus_btn = "nul" +input_player14_l_x_minus_mbtn = "nul" +input_player14_l_x_plus = "nul" +input_player14_l_x_plus_axis = "nul" +input_player14_l_x_plus_btn = "nul" +input_player14_l_x_plus_mbtn = "nul" +input_player14_l_y_minus = "nul" +input_player14_l_y_minus_axis = "nul" +input_player14_l_y_minus_btn = "nul" +input_player14_l_y_minus_mbtn = "nul" +input_player14_l_y_plus = "nul" +input_player14_l_y_plus_axis = "nul" +input_player14_l_y_plus_btn = "nul" +input_player14_l_y_plus_mbtn = "nul" +input_player14_left = "nul" +input_player14_left_axis = "nul" +input_player14_left_btn = "nul" +input_player14_left_mbtn = "nul" +input_player14_mouse_index = "13" +input_player14_r = "nul" +input_player14_r2 = "nul" +input_player14_r2_axis = "nul" +input_player14_r2_btn = "nul" +input_player14_r2_mbtn = "nul" +input_player14_r3 = "nul" +input_player14_r3_axis = "nul" +input_player14_r3_btn = "nul" +input_player14_r3_mbtn = "nul" +input_player14_r_axis = "nul" +input_player14_r_btn = "nul" +input_player14_r_mbtn = "nul" +input_player14_r_x_minus = "nul" +input_player14_r_x_minus_axis = "nul" +input_player14_r_x_minus_btn = "nul" +input_player14_r_x_minus_mbtn = "nul" +input_player14_r_x_plus = "nul" +input_player14_r_x_plus_axis = "nul" +input_player14_r_x_plus_btn = "nul" +input_player14_r_x_plus_mbtn = "nul" +input_player14_r_y_minus = "nul" +input_player14_r_y_minus_axis = "nul" +input_player14_r_y_minus_btn = "nul" +input_player14_r_y_minus_mbtn = "nul" +input_player14_r_y_plus = "nul" +input_player14_r_y_plus_axis = "nul" +input_player14_r_y_plus_btn = "nul" +input_player14_r_y_plus_mbtn = "nul" +input_player14_right = "nul" +input_player14_right_axis = "nul" +input_player14_right_btn = "nul" +input_player14_right_mbtn = "nul" +input_player14_select = "nul" +input_player14_select_axis = "nul" +input_player14_select_btn = "nul" +input_player14_select_mbtn = "nul" +input_player14_start = "nul" +input_player14_start_axis = "nul" +input_player14_start_btn = "nul" +input_player14_start_mbtn = "nul" +input_player14_turbo = "nul" +input_player14_turbo_axis = "nul" +input_player14_turbo_btn = "nul" +input_player14_turbo_mbtn = "nul" +input_player14_up = "nul" +input_player14_up_axis = "nul" +input_player14_up_btn = "nul" +input_player14_up_mbtn = "nul" +input_player14_x = "nul" +input_player14_x_axis = "nul" +input_player14_x_btn = "nul" +input_player14_x_mbtn = "nul" +input_player14_y = "nul" +input_player14_y_axis = "nul" +input_player14_y_btn = "nul" +input_player14_y_mbtn = "nul" +input_player15_a = "nul" +input_player15_a_axis = "nul" +input_player15_a_btn = "nul" +input_player15_a_mbtn = "nul" +input_player15_analog_dpad_mode = "0" +input_player15_b = "nul" +input_player15_b_axis = "nul" +input_player15_b_btn = "nul" +input_player15_b_mbtn = "nul" +input_player15_down = "nul" +input_player15_down_axis = "nul" +input_player15_down_btn = "nul" +input_player15_down_mbtn = "nul" +input_player15_gun_aux_a = "nul" +input_player15_gun_aux_a_axis = "nul" +input_player15_gun_aux_a_btn = "nul" +input_player15_gun_aux_a_mbtn = "nul" +input_player15_gun_aux_b = "nul" +input_player15_gun_aux_b_axis = "nul" +input_player15_gun_aux_b_btn = "nul" +input_player15_gun_aux_b_mbtn = "nul" +input_player15_gun_aux_c = "nul" +input_player15_gun_aux_c_axis = "nul" +input_player15_gun_aux_c_btn = "nul" +input_player15_gun_aux_c_mbtn = "nul" +input_player15_gun_dpad_down = "nul" +input_player15_gun_dpad_down_axis = "nul" +input_player15_gun_dpad_down_btn = "nul" +input_player15_gun_dpad_down_mbtn = "nul" +input_player15_gun_dpad_left = "nul" +input_player15_gun_dpad_left_axis = "nul" +input_player15_gun_dpad_left_btn = "nul" +input_player15_gun_dpad_left_mbtn = "nul" +input_player15_gun_dpad_right = "nul" +input_player15_gun_dpad_right_axis = "nul" +input_player15_gun_dpad_right_btn = "nul" +input_player15_gun_dpad_right_mbtn = "nul" +input_player15_gun_dpad_up = "nul" +input_player15_gun_dpad_up_axis = "nul" +input_player15_gun_dpad_up_btn = "nul" +input_player15_gun_dpad_up_mbtn = "nul" +input_player15_gun_offscreen_shot = "nul" +input_player15_gun_offscreen_shot_axis = "nul" +input_player15_gun_offscreen_shot_btn = "nul" +input_player15_gun_offscreen_shot_mbtn = "nul" +input_player15_gun_select = "nul" +input_player15_gun_select_axis = "nul" +input_player15_gun_select_btn = "nul" +input_player15_gun_select_mbtn = "nul" +input_player15_gun_start = "nul" +input_player15_gun_start_axis = "nul" +input_player15_gun_start_btn = "nul" +input_player15_gun_start_mbtn = "nul" +input_player15_gun_trigger = "nul" +input_player15_gun_trigger_axis = "nul" +input_player15_gun_trigger_btn = "nul" +input_player15_gun_trigger_mbtn = "1" +input_player15_joypad_index = "14" +input_player15_l = "nul" +input_player15_l2 = "nul" +input_player15_l2_axis = "nul" +input_player15_l2_btn = "nul" +input_player15_l2_mbtn = "nul" +input_player15_l3 = "nul" +input_player15_l3_axis = "nul" +input_player15_l3_btn = "nul" +input_player15_l3_mbtn = "nul" +input_player15_l_axis = "nul" +input_player15_l_btn = "nul" +input_player15_l_mbtn = "nul" +input_player15_l_x_minus = "nul" +input_player15_l_x_minus_axis = "nul" +input_player15_l_x_minus_btn = "nul" +input_player15_l_x_minus_mbtn = "nul" +input_player15_l_x_plus = "nul" +input_player15_l_x_plus_axis = "nul" +input_player15_l_x_plus_btn = "nul" +input_player15_l_x_plus_mbtn = "nul" +input_player15_l_y_minus = "nul" +input_player15_l_y_minus_axis = "nul" +input_player15_l_y_minus_btn = "nul" +input_player15_l_y_minus_mbtn = "nul" +input_player15_l_y_plus = "nul" +input_player15_l_y_plus_axis = "nul" +input_player15_l_y_plus_btn = "nul" +input_player15_l_y_plus_mbtn = "nul" +input_player15_left = "nul" +input_player15_left_axis = "nul" +input_player15_left_btn = "nul" +input_player15_left_mbtn = "nul" +input_player15_mouse_index = "14" +input_player15_r = "nul" +input_player15_r2 = "nul" +input_player15_r2_axis = "nul" +input_player15_r2_btn = "nul" +input_player15_r2_mbtn = "nul" +input_player15_r3 = "nul" +input_player15_r3_axis = "nul" +input_player15_r3_btn = "nul" +input_player15_r3_mbtn = "nul" +input_player15_r_axis = "nul" +input_player15_r_btn = "nul" +input_player15_r_mbtn = "nul" +input_player15_r_x_minus = "nul" +input_player15_r_x_minus_axis = "nul" +input_player15_r_x_minus_btn = "nul" +input_player15_r_x_minus_mbtn = "nul" +input_player15_r_x_plus = "nul" +input_player15_r_x_plus_axis = "nul" +input_player15_r_x_plus_btn = "nul" +input_player15_r_x_plus_mbtn = "nul" +input_player15_r_y_minus = "nul" +input_player15_r_y_minus_axis = "nul" +input_player15_r_y_minus_btn = "nul" +input_player15_r_y_minus_mbtn = "nul" +input_player15_r_y_plus = "nul" +input_player15_r_y_plus_axis = "nul" +input_player15_r_y_plus_btn = "nul" +input_player15_r_y_plus_mbtn = "nul" +input_player15_right = "nul" +input_player15_right_axis = "nul" +input_player15_right_btn = "nul" +input_player15_right_mbtn = "nul" +input_player15_select = "nul" +input_player15_select_axis = "nul" +input_player15_select_btn = "nul" +input_player15_select_mbtn = "nul" +input_player15_start = "nul" +input_player15_start_axis = "nul" +input_player15_start_btn = "nul" +input_player15_start_mbtn = "nul" +input_player15_turbo = "nul" +input_player15_turbo_axis = "nul" +input_player15_turbo_btn = "nul" +input_player15_turbo_mbtn = "nul" +input_player15_up = "nul" +input_player15_up_axis = "nul" +input_player15_up_btn = "nul" +input_player15_up_mbtn = "nul" +input_player15_x = "nul" +input_player15_x_axis = "nul" +input_player15_x_btn = "nul" +input_player15_x_mbtn = "nul" +input_player15_y = "nul" +input_player15_y_axis = "nul" +input_player15_y_btn = "nul" +input_player15_y_mbtn = "nul" +input_player16_a = "nul" +input_player16_a_axis = "nul" +input_player16_a_btn = "nul" +input_player16_a_mbtn = "nul" +input_player16_analog_dpad_mode = "0" +input_player16_b = "nul" +input_player16_b_axis = "nul" +input_player16_b_btn = "nul" +input_player16_b_mbtn = "nul" +input_player16_down = "nul" +input_player16_down_axis = "nul" +input_player16_down_btn = "nul" +input_player16_down_mbtn = "nul" +input_player16_gun_aux_a = "nul" +input_player16_gun_aux_a_axis = "nul" +input_player16_gun_aux_a_btn = "nul" +input_player16_gun_aux_a_mbtn = "nul" +input_player16_gun_aux_b = "nul" +input_player16_gun_aux_b_axis = "nul" +input_player16_gun_aux_b_btn = "nul" +input_player16_gun_aux_b_mbtn = "nul" +input_player16_gun_aux_c = "nul" +input_player16_gun_aux_c_axis = "nul" +input_player16_gun_aux_c_btn = "nul" +input_player16_gun_aux_c_mbtn = "nul" +input_player16_gun_dpad_down = "nul" +input_player16_gun_dpad_down_axis = "nul" +input_player16_gun_dpad_down_btn = "nul" +input_player16_gun_dpad_down_mbtn = "nul" +input_player16_gun_dpad_left = "nul" +input_player16_gun_dpad_left_axis = "nul" +input_player16_gun_dpad_left_btn = "nul" +input_player16_gun_dpad_left_mbtn = "nul" +input_player16_gun_dpad_right = "nul" +input_player16_gun_dpad_right_axis = "nul" +input_player16_gun_dpad_right_btn = "nul" +input_player16_gun_dpad_right_mbtn = "nul" +input_player16_gun_dpad_up = "nul" +input_player16_gun_dpad_up_axis = "nul" +input_player16_gun_dpad_up_btn = "nul" +input_player16_gun_dpad_up_mbtn = "nul" +input_player16_gun_offscreen_shot = "nul" +input_player16_gun_offscreen_shot_axis = "nul" +input_player16_gun_offscreen_shot_btn = "nul" +input_player16_gun_offscreen_shot_mbtn = "nul" +input_player16_gun_select = "nul" +input_player16_gun_select_axis = "nul" +input_player16_gun_select_btn = "nul" +input_player16_gun_select_mbtn = "nul" +input_player16_gun_start = "nul" +input_player16_gun_start_axis = "nul" +input_player16_gun_start_btn = "nul" +input_player16_gun_start_mbtn = "nul" +input_player16_gun_trigger = "nul" +input_player16_gun_trigger_axis = "nul" +input_player16_gun_trigger_btn = "nul" +input_player16_gun_trigger_mbtn = "1" +input_player16_joypad_index = "15" +input_player16_l = "nul" +input_player16_l2 = "nul" +input_player16_l2_axis = "nul" +input_player16_l2_btn = "nul" +input_player16_l2_mbtn = "nul" +input_player16_l3 = "nul" +input_player16_l3_axis = "nul" +input_player16_l3_btn = "nul" +input_player16_l3_mbtn = "nul" +input_player16_l_axis = "nul" +input_player16_l_btn = "nul" +input_player16_l_mbtn = "nul" +input_player16_l_x_minus = "nul" +input_player16_l_x_minus_axis = "nul" +input_player16_l_x_minus_btn = "nul" +input_player16_l_x_minus_mbtn = "nul" +input_player16_l_x_plus = "nul" +input_player16_l_x_plus_axis = "nul" +input_player16_l_x_plus_btn = "nul" +input_player16_l_x_plus_mbtn = "nul" +input_player16_l_y_minus = "nul" +input_player16_l_y_minus_axis = "nul" +input_player16_l_y_minus_btn = "nul" +input_player16_l_y_minus_mbtn = "nul" +input_player16_l_y_plus = "nul" +input_player16_l_y_plus_axis = "nul" +input_player16_l_y_plus_btn = "nul" +input_player16_l_y_plus_mbtn = "nul" +input_player16_left = "nul" +input_player16_left_axis = "nul" +input_player16_left_btn = "nul" +input_player16_left_mbtn = "nul" +input_player16_mouse_index = "15" +input_player16_r = "nul" +input_player16_r2 = "nul" +input_player16_r2_axis = "nul" +input_player16_r2_btn = "nul" +input_player16_r2_mbtn = "nul" +input_player16_r3 = "nul" +input_player16_r3_axis = "nul" +input_player16_r3_btn = "nul" +input_player16_r3_mbtn = "nul" +input_player16_r_axis = "nul" +input_player16_r_btn = "nul" +input_player16_r_mbtn = "nul" +input_player16_r_x_minus = "nul" +input_player16_r_x_minus_axis = "nul" +input_player16_r_x_minus_btn = "nul" +input_player16_r_x_minus_mbtn = "nul" +input_player16_r_x_plus = "nul" +input_player16_r_x_plus_axis = "nul" +input_player16_r_x_plus_btn = "nul" +input_player16_r_x_plus_mbtn = "nul" +input_player16_r_y_minus = "nul" +input_player16_r_y_minus_axis = "nul" +input_player16_r_y_minus_btn = "nul" +input_player16_r_y_minus_mbtn = "nul" +input_player16_r_y_plus = "nul" +input_player16_r_y_plus_axis = "nul" +input_player16_r_y_plus_btn = "nul" +input_player16_r_y_plus_mbtn = "nul" +input_player16_right = "nul" +input_player16_right_axis = "nul" +input_player16_right_btn = "nul" +input_player16_right_mbtn = "nul" +input_player16_select = "nul" +input_player16_select_axis = "nul" +input_player16_select_btn = "nul" +input_player16_select_mbtn = "nul" +input_player16_start = "nul" +input_player16_start_axis = "nul" +input_player16_start_btn = "nul" +input_player16_start_mbtn = "nul" +input_player16_turbo = "nul" +input_player16_turbo_axis = "nul" +input_player16_turbo_btn = "nul" +input_player16_turbo_mbtn = "nul" +input_player16_up = "nul" +input_player16_up_axis = "nul" +input_player16_up_btn = "nul" +input_player16_up_mbtn = "nul" +input_player16_x = "nul" +input_player16_x_axis = "nul" +input_player16_x_btn = "nul" +input_player16_x_mbtn = "nul" +input_player16_y = "nul" +input_player16_y_axis = "nul" +input_player16_y_btn = "nul" +input_player16_y_mbtn = "nul" +input_player1_a = "x" +input_player1_a_axis = "nul" +input_player1_a_btn = "nul" +input_player1_a_mbtn = "nul" +input_player1_analog_dpad_mode = "0" +input_player1_b = "z" +input_player1_b_axis = "nul" +input_player1_b_btn = "nul" +input_player1_b_mbtn = "nul" +input_player1_down = "down" +input_player1_down_axis = "nul" +input_player1_down_btn = "nul" +input_player1_down_mbtn = "nul" +input_player1_gun_aux_a = "nul" +input_player1_gun_aux_a_axis = "nul" +input_player1_gun_aux_a_btn = "nul" +input_player1_gun_aux_a_mbtn = "nul" +input_player1_gun_aux_b = "nul" +input_player1_gun_aux_b_axis = "nul" +input_player1_gun_aux_b_btn = "nul" +input_player1_gun_aux_b_mbtn = "nul" +input_player1_gun_aux_c = "nul" +input_player1_gun_aux_c_axis = "nul" +input_player1_gun_aux_c_btn = "nul" +input_player1_gun_aux_c_mbtn = "nul" +input_player1_gun_dpad_down = "nul" +input_player1_gun_dpad_down_axis = "nul" +input_player1_gun_dpad_down_btn = "nul" +input_player1_gun_dpad_down_mbtn = "nul" +input_player1_gun_dpad_left = "nul" +input_player1_gun_dpad_left_axis = "nul" +input_player1_gun_dpad_left_btn = "nul" +input_player1_gun_dpad_left_mbtn = "nul" +input_player1_gun_dpad_right = "nul" +input_player1_gun_dpad_right_axis = "nul" +input_player1_gun_dpad_right_btn = "nul" +input_player1_gun_dpad_right_mbtn = "nul" +input_player1_gun_dpad_up = "nul" +input_player1_gun_dpad_up_axis = "nul" +input_player1_gun_dpad_up_btn = "nul" +input_player1_gun_dpad_up_mbtn = "nul" +input_player1_gun_offscreen_shot = "nul" +input_player1_gun_offscreen_shot_axis = "nul" +input_player1_gun_offscreen_shot_btn = "nul" +input_player1_gun_offscreen_shot_mbtn = "nul" +input_player1_gun_select = "nul" +input_player1_gun_select_axis = "nul" +input_player1_gun_select_btn = "nul" +input_player1_gun_select_mbtn = "nul" +input_player1_gun_start = "nul" +input_player1_gun_start_axis = "nul" +input_player1_gun_start_btn = "nul" +input_player1_gun_start_mbtn = "nul" +input_player1_gun_trigger = "nul" +input_player1_gun_trigger_axis = "nul" +input_player1_gun_trigger_btn = "nul" +input_player1_gun_trigger_mbtn = "1" +input_player1_joypad_index = "0" +input_player1_l = "q" +input_player1_l2 = "nul" +input_player1_l2_axis = "nul" +input_player1_l2_btn = "nul" +input_player1_l2_mbtn = "nul" +input_player1_l3 = "nul" +input_player1_l3_axis = "nul" +input_player1_l3_btn = "nul" +input_player1_l3_mbtn = "nul" +input_player1_l_axis = "nul" +input_player1_l_btn = "nul" +input_player1_l_mbtn = "nul" +input_player1_l_x_minus = "nul" +input_player1_l_x_minus_axis = "nul" +input_player1_l_x_minus_btn = "nul" +input_player1_l_x_minus_mbtn = "nul" +input_player1_l_x_plus = "nul" +input_player1_l_x_plus_axis = "nul" +input_player1_l_x_plus_btn = "nul" +input_player1_l_x_plus_mbtn = "nul" +input_player1_l_y_minus = "nul" +input_player1_l_y_minus_axis = "nul" +input_player1_l_y_minus_btn = "nul" +input_player1_l_y_minus_mbtn = "nul" +input_player1_l_y_plus = "nul" +input_player1_l_y_plus_axis = "nul" +input_player1_l_y_plus_btn = "nul" +input_player1_l_y_plus_mbtn = "nul" +input_player1_left = "left" +input_player1_left_axis = "nul" +input_player1_left_btn = "nul" +input_player1_left_mbtn = "nul" +input_player1_mouse_index = "0" +input_player1_r = "w" +input_player1_r2 = "nul" +input_player1_r2_axis = "nul" +input_player1_r2_btn = "nul" +input_player1_r2_mbtn = "nul" +input_player1_r3 = "nul" +input_player1_r3_axis = "nul" +input_player1_r3_btn = "nul" +input_player1_r3_mbtn = "nul" +input_player1_r_axis = "nul" +input_player1_r_btn = "nul" +input_player1_r_mbtn = "nul" +input_player1_r_x_minus = "nul" +input_player1_r_x_minus_axis = "nul" +input_player1_r_x_minus_btn = "nul" +input_player1_r_x_minus_mbtn = "nul" +input_player1_r_x_plus = "nul" +input_player1_r_x_plus_axis = "nul" +input_player1_r_x_plus_btn = "nul" +input_player1_r_x_plus_mbtn = "nul" +input_player1_r_y_minus = "nul" +input_player1_r_y_minus_axis = "nul" +input_player1_r_y_minus_btn = "nul" +input_player1_r_y_minus_mbtn = "nul" +input_player1_r_y_plus = "nul" +input_player1_r_y_plus_axis = "nul" +input_player1_r_y_plus_btn = "nul" +input_player1_r_y_plus_mbtn = "nul" +input_player1_right = "right" +input_player1_right_axis = "nul" +input_player1_right_btn = "nul" +input_player1_right_mbtn = "nul" +input_player1_select = "rshift" +input_player1_select_axis = "nul" +input_player1_select_btn = "nul" +input_player1_select_mbtn = "nul" +input_player1_start = "enter" +input_player1_start_axis = "nul" +input_player1_start_btn = "nul" +input_player1_start_mbtn = "nul" +input_player1_turbo = "nul" +input_player1_turbo_axis = "nul" +input_player1_turbo_btn = "nul" +input_player1_turbo_mbtn = "nul" +input_player1_up = "up" +input_player1_up_axis = "nul" +input_player1_up_btn = "nul" +input_player1_up_mbtn = "nul" +input_player1_x = "s" +input_player1_x_axis = "nul" +input_player1_x_btn = "nul" +input_player1_x_mbtn = "nul" +input_player1_y = "a" +input_player1_y_axis = "nul" +input_player1_y_btn = "nul" +input_player1_y_mbtn = "nul" +input_player2_a = "nul" +input_player2_a_axis = "nul" +input_player2_a_btn = "nul" +input_player2_a_mbtn = "nul" +input_player2_analog_dpad_mode = "0" +input_player2_b = "nul" +input_player2_b_axis = "nul" +input_player2_b_btn = "nul" +input_player2_b_mbtn = "nul" +input_player2_down = "nul" +input_player2_down_axis = "nul" +input_player2_down_btn = "nul" +input_player2_down_mbtn = "nul" +input_player2_gun_aux_a = "nul" +input_player2_gun_aux_a_axis = "nul" +input_player2_gun_aux_a_btn = "nul" +input_player2_gun_aux_a_mbtn = "nul" +input_player2_gun_aux_b = "nul" +input_player2_gun_aux_b_axis = "nul" +input_player2_gun_aux_b_btn = "nul" +input_player2_gun_aux_b_mbtn = "nul" +input_player2_gun_aux_c = "nul" +input_player2_gun_aux_c_axis = "nul" +input_player2_gun_aux_c_btn = "nul" +input_player2_gun_aux_c_mbtn = "nul" +input_player2_gun_dpad_down = "nul" +input_player2_gun_dpad_down_axis = "nul" +input_player2_gun_dpad_down_btn = "nul" +input_player2_gun_dpad_down_mbtn = "nul" +input_player2_gun_dpad_left = "nul" +input_player2_gun_dpad_left_axis = "nul" +input_player2_gun_dpad_left_btn = "nul" +input_player2_gun_dpad_left_mbtn = "nul" +input_player2_gun_dpad_right = "nul" +input_player2_gun_dpad_right_axis = "nul" +input_player2_gun_dpad_right_btn = "nul" +input_player2_gun_dpad_right_mbtn = "nul" +input_player2_gun_dpad_up = "nul" +input_player2_gun_dpad_up_axis = "nul" +input_player2_gun_dpad_up_btn = "nul" +input_player2_gun_dpad_up_mbtn = "nul" +input_player2_gun_offscreen_shot = "nul" +input_player2_gun_offscreen_shot_axis = "nul" +input_player2_gun_offscreen_shot_btn = "nul" +input_player2_gun_offscreen_shot_mbtn = "nul" +input_player2_gun_select = "nul" +input_player2_gun_select_axis = "nul" +input_player2_gun_select_btn = "nul" +input_player2_gun_select_mbtn = "nul" +input_player2_gun_start = "nul" +input_player2_gun_start_axis = "nul" +input_player2_gun_start_btn = "nul" +input_player2_gun_start_mbtn = "nul" +input_player2_gun_trigger = "nul" +input_player2_gun_trigger_axis = "nul" +input_player2_gun_trigger_btn = "nul" +input_player2_gun_trigger_mbtn = "1" +input_player2_joypad_index = "1" +input_player2_l = "nul" +input_player2_l2 = "nul" +input_player2_l2_axis = "nul" +input_player2_l2_btn = "nul" +input_player2_l2_mbtn = "nul" +input_player2_l3 = "nul" +input_player2_l3_axis = "nul" +input_player2_l3_btn = "nul" +input_player2_l3_mbtn = "nul" +input_player2_l_axis = "nul" +input_player2_l_btn = "nul" +input_player2_l_mbtn = "nul" +input_player2_l_x_minus = "nul" +input_player2_l_x_minus_axis = "nul" +input_player2_l_x_minus_btn = "nul" +input_player2_l_x_minus_mbtn = "nul" +input_player2_l_x_plus = "nul" +input_player2_l_x_plus_axis = "nul" +input_player2_l_x_plus_btn = "nul" +input_player2_l_x_plus_mbtn = "nul" +input_player2_l_y_minus = "nul" +input_player2_l_y_minus_axis = "nul" +input_player2_l_y_minus_btn = "nul" +input_player2_l_y_minus_mbtn = "nul" +input_player2_l_y_plus = "nul" +input_player2_l_y_plus_axis = "nul" +input_player2_l_y_plus_btn = "nul" +input_player2_l_y_plus_mbtn = "nul" +input_player2_left = "nul" +input_player2_left_axis = "nul" +input_player2_left_btn = "nul" +input_player2_left_mbtn = "nul" +input_player2_mouse_index = "1" +input_player2_r = "nul" +input_player2_r2 = "nul" +input_player2_r2_axis = "nul" +input_player2_r2_btn = "nul" +input_player2_r2_mbtn = "nul" +input_player2_r3 = "nul" +input_player2_r3_axis = "nul" +input_player2_r3_btn = "nul" +input_player2_r3_mbtn = "nul" +input_player2_r_axis = "nul" +input_player2_r_btn = "nul" +input_player2_r_mbtn = "nul" +input_player2_r_x_minus = "nul" +input_player2_r_x_minus_axis = "nul" +input_player2_r_x_minus_btn = "nul" +input_player2_r_x_minus_mbtn = "nul" +input_player2_r_x_plus = "nul" +input_player2_r_x_plus_axis = "nul" +input_player2_r_x_plus_btn = "nul" +input_player2_r_x_plus_mbtn = "nul" +input_player2_r_y_minus = "nul" +input_player2_r_y_minus_axis = "nul" +input_player2_r_y_minus_btn = "nul" +input_player2_r_y_minus_mbtn = "nul" +input_player2_r_y_plus = "nul" +input_player2_r_y_plus_axis = "nul" +input_player2_r_y_plus_btn = "nul" +input_player2_r_y_plus_mbtn = "nul" +input_player2_right = "nul" +input_player2_right_axis = "nul" +input_player2_right_btn = "nul" +input_player2_right_mbtn = "nul" +input_player2_select = "nul" +input_player2_select_axis = "nul" +input_player2_select_btn = "nul" +input_player2_select_mbtn = "nul" +input_player2_start = "nul" +input_player2_start_axis = "nul" +input_player2_start_btn = "nul" +input_player2_start_mbtn = "nul" +input_player2_turbo = "nul" +input_player2_turbo_axis = "nul" +input_player2_turbo_btn = "nul" +input_player2_turbo_mbtn = "nul" +input_player2_up = "nul" +input_player2_up_axis = "nul" +input_player2_up_btn = "nul" +input_player2_up_mbtn = "nul" +input_player2_x = "nul" +input_player2_x_axis = "nul" +input_player2_x_btn = "nul" +input_player2_x_mbtn = "nul" +input_player2_y = "nul" +input_player2_y_axis = "nul" +input_player2_y_btn = "nul" +input_player2_y_mbtn = "nul" +input_player3_a = "nul" +input_player3_a_axis = "nul" +input_player3_a_btn = "nul" +input_player3_a_mbtn = "nul" +input_player3_analog_dpad_mode = "0" +input_player3_b = "nul" +input_player3_b_axis = "nul" +input_player3_b_btn = "nul" +input_player3_b_mbtn = "nul" +input_player3_down = "nul" +input_player3_down_axis = "nul" +input_player3_down_btn = "nul" +input_player3_down_mbtn = "nul" +input_player3_gun_aux_a = "nul" +input_player3_gun_aux_a_axis = "nul" +input_player3_gun_aux_a_btn = "nul" +input_player3_gun_aux_a_mbtn = "nul" +input_player3_gun_aux_b = "nul" +input_player3_gun_aux_b_axis = "nul" +input_player3_gun_aux_b_btn = "nul" +input_player3_gun_aux_b_mbtn = "nul" +input_player3_gun_aux_c = "nul" +input_player3_gun_aux_c_axis = "nul" +input_player3_gun_aux_c_btn = "nul" +input_player3_gun_aux_c_mbtn = "nul" +input_player3_gun_dpad_down = "nul" +input_player3_gun_dpad_down_axis = "nul" +input_player3_gun_dpad_down_btn = "nul" +input_player3_gun_dpad_down_mbtn = "nul" +input_player3_gun_dpad_left = "nul" +input_player3_gun_dpad_left_axis = "nul" +input_player3_gun_dpad_left_btn = "nul" +input_player3_gun_dpad_left_mbtn = "nul" +input_player3_gun_dpad_right = "nul" +input_player3_gun_dpad_right_axis = "nul" +input_player3_gun_dpad_right_btn = "nul" +input_player3_gun_dpad_right_mbtn = "nul" +input_player3_gun_dpad_up = "nul" +input_player3_gun_dpad_up_axis = "nul" +input_player3_gun_dpad_up_btn = "nul" +input_player3_gun_dpad_up_mbtn = "nul" +input_player3_gun_offscreen_shot = "nul" +input_player3_gun_offscreen_shot_axis = "nul" +input_player3_gun_offscreen_shot_btn = "nul" +input_player3_gun_offscreen_shot_mbtn = "nul" +input_player3_gun_select = "nul" +input_player3_gun_select_axis = "nul" +input_player3_gun_select_btn = "nul" +input_player3_gun_select_mbtn = "nul" +input_player3_gun_start = "nul" +input_player3_gun_start_axis = "nul" +input_player3_gun_start_btn = "nul" +input_player3_gun_start_mbtn = "nul" +input_player3_gun_trigger = "nul" +input_player3_gun_trigger_axis = "nul" +input_player3_gun_trigger_btn = "nul" +input_player3_gun_trigger_mbtn = "1" +input_player3_joypad_index = "2" +input_player3_l = "nul" +input_player3_l2 = "nul" +input_player3_l2_axis = "nul" +input_player3_l2_btn = "nul" +input_player3_l2_mbtn = "nul" +input_player3_l3 = "nul" +input_player3_l3_axis = "nul" +input_player3_l3_btn = "nul" +input_player3_l3_mbtn = "nul" +input_player3_l_axis = "nul" +input_player3_l_btn = "nul" +input_player3_l_mbtn = "nul" +input_player3_l_x_minus = "nul" +input_player3_l_x_minus_axis = "nul" +input_player3_l_x_minus_btn = "nul" +input_player3_l_x_minus_mbtn = "nul" +input_player3_l_x_plus = "nul" +input_player3_l_x_plus_axis = "nul" +input_player3_l_x_plus_btn = "nul" +input_player3_l_x_plus_mbtn = "nul" +input_player3_l_y_minus = "nul" +input_player3_l_y_minus_axis = "nul" +input_player3_l_y_minus_btn = "nul" +input_player3_l_y_minus_mbtn = "nul" +input_player3_l_y_plus = "nul" +input_player3_l_y_plus_axis = "nul" +input_player3_l_y_plus_btn = "nul" +input_player3_l_y_plus_mbtn = "nul" +input_player3_left = "nul" +input_player3_left_axis = "nul" +input_player3_left_btn = "nul" +input_player3_left_mbtn = "nul" +input_player3_mouse_index = "2" +input_player3_r = "nul" +input_player3_r2 = "nul" +input_player3_r2_axis = "nul" +input_player3_r2_btn = "nul" +input_player3_r2_mbtn = "nul" +input_player3_r3 = "nul" +input_player3_r3_axis = "nul" +input_player3_r3_btn = "nul" +input_player3_r3_mbtn = "nul" +input_player3_r_axis = "nul" +input_player3_r_btn = "nul" +input_player3_r_mbtn = "nul" +input_player3_r_x_minus = "nul" +input_player3_r_x_minus_axis = "nul" +input_player3_r_x_minus_btn = "nul" +input_player3_r_x_minus_mbtn = "nul" +input_player3_r_x_plus = "nul" +input_player3_r_x_plus_axis = "nul" +input_player3_r_x_plus_btn = "nul" +input_player3_r_x_plus_mbtn = "nul" +input_player3_r_y_minus = "nul" +input_player3_r_y_minus_axis = "nul" +input_player3_r_y_minus_btn = "nul" +input_player3_r_y_minus_mbtn = "nul" +input_player3_r_y_plus = "nul" +input_player3_r_y_plus_axis = "nul" +input_player3_r_y_plus_btn = "nul" +input_player3_r_y_plus_mbtn = "nul" +input_player3_right = "nul" +input_player3_right_axis = "nul" +input_player3_right_btn = "nul" +input_player3_right_mbtn = "nul" +input_player3_select = "nul" +input_player3_select_axis = "nul" +input_player3_select_btn = "nul" +input_player3_select_mbtn = "nul" +input_player3_start = "nul" +input_player3_start_axis = "nul" +input_player3_start_btn = "nul" +input_player3_start_mbtn = "nul" +input_player3_turbo = "nul" +input_player3_turbo_axis = "nul" +input_player3_turbo_btn = "nul" +input_player3_turbo_mbtn = "nul" +input_player3_up = "nul" +input_player3_up_axis = "nul" +input_player3_up_btn = "nul" +input_player3_up_mbtn = "nul" +input_player3_x = "nul" +input_player3_x_axis = "nul" +input_player3_x_btn = "nul" +input_player3_x_mbtn = "nul" +input_player3_y = "nul" +input_player3_y_axis = "nul" +input_player3_y_btn = "nul" +input_player3_y_mbtn = "nul" +input_player4_a = "nul" +input_player4_a_axis = "nul" +input_player4_a_btn = "nul" +input_player4_a_mbtn = "nul" +input_player4_analog_dpad_mode = "0" +input_player4_b = "nul" +input_player4_b_axis = "nul" +input_player4_b_btn = "nul" +input_player4_b_mbtn = "nul" +input_player4_down = "nul" +input_player4_down_axis = "nul" +input_player4_down_btn = "nul" +input_player4_down_mbtn = "nul" +input_player4_gun_aux_a = "nul" +input_player4_gun_aux_a_axis = "nul" +input_player4_gun_aux_a_btn = "nul" +input_player4_gun_aux_a_mbtn = "nul" +input_player4_gun_aux_b = "nul" +input_player4_gun_aux_b_axis = "nul" +input_player4_gun_aux_b_btn = "nul" +input_player4_gun_aux_b_mbtn = "nul" +input_player4_gun_aux_c = "nul" +input_player4_gun_aux_c_axis = "nul" +input_player4_gun_aux_c_btn = "nul" +input_player4_gun_aux_c_mbtn = "nul" +input_player4_gun_dpad_down = "nul" +input_player4_gun_dpad_down_axis = "nul" +input_player4_gun_dpad_down_btn = "nul" +input_player4_gun_dpad_down_mbtn = "nul" +input_player4_gun_dpad_left = "nul" +input_player4_gun_dpad_left_axis = "nul" +input_player4_gun_dpad_left_btn = "nul" +input_player4_gun_dpad_left_mbtn = "nul" +input_player4_gun_dpad_right = "nul" +input_player4_gun_dpad_right_axis = "nul" +input_player4_gun_dpad_right_btn = "nul" +input_player4_gun_dpad_right_mbtn = "nul" +input_player4_gun_dpad_up = "nul" +input_player4_gun_dpad_up_axis = "nul" +input_player4_gun_dpad_up_btn = "nul" +input_player4_gun_dpad_up_mbtn = "nul" +input_player4_gun_offscreen_shot = "nul" +input_player4_gun_offscreen_shot_axis = "nul" +input_player4_gun_offscreen_shot_btn = "nul" +input_player4_gun_offscreen_shot_mbtn = "nul" +input_player4_gun_select = "nul" +input_player4_gun_select_axis = "nul" +input_player4_gun_select_btn = "nul" +input_player4_gun_select_mbtn = "nul" +input_player4_gun_start = "nul" +input_player4_gun_start_axis = "nul" +input_player4_gun_start_btn = "nul" +input_player4_gun_start_mbtn = "nul" +input_player4_gun_trigger = "nul" +input_player4_gun_trigger_axis = "nul" +input_player4_gun_trigger_btn = "nul" +input_player4_gun_trigger_mbtn = "1" +input_player4_joypad_index = "3" +input_player4_l = "nul" +input_player4_l2 = "nul" +input_player4_l2_axis = "nul" +input_player4_l2_btn = "nul" +input_player4_l2_mbtn = "nul" +input_player4_l3 = "nul" +input_player4_l3_axis = "nul" +input_player4_l3_btn = "nul" +input_player4_l3_mbtn = "nul" +input_player4_l_axis = "nul" +input_player4_l_btn = "nul" +input_player4_l_mbtn = "nul" +input_player4_l_x_minus = "nul" +input_player4_l_x_minus_axis = "nul" +input_player4_l_x_minus_btn = "nul" +input_player4_l_x_minus_mbtn = "nul" +input_player4_l_x_plus = "nul" +input_player4_l_x_plus_axis = "nul" +input_player4_l_x_plus_btn = "nul" +input_player4_l_x_plus_mbtn = "nul" +input_player4_l_y_minus = "nul" +input_player4_l_y_minus_axis = "nul" +input_player4_l_y_minus_btn = "nul" +input_player4_l_y_minus_mbtn = "nul" +input_player4_l_y_plus = "nul" +input_player4_l_y_plus_axis = "nul" +input_player4_l_y_plus_btn = "nul" +input_player4_l_y_plus_mbtn = "nul" +input_player4_left = "nul" +input_player4_left_axis = "nul" +input_player4_left_btn = "nul" +input_player4_left_mbtn = "nul" +input_player4_mouse_index = "3" +input_player4_r = "nul" +input_player4_r2 = "nul" +input_player4_r2_axis = "nul" +input_player4_r2_btn = "nul" +input_player4_r2_mbtn = "nul" +input_player4_r3 = "nul" +input_player4_r3_axis = "nul" +input_player4_r3_btn = "nul" +input_player4_r3_mbtn = "nul" +input_player4_r_axis = "nul" +input_player4_r_btn = "nul" +input_player4_r_mbtn = "nul" +input_player4_r_x_minus = "nul" +input_player4_r_x_minus_axis = "nul" +input_player4_r_x_minus_btn = "nul" +input_player4_r_x_minus_mbtn = "nul" +input_player4_r_x_plus = "nul" +input_player4_r_x_plus_axis = "nul" +input_player4_r_x_plus_btn = "nul" +input_player4_r_x_plus_mbtn = "nul" +input_player4_r_y_minus = "nul" +input_player4_r_y_minus_axis = "nul" +input_player4_r_y_minus_btn = "nul" +input_player4_r_y_minus_mbtn = "nul" +input_player4_r_y_plus = "nul" +input_player4_r_y_plus_axis = "nul" +input_player4_r_y_plus_btn = "nul" +input_player4_r_y_plus_mbtn = "nul" +input_player4_right = "nul" +input_player4_right_axis = "nul" +input_player4_right_btn = "nul" +input_player4_right_mbtn = "nul" +input_player4_select = "nul" +input_player4_select_axis = "nul" +input_player4_select_btn = "nul" +input_player4_select_mbtn = "nul" +input_player4_start = "nul" +input_player4_start_axis = "nul" +input_player4_start_btn = "nul" +input_player4_start_mbtn = "nul" +input_player4_turbo = "nul" +input_player4_turbo_axis = "nul" +input_player4_turbo_btn = "nul" +input_player4_turbo_mbtn = "nul" +input_player4_up = "nul" +input_player4_up_axis = "nul" +input_player4_up_btn = "nul" +input_player4_up_mbtn = "nul" +input_player4_x = "nul" +input_player4_x_axis = "nul" +input_player4_x_btn = "nul" +input_player4_x_mbtn = "nul" +input_player4_y = "nul" +input_player4_y_axis = "nul" +input_player4_y_btn = "nul" +input_player4_y_mbtn = "nul" +input_player5_a = "nul" +input_player5_a_axis = "nul" +input_player5_a_btn = "nul" +input_player5_a_mbtn = "nul" +input_player5_analog_dpad_mode = "0" +input_player5_b = "nul" +input_player5_b_axis = "nul" +input_player5_b_btn = "nul" +input_player5_b_mbtn = "nul" +input_player5_down = "nul" +input_player5_down_axis = "nul" +input_player5_down_btn = "nul" +input_player5_down_mbtn = "nul" +input_player5_gun_aux_a = "nul" +input_player5_gun_aux_a_axis = "nul" +input_player5_gun_aux_a_btn = "nul" +input_player5_gun_aux_a_mbtn = "nul" +input_player5_gun_aux_b = "nul" +input_player5_gun_aux_b_axis = "nul" +input_player5_gun_aux_b_btn = "nul" +input_player5_gun_aux_b_mbtn = "nul" +input_player5_gun_aux_c = "nul" +input_player5_gun_aux_c_axis = "nul" +input_player5_gun_aux_c_btn = "nul" +input_player5_gun_aux_c_mbtn = "nul" +input_player5_gun_dpad_down = "nul" +input_player5_gun_dpad_down_axis = "nul" +input_player5_gun_dpad_down_btn = "nul" +input_player5_gun_dpad_down_mbtn = "nul" +input_player5_gun_dpad_left = "nul" +input_player5_gun_dpad_left_axis = "nul" +input_player5_gun_dpad_left_btn = "nul" +input_player5_gun_dpad_left_mbtn = "nul" +input_player5_gun_dpad_right = "nul" +input_player5_gun_dpad_right_axis = "nul" +input_player5_gun_dpad_right_btn = "nul" +input_player5_gun_dpad_right_mbtn = "nul" +input_player5_gun_dpad_up = "nul" +input_player5_gun_dpad_up_axis = "nul" +input_player5_gun_dpad_up_btn = "nul" +input_player5_gun_dpad_up_mbtn = "nul" +input_player5_gun_offscreen_shot = "nul" +input_player5_gun_offscreen_shot_axis = "nul" +input_player5_gun_offscreen_shot_btn = "nul" +input_player5_gun_offscreen_shot_mbtn = "nul" +input_player5_gun_select = "nul" +input_player5_gun_select_axis = "nul" +input_player5_gun_select_btn = "nul" +input_player5_gun_select_mbtn = "nul" +input_player5_gun_start = "nul" +input_player5_gun_start_axis = "nul" +input_player5_gun_start_btn = "nul" +input_player5_gun_start_mbtn = "nul" +input_player5_gun_trigger = "nul" +input_player5_gun_trigger_axis = "nul" +input_player5_gun_trigger_btn = "nul" +input_player5_gun_trigger_mbtn = "1" +input_player5_joypad_index = "4" +input_player5_l = "nul" +input_player5_l2 = "nul" +input_player5_l2_axis = "nul" +input_player5_l2_btn = "nul" +input_player5_l2_mbtn = "nul" +input_player5_l3 = "nul" +input_player5_l3_axis = "nul" +input_player5_l3_btn = "nul" +input_player5_l3_mbtn = "nul" +input_player5_l_axis = "nul" +input_player5_l_btn = "nul" +input_player5_l_mbtn = "nul" +input_player5_l_x_minus = "nul" +input_player5_l_x_minus_axis = "nul" +input_player5_l_x_minus_btn = "nul" +input_player5_l_x_minus_mbtn = "nul" +input_player5_l_x_plus = "nul" +input_player5_l_x_plus_axis = "nul" +input_player5_l_x_plus_btn = "nul" +input_player5_l_x_plus_mbtn = "nul" +input_player5_l_y_minus = "nul" +input_player5_l_y_minus_axis = "nul" +input_player5_l_y_minus_btn = "nul" +input_player5_l_y_minus_mbtn = "nul" +input_player5_l_y_plus = "nul" +input_player5_l_y_plus_axis = "nul" +input_player5_l_y_plus_btn = "nul" +input_player5_l_y_plus_mbtn = "nul" +input_player5_left = "nul" +input_player5_left_axis = "nul" +input_player5_left_btn = "nul" +input_player5_left_mbtn = "nul" +input_player5_mouse_index = "4" +input_player5_r = "nul" +input_player5_r2 = "nul" +input_player5_r2_axis = "nul" +input_player5_r2_btn = "nul" +input_player5_r2_mbtn = "nul" +input_player5_r3 = "nul" +input_player5_r3_axis = "nul" +input_player5_r3_btn = "nul" +input_player5_r3_mbtn = "nul" +input_player5_r_axis = "nul" +input_player5_r_btn = "nul" +input_player5_r_mbtn = "nul" +input_player5_r_x_minus = "nul" +input_player5_r_x_minus_axis = "nul" +input_player5_r_x_minus_btn = "nul" +input_player5_r_x_minus_mbtn = "nul" +input_player5_r_x_plus = "nul" +input_player5_r_x_plus_axis = "nul" +input_player5_r_x_plus_btn = "nul" +input_player5_r_x_plus_mbtn = "nul" +input_player5_r_y_minus = "nul" +input_player5_r_y_minus_axis = "nul" +input_player5_r_y_minus_btn = "nul" +input_player5_r_y_minus_mbtn = "nul" +input_player5_r_y_plus = "nul" +input_player5_r_y_plus_axis = "nul" +input_player5_r_y_plus_btn = "nul" +input_player5_r_y_plus_mbtn = "nul" +input_player5_right = "nul" +input_player5_right_axis = "nul" +input_player5_right_btn = "nul" +input_player5_right_mbtn = "nul" +input_player5_select = "nul" +input_player5_select_axis = "nul" +input_player5_select_btn = "nul" +input_player5_select_mbtn = "nul" +input_player5_start = "nul" +input_player5_start_axis = "nul" +input_player5_start_btn = "nul" +input_player5_start_mbtn = "nul" +input_player5_turbo = "nul" +input_player5_turbo_axis = "nul" +input_player5_turbo_btn = "nul" +input_player5_turbo_mbtn = "nul" +input_player5_up = "nul" +input_player5_up_axis = "nul" +input_player5_up_btn = "nul" +input_player5_up_mbtn = "nul" +input_player5_x = "nul" +input_player5_x_axis = "nul" +input_player5_x_btn = "nul" +input_player5_x_mbtn = "nul" +input_player5_y = "nul" +input_player5_y_axis = "nul" +input_player5_y_btn = "nul" +input_player5_y_mbtn = "nul" +input_player6_a = "nul" +input_player6_a_axis = "nul" +input_player6_a_btn = "nul" +input_player6_a_mbtn = "nul" +input_player6_analog_dpad_mode = "0" +input_player6_b = "nul" +input_player6_b_axis = "nul" +input_player6_b_btn = "nul" +input_player6_b_mbtn = "nul" +input_player6_down = "nul" +input_player6_down_axis = "nul" +input_player6_down_btn = "nul" +input_player6_down_mbtn = "nul" +input_player6_gun_aux_a = "nul" +input_player6_gun_aux_a_axis = "nul" +input_player6_gun_aux_a_btn = "nul" +input_player6_gun_aux_a_mbtn = "nul" +input_player6_gun_aux_b = "nul" +input_player6_gun_aux_b_axis = "nul" +input_player6_gun_aux_b_btn = "nul" +input_player6_gun_aux_b_mbtn = "nul" +input_player6_gun_aux_c = "nul" +input_player6_gun_aux_c_axis = "nul" +input_player6_gun_aux_c_btn = "nul" +input_player6_gun_aux_c_mbtn = "nul" +input_player6_gun_dpad_down = "nul" +input_player6_gun_dpad_down_axis = "nul" +input_player6_gun_dpad_down_btn = "nul" +input_player6_gun_dpad_down_mbtn = "nul" +input_player6_gun_dpad_left = "nul" +input_player6_gun_dpad_left_axis = "nul" +input_player6_gun_dpad_left_btn = "nul" +input_player6_gun_dpad_left_mbtn = "nul" +input_player6_gun_dpad_right = "nul" +input_player6_gun_dpad_right_axis = "nul" +input_player6_gun_dpad_right_btn = "nul" +input_player6_gun_dpad_right_mbtn = "nul" +input_player6_gun_dpad_up = "nul" +input_player6_gun_dpad_up_axis = "nul" +input_player6_gun_dpad_up_btn = "nul" +input_player6_gun_dpad_up_mbtn = "nul" +input_player6_gun_offscreen_shot = "nul" +input_player6_gun_offscreen_shot_axis = "nul" +input_player6_gun_offscreen_shot_btn = "nul" +input_player6_gun_offscreen_shot_mbtn = "nul" +input_player6_gun_select = "nul" +input_player6_gun_select_axis = "nul" +input_player6_gun_select_btn = "nul" +input_player6_gun_select_mbtn = "nul" +input_player6_gun_start = "nul" +input_player6_gun_start_axis = "nul" +input_player6_gun_start_btn = "nul" +input_player6_gun_start_mbtn = "nul" +input_player6_gun_trigger = "nul" +input_player6_gun_trigger_axis = "nul" +input_player6_gun_trigger_btn = "nul" +input_player6_gun_trigger_mbtn = "1" +input_player6_joypad_index = "5" +input_player6_l = "nul" +input_player6_l2 = "nul" +input_player6_l2_axis = "nul" +input_player6_l2_btn = "nul" +input_player6_l2_mbtn = "nul" +input_player6_l3 = "nul" +input_player6_l3_axis = "nul" +input_player6_l3_btn = "nul" +input_player6_l3_mbtn = "nul" +input_player6_l_axis = "nul" +input_player6_l_btn = "nul" +input_player6_l_mbtn = "nul" +input_player6_l_x_minus = "nul" +input_player6_l_x_minus_axis = "nul" +input_player6_l_x_minus_btn = "nul" +input_player6_l_x_minus_mbtn = "nul" +input_player6_l_x_plus = "nul" +input_player6_l_x_plus_axis = "nul" +input_player6_l_x_plus_btn = "nul" +input_player6_l_x_plus_mbtn = "nul" +input_player6_l_y_minus = "nul" +input_player6_l_y_minus_axis = "nul" +input_player6_l_y_minus_btn = "nul" +input_player6_l_y_minus_mbtn = "nul" +input_player6_l_y_plus = "nul" +input_player6_l_y_plus_axis = "nul" +input_player6_l_y_plus_btn = "nul" +input_player6_l_y_plus_mbtn = "nul" +input_player6_left = "nul" +input_player6_left_axis = "nul" +input_player6_left_btn = "nul" +input_player6_left_mbtn = "nul" +input_player6_mouse_index = "5" +input_player6_r = "nul" +input_player6_r2 = "nul" +input_player6_r2_axis = "nul" +input_player6_r2_btn = "nul" +input_player6_r2_mbtn = "nul" +input_player6_r3 = "nul" +input_player6_r3_axis = "nul" +input_player6_r3_btn = "nul" +input_player6_r3_mbtn = "nul" +input_player6_r_axis = "nul" +input_player6_r_btn = "nul" +input_player6_r_mbtn = "nul" +input_player6_r_x_minus = "nul" +input_player6_r_x_minus_axis = "nul" +input_player6_r_x_minus_btn = "nul" +input_player6_r_x_minus_mbtn = "nul" +input_player6_r_x_plus = "nul" +input_player6_r_x_plus_axis = "nul" +input_player6_r_x_plus_btn = "nul" +input_player6_r_x_plus_mbtn = "nul" +input_player6_r_y_minus = "nul" +input_player6_r_y_minus_axis = "nul" +input_player6_r_y_minus_btn = "nul" +input_player6_r_y_minus_mbtn = "nul" +input_player6_r_y_plus = "nul" +input_player6_r_y_plus_axis = "nul" +input_player6_r_y_plus_btn = "nul" +input_player6_r_y_plus_mbtn = "nul" +input_player6_right = "nul" +input_player6_right_axis = "nul" +input_player6_right_btn = "nul" +input_player6_right_mbtn = "nul" +input_player6_select = "nul" +input_player6_select_axis = "nul" +input_player6_select_btn = "nul" +input_player6_select_mbtn = "nul" +input_player6_start = "nul" +input_player6_start_axis = "nul" +input_player6_start_btn = "nul" +input_player6_start_mbtn = "nul" +input_player6_turbo = "nul" +input_player6_turbo_axis = "nul" +input_player6_turbo_btn = "nul" +input_player6_turbo_mbtn = "nul" +input_player6_up = "nul" +input_player6_up_axis = "nul" +input_player6_up_btn = "nul" +input_player6_up_mbtn = "nul" +input_player6_x = "nul" +input_player6_x_axis = "nul" +input_player6_x_btn = "nul" +input_player6_x_mbtn = "nul" +input_player6_y = "nul" +input_player6_y_axis = "nul" +input_player6_y_btn = "nul" +input_player6_y_mbtn = "nul" +input_player7_a = "nul" +input_player7_a_axis = "nul" +input_player7_a_btn = "nul" +input_player7_a_mbtn = "nul" +input_player7_analog_dpad_mode = "0" +input_player7_b = "nul" +input_player7_b_axis = "nul" +input_player7_b_btn = "nul" +input_player7_b_mbtn = "nul" +input_player7_down = "nul" +input_player7_down_axis = "nul" +input_player7_down_btn = "nul" +input_player7_down_mbtn = "nul" +input_player7_gun_aux_a = "nul" +input_player7_gun_aux_a_axis = "nul" +input_player7_gun_aux_a_btn = "nul" +input_player7_gun_aux_a_mbtn = "nul" +input_player7_gun_aux_b = "nul" +input_player7_gun_aux_b_axis = "nul" +input_player7_gun_aux_b_btn = "nul" +input_player7_gun_aux_b_mbtn = "nul" +input_player7_gun_aux_c = "nul" +input_player7_gun_aux_c_axis = "nul" +input_player7_gun_aux_c_btn = "nul" +input_player7_gun_aux_c_mbtn = "nul" +input_player7_gun_dpad_down = "nul" +input_player7_gun_dpad_down_axis = "nul" +input_player7_gun_dpad_down_btn = "nul" +input_player7_gun_dpad_down_mbtn = "nul" +input_player7_gun_dpad_left = "nul" +input_player7_gun_dpad_left_axis = "nul" +input_player7_gun_dpad_left_btn = "nul" +input_player7_gun_dpad_left_mbtn = "nul" +input_player7_gun_dpad_right = "nul" +input_player7_gun_dpad_right_axis = "nul" +input_player7_gun_dpad_right_btn = "nul" +input_player7_gun_dpad_right_mbtn = "nul" +input_player7_gun_dpad_up = "nul" +input_player7_gun_dpad_up_axis = "nul" +input_player7_gun_dpad_up_btn = "nul" +input_player7_gun_dpad_up_mbtn = "nul" +input_player7_gun_offscreen_shot = "nul" +input_player7_gun_offscreen_shot_axis = "nul" +input_player7_gun_offscreen_shot_btn = "nul" +input_player7_gun_offscreen_shot_mbtn = "nul" +input_player7_gun_select = "nul" +input_player7_gun_select_axis = "nul" +input_player7_gun_select_btn = "nul" +input_player7_gun_select_mbtn = "nul" +input_player7_gun_start = "nul" +input_player7_gun_start_axis = "nul" +input_player7_gun_start_btn = "nul" +input_player7_gun_start_mbtn = "nul" +input_player7_gun_trigger = "nul" +input_player7_gun_trigger_axis = "nul" +input_player7_gun_trigger_btn = "nul" +input_player7_gun_trigger_mbtn = "1" +input_player7_joypad_index = "6" +input_player7_l = "nul" +input_player7_l2 = "nul" +input_player7_l2_axis = "nul" +input_player7_l2_btn = "nul" +input_player7_l2_mbtn = "nul" +input_player7_l3 = "nul" +input_player7_l3_axis = "nul" +input_player7_l3_btn = "nul" +input_player7_l3_mbtn = "nul" +input_player7_l_axis = "nul" +input_player7_l_btn = "nul" +input_player7_l_mbtn = "nul" +input_player7_l_x_minus = "nul" +input_player7_l_x_minus_axis = "nul" +input_player7_l_x_minus_btn = "nul" +input_player7_l_x_minus_mbtn = "nul" +input_player7_l_x_plus = "nul" +input_player7_l_x_plus_axis = "nul" +input_player7_l_x_plus_btn = "nul" +input_player7_l_x_plus_mbtn = "nul" +input_player7_l_y_minus = "nul" +input_player7_l_y_minus_axis = "nul" +input_player7_l_y_minus_btn = "nul" +input_player7_l_y_minus_mbtn = "nul" +input_player7_l_y_plus = "nul" +input_player7_l_y_plus_axis = "nul" +input_player7_l_y_plus_btn = "nul" +input_player7_l_y_plus_mbtn = "nul" +input_player7_left = "nul" +input_player7_left_axis = "nul" +input_player7_left_btn = "nul" +input_player7_left_mbtn = "nul" +input_player7_mouse_index = "6" +input_player7_r = "nul" +input_player7_r2 = "nul" +input_player7_r2_axis = "nul" +input_player7_r2_btn = "nul" +input_player7_r2_mbtn = "nul" +input_player7_r3 = "nul" +input_player7_r3_axis = "nul" +input_player7_r3_btn = "nul" +input_player7_r3_mbtn = "nul" +input_player7_r_axis = "nul" +input_player7_r_btn = "nul" +input_player7_r_mbtn = "nul" +input_player7_r_x_minus = "nul" +input_player7_r_x_minus_axis = "nul" +input_player7_r_x_minus_btn = "nul" +input_player7_r_x_minus_mbtn = "nul" +input_player7_r_x_plus = "nul" +input_player7_r_x_plus_axis = "nul" +input_player7_r_x_plus_btn = "nul" +input_player7_r_x_plus_mbtn = "nul" +input_player7_r_y_minus = "nul" +input_player7_r_y_minus_axis = "nul" +input_player7_r_y_minus_btn = "nul" +input_player7_r_y_minus_mbtn = "nul" +input_player7_r_y_plus = "nul" +input_player7_r_y_plus_axis = "nul" +input_player7_r_y_plus_btn = "nul" +input_player7_r_y_plus_mbtn = "nul" +input_player7_right = "nul" +input_player7_right_axis = "nul" +input_player7_right_btn = "nul" +input_player7_right_mbtn = "nul" +input_player7_select = "nul" +input_player7_select_axis = "nul" +input_player7_select_btn = "nul" +input_player7_select_mbtn = "nul" +input_player7_start = "nul" +input_player7_start_axis = "nul" +input_player7_start_btn = "nul" +input_player7_start_mbtn = "nul" +input_player7_turbo = "nul" +input_player7_turbo_axis = "nul" +input_player7_turbo_btn = "nul" +input_player7_turbo_mbtn = "nul" +input_player7_up = "nul" +input_player7_up_axis = "nul" +input_player7_up_btn = "nul" +input_player7_up_mbtn = "nul" +input_player7_x = "nul" +input_player7_x_axis = "nul" +input_player7_x_btn = "nul" +input_player7_x_mbtn = "nul" +input_player7_y = "nul" +input_player7_y_axis = "nul" +input_player7_y_btn = "nul" +input_player7_y_mbtn = "nul" +input_player8_a = "nul" +input_player8_a_axis = "nul" +input_player8_a_btn = "nul" +input_player8_a_mbtn = "nul" +input_player8_analog_dpad_mode = "0" +input_player8_b = "nul" +input_player8_b_axis = "nul" +input_player8_b_btn = "nul" +input_player8_b_mbtn = "nul" +input_player8_down = "nul" +input_player8_down_axis = "nul" +input_player8_down_btn = "nul" +input_player8_down_mbtn = "nul" +input_player8_gun_aux_a = "nul" +input_player8_gun_aux_a_axis = "nul" +input_player8_gun_aux_a_btn = "nul" +input_player8_gun_aux_a_mbtn = "nul" +input_player8_gun_aux_b = "nul" +input_player8_gun_aux_b_axis = "nul" +input_player8_gun_aux_b_btn = "nul" +input_player8_gun_aux_b_mbtn = "nul" +input_player8_gun_aux_c = "nul" +input_player8_gun_aux_c_axis = "nul" +input_player8_gun_aux_c_btn = "nul" +input_player8_gun_aux_c_mbtn = "nul" +input_player8_gun_dpad_down = "nul" +input_player8_gun_dpad_down_axis = "nul" +input_player8_gun_dpad_down_btn = "nul" +input_player8_gun_dpad_down_mbtn = "nul" +input_player8_gun_dpad_left = "nul" +input_player8_gun_dpad_left_axis = "nul" +input_player8_gun_dpad_left_btn = "nul" +input_player8_gun_dpad_left_mbtn = "nul" +input_player8_gun_dpad_right = "nul" +input_player8_gun_dpad_right_axis = "nul" +input_player8_gun_dpad_right_btn = "nul" +input_player8_gun_dpad_right_mbtn = "nul" +input_player8_gun_dpad_up = "nul" +input_player8_gun_dpad_up_axis = "nul" +input_player8_gun_dpad_up_btn = "nul" +input_player8_gun_dpad_up_mbtn = "nul" +input_player8_gun_offscreen_shot = "nul" +input_player8_gun_offscreen_shot_axis = "nul" +input_player8_gun_offscreen_shot_btn = "nul" +input_player8_gun_offscreen_shot_mbtn = "nul" +input_player8_gun_select = "nul" +input_player8_gun_select_axis = "nul" +input_player8_gun_select_btn = "nul" +input_player8_gun_select_mbtn = "nul" +input_player8_gun_start = "nul" +input_player8_gun_start_axis = "nul" +input_player8_gun_start_btn = "nul" +input_player8_gun_start_mbtn = "nul" +input_player8_gun_trigger = "nul" +input_player8_gun_trigger_axis = "nul" +input_player8_gun_trigger_btn = "nul" +input_player8_gun_trigger_mbtn = "1" +input_player8_joypad_index = "7" +input_player8_l = "nul" +input_player8_l2 = "nul" +input_player8_l2_axis = "nul" +input_player8_l2_btn = "nul" +input_player8_l2_mbtn = "nul" +input_player8_l3 = "nul" +input_player8_l3_axis = "nul" +input_player8_l3_btn = "nul" +input_player8_l3_mbtn = "nul" +input_player8_l_axis = "nul" +input_player8_l_btn = "nul" +input_player8_l_mbtn = "nul" +input_player8_l_x_minus = "nul" +input_player8_l_x_minus_axis = "nul" +input_player8_l_x_minus_btn = "nul" +input_player8_l_x_minus_mbtn = "nul" +input_player8_l_x_plus = "nul" +input_player8_l_x_plus_axis = "nul" +input_player8_l_x_plus_btn = "nul" +input_player8_l_x_plus_mbtn = "nul" +input_player8_l_y_minus = "nul" +input_player8_l_y_minus_axis = "nul" +input_player8_l_y_minus_btn = "nul" +input_player8_l_y_minus_mbtn = "nul" +input_player8_l_y_plus = "nul" +input_player8_l_y_plus_axis = "nul" +input_player8_l_y_plus_btn = "nul" +input_player8_l_y_plus_mbtn = "nul" +input_player8_left = "nul" +input_player8_left_axis = "nul" +input_player8_left_btn = "nul" +input_player8_left_mbtn = "nul" +input_player8_mouse_index = "7" +input_player8_r = "nul" +input_player8_r2 = "nul" +input_player8_r2_axis = "nul" +input_player8_r2_btn = "nul" +input_player8_r2_mbtn = "nul" +input_player8_r3 = "nul" +input_player8_r3_axis = "nul" +input_player8_r3_btn = "nul" +input_player8_r3_mbtn = "nul" +input_player8_r_axis = "nul" +input_player8_r_btn = "nul" +input_player8_r_mbtn = "nul" +input_player8_r_x_minus = "nul" +input_player8_r_x_minus_axis = "nul" +input_player8_r_x_minus_btn = "nul" +input_player8_r_x_minus_mbtn = "nul" +input_player8_r_x_plus = "nul" +input_player8_r_x_plus_axis = "nul" +input_player8_r_x_plus_btn = "nul" +input_player8_r_x_plus_mbtn = "nul" +input_player8_r_y_minus = "nul" +input_player8_r_y_minus_axis = "nul" +input_player8_r_y_minus_btn = "nul" +input_player8_r_y_minus_mbtn = "nul" +input_player8_r_y_plus = "nul" +input_player8_r_y_plus_axis = "nul" +input_player8_r_y_plus_btn = "nul" +input_player8_r_y_plus_mbtn = "nul" +input_player8_right = "nul" +input_player8_right_axis = "nul" +input_player8_right_btn = "nul" +input_player8_right_mbtn = "nul" +input_player8_select = "nul" +input_player8_select_axis = "nul" +input_player8_select_btn = "nul" +input_player8_select_mbtn = "nul" +input_player8_start = "nul" +input_player8_start_axis = "nul" +input_player8_start_btn = "nul" +input_player8_start_mbtn = "nul" +input_player8_turbo = "nul" +input_player8_turbo_axis = "nul" +input_player8_turbo_btn = "nul" +input_player8_turbo_mbtn = "nul" +input_player8_up = "nul" +input_player8_up_axis = "nul" +input_player8_up_btn = "nul" +input_player8_up_mbtn = "nul" +input_player8_x = "nul" +input_player8_x_axis = "nul" +input_player8_x_btn = "nul" +input_player8_x_mbtn = "nul" +input_player8_y = "nul" +input_player8_y_axis = "nul" +input_player8_y_btn = "nul" +input_player8_y_mbtn = "nul" +input_player9_a = "nul" +input_player9_a_axis = "nul" +input_player9_a_btn = "nul" +input_player9_a_mbtn = "nul" +input_player9_analog_dpad_mode = "0" +input_player9_b = "nul" +input_player9_b_axis = "nul" +input_player9_b_btn = "nul" +input_player9_b_mbtn = "nul" +input_player9_down = "nul" +input_player9_down_axis = "nul" +input_player9_down_btn = "nul" +input_player9_down_mbtn = "nul" +input_player9_gun_aux_a = "nul" +input_player9_gun_aux_a_axis = "nul" +input_player9_gun_aux_a_btn = "nul" +input_player9_gun_aux_a_mbtn = "nul" +input_player9_gun_aux_b = "nul" +input_player9_gun_aux_b_axis = "nul" +input_player9_gun_aux_b_btn = "nul" +input_player9_gun_aux_b_mbtn = "nul" +input_player9_gun_aux_c = "nul" +input_player9_gun_aux_c_axis = "nul" +input_player9_gun_aux_c_btn = "nul" +input_player9_gun_aux_c_mbtn = "nul" +input_player9_gun_dpad_down = "nul" +input_player9_gun_dpad_down_axis = "nul" +input_player9_gun_dpad_down_btn = "nul" +input_player9_gun_dpad_down_mbtn = "nul" +input_player9_gun_dpad_left = "nul" +input_player9_gun_dpad_left_axis = "nul" +input_player9_gun_dpad_left_btn = "nul" +input_player9_gun_dpad_left_mbtn = "nul" +input_player9_gun_dpad_right = "nul" +input_player9_gun_dpad_right_axis = "nul" +input_player9_gun_dpad_right_btn = "nul" +input_player9_gun_dpad_right_mbtn = "nul" +input_player9_gun_dpad_up = "nul" +input_player9_gun_dpad_up_axis = "nul" +input_player9_gun_dpad_up_btn = "nul" +input_player9_gun_dpad_up_mbtn = "nul" +input_player9_gun_offscreen_shot = "nul" +input_player9_gun_offscreen_shot_axis = "nul" +input_player9_gun_offscreen_shot_btn = "nul" +input_player9_gun_offscreen_shot_mbtn = "nul" +input_player9_gun_select = "nul" +input_player9_gun_select_axis = "nul" +input_player9_gun_select_btn = "nul" +input_player9_gun_select_mbtn = "nul" +input_player9_gun_start = "nul" +input_player9_gun_start_axis = "nul" +input_player9_gun_start_btn = "nul" +input_player9_gun_start_mbtn = "nul" +input_player9_gun_trigger = "nul" +input_player9_gun_trigger_axis = "nul" +input_player9_gun_trigger_btn = "nul" +input_player9_gun_trigger_mbtn = "1" +input_player9_joypad_index = "8" +input_player9_l = "nul" +input_player9_l2 = "nul" +input_player9_l2_axis = "nul" +input_player9_l2_btn = "nul" +input_player9_l2_mbtn = "nul" +input_player9_l3 = "nul" +input_player9_l3_axis = "nul" +input_player9_l3_btn = "nul" +input_player9_l3_mbtn = "nul" +input_player9_l_axis = "nul" +input_player9_l_btn = "nul" +input_player9_l_mbtn = "nul" +input_player9_l_x_minus = "nul" +input_player9_l_x_minus_axis = "nul" +input_player9_l_x_minus_btn = "nul" +input_player9_l_x_minus_mbtn = "nul" +input_player9_l_x_plus = "nul" +input_player9_l_x_plus_axis = "nul" +input_player9_l_x_plus_btn = "nul" +input_player9_l_x_plus_mbtn = "nul" +input_player9_l_y_minus = "nul" +input_player9_l_y_minus_axis = "nul" +input_player9_l_y_minus_btn = "nul" +input_player9_l_y_minus_mbtn = "nul" +input_player9_l_y_plus = "nul" +input_player9_l_y_plus_axis = "nul" +input_player9_l_y_plus_btn = "nul" +input_player9_l_y_plus_mbtn = "nul" +input_player9_left = "nul" +input_player9_left_axis = "nul" +input_player9_left_btn = "nul" +input_player9_left_mbtn = "nul" +input_player9_mouse_index = "8" +input_player9_r = "nul" +input_player9_r2 = "nul" +input_player9_r2_axis = "nul" +input_player9_r2_btn = "nul" +input_player9_r2_mbtn = "nul" +input_player9_r3 = "nul" +input_player9_r3_axis = "nul" +input_player9_r3_btn = "nul" +input_player9_r3_mbtn = "nul" +input_player9_r_axis = "nul" +input_player9_r_btn = "nul" +input_player9_r_mbtn = "nul" +input_player9_r_x_minus = "nul" +input_player9_r_x_minus_axis = "nul" +input_player9_r_x_minus_btn = "nul" +input_player9_r_x_minus_mbtn = "nul" +input_player9_r_x_plus = "nul" +input_player9_r_x_plus_axis = "nul" +input_player9_r_x_plus_btn = "nul" +input_player9_r_x_plus_mbtn = "nul" +input_player9_r_y_minus = "nul" +input_player9_r_y_minus_axis = "nul" +input_player9_r_y_minus_btn = "nul" +input_player9_r_y_minus_mbtn = "nul" +input_player9_r_y_plus = "nul" +input_player9_r_y_plus_axis = "nul" +input_player9_r_y_plus_btn = "nul" +input_player9_r_y_plus_mbtn = "nul" +input_player9_right = "nul" +input_player9_right_axis = "nul" +input_player9_right_btn = "nul" +input_player9_right_mbtn = "nul" +input_player9_select = "nul" +input_player9_select_axis = "nul" +input_player9_select_btn = "nul" +input_player9_select_mbtn = "nul" +input_player9_start = "nul" +input_player9_start_axis = "nul" +input_player9_start_btn = "nul" +input_player9_start_mbtn = "nul" +input_player9_turbo = "nul" +input_player9_turbo_axis = "nul" +input_player9_turbo_btn = "nul" +input_player9_turbo_mbtn = "nul" +input_player9_up = "nul" +input_player9_up_axis = "nul" +input_player9_up_btn = "nul" +input_player9_up_mbtn = "nul" +input_player9_x = "nul" +input_player9_x_axis = "nul" +input_player9_x_btn = "nul" +input_player9_x_mbtn = "nul" +input_player9_y = "nul" +input_player9_y_axis = "nul" +input_player9_y_btn = "nul" +input_player9_y_mbtn = "nul" +input_poll_type_behavior = "2" +input_quit_gamepad_combo = "0" +input_recording_toggle = "nul" +input_recording_toggle_axis = "nul" +input_recording_toggle_btn = "nul" +input_recording_toggle_mbtn = "nul" +input_remap_binds_enable = "true" +input_remapping_directory = "~/.config/retroarch/config/remaps" +input_reset = "h" +input_reset_axis = "nul" +input_reset_btn = "nul" +input_reset_mbtn = "nul" +input_rewind = "r" +input_rewind_axis = "nul" +input_rewind_btn = "nul" +input_rewind_mbtn = "nul" +input_rumble_gain = "100" +input_runahead_toggle = "nul" +input_runahead_toggle_axis = "nul" +input_runahead_toggle_btn = "nul" +input_runahead_toggle_mbtn = "nul" +input_save_state = "f2" +input_save_state_axis = "nul" +input_save_state_btn = "nul" +input_save_state_mbtn = "nul" +input_screenshot = "f8" +input_screenshot_axis = "nul" +input_screenshot_btn = "nul" +input_screenshot_mbtn = "nul" +input_send_debug_info = "f10" +input_send_debug_info_axis = "nul" +input_send_debug_info_btn = "nul" +input_send_debug_info_mbtn = "nul" +input_sensors_enable = "true" +input_shader_next = "m" +input_shader_next_axis = "nul" +input_shader_next_btn = "nul" +input_shader_next_mbtn = "nul" +input_shader_prev = "n" +input_shader_prev_axis = "nul" +input_shader_prev_btn = "nul" +input_shader_prev_mbtn = "nul" +input_state_slot_decrease = "f6" +input_state_slot_decrease_axis = "nul" +input_state_slot_decrease_btn = "nul" +input_state_slot_decrease_mbtn = "nul" +input_state_slot_increase = "f7" +input_state_slot_increase_axis = "nul" +input_state_slot_increase_btn = "nul" +input_state_slot_increase_mbtn = "nul" +input_streaming_toggle = "nul" +input_streaming_toggle_axis = "nul" +input_streaming_toggle_btn = "nul" +input_streaming_toggle_mbtn = "nul" +input_toggle_fast_forward = "space" +input_toggle_fast_forward_axis = "nul" +input_toggle_fast_forward_btn = "nul" +input_toggle_fast_forward_mbtn = "nul" +input_toggle_fullscreen = "f" +input_toggle_fullscreen_axis = "nul" +input_toggle_fullscreen_btn = "nul" +input_toggle_fullscreen_mbtn = "nul" +input_toggle_slowmotion = "nul" +input_toggle_slowmotion_axis = "nul" +input_toggle_slowmotion_btn = "nul" +input_toggle_slowmotion_mbtn = "nul" +input_toggle_statistics = "nul" +input_toggle_statistics_axis = "nul" +input_toggle_statistics_btn = "nul" +input_toggle_statistics_mbtn = "nul" +input_touch_scale = "1" +input_turbo_default_button = "0" +input_turbo_mode = "0" +input_turbo_period = "6" +input_volume_down = "subtract" +input_volume_down_axis = "nul" +input_volume_down_btn = "nul" +input_volume_down_mbtn = "nul" +input_volume_up = "add" +input_volume_up_axis = "nul" +input_volume_up_btn = "nul" +input_volume_up_mbtn = "nul" +joypad_autoconfig_dir = "~/.config/retroarch/autoconfig" +keyboard_gamepad_enable = "true" +keyboard_gamepad_mapping_type = "1" +kiosk_mode_enable = "false" +kiosk_mode_password = "" +led_driver = "null" +libretro_directory = "/usr/lib/libretro" +libretro_info_path = "/usr/share/libretro/info" +libretro_log_level = "1" +load_dummy_on_core_shutdown = "true" +location_allow = "false" +location_driver = "null" +log_dir = "~/.config/retroarch/logs" +log_to_file = "false" +log_to_file_timestamp = "false" +log_verbosity = "false" +materialui_auto_rotate_nav_bar = "true" +materialui_dual_thumbnail_list_view_enable = "true" +materialui_icons_enable = "true" +materialui_landscape_layout_optimization = "1" +materialui_menu_color_theme = "9" +materialui_menu_transition_animation = "0" +materialui_playlist_icons_enable = "true" +materialui_show_nav_bar = "true" +materialui_thumbnail_background_enable = "true" +materialui_thumbnail_view_landscape = "2" +materialui_thumbnail_view_portrait = "1" +memory_show = "false" +memory_update_interval = "256" +menu_battery_level_enable = "true" +menu_core_enable = "true" +menu_driver = "ozone" +menu_dynamic_wallpaper_enable = "true" +menu_enable_widgets = "true" +menu_font_color_blue = "255" +menu_font_color_green = "255" +menu_font_color_red = "255" +menu_footer_opacity = "1.000000" +menu_framebuffer_opacity = "0.900000" +menu_header_opacity = "1.000000" +menu_horizontal_animation = "true" +menu_insert_disk_resume = "true" +menu_left_thumbnails = "0" +menu_linear_filter = "false" +menu_mouse_enable = "true" +menu_navigation_browser_filter_supported_extensions_enable = "true" +menu_navigation_wraparound_enable = "true" +menu_pause_libretro = "true" +menu_pointer_enable = "false" +menu_rgui_full_width_layout = "true" +menu_rgui_shadows = "false" +menu_rgui_transparency = "true" +menu_savestate_resume = "true" +menu_scale_factor = "1.000000" +menu_screensaver_animation = "0" +menu_screensaver_animation_speed = "1.000000" +menu_screensaver_timeout = "0" +menu_scroll_delay = "256" +menu_scroll_fast = "false" +menu_shader_pipeline = "2" +menu_show_advanced_settings = "false" +menu_show_configurations = "true" +menu_show_core_updater = "false" +menu_show_dump_disc = "true" +menu_show_help = "true" +menu_show_information = "true" +menu_show_latency = "true" +menu_show_legacy_thumbnail_updater = "false" +menu_show_load_content = "true" +menu_show_load_content_animation = "true" +menu_show_load_core = "true" +menu_show_load_disc = "true" +menu_show_online_updater = "true" +menu_show_overlays = "true" +menu_show_quit_retroarch = "true" +menu_show_reboot = "true" +menu_show_restart_retroarch = "true" +menu_show_rewind = "true" +menu_show_shutdown = "true" +menu_show_sublabels = "true" +menu_show_video_layout = "true" +menu_swap_ok_cancel_buttons = "false" +menu_throttle_framerate = "true" +menu_thumbnail_upscale_threshold = "0" +menu_thumbnails = "3" +menu_ticker_smooth = "true" +menu_ticker_speed = "2.000000" +menu_ticker_type = "1" +menu_timedate_date_separator = "0" +menu_timedate_enable = "true" +menu_timedate_style = "11" +menu_unified_controls = "false" +menu_use_preferred_system_color_theme = "false" +menu_wallpaper = "" +menu_wallpaper_opacity = "0.300000" +menu_widget_scale_auto = "true" +menu_widget_scale_factor = "1.000000" +menu_widget_scale_factor_windowed = "1.000000" +menu_xmb_animation_horizontal_highlight = "0" +menu_xmb_animation_move_up_down = "0" +menu_xmb_animation_opening_main_menu = "0" +menu_xmb_thumbnail_scale_factor = "100" +menu_xmb_vertical_fade_factor = "100" +midi_driver = "alsa" +midi_input = "Off" +midi_output = "Off" +midi_volume = "100" +netplay_allow_pausing = "false" +netplay_allow_slaves = "true" +netplay_check_frames = "600" +netplay_custom_mitm_server = "" +netplay_fade_chat = "true" +netplay_input_latency_frames_min = "0" +netplay_input_latency_frames_range = "0" +netplay_ip_address = "" +netplay_ip_port = "55435" +netplay_max_connections = "3" +netplay_max_ping = "0" +netplay_mitm_server = "nyc" +netplay_nat_traversal = "true" +netplay_nickname = "" +netplay_password = "" +netplay_ping_show = "false" +netplay_public_announce = "true" +netplay_request_device_p1 = "false" +netplay_request_device_p10 = "false" +netplay_request_device_p11 = "false" +netplay_request_device_p12 = "false" +netplay_request_device_p13 = "false" +netplay_request_device_p14 = "false" +netplay_request_device_p15 = "false" +netplay_request_device_p16 = "false" +netplay_request_device_p2 = "false" +netplay_request_device_p3 = "false" +netplay_request_device_p4 = "false" +netplay_request_device_p5 = "false" +netplay_request_device_p6 = "false" +netplay_request_device_p7 = "false" +netplay_request_device_p8 = "false" +netplay_request_device_p9 = "false" +netplay_require_slaves = "false" +netplay_share_analog = "1" +netplay_share_digital = "1" +netplay_show_only_connectable = "true" +netplay_spectate_password = "" +netplay_start_as_spectator = "false" +netplay_stateless_mode = "false" +netplay_use_mitm_server = "false" +network_cmd_enable = "false" +network_cmd_port = "55355" +network_on_demand_thumbnails = "false" +network_remote_base_port = "55400" +network_remote_enable = "false" +network_remote_enable_user_p1 = "false" +network_remote_enable_user_p10 = "false" +network_remote_enable_user_p11 = "false" +network_remote_enable_user_p12 = "false" +network_remote_enable_user_p13 = "false" +network_remote_enable_user_p14 = "false" +network_remote_enable_user_p15 = "false" +network_remote_enable_user_p16 = "false" +network_remote_enable_user_p2 = "false" +network_remote_enable_user_p3 = "false" +network_remote_enable_user_p4 = "false" +network_remote_enable_user_p5 = "false" +network_remote_enable_user_p6 = "false" +network_remote_enable_user_p7 = "false" +network_remote_enable_user_p8 = "false" +network_remote_enable_user_p9 = "false" +notification_show_autoconfig = "true" +notification_show_cheats_applied = "true" +notification_show_config_override_load = "true" +notification_show_fast_forward = "true" +notification_show_netplay_extra = "false" +notification_show_patch_applied = "true" +notification_show_refresh_rate = "true" +notification_show_remap_load = "true" +notification_show_screenshot = "true" +notification_show_screenshot_duration = "0" +notification_show_screenshot_flash = "0" +notification_show_set_initial_disk = "true" +notification_show_when_menu_is_alive = "false" +overlay_directory = "~/.config/retroarch/overlay" +ozone_collapse_sidebar = "false" +ozone_menu_color_theme = "1" +ozone_scroll_content_metadata = "false" +ozone_sort_after_truncate_playlist_name = "true" +ozone_truncate_playlist_name = "true" +pause_nonactive = "true" +perfcnt_enable = "false" +playlist_compression = "false" +playlist_directory = "~/.config/retroarch/playlists" +playlist_entry_remove_enable = "1" +playlist_entry_rename = "true" +playlist_fuzzy_archive_match = "false" +playlist_portable_paths = "false" +playlist_show_entry_idx = "true" +playlist_show_history_icons = "0" +playlist_show_inline_core_name = "0" +playlist_show_sublabels = "true" +playlist_sort_alphabetical = "true" +playlist_sublabel_last_played_style = "0" +playlist_sublabel_runtime_type = "0" +playlist_use_old_format = "false" +quick_menu_show_add_to_favorites = "true" +quick_menu_show_cheats = "true" +quick_menu_show_close_content = "true" +quick_menu_show_controls = "true" +quick_menu_show_core_options_flush = "false" +quick_menu_show_download_thumbnails = "true" +quick_menu_show_information = "true" +quick_menu_show_options = "true" +quick_menu_show_recording = "true" +quick_menu_show_reset_core_association = "true" +quick_menu_show_restart_content = "true" +quick_menu_show_resume_content = "true" +quick_menu_show_save_content_dir_overrides = "true" +quick_menu_show_save_core_overrides = "true" +quick_menu_show_save_game_overrides = "true" +quick_menu_show_save_load_state = "true" +quick_menu_show_set_core_association = "true" +quick_menu_show_shaders = "true" +quick_menu_show_start_recording = "true" +quick_menu_show_start_streaming = "true" +quick_menu_show_streaming = "true" +quick_menu_show_take_screenshot = "true" +quick_menu_show_undo_save_load_state = "true" +quit_on_close_content = "0" +quit_press_twice = "true" +record_driver = "ffmpeg" +recording_config_directory = "~/.config/retroarch/records_config" +recording_output_directory = "~/.config/retroarch/records" +resampler_directory = "" +rewind_buffer_size = "20971520" +rewind_buffer_size_step = "10" +rewind_enable = "false" +rewind_granularity = "1" +rgui_aspect_ratio = "0" +rgui_aspect_ratio_lock = "0" +rgui_background_filler_thickness_enable = "true" +rgui_border_filler_enable = "true" +rgui_border_filler_thickness_enable = "true" +rgui_browser_directory = "default" +rgui_config_directory = "~/.config/retroarch/config" +rgui_extended_ascii = "false" +rgui_inline_thumbnails = "false" +rgui_internal_upscale_level = "0" +rgui_menu_color_theme = "4" +rgui_menu_theme_preset = "" +rgui_particle_effect = "0" +rgui_particle_effect_screensaver = "true" +rgui_particle_effect_speed = "1.000000" +rgui_show_start_screen = "false" +rgui_swap_thumbnails = "false" +rgui_switch_icons = "true" +rgui_thumbnail_delay = "0" +rgui_thumbnail_downscaler = "0" +run_ahead_enabled = "false" +run_ahead_frames = "1" +run_ahead_hide_warnings = "false" +run_ahead_secondary_instance = "false" +runtime_log_directory = "default" +save_file_compression = "false" +savefile_directory = "~/.config/retroarch/saves" +savefiles_in_content_dir = "false" +savestate_auto_index = "false" +savestate_auto_load = "true" +savestate_auto_save = "true" +savestate_directory = "~/.config/retroarch/states" +savestate_file_compression = "true" +savestate_max_keep = "50" +savestate_thumbnail_enable = "false" +savestates_in_content_dir = "false" +scan_without_core_match = "false" +screen_brightness = "100" +screen_orientation = "0" +screenshot_directory = "~/.config/retroarch/screenshots" +screenshots_in_content_dir = "false" +settings_show_accessibility = "true" +settings_show_achievements = "true" +settings_show_ai_service = "true" +settings_show_audio = "true" +settings_show_configuration = "true" +settings_show_core = "true" +settings_show_directory = "true" +settings_show_drivers = "true" +settings_show_file_browser = "true" +settings_show_frame_throttle = "true" +settings_show_input = "true" +settings_show_latency = "true" +settings_show_logging = "true" +settings_show_network = "true" +settings_show_onscreen_display = "true" +settings_show_playlists = "true" +settings_show_power_management = "true" +settings_show_recording = "true" +settings_show_saving = "true" +settings_show_user = "true" +settings_show_user_interface = "true" +settings_show_video = "true" +show_hidden_files = "false" +slowmotion_ratio = "3.000000" +soft_filter_enable = "false" +soft_filter_index = "0" +sort_savefiles_by_content_enable = "false" +sort_savefiles_enable = "false" +sort_savestates_by_content_enable = "false" +sort_savestates_enable = "false" +sort_screenshots_by_content_enable = "false" +state_slot = "0" +statistics_show = "false" +stdin_cmd_enable = "false" +streaming_mode = "0" +suspend_screensaver_enable = "true" +sustained_performance_mode = "false" +system_directory = "~/.config/retroarch/system" +systemfiles_in_content_dir = "false" +threaded_data_runloop_enable = "true" +thumbnails_directory = "~/.config/retroarch/thumbnails" +twitch_stream_key = "" +ui_companion_enable = "false" +ui_companion_start_on_boot = "true" +ui_companion_toggle = "false" +ui_menubar_enable = "true" +use_last_start_directory = "false" +user_language = "0" +vibrate_on_keypress = "false" +video_adaptive_vsync = "false" +video_allow_rotate = "true" +video_aspect_ratio = "1.333300" +video_aspect_ratio_auto = "false" +video_black_frame_insertion = "0" +video_context_driver = "" +video_crop_overscan = "true" +video_ctx_scaling = "false" +video_disable_composition = "false" +video_driver = "gl" +video_filter = "" +video_filter_dir = "/usr/share/retroarch/filters/64bit/video" +video_font_enable = "true" +video_font_path = "" +video_font_size = "32.000000" +video_force_aspect = "true" +video_force_srgb_disable = "false" +video_frame_delay = "0" +video_frame_delay_auto = "false" +video_fullscreen = "true" +video_fullscreen_x = "0" +video_fullscreen_y = "0" +video_gpu_record = "false" +video_gpu_screenshot = "true" +video_hard_sync = "false" +video_hard_sync_frames = "0" +video_hdr_display_contrast = "5.000000" +video_hdr_enable = "false" +video_hdr_expand_gamut = "true" +video_hdr_max_nits = "1000.000000" +video_hdr_paper_white_nits = "200.000000" +video_layout_directory = "~/.config/retroarch/layouts" +video_layout_enable = "true" +video_layout_path = "" +video_layout_selected_view = "0" +video_max_swapchain_images = "3" +video_message_color = "ffff00" +video_message_pos_x = "0.050000" +video_message_pos_y = "0.050000" +video_monitor_index = "0" +video_msg_bgcolor_blue = "0" +video_msg_bgcolor_enable = "false" +video_msg_bgcolor_green = "0" +video_msg_bgcolor_opacity = "1.000000" +video_msg_bgcolor_red = "0" +video_notch_write_over_enable = "false" +video_post_filter_record = "false" +video_record_config = "" +video_record_quality = "2" +video_record_scale_factor = "1" +video_record_threads = "2" +video_refresh_rate = "60.000000" +video_rotation = "0" +video_scale = "3.000000" +video_scale_integer = "true" +video_scale_integer_overscale = "false" +video_shader_delay = "0" +video_shader_dir = "/usr/share/libretro/shaders" +video_shader_enable = "true" +video_shader_preset_save_reference_enable = "true" +video_shader_remember_last_dir = "false" +video_shader_watch_files = "false" +video_shared_context = "false" +video_smooth = "false" +video_stream_config = "" +video_stream_port = "56400" +video_stream_quality = "11" +video_stream_scale_factor = "1" +video_stream_url = "" +video_swap_interval = "1" +video_threaded = "false" +video_vsync = "true" +video_window_auto_height_max = "1080" +video_window_auto_width_max = "1920" +video_window_custom_size_enable = "false" +video_window_opacity = "100" +video_window_save_positions = "false" +video_window_show_decorations = "true" +video_windowed_fullscreen = "false" +video_windowed_position_height = "720" +video_windowed_position_width = "1280" +video_windowed_position_x = "0" +video_windowed_position_y = "0" +vrr_runloop_enable = "false" +vulkan_gpu_index = "0" +wifi_driver = "null" +wifi_enabled = "true" +xmb_alpha_factor = "75" +xmb_font = "" +xmb_layout = "0" +xmb_menu_color_theme = "4" +xmb_shadows_enable = "true" +xmb_theme = "0" +xmb_vertical_thumbnails = "false" +youtube_stream_key = "" diff --git a/usr/bin/351elec-es-packages b/usr/bin/351elec-es-packages new file mode 100755 index 00000000..ca6c2f64 --- /dev/null +++ b/usr/bin/351elec-es-packages @@ -0,0 +1,236 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2020-present Batocera +# Copyright (C) 2020-present Fewtarius + +# +# Download and install packages supported binary packages +# +# Usage: +# 351elec-es-package 'list' or 'install ' +# +# If you don't provide a , the list of packages will be downloaded and sent back to you. +# + +ARCH="$(cat /storage/.config/.OS_ARCH)" +if [ "${ARCH}" == "RG351P" ]; then + DEVICE="RG351P" +elif [ "${ARCH}" == "RG351V" ]; then + DEVICE="RG351V" +elif [ "${ARCH}" == "RG351MP" ]; then + DEVICE="RG351MP" +elif [ "${ARCH}" == "RG552" ]; then + DEVICE="RG552" +fi +DISTRO="351ELEC" +CONFIGDIR="/storage/.config/packages" +PACKAGELIST="https://raw.githubusercontent.com/351ELEC/351ELEC-metadata/main/${ARCH}/packages.cfg" +LOCALPACKAGELIST="/storage/.config/packages.cfg" + +# Community Package List Schema +# +# {PACKAGE NAME}|{PACKAGE URL}|{SHA256SUM} +# +# Half_Life|https://github.com/blah/half-life-1231.zip|d06489dcf04c602ddacc6f80b2809e6d25fd6298c461966e666e19d3188e04be +# +# packages.cfg must be a plain text pipe delimited file. + +# Community Package Schema +# +# URL: https://github.com/blah/half-life-1231.zip +# Content: +# half-life/ <- must match "package" name ^ +# install.sh <- must be named install.sh/uninstall.sh and be in the package root. +# uninstall.sh +# Relevant files/directories included in install.sh/uninstall.sh +# Minimum: +# system-half-life.png +# system-half-life-thumb.png +# +# The package blob may be hosted elsewhere, as long as install.sh is able to download it. + +############################### +# +# Prepare the system for installation +if [ ! -d "${CONFIGDIR}" ] +then + mkdir -p "${CONFIGDIR}" +fi + +############################### +# +function usage() { + echo "$0 - downloads and installs packages supported packages in ${DISTRO}" + echo " " + echo "It accepts two modes: 'list' and 'install '" + echo "- 'list' for the list of packages available online, and if they are" + echo " [A]vailable to install, [I]nstalled or [?]unknown." + echo "- 'install ' to install the package, from its package name." + echo "- 'remove ' to delete an installed package." + echo " " + exit 1 +} + +############################### +# +function check_url() { + [[ "$1" =~ ^(https?|ftp)://.*$ ]] && echo "[A]" || echo "[?]" +} + +############################### +# +function git_name() { + echo "$1" | sed "s,.*/\(.*\),\1," +} + +############################### +# +function repo_name() { + echo "$1" | sed "s,.*github.com/\([A-Za-z0-9_-]*\)/.*,\1," +} + +############################### +# +function list_packages() { + fn=$(date +"%s") + tmp="/tmp/packages_${fn}" + echo "* ${DISTRO} packages *" + if [ -f ${LOCALPACKAGELIST} ]; then + cp -f "${LOCALPACKAGELIST}" "${tmp}" + else + curl -H 'Cache-Control: no-cache' -sfL "${PACKAGELIST}" -o "${tmp}" || exit 1 + sed -i 's/\r$//' "${tmp}" + fi + while IFS=$'|' read name url shasum; do + [ x"${name}" == "x" ] && continue + ia=$(check_url "${url}") + [ -d "${CONFIGDIR}"/"${name}" ] && ia="[I]" + echo "${ia} ${name} - ${url}" + done < "${tmp}" + [[ -e "${tmp}" ]] && rm "${tmp}" +} + + +############################### +# +function getPer() { + TARFILE="$1" + TARVAL="$2" + while true; do + CURVAL=$(stat "$TARFILE" | grep -E '^[ ]*Size:' | sed -e s+'^[ ]*Size: \([0-9][0-9]*\) .*$'+'\1'+) + CURVAL=$((CURVAL / 1024 / 1024)) + PER=$((${CURVAL} * 100 / ${TARVAL})) + echo "${PER}% - ${package} - [${TARVAL}MB]" + sleep 2 + done +} + +############################### +# +function install_package() { + package="$1" + success_installed=0 + fn=$(date +"%s") + tmp="/tmp/packages_${fn}" + if [ -f ${LOCALPACKAGELIST} ]; then + cp -f "${LOCALPACKAGELIST}" "${tmp}" + else + curl -H 'Cache-Control: no-cache' -sfL "${PACKAGELIST}" -o "${tmp}" || exit 1 + sed -i 's/\r$//' "${tmp}" + fi + while IFS=$'|' read name url shasum; do + [ x"${name}" != x"${package}" ] && continue + ia=$(check_url "${url}") + if [ x"${ia}" != x"[A]" ]; then + echo "Error - invalid package URL ${url}" + exit 1 + else + cd ${CONFIGDIR} + filename=$(echo ${url} | sed "s#^.*/##") + curl -H 'Cache-Control: no-cache' -sfL "${url}" -o "${filename}" || exit 1 + if [ -f "${filename}" ]; then + echo "Verifying package checksum" + dldsum=$(sha256sum ${filename} | awk '{print $1}') + if [ ! "${shasum}" == "${dldsum}" ] + then + echo "Error - Checksum does not match." + success_installed=0 + else + echo "Unzipping ${filename} package files >>> 99%" + if [ -d "${CONFIGDIR}/${filename}" ] + then + rm -rf "${CONFIGDIR}/${filename}" + fi + unzip "${filename}" >/dev/null 2>&1 + rm "${filename}" + echo "Installing ${filename} package" + sh ./${package}/install.sh + if [ $? == 0 ] + then + success_installed=1 + else + echo "Error - Installation failed." + success_installed=0 + fi + fi + else + echo "Error - ${package} zip file could not be downloaded from ${url}" + exit 1 + fi + fi + done < "${tmp}" + [[ -e "${tmp}" ]] && rm "${tmp}" + if [ "${success_installed}" == 1 ]; then + echo "${package} is now installed >>> 100%" + exit 0 + else + echo "Error - ${package} could not be installed" + exit 1 + fi +} + +############################### +# +function remove_package() { + package="$1" + success_removed=0 + filename=${package} + if [ -d "${CONFIGDIR}/${package}" ]; then + sh ${CONFIGDIR}/${package}/uninstall.sh + if [ $? == 0 ] + then + rm -rf "${CONFIGDIR}"/"${filename}" && success_removed=1 + else + echo "Unable to uninstall ${package}" + success_removed=0 + fi + else + echo "${package} doesn't appear to be in ${CONFIGDIR}/${filename}" + fi + if [ "${success_removed}" == 1 ]; then + TERMINAL=0 && echo "${package} uninstalled >>>100" + exit 0 + else + echo "Error - ${package} could not be removed" + exit 1 + fi +} + +#### Main loop +# +command="$1" +package="$2" + +if ! [ -d "${CONFIGDIR}" ]; then + echo "Error - package directory ${CONFIGDIR} is not valid." + exit 1 +fi +if [ x"${command}" == "xlist" ]; then + list_packages +elif [ x"${command}" == "xinstall" ]; then + [ x"${package}" != "x" ] && install_package ${package} || usage +elif [ x"${command}" == "xremove" ]; then + [ x"${package}" != "x" ] && remove_package ${package} || usage +else + usage +fi diff --git a/usr/bin/batocera-config b/usr/bin/batocera-config new file mode 100755 index 00000000..94b0e359 --- /dev/null +++ b/usr/bin/batocera-config @@ -0,0 +1,373 @@ +#!/bin/bash + +if [ ! "$1" ];then + echo -e "usage : batocera-config [command] [args]\nWith command in\n\toverscan [enable|disable]\n\tlsaudio\n\tgetaudio\n\taudio [hdmi|jack|auto|custom|x,y]\n\tcanupdate\n\tupdate\n\twifi [enable|disable] ssid key\n\tstorage [current|list|INTERNAL|ANYEXTERNAL|RAM|DEV UUID]\n\tsetRootPassword [password]\n\tgetRootPassword\n\ttz [|tz]" + exit 1 +fi +configFile="/storage/.config/distribution/configs/config.txt" +storageFile="/storage/.config/distribution/configs/batocera-boot.conf" +command="$1" +mode="$2" +extra1="$3" +extra2="$4" +extra3="$5" +extra4="$6" +arch=$(cat /storage/.config/.OS_ARCH) + +updateurl="https://127.0.0.1" + +preBootConfig() { + mount -o remount,rw /boot +} + +postBootConfig() { + mount -o remount,ro /boot +} + +bato_config_set_value () { + key=$1 + value=$2 + [ -z "$value" ] && value=0 + cat "$configFile" | grep "$key" + valPresent=$? + if [ "$valPresent" != "0" ];then + echo "$key=$value" >> "$configFile" + else + sed -i "s/#\?$key=.*/$key=$value/g" "$configFile" + fi +} + +#log=/userdata/system/logs/batocera.log +#systemsetting="python /usr/lib/python2.7/site-packages/configgen/settings/batoceraSettings.py" + +log=/tmp/logs/systemsettings.log +systemsetting="/usr/bin/batocera-settings" + + +echo "----config ----" >> $log + +if [ "$command" == "getRootPassword" ]; then + # security disabled, force the default one without changing boot configuration + securityenabled="`$systemsetting -command load -key system.security.enabled`" + if [ "$securityenabled" != "1" ];then + echo "linux" + exit 0 + fi + + ENCPASSWD=$(grep -E '^[ \t]*rootshadowpassword[ \t]*=' "${storageFile}" | sed -e s+'^[ \t]*rootshadowpassword[ \t]*='++) + if test -z "${ENCPASSWD}" + then + exit 1 + fi + if ! batocera-encode decode "${ENCPASSWD}" + then + exit 1 + fi + exit 0 +fi + +if [ "$command" == "setRootPassword" ]; then + PASSWD=${2} + + # security disabled, don't change + securityenabled="`$systemsetting -command load -key system.security.enabled`" + if [ "$securityenabled" != "1" ];then + exit 0 + fi + + # if no password if provided, generate one + if test -z "${PASSWD}" + then + PASSWD=$(tr -cd _A-Z-a-z-0-9 < /dev/urandom | fold -w8 | head -n1) + fi + PASSWDENC=$(batocera-encode encode "${PASSWD}") + + preBootConfig + if grep -qE '^[ \t]*rootshadowpassword[ \t]*=' "${storageFile}" + then + # update it + if ! sed -i -e s@'^[ \t]*rootshadowpassword[ \t]*=.*$'@"rootshadowpassword=${PASSWDENC}"@ "${storageFile}" + then + postBootConfig + exit 1 + fi + postBootConfig + exit 0 + else + # create it + if ! echo "rootshadowpassword=${PASSWDENC}" >> "${storageFile}" + then + postBootConfig + exit 1 + fi + postBootConfig + exit 0 + fi +fi + +if [ "$command" == "overscan" ]; then +if [ "$mode" == "set" ];then +# set will set overscan values abd also enable this mode + if [ -z "$extra1" ] || [ -z "$extra2" ] || [ -z "$extra3" ] || [ -z "$extra4" ]; then + echo "$0 $command $mode needs 4 arguments:" + echo "$0 $command $mode overscan_left overscan_right overscan_top overscan_bottom" + exit 2 + fi + preBootConfig + [ -f "$configFile" ] || touch "$configFile" + + echo "setting overscan values $extra1 $extra2 $extra3 $extra4 " >> $log + bato_config_set_value disable_overscan 0 + bato_config_set_value overscan_scale 1 + bato_config_set_value overscan_left "$extra1" + bato_config_set_value overscan_right "$extra2" + bato_config_set_value overscan_top "$extra3" + bato_config_set_value overscan_bottom "$extra4" + + postBootConfig + exit 0 + +fi +if [ -f "$configFile" ];then + preBootConfig + if [ "$mode" == "enable" ];then + echo "enabling overscan" >> $log + bato_config_set_value disable_overscan 0 + bato_config_set_value overscan_scale 1 + elif [ "$mode" == "disable" ];then + echo "disabling overscan" >> $log + bato_config_set_value disable_overscan 1 + bato_config_set_value overscan_scale 0 + else + postBootConfig + exit 1 + fi + postBootConfig + exit 0 +else + exit 2 +fi +fi + +if [ "$command" == "lsoutputs" ] +then + echo "auto" + batocera-resolution listOutputs +fi + +if [ "$command" == "lsaudio" ];then + if [[ "${arch}" =~ "rpi" ]] + then + echo "hdmi" + echo "jack" + echo "auto" + elif [[ "${arch}" =~ "x86" ]];then + echo "auto" + echo "custom" + LANG=C aplay -l | grep -E '^card [0-9]*:' | sed -e s+'^card \([0-9]*\): \([^,]*\), device \([0-9]*\): [^\[]* \[\([^]]*\)].*$'+'\1,\3 \4 \2'+ + else + echo "auto" + fi +fi + +if [ "$command" == "getaudio" ];then + $systemsetting -command load -key audio.device + exit 0 +fi + +if [ "$command" == "audio" ];then + # this code is specific to the rpi + # don't set it on other boards + # find a more generic way would be nice + if [[ "${arch}" =~ "rpi" ]] + then + # this is specific to the rpi + cmdVal="0" + if [ "$mode" == "hdmi" ];then + cmdVal="2" + elif [ "$mode" == "jack" ];then + cmdVal="1" + fi + echo "setting audio output mode : $mode" >> $log + amixer cset numid=3 $cmdVal || exit 1 + elif [[ "${arch}" =~ "x86" ]] + then + # auto: no .asoundrc file + # custom: don't touch the .asoundrc file + # any other, create the .asoundrd file + if [ "$mode" == "auto" ];then + rm -rf /userdata/system/.asoundrc || exit 1 + elif [ "$mode" != "custom" ];then + if echo "${mode}" | grep -qE '^[0-9]*,[0-9]* ' + then + cardnb=$(echo "${mode}" | sed -e s+'^\([0-9]*\),.*$'+'\1'+) + devicenb=$(echo "${mode}" | sed -e s+'^[0-9]*,\([0-9]*\) .*$'+'\1'+) + cat > /userdata/system/.asoundrc <> $log + + # on my pc, the master is turned off at boot + # i don't know what are the rules to set here. + amixer set Master unmute || exit 1 + amixer set Master -- ${mode}% || exit 1 + + # maximize the sound to be sure it's not 0, allow errors + amixer set PCM -- 100% #|| exit 1 + amixer set Headphone -- 100% #|| exit 1 + exit 0 + fi + exit 12 +fi + +if [ "$command" == "gpiocontrollers" ];then + command="module" + mode="load" + extra1="mk_arcade_joystick_rpi" + extra2="map=1,2" +fi + +if [ "$command" == "module" ];then + modulename="$extra1" + map="$extra2" + # remove in all cases + rmmod /lib/modules/`uname -r`/extra/${modulename}.ko >> $log + + if [ "$mode" == "load" ];then + echo "loading module $modulename args = $map" >> $log + insmod /lib/modules/`uname -r`/extra/${modulename}.ko $map >> $log + [ "$?" ] || exit 1 + fi + exit 0 +fi + +if [ "$command" == "canupdate" ];then + available=$(updatecheck canupdate) + echo "$available" + if [[ "$available" != "no" ]]; then + exit 0 + fi + exit 12 +fi + +if [ "$command" == "update" ];then + 351elec-upgrade + exit $? +fi + +if [[ "$command" == "wifi" ]]; then + ssid="$3" + psk="$4" + + if [[ "$mode" == "enable" ]]; then + echo "configure wifi" >> $log + mkdir -p "/storage/.cache/connman" || exit 1 + cat > "/storage/.cache/connman/wifi.config" <> "/storage/.cache/connman/wifi.config" + fi + # Power up the WIFI device + if [ "$(cat /sys/firmware/devicetree/base/model)" == "Anbernic RG552" ]; then + echo 1 > /sys/class/gpio/gpio113/value + else + echo 1 > /sys/class/gpio/gpio5/value + fi + sleep 3 + connmanctl enable wifi || exit 1 + connmanctl scan wifi || exit 1 + exit 0 + fi + if [[ "$mode" =~ "start" ]]; then + if [[ "$mode" != "forcestart" ]]; then + settingsWlan="`$systemsetting -command load -key wifi.enabled`" + if [ "$settingsWlan" != "1" ];then + exit 1 + fi + fi + # Power up the WIFI device + if [ "$(cat /sys/firmware/devicetree/base/model)" == "Anbernic RG552" ]; then + echo 1 > /sys/class/gpio/gpio113/value + else + echo 1 > /sys/class/gpio/gpio5/value + fi + sleep 3 + connmanctl enable wifi || exit 1 + connmanctl scan wifi || exit 1 + exit 0 + fi + if [[ "$mode" == "disable" ]]; then + connmanctl disable wifi + # Power down the WIFI device + if [ "$(cat /sys/firmware/devicetree/base/model)" == "Anbernic RG552" ]; then + echo 0 > /sys/class/gpio/gpio113/value + else + echo 0 > /sys/class/gpio/gpio5/value + fi + exit $? + fi + if [[ "$mode" == "list" ]]; then + WAVAILABLE=$(connmanctl services | cut -b 5- | sed -e s+'^\([^ ]*\).*$'+'\1'+ | grep -vE '^Wired$|^$') + if test -n "${ssid}" + then + echo "${WAVAILABLE}" | grep -qE '^'"${ssid}"'$' || echo "${ssid}" + fi + echo "${WAVAILABLE}" + exit 0 + fi +fi + +if [[ "$command" == "storage" ]]; then + exit 0; +fi + +if [[ "$command" == "forgetBT" ]]; then + killall -9 hcitool + systemctl stop bluetooth + rm -rf /storage/.cache/bluetooth/* + systemctl start bluetooth + exit 0 +fi + +if [ "$command" == "tz" ];then + if test "$mode" == "" + then + cat /storage/.config/distribution/configs/tz + else + if test -f "/usr/share/zoneinfo/${mode}" + then + echo "TIMEZONE=${mode}" > /storage/.cache/timezone + systemctl restart tz-data.service + fi + fi + exit $? +fi + +exit 10 diff --git a/usr/bin/batocera-scraper b/usr/bin/batocera-scraper new file mode 100755 index 00000000..d9ead6ff --- /dev/null +++ b/usr/bin/batocera-scraper @@ -0,0 +1,84 @@ +#!/bin/bash + +# If we are on Steam Deck +arch=$(cat /storage/.config/.OS_ARCH) +if [ $arch == "DECK" ];then + INSTALL_DIR="~/retrodeck" + +systemsetting=$INSTALL_DIR+"/usr/bin/batocera-settings" +syslang=$($systemsetting -command load -key system.language) +IMGSTYLE=$($systemsetting -command load -key scrapper.style) + +if test $# = 1 +then + DOSYS=$1 +fi + +# supported languages : en, fr, es, de, pt +case "${syslang}" in + fr_FR) + sslang=fr,en + ;; + es_ES) + sslang=es,en + ;; + de_DE) + sslang=de,en + ;; + pt_PT) + sslang=pt,en + ;; + pt_BR) + sslang=pt,en + ;; + *) + sslang=en +esac + +if test -z "${IMGSTYLE}" +then + IMGSTYLE="b,f,a,l,3b,s" +fi + +do_scrap() { + LRDIR=$1 + NF=$(ls "${LRDIR}" | grep -vE '\.txt$|\.xml$' | wc -l) + if test "${NF}" -gt 0 + then + BASEDIR=$(basename "${LRDIR}") + echo "GAME: system ${BASEDIR}" + EXTRAOPT= + + for x in "mame" "fba" "fba_libretro" "neogeo" + do + test "${LRDIR}" = $INSTALL_DIR+"/storage/roms/${x}" && EXTRAOPT="-mame" + done + + (cd "${LRDIR}" && sselph-scraper -console_src ss,gdb,ovgdb -lang "${sslang}" -console_img "${IMGSTYLE}" -download_videos -workers 5 ${EXTRAOPT}) 2>&1 + fi +} + +# find system to scrape +(if test -n "${DOSYS}" + then + test -d $INSTALL_DIR+"/storage/roms/${DOSYS}" && echo $INSTALL_DIR+"/storage/roms/${DOSYS}" + else + find /storage/roms -maxdepth 1 -mindepth 1 -type d + fi) | + while read RDIR1 + do + # read the 2 next dir + read RDIR2 + read RDIR3 + read RDIR4 + + do_scrap "${RDIR1}" & + test -n "${RDIR2}" && do_scrap "${RDIR2}" & + test -n "${RDIR3}" && do_scrap "${RDIR3}" & + test -n "${RDIR4}" && do_scrap "${RDIR4}" & + wait + + done + +# synchronize to not make the usb/sdcard slowing down once finnished +sync diff --git a/usr/bin/batocera-settings b/usr/bin/batocera-settings new file mode 100755 index 00000000..2f76e45e --- /dev/null +++ b/usr/bin/batocera-settings @@ -0,0 +1,272 @@ +#!/bin/bash + +# batocera-settings can mimic batoceraSettings.py +# goal: abolish this python script, it's useless for the sake of the load feature only +# get a more user friendly environment for setting, getting and saving keys +# +# Usage of BASE COMMAND: +# longform: --command --key --value +# +# shortform: +# +# --command load write enable disable status +# --key any key in emuelec.conf (kodi.enabled...) +# --value any alphanumerical string +# use quotation marks to avoid globbing use slashes escape special characters + +# This script reads only 1st occurrence if string and writes only to this first hit +# +# This script uses #-Character to comment values +# +# If there is a boolean value (0,1) then then enable and disable command will set the corresponding +# boolean value. + +# Examples: +# 'batocera-settings --command load --key wifi.enabled' will print out 0 or 1 +# 'batocera-settings --command write --key wifi.ssid -value "This is my NET"' will set 'wlan.ssid=This is my NET' +# 'batocera-settings enable wifi.ssid' will remove # from configfile (activate) +# 'batocera-settings disable wifi.enabled' will set key wifi.enabled=0 +# 'botocera-settings /myown/config.file --command status --key my.key' will output status of own config.file and my.key + +# by cyperghost - 2019/12/30 + +##### INITS ##### +# If we are on Steam Deck +arch=$(cat /storage/.config/.OS_ARCH) +if [ $arch == "DECK" ];then + INSTALL_DIR="~/retrodeck" + +BATOCERA_CONFIGFILE=$INSTALL_DIR+"/storage/.config/distribution/configs/distribution.conf" +COMMENT_CHAR_SEARCH="[#|;]" +COMMENT_CHAR="#" +##### INITS ##### + +##### Function Calls ##### + +function get_config() { + #Will search for key.value and #key.value for only one occurrence + #If the character is the COMMENT CHAR then set value to it + #Otherwise strip till the equal-char to obtain value + local val + local ret + val="$(grep -E -m1 "^\s*$1\s*=" $BATOCERA_CONFIGFILE)" + ret=$? + if [[ $ret -eq 1 ]]; then + val="$(grep -E -m1 "^$COMMENT_CHAR_SEARCH\s*$1\s*=" $BATOCERA_CONFIGFILE)" + ret=$? + [[ $ret -eq 0 ]] && val=$COMMENT_CHAR + else + #Maybe here some finetuning to catch key.value = ENTRY without blanks + val="${val#*=}" + fi + echo "$val" + return $ret +} + +function set_config() { + #Will search for first key.name at beginning of line and write value to it + sed -i "1,/^\(\s*$1\s*=\).*/s//\1$2/" "$BATOCERA_CONFIGFILE" +} + +function uncomment_config() { + #Will search for first Comment Char at beginning of line and remove it + sed -i "1,/^$COMMENT_CHAR_SEARCH\(\s*$1\)/s//\1/" "$BATOCERA_CONFIGFILE" +} + +function comment_config() { + #Will search for first key.name at beginning of line and add a comment char to it + sed -i "1,/^\(\s*$1\)/s//$COMMENT_CHAR\1/" "$BATOCERA_CONFIGFILE" +} + +function check_argument() { + # This method does not accept arguments starting with '-'. + if [[ -z "$2" || "$2" =~ ^- ]]; then + echo >&2 + echo "ERROR: '$1' is missing an argument." >&2 + echo >&2 + echo "Just type '$0' to see usage page." >&2 + echo >&2 + return 1 + fi +} + +function dash_style() { + #This function is needed to "simulate" the python script with single dash + #commands. It will also accept the more common posix double dashes + #Accept dashes and double dashes and build new array ii with parameter set + #The else-branch can be used for the shortform + + for i in --command --key --value; do + if [[ -z "$1" ]]; then + continue + elif [[ "$i" =~ ^-{0,1}"${1,,}" ]]; then + check_argument $1 $2 + [[ $? -eq 0 ]] || exit 1 + ii+=("$2") + shift 2 + else + ii+=("$1") + shift 1 + fi + done +} + + +function usage() { +val=" Usage of BASE COMMAND: + + --command --key --value + + shortform: + + --command load write enable disable status + --key any key in emuelec.conf (kodi.enabled...) + --value any alphanumerical string + use quotation marks to avoid globbing + + For write command --value must be provided + + exit codes: exit 0 = value is available, proper exit + exit 1 = general error + exit 2 = file error + exit 10 = value found, but empty + exit 11 = value found, but not activated + exit 12 = value not found + + If you don't set a filename then default is '~/storage/.config/distribution.conf'" + +echo "$val" + +} +##### Function Calls ##### + +##### MAIN FUNCTION ##### +function main() { + + #Filename parsed? + if [[ -f "$1" ]]; then + BATOCERA_CONFIGFILE="$1" + shift + else + [[ -f "$BATOCERA_CONFIGFILE" ]] || { echo "not found: $BATOCERA_CONFIGFILE" >&2; exit 2; } + fi + + #How much arguments are parsed, up to 6 then it is the long format + #up to 3 then it is the short format + if [[ ${#@} -eq 0 || ${#@} -gt 6 ]]; then + usage + exit 1 + else + dash_style "$@" + command="${ii[0]}" + keyvalue="${ii[1]}" + newvalue="${ii[2]}" + unset ii + fi + + [[ -z $keyvalue ]] && { echo "error: Please provide a proper keyvalue" >&2; exit 1; } + + # value processing, switch case + case "${command,,}" in + + "read"|"get"|"load") + val="$(get_config $keyvalue)" + ret=$? + [[ "$val" == "$COMMENT_CHAR" ]] && exit 11 + [[ -z "$val" && $ret -eq 0 ]] && exit 10 + [[ -z "$val" && $ret -eq 1 ]] && exit 12 + [[ -n "$val" ]] && echo "$val" && exit 0 + ;; + + "stat"|"status") + val="$(get_config $keyvalue)" + ret=$? + [[ -f "$BATOCERA_CONFIGFILE" ]] && echo "ok: found '$BATOCERA_CONFIGFILE'" >&2 || echo "error: not found '$BATOCERA_CONFIGFILE'" >&2 + [[ -w "$BATOCERA_CONFIGFILE" ]] && echo "ok: r/w file '$BATOCERA_CONFIGFILE'" >&2 || echo "error: r/o file '$BATOCERA_CONFIGFILE'" >&2 + [[ -z "$val" && $ret -eq 1 ]] && echo "error: '$keyvalue' not found!" >&2 + [[ -z "$val" && $ret -eq 0 ]] && echo "error: '$keyvalue' is empty - use 'comment' command to retrieve" >&2 + [[ "$val" == "$COMMENT_CHAR" ]] && echo "error: '$keyvalue' is commented $COMMENT_CHAR!" >&2 && val= + [[ -n "$val" ]] && echo "ok: '$keyvalue' $val" + exit 0 + ;; + + "set"|"write"|"save") + #Is file write protected? + [[ -w "$BATOCERA_CONFIGFILE" ]] || { echo "r/o file: $BATOCERA_CONFIGFILE" >&2; exit 2; } + #We can comment line above to erase keys, it's much saver to check if a value is setted + [[ -z "$newvalue" ]] && echo "error: '$keyvalue' needs value to be setted" >&2 && exit 1 + + val="$(get_config $keyvalue)" + ret=$? + if [[ "$val" == "$COMMENT_CHAR" ]]; then + echo "$keyvalue: hashed out!" >&2 + uncomment_config "$keyvalue" + set_config "$keyvalue" "$newvalue" + echo "$keyvalue: set from '$val' to '$newvalue'" >&2 + exit 0 + elif [[ -z "$val" && $ret -eq 1 ]]; then + echo "$keyvalue: not found!" >&2 + exit 12 + elif [[ "$val" != "$newvalue" ]]; then + set_config "$keyvalue" "$newvalue" + exit 0 + fi + ;; + + "uncomment"|"enable"|"activate") + val="$(get_config $keyvalue)" + ret=$? + # Boolean + if [[ "$val" == "$COMMENT_CHAR" ]]; then + uncomment_config "$keyvalue" + echo "$keyvalue: removed '$COMMENT_CHAR', key is active" >&2 + elif [[ "$val" == "0" ]]; then + set_config "$keyvalue" "1" + echo "$keyvalue: boolean set '1'" >&2 + elif [[ -z "$val" && $ret -eq 1 ]]; then + echo "$keyvalue: not found!" && exit 2 + fi + ;; + + "comment"|"disable"|"remark") + val="$(get_config $keyvalue)" + ret=$? + # Boolean + [[ "$val" == "$COMMENT_CHAR" || "$val" == "0" ]] && exit 0 + if [[ -z "$val" && $ret -eq 1 ]]; then + echo "$keyvalue: not found!" >&2 && exit 12 + elif [[ "$val" == "1" ]]; then + set_config "$keyvalue" "0" + echo "$keyvalue: boolean set to '0'" >&2 + else + comment_config "$keyvalue" + echo "$keyvalue: added '$COMMENT_CHAR', key is not active" >&2 + fi + ;; + + *) + echo "ERROR: invalid command '$command'" >&2 + exit 1 + ;; + esac +} +##### MAIN FUNCTION ##### + +##### MAIN CALL ##### + +# Prepare arrays from fob python script +# Keyword for python call is mimic_python +# Attention the unset is needed to eliminate first argument (python basefile) + +if [[ "${#@}" -eq 1 && "$1" =~ "mimic_python" ]]; then + #batoceraSettings.py fob + readarray -t arr <<< "$1" + unset arr[0] +else + #regular call by shell + arr=("$@") +fi + +main "${arr[@]}" + +##### MAIN CALL ##### diff --git a/usr/bin/runemu.py b/usr/bin/runemu.py new file mode 100755 index 00000000..32ba1400 --- /dev/null +++ b/usr/bin/runemu.py @@ -0,0 +1,405 @@ +#!/usr/bin/env python3 + +import datetime +import os +import shlex +import subprocess +import sys +from dataclasses import dataclass +from pathlib import Path +from time import perf_counter +from typing import TYPE_CHECKING, Optional + +from setsettings import set_settings + +# If we are on Steam Deck we want a prefix + +# TODO: INSTALL_DIR + '/storage/.config/.OS_ARCH' was not working, dunno why, I'll check later +# DEVICE = "DECK" #for the moment this will do + +INSTALL_DIR = os.path.expanduser('~/retrodeck') +with open(INSTALL_DIR + r'/storage/.config/.OS_ARCH', 'r') as file: + DEVICE = file.read().rstrip() + +#if DEVICE == "DECK" : +# +#else: +# INSTALL_DIR = "" + +if TYPE_CHECKING: + #These except Union are deprecated in 3.9 and should be replaced with collections.abc / builtin list type, but we have 3.8 for now + from typing import List, Mapping, MutableMapping, Sequence, Union + +LOGS_DIR = Path('/tmp/logs') +RA_TEMP_CONF = INSTALL_DIR + '/storage/.config/retroarch/retroarch.cfg' +RA_APPEND_CONF = '/tmp/raappend.cfg' +log_path = LOGS_DIR / 'exec.log' + +def call_profile_func(function_name: str, *args: str) -> str: + # if we are on Steam Deck + if DEVICE == "DECK" : + proc = subprocess.run(f'. {INSTALL_DIR}/export_func.sh', shell=True, stdout=subprocess.PIPE, check=True, text=True) + else: + #We are going to want to call some stuff from /etc/profile, they are defined in ../profile.d/99-distribution.conf + #But on Steam Deck this is not needed as these stuff is called by another script as profile.d is just for embedded distros + proc = subprocess.run(f'. /etc/profile && {shlex.quote(function_name)} {shlex.join(args)}', shell=True, stdout=subprocess.PIPE, check=True, text=True) + return proc.stdout.strip('\n') + +def get_es_setting(setting_type: str, setting_name: str) -> str: + #from es_settings.cfg (XML) + return call_profile_func('get_es_setting', setting_type, setting_name) + +log_level = get_es_setting('string', 'LogLevel') #If set to default, would equal empty string + +def jslisten_set(*exe_names: str): + #exe_names are passed as one argument, intended for killall to use them later + if DEVICE != "DECK" : + call_profile_func('jslisten', 'set', shlex.join(exe_names)) + +def jslisten_stop(): + #call_profile_func('jslisten', 'stop') + if DEVICE != "DECK" : + subprocess.check_call(['systemctl', 'stop', 'jslisten']) + +def get_elec_setting(setting_name, platform=None, rom=None): + #From distribution.conf + #Potentially this can be reimplemented in Python if that turns out to be a good idea + return call_profile_func('get_ee_setting', setting_name, platform, rom) + +def set_elec_setting(setting_name, value): + call_profile_func('set_ee_setting', setting_name, value) + +def check_bios(platform, core, emulator, game, log_path_): + call_profile_func('ee_check_bios', platform, core, emulator, game, log_path_) + +def log(text): + with log_path.open('at', encoding='utf-8') as log_file: + print(text, file=log_file) + +def cleanup_and_quit(return_code): + if log_level == 'debug': + log(f'Cleaning up and exiting with return code {return_code}') + + if DEVICE != "DECK" : + jslisten_stop() + clear_screen() + call_profile_func('normperf') + call_profile_func('set_audio', 'default') + sys.exit(return_code) + +def clear_screen(): + if DEVICE != "DECK" : + if log_level == 'debug': + log('Clearing screen') + with open('/dev/console', 'wb') as console: + subprocess.run('clear', stdout=console, check=True) + +def list_archive(path: Path) -> 'List[str]': + #7z path needs to be given explicitly, otherwise it won't find 7z.so + sevenzip_proc = subprocess.run(['/usr/bin/7z', 'l', '-slt', path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=False) + if sevenzip_proc.returncode != 0: + raise OSError(sevenzip_proc.stderr.strip()) + #Ignore the first Path = line which is the archive itself + return [line[len('Path = '):] for line in sevenzip_proc.stdout.splitlines() if line.startswith('Path = ')][1:] + +def extract_archive(path: Path) -> Path: + #Assume there is only one file, otherwise things get weird + inner_filename = list_archive(path)[0] + #Since save files etc may be placed in the ROM folder, we should extract there so everything still works transparently, which also helps with overrides and such + subprocess.check_call(['/usr/bin/7z', 'e', f'-o{str(path.parent)}', path, inner_filename], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + return path.parent.joinpath(inner_filename) + +@dataclass(frozen=True) +class StandaloneEmulator(): + jskill_name: str + args: 'Sequence[str]' + should_extract: bool = False + +standalone_emulators: 'MutableMapping[str, StandaloneEmulator]' = { + 'AMIBERRY': StandaloneEmulator('amiberry', ['/usr/bin/amiberry.start', '']), + 'AdvanceMame': StandaloneEmulator('advmame', ['/usr/bin/advmame.sh', '']), + 'HATARISA': StandaloneEmulator('hatari', ['/usr/bin/hatari.start', '']), + 'hypseus_singe': StandaloneEmulator('hypseus', ['/usr/bin/hypseus.sh', '']), + 'OPENBOR': StandaloneEmulator('openbor', ['/usr/bin/openbor.sh', '']), + 'PPSSPPSDL': StandaloneEmulator('PPSSPPSDL', ['/usr/bin/ppsspp.sh', '']), + 'SCUMMVMSA': StandaloneEmulator('scummvm', ['/usr/bin/scummvm.start', 'sa', '']), + 'drastic': StandaloneEmulator('drastic', ['/usr/bin/drastic.sh', '']), + 'ecwolf': StandaloneEmulator('ecwolf', ['/usr/bin/ecwolf.sh', '']), + 'gzdoom': StandaloneEmulator('gzdoom', ['/usr/bin/gzdoom.sh', '']), + 'lzdoom': StandaloneEmulator('lzdoom', ['/usr/bin/lzdoom.sh', '']), + 'mpv': StandaloneEmulator('mpv', ['/usr/bin/mpv_video.sh', '']), + 'pico8': StandaloneEmulator('pico8_dyn', ['/usr/bin/pico-8.sh', '']), + 'piemu': StandaloneEmulator('piemu', ['/usr/bin/bash', '-l', '/usr/bin/piemu.sh', '']), + 'raze': StandaloneEmulator('raze', ['/usr/bin/raze.sh', '']), + 'solarus': StandaloneEmulator('solarus-run', ['/usr/bin/solarus.sh', '']), +} + +def _load_customized_standalone_emulators(): + try: + with open(INSTALL_DIR + '/storage/.config/standalone_emulators', 'rt', encoding='utf-8') as f: + for line in f: + if ': ' not in line or line.startswith('#'): + continue + name, rest = line.rstrip().split(': ', 1) + args = rest.split(' ') + kill_name = name + should_extract = False + #If name of exe to kill was not listed, assume it is the same as the emulator name + if not args[0].startswith('/'): + kill_name = args[0] + args = args[1:] + if args[-1] == 'should_extract': + args = args[:-1] + should_extract = True + standalone_emulators[name] = StandaloneEmulator(kill_name, args, should_extract) + except (FileNotFoundError, ValueError): + pass + +_load_customized_standalone_emulators() + +class EmuRunner(): + def __init__(self, rom: Optional[Path], platform: Optional[str], emulator: Optional[str], core: Optional[str], args: 'Mapping[str, str]') -> None: + self.rom = rom + self.platform = platform + self.emulator = emulator + self.core = core + self.args = args + self.temp_files: 'List[Path]' = [] #Files that we extracted from archives, etc. to clean up later + self.environment = os.environ.copy() + + def download_things_if_needed(self) -> None: + if self.core == 'freej2me': + #freej2me needs the JDK to be downloaded on the first run + subprocess.run(INSTALL_DIR + '/usr/bin/freej2me.sh', check=True) + self.environment['JAVA_HOME']=INSTALL_DIR + '/storage/jdk' + self.environment['PATH'] = INSTALL_DIR + '/storage/jdk/bin:' + os.environ['PATH'] + elif self.core == 'easyrpg': + # easyrpg needs runtime files to be downloaded on the first run + subprocess.run(INSTALL_DIR + '/usr/bin/easyrpg.sh', check=True) + + def toggle_max_performance(self) -> None: + if get_elec_setting('maxperf', self.platform, self.rom.name if self.rom else None) == '1': + if log_level == 'debug': + log('Enabling max performance as requested') + call_profile_func('maxperf') + else: + call_profile_func('normperf') + + def set_settings(self) -> str: + rom_name = str(self.rom) if self.rom else '' + core = self.core if self.core else '' + platform = self.platform if self.platform else '' + return set_settings(rom_name, core, platform, controllers=self.args.get('controllers', ''), autosave=self.args.get('autosave', ''), snapshot=self.args.get('state_slot', '')) + + def get_standalone_emulator_command(self) -> 'Sequence[Union[str, Path]]': + if not self.emulator: + raise ValueError('runemu.py was called improperly, tried to launch a standard emulator with no emulator') + if log_level != 'minimal': + log('Running a standalone emulator:') + log(f'platform: {self.platform}') + log(f'emulator: {self.emulator}') + #Core is not actually relevant (other than Mupen64Plus which is in another function) + + emu = standalone_emulators[self.emulator] + path = self.rom + if self.rom and emu.should_extract and self.rom.suffix in {'.zip', '.7z', '.gz', '.bz2'}: + path = extract_archive(self.rom) + self.temp_files.append(path) + + command = [arg for arg in (path if arg == '' else arg for arg in emu.args) if arg] + + jslisten_set(emu.jskill_name) + return command + + def get_retroarch_command(self, shader_arg: str) -> 'Sequence[Union[str, Path]]': + if log_level != 'minimal': + log('Running a libretro core via RetroArch') + log(f'platform: {self.platform}') + log(f'core: {self.core}') + retroarch_binary = 'retroarch' + if self.core in {'pcsx_rearmed', 'parallel_n64'}: + retroarch_binary = 'retroarch32' + self.environment['LD_LIBRARY_PATH'] = '/usr/lib32' + + rom_path: 'Optional[Union[str, Path]]' = self.rom + + if self.rom: + if self.platform == 'doom' and self.rom.suffix == '.doom': + subprocess.run(['dos2unix', self.rom], check=True) #Hmmmmm but do we need that + with self.rom.open('rt', encoding='utf-8') as doomfile: + for line in doomfile: + key, _, value = line.partition('=') + if key == 'IWAD': + rom_path = value + break + if self.core == 'scummvm' and self.rom.suffix == '.scummvm': + #ScummVM libretro core actually only works with .scummvm files that just have the game ID with no path specified, which isn't how they are generated by the scummvm scanner script + #But if you give it any other path to a file, it will autodetect a game inside that file's parent directory, even if the file doesn't actually exist + #This would otherwise be what /usr/bin/scummvm.start tries to do when its first arg is "libretro", by cd'ing into that game directory + path = Path(self.rom.read_text(encoding='utf-8').split('"')[1]) + rom_path = path / 'game' + + jslisten_set(retroarch_binary) + command: 'List[Union[str, Path]]' = [os.path.join('/usr/bin/', retroarch_binary), '-L', Path('/tmp/cores/', f'{self.core}_libretro.so')] + + if log_level != 'minimal': + command.append('--verbose') + + if 'host' in self.args or 'connect' in self.args: + netplay_nick = get_elec_setting('netplay.nickname') + if not netplay_nick: + netplay_nick = '351ELEC' + if 'connect' in self.args: + set_elec_setting('netplay.client.port', self.args['port']) + set_elec_setting('netplay.client.ip', self.args['connect']) #We should now have parsed that properly so it's just a hostname/IP address, no --port argument + command += ['--connect', self.args['connect'] + '|' + self.args['port']] + if 'host' in self.args: + command += ['--host', self.args['host']] + + command += ['--nick', netplay_nick] + + if self.core == 'fbneo' and self.platform == 'neocd': + command += ['--subsystem', self.platform] + if shader_arg: + #Returned from setsettings, this is of the form "--shader-set /tmp/shaders/blahblahblah", apparently actually needed even if video_shader is set in RA_APPEND_CONF + command += shlex.split(shader_arg) + command += ['--config', RA_TEMP_CONF, '--appendconfig', RA_APPEND_CONF] + if rom_path: + command.append(rom_path) + + return command + + def get_retrorun_command(self) -> 'Sequence[Union[str, Path]]': + if not self.rom: + raise ValueError('runemu.py was called improperly, tried to launch retrorun with no game') + if not self.platform: + raise ValueError('runemu.py was called improperly, tried to launch retrorun with no platform') + if not self.core: + raise ValueError('runemu.py was called improperly, tried to launch retrorun with no platform') + + core_path = Path('/tmp/cores/', f'{self.core}_libretro.so') + if log_level != 'minimal': + log('Running a libretro core via retrorun') + log(f'platform: {self.platform}') + log(f'core: {self.core}') + jslisten_set('retrorun', 'retrorun32') + + path = self.rom + if self.rom.suffix in {'.zip', '.7z', '.gz', '.bz2'} and self.platform not in {'arcade', 'naomi', 'atomiswave', 'fbneo', 'mame'}: + path = extract_archive(self.rom) + self.temp_files.append(path) + + return [INSTALL_DIR + '/usr/bin/retrorun.sh', core_path, path, self.platform] + + def get_mupen64plus_standalone_command(self) -> 'Sequence[Union[str, Path]]': + if not self.rom: + raise ValueError('runemu.py was called improperly, tried to launch Mupen64Plus standalone with no video plugin') + if not self.core: + raise ValueError('runemu.py was called improperly, tried to launch Mupen64Plus standalone with no video plugin') + if log_level != 'minimal': + log(f'Running Mupen64Plus standalone with {self.core} video plugin') + jslisten_set('mupen64plus') + path = self.rom + if self.rom.suffix in {'.zip', '.7z', '.gz', '.bz2'}: + path = extract_archive(self.rom) + self.temp_files.append(path) + + return [INSTALL_DIR + '/usr/bin/m64p.sh', self.core, path] + + def get_command(self, shader_arg: str='') -> 'Sequence[Union[str, Path]]': + is_libretro_port = self.core and not self.emulator + #If true this was called from the inside of a port .sh that runs a libretro port (e.g. 2048, tyrQuake, etc), it makes no sense otherwise + + if self.rom and (self.rom.suffix == '.sh' or self.platform == 'tools'): + #If the ROM is a shell script then just execute it (tools, ports, Pico-8 splore, ScummVM scanner, etc) + return ['/usr/bin/bash', '-l', self.rom] + elif self.emulator == 'retroarch' or is_libretro_port: + return self.get_retroarch_command(shader_arg) + elif self.emulator == 'retrorun': + return self.get_retrorun_command() + elif self.emulator == 'mupen64plussa': + return self.get_mupen64plus_standalone_command() + else: + return self.get_standalone_emulator_command() + + def run(self, command: 'Sequence[Union[str, Path]]') -> None: + clear_screen() + if log_level != 'minimal': + log(f'Executing game: {self.rom}') + log(f'Executing {command}') + with log_path.open('at', encoding='utf-8') as log_file: + subprocess.run(command, stdout=log_file, stderr=subprocess.STDOUT, check=True, text=True, env=self.environment) + + def cleanup_temp_files(self) -> None: + for temp_file in self.temp_files: + temp_file.unlink(missing_ok=True) + +def main(): + time_started = perf_counter() + + i = 0 + args: dict[str, str] = {} + while i < len(sys.argv)-1: + if sys.argv[i].startswith('--'): + args[sys.argv[i][2:]] = sys.argv[i + 1] + i += 1 + continue + if sys.argv[i].startswith('-'): + args[sys.argv[i][1:]] = sys.argv[i + 1] + i += 1 + continue + i += 1 + + rom = Path(args['rom']) if 'rom' in args else None + platform = args.get('platform') + core = args.get('core') + emulator = args.get('emulator') + + log_path.unlink(missing_ok=True) + LOGS_DIR.mkdir(parents=True, exist_ok=True) + log_path.touch() + + log(f'Emulation run log: Started at {datetime.datetime.now()}') + log(f'Args: {args}') + + runner = EmuRunner(rom, platform, emulator, core, args) + + runner.download_things_if_needed() + runner.toggle_max_performance() + + #Disable netplay by default + set_elec_setting('netplay.client.ip', 'disable') + set_elec_setting('netplay.client.port', 'disable') + + jslisten_stop() + + shader_arg = runner.set_settings() + command = runner.get_command(shader_arg) + if log_level != 'minimal': + log(f'Took {perf_counter() - time_started} seconds to start up') + clear_screen() + + try: + runner.run(command) + exit_code = 0 + except subprocess.CalledProcessError as cpe: + log(f'Process exited improperly with return code {cpe.returncode}') + exit_code = 1 + requires_bios = {'atari5200', 'atari800', 'atari7800', 'atarilynx', 'colecovision', 'amiga', 'amigacd32', 'o2em', 'intellivision', 'pcengine', 'pcenginecd', 'pcfx', 'fds', 'segacd', 'saturn', 'dreamcast', 'naomi', 'atomiswave', 'x68000', 'neogeo', 'neogeocd', 'msx', 'msx2', 'sc-3000'} + if platform in requires_bios: + if platform == 'msx2': + platform_to_check = 'msx2' + elif platform == 'pcenginecd': + platform_to_check = 'pcengine' + elif platform == 'amigacd32': + platform_to_check = 'amiga' + else: + platform_to_check = platform + check_bios(platform_to_check, core, emulator, rom, log_path) + finally: + runner.cleanup_temp_files() + cleanup_and_quit(exit_code) + + +if __name__ == '__main__': + main() diff --git a/usr/bin/setsettings.py b/usr/bin/setsettings.py new file mode 100755 index 00000000..aabdff08 --- /dev/null +++ b/usr/bin/setsettings.py @@ -0,0 +1,700 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: GPL-2.0-or-later +# +# setsettings.py: +# Copyright (C) 2021-present konsumschaf +# Copyright (C) 2021-present konsumlamm +# +# based on setsettings.sh: +# Copyright (C) 2019-present Shanti Gilbert (https://github.com/shantigilbert) +# Copyright (C) 2020-present Fewtarius + + +# Convert ES settings from distribution.conf to RetroArch configuration in raappend.conf. + +from argparse import ArgumentParser +from configparser import ConfigParser +from dataclasses import dataclass +from glob import iglob +import os +import random +import re +import shutil + +# If we are on Steam Deck we want a prefix +DEVICE = "DECK" +# TODO: put a real check on the .OS_ARCH file, or maybe not as we are obviously running on Deck +INSTALL_DIR = os.path.expanduser("~/retrodeck") + +# if DEVICE == "DECK" : +# +#else: +# INSTALL_DIR = "" + +# Files and Folder +ra_conf = INSTALL_DIR + "/storage/.config/retroarch/retroarch.cfg" +ra_source_conf = INSTALL_DIR + "/usr/config/retroarch/retroarch.cfg" +ra_core_conf = INSTALL_DIR + "/storage/.config/retroarch/retroarch-core-options.cfg" +ra_append_conf = "/tmp/raappend.cfg" +os_arch_conf = INSTALL_DIR + "/storage/.config/.OS_ARCH" +snapshots = INSTALL_DIR + "/storage/roms/savestates" + +# Logging +class Logger: + dir = "/tmp/logs" + file = "exec.log" + script_basename = os.path.basename(__file__) + + def __init__(self): + if not os.path.isdir(self.dir): + os.makedirs(self.dir) + self.file_handle = open(f'{self.dir}/{self.file}',"a+") + + def log(self, text: str) -> None: + self.file_handle.write(f'{self.script_basename}: {text}\n') + + def __del__(self): + self.file_handle.close() + + +# No Sections in distribution.conf, we have to fake our own +class MyConfigParser(ConfigParser): + def read(self, filename: str) -> None: + text = open(filename, encoding="utf_8").read() + self.read_string("[351elec]\n" + text, filename) + +@dataclass +class Config: + rom_name: str + platform: str + + distribution_conf = INSTALL_DIR + "/storage/.config/distribution/configs/distribution.conf" + + def __post_init__(self): + # Read the distribution.conf to a dictionary + config_parser = MyConfigParser(strict=False) + config_parser.read(self.distribution_conf) + self.config = config_parser['351elec'] + + def get_setting(self, setting: str) -> str: + """Get the settings from distribution.conf""" + + pat_rom = f'{self.platform}["{self.rom_name}"].{setting}' + pat_platform = f'{self.platform}.{setting}' + pat_global = f'global.{setting}' + + if pat_rom in self.config: + value = self.config[pat_rom] + elif pat_platform in self.config: + value = self.config[pat_platform] + elif pat_global in self.config: + value = self.config[pat_global] + else: + value = "" + + if value == "0": + value = "" + return value + + def get_bool_string(self, setting: str) -> str: + """For readability a function that returns "true" and "false" directly.""" + + if self.get_setting(setting): + return "true" + else: + return "false" + +# Delete lines from a config file +def delete_lines(file_path: str, lines: tuple) -> None: + with open(file_path, "r") as input: + tmp_file = f'/tmp/{os.path.basename(file_path)}.tmp' + with open(tmp_file, "w") as output: + for line in input: + write_this_line = True + for item in lines: + if line.strip().startswith(item): + write_this_line = False + break + if write_this_line: + output.write(line) + # replace file with original name + shutil.move(tmp_file, file_path) + +# Append dictionary to the end of a file +def write_file(file_path: str, dictionary: dict, separator: str = ' = ', quote_sign: str = '"') -> None: + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "a") as file: + for (key, value) in dictionary.items(): + file.write(f'{key}{separator}{quote_sign}{value}{quote_sign}\n') + +# Generate the config out of the distribution.conf +def set_settings(rom_name: str, core: str, platform: str, controllers: str, autosave: str, snapshot: str) -> str: + logger = Logger() + shader_path = '' + + # + # Do some checks and clean up first + # + + # Log current call: + logger.log(f'ROM: {rom_name}') + logger.log(f'Platform: {platform}') + logger.log(f'Core: {core}') + logger.log(f'Controllers: {controllers}') + logger.log(f'Autosave: {autosave}') + logger.log(f'Snapshot: {snapshot}') + + # We only need the ROM, but we get the fullpath + rom_name = os.path.basename(rom_name) + # Delete any existing raappend.cfg first + if os.path.isfile(ra_append_conf): + os.remove(ra_append_conf) + # Restore retroarch.cfg if it is missing or empty + if not os.path.isfile(ra_conf) or os.stat(ra_conf).st_size == 0: + shutil.copy(ra_source_conf,ra_conf) + + # Get the Device Name + with open(os_arch_conf, encoding="utf-8") as f: + device_name = f.readline().strip() + logger.log(f'Device: {device_name}') + + # Is the CORE 32 or 64bit? + if core in {'pcsx_rearmed', 'parallel_n64'}: + bits='32bit' + else: + bits='64bit' + logger.log(f'core is {bits}') + + # Dictionary for the raappend.cfg + ra_append_dict = {} + + # Create config from distribution.conf + config = Config(rom_name, platform) + + # + # Global configuration directly in retroarch.cfg + # + + # RA menu rgui, ozone, glui or xmb (fallback if everthing else fails) + # if empty (auto in ES) do nothing to enable configuration in RA + if menu_driver := config.get_setting('retroarch.menu_driver'): + ra_dict = {} + # delete setting only if we set new ones + # therefore configuring in RA is still possible + delete_lines(ra_conf, ('menu_driver', 'menu_linear_filter')) + if menu_driver == 'rgui': + ra_dict['menu_driver'] = 'rgui' + ra_dict['menu_linear_filter'] = 'true' + elif menu_driver == 'ozone': + ra_dict['menu_driver'] = 'ozone' + elif menu_driver == 'glui': + ra_dict['menu_driver'] = 'glui' + else: + # play it save and set xmb if nothing else matches + ra_dict['menu_driver'] = 'xmb' + write_file(ra_conf, ra_dict) + + # + # Convert the settings from distribution.conf to raappend.cfg + # + + # FPS + ra_append_dict['fps_show'] = config.get_bool_string("showFPS") + + # Retroachievements / Cheevos + retro_achievements = { + 'arcade', 'atari2600', 'atari7800', 'atarilynx', 'colecovision', + 'famicom', 'fbn', 'fds', 'gamegear', 'gb', 'gba', 'gbah', 'gbc', 'gbch', + 'gbh', 'genesis', 'genh', 'ggh', 'intellivision', 'mastersystem', + 'megacd', 'megadrive', 'megadrive-japan', 'msx', 'msx2', 'n64', + 'neogeo', 'neogeocd', 'nes', 'nesh', 'ngp', 'ngpc', 'odyssey2', + 'pcengine', 'pcenginecd', 'pcfx', 'pokemini', 'psp', 'psx', 'sega32x', + 'segacd', 'sfc', 'sg-1000', 'snes', 'snesh', 'snesmsu1', 'supergrafx', + 'supervision', 'tg16', 'tg16cd', 'vectrex', 'virtualboy', 'wonderswan', + 'wonderswancolor', + } + if platform in retro_achievements: + if config.get_setting("retroachievements"): + ra_append_dict['cheevos_enable'] = "true" + ra_append_dict['cheevos_username'] = config.get_setting("retroachievements.username") + ra_append_dict['cheevos_password'] = config.get_setting("retroachievements.password") + ra_append_dict['cheevos_hardcore_mode_enable'] = config.get_bool_string("retroachievements.hardcore") + value = config.get_setting("retroachievements.leaderboards") + if value == "enabled": + ra_append_dict['cheevos_leaderboards_enable'] = "true" + elif value == "trackers only": + ra_append_dict['cheevos_leaderboards_enable'] = "trackers" + elif value == "notifications only": + ra_append_dict['cheevos_leaderboards_enable'] = "notifications" + else: + ra_append_dict['cheevos_leaderboards_enable'] = "false" + ra_append_dict['cheevos_verbose_enable'] = config.get_bool_string("retroachievements.verbose") + ra_append_dict['cheevos_auto_screenshot'] = config.get_bool_string("retroachievements.screenshot") + ra_append_dict['cheevos_richpresence_enable'] = config.get_bool_string("retroachievements.richpresence") + ra_append_dict['cheevos_challenge_indicators'] = config.get_bool_string("retroachievements.challengeindicators") + ra_append_dict['cheevos_test_unofficial'] = config.get_bool_string("retroachievements.testunofficial") + ra_append_dict['cheevos_badges_enable'] = config.get_bool_string("retroachievements.badges") + ra_append_dict['cheevos_start_active'] = config.get_bool_string("retroachievements.active") + ra_append_dict['cheevos_unlock_sound_enable'] = config.get_bool_string("retroachievements.soundenable") + else: + ra_append_dict['cheevos_enable'] = "false" + ra_append_dict['cheevos_username'] = "" + ra_append_dict['cheevos_password'] = "" + ra_append_dict['cheevos_hardcore_mode_enable'] = "false" + ra_append_dict['cheevos_leaderboards_enable'] = "false" + ra_append_dict['cheevos_verbose_enable'] = "false" + ra_append_dict['cheevos_test_unofficial'] = "false" + ra_append_dict['cheevos_unlock_sound_enable'] = "false" + ra_append_dict['cheevos_auto_screenshot'] = "false" + ra_append_dict['cheevos_badges_enable'] = "false" + ra_append_dict['cheevos_start_active'] = "false" + ra_append_dict['cheevos_richpresence_enable'] = "false" + ra_append_dict['cheevos_challenge_indicators'] = "false" + + # Netplay + if config.get_setting("netplay"): + ra_append_dict['netplay'] = "true" + # Not needed any more? + ## Disable Cheevos Hardcore Mode to allow savestates + #if 'cheevos_hardcore_mode_enable' in ra_append_dict: + # ra_append_dict['cheevos_hardcore_mode_enable'] = "false" + # Host or Client + value = config.get_setting('netplay.mode') + if value == 'host': + ra_append_dict['netplay_mode'] = "false" + ra_append_dict['netplay_client_swap_input'] = "false" + ra_append_dict['netplay_ip_port'] = config.get_setting('netplay.port') + elif value == 'client': + ra_append_dict['netplay_mode'] = "true" + ra_append_dict['netplay_ip_address'] = config.get_setting('netplay.client.ip') + ra_append_dict['netplay_ip_port'] = config.get_setting('netplay.client.port') + ra_append_dict['netplay_client_swap_input'] = "true" + # Relay + if value := config.get_setting('netplay.relay'): + ra_append_dict['netplay_use_mitm_server'] = "true" + ra_append_dict['netplay_mitm_server'] = value + else: + ra_append_dict['netplay_use_mitm_server'] = "false" + ra_append_dict['netplay_delay_frames'] = config.get_setting('netplay.frames') + ra_append_dict['netplay_nickname'] = config.get_setting('netplay.nickname') + # spectator mode + ra_append_dict['netplay_spectator_mode_enable'] = config.get_bool_string("netplay.spectator") + ra_append_dict['netplay_public_announce'] = config.get_bool_string("netplay_public_announce") + else: + ra_append_dict['netplay'] = "false" + + # AI Translation Service + if config.get_setting('ai_service_enabled'): + ra_append_dict['ai_service_enable'] = "true" + LangCodes = { + "false": "0", "En": "1", "Fr": "3", "Pt": "49", "De": "5", + "El": "30", "Es": "2", "Cs": "8", "Da": "9", "Hr": "11", "Hu": "35", + "It": "4", "Ja": "6", "Ko": "12", "Nl": "7", "Nn": "46", "Po": "48", + "Ro": "50", "Ru": "51", "Sv": "10", "Tr": "59", "Zh": "13", + } + ai_lang = config.get_setting('ai_target_lang') + if ai_lang in LangCodes: + ra_append_dict['ai_service_target_lang'] = f'{LangCodes[ai_lang]}' + else: + # use English as default + ra_append_dict['ai_service_target_lang'] = "1" + if ai_url := config.get_setting('ai_service_url'): + ra_append_dict['ai_service_url'] = f'{ai_url}&mode=Fast&output=png&target_lang={ai_lang}' + else: + ra_append_dict['ai_service_url'] = f'http://ztranslate.net/service?api_key=BATOCERA&mode=Fast&output=png&target_lang={ai_lang}' + else: + ra_append_dict['ai_service_enable'] = "false" + + # + # Global/System/Game specific settings + # + + # Ratio + # default to 22 (core provided) if case anything goes wrong + ra_append_dict['aspect_ratio_index'] = "22" + if ratio := config.get_setting('ratio'): + index_rations = { + '4/3': '0', '16/9': '1', '16/10': '2', '16/15': '3', '21/9': '4', + '1/1': '5', '2/1': '6', '3/2': '7', '3/4': '8', '4/1': '9', + '9/16': '10', '5/4': '11', '6/5': '12', '7/9': '13', '8/3': '14', + '8/7': '15', '19/12': '16', '19/14': '17', '30/17': '18', + '32/9': '19', 'config': '20', 'squarepixel': '21', 'core': '22', + 'custom': '23', 'full' : '24', + } + if ratio in index_rations: + ra_append_dict['aspect_ratio_index'] = index_rations[ratio] + + # Bilinear filtering + ra_append_dict['video_smooth'] = config.get_bool_string("smooth") + + # Video Integer Scale + ra_append_dict['video_scale_integer'] = config.get_bool_string("integerscale") + + # Video Integer Scale Overscale + ra_append_dict['video_scale_integer_overscale'] = config.get_bool_string("integerscaleoverscale") + + # RGA Scaling / CTX Scaling + ra_append_dict['video_ctx_scaling'] = config.get_bool_string("rgascale") + + # Shaderset + if shaderset := config.get_setting('shaderset'): + ra_append_dict['video_shader_enable'] = "true" + ra_append_dict['video_shader'] = shaderset + # We need to print the shader folder for runemu.sh to use it + shader_path = f'--set-shader /tmp/shaders/{shaderset}' + else: + ra_append_dict['video_shader_enable'] = "false" + ra_append_dict['video_shader'] = "" + + # Filters + # Set correct path for video- and audio-filters depending on 32/64bit + ra_append_dict['audio_filter_dir'] = f'/usr/share/retroarch/filters/{bits}/audio' + ra_append_dict['video_filter_dir'] = f'/usr/share/retroarch/filters/{bits}/video' + # Filterset + if filterset := config.get_setting('filterset'): + # Filter do not work with RGA/CTX enabled + ra_append_dict['video_ctx_scaling'] = "false" + ra_append_dict['video_filter'] = f'/usr/share/retroarch/filters/{bits}/video/{filterset}' + else: + ra_append_dict['video_filter'] = "" + + # Rewind + no_rewind = {'sega32x', 'psx', 'zxspectrum', 'odyssey2', 'mame', 'n64', 'dreamcast', 'atomiswave', 'naomi', 'neogeocd', 'saturn', 'psp', 'pspminis'} + if config.get_setting('rewind') and platform not in no_rewind: + ra_append_dict['rewind_enable'] = "true" + else: + ra_append_dict['rewind_enable'] = "false" + + # Saves + # Incrementalsavestates + if config.get_setting('incrementalsavestates'): + ra_append_dict['savestate_auto_index'] = "true" + ra_append_dict['savestate_max_keep'] = "0" + else: + ra_append_dict['savestate_auto_index'] = "false" + ra_append_dict['savestate_max_keep'] = "50" + # Autosave + if config.get_setting('autosave'): + ra_append_dict['savestate_auto_save'] = "true" + ra_append_dict['savestate_auto_load'] = "true" + else: + ra_append_dict['savestate_auto_save'] = "false" + ra_append_dict['savestate_auto_load'] = "false" + # Snapshots + ra_append_dict['savestate_directory'] = f'{snapshots}/{platform}' + if snapshot: + if autosave == "1": + ra_append_dict['savestate_auto_load'] = "true" + ra_append_dict['savestate_auto_save'] = "true" + else: + ra_append_dict['savestate_auto_load'] = "false" + ra_append_dict['savestate_auto_save'] = "false" + ra_append_dict['state_slot'] = f'{snapshot}' + + # Runahead + # Runahead 1st Instance + no_run_ahead = {'psp', 'sega32x', 'n64', 'dreamcast', 'atomiswave', 'naomi', 'neogeocd', 'saturn'} + if (runahead := config.get_setting('runahead')) and platform not in no_run_ahead: + ra_append_dict['run_ahead_enabled'] = "true" + ra_append_dict['run_ahead_frames'] = runahead + else: + ra_append_dict['run_ahead_enabled'] = "false" + ra_append_dict['run_ahead_frames'] = "1" + # Runahead 2nd Instance + if config.get_setting('secondinstance') and platform not in no_run_ahead: + ra_append_dict['run_ahead_secondary_instance'] = "true" + else: + ra_append_dict['run_ahead_secondary_instance'] = "false" + + # Auto Frame Relay + ra_append_dict['video_frame_delay_auto'] = config.get_bool_string("video_frame_delay_auto") + + # maxperf / CPU Governor + if config.get_setting('maxperf'): + ra_append_dict['cpu_scaling_mode'] = '2' + else: + ra_append_dict['cpu_scaling_mode'] = '4' + + # + # Settings for special cores + # + + ## atari800 core needs other settings when emulation atari5200 + if core == 'atari800': + logger.log('Atari 800 section') + retrocore_dict = {} + atari800_dict = {} + atari_dict = {} + atari_conf = INSTALL_DIR + '/storage/.config/distribution/configs/atari800.cfg' + atari800_conf = INSTALL_DIR + '/storage/.config/retroarch/config/Atari800/Atari800.opt' + delete_lines(ra_core_conf, ('atari800_system =',)) + delete_lines(atari_conf, ('RAM_SIZE', 'STEREO_POKEY', 'BUILTIN_BASIC')) + if os.path.isfile(atari800_conf): + delete_lines(atari800_conf, ('atari800_system',)) + if platform == 'atari5200': + retrocore_dict['atari800_system'] = '5200' + atari800_dict['atari800_system'] = '5200' + atari_dict['RAM_SIZE'] = '16' + atari_dict['STEREO_POKEY'] = '0' + atari_dict['BUILTIN_BASIC'] = '0' + else: + retrocore_dict['atari800_system'] = '800XL (64K)' + atari800_dict['atari800_system'] = '800XL (64K)' + atari_dict['RAM_SIZE'] = '64' + atari_dict['STEREO_POKEY'] = '1' + atari_dict['BUILTIN_BASIC'] = '1' + write_file(ra_core_conf, retrocore_dict) + # The format of the atari800.cfg is different + # ('key=value' instead of 'key = "value"') + write_file(atari_conf, atari_dict, separator='=', quote_sign='') + write_file(atari800_conf, atari800_dict) + + # Gambatte + if core == 'gambatte': + logger.log('Gambatte section') + gambatte_dict = {} + gambatte_conf = INSTALL_DIR + "/storage/.config/retroarch/config/Gambatte/Gambatte.opt" + + if os.path.isfile(gambatte_conf): + delete_lines(gambatte_conf, ('gambatte_gb_colorization', 'gambatte_gb_internal_palette')) + else: + gambatte_dict['gambatte_gbc_color_correction'] = 'disabled' + + colorization = config.get_setting('renderer.colorization') + logger.log(f'gambatte colorization: {colorization}') + if not colorization or colorization == 'auto': + gambatte_dict['gambatte_gb_colorization'] = 'disabled' + elif colorization == 'Best Guess': + gambatte_dict['gambatte_gb_colorization'] = 'auto' + elif colorization == 'GBC' or colorization == 'SGB': + gambatte_dict['gambatte_gb_colorization'] = colorization + else: + gambatte_dict['gambatte_gb_colorization'] = 'internal' + gambatte_dict['gambatte_gb_internal_palette'] = colorization + + write_file(gambatte_conf, gambatte_dict) + + # + # Controllers + # + # We set up the controller index + if controllers: + for player in range(1,6): + logger.log(f'Controller section {player}') + if pindex := re.search(fr'p{player}index\s+([0-9]+)', controllers): + ra_append_dict['input_player{player}_joypad_index'] = pindex.group(1) + # Setting controller type for different cores + if platform == "atari5200": + ra_append_dict['input_libretro_device_p{player}'] = '513' + + # + # Bezels / Decorations + # + # List of possible Bezel Folders + bezel_dir = ('/tmp/overlays/bezels', INSTALL_DIR + '/storage/roms/bezels') + # Define the resolutions of the different systems (0:x 1:y 2:width 3:height) as seen in Scaling -> Aspect Ration -> Custom + # Devices (width x hight) + # RG351P/M = 480x320 + # RG351V/MP = 640x480 + # RG552 = 1920x1152 + # DECK = 1280x800 + # Consoles (width x hight) + # GB/GBC/GG = 160x144 + # supervision = 160x160 + # Pokemini = 96x64 + # ngp/ngpc = 160x152 + # wonderswan/wonderswancolor = 224×144 + if device_name == "RG351P": + system_viewport = { + 'standard': (1, 1, 479, 319), # max-1 + 'gb': (80, 16, 320, 288), # x2 + 'gbh': (80, 16, 320, 288), # x2 + 'gbc': (80, 16, 320, 288), # x2 + 'gbch': (80, 16, 320, 288), # x2 + 'supervision': (80, 0, 320, 320), # x2 + 'gamegear': (80, 16, 320, 288), # x2 + 'ggh': (80, 16, 320, 288), # x2 + 'pokemini': (96, 64, 288, 192), # x3 + 'ngp': (80, 8, 320, 304), # x2 + 'ngpc': (80, 8, 320, 304), # x2 + 'wonderswan': (16, 16, 448, 288), # x2 + 'wonderswancolor': (16, 16, 448, 288), # x2 + } + elif device_name == "RG351V" or device_name == "RG351MP": + system_viewport = { + 'standard': (1, 1, 639, 479), # max-1 + 'gb': (80, 24, 480, 432), # x3 + 'gbh': (80, 24, 480, 432), # x3 + 'gbc': (80, 24, 480, 432), # x3 + 'gbch': (80, 24, 480, 432), # x3 + 'supervision': (80, 0, 480, 480), # x3 + 'gamegear': (80, 24, 480, 432), # x3 + 'ggh': (80, 24, 480, 432), # x3 + 'pokemini': (128, 112, 384, 256), # x4 + 'ngp': (80, 12, 480, 456), # x3 + 'ngpc': (80, 12, 480, 456), # x3 + 'wonderswan': (96, 96, 448, 288), # x2 + 'wonderswancolor': (96, 96, 448, 288), # x2 + } + elif device_name == "RG552": + system_viewport = { + 'standard': (1, 1, 1919, 1151), # max-1 + 'gb': (320, 0, 1280, 1152), # x8 + 'gbh': (320, 0, 1280, 1152), # x8 + 'gbc': (320, 0, 1280, 1152), # x8 + 'gbch': (320, 0, 1280, 1152), # x8 + 'supervision': (400, 16, 1120, 1120), # x7 + 'gamegear': (320, 0, 1280, 1152), # x8 + 'ggh': (320, 0, 1280, 1152), # x8 + 'pokemini': (384, 192, 1152, 768), # x12 + 'ngp': (400, 44, 1120, 1064), # x7 + 'ngpc': (400, 44, 1120, 1064), # x7 + 'wonderswan': (64, 0, 1792, 1152), # x8 + 'wonderswancolor': (64, 0, 1792, 1152), # x8 + } + elif device_name == "DECK": + #just copied from 552, I have to edit this + system_viewport = { + 'standard': (1, 1, 1279, 799), # max-1 + 'gb': (320, 0, 1280, 1152), # x8 + 'gbh': (320, 0, 1280, 1152), # x8 + 'gbc': (320, 0, 1280, 1152), # x8 + 'gbch': (320, 0, 1280, 1152), # x8 + 'supervision': (400, 16, 1120, 1120), # x7 + 'gamegear': (320, 0, 1280, 1152), # x8 + 'ggh': (320, 0, 1280, 1152), # x8 + 'pokemini': (384, 192, 1152, 768), # x12 + 'ngp': (400, 44, 1120, 1064), # x7 + 'ngpc': (400, 44, 1120, 1064), # x7 + 'wonderswan': (64, 0, 1792, 1152), # x8 + 'wonderswancolor': (64, 0, 1792, 1152), # x8 + } + + bezel_cfg = None + + if (bezel := config.get_setting('bezel')) and platform in system_viewport: + logger.log(f'bezel: {bezel} platform: {platform} rom: {rom_name}') + tmp_bezel = "/tmp/351elec-bezel.cfg" + game_cfg = '' + # set path + path = '' + for searchpath in bezel_dir: + if os.path.isdir(f'{searchpath}/{bezel}'): + path = f'{searchpath}/{bezel}' + + bezel_system = config.get_setting('bezel.system.override') + if not bezel_system or bezel_system == "AUTO": + bezel_system = platform + + bezel_system_png = f'{path}/systems/{bezel_system}.png' + logger.log(f'Bezel system png: {bezel_system_png}') + + game_bezel_override = config.get_setting('bezel.game.override') + logger.log(f'Game bezel override: {game_bezel_override}') + if not game_bezel_override or game_bezel_override == "AUTO": + logger.log('No game specific override found. Looking for games') + # is there a $ROMNAME.cfg? + # exactly the same / just the name / default + # Random bezels have to match $ROMNAME./d+.cfg + romdir = f'{path}/systems/{bezel_system}/games' + full_name = os.path.splitext(rom_name)[0] + short_name = full_name.split(' (')[0] + if os.path.isdir(romdir): + with os.scandir(romdir) as it: + full_list = [entry.name for entry in it if entry.is_file() and entry.name.endswith('.cfg')] + for romname in (full_name, short_name , 'default'): + logger.log(f'Looking at: {romdir}/{romname}') + file_list = [file for file in full_list if re.fullmatch(fr'{re.escape(romname)}\.[0-9]+\.cfg', file)] + if len(file_list) > 0: + game_cfg = f'{romdir}/{random.choice(file_list)}' + logger.log(f'Using random config: {game_cfg}') + break + elif os.path.isfile(f'{romdir}/{romname}.cfg'): + game_cfg = f'{romdir}/{romname}.cfg' + logger.log(f'Using ROM config: {game_cfg}') + break + else: + game_cfg = f'{path}/systems/{bezel_system}/games/{game_bezel_override}.cfg' + + if os.path.isfile(game_cfg): + logger.log(f'game config file exists: {game_cfg}') + with open(game_cfg) as f: + contents = f.read().strip() + bezel_system_png = f'{path}/systems/{bezel_system}/games/{contents}' + logger.log(f'bezel png: {bezel_system_png}') + if os.path.isfile(bezel_system_png): + tmp_bezel_dict = {} + tmp_bezel_dict['overlays'] = '1' + tmp_bezel_dict['overlay0_full_screen'] = 'true' + tmp_bezel_dict['overlay0_normalized'] = 'true' + tmp_bezel_dict['overlay0_overlay'] = bezel_system_png + overlays_dir = f'{path}/systems/{bezel_system}/overlays/' + count = 0 + if os.path.isdir(overlays_dir): + for overlay_png in iglob(f'{overlays_dir}/*.png'): + overlay_name = os.path.splitext(os.path.basename(overlay_png))[0] + overlay_setting = config.get_setting(f'bezel.overlay.{overlay_name}') + if not overlay_setting: + continue + logger.log(f'Adding overlay. name: {overlay_name} overlay setting: {overlay_setting}') + tmp_bezel_dict[f'overlay0_desc{count}_overlay'] = overlay_png + tmp_bezel_dict[f'overlay0_desc{count}'] = 'nul,0.5,0.5,rect,0.5,0.5' + count += 1 + tmp_bezel_dict['overlay0_descs'] = count + if os.path.isfile(tmp_bezel): + os.remove(tmp_bezel) + write_file(tmp_bezel, tmp_bezel_dict) + bezel_cfg = tmp_bezel + + if bezel_cfg is not None: + logger.log('using bezel') + # configure bezel + ra_append_dict['input_overlay_enable'] = 'true' + ra_append_dict['input_overlay'] = bezel_cfg + ra_append_dict['input_overlay_hide_in_menu'] = 'true' + ra_append_dict['input_overlay_opacity'] = '1.000000' + ra_append_dict['input_overlay_show_inputs'] = '2' + ra_append_dict['video_scale_integer'] = 'false' + ra_append_dict['aspect_ratio_index'] = '23' + # configure custom scaling + # needs some grouping to reflect the hack systems as well (i. e. gb=gb, gbh, gbc and gbch) + ra_append_dict['custom_viewport_x'] = system_viewport[platform][0] + ra_append_dict['custom_viewport_y'] = system_viewport[platform][1] + ra_append_dict['custom_viewport_width'] = system_viewport[platform][2] + ra_append_dict['custom_viewport_height'] = system_viewport[platform][3] + else: + logger.log('not using bezel') + # disable decorations + ra_append_dict['input_overlay_enable'] = 'false' + # set standard resolution for custom scaling + ra_append_dict['custom_viewport_x'] = system_viewport['standard'][0] + ra_append_dict['custom_viewport_y'] = system_viewport['standard'][1] + ra_append_dict['custom_viewport_width'] = system_viewport['standard'][2] + ra_append_dict['custom_viewport_height'] = system_viewport['standard'][3] + + # DECK specific options TODO: integrate better in the code + # TODO: not working + #ra_append_dict['video_windowed_fullscreen'] = "true" + + # Write the raappend.cfg + logger.log('Write raappend.cfg') + write_file(ra_append_conf, ra_append_dict) + + logger.log('done ...') + return shader_path + +# Main (if we are run as a script and not as a module) +if __name__ == '__main__': + # Arguments + parser = ArgumentParser(description="Convert ES settings from distribution.conf to RetroArch configuration in raappend.conf.") + parser.add_argument("--core", help="core", required=True) + parser.add_argument("--platform", help="platform", required=True) + parser.add_argument("--rom", help="ROM file name", required=True) + parser.add_argument("--controllers", help="controller config", default="-p1index 0") + parser.add_argument("--autosave", help="autosave", default="0") + parser.add_argument("--snapshot", help="snapshot", default="") + args = parser.parse_args() + shader_path = set_settings(rom_name=args.rom, core=args.core, platform=args.platform, controllers=args.controllers, autosave=args.autosave, snapshot=args.snapshot) + if shader_path: + print(shader_path)