Merge branch 'cooker'

This commit is contained in:
XargonWan 2025-03-02 20:36:21 +09:00
commit e147c5e93b
49 changed files with 3796 additions and 2116 deletions

View file

@ -4,21 +4,19 @@ Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR | TL
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Modifier/Range = 50.0
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
@ -26,30 +24,28 @@ D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
Triggers/R-Analog = `Full Axis 5+`
Rumble/Motor = Strong
[GCPad2]
Device = evdev/0/Microsoft X-Box 360 pad 1
Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR | TL
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Modifier/Range = 50.0
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
@ -57,30 +53,28 @@ D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
Triggers/R-Analog = `Full Axis 5+`
Rumble/Motor = Strong
[GCPad3]
Device = evdev/0/Microsoft X-Box 360 pad 2
Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR | TL
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Modifier/Range = 50.0
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
@ -88,30 +82,28 @@ D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
Triggers/R-Analog = `Full Axis 5+`
Rumble/Motor = Strong
[GCPad4]
Device = evdev/0/Microsoft X-Box 360 pad 3
Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR | TL
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier = THUMBL
Main Stick/Modifier/Range = 50.0
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Modifier/Range = 50.0
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
@ -119,6 +111,6 @@ D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
Triggers/R-Analog = `Full Axis 5+`
Rumble/Motor = Strong

View file

@ -0,0 +1,10 @@
[Achievements]
ApiToken =
DiscordPresenceEnabled = True
Enabled = False
EncoreEnabled = True
HardcoreEnabled = False
ProgressEnabled = False
SpectatorEnabled = False
UnofficialEnabled = False
Username =

View file

@ -41,8 +41,9 @@ UseDiscordPresence = True
HotkeysRequireFocus = True
UseGameCovers = False
RecursiveISOPaths = False
ISOPath0 = RETRODECKHOMEDIR/roms/gc
ISOPaths = 1
ISOPath0 = RETRODECKHOMEDIR/roms/wii
ISOPath1 = RETRODECKHOMEDIR/roms/gc
ISOPaths = 2
[Display]
DisableScreenSaver = True
KeepWindowOnTop = False

View file

@ -1,49 +1,116 @@
[GCPad1]
Device = SDL/0/Microsoft X-Box 360 pad 0
Buttons/A = `Full Axis 5+` | `Button 0`
Buttons/B = `Button 1`
Buttons/X = `Button 2`
Buttons/Y = `Button 3`
Buttons/Z = `Button 6`
Buttons/Start = `Button 7`
Main Stick/Dead Zone = 10.0
Device = evdev/0/Microsoft X-Box 360 pad 0
Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier/Range = 50.0
Main Stick/Modifier = THUMBL
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Button 5` & `Hat 0 N`
C-Stick/Down = `Button 5` & `Hat 0 S`
C-Stick/Left = `Button 5` & `Hat 0 W`
C-Stick/Right = `Button 5` & `Hat 0 E`
C-Stick/Modifier/Range = 50.0
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
D-Pad/Up = !`Button 5` & `Hat 0 N`
D-Pad/Down = !`Button 5` & `Hat 0 S`
D-Pad/Left = !`Button 5` & `Hat 0 W`
D-Pad/Right = !`Button 5` & `Hat 0 E`
Camera Control/Dead Zone = 10.0
Camera Control/Up = `Axis 4-`
Camera Control/Down = `Axis 4+`
Camera Control/Left = `Axis 3-`
Camera Control/Right = `Axis 3+`
Camera Control/Modifier/Range = 50.0
PrimeHack/Mode = 1
Triggers/R-Analog = `Full Axis 5+`
[GCPad2]
Device = XInput2/0/Virtual core pointer
Main Stick/Modifier/Range = 50.0
C-Stick/Modifier/Range = 50.0
Camera Control/Modifier/Range = 50.0
Device = evdev/0/Microsoft X-Box 360 pad 1
Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier = THUMBL
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
Triggers/R-Analog = `Full Axis 5+`
[GCPad3]
Device = XInput2/0/Virtual core pointer
Main Stick/Modifier/Range = 50.0
C-Stick/Modifier/Range = 50.0
Camera Control/Modifier/Range = 50.0
Device = evdev/0/Microsoft X-Box 360 pad 2
Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier = THUMBL
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
Triggers/R-Analog = `Full Axis 5+`
[GCPad4]
Device = XInput2/0/Virtual core pointer
Main Stick/Modifier/Range = 50.0
C-Stick/Modifier/Range = 50.0
Camera Control/Modifier/Range = 50.0
Device = evdev/0/Microsoft X-Box 360 pad 3
Buttons/A = SOUTH
Buttons/B = EAST
Buttons/X = NORTH
Buttons/Y = WEST
Buttons/Z = TR
Buttons/Start = START
Main Stick/Up = `Axis 1-`
Main Stick/Down = `Axis 1+`
Main Stick/Left = `Axis 0-`
Main Stick/Right = `Axis 0+`
Main Stick/Modifier = THUMBL
Main Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
C-Stick/Up = `Axis 4-`
C-Stick/Down = `Axis 4+`
C-Stick/Left = `Axis 3-`
C-Stick/Right = `Axis 3+`
C-Stick/Modifier = THUMBR
C-Stick/Calibration = 100.00 141.42 100.00 141.42 100.00 141.42 100.00 141.42
Triggers/L = `Full Axis 2+`
Triggers/R = `Full Axis 5+`
D-Pad/Up = `Axis 7-`
D-Pad/Down = `Axis 7+`
D-Pad/Left = `Axis 6-`
D-Pad/Right = `Axis 6+`
Rumble/Motor = Strong
Triggers/L-Analog = `Full Axis 2+`
Triggers/R-Analog = `Full Axis 5+`

View file

@ -10,7 +10,7 @@
"export_type" ""
"controller_type" "controller_neptune"
"controller_caps" "23117823"
"major_revision" "0"
"major_revision" "1"
"minor_revision" "0"
"Timestamp" "-942108240"
"actions"

View file

@ -1,2 +1,6 @@
config_file_format^dolphin
change^ask_to_exit^ConfirmStop^True^Interface^$dolphinconf^$config/dolphin/Dolphin.ini
change^cheevos^Enabled^True^Achievements^$dolphinCheevosConf^$config/dolphin-emu/RetroAchievements.ini
change^cheevos^ApiToken^$cheevos_token^Achievements^$dolphinCheevosConf^$config/dolphin-emu/RetroAchievements.ini
change^cheevos^Username^$cheevos_username^Achievements^$dolphinCheevosConf^$config/dolphin-emu/RetroAchievements.ini
change^cheevos_hardcore^HardcoreEnabled^True^Achievements^$dolphinCheevosConf^$config/dolphin-emu/RetroAchievements.ini

View file

@ -1,5 +1,6 @@
config_file_format^ppsspp
change^savestate_auto_load^AutoLoadSaveState^2^General^$ppssppconf^$config/ppssppdl/ppsspp.ini
change^cheevos^AchievementsEnable^True^Achievements^$ppssppconf^$config/ppssppdl/ppsspp.ini
change^cheevos^AchievementsUserName^Achievements^$cheevos_username^$ppssppconf^$config/ppssppdl/ppsspp.ini
change^cheevos_hardcore^AchievementsChallengeMode^True^Achievements^$ppssppconf^$config/ppssppdl/ppsspp.ini
change^savestate_auto_load^AutoLoadSaveState^2^General^$ppssppconf^$config/ppssppsdl/ppsspp.ini
change^cheevos^AchievementsEnable^True^Achievements^$ppssppconf^$config/ppssppsdl/ppsspp.ini
change^cheevos^AchievementsUserName^$cheevos_username^Achievements^$ppssppconf^$config/ppssppsdl/ppsspp.ini
rewrite^cheevos^^$cheevos_token^^$ppssppcheevosconf^$config/ppssppsdl/ppsspp_retroachievements.dat
change^cheevos_hardcore^AchievementsChallengeMode^True^Achievements^$ppssppconf^$config/ppssppsdl/ppsspp.ini

View file

@ -1,5 +1,5 @@
config_file_format^retroarch
change^borders^input_overlay^/var/config/retrodeck/overlays/borders/pegasus/psx.cfg^^/var/config/retroarch/config/SwanStation/psx.cfg^$config/retroarch/retroarch.cfg
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/psx.cfg^^/var/config/retroarch/config/SwanStation/psx.cfg^$config/retroarch/retroarch.cfg
change^borders^input_overlay_aspect_adjust_landscape^0.120000^^/var/config/retroarch/config/SwanStation/psx.cfg^$config/retroarch/retroarch.cfg
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/SwanStation/psx.cfg^$config/retroarch/retroarch.cfg
change^borders^input_overlay_scale_landscape^1.040000^^/var/config/retroarch/config/SwanStation/psx.cfg^$config/retroarch/retroarch.cfg

View file

@ -74,9 +74,9 @@
"description": "Neo Geo BIOS",
"required": "required",
"paths": [
"roms/neogeo",
"roms/fbneo",
"roms/arcade"
"$roms_folder/neogeo",
"$roms_folder/fbneo",
"$roms_folder/arcade"
]
},
"neocdz.zip": {
@ -664,13 +664,13 @@
"system": "switch",
"description": "A file required for Switch emulation",
"required": "required",
"paths": "bios/switch/keys"
"paths": "$bios_folder/switch/keys"
},
"title.keys": {
"system": "switch",
"description": "A file required for Switch emulation",
"required": "required",
"paths": "bios/switch/keys"
"paths": "$bios_folder/switch/keys"
},
"pico8": {
"system": "PICO-8",
@ -709,7 +709,7 @@
"md5": "e10c53c2f8b90bab96ead2d368858623",
"system": "dreamcast",
"description": "Dreamcast BIOS",
"paths": "bios/dc",
"paths": "$bios_folder/dc",
"required": "required"
},
"naomi.zip": {
@ -719,13 +719,13 @@
],
"system": "dreamcast",
"description": "Naomi BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"naomi2.zip": {
"md5": "9b85e0de6ef359e5006c9b79a5a266b0",
"system": "dreamcast",
"description": "Naomi BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"naomi_boot.bin": {
"md5": [
@ -737,7 +737,7 @@
"arcade"
],
"description": "Naomi BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"hod2bios.zip": {
"md5": [
@ -746,7 +746,7 @@
],
"system": "dreamcast",
"description": "Naomi The House of the Dead 2 BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"f355dlx.zip": {
"md5": [
@ -755,7 +755,7 @@
],
"system": "dreamcast",
"description": "Naomi Ferrari F355 Challenge Deluxe BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"f355bios.zip": {
"md5": [
@ -767,7 +767,7 @@
"arcade"
],
"description": "Naomi Ferrari F355 Challenge Twin/Deluxe BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"airlbios.zip": {
"md5": [
@ -779,7 +779,7 @@
"arcade"
],
"description": "Naomi Airline Pilots Deluxe BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"awbios.zip": {
"md5": [
@ -791,7 +791,7 @@
"arcade"
],
"description": "Naomi Atomiswave BIOS",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"bios.sms": {
"md5": "840481177270d5642a14ca71ee72844c",
@ -1168,51 +1168,86 @@
"gc-dvd-20010608.bin": {
"md5": "561532ad496f644897952d2cef5bb431",
"system": "gc",
"paths": [
"$saves_folder/gc/dolphin/EU",
"$saves_folder/gc/dolphin/US",
"$saves_folder/gc/dolphin/JP"
],
"description": "Gamecube DVD BIOS"
},
"gc-dvd-20010831.bin": {
"md5": "b953eb1a8fc9922b3f7051c1cdc451f1",
"paths": [
"$saves_folder/gc/dolphin/EU",
"$saves_folder/gc/dolphin/US",
"$saves_folder/gc/dolphin/JP"
],
"system": "gc",
"description": "Gamecube DVD BIOS"
},
"gc-dvd-20020402.bin": {
"md5": "413154dd0e2c824c9b18b807fd03ec4e",
"system": "gc",
"paths": [
"$saves_folder/gc/dolphin/EU",
"$saves_folder/gc/dolphin/US",
"$saves_folder/gc/dolphin/JP"
],
"description": "Gamecube DVD BIOS"
},
"gc-dvd-20020823.bin": {
"md5": "c03f6bbaf644eb9b3ee261dbe199eb42",
"system": "gc",
"paths": [
"$saves_folder/gc/dolphin/EU",
"$saves_folder/gc/dolphin/US",
"$saves_folder/gc/dolphin/JP"
],
"description": "Gamecube DVD BIOS"
},
"gc-ntsc-10.bin": {
"md5": "fc924a7c879b661abc37cec4f018fdf3",
"system": "gc",
"paths": [
"$saves_folder/gc/dolphin/US",
"$saves_folder/gc/dolphin/JP"
],
"description": "Gamecube NTSC BIOS"
},
"gc-ntsc-11.bin": {
"md5": "019e39822a9ca3029124f74dd4d55ac4",
"system": "gc",
"paths": [
"$saves_folder/gc/dolphin/US",
"$saves_folder/gc/dolphin/JP"
],
"description": "Gamecube NTSC BIOS"
},
"gc-ntsc-12.bin": {
"md5": "b17148254a5799684c7d783206504926",
"system": "gc",
"paths": [
"$saves_folder/gc/dolphin/US",
"$saves_folder/gc/dolphin/JP"
],
"description": "Gamecube NTSC BIOS"
},
"gc-pal-10.bin": {
"md5": "0cdda509e2da83c85bfe423dd87346cc",
"system": "gc",
"paths": "$saves_folder/gc/dolphin/EU",
"description": "Gamecube PAL BIOS"
},
"gc-pal-11.bin": {
"md5": "339848a0b7c2124cf155276c1e79cbd0",
"system": "gc",
"paths": "$saves_folder/gc/dolphin/EU",
"description": "Gamecube PAL BIOS"
},
"gc-pal-12.bin": {
"md5": "db92574caab77a7ec99d4605fd6f2450",
"system": "gc",
"paths": "$saves_folder/gc/dolphin/EU",
"description": "Gamecube PAL BIOS"
},
"64DD_IPL.bin": {
@ -1390,14 +1425,14 @@
"system": "dreamcast",
"description": "Dreamcast BIOS",
"required": "required",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"flash.bin": {
"md5": "0a93f7940c455905bea6e392dfde92a4",
"system": "dreamcast",
"description": "Dreamcast BIOS",
"required": "required",
"paths": "bios/dc"
"paths": "$bios_folder/dc"
},
"bios_J.sms": {
"md5": "24a519c53f67b00640d0048ef7089105",
@ -2329,6 +2364,54 @@
"md5": "88dc7876d584f90e4106f91444ab23b7",
"system": "enterprise",
"description": "Enterprise - 64/128 BIOS"
},
"a2diskiing.zip": {
"system": "apple2",
"description": "Holds the ROM(s) for the Disk II interface",
"paths": [
"$roms_folder/apple2"
],
"required": "required"
},
"apple2e.zip": {
"system": "apple2",
"description": "Contains the main BIOS ROM images for the Apple IIe system",
"paths": [
"$roms_folder/apple2"
],
"required": "required"
},
"d2fdc.zip": {
"system": "apple2",
"description": "Provides the ROM for the floppy disk controller itself",
"paths": [
"$roms_folder/apple2"
],
"required": "required"
},
"votrsc01.zip": {
"system": "apple2",
"description": "Contains the ROM images for the Votrax SC-01 speech synthesizer chip",
"paths": [
"$roms_folder/apple2"
],
"required": "required"
},
"votrsc01a.zip": {
"system": "apple2",
"description": "Contains the ROM images for the Votrax SC-01 speech synthesizer chip",
"paths": [
"$roms_folder/apple2"
],
"required": "required"
},
"apple2gs.zip": {
"system": "apple2",
"description": "Apple IIGS system bios",
"paths": [
"$roms_folder/apple2gs"
],
"required": "required"
}
}
}

View file

@ -156,6 +156,15 @@
"full_end_date": "2025-10-05",
"filename": "placeholder.svg"
},
"halloween": {
"start_date": "1025",
"end_date": "1102",
"start_time": "0000",
"end_time": "2359",
"full_start_date": "2025-10-25",
"full_end_date": "2025-11-02",
"filename": "placeholder.svg"
},
"xmas": {
"start_date": "1201",
"end_date": "1231",
@ -248,6 +257,7 @@
"gbc",
"genesis",
"mastersystem",
"megadrive",
"n64",
"nes",
"ngp",
@ -683,6 +693,9 @@
"psx": {
"name": "Sony PlayStation"
},
"psx_ra": {
"name": "Sony PlayStation"
},
"pv1000": {
"name": "Casio PV-1000"
},
@ -829,8 +842,14 @@
}
},
"emulator": {
"retrodeck": {
"description": "RetroDECK Framework",
"name": "RetroDECK",
"url": "https://retrodeck.net/",
"cli-arg": "--version"
},
"retroarch": {
"description": "RetroArch (Multi-emulator Frontend)",
"description": "Libretro Multi-emulator Frontend",
"name": "RetroArch",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/retroarch/retroarch-guide/",
"launch": "retroarch",
@ -1000,7 +1019,7 @@
}
},
"mame": {
"description": "MAME: Multiple Arcade Machine Emulator",
"description": "Multiple Arcade Machine Emulator",
"name": "MAME",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/mame/mame-guide/",
"system": [
@ -1010,7 +1029,7 @@
"cli-arg": "-help"
},
"citra": {
"description": "Citra Nintendo 3DS Emulator (via Ponzu)",
"description": "A legacy Nintendo 3DS Emulator (via Ponzu)",
"name": "Citra (via Ponzu)",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_about/what-is-retrodeck/",
"system": "n3ds",
@ -1033,7 +1052,7 @@
"cli-arg": ""
},
"melonds": {
"description": "MelonDS Nintendo DS Emulator",
"description": "Nintendo DS Emulator",
"name": "melonDS",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/melonds/melonds-guide/",
"system": "nds",
@ -1042,7 +1061,7 @@
},
"pcsx2": {
"name": "pcsx2",
"description": "PCSX2 Play Station 2 Emulator",
"description": "PlayStation 2 Emulator",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/pcsx2/pcsx2-guide/",
"system": "ps2",
"launch": "pcsx2-qt",
@ -1070,7 +1089,7 @@
},
"ppsspp": {
"name": "PPSSPP",
"description": "PPSSPP: PlayStation Portable Emulator",
"description": "PlayStation Portable Emulator",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/ppsspp/ppsspp-guide/",
"launch": "PPSSPPSDL",
"cli-arg": "--version",
@ -1084,7 +1103,7 @@
},
"vita3k": {
"name": "Vita3k",
"description": "Vita3K PSVita Emulator",
"description": "PSVita Emulator",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/vita3k/vita3k-guide/",
"system": "psvita",
"launch": "Vita3K",
@ -1092,7 +1111,7 @@
},
"rpcs3": {
"name": "RPCS3",
"description": "RPCS3 PlayStation 3 Emulator",
"description": "PlayStation 3 Emulator",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/rpcs3/rpcs3-guide/",
"system": "ps3",
"launch": "rpcs3",
@ -1106,7 +1125,7 @@
},
"ryujinx": {
"name": "Ryujinx",
"description": "Ryujinx Nintendo Switch Emulator",
"description": "A legacy Nintendo Switch Emulator",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/ryujinx/ryujinx-guide/",
"system": "switch",
"launch": "Ryujinx.sh",
@ -1114,7 +1133,7 @@
},
"yuzu": {
"name": "Yuzu (via Ponzu)",
"description": "Yuzu Nintendo Switch Emulator (via Ponzu)",
"description": "A legacy Nintendo Switch Emulator (via Ponzu)",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_about/what-is-retrodeck/",
"launch": "Yuzu",
"cli-arg": "",
@ -1124,7 +1143,7 @@
},
"dolphin": {
"name": "Dolphin",
"description": "Dolphin Wii and GameCube Emulator",
"description": "Wii and GameCube Emulator",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-guide/",
"launch": "dolphin-emu-wrapper",
"cli-arg": "--version",
@ -1144,7 +1163,7 @@
},
"primehack": {
"name": "PrimeHack",
"description": "A fork of Dolphiin to enhance Metroid Prime experience",
"description": "A fork of Dolphin to enhance Metroid Prime experience",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-guide/",
"launch": "primehack-wrapper",
"cli-arg": "--version",
@ -1173,7 +1192,7 @@
]
},
"xemu": {
"description": "xemu Xbox Emulator",
"description": "Xbox Emulator",
"name": "xemu",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/xemu/xemu-guide/",
"system": "xbox",
@ -1181,20 +1200,20 @@
"cli-arg": "--version"
},
"es-de": {
"description": "ES-DE Emulation Frontend",
"description": "Emulation Frontend",
"name": "ES-DE",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_es_de/esde-guide/.",
"launch": "es-de",
"cli-arg": "--version"
},
"steam-rom-manager": {
"description": "Steam ROM Manager (used to sync RetroDECK favorites with Steam)",
"description": "Used to sync RetroDECK favorites and Launcher with Steam",
"name": "Steam ROM Manager",
"launch": "steam-rom-manager",
"cli-arg": "--version"
},
"portmaster": {
"description": "PortMaster",
"description": "Port Manager also available on various linux handheld devices that ease the managing of ports",
"name": "PortMaster",
"url": "https://retrodeck.readthedocs.io/en/latest/wiki_about/what-is-retrodeck/",
"system": "portmaster",

View file

@ -5,7 +5,9 @@ rdhome=/home/deck/retrodeck
roms_folder=/home/deck/retrodeck/roms
saves_folder=/home/deck/retrodeck/saves
states_folder=/home/deck/retrodeck/states
shaders_folder=/home/deck/retrodeck/shaders
bios_folder=/home/deck/retrodeck/bios
backups_folder=/home/deck/retrodeck/backups
media_folder=/home/deck/retrodeck/ES-DE/downloaded_media
themes_folder=/home/deck/retrodeck/ES-DE/themes
logs_folder=/home/deck/retrodeck/logs
@ -13,6 +15,7 @@ screenshots_folder=/home/deck/retrodeck/screenshots
mods_folder=/home/deck/retrodeck/mods
texture_packs_folder=/home/deck/retrodeck/texture_packs
borders_folder=/home/deck/retrodeck/borders
cheats_folder=/home/deck/retrodeck/cheats
sdcard=/run/media/mmcblk0p1
[options]
@ -37,16 +40,21 @@ font=1
cheevos_login=false
logging_level=info
portmaster_reload_esde=true
portmaster_show=true
[cheevos]
duckstation=false
pcsx2=false
retroarch=false
ppsspp=false
dolphin=false
[cheevos_hardcore]
duckstation=false
pcsx2=false
retroarch=false
ppsspp=false
dolphin=false
[rewind]
gb=false

View file

@ -16,7 +16,7 @@ if [[ $(check_desktop_mode) == "true" ]]; then
log d "ruffle --graphics vulkan $static_invoke $@"
ruffle --graphics vulkan $static_invoke "$@"
else
log d "Running Ruffle in Desktop Mode"
log d "Running Ruffle in Gaming Mode"
log d "ruffle --graphics gl --no-gui $static_invoke $@"
ruffle --graphics gl --no-gui $static_invoke "$@"
fi

View file

@ -0,0 +1,6 @@
{
"title": "RetroDECK",
"target": "flatpak",
"launchOptions": "run net.retrodeck.retrodeck",
"startIn": ""
}

View file

@ -1,7 +1,7 @@
[
{
"parserType": "Glob",
"configTitle": "RetroDECK",
"configTitle": "RetroDECK Steam Sync",
"steamDirectory": "${steamdirglobal}",
"romDirectory": "${romsdirglobal}",
"steamCategories": [
@ -128,5 +128,132 @@
},
"parserId": "1725539138664815",
"version": 25
},
{
"parserType": "Manual",
"configTitle": "RetroDECK Launcher",
"steamDirectory": "${steamdirglobal}",
"romDirectory": "${romsdirglobal}",
"steamCategories": [
"RetroDECK"
],
"executableArgs": "",
"executableModifier": "",
"startInDirectory": "",
"titleModifier": "",
"fetchControllerTemplatesButton": null,
"removeControllersButton": null,
"steamInputEnabled": "2",
"imageProviders": [],
"onlineImageQueries": [
"${fuzzyTitle}"
],
"imagePool": "",
"drmProtect": false,
"userAccounts": {
"specifiedAccounts": [
""
]
},
"parserInputs": {
"manualManifests": "/var/config/steam-rom-manager/userData/manifests"
},
"executable": {
"path": "",
"shortcutPassthrough": false,
"appendArgsToExecutable": false
},
"titleFromVariable": {
"limitToGroups": [],
"caseInsensitiveVariables": false,
"skipFileIfVariableWasNotFound": false
},
"fuzzyMatch": {
"replaceDiacritics": true,
"removeCharacters": true,
"removeBrackets": true
},
"controllers": {
"ps4": {
"title": "RetroDECK: DualShock 4 v.1b",
"mappingId": "RetroDECK_controller_ps4_dualshock4_simple.vdf",
"profileType": "template"
},
"ps5": {
"title": "RetroDECK: DualSense v.1b",
"mappingId": "RetroDECK_controller_ps5_dualsense_simple.vdf",
"profileType": "template"
},
"ps5_edge": null,
"xbox360": {
"title": "RetroDECK: Xbox 360 v.1b",
"mappingId": "RetroDECK_controller_xbox360_simple.vdf",
"profileType": "template"
},
"xboxone": {
"title": "RetroDECK: Xbox Wireless v.1b",
"mappingId": "RetroDECK_controller_xboxone_simple.vdf",
"profileType": "template"
},
"xboxelite": null,
"switch_joycon_left": {
"title": "Controller",
"mappingId": "controller_switch_joycon_left_gamepad_joystick.vdf",
"profileType": "template"
},
"switch_joycon_right": {
"title": "Controller",
"mappingId": "controller_switch_joycon_right_gamepad_joystick.vdf",
"profileType": "template"
},
"switch_pro": {
"title": "RetroDECK: Switch Pro v.1b",
"mappingId": "RetroDECK_controller_switch_pro_simple.vdf",
"profileType": "template"
},
"neptune": {
"title": "RetroDECK: Steam Deck - Neptune v.1.1b FULL",
"mappingId": "RetroDECK_controller_steamdeck_neptune_full.vdf",
"profileType": "template"
},
"steamcontroller_gordon": {
"title": "RetroDECK: Steam Controller - Gordon v.1b",
"mappingId": "RetroDECK_controller_steam_controller_gordon_simple.vdf",
"profileType": "template"
}
},
"imageProviderAPIs": {
"sgdb": {
"nsfw": false,
"humor": false,
"styles": [],
"stylesHero": [],
"stylesLogo": [],
"stylesIcon": [],
"imageMotionTypes": [
"static"
],
"sizes": [],
"sizesHero": [],
"sizesTall": null,
"sizesIcon": []
}
},
"defaultImage": {
"tall": "/app/retrodeck/steam_grid/portrait.png",
"long": "/app/retrodeck/steam_grid/banner.png",
"hero": "/app/retrodeck/steam_grid/hero.png",
"logo": "/app/retrodeck/steam_grid/logo.png",
"icon": "/app/retrodeck/steam_grid/icon.png"
},
"localImages": {
"tall": null,
"long": null,
"hero": null,
"logo": null,
"icon": null
},
"parserId": "173908444383456337",
"version": 25
}
]
]

View file

@ -41,10 +41,12 @@ else
fi
# Copying files to the installation
sudo cp -vfr "res/binding_icons" "$app/retrodeck/binding_icons"
sudo cp -vfr "res/binding_icons" "$app/retrodeck/binding_icons"
sudo cp -vfr "res/steam_grid" "$app/retrodeck"
sudo cp -vfr "config/"** "$app/retrodeck/config/"
sudo cp -vfr "tools" "$app"
sudo cp -vfr "retrodeck.sh" "$app/bin/"
sudo cp -vfr "functions/"** "$app/libexec/"
sudo cp -vfr "config/gzdoom/gzdoom.sh" "$app/bin/"
sudo cp -vfr "config/ruffle/ruffle-rdwrapper.sh" "$app/bin/"
sudo cp -vfr "net.retrodeck.retrodeck.metainfo.xml" "$app/share/metainfo/net.retrodeck.retrodeck.metainfo.xml"

View file

@ -1,6 +1,9 @@
#!/bin/bash
save_migration() {
log i "Executing 0.5.0b save migration"
# Finding existing ROMs folder
if [ -d "$default_sd/retrodeck" ]
then
@ -50,9 +53,9 @@ save_migration() {
versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves
if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5
migration_logfile=$rdhome/logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log"
save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip"
state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip"
migration_logfile="$rdhome/logs/savemove_$(date +"%Y_%m_%d_%I_%M_%p").log"
save_backup_file="$rdhome/savebackup_$(date +"%Y_%m_%d_%I_%M_%p").zip"
state_backup_file="$rdhome/statesbackup_$(date +"%Y_%m_%d_%I_%M_%p").zip"
rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \

View file

@ -59,7 +59,7 @@ check_for_version_update() {
if [[ ! "$update_ignore" == "$online_version" ]]; then
if [[ "$update_repo" == "RetroDECK" ]] && [[ $(sed -e 's/[\.a-z]//g' <<< $version) -le $(sed -e 's/[\.a-z]//g' <<< $online_version) ]]; then
choice=$(zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Ignore this version" \
choice=$(rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap --ok-label="OK" --extra-button="Ignore this version" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK - New Update Available" \
--text="There is a new version of RetroDECK available: <span foreground='$blue'><b>$online_version</b></span>.\nYou can easily update from the app store you have installed, examples: KDE Discover or Gnome Software.\n\nIf you would like to ignore this notification, click the \"Ignore this version\" button.")

View file

@ -6,7 +6,8 @@ compress_game() {
local file="$2"
local filename_no_path=$(basename "$file")
local filename_no_extension="${filename_no_path%.*}"
local source_file=$(dirname "$(realpath "$file")")"/"$(basename "$file")
local filename_extension="${filename_no_path##*.}"
local source_file=$(dirname "$(realpath "$file")")"/""$(basename "$file")"
local dest_file=$(dirname "$(realpath "$file")")"/""$filename_no_extension"
if [[ "$1" == "chd" ]]; then
@ -15,7 +16,11 @@ compress_game() {
/app/bin/chdman createdvd --hunksize 2048 -i "$source_file" -o "$dest_file".chd -c zstd
;;
"ps2" )
/app/bin/chdman createdvd -i "$source_file" -o "$dest_file".chd -c zstd
if [[ "$filename_extension" == "cue" ]]; then
/app/bin/chdman createcd -i "$source_file" -o "$dest_file".chd
else
/app/bin/chdman createdvd -i "$source_file" -o "$dest_file".chd -c zstd
fi
;;
* )
/app/bin/chdman createcd -i "$source_file" -o "$dest_file".chd
@ -126,68 +131,94 @@ validate_for_chd() {
}
find_compatible_games() {
# The function takes the following arguments, which alter what files are compressed:
# "everything" - Compresses all games found into their compatible formats
# "all" - Compresses a list of user-chosen files into their compatible formats
# "chd" or "zip" or "rvz" - Compresses a list of user-chosen files into the given format
# Supported parameters:
# "everything" - All games found (regardless of format)
# "all" - Only user-chosen games (later selected via checklist)
# "chd", "zip", "rvz" - Only games matching that compression type
if [[ -f "$godot_compression_compatible_games" ]]; then
rm -f "$godot_compression_compatible_games" # Godot data transfer temp files
fi
touch "$godot_compression_compatible_games"
compressable_games_list=()
all_compressable_games=()
games_to_compress=()
target_selection="$1"
log d "Started find_compatible_games with parameter: $1"
local output_file="${godot_compression_compatible_games}"
[ -f "$output_file" ] && rm -f "$output_file"
touch "$output_file"
local target_selection="$1"
local compression_format
if [[ "$1" == "everything" ]]; then
local compression_format="all"
compression_format="all"
else
local compression_format="$1"
compression_format="$1"
fi
if [[ $compression_format == "all" ]]; then
local compressable_systems_list=$(cat $compression_targets | sed '/^$/d' | sed '/^\[/d')
local compressable_systems_list
if [[ "$compression_format" == "all" ]]; then
compressable_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' "$features")
log d "compressable_systems_list: $compressable_systems_list"
else
local compressable_systems_list=$(sed -n '/\['"$compression_format"'\]/, /\[/{ /\['"$compression_format"'\]/! { /\[/! p } }' $compression_targets | sed '/^$/d')
compressable_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' "$features")
log d "compressable_systems_list: $compressable_systems_list"
fi
while IFS= read -r system # Find and validate all games that are able to be compressed with this compression type
do
log d "Finding compatible games for compression ($1)"
log d "compression_targets: $compression_targets"
while IFS= read -r system; do
log d "Checking system: $system"
local compression_candidates
compression_candidates=$(find "$roms_folder/$system" -type f -not -iname "*.txt")
if [[ ! -z $compression_candidates ]]; then
while IFS= read -r game
do
local compatible_compression_format=$(find_compatible_compression_format "$game")
if [[ $compression_format == "chd" ]]; then
if [[ $compatible_compression_format == "chd" && ! -f "$(echo ${game%.*}.chd)" ]]; then
all_compressable_games=("${all_compressable_games[@]}" "$game")
compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game")
echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games"
fi
elif [[ $compression_format == "zip" ]]; then
if [[ $compatible_compression_format == "zip" && ! -f "$(echo ${game%.*}.zip)" ]]; then
all_compressable_games=("${all_compressable_games[@]}" "$game")
compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game")
echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games"
fi
elif [[ $compression_format == "rvz" ]]; then
if [[ $compatible_compression_format == "rvz" && ! -f "$(echo ${game%.*}.rvz)" ]]; then
all_compressable_games=("${all_compressable_games[@]}" "$game")
compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game")
echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games"
fi
elif [[ $compression_format == "all" ]]; then
if [[ ! $compatible_compression_format == "none" ]]; then
all_compressable_games=("${all_compressable_games[@]}" "$game")
compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game")
echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games"
fi
fi
if [[ -n "$compression_candidates" ]]; then
while IFS= read -r game; do
log d "Checking game: $game"
local compatible_compression_format
compatible_compression_format=$(find_compatible_compression_format "$game")
local file_ext="${game##*.}"
case "$compression_format" in
"chd")
if [[ "$compatible_compression_format" == "chd" ]]; then
if [[ "$file_ext" == "chd" ]]; then
log d "Skipping $game because it is already a CHD file."
elif [[ ! -f "${game%.*}.chd" ]]; then
log d "Game $game is compatible with CHD compression"
echo "${game}^chd" >> "$output_file"
fi
fi
;;
"zip")
if [[ "$compatible_compression_format" == "zip" ]]; then
if [[ "$file_ext" == "zip" ]]; then
log d "Skipping $game because it is already a ZIP file."
elif [[ ! -f "${game%.*}.zip" ]]; then
log d "Game $game is compatible with ZIP compression"
echo "${game}^zip" >> "$output_file"
fi
fi
;;
"rvz")
if [[ "$compatible_compression_format" == "rvz" ]]; then
if [[ "$file_ext" == "rvz" ]]; then
log d "Skipping $game because it is already an RVZ file."
elif [[ ! -f "${game%.*}.rvz" ]]; then
log d "Game $game is compatible with RVZ compression"
echo "${game}^rvz" >> "$output_file"
fi
fi
;;
"all")
if [[ "$compatible_compression_format" != "none" ]]; then
if [[ "$file_ext" == "$compatible_compression_format" ]]; then
log d "Skipping $game because it is already in $compatible_compression_format format."
else
log d "Game $game is compatible with $compatible_compression_format compression"
echo "${game}^${compatible_compression_format}" >> "$output_file"
fi
fi
;;
esac
done < <(printf '%s\n' "$compression_candidates")
fi
done < <(printf '%s\n' "$compressable_systems_list")
log d "Compatible games have been written to $output_file"
cat "$output_file"
}
cli_compress_single_game() {
@ -226,9 +257,9 @@ cli_compress_all_games() {
local compressable_game=""
local all_compressable_games=()
if [[ $compression_format == "all" ]]; then
local compressable_systems_list=$(cat $compression_targets | sed '/^$/d' | sed '/^\[/d')
local compressable_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' $features)
else
local compressable_systems_list=$(sed -n '/\['"$compression_format"'\]/, /\[/{ /\['"$compression_format"'\]/! { /\[/! p } }' $compression_targets | sed '/^$/d')
local compressable_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' $features)
fi
read -p "Do you want to have the original files removed after compression is complete? Please answer y/n and press Enter: " post_compression_cleanup

View file

@ -50,3 +50,16 @@ find_empty_rom_folders() {
done
}
configurator_check_multifile_game_structure() {
local folder_games=($(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3"))
if [[ ${#folder_games[@]} -gt 1 ]]; then
echo "$(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")" > $logs_folder/multi_file_games_"$(date +"%Y_%m_%d_%I_%M_%p").log"
rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - Verify Multi-file Structure" \
--text="The following games were found to have the incorrect folder structure:\n\n$(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")\n\nIncorrect folder structure can result in failure to launch games or saves being in the incorrect location.\n\nPlease see the RetroDECK wiki for more details!\n\nYou can find this list of games in ~/retrodeck/logs"
else
configurator_generic_dialog "RetroDECK Configurator - Verify Multi-file Structure" "No incorrect multi-file game folder structures found."
fi
configurator_welcome_dialog
}

View file

@ -11,10 +11,28 @@ rd_logs_folder="/var/config/retrodeck/logs" # Static location to write all Retro
source /app/libexec/logger.sh
rotate_logs
# OS detection
width=$(grep -oP '\d+(?=x)' /sys/class/graphics/fb0/modes)
height=$(grep -oP '(?<=x)\d+' /sys/class/graphics/fb0/modes)
if [[ $width -ne 1280 ]] || [[ $height -ne 800 ]]; then
native_resolution=false
else
native_resolution=true
fi
distro_name=$(flatpak-spawn --host grep '^ID=' /etc/os-release | cut -d'=' -f2)
distro_version=$(flatpak-spawn --host grep '^VERSION_ID=' /etc/os-release | cut -d'=' -f2)
gpu_info=$(flatpak-spawn --host lspci | grep -i 'vga\|3d\|2d')
log d "Debug mode enabled"
log i "Initializing RetroDECK"
log i "Running on $XDG_SESSION_DESKTOP, $XDG_SESSION_TYPE"
log i "Running on $XDG_SESSION_DESKTOP, $XDG_SESSION_TYPE, $distro_name $distro_version"
if [[ -n $container ]]; then
log i "$container environment"
log i "Running inside $container environment"
fi
log i "GPU: $gpu_info"
log i "Resolution: $width x $height"
if [[ $native_resolution == true ]]; then
log i "Steam Deck native resolution detected"
fi
source /app/libexec/050_save_migration.sh
@ -65,7 +83,6 @@ features="$config/retrodeck/reference_lists/features.json"
es_systems="/app/share/es-de/resources/systems/linux/es_systems.xml" # ES-DE supported system list
es_find_rules="/app/share/es-de/resources/systems/linux/es_find_rules.xml" # ES-DE emulator find rules
# Godot data transfer temp files
godot_bios_files_checked="/var/config/retrodeck/godot/godot_bios_files_checked.tmp"
@ -107,6 +124,8 @@ dolphingcpadconf="/var/config/dolphin-emu/GCPadNew.ini"
dolphingfxconf="/var/config/dolphin-emu/GFX.ini"
dolphinhkconf="/var/config/dolphin-emu/Hotkeys.ini"
dolphinqtconf="/var/config/dolphin-emu/Qt.ini"
dolphinDynamicInputTexturesPath="/var/data/dolphin-emu/Load/DynamicInputTextures"
dolphinCheevosConf="/var/config/dolphin-emu/RetroAchievements.ini"
# PCSX2 config files
@ -115,10 +134,11 @@ pcsx2gsconf="/var/config/PCSX2/inis/GS.ini" # This file should be deprecated sin
pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" # This file should be deprecated since moving to PCSX2-QT
pcsx2vmconf="/var/config/PCSX2/inis/PCSX2_vm.ini" # This file should be deprecated since moving to PCSX2-QT
# PPSSPPDL config files
# PPSSPP-SDL config files
ppssppconf="/var/config/ppsspp/PSP/SYSTEM/ppsspp.ini"
ppssppcontrolsconf="/var/config/ppsspp/PSP/SYSTEM/controls.ini"
ppssppcheevosconf="/var/config/ppsspp/PSP/SYSTEM/ppsspp_retroachievements.dat"
# Primehack config files
@ -127,6 +147,7 @@ primehackgcpadconf="/var/config/primehack/GCPadNew.ini"
primehackgfxconf="/var/config/primehack/GFX.ini"
primehackhkconf="/var/config/primehack/Hotkeys.ini"
primehackqtconf="/var/config/primehack/Qt.ini"
primehackDynamicInputTexturesPath="/var/data/primehack/Load/DynamicInputTextures"
# RPCS3 config files
@ -203,8 +224,7 @@ if [[ ! -f "$rd_conf" ]]; then
# If the config file is existing i just read the variables
else
log i "Found RetroDECK config file in $rd_conf"
log i "Loading it"
log i "Loading RetroDECK config file in $rd_conf"
if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build
set_setting_value $rd_conf "update_repo" "$cooker_repository_name" retrodeck "options"
@ -235,5 +255,7 @@ fi
logs_folder="$rdhome/logs" # The path of the logs folder, here we collect all the logs
steamsync_folder="$rdhome/.sync" # Folder containing all the steam sync launchers for SRM
steamsync_folder_tmp="$rdhome/.sync-tmp" # Temp folder containing all the steam sync launchers for SRM
cheats_folder="$rdhome/cheats" # Folder containing all the cheats for the emulators
backups_folder="$rdhome/backups" # Folder containing all the RetroDECK backups
export GLOBAL_SOURCED=true

View file

@ -22,30 +22,45 @@
# The function auto-detects if the shell is sh and avoids colorizing the output in that case.
log() {
# Exit early if logging_level is "none"
# Define and export log color environment variables for ES-DE
export logcolor_debug="\033[32m[DEBUG]"
export logcolor_error="\033[31m[ERROR]"
export logcolor_warn="\033[33m[WARN]"
export logcolor_info="\033[37m[INFO]"
export logcolor_default="\033[37m[LOG]"
# Define and export log prefix environment variables for ES-DE
export logprefix_debug="[DEBUG]"
export logprefix_error="[ERROR]"
export logprefix_warn="[WARN]"
export logprefix_info="[INFO]"
export logprefix_default="[LOG]"
# Exit immediately if logging_level is "none"
if [[ $logging_level == "none" ]]; then
return
fi
local level="$1" # Logging level of the current message
local message="$2" # Message to log
local logfile="${3:-$rd_logs_folder/retrodeck.log}" # Log file, default to retrodeck.log
local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])" # Timestamp for the log entry
local level="$1" # Current message level
local message="$2" # Message to log
local logfile="${3:-$rd_logs_folder/retrodeck.log}" # Default log file
local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])" # Timestamp
local colorize_terminal=true
# Determine the calling function or use [FWORK]
# Determine the calling function, or use [FWORK]
local caller="${FUNCNAME[1]:-FWORK}"
caller="${caller^^}" # Convert to uppercase
caller="${caller^^}" # Convert to uppercase
# Check if the shell is sh (not bash or zsh) to avoid colorization
if [ "${SHELL##*/}" = "sh" ]; then
colorize_terminal=false
fi
# # Check if the shell is sh to avoid colorization
# if [ "${SHELL##*/}" = "sh" ]; then
# colorize_terminal=false
# fi
# Function to check if the current message level should be logged
# Internal function to check if the message should be logged
should_log() {
case "$logging_level" in
debug) return 0 ;; # Always log everything
debug) return 0 ;; # Log everything
info) [[ "$level" == "i" || "$level" == "e" ]] && return 0 ;;
warn) [[ "$level" != "d" ]] && return 0 ;;
error) [[ "$level" == "e" ]] && return 0 ;;
@ -54,31 +69,31 @@ log() {
}
if should_log; then
# Define message colors based on level
# Define colors based on the message level
case "$level" in
d)
color="\e[32m[DEBUG]"
prefix="[DEBUG]"
color="${logcolor_debug:-\033[32m[DEBUG]}"
prefix="${logprefix_debug:-[DEBUG]}"
;;
e)
color="\e[31m[ERROR]"
prefix="[ERROR]"
color="${logcolor_error:-\033[31m[ERROR]}"
prefix="${logprefix_error:-[ERROR]}"
;;
w)
color="\e[33m[WARN]"
prefix="[WARN]"
color="${logcolor_warn:-\033[33m[WARN]}"
prefix="${logprefix_warn:-[WARN]}"
;;
i)
color="\e[34m[INFO]"
prefix="[INFO]"
color="${logcolor_info:-\033[37m[INFO]}"
prefix="${logprefix_info:-[INFO]}"
;;
*)
color="\e[37m[LOG]"
prefix="[LOG]"
color="${logcolor_default:-\033[37m[LOG]}"
prefix="${logprefix_default:-[LOG]}"
;;
esac
# Construct the log message
# Build the message to display
if [ "$colorize_terminal" = true ]; then
colored_message="$color [$caller] $message\e[0m"
else
@ -86,17 +101,20 @@ log() {
fi
log_message="$timestamp $prefix [$caller] $message"
# Display the message in the terminal
echo -e "$colored_message" >&2
# If silent mode is not active, print the message to the terminal
if [[ "$LOG_SILENT" != "true" ]]; then
echo -e "$colored_message" >&2
fi
# Write the log message to the log file
# Ensure the log file exists
if [ ! -f "$logfile" ]; then
#echo "$timestamp [WARN] Log file not found in \"$logfile\", creating it" >&2 # Disabled it as it's always appearing because of log rotation
if [[ ! -d "$(dirname "$logfile")" ]]; then
mkdir -p "$(dirname "$logfile")"
fi
touch "$logfile"
fi
# Write the log to the file
echo "$log_message" >> "$logfile"
fi
}
@ -130,4 +148,4 @@ rotate_logs() {
# Compress without directory structure and suppress tar output
tar -czf "${logfile}.1.tar.gz" -C "$(dirname "$logfile")" "$(basename "$logfile")" --remove-files &>/dev/null
fi
}
}

View file

@ -299,7 +299,17 @@ dir_prep() {
rd_zenity() {
# This function replaces the standard 'zenity' command and filters out annoying GTK errors on Steam Deck
export CONFIGURATOR_GUI="zenity"
# env GDK_SCALE=1.5 \
# GDK_DPI_SCALE=1.5 \
zenity 2> >(grep -v 'Gtk' >&2) "$@"
local status=${PIPESTATUS[0]} # Capture the exit code of 'zenity'
unset CONFIGURATOR_GUI
return $status
}
update_rpcs3_firmware() {
@ -519,8 +529,9 @@ finit() {
rd_zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Finishing Initialization" \
--text="RetroDECK is finishing the initial setup process, please wait."
--text="RetroDECK is finishing the initial setup process, please wait.\n\n"
add_retrodeck_to_steam
create_lock
# Inform the user where to put the ROMs and BIOS files
@ -641,7 +652,7 @@ install_release() {
log d "Constructed flatpak URL: $flatpak_url"
# Confirm installation with the user
zenity --question --icon-name=net.retrodeck.retrodeck --no-wrap \
rd_zenity --question --icon-name=net.retrodeck.retrodeck --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Updater" \
--text="$1 will be now installed.\nThe update process may take several minutes.\n\nAfter the update is complete, RetroDECK will close. When you run it again, you will be using the latest version.\n\nDo you want to continue?"
@ -672,7 +683,7 @@ install_release() {
# Cleanup old bundles to save space
rm -rf "$rdhome/RetroDECK_Updates"
) |
zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
rd_zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Updater" \
--text="RetroDECK is updating to the selected version, please wait."
@ -781,7 +792,7 @@ ponzu_remove() {
else
log e "Ponzu: \"$1\" is not a vaild choice for removal, quitting"
fi
configurator_retrodeck_tools_dialog
configurator_tools_dialog
}
release_selector() {
@ -790,7 +801,7 @@ release_selector() {
while true; do
echo "# Fetching all available releases from GitHub repositories... Please wait. This may take some time." ; sleep 1
done
) | zenity --progress --title="Fetching Releases" --text="Fetching releases..." --pulsate --no-cancel --auto-close --width=500 --height=150 &
) | rd_zenity --progress --title="Fetching Releases" --text="Fetching releases..." --pulsate --no-cancel --auto-close --width=500 --height=150 &
progress_pid=$! # save process PID to kill it later
@ -930,10 +941,10 @@ quit_retrodeck() {
source /app/libexec/steam_sync.sh
add_to_steam "$(ls "$rdhome/ES-DE/gamelists/")"
) |
zenity --progress \
rd_zenity --progress \
--title="Syncing with Steam" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="<span foreground='$purple'><b>\t\t\t\t\tSyncing favorite games with Steam.</b></span>\n\n<b>NOTE: </b>This operation may take some time depending on the size of your library.\nFeel free to leave this in the background and switch to another application.\n\n" \
--text="<span foreground='$purple'><b>\t\t\t\tSyncing favorite games with Steam</b></span>\n\n<b>NOTE: </b>This operation may take some time depending on the size of your library.\nFeel free to leave this in the background and switch to another application.\n\n" \
--percentage=25 \
--pulsate \
--width=500 \
@ -953,6 +964,16 @@ start_retrodeck() {
get_steam_user # get steam user info
splash_screen # Check if today has a surprise splashscreen and load it if so
ponzu
log d "Checking if PortMaster should be shown"
if [[ $(get_setting_value "$rd_conf" "portmaster_show" "retrodeck" "options") == "false" ]]; then
log d "Assuring that PortMaster is hidden on ES-DE"
portmaster_show "false"
else
log d "Assuring that PortMaster is shown on ES-DE"
portmaster_show "true"
fi
log i "Starting RetroDECK v$version"
es-de
}
@ -973,3 +994,111 @@ convert_to_markdown() {
-e 's|</description>||g' \
-e '/<[^>]*>/d' > "$output_file" # Remove any other XML tags and output to .md file
}
# This function updates RetroArch by synchronizing shaders, cores, and border overlays.
# It should be called whenever RetroArch is reset or updated.
retroarch_updater(){
log i "Running RetroArch updater"
# Synchronize cores from the application share directory to the RetroArch cores directory
rsync -rlD --mkpath "/app/share/libretro/cores/" "/var/config/retroarch/cores/" && log d "RetroArch cores updated correctly"
# Synchronize border overlays from the RetroDeck configuration directory to the RetroArch overlays directory
rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "/var/config/retroarch/overlays/borders/" && log d "RetroArch overlays and borders updated correctly"
}
portmaster_show(){
log d "Setting PortMaster visibility in ES-DE"
if [ "$1" = "true" ]; then
log d "\"$roms_folder/portmaster/PortMaster.sh\" is not found, installing it"
install -Dm755 "/var/data/PortMaster/PortMaster.sh" "$roms_folder/portmaster/PortMaster.sh" && log d "PortMaster is correctly showing in ES-DE"
set_setting_value $rd_conf "portmaster_show" "true" retrodeck "options"
elif [ "$1" = "false" ]; then
rm -rf "$roms_folder/portmaster/PortMaster.sh" && log d "PortMaster is correctly hidden in ES-DE"
set_setting_value $rd_conf "portmaster_show" "false" retrodeck "options"
else
log e "\"$1\" is not a valid choice, quitting"
fi
}
open_component(){
if [[ -z "$1" ]]; then
cmd=$(jq -r '.emulator[] | select(.ponzu != true) | .name' "$features")
if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then
cmd+="\n$(jq -r '.emulator.citra | .name' "$features")"
fi
if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then
cmd+="\n$(jq -r '.emulator.yuzu | .name' "$features")"
fi
echo -e "This command expects one of the following components as arguments:\n$(echo -e "$cmd")"
return
fi
if [[ "$1" == "--list" ]]; then
cmd=$(jq -r '.emulator[] | select(.ponzu != true) | .name' "$features")
if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then
cmd+="\n$(jq -r '.emulator.citra | .name' "$features")"
fi
if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then
cmd+="\n$(jq -r '.emulator.yuzu | .name' "$features")"
fi
echo -e "$cmd"
return
fi
if [[ "$1" == "--getdesc" ]]; then
cmd=$(jq -r '.emulator[] | select(.ponzu != true) | "\(.description)"' "$features")
if [[ $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" ]]; then
cmd+="\n$(jq -r '.emulator.citra | "\(.description)"' "$features")"
fi
if [[ $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" ]]; then
cmd+="\n$(jq -r '.emulator.yuzu | "\(.description)"' "$features")"
fi
echo -e "$cmd"
return
fi
launch_exists=$(jq -r --arg name "$1" '.emulator[] | select(.name == $name) | has("launch")' "$features")
if [[ "$launch_exists" != "true" ]]; then
echo "Error: The component '$1' cannot be opened."
return 1
fi
cmd=$(jq -r --arg name "$1" '.emulator[] | select(.name == $name and .ponzu != true) | .launch' "$features")
if [[ -z "$cmd" && $(get_setting_value "$rd_conf" "akai_ponzu" "retrodeck" "options") == "true" && "$1" == "citra" ]]; then
cmd=$(jq -r '.emulator.citra | .launch' "$features")
fi
if [[ -z "$cmd" && $(get_setting_value "$rd_conf" "kiroi_ponzu" "retrodeck" "options") == "true" && "$1" == "yuzu" ]]; then
cmd=$(jq -r '.emulator.yuzu | .launch' "$features")
fi
if [[ -n "$cmd" ]]; then
eval "$cmd" "${@:2}"
else
echo "Invalid component name: $1"
echo "Please ensure the name is correctly spelled (case sensitive) and quoted if it contains spaces."
fi
}
add_retrodeck_to_steam(){
log i "Adding RetroDECK to Steam"
rd_zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" \
--text="Do you want to add RetroDECK to Steam?"
if [ $? == 0 ]; then
(
steam-rom-manager enable --names "RetroDECK Launcher"
steam-rom-manager add
) |
rd_zenity --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "Adding RetroDECK to Steam" \
--text="Please wait while RetroDECK is being added to Steam...\n\n"
rd_zenity --info --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --text="RetroDECK has been added to Steam.\n\nPlease close and reopen Steam to see the changes."
fi
log i "RetroDECK has been added to Steam"
}

View file

@ -5,7 +5,10 @@ post_update() {
# post update script
log i "Executing post-update script"
update_rd_conf
if [[ $(check_version_is_older_than "0.5.0b") == "true" ]]; then # If updating from prior to save sorting change at 0.5.0b
log d "Version is older than 0.5.0b, executing save migration"
save_migration
fi
@ -30,7 +33,7 @@ post_update() {
fi
if [[ $(check_version_is_older_than "0.6.3b") == "true" ]]; then
# In version 0.6.3b, the following changes were made that required config file updates/reset:
# - Put Dolphin and Primehack save states in different folders inside $rd_home/states
# - Put Dolphin and Primehack save states in different folders inside $rdhome/states
# - Fix symlink to hard-coded PICO-8 config folder (dir_prep doesn't like ~)
# - Overwrite Citra and Yuzu configs, as controller mapping was broken due to emulator updates.
@ -425,7 +428,7 @@ post_update() {
# Create a Zenity window with checkboxes for each reset option and two buttons
while true; do
choices=$(zenity --list --checklist --title="RetroDECK Reset Options" \
choices=$(rd_zenity --list --checklist --title="RetroDECK Reset Options" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="The following components have been updated and need to be reset or fixed to ensure compatibility with the new version: select the components you want to reset.\n\nNot resetting them may cause serious issues with your installation.\nYou can also reset them manually later via Configurator -> Troubleshooting -> Reset Component.\n\nNote: Your games, saves, game collections and scraped data will not be affected." \
--column="Select" --column="Component" --column="Description" --width="1100" --height="700" \
@ -453,7 +456,7 @@ post_update() {
fi
if [[ $? -eq 0 && -n "$choices" ]]; then
if ! zenity --question --title="Confirmation" --text="Are you sure you want to proceed with only the selected options?\n\nThis might cause issues in RetroDECK"; then
if ! rd_zenity --question --title="Confirmation" --text="Are you sure you want to proceed with only the selected options?\n\nThis might cause issues in RetroDECK"; then
log i "User is not sure, showing the checklist window again."
continue
else
@ -463,7 +466,7 @@ post_update() {
fi
if [[ $? == 0 ]]; then
if ! zenity --question --title="Confirmation" --text="Are you sure you want to skip the reset process?\n\nThis might cause issues in RetroDECK"; then
if ! rd_zenity --question --title="Confirmation" --text="Are you sure you want to skip the reset process?\n\nThis might cause issues in RetroDECK"; then
log i "User is not sure, showing the checklist window again."
continue
else
@ -520,13 +523,12 @@ post_update() {
set_setting_value "$primehackgfxconf" "AspectRatio" "0" "dolphin" "Settings"
fi
# --- ALWAYS EXECUTED ---
# --- ALWAYS EXECUTED IN 0.9.0b ---
# New components preparation
log i "New components were added in this version, initializing them"
prepare_component "reset" "portmaster"
prepare_component "reset" "ruffle"
update_rd_conf
prepare_component "reset" "steam-rom-manager"
# RetroArch
@ -555,6 +557,121 @@ post_update() {
fi # end of 0.9.0b
if [[ $(check_version_is_older_than "0.9.1b") == "true" ]]; then
log i "Running the 0.9.1b post update process"
# Create a Zenity window with checkboxes for each reset option and two buttons
while true; do
choices=$(rd_zenity --list --checklist --title="RetroDECK Reset Options" \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--text="The following components have been updated and need to be reset or fixed to ensure compatibility with the new version: select the components you want to reset.\n\nNot resetting them may cause serious issues with your installation.\nYou can also reset them manually later via Configurator -> Troubleshooting -> Reset Component.\n\nNote: Your games, saves, game collections and scraped data will not be affected." \
--column="Select" --column="Component" --column="Description" --width="1100" --height="700" \
TRUE "Dolphin - GameCube Controller" "The GameCube controller configuration needs to be reset to fix a trigger issue" \
TRUE "RetroArch" "Needs to be reset to fix the borders issue on some sytems such as psx" \
TRUE "Steam ROM Manager" "Needs to add the \"Add RetroDECk to Steam\" functionality" \
--separator=":" \
--extra-button="Execute All" \
--ok-label="Execute Selected Only" \
--cancel-label="Execute None")
log d "User selected: $choices"
log d "User pressed: $?"
# Check if "Execute All" button was pressed
if [[ "$choices" == "Execute All" ]]; then
execute_all=true
break
else
execute_all=false
# Split the choices into an array
IFS=":" read -r -a selected_choices <<< "$choices"
fi
if [[ $? -eq 0 && -n "$choices" ]]; then
if ! rd_zenity --question --title="Confirmation" --text="Are you sure you want to proceed with only the selected options?\n\nThis might cause issues in RetroDECK"; then
log i "User is not sure, showing the checklist window again."
continue
else
log i "User confirmed to proceed with only the selected options."
break
fi
fi
if [[ $? == 0 ]]; then
if ! rd_zenity --question --title="Confirmation" --text="Are you sure you want to skip the reset process?\n\nThis might cause issues in RetroDECK"; then
log i "User is not sure, showing the checklist window again."
continue
else
log i "User confirmed to proceed without any reset."
break
fi
fi
break
done
# Execute the selected resets
# RetroArch reset
if [[ "$execute_all" == "true" || " ${selected_choices[@]} " =~ " RetroArch " ]]; then
log i "User agreed to RetroArch reset"
# Twice to toggle them once and then toggle them back to the original value
make_preset_changes "borders" "all"
make_preset_changes "borders" "all"
fi
# Dolphin - GameCube Controller
if [[ "$execute_all" == "true" || " ${selected_choices[@]} " =~ " Dolphin - GameCube Controller " ]]; then
log i "User agreed to reset Dolphin - GameCube Controller"
cp -f "$config/dolphin/GCPadNew.ini" "$dolphingcpadconf" && log i "Done"
fi
# Steam ROM Manager - Add to Steam fix
if [[ "$execute_all" == "true" || " ${selected_choices[@]} " =~ " Steam ROM Manager " ]]; then
log i "User agreed to reset Steam ROM Manager - Add to Steam fix"
prepare_component reset steam-rom-manager
fi
# --- ALWAYS EXECUTED IN 0.9.1b ---
log i "Preparing the shaders folder for MAME..."
shaders_folder=$rdhome/shaders && log i "Shaders folder set to \"$shaders_folder\""
conf_write && log i "Done"
create_dir "$shaders_folder/mame/bgfx"
set_setting_value "$mameconf" "bgfx_path" "$shaders_folder/mame/bgfx/" "mame"
cp -fvr "/app/share/mame/bgfx/"* "$shaders_folder/mame/bgfx"
log i "Preparing the cheats for RetroArch..."
create_dir "$cheats_folder/retroarch"
set_setting_value "$raconf" "cheat_database_path" "$cheats_folder/retroarch" "retroarch"
tar --strip-components=1 -xzf /app/retrodeck/cheats/retroarch.tar.gz -C "$cheats_folder/retroarch" --overwrite && log i "Cheats for RetroArch installed"
log i "Preparing the cheats for PPSSPP..."
create_dir -d "$cheats_folder/PPSSPP"
dir_prep "$cheats_folder/PPSSPP" "/var/config/ppsspp/PSP/Cheats"
tar -xzf /app/retrodeck/cheats/ppsspp.tar.gz -C "$cheats_folder/PPSSPP" --overwrite && log i "Cheats for PPSSPP installed"
log i "Preparing the cheats for PCSX2..."
create_dir "$cheats_folder/pcsx2"
set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders"
tar --strip-components=1 -xzf /app/retrodeck/cheats/pcsx2.tar.gz -C "$cheats_folder/pcsx2" --overwrite && log i "Cheats for PCSX2 installed"
log i "Preparing the cheats for MAME..."
create_dir "$cheats_folder/mame"
set_setting_value "$mameconf" "cheatpath" "$cheats_folder/mame" "mame"
unzip -j -o "$config/mame/cheat0264.zip" 'cheat.7z' -d "$cheats_folder/mame" && log i "Cheats for MAME installed"
rm -rf /var/data/mame/cheat
log i "Preparing the RetroAchievements for Dolphin..."
cp -vn "$config/dolphin/"* /var/config/dolphin-emu/
log i "Fixing PrimeHack roms paths..."
set_setting_value "$rd_conf" "ppsspp" "$(get_setting_value "$rd_defaults" "ppsspp" "retrodeck" "cheevos")" "retrodeck" "cheevos"
set_setting_value "$rd_conf" "ppsspp" "$(get_setting_value "$rd_defaults" "ppsspp" "retrodeck" "cheevos_hardcore")" "retrodeck" "cheevos_hardcore"
fi # end of 0.9.1b
# The following commands are run every time.
if [[ -d "/var/data/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled
@ -570,6 +687,7 @@ post_update() {
install_retrodeck_controller_profile
fi
retroarch_updater
update_splashscreens
deploy_helper_files
build_retrodeck_current_presets
@ -589,4 +707,6 @@ post_update() {
else
changelog_dialog "$version"
fi
log i "Upgrade process completed successfully."
}

File diff suppressed because it is too large Load diff

View file

@ -1,22 +1,29 @@
#!/bin/bash
change_preset_dialog() {
# This function will build a list of all systems compatible with a given preset, their current enable/disabled state and allow the user to change one or more
# This function will build a list of all systems compatible with a given preset,
# show their current enable/disabled state and allow the user to change one or more.
# USAGE: change_preset_dialog "$preset"
preset="$1"
pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo $pretty_preset_name | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification
current_preset_settings=()
local section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d')
log d "Starting change_preset_dialog for preset: $preset"
while IFS= read -r config_line
do
preset="$1"
pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo "$pretty_preset_name" | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1')
current_preset_settings=()
local section_results
section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' "$rd_conf" | sed '/^$/d')
while IFS= read -r config_line; do
system_name=$(get_setting_name "$config_line" "retrodeck")
system_value=$(get_setting_value "$rd_conf" "$system_name" "retrodeck" "$preset")
current_preset_settings=("${current_preset_settings[@]}" "$system_value" "$(make_name_pretty $system_name)" "$system_name")
# Append three values: the current enabled state, a pretty name, and the internal system name.
current_preset_settings=("${current_preset_settings[@]}" "$system_value" "$(make_name_pretty "$system_name")" "$system_name")
done < <(printf '%s\n' "$section_results")
log d "Current preset settings built for preset: $preset"
# Show the checklist with extra buttons for "Enable All" and "Disable All"
choice=$(rd_zenity \
--list --width=1200 --height=720 \
--checklist \
@ -26,28 +33,79 @@ change_preset_dialog() {
--column "Enabled" \
--column "Emulator" \
--column "internal_system_name" \
"${current_preset_settings[@]}")
"${current_preset_settings[@]}" \
--extra-button "Enable All" \
--extra-button "Disable All")
local rc=$?
local extra_action=""
if [[ ! -z $choice || "$rc" == 0 ]]; then
log d "User made a choice: $choice with return code: $rc"
# Handle extra button responses.
if [ "$choice" == "Enable All" ]; then
log d "Enable All selected"
# Build a comma-separated list of all internal system names.
all_systems=""
for ((i=2; i<${#current_preset_settings[@]}; i+=3)); do
if [ -z "$all_systems" ]; then
all_systems="${current_preset_settings[$i]}"
else
all_systems="$all_systems,${current_preset_settings[$i]}"
fi
done
choice="$all_systems"
extra_action="extra"
force_state="true"
elif [ "$choice" == "Disable All" ]; then
log d "Disable All selected"
# Build a comma-separated list of all internal system names.
all_systems=""
for ((i=2; i<${#current_preset_settings[@]}; i+=3)); do
if [ -z "$all_systems" ]; then
all_systems="${current_preset_settings[$i]}"
else
all_systems="$all_systems,${current_preset_settings[$i]}"
fi
done
choice="$all_systems"
extra_action="extra"
force_state="false"
fi
# Call make_preset_changes if the user made a selection,
# or if an extra button was clicked (even if the resulting choice is empty).
if [[ "$rc" == 0 || "$extra_action" == "extra" || -n "$choice" ]]; then
log d "Calling make_preset_changes with choice: $choice"
(
make_preset_changes "$1" "$choice"
) |
rd_zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator Utility - Presets Configuration" \
--text="Setting up your presets, please wait..."
make_preset_changes "$preset" "$choice" "$force_state"
) | rd_zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator Utility - Presets Configuration" \
--text="Setting up your presets, please wait..."
else
log i "No preset choices made"
fi
}
build_preset_list_options() {
# This function will build a list of all the systems available for a given preset
# The list will be generated into a Godot temp file and the variable $current_preset_settings
# The other arrays built (all_systems, changed_systems etc.) are also used in the make_preset_changes() function, so this needs to be called in the same memory space as that function at least once
# FUNCTION: build_preset_list_options
# DESCRIPTION: This function builds a list of all the systems available for a given preset.
# It generates the list into a Godot temp file and updates the variable $current_preset_settings.
# The function also builds several arrays (all_systems, changed_systems, etc.) that are used in the make_preset_changes() function.
# This function needs to be called in the same memory space as make_preset_changes() at least once.
# USAGE: build_preset_list_options "$preset"
# INPUT:
# - $1: The name of the preset.
# OUTPUT:
# - $godot_current_preset_settings: A Godot temp file containing the system values, pretty system names, and system names.
# - $current_preset_settings: An array containing the system values, pretty system names, and system names.
# - $current_enabled_systems: An array containing the names of systems that are enabled in the preset.
# - $current_disabled_systems: An array containing the names of systems that are disabled in the preset.
# - $changed_systems: An array that will be used to track systems that have changed.
# - $changed_presets: An array that will be used to track presets that have changed.
# - $all_systems: An array containing the names of all systems in the preset.
if [[ -f "$godot_current_preset_settings" ]]; then
rm -f "$godot_current_preset_settings" # Godot data transfer temp files
@ -82,56 +140,106 @@ build_preset_list_options() {
make_preset_changes() {
# This function will take a preset name $preset and a CSV list $choice, which contains the names of systems that have been enabled for this preset and enable them in the backend
# Any systems which are currently enabled and not in the CSV list $choice will instead be disabled in the backend
# USAGE: make_preset_changes $preset $choice
# This function takes a preset name ($1) and a CSV list ($2) of system names.
# If a third parameter is provided (force_state), it forces the specified state (true/false)
# for only the systems in the CSV list. Otherwise, it toggles the current state.
#
# USAGE: make_preset_changes $preset $choice [force_state]
#
# Examples:
# Force "borders" to be true for gba:
# make_preset_changes "borders" "gba" true
# Force "borders" to be true for all supported systems:
# make_preset_changes "borders" "all" true
# Toggle gba in preset "borders", this will disable the enabled and vice versa:
# make_preset_changes "borders" "gba" true
# Toggle all in preset "borders":
# make_preset_changes "borders" "all"
# Fetch incompatible presets from JSON and create a lookup list
log d "Fetching incompatible presets from JSON file"
incompatible_presets=$(jq -r '
.incompatible_presets | to_entries[] |
.incompatible_presets | to_entries[] |
[
"\(.key):\(.value)",
"\(.key):\(.value)",
"\(.value):\(.key)"
] | join("\n")
' $features)
' "$features")
preset="$1"
choice="$2"
force_state="${3:-}"
if [[ "${force_state,,}" == "on" || "${force_state,,}" == "true" ]]; then
force_state="true"
elif [[ "${force_state,,}" == "off" || "${force_state,,}" == "false" ]]; then
force_state="false"
fi
log d "Building preset list options for preset: $preset"
build_preset_list_options "$preset"
IFS="," read -ra choices <<< "$choice"
for emulator in "${all_systems[@]}"; do
if [[ " ${choices[*]} " =~ " ${emulator} " && ! " ${current_enabled_systems[*]} " =~ " ${emulator} " ]]; then
changed_systems=("${changed_systems[@]}" "$emulator")
if [[ ! " ${changed_presets[*]} " =~ " ${preset} " ]]; then
changed_presets=("${changed_presets[@]}" "$preset")
if [[ " ${choices[*]} " == *" all "* ]]; then
log d "All systems selected for preset: $preset"
choices=("${all_systems[@]}")
fi
# Use an associative array to store the new state for each emulator.
declare -A emulator_state
# Iterate only over the specified systems.
for emulator in "${choices[@]}"; do
if [[ -n "$force_state" ]]; then
new_state="$force_state"
log i "Forcing $preset to state: $new_state for $emulator"
else
current_state=$(get_setting_value "$rd_conf" "$emulator" "retrodeck" "$preset")
if [[ "$current_state" == "true" ]]; then
new_state="false"
if [[ $emulator == "all" ]]; then
log i "Toggling off $preset for all systems"
else
log i "Toggling off $preset for system: $emulator"
fi
set_setting_value "$rd_conf" "$emulator" "true" "retrodeck" "$preset"
# Check for conflicting presets for this system
while IFS=: read -r preset_being_checked known_incompatible_preset || [[ -n "$preset_being_checked" ]];
do
if [[ ! $preset_being_checked == "#"* ]] && [[ ! -z "$preset_being_checked" ]]; then
if [[ "$preset" == "$preset_being_checked" ]]; then
if [[ $(get_setting_value "$rd_conf" "$emulator" "retrodeck" "$known_incompatible_preset") == "true" ]]; then
changed_presets=("${changed_presets[@]}" "$known_incompatible_preset")
set_setting_value "$rd_conf" "$emulator" "false" "retrodeck" "$known_incompatible_preset"
fi
fi
else
if [[ $emulator == "all" ]]; then
log i "Toggling on $preset for all systems"
else
new_state="true"
log i "Toggling on $preset for system: $emulator"
fi
fi
fi
emulator_state["$emulator"]="$new_state"
changed_systems=("${changed_systems[@]}" "$emulator")
[[ ! " ${changed_presets[*]} " =~ " ${preset} " ]] && changed_presets=("${changed_presets[@]}" "$preset")
set_setting_value "$rd_conf" "$emulator" "$new_state" "retrodeck" "$preset"
# If enabling the emulator, disable any conflicting presets.
if [[ "$new_state" == "true" ]]; then
while IFS=: read -r preset_being_checked known_incompatible_preset || [[ -n "$preset_being_checked" ]]; do
if [[ ! $preset_being_checked =~ ^# ]] && [[ -n "$preset_being_checked" ]]; then
if [[ "$preset" == "$preset_being_checked" ]] && [[ $(get_setting_value "$rd_conf" "$emulator" "retrodeck" "$known_incompatible_preset") == "true" ]]; then
log d "Disabling conflicting preset: $known_incompatible_preset for emulator: $emulator"
changed_presets=("${changed_presets[@]}" "$known_incompatible_preset")
set_setting_value "$rd_conf" "$emulator" "false" "retrodeck" "$known_incompatible_preset"
fi
done < <(echo "$incompatible_presets")
fi
if [[ ! " ${choices[*]} " =~ " ${emulator} " && ! " ${current_disabled_systems[*]} " =~ " ${emulator} " ]]; then
changed_systems=("${changed_systems[@]}" "$emulator")
if [[ ! " ${changed_presets[*]} " =~ " ${preset} " ]]; then
changed_presets=("${changed_presets[@]}" "$preset")
fi
set_setting_value "$rd_conf" "$emulator" "false" "retrodeck" "$preset"
fi
done
for emulator in "${changed_systems[@]}"; do
build_preset_config $emulator ${changed_presets[*]}
done
done < <(echo "$incompatible_presets")
fi
done
# Rebuild config for all changed systems.
for emulator in "${changed_systems[@]}"; do
log d "Building preset config for changed emulator: $emulator"
if [[ "${emulator_state[$emulator]}" == "true" ]]; then
# When enabling, force a full config update (detailed settings applied).
build_preset_config "$emulator" "${changed_presets[*]}" true
else
build_preset_config "$emulator" "${changed_presets[*]}"
fi
done
}
build_preset_config() {
@ -141,6 +249,7 @@ build_preset_config() {
local system_being_changed="$1"
shift
local presets_being_changed="$*"
log d "Applying presets: $presets_being_changed for system: $system_being_changed"
for current_preset in $presets_being_changed
do
local preset_section=$(sed -n '/\['"$current_preset"'\]/, /\[/{ /\['"$current_preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d')
@ -149,6 +258,7 @@ build_preset_config() {
local read_system_name=$(get_setting_name "$system_line")
if [[ "$read_system_name" == "$system_being_changed" ]]; then
local read_system_enabled=$(get_setting_value "$rd_conf" "$read_system_name" "retrodeck" "$current_preset")
log d "Processing system: $read_system_name with preset: $current_preset, enabled: $read_system_enabled"
while IFS='^' read -r action read_preset read_setting_name new_setting_value section target_file defaults_file || [[ -n "$action" ]];
do
if [[ ! $action == "#"* ]] && [[ ! -z "$action" ]]; then
@ -161,6 +271,7 @@ build_preset_config() {
else
local read_config_format="$read_preset"
fi
log d "Config file format: $read_config_format"
;;
"change" )
@ -173,6 +284,7 @@ build_preset_config() {
eval defaults_file=$defaults_file
fi
local read_defaults_file="$defaults_file"
log d "Changing setting: $read_setting_name to $new_setting_value in $read_target_file"
if [[ "$read_system_enabled" == "true" ]]; then
if [[ "$new_setting_value" = \$* ]]; then
eval new_setting_value=$new_setting_value
@ -210,8 +322,31 @@ build_preset_config() {
fi
;;
"rewrite" )
if [[ "$read_preset" == "$current_preset" ]]; then
if [[ "$target_file" = \$* ]]; then # Read current target file and resolve if it is a variable
eval target_file=$target_file
fi
local read_target_file="$target_file"
if [[ "$defaults_file" = \$* ]]; then # Read current defaults file and resolve if it is a variable
eval defaults_file=$defaults_file
fi
local read_defaults_file="$defaults_file"
log d "Rewriting setting: $read_setting_name to $new_setting_value in $read_target_file"
if [[ "$read_system_enabled" == "true" ]]; then
if [[ "$new_setting_value" = \$* ]]; then # Resolve new setting value if it is a variable
eval new_setting_value=$new_setting_value
fi
echo -n "$new_setting_value" > "$read_target_file" # Write the new setting value to the target file
else
cat "$read_defaults_file" > "$read_target_file" # Restore the default settings from the defaults file
fi
fi
;;
"enable" )
if [[ "$read_preset" == "$current_preset" ]]; then
log d "Enabling file: $read_setting_name"
if [[ "$read_system_enabled" == "true" ]]; then
enable_file "$read_setting_name"
else
@ -254,3 +389,62 @@ build_retrodeck_current_presets() {
fi
done < $rd_conf
}
fetch_all_presets() {
# This function fetches all possible presets from the presets directory
# USAGE: fetch_all_presets [--pretty] [system_name]
local presets_dir="$config/retrodeck/presets"
local presets=()
local pretty_presets=()
local pretty_output=false
local system_name=""
if [[ "$1" == "--pretty" ]]; then
pretty_output=true
system_name="$2"
else
system_name="$1"
fi
if [[ -n "$system_name" ]]; then
preset_file="$presets_dir/${system_name}_presets.cfg"
if [[ -f "$preset_file" ]]; then
while IFS= read -r line; do
if [[ $line =~ ^(change|enable)\^([a-zA-Z0-9_]+)\^ ]]; then
preset="${BASH_REMATCH[2]}"
if [[ ! " ${presets[*]} " =~ " ${preset} " ]]; then
presets+=("$preset")
if $pretty_output; then
pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo $pretty_preset_name | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification
pretty_presets+=("$pretty_preset_name")
fi
fi
fi
done < "$preset_file"
fi
else
for preset_file in "$presets_dir"/*_presets.cfg; do
while IFS= read -r line; do
if [[ $line =~ ^change\^([a-zA-Z0-9_]+)\^ ]]; then
preset="${BASH_REMATCH[1]}"
if [[ ! " ${presets[*]} " =~ " ${preset} " ]]; then
presets+=("$preset")
if $pretty_output; then
pretty_preset_name=${preset//_/ } # Preset name prettification
pretty_preset_name=$(echo $pretty_preset_name | awk '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1))substr($i,2)}}1') # Preset name prettification
pretty_presets+=("$pretty_preset_name")
fi
fi
fi
done < "$preset_file"
done
fi
if $pretty_output; then
printf "%s\n" "${pretty_presets[@]}"
else
echo "${presets[@]}"
fi
}

View file

@ -6,6 +6,8 @@ run_game() {
system=""
manual_mode=false
usage="Usage: flatpak run net.retrodeck.retrodeck [-e emulator] [-s system] [-m] game"
# Parse options for system, emulator, and manual mode
while getopts ":e:s:m" opt; do
case ${opt} in
@ -20,7 +22,7 @@ run_game() {
log i "Run game: manual mode enabled"
;;
\?)
echo "Usage: $0 [-e emulator] [-s system] [-m] game"
echo "$usage"
exit 1
;;
esac
@ -30,7 +32,7 @@ run_game() {
# Check for game argument
if [[ -z "$1" ]]; then
log e "Game path is required."
log i "Usage: $0 [-e emulator] [-s system] [-m] game"
log i "$usage"
exit 1
fi
@ -178,7 +180,7 @@ find_system_commands() {
selected_command="${command_list[1]}"
else
# Show the list with Zenity and return the **command** (second column) selected
selected_command=$(zenity --list \
selected_command=$(rd_zenity --list \
--title="Select an emulator for $system_name" \
--column="Emulator" --column="Hidden Command" "${command_list[@]}" \
--width=800 --height=400 --print-column=2 --hide-column=2)

View file

@ -100,6 +100,7 @@ add_to_steam() {
remove_from_steam
else
log d "Updating game list"
steam-rom-manager enable --names "RetroDECK Steam Sync"
steam-rom-manager add
fi
}
@ -110,7 +111,11 @@ remove_from_steam() {
log d "Creating dummy game"
cat "" > "$steamsync_folder/CUL0.sh"
log d "Cleaning the shortcut"
steam-rom-manager enable --names "RetroDECK Steam Sync"
steam-rom-manager disable --names "RetroDECK Launcher"
steam-rom-manager remove
log d "Removing dummy game"
rm "$steamsync_folder/CUL0.sh"
steam-rom-manager enable --names "RetroDECK Launcher"
steam-rom-manager disable --names "RetroDECK Steam Sync"
}

View file

@ -1,6 +1,6 @@
[Desktop Entry]
Name=RetroDECK
GenericName=Universal Emulator Platform
GenericName=All-in-One Retro Gaming Platform
Type=Application
Comment=All-in-one emulation solution for Steam Deck and Linux desktops, making emulation easy and accessible
Icon=net.retrodeck.retrodeck

View file

@ -36,22 +36,35 @@
</screenshot>
</screenshots>
<description>
<p>RetroDECK is an emulation and retro gaming application powered by the ES-DE Frontend that allows you to catalog and play your game collection directly on Linux in one unified experience. It's inspired by other embedded emulation systems like AmberELEC, EmuELEC, CoreELEC, Lakka, and Batocera. The goal is to have everything you need included in one package, so no other software is required.</p>
<p>Currently in Beta, RetroDECK focuses on SteamOS, Steam Deck, and Linux Desktop. It uses Steam Input for controller inputs and hotkeys. For the best experience, play and launch RetroDECK via Steam, though manual tweaks via RetroDECK Configurator may be needed if played without it.</p>
<p>Thanks to the built-in RetroENGINE, RetroDECK can be used as a headless engine, and with Steam Sync, you can synchronize your favorites as non-Steam games (powered by Steam ROM Manager).</p>
<p>What is it in detail?
https://retrodeck.readthedocs.io/en/latest/wiki_about/what-is-retrodeck/</p>
<p>How-to: Get Started using RetroDECK
https://retrodeck.readthedocs.io/en/latest/wiki_general/retrodeck-start/</p>
<p>If you want to sponsor the project:
https://www.patreon.com/RetroDECK</p>
<p>RetroDECK is a universal retro gaming platform that brings the power and flexibility of custom firmware without replacing your systems OS. Perfect for Steam Deck and Linux desktops, RetroDECK is a self-contained app that delivers everything you need for retro gaming right out of the box.</p>
<p>Why RetroDECK?</p>
<ul>
<li>All-in-One Convenience: Catalog, customize, and play your retro games from one unified app.</li>
<li>No Custom Firmware: Enjoy the benefits of custom firmware without modifying your system — RetroDECK runs as a fully self-contained app.</li>
<li>Easy Installation and Updates: RetroDECK is easy to install, update, and remove if you choose, ensuring a hassle-free experience.</li>
</ul>
<p>Whats Inside?</p>
<ul>
<li>RetroDECK Framework: A flexible and powerful environment for seamless emulation and retro gaming.</li>
<li>RetroENGINE: Offers a versatile gaming setup with headless engine mode, perfect for advanced users.</li>
<li>RetroDECK Configurator: A multi-tool interface to tweak and tailor your gaming experience.</li>
<li>Steam Input Controller Support: Advanced input handling, radial menus and hotkeys via Steam Input.</li>
<li>Steam Sync: Add your games as non-Steam titles with ease using Steam ROM Manager.</li>
<li>ES-DE Frontend: A polished, user-friendly interface for browsing and launching your retro collection.</li>
<li>Emulators: Packed with emulators like RetroArch, MAME, PCSX2, and more — play almost any retro game you can think of.</li>
<li>Engines: Support for game engines like Solarus, GZDoom, and others.</li>
<li>PortMaster: Manage your Linux game ports with ease — no more headaches setting up game ports manually.</li>
</ul>
<p>RetroDECK gives you the power of a retro game handheld's custom firmware experience in a tidy, self-contained package. No system modding, no OS replacement — just pure retro gaming bliss.</p>
<p>The RetroDECK Community:</p>
<p>Blog: https://retrodeck.readthedocs.io/en/latest/blog/</p>
<p>Discord: https://discord.gg/WDc5C9YWMx</p>
<p>Matrix: https://matrix.to/#/#retrodeck:matrix.org</p>
<p>Lemmy Community: https://lemmy.zip/c/retrodeck</p>
<p>Subreddit: https://www.reddit.com/r/retrodeck</p>
<p>Bluesky: https://bsky.app/profile/retrodeck.net</p>
<ul>
<li>Blog: https://retrodeck.readthedocs.io/en/latest/blog/</li>
<li>Discord: https://discord.gg/WDc5C9YWMx</li>
<li>Matrix: https://matrix.to/#/#retrodeck:matrix.org</li>
<li>Lemmy Community: https://lemmy.zip/c/retrodeck</li>
<li>Subreddit: https://www.reddit.com/r/retrodeck</li>
<li>Bluesky: https://bsky.app/profile/retrodeck.net</li>
</ul>
</description>
<branding>
<color type="primary" scheme_preference="light">#94a6fb</color>
@ -60,6 +73,51 @@
<project_license>GPL-3.0</project_license>
<metadata_license>CC0-1.0</metadata_license>
<releases>
<release version="0.9.1b" date="2025-02-07">
<url>https://github.com/RetroDECK/RetroDECK/releases/tag/0.9.0b</url>
<description>
<p>New Additions:</p>
<ul>
<li>RetroAchievements: PPSSPP support added (by Cohee)</li>
<li>RetroAchievements: Dolphin support added</li>
<li>INITIAL SETUP: prompts to add RetroDECK to Steam</li>
<li>CONFIGURATOR: reset components menu simplified and allowed multiple choices and `Factory Reset`</li>
<li>CONFIGURATOR: refacotred open component menu</li>
<li>CONFIGURATOR: scaled UI to 1.5x</li>
<li>New CLI argument `--set` to set presets, call retrodeck with `--set help` for more information</li>
<li>New CLI argument `--open` to open a component or emulator. Call retrodeck with `--open --list` for a list of available components or emulator to open</li>
<li>New CLI argument `--reset` that replaces the previous ones</li>
<li>New CLI argument `--factory-reset` that resets RetroDECK completely and brings the user to the first setup</li>
<li>CHEATS: added basic cheats support for RetroArch, PCSX2, PPSSPP and MAME</li>
<li>GAME COMPRESSOR: refactored</li>
<li>CHANGE PRESET DIALOG: added enable all and disable all buttons</li>
<li>RPCS3: updated</li>
<li>MAME: updated to 0.275</li>
</ul>
<p>Bug fixes:</p>
<ul>
<li>CONFIGURATOR: restructured menus for better navigation and clarity</li>
<li>RETROARCH: fixed a bug where the cores were not updated along with RetroArch itself</li>
<li>DOLPHIN and PRIMEHACK: Fixed a bug where the Universal Dynamic Input was missing from the build</li>
<li>DOLPHIN: fixed a bug where it wouldn't start in some Wayland configurations</li>
<li>DOLPHIN: fixed a trigger issue in the controller configuration</li>
<li>PRIMEHACK: fixed an issue where wii folder was not mapped as roms path in GTK GUI</li>
<li>PORTMASTER: added the ability to hide PortMaster from ES-DE</li>
<li>PSX: fixed an issue that was not showing the borders correctly</li>
<li>BIOS CHECKER: fixed wrong folder check</li>
<li>POST_UPDATE: fixed a bug where retrodeck.cfg was not updated at every version</li>
<li>COMPRESSOR: fixed a bug where user selected items were misread</li>
<li>ES-DE: removed 7zip and zip formats from PSP as not supported by PPSSPP (Standalone)</li>
</ul>
<p>Developers, developers, developers:</p>
<ul>
<li>Function `make_preset_changes` enhanced to be 100% headless</li>
<li>New `fetch_all_presets` function to list all the presets globally of per-system</li>
<li>`preapre_components` can now act/reset multiple components at once</li>
<li>`preapre_components` can now execute a factory reset with --factory-reset</li>
</ul>
</description>
</release>
<release version="0.9.0b" date="2025-02-04">
<url>https://github.com/RetroDECK/RetroDECK/releases/tag/0.9.0b</url>
<description>
@ -88,6 +146,7 @@
<li>Fixed an issue that was not correctly displaying version notes</li>
<li>Vita3K now uses Vulkan as default</li>
<li>Dolphin and Primehack are no longer scaled wide by default but are set to auto</li>
<li>Removed zip extension from NDS system as is not supported</li>
</ul>
<p>Developers, developers, developers:</p>
<ul>

View file

@ -86,7 +86,7 @@ modules:
# VERSION INITIALIZATION
# on main please update this with the version variable, eg: VERSION=0.8.0b
# on cooker will be VERSION=cooker-0.9.0b for example
VERSION=0.9.0b
VERSION=cooker-0.9.1b
git checkout ${GITHUB_REF_NAME}
mkdir -p ${FLATPAK_DEST}/retrodeck/
@ -311,6 +311,16 @@ modules:
url: https://buildbot.libretro.com/nightly/linux/x86_64/latest/sameduck_libretro.so.zip
sha256: SAMEDUCKSHAPLACEHOLDER
- name: retroarch-cheats
buildsystem: simple
build-commands:
- mkdir -p ${FLATPAK_DEST}/retrodeck/cheats
- tar -czf ${FLATPAK_DEST}/retrodeck/cheats/retroarch.tar.gz cht
sources:
- type: git
url: https://github.com/libretro/libretro-database
branch: master
- name: ppsspp-bios
buildsystem: simple
build-commands:
@ -366,6 +376,16 @@ modules:
url: https://github.com/RetroDECK/org.ppsspp.PPSSPP/releases/latest/download/RetroDECK-Artifact.tar.gz
sha256: RETRODECKPPSSPPLATEST
- name: ppsspp-cheats
buildsystem: simple
build-commands:
- mkdir -p ${FLATPAK_DEST}/retrodeck/cheats
- tar -czf ${FLATPAK_DEST}/retrodeck/cheats/ppsspp.tar.gz cheat.db
sources:
- type: git
url: https://github.com/Saramagrean/CWCheat-Database-Plus-
branch: master
# PCSX2 - FROZEN UNTIL QT 6.8 UPDATE
# Inspired by: https://github.com/flathub/com.zettlr.Zettlr/blob/master/com.zettlr.Zettlr.yaml
# https://pcsx2.net/downloads/
@ -386,6 +406,16 @@ modules:
url: https://github.com/PCSX2/pcsx2/releases/download/v2.1.190/pcsx2-v2.1.190-linux-appimage-x64-Qt.AppImage
sha256: 6a83a7bc499ad4ef4940aa2df08624876b452998f897ebdb8f8d7687c9035b79
- name: pcsx2-cheats
buildsystem: simple
build-commands:
- mkdir -p ${FLATPAK_DEST}/retrodeck/cheats
- tar -czf ${FLATPAK_DEST}/retrodeck/cheats/pcsx2.tar.gz cheats
sources:
- type: git
url: https://github.com/xs1l3n7x/pcsx2_cheats_collection
branch: main
# Dolphin
# why from source: AppImage not provided, only Flatpak
# https://github.com/RetroDECK/org.DolphinEmu.dolphin-emu
@ -431,6 +461,17 @@ modules:
url: https://github.com/RetroDECK/io.github.shiiion.primehack/releases/latest/download/RetroDECK-primehack-Artifact.tar.gz
sha256: RETRODECKPRIMEHACKLATEST
# Universal Dynamic Input for Dolphin and Primehack
- name: universal_dynamic_input
buildsystem: simple
build-commands:
- mkdir -p ${FLATPAK_DEST}/retrodeck/extras/DynamicInputTextures
- cp -r * ${FLATPAK_DEST}/retrodeck/extras/DynamicInputTextures/
sources:
- type: git
url: https://github.com/Venomalia/UniversalDynamicInput.git
commit: UNIVERSALDYNAMICINPUTCOMMITPLACEHOLDER
# RPCS3
# https://rpcs3.net/download
@ -761,6 +802,7 @@ modules:
- cp -f res/icon.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg
- cp -f res/icon-configurator.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.configurator.svg
- mv -f -t ${FLATPAK_DEST}/retrodeck res/binding_icons
- mv -f -t ${FLATPAK_DEST}/retrodeck res/steam_grid
# RetroDECK core script
- install -Dm755 retrodeck.sh ${FLATPAK_DEST}/bin/retrodeck.sh

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 85 KiB

View file

@ -4,15 +4,11 @@
<g transform="matrix(1.88235,0,0,1.86861,-7.52941,-5.60584)">
<path d="M140,37.25C140,18.347 124.765,3 106,3L38,3C19.235,3 4,18.347 4,37.25L4,105.75C4,124.653 19.235,140 38,140L106,140C124.765,140 140,124.653 140,105.75L140,37.25Z" style="fill:rgb(17,17,17);"/>
</g>
<g transform="matrix(2.02105,0,0,2.02105,-13.4737,-13.4737)">
<g id="D" transform="matrix(-0.674885,8.26495e-17,-8.26495e-17,-0.674885,223.747,109.037)">
<path d="M172.54,-2.511C175.786,-5.757 179.378,-8.24 183.315,-9.96C187.251,-11.68 191.533,-12.54 196.16,-12.54L271.855,-12.54L271.855,6.901L196.16,6.901C194.44,6.901 192.823,7.222 191.309,7.864C189.795,8.506 188.475,9.39 187.348,10.517C186.222,11.643 185.337,12.964 184.695,14.478C184.053,15.992 183.732,17.609 183.732,19.329L183.732,96.355C183.732,97.954 184.084,99.498 184.786,100.988C185.489,102.478 186.416,103.798 187.566,104.949C188.717,106.1 190.037,107.027 191.527,107.729C193.017,108.432 194.562,108.783 196.16,108.783L271.855,108.783L271.855,128.224L196.16,128.224C193.859,128.224 191.624,127.982 189.456,127.498C187.288,127.013 185.204,126.329 183.206,125.444C181.207,124.56 179.311,123.5 177.518,122.265C175.726,121.029 174.066,119.673 172.54,118.195C169.366,115.118 166.901,111.575 165.145,107.566C163.389,103.556 162.51,99.226 162.51,94.574L162.51,21.11C162.51,16.458 163.37,12.17 165.09,8.246C166.811,4.321 169.294,0.736 172.54,-2.511Z" style="fill:white;fill-rule:nonzero;"/>
</g>
<g id="Left-Symbol" serif:id="Left Symbol" transform="matrix(0.494792,-0,-0,0.494792,6.66667,6.66667)">
<use xlink:href="#_Image1" x="38.93" y="88.886" width="101px" height="79px"/>
</g>
<use id="Central-Icons" serif:id="Central Icons" xlink:href="#_Image1" x="55.434" y="81.667" width="80px" height="93px"/>
<g id="D" transform="matrix(-1.36398,1.67039e-16,-1.67039e-16,-1.36398,438.73,206.895)">
<path d="M172.54,-2.511C175.786,-5.757 179.378,-8.24 183.315,-9.96C187.251,-11.68 191.533,-12.54 196.16,-12.54L271.855,-12.54L271.855,6.901L196.16,6.901C194.44,6.901 192.823,7.222 191.309,7.864C189.795,8.506 188.475,9.39 187.348,10.517C186.222,11.643 185.337,12.964 184.695,14.478C184.053,15.992 183.732,17.609 183.732,19.329L183.732,96.355C183.732,97.954 184.084,99.498 184.786,100.988C185.489,102.478 186.416,103.798 187.566,104.949C188.717,106.1 190.037,107.027 191.527,107.729C193.017,108.432 194.562,108.783 196.16,108.783L271.855,108.783L271.855,128.224L196.16,128.224C193.859,128.224 191.624,127.982 189.456,127.498C187.288,127.013 185.204,126.329 183.206,125.444C181.207,124.56 179.311,123.5 177.518,122.265C175.726,121.029 174.066,119.673 172.54,118.195C169.366,115.118 166.901,111.575 165.145,107.566C163.389,103.556 162.51,99.226 162.51,94.574L162.51,21.11C162.51,16.458 163.37,12.17 165.09,8.246C166.811,4.321 169.294,0.736 172.54,-2.511Z" style="fill:white;fill-rule:nonzero;"/>
</g>
<defs>
<image id="_Image1" width="101px" height="79px" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABPCAYAAADySwufAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACYklEQVR4nO3dwWoTQQDG8f+MoZ6l6CHexJvES6lFX8NDGnrSo+jVF1DwCbwIehNS0WfwImqgglR8hUQUwYOiIM56yDabTZq0hSH7od8PAhl2u5n0T5dku8sGZrzqjdZSoFfARgp0UgidFFgvgBQghUACirBgTCCF+rh6Pl7/0PHU9ufGk+dQlK83GZevd6wx5c9PlpXznyxbMIap9zQzPuT9Vsuq7c2Np3+f9fH51nSQ19vDzQSPgc5sLFudePDkzfbwLvAWB2lcBBh0h5vAA6YiWXPioDtcY7zLchAREejhXZaUCGw0PQmri/ivRI6jCIrAetOTsDp/4hLkKIIcRZCjCGodvcqRfgG/M2zHxoocUW5cf3Kun2E7VvLuS5CjCHIUQY4iyFEEOYogRxHkKIIcRZCjCHIUQY4iyFEEOYqgHIfuL764+fmKz7pfetb9n/e3Wu9WGeVe+bDFvgFnjruyd1+CHEWQowhyFEGOIshRBDmKIEcR5CiCHEWQowhyFEGOIijHUeKPwKcM2/mXfT/Jyjmi3PelEHl59yXIUQQ5iiBHEeQoghxFkKMIchRBjiLIUQQ5iiBHEeQoghxFkKMIchRBYdAdFjB/Ec2SW0nM3qpjP8HIFw1lu1XHTo7/PF4uH5bHae++BDmKIEcR5CiCIvCj6UlYXWR8Mp0JicCHpidhdRHYb3oSVheBp8CXpidilbi12/4K3Gl6IlY5+Ej8DHje5ESsEgG2dtsF0AVuc8LT9i2/yZfHq/12utZvPwQuAY+APeBnUxP7n4VlC1/ujE6lEC6kwFnfZXtlh+73/gIFdaUBKdRJYwAAAABJRU5ErkJggg=="/>
<image id="_Image1" width="80px" height="93px" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABdCAYAAAAyj+FzAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGX0lEQVR4nO2daWxUVRSAvzOUskMBE0hFBININUgqGgQiUYNLlIQQAyg7ZW3LVva17KtAKZtQtiCpgqiAqRIBCT9QJE1RJAiCEajQtNVIgEI35tYfwyvTvbO9O8v7kkk7S+8598u5k7mnk/uEGvhyVG64EgYokZ5KiLJDlBKpp4RMJdxQIr8rYee4LS2v1jRWMCJVPXF4ZG6EEsYrYaISIpUISsAOGL87boISSpRwVAnJ8ZtaHjMxf+1UKvCbETldlchhJbQpJ6oqgaU3O3JCCfFTNra4YvJctFBBYNrwnCFK2KFE6juLcUEgSihSwsdKZPn0Dc3zNczLNGzOd44OzxkE7APqezhuODAPuLgm4fb7Ho7l15RW4PfDsjsqkQw7NK6sslyswPLPHVEik+aui8jUOFefIADHh2bXU8JZJdLFIcjrAlEiD5SwTMHaxLURxXqn7T2MJTwY6OLjWA2BFcD5hTPuvOHjWKZhCBxnYswo4OSCmXdS582609rEuD5BfhiSHa2Ec8aS8+ESdvwE7I8fv6OERCWyZfXKpnbNLtzCBvTXGL8ZkAykz5h7t5vGPNzGBnTQnQQQDZyZNu9uSsK8ey10J+MKNqCd7iQeIcAY4I9J8+/FTFhwr8ptpj9hA9rrTqIcTwC7gNNxiXkv6k6mJmw4EvZHegAZ4xfmJY1dlNdEdzJVYav5JVoJA6YAl0cvzhuoO5nK8HeBBpHA/pgl94+PWHK/o+5knAkUgQa9gQtDl95fNnjZgwa6k4HAEwhOnZ6Plj/Q3ukJRIEG7YG0gSseHO6/Mr+triQCWaBBX+DSB6vy5/RblV/X7ODBIBCcOj19V+eb2ukJFoEGUcDJPmsKUt/7uMCUTk+wCTQYBFx+d23BxLfXFdbxZaBgFQiOTs9GIL33+kKfdXqCWaBBNHDmzaTClNeTirze6QkFgeDU6em1oSimZ3KR1zo9oSLQoLTT031jsVc6PaEm0KAHkNFtU3HSK5uLPer0hKpAcOr0dN1S7HanJ5QFGkQC+6O3PjzWZetDlzs9lsDHvAVc6PzJw2UvbLPXutNjCSxLaaen03Z7rTo9lsDKaQ+kdUyxH+6wQ1Xb6bEEVk9f4OIzO1W/ql5gCayZxsBX7XaphW13qQofwC2BtUOARTi+O1kGS6BrDG6zu6TMF7Esga6zPnJPSennRUug6zQEdhh3LIHu0StyT0knsAR6wnCwBHrC0Mg9JWIJdJ8ngVaWQM9oawn0DEughzS3BHpGliXQM25YAj0j0xLoPmezRspdS6D77AVrJ+IuhcB+sAS6S0rWSLkNlkB3uAzMMu5YAl2jGBicNVJKz4GwBNaeAmDYzRg55/xgmKZkAo1bQL/MUbb08k9YFVgzp4CXr1ciD6wKrI4cYMafY2wV/pXpjFWBFVHAFqDTlbF1qpUHVgWWJx2IvTi+TkZt/8CqQAe3gVjg1QuxYbWWB1YFluDY0878JS7sH3cGCGWBF4C49Al1T3sySCgu4TxgGvDS2YmeyYPQq8CDQMKPk8NveWvAUBF4FZhwKiHc66drBvsSLgASgc4nE+r55GjSYK7Ab4FJx6bV+8uXQYJRYCYw5bsZ9Q+ZESyYlnAxsBqISptpjjwIngo8BcQdmt3gktmBA11gNjD94JwGqboSCNQlbAc2A50OzG2oTR4EZgWeBeJS5zc8V+MrTSCQKvA/HGe9dt+3oJFfyIPAqMASYA8wa3dio391J1OeMBzvJz49GsQDfgNiUxY1/kl3IlVhA27qTqIS7gFTga7bFvuvPHBU4DXgad2JOHEAmLp5aZMs3YnUhjDguu4kHnEFiE9a3uSE7kRcwQac15xDPrAA6LxuedOAkgeOCkzFsYcM1xA/DZi0emXTaxpiewXjag6fK+FDE4+Cv6GEyUvXNDuidfZewPggvdWkeEXASuD5YJAHZS/Isl2JjPVhBZ5UQvz8tRGX9U3X+zjvRCYD3YHOXo6RDUybuy7iMy+P6xeU7oXf+bR1ATAAyPXS2HYc5/c9N3t986CUB5Vf1espJRxSIl09WMI/KyF2anKLXzXMyVQqdGP67G31N/Aajg28cnG8HGAs0CMU5EE1VzYE+Dom91klTFXCcCXSoJoKzFDCRiUciN/UstCk3P2CWp3k+MXo3AglEq3KXlvzhnp0bc0xW1v6TX/ObP4HOCdVp+44FjkAAAAASUVORK5CYII="/>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

18
res/icon-framework.svg Normal file
View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1.88235,0,0,1.86861,-7.52941,-5.60584)">
<path d="M140,37.25C140,18.347 124.765,3 106,3L38,3C19.235,3 4,18.347 4,37.25L4,105.75C4,124.653 19.235,140 38,140L106,140C124.765,140 140,124.653 140,105.75L140,37.25Z" style="fill:rgb(17,17,17);"/>
</g>
<g transform="matrix(2.02105,0,0,2.02105,-13.4737,-13.4737)">
<g id="D" transform="matrix(-0.674885,8.26495e-17,-8.26495e-17,-0.674885,223.747,109.037)">
<path d="M172.54,-2.511C175.786,-5.757 179.378,-8.24 183.315,-9.96C187.251,-11.68 191.533,-12.54 196.16,-12.54L271.855,-12.54L271.855,6.901L196.16,6.901C194.44,6.901 192.823,7.222 191.309,7.864C189.795,8.506 188.475,9.39 187.348,10.517C186.222,11.643 185.337,12.964 184.695,14.478C184.053,15.992 183.732,17.609 183.732,19.329L183.732,96.355C183.732,97.954 184.084,99.498 184.786,100.988C185.489,102.478 186.416,103.798 187.566,104.949C188.717,106.1 190.037,107.027 191.527,107.729C193.017,108.432 194.562,108.783 196.16,108.783L271.855,108.783L271.855,128.224L196.16,128.224C193.859,128.224 191.624,127.982 189.456,127.498C187.288,127.013 185.204,126.329 183.206,125.444C181.207,124.56 179.311,123.5 177.518,122.265C175.726,121.029 174.066,119.673 172.54,118.195C169.366,115.118 166.901,111.575 165.145,107.566C163.389,103.556 162.51,99.226 162.51,94.574L162.51,21.11C162.51,16.458 163.37,12.17 165.09,8.246C166.811,4.321 169.294,0.736 172.54,-2.511Z" style="fill:white;fill-rule:nonzero;"/>
</g>
<g id="Engine" transform="matrix(0.494792,-0,-0,0.494792,6.66667,6.66667)">
<use xlink:href="#_Image1" x="33.993" y="72.667" width="111px" height="111px"/>
</g>
</g>
<defs>
<image id="_Image1" width="111px" height="111px" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG8AAABvCAYAAADixZ5gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFq0lEQVR4nO2dTWhUVxSAvzN5/hSLEayCIIJ0U61ixKZiacWddOHSkurOpibGCqYqVFIQCo1mVazUJqm2WiuVQqELDYJQDXShFqSx1S5dWSlJaytEJSb3djFJE8P85b37ZuY454MhkHn3nDvnm5n33tz73hWqiK72+5edsNGL4AAn4AUckv0rPPGw5eOu+kuhczd1PjzmoM2LZPOO55+SGw97+g7MPR46d1wyle7ANNaS7VO+xxzgpZRyrymSOwOsTil3LKpNXqXxMZ+rCCZPMSZPMSZPMSZPMSZPMSZPMSZPMSZPMSZPMSZPMSZPMSZPMZJW4JO7hhZ7YZ1Dlk0O7UCRIZdPnPBcgSEhPHznhB+dyP8xJraZGnd6u1y5n2on7HfwoheRPP3zHn5ywtlcuZ/OA05k1MMtJwz8/N6sR2nUOKi8r1uGZjuhw8MOJyydVpxS5I1vm1ee9yAuW5zQ8or1z3nI5MudQ97ENs7DTSfScWN31Bey3sHkfbNzsMGJnHHCqpjFKUXeZLvyyyuYu4A8PDgnknHCSQ/vD7RFD0LUPMg+7+zOwQbgGrAyRLxnkIk6vwP0r/58dHbIoLH59t3B2cAZIAoRrwZoADpCBApR7A5gVaBYtcKHq7pHG5IGCVHwHQFi1BoZYFuIILE51zy4GFiatBM1iAMakwZJ+slbl7QDNUoGaFzZPZao/lHCTiwrcbvhhHm0EZGdpliIecAC4O8kSdJmuPWzhc+XIU/V8NqnI5uBi2nnsSNExZg8xZg8xZg8xZg8xZg8xZg8xZg8xZg8xURXtt+77JC1sUaLIcig4gRd7fd/cMKmKh1Jdx729R2Y+1XAl3xnRc+Yz9e/qa9xGh44FAEbqZ5P4CagvtKdKMCrQEh582O288CGapGmgWq6rNlB9XzijBiYPMWYPMWYPMWYPJ0IZOU9SRionEdh1XTEV0kywEgEbCH+LaFeB94K1qXiCPA90J9C7L3AclK8+CYHB4k/v+d8tOnskktArBuxnWseHKG88gD6Dx+pPxY6aFPnw61k5ZWT3t9b6mJPQLJ9nmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmJMnmKiK9vvHXPImpiXeC2pQJ/3Hvzg363BL/HKLn5Ybi6s6Bl7EuMSL4CjEdBG9hOoZU7kctKb5VXOaX8eWB+zrQB3o2n/0ICWfhYjyesYA9vnqcbkKcbkKcbkKcbkKWbq0WbcUwVPuDeBS9iXNBHC9ssR/4izDvARsAdYHTPIy8AbMdvmYh/Z22VUIx7oDRgvA5wCHsdsfzrROdO55sEWL3RP/iqQ8xeM4Z3Ha+82xU7k4pTlaPLVZuHtVrvEqyYxeYoxeYoxeYoxeYoxeYoxeYoxeYopx1pCUffuvzbX1Jqx8EoZ6ppY3mgJ28yhDIsiKaWU+uUl6dfmrYTta5k/brfWJVq1Oam8ASZHAozSccDVpEESyWs6segRcBMTOFMywPUQQZLSEShOreCAe0BP0kCJi/72F4v6gC+TxqkhMsCO31qjf0IECkE78EugWM8qE7uWzl93RUGOvoPI29676AHZ2b8fMdlJ2w9mmajDn8CbA21RR6jAwWcfn2odavCwzQmNXmh0yLyZngRX8CTdexEpsBxNpuTrOLLb3HXCNQ/XnUjPjd3JvyqnkurU8RNtQxmHLJiBvDtOmF9E3kEn9KYg74KD9QXkeQ+nnbCvRHmjV/fMSnQeV4xUfx5rPv6CYwbrgHe13y9ldtbw4SP1sed95KOp82EpN0p/fHH/3OC542KH+IoxeYoxeYoxeYoxeYoxeYoxeYoxeYoxeYoxeYoxeYoxeYopx7zNmeDHH7nGAoX032zC+A1qclCXcu4ZU23yDgEbCjw/ApxPKfdR4G6B5z1wOqXcsfgP3aQLLxWNbfYAAAAASUVORK5CYII="/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
res/steam_grid/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
res/steam_grid/hero.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
res/steam_grid/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
res/steam_grid/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
res/steam_grid/portrait.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View file

@ -1,34 +1,24 @@
#!/bin/bash
source /app/libexec/global.sh
# uses jq to extract all the emulators (components) that don't have resettable: false in the features.json and separate them with "|"
resettable_components=$(jq -r '
[(.emulator | to_entries[]) |
select(.value.core == null and .value.resettable != false) |
.key] | sort | join("|")
' "$features")
# uses sed to create, a, list, like, this
pretty_resettable_components=$(echo "$resettable_components" | sed 's/|/, /g')
# Function to display CLI help
show_cli_help() {
echo -e "
Usage:
flatpak run [FLATPAK-RUN-OPTION] net.retrodeck-retrodeck [ARGUMENTS]
echo -e "
Usage:
flatpak run [FLATPAK-RUN-OPTION] net.retrodeck.retrodeck [ARGUMENTS]
Arguments:
-h, --help \t Print this help
-v, --version \t Print RetroDECK version
--info-msg \t Print paths and config informations
--debug \t Enable debug logging for this launch of RetroDECK (This may miss errors very early in the launch process)
--show-config \t Print information about the RetroDECK configuration file and its contents
--debug \t Enable debug logging for this run of RetroDECK
--configurator \t Starts the RetroDECK Configurator
--compress-one <file> \t Compresses target file to a compatible format
--compress-all <format> \t Compresses all supported games into a compatible format.\n\t\t\t\t\t\t Available formats are \"chd\", \"zip\", \"rvz\" and \"all\"
--reset-component <component> \t Reset one or more component or emulator configs to the default values
--reset-retrodeck \t Starts the initial RetroDECK installer (backup your data first!)
--reset <component> \t Reset RetroDECK or one or more component/emulator configurations to default values. WARNING: no confirmation prompt
--factory-reset \t Factory Reset, triggers the initial setup WARNING: no confirmation prompt
--test-upgrade <version> \t Test upgrading RetroDECK to a specific version, developer use only
--set <preset> <system/all> [value] \t Configure or toggle a preset. Examples: --set borders, --set borders all true,\n\t\t\t\t\t\t --set borders gba false. Use --set-help for more information
--open <component/emulator> \t Open a specific component or emulator\n\t\t\t\t\t\t --open --list for a list of available components
Game Launch:
[<options>] <game_path> \t Start a game using the default emulator or\n\t\t\t\t\t\t the one defined in ES-DE for game or system
@ -39,121 +29,154 @@ Game Launch:
For flatpak run specific options please run: flatpak run -h
The RetroDECK Team
https://retrodeck.net
"
}
# Arguments section
for i in "$@"; do
case $i in
-h*|--help*)
echo "RetroDECK v""$version"
show_cli_help
exit
;;
--version*|-v*)
# Check if is an infromational message
# If so, set LOG_SILENT to true, source the global.sh script,
# show the needed information and quit
case "$1" in
-h|--help)
LOG_SILENT=true
source /app/libexec/global.sh
if [[ "$version" =~ ^[0-9] ]]; then
echo "RetroDECK v$version"
exit
;;
--info-msg*)
else
echo "RetroDECK $version"
fi
show_cli_help
exit 0
;;
-v|--version)
LOG_SILENT=true
source /app/libexec/global.sh
if [[ "$version" =~ ^[0-9] ]]; then
echo "RetroDECK v$version"
echo "RetroDECK config file is in: $rd_conf"
echo "Contents:"
cat $rd_conf
exit
;;
--debug*)
logging_level="debug"
shift
;;
--compress-one*)
cli_compress_single_game "$2"
exit
;;
--compress-all*)
cli_compress_all_games "$2"
;;
--configurator*)
sh /app/tools/configurator.sh
#sh /app/bin/godot-configurator.sh
;;
# --legacy-configurator*)
# sh /app/tools/configurator.sh
# if [[ $(configurator_generic_question_dialog "RetroDECK Configurator" "Would you like to launch RetroDECK after closing the Configurator?") == "false" ]]; then
# exit
# else
# shift
# fi
# ;;
--reset-component*)
component="$2"
if [ -z "$component" ]; then
echo "You are about to reset one or more RetroDECK components or emulators."
echo -e "Available options are:\nall, $pretty_resettable_components"
read -p "Please enter the component you would like to reset: " component
component=$(echo "$component" | tr '[:upper:]' '[:lower:]')
fi
else
echo "RetroDECK $version"
fi
exit 0
;;
--set-help)
LOG_SILENT=true
source /app/libexec/global.sh
echo -e "\nUsed to toggle or set a preset.\n\nAvailable presets are:"
fetch_all_presets | tr ' ' ',' | sed 's/,/, /g'
echo -e "\nUsage: --set <preset> <system/all> [value]"
echo -e "\nExamples:"
echo -e " Force borders to be ON for GBA:"
echo -e " make_preset_changes borders gba on"
echo -e " Force borders to be OFF for all supported systems:"
echo -e " make_preset_changes borders all off"
echo -e " Toggle GBA in preset borders (this will disable if enabled and vice versa):"
echo -e " make_preset_changes borders gba"
echo -e " Toggle all in preset borders:"
echo -e " make_preset_changes borders all"
echo -e "\nYou can also use 'true' or 'false' instead of 'on' and 'off'.\nThe forced status is case insensitive."
exit 0
;;
esac
if [[ "$component" =~ ^(all|$resettable_components)$ ]]; then
read -p "You are about to reset $component to default settings. Enter 'y' to continue, 'n' to stop: " response
if [[ $response == [yY] ]]; then
prepare_component "reset" "$component" "cli"
read -p "The process has been completed, press Enter key to start RetroDECK."
shift # Continue launch after previous command is finished
else
read -p "The process has been cancelled, press Enter key to exit."
exit
fi
else
echo "$component is not a valid selection, exiting..."
exit
fi
;;
--reset-retrodeck*)
echo "You are about to reset RetroDECK completely!"
read -p "Enter 'y' to continue, 'n' to stop: " response
if [[ $response == [yY] ]]; then
rm -f "$lockfile"
rm -f "$rd_conf"
read -p "The process has been completed, press Enter key to exit. Please run RetroDECK again to start the initial setup process."
exit 1
else
read -p "The process has been cancelled, press Enter key to exit."
exit
fi
;;
--test-upgrade*)
echo "You are about to test upgrading RetroDECK from version $2 to $hard_version"
read -p "Enter 'y' to continue, 'n' to start RetroDECK normally: " response
if [[ $response == [yY] ]]; then
version="$2"
shift
else
shift
fi
;;
*)
# Assume unknown arguments are game start arguments
if [ -f "$i" ]; then
log i "Attempting to start the game: $i"
source /app/libexec/global.sh
# Process command-line arguments
while [[ $# -gt 0 ]]; do
# If the first argument is -e, -s, -m, or a valid file, attempt to launch the game
if [ -f "$1" ] || [[ "$1" == "-e" || "$1" == "-s" || "$1" == "-m" ]]; then
echo "$LOG_BUFFER"
log i "Game start option detected: $1"
run_game "$@"
exit
elif [[ "$i" == "-e" || "$i" == "-s" || "$i" == "-m" ]]; then
log i "Game start option detected: $i"
run_game "$@"
exit
else
log i "Command or File '$i' not found. Ignoring argument and continuing..."
break # Continue with the main program
fi
;;
-*|--*)
log i "Unknown option $i"
show_cli_help
exit 1
;;
esac
exit 0
fi
case "$1" in
--show-config)
echo ""
cat "$rd_conf"
exit 0
;;
--debug)
logging_level="debug"
shift
;;
--compress-one)
cli_compress_single_game "$2"
exit 0
;;
--compress-all)
cli_compress_all_games "$2"
shift 2
;;
--configurator)
sh /app/tools/configurator.sh
exit 0
;;
--reset)
component="${@:2}"
if [ -z "$component" ]; then
echo "You are about to reset one or more RetroDECK components or emulators."
echo -e "Available options are:\nall, $(prepare_component --list | tr ' ' ',' | sed 's/,/, /g')"
read -p "Please enter the component you would like to reset: " component
component=$(echo "$component" | tr '[:upper:]' '[:lower:]')
fi
log d "Resetting component: $component"
prepare_component "reset" "$component"
exit 0
;;
--factory-reset)
prepare_component --factory-reset
exit 0
;;
--test-upgrade)
if [[ "$2" =~ ^.+ ]]; then
echo "You are about to test upgrading RetroDECK from version $2 to $hard_version"
read -p "Enter 'y' to continue, 'n' to start RetroDECK normally: " response
if [[ $response == [yY] ]]; then
version="$2"
logging_level="debug" # Temporarily enable debug logging
shift 2
else
shift
fi
else
echo "Error: Invalid format. Usage: --test-upgrade <version>"
exit 1
fi
;;
--set)
preset="$2"
system="$3"
value="$4"
if [ "$preset" == "cheevos" ]; then
echo "Error: The 'cheevos' preset is not yet supported via CLI. Please use the RetroDECK Configurator."
exit 1
fi
if [ -z "$preset" ]; then
echo "Error: No preset specified. Usage: --set <preset> <system/all> [value] (use --set-help for more information)"
exit 1
fi
make_preset_changes "$preset" "$system" "$value"
exit 0
;;
--open)
open_component "${@:2}"
exit 0
;;
-*)
# Catch-all for unrecognized options starting with a dash
log e "Error: Unknown option '$1'"
echo "Error: Unrecognized option '$1'. Use -h or --help for usage information."
exit 1
;;
*)
# If it reaches here and is an unrecognized argument, report the error
log e "Error: Command or file '$1' not recognized."
echo "Error: Command or file '$1' not recognized. Use -h or --help for usage information."
exit 1
;;
esac
done
# if lockfile exists

File diff suppressed because it is too large Load diff

View file

@ -124,12 +124,12 @@ This option lets you turn on or off automatic updates on launch.
Various troubleshooting options.
### Backup: RetroDECK Userdata
### Backup Userdata
Creates backups of the user data folders
### Check & Verify: Multi-file structure
### Verify Multi-file Structure
Verifies the structure of multi disc/file games that uses `.m3u` files.

View file

@ -28,12 +28,14 @@
"cheevos": {
"duckstation": false,
"pcsx2": false,
"retroarch": false
"retroarch": false,
"ppsspp": false
},
"cheevos_hardcore": {
"duckstation": false,
"pcsx2": false,
"retroarch": false
"retroarch": false,
"ppsspp": false
},
"options": {
"akai_ponzu": false,

View file

@ -6,7 +6,7 @@ func _ready():
add_child(http_request)
http_request.request_completed.connect(_on_request_completed)
_connect_signals()
#%backup_user_button.text += " - " + class_functions.rdhome + "/backup"
#%backup_user_button.text += " - " + class_functions.rdhome + "/backups"
func _connect_signals() -> void:
%check_conn_button.pressed.connect(check_internet_connection)
@ -34,7 +34,7 @@ func _run_backup(button: Button) -> void:
var parameters = ["backup_retrodeck_userdata"]
var run_result = await class_functions.run_thread_command(class_functions.wrapper_command, parameters, true)
if run_result["exit_code"] == 0:
button.text = "Backup Complete - " + class_functions.rdhome + "/backup"
button.text = "Backup Complete - " + class_functions.rdhome + "/backups"
class_functions.logger("d","User Backup Completed")
await class_functions.wait(3.0)
button.text = original_txt

View file

@ -1,5 +1,7 @@
#!/bin/bash
# TODO: is this function still needed?
# This wrapper will run a single RetroDECK function with any number of arguments
# USAGE: /bin/bash retrodeck_function_wrapper.sh <function_name> <arg1> <arg2> ...