Reworked it to Work like Titus's D2 Script

This commit is contained in:
Nightmare1984 2025-02-25 16:15:12 -05:00
parent 886ab94b54
commit 1581ceea38

View File

@ -1,27 +1,24 @@
#!/bin/bash #!/bin/bash
if ! which 7z &> /dev/null; then . ../../common-script.sh
echo "7z is not installed. Installing 7z..."
if [[ -f /etc/debian_version ]]; then for cmd in find 7z curl git grep; do
sudo apt update if ! command_exists "$cmd"; then
sudo apt install -y p7zip-full printf "%b\n" "${RED}$cmd is not installed.${RC}"
elif [[ -f /etc/redhat-release ]]; then
sudo yum install -y p7zip
elif [[ -f /etc/arch-release ]]; then
sudo pacman -S --noconfirm p7zip
else
echo "Unsupported OS. Please install 7zip manually."
exit 1 exit 1
fi fi
fi done
function printErr() { printErr() {
removeTempDir removeTempDir
echo -e "\e[40m\e[31mError: $1\nExiting.\e[0m" echo -e "\e[40m\e[31mError: $1\nExiting.\e[0m"
[[ -z $2 ]] && exit 1 || exit "$2" [[ -z $2 ]] && exit 1 || exit "$2"
} }
function checkStdin() { # Check user input
# $1 is valid values to display to user
# $2 is regex
checkStdin() {
while true; do while true; do
read -rp "$1" userInput read -rp "$1" userInput
if [[ $userInput =~ $2 ]]; then if [[ $userInput =~ $2 ]]; then
@ -31,7 +28,8 @@ function checkStdin() {
echo "$userInput" echo "$userInput"
} }
function getGamePath() { # Try to get game directory from user.
getGamePath() {
echo 'Supply the folder path where the main executable (exe file) for the game is.' echo 'Supply the folder path where the main executable (exe file) for the game is.'
echo '(Control+c to exit)' echo '(Control+c to exit)'
while true; do while true; do
@ -53,21 +51,23 @@ function getGamePath() {
done done
} }
function createTempDir() { # Remove / create temporary directory.
createTempDir() {
tmpDir=$(mktemp -d) tmpDir=$(mktemp -d)
cd "$tmpDir" || printErr "Failed to create temp directory." cd "$tmpDir" || printErr "Failed to create temp directory."
} }
removeTempDir() {
function removeTempDir() {
cd "$MAIN_PATH" || exit cd "$MAIN_PATH" || exit
[[ -d $tmpDir ]] && rm -rf "$tmpDir" [[ -d $tmpDir ]] && rm -rf "$tmpDir"
} }
function downloadD3dcompiler_47() { # Downloads d3dcompiler_47.dll files.
downloadD3dcompiler_47() {
! [[ $1 =~ ^(32|64)$ ]] && printErr "(downloadD3dcompiler_47): Wrong system architecture." ! [[ $1 =~ ^(32|64)$ ]] && printErr "(downloadD3dcompiler_47): Wrong system architecture."
[[ -f $MAIN_PATH/d3dcompiler_47.dll.$1 ]] && return [[ -f $MAIN_PATH/d3dcompiler_47.dll.$1 ]] && return
echo "Downloading d3dcompiler_47.dll for $1 bits." echo "Downloading d3dcompiler_47.dll for $1 bits."
createTempDir createTempDir
# Based on https://github.com/Winetricks/winetricks/commit/bc5c57d0d6d2c30642efaa7fee66b60f6af3e133
curl -sLO "https://download-installer.cdn.mozilla.net/pub/firefox/releases/62.0.3/win$1/ach/Firefox%20Setup%2062.0.3.exe" \ curl -sLO "https://download-installer.cdn.mozilla.net/pub/firefox/releases/62.0.3/win$1/ach/Firefox%20Setup%2062.0.3.exe" \
|| echo "Could not download Firefox setup file (which contains d3dcompiler_47.dll)" || echo "Could not download Firefox setup file (which contains d3dcompiler_47.dll)"
[[ $1 -eq 32 ]] && hash="d6edb4ff0a713f417ebd19baedfe07527c6e45e84a6c73ed8c66a33377cc0aca" || hash="721977f36c008af2b637aedd3f1b529f3cfed6feb10f68ebe17469acb1934986" [[ $1 -eq 32 ]] && hash="d6edb4ff0a713f417ebd19baedfe07527c6e45e84a6c73ed8c66a33377cc0aca" || hash="721977f36c008af2b637aedd3f1b529f3cfed6feb10f68ebe17469acb1934986"
@ -78,7 +78,10 @@ function downloadD3dcompiler_47() {
removeTempDir removeTempDir
} }
function downloadReshade() { # Download / extract ReShade from specified link.
# $1 => Version of ReShade
# $2 -> Full URL of ReShade exe, ex.: https://reshade.me/downloads/ReShade_Setup_5.0.2.exe
downloadReshade() {
createTempDir createTempDir
curl -sLO "$2" || printErr "Could not download version $1 of ReShade." curl -sLO "$2" || printErr "Could not download version $1 of ReShade."
exeFile="$(find . -name "*.exe")" exeFile="$(find . -name "*.exe")"
@ -118,20 +121,41 @@ for REQUIRED_EXECUTABLE in $REQUIRED_EXECUTABLES; do
fi fi
done done
# Z0000 Create MAIN_PATH
# Z0005 Check if update enabled.
# Z0010 Download / update shaders.
# Z0015 Download / update latest ReShade version.
# Z0016 Download version of ReShade specified by user.
# Z0020 Process GLOBAL_INI.
# Z0025 Vulkan install / uninstall.
# Z0030 DirectX / OpenGL uninstall.
# Z0035 DirectX / OpenGL find correct ReShade DLL.
# Z0040 Download d3dcompiler_47.dll.
# Z0045 DirectX / OpenGL link files to game directory.
# Z0000
mkdir -p "$MAIN_PATH" || printErr "Unable to create directory '$MAIN_PATH'." mkdir -p "$MAIN_PATH" || printErr "Unable to create directory '$MAIN_PATH'."
cd "$MAIN_PATH" || exit cd "$MAIN_PATH" || exit
# Z0000
mkdir -p "$RESHADE_PATH" mkdir -p "$RESHADE_PATH"
mkdir -p "$MAIN_PATH/ReShade_shaders" mkdir -p "$MAIN_PATH/ReShade_shaders"
mkdir -p "$MAIN_PATH/External_shaders" mkdir -p "$MAIN_PATH/External_shaders"
# Z0005
# Skip updating shaders / reshade if recently done (4 hours).
[[ -f LASTUPDATED ]] && LASTUPDATED=$(cat LASTUPDATED) || LASTUPDATED=0 [[ -f LASTUPDATED ]] && LASTUPDATED=$(cat LASTUPDATED) || LASTUPDATED=0
[[ ! $LASTUPDATED =~ ^[0-9]+$ ]] && LASTUPDATED=0 [[ ! $LASTUPDATED =~ ^[0-9]+$ ]] && LASTUPDATED=0
[[ $LASTUPDATED -gt 0 && $(($(date +%s)-LASTUPDATED)) -lt 14400 ]] && UPDATE_RESHADE=0 [[ $LASTUPDATED -gt 0 && $(($(date +%s)-LASTUPDATED)) -lt 14400 ]] && UPDATE_RESHADE=0
[[ $UPDATE_RESHADE == 1 ]] && date +%s > LASTUPDATED [[ $UPDATE_RESHADE == 1 ]] && date +%s > LASTUPDATED
# Z0005
echo -e "$SEPARATOR\nReShade installer/updater for Linux games using wine or proton.\n$SEPARATOR\n" echo -e "$SEPARATOR\nReShade installer/updater for Linux games using wine or proton.\n$SEPARATOR\n"
# Z0010
# Link Shader / Texture files from an input directory to an output directory if the link doesn't already exist.
# $1 is the input directory (full path).
# $2 is the output directory name (Textures / Shaders), with optional subdirectory.
function linkShaderFiles() { function linkShaderFiles() {
[[ ! -d $1 ]] && return [[ ! -d $1 ]] && return
cd "$1" || return cd "$1" || return
@ -145,7 +169,9 @@ function linkShaderFiles() {
ln -s "$INFILE" "$OUTDIR" ln -s "$INFILE" "$OUTDIR"
done done
} }
# Check ReShade_shaders or External_shaders directories for directories to link to the Merged folder.
# $1 ReShade_shaders | External_shaders
# $2 Optional: Repo name
function mergeShaderDirs() { function mergeShaderDirs() {
[[ $1 != ReShade_shaders && $1 != External_shaders ]] && return [[ $1 != ReShade_shaders && $1 != External_shaders ]] && return
for dirName in Shaders Textures; do for dirName in Shaders Textures; do
@ -181,6 +207,7 @@ if [[ -n $SHADER_REPOS ]]; then
if [[ $MERGE_SHADERS == 1 ]] && [[ -d "$MAIN_PATH/External_shaders" ]]; then if [[ $MERGE_SHADERS == 1 ]] && [[ -d "$MAIN_PATH/External_shaders" ]]; then
echo "Checking for External Shader updates." echo "Checking for External Shader updates."
mergeShaderDirs "External_shaders" mergeShaderDirs "External_shaders"
# Link loose files.
cd "$MAIN_PATH/External_shaders" || exit 1 cd "$MAIN_PATH/External_shaders" || exit 1
for file in *; do for file in *; do
[[ ! -f $file || -L "$MAIN_PATH/ReShade_shaders/Merged/Shaders/$file" ]] && continue [[ ! -f $file || -L "$MAIN_PATH/ReShade_shaders/Merged/Shaders/$file" ]] && continue
@ -192,11 +219,15 @@ if [[ -n $SHADER_REPOS ]]; then
fi fi
fi fi
echo "$SEPARATOR" echo "$SEPARATOR"
# Z0010
# Z0015
cd "$MAIN_PATH" || exit cd "$MAIN_PATH" || exit
[[ -f LVERS ]] && LVERS=$(cat LVERS) || LVERS=0 [[ -f LVERS ]] && LVERS=$(cat LVERS) || LVERS=0
if [[ $RESHADE_VERSION == latest ]]; then if [[ $RESHADE_VERSION == latest ]]; then
# Check if user wants reshade without addon support and we're currently using reshade with addon support.
[[ $LVERS =~ Addon && $RESHADE_ADDON_SUPPORT -eq 0 ]] && UPDATE_RESHADE=1 [[ $LVERS =~ Addon && $RESHADE_ADDON_SUPPORT -eq 0 ]] && UPDATE_RESHADE=1
# Check if user wants reshade with addon support and we're not currently using reshade with addon support.
[[ ! $LVERS =~ Addon ]] && [[ $RESHADE_ADDON_SUPPORT -eq 1 ]] && UPDATE_RESHADE=1 [[ ! $LVERS =~ Addon ]] && [[ $RESHADE_ADDON_SUPPORT -eq 1 ]] && UPDATE_RESHADE=1
fi fi
if [[ $FORCE_RESHADE_UPDATE_CHECK -eq 1 ]] || [[ $UPDATE_RESHADE -eq 1 ]] || [[ ! -e reshade/latest/ReShade64.dll ]] || [[ ! -e reshade/latest/ReShade32.dll ]]; then if [[ $FORCE_RESHADE_UPDATE_CHECK -eq 1 ]] || [[ $UPDATE_RESHADE -eq 1 ]] || [[ ! -e reshade/latest/ReShade64.dll ]] || [[ ! -e reshade/latest/ReShade32.dll ]]; then
@ -224,7 +255,9 @@ if [[ $FORCE_RESHADE_UPDATE_CHECK -eq 1 ]] || [[ $UPDATE_RESHADE -eq 1 ]] || [[
echo "Updated ReShade to version $RVERS." echo "Updated ReShade to version $RVERS."
fi fi
fi fi
# Z0015
# Z0016
cd "$MAIN_PATH" || exit cd "$MAIN_PATH" || exit
if [[ $RESHADE_VERSION != latest ]]; then if [[ $RESHADE_VERSION != latest ]]; then
[[ $RESHADE_ADDON_SUPPORT -eq 1 ]] && RESHADE_VERSION="${RESHADE_VERSION}_Addon" [[ $RESHADE_ADDON_SUPPORT -eq 1 ]] && RESHADE_VERSION="${RESHADE_VERSION}_Addon"
@ -237,7 +270,9 @@ if [[ $RESHADE_VERSION != latest ]]; then
else else
echo -e "Using the latest version of ReShade ($LVERS).\n" echo -e "Using the latest version of ReShade ($LVERS).\n"
fi fi
# Z0016
# Z0020
if [[ $GLOBAL_INI != 0 ]] && [[ $GLOBAL_INI == ReShade.ini ]] && [[ ! -f $MAIN_PATH/$GLOBAL_INI ]]; then if [[ $GLOBAL_INI != 0 ]] && [[ $GLOBAL_INI == ReShade.ini ]] && [[ ! -f $MAIN_PATH/$GLOBAL_INI ]]; then
cd "$MAIN_PATH" || exit cd "$MAIN_PATH" || exit
curl -sLO https://github.com/kevinlekiller/reshade-steam-proton/raw/ini/ReShade.ini curl -sLO https://github.com/kevinlekiller/reshade-steam-proton/raw/ini/ReShade.ini
@ -249,7 +284,11 @@ if [[ $GLOBAL_INI != 0 ]] && [[ $GLOBAL_INI == ReShade.ini ]] && [[ ! -f $MAIN_P
fi fi
fi fi
fi fi
# Z0020
# Z0025
# TODO Requires changes for ReShade 5.0 ; paths and json files are different.
# See https://github.com/kevinlekiller/reshade-steam-proton/issues/6#issuecomment-1027230967
if [[ $VULKAN_SUPPORT == 1 ]]; then if [[ $VULKAN_SUPPORT == 1 ]]; then
echo "Does the game use the Vulkan API?" echo "Does the game use the Vulkan API?"
if [[ $(checkStdin "(y/n): " "^(y|n)$") == "y" ]]; then if [[ $(checkStdin "(y/n): " "^(y|n)$") == "y" ]]; then
@ -269,7 +308,7 @@ if [[ $VULKAN_SUPPORT == 1 ]]; then
echo "Specify if the game's EXE file architecture is 32 or 64 bits:" echo "Specify if the game's EXE file architecture is 32 or 64 bits:"
[[ $(checkStdin "(32/64) " "^(32|64)$") == 64 ]] && exeArch=64 || exeArch=32 [[ $(checkStdin "(32/64) " "^(32|64)$") == 64 ]] && exeArch=64 || exeArch=32
export WINEPREFIX="$WINEPREFIX" export WINEPREFIX="$WINEPREFIX"
echo "Do you want to install or uninstall ReShade?" echo "Do you want to (i)nstall or (u)ninstall ReShade?"
if [[ $(checkStdin "(i/u): " "^(i|u)$") == "i" ]]; then if [[ $(checkStdin "(i/u): " "^(i|u)$") == "i" ]]; then
wine reg ADD HKLM\\SOFTWARE\\Khronos\\Vulkan\\ImplicitLayers /d 0 /t REG_DWORD /v "Z:\\home\\$USER\\$WINE_MAIN_PATH\\reshade\\$RESHADE_VERSION\\ReShade$exeArch.json" -f /reg:"$exeArch" wine reg ADD HKLM\\SOFTWARE\\Khronos\\Vulkan\\ImplicitLayers /d 0 /t REG_DWORD /v "Z:\\home\\$USER\\$WINE_MAIN_PATH\\reshade\\$RESHADE_VERSION\\ReShade$exeArch.json" -f /reg:"$exeArch"
else else
@ -279,8 +318,10 @@ if [[ $VULKAN_SUPPORT == 1 ]]; then
exit 0 exit 0
fi fi
fi fi
# Z0025
echo "Do you want to install or uninstall ReShade for a DirectX or OpenGL game?" # Z0030
echo "Do you want to (i)nstall or (u)ninstall ReShade for a DirectX or OpenGL game?"
if [[ $(checkStdin "(i/u): " "^(i|u)$") == "u" ]]; then if [[ $(checkStdin "(i/u): " "^(i|u)$") == "u" ]]; then
getGamePath getGamePath
echo "Unlinking ReShade files." echo "Unlinking ReShade files."
@ -299,7 +340,9 @@ if [[ $(checkStdin "(i/u): " "^(i|u)$") == "u" ]]; then
echo -e "\e[40m\e[32mMake sure to remove or change the \e[34mWINEDLLOVERRIDES\e[32m environment variable.\e[0m" echo -e "\e[40m\e[32mMake sure to remove or change the \e[34mWINEDLLOVERRIDES\e[32m environment variable.\e[0m"
exit 0 exit 0
fi fi
# Z0030
# Z0035
getGamePath getGamePath
echo "Do you want $0 to attempt to automatically detect the right dll files to use for ReShade?" echo "Do you want $0 to attempt to automatically detect the right dll files to use for ReShade?"
[[ $(checkStdin "(y/n) " "^(y|n)$") == "y" ]] && wantedDll="auto" || wantedDll="manual" [[ $(checkStdin "(y/n) " "^(y|n)$") == "y" ]] && wantedDll="auto" || wantedDll="manual"
@ -328,9 +371,13 @@ if [[ $wantedDll == "manual" ]]; then
[[ $ynCheck =~ ^(y|Y|yes|YES)$ ]] && break [[ $ynCheck =~ ^(y|Y|yes|YES)$ ]] && break
done done
fi fi
# Z0035
# Z0040
downloadD3dcompiler_47 "$exeArch" downloadD3dcompiler_47 "$exeArch"
# Z0040
# Z0045
echo "Linking ReShade files to game directory." echo "Linking ReShade files to game directory."
[[ -L $gamePath/$wantedDll.dll ]] && unlink "$gamePath/$wantedDll.dll" [[ -L $gamePath/$wantedDll.dll ]] && unlink "$gamePath/$wantedDll.dll"
if [[ $exeArch == 32 ]]; then if [[ $exeArch == 32 ]]; then
@ -353,6 +400,7 @@ if [[ -f $MAIN_PATH/$LINK_PRESET ]]; then
[[ -L $gamePath/$LINK_PRESET ]] && unlink "$gamePath/$LINK_PRESET" [[ -L $gamePath/$LINK_PRESET ]] && unlink "$gamePath/$LINK_PRESET"
ln -is "$(realpath "$MAIN_PATH/$LINK_PRESET")" "$gamePath/$LINK_PRESET" ln -is "$(realpath "$MAIN_PATH/$LINK_PRESET")" "$gamePath/$LINK_PRESET"
fi fi
# Z0045
echo -e "$SEPARATOR\nDone." echo -e "$SEPARATOR\nDone."
gameEnvVar="WINEDLLOVERRIDES=\"d3dcompiler_47=n;$wantedDll=n,b\"" gameEnvVar="WINEDLLOVERRIDES=\"d3dcompiler_47=n;$wantedDll=n,b\""