REM Setup OptiScaler for your game @echo off cls echo :::::::: ::::::::: ::::::::::: ::::::::::: :::::::: :::::::: ::: ::: :::::::::: ::::::::: echo :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: echo +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ echo +#+ +:+ +#++:++#+ +#+ +#+ +#++:++#++ +#+ +#++:++#++: +#+ +#++:++# +#++:++#: echo +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ echo #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# echo ######## ### ### ########### ######## ######## ### ### ########## ########## ### ### echo. echo Coping is strong with this one... echo v2.75 - now with OptiPatcher support echo. del "!! README_EXTRACT ALL FILES TO GAME FOLDER !!.txt" 2>nul setlocal enabledelayedexpansion if not exist OptiScaler.dll ( echo OptiScaler "OptiScaler.dll" file is not found^^! echo Either a folder permissions issue or the repo source code was downloaded. echo. echo If "OptiScaler.dll" exists, please manually rename to a supported filename ^(e.g. dxgi/winmm.dll^) and you are done^^! echo No need to run the setup BAT again after renaming. echo. echo If .sln or .git files are in the folder, congratz, you have the source code. Now try properly downloading Opti please echo Hint - use the Releases page on GitHub, or RTFM :^) echo. echo. goto end ) REM Check if old pre-0.9 additional files exist, along with an existing Opti installation set "OLD_FILES_FOUND=0" set "OPTI_DLL_LIST=" if exist nvapi64.dll set "OLD_FILES_FOUND=1" if exist nvngx.dll set "OLD_FILES_FOUND=1" if exist OptiScaler.asi set "OLD_FILES_FOUND=1" if exist "Remove OptiScaler.bat" set "OLD_FILES_FOUND=1" for %%F in (dxgi.dll winmm.dll d3d12.dll dbghelp.dll version.dll wininet.dll winhttp.dll) do ( if exist "%%F" ( set "origname=" for /f "tokens=*" %%P in ('powershell -NoProfile -Command "(Get-Item '%%F').VersionInfo.OriginalFilename"') do ( set "origname=%%P" ) if /i "!origname!"=="OptiScaler.dll" ( set "OLD_FILES_FOUND=1" set "OPTI_DLL_LIST=!OPTI_DLL_LIST! %%F" ) ) ) if "!OLD_FILES_FOUND!"=="1" ( echo WARNING: Possible old OptiScaler file^(s^) detected^^! if exist nvapi64.dll echo - nvapi64.dll if exist nvngx.dll echo - nvngx.dll if exist OptiScaler.asi echo - OptiScaler.asi if exist "Remove OptiScaler.bat" echo - Remove OptiScaler.bat for %%F in (!OPTI_DLL_LIST!) do echo - %%F ^(original filename: OptiScaler.dll^) echo. echo These files may conflict with the current version of OptiScaler. echo It is recommended to delete them. echo. set /p "USER_CHOICE=Do you want to delete these files? (y/n): " echo. if /i "!USER_CHOICE!"=="y" ( if exist nvapi64.dll ( del nvapi64.dll echo Deleted nvapi64.dll ) if exist nvngx.dll ( del nvngx.dll echo Deleted nvngx.dll ) if exist OptiScaler.asi ( del OptiScaler.asi echo Deleted OptiScaler.asi ) if exist "Remove OptiScaler.bat" ( del "Remove OptiScaler.bat" echo Deleted Remove OptiScaler.bat ) for %%F in (!OPTI_DLL_LIST!) do ( del "%%F" echo Deleted %%F ) echo Done^^! ) else ( echo Skipping deletion. Note that these files may cause issues. ) echo. ) REM Set paths based on current directory set "gamePath=%~dp0" set "optiScalerFile=%gamePath%\OptiScaler.dll" set setupSuccess=false REM Check if the Engine folder exists if exist "%gamePath%\Engine" ( echo Found Engine folder, if this is an Unreal Engine game then please extract Optiscaler to #CODENAME#\Binaries\Win64 echo. set /p continueChoice="Continue installation to current folder? [y/n]: " set continueChoice=!continueChoice: =! if "!continueChoice!"=="y" ( goto selectFilename ) goto end ) REM Prompt user to select a filename for OptiScaler :selectFilename echo. echo Choose a filename for OptiScaler (default is dxgi.dll, most compatible): echo (For Vulkan, use winmm.dll. For XGP/MS Store, winmm/version.dll may be better) echo. echo [1] dxgi.dll echo [2] winmm.dll echo [3] version.dll echo [4] dbghelp.dll echo [5] d3d12.dll echo [6] wininet.dll echo [7] winhttp.dll echo [8] OptiScaler.asi echo. set /p filenameChoice="Enter 1-8 (or press Enter for default): " if "%filenameChoice%"=="" ( set selectedFilename="dxgi.dll" ) else if "%filenameChoice%"=="1" ( set selectedFilename="dxgi.dll" ) else if "%filenameChoice%"=="2" ( set selectedFilename="winmm.dll" ) else if "%filenameChoice%"=="3" ( set selectedFilename="version.dll" ) else if "%filenameChoice%"=="4" ( set selectedFilename="dbghelp.dll" ) else if "%filenameChoice%"=="5" ( set selectedFilename="d3d12.dll" ) else if "%filenameChoice%"=="6" ( set selectedFilename="wininet.dll" ) else if "%filenameChoice%"=="7" ( set selectedFilename="winhttp.dll" ) else if "%filenameChoice%"=="8" ( set selectedFilename="OptiScaler.asi" ) else ( echo Invalid choice. Please select a valid option. echo. goto selectFilename ) if exist %selectedFilename% ( echo. echo WARNING: %selectedFilename% already exists in the current folder. echo. set /p overwriteChoice="Do you want to overwrite %selectedFilename%? [y/n]: " set overwriteChoice=!overwriteChoice: =! echo. if "!overwriteChoice!"=="y" ( goto checkWine ) goto selectFilename ) REM Wine doesn't support powershell :checkWine reg query HKEY_CURRENT_USER\Software\Wine >nul 2>&1 if %errorlevel%==0 ( echo. echo Using wine, skipping over spoofing checks. echo If you need, you can disable spoofing by setting Dxgi=false in the config echo. pause goto completeSetup ) if exist %windir%\system32\nvapi64.dll ( echo. echo Nvidia driver files detected. set isNvidia=true ) else ( set isNvidia=false ) REM Query user for GPU type echo. echo Are you using an Nvidia GPU or AMD/Intel GPU? echo [1] AMD/Intel echo [2] Nvidia echo. :gpuPrompt if "%isNvidia%"=="true" ( set /p gpuChoice="Enter 1 or 2 (Detected Nvidia): " ) else ( set /p gpuChoice="Enter 1 or 2 (Detected AMD/Intel): " ) if "%gpuChoice%"=="1" goto gpuValid if "%gpuChoice%"=="2" goto gpuValid echo Invalid input. Please enter 1 or 2. echo. goto gpuPrompt :gpuValid REM Skip spoofing if Nvidia if "%gpuChoice%"=="2" ( goto completeSetup ) REM Query user for DLSS echo. echo Will you try to use DLSS inputs to replace with FSR/XeSS? (enables Nvidia spoofing, required for DLSS-FG, Reflex-^>AL2) echo If you want to change the setting later, edit OptiScaler.ini and set Dxgi=false to disable spoofing and reverse. echo. echo [1] Yes echo [2] No echo. set /p enablingSpoofing="Enter 1 or 2 (or press Enter for Yes): " set configFile=OptiScaler.ini if "%enablingSpoofing%"=="2" ( if not exist "%configFile%" ( echo Config file not found: %configFile% pause ) powershell -Command "(Get-Content '%configFile%') -replace 'Dxgi=auto', 'Dxgi=false' | Set-Content '%configFile%'" ) REM Decide whether to run OptiPatcher echo. if "%gpuChoice%"=="1" ( echo AMD/Intel GPU detected - running OptiPatcher check. goto checkExistingOptiPatcher ) :checkExistingOptiPatcher set "foundOptiPatcher=" for %%F in (plugins\*OptiPatcher*.asi) do ( set "foundOptiPatcher=%%F" ) if defined foundOptiPatcher ( echo. echo OptiPatcher found: !foundOptiPatcher! echo If the existing version works properly, might be best to keep it. set /p optiRedownload="Do you want to re-download a possibly newer version [y/n]? " if /i "!optiRedownload!"=="y" ( echo. echo Deleting !foundOptiPatcher!... del "!foundOptiPatcher!" goto checkOptiPatcher ) else ( echo. echo Keeping existing OptiPatcher - skipping download. goto completeSetup ) ) REM Not installed - continue to download goto checkOptiPatcher :checkOptiPatcher REM Check connectivity echo. echo Checking for OptiPatcher compatibility... echo Press Ctrl+C if this gets stuck to skip to setup completion. ping -n 1 -w 3000 github.com >nul 2>&1 if %errorlevel% neq 0 ( echo Offline or GitHub blocked. Skipping OptiPatcher check. goto completeSetup ) set "OPTI_MATCH=NO" for /f "usebackq tokens=*" %%A in (`powershell -Command "& { $rawUrl = 'https://raw.githubusercontent.com/optiscaler/OptiPatcher/main/OptiPatcher/dllmain.cpp'; try { $code = (Invoke-WebRequest -Uri $rawUrl -UseBasicParsing).Content } catch { return 'ERR' }; $supported = @(); $ueMatches = [Regex]::Matches($code, 'CHECK_UE\s*\(\s*([a-zA-Z0-9_]+)\s*\)'); foreach ($m in $ueMatches) { $base = $m.Groups[1].Value; $supported += ($base + '-win64-shipping.exe').ToLower(); $supported += ($base + '-wingdk-shipping.exe').ToLower(); }; $directMatches = [Regex]::Matches($code, 'exeName\s*==\s*[\x22\x27]([^\x22\x27]+)[\x22\x27]'); foreach ($m in $directMatches) { $supported += $m.Groups[1].Value.ToLower(); }; $localFiles = Get-ChildItem *.exe | Select-Object -ExpandProperty Name; foreach ($file in $localFiles) { if ($supported -contains $file.ToLower()) { Write-Output 'YES'; exit; } }; Write-Output 'NO'; }"`) do ( set "OPTI_MATCH=%%A" ) if "!OPTI_MATCH!"=="YES" ( echo. echo OptiPatcher support detected^^! echo An Opti plugin used for unlocking DLSS/DLSS-FG inputs, avoiding spoofing and performance overhead in supported games. echo More info available on OptiPatcher Github echo. set /p downloadOptiPatcher="Download OptiPatcher.asi? [y/n]: " set downloadOptiPatcher=!downloadOptiPatcher: =! if "!downloadOptiPatcher!"=="y" ( echo. echo Preparing plugins folder... if not exist "plugins" mkdir "plugins" echo Downloading OptiPatcher... echo Press Ctrl+C if this gets stuck to skip to setup completion. echo. powershell -Command "Invoke-WebRequest -Uri 'https://github.com/optiscaler/OptiPatcher/releases/download/rolling/OptiPatcher.asi' -OutFile 'plugins\OptiPatcher.asi'" if errorlevel 1 goto completeSetup if exist "plugins\OptiPatcher.asi" ( echo OptiPatcher.asi downloaded successfully. echo Enabling ASI loading in OptiScaler.ini... if exist "%configFile%" ( powershell -Command "(Get-Content '%configFile%') -replace 'LoadAsiPlugins=auto', 'LoadAsiPlugins=true' | Set-Content '%configFile%'" echo Successfully enabled ASI loading in OptiScaler.ini^^! ) else ( echo Warning: OptiScaler.ini not found, could not enable LoadAsiPlugins. ) ) else ( echo Failed to download OptiPatcher.asi. ) timeout /t 3 ) ) echo. goto completeSetup :completeSetup REM Rename OptiScaler file echo. if "!overwriteChoice!"=="y" ( echo Removing previous %selectedFilename%... del /F %selectedFilename% ) echo Renaming OptiScaler file to %selectedFilename%... rename "%optiScalerFile%" %selectedFilename% if errorlevel 1 ( echo. echo ERROR: Failed to rename OptiScaler file to %selectedFilename%. Most likely due to folder permissions issues. echo Please rename OptiScaler.dll manually to %selectedFilename%^^! No need to run setup BAT again after that. echo. goto end ) goto create_uninstaller :create_uninstaller_return cls echo OptiScaler setup completed successfully... echo. echo ___ echo (_ ' echo /__ /) / () (/ echo _/ / echo. set setupSuccess=true :end pause if "%setupSuccess%"=="true" ( del "setup_linux.sh" del %0 ) exit /b :create_uninstaller setlocal DisableDelayedExpansion ( echo @echo off echo setlocal EnableDelayedExpansion echo cls echo echo :::::::: ::::::::: ::::::::::: ::::::::::: :::::::: :::::::: ::: ::: :::::::::: ::::::::: echo echo :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: echo echo +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ echo echo +#+ +:+ +#++:++#+ +#+ +#+ +#++:++#++ +#+ +#++:++#++: +#+ +#++:++# +#++:++#: echo echo +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ echo echo #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# echo echo ######## ### ### ########### ######## ######## ### ### ########## ########## ### ### echo echo. echo echo Coping is strong with this one... echo echo v2.75 - now with OptiPatcher support echo echo. echo REM Check if OptiScaler installation exists echo set "OLD_FILES_FOUND=0" echo set "OPTI_DLL_LIST=" echo if exist OptiScaler.asi set "OLD_FILES_FOUND=1" echo for %%%%F in ^(dxgi.dll winmm.dll d3d12.dll dbghelp.dll version.dll wininet.dll winhttp.dll^) do ^( echo if exist "%%%%F" ^( echo set "origname=" echo for /f "tokens=*" %%%%P in ^('powershell -NoProfile -Command "(Get-Item '%%%%F').VersionInfo.OriginalFilename"'^) do ^( echo set "origname=%%%%P" echo ^) echo if /i "!origname!"=="OptiScaler.dll" ^( echo set "OLD_FILES_FOUND=1" echo set "OPTI_DLL_LIST=!OPTI_DLL_LIST! %%%%F" echo ^) echo ^) echo ^) echo if "!OLD_FILES_FOUND!"=="1" ^( echo echo Existing OptiScaler installation detected^^^^! echo if exist OptiScaler.asi echo - OptiScaler.asi echo for %%%%F in ^(!OPTI_DLL_LIST!^) do echo - %%%%F - original filename: OptiScaler.dll echo echo. echo ^) echo set /p removeChoice="Do you want to remove OptiScaler? [y/n]: " echo echo. echo if "%%removeChoice%%"=="y" ^( echo del OptiScaler.log echo del OptiScaler.ini echo del OptiScaler.asi echo del fakenvapi.dll echo del fakenvapi.ini echo del fakenvapi.log echo del dlssg_to_fsr3_amd_is_better.dll echo del dlssg_to_fsr3.log echo del /Q D3D12_Optiscaler\* echo rd D3D12_Optiscaler echo del /Q DlssOverrides\* echo rd DlssOverrides echo del /Q Licenses\* echo rd Licenses echo for %%%%F in ^(!OPTI_DLL_LIST!^) do ^(del "%%%%F"^) echo echo. echo echo Deleting OptiPatcher if present echo del plugins\OptiPatcher.asi echo rd plugins echo echo. echo echo OptiScaler removed^^^^! Ignore the warnings about missing files. echo echo. echo ^) else ^( echo echo. echo echo Operation cancelled. echo echo. echo ^) echo. echo pause echo if "%%removeChoice%%"=="y" ^( echo del %%0 echo ^) ) > "Remove OptiScaler.bat" endlocal echo. echo Uninstaller created. echo. goto create_uninstaller_return