summaryrefslogtreecommitdiff
path: root/defaults/assets/fgmod.sh
blob: ba8846a391ca39e2a97e514ad43a58418fe5233b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/usr/bin/env bash

set -x
exec > >(tee -i /tmp/fgmod-install.log) 2>&1

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"
  fi
  logger -t fgmod "❌ ERROR: $1"
  exit 1
}

# === CONFIG ===
fgmod_path="$HOME/fgmod"
opti_path="$fgmod_path/opti"
int8_path="$fgmod_path/int8"

# === Resolve Game Path ===
if [[ "$#" -lt 1 ]]; then
  error_exit "Usage: $0 program [program_arguments...]"
fi

exe_folder_path=""
if [[ $# -eq 1 ]]; then
  [[ "$1" == *.exe ]] && exe_folder_path=$(dirname "$1") || exe_folder_path="$1"
else
  for arg in "$@"; do
    if [[ "$arg" == *.exe ]]; then
      [[ "$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

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

    # Find matching YAML file using slug
    config_file=$(find ~/.config/lutris/games/ -iname "${slug}-*.yml" | head -1)

    if [[ -z "$config_file" ]]; then
      echo "No config file found for slug '$slug'"
      break
    fi

    # Extract executable path from YAML
    exe_path=$(grep -E '^\s*exe:' "$config_file" | sed 's/.*exe:[[:space:]]*//')

    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

    break
  fi
done

[[ -z "$exe_folder_path" && -n "$STEAM_COMPAT_INSTALL_PATH" ]] && exe_folder_path="$STEAM_COMPAT_INSTALL_PATH"

if [[ -d "$exe_folder_path/Engine" ]]; then
  ue_exe=$(find "$exe_folder_path" -maxdepth 4 -mindepth 4 -path "*Binaries/Win64/*.exe" -not -path "*/Engine/*" | head -1)
  exe_folder_path=$(dirname "$ue_exe")
fi

[[ ! -d "$exe_folder_path" ]] && error_exit "❌ Could not resolve game directory!"
[[ ! -w "$exe_folder_path" ]] && error_exit "🛑 No write permission to the game folder!"

logger -t fgmod "🟢 Target directory: $exe_folder_path"

# === Copy all OptiScaler files from ~/fgmod/opti to game directory ===
echo "📦 Copying OptiScaler files from $opti_path to $exe_folder_path"
if [[ ! -d "$opti_path" ]]; then
  error_exit "❌ OptiScaler directory not found at $opti_path. Please run Setup OptiScaler first."
fi

# Copy all files from opti directory to game directory
cp -rf "$opti_path"/* "$exe_folder_path/" || error_exit "❌ Failed to copy OptiScaler files"
echo "✅ Copied all OptiScaler files to game directory"

# === Copy int8 upscaler DLL if it exists ===
if [[ -f "$int8_path/amd_fidelityfx_upscaler_dx12.dll" ]]; then
  echo "📦 Copying int8 upscaler DLL to $exe_folder_path"
  cp -f "$int8_path/amd_fidelityfx_upscaler_dx12.dll" "$exe_folder_path/" || true
  echo "✅ Copied int8 upscaler DLL"
fi

# === Apply OptiScaler setup (what setup_linux.sh does) ===
# We do this directly instead of running setup_linux.sh to avoid interaction issues
echo "🔧 Setting up OptiScaler files"

# Rename OptiScaler.dll to dxgi.dll (equivalent to selecting option 1)
if [[ -f "$exe_folder_path/OptiScaler.dll" ]]; then
  if [[ -f "$exe_folder_path/dxgi.dll" ]]; then
    echo "⚠️ Removing existing dxgi.dll"
    rm -f "$exe_folder_path/dxgi.dll"
  fi
  mv "$exe_folder_path/OptiScaler.dll" "$exe_folder_path/dxgi.dll"
  echo "✅ Renamed OptiScaler.dll to dxgi.dll"
else
  echo "⚠️ OptiScaler.dll not found, may already be renamed"
fi

# Disable spoofing for non-Nvidia (equivalent to answering 'n' then 'y')
# The script asks: "Are you using Nvidia?" - we answer 'n'
# Then asks: "Will you try to use DLSS inputs?" - we answer 'y' (enable spoofing)
# Spoofing stays enabled (Dxgi=auto), so we don't need to change OptiScaler.ini

# Clean up setup script and windows batch file
rm -f "$exe_folder_path/setup_linux.sh" "$exe_folder_path/setup_windows.bat"
rm -f "$exe_folder_path/!! EXTRACT ALL FILES TO GAME FOLDER !!"

# Create uninstaller script (simplified version)
cat > "$exe_folder_path/remove_optiscaler.sh" << 'UNINSTALL_EOF'
#!/usr/bin/env bash
echo "Removing OptiScaler files..."
rm -f OptiScaler.log OptiScaler.ini dxgi.dll fakenvapi.dll fakenvapi.ini fakenvapi.log
rm -f dlssg_to_fsr3_amd_is_better.dll dlssg_to_fsr3.log
rm -rf D3D12_Optiscaler DlssOverrides Licenses
echo "OptiScaler removed!"
rm -f "$0"
UNINSTALL_EOF
chmod +x "$exe_folder_path/remove_optiscaler.sh"

echo "✅ OptiScaler setup completed"

echo "✅ Installation completed successfully!"
logger -t fgmod "🟢 Installation completed successfully for $exe_folder_path"

# === Execute original command ===
if [[ $# -gt 1 ]]; then
  # Log to both file and system journal
  logger -t fgmod "=================="
  logger -t fgmod "Debug Info (Launch Mode):"
  logger -t fgmod "Number of arguments: $#"
  for i in $(seq 1 $#); do
    logger -t fgmod "Arg $i: ${!i}"
  done
  logger -t fgmod "Final executable path: $exe_folder_path"
  logger -t fgmod "=================="
  
  # Execute the original command with proper environment variables
  export SteamDeck=0
  export WINEDLLOVERRIDES="dxgi=n,b${WINEDLLOVERRIDES:+,$WINEDLLOVERRIDES}"
  exec "$@"
else
  echo "Done!"
  echo "----------------------------------------"
  echo "Debug Info (Standalone Mode):"
  echo "Number of arguments: $#"
  for i in $(seq 1 $#); do
    echo "Arg $i: ${!i}"
  done
  echo "Final executable path: $exe_folder_path"
  echo "----------------------------------------"
fi