@echo off
setLocal EnableDelayedExpansion

:: ------------------------ SET VARIABLES (don't touch) ----------------------------
set LauncherFolder="%userprofile%\Documents\Rockstar Games\Launcher"

:: ------------------------ USER OPTIONS ----------------------------------------------
:: gamefolder will be replaced by actual game folder. BUT, you can put a completely custom path here, like "F:\my backups\gta_backup" , BUT please use " marks if your path has spaces!
set backupfolder=gamefolder\_backup
:: open backup folder in explorer once finished
set open_explorer_window=true
:: ----------------------------------------------------------------------------------------

:Start
:GetGameFolder
if exist %LauncherFolder% (
cd /d %LauncherFolder%
for /f tokens^=2^ delims^=^" %%i in ('type launcher.log ^|find "GTA5.exe"') do set "exepath=%%i"
if "!exepath!"=="" ( echo ERROR: COULD NOT DETECT GAMEFOLDER & pause & goto :eof )
set gamepath="!exepath:\GTA5.exe=!"
if exist !gamepath! ( set "gamefolder=!gamepath!" ) else ( echo ERROR: COULD NOT DETECT GAMEFOLDER & pause & goto :eof )
echo Detected Game Folder !gamepath! & echo.
) else ( echo Warning: CAN'T FIND LAUNCHER FOLDER %LauncherFolder% & pause & goto :eof )

:GetVersion
set exepath2=!exepath:\=\\!
for /f "tokens=*" %%V in ( ' wmic datafile where "name='!exepath2!'" get version ' ) do (

	for /F "delims=" %%A IN ("%%V") do (
		if not "%%V"=="" (
			if not "%%V"=="Version" set "version=%%V"	
		)
	)
)
set "version=%version: =%"
if '!version!'=='' ( echo ERROR: COULD NOT DETECT VERSION & pause & goto :eof ) else ( echo Game Version: %version% )

:GetPlatform
cd /d %LauncherFolder%
	if exist launcher.log (
	for /f "tokens=*" %%i in ('type launcher.log ^|find "Running in Steam mode"') do set "Is_Steam=true"
	) else (
	echo ERROR: CAN'T FIND %cd%\launcher.log
)

:SetFileList
if defined is_steam ( set files_tocopy=GTA5.exe,GTAVLauncher.exe,steam_api64.dll,update\update.rpf ) else ( set files_tocopy=GTA5.exe,GTAVLauncher.exe,update\update.rpf )

:SetBackupFolder
set backupfolder=%backupfolder:gamefolder=!gamefolder!%
set backupfolder=%backupfolder:"=%
set backupfolder="%backupfolder%\%version%"
if NOT exist %backupfolder% ( mkdir %backupfolder% || ( CALL :ReportMkDirFailure %backupfolder% & pause & goto :eof ) )
echo Backup Folder %backupfolder% & echo.

:IterateFiles
set copycount=0
set failcount=0
for %%F in (%files_tocopy%) do ( if exist %backupfolder%\%%F ( CALL :AlreadyBackedUp %%F ) else ( CALL :CopyFile %%F ) )

:Finish
CALL :ReportALL
echo.
pause
if %open_explorer_window%==true explorer %backupfolder%
goto :eof

:: --------------------------------------------------------------------------------------------------------------------------

:CopyFile
xcopy /Y %gamefolder%\%1 %backupfolder%\%1*
if !errorlevel!==0 ( CALL :LogSuccess %1 ) else ( CALL :LogFailure %1 )
goto :eof

:AlreadyBackedUp
echo %1           - already backed up
goto :eof

:LogFailure
if "!failedfiles!"=="" ( set "failedfiles=%1" ) else ( set "failedfiles=!failedfiles!, %1" )
set /a "failcount=!failcount!+1"
goto :eof

:LogSuccess
if "!copiedfiles!"=="" ( set "copiedfiles=%1" ) else ( set "copiedfiles=!copiedfiles!, %1" )
set /a "copycount=!copycount!+1"
goto :eof

:ReportALL
CALL :ReportSuccess
CALL :ReportFailure
goto :eof

:ReportMkDirFailure
echo ---------------------------------------------------------------------------------------
echo  ERROR
echo  CAN'T CREATE FOLDER %1
echo  CHECK PERMISSIONS
echo ---------------------------------------------------------------------------------------
goto :eof

:ReportFailure
if %failcount% GTR 0 (
if %failcount% GTR 1 (set filesplural=files) else (set filesplural=file)
echo ------------------------------------------------------------------------
echo  FAILED TO COPY %failcount% !filesplural!: !failedfiles!
echo ------------------------------------------------------------------------
)
set failcount=0
set failedfiles=
goto :eof

:ReportSuccess
if %copycount% GTR 0 (
if %copycount% GTR 1 (set filesplural=files) else (set filesplural=file)
echo ------------------------------------------------------------------------
echo  %copycount% !filesplural! copied: !copiedfiles!
echo ------------------------------------------------------------------------
)
set copycount=0
set copiedfiles=
goto :eof