Convert /var/config and /var/data paths to XDG environment variables for portability

Also fix a ton of improperly-quoted bash variables
This commit is contained in:
icenine451 2025-03-27 12:52:04 -04:00
parent 79381909a4
commit c8fc7f3f8e
15 changed files with 590 additions and 591 deletions

View file

@ -10,7 +10,7 @@ save_migration() {
# ROMs on SD card # ROMs on SD card
roms_folder="$default_sd/retrodeck/roms" roms_folder="$default_sd/retrodeck/roms"
if [[ ! -L "$rdhome" && ! -L "$rdhome/roms" ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory if [[ ! -L "$rdhome" && ! -L "$rdhome/roms" ]]; then # Add a roms folder symlink back to ~/retrodeck if missing, to fix things like PS2 autosaves until user migrates whole ~retrodeck directory
ln -s $roms_folder "$rdhome/roms" ln -s "$roms_folder" "$rdhome/roms"
fi fi
else else
# ROMs on Internal # ROMs on Internal
@ -31,19 +31,19 @@ save_migration() {
fi fi
# Doing the dir prep as we don't know from which version we came # Doing the dir prep as we don't know from which version we came
dir_prep "$media_folder" "/var/config/ES-DE/downloaded_media" dir_prep "$media_folder" "$XDG_CONFIG_HOME/ES-DE/downloaded_media"
dir_prep "$themes_folder" "/var/config/ES-DE/themes" dir_prep "$themes_folder" "$XDG_CONFIG_HOME/ES-DE/themes"
create_dir "$rdhome/logs" #this was added later, maybe safe to remove in a few versions create_dir "$rdhome/logs" #this was added later, maybe safe to remove in a few versions
# Resetting es_settings, now we need it but in the future I should think a better solution, maybe with sed # Resetting es_settings, now we need it but in the future I should think a better solution, maybe with sed
cp -fv /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml cp -fv "/app/retrodeck/es_settings.xml" "$XDG_CONFIG_HOME/ES-DE/settings/es_settings.xml"
# 0.4 -> 0.5 # 0.4 -> 0.5
# Perform save and state migration if needed # Perform save and state migration if needed
# Moving PCSX2 Saves # Moving PCSX2 Saves
mv -fv /var/config/PCSX2/sstates/* "$rdhome/states/ps2/pcsx2" mv -fv "$XDG_CONFIG_HOME/PCSX2/sstates/"* "$rdhome/states/ps2/pcsx2"
mv -fv /var/config/PCSX2/memcards/* "$rdhome/saves/ps2/memcards" mv -fv "$XDG_CONFIG_HOME/PCSX2/memcards/"* "$rdhome/saves/ps2/memcards"
# Moving Citra saves from legacy location to 0.5.0b structure # Moving Citra saves from legacy location to 0.5.0b structure
@ -52,7 +52,7 @@ save_migration() {
versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves 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 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" 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" 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" state_backup_file="$rdhome/statesbackup_$(date +"%Y_%m_%d_%I_%M_%p").zip"
@ -74,16 +74,16 @@ save_migration() {
current_dest_folder= current_dest_folder=
gamestoskip= gamestoskip=
tar -C "$rdhome" -czf $save_backup_file saves # Backup save directory for safety tar -C "$rdhome" -czf "$save_backup_file" saves # Backup save directory for safety
log i "Saves backed up to" $save_backup_file $migration_logfile log i "Saves backed up to" "$save_backup_file" "$migration_logfile"
tar -C "$rdhome" -czf $state_backup_file states # Backup state directory for safety tar -C "$rdhome" -czf "$state_backup_file" states # Backup state directory for safety
log i "States backed up to" $state_backup_file $migration_logfile log i "States backed up to" "$state_backup_file" "$migration_logfile"
( (
movefile() { # Take matching save and rom files and sort save into appropriate system folder movefile() { # Take matching save and rom files and sort save into appropriate system folder
echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar echo "# $filesleft $currentlybeingmoved remaining..." # These lines update the Zenity progress bar
progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" ))) progress=$(( 100 - (( 100 / "$totalfiles" ) * "$filesleft" )))
echo $progress echo "$progress"
filesleft=$((filesleft-1)) filesleft=$((filesleft-1))
if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually if [[ ! " ${gamestoskip[*]} " =~ " ${1} " ]]; then # If the current game name exists multiple times in array ie. /roms/snes/Mortal Kombat 3.zip and /roms/genesis/Mortal Kombat 3.zip, skip and alert user to sort manually
game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder game=$(sed -e "s/\^/ /g" <<< "$1") # Remove whitespace placeholder
@ -91,59 +91,59 @@ save_migration() {
systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to systemdir="$(basename "$(dirname "$1")")" # Extract parent directory identifying system ROM belongs to
matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found matches=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -name "$gamebasename"".*" | sed -e 's/ /^/g' | sed -e 's/\..*//')) # Search for multiple instances of pure game name, adding to skip list if found
if [[ ${#matches[@]} -gt 1 ]]; then if [[ ${#matches[@]} -gt 1 ]]; then
echo "ERROR: Multiple ROMS found with name:" $gamebasename "Please sort saves and states for these ROMS manually" >> $migration_logfile echo "ERROR: Multiple ROMS found with name: $gamebasename Please sort saves and states for these ROMS manually" >> "$migration_logfile"
gamestoskip+=("$1") gamestoskip+=("$1")
return return
fi fi
log i "Examining ROM file:" "$game" $migration_logfile log i "Examining ROM file:" "$game" "$migration_logfile"
log i "System detected as" $systemdir $migration_logfile log i "System detected as" "$systemdir" "$migration_logfile"
sosfile=$(sed -e "s/\^/ /g" <<< "$2") # Remove whitespace placeholder from s-ave o-r s-tate file sosfile=$(sed -e "s/\^/ /g" <<< "$2") # Remove whitespace placeholder from s-ave o-r s-tate file
sospurebasename="$(basename "$sosfile")" # Extract pure file name ie. /saves/game1.sav becomes game1 sospurebasename="$(basename "$sosfile")" # Extract pure file name ie. /saves/game1.sav becomes game1
log i "Current save or state being examined for match:" $sosfile $migration_logfile log i "Current save or state being examined for match:" "$sosfile" "$migration_logfile"
log i "Matching save or state" $sosfile "and game" $game "found." $migration_logfile log i "Matching save or state $sosfile and game $game found." "$migration_logfile"
log i "Moving save or state to $current_dest_folder/$systemdir/$sosbasename" $migration_logfile log i "Moving save or state to $current_dest_folder/$systemdir/$sosbasename" "$migration_logfile"
if [[ ! -d $current_dest_folder"/"$systemdir ]]; then # If system directory doesn't exist for save yet, create it if [[ ! -d $current_dest_folder"/"$systemdir ]]; then # If system directory doesn't exist for save yet, create it
log w "Creating missing system directory $current_dest_folder/$systemdir" log w "Creating missing system directory $current_dest_folder/$systemdir"
mkdir $current_dest_folder/$systemdir mkdir "$current_dest_folder/$systemdir"
fi fi
mv "$sosfile" -t $current_dest_folder/$systemdir # Move save to appropriate system directory mv "$sosfile" -t "$current_dest_folder/$systemdir" # Move save to appropriate system directory
return return
else else
local name="$(basename "$1" | sed -e "s/\^/ /g")" local name="$(basename "$1" | sed -e "s/\^/ /g")"
log w "Game with name \"$name\" already found. Skipping to next game..." $migration_logfile # Inform user of game being skipped due to duplicate ROM names log w "Game with name \"$name\" already found. Skipping to next game..." "$migration_logfile" # Inform user of game being skipped due to duplicate ROM names
fi fi
} }
find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> $migration_logfile # Warn user if any of their files have the whitespace replacement character used by the script find "$roms_folder" -mindepth 2 -maxdepth 2 -name "*\^*" -exec echo "ERROR: Game named" {} "found, please move save manually" \; >> "$migration_logfile" # Warn user if any of their files have the whitespace replacement character used by the script
totalfiles=$totalsaves #set variables for save file migration totalfiles="$totalsaves" #set variables for save file migration
filesleft=$totalsaves filesleft="$totalsaves"
currentlybeingmoved="saves" currentlybeingmoved="saves"
current_dest_folder=$saves_folder current_dest_folder="$saves_folder"
for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match for i in "${allsaves[@]}"; do # For each save file, compare to every ROM file name looking for a match
found= found=
currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1 currentsave=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /saves/game1.sav becomes game1
for j in "${allgames[@]}"; do for j in "${allgames[@]}"; do
currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1
[[ $currentgame == $currentsave ]] && { found=1; break; } # If names match move to next stage, otherwise skip [[ "$currentgame" == "$currentsave" ]] && { found=1; break; } # If names match move to next stage, otherwise skip
done done
[[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for save file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded save file [[ -n "$found" ]] && movefile "$j" "$i" || echo "ERROR: No ROM match found for save file" "$i" | sed -e 's/\^/ /g' >> "$migration_logfile" # If a match is found, run movefile() otherwise warn user of stranded save file
done done
totalfiles=$totalstates #set variables for state file migration totalfiles="$totalstates" #set variables for state file migration
filesleft=$totalstates filesleft="$totalstates"
currentlybeingmoved="states" currentlybeingmoved="states"
current_dest_folder=$states_folder current_dest_folder="$states_folder"
for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match for i in "${allstates[@]}"; do # For each state file, compare to every ROM file name looking for a match
found= found=
currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1 currentstate=($(basename "$i" | sed -e 's/\..*//')) # Extract pure file name ie. /states/game1.sav becomes game1
for j in "${allgames[@]}"; do for j in "${allgames[@]}"; do
currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1 currentgame=($(basename "$j" | sed -e 's/\..*//')) # Extract pure file name ie. /roms/snes/game1.zip becomes game1
[[ $currentgame == $currentstate ]] && { found=1; break; } # If names match move to next stage, otherwise skip [[ "$currentgame" == "$currentstate" ]] && { found=1; break; } # If names match move to next stage, otherwise skip
done done
[[ -n $found ]] && movefile $j $i || echo "ERROR: No ROM match found for state file" $i | sed -e 's/\^/ /g' >> $migration_logfile # If a match is found, run movefile() otherwise warn user of stranded state file [[ -n "$found" ]] && movefile "$j" "$i" || echo "ERROR: No ROM match found for state file" "$i" | sed -e 's/\^/ /g' >> "$migration_logfile" # If a match is found, run movefile() otherwise warn user of stranded state file
done done
) | ) |
@ -156,18 +156,18 @@ save_migration() {
--no-cancel \ --no-cancel \
--auto-close --auto-close
if [[ $(cat $migration_logfile | grep "ERROR" | wc -l) -eq 0 ]]; then if [[ $(cat "$migration_logfile" | grep "ERROR" | wc -l) -eq 0 ]]; then
rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \ --title "RetroDECK" \
--text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord." --text="The migration process has sorted all of your files automatically.\n\nEverything should be working normally, if you experience any issues please check the RetroDECK wiki or contact us directly on the Discord."
else else
cat $migration_logfile | grep "ERROR" > "$rdhome/manual_sort_needed.log" cat "$migration_logfile" | grep "ERROR" > "$rdhome/manual_sort_needed.log"
rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \ rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \ --title "RetroDECK" \
--text="The migration process was unable to sort $(cat $migration_logfile | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log" --text="The migration process was unable to sort $(cat "$migration_logfile" | grep "ERROR" | wc -l) files automatically.\n\nThese files will need to be moved manually to their new locations, find more detail on the RetroDECK wiki.\n\nA log of the files that need manual sorting can be found at $rdhome/manual_sort_needed.log"
fi fi
else else

View file

@ -4,11 +4,11 @@ check_network_connectivity() {
# This function will do a basic check for network availability and return "true" if it is working. # This function will do a basic check for network availability and return "true" if it is working.
# USAGE: if [[ $(check_network_connectivity) == "true" ]]; then # USAGE: if [[ $(check_network_connectivity) == "true" ]]; then
if [[ ! -z $(wget --spider -t 1 $remote_network_target_1 | grep "HTTP response 200") ]]; then if [[ ! -z $(wget --spider -t 1 "$remote_network_target_1" | grep "HTTP response 200") ]]; then
local network_connected="true" local network_connected="true"
elif [[ ! -z $(wget --spider -t 1 $remote_network_target_2 | grep "HTTP response 200") ]]; then elif [[ ! -z $(wget --spider -t 1 "$remote_network_target_2" | grep "HTTP response 200") ]]; then
local network_connected="true" local network_connected="true"
elif [[ ! -z $(wget --spider -t 1 $remote_network_target_3 | grep "HTTP response 200") ]]; then elif [[ ! -z $(wget --spider -t 1 "$remote_network_target_3" | grep "HTTP response 200") ]]; then
local network_connected="true" local network_connected="true"
else else
local network_connected="false" local network_connected="false"
@ -21,7 +21,7 @@ check_desktop_mode() {
# This function will do a basic check of if we are running in Steam Deck game mode or not, and return "true" if we are outside of game mode # This function will do a basic check of if we are running in Steam Deck game mode or not, and return "true" if we are outside of game mode
# USAGE: if [[ $(check_desktop_mode) == "true" ]]; then # USAGE: if [[ $(check_desktop_mode) == "true" ]]; then
if [[ ! $XDG_CURRENT_DESKTOP == "gamescope" ]]; then if [[ ! "$XDG_CURRENT_DESKTOP" == "gamescope" ]]; then
echo "true" echo "true"
else else
echo "false" echo "false"
@ -32,7 +32,7 @@ check_is_steam_deck() {
# This function will check the internal product ID for the Steam Deck codename and return "true" if RetroDECK is running on a real Deck # This function will check the internal product ID for the Steam Deck codename and return "true" if RetroDECK is running on a real Deck
# USAGE: if [[ $(check_is_steam_deck) == "true" ]]; then # USAGE: if [[ $(check_is_steam_deck) == "true" ]]; then
if [[ $(cat /sys/devices/virtual/dmi/id/product_name) =~ ^(Jupiter|Galileo)$ ]]; then if [[ $(cat "/sys/devices/virtual/dmi/id/product_name") =~ ^(Jupiter|Galileo)$ ]]; then
echo "true" echo "true"
else else
echo "false" echo "false"
@ -58,7 +58,7 @@ check_for_version_update() {
fi fi
if [[ ! "$update_ignore" == "$online_version" ]]; then 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 if [[ "$update_repo" == "RetroDECK" ]] && [[ $(sed -e 's/[\.a-z]//g' <<< "$version") -le $(sed -e 's/[\.a-z]//g' <<< "$online_version") ]]; then
choice=$(rd_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" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK - New Update Available" \ --title "RetroDECK - New Update Available" \
@ -66,7 +66,7 @@ check_for_version_update() {
rc=$? # Capture return code, as "OK" button has no text value rc=$? # Capture return code, as "OK" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "OK" was clicked if [[ $rc == "1" ]]; then # If any button other than "OK" was clicked
log i "Selected: \"OK\"" log i "Selected: \"OK\""
set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks set_setting_value "$rd_conf" "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks
fi fi
elif [[ "$update_repo" == "$cooker_repository_name" ]] && [[ ! $version == $online_version ]]; then elif [[ "$update_repo" == "$cooker_repository_name" ]] && [[ ! $version == $online_version ]]; then
log i "Showing update request dialog as \"$online_version\" was found and is greater then \"$version\"" log i "Showing update request dialog as \"$online_version\" was found and is greater then \"$version\""
@ -78,10 +78,10 @@ check_for_version_update() {
if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked
if [[ $choice == "Ignore this version" ]]; then if [[ $choice == "Ignore this version" ]]; then
log i "\"Ignore this version\" selected, updating \"$rd_conf\"" log i "\"Ignore this version\" selected, updating \"$rd_conf\""
set_setting_value $rd_conf "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks. set_setting_value "$rd_conf" "update_ignore" "$online_version" retrodeck "options" # Store version to ignore for future checks.
fi fi
else # User clicked "Yes" else # User clicked "Yes"
install_release $online_version install_release "$online_version"
fi fi
fi fi
fi fi
@ -93,13 +93,13 @@ check_for_version_update() {
validate_input() { validate_input() {
while IFS="^" read -r input action || [[ -n "$input" ]]; while IFS="^" read -r input action || [[ -n "$input" ]];
do do
if [[ ! $input == "#"* ]] && [[ ! -z "$input" ]]; then if [[ ! "$input" == "#"* ]] && [[ ! -z "$input" ]]; then
if [[ "$input" == "$1" ]]; then if [[ "$input" == "$1" ]]; then
eval "$action" eval "$action"
input_validated="true" input_validated="true"
fi fi
fi fi
done < $input_validation done < "$input_validation"
} }
check_version_is_older_than() { check_version_is_older_than() {
@ -135,7 +135,7 @@ fi
# Perform post_update commands for current version if it is a cooker or PR # Perform post_update commands for current version if it is a cooker or PR
if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR" <<< "$hard_version"; then if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR" <<< "$hard_version"; then
# If newly-installed version is a "cooker" or "PR" build, always perform post_update commands for current version # If newly-installed version is a "cooker" or "PR" build, always perform post_update commands for current version
if [[ "$(echo $hard_version | cut -d'-' -f2)" == "$new_version" ]]; then if [[ "$(echo "$hard_version" | cut -d'-' -f2)" == "$new_version" ]]; then
is_newer_version="true" is_newer_version="true"
fi fi
fi fi

View file

@ -63,10 +63,10 @@ find_compatible_compression_format() {
local system=$(echo "$1" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") local system=$(echo "$1" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$")
# Extract the relevant lists from the JSON file # Extract the relevant lists from the JSON file
local chd_systems=$(jq -r '.compression_targets.chd[]' $features) local chd_systems=$(jq -r '.compression_targets.chd[]' "$features")
local rvz_systems=$(jq -r '.compression_targets.rvz[]' $features) local rvz_systems=$(jq -r '.compression_targets.rvz[]' "$features")
local zip_systems=$(jq -r '.compression_targets.zip[]' $features) local zip_systems=$(jq -r '.compression_targets.zip[]' "$features")
local zip_compressable_extensions=$(jq -r '.zip_compressable_extensions[]' $features) local zip_compressable_extensions=$(jq -r '.zip_compressable_extensions[]' "$features")
if [[ $(validate_for_chd "$1") == "true" ]] && echo "$chd_systems" | grep -q "\b$system\b"; then if [[ $(validate_for_chd "$1") == "true" ]] && echo "$chd_systems" | grep -q "\b$system\b"; then
echo "chd" echo "chd"
@ -259,9 +259,9 @@ cli_compress_all_games() {
local compressable_game="" local compressable_game=""
local all_compressable_games=() local all_compressable_games=()
if [[ $compression_format == "all" ]]; then if [[ $compression_format == "all" ]]; then
local compressible_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' $features) local compressible_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' "$features")
else else
local compressible_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' $features) local compressible_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' "$features")
fi 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 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

@ -51,13 +51,13 @@ find_empty_rom_folders() {
} }
configurator_check_multifile_game_structure() { configurator_check_multifile_game_structure() {
local folder_games=($(find $roms_folder -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3")) local folder_games=($(find "$roms_folder" -maxdepth 2 -mindepth 2 -type d ! -name "*.m3u" ! -name "*.ps3"))
if [[ ${#folder_games[@]} -gt 1 ]]; then 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" 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 \ rd_zenity --icon-name=net.retrodeck.retrodeck --info --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Configurator - Verify Multi-file Structure" \ --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" --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 else
configurator_generic_dialog "RetroDECK Configurator - Verify Multi-file Structure" "No incorrect multi-file game folder structures found." configurator_generic_dialog "RetroDECK Configurator - Verify Multi-file Structure" "No incorrect multi-file game folder structures found."
fi fi

View file

@ -65,7 +65,7 @@ configurator_destination_choice_dialog() {
if [[ $rc == "0" ]] && [[ -z "$choice" ]]; then if [[ $rc == "0" ]] && [[ -z "$choice" ]]; then
echo "Back" echo "Back"
else else
echo $choice echo "$choice"
fi fi
} }
@ -88,7 +88,7 @@ configurator_move_folder_dialog() {
# USAGE: configurator_move_folder_dialog "folder_variable_name" # USAGE: configurator_move_folder_dialog "folder_variable_name"
local rd_dir_name="$1" # The folder variable name from retrodeck.cfg local rd_dir_name="$1" # The folder variable name from retrodeck.cfg
local dir_to_move="$(get_setting_value "$rd_conf" "$rd_dir_name" "retrodeck" "paths")/" # The path of that folder variable local dir_to_move="$(get_setting_value "$rd_conf" "$rd_dir_name" "retrodeck" "paths")/" # The path of that folder variable
local source_root="$(echo $dir_to_move | sed -e 's/\(.*\)\/retrodeck\/.*/\1/')" # The root path of the folder, excluding retrodeck/<folder name>. So /home/deck/retrodeck/roms becomes /home/deck local source_root="$(echo "$dir_to_move" | sed -e 's/\(.*\)\/retrodeck\/.*/\1/')" # The root path of the folder, excluding retrodeck/<folder name>. So /home/deck/retrodeck/roms becomes /home/deck
if [[ ! "$rd_dir_name" == "rdhome" ]]; then # If a sub-folder is being moved, find it's path without the source_root. So /home/deck/retrodeck/roms becomes retrodeck/roms if [[ ! "$rd_dir_name" == "rdhome" ]]; then # If a sub-folder is being moved, find it's path without the source_root. So /home/deck/retrodeck/roms becomes retrodeck/roms
local rd_dir_path="$(echo "$dir_to_move" | sed "s/.*\(retrodeck\/.*\)/\1/; s/\/$//")" local rd_dir_path="$(echo "$dir_to_move" | sed "s/.*\(retrodeck\/.*\)/\1/; s/\/$//")"
else # Otherwise just set the retrodeck root folder else # Otherwise just set the retrodeck root folder
@ -114,7 +114,7 @@ configurator_move_folder_dialog() {
configurator_generic_dialog "RetroDECK Configurator - Move Folder" "The $(basename "$dir_to_move") folder is already at that location, please pick a new one." configurator_generic_dialog "RetroDECK Configurator - Move Folder" "The $(basename "$dir_to_move") folder is already at that location, please pick a new one."
configurator_move_folder_dialog "$rd_dir_name" configurator_move_folder_dialog "$rd_dir_name"
else else
if [[ $(verify_space "$(echo $dir_to_move | sed 's/\/$//')" "$dest_root") ]]; then # Make sure there is enough space at the destination if [[ $(verify_space "$(echo "$dir_to_move" | sed 's/\/$//')" "$dest_root") ]]; then # Make sure there is enough space at the destination
configurator_generic_dialog "RetroDECK Configurator - Move Folder" "Moving $(basename "$dir_to_move") folder to $choice" configurator_generic_dialog "RetroDECK Configurator - Move Folder" "Moving $(basename "$dir_to_move") folder to $choice"
unlink "$dest_root/$rd_dir_path" # In case there is already a symlink at the picked destination unlink "$dest_root/$rd_dir_path" # In case there is already a symlink at the picked destination
move "$dir_to_move" "$dest_root/$rd_dir_path" move "$dir_to_move" "$dest_root/$rd_dir_path"
@ -168,28 +168,28 @@ changelog_dialog() {
log d "Showing changelog dialog" log d "Showing changelog dialog"
if [[ "$1" == "all" ]]; then if [[ "$1" == "all" ]]; then
> "/var/config/retrodeck/changelog-full.xml" > "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
for release in $(xml sel -t -m "//component/releases/release" -v "@version" -n $rd_metainfo); do for release in $(xml sel -t -m "//component/releases/release" -v "@version" -n "$rd_metainfo"); do
echo "<h1>RetroDECK v$release</h1>" >> "/var/config/retrodeck/changelog-full.xml" echo "<h1>RetroDECK v$release</h1>" >> "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
xml sel -t -m "//component/releases/release[@version='$release']/description" -c . $rd_metainfo | tr -s '\n' | sed 's/^\s*//' >> "/var/config/retrodeck/changelog-full.xml" xml sel -t -m "//component/releases/release[@version='"$release"']/description" -c . "$rd_metainfo" | tr -s '\n' | sed 's/^\s*//' >> "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
echo "" >> "/var/config/retrodeck/changelog-full.xml" echo "" >> "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
done done
#convert_to_markdown "/var/config/retrodeck/changelog-full.xml" #convert_to_markdown "$XDG_CONFIG_HOME/retrodeck/changelog-full.xml"
rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \ rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Changelogs" \ --title "RetroDECK Changelogs" \
--filename="/var/config/retrodeck/changelog-full.xml.md" --filename="$XDG_CONFIG_HOME/retrodeck/changelog-full.xml.md"
else else
xml sel -t -m "//component/releases/release[@version='$1']/description" -c . $rd_metainfo | tr -s '\n' | sed 's/^\s*//' > "/var/config/retrodeck/changelog.xml" xml sel -t -m "//component/releases/release[@version='"$1"']/description" -c . "$rd_metainfo" | tr -s '\n' | sed 's/^\s*//' > "$XDG_CONFIG_HOME/retrodeck/changelog.xml"
convert_to_markdown "/var/config/retrodeck/changelog.xml" convert_to_markdown "$XDG_CONFIG_HOME/retrodeck/changelog.xml"
rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \ rd_zenity --icon-name=net.retrodeck.retrodeck --text-info --width=1200 --height=720 \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK Changelogs" \ --title "RetroDECK Changelogs" \
--filename="/var/config/retrodeck/changelog.xml.md" --filename="$XDG_CONFIG_HOME/retrodeck/changelog.xml.md"
fi fi
} }
@ -204,9 +204,9 @@ get_cheevos_token_dialog() {
--add-password="Password") --add-password="Password")
IFS='^' read -r cheevos_username cheevos_password < <(printf '%s\n' "$cheevos_info") IFS='^' read -r cheevos_username cheevos_password < <(printf '%s\n' "$cheevos_info")
local cheevos_response=$(curl --silent --data "r=login&u=$cheevos_username&p=$cheevos_password" $RA_API_URL) local cheevos_response=$(curl --silent --data "r=login&u=$cheevos_username&p=$cheevos_password" "$RA_API_URL")
local cheevos_success=$(echo $cheevos_response | jq .Success | tr -d '"') local cheevos_success=$(echo "$cheevos_response" | jq .Success | tr -d '"')
local cheevos_token=$(echo $cheevos_response | jq .Token | tr -d '"') local cheevos_token=$(echo "$cheevos_response" | jq .Token | tr -d '"')
local cheevos_login_timestamp=$(date +%s) local cheevos_login_timestamp=$(date +%s)
if [[ "$cheevos_success" == "true" ]]; then if [[ "$cheevos_success" == "true" ]]; then
echo "$cheevos_username,$cheevos_token,$cheevos_login_timestamp" echo "$cheevos_username,$cheevos_token,$cheevos_login_timestamp"
@ -235,7 +235,7 @@ desktop_mode_warning() {
exit 1 exit 1
elif [[ $choice == "Never show this again" ]]; then elif [[ $choice == "Never show this again" ]]; then
log i "Selected: \"Never show this again\"" log i "Selected: \"Never show this again\""
set_setting_value $rd_conf "desktop_mode_warning" "false" retrodeck "options" # Store desktop mode warning variable for future checks set_setting_value "$rd_conf" "desktop_mode_warning" "false" retrodeck "options" # Store desktop mode warning variable for future checks
fi fi
else else
log i "Selected: \"Yes\"" log i "Selected: \"Yes\""
@ -258,7 +258,7 @@ low_space_warning() {
--text="$message") --text="$message")
if [[ $choice == "Never show this again" ]]; then if [[ $choice == "Never show this again" ]]; then
log i "Selected: \"Never show this again\"" log i "Selected: \"Never show this again\""
set_setting_value $rd_conf "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks set_setting_value "$rd_conf" "low_space_warning" "false" retrodeck "options" # Store low space warning variable for future checks
fi fi
fi fi
log i "Selected: \"OK\"" log i "Selected: \"OK\""

View file

@ -141,7 +141,7 @@ get_setting_value() {
"dolphin" | "duckstation" | "pcsx2" | "ppsspp" | "primehack" | "xemu" ) # For files with this syntax - setting_name = setting_value "dolphin" | "duckstation" | "pcsx2" | "ppsspp" | "primehack" | "xemu" ) # For files with this syntax - setting_name = setting_value
if [[ -z $current_section_name ]]; then if [[ -z $current_section_name ]]; then
echo $(grep -o -P "(?<=^$current_setting_name = ).*" $1) echo $(grep -o -P "(?<=^$current_setting_name = ).*" "$1")
else else
sed -n -E '\^\['"$current_section_name"'\]^,\^\^'"$current_setting_name"'|\[^{ \^\['"$current_section_name"'\]^! { \^\^'"$current_setting_name"'^ p } }' "$1" | grep -o -P "(?<=^$current_setting_name = ).*" sed -n -E '\^\['"$current_section_name"'\]^,\^\^'"$current_setting_name"'|\[^{ \^\['"$current_section_name"'\]^! { \^\^'"$current_setting_name"'^ p } }' "$1" | grep -o -P "(?<=^$current_setting_name = ).*"
fi fi
@ -337,7 +337,7 @@ generate_single_patch() {
current_setting_name=$(get_setting_name "$escaped_setting_line" "$system") current_setting_name=$(get_setting_name "$escaped_setting_line" "$system")
if [[ (-z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'$^ p } }' "$modified_file")) ]]; then # If the same setting line is not found in the same section of the modified file... if [[ (-z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$(sed -E 's/^[ \t]*//;' <<< "$escaped_setting_line")"'$^ p } }' "$modified_file")) ]]; then # If the same setting line is not found in the same section of the modified file...
if [[ ! -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'\s*?[:=]^ p } }' "$modified_file") ]]; then # But the setting exists in that section, only with a different value... if [[ ! -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'\s*?[:=]^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'\s*?[:=]^ p } }' "$modified_file") ]]; then # But the setting exists in that section, only with a different value...
new_setting_value=$(get_setting_value "$2" "$current_setting_name" "$system" $current_section) new_setting_value=$(get_setting_value "$2" "$current_setting_name" "$system" "$current_section")
action="change" action="change"
echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file" echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file"
fi fi
@ -356,7 +356,7 @@ generate_single_patch() {
if [[ (-z $(sed -n -E '\^\s*?\b'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'$^p' "$modified_file")) ]]; then # If the same setting line is not found in the modified file... if [[ (-z $(sed -n -E '\^\s*?\b'"$(sed -E 's/^[ \t]*//' <<< "$escaped_setting_line")"'$^p' "$modified_file")) ]]; then # If the same setting line is not found in the modified file...
current_setting_name=$(get_setting_name "$escaped_setting_line" "$system") current_setting_name=$(get_setting_name "$escaped_setting_line" "$system")
if [[ ! -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' "$modified_file") ]]; then # But the setting exists, only with a different value... if [[ ! -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' "$modified_file") ]]; then # But the setting exists, only with a different value...
new_setting_value=$(get_setting_value $2 "$current_setting_name" "$system") new_setting_value=$(get_setting_value "$2" "$current_setting_name" "$system")
action="change" action="change"
echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file" echo $action"^"$current_section"^"$(sed -e 's%\\\\%\\%g' <<< "$current_setting_name")"^"$new_setting_value"^"$system >> "$patch_file"
fi fi
@ -381,22 +381,22 @@ generate_single_patch() {
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") || ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # Capture section header lines if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") || ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # Capture section header lines
if [[ $current_setting_line =~ ^\[.+\] ]]; then # If normal section line if [[ $current_setting_line =~ ^\[.+\] ]]; then # If normal section line
action="section" action="section"
current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
elif [[ ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # If RPCS3 section name elif [[ ! -z $(grep -o -P "^\b.+?:$" <<< "$current_setting_line") ]]; then # If RPCS3 section name
action="section" action="section"
current_section=$(sed 's^:$^^' <<< $current_setting_line) # Remove colon from section name current_section=$(sed 's^:$^^' <<< "$current_setting_line") # Remove colon from section name
fi fi
elif [[ (! -z $current_section) ]]; then elif [[ (! -z $current_section) ]]; then
current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") current_setting_name=$(get_setting_name "$escaped_setting_line" "$4")
if [[ -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^p } }' $1 ) ]]; then # If setting name is not found in this section of the original file... if [[ -z $(sed -n -E '\^\['"$current_section"'\]|\b'"$current_section"':$^,\^\b'"$current_setting_name"'.*^{ \^\['"$current_section"'\]|\b'"$current_section"':$^! { \^\b'"$current_setting_name"'^p } }' "$1" ) ]]; then # If setting name is not found in this section of the original file...
action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end. action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end.
echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> $3 echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> "$3"
fi fi
elif [[ (-z $current_section) ]]; then elif [[ (-z $current_section) ]]; then
current_setting_name=$(get_setting_name "$escaped_setting_line" "$4") current_setting_name=$(get_setting_name "$escaped_setting_line" "$4")
if [[ -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' $1) ]]; then # If setting name is not found in the original file... if [[ -z $(sed -n -E '\^\s*?\b'"$current_setting_name"'\s*?[:=]^p' "$1") ]]; then # If setting name is not found in the original file...
action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end. action="add_setting_line" # TODO: This should include the previous line, so that new lines can be inserted in the correct place rather than at the end.
echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> $3 echo $action"^"$current_section"^"$current_setting_line"^^"$4 >> "$3"
fi fi
fi fi
fi fi
@ -562,4 +562,4 @@ populate_steamuser_srm(){
) )
' "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json" > "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json.tmp" && ' "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json" > "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json.tmp" &&
mv "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json.tmp" "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json" mv "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json.tmp" "$XDG_CONFIG_HOME/steam-rom-manager/userData/userConfigurations.json"
} }

View file

@ -7,7 +7,7 @@
# export LD_LIBRARY_PATH="/app/retrodeck/lib:/app/retrodeck/lib/debug:/app/retrodeck/lib/pkgconfig:$LD_LIBRARY_PATH" # export LD_LIBRARY_PATH="/app/retrodeck/lib:/app/retrodeck/lib/debug:/app/retrodeck/lib/pkgconfig:$LD_LIBRARY_PATH"
: "${logging_level:=info}" # Initializing the log level variable if not already valued, this will be actually red later from the config file : "${logging_level:=info}" # Initializing the log level variable if not already valued, this will be actually red later from the config file
rd_logs_folder="/var/config/retrodeck/logs" # Static location to write all RetroDECK-related logs rd_logs_folder="$XDG_CONFIG_HOME/retrodeck/logs" # Static location to write all RetroDECK-related logs
if [ -h "$rd_logs_folder" ]; then # Check if internal logging folder is already a symlink if [ -h "$rd_logs_folder" ]; then # Check if internal logging folder is already a symlink
if [ ! -e "$rd_logs_folder" ]; then # Check if internal logging folder symlink is broken if [ ! -e "$rd_logs_folder" ]; then # Check if internal logging folder symlink is broken
unlink "$rd_logs_folder" # Remove broken symlink so the folder is recreated when sourcing logger.sh unlink "$rd_logs_folder" # Remove broken symlink so the folder is recreated when sourcing logger.sh
@ -55,21 +55,21 @@ source /app/libexec/run_game.sh
source /app/libexec/steam_sync.sh source /app/libexec/steam_sync.sh
# Static variables # Static variables
rd_conf="/var/config/retrodeck/retrodeck.cfg" # RetroDECK config file path rd_conf="$XDG_CONFIG_HOME/retrodeck/retrodeck.cfg" # RetroDECK config file path
rd_conf_backup="/var/config/retrodeck/retrodeck.bak" # Backup of RetroDECK config file from update rd_conf_backup="$XDG_CONFIG_HOME/retrodeck/retrodeck.bak" # Backup of RetroDECK config file from update
config="/app/retrodeck/config" # folder with all the default emulator configs config="/app/retrodeck/config" # folder with all the default emulator configs
rd_defaults="$config/retrodeck/retrodeck.cfg" # A default RetroDECK config file rd_defaults="$config/retrodeck/retrodeck.cfg" # A default RetroDECK config file
rd_update_patch="/var/config/retrodeck/rd_update.patch" # A static location for the temporary patch file used during retrodeck.cfg updates rd_update_patch="$XDG_CONFIG_HOME/retrodeck/rd_update.patch" # A static location for the temporary patch file used during retrodeck.cfg updates
bios_checklist="$config/retrodeck/reference_lists/bios.json" # A config file listing BIOS file information that can be verified bios_checklist="$config/retrodeck/reference_lists/bios.json" # A config file listing BIOS file information that can be verified
input_validation="$config/retrodeck/reference_lists/input_validation.cfg" # A config file listing valid CLI inputs input_validation="$config/retrodeck/reference_lists/input_validation.cfg" # A config file listing valid CLI inputs
finit_options_list="$config/retrodeck/reference_lists/finit_options_list.cfg" # A config file listing available optional installs during finit finit_options_list="$config/retrodeck/reference_lists/finit_options_list.cfg" # A config file listing available optional installs during finit
splashscreen_dir="/var/config/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens splashscreen_dir="$XDG_CONFIG_HOME/ES-DE/resources/graphics/extra_splashes" # The default location of extra splash screens
current_splash_file="/var/config/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot current_splash_file="$XDG_CONFIG_HOME/ES-DE/resources/graphics/splash.svg" # The active splash file that will be shown on boot
default_splash_file="/var/config/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen default_splash_file="$XDG_CONFIG_HOME/ES-DE/resources/graphics/splash-orig.svg" # The default RetroDECK splash screen
# TODO: instead of this maybe we can iterate the features.json # TODO: instead of this maybe we can iterate the features.json
multi_user_emulator_config_dirs="$config/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg" # A list of emulator config folders that can be safely linked/unlinked entirely in multi-user mode multi_user_emulator_config_dirs="$config/retrodeck/reference_lists/multi_user_emulator_config_dirs.cfg" # A list of emulator config folders that can be safely linked/unlinked entirely in multi-user mode
rd_es_themes="/app/share/es-de/themes" # The directory where themes packaged with RetroDECK are stored rd_es_themes="/app/share/es-de/themes" # The directory where themes packaged with RetroDECK are stored
lockfile="/var/config/retrodeck/.lock" # Where the lockfile is located lockfile="$XDG_CONFIG_HOME/retrodeck/.lock" # Where the lockfile is located
default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path default_sd="/run/media/mmcblk0p1" # Steam Deck SD default path
hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem) hard_version="$(cat '/app/retrodeck/version')" # hardcoded version (in the readonly filesystem)
rd_repo="https://github.com/RetroDECK/RetroDECK" # The URL of the main RetroDECK GitHub repo rd_repo="https://github.com/RetroDECK/RetroDECK" # The URL of the main RetroDECK GitHub repo
@ -91,84 +91,84 @@ es_find_rules="/app/share/es-de/resources/systems/linux/es_find_rules.xml"
# Godot data transfer temp files # Godot data transfer temp files
godot_bios_files_checked="/var/config/retrodeck/godot/godot_bios_files_checked.tmp" godot_bios_files_checked="$XDG_CONFIG_HOME/retrodeck/godot/godot_bios_files_checked.tmp"
godot_current_preset_settings="/var/config/retrodeck/godot/godot_current_preset_settings.tmp" godot_current_preset_settings="$XDG_CONFIG_HOME/retrodeck/godot/godot_current_preset_settings.tmp"
godot_compression_compatible_games="/var/config/retrodeck/godot/godot_compression_compatible_games.tmp" godot_compression_compatible_games="$XDG_CONFIG_HOME/retrodeck/godot/godot_compression_compatible_games.tmp"
godot_empty_roms_folders="/var/config/retrodeck/godot/godot_empty_roms_folders.tmp" godot_empty_roms_folders="$XDG_CONFIG_HOME/retrodeck/godot/godot_empty_roms_folders.tmp"
# Config files for emulators with single config files # Config files for emulators with single config files
duckstationconf="/var/config/duckstation/settings.ini" duckstationconf="$XDG_CONFIG_HOME/duckstation/settings.ini"
melondsconf="/var/config/melonDS/melonDS.ini" melondsconf="$XDG_CONFIG_HOME/melonDS/melonDS.ini"
ryujinxconf="/var/config/Ryujinx/Config.json" ryujinxconf="$XDG_CONFIG_HOME/Ryujinx/Config.json"
xemuconf="/var/config/xemu/xemu.toml" xemuconf="$XDG_CONFIG_HOME/xemu/xemu.toml"
yuzuconf="/var/config/yuzu/qt-config.ini" yuzuconf="$XDG_CONFIG_HOME/yuzu/qt-config.ini"
citraconf="/var/config/citra-emu/qt-config.ini" citraconf="$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
# ES-DE config files # ES-DE config files
export ESDE_APPDATA_DIR="/var/config/ES-DE" export ESDE_APPDATA_DIR="$XDG_CONFIG_HOME/ES-DE"
es_settings="/var/config/ES-DE/settings/es_settings.xml" es_settings="$XDG_CONFIG_HOME/ES-DE/settings/es_settings.xml"
es_source_logs="/var/config/ES-DE/logs" es_source_logs="$XDG_CONFIG_HOME/ES-DE/logs"
# RetroArch config files # RetroArch config files
raconf="/var/config/retroarch/retroarch.cfg" raconf="$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
ra_core_conf="/var/config/retroarch/retroarch-core-options.cfg" ra_core_conf="$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
ra_scummvm_conf="/var/config/retroarch/system/scummvm.ini" ra_scummvm_conf="$XDG_CONFIG_HOME/retroarch/system/scummvm.ini"
ra_cores_path="/var/config/retroarch/cores" ra_cores_path="$XDG_CONFIG_HOME/retroarch/cores"
# CEMU config files # CEMU config files
cemuconf="/var/config/Cemu/settings.xml" cemuconf="$XDG_CONFIG_HOME/Cemu/settings.xml"
cemucontrollerconf="/var/config/Cemu/controllerProfiles/controller0.xml" cemucontrollerconf="$XDG_CONFIG_HOME/Cemu/controllerProfiles/controller0.xml"
# Dolphin config files # Dolphin config files
dolphinconf="/var/config/dolphin-emu/Dolphin.ini" dolphinconf="$XDG_CONFIG_HOME/dolphin-emu/Dolphin.ini"
dolphingcpadconf="/var/config/dolphin-emu/GCPadNew.ini" dolphingcpadconf="$XDG_CONFIG_HOME/dolphin-emu/GCPadNew.ini"
dolphingfxconf="/var/config/dolphin-emu/GFX.ini" dolphingfxconf="$XDG_CONFIG_HOME/dolphin-emu/GFX.ini"
dolphinhkconf="/var/config/dolphin-emu/Hotkeys.ini" dolphinhkconf="$XDG_CONFIG_HOME/dolphin-emu/Hotkeys.ini"
dolphinqtconf="/var/config/dolphin-emu/Qt.ini" dolphinqtconf="$XDG_CONFIG_HOME/dolphin-emu/Qt.ini"
dolphinDynamicInputTexturesPath="/var/data/dolphin-emu/Load/DynamicInputTextures" dolphinDynamicInputTexturesPath="$XDG_DATA_HOME/dolphin-emu/Load/DynamicInputTextures"
dolphinCheevosConf="/var/config/dolphin-emu/RetroAchievements.ini" dolphinCheevosConf="$XDG_CONFIG_HOME/dolphin-emu/RetroAchievements.ini"
# PCSX2 config files # PCSX2 config files
pcsx2conf="/var/config/PCSX2/inis/PCSX2.ini" pcsx2conf="$XDG_CONFIG_HOME/PCSX2/inis/PCSX2.ini"
pcsx2gsconf="/var/config/PCSX2/inis/GS.ini" # This file should be deprecated since moving to PCSX2-QT pcsx2gsconf="$XDG_CONFIG_HOME/PCSX2/inis/GS.ini" # This file should be deprecated since moving to PCSX2-QT
pcsx2uiconf="/var/config/PCSX2/inis/PCSX2_ui.ini" # This file should be deprecated since moving to PCSX2-QT pcsx2uiconf="$XDG_CONFIG_HOME/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 pcsx2vmconf="$XDG_CONFIG_HOME/PCSX2/inis/PCSX2_vm.ini" # This file should be deprecated since moving to PCSX2-QT
# PPSSPP-SDL config files # PPSSPP-SDL config files
ppssppconf="/var/config/ppsspp/PSP/SYSTEM/ppsspp.ini" ppssppconf="$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/ppsspp.ini"
ppssppcontrolsconf="/var/config/ppsspp/PSP/SYSTEM/controls.ini" ppssppcontrolsconf="$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/controls.ini"
ppssppcheevosconf="/var/config/ppsspp/PSP/SYSTEM/ppsspp_retroachievements.dat" ppssppcheevosconf="$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/ppsspp_retroachievements.dat"
# Primehack config files # Primehack config files
primehackconf="/var/config/primehack/Dolphin.ini" primehackconf="$XDG_CONFIG_HOME/primehack/Dolphin.ini"
primehackgcpadconf="/var/config/primehack/GCPadNew.ini" primehackgcpadconf="$XDG_CONFIG_HOME/primehack/GCPadNew.ini"
primehackgfxconf="/var/config/primehack/GFX.ini" primehackgfxconf="$XDG_CONFIG_HOME/primehack/GFX.ini"
primehackhkconf="/var/config/primehack/Hotkeys.ini" primehackhkconf="$XDG_CONFIG_HOME/primehack/Hotkeys.ini"
primehackqtconf="/var/config/primehack/Qt.ini" primehackqtconf="$XDG_CONFIG_HOME/primehack/Qt.ini"
primehackDynamicInputTexturesPath="/var/data/primehack/Load/DynamicInputTextures" primehackDynamicInputTexturesPath="$XDG_DATA_HOME/primehack/Load/DynamicInputTextures"
# RPCS3 config files # RPCS3 config files
rpcs3conf="/var/config/rpcs3/config.yml" rpcs3conf="$XDG_CONFIG_HOME/rpcs3/config.yml"
rpcs3vfsconf="/var/config/rpcs3/vfs.yml" rpcs3vfsconf="$XDG_CONFIG_HOME/rpcs3/vfs.yml"
# Vita3k config files # Vita3k config files
vita3kconf="/var/config/Vita3K/config.yml" vita3kconf="$XDG_CONFIG_HOME/Vita3K/config.yml"
# MAME-SA config files # MAME-SA config files
mameconf="/var/config/mame/ini/mame.ini" mameconf="$XDG_CONFIG_HOME/mame/ini/mame.ini"
mameuiconf="/var/config/mame/ini/ui.ini" mameuiconf="$XDG_CONFIG_HOME/mame/ini/ui.ini"
mamedefconf="/var/config/mame/cfg/default.cfg" mamedefconf="$XDG_CONFIG_HOME/mame/cfg/default.cfg"
# Initialize logging location if it doesn't exist, before anything else happens # Initialize logging location if it doesn't exist, before anything else happens
if [ ! -d "$rd_logs_folder" ]; then if [ ! -d "$rd_logs_folder" ]; then
@ -176,13 +176,13 @@ if [ ! -d "$rd_logs_folder" ]; then
fi fi
# Initialize location of Godot temp data files, if it doesn't exist # Initialize location of Godot temp data files, if it doesn't exist
if [[ ! -d "/var/config/retrodeck/godot" ]]; then if [[ ! -d "$XDG_CONFIG_HOME/retrodeck/godot" ]]; then
create_dir "/var/config/retrodeck/godot" create_dir "$XDG_CONFIG_HOME/retrodeck/godot"
fi fi
# We moved the lockfile in /var/config/retrodeck in order to solve issue #53 - Remove in a few versions # We moved the lockfile in $XDG_CONFIG_HOME/retrodeck in order to solve issue #53 - Remove in a few versions
if [[ -f "$HOME/retrodeck/.lock" ]]; then if [[ -f "$HOME/retrodeck/.lock" ]]; then
mv "$HOME/retrodeck/.lock" $lockfile mv "$HOME/retrodeck/.lock" "$lockfile"
fi fi
# If there is no config file I initalize the file with the the default values # If there is no config file I initalize the file with the the default values
@ -193,9 +193,9 @@ if [[ ! -f "$rd_conf" ]]; then
# Initializing the variables # Initializing the variables
if [[ -z "$version" ]]; then if [[ -z "$version" ]]; then
if [[ -f "$lockfile" ]]; then if [[ -f "$lockfile" ]]; then
if [[ $(cat $lockfile) == *"0.4."* ]] || [[ $(cat $lockfile) == *"0.3."* ]] || [[ $(cat $lockfile) == *"0.2."* ]] || [[ $(cat $lockfile) == *"0.1."* ]]; then # If the previous version is very out of date, pre-rd_conf if [[ $(cat "$lockfile") == *"0.4."* ]] || [[ $(cat "$lockfile") == *"0.3."* ]] || [[ $(cat "$lockfile") == *"0.2."* ]] || [[ $(cat "$lockfile") == *"0.1."* ]]; then # If the previous version is very out of date, pre-rd_conf
log d "Running version workaround" log d "Running version workaround"
version=$(cat $lockfile) version=$(cat "$lockfile")
fi fi
else else
version="$hard_version" version="$hard_version"
@ -203,28 +203,28 @@ if [[ ! -f "$rd_conf" ]]; then
fi fi
# Check if SD card path has changed from SteamOS update # Check if SD card path has changed from SteamOS update
if [[ ! -d "$default_sd" && "$(ls -A /run/media/deck/)" ]]; then if [[ ! -d "$default_sd" && "$(ls -A "/run/media/deck/")" ]]; then
if [[ $(find /run/media/deck/* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default if [[ $(find "/run/media/deck/"* -maxdepth 0 -type d -print | wc -l) -eq 1 ]]; then # If there is only one SD card found in the new SteamOS 3.5 location, assign it as the default
default_sd="$(find /run/media/deck/* -maxdepth 0 -type d -print)" default_sd="$(find "/run/media/deck/"* -maxdepth 0 -type d -print)"
else # If the default legacy path cannot be found, and there are multiple entries in the new Steam OS 3.5 SD card path, let the user pick which one to use else # If the default legacy path cannot be found, and there are multiple entries in the new Steam OS 3.5 SD card path, let the user pick which one to use
configurator_generic_dialog "RetroDECK Setup" "The SD card was not found in the default location, and multiple drives were detected.\nPlease browse to the location of the desired SD card.\n\nIf you are not using an SD card, please click \"Cancel\"." configurator_generic_dialog "RetroDECK Setup" "The SD card was not found in the default location, and multiple drives were detected.\nPlease browse to the location of the desired SD card.\n\nIf you are not using an SD card, please click \"Cancel\"."
default_sd="$(directory_browse "SD Card Location")" default_sd="$(directory_browse "SD Card Location")"
fi fi
fi fi
cp $rd_defaults $rd_conf # Load default settings file cp "$rd_defaults" "$rd_conf" # Load default settings file
set_setting_value $rd_conf "version" "$version" retrodeck # Set current version for new installs set_setting_value "$rd_conf" "version" "$version" retrodeck # Set current version for new installs
set_setting_value $rd_conf "sdcard" "$default_sd" retrodeck "paths" # Set SD card location if default path has changed set_setting_value "$rd_conf" "sdcard" "$default_sd" retrodeck "paths" # Set SD card location if default path has changed
if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR-" <<< "$hard_version"; then # If newly-installed version is a "cooker" or PR build if grep -qF "cooker" <<< "$hard_version" || grep -qF "PR-" <<< "$hard_version"; then # If newly-installed version is a "cooker" or PR build
set_setting_value $rd_conf "update_repo" "$cooker_repository_name" retrodeck "options" set_setting_value "$rd_conf" "update_repo" "$cooker_repository_name" retrodeck "options"
set_setting_value $rd_conf "update_check" "true" retrodeck "options" set_setting_value "$rd_conf" "update_check" "true" retrodeck "options"
set_setting_value $rd_conf "developer_options" "true" retrodeck "options" set_setting_value "$rd_conf" "developer_options" "true" retrodeck "options"
fi fi
log i "Setting config file permissions" log i "Setting config file permissions"
chmod +rw $rd_conf chmod +rw "$rd_conf"
log i "RetroDECK config file initialized. Contents:\n\n$(cat $rd_conf)\n" log i "RetroDECK config file initialized. Contents:\n\n$(cat "$rd_conf")\n"
conf_read # Load new variables into memory conf_read # Load new variables into memory
#tmplog_merger # This function is tempry(?) removed #tmplog_merger # This function is tempry(?) removed
@ -232,10 +232,10 @@ if [[ ! -f "$rd_conf" ]]; then
else else
log i "Loading RetroDECK config file in $rd_conf" log i "Loading RetroDECK config file in $rd_conf"
if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build 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" set_setting_value "$rd_conf" "update_repo" "$cooker_repository_name" retrodeck "options"
set_setting_value $rd_conf "update_check" "true" retrodeck "options" set_setting_value "$rd_conf" "update_check" "true" retrodeck "options"
set_setting_value $rd_conf "developer_options" "true" retrodeck "options" set_setting_value "$rd_conf" "developer_options" "true" retrodeck "options"
fi fi
conf_read conf_read
@ -244,7 +244,7 @@ else
if [[ ! -d "$rdhome" ]]; then if [[ ! -d "$rdhome" ]]; then
configurator_generic_dialog "RetroDECK Setup" "The RetroDECK data folder was not found in the expected location.\nThis may happen when SteamOS is updated.\n\nPlease browse to the current location of the \"retrodeck\" folder." configurator_generic_dialog "RetroDECK Setup" "The RetroDECK data folder was not found in the expected location.\nThis may happen when SteamOS is updated.\n\nPlease browse to the current location of the \"retrodeck\" folder."
new_home_path=$(directory_browse "RetroDECK folder location") new_home_path=$(directory_browse "RetroDECK folder location")
set_setting_value $rd_conf "rdhome" "$new_home_path" retrodeck "paths" set_setting_value "$rd_conf" "rdhome" "$new_home_path" retrodeck "paths"
conf_read conf_read
#tmplog_merger # This function is tempry(?) removed #tmplog_merger # This function is tempry(?) removed
prepare_component "postmove" "retrodeck" prepare_component "postmove" "retrodeck"

View file

@ -8,11 +8,11 @@ multi_user_set_default_dialog() {
--text="Would you like to set $chosen_user as the default user?\n\nIf the current user cannot be determined from the system, the default will be used.\nThis normally only happens in Desktop Mode.\n\nIf you would like to be asked which user is playing every time, click \"No and don't ask again\"") --text="Would you like to set $chosen_user as the default user?\n\nIf the current user cannot be determined from the system, the default will be used.\nThis normally only happens in Desktop Mode.\n\nIf you would like to be asked which user is playing every time, click \"No and don't ask again\"")
rc=$? # Capture return code, as "Yes" button has no text value rc=$? # Capture return code, as "Yes" button has no text value
if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked if [[ $rc == "1" ]]; then # If any button other than "Yes" was clicked
if [[ $choice == "No and don't ask again" ]]; then if [[ "$choice" == "No and don't ask again" ]]; then
set_setting_value $rd_conf "ask_default_user" "false" retrodeck "options" set_setting_value "$rd_conf" "ask_default_user" "false" retrodeck "options"
fi fi
else # User clicked "Yes" else # User clicked "Yes"
set_setting_value $rd_conf "default_user" "$chosen_user" retrodeck "options" set_setting_value "$rd_conf" "default_user" "$chosen_user" retrodeck "options"
fi fi
} }
@ -30,7 +30,7 @@ chosen_user=$(rd_zenity \
--column "Steam Username" --print-column=1 \ --column "Steam Username" --print-column=1 \
"${full_userlist[@]}") "${full_userlist[@]}")
if [[ ! -z $chosen_user && -z $default_user && $ask_default_user == "true" ]]; then if [[ ! -z "$chosen_user" && -z "$default_user" && "$ask_default_user" == "true" ]]; then
multi_user_set_default_dialog "$chosen_user" multi_user_set_default_dialog "$chosen_user"
fi fi
echo "$chosen_user" echo "$chosen_user"
@ -48,7 +48,7 @@ multi_user_enable_multi_user_mode() {
rm -rf "$multi_user_data_folder/$SteamAppUser" # Remove stale data after backup rm -rf "$multi_user_data_folder/$SteamAppUser" # Remove stale data after backup
fi fi
fi fi
set_setting_value $rd_conf "multi_user_mode" "true" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "true" retrodeck "options"
multi_user_determine_current_user multi_user_determine_current_user
if [[ -d "$multi_user_data_folder/$SteamAppUser" ]]; then if [[ -d "$multi_user_data_folder/$SteamAppUser" ]]; then
configurator_process_complete_dialog "enabling multi-user support" configurator_process_complete_dialog "enabling multi-user support"
@ -74,7 +74,7 @@ multi_user_disable_multi_user_mode() {
if [[ ! -z "$single_user" ]]; then # Single user was selected if [[ ! -z "$single_user" ]]; then # Single user was selected
multi_user_return_to_single_user "$single_user" multi_user_return_to_single_user "$single_user"
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
configurator_process_complete_dialog "disabling multi-user support" configurator_process_complete_dialog "disabling multi-user support"
else else
configurator_generic_dialog "RetroDECK Multi-User Mode" "No single user was selected, please try the process again." configurator_generic_dialog "RetroDECK Multi-User Mode" "No single user was selected, please try the process again."
@ -83,13 +83,13 @@ multi_user_disable_multi_user_mode() {
else else
single_user=$(ls -1 "$multi_user_data_folder") single_user=$(ls -1 "$multi_user_data_folder")
multi_user_return_to_single_user "$single_user" multi_user_return_to_single_user "$single_user"
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
configurator_process_complete_dialog "disabling multi-user support" configurator_process_complete_dialog "disabling multi-user support"
fi fi
} }
multi_user_determine_current_user() { multi_user_determine_current_user() {
if [[ $(get_setting_value $rd_conf "multi_user_mode" retrodeck "options") == "true" ]]; then # If multi-user environment is enabled in rd_conf if [[ $(get_setting_value "$rd_conf" "multi_user_mode" retrodeck "options") == "true" ]]; then # If multi-user environment is enabled in rd_conf
if [[ -d "$multi_user_data_folder" ]]; then if [[ -d "$multi_user_data_folder" ]]; then
if [[ ! -z $SteamAppUser ]]; then # If running in Game Mode and this variable exists if [[ ! -z $SteamAppUser ]]; then # If running in Game Mode and this variable exists
if [[ -z $(ls -1 "$multi_user_data_folder" | grep "$SteamAppUser") ]]; then if [[ -z $(ls -1 "$multi_user_data_folder" | grep "$SteamAppUser") ]]; then
@ -99,24 +99,24 @@ multi_user_determine_current_user() {
fi fi
else # Unable to find Steam user ID else # Unable to find Steam user ID
if [[ $(ls -1 "$multi_user_data_folder" | wc -l) -gt 1 ]]; then if [[ $(ls -1 "$multi_user_data_folder" | wc -l) -gt 1 ]]; then
if [[ -z $default_user ]]; then # And a default user is not set if [[ -z "$default_user" ]]; then # And a default user is not set
configurator_generic_dialog "RetroDECK Multi-User Mode" "The current user could not be determined from the system, and there are multiple users registered.\n\nPlease select which user is currently playing in the next dialog." configurator_generic_dialog "RetroDECK Multi-User Mode" "The current user could not be determined from the system, and there are multiple users registered.\n\nPlease select which user is currently playing in the next dialog."
SteamAppUser=$(multi_user_choose_current_user_dialog) SteamAppUser=$(multi_user_choose_current_user_dialog)
if [[ ! -z $SteamAppUser ]]; then # User was chosen from dialog if [[ ! -z "$SteamAppUser" ]]; then # User was chosen from dialog
multi_user_link_current_user_files multi_user_link_current_user_files
else else
configurator_generic_dialog "RetroDECK Multi-User Mode" "No user was chosen, RetroDECK will launch with the files from the user who played most recently." configurator_generic_dialog "RetroDECK Multi-User Mode" "No user was chosen, RetroDECK will launch with the files from the user who played most recently."
fi fi
else # The default user is set else # The default user is set
if [[ ! -z $(ls -1 $multi_user_data_folder | grep "$default_user") ]]; then # Confirm user data folder exists if [[ ! -z $(ls -1 "$multi_user_data_folder" | grep "$default_user") ]]; then # Confirm user data folder exists
SteamAppUser=$default_user SteamAppUser="$default_user"
multi_user_link_current_user_files multi_user_link_current_user_files
else # Default user has no data folder, something may have gone horribly wrong. Setting up as a new user. else # Default user has no data folder, something may have gone horribly wrong. Setting up as a new user.
multi_user_setup_new_user multi_user_setup_new_user
fi fi
fi fi
else # If there is only 1 user in the userlist, default to that user else # If there is only 1 user in the userlist, default to that user
SteamAppUser=$(ls -1 $multi_user_data_folder) SteamAppUser=$(ls -1 "$multi_user_data_folder")
multi_user_link_current_user_files multi_user_link_current_user_files
fi fi
fi fi
@ -134,11 +134,11 @@ multi_user_determine_current_user() {
multi_user_setup_new_user multi_user_setup_new_user
else # But dialog box was blank else # But dialog box was blank
configurator_generic_dialog "RetroDECK Multi-User Mode" "No username was entered, so multi-user data folder cannot be created.\n\nDisabling multi-user mode, please try the process again." configurator_generic_dialog "RetroDECK Multi-User Mode" "No username was entered, so multi-user data folder cannot be created.\n\nDisabling multi-user mode, please try the process again."
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
fi fi
else # User clicked "Cancel" else # User clicked "Cancel"
configurator_generic_dialog "RetroDECK Multi-User Mode" "Cancelling multi-user mode activation." configurator_generic_dialog "RetroDECK Multi-User Mode" "Cancelling multi-user mode activation."
set_setting_value $rd_conf "multi_user_mode" "false" retrodeck "options" set_setting_value "$rd_conf" "multi_user_mode" "false" retrodeck "options"
fi fi
fi fi
fi fi
@ -155,16 +155,16 @@ multi_user_return_to_single_user() {
unlink "$rd_conf" unlink "$rd_conf"
mv -f "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf" mv -f "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf"
# RetroArch one-offs, because it has so many folders that should be shared between users # RetroArch one-offs, because it has so many folders that should be shared between users
unlink "/var/config/retroarch/retroarch.cfg" unlink "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
unlink "/var/config/retroarch/retroarch-core-options.cfg" unlink "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "/var/config/retroarch/retroarch.cfg" mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "/var/config/retroarch/retroarch-core-options.cfg" mv -f "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
# XEMU one-offs, because it stores its config in /var/data, not /var/config like everything else # XEMU one-offs, because it stores its config in $XDG_DATA_HOME, not $XDG_CONFIG_HOME like everything else
unlink "/var/config/xemu" unlink "$XDG_CONFIG_HOME/xemu"
unlink "/var/data/xemu/xemu" unlink "$XDG_DATA_HOME/xemu/xemu"
create_dir "/var/config/xemu" create_dir "$XDG_CONFIG_HOME/xemu"
mv -f "$multi_user_data_folder/$single_user/config/xemu"/{.[!.],}* "/var/config/xemu" mv -f "$multi_user_data_folder/$single_user/config/xemu"/{.[!.],}* "$XDG_CONFIG_HOME/xemu"
dir_prep "/var/config/xemu" "/var/data/xemu/xemu" dir_prep "$XDG_CONFIG_HOME/xemu" "$XDG_DATA_HOME/xemu/xemu"
create_dir "$saves_folder" create_dir "$saves_folder"
create_dir "$states_folder" create_dir "$states_folder"
mv -f "$multi_user_data_folder/$single_user/saves"/{.[!.],}* "$saves_folder" mv -f "$multi_user_data_folder/$single_user/saves"/{.[!.],}* "$saves_folder"
@ -172,9 +172,9 @@ multi_user_return_to_single_user() {
for emu_conf in $(find "$multi_user_data_folder/$single_user/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') for emu_conf in $(find "$multi_user_data_folder/$single_user/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n')
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
unlink "/var/config/$emu_conf" unlink "$XDG_CONFIG_HOME/$emu_conf"
create_dir "/var/config/$emu_conf" create_dir "$XDG_CONFIG_HOME/$emu_conf"
mv -f "$multi_user_data_folder/$single_user/config/$emu_conf"/{.[!.],}* "/var/config/$emu_conf" mv -f "$multi_user_data_folder/$single_user/config/$emu_conf"/{.[!.],}* "$XDG_CONFIG_HOME/$emu_conf"
fi fi
done done
rm -r "$multi_user_data_folder/$single_user" # Should be empty, omitting -f for safety rm -r "$multi_user_data_folder/$single_user" # Should be empty, omitting -f for safety
@ -192,9 +192,9 @@ multi_user_setup_new_user() {
rm -f "$rd_conf" rm -f "$rd_conf"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf"
create_dir "$multi_user_data_folder/$SteamAppUser/config/retroarch" create_dir "$multi_user_data_folder/$SteamAppUser/config/retroarch"
if [[ ! -L "/var/config/retroarch/retroarch.cfg" ]]; then if [[ ! -L "$XDG_CONFIG_HOME/retroarch/retroarch.cfg" ]]; then
mv "/var/config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" mv "$XDG_CONFIG_HOME/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg"
mv "/var/config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" mv "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg"
else else
cp "$config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" cp "$config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg"
cp "$config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" cp "$config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg"
@ -202,19 +202,19 @@ multi_user_setup_new_user() {
set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch" set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch"
set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch" set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch"
fi fi
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "/var/config/retroarch/retroarch.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "/var/config/retroarch/retroarch-core-options.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type l -printf '%f\n') # For all the config folders already linked to a different user for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type l -printf '%f\n') # For all the config folders already linked to a different user
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
unlink "/var/config/$emu_conf" unlink "$XDG_CONFIG_HOME/$emu_conf"
prepare_component "reset" "$emu_conf" prepare_component "reset" "$emu_conf"
fi fi
done done
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # For all the currently non-linked config folders, like from a newly-added emulator for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # For all the currently non-linked config folders, like from a newly-added emulator
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "/var/config/$emu_conf" dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "$XDG_CONFIG_HOME/$emu_conf"
fi fi
done done
} }
@ -224,22 +224,22 @@ multi_user_link_current_user_files() {
ln -sfT "$multi_user_data_folder/$SteamAppUser/saves" "$saves_folder" ln -sfT "$multi_user_data_folder/$SteamAppUser/saves" "$saves_folder"
ln -sfT "$multi_user_data_folder/$SteamAppUser/states" "$states_folder" ln -sfT "$multi_user_data_folder/$SteamAppUser/states" "$states_folder"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retrodeck/retrodeck.cfg" "$rd_conf"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "/var/config/retroarch/retroarch.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch.cfg"
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "/var/config/retroarch/retroarch-core-options.cfg" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/retroarch-core-options.cfg"
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # Find any new emulator config folders from last time this user played for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # Find any new emulator config folders from last time this user played
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "/var/config/$emu_conf" dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "$XDG_CONFIG_HOME/$emu_conf"
fi fi
done done
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type l -printf '%f\n') for emu_conf in $(find "$XDG_CONFIG_HOME" -mindepth 1 -maxdepth 1 -type l -printf '%f\n')
do do
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
if [[ -d "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" ]]; then # If the current user already has a config folder for this emulator if [[ -d "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" ]]; then # If the current user already has a config folder for this emulator
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "retrodeck/config/$emu_conf" ln -sfT "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "retrodeck/config/$emu_conf"
else # If the current user doesn't have a config folder for this emulator, init it and then link it else # If the current user doesn't have a config folder for this emulator, init it and then link it
prepare_component "reset" "$emu_conf" prepare_component "reset" "$emu_conf"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "/var/config/$emu_conf" dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "$XDG_CONFIG_HOME/$emu_conf"
fi fi
fi fi
done done

View file

@ -80,8 +80,8 @@ move() {
# Function to move a directory from one parent to another # Function to move a directory from one parent to another
# USAGE: move $source_dir $dest_dir # USAGE: move $source_dir $dest_dir
source_dir="$(echo $1 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing source_dir="$(echo "$1" | sed 's![^/]$!&/!')" # Add trailing slash if it is missing
dest_dir="$(echo $2 | sed 's![^/]$!&/!')" # Add trailing slash if it is missing dest_dir="$(echo "$2" | sed 's![^/]$!&/!')" # Add trailing slash if it is missing
log d "Moving \"$source_dir\" to \"$dest_dir\"" log d "Moving \"$source_dir\" to \"$dest_dir\""
@ -147,17 +147,17 @@ update_rd_conf() {
# STAGE 1: For current files that haven't been broken into sections yet, where every setting name is unique # STAGE 1: For current files that haven't been broken into sections yet, where every setting name is unique
conf_read # Read current settings into memory conf_read # Read current settings into memory
mv -f $rd_conf $rd_conf_backup # Backup config file before update mv -f "$rd_conf" "$rd_conf_backup" # Backup config file before update
cp $rd_defaults $rd_conf # Copy defaults file into place cp "$rd_defaults" "$rd_conf" # Copy defaults file into place
conf_write # Write old values into new retrodeck.cfg file conf_write # Write old values into new retrodeck.cfg file
# STAGE 2: To handle presets sections that use duplicate setting names # STAGE 2: To handle presets sections that use duplicate setting names
generate_single_patch $rd_defaults $rd_conf_backup $rd_update_patch retrodeck # Create a patch file for differences between defaults and current user settings generate_single_patch "$rd_defaults" "$rd_conf_backup" "$rd_update_patch" retrodeck # Create a patch file for differences between defaults and current user settings
sed -i '/change^^version/d' $rd_update_patch # Remove version line from temporary patch file sed -i '/change^^version/d' "$rd_update_patch" # Remove version line from temporary patch file
deploy_single_patch $rd_defaults $rd_update_patch $rd_conf # Re-apply user settings to defaults file deploy_single_patch "$rd_defaults" "$rd_update_patch" "$rd_conf" # Re-apply user settings to defaults file
set_setting_value $rd_conf "version" "$hard_version" retrodeck # Set version of currently running RetroDECK to updated retrodeck.cfg set_setting_value "$rd_conf" "version" "$hard_version" retrodeck # Set version of currently running RetroDECK to updated retrodeck.cfg
rm -f $rd_update_patch # Cleanup temporary patch file rm -f "$rd_update_patch" # Cleanup temporary patch file
conf_read # Read all settings into memory conf_read # Read all settings into memory
# STAGE 3: Create new folders that were added to the shipped retrodeck.cfg, if any # STAGE 3: Create new folders that were added to the shipped retrodeck.cfg, if any
@ -196,13 +196,13 @@ update_rd_conf() {
"\(.key):\(.value)", "\(.key):\(.value)",
"\(.value):\(.key)" "\(.value):\(.key)"
] | join("\n") ] | join("\n")
' $features) ' "$features")
while IFS= read -r current_setting_line # Read the existing retrodeck.cfg while IFS= read -r current_setting_line # Read the existing retrodeck.cfg
do do
if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header
local current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name local current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
else else
if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then
local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line
@ -220,7 +220,7 @@ update_rd_conf() {
fi fi
fi fi
fi fi
done < $rd_conf done < "$rd_conf"
} }
conf_read() { conf_read() {
@ -252,7 +252,7 @@ conf_write() {
do do
if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header
local current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name local current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
else else
if [[ "$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" ]]; then if [[ "$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" ]]; then
local current_setting_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line local current_setting_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line
@ -264,7 +264,7 @@ conf_write() {
fi fi
fi fi
fi fi
done < $rd_conf done < "$rd_conf"
log d "retrodeck.cfg written" log d "retrodeck.cfg written"
} }
@ -335,7 +335,7 @@ rd_zenity() {
unset CONFIGURATOR_GUI unset CONFIGURATOR_GUI
return $status return "$status"
} }
update_rpcs3_firmware() { update_rpcs3_firmware() {
@ -394,7 +394,7 @@ backup_retrodeck_userdata() {
local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths") local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths")
config_paths["$current_setting_name"]="$current_setting_value" config_paths["$current_setting_name"]="$current_setting_value"
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
# Determine which paths to backup # Determine which paths to backup
if [[ "$backup_type" == "complete" ]]; then if [[ "$backup_type" == "complete" ]]; then
@ -553,7 +553,7 @@ backup_retrodeck_userdata() {
path_size=$(du -sk "$path" 2>/dev/null | cut -f1) # Get size in KB path_size=$(du -sk "$path" 2>/dev/null | cut -f1) # Get size in KB
path_size=$((path_size * 1024)) # Convert to bytes for calculation path_size=$((path_size * 1024)) # Convert to bytes for calculation
total_size=$((total_size + path_size)) total_size=$((total_size + path_size))
echo "$total_size" > $total_size_file echo "$total_size" > "$total_size_file"
fi fi
done done
) | ) |
@ -578,15 +578,15 @@ backup_retrodeck_userdata() {
available_space=$(df -B1 "$backups_folder" | awk 'NR==2 {print $4}') available_space=$(df -B1 "$backups_folder" | awk 'NR==2 {print $4}')
# Log sizes for reference # Log sizes for reference
log i "Total size of backup data: $(numfmt --to=iec-i --suffix=B $total_size)" log i "Total size of backup data: $(numfmt --to=iec-i --suffix=B "$total_size")"
log i "Available space at destination: $(numfmt --to=iec-i --suffix=B $available_space)" log i "Available space at destination: $(numfmt --to=iec-i --suffix=B "$available_space")"
# Check if we have enough space (using uncompressed size as a conservative estimate) # Check if we have enough space (using uncompressed size as a conservative estimate)
if [[ "$available_space" -lt "$total_size" ]]; then if [[ "$available_space" -lt "$total_size" ]]; then
if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then if [[ "$CONFIGURATOR_GUI" == "zenity" ]]; then
configurator_generic_dialog "RetroDECK Userdata Backup" "There is not enough free space to perform this backup.\n\nYou need at least $(numfmt --to=iec-i --suffix=B $total_size),\nplease free up some space and try again." configurator_generic_dialog "RetroDECK Userdata Backup" "There is not enough free space to perform this backup.\n\nYou need at least $(numfmt --to=iec-i --suffix=B "$total_size"),\nplease free up some space and try again."
fi fi
log e "Error: Not enough space to perform backup. Need at least $(numfmt --to=iec-i --suffix=B $total_size)" log e "Error: Not enough space to perform backup. Need at least $(numfmt --to=iec-i --suffix=B "$total_size")"
return 1 return 1
fi fi
@ -853,9 +853,9 @@ install_retrodeck_starterpack() {
## DOOM section ## ## DOOM section ##
cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it cp /app/retrodeck/extras/doom1.wad "$roms_folder/doom/doom1.wad" # No -f in case the user already has it
create_dir "/var/config/ES-DE/gamelists/doom" create_dir "$XDG_CONFIG_HOME/ES-DE/gamelists/doom"
if [[ ! -f "/var/config/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist if [[ ! -f "$XDG_CONFIG_HOME/ES-DE/gamelists/doom/gamelist.xml" ]]; then # Don't overwrite an existing gamelist
cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "/var/config/ES-DE/gamelists/doom/gamelist.xml" cp "/app/retrodeck/rd_prepacks/doom/gamelist.xml" "$XDG_CONFIG_HOME/ES-DE/gamelists/doom/gamelist.xml"
fi fi
create_dir "$media_folder/doom" create_dir "$media_folder/doom"
unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/" unzip -oq "/app/retrodeck/rd_prepacks/doom/doom.zip" -d "$media_folder/doom/"
@ -893,8 +893,8 @@ update_splashscreens() {
log i "Updating splash screen" log i "Updating splash screen"
rm -rf /var/config/ES-DE/resources/graphics rm -rf "$XDG_CONFIG_HOME/ES-DE/resources/graphics"
rsync -rlD --mkpath "/app/retrodeck/graphics/" "/var/config/ES-DE/resources/graphics/" rsync -rlD --mkpath "/app/retrodeck/graphics/" "$XDG_CONFIG_HOME/ES-DE/resources/graphics/"
} }
@ -930,7 +930,7 @@ splash_screen() {
($current_day | tonumber) <= (.value.end_date | tonumber) and ($current_day | tonumber) <= (.value.end_date | tonumber) and
($current_time | tonumber) >= (.value.start_time | tonumber) and ($current_time | tonumber) >= (.value.start_time | tonumber) and
($current_time | tonumber) <= (.value.end_time | tonumber) ($current_time | tonumber) <= (.value.end_time | tonumber)
) | .value.filename' $features) ) | .value.filename' "$features")
# Determine the splash file to use # Determine the splash file to use
if [[ -n "$splash_screen" ]]; then if [[ -n "$splash_screen" ]]; then
@ -972,7 +972,7 @@ install_release() {
mkdir -p "$rdhome/RetroDECK_Updates" mkdir -p "$rdhome/RetroDECK_Updates"
# Download the flatpak file # Download the flatpak file
wget -P "$rdhome/RetroDECK_Updates" $flatpak_url -O "$rdhome/RetroDECK_Updates/RetroDECK$iscooker.flatpak" wget -P "$rdhome/RetroDECK_Updates" "$flatpak_url" -O "$rdhome/RetroDECK_Updates/RetroDECK$iscooker.flatpak"
# Check if the download was successful # Check if the download was successful
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
@ -1012,13 +1012,13 @@ ponzu() {
local executable local executable
# if the binaries are found, ponzu should be set as true into the retrodeck config # if the binaries are found, ponzu should be set as true into the retrodeck config
if [ -f "/var/data/ponzu/Citra/bin/citra-qt" ]; then if [ -f "$XDG_DATA_HOME/ponzu/Citra/bin/citra-qt" ]; then
log d "Citra binaries has already been installed, checking for updates and forcing the setting as true." log d "Citra binaries has already been installed, checking for updates and forcing the setting as true."
set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "akai_ponzu" "true" retrodeck "options"
fi fi
if [ -f "/var/data/ponzu/Yuzu/bin/yuzu" ]; then if [ -f "$XDG_DATA_HOME/ponzu/Yuzu/bin/yuzu" ]; then
log d "Yuzu binaries has already been installed, checking for updates and forcing the setting as true." log d "Yuzu binaries has already been installed, checking for updates and forcing the setting as true."
set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "kiroi_ponzu" "true" retrodeck "options"
fi fi
# Loop through all ponzu files # Loop through all ponzu files
@ -1027,11 +1027,11 @@ ponzu() {
if [ -f "$ponzu_file" ]; then if [ -f "$ponzu_file" ]; then
if [[ "$ponzu_file" == *itra* ]]; then if [[ "$ponzu_file" == *itra* ]]; then
log i "Found akai ponzu! Elaborating it" log i "Found akai ponzu! Elaborating it"
data_dir="/var/data/ponzu/Citra" data_dir="$XDG_DATA_HOME/ponzu/Citra"
local message="Akai ponzu is served, enjoy" local message="Akai ponzu is served, enjoy"
elif [[ "$ponzu_file" == *uzu* ]]; then elif [[ "$ponzu_file" == *uzu* ]]; then
log i "Found kiroi ponzu! Elaborating it" log i "Found kiroi ponzu! Elaborating it"
data_dir="/var/data/ponzu/Yuzu" data_dir="$XDG_DATA_HOME/ponzu/Yuzu"
local message="Kiroi ponzu is served, enjoy" local message="Kiroi ponzu is served, enjoy"
else else
log e "AppImage not recognized, not a ponzu ingredient!" log e "AppImage not recognized, not a ponzu ingredient!"
@ -1059,14 +1059,14 @@ ponzu() {
chmod +x "$executable" chmod +x "$executable"
chmod +x "$executable-qt" chmod +x "$executable-qt"
prepare_component "reset" "citra" prepare_component "reset" "citra"
set_setting_value $rd_conf "akai_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "akai_ponzu" "true" retrodeck "options"
elif [[ "$ponzu_file" == *uzu* ]]; then elif [[ "$ponzu_file" == *uzu* ]]; then
mv "$tmp_folder/usr/"** . mv "$tmp_folder/usr/"** .
executable="$data_dir/bin/yuzu" executable="$data_dir/bin/yuzu"
log d "Making $executable executable" log d "Making $executable executable"
chmod +x "$executable" chmod +x "$executable"
prepare_component "reset" "yuzu" prepare_component "reset" "yuzu"
set_setting_value $rd_conf "kiroi_ponzu" "true" retrodeck "options" set_setting_value "$rd_conf" "kiroi_ponzu" "true" retrodeck "options"
fi fi
cd - cd -
@ -1084,15 +1084,15 @@ ponzu_remove() {
if [[ "$1" == "citra" ]]; then if [[ "$1" == "citra" ]]; then
if [[ $(configurator_generic_question_dialog "Ponzu - Remove Citra" "Do you really want to remove Citra binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then if [[ $(configurator_generic_question_dialog "Ponzu - Remove Citra" "Do you really want to remove Citra binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then
log i "Ponzu: removing Citra" log i "Ponzu: removing Citra"
rm -rf "/var/data/ponzu/Citra" rm -rf "$XDG_DATA_HOME/ponzu/Citra"
set_setting_value $rd_conf "akai_ponzu" "false" retrodeck "options" set_setting_value "$rd_conf" "akai_ponzu" "false" retrodeck "options"
configurator_generic_dialog "Ponzu - Remove Citra" "Done, Citra is now removed from RetroDECK" configurator_generic_dialog "Ponzu - Remove Citra" "Done, Citra is now removed from RetroDECK"
fi fi
elif [[ "$1" == "yuzu" ]]; then elif [[ "$1" == "yuzu" ]]; then
if [[ $(configurator_generic_question_dialog "Ponzu - Remove Yuzu" "Do you really want to remove Yuzu binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then if [[ $(configurator_generic_question_dialog "Ponzu - Remove Yuzu" "Do you really want to remove Yuzu binaries?\n\nYour games and saves will not be deleted.") == "true" ]]; then
log i "Ponzu: removing Yuzu" log i "Ponzu: removing Yuzu"
rm -rf "/var/data/ponzu/Yuzu" rm -rf "$XDG_DATA_HOME/ponzu/Yuzu"
set_setting_value $rd_conf "kiroi_ponzu" "false" retrodeck "options" set_setting_value "$rd_conf" "kiroi_ponzu" "false" retrodeck "options"
configurator_generic_dialog "Ponzu - Remove Yuzu" "Done, Yuzu is now removed from RetroDECK" configurator_generic_dialog "Ponzu - Remove Yuzu" "Done, Yuzu is now removed from RetroDECK"
fi fi
else else
@ -1115,7 +1115,7 @@ release_selector() {
# Fetch the main release from the RetroDECK repository # Fetch the main release from the RetroDECK repository
log d "Fetching latest main release from GitHub API for repository RetroDECK" log d "Fetching latest main release from GitHub API for repository RetroDECK"
local main_release=$(curl -s https://api.github.com/repos/$git_organization_name/RetroDECK/releases/latest) local main_release=$(curl -s "https://api.github.com/repos/$git_organization_name/RetroDECK/releases/latest")
if [[ -z "$main_release" ]]; then if [[ -z "$main_release" ]]; then
log e "Failed to fetch the main release" log e "Failed to fetch the main release"
@ -1134,7 +1134,7 @@ release_selector() {
local release_array=("Main Release" "$main_tag_name" "$main_human_readable_date") local release_array=("Main Release" "$main_tag_name" "$main_human_readable_date")
# Fetch all releases (including draft and pre-release) from the Cooker repository # Fetch all releases (including draft and pre-release) from the Cooker repository
local releases=$(curl -s https://api.github.com/repos/$git_organization_name/$cooker_repository_name/releases?per_page=100) local releases=$(curl -s "https://api.github.com/repos/$git_organization_name/$cooker_repository_name/releases?per_page=100")
if [[ -z "$releases" ]]; then if [[ -z "$releases" ]]; then
log e "Failed to fetch releases or no releases available" log e "Failed to fetch releases or no releases available"
@ -1220,16 +1220,16 @@ release_selector() {
log d "User confirmed installation of release $selected_tag" log d "User confirmed installation of release $selected_tag"
if echo "$selected_release" | grep -q "Main Release"; then if echo "$selected_release" | grep -q "Main Release"; then
set_setting_value $rd_conf "update_repo" "$main_repository_name" retrodeck "options" set_setting_value "$rd_conf" "update_repo" "$main_repository_name" retrodeck "options"
log i "Switching to main channel" log i "Switching to main channel"
else else
set_setting_value $rd_conf "update_repo" "$cooker_repository_name" retrodeck "options" set_setting_value "$rd_conf" "update_repo" "$cooker_repository_name" retrodeck "options"
log i "Switching to cooker channel" log i "Switching to cooker channel"
fi fi
set_setting_value "$rd_conf" "branch" "$selected_branch" "retrodeck" "options" set_setting_value "$rd_conf" "branch" "$selected_branch" "retrodeck" "options"
log d "Set branch to $selected_branch in configuration" log d "Set branch to $selected_branch in configuration"
install_release $selected_tag install_release "$selected_tag"
else else
log d "User canceled installation" log d "User canceled installation"
@ -1294,21 +1294,21 @@ retroarch_updater(){
log i "Running RetroArch updater" log i "Running RetroArch updater"
# Synchronize cores from the application share directory to the RetroArch cores directory # 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" rsync -rlD --mkpath "/app/share/libretro/cores/" "$XDG_CONFIG_HOME/retroarch/cores/" && log d "RetroArch cores updated correctly"
# Synchronize border overlays from the RetroDeck configuration directory to the RetroArch overlays directory # 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" rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "$XDG_CONFIG_HOME/retroarch/overlays/borders/" && log d "RetroArch overlays and borders updated correctly"
} }
portmaster_show(){ portmaster_show(){
log d "Setting PortMaster visibility in ES-DE" log d "Setting PortMaster visibility in ES-DE"
if [ "$1" = "true" ]; then if [ "$1" = "true" ]; then
log d "\"$roms_folder/portmaster/PortMaster.sh\" is not found, installing it" 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" install -Dm755 "$XDG_DATA_HOME/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" set_setting_value "$rd_conf" "portmaster_show" "true" retrodeck "options"
elif [ "$1" = "false" ]; then elif [ "$1" = "false" ]; then
rm -rf "$roms_folder/portmaster/PortMaster.sh" && log d "PortMaster is correctly hidden in ES-DE" 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" set_setting_value "$rd_conf" "portmaster_show" "false" retrodeck "options"
else else
log e "\"$1\" is not a valid choice, quitting" log e "\"$1\" is not a valid choice, quitting"
fi fi
@ -1430,7 +1430,7 @@ repair_paths() {
fi fi
fi fi
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
if [[ $invalid_path_found == "true" ]]; then if [[ $invalid_path_found == "true" ]]; then
log i "One or more invalid paths repaired, fixing internal RetroDECK structures" log i "One or more invalid paths repaired, fixing internal RetroDECK structures"

View file

@ -21,7 +21,7 @@ run_and_check() {
fi fi
# Run command with timeout # Run command with timeout
timeout -s TERM $TIMEOUT $full_cmd timeout -s TERM $TIMEOUT "$full_cmd"
local exit_code=$? local exit_code=$?
# Log the results # Log the results
@ -52,4 +52,4 @@ for entry in "${commands[@]}"; do
# Run the command with optional CLI argument # Run the command with optional CLI argument
run_and_check "$cmd" "$cli_arg" run_and_check "$cmd" "$cli_arg"
done done

View file

@ -40,7 +40,7 @@ post_update() {
local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths") local current_setting_value=$(get_setting_value "$rd_conf" "$current_setting_name" "retrodeck" "paths")
compressible_paths=("${compressible_paths[@]}" "false" "$current_setting_name" "$current_setting_value") compressible_paths=("${compressible_paths[@]}" "false" "$current_setting_name" "$current_setting_value")
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
choice=$(rd_zenity \ choice=$(rd_zenity \
--list --width=1200 --height=720 \ --list --width=1200 --height=720 \
@ -92,11 +92,11 @@ post_update() {
# - Duckstation save and state locations were dir_prep'd to the rdhome/save and /state folders, which was not previously done. Much safer now! # - Duckstation save and state locations were dir_prep'd to the rdhome/save and /state folders, which was not previously done. Much safer now!
# - Fix PICO-8 folder structure. ROM and save folders are now sane and binary files will go into ~/retrodeck/bios/pico-8/ # - Fix PICO-8 folder structure. ROM and save folders are now sane and binary files will go into ~/retrodeck/bios/pico-8/
rm -rf /var/config/primehack # Purge old Primehack config files. Saves are safe as they are linked into /var/data/primehack. rm -rf "$XDG_CONFIG_HOME/primehack" # Purge old Primehack config files. Saves are safe as they are linked into $XDG_DATA_HOME/primehack.
prepare_component "reset" "primehack" prepare_component "reset" "primehack"
dir_prep "$rdhome/saves/duckstation" "/var/data/duckstation/memcards" dir_prep "$rdhome/saves/duckstation" "$XDG_DATA_HOME/duckstation/memcards"
dir_prep "$rdhome/states/duckstation" "/var/data/duckstation/savestates" dir_prep "$rdhome/states/duckstation" "$XDG_DATA_HOME/duckstation/savestates"
mv "$bios_folder/pico8" "$bios_folder/pico8_olddata" # Move legacy (and incorrect / non-functional ) PICO-8 location for future cleanup / less confusion mv "$bios_folder/pico8" "$bios_folder/pico8_olddata" # Move legacy (and incorrect / non-functional ) PICO-8 location for future cleanup / less confusion
dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed
@ -109,21 +109,21 @@ post_update() {
# - Fix symlink to hard-coded PICO-8 config folder (dir_prep doesn't like ~) # - 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. # - Overwrite Citra and Yuzu configs, as controller mapping was broken due to emulator updates.
dir_prep "$rdhome/states/dolphin" "/var/data/dolphin-emu/StateSaves" dir_prep "$rdhome/states/dolphin" "$XDG_DATA_HOME/dolphin-emu/StateSaves"
dir_prep "$rdhome/states/primehack" "/var/data/primehack/StateSaves" dir_prep "$rdhome/states/primehack" "$XDG_DATA_HOME/primehack/StateSaves"
rm -rf "$HOME/~/" # Remove old incorrect location from 0.6.2b rm -rf "$HOME/~/" # Remove old incorrect location from 0.6.2b
rm -f "$HOME/.lexaloffle/pico-8" # Remove old symlink to prevent recursion rm -f "$HOME/.lexaloffle/pico-8" # Remove old symlink to prevent recursion
dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed
dir_prep "$saves_folder/pico-8" "$bios_folder/pico-8/cdata" # PICO-8 saves folder structure was backwards, fixing for consistency. dir_prep "$saves_folder/pico-8" "$bios_folder/pico-8/cdata" # PICO-8 saves folder structure was backwards, fixing for consistency.
cp -f "$config/citra/qt-config.ini" /var/config/citra-emu/qt-config.ini cp -f "$config/citra/qt-config.ini" "$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' /var/config/citra-emu/qt-config.ini sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
cp -fr "$config/yuzu/"* /var/config/yuzu/ cp -fr "$config/yuzu/"* "$XDG_CONFIG_HOME/yuzu/"
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' /var/config/yuzu/qt-config.ini sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$XDG_CONFIG_HOME/yuzu/qt-config.ini"
# Remove unneeded tools folder, as location has changed to RO space # Remove unneeded tools folder, as location has changed to RO space
rm -rfv /var/config/retrodeck/tools/ rm -rfv "$XDG_CONFIG_HOME/retrodeck/tools/"
fi fi
if [[ $(check_version_is_older_than "$version_being_updated" "0.6.4b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.6.4b") == "true" ]]; then
# In version 0.6.4b, the following changes were made: # In version 0.6.4b, the following changes were made:
@ -137,12 +137,12 @@ post_update() {
# In version 0.6.5b, the following changes were made: # In version 0.6.5b, the following changes were made:
# Change Yuzu GPU accuracy to normal for better performance # Change Yuzu GPU accuracy to normal for better performance
set_setting_value $yuzuconf "gpu_accuracy" "0" "yuzu" "Renderer" set_setting_value "$yuzuconf" "gpu_accuracy" "0" "yuzu" "Renderer"
fi fi
if [[ $(check_version_is_older_than "$version_being_updated" "0.7.0b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.7.0b") == "true" ]]; then
# In version 0.7.0b, the following changes were made that required config file updates/reset or other changes to the filesystem: # In version 0.7.0b, the following changes were made that required config file updates/reset or other changes to the filesystem:
# - Update retrodeck.cfg and set new paths to $rdhome by default # - Update retrodeck.cfg and set new paths to $rdhome by default
# - Update PCSX2 and Duckstation configs to latest templates (to accomadate RetroAchievements feature) and move Duckstation config folder from /var/data to /var/config # - Update PCSX2 and Duckstation configs to latest templates (to accomadate RetroAchievements feature) and move Duckstation config folder from $XDG_DATA_HOME to $XDG_CONFIG_HOME
# - New ~/retrodeck/mods and ~/retrodeck/texture_packs directories are added and symlinked to multiple different emulators (where supported) # - New ~/retrodeck/mods and ~/retrodeck/texture_packs directories are added and symlinked to multiple different emulators (where supported)
# - Expose ES-DE gamelists folder to user at ~/retrodeck/gamelists # - Expose ES-DE gamelists folder to user at ~/retrodeck/gamelists
# - Copy new borders into RA config location # - Copy new borders into RA config location
@ -162,52 +162,52 @@ post_update() {
# - Init PICO-8 as it has newly-shipped config files # - Init PICO-8 as it has newly-shipped config files
update_rd_conf # Expand retrodeck.cfg to latest template update_rd_conf # Expand retrodeck.cfg to latest template
set_setting_value $rd_conf "screenshots_folder" "$rdhome/screenshots" set_setting_value "$rd_conf" "screenshots_folder" "$rdhome/screenshots"
set_setting_value $rd_conf "mods_folder" "$rdhome/mods" set_setting_value "$rd_conf" "mods_folder" "$rdhome/mods"
set_setting_value $rd_conf "texture_packs_folder" "$rdhome/texture_packs" set_setting_value "$rd_conf" "texture_packs_folder" "$rdhome/texture_packs"
set_setting_value $rd_conf "borders_folder" "$rdhome/borders" set_setting_value "$rd_conf" "borders_folder" "$rdhome/borders"
conf_read conf_read
mv -f "$pcsx2conf" "$pcsx2conf.bak" mv -f "$pcsx2conf" "$pcsx2conf.bak"
generate_single_patch "$config/PCSX2/PCSX2.ini" "$pcsx2conf.bak" "/var/config/PCSX2/inis/PCSX2-cheevos-upgrade.patch" pcsx2 generate_single_patch "$config/PCSX2/PCSX2.ini" "$pcsx2conf.bak" "$XDG_CONFIG_HOME/PCSX2/inis/PCSX2-cheevos-upgrade.patch" pcsx2
deploy_single_patch "$config/PCSX2/PCSX2.ini" "/var/config/PCSX2/inis/PCSX2-cheevos-upgrade.patch" "$pcsx2conf" deploy_single_patch "$config/PCSX2/PCSX2.ini" "$XDG_CONFIG_HOME/PCSX2/inis/PCSX2-cheevos-upgrade.patch" "$pcsx2conf"
rm -f "/var/config/PCSX2/inis/PCSX2-cheevos-upgrade.patch" rm -f "$XDG_CONFIG_HOME/PCSX2/inis/PCSX2-cheevos-upgrade.patch"
dir_prep "/var/config/duckstation" "/var/data/duckstation" dir_prep "$XDG_CONFIG_HOME/duckstation" "$XDG_DATA_HOME/duckstation"
mv -f "$duckstationconf" "$duckstationconf.bak" mv -f "$duckstationconf" "$duckstationconf.bak"
generate_single_patch "$config/duckstation/settings.ini" "$duckstationconf.bak" "/var/config/duckstation/duckstation-cheevos-upgrade.patch" pcsx2 generate_single_patch "$config/duckstation/settings.ini" "$duckstationconf.bak" "$XDG_CONFIG_HOME/duckstation/duckstation-cheevos-upgrade.patch" pcsx2
deploy_single_patch "$config/duckstation/settings.ini" "/var/config/duckstation/duckstation-cheevos-upgrade.patch" "$duckstationconf" deploy_single_patch "$config/duckstation/settings.ini" "$XDG_CONFIG_HOME/duckstation/duckstation-cheevos-upgrade.patch" "$duckstationconf"
rm -f "/var/config/duckstation/duckstation-cheevos-upgrade.patch" rm -f "$XDG_CONFIG_HOME/duckstation/duckstation-cheevos-upgrade.patch"
create_dir "$mods_folder" create_dir "$mods_folder"
create_dir "$texture_packs_folder" create_dir "$texture_packs_folder"
create_dir "$borders_folder" create_dir "$borders_folder"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$mods_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" dir_prep "$texture_packs_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/Textures"
dir_prep "$mods_folder/Dolphin" "/var/data/dolphin-emu/Load/GraphicMods" dir_prep "$mods_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/GraphicMods"
dir_prep "$texture_packs_folder/Dolphin" "/var/data/dolphin-emu/Load/Textures" dir_prep "$texture_packs_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/Textures"
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods" dir_prep "$mods_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/mods"
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures" dir_prep "$texture_packs_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/textures"
dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" dir_prep "$mods_folder/Yuzu" "$XDG_DATA_HOME/yuzu/load"
dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks" dir_prep "$texture_packs_folder/RetroArch-Mesen" "$XDG_CONFIG_HOME/retroarch/system/HdPacks"
dir_prep "$texture_packs_folder/PPSSPP" "/var/config/ppsspp/PSP/TEXTURES" dir_prep "$texture_packs_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/TEXTURES"
dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures" dir_prep "$texture_packs_folder/PCSX2" "$XDG_CONFIG_HOME/PCSX2/textures"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/cache"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "/var/config/retroarch/system/Mupen64plus/hires_texture" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/hires_texture"
dir_prep "$texture_packs_folder/Duckstation" "/var/config/duckstation/textures" dir_prep "$texture_packs_folder/Duckstation" "$XDG_CONFIG_HOME/duckstation/textures"
dir_prep "$rdhome/gamelists" "/var/config/emulationstation/ES-DE/gamelists" dir_prep "$rdhome/gamelists" "$XDG_CONFIG_HOME/emulationstation/ES-DE/gamelists"
dir_prep "$borders_folder" "/var/config/retroarch/overlays/borders" dir_prep "$borders_folder" "$XDG_CONFIG_HOME/retroarch/overlays/borders"
rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "/var/config/retroarch/overlays/borders/" rsync -rlD --mkpath "/app/retrodeck/config/retroarch/borders/" "$XDG_CONFIG_HOME/retroarch/overlays/borders/"
rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "/var/config/retroarch/config/remaps/" rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "$XDG_CONFIG_HOME/retroarch/config/remaps/"
if [[ ! -f "$bios_folder/capsimg.so" ]]; then if [[ ! -f "$bios_folder/capsimg.so" ]]; then
cp -f "/app/retrodeck/extras/Amiga/capsimg.so" "$bios_folder/capsimg.so" cp -f "/app/retrodeck/extras/Amiga/capsimg.so" "$bios_folder/capsimg.so"
fi fi
cp -f $config/rpcs3/vfs.yml /var/config/rpcs3/vfs.yml cp -f "$config/rpcs3/vfs.yml" "$XDG_CONFIG_HOME/rpcs3/vfs.yml"
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf" sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf"
set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3" set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3"
if [[ -d "$roms_folder/ps3/emudir" ]]; then # The old location exists, meaning the emulator was run at least once. if [[ -d "$roms_folder/ps3/emudir" ]]; then # The old location exists, meaning the emulator was run at least once.
@ -225,7 +225,7 @@ post_update() {
create_dir "$bios_folder/rpcs3/dev_usb000" create_dir "$bios_folder/rpcs3/dev_usb000"
dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3" dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3"
set_setting_value $es_settings "ApplicationUpdaterFrequency" "never" "es_settings" set_setting_value "$es_settings" "ApplicationUpdaterFrequency" "never" "es_settings"
if [[ -f "$saves_folder/duckstation/shared_card_1.mcd" || -f "$saves_folder/duckstation/shared_card_2.mcd" ]]; then if [[ -f "$saves_folder/duckstation/shared_card_1.mcd" || -f "$saves_folder/duckstation/shared_card_2.mcd" ]]; then
configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update, the location of saves and states for Duckstation has been changed.\n\nYour files will be moved automatically, and can now be found at\n\n~.../saves/psx/duckstation/memcards/\nand\n~.../states/psx/duckstation/" configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "As part of this update, the location of saves and states for Duckstation has been changed.\n\nYour files will be moved automatically, and can now be found at\n\n~.../saves/psx/duckstation/memcards/\nand\n~.../states/psx/duckstation/"
@ -233,42 +233,42 @@ post_update() {
create_dir "$saves_folder/psx/duckstation/memcards" create_dir "$saves_folder/psx/duckstation/memcards"
mv "$saves_folder/duckstation/"* "$saves_folder/psx/duckstation/memcards/" mv "$saves_folder/duckstation/"* "$saves_folder/psx/duckstation/memcards/"
rmdir "$saves_folder/duckstation" # File-safe folder cleanup rmdir "$saves_folder/duckstation" # File-safe folder cleanup
unlink "/var/config/duckstation/memcards" unlink "$XDG_CONFIG_HOME/duckstation/memcards"
set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
create_dir "$states_folder/psx" create_dir "$states_folder/psx"
mv -t "$states_folder/psx/" "$states_folder/duckstation" mv -t "$states_folder/psx/" "$states_folder/duckstation"
unlink "/var/config/duckstation/savestates" unlink "$XDG_CONFIG_HOME/duckstation/savestates"
dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates" dir_prep "$states_folder/psx/duckstation" "$XDG_CONFIG_HOME/duckstation/savestates"
rm -rf /var/config/retrodeck/tools rm -rf "$XDG_CONFIG_HOME/retrodeck/tools"
rm -rf /var/config/emulationstation/ES-DE/gamelists/tools/ rm -rf "$XDG_CONFIG_HOME/emulationstation/ES-DE/gamelists/tools/"
mv "$saves_folder/gc/dolphin/EUR" "$saves_folder/gc/dolphin/EU" mv "$saves_folder/gc/dolphin/EUR" "$saves_folder/gc/dolphin/EU"
mv "$saves_folder/gc/dolphin/USA" "$saves_folder/gc/dolphin/US" mv "$saves_folder/gc/dolphin/USA" "$saves_folder/gc/dolphin/US"
mv "$saves_folder/gc/dolphin/JAP" "$saves_folder/gc/dolphin/JP" mv "$saves_folder/gc/dolphin/JAP" "$saves_folder/gc/dolphin/JP"
dir_prep "$saves_folder/gc/dolphin/EU" "/var/data/dolphin-emu/GC/EUR" dir_prep "$saves_folder/gc/dolphin/EU" "$XDG_DATA_HOME/dolphin-emu/GC/EUR"
dir_prep "$saves_folder/gc/dolphin/US" "/var/data/dolphin-emu/GC/USA" dir_prep "$saves_folder/gc/dolphin/US" "$XDG_DATA_HOME/dolphin-emu/GC/USA"
dir_prep "$saves_folder/gc/dolphin/JP" "/var/data/dolphin-emu/GC/JAP" dir_prep "$saves_folder/gc/dolphin/JP" "$XDG_DATA_HOME/dolphin-emu/GC/JAP"
mv "$saves_folder/gc/primehack/EUR" "$saves_folder/gc/primehack/EU" mv "$saves_folder/gc/primehack/EUR" "$saves_folder/gc/primehack/EU"
mv "$saves_folder/gc/primehack/USA" "$saves_folder/gc/primehack/US" mv "$saves_folder/gc/primehack/USA" "$saves_folder/gc/primehack/US"
mv "$saves_folder/gc/primehack/JAP" "$saves_folder/gc/primehack/JP" mv "$saves_folder/gc/primehack/JAP" "$saves_folder/gc/primehack/JP"
dir_prep "$saves_folder/gc/primehack/EU" "/var/data/primehack/GC/EUR" dir_prep "$saves_folder/gc/primehack/EU" "$XDG_DATA_HOME/primehack/GC/EUR"
dir_prep "$saves_folder/gc/primehack/US" "/var/data/primehack/GC/USA" dir_prep "$saves_folder/gc/primehack/US" "$XDG_DATA_HOME/primehack/GC/USA"
dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP" dir_prep "$saves_folder/gc/primehack/JP" "$XDG_DATA_HOME/primehack/GC/JAP"
dir_prep "$saves_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/SAVEDATA" dir_prep "$saves_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/SAVEDATA"
dir_prep "$states_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/PPSSPP_STATE" dir_prep "$states_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/PPSSPP_STATE"
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
sed -i '$ a <string name="UserThemeDirectory" value="" />' "$es_settings" # Add new default line to existing file sed -i '$ a <string name="UserThemeDirectory" value="" />' "$es_settings" # Add new default line to existing file
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
unlink "/var/config/emulationstation/ROMs" unlink "$XDG_CONFIG_HOME/emulationstation/ROMs"
unlink "/var/config/emulationstation/ES-DE/downloaded_media" unlink "$XDG_CONFIG_HOME/emulationstation/ES-DE/downloaded_media"
unlink "/var/config/emulationstation/ES-DE/themes" unlink "$XDG_CONFIG_HOME/emulationstation/ES-DE/themes"
set_setting_value "$raconf" "savestate_auto_load" "false" "retroarch" set_setting_value "$raconf" "savestate_auto_load" "false" "retroarch"
set_setting_value "$raconf" "savestate_auto_save" "false" "retroarch" set_setting_value "$raconf" "savestate_auto_save" "false" "retroarch"
@ -303,7 +303,7 @@ post_update() {
if [[ $(check_version_is_older_than "$version_being_updated" "0.7.3b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.7.3b") == "true" ]]; then
# In version 0.7.3b, there was a bug that prevented the correct creations of the roms/system folders, so we force recreate them. # In version 0.7.3b, there was a bug that prevented the correct creations of the roms/system folders, so we force recreate them.
emulationstation --home /var/config/emulationstation --create-system-dirs emulationstation --home "$XDG_CONFIG_HOME/emulationstation" --create-system-dirs
fi fi
if [[ $(check_version_is_older_than "$version_being_updated" "0.8.0b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.8.0b") == "true" ]]; then
@ -342,8 +342,8 @@ post_update() {
set_setting_value "$raconf" "rewind_enable" "false" "retroarch" set_setting_value "$raconf" "rewind_enable" "false" "retroarch"
# in 3.0 .emulationstation was moved into ES-DE # in 3.0 .emulationstation was moved into ES-DE
log i "Renaming old \"/var/config/emulationstation\" folder as \"/var/config/ES-DE\"" log i "Renaming old \"$XDG_CONFIG_HOME/emulationstation\" folder as \"$XDG_CONFIG_HOME/ES-DE\""
mv -f /var/config/emulationstation /var/config/ES-DE mv -f "$XDG_CONFIG_HOME/emulationstation" "$XDG_CONFIG_HOME/ES-DE"
prepare_component "reset" "es-de" prepare_component "reset" "es-de"
prepare_component "reset" "mame" prepare_component "reset" "mame"
@ -357,7 +357,7 @@ post_update() {
# The save folder of rpcs3 was inverted so we're moving the saves into the real one # The save folder of rpcs3 was inverted so we're moving the saves into the real one
log i "RPCS3 saves needs to be migrated, executing." log i "RPCS3 saves needs to be migrated, executing."
if [[ "$(ls -A $bios_folder/rpcs3/dev_hdd0/home/00000001/savedata)" ]]; then if [[ "$(ls -A "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata")" ]]; then
log i "Existing RPCS3 savedata found, backing up..." log i "Existing RPCS3 savedata found, backing up..."
create_dir "$backups_folder" create_dir "$backups_folder"
zip -rq9 "$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" zip -rq9 "$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
@ -369,7 +369,7 @@ post_update() {
mv "$bios_folder/switch/registered" "$bios_folder/switch/firmware" mv "$bios_folder/switch/registered" "$bios_folder/switch/firmware"
log i "New systems were added in this version, regenerating system folders." log i "New systems were added in this version, regenerating system folders."
#es-de --home "/var/config/" --create-system-dirs #es-de --home "$XDG_CONFIG_HOME/" --create-system-dirs
es-de --create-system-dirs es-de --create-system-dirs
fi # end of 0.8.0b fi # end of 0.8.0b
@ -380,8 +380,8 @@ post_update() {
log i "- Give the user the option to reset Ryujinx, which was not properly initialized in 0.8.0b" log i "- Give the user the option to reset Ryujinx, which was not properly initialized in 0.8.0b"
log d "ES-DE files were moved inside the retrodeck folder, migrating to the new structure" log d "ES-DE files were moved inside the retrodeck folder, migrating to the new structure"
dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections" dir_prep "$rdhome/ES-DE/collections" "$XDG_CONFIG_HOME/ES-DE/collections"
dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists" dir_prep "$rdhome/ES-DE/gamelists" "$XDG_CONFIG_HOME/ES-DE/gamelists"
log i "Moving ES-DE collections, downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\"" log i "Moving ES-DE collections, downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\""
set_setting_value "$es_settings" "MediaDirectory" "$rdhome/ES-DE/downloaded_media" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$rdhome/ES-DE/downloaded_media" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$rdhome/ES-DE/themes" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$rdhome/ES-DE/themes" "es_settings"
@ -389,21 +389,21 @@ post_update() {
mv -f "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed" mv -f "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed"
mv -f "$rdhome/gamelists/"* "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed" && rm -rf "$rdhome/gamelists" mv -f "$rdhome/gamelists/"* "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed" && rm -rf "$rdhome/gamelists"
log i "MAME-SA, migrating samples to the new exposed folder: from \"/var/data/mame/assets/samples\" to \"$bios_folder/mame-sa/samples\"" log i "MAME-SA, migrating samples to the new exposed folder: from \"$XDG_DATA_HOME/mame/assets/samples\" to \"$bios_folder/mame-sa/samples\""
create_dir "$bios_folder/mame-sa/samples" create_dir "$bios_folder/mame-sa/samples"
mv -f "/var/data/mame/assets/samples/"* "$bios_folder/mame-sa/samples" mv -f "$XDG_DATA_HOME/mame/assets/samples/"* "$bios_folder/mame-sa/samples"
set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame" set_setting_value "$mameconf" "samplepath" "$bios_folder/mame-sa/samples" "mame"
log i "Installing the missing ScummVM assets and renaming \"$mods_folder/RetroArch/ScummVM/themes\" into \"theme\"" log i "Installing the missing ScummVM assets and renaming \"$mods_folder/RetroArch/ScummVM/themes\" into \"theme\""
mv -f "$mods_folder/RetroArch/ScummVM/themes" "$mods_folder/RetroArch/ScummVM/theme" mv -f "$mods_folder/RetroArch/ScummVM/themes" "$mods_folder/RetroArch/ScummVM/theme"
unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/extra/*' -d /tmp
unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp unzip -o "$config/retroarch/ScummVM.zip" 'scummvm/theme/*' -d /tmp
mv -f /tmp/scummvm/extra "$mods_folder/RetroArch/ScummVM" mv -f "/tmp/scummvm/extra" "$mods_folder/RetroArch/ScummVM"
mv -f /tmp/scummvm/theme "$mods_folder/RetroArch/ScummVM" mv -f "/tmp/scummvm/theme" "$mods_folder/RetroArch/ScummVM"
rm -rf /tmp/extra /tmp/theme rm -rf "/tmp/extra /tmp/theme"
log i "Placing cheats in \"/var/data/mame/cheat\"" log i "Placing cheats in \"$XDG_DATA_HOME/mame/cheat\""
unzip -j -o "$config/mame/cheat0264.zip" 'cheat.7z' -d "/var/data/mame/cheat" unzip -j -o "$config/mame/cheat0264.zip" 'cheat.7z' -d "$XDG_DATA_HOME/mame/cheat"
log d "Verifying with user if they want to reset Ryujinx" log d "Verifying with user if they want to reset Ryujinx"
if [[ "$(configurator_generic_question_dialog "RetroDECK 0.8.1b Ryujinx Reset" "In RetroDECK 0.8.0b the Ryujinx emulator was not properly initialized for upgrading users.\nThis would cause Ryujinx to not work properly.\n\nWould you like to reset Ryujinx to default RetroDECK settings now?\n\nIf you have made your own changes to the Ryujinx config, you can decline this reset.")" == "true" ]]; then if [[ "$(configurator_generic_question_dialog "RetroDECK 0.8.1b Ryujinx Reset" "In RetroDECK 0.8.0b the Ryujinx emulator was not properly initialized for upgrading users.\nThis would cause Ryujinx to not work properly.\n\nWould you like to reset Ryujinx to default RetroDECK settings now?\n\nIf you have made your own changes to the Ryujinx config, you can decline this reset.")" == "true" ]]; then
@ -413,15 +413,15 @@ post_update() {
fi # end of 0.8.1b fi # end of 0.8.1b
if [[ $(check_version_is_older_than "$version_being_updated" "0.8.2b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.8.2b") == "true" ]]; then
log i "Vita3K changed some paths, reflecting them: moving \"/var/data/Vita3K\" in \"/var/config/Vita3K\"" log i "Vita3K changed some paths, reflecting them: moving \"$XDG_DATA_HOME/Vita3K\" in \"$XDG_CONFIG_HOME/Vita3K\""
move "/var/data/Vita3K" "/var/config/Vita3K" move "$XDG_DATA_HOME/Vita3K" "$XDG_CONFIG_HOME/Vita3K"
log i "Moving ES-DE downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\" due to a RetroDECK Framework bug" log i "Moving ES-DE downloaded_media, gamelist, and themes from \"$rdhome\" to \"$rdhome/ES-DE\" due to a RetroDECK Framework bug"
move "$rdhome/themes" "$rdhome/ES-DE/themes" && log d "Move of \"$rdhome/themes\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/themes" "$rdhome/ES-DE/themes" && log d "Move of \"$rdhome/themes\" in \"$rdhome/ES-DE\" folder completed"
move "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/downloaded_media" "$rdhome/ES-DE/downloaded_media" && log d "Move of \"$rdhome/downloaded_media\" in \"$rdhome/ES-DE\" folder completed"
move "$rdhome/gamelists" "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/gamelists" "$rdhome/ES-DE/gamelists" && log d "Move of \"$rdhome/gamelists/\" in \"$rdhome/ES-DE\" folder completed"
move "$rdhome/collections" "$rdhome/ES-DE/collections" && log d "Move of \"$rdhome/collections/\" in \"$rdhome/ES-DE\" folder completed" move "$rdhome/collections" "$rdhome/ES-DE/collections" && log d "Move of \"$rdhome/collections/\" in \"$rdhome/ES-DE\" folder completed"
log i "Since in this version we moved to a PR build of Ryujinx we need to symlink it." log i "Since in this version we moved to a PR build of Ryujinx we need to symlink it."
ln -sv $ryujinxconf "$(dirname $ryujinxconf)/PRConfig.json" ln -sv "$ryujinxconf" "$(dirname "$ryujinxconf")/PRConfig.json"
fi #end of 0.8.2b fi #end of 0.8.2b
if [[ $(check_version_is_older_than "$version_being_updated" "0.8.3b") == "true" ]]; then if [[ $(check_version_is_older_than "$version_being_updated" "0.8.3b") == "true" ]]; then
@ -605,26 +605,26 @@ post_update() {
# RetroArch # RetroArch
log i "Forcing RetroArch to use the new libretro info path" log i "Forcing RetroArch to use the new libretro info path"
set_setting_value "$raconf" "libretro_info_path" "/var/config/retroarch/cores" "retroarch" set_setting_value "$raconf" "libretro_info_path" "$XDG_CONFIG_HOME/retroarch/cores" "retroarch"
log i "Moving Ryujinx data to the new locations" log i "Moving Ryujinx data to the new locations"
if [[ -d "/var/config/Ryujinx/bis" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/bis" ]]; then
mv -f "/var/config/Ryujinx/bis"/* "$saves_folder/switch/ryujinx/nand" && rm -rf "/var/config/Ryujinx/bis" && log i "Migrated Ryujinx nand data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/bis"/* "$saves_folder/switch/ryujinx/nand" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/bis" && log i "Migrated Ryujinx nand data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/sdcard" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/sdcard" ]]; then
mv -f "/var/config/Ryujinx/sdcard"/* "$saves_folder/switch/ryujinx/sdcard" && rm -rf "/var/config/Ryujinx/sdcard" && log i "Migrated Ryujinx sdcard data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/sdcard"/* "$saves_folder/switch/ryujinx/sdcard" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/sdcard" && log i "Migrated Ryujinx sdcard data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/bis/system/Contents/registered" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/bis/system/Contents/registered" ]]; then
mv -f "/var/config/Ryujinx/bis/system/Contents/registered"/* "$bios_folder/switch/firmware" && rm -rf "/var/config/Ryujinx/bis/system/Contents/registered" && log i "Migration of Ryujinx firmware data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/bis/system/Contents/registered"/* "$bios_folder/switch/firmware" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/bis/system/Contents/registered" && log i "Migration of Ryujinx firmware data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/system" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/system" ]]; then
mv -f "/var/config/Ryujinx/system"/* "$bios_folder/switch/keys" && rm -rf "/var/config/Ryujinx/system" && log i "Migrated Ryujinx keys data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/system"/* "$bios_folder/switch/keys" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/system" && log i "Migrated Ryujinx keys data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/mods" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/mods" ]]; then
mv -f "/var/config/Ryujinx/mods"/* "$mods_folder/ryujinx" && rm -rf "/var/config/Ryujinx/mods" && log i "Migrated Ryujinx mods data to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/mods"/* "$mods_folder/ryujinx" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/mods" && log i "Migrated Ryujinx mods data to the new location"
fi fi
if [[ -d "/var/config/Ryujinx/screenshots" ]]; then if [[ -d "$XDG_CONFIG_HOME/Ryujinx/screenshots" ]]; then
mv -f "/var/config/Ryujinx/screenshots"/* "$screenshots_folder/ryujinx" && rm -rf "/var/config/Ryujinx/screenshots" && log i "Migrated Ryujinx screenshots to the new location" mv -f "$XDG_CONFIG_HOME/Ryujinx/screenshots"/* "$screenshots_folder/ryujinx" && rm -rf "$XDG_CONFIG_HOME/Ryujinx/screenshots" && log i "Migrated Ryujinx screenshots to the new location"
fi fi
fi # end of 0.9.0b fi # end of 0.9.0b
@ -708,7 +708,7 @@ post_update() {
# --- ALWAYS EXECUTED IN 0.9.1b --- # --- ALWAYS EXECUTED IN 0.9.1b ---
log i "Preparing the shaders folder for MAME..." log i "Preparing the shaders folder for MAME..."
shaders_folder=$rdhome/shaders && log i "Shaders folder set to \"$shaders_folder\"" shaders_folder="$rdhome/shaders" && log i "Shaders folder set to \"$shaders_folder\""
conf_write && log i "Done" conf_write && log i "Done"
create_dir "$shaders_folder/mame/bgfx" create_dir "$shaders_folder/mame/bgfx"
set_setting_value "$mameconf" "bgfx_path" "$shaders_folder/mame/bgfx/" "mame" set_setting_value "$mameconf" "bgfx_path" "$shaders_folder/mame/bgfx/" "mame"
@ -717,26 +717,26 @@ post_update() {
log i "Preparing the cheats for RetroArch..." log i "Preparing the cheats for RetroArch..."
create_dir "$cheats_folder/retroarch" create_dir "$cheats_folder/retroarch"
set_setting_value "$raconf" "cheat_database_path" "$cheats_folder/retroarch" "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" 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..." log i "Preparing the cheats for PPSSPP..."
create_dir -d "$cheats_folder/PPSSPP" create_dir -d "$cheats_folder/PPSSPP"
dir_prep "$cheats_folder/PPSSPP" "/var/config/ppsspp/PSP/Cheats" dir_prep "$cheats_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/Cheats"
tar -xzf /app/retrodeck/cheats/ppsspp.tar.gz -C "$cheats_folder/PPSSPP" --overwrite && log i "Cheats for PPSSPP installed" 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..." log i "Preparing the cheats for PCSX2..."
create_dir "$cheats_folder/pcsx2" create_dir "$cheats_folder/pcsx2"
set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders" 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" 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..." log i "Preparing the cheats for MAME..."
create_dir "$cheats_folder/mame" create_dir "$cheats_folder/mame"
set_setting_value "$mameconf" "cheatpath" "$cheats_folder/mame" "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" 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 rm -rf "$XDG_DATA_HOME/mame/cheat"
log i "Preparing the RetroAchievements for Dolphin..." log i "Preparing the RetroAchievements for Dolphin..."
cp -vn "$config/dolphin/"* /var/config/dolphin-emu/ cp -vn "$config/dolphin/"* "$XDG_CONFIG_HOME/dolphin-emu/"
log i "Fixing PrimeHack roms paths..." 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")" "retrodeck" "cheevos"
@ -766,18 +766,17 @@ post_update() {
fi fi
fi fi
fi fi
fi # end of 0.9.2b fi # end of 0.9.2b
# The following commands are run every time. # The following commands are run every time.
if [[ -d "/var/data/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled if [[ -d "$XDG_DATA_HOME/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled
log i "Refreshing installed textures for Dolphin..." log i "Refreshing installed textures for Dolphin..."
rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "/var/data/dolphin-emu/Load/DynamicInputTextures/" && log i "Done" rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "$XDG_DATA_HOME/dolphin-emu/Load/DynamicInputTextures/" && log i "Done"
fi fi
if [[ -d "/var/data/primehack/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled if [[ -d "$XDG_DATA_HOME/primehack/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled
log i "Refreshing installed textures for Dolphin..." log i "Refreshing installed textures for Dolphin..."
rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "/var/data/primehack/Load/DynamicInputTextures/" && log i "Done" rsync -rlD --mkpath "/app/retrodeck/extras/DynamicInputTextures/" "$XDG_DATA_HOME/primehack/Load/DynamicInputTextures/" && log i "Done"
fi fi
if [[ ! -z $(find "$HOME/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") || ! -z $(find "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") ]]; then # If RetroDECK controller profile has been previously installed if [[ ! -z $(find "$HOME/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") || ! -z $(find "$HOME/.var/app/com.valvesoftware.Steam/.steam/steam/controller_base/templates/" -maxdepth 1 -type f -iname "RetroDECK*.vdf") ]]; then # If RetroDECK controller profile has been previously installed
@ -796,11 +795,11 @@ post_update() {
--text="RetroDECK is finishing up the upgrading process, please be patient.\n\n<span foreground='$purple' size='larger'><b>NOTICE - If the process is taking too long:</b></span>\n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n" --text="RetroDECK is finishing up the upgrading process, please be patient.\n\n<span foreground='$purple' size='larger'><b>NOTICE - If the process is taking too long:</b></span>\n\nSome windows might be running in the background that could require your attention: pop-ups from emulators or the upgrade itself that needs user input to continue.\n\n"
conf_read conf_read
version=$hard_version version="$hard_version"
conf_write conf_write
if grep -qF "cooker" <<< $hard_version; then if grep -qF "cooker" <<< "$hard_version"; then
changelog_dialog "$(echo $version | cut -d'-' -f2)" changelog_dialog "$(echo "$version" | cut -d'-' -f2)"
else else
changelog_dialog "$version" changelog_dialog "$version"
fi fi

View file

@ -5,7 +5,7 @@ prepare_component() {
# The actions currently include "reset" and "postmove" # The actions currently include "reset" and "postmove"
# The "reset" action will initialize the component # The "reset" action will initialize the component
# The "postmove" action will update the component settings after one or more RetroDECK folders were moved # The "postmove" action will update the component settings after one or more RetroDECK folders were moved
# An component can be called by name, by parent folder name in the /var/config root or use the option "all" to perform the action on all components equally # An component can be called by name, by parent folder name in the $XDG_CONFIG_HOME root or use the option "all" to perform the action on all components equally
# USAGE: prepare_component "$action" "$component" "$call_source(optional)" # USAGE: prepare_component "$action" "$component" "$call_source(optional)"
if [[ "$1" == "--list" ]]; then if [[ "$1" == "--list" ]]; then
@ -76,8 +76,8 @@ prepare_component() {
log d "Logs folder moved to $logs_folder and linked back to $rd_logs_folder" log d "Logs folder moved to $logs_folder and linked back to $rd_logs_folder"
fi fi
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
create_dir "/var/config/retrodeck/godot" # TODO: what is this for? Can we delete it or add it to the retrodeck.cfg so the folder will be created by the above script? create_dir "$XDG_CONFIG_HOME/retrodeck/godot" # TODO: what is this for? Can we delete it or add it to the retrodeck.cfg so the folder will be created by the above script?
fi fi
if [[ "$action" == "postmove" ]]; then # Update the paths of any folders that came with the retrodeck folder during a move if [[ "$action" == "postmove" ]]; then # Update the paths of any folders that came with the retrodeck folder during a move
@ -89,7 +89,7 @@ prepare_component() {
declare -g "$current_setting_name=$rdhome/${current_setting_value#*retrodeck/}" declare -g "$current_setting_name=$rdhome/${current_setting_value#*retrodeck/}"
fi fi
fi fi
done < <(grep -v '^\s*$' $rd_conf | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f') done < <(grep -v '^\s*$' "$rd_conf" | awk '/^\[paths\]/{f=1;next} /^\[/{f=0} f')
dir_prep "$logs_folder" "$rd_logs_folder" dir_prep "$logs_folder" "$rd_logs_folder"
fi fi
fi fi
@ -100,16 +100,16 @@ prepare_component() {
log i "Prepearing ES-DE" log i "Prepearing ES-DE"
log i "--------------------------------" log i "--------------------------------"
if [[ "$action" == "reset" ]]; then if [[ "$action" == "reset" ]]; then
rm -rf /var/config/ES-DE rm -rf "$XDG_CONFIG_HOME/ES-DE"
create_dir /var/config/ES-DE/settings create_dir "$XDG_CONFIG_HOME/ES-DE/settings"
log d "Prepearing es_settings.xml" log d "Prepearing es_settings.xml"
cp -f /app/retrodeck/es_settings.xml /var/config/ES-DE/settings/es_settings.xml cp -f "/app/retrodeck/es_settings.xml" "$XDG_CONFIG_HOME/ES-DE/settings/es_settings.xml"
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
dir_prep "$rdhome/ES-DE/gamelists" "/var/config/ES-DE/gamelists" dir_prep "$rdhome/ES-DE/gamelists" "$XDG_CONFIG_HOME/ES-DE/gamelists"
dir_prep "$rdhome/ES-DE/collections" "/var/config/ES-DE/collections" dir_prep "$rdhome/ES-DE/collections" "$XDG_CONFIG_HOME/ES-DE/collections"
dir_prep "$rdhome/ES-DE/custom_systems" "/var/config/ES-DE/custom_systems" dir_prep "$rdhome/ES-DE/custom_systems" "$XDG_CONFIG_HOME/ES-DE/custom_systems"
log d "Generating roms system folders" log d "Generating roms system folders"
es-de --create-system-dirs es-de --create-system-dirs
update_splashscreens update_splashscreens
@ -118,7 +118,7 @@ prepare_component() {
set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings" set_setting_value "$es_settings" "ROMDirectory" "$roms_folder" "es_settings"
set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings" set_setting_value "$es_settings" "MediaDirectory" "$media_folder" "es_settings"
set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings" set_setting_value "$es_settings" "UserThemeDirectory" "$themes_folder" "es_settings"
dir_prep "$rdhome/gamelists" "/var/config/ES-DE/gamelists" dir_prep "$rdhome/gamelists" "$XDG_CONFIG_HOME/ES-DE/gamelists"
fi fi
fi fi
@ -128,7 +128,7 @@ prepare_component() {
log i "Prepearing Steam ROM Manager" log i "Prepearing Steam ROM Manager"
log i "-----------------------------" log i "-----------------------------"
local srm_userdata="/var/config/steam-rom-manager/userData" local srm_userdata="$XDG_CONFIG_HOME/steam-rom-manager/userData"
create_dir -d "$srm_userdata" create_dir -d "$srm_userdata"
cp -fv "$config/steam-rom-manager/"*.json "$srm_userdata" cp -fv "$config/steam-rom-manager/"*.json "$srm_userdata"
cp -fvr "$config/steam-rom-manager/manifests" "$srm_userdata" cp -fvr "$config/steam-rom-manager/manifests" "$srm_userdata"
@ -148,28 +148,28 @@ prepare_component() {
if [[ "$action" == "reset" ]]; then # Run reset-only commands if [[ "$action" == "reset" ]]; then # Run reset-only commands
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/retroarch" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/retroarch"
cp -fv $config/retroarch/retroarch.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/" cp -fv "$config/retroarch/retroarch.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/"
cp -fv $config/retroarch/retroarch-core-options.cfg "$multi_user_data_folder/$SteamAppUser/config/retroarch/" cp -fv "$config/retroarch/retroarch-core-options.cfg" "$multi_user_data_folder/$SteamAppUser/config/retroarch/"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/retroarch create_dir -d "$XDG_CONFIG_HOME/retroarch"
dir_prep "$bios_folder" "/var/config/retroarch/system" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/retroarch/system"
dir_prep "$rdhome/logs/retroarch" "/var/config/retroarch/logs" dir_prep "$rdhome/logs/retroarch" "$XDG_CONFIG_HOME/retroarch/logs"
create_dir -d "/var/config/retroarch/shaders/" create_dir -d "$XDG_CONFIG_HOME/retroarch/shaders/"
if [[ -d "$cheats_folder/retroarch" && "$(ls -A $cheats_folder/retroarch)" ]]; then if [[ -d "$cheats_folder/retroarch" && "$(ls -A "$cheats_folder/retroarch")" ]]; then
backup_file="$backups_folder/cheats/retroarch-$(date +%y%m%d).tar.gz" backup_file="$backups_folder/cheats/retroarch-$(date +%y%m%d).tar.gz"
create_dir "$(dirname "$backup_file")" create_dir "$(dirname "$backup_file")"
tar -czf "$backup_file" -C "$cheats_folder" retroarch tar -czf "$backup_file" -C "$cheats_folder" retroarch
log i "RetroArch cheats backed up to $backup_file" log i "RetroArch cheats backed up to $backup_file"
fi fi
create_dir -d "$cheats_folder/retroarch" create_dir -d "$cheats_folder/retroarch"
tar --strip-components=1 -xzf /app/retrodeck/cheats/retroarch.tar.gz -C "$cheats_folder/retroarch" --overwrite tar --strip-components=1 -xzf "/app/retrodeck/cheats/retroarch.tar.gz" -C "$cheats_folder/retroarch" --overwrite
cp -rf /app/share/libretro/shaders /var/config/retroarch/ cp -rf "/app/share/libretro/shaders" "$XDG_CONFIG_HOME/retroarch/"
dir_prep "$shaders_folder/retroarch" "/var/config/retroarch/shaders" dir_prep "$shaders_folder/retroarch" "$XDG_CONFIG_HOME/retroarch/shaders"
cp -fv $config/retroarch/retroarch.cfg /var/config/retroarch/ cp -fv "$config/retroarch/retroarch.cfg" "$XDG_CONFIG_HOME/retroarch/"
cp -fv $config/retroarch/retroarch-core-options.cfg /var/config/retroarch/ cp -fv "$config/retroarch/retroarch-core-options.cfg" "$XDG_CONFIG_HOME/retroarch/"
rsync -rlD --mkpath "$config/retroarch/core-overrides/" "/var/config/retroarch/config/" rsync -rlD --mkpath "$config/retroarch/core-overrides/" "$XDG_CONFIG_HOME/retroarch/config/"
rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "/var/config/retroarch/config/remaps/" rsync -rlD --mkpath "$config/retrodeck/presets/remaps/" "$XDG_CONFIG_HOME/retroarch/config/remaps/"
dir_prep "$borders_folder" "/var/config/retroarch/overlays/borders" dir_prep "$borders_folder" "$XDG_CONFIG_HOME/retroarch/overlays/borders"
set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch" set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch"
set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch" set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch"
set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch" set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch"
@ -244,9 +244,9 @@ prepare_component() {
set_setting_value "$ra_scummvm_conf" "savepath" "$saves_folder/scummvm" "libretro_scummvm" "scummvm" set_setting_value "$ra_scummvm_conf" "savepath" "$saves_folder/scummvm" "libretro_scummvm" "scummvm"
set_setting_value "$ra_scummvm_conf" "browser_lastpath" "$roms_folder/scummvm" "libretro_scummvm" "scummvm" set_setting_value "$ra_scummvm_conf" "browser_lastpath" "$roms_folder/scummvm" "libretro_scummvm" "scummvm"
dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks" dir_prep "$texture_packs_folder/RetroArch-Mesen" "$XDG_CONFIG_HOME/retroarch/system/HdPacks"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/cache"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "/var/config/retroarch/system/Mupen64plus/hires_texture" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/hires_texture"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -272,12 +272,12 @@ prepare_component() {
set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "savestate_auto_save")" "retrodeck" "savestate_auto_save" set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "savestate_auto_save")" "retrodeck" "savestate_auto_save"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder" "/var/config/retroarch/system" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/retroarch/system"
dir_prep "$logs_folder/retroarch" "/var/config/retroarch/logs" dir_prep "$logs_folder/retroarch" "$XDG_CONFIG_HOME/retroarch/logs"
dir_prep "$shaders_folder/retroarch" "/var/config/retroarch/shaders" dir_prep "$shaders_folder/retroarch" "$XDG_CONFIG_HOME/retroarch/shaders"
dir_prep "$texture_packs_folder/RetroArch-Mesen" "/var/config/retroarch/system/HdPacks" dir_prep "$texture_packs_folder/RetroArch-Mesen" "$XDG_CONFIG_HOME/retroarch/system/HdPacks"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "/var/config/retroarch/system/Mupen64plus/cache" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/cache" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/cache"
dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "/var/config/retroarch/system/Mupen64plus/hires_texture" dir_prep "$texture_packs_folder/RetroArch-Mupen64Plus/hires_texture" "$XDG_CONFIG_HOME/retroarch/system/Mupen64plus/hires_texture"
set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch" set_setting_value "$raconf" "savefile_directory" "$saves_folder" "retroarch"
set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch" set_setting_value "$raconf" "savestate_directory" "$states_folder" "retroarch"
set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch" set_setting_value "$raconf" "screenshot_directory" "$screenshots_folder" "retroarch"
@ -294,15 +294,15 @@ prepare_component() {
log i "------------------------" log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/citra-emu" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/citra-emu"
cp -fv $config/citra/qt-config.ini "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" cp -fv "$config/citra/qt-config.ini" "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/citra-emu/qt-config.ini" "Paths\screenshotPath" "$screenshots_folder" "citra" "UI"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/citra-emu" "/var/config/citra-emu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/citra-emu" "$XDG_CONFIG_HOME/citra-emu"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/citra-emu/ create_dir -d "$XDG_CONFIG_HOME/citra-emu/"
cp -f $config/citra/qt-config.ini /var/config/citra-emu/qt-config.ini cp -f "$config/citra/qt-config.ini" "$XDG_CONFIG_HOME/citra-emu/qt-config.ini"
set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI" set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI"
@ -311,20 +311,20 @@ prepare_component() {
# Shared actions # Shared actions
create_dir "$saves_folder/n3ds/citra/nand/" create_dir "$saves_folder/n3ds/citra/nand/"
create_dir "$saves_folder/n3ds/citra/sdmc/" create_dir "$saves_folder/n3ds/citra/sdmc/"
dir_prep "$bios_folder/citra/sysdata" "/var/data/citra-emu/sysdata" dir_prep "$bios_folder/citra/sysdata" "$XDG_DATA_HOME/citra-emu/sysdata"
dir_prep "$logs_folder/citra" "/var/data/citra-emu/log" dir_prep "$logs_folder/citra" "$XDG_DATA_HOME/citra-emu/log"
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods" dir_prep "$mods_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/mods"
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures" dir_prep "$texture_packs_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap" set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder/citra/sysdata" "/var/data/citra-emu/sysdata" dir_prep "$bios_folder/citra/sysdata" "$XDG_DATA_HOME/citra-emu/sysdata"
dir_prep "$rdhome/logs/citra" "/var/data/citra-emu/log" dir_prep "$rdhome/logs/citra" "$XDG_DATA_HOME/citra-emu/log"
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods" dir_prep "$mods_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/mods"
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures" dir_prep "$texture_packs_folder/Citra" "$XDG_DATA_HOME/citra-emu/load/textures"
set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage" set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage" set_setting_value "$citraconf" "sdmc_directory" "$saves_folder/n3ds/citra/sdmc/" "citra" "Data%20Storage"
set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI" set_setting_value "$citraconf" "Paths\gamedirs\3\path" "$roms_folder/n3ds" "citra" "UI"
@ -344,10 +344,10 @@ prepare_component() {
cp -fr "$config/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/" cp -fr "$config/cemu/"* "$multi_user_data_folder/$SteamAppUser/config/Cemu/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "mlc_path" "$bios_folder/cemu" "cemu"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/Cemu/settings.ini" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "/var/config/Cemu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/Cemu" "$XDG_CONFIG_HOME/Cemu"
else else
create_dir -d /var/config/Cemu/ create_dir -d "$XDG_CONFIG_HOME/Cemu/"
cp -fr "$config/cemu/"* /var/config/Cemu/ cp -fr "$config/cemu/"* "$XDG_CONFIG_HOME/Cemu/"
set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu" set_setting_value "$cemuconf" "mlc_path" "$bios_folder/cemu" "cemu"
set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths" set_setting_value "$cemuconf" "Entry" "$roms_folder/wiiu" "cemu" "GamePaths"
if [[ -e "$bios_folder/cemu/keys.txt" ]]; then if [[ -e "$bios_folder/cemu/keys.txt" ]]; then
@ -378,10 +378,10 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath0" "$roms_folder/wii" "dolphin" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath0" "$roms_folder/wii" "dolphin" "General"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath1" "$roms_folder/gc" "dolphin" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "ISOPath1" "$roms_folder/gc" "dolphin" "General"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu/Dolphin.ini" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" "/var/config/dolphin-emu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/dolphin-emu" "$XDG_CONFIG_HOME/dolphin-emu"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/dolphin-emu/ create_dir -d "$XDG_CONFIG_HOME/dolphin-emu/"
cp -fvr "$config/dolphin/"* /var/config/dolphin-emu/ cp -fvr "$config/dolphin/"* "$XDG_CONFIG_HOME/dolphin-emu/"
set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA" set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA"
set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA" set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA"
set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General" set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General"
@ -389,27 +389,27 @@ prepare_component() {
set_setting_value "$dolphinconf" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General" set_setting_value "$dolphinconf" "WiiSDCardPath" "$saves_folder/wii/dolphin/sd.raw" "dolphin" "General"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/gc/dolphin/EU" "/var/data/dolphin-emu/GC/EUR" # TODO: Multi-user one-off dir_prep "$saves_folder/gc/dolphin/EU" "$XDG_DATA_HOME/dolphin-emu/GC/EUR" # TODO: Multi-user one-off
dir_prep "$saves_folder/gc/dolphin/US" "/var/data/dolphin-emu/GC/USA" # TODO: Multi-user one-off dir_prep "$saves_folder/gc/dolphin/US" "$XDG_DATA_HOME/dolphin-emu/GC/USA" # TODO: Multi-user one-off
dir_prep "$saves_folder/gc/dolphin/JP" "/var/data/dolphin-emu/GC/JAP" # TODO: Multi-user one-off dir_prep "$saves_folder/gc/dolphin/JP" "$XDG_DATA_HOME/dolphin-emu/GC/JAP" # TODO: Multi-user one-off
dir_prep "$screenshots_folder" "/var/data/dolphin-emu/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/dolphin-emu/ScreenShots"
dir_prep "$states_folder/dolphin" "/var/data/dolphin-emu/StateSaves" dir_prep "$states_folder/dolphin" "$XDG_DATA_HOME/dolphin-emu/StateSaves"
dir_prep "$saves_folder/wii/dolphin" "/var/data/dolphin-emu/Wii" dir_prep "$saves_folder/wii/dolphin" "$XDG_DATA_HOME/dolphin-emu/Wii"
dir_prep "$mods_folder/Dolphin" "/var/data/dolphin-emu/Load/GraphicMods" dir_prep "$mods_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/GraphicMods"
dir_prep "$texture_packs_folder/Dolphin" "/var/data/dolphin-emu/Load/Textures" dir_prep "$texture_packs_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/Textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "dolphin" "$(get_setting_value "$rd_defaults" "dolphin" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "dolphin" "$(get_setting_value "$rd_defaults" "dolphin" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$saves_folder/gc/dolphin/EU" "/var/data/dolphin-emu/GC/EUR" dir_prep "$saves_folder/gc/dolphin/EU" "$XDG_DATA_HOME/dolphin-emu/GC/EUR"
dir_prep "$saves_folder/gc/dolphin/US" "/var/data/dolphin-emu/GC/USA" dir_prep "$saves_folder/gc/dolphin/US" "$XDG_DATA_HOME/dolphin-emu/GC/USA"
dir_prep "$saves_folder/gc/dolphin/JP" "/var/data/dolphin-emu/GC/JAP" dir_prep "$saves_folder/gc/dolphin/JP" "$XDG_DATA_HOME/dolphin-emu/GC/JAP"
dir_prep "$screenshots_folder" "/var/data/dolphin-emu/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/dolphin-emu/ScreenShots"
dir_prep "$states_folder/dolphin" "/var/data/dolphin-emu/StateSaves" dir_prep "$states_folder/dolphin" "$XDG_DATA_HOME/dolphin-emu/StateSaves"
dir_prep "$saves_folder/wii/dolphin" "/var/data/dolphin-emu/Wii" dir_prep "$saves_folder/wii/dolphin" "$XDG_DATA_HOME/dolphin-emu/Wii"
dir_prep "$mods_folder/Dolphin" "/var/data/dolphin-emu/Load/GraphicMods" dir_prep "$mods_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/GraphicMods"
dir_prep "$texture_packs_folder/Dolphin" "/var/data/dolphin-emu/Load/Textures" dir_prep "$texture_packs_folder/Dolphin" "$XDG_DATA_HOME/dolphin-emu/Load/Textures"
set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA" set_setting_value "$dolphinconf" "BIOS" "$bios_folder" "dolphin" "GBA"
set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA" set_setting_value "$dolphinconf" "SavesPath" "$saves_folder/gba" "dolphin" "GBA"
set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General" set_setting_value "$dolphinconf" "ISOPath0" "$roms_folder/wii" "dolphin" "General"
@ -432,11 +432,11 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards"
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/duckstation" "/var/config/duckstation" dir_prep "$multi_user_data_folder/$SteamAppUser/config/duckstation" "$XDG_CONFIG_HOME/duckstation"
else # Single-user actions else # Single-user actions
create_dir -d "/var/config/duckstation/" create_dir -d "$XDG_CONFIG_HOME/duckstation/"
create_dir "$saves_folder/psx/duckstation/memcards" create_dir "$saves_folder/psx/duckstation/memcards"
cp -fv "$config/duckstation/"* /var/config/duckstation cp -fv "$config/duckstation/"* "$XDG_CONFIG_HOME/duckstation"
set_setting_value "$duckstationconf" "SearchDirectory" "$bios_folder" "duckstation" "BIOS" set_setting_value "$duckstationconf" "SearchDirectory" "$bios_folder" "duckstation" "BIOS"
set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
@ -444,8 +444,8 @@ prepare_component() {
set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
fi fi
# Shared actions # Shared actions
dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates" # This is hard-coded in Duckstation, always needed dir_prep "$states_folder/psx/duckstation" "$XDG_CONFIG_HOME/duckstation/savestates" # This is hard-coded in Duckstation, always needed
dir_prep "$texture_packs_folder/Duckstation" "/var/config/duckstation/textures" dir_prep "$texture_packs_folder/Duckstation" "$XDG_CONFIG_HOME/duckstation/textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "duckstation" "$(get_setting_value "$rd_defaults" "duckstation" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "duckstation" "$(get_setting_value "$rd_defaults" "duckstation" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -459,8 +459,8 @@ prepare_component() {
set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Card2Path" "$saves_folder/psx/duckstation/memcards/shared_card_2.mcd" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards" set_setting_value "$duckstationconf" "Directory" "$saves_folder/psx/duckstation/memcards" "duckstation" "MemoryCards"
set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList" set_setting_value "$duckstationconf" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
dir_prep "$states_folder/psx/duckstation" "/var/config/duckstation/savestates" # This is hard-coded in Duckstation, always needed dir_prep "$states_folder/psx/duckstation" "$XDG_CONFIG_HOME/duckstation/savestates" # This is hard-coded in Duckstation, always needed
dir_prep "$texture_packs_folder/Duckstation" "/var/config/duckstation/textures" dir_prep "$texture_packs_folder/Duckstation" "$XDG_CONFIG_HOME/duckstation/textures"
fi fi
fi fi
@ -472,16 +472,16 @@ prepare_component() {
log i "----------------------" log i "----------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/melonDS/" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/melonDS/"
cp -fvr $config/melonds/melonDS.ini "$multi_user_data_folder/$SteamAppUser/config/melonDS/" cp -fvr "$config/melonds/melonDS.ini" "$multi_user_data_folder/$SteamAppUser/config/melonDS/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "FirmwarePath" "$bios_folder/firmware.bin" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "FirmwarePath" "$bios_folder/firmware.bin" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SaveFilePath" "$saves_folder/nds/melonds" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SaveFilePath" "$saves_folder/nds/melonds" "melonds"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SavestatePath" "$states_folder/nds/melonds" "melonds" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/melonDS/melonDS.ini" "SavestatePath" "$states_folder/nds/melonds" "melonds"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/melonDS" "/var/config/melonDS" dir_prep "$multi_user_data_folder/$SteamAppUser/config/melonDS" "$XDG_CONFIG_HOME/melonDS"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/melonDS/ create_dir -d "$XDG_CONFIG_HOME/melonDS/"
cp -fvr $config/melonds/melonDS.ini /var/config/melonDS/ cp -fvr "$config/melonds/melonDS.ini" "$XDG_CONFIG_HOME/melonDS/"
set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds" set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds"
@ -491,10 +491,10 @@ prepare_component() {
# Shared actions # Shared actions
create_dir "$saves_folder/nds/melonds" create_dir "$saves_folder/nds/melonds"
create_dir "$states_folder/nds/melonds" create_dir "$states_folder/nds/melonds"
dir_prep "$bios_folder" "/var/config/melonDS/bios" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/melonDS/bios"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder" "/var/config/melonDS/bios" dir_prep "$bios_folder" "$XDG_CONFIG_HOME/melonDS/bios"
set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds" set_setting_value "$melondsconf" "BIOS9Path" "$bios_folder/bios9.bin" "melonds"
set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds" set_setting_value "$melondsconf" "BIOS7Path" "$bios_folder/bios7.bin" "melonds"
set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds" set_setting_value "$melondsconf" "FirmwarePath" "$bios_folder/firmware.bin" "melonds"
@ -517,29 +517,29 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/PCSX2/inis/PCSX2.ini" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/PCSX2" "/var/config/PCSX2" dir_prep "$multi_user_data_folder/$SteamAppUser/config/PCSX2" "$XDG_CONFIG_HOME/PCSX2"
else # Single-user actions else # Single-user actions
create_dir -d "/var/config/PCSX2/inis" create_dir -d "$XDG_CONFIG_HOME/PCSX2/inis"
cp -fvr "$config/PCSX2/"* /var/config/PCSX2/inis/ cp -fvr "$config/PCSX2/"* "$XDG_CONFIG_HOME/PCSX2/inis/"
set_setting_value "$pcsx2conf" "Bios" "$bios_folder" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "Bios" "$bios_folder" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "Snapshots" "$screenshots_folder" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "Snapshots" "$screenshots_folder" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "SaveStates" "$states_folder/ps2/pcsx2" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders" set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders"
if [[ -d "$cheats_folder/pcsx2" && "$(ls -A $cheats_folder/pcsx2)" ]]; then if [[ -d "$cheats_folder/pcsx2" && "$(ls -A "$cheats_folder/pcsx2")" ]]; then
backup_file="$backups_folder/cheats/pcsx2-$(date +%y%m%d).tar.gz" backup_file="$backups_folder/cheats/pcsx2-$(date +%y%m%d).tar.gz"
create_dir "$(dirname $backup_file)" create_dir "$(dirname "$backup_file")"
tar -czf "$backup_file" -C "$cheats_folder" pcsx2 tar -czf "$backup_file" -C "$cheats_folder" pcsx2
log i "PCSX2 cheats backed up to $backup_file" log i "PCSX2 cheats backed up to $backup_file"
fi fi
create_dir -d "$cheats_folder/pcsx2" create_dir -d "$cheats_folder/pcsx2"
tar --strip-components=1 -xzf /app/retrodeck/cheats/pcsx2.tar.gz -C "$cheats_folder/pcsx2" --overwrite tar --strip-components=1 -xzf "/app/retrodeck/cheats/pcsx2.tar.gz" -C "$cheats_folder/pcsx2" --overwrite
fi fi
# Shared actions # Shared actions
create_dir "$saves_folder/ps2/pcsx2/memcards" create_dir "$saves_folder/ps2/pcsx2/memcards"
create_dir "$states_folder/ps2/pcsx2" create_dir "$states_folder/ps2/pcsx2"
dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures" dir_prep "$texture_packs_folder/PCSX2" "$XDG_CONFIG_HOME/PCSX2/textures"
# Reset default preset settings # Reset default preset settings
set_setting_value "$rd_conf" "pcsx2" "$(get_setting_value "$rd_defaults" "pcsx2" "retrodeck" "cheevos")" "retrodeck" "cheevos" set_setting_value "$rd_conf" "pcsx2" "$(get_setting_value "$rd_defaults" "pcsx2" "retrodeck" "cheevos")" "retrodeck" "cheevos"
@ -554,7 +554,7 @@ prepare_component() {
set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders" set_setting_value "$pcsx2conf" "MemoryCards" "$saves_folder/ps2/pcsx2/memcards" "pcsx2" "Folders"
set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList" set_setting_value "$pcsx2conf" "RecursivePaths" "$roms_folder/ps2" "pcsx2" "GameList"
set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders" set_setting_value "$pcsx2conf" "Cheats" "$cheats_folder/pcsx2" "Folders"
dir_prep "$texture_packs_folder/PCSX2" "/var/config/PCSX2/textures" dir_prep "$texture_packs_folder/PCSX2" "$XDG_CONFIG_HOME/PCSX2/textures"
fi fi
fi fi
@ -581,25 +581,25 @@ prepare_component() {
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/"
cp -fv "$config/ppssppsdl/"* "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/" cp -fv "$config/ppssppsdl/"* "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/ppsspp.ini" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/ppsspp/PSP/SYSTEM/ppsspp.ini" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/ppsspp" "/var/config/ppsspp" dir_prep "$multi_user_data_folder/$SteamAppUser/config/ppsspp" "$XDG_CONFIG_HOME/ppsspp"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/ppsspp/PSP/SYSTEM/ create_dir -d "$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/"
cp -fv "$config/ppssppsdl/"* /var/config/ppsspp/PSP/SYSTEM/ cp -fv "$config/ppssppsdl/"* "$XDG_CONFIG_HOME/ppsspp/PSP/SYSTEM/"
set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/SAVEDATA" dir_prep "$saves_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/SAVEDATA"
dir_prep "$states_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/PPSSPP_STATE" dir_prep "$states_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/PPSSPP_STATE"
dir_prep "$texture_packs_folder/PPSSPP" "/var/config/ppsspp/PSP/TEXTURES" dir_prep "$texture_packs_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/TEXTURES"
create_dir -d "$cheats_folder/PPSSPP" create_dir -d "$cheats_folder/PPSSPP"
dir_prep "$cheats_folder/PPSSPP" "/var/config/ppsspp/PSP/Cheats" dir_prep "$cheats_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/Cheats"
if [[ -d "$cheats_folder/PPSSPP" && "$(ls -A "$cheats_folder"/PPSSPP)" ]]; then if [[ -d "$cheats_folder/PPSSPP" && "$(ls -A "$cheats_folder"/PPSSPP)" ]]; then
backup_file="$backups_folder/cheats/PPSSPP-$(date +%y%m%d).tar.gz" backup_file="$backups_folder/cheats/PPSSPP-$(date +%y%m%d).tar.gz"
create_dir "$(dirname "$backup_file")" create_dir "$(dirname "$backup_file")"
tar -czf "$backup_file" -C "$cheats_folder" PPSSPP tar -czf "$backup_file" -C "$cheats_folder" PPSSPP
log i "PPSSPP cheats backed up to $backup_file" log i "PPSSPP cheats backed up to $backup_file"
fi fi
tar -xzf /app/retrodeck/cheats/ppsspp.tar.gz -C "$cheats_folder/PPSSPP" --overwrite tar -xzf "/app/retrodeck/cheats/ppsspp.tar.gz" -C "$cheats_folder/PPSSPP" --overwrite
# Reset default preset settings # Reset default preset settings
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")" "retrodeck" "cheevos"
@ -607,10 +607,10 @@ prepare_component() {
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General" set_setting_value "$ppssppconf" "CurrentDirectory" "$roms_folder/psp" "ppsspp" "General"
dir_prep "$saves_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/SAVEDATA" dir_prep "$saves_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/SAVEDATA"
dir_prep "$states_folder/PSP/PPSSPP-SA" "/var/config/ppsspp/PSP/PPSSPP_STATE" dir_prep "$states_folder/PSP/PPSSPP-SA" "$XDG_CONFIG_HOME/ppsspp/PSP/PPSSPP_STATE"
dir_prep "$texture_packs_folder/PPSSPP" "/var/config/ppsspp/PSP/TEXTURES" dir_prep "$texture_packs_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/TEXTURES"
dir_prep "$cheats_folder/PPSSPP" "/var/config/ppsspp/PSP/Cheats" dir_prep "$cheats_folder/PPSSPP" "$XDG_CONFIG_HOME/ppsspp/PSP/Cheats"
fi fi
fi fi
@ -623,25 +623,25 @@ prepare_component() {
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/primehack" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/primehack"
cp -fvr "$config/primehack/config/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/" cp -fvr "$config/primehack/config/"* "$multi_user_data_folder/$SteamAppUser/config/primehack/"
set_setting_value ""$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini"" "ISOPath0" "$roms_folder/wii" "primehack" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini" "ISOPath0" "$roms_folder/wii" "primehack" "General"
set_setting_value ""$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini"" "ISOPath1" "$roms_folder/gc" "primehack" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/primehack/Dolphin.ini" "ISOPath1" "$roms_folder/gc" "primehack" "General"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/primehack" "/var/config/primehack" dir_prep "$multi_user_data_folder/$SteamAppUser/config/primehack" "$XDG_CONFIG_HOME/primehack"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/primehack/ create_dir -d "$XDG_CONFIG_HOME/primehack/"
cp -fvr "$config/primehack/config/"* /var/config/primehack/ cp -fvr "$config/primehack/config/"* "$XDG_CONFIG_HOME/primehack/"
set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/wii" "primehack" "General" set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/wii" "primehack" "General"
set_setting_value "$primehackconf" "ISOPath1" "$roms_folder/gc" "primehack" "General" set_setting_value "$primehackconf" "ISOPath1" "$roms_folder/gc" "primehack" "General"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/gc/primehack/EU" "/var/data/primehack/GC/EUR" dir_prep "$saves_folder/gc/primehack/EU" "$XDG_DATA_HOME/primehack/GC/EUR"
dir_prep "$saves_folder/gc/primehack/US" "/var/data/primehack/GC/USA" dir_prep "$saves_folder/gc/primehack/US" "$XDG_DATA_HOME/primehack/GC/USA"
dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP" dir_prep "$saves_folder/gc/primehack/JP" "$XDG_DATA_HOME/primehack/GC/JAP"
dir_prep "$screenshots_folder" "/var/data/primehack/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/primehack/ScreenShots"
dir_prep "$states_folder/primehack" "/var/data/primehack/StateSaves" dir_prep "$states_folder/primehack" "$XDG_DATA_HOME/primehack/StateSaves"
create_dir /var/data/primehack/Wii/ create_dir "$XDG_DATA_HOME/primehack/Wii/"
dir_prep "$saves_folder/wii/primehack" "/var/data/primehack/Wii" dir_prep "$saves_folder/wii/primehack" "$XDG_DATA_HOME/primehack/Wii"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$mods_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" dir_prep "$texture_packs_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/Textures"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
cp -fvr "$config/primehack/data/"* "$multi_user_data_folder/$SteamAppUser/data/primehack/" # this must be done after the dirs are prepared as it copying some "mods" cp -fvr "$config/primehack/data/"* "$multi_user_data_folder/$SteamAppUser/data/primehack/" # this must be done after the dirs are prepared as it copying some "mods"
fi fi
@ -650,14 +650,14 @@ prepare_component() {
set_setting_value "$rd_conf" "primehack" "$(get_setting_value "$rd_defaults" "primehack" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "primehack" "$(get_setting_value "$rd_defaults" "primehack" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$saves_folder/gc/primehack/EU" "/var/data/primehack/GC/EUR" dir_prep "$saves_folder/gc/primehack/EU" "$XDG_DATA_HOME/primehack/GC/EUR"
dir_prep "$saves_folder/gc/primehack/US" "/var/data/primehack/GC/USA" dir_prep "$saves_folder/gc/primehack/US" "$XDG_DATA_HOME/primehack/GC/USA"
dir_prep "$saves_folder/gc/primehack/JP" "/var/data/primehack/GC/JAP" dir_prep "$saves_folder/gc/primehack/JP" "$XDG_DATA_HOME/primehack/GC/JAP"
dir_prep "$screenshots_folder" "/var/data/primehack/ScreenShots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/primehack/ScreenShots"
dir_prep "$states_folder/primehack" "/var/data/primehack/StateSaves" dir_prep "$states_folder/primehack" "$XDG_DATA_HOME/primehack/StateSaves"
dir_prep "$saves_folder/wii/primehack" "/var/data/primehack/Wii/" dir_prep "$saves_folder/wii/primehack" "$XDG_DATA_HOME/primehack/Wii/"
dir_prep "$mods_folder/Primehack" "/var/data/primehack/Load/GraphicMods" dir_prep "$mods_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/GraphicMods"
dir_prep "$texture_packs_folder/Primehack" "/var/data/primehack/Load/Textures" dir_prep "$texture_packs_folder/Primehack" "$XDG_DATA_HOME/primehack/Load/Textures"
set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/gc" "primehack" "General" set_setting_value "$primehackconf" "ISOPath0" "$roms_folder/gc" "primehack" "General"
fi fi
fi fi
@ -674,15 +674,15 @@ prepare_component() {
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name. # This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" "/games/" "$roms_folder/ps3/" "rpcs3" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/rpcs3/vfs.yml" "/games/" "$roms_folder/ps3/" "rpcs3"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/rpcs3" "/var/config/rpcs3" dir_prep "$multi_user_data_folder/$SteamAppUser/config/rpcs3" "$XDG_CONFIG_HOME/rpcs3"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/rpcs3/ create_dir -d "$XDG_CONFIG_HOME/rpcs3/"
cp -fr "$config/rpcs3/"* /var/config/rpcs3/ cp -fr "$config/rpcs3/"* "$XDG_CONFIG_HOME/rpcs3/"
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name. # This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf" sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf"
set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3" set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3"
dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
dir_prep "$states_folder/ps3/rpcs3" "/var/config/rpcs3/savestates" dir_prep "$states_folder/ps3/rpcs3" "$XDG_CONFIG_HOME/rpcs3/savestates"
fi fi
# Shared actions # Shared actions
create_dir "$bios_folder/rpcs3/dev_hdd0" create_dir "$bios_folder/rpcs3/dev_hdd0"
@ -711,16 +711,16 @@ prepare_component() {
if [[ $multi_user_mode == "true" ]]; then if [[ $multi_user_mode == "true" ]]; then
rm -rf "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" rm -rf "$multi_user_data_folder/$SteamAppUser/config/Ryujinx"
#create_dir "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system" #create_dir "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/system"
cp -fv $config/ryujinx/* "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" cp -fv "$config/ryujinx/"* "$multi_user_data_folder/$SteamAppUser/config/Ryujinx"
sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json" sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$multi_user_data_folder/$SteamAppUser/config/Ryujinx/Config.json"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" "/var/config/Ryujinx" dir_prep "$multi_user_data_folder/$SteamAppUser/config/Ryujinx" "$XDG_CONFIG_HOME/Ryujinx"
else else
# removing config directory to wipe legacy files # removing config directory to wipe legacy files
log d "Removing \"/var/config/Ryujinx\"" log d "Removing \"$XDG_CONFIG_HOME/Ryujinx\""
rm -rf "/var/config/Ryujinx" rm -rf "$XDG_CONFIG_HOME/Ryujinx"
create_dir "/var/config/Ryujinx/system" create_dir "$XDG_CONFIG_HOME/Ryujinx/system"
cp -fv "$config/ryujinx/Config.json" "$ryujinxconf" cp -fv "$config/ryujinx/Config.json" "$ryujinxconf"
cp -fvr "$config/ryujinx/profiles" "/var/config/Ryujinx/" cp -fvr "$config/ryujinx/profiles" "$XDG_CONFIG_HOME/Ryujinx/"
log d "Replacing placeholders in \"$ryujinxconf\"" log d "Replacing placeholders in \"$ryujinxconf\""
sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$ryujinxconf" sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$ryujinxconf"
create_dir "$logs_folder/ryujinx" create_dir "$logs_folder/ryujinx"
@ -729,11 +729,11 @@ prepare_component() {
fi fi
fi fi
# if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves # if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves
# dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system" # dir_prep "$bios_folder/switch/keys" "$XDG_CONFIG_HOME/Ryujinx/system"
# fi # fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
log d "Replacing placeholders in \"$ryujinxconf\"" log d "Replacing placeholders in \"$ryujinxconf\""
sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$ryujinxconf" # This is an unfortunate one-off because set_setting_value does not currently support JSON
fi fi
fi fi
@ -751,26 +751,26 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/yuzu/qt-config.ini" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "/var/config/yuzu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/yuzu" "$XDG_CONFIG_HOME/yuzu"
else # Single-user actions else # Single-user actions
create_dir -d /var/config/yuzu/ create_dir -d "$XDG_CONFIG_HOME/yuzu/"
cp -fvr "$config/yuzu/"* /var/config/yuzu/ cp -fvr "$config/yuzu/"* "$XDG_CONFIG_HOME/yuzu/"
set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI" set_setting_value "$yuzuconf" "Screenshots\screenshot_path" "$screenshots_folder" "yuzu" "UI"
fi fi
# Shared actions # Shared actions
dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" dir_prep "$saves_folder/switch/yuzu/nand" "$XDG_DATA_HOME/yuzu/nand"
dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" dir_prep "$saves_folder/switch/yuzu/sdmc" "$XDG_DATA_HOME/yuzu/sdmc"
dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" dir_prep "$bios_folder/switch/keys" "$XDG_DATA_HOME/yuzu/keys"
dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered" dir_prep "$bios_folder/switch/firmware" "$XDG_DATA_HOME/yuzu/nand/system/Contents/registered"
dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" dir_prep "$logs_folder/yuzu" "$XDG_DATA_HOME/yuzu/log"
dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/yuzu/screenshots"
dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" dir_prep "$mods_folder/Yuzu" "$XDG_DATA_HOME/yuzu/load"
# removing dead symlinks as they were present in a past version # removing dead symlinks as they were present in a past version
if [ -d $bios_folder/switch ]; then if [ -d "$bios_folder/switch" ]; then
find $bios_folder/switch -xtype l -exec rm {} \; find "$bios_folder/switch" -xtype l -exec rm {} \;
fi fi
# Reset default preset settings # Reset default preset settings
@ -778,13 +778,13 @@ prepare_component() {
set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit" set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
fi fi
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$bios_folder/switch/keys" "/var/data/yuzu/keys" dir_prep "$bios_folder/switch/keys" "$XDG_DATA_HOME/yuzu/keys"
dir_prep "$bios_folder/switch/firmware" "/var/data/yuzu/nand/system/Contents/registered" dir_prep "$bios_folder/switch/firmware" "$XDG_DATA_HOME/yuzu/nand/system/Contents/registered"
dir_prep "$saves_folder/switch/yuzu/nand" "/var/data/yuzu/nand" dir_prep "$saves_folder/switch/yuzu/nand" "$XDG_DATA_HOME/yuzu/nand"
dir_prep "$saves_folder/switch/yuzu/sdmc" "/var/data/yuzu/sdmc" dir_prep "$saves_folder/switch/yuzu/sdmc" "$XDG_DATA_HOME/yuzu/sdmc"
dir_prep "$logs_folder/yuzu" "/var/data/yuzu/log" dir_prep "$logs_folder/yuzu" "$XDG_DATA_HOME/yuzu/log"
dir_prep "$screenshots_folder" "/var/data/yuzu/screenshots" dir_prep "$screenshots_folder" "$XDG_DATA_HOME/yuzu/screenshots"
dir_prep "$mods_folder/Yuzu" "/var/data/yuzu/load" dir_prep "$mods_folder/Yuzu" "$XDG_DATA_HOME/yuzu/load"
set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "nand_directory" "$saves_folder/switch/yuzu/nand" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage" set_setting_value "$yuzuconf" "sdmc_directory" "$saves_folder/switch/yuzu/sdmc" "yuzu" "Data%20Storage"
set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI" set_setting_value "$yuzuconf" "Paths\gamedirs\4\path" "$roms_folder/switch" "yuzu" "UI"
@ -800,8 +800,8 @@ prepare_component() {
log i "Prepearing XEMU" log i "Prepearing XEMU"
log i "------------------------" log i "------------------------"
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
rm -rf "/var/config/xemu" rm -rf "$XDG_CONFIG_HOME/xemu"
rm -rf "/var/data/xemu" rm -rf "$XDG_DATA_HOME/xemu"
create_dir -d "$multi_user_data_folder/$SteamAppUser/config/xemu/" create_dir -d "$multi_user_data_folder/$SteamAppUser/config/xemu/"
cp -fv "$config/xemu/xemu.toml" "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" cp -fv "$config/xemu/xemu.toml" "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "screenshot_dir" "'$screenshots_folder'" "xemu" "General" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "screenshot_dir" "'$screenshots_folder'" "xemu" "General"
@ -809,12 +809,12 @@ prepare_component() {
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "flashrom_path" "'$bios_folder/Complex.bin'" "xemu" "sys.files" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "flashrom_path" "'$bios_folder/Complex.bin'" "xemu" "sys.files"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files"
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files" set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files"
dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "/var/config/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where component will look dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "$XDG_CONFIG_HOME/xemu" # Creating config folder in $XDG_CONFIG_HOME for consistentcy and linking back to original location where component will look
dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "/var/data/xemu/xemu" dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "$XDG_DATA_HOME/xemu/xemu"
else # Single-user actions else # Single-user actions
rm -rf "/var/config/xemu" rm -rf "$XDG_CONFIG_HOME/xemu"
rm -rf "/var/data/xemu" rm -rf "$XDG_DATA_HOME/xemu"
dir_prep "/var/config/xemu" "/var/data/xemu/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where component will look dir_prep "$XDG_CONFIG_HOME/xemu" "$XDG_DATA_HOME/xemu/xemu" # Creating config folder in $XDG_CONFIG_HOME for consistentcy and linking back to original location where component will look
cp -fv "$config/xemu/xemu.toml" "$xemuconf" cp -fv "$config/xemu/xemu.toml" "$xemuconf"
set_setting_value "$xemuconf" "screenshot_dir" "'$screenshots_folder'" "xemu" "General" set_setting_value "$xemuconf" "screenshot_dir" "'$screenshots_folder'" "xemu" "General"
set_setting_value "$xemuconf" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files" set_setting_value "$xemuconf" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files"
@ -848,8 +848,8 @@ prepare_component() {
log d "Figure out what Vita3k needs for multi-user" log d "Figure out what Vita3k needs for multi-user"
else # Single-user actions else # Single-user actions
# NOTE: the component is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K # NOTE: the component is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K
rm -rf "/var/config/Vita3K" rm -rf "$XDG_CONFIG_HOME/Vita3K"
create_dir "/var/config/Vita3K" create_dir "$XDG_CONFIG_HOME/Vita3K"
cp -fvr "$config/vita3k/config.yml" "$vita3kconf" # component config cp -fvr "$config/vita3k/config.yml" "$vita3kconf" # component config
cp -fvr "$config/vita3k/ux0" "$bios_folder/Vita3K/" # User config cp -fvr "$config/vita3k/ux0" "$bios_folder/Vita3K/" # User config
set_setting_value "$vita3kconf" "pref-path" "$bios_folder/Vita3K/" "vita3k" set_setting_value "$vita3kconf" "pref-path" "$bios_folder/Vita3K/" "vita3k"
@ -878,45 +878,45 @@ prepare_component() {
create_dir "$rdhome/screenshots/mame-sa" create_dir "$rdhome/screenshots/mame-sa"
create_dir "$saves_folder/mame-sa/diff" create_dir "$saves_folder/mame-sa/diff"
create_dir "/var/config/ctrlr" create_dir "$XDG_CONFIG_HOME/ctrlr"
create_dir "/var/config/mame/ini" create_dir "$XDG_CONFIG_HOME/mame/ini"
create_dir "/var/config/mame/cfg" create_dir "$XDG_CONFIG_HOME/mame/cfg"
create_dir "/var/config/mame/inp" create_dir "$XDG_CONFIG_HOME/mame/inp"
create_dir "/var/data/mame/plugin-data" create_dir "$XDG_DATA_HOME/mame/plugin-data"
create_dir "/var/data/mame/hash" create_dir "$XDG_DATA_HOME/mame/hash"
create_dir "$bios_folder/mame-sa/samples" create_dir "$bios_folder/mame-sa/samples"
create_dir "/var/data/mame/assets/artwork" create_dir "$XDG_DATA_HOME/mame/assets/artwork"
create_dir "/var/data/mame/assets/fonts" create_dir "$XDG_DATA_HOME/mame/assets/fonts"
create_dir "/var/data/mame/assets/crosshair" create_dir "$XDG_DATA_HOME/mame/assets/crosshair"
create_dir "/var/data/mame/plugins" create_dir "$XDG_DATA_HOME/mame/plugins"
create_dir "/var/data/mame/assets/language" create_dir "$XDG_DATA_HOME/mame/assets/language"
create_dir "/var/data/mame/assets/software" create_dir "$XDG_DATA_HOME/mame/assets/software"
create_dir "/var/data/mame/assets/comments" create_dir "$XDG_DATA_HOME/mame/assets/comments"
create_dir "/var/data/mame/assets/share" create_dir "$XDG_DATA_HOME/mame/assets/share"
create_dir "/var/data/mame/dats" create_dir "$XDG_DATA_HOME/mame/dats"
create_dir "/var/data/mame/folders" create_dir "$XDG_DATA_HOME/mame/folders"
create_dir "/var/data/mame/assets/cabinets" create_dir "$XDG_DATA_HOME/mame/assets/cabinets"
create_dir "/var/data/mame/assets/cpanel" create_dir "$XDG_DATA_HOME/mame/assets/cpanel"
create_dir "/var/data/mame/assets/pcb" create_dir "$XDG_DATA_HOME/mame/assets/pcb"
create_dir "/var/data/mame/assets/flyers" create_dir "$XDG_DATA_HOME/mame/assets/flyers"
create_dir "/var/data/mame/assets/titles" create_dir "$XDG_DATA_HOME/mame/assets/titles"
create_dir "/var/data/mame/assets/ends" create_dir "$XDG_DATA_HOME/mame/assets/ends"
create_dir "/var/data/mame/assets/marquees" create_dir "$XDG_DATA_HOME/mame/assets/marquees"
create_dir "/var/data/mame/assets/artwork-preview" create_dir "$XDG_DATA_HOME/mame/assets/artwork-preview"
create_dir "/var/data/mame/assets/bosses" create_dir "$XDG_DATA_HOME/mame/assets/bosses"
create_dir "/var/data/mame/assets/logo" create_dir "$XDG_DATA_HOME/mame/assets/logo"
create_dir "/var/data/mame/assets/scores" create_dir "$XDG_DATA_HOME/mame/assets/scores"
create_dir "/var/data/mame/assets/versus" create_dir "$XDG_DATA_HOME/mame/assets/versus"
create_dir "/var/data/mame/assets/gameover" create_dir "$XDG_DATA_HOME/mame/assets/gameover"
create_dir "/var/data/mame/assets/howto" create_dir "$XDG_DATA_HOME/mame/assets/howto"
create_dir "/var/data/mame/assets/select" create_dir "$XDG_DATA_HOME/mame/assets/select"
create_dir "/var/data/mame/assets/icons" create_dir "$XDG_DATA_HOME/mame/assets/icons"
create_dir "/var/data/mame/assets/covers" create_dir "$XDG_DATA_HOME/mame/assets/covers"
create_dir "/var/data/mame/assets/ui" create_dir "$XDG_DATA_HOME/mame/assets/ui"
create_dir "$shaders_folder/mame/bgfx/" create_dir "$shaders_folder/mame/bgfx/"
dir_prep "$saves_folder/mame-sa/hiscore" "/var/config/mame/hiscore" dir_prep "$saves_folder/mame-sa/hiscore" "$XDG_CONFIG_HOME/mame/hiscore"
cp -fvr "$config/mame/mame.ini" "$mameconf" cp -fvr "$config/mame/mame.ini" "$mameconf"
cp -fvr "$config/mame/ui.ini" "$mameuiconf" cp -fvr "$config/mame/ui.ini" "$mameuiconf"
cp -fvr "$config/mame/default.cfg" "$mamedefconf" cp -fvr "$config/mame/default.cfg" "$mamedefconf"
@ -944,17 +944,17 @@ prepare_component() {
log i "Prepearing GZDOOM" log i "Prepearing GZDOOM"
log i "----------------------" log i "----------------------"
create_dir "/var/config/gzdoom" create_dir "$XDG_CONFIG_HOME/gzdoom"
create_dir "/var/data/gzdoom/audio/midi" create_dir "$XDG_DATA_HOME/gzdoom/audio/midi"
create_dir "/var/data/gzdoom/audio/fm_banks" create_dir "$XDG_DATA_HOME/gzdoom/audio/fm_banks"
create_dir "/var/data/gzdoom/audio/soundfonts" create_dir "$XDG_DATA_HOME/gzdoom/audio/soundfonts"
create_dir "$bios_folder/gzdoom" create_dir "$bios_folder/gzdoom"
cp -fvr "$config/gzdoom/gzdoom.ini" "/var/config/gzdoom" cp -fvr "$config/gzdoom/gzdoom.ini" "$XDG_CONFIG_HOME/gzdoom"
sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKHOMEDIR#'"$rdhome"'#g' "$XDG_CONFIG_HOME/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
sed -i 's#RETRODECKROMSDIR#'"$roms_folder"'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKROMSDIR#'"$roms_folder"'#g' "$XDG_CONFIG_HOME/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
sed -i 's#RETRODECKSAVESDIR#'"$saves_folder"'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON sed -i 's#RETRODECKSAVESDIR#'"$saves_folder"'#g' "$XDG_CONFIG_HOME/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
fi fi
if [[ "$component" =~ ^(portmaster|all)$ ]]; then if [[ "$component" =~ ^(portmaster|all)$ ]]; then
@ -964,14 +964,14 @@ prepare_component() {
log i "Prepearing PortMaster" log i "Prepearing PortMaster"
log i "----------------------" log i "----------------------"
rm -rf "/var/data/PortMaster" rm -rf "$XDG_DATA_HOME/PortMaster"
unzip "/app/retrodeck/PortMaster.zip" -d "/var/data/" unzip "/app/retrodeck/PortMaster.zip" -d "$XDG_DATA_HOME/"
cp -f "/var/data/PortMaster/retrodeck/PortMaster.txt" "/var/data/PortMaster/PortMaster.sh" cp -f "$XDG_DATA_HOME/PortMaster/retrodeck/PortMaster.txt" "$XDG_DATA_HOME/PortMaster/PortMaster.sh"
chmod +x "/var/data/PortMaster/PortMaster.sh" chmod +x "$XDG_DATA_HOME/PortMaster/PortMaster.sh"
rm -f "$roms_folder/portmaster/PortMaster.sh" rm -f "$roms_folder/portmaster/PortMaster.sh"
install -Dm755 "/var/data/PortMaster/PortMaster.sh" "$roms_folder/portmaster/PortMaster.sh" install -Dm755 "$XDG_DATA_HOME/PortMaster/PortMaster.sh" "$roms_folder/portmaster/PortMaster.sh"
create_dir "/var/data/PortMaster/config/" create_dir "$XDG_DATA_HOME/PortMaster/config/"
cp "$config/portmaster/config.json" "/var/data/PortMaster/config/config.json" cp "$config/portmaster/config.json" "$XDG_DATA_HOME/PortMaster/config/config.json"
fi fi
@ -981,14 +981,14 @@ prepare_component() {
log i "Prepearing Ruffle" log i "Prepearing Ruffle"
log i "----------------------" log i "----------------------"
rm -rf "/var/config/ruffle" rm -rf "$XDG_CONFIG_HOME/ruffle"
# Ruffle creates a directory with the full rom paths in it, so this is necessary # Ruffle creates a directory with the full rom paths in it, so this is necessary
# TODO: be aware of this when multi user support will be integrated for this component # TODO: be aware of this when multi user support will be integrated for this component
dir_prep "$saves_folder/flash" "/var/data/ruffle/SharedObjects/localhost/$roms_folder/flash" dir_prep "$saves_folder/flash" "$XDG_DATA_HOME/ruffle/SharedObjects/localhost/$roms_folder/flash"
if [[ "$action" == "postmove" ]]; then # Run only post-move commands if [[ "$action" == "postmove" ]]; then # Run only post-move commands
dir_prep "$saves_folder/flash" "/var/data/ruffle/SharedObjects/localhost/$roms_folder/flash" dir_prep "$saves_folder/flash" "$XDG_DATA_HOME/ruffle/SharedObjects/localhost/$roms_folder/flash"
fi fi
fi fi

View file

@ -114,14 +114,14 @@ build_preset_list_options() {
preset="$1" preset="$1"
pretty_preset_name=${preset//_/ } # Preset name prettification 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_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=() current_preset_settings=()
current_enabled_systems=() current_enabled_systems=()
current_disabled_systems=() current_disabled_systems=()
changed_systems=() changed_systems=()
changed_presets=() changed_presets=()
all_systems=() all_systems=()
local section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d') local section_results=$(sed -n '/\['"$preset"'\]/, /\[/{ /\['"$preset"'\]/! { /\[/! p } }' "$rd_conf" | sed '/^$/d')
while IFS= read -r config_line while IFS= read -r config_line
do do
@ -133,8 +133,8 @@ build_preset_list_options() {
elif [[ "$system_value" == "false" ]]; then elif [[ "$system_value" == "false" ]]; then
current_disabled_systems=("${current_disabled_systems[@]}" "$system_name") current_disabled_systems=("${current_disabled_systems[@]}" "$system_name")
fi fi
current_preset_settings=("${current_preset_settings[@]}" "$system_value" "$(make_name_pretty $system_name)" "$system_name") current_preset_settings=("${current_preset_settings[@]}" "$system_value" "$(make_name_pretty "$system_name")" "$system_name")
echo "$system_value"^"$(make_name_pretty $system_name)"^"$system_name" >> "$godot_current_preset_settings" echo "$system_value"^"$(make_name_pretty "$system_name")"^"$system_name" >> "$godot_current_preset_settings"
done < <(printf '%s\n' "$section_results") done < <(printf '%s\n' "$section_results")
} }
@ -252,7 +252,7 @@ build_preset_config() {
log d "Applying presets: $presets_being_changed for system: $system_being_changed" log d "Applying presets: $presets_being_changed for system: $system_being_changed"
for current_preset in $presets_being_changed for current_preset in $presets_being_changed
do do
local preset_section=$(sed -n '/\['"$current_preset"'\]/, /\[/{ /\['"$current_preset"'\]/! { /\[/! p } }' $rd_conf | sed '/^$/d') local preset_section=$(sed -n '/\['"$current_preset"'\]/, /\[/{ /\['"$current_preset"'\]/! { /\[/! p } }' "$rd_conf" | sed '/^$/d')
while IFS= read -r system_line while IFS= read -r system_line
do do
local read_system_name=$(get_setting_name "$system_line") local read_system_name=$(get_setting_name "$system_line")
@ -376,7 +376,7 @@ build_retrodeck_current_presets() {
do do
if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it if [[ (! -z "$current_setting_line") && (! "$current_setting_line" == "#"*) && (! "$current_setting_line" == "[]") ]]; then # If the line has a valid entry in it
if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header if [[ ! -z $(grep -o -P "^\[.+?\]$" <<< "$current_setting_line") ]]; then # If the line is a section header
local current_section=$(sed 's^[][]^^g' <<< $current_setting_line) # Remove brackets from section name local current_section=$(sed 's^[][]^^g' <<< "$current_setting_line") # Remove brackets from section name
else else
if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then if [[ ! ("$current_section" == "" || "$current_section" == "paths" || "$current_section" == "options" || "$current_section" == "cheevos" || "$current_section" == "cheevos_hardcore") ]]; then
local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line local system_name=$(get_setting_name "$current_setting_line" "retrodeck") # Read the variable name from the current line
@ -387,7 +387,7 @@ build_retrodeck_current_presets() {
fi fi
fi fi
fi fi
done < $rd_conf done < "$rd_conf"
} }
fetch_all_presets() { fetch_all_presets() {
@ -417,7 +417,7 @@ fetch_all_presets() {
presets+=("$preset") presets+=("$preset")
if $pretty_output; then if $pretty_output; then
pretty_preset_name=${preset//_/ } # Preset name prettification 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_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") pretty_presets+=("$pretty_preset_name")
fi fi
fi fi
@ -433,7 +433,7 @@ fetch_all_presets() {
presets+=("$preset") presets+=("$preset")
if $pretty_output; then if $pretty_output; then
pretty_preset_name=${preset//_/ } # Preset name prettification 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_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") pretty_presets+=("$pretty_preset_name")
fi fi
fi fi

View file

@ -389,8 +389,8 @@ find_emulator() {
while IFS= read -r line; do while IFS= read -r line; do
command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p') command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p')
# Check if the command specified by the variable 'command_path' exists and is executable # Check if the command specified by the variable 'command_path' exists and is executable
if [ -x "$(command -v $command_path)" ]; then if [ -x "$(command -v "$command_path")" ]; then
found_path=$command_path found_path="$command_path"
break break
fi fi
done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='systempath']/entry" - 2>/dev/null)" done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='systempath']/entry" - 2>/dev/null)"
@ -400,7 +400,7 @@ find_emulator() {
while IFS= read -r line; do while IFS= read -r line; do
command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p') command_path=$(echo "$line" | sed -n 's/.*<entry>\(.*\)<\/entry>.*/\1/p')
if [ -x "$command_path" ]; then if [ -x "$command_path" ]; then
found_path=$command_path found_path="$command_path"
break break
fi fi
done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='staticpath']/entry" - 2>/dev/null)" done <<< "$(echo "$emulator_section" | xmllint --xpath "//rule[@type='staticpath']/entry" - 2>/dev/null)"
@ -466,4 +466,4 @@ find_system_by_extension() {
# Return the detected system # Return the detected system
echo "$detected_system" echo "$detected_system"
} }

View file

@ -9,7 +9,7 @@ steam_sync() {
# USAGE: steam_sync # USAGE: steam_sync
log "i" "Starting Steam Sync" log "i" "Starting Steam Sync"
create_dir $steamsync_folder create_dir "$steamsync_folder"
if [ ! -f "$srm_path" ]; then if [ ! -f "$srm_path" ]; then
log "e" "Steam ROM Manager configuration not initialized! Initializing now." log "e" "Steam ROM Manager configuration not initialized! Initializing now."