diff --git a/lug-helper.sh b/lug-helper.sh index a2d71b5..974f533 100755 --- a/lug-helper.sh +++ b/lug-helper.sh @@ -92,9 +92,15 @@ lutris_flatpak_dir="$HOME/.var/app/net.lutris.Lutris" # Lutris native game configs directory lutris_native_conf_dir="$conf_dir/lutris/games" +# Lutris native wine config +lutris_native_wine_yml="$conf_dir/lutris/runners/wine.yml" + # Lutris flatpak game configs directory lutris_flatpak_conf_dir="$lutris_flatpak_dir/config/lutris/games" +# Lutris flatpak wine config +lutris_flatpak_wine_yml="$lutris_flatpak_dir/data/lutris/runners/wine.yml" + # Helper directory helper_dir="$(realpath "$0" | xargs -0 dirname)" @@ -200,6 +206,9 @@ wine_required="9.4" # Lutris minimum version lutris_required="0.5.18" +# Lutris runner minimum version +lutris_runner_required="ge-proton" + # Minimum amount of RAM in GiB memory_required="16" # Minimum amount of combined RAM + swap in GiB @@ -922,6 +931,28 @@ lutris_check() { else preflight_pass+=("Lutris is installed and sufficiently up to date.") fi + + if ["$lutris_native_runner" = "$lutris_runner_required" ]; then + # All good + preflight_pass+=("Lutris runner is set to $lutris_runner.") + else + # The setting should be changed + preflight_fail+=("Lutris runner should be set to $lutris_runner_required") + + preflight_action_funcs+=("lutris_set_runner $conf_dir/lutris/runners/wine.yml") + preflight_fix_results+=("The Lutris global wine runner has been configured.") + + # Add info for manually changing the setting + preflight_manual+=("To change Lutris global Wine runner, edit global preferences in Lutris") + fi + + if [ ! -z "$(ls -A $data_dir/lutris/runtime)" ]; then + preflight_pass+=("Lutris has run at least once.") + else + preflight_fail+=("Lutris has not been run yet.") + + preflight_manual+=("Run Lutris before installing the game.") + fi fi # Check the flatpak lutris version number @@ -935,25 +966,80 @@ lutris_check() { else preflight_pass+=("Flatpak Lutris is installed and sufficiently up to date.") fi + + if [ "$lutris_flatpak_runner" = "$lutris_runner_required" ]; then + # All good + preflight_pass+=("Flatpak Lutris runner is set to $lutris_runner.") + else + # The setting should be changed + preflight_fail+=("Flatpak Lutris runner should be set to $lutris_runner_required") + + preflight_action_funcs+=("lutris_set_runner $lutris_flatpak_dir/data/lutris/runners/wine.yml") + preflight_fix_results+=("The Flatpak Lutris global wine runner has been configured.") + + # Add info for manually changing the setting + preflight_manual+=("To change Flatpak Lutris global Wine runner, edit global preferences in Flatpak Lutris") + fi + + if [ ! -z "$(ls -A $lutris_flatpak_dir/data/lutris/runtime)" ]; then + preflight_pass+=("Flatpak Lutris has run at least once.") + else + preflight_fail+=("Flatpak Lutris has not been run yet.") + + preflight_manual+=("Run Flatpak Lutris before installing the game.") + fi fi } # Detect if lutris is installed lutris_detect() { lutris_installed="false" + lutris_native="false" + lutris_native_runner="" + lutris_flatpak="false" + lutris_flatpak_runner="" # Detect native lutris if [ -x "$(command -v lutris)" ]; then lutris_installed="true" lutris_native="true" + if [ -f "$lutris_native_wine_yml" ]; then + lutris_native_runner="$(sed -En '/^wine:/,/^[^[:blank:]]/ { /^[[:blank:]]*version:/s/^[[:blank:]]*version:[[:blank:]]*//p }' "$lutris_native_wine_yml")" + fi fi # Detect flatpak lutris if [ -x "$(command -v flatpak)" ] && flatpak list --app | grep -q Lutris; then - lutris_installed="true" - lutris_flatpak="true" + lutris_installed="true" + lutris_flatpak="true" + if [ -f "$lutris_flatpak_wine_yml" ]; then + lutris_flatpak_runner="$(sed -En '/^wine:/,/^[^[:blank:]]/ { /^[[:blank:]]*version:/s/^[[:blank:]]*version:[[:blank:]]*//p }' "$lutris_flatpak_wine_yml")" + fi + fi +} + +lutris_set_runner() { + # This function expects a string to be passed as an argument + if [ -z "$1" ]; then + debug_print exit "Script error: The lutris_set_runner() function expects an argument. Aborting." + fi + + version_sed_string="version: " + if [ ! -f "$1" ] || [ "$(cat "$1")" = "{}" ]; then + # If the file doesn't exist yet or has at most one line, make it with the wine version content + preflight_user_actions+=("mkdir -p \$(dirname \"\$1\"); printf 'wine:\n version: $lutris_runner_required\n' > '$1'") + # This assumes an indent of two spaces before the key:value pair + elif ! grep -q "^wine:" "$1"; then + # If wine: group doesnt exist append it with the version: node + preflight_user_actions+=("printf '\nwine:\n version: $lutris_runner_required\n' >> '$1'") + elif [ -z "$(sed -En '/^wine:/,/^[^[:blank:]]/ { /^[[:blank:]]*version:/p }' "$1")" ]; then + # If system: node doesn't exist, add it at the start of the wine: grouping + preflight_user_actions+=("sed -i -e '/^wine:/a\' -e \" ${version_sed_string}${lutris_runner_required}\" '$1'") + else + # Replace the appropriate key:value line if it exists + preflight_user_actions+=("sed -Ei '/^wine:/,/^[^[:blank:]]/ {/^[[:blank:]]*${version_sed_string}/s/${version_sed_string}.*/${version_sed_string}${lutris_runner_required}/}' '$1'") fi }