diff --git a/config/retrodeck/reference_lists/features.json b/config/retrodeck/reference_lists/features.json index a02df957..1c8a93f6 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", @@ -997,7 +997,7 @@ "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/pcsx2/pcsx2-guide/", "system": "ps2", "launch": "pcsx2-qt", - "launch_args": "-batch $game", + "launch-args": "-batch $game", "properties": [ { "ask_to_exit": true, @@ -1038,7 +1038,7 @@ "url": "https://retrodeck.readthedocs.io/en/latest/wiki_emulator_guides/vita3k/vita3k-guide/", "system": "psvita", "launch": "Vita3K", - "launch_args": "-r $game.psvita" + "launch-args": "-r $game.psvita" }, "rpcs3": { "name": "RPCS3", @@ -1046,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 diff --git a/functions/other_functions.sh b/functions/other_functions.sh index e039284f..a16e1453 100644 --- a/functions/other_functions.sh +++ b/functions/other_functions.sh @@ -910,22 +910,45 @@ start_retrodeck() { } run_game() { - # Arguments: $1 -> game path, $2 -> optional system - local game="$1" - local system="$2" + + # 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 "Run game: running $(basename "$game") for $system system" - - # Special case for retroarch - if [[ "$system" == "retroarch" ]]; then - log d "TODO: implement retroarch" - return - 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" ' @@ -943,6 +966,15 @@ run_game() { (.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") @@ -972,19 +1004,29 @@ run_game() { log d "Command: retroarch -L $core_path \"$game\"" eval "retroarch -L $core_path \"$game\"" else - # Parse emulator launch command and optional arguments from the JSON file - local launch_command=$(jq -r ".emulator.$emulator.launch" "$features") - local launch_args=$(jq -r ".emulator.$emulator.\"launch-args\"" "$features") - - # 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" + # 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 - log d "Command: \"$launch_command\"" - eval "$launch_command \"$game\"" + # 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 47cacbe3..e76f8df0 100644 --- a/retrodeck.sh +++ b/retrodeck.sh @@ -18,20 +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 - --run (system) Run a game from cli, if no system is defined it will deducted from the path. For example --run ~/retrodeck/roms/system/game.ext will be run with the system "system". - --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 @@ -44,7 +45,8 @@ https://retrodeck.net exit ;; --run*) - run_game "$2" "$3" + shift # Remove --run + run_game "$@" exit ;; --info-msg*)