diff --git a/config/retrodeck/reference_lists/features.json b/config/retrodeck/reference_lists/features.json index 86a5b049..24f0ec09 100644 --- a/config/retrodeck/reference_lists/features.json +++ b/config/retrodeck/reference_lists/features.json @@ -849,7 +849,7 @@ } ] }, - "picodrive_libetro": { + "picodrive_libretro": { "name": "PicoDrive", "description": "SEGA MS/MD/CD/32X Libretro Core", "system": [ @@ -866,7 +866,7 @@ } ] }, - "genesisplusgx_libetro": { + "genesisplusgx_libretro": { "name": "Genesis Plus GX", "description": "SEGA MS/GG/MD/CD Libretro Core", "system": [ @@ -883,7 +883,7 @@ } ] }, - "genesisplusgxwide_libetro": { + "genesisplusgxwide_libretro": { "name": "Genesis Plus GX Wide", "description": "SEGA MS/GG/MD/CD Libretro Core for Wide Screen", "system": [ @@ -899,7 +899,7 @@ } ] }, - "mupen64plus-next_libetro": { + "mupen64plus-next_libretro": { "name": "Mupen64Plus-Next", "description": "Nintendo 64 Libretro Core", "system": "n64", @@ -911,7 +911,7 @@ } ] }, - "snes9x-current_libetro": { + "snes9x-current_libretro": { "name": "Snes9x - Current", "description": "Super Nintendo Libretro Core", "system": "snes", @@ -924,7 +924,7 @@ } ] }, - "gambatte_libetro": { + "gambatte_libretro": { "name": "Gambatte", "description": "Game Boy/Color Libretro Core", "system": [ @@ -939,7 +939,7 @@ } ] }, - "mgba_libetro": { + "mgba_libretro": { "name": "mGBA", "description": "Game Boy Advance Libretro Core", "system": "gba", @@ -960,7 +960,8 @@ "system": [ "arcade" ], - "launch": "mame" + "launch": "mame", + "launch-args": "-inipath /var/config/mame/ini -rompath $(dirname \"$game\") $game" }, "citra": { "description": "Citra Nintendo 3DS Emulator (via Ponzu)", @@ -976,19 +977,19 @@ } ] }, - "ruffle": { - "description": "Flash Games emulator", - "name" : "Ruffle", - "url": "https://retrodeck.readthedocs.io/en/latest/wiki_about/what-is-retrodeck/", - "system" : "flash", - "launch": "ruffle-rd-wrapper.sh" - }, + "ruffle": { + "description": "Flash Games emulator", + "name" : "Ruffle", + "url": "https://retrodeck.readthedocs.io/en/latest/wiki_about/what-is-retrodeck/", + "system" : "flash", + "launch": "ruffle-rd-wrapper.sh" + }, "melonds": { "description": "MelonDS Nintendo DS Emulator", "name": "melonds", "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/melonds/melonds-guide/", "system": "nds", - "launch": "MelonDS" + "launch": "melonDS" }, "pcsx2": { "name": "pcsx2", @@ -996,6 +997,7 @@ "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/pcsx2/pcsx2-guide/", "system": "ps2", "launch": "pcsx2-qt", + "launch-args": "-batch $game", "properties": [ { "ask_to_exit": true, @@ -1008,6 +1010,7 @@ "description": "PlayStation Emulator", "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/duckstation/duckstation-guide/", "launch": "duckstation-qt", + "launch-args": "-batch $game", "system": "psx", "properties": [ { @@ -1034,7 +1037,8 @@ "description": "Vita3K PSVita Emulator", "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/vita3k/vita3k-guide/", "system": "psvita", - "launch": "Vita3K" + "launch": "Vita3K", + "launch-args": "-r $game.psvita" }, "rpcs3": { "name": "RPCS3", @@ -1042,6 +1046,7 @@ "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/rpcs3/rpcs3-guide/", "system": "ps3", "launch": "rpcs3", + "launch-override": "cd $(dirname $game) && rpcs3 $game", "properties": [ { "ask_to_exit": true @@ -1061,6 +1066,7 @@ "url": "https://retrodeck.readthedocs.io/en/latest/wiki_about/what-is-retrodeck/", "launch": "Yuzu", "system": "switch", + "launch-args": "-f -g $game", "ponzu": true, "abxy_button": true }, @@ -1069,6 +1075,7 @@ "description": "Dolphin Wii and GameCube Emulator", "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-guide/", "launch": "dolphin-emu-wrapper", + "launch-args": "-e $game", "system": [ "gc", "wii" @@ -1088,6 +1095,7 @@ "description": "A fork of Dolphiin to enhance Metroid Prime experience", "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/dolphin-primehack/dolphin-primehack-guide/", "launch": "primehack-wrapper", + "launch-args": "-e $game", "system": [ "wii" ], @@ -1104,6 +1112,7 @@ "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/cemu/cemu-guide/", "system": "wiiu", "launch": "Cemu-wrapper", + "launch-args": "-g $game", "properties": [ { "abxy_button": true, @@ -1116,7 +1125,8 @@ "name": "xemu", "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/xemu/xemu-guide/", "system": "xbox", - "launch": "xemu" + "launch": "xemu", + "launch-args": "-dvd_path $game" }, "es-de": { "description": "ES-DE Emulation Frontend", diff --git a/functions/checks.sh b/functions/checks.sh index 55b24df3..415e538f 100644 --- a/functions/checks.sh +++ b/functions/checks.sh @@ -132,8 +132,9 @@ elif [[ "$new_version_major_rev" -eq "$current_version_major_rev" ]]; then fi fi -# Perform post_update commands for current version if it is a cooker -if grep -qF "cooker" <<< $hard_version; then # If newly-installed version is a "cooker" build, always perform post_update commands for current version +# 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 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 is_newer_version="true" fi diff --git a/functions/other_functions.sh b/functions/other_functions.sh index b6a833ee..53ebf2d4 100644 --- a/functions/other_functions.sh +++ b/functions/other_functions.sh @@ -891,3 +891,125 @@ start_retrodeck() { log i "Starting RetroDECK v$version" es-de } + +run_game() { + + # Initialize variables + emulator="" + system="" + + # Parse options + while getopts ":e:s:" opt; do + case ${opt} in + e ) + emulator=$OPTARG + ;; + s ) + system=$OPTARG + ;; + \? ) + echo "Usage: $0 --run [-e emulator] [-s system] game" + exit 1 + ;; + esac + done + shift $((OPTIND -1)) + + # Check for game argument + if [[ -z "$1" ]]; then + echo "Error: Game file is required." + echo "Usage: $0 --run [-e emulator] [-s system] game" + exit 1 + fi + + game=$1 + + # If no system is provided, extract it from the game path + if [[ -z "$system" ]]; then + system=$(echo "$game" | grep -oP '(?<=roms/)[^/]+') + fi + + log d "Emulator: $emulator" + log d "System: $system" + log d "Game: $game" + + # Query the features JSON for emulators that support the system + local emulators=$(jq -r --arg system "$system" ' + .emulator | to_entries[] | + select( + (.value.system == $system) or + (.value.system[]? == $system) + ) | .key' "$features") + + # Check if the system is handled by RetroArch cores + local retroarch_cores=$(jq -r --arg system "$system" ' + .emulator.retroarch.cores | to_entries[] | + select( + .value.system == $system or + (.value.system[]? == $system) + ) | .key' "$features") + + # if the emulator is given and it's a retroarch core just execute it + if [[ "$emulator" == *"_libretro" ]]; then + local core_path="/var/config/retroarch/cores/$emulator.so" + log d "Running RetroArch core: $core_path" + log d "Command: retroarch -L $core_path \"$game\"" + eval "retroarch -L $core_path \"$game\"" + return 1 + fi + + # If the system is handled by RetroArch cores, add them to the list of emulators + if [[ -n "$retroarch_cores" ]]; then + emulators=$(echo -e "$emulators\n$retroarch_cores") + fi + + local pretty_system=$(jq -r --arg system "$system" '.system[$system].name' "$features") + + # Check if multiple emulators are found and prompt the user to select one with zenity + if [[ $(echo "$emulators" | wc -l) -gt 1 ]]; then + emulator=$(echo "$emulators" | zenity --list --title="Select Emulator" --text="Multiple emulators found for $pretty_system. Select one to run." --column="Emulator") + else + emulator="$emulators" + fi + + # If no emulator was selected, exit + if [[ -z "$emulator" ]]; then + log e "No emulator selected. Exiting." + return 1 + fi + + log d "Run game: selected emulator $emulator" + + # Handle RetroArch core separately + if [[ "$emulator" == *"_libretro" ]]; then + local core_path="/var/config/retroarch/cores/$emulator.so" + log d "Running RetroArch core: $core_path" + log d "Command: retroarch -L $core_path \"$game\"" + eval "retroarch -L $core_path \"$game\"" + else + # Check if launch-override exists + local launch_override=$(jq -r ".emulator.$emulator.\"launch-override\"" "$features") + if [[ "$launch_override" != "null" ]]; then + # Use launch-override + launch_override=${launch_override//\$game/\"$game\"} + log d "Using launch-override: $launch_override" + eval "$launch_override" + else + # Use standard launch and launch-args + local launch_command=$(jq -r ".emulator.$emulator.launch" "$features") + local launch_args=$(jq -r ".emulator.$emulator.\"launch-args\"" "$features") + log d "launch args: $launch_args" + + # Only add launch_args if they are not null + if [[ "$launch_args" != "null" ]]; then + # Replace $game in launch_args with the actual game path, quoting it to handle spaces + launch_args=${launch_args//\$game/\"$game\"} + log d "Command: \"$launch_command $launch_args\"" + eval "$launch_command $launch_args" + else + log d "Command: \"$launch_command\"" + eval "$launch_command \"$game\"" + fi + fi + fi +} \ No newline at end of file diff --git a/retrodeck.sh b/retrodeck.sh index 018d9bc2..e76f8df0 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -18,19 +18,21 @@ for i in "$@"; do case $i in -h*|--help*) echo "RetroDECK v""$version" - echo " + echo -e " Usage: flatpak run [FLATPAK-RUN-OPTION] net.retrodeck-retrodeck [ARGUMENTS] Arguments: - -h, --help Print this help - -v, --version Print RetroDECK version - --info-msg Print paths and config informations - --configurator Starts the RetroDECK Configurator - --compress-one Compresses target file to a compatible format - --compress-all Compresses all supported games into a compatible format. Available formats are \"chd\", \"zip\", \"rvz\" and \"all\". - --reset-component Reset one or more component or emulator configs to the default values - --reset-retrodeck Starts the initial RetroDECK installer (backup your data first!) + -h, --help \t Print this help + -v, --version \t Print RetroDECK version + --info-msg \t Print paths and config informations + --configurator \t Starts the RetroDECK Configurator + --compress-one \t Compresses target file to a compatible format + --compress-all \t Compresses all supported games into a compatible format.\n\t\t\t\t\t\t Available formats are \"chd\", \"zip\", \"rvz\" and \"all\". + --reset-component \t Reset one or more component or emulator configs to the default values + --reset-retrodeck \t Starts the initial RetroDECK installer (backup your data first!) + + --run [-s ] [-e ] \t Run a game from cli, if no system is defined it will deducted from the path.\n\t\t\t\t\t\t For example --run ~/retrodeck/roms/system/game.ext will be run with the system "system".\n\t\t\t\t\t\t Optionally -e (emulator) and -s (system) can be passed as arguments. For flatpak run specific options please run: flatpak run -h @@ -42,6 +44,11 @@ https://retrodeck.net echo "RetroDECK v$version" exit ;; + --run*) + shift # Remove --run + run_game "$@" + exit + ;; --info-msg*) echo "RetroDECK v$version" echo "RetroDECK config file is in: $rd_conf" @@ -199,3 +206,4 @@ fi # Normal Startup start_retrodeck +quit_retrodeck diff --git a/tools/configurator/main.gd b/tools/configurator/main.gd index fde10706..5cdef960 100644 --- a/tools/configurator/main.gd +++ b/tools/configurator/main.gd @@ -192,6 +192,7 @@ func _on_bios_button_expert_pressed(): func _on_exit_button_pressed(): _play_main_animations() _exit() + _exit() func _on_locale_selected(index): match index: