Files
Jackify/Legacy/binaries/WabbajackProton-testing.sh
Omni c2e6ac0569 feat: add Legacy directory with original guides and scripts
- Added complete Legacy directory with all original content
- Includes binaries, docs, files, images, and README
- Removed .git directory from Legacy to keep repository clean
- Legacy content now accessible via navigation links
2025-09-09 14:25:41 +01:00

839 lines
31 KiB
Bash

#!/usr/bin/env bash
#
##################################################################
# #
# Attempt to automate installing Wabbajack on Linux Steam/Proton #
# #
# Alpha v0.19 - Omni, from 25/01/25 #
# #
##################################################################
# - v0.01 - Initial script structure.
# - v0.02 - Added functions for most features
# - v0.03 - Completed initial functions
# - v0.04 - Added handling of WebP Installer
# - v0.05 - Switched out installing WebP in favour of dll + .reg files
# - v0.06 - Tidied up some ordering of commands, plus output style differences.
# - v0.07 - Replaced troublesome win7/win10 protontricks setting with swapping out .reg files. Also much faster.
# - v0.08 - Added listing of Wabbajack Steam entries, with selection, if more than one "Wabbajack" named entry found.
# - v0.09 - Initial support for Flatpak Steam libraries
# - v0.10 - Better detection of flatpak protontricks (Bazzite has a wrapper that made it look like native protontricks)
# - v0.11 - Better handling of the Webview Installer
# - v0.12 - Added further support for Flatpak Steam, including override requirement message.
# - v0.13 - Fixed incorrect protontricks-launch command for installing Webview using native protontricks.
# - v0.14 - Fallback support to curl if wget is not found on the system.
# - v0.15 - Add a check/creation of protontricks alias entries, for troubleshooting and future use.
# - v0.16 - Replaced Wabbajack.exe and Steam Library detection to instead use shortcuts.vdf and libraryfolders.vdf to extrapolate, removing ambiguity and user input requirement.
# - v0.17 - Modified the path related functions to handle spaces in the path name.
# - v0.18 - Fixed Wabbajack.exe detection that was causing "blank" options being displayed (e.g if the entry in Steam was left as "Wabbajack.exe" then it would wrongly show up as a blank line.)
# - v0.19 - Changed WebView instller download URL.
# Current Script Version (alpha)
script_ver=0.19
# Today's date
date=$(date +"%d%m%y")
# Set up and blank logs
LOGFILE=$HOME/wabbajack-via-proton-sh.log
echo "" >$LOGFILE
#set -x
######################
# Fancy banner thing #
######################
if [ -f "/usr/bin/toilet" ]; then
toilet -t -f smmono12 -F border:metal "Omni-Guides (alpha)"
else
echo "=================================================================================================="
echo "| ####### ## ## ## ## #### ###### ## ## #### ######## ######## ###### |"
echo "| ## ## ### ### ### ## ## ## ## ## ## ## ## ## ## ## ## |"
echo "| ## ## #### #### #### ## ## ## ## ## ## ## ## ## ## |"
echo "| ## ## ## ### ## ## ## ## ## ####### ## #### ## ## ## ## ## ###### ###### |"
echo "| ## ## ## ## ## #### ## ## ## ## ## ## ## ## ## ## |"
echo "| ## ## ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## |"
echo "| ####### ## ## ## ## #### ###### ####### #### ######## ######## ###### |"
echo "============================================================================~~--(alpha)--~~======="
fi
#########
# Intro #
#########
echo ""
echo -e "This is an experimental script - an attempt to automate as much as possible of the process of getting"
echo -e "Wabbajack running on Linux via Proton through Steam. Please be aware that stability of the Wabbajack "
echo -e "application is not guaranteed. Please use at your own risk and accept that in the worst case, you may "
echo -e "have to remove and re-add the WabbaJack entry in Steam. You can report back to me via GitHub or the "
echo -e "Official Wabbajack Discord if you discover an issue with this script. Any other feedback, positive"
echo -e "or negative, is also most welcome."
echo -e "\e[32m\nPress any key to continue...\e[0m"
echo
read -n 1 -s -r -p ""
#############
# Functions #
#############
#############################
# Detect if running on deck #
#############################
detect_steamdeck() {
# Steamdeck or nah?
if [ -f "/etc/os-release" ] && grep -q "steamdeck" "/etc/os-release"; then
steamdeck=1
echo "Running on Steam Deck" >>$LOGFILE 2>&1
else
steamdeck=0
echo "NOT A steamdeck" >>$LOGFILE 2>&1
fi
}
###########################################
# Detect Protontricks (flatpak or native) #
###########################################
detect_protontricks() {
echo -ne "\nDetecting if protontricks is installed..." >>$LOGFILE 2>&1
# Check if "which protontricks" outputs a valid path
if command -v protontricks >/dev/null 2>&1; then
protontricks_path=$(command -v protontricks)
# Check if the detected binary is actually a Flatpak wrapper
if [[ -f "$protontricks_path" ]] && grep -q "flatpak run" "$protontricks_path"; then
echo -e "Detected Protontricks is actually a Flatpak wrapper at $protontricks_path." >>$LOGFILE 2>&1
which_protontricks=flatpak
else
echo -e "Native Protontricks found at $protontricks_path." | tee -a $LOGFILE
which_protontricks=native
return 0 # Exit function since we confirmed native protontricks
fi
else
echo -e "Non-Flatpak Protontricks not found. Checking flatpak..." >>$LOGFILE 2>&1
if flatpak list | grep -iq protontricks; then
echo -e "Flatpak Protontricks is already installed." >>$LOGFILE 2>&1
which_protontricks=flatpak
else
echo -e "\e[31m\n** Protontricks not found. Do you wish to install it? (y/n): **\e[0m"
read -p " " answer
if [[ $answer =~ ^[Yy]$ ]]; then
if [[ $steamdeck -eq 1 ]]; then
flatpak install -u -y --noninteractive flathub com.github.Matoking.protontricks
which_protontricks=flatpak
else
read -p "Choose installation method: 1) Flatpak (preferred) 2) Native: " choice
if [[ $choice =~ 1 ]]; then
flatpak install -u -y --noninteractive flathub com.github.Matoking.protontricks
which_protontricks=flatpak
else
echo -e "\nSorry, there are too many distros to automate this!" | tee -a $LOGFILE
echo -e "Please check how to install Protontricks using your OS package manager (yum, dnf, apt, pacman, etc.)" | tee -a $LOGFILE
fi
fi
fi
fi
fi
}
#############################
# Create protontricks alias #
#############################
protontricks_alias() {
if [[ "$which_protontricks" = "flatpak" ]]; then
local protontricks_alias_exists=$(grep "^alias protontricks=" ~/.bashrc)
local launch_alias_exists=$(grep "^alias protontricks-launch" ~/.bashrc)
if [[ -z "$protontricks_alias_exists" ]]; then
echo -e "\nAdding protontricks alias to ~/.bashrc"
echo "alias protontricks='flatpak run com.github.Matoking.protontricks'" >>~/.bashrc
source ~/.bashrc
else
echo "protontricks alias already exists in ~/.bashrc" >>"$LOGFILE" 2>&1
fi
if [[ -z "$launch_alias_exists" ]]; then
echo -e "\nAdding protontricks-launch alias to ~/.bashrc"
echo "alias protontricks-launch='flatpak run --command=protontricks-launch com.github.Matoking.protontricks'" >>~/.bashrc
source ~/.bashrc
else
echo "protontricks-launch alias already exists in ~/.bashrc" >>"$LOGFILE" 2>&1
fi
else
echo "Protontricks is not installed via flatpak, skipping alias creation." >>"$LOGFILE" 2>&1
fi
}
#############################
# Run protontricks commands #
#############################
run_protontricks() {
# Determine the protontricks binary path
if [ "$which_protontricks" = "flatpak" ]; then
protontricks_bin="flatpak run com.github.Matoking.protontricks"
else
protontricks_bin="protontricks"
fi
# Construct and execute the command using eval to preserve quotes
$protontricks_bin "$@"
}
###############################
# Detect Protontricks Version #
###############################
protontricks_version() {
# Get the current version of protontricks
protontricks_version=$(run_protontricks -V | cut -d ' ' -f 2 | sed 's/[()]//g' | sed 's/\.[0-9]$//')
# Remove any non-numeric characters from the version number
protontricks_version_cleaned=$(echo "$protontricks_version" | sed 's/[^0-9.]//g')
echo "Protontricks Version Cleaned = $protontricks_version_cleaned" >>$LOGFILE 2>&1
# Compare version strings directly using simple string comparison
if [[ "$protontricks_version_cleaned" < "1.12" ]]; then
echo "Your protontricks version is too old! Update to version 1.12 or newer and rerun this script. If 'flatpak run com.github.Matoking.protontricks -V' returns 'unknown', then please update via flatpak." | tee -a $LOGFILE
cleaner_exit
fi
}
#############################
# Create protontricks alias #
#############################
protontricks_alias() {
if [[ "$which_protontricks" = "flatpak" ]]; then
local protontricks_alias_exists=$(grep "^alias protontricks=" ~/.bashrc)
local launch_alias_exists=$(grep "^alias protontricks-launch" ~/.bashrc)
if [[ -z "$protontricks_alias_exists" ]]; then
echo -e "\nAdding protontricks alias to ~/.bashrc"
echo "alias protontricks='flatpak run com.github.Matoking.protontricks'" >> ~/.bashrc
source ~/.bashrc
else
echo "protontricks alias already exists in ~/.bashrc" >> "$LOGFILE" 2>&1
fi
if [[ -z "$launch_alias_exists" ]]; then
echo -e "\nAdding protontricks-launch alias to ~/.bashrc"
echo "alias protontricks-launch='flatpak run --command=protontricks-launch com.github.Matoking.protontricks'" >> ~/.bashrc
source ~/.bashrc
else
echo "protontricks-launch alias already exists in ~/.bashrc" >> "$LOGFILE" 2>&1
fi
else
echo "Protontricks is not installed via flatpak, skipping alias creation." >> "$LOGFILE" 2>&1
fi
}
###########################
# Get Wabbajack Directory #
###########################
get_wabbajack_path() {
local wabbajack_path=""
local wabbajack_entries=()
local selected_entry=""
echo -e "\e[33m \nDetecting Wabbajack Install Directory..\e[0m" | tee -a "$LOGFILE"
# Find all entries with Wabbajack.exe
local entries_string=$(strings ~/.steam/steam/userdata/*/config/shortcuts.vdf | grep "/Wabbajack.exe")
if [[ -z "$entries_string" ]]; then
echo "No Wabbajack.exe entries found in shortcuts.vdf."
echo "Please ensure Steam is installed and you have added Wabbajack.exe as a non-Steam game." | tee -a "$LOGFILE"
echo "Please run Wabbajack.exe once via Steam to register it." | tee -a "$LOGFILE"
return 1 # Indicate failure
fi
# Store each entry in an array to handle spaces
while IFS= read -r entry; do
local path=$(echo "$entry" | grep -oE '"[^"]+"' | head -n 1 | tr -d '"')
wabbajack_entries+=("$path")
done <<<"$entries_string"
local entry_count=${#wabbajack_entries[@]}
if [[ "$entry_count" -gt 1 ]]; then
echo -e "\e[31m \nMultiple Wabbajack.exe paths found, please select which one you wish to configure: \e[0m" | tee -a "$LOGFILE"
local i=1
for path in "${wabbajack_entries[@]}"; do
echo "$i) $path" | tee -a "$LOGFILE"
((i++))
done
# Prompt user to select an entry
read -p "Enter the number of the desired entry: " selected_entry
if [[ ! "$selected_entry" =~ ^[0-9]+$ || "$selected_entry" -lt 1 || "$selected_entry" -gt "$((entry_count))" ]]; then
echo "Invalid selection." | tee -a "$LOGFILE"
return 1 # Indicate failure
fi
# Extract the selected entry
wabbajack_path="${wabbajack_entries[$((selected_entry - 1))]}"
else
# Single matching entry
wabbajack_path="${wabbajack_entries[0]}"
fi
if [[ -n "$wabbajack_path" ]]; then
echo "Wabbajack path: $wabbajack_path" >>"$LOGFILE" 2>&1
application_directory=$(dirname "$wabbajack_path")
echo "Application Directory: $application_directory" >>"$LOGFILE" 2>&1
return 0 # Indicate success
else
echo "Failed to determine Wabbajack path." | tee -a "$LOGFILE"
return 1 # Indicate failure
fi
echo "Wabbajack Path: $wabbajack_path"
echo "Application Directory: $application_directory"
}
##################################################
# Detect Wabbajack entry in steam and get App ID #
##################################################
set_appid() {
wabbajack_entries=$(run_protontricks -l | grep -i 'Non-Steam shortcut' | grep -i wabbajack)
if [[ -z "$wabbajack_entries" ]]; then
echo "No Wabbajack entries found. Please ensure your entry in steam contains 'Wabbajack' in some way.." | tee -a $LOGFILE
exit 1
fi
IFS=$'\n' read -d '' -r -a entries_array <<<"$wabbajack_entries"
if [[ ${#entries_array[@]} -gt 1 ]]; then
echo -e "\e[31m \nMultiple Wabbajack entries found in Steam, please select which one you wish to configure: \e[0m"
for i in "${!entries_array[@]}"; do
stripped_entry=$(echo "${entries_array[i]}" | sed 's/^Non-Steam shortcut: //i')
echo "$((i + 1)). $stripped_entry"
done
echo "Please select the entry you want to use (1-${#entries_array[@]}):"
read -r selection
if ! [[ "$selection" =~ ^[0-9]+$ ]] || ((selection < 1 || selection > ${#entries_array[@]})); then
echo "Invalid selection." | tee -a $LOGFILE
exit 1
fi
selected_entry="${entries_array[$((selection - 1))]}"
else
selected_entry="${entries_array[0]}"
fi
APPID=$(echo "$selected_entry" | awk {'print $NF'} | sed 's:^.\(.*\).$:\1:')
echo "Wabbajack App ID:" $APPID >>$LOGFILE 2>&1
# If $APPID is empty, produce an error
if [[ -z "$APPID" ]]; then
echo "APPID empty, something went wrong.." | tee -a $LOGFILE
exit 1
fi
}
####################################
# Detect compatdata Directory Path #
####################################
detect_compatdata_path() {
# Check common Steam library locations first
for path in "$HOME/.local/share/Steam/steamapps/compatdata" "$HOME/.steam/steam/steamapps/compatdata" "$HOME/.var/app/com.valvesoftware.Steam/.local/share/Steam/steamapps/compatdata"; do
if [[ -d "$path/$APPID" ]]; then
compat_data_path="$path/$APPID"
echo -e "compatdata Path detected: $compat_data_path" >>$LOGFILE 2>&1
break
fi
done
# If not found in common locations, use find command
if [[ -z "$compat_data_path" ]]; then
find / -type d -name "compatdata" 2>/dev/null | while read -r compatdata_dir; do
if [[ -d "$compatdata_dir/$APPID" ]]; then
compat_data_path="$compatdata_dir/$appid"
echo -e "compatdata Path detected: $compat_data_path" >>$LOGFILE 2>&1
break
fi
done
fi
if [[ -z "$compat_data_path" ]]; then
echo "Directory named '$APPID' not found in any compatdata directories."
echo -e "Please ensure you have started the Steam entry for the modlist at least once, even if it fails.."
else
echo "Found compatdata directory with '$APPID': $compat_data_path" >>$LOGFILE 2>&1
fi
}
#####################################################
# Set protontricks permissions on Wabbajack Directory #
#####################################################
set_protontricks_perms() {
if [ "$which_protontricks" = "flatpak" ]; then
echo -e "\e[33m \nSetting Protontricks permissions... \e[0m" | tee -a "$LOGFILE"
# Set flatpak permission override, quoting the path
flatpak override --user com.github.Matoking.protontricks --filesystem="$application_directory"
if [[ "$steamdeck" = 1 ]]; then
echo -e "\e[33m \nChecking for SDCard and setting permissions appropriately..\e[0m" | tee -a "$LOGFILE"
# Set protontricks SDCard permissions early to suppress warning
sdcard_path=$(df -h | grep "/run/media" | awk '{print $NF}')
echo "$sdcard_path" >>"$LOGFILE" 2>&1
# Quote the SD card path
flatpak override --user --filesystem="$sdcard_path" com.github.Matoking.protontricks
echo -e " Done." >>"$LOGFILE" 2>&1
fi
else
echo -e "Using Native protontricks, skip setting permissions" >>"$LOGFILE" 2>&1
fi
}
#####################################
# Enable Visibility of (.)dot files #
#####################################
enable_dotfiles() {
echo $APPID >>$LOGFILE 2>&1
echo -ne "\e[33m \nEnabling visibility of (.)dot files... \e[0m" | tee -a $LOGFILE
# Check if already settings
dotfiles_check=$(run_protontricks -c 'WINEDEBUG=-all wine reg query "HKEY_CURRENT_USER\Software\Wine" /v ShowDotFiles' $APPID 2>/dev/null | grep ShowDotFiles | awk '{gsub(/\r/,""); print $NF}')
printf '%s\n' "$dotfiles_check" >>$LOGFILE 2>&1
if [[ "$dotfiles_check" = "Y" ]]; then
printf '%s\n' "DotFiles already enabled... skipping" | tee -a $LOGFILE
else
if run_protontricks -c 'WINEDEBUG=-all wine reg add "HKEY_CURRENT_USER\Software\Wine" /v ShowDotFiles /d Y /f' $APPID 2>/dev/null; then
echo "Done!" >>$LOGFILE 2>&1
else
echo -e "\e[31mError: Failed to enable dot files visibility.\e[0m" | tee -a $LOGFILE
exit 1
fi
fi
}
##############################
# Download WebView Installer #
##############################
webview_installer() {
echo -e "\e[33m\nDownloading WebView Installer...\e[0m"
local installer_path="$application_directory/MicrosoftEdgeWebView2RuntimeInstallerX64-WabbajackProton.exe"
local download_url="https://node10.sokloud.com/filebrowser/api/public/dl/yqVTbUT8/rwatch/WebView/MicrosoftEdgeWebView2RuntimeInstallerX64-WabbajackProton.exe"
# Check if installer already exists
if [ -f "$installer_path" ]; then
echo "WebView Installer already exists, skipping download."
return 0
fi
# Check for wget and use it if available
if command -v wget &>/dev/null; then
if wget "$download_url" -O "$installer_path" >>"$LOGFILE" 2>&1; then
echo "Download completed successfully."
return 0
else
echo -e "\e[31mError: Failed to download WebView Installer with wget.\e[0m"
return 1
fi
# Check for curl and use it if wget is not available
elif command -v curl &>/dev/null; then
if curl -sLo "$installer_path" "$download_url" >>"$LOGFILE" 2>&1; then
echo "Download completed successfully."
return 0
else
echo -e "\e[31mError: Failed to download WebView Installer with curl.\e[0m"
return 1
fi
else
echo -e "\e[31mError: Neither wget nor curl is available. Cannot download WebView Installer.\e[0m"
return 1
fi
}
####################
# Configure Prefix #
####################
configure_prefix() {
echo -e "\e[33m\nChanging the default renderer used..\e[0m" | tee -a "$LOGFILE"
if run_protontricks "$APPID" settings renderer=vulkan >>"$LOGFILE" 2>&1; then
echo "Renderer changed to Vulkan." >>"$LOGFILE" 2>&1
else
echo -e "\e[31mError: Failed to change renderer.\e[0m" | tee -a "$LOGFILE"
exit 1
fi
# Copy in place win10 based system.reg
echo -e "\e[33m\nChange the default prefix version to win10..\e[0m" | tee -a "$LOGFILE"
local system_reg_win10_url="https://github.com/Omni-guides/Wabbajack-Modlist-Linux/raw/refs/heads/main/files/system.reg.win10"
local system_reg_win10_path="$compat_data_path/pfx/system.reg"
if command -v wget &>/dev/null; then
wget "$system_reg_win10_url" -O "$system_reg_win10_path" >>"$LOGFILE" 2>&1
elif command -v curl &>/dev/null; then
curl -sLo "$system_reg_win10_path" "$system_reg_win10_url" >>"$LOGFILE" 2>&1
else
echo -e "\e[31mError: Neither wget nor curl is available. Cannot download system.reg.win10.\e[0m" | tee -a "$LOGFILE"
exit 1
fi
echo "Prefix version changed to win10." >>"$LOGFILE" 2>&1
# Install WebView
echo -e "\e[33m\nInstalling Webview, this can take a while, please be patient..\e[0m" | tee -a "$LOGFILE"
if [ "$which_protontricks" = "flatpak" ]; then
/usr/bin/flatpak run --command=protontricks-launch com.github.Matoking.protontricks --appid "$APPID" "$application_directory/MicrosoftEdgeWebView2RuntimeInstallerX64-WabbajackProton.exe" /silent /install >>"$LOGFILE" 2>&1
else
protontricks-launch --appid "$APPID" "$application_directory/MicrosoftEdgeWebView2RuntimeInstallerX64-WabbajackProton.exe" /silent /install >>"$LOGFILE" 2>&1
fi
# Copy in place WebP .dll
echo -e "\e[33m\nConfiguring WebP..\e[0m" | tee -a "$LOGFILE"
local webp_32_url="https://github.com/Omni-guides/Wabbajack-Modlist-Linux/raw/refs/heads/main/files/WebpWICCodec.dll-32"
local webp_64_url="https://github.com/Omni-guides/Wabbajack-Modlist-Linux/raw/refs/heads/main/files/WebpWICCodec.dll-64"
local webp_32_path="$compat_data_path/pfx/drive_c/Program Files (x86)/WebP Codec/WebpWICCodec.dll"
local webp_64_path="$compat_data_path/pfx/drive_c/Program Files/WebP Codec/WebpWICCodec.dll"
if mkdir -p "$compat_data_path/pfx/drive_c/Program Files (x86)/WebP Codec" && mkdir -p "$compat_data_path/pfx/drive_c/Program Files/WebP Codec"; then
if command -v wget &>/dev/null; then
wget "$webp_32_url" -O "$webp_32_path" >>"$LOGFILE" 2>&1 && wget "$webp_64_url" -O "$webp_64_path" >>"$LOGFILE" 2>&1
elif command -v curl &>/dev/null; then
curl -sLo "$webp_32_path" "$webp_32_url" >>"$LOGFILE" 2>&1 && curl -sLo "$webp_64_path" "$webp_64_url" >>"$LOGFILE" 2>&1
else
echo -e "\e[31mError: Neither wget nor curl is available. Cannot download WebP dlls.\e[0m" | tee -a "$LOGFILE"
exit 1
fi
echo "WebP configured successfully." | tee -a "$LOGFILE"
else
echo -e "\e[31mError: Failed to configure WebP.\e[0m" | tee -a "$LOGFILE"
exit 1
fi
# Backup system.reg and user.reg
cp "$compat_data_path/pfx/system.reg" "$compat_data_path/pfx/system.reg.orig"
cp "$compat_data_path/pfx/user.reg" "$compat_data_path/pfx/user.reg.orig"
# Copy in system.reg and user.reg
echo -e "\e[33m\nConfiguring Registry..\e[0m" | tee -a "$LOGFILE"
local system_reg_url="https://github.com/Omni-guides/Wabbajack-Modlist-Linux/raw/refs/heads/main/files/system.reg.github"
local user_reg_url="https://github.com/Omni-guides/Wabbajack-Modlist-Linux/raw/refs/heads/main/files/user.reg.github"
local system_reg_path="$compat_data_path/pfx/system.reg"
local user_reg_path="$compat_data_path/pfx/user.reg"
if command -v wget &>/dev/null; then
wget "$system_reg_url" -O "$system_reg_path" >>"$LOGFILE" 2>&1 && wget "$user_reg_url" -O "$user_reg_path" >>"$LOGFILE" 2>&1
elif command -v curl &>/dev/null; then
curl -sLo "$system_reg_path" "$system_reg_url" >>"$LOGFILE" 2>&1 && curl -sLo "$user_reg_path" "$user_reg_url" >>"$LOGFILE" 2>&1
else
echo -e "\e[31mError: Neither wget nor curl is available. Cannot download registry files.\e[0m" | tee -a "$LOGFILE"
exit 1
fi
echo "Registry configured successfully." | tee -a "$LOGFILE"
}
#################################
# Detect and Link Steam Library #
#################################
detect_link_steam_library() {
local steam_library_paths=()
local chosen_library=""
local libraryfolders_vdf=""
echo -e "\e[33m\nDiscovering Steam libraries..\e[0m"
# Find libraryfolders.vdf and extract library paths
if [[ -f "$HOME/.steam/steam/steamapps/libraryfolders.vdf" ]]; then
libraryfolders_vdf="$HOME/.steam/steam/steamapps/libraryfolders.vdf"
elif [[ -f "$HOME/.local/share/Steam/steamapps/libraryfolders.vdf" ]]; then
libraryfolders_vdf="$HOME/.local/share/Steam/steamapps/libraryfolders.vdf"
elif [[ -f "$HOME/.var/app/com.valvesoftware.Steam/.local/share/Steam/steamapps/libraryfolders.vdf" ]]; then
libraryfolders_vdf="$HOME/.var/app/com.valvesoftware.Steam/.local/share/Steam/steamapps/libraryfolders.vdf"
else
echo -e "\e[31m\nSteam libraryfolders.vdf not found. Please check the installation.\e[0m" | tee -a "$LOGFILE"
read -e -p "Enter the path to your main Steam directory: " steam_library_path
while true; do
if [[ ! -d "$steam_library_path" ]]; then
echo -e "\e[31m\nInvalid path.\e[0m Please enter a valid directory." | tee -a "$LOGFILE"
elif [[ ! -f "$steam_library_path/steamapps/libraryfolders.vdf" ]]; then
echo -e "\e[31m\nThe specified path does not appear to be a Steam directory. Please check the path and try again. Do not enter the path for a secondary Steam Library, only the path for your actual Steam install.\e[0m" | tee -a "$LOGFILE"
else
read -p "Confirm using '$steam_library_path' as the Steam directory path? (y/n): " -r choice
if [[ "$choice" =~ ^[Yy]$ ]]; then
libraryfolders_vdf="$steam_library_path/steamapps/libraryfolders.vdf"
break
fi
fi
read -e -p "Enter the path to your Steam library: " steam_library_path
done
fi
if [[ -n "$libraryfolders_vdf" ]]; then
# Parse libraryfolders.vdf
while IFS= read -r line; do
if [[ "$line" =~ \"path\" ]]; then
local path=$(echo "$line" | sed 's/.*"\(.*\)".*/\1/')
steam_library_paths+=("$path")
fi
done < <(grep "\"path\"" "$libraryfolders_vdf")
if [[ ${#steam_library_paths[@]} -gt 0 ]]; then
# Use the first library path found as the chosen library
chosen_library="${steam_library_paths[0]}"
echo "Steam library found at: $chosen_library" >>"$LOGFILE" 2>&1
configure_steam_libraries || {
echo -e "\e[31m\nFailed to configure Steam libraries. Exiting.\e[0m" | tee -a "$LOGFILE"
exit 1
}
else
echo -e "\e[31m\nNo Steam library paths found in libraryfolders.vdf.\e[0m" | tee -a "$LOGFILE"
exit 1
fi
else
echo -e "\e[31m\nSteam library not found. Please check the installation.\e[0m" | tee -a "$LOGFILE"
exit 1
fi
}
configure_steam_libraries() {
echo -e "\e[33m\nConfiguring Steam libraries..\e[0m"
# Make directories
steam_config_directory="$chosen_library/steamapps/compatdata/$APPID/pfx/drive_c/Program Files (x86)/Steam/config"
echo -e "Creating directory $steam_config_directory" >>$LOGFILE 2>&1
mkdir -p "$steam_config_directory" || {
echo -e "\e[31m\nFailed to create directory $steam_config_directory. Exiting.\e[0m" | tee -a $LOGFILE
exit 1
}
# Copy or symlink libraryfolders.vdf to config directory
if [[ "$chosen_library" == "$HOME/.var/app/com.valvesoftware.Steam/.local/share/Steam" ]]; then
steam_is_flatpak=1
# For Flatpak Steam, adjust the paths accordingly
echo -e "Symlinking libraryfolders.vdf to config directory for Flatpak" >>$LOGFILE 2>&1
ln -s "$chosen_library/config/libraryfolders.vdf" "$steam_config_directory/libraryfolders.vdf" >>$LOGFILE 2>&1 || {
echo -e "\e[31m\nFailed to symlink libraryfolders.vdf (Flatpak Steam).\e[0m" >>$LOGFILE 2>&1 | tee -a $LOGFILE
}
else
echo -e "Symlinking libraryfolders.vdf to config directory" >>$LOGFILE 2>&1
ln -s "$chosen_library/config/libraryfolders.vdf" "$steam_config_directory/libraryfolders.vdf" >>$LOGFILE 2>&1 || {
echo -e "\e[31m\nFailed to symlink libraryfolders.vdf.\e[0m" >>$LOGFILE 2>&1 | tee -a $LOGFILE
}
fi
mv "$chosen_library/steamapps/compatdata/$APPID/pfx/drive_c/Program Files (x86)/Steam/steamapps/libraryfolders.vdf" \
"$chosen_library/steamapps/compatdata/$APPID/pfx/drive_c/Program Files (x86)/Steam/steamapps/libraryfolders.vdf.bak" >>$LOGFILE 2>&1 || {
echo -e "\e[31m\nFailed to backup libraryfolders.vdf.\e[0m" >>$LOGFILE 2>&1
}
}
##########################################
# Create dotnet_bundle_extract directory #
##########################################
create_dotnet_cache_dir() {
local user_name=$(whoami)
local cache_dir="$application_directory/home/$user_name/.cache/dotnet_bundle_extract"
# Check if the directory already exists
if [ -d "$cache_dir" ]; then
echo "Directory already exists: $cache_dir, skipping..." >>"$LOGFILE" 2>&1
return 0
fi
# Create the directory
mkdir -p "$cache_dir"
if [ $? -ne 0 ]; then
echo "Error: Failed to create directory: $cache_dir" >&2
exit 1
fi
echo "Directory successfully created: $cache_dir" >>"$LOGFILE" 2>&1
}
##########################
# Cleanup Wine Processes #
##########################
cleanup_wine_procs() {
# Find and kill processes containing "WabbajackProton.exe" or "renderer"
processes=$(pgrep -f "WabbajackProton.exe|renderer=vulkan|win7|win10|ShowDotFiles|MicrosoftEdgeWebView2RuntimeInstallerX64-WabbajackProton.exe")
if [[ -n "$processes" ]]; then
echo "$processes" | xargs -r kill -9
echo "Processes killed successfully." >>$LOGFILE 2>&1
else
echo "No matching wine processes found." >>$LOGFILE 2>&1
fi
}
#####################
# Exit more cleanly #
#####################
cleaner_exit() {
if [[ "$steamdeck" != "1" ]]; then
if [ -f /usr/binwineserver ]; then
wineserver -k
exit 1
else
exit 1
fi
else
exit 1
fi
}
####################
# END OF FUNCTIONS #
####################
#######################
# Note Script Version #
#######################
echo -e "Script Version $script_ver" >>$LOGFILE 2>&1
######################
# Note Date and Time #
######################
echo -e "Script started at: $(date +'%Y-%m-%d %H:%M:%S')" >>$LOGFILE 2>&1
#########################################
# pre-emptively clean up wine processes #
#########################################
cleanup_wine_procs
#############################
# Detect if running on deck #
#############################
detect_steamdeck
###########################################
# Detect Protontricks (flatpak or native) #
###########################################
detect_protontricks
#############################
# Create protontricks alias #
#############################
protontricks_alias
###############################
# Detect Protontricks Version #
###############################
protontricks_version
##########################################
# Create protontricks alias in ~/.bashrc #
##########################################
protontricks_alias
###########################
# Get Wabbajack Directory #
###########################
get_wabbajack_path
###########################
# Set APPID and run steps #
###########################
set_appid
####################################
# Detect compatdata Directory Path #
####################################
detect_compatdata_path
#####################################################
# Set protontricks permissions on Modlist Directory #
#####################################################
set_protontricks_perms
#####################################
# Enable Visibility of (.)dot files #
#####################################
enable_dotfiles
##########################################
# Download and install WebView Installer #
##########################################
webview_installer
####################
# Configure Prefix #
####################
configure_prefix
#################################
# Detect and Link Steam Library #
#################################
detect_link_steam_library
##########################################
# Create dotnet_bundle_extract directory #
##########################################
create_dotnet_cache_dir
##########################
# Cleanup Wine Processes #
##########################
cleanup_wine_procs
########
# Exit #
########
echo -e "\e[32m\nSet up complete.\e[0m"
if [[ $steam_is_flatpak -eq 1 ]]; then
echo -e "\e[33m\nFlatpak Steam is in use, you may need to add a permissions override so that Wabbajack can access the directories.\e[0m"
echo -e "\e[33m\nFor example, if you wanted to install the modlist to /home/user/Games/Skyrim/Modlistname, then you would need to run something like:\e[0m"
echo -e "\e[33m\nflatpak override --user com.valvesoftware.Steam --filesystem="/home/user/Games"\e[0m"
fi
cleaner_exit