@echo off setlocal EnableExtensions EnableDelayedExpansion REM Check if being run from gameupdate folder (incorrect usage) for %%I in ("%CD%") do set "CURRENT_FOLDER=%%~nxI" if /I "%CURRENT_FOLDER%"=="gameupdate" ( echo. echo ======================================== echo ERROR: Do not run patch.bat directly! echo ======================================== echo. echo You are running this from the gameupdate folder. echo This will not work correctly! echo. echo Please go back to the game's root folder and echo run GameUpdate.bat instead. echo ======================================== echo. pause exit /b 1 ) REM Determine important paths set "SCRIPT_DIR=%~dp0" set "ROOT_DIR=%CD%" set "CONFIG_FILE=%SCRIPT_DIR%patch-config.txt" echo Using root directory: "%ROOT_DIR%" echo Using config: "%CONFIG_FILE%" echo Checking for pwsh... set _my_shell=pwsh REM Check if pwsh.exe exists where /q !_my_shell! if !errorlevel! neq 0 ( echo pwsh not found. Falling back to powershell... REM If pwsh is not found, set to powershell set _my_shell=powershell REM Check if powershell.exe exists echo Checking for powershell... where /q !_my_shell! if !errorlevel! neq 0 ( echo.Error: Powershell not found! pause exit /B 1 ) else ( echo powershell found. ) ) else ( echo pwsh found. ) echo Using !_my_shell! for script execution. REM Check if patch-config.txt exists in gameupdate folder if not exist "%CONFIG_FILE%" ( echo "Config file (gameupdate\patch-config.txt) not found! Assuming no patching needed." pause exit /b ) REM Read configuration from file for /f "usebackq tokens=1,2 delims==" %%a in ("%CONFIG_FILE%") do ( if "%%a"=="username" set "username=%%b" if "%%a"=="repo" set "repo=%%b" if "%%a"=="branch" set "branch=%%b" ) REM Get the latest hash echo "Getting latest commit SHA hash" !_my_shell! -Command "(Invoke-RestMethod -Uri 'https://gitgud.io/api/v4/projects/%username%%%2F%repo%/repository/branches/%branch%').commit.id" > "%ROOT_DIR%\latest_patch_sha.txt" REM Read the latest SHA from the file set /p latest_patch_sha=<"%ROOT_DIR%\latest_patch_sha.txt" REM Check if previous_patch_sha.txt exists in gameupdate if not exist "%SCRIPT_DIR%previous_patch_sha.txt" ( echo "Previous SHA hash not found!" echo "Assuming first time patching..." goto download_extract ) REM Read the stored SHA from previous check set /p previous_patch_sha=<"%SCRIPT_DIR%previous_patch_sha.txt" REM Trim whitespace from SHA strings set "previous_patch_sha=%previous_patch_sha: =%" set "latest_patch_sha=%latest_patch_sha: =%" REM Compare trimmed SHAs if "%latest_patch_sha%" neq "%previous_patch_sha%" ( echo "Update found! Patching..." goto download_extract ) else ( echo "Patch is up to date." ) REM Delete latest_patch_sha.txt del "%ROOT_DIR%\latest_patch_sha.txt" endlocal pause exit /b :download_extract REM Escape single quotes in paths set "escaped_root=%ROOT_DIR:'=''%" REM Download zip file to root echo "Downloading latest patch..." !_my_shell! -Command "Set-Location -LiteralPath '%escaped_root%'; $ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest -Uri 'https://gitgud.io/%username%/%repo%/-/archive/%branch%/%repo%-%branch%.zip' -OutFile 'repo.zip'" if !errorlevel! neq 0 ( pause exit /b ) REM Extract contents, overwriting conflicts into root echo "Extracting..." !_my_shell! -Command "Set-Location -LiteralPath '%escaped_root%'; $ProgressPreference = 'SilentlyContinue'; Expand-Archive -Path '.\repo.zip' -DestinationPath '.' -Force" if !errorlevel! neq 0 ( echo Extraction failed! del "%ROOT_DIR%\repo.zip" rmdir /s /q "%ROOT_DIR%\%repo%-%branch%" pause exit /b ) echo "Applying patch..." xcopy /s /e /y "%ROOT_DIR%\%repo%-%branch%\*" "%ROOT_DIR%\" if !errorlevel! neq 0 ( echo Patch application failed! del "%ROOT_DIR%\repo.zip" rmdir /s /q "%ROOT_DIR%\%repo%-%branch%" pause exit /b ) REM Clean up echo "Cleaning up..." del "%ROOT_DIR%\repo.zip" rmdir /s /q "%ROOT_DIR%\%repo%-%branch%" del "%ROOT_DIR%\latest_patch_sha.txt" REM Store latest SHA for next check in gameupdate echo %latest_patch_sha% > "%SCRIPT_DIR%previous_patch_sha.txt" endlocal pause exit /b