diff --git a/developer_toolbox/build_retrodck_locally.sh b/developer_toolbox/build_retrodeck_locally.sh similarity index 100% rename from developer_toolbox/build_retrodck_locally.sh rename to developer_toolbox/build_retrodeck_locally.sh diff --git a/emu-configs/PCSX2/PCSX2.ini b/emu-configs/PCSX2/PCSX2.ini index a1fe4f9d..c818b225 100644 --- a/emu-configs/PCSX2/PCSX2.ini +++ b/emu-configs/PCSX2/PCSX2.ini @@ -7,7 +7,7 @@ PauseOnFocusLoss = true StartFullscreen = true StartPaused = false ConfirmShutdown = false -HideMouseCursor = false +HideMouseCursor = true RenderToSeparateWindow = false HideMainWindowWhenRunning = false DisableWindowResize = false diff --git a/emu-configs/ryujinx/Config.json b/emu-configs/ryujinx/Config.json index 8fb6245a..4f67672d 100644 --- a/emu-configs/ryujinx/Config.json +++ b/emu-configs/ryujinx/Config.json @@ -86,16 +86,16 @@ "grid_size": 2, "application_sort": 0, "is_ascending_order": true, - "start_fullscreen": false, + "start_fullscreen": true, "show_console": true, "enable_keyboard": false, "enable_mouse": false, "hotkeys": { - "toggle_vsync": "", - "screenshot": "", - "show_ui": "ESC", - "pause": "", - "toggle_mute": "", + "toggle_vsync": "Tab", + "screenshot": "F8", + "show_ui": "F4", + "pause": "F5", + "toggle_mute": "F2", "res_scale_up": "Unbound", "res_scale_down": "Unbound", "volume_up": "Unbound", @@ -119,11 +119,11 @@ "rotate90_cw": false, "stick_button": "RightStick" }, - "deadzone_left": 0, - "deadzone_right": 0, - "range_left": 1.2, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, "range_right": 1, - "trigger_threshold": 0, + "trigger_threshold": 0.5, "motion": { "slot": 0, "alt_slot": 0, @@ -136,12 +136,12 @@ "enable_motion": true }, "rumble": { - "strong_rumble": 2.1, + "strong_rumble": 1, "weak_rumble": 1, "enable_rumble": true }, "left_joycon": { - "button_minus": "Minus", + "button_minus": "Back", "button_l": "LeftShoulder", "button_zl": "LeftTrigger", "button_sl": "Unbound", @@ -152,20 +152,20 @@ "dpad_right": "DpadRight" }, "right_joycon": { - "button_plus": "Plus", + "button_plus": "Start", "button_r": "RightShoulder", "button_zr": "RightTrigger", "button_sl": "Unbound", "button_sr": "Unbound", - "button_x": "X", - "button_b": "B", - "button_y": "Y", - "button_a": "A" + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" }, "version": 1, "backend": "GamepadSDL2", - "id": "0-00000003-28de-0000-ff11-000001000000", - "controller_type": "JoyconPair", + "id": "0-36b80003-28de-0000-ff11-000001000000", + "controller_type": "ProController", "player_index": "Player1" }, { @@ -183,11 +183,11 @@ "rotate90_cw": false, "stick_button": "RightStick" }, - "deadzone_left": 0, - "deadzone_right": 0, - "range_left": 1.2, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, "range_right": 1, - "trigger_threshold": 0, + "trigger_threshold": 0.5, "motion": { "motion_backend": "GamepadDriver", "sensitivity": 100, @@ -200,7 +200,7 @@ "enable_rumble": true }, "left_joycon": { - "button_minus": "Minus", + "button_minus": "Back", "button_l": "LeftShoulder", "button_zl": "LeftTrigger", "button_sl": "Unbound", @@ -211,19 +211,19 @@ "dpad_right": "DpadRight" }, "right_joycon": { - "button_plus": "Plus", + "button_plus": "Start", "button_r": "RightShoulder", "button_zr": "RightTrigger", "button_sl": "Unbound", "button_sr": "Unbound", - "button_x": "X", - "button_b": "B", - "button_y": "Y", - "button_a": "A" + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" }, "version": 1, "backend": "GamepadSDL2", - "id": "1-00000003-28de-0000-ff11-000001000000", + "id": "1-36b80003-28de-0000-ff11-000001000000", "controller_type": "ProController", "player_index": "Player2" }, @@ -242,11 +242,11 @@ "rotate90_cw": false, "stick_button": "RightStick" }, - "deadzone_left": 0, - "deadzone_right": 0, - "range_left": 1.2, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, "range_right": 1, - "trigger_threshold": 0, + "trigger_threshold": 0.5, "motion": { "motion_backend": "GamepadDriver", "sensitivity": 100, @@ -259,7 +259,7 @@ "enable_rumble": true }, "left_joycon": { - "button_minus": "Minus", + "button_minus": "Back", "button_l": "LeftShoulder", "button_zl": "LeftTrigger", "button_sl": "Unbound", @@ -270,19 +270,19 @@ "dpad_right": "DpadRight" }, "right_joycon": { - "button_plus": "Plus", + "button_plus": "Start", "button_r": "RightShoulder", "button_zr": "RightTrigger", "button_sl": "Unbound", "button_sr": "Unbound", - "button_x": "X", - "button_b": "B", - "button_y": "Y", - "button_a": "A" + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" }, "version": 1, "backend": "GamepadSDL2", - "id": "2-00000003-28de-0000-ff11-000001000000", + "id": "2-36b80003-28de-0000-ff11-000001000000", "controller_type": "ProController", "player_index": "Player3" }, @@ -301,11 +301,11 @@ "rotate90_cw": false, "stick_button": "RightStick" }, - "deadzone_left": 0, - "deadzone_right": 0, - "range_left": 1.2, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, "range_right": 1, - "trigger_threshold": 0, + "trigger_threshold": 0.5, "motion": { "motion_backend": "GamepadDriver", "sensitivity": 100, @@ -318,7 +318,7 @@ "enable_rumble": true }, "left_joycon": { - "button_minus": "Minus", + "button_minus": "Back", "button_l": "LeftShoulder", "button_zl": "LeftTrigger", "button_sl": "Unbound", @@ -329,19 +329,19 @@ "dpad_right": "DpadRight" }, "right_joycon": { - "button_plus": "Plus", + "button_plus": "Start", "button_r": "RightShoulder", "button_zr": "RightTrigger", "button_sl": "Unbound", "button_sr": "Unbound", - "button_x": "X", - "button_b": "B", - "button_y": "Y", - "button_a": "A" + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" }, "version": 1, "backend": "GamepadSDL2", - "id": "3-00000003-28de-0000-ff11-000001000000", + "id": "3-36b80003-28de-0000-ff11-000001000000", "controller_type": "ProController", "player_index": "Player4" } diff --git a/emu-configs/ryujinx/profiles/controller/Controller-P1.json b/emu-configs/ryujinx/profiles/controller/Controller-P1.json new file mode 100644 index 00000000..99ad926d --- /dev/null +++ b/emu-configs/ryujinx/profiles/controller/Controller-P1.json @@ -0,0 +1,64 @@ +{ + "left_joycon_stick": { + "joystick": "Left", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "LeftStick" + }, + "right_joycon_stick": { + "joystick": "Right", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "RightStick" + }, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, + "range_right": 1, + "trigger_threshold": 0.5, + "motion": { + "slot": 0, + "alt_slot": 0, + "mirror_input": false, + "dsu_server_host": "127.0.0.1", + "dsu_server_port": 26760, + "motion_backend": "CemuHook", + "sensitivity": 100, + "gyro_deadzone": 1, + "enable_motion": false + }, + "rumble": { + "strong_rumble": 1, + "weak_rumble": 1, + "enable_rumble": true + }, + "left_joycon": { + "button_minus": "Back", + "button_l": "LeftShoulder", + "button_zl": "LeftTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "dpad_up": "DpadUp", + "dpad_down": "DpadDown", + "dpad_left": "DpadLeft", + "dpad_right": "DpadRight" + }, + "right_joycon": { + "button_plus": "Start", + "button_r": "RightShoulder", + "button_zr": "RightTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" + }, + "version": 1, + "backend": "GamepadSDL2", + "id": "0-f7390003-28de-0000-ff11-000001000000", + "controller_type": "ProController", + "player_index": "Player1" +} diff --git a/emu-configs/ryujinx/profiles/controller/Controller-P2.json b/emu-configs/ryujinx/profiles/controller/Controller-P2.json new file mode 100644 index 00000000..30e0a478 --- /dev/null +++ b/emu-configs/ryujinx/profiles/controller/Controller-P2.json @@ -0,0 +1,59 @@ +{ + "left_joycon_stick": { + "joystick": "Left", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "LeftStick" + }, + "right_joycon_stick": { + "joystick": "Right", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "RightStick" + }, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, + "range_right": 1, + "trigger_threshold": 0.5, + "motion": { + "motion_backend": "GamepadDriver", + "sensitivity": 100, + "gyro_deadzone": 1, + "enable_motion": false + }, + "rumble": { + "strong_rumble": 1, + "weak_rumble": 1, + "enable_rumble": true + }, + "left_joycon": { + "button_minus": "Back", + "button_l": "LeftShoulder", + "button_zl": "LeftTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "dpad_up": "DpadUp", + "dpad_down": "DpadDown", + "dpad_left": "DpadLeft", + "dpad_right": "DpadRight" + }, + "right_joycon": { + "button_plus": "Start", + "button_r": "RightShoulder", + "button_zr": "RightTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" + }, + "version": 1, + "backend": "GamepadSDL2", + "id": "1-f7390003-28de-0000-ff11-000001000000", + "controller_type": "ProController", + "player_index": "Player2" +} diff --git a/emu-configs/ryujinx/profiles/controller/Controller-P3.json b/emu-configs/ryujinx/profiles/controller/Controller-P3.json new file mode 100644 index 00000000..e2b180be --- /dev/null +++ b/emu-configs/ryujinx/profiles/controller/Controller-P3.json @@ -0,0 +1,59 @@ +{ + "left_joycon_stick": { + "joystick": "Left", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "LeftStick" + }, + "right_joycon_stick": { + "joystick": "Right", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "RightStick" + }, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, + "range_right": 1, + "trigger_threshold": 0.5, + "motion": { + "motion_backend": "GamepadDriver", + "sensitivity": 100, + "gyro_deadzone": 1, + "enable_motion": false + }, + "rumble": { + "strong_rumble": 1, + "weak_rumble": 1, + "enable_rumble": true + }, + "left_joycon": { + "button_minus": "Back", + "button_l": "LeftShoulder", + "button_zl": "LeftTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "dpad_up": "DpadUp", + "dpad_down": "DpadDown", + "dpad_left": "DpadLeft", + "dpad_right": "DpadRight" + }, + "right_joycon": { + "button_plus": "Start", + "button_r": "RightShoulder", + "button_zr": "RightTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" + }, + "version": 1, + "backend": "GamepadSDL2", + "id": "2-f7390003-28de-0000-ff11-000001000000", + "controller_type": "ProController", + "player_index": "Player3" +} diff --git a/emu-configs/ryujinx/profiles/controller/Controller-P4.json b/emu-configs/ryujinx/profiles/controller/Controller-P4.json new file mode 100644 index 00000000..27df16f0 --- /dev/null +++ b/emu-configs/ryujinx/profiles/controller/Controller-P4.json @@ -0,0 +1,59 @@ +{ + "left_joycon_stick": { + "joystick": "Left", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "LeftStick" + }, + "right_joycon_stick": { + "joystick": "Right", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "RightStick" + }, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, + "range_right": 1, + "trigger_threshold": 0.5, + "motion": { + "motion_backend": "GamepadDriver", + "sensitivity": 100, + "gyro_deadzone": 1, + "enable_motion": false + }, + "rumble": { + "strong_rumble": 1, + "weak_rumble": 1, + "enable_rumble": true + }, + "left_joycon": { + "button_minus": "Back", + "button_l": "LeftShoulder", + "button_zl": "LeftTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "dpad_up": "DpadUp", + "dpad_down": "DpadDown", + "dpad_left": "DpadLeft", + "dpad_right": "DpadRight" + }, + "right_joycon": { + "button_plus": "Start", + "button_r": "RightShoulder", + "button_zr": "RightTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" + }, + "version": 1, + "backend": "GamepadSDL2", + "id": "3-f7390003-28de-0000-ff11-000001000000", + "controller_type": "ProController", + "player_index": "Player4" +} diff --git a/emu-configs/ryujinx/profiles/controller/SteamInput-Gyro.json b/emu-configs/ryujinx/profiles/controller/SteamInput-Gyro.json new file mode 100644 index 00000000..e58b7afa --- /dev/null +++ b/emu-configs/ryujinx/profiles/controller/SteamInput-Gyro.json @@ -0,0 +1,64 @@ +{ + "left_joycon_stick": { + "joystick": "Left", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "LeftStick" + }, + "right_joycon_stick": { + "joystick": "Right", + "invert_stick_x": false, + "invert_stick_y": false, + "rotate90_cw": false, + "stick_button": "RightStick" + }, + "deadzone_left": 0.1, + "deadzone_right": 0.1, + "range_left": 1, + "range_right": 1, + "trigger_threshold": 0.5, + "motion": { + "slot": 0, + "alt_slot": 0, + "mirror_input": false, + "dsu_server_host": "127.0.0.1", + "dsu_server_port": 26760, + "motion_backend": "CemuHook", + "sensitivity": 100, + "gyro_deadzone": 1, + "enable_motion": true + }, + "rumble": { + "strong_rumble": 1, + "weak_rumble": 1, + "enable_rumble": true + }, + "left_joycon": { + "button_minus": "Back", + "button_l": "LeftShoulder", + "button_zl": "LeftTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "dpad_up": "DpadUp", + "dpad_down": "DpadDown", + "dpad_left": "DpadLeft", + "dpad_right": "DpadRight" + }, + "right_joycon": { + "button_plus": "Start", + "button_r": "RightShoulder", + "button_zr": "RightTrigger", + "button_sl": "Unbound", + "button_sr": "Unbound", + "button_x": "Y", + "button_b": "A", + "button_y": "X", + "button_a": "B" + }, + "version": 1, + "backend": "GamepadSDL2", + "id": "0-f6790003-28de-0000-ff11-000001000000", + "controller_type": "ProController", + "player_index": "Player1" +} diff --git a/emu-configs/ryujinx/ryujinx-rdwrapper.sh b/emu-configs/ryujinx/ryujinx-rdwrapper.sh deleted file mode 100755 index 7865db7e..00000000 --- a/emu-configs/ryujinx/ryujinx-rdwrapper.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -source /app/libexec/global.sh - -log i "Ryujinx RetroDECK wrapper: starting" -command="$1" -manage_ryujinx_keys -log d "Ryujinx RetroDECK wrapper: launching \"Ryujinx.sh $command\"" -Ryujinx.sh "$command" \ No newline at end of file diff --git a/functions/compression.sh b/functions/compression.sh index 15bce646..bb33cd2e 100644 --- a/functions/compression.sh +++ b/functions/compression.sh @@ -55,36 +55,35 @@ validate_for_chd() { local file="$1" local normalized_filename=$(echo "$file" | tr '[:upper:]' '[:lower:]') local file_validated="false" - chd_validation_log_file="compression_$(basename "$file").log" - echo "Validating file:" "$file" > "$logs_folder/$chd_validation_log_file" + log i "Validating file: $file" if echo "$normalized_filename" | grep -qE '\.iso|\.cue|\.gdi'; then - echo ".cue/.iso/.gdi file detected" >> "$logs_folder/$chd_validation_log_file" + log i ".cue/.iso/.gdi file detected" local file_path=$(dirname "$(realpath "$file")") local file_base_name=$(basename "$file") local file_name=${file_base_name%.*} if [[ "$normalized_filename" == *".cue" ]]; then # Validate .cue file if [[ ! "$file_path" == *"dreamcast"* ]]; then # .bin/.cue compression may not work for Dreamcast, only GDI or ISO # TODO: verify - echo "Validating .cue associated .bin files" >> "$logs_folder/$chd_validation_log_file" + log i "Validating .cue associated .bin files" local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - echo "Associated bin files read:" >> "$logs_folder/$chd_validation_log_file" - printf '%s\n' "$cue_bin_files" >> "$logs_folder/$chd_validation_log_file" + log i "Associated bin files read:" + log i $(printf '%s\n' "$cue_bin_files") if [[ ! -z "$cue_bin_files" ]]; then while IFS= read -r line do - echo "looking for $file_path/$line" >> "$logs_folder/$chd_validation_log_file" + log i "Looking for $file_path/$line" if [[ -f "$file_path/$line" ]]; then - echo ".bin file found at $file_path/$line" >> "$logs_folder/$chd_validation_log_file" + log i ".bin file found at $file_path/$line" file_validated="true" else - echo ".bin file NOT found at $file_path/$line" >> "$logs_folder/$chd_validation_log_file" - echo ".cue file could not be validated. Please verify your .cue file contains the correct corresponding .bin file information and retry." >> "$logs_folder/$chd_validation_log_file" + log e ".bin file NOT found at $file_path/$line" + log e ".cue file could not be validated. Please verify your .cue file contains the correct corresponding .bin file information and retry." file_validated="false" break fi done < <(printf '%s\n' "$cue_bin_files") fi else - echo ".cue files not compatible with Dreamcast CHD compression" >> "$logs_folder/$chd_validation_log_file" + log w ".cue files not compatible with CHD compression" fi echo $file_validated else # If file is a .iso or .gdi @@ -92,7 +91,7 @@ validate_for_chd() { echo $file_validated fi else - echo "File type not recognized. Supported file types are .cue, .gdi and .iso" >> "$logs_folder/$chd_validation_log_file" + log w "File type not recognized. Supported file types are .cue, .gdi and .iso" echo $file_validated fi } @@ -108,32 +107,36 @@ cli_compress_single_game() { local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") local compatible_compression_format=$(find_compatible_compression_format "$file") if [[ ! $compatible_compression_format == "none" ]]; then - echo "$(basename "$file") can be compressed to $compatible_compression_format" + log i "$(basename "$file") can be compressed to $compatible_compression_format" compress_game "$compatible_compression_format" "$file" "$system" if [[ $post_compression_cleanup == [yY] ]]; then # Remove file(s) if requested - if [[ $(basename "$file") == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do # Remove associated .bin files - echo "Removing original file "$file_path/$line"" - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file - echo "Removing original file $(basename "$file")" - rm -f "$file" + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + if [[ $(basename "$file") == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do # Remove associated .bin files + log i "Removing original file "$file_path/$line"" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file + log i "Removing original file $(basename "$file")" + rm -f "$file" + else + log i "Removing original file $(basename "$file")" + rm -f "$file" + fi else - echo "Removing original file $(basename "$file")" - rm -f "$file" + log w "Compressed version of $(basename "$file") not found, skipping deletion." fi fi else - echo "$(basename "$file") does not have any compatible compression formats." + log w "$(basename "$file") does not have any compatible compression formats." fi else - echo "File not found, please specify the full path to the file to be compressed." + log w "File not found, please specify the full path to the file to be compressed." fi else - echo "Please use this command format \"--compress-one \"" + log i "Please use this command format \"--compress-one \"" fi } @@ -161,35 +164,39 @@ cli_compress_all_games() { do local compression_candidates=$(find "$roms_folder/$system" -type f -not -iname "*.txt") if [[ ! -z "$compression_candidates" ]]; then - echo "Checking files for $system" + log i "Checking files for $system" while IFS= read -r file do local compatible_compression_format=$(find_compatible_compression_format "$file") if [[ ! "$compatible_compression_format" == "none" ]]; then - echo "$(basename "$file") can be compressed to $compatible_compression_format" + log i "$(basename "$file") can be compressed to $compatible_compression_format" compress_game "$compatible_compression_format" "$file" "$system" if [[ $post_compression_cleanup == [yY] ]]; then # Remove file(s) if requested - if [[ "$file" == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do # Remove associated .bin files - echo "Removing original file "$file_path/$line"" - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file - echo "Removing original file "$file"" - rm -f $(realpath "$file") + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + if [[ "$file" == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do # Remove associated .bin files + log i "Removing original file "$file_path/$line"" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") # Remove original .cue file + log i "Removing original file "$file"" + rm -f $(realpath "$file") + else + log i "Removing original file "$file"" + rm -f $(realpath "$file") + fi else - echo "Removing original file "$file"" - rm -f $(realpath "$file") + log w "Compressed version of $(basename "$file") not found, skipping deletion." fi fi else - echo "No compatible compression format found for $(basename "$file")" + log w "No compatible compression format found for $(basename "$file")" fi done < <(printf '%s\n' "$compression_candidates") else - echo "No compatible files found for compression in $system" + log w "No compatible files found for compression in $system" fi done < <(printf '%s\n' "$compressable_systems_list") } diff --git a/functions/functions.sh b/functions/functions.sh index b19dcd38..b040fc73 100644 --- a/functions/functions.sh +++ b/functions/functions.sh @@ -236,8 +236,8 @@ dir_prep() { # Call me with: # dir prep "real dir" "symlink location" - real="$1" - symlink="$2" + real="$(realpath -s $1)" + symlink="$(realpath -s $2)" log d "Preparing directory $symlink in $real" @@ -620,43 +620,6 @@ easter_eggs() { cp -f "$new_splash_file" "$current_splash_file" # Deploy assigned splash screen } -manage_ryujinx_keys() { - # This function checks if Switch keys are existing and symlinks them inside the Ryujinx system folder - # If the symlinks are broken it recreates them - - log i "Checking Ryujinx Switch keys." - local ryujinx_system="/var/config/Ryujinx/system" # Set the path to the Ryujinx system folder - # Check if the keys folder exists - if [ -d "$bios_folder/switch/keys" ]; then - # Check if there are files in the keys folder - if [ -n "$(find "$bios_folder/switch/keys" -maxdepth 1 -type f)" ]; then - # Iterate over each file in the keys folder - for file in "$bios_folder/switch/keys"/*; do - local filename=$(basename "$file") - local symlink="$ryujinx_system/$filename" - - # Check if the symlink exists and is valid - if [ -L "$symlink" ] && [ "$(readlink -f "$symlink")" = "$file" ]; then - log i "Found \"$symlink\" and it's a valid symlink." - continue # Skip if the symlink is already valid - fi - - # Remove broken symlink or non-symlink file - log w "Found \"$symlink\" but it's not a valid symlink. Repairing it" - [ -e "$symlink" ] && rm "$symlink" - - # Create symlink - ln -s "$file" "$symlink" - log i "Created symlink: \"$symlink\"" - done - else - log w "No files found in $bios_folder/switch/keys. Continuing..." - fi - else - log e "Directory $bios_folder/switch/keys does not exist. Something is wrong with your RetroDECK installation. Continuing but Ryujinx will not be able to run any game." - fi -} - ponzu() { # This function is used to extract some specific appimages # Check if any of the specified files exist diff --git a/functions/post_update.sh b/functions/post_update.sh index 333f0f21..b3030442 100644 --- a/functions/post_update.sh +++ b/functions/post_update.sh @@ -283,17 +283,16 @@ post_update() { # 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." - mv "$saves_folder/ps3/rpcs3" "$saves_folder/ps3/rpcs3.bak" - mkdir -p "$saves_folder/ps3/rpcs3" - mv -v "$saves_folder/ps3/rpcs3.bak"/* "$saves_folder/ps3/rpcs3" - mv -v "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"/* "$saves_folder/ps3/rpcs3" - mv -v "$saves_folder/ps3/rpcs3.bak" "$rdhome/backups/saves/ps3/rpcs3" - log i "RPCS3 saves migration completed, a backup was made here: \"$rdhome/backups/saves/ps3/rpcs3\"." - source /app/libexec/functions.sh + if [[ "$(ls -A $bios_folder/rpcs3/dev_hdd0/home/00000001/savedata)" ]]; then + log i "Existing RPCS3 savedata found, backing up..." + create_dir "$backups_folder" + zip -rq9 "$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" + fi dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" + log i "RPCS3 saves migration completed, a backup was made here: \"$backups_folder/$(date +"%0m%0d")_rpcs3_save_data.zip\"." log i "Switch firmware folder should be moved in \"$bios_folder/switch/firmware\" from \"$bios_folder/switch/registered\"" - dir_prep "$bios_folder/switch/firmware" "$bios_folder/switch/registered" + mv "$bios_folder/switch/registered" "$bios_folder/switch/firmware" log i "New systems were added in this version, regenerating system folders." #es-de --home "/var/config/" --create-system-dirs diff --git a/functions/prepare_component.sh b/functions/prepare_component.sh index 003c72fa..a47e5fd2 100644 --- a/functions/prepare_component.sh +++ b/functions/prepare_component.sh @@ -571,7 +571,7 @@ prepare_component() { fi fi - if [[ "$component" =~ ^(ryujunx|Ryujinx|all)$ ]]; then + if [[ "$component" =~ ^(ryujinx|Ryujinx|all)$ ]]; then # NOTE: for techincal reasons the system folder of Ryujinx IS NOT a sumlink of the bios/switch/keys as not only the keys are located there # When RetroDECK starts there is a "manage_ryujinx_keys" function that symlinks the keys only in Rryujinx/system. if [[ "$action" == "reset" ]]; then # Run reset-only commands @@ -594,6 +594,7 @@ prepare_component() { rm -rf /var/config/Ryujinx create_dir /var/config/Ryujinx/system cp -fv $emuconfigs/ryujinx/Config.json $ryujinxconf + cp -fvr $emuconfigs/ryujinx/profiles /var/config/Ryujinx/ log d "Replacing placeholders in \"$ryujinxconf\"" sed -i 's#RETRODECKHOMEDIR#'$rdhome'#g' "$ryujinxconf" log i "Linking switch nand/saves folder" @@ -602,6 +603,7 @@ prepare_component() { dir_prep "$saves_folder/switch/ryujinx/nand" "/var/config/Ryujinx/bis" dir_prep "$saves_folder/switch/ryujinx/sdcard" "/var/config/Ryujinx/sdcard" dir_prep "$bios_folder/switch/firmware" "/var/config/Ryujinx/bis/system/Contents/registered" + dir_prep "$bios_folder/switch/keys" "/var/config/Ryujinx/system" fi fi # if [[ "$action" == "reset" ]] || [[ "$action" == "postmove" ]]; then # Run commands that apply to both resets and moves @@ -826,7 +828,10 @@ prepare_component() { create_dir "/var/config/boilr" cp -fvr "/app/libexec/steam-sync/config.toml" "/var/config/boilr" - + fi + + if [[ ! "$component" =~ ^(retrodeck|es-de|ES-DE|retroarch|RetroArch|citra|citra-emu|Citra|cemu|Cemu|dolphin|dolphin-emu|Dolphin|duckstation|Duckstation|melonds|melonDS|MelonDS|pcsx2|PCSX2|pico8|pico-8|ppsspp|PPSSPP|primehack|Primehack|rpcs3|RPCS3|ryujinx|Ryujinx|yuzu|Yuzu|xemu|XEMU|vita3k|Vita3K|mame|MAME|gzdoom|GZDOOM|boilr|BOILR|)$ ]]; then + log e "Supplied component $component not found, not resetting" fi # Update presets for all components after any reset or move diff --git a/net.retrodeck.retrodeck.yml b/net.retrodeck.retrodeck.yml index f3812a6a..c430bb42 100644 --- a/net.retrodeck.retrodeck.yml +++ b/net.retrodeck.retrodeck.yml @@ -913,7 +913,7 @@ modules: sources: - type: git url: https://github.com/RPCS3/rpcs3.git - commit: efbf044ea08a0cee103acaf664f55e8eaa452c63 + commit: 4ecf8ecd06c15f0557e1d9243f31e4c2d7baebe2 # RPCS3 - END @@ -1327,10 +1327,6 @@ modules: - cp emu-configs/gzdoom/gzdoom.sh ${FLATPAK_DEST}/bin/gzdoom.sh - chmod +x ${FLATPAK_DEST}/bin/gzdoom.sh - # Ryujinx wrapper - - cp emu-configs/ryujinx/ryujinx-rdwrapper.sh ${FLATPAK_DEST}/bin/ryujinx-rdwrapper.sh - - chmod +x ${FLATPAK_DEST}/bin/ryujinx-rdwrapper.sh - sources: - type: git url: https://github.com/XargonWan/RetroDECK.git diff --git a/retrodeck.sh b/retrodeck.sh index cab440d7..bdfdae05 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -56,7 +56,7 @@ https://retrodeck.net ;; --reset-component*) echo "You are about to reset one or more RetroDECK components or emulators." - echo "Available options are: es-de, retroarch, cemu, dolphin, duckstation, gzdoom, melonds, pcsx3, pico8, ppsspp, primehack, ryujinx, rpcs3, ryujinx, xemu, vita3k, mame, boilr, all" + echo "Available options are: es-de, retroarch, cemu, dolphin, duckstation, gzdoom, melonds, pcsx3, pico8, ppsspp, primehack, rpcs3, ryujinx, xemu, vita3k, mame, boilr, all" read -p "Please enter the component you would like to reset: " component if [[ "$component" =~ ^(es-de|retroarch|cemu|dolphin|duckstation|gzdoom|mame|melonds|pcsx2|ppsspp|primehack|ryujinx|rpcs3|xemu|all)$ ]]; then read -p "You are about to reset $component to default settings. Enter 'y' to continue, 'n' to stop: " response diff --git a/tools/configurator.sh b/tools/configurator.sh index 6f8f68a2..e00747f5 100644 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -119,8 +119,7 @@ configurator_welcome_dialog() { "Open Emulator" "Launch and configure each emulators settings (for advanced users)" \ "RetroDECK: Tools" "Compress games, move RetroDECK and install optional features" \ "RetroDECK: Troubleshooting" "Backup data, perform BIOS / multi-disc file checks checks and emulator resets" \ - "RetroDECK: About" "Show additional information about RetroDECK" \ - "Sync with Steam" "Sync with Steam all the favorites games") + "RetroDECK: About" "Show additional information about RetroDECK") fi choice=$(zenity --list --title="RetroDECK Configurator Utility" --cancel-label="Quit" \ @@ -528,7 +527,7 @@ configurator_open_emulator_dialog() { "Ryujinx" ) log i "Configurator: \"$emulator\"" - ryujinx-rdwrapper.sh + Ryujinx.sh ;; "Vita3K" ) @@ -791,26 +790,36 @@ configurator_compress_single_game_dialog() { if [[ ! $compatible_compression_format == "none" ]]; then local post_compression_cleanup=$(configurator_compression_cleanup_dialog) ( - echo "# Compressing $(basename "$file") to $compatible_compression_format format" + echo "# Compressing $(basename "$file") to $compatible_compression_format format" # This updates the Zenity dialog + log i "Compressing $(basename "$file") to $compatible_compression_format format" compress_game "$compatible_compression_format" "$file" "$system" if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested - if [[ "$file" == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") - rm -f $(realpath "$file") + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + log i "Performing post-compression file cleanup" + if [[ "$file" == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do + log i "Removing file $file_path/$line" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") + log i "Removing file $(realpath $file)" + rm -f $(realpath "$file") + else + log i "Removing file $(realpath $file)" + rm -f "$(realpath "$file")" + fi else - rm -f "$(realpath "$file")" + log i "Compressed file ${file%.*}.$compatible_compression_format not found, skipping original file deletion" + configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "A compressed version of the file was not found, skipping deletion." fi fi ) | zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator Utility - Compression in Progress" - configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The compression process is complete!" + configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "The compression process is complete." configurator_compression_tool_dialog else @@ -906,21 +915,31 @@ configurator_compress_multiple_games_dialog() { local system=$(echo "$file" | grep -oE "$roms_folder/[^/]+" | grep -oE "[^/]+$") local compression_format=$(find_compatible_compression_format "$file") echo "# Compressing $(basename "$file") into $compression_format format" # Update Zenity dialog text + log i "Compressing $(basename "$file") into $compression_format format" progress=$(( 100 - (( 100 / "$total_games_to_compress" ) * "$games_left_to_compress" ))) echo $progress games_left_to_compress=$((games_left_to_compress-1)) + log i "Games left to compress: $games_left_to_compress" compress_game "$compression_format" "$file" "$system" if [[ $post_compression_cleanup == "true" ]]; then # Remove file(s) if requested - if [[ "$file" == *".cue" ]]; then - local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") - local file_path=$(dirname "$(realpath "$file")") - while IFS= read -r line - do - rm -f "$file_path/$line" - done < <(printf '%s\n' "$cue_bin_files") - rm -f $(realpath "$file") + if [[ -f "${file%.*}.$compatible_compression_format" ]]; then + if [[ "$file" == *".cue" ]]; then + local cue_bin_files=$(grep -o -P "(?<=FILE \").*(?=\".*$)" "$file") + local file_path=$(dirname "$(realpath "$file")") + while IFS= read -r line + do + log i "Removing file $file_path/$line" + rm -f "$file_path/$line" + done < <(printf '%s\n' "$cue_bin_files") + log i "Removing file $(realpath $file)" + rm -f $(realpath "$file") + else + log i "Removing file $(realpath $file)" + rm -f "$(realpath "$file")" + fi else - rm -f "$(realpath "$file")" + log i "Compressed file ${file%.*}.$compatible_compression_format not found, skipping original file deletion" + configurator_generic_dialog "RetroDECK Configurator - RetroDECK: Compression Tool" "Compression of $(basename $file) failed, skipping deletion." fi fi done @@ -939,7 +958,7 @@ configurator_compression_cleanup_dialog() { zenity --icon-name=net.retrodeck.retrodeck --question --no-wrap --cancel-label="No" --ok-label="Yes" \ --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ --title "RetroDECK Configurator - RetroDECK: Compression Tool" \ - --text="Do you want to remove old files after they are compressed?\n\nClicking \"No\" will leave all files behind which will need to be cleaned up manually and may result in game duplicates showing in the RetroDECK library." + --text="Do you want to remove old files after they are compressed?\n\nClicking \"No\" will leave all files behind which will need to be cleaned up manually and may result in game duplicates showing in the RetroDECK library.\n\nPlease make sure you have a backup of your ROMs before using automatic cleanup!" local rc=$? # Capture return code, as "Yes" button has no text value if [[ $rc == "0" ]]; then # If user clicked "Yes" echo "true"