summaryrefslogtreecommitdiff
path: root/defaults/assets/fgmod-uninstaller.sh
diff options
context:
space:
mode:
authorxXJsonDeruloXx <danielhimebauch@gmail.com>2026-03-20 17:32:05 -0400
committerxXJsonDeruloXx <danielhimebauch@gmail.com>2026-03-20 17:32:05 -0400
commitca5db2231b8554d1377dd449f6fb9c736e3d6386 (patch)
tree0c3a52bebfa5602a6499b1fcaa1fea5539632c1e /defaults/assets/fgmod-uninstaller.sh
parentef469a8036e3b3f129a753dad4cf04fad3ca92f7 (diff)
downloadDecky-Framegen-ca5db2231b8554d1377dd449f6fb9c736e3d6386.tar.gz
Decky-Framegen-ca5db2231b8554d1377dd449f6fb9c736e3d6386.zip
Implement prefix-managed OptiScaler runtime
Diffstat (limited to 'defaults/assets/fgmod-uninstaller.sh')
-rwxr-xr-xdefaults/assets/fgmod-uninstaller.sh235
1 files changed, 80 insertions, 155 deletions
diff --git a/defaults/assets/fgmod-uninstaller.sh b/defaults/assets/fgmod-uninstaller.sh
index 8c5e7b9..08e7113 100755
--- a/defaults/assets/fgmod-uninstaller.sh
+++ b/defaults/assets/fgmod-uninstaller.sh
@@ -1,175 +1,100 @@
#!/usr/bin/env bash
+set -euo pipefail
set -x
-exec > >(tee -i /tmp/fgmod-uninstaller.log) 2>&1
+exec > >(tee -i /tmp/fgmod-prefix-cleanup.log) 2>&1
+
+log() {
+ echo "$*"
+ logger -t fgmod-prefix-cleanup "$*"
+}
error_exit() {
- echo "โŒ $1"
- if [[ -n $STEAM_ZENITY ]]; then
- $STEAM_ZENITY --error --text "$1"
- else
- zenity --error --text "$1" || echo "Zenity failed to display error"
+ local message="$1"
+ echo "โŒ $message"
+ logger -t fgmod-prefix-cleanup "ERROR: $message"
+ if [[ -n "${STEAM_ZENITY:-}" ]]; then
+ "$STEAM_ZENITY" --error --text "$message" || true
+ elif command -v zenity >/dev/null 2>&1; then
+ zenity --error --text "$message" || true
fi
- logger -t fgmod-uninstaller "โŒ ERROR: $1"
exit 1
}
-if [ "$#" -lt 1 ]; then
- echo "Usage: $0 program [program_arguments...]"
- exit 1
+managed_dir_name="optiscaler-managed"
+manifest_name="manifest.env"
+default_proxy="${OPTISCALER_PROXY:-${DLL:-winmm}}"
+default_proxy="${default_proxy%.dll}"
+
+support_files=(
+ "OptiScaler.ini"
+ "OptiScaler.log"
+ "libxess.dll"
+ "libxess_dx11.dll"
+ "libxess_fg.dll"
+ "libxell.dll"
+ "amd_fidelityfx_dx12.dll"
+ "amd_fidelityfx_framegeneration_dx12.dll"
+ "amd_fidelityfx_upscaler_dx12.dll"
+ "amd_fidelityfx_vk.dll"
+ "nvngx.dll"
+ "dlssg_to_fsr3_amd_is_better.dll"
+ "fakenvapi.dll"
+ "fakenvapi.ini"
+ "dlssg_to_fsr3.ini"
+ "dlssg_to_fsr3.log"
+ "nvapi64.dll"
+ "nvapi64.dll.b"
+ "fakenvapi.log"
+ "dlss-enabler.dll"
+ "dlss-enabler-upscaler.dll"
+ "dlss-enabler.log"
+ "nvngx-wrapper.dll"
+ "_nvngx.dll"
+ "dlssg_to_fsr3_amd_is_better-3.0.dll"
+ "OptiScaler.asi"
+)
+
+[[ -n "${STEAM_COMPAT_DATA_PATH:-}" ]] || error_exit "STEAM_COMPAT_DATA_PATH is required. Use this wrapper from a Steam/Proton launch option."
+[[ $# -ge 1 ]] || error_exit "Usage: $0 program [program_arguments...]"
+
+compatdata_path="$STEAM_COMPAT_DATA_PATH"
+system32_path="$compatdata_path/pfx/drive_c/windows/system32"
+managed_root="$compatdata_path/$managed_dir_name"
+manifest_path="$managed_root/$manifest_name"
+proxy_name="$default_proxy"
+
+if [[ -f "$manifest_path" ]]; then
+ # shellcheck disable=SC1090
+ source "$manifest_path"
+ proxy_name="${MANAGED_PROXY:-$proxy_name}"
fi
-# === Resolve Game Path ===
-exe_folder_path=""
-if [[ "$1" == *.exe ]]; then
- exe_folder_path=$(dirname "$1")
-else
- for arg in "$@"; do
- if [[ "$arg" == *.exe ]]; then
- # Handle special cases for specific games
- [[ "$arg" == *"Cyberpunk 2077"* ]] && arg=${arg//REDprelauncher.exe/bin/x64/Cyberpunk2077.exe}
- [[ "$arg" == *"Witcher 3"* ]] && arg=${arg//REDprelauncher.exe/bin/x64_dx12/witcher3.exe}
- [[ "$arg" == *"Baldurs Gate 3"* ]] && arg=${arg//Launcher\/LariLauncher.exe/bin/bg3_dx11.exe}
- [[ "$arg" == *"HITMAN 3"* ]] && arg=${arg//Launcher.exe/Retail/HITMAN3.exe}
- [[ "$arg" == *"HITMAN World of Assassination"* ]] && arg=${arg//Launcher.exe/Retail/HITMAN3.exe}
- [[ "$arg" == *"SYNCED"* ]] && arg=${arg//Launcher\/sop_launcher.exe/SYNCED.exe}
- [[ "$arg" == *"2KLauncher"* ]] && arg=${arg//2KLauncher\/LauncherPatcher.exe/DoesntMatter.exe}
- [[ "$arg" == *"Warhammer 40,000 DARKTIDE"* ]] && arg=${arg//launcher\/Launcher.exe/binaries/Darktide.exe}
- [[ "$arg" == *"Warhammer Vermintide 2"* ]] && arg=${arg//launcher\/Launcher.exe/binaries_dx12/vermintide2_dx12.exe}
- [[ "$arg" == *"Satisfactory"* ]] && arg=${arg//FactoryGameSteam.exe/Engine/Binaries/Win64/FactoryGameSteam-Win64-Shipping.exe}
- [[ "$arg" == *"FINAL FANTASY XIV Online"* ]] && arg=${arg//boot\/ffxivboot.exe/game/ffxiv_dx11.exe}
- exe_folder_path=$(dirname "$arg")
- break
- fi
- done
-fi
+proxy_dll="${proxy_name}.dll"
+backup_dll="${proxy_name}-original.dll"
-for arg in "$@"; do
- if [[ "$arg" == lutris:rungameid/* ]]; then
- lutris_id="${arg#lutris:rungameid/}"
-
- # Get slug from Lutris JSON
- slug=$(lutris --list-games --json 2>/dev/null | jq -r ".[] | select(.id == $lutris_id) | .slug")
-
- if [[ -z "$slug" || "$slug" == "null" ]]; then
- echo "Could not find slug for Lutris ID $lutris_id"
- break
- fi
+for file_name in "${support_files[@]}"; do
+ rm -f "$system32_path/$file_name"
+done
- # Find matching YAML file using slug
- config_file=$(find ~/.config/lutris/games/ -iname "${slug}-*.yml" | head -1)
+rm -rf "$system32_path/plugins"
+rm -f "$system32_path/$proxy_dll"
- if [[ -z "$config_file" ]]; then
- echo "No config file found for slug '$slug'"
- break
- fi
+if [[ -f "$system32_path/$backup_dll" ]]; then
+ mv -f "$system32_path/$backup_dll" "$system32_path/$proxy_dll"
+fi
- # Extract executable path from YAML
- exe_path=$(grep -E '^\s*exe:' "$config_file" | sed 's/.*exe:[[:space:]]*//')
+rm -rf "$managed_root"
- if [[ -n "$exe_path" ]]; then
- exe_folder_path=$(dirname "$exe_path")
- echo "Resolved executable path: $exe_path"
- echo "Executable folder: $exe_folder_path"
- else
- echo "Executable path not found in $config_file"
- fi
+log "Cleaned prefix-managed OptiScaler files from $compatdata_path using proxy $proxy_name"
- break
- fi
+while [[ $# -gt 0 && "$1" == "--" ]]; do
+ shift
done
-# Fallback to STEAM_COMPAT_INSTALL_PATH when no path was found
-[[ -z "$exe_folder_path" && -n "$STEAM_COMPAT_INSTALL_PATH" ]] && exe_folder_path="$STEAM_COMPAT_INSTALL_PATH"
-
-# Check for Unreal Engine game paths
-if [[ -d "$exe_folder_path/Engine" ]]; then
- ue_exe_path=$(find "$exe_folder_path" -maxdepth 4 -mindepth 4 -path "*Binaries/Win64/*.exe" -not -path "*/Engine/*" | head -1)
- exe_folder_path=$(dirname "$ue_exe_path")
-fi
-
-# Verify the game folder exists
-[[ ! -d "$exe_folder_path" ]] && error_exit "Unable to locate the game folder: $exe_folder_path"
-
-# Avoid operating on the uninstaller's own directory
-script_dir=$(dirname "$(realpath "$0")")
-[[ "$(realpath "$exe_folder_path")" == "$script_dir" ]] && error_exit "The target directory matches the script's directory. Aborting to prevent accidental deletion."
-
-# Change to the game directory
-cd "$exe_folder_path" || error_exit "Failed to change directory to $exe_folder_path"
-
-# Verify current directory before proceeding
-[[ "$(pwd)" != "$exe_folder_path" ]] && error_exit "Unexpected working directory: $(pwd)"
-
-logger -t fgmod-uninstaller "๐ŸŸข Uninstalling from: $exe_folder_path"
-
-# === Remove OptiScaler Files ===
-echo "๐Ÿงน Removing OptiScaler files..."
-rm -f "OptiScaler.dll" "dxgi.dll" "winmm.dll" "dbghelp.dll" "version.dll" "wininet.dll" "winhttp.dll" "OptiScaler.asi"
-rm -f "OptiScaler.ini" "OptiScaler.log"
-
-# === Remove Nukem FG Mod Files ===
-echo "๐Ÿงน Removing Nukem FG Mod files..."
-rm -f "dlssg_to_fsr3_amd_is_better.dll" "dlssg_to_fsr3.ini" "dlssg_to_fsr3.log"
-rm -f "nvapi64.dll" "fakenvapi.ini" "fakenvapi.log"
-
-# === Remove Supporting Libraries ===
-echo "๐Ÿงน Removing supporting libraries..."
-rm -f "nvngx.dll" "nvngx.ini"
-# Only remove files if backups exist (to avoid removing restored originals)
-[[ -f "libxess.dll.b" ]] && rm -f "libxess.dll"
-[[ -f "libxess_dx11.dll.b" ]] && rm -f "libxess_dx11.dll"
-[[ -f "libxess_fg.dll.b" ]] && rm -f "libxess_fg.dll"
-[[ -f "libxell.dll.b" ]] && rm -f "libxell.dll"
-[[ -f "amd_fidelityfx_dx12.dll.b" ]] && rm -f "amd_fidelityfx_dx12.dll"
-[[ -f "amd_fidelityfx_framegeneration_dx12.dll.b" ]] && rm -f "amd_fidelityfx_framegeneration_dx12.dll"
-[[ -f "amd_fidelityfx_upscaler_dx12.dll.b" ]] && rm -f "amd_fidelityfx_upscaler_dx12.dll"
-[[ -f "amd_fidelityfx_vk.dll.b" ]] && rm -f "amd_fidelityfx_vk.dll"
-
-# === Remove FG Mod Files ===
-echo "๐Ÿงน Removing frame generation mod files..."
-rm -f "dlssg_to_fsr3_amd_is_better.dll" "dlssg_to_fsr3.ini"
-
-# === Remove NVAPI Files (Current and Legacy) ===
-echo "๐Ÿงน Removing NVAPI files..."
-rm -f "fakenvapi.dll" "fakenvapi.ini" # Current v0.9.0-pre4 approach
-rm -f "nvapi64.dll" "nvapi64.dll.b" # Legacy cleanup for older versions and backups
-
-# === Remove ASI Plugins ===
-echo "๐Ÿงน Removing ASI plugins directory..."
-rm -rf "plugins"
-
-# === Remove Legacy Files ===
-echo "๐Ÿงน Removing legacy files..."
-rm -f "dlss-enabler.dll" "dlss-enabler-upscaler.dll" "dlss-enabler.log"
-rm -f "nvngx-wrapper.dll" "_nvngx.dll"
-rm -f "dlssg_to_fsr3_amd_is_better-3.0.dll"
-
-# === Restore Original DLLs ===
-echo "๐Ÿ”„ Restoring original DLLs..."
-original_dlls=("d3dcompiler_47.dll" "amd_fidelityfx_dx12.dll" "amd_fidelityfx_framegeneration_dx12.dll" "amd_fidelityfx_upscaler_dx12.dll" "amd_fidelityfx_vk.dll" "libxess.dll" "libxess_dx11.dll" "libxess_fg.dll" "libxell.dll")
-for dll in "${original_dlls[@]}"; do
- if [[ -f "${dll}.b" ]]; then
- mv "${dll}.b" "$dll"
- echo "โœ… Restored original $dll"
- logger -t fgmod-uninstaller "โœ… Restored original $dll"
- fi
-done
+set +e
+"$@"
+exit_code=$?
+set -e
-# === Self-remove uninstaller ===
-echo "๐Ÿ—‘๏ธ Removing uninstaller..."
-rm -f "fgmod-uninstaller.sh"
-
-echo "โœ… fgmod removed from this game successfully!"
-logger -t fgmod-uninstaller "โœ… fgmod removed from $exe_folder_path"
-
-# === Execute original command if provided ===
-if [[ $# -gt 1 ]]; then
- echo "๐Ÿš€ Launching the game..."
- export SteamDeck=0
- export WINEDLLOVERRIDES="${WINEDLLOVERRIDES},dxgi=n,b"
- exec >/dev/null 2>&1
- exec "$@"
-else
- echo "โœ… Uninstallation complete. No game specified to run."
-fi \ No newline at end of file
+exit "$exit_code"