RPCS3

MEmu := "RPCS3"

MEmuV := ""

MURL := ["https://rpcs3.net"]

MAuthor := ["slashin8r", "wallmachine", "jviegas", "brolly", "aurel102001"]

MVersion := ""

MDate := ""

MCRC := ""

iCRC := ""

MID := ""

MSystem := ["Sony PlayStation 3"]

;----------------------------------------------------------------------------

; Notes:

; [IMPORTANT]

; There are three methods for using this module.

; METHOD 1: Archives: Use this method if you will be compressing your games to save space.

; 1) Archive your game folders, rename the archive to the title of the game, place all the archives within the same folder, and then add that folder as a romPath in RocketLauncher.

; 2) Add the archive's extension ("7z", "rar", "zip", etc.) for the RPCS3 emulator within RocketLauncher.

; 3) Generate a new database based on the new rom path.

; 4) Audit all games for the system and enjoy.

; METHOD 2: Shortcuts: Use this method if you will be installing your games directly into RPCS3. Can also be used if you will be storing your non-archive games outside of the RPCS3 installation directories.

; 1) Create shortcuts of your EBOOT.BIN files, rename them to the title of the game, place them all within the same folder, then add that folder as a romPath in RocketLauncher.

; 2) Add the "lnk" (LNK) extension for the RPCS3 emulator within RocketLauncher.

; 3) Generate a new database based on the new rom path.

; 4) Audit all games for the system and enjoy.

; METHOD 3: Text Files: Use this method if you are converting over from a RPCS3 module prior to version 1.0.2.

; 1) Place game folders all within the same folder. You can rename these folders to whatever you like, usually the title of the game. (e.g. "Rune Factory - Oceans (Europe) [BLES01550]")

; 2) Create a text file for every game with the same name as its game folder. (e.g. "Rune Factory - Oceans (Europe) [BLES01550]")

; 3) Place these text files within the folder storing your games.

; [If you wish to have the text files in a separate folder, edit the "GamesDirectory" variable, found within your RPCS3.ini file, to match the full path of the folder storing your games]

; 4) Add the folder containing your text files as a romPath in RocketLauncher.

; 5) Add the "txt" extension for the RPCS3 emulator within RocketLauncher.

; 6) Generate a new database based on the new rom path.

; 7) Audit all games for the system and enjoy.

; [IMPORTANT]

; To save additional space, this module now automatically compresses each game's PPU folder and Game Data folder (if exists) as long as it is enabled in your RPCS3.ini file.

; PPU file saved in: %romPath%\cache\%romName%_%A_ComputerName%.7z (PPU files are hardware specific, so the computer name is added to the end of the filename)

; Game Data file saved in: %romPath%\data\%romName%_data.7z ("_data" added to the end of the filename so there is no conflict with the rom name)

; Example:

; Rom File = "D:\PS3\PS3 Test Game.rar"

; A_ComputerName = "PC001"

; PPU File = "D:\PS3\cache\PS3 Test Game_PC001.7z")

; Game Data File = "D:\PS3\data\PS3 Test Game_data.7z")

; Known Issues:

; 1) Additional progress bar appears just before the game is extracted/loaded (after the PPU and/or DATA archives are extracted). This problem is not specific to this module.

; 2) Unable to run PSN games with the emulator stored on a network drive.

; Coming Soon:

; 1) Allow PSN games to run from the installed path.

;----------------------------------------------------------------------------


StartModule()

BezelGUI()

FadeInStart()


primaryExe := new Emulator(emuPath . "\" . executable)

primaryWindowClassName := "Qt5152QWindowIcon"

emuPrimaryWindow := new Window(new WindowTitle(,primaryWindowClassName, executable))


; Finding emulator config file

Rpcs3config := new File(emuPath . "\config.yml")

Rpcs3config.CheckFile("Could not find RPCS3 config.yml! Run your emulator, go to Settings and save them.")


textGameFolder := moduleIni.Read("Settings", "GamesDirectory","",,1)

archivePPUFolder := moduleIni.Read("Settings", "PPUDirectory",".\cache",,1)

archiveDATAFolder := moduleIni.Read("Settings", "DATADirectory",".\data",,1)

archiveCACHESFolder := moduleIni.Read("Settings", "CACHESDirectory",".\data\caches",,1)

archivePPU := moduleIni.Read("Settings", "ArchivePPU","false",,1)

archiveDATA := moduleIni.Read("Settings", "ArchiveDATA","false",,1)

archiveCACHES := moduleIni.Read("Settings", "ArchiveCACHES","false",,1)

removePPU := moduleIni.Read("Settings", "RemovePPU","false",,1)

removeDATA := moduleIni.Read("Settings", "RemoveDATA","false",,1)

removeCACHES := moduleIni.Read("Settings", "RemoveCACHES","false",,1)


; Convert relative paths into full paths.

textGameFolder := RelativeToFull(textGameFolder, romPath)

archivePPUFolder := RelativeToFull(archivePPUFolder, romPath)

archiveDATAFolder := RelativeToFull(archiveDATAFolder, romPath)

archiveCACHESFolder := RelativeToFull(archiveCACHESFolder, romPath)


BezelStart()


hideEmuObj := Object(emuPrimaryWindow,1)

HideAppStart(hideEmuObj,hideEmu)


; Set variables

gameType := ""

gameSerial := ""

gameDirectoryJunction := "false"

gamePPU := "false"

gamePPUarchive := archivePPUFolder . "\" . romName . "_" . A_ComputerName . ".7z"

gamePPUromPath := archivePPUFolder

gamePPUromName := romName . "_" . A_ComputerName

gamePPUromExtension := ".7z"

gamePPUemuPath := emuPath . "\cache"

gameDATA := "false"

gameDATAarchive := archiveDATAFolder . "\" . romName . "_data.7z"

gameDATAromPath := archiveDATAFolder

gameDATAromName := romName . "_data"

gameDATAromExtension := "7z"

gameDATAemuPath := emuPath . "\dev_hdd0\game"

gameCACHES := "false"

gameCACHESarchive := archiveCACHESFolder . "\" . romName . "_hdd1.7z"

gameCACHESromPath := archiveCACHESFolder

gameCACHESromName := romName . "_hdd1"

gameCACHESromExtension := "7z"

gameCACHESemuPath := emuPath . "\dev_hdd1\caches"

textRomFolder := ""


If (romExtension = ".txt")

{

  FileReadLine, textRomFolder, %romPath%\%romName%%romExtension%, 1

  If (textGameFolder = "")

  {

    If (textRomFolder = "")

    {

      gameSerial := romName

      If (Fileexist(romPath . "\" . romName . "\PS3_GAME\USRDIR\EBOOT.BIN"))

      {

        gameType := "disc"

        romPath := romPath . "\" . romName . "\PS3_GAME\USRDIR"

      }

      Else If (Fileexist(romPath . "\" . romName . "\USRDIR\EBOOT.BIN"))

      {

        gameType := "game"

        romPath := romPath . "\" . romName . "\USRDIR"

      }

      Else

      {

        ScriptError("Unable to find EBOOT.BIN within the folder: """ . romPath . "\" . romName . "\""")

      }

    }

    Else

    {

      gameSerial := textRomFolder

      If (Fileexist(romPath . "\" . textRomFolder . "\PS3_GAME\USRDIR\EBOOT.BIN"))

      {

        gameType := "disc"

        romPath := romPath . "\" . textRomFolder . "\PS3_GAME\USRDIR"

      }

      Else If (Fileexist(romPath . "\" . textRomFolder . "\USRDIR\EBOOT.BIN"))

      {

        gameType := "game"

        romPath := romPath . "\" . textRomFolder . "\USRDIR"

      }

      Else

      {

        ScriptError("Unable to find EBOOT.BIN within the folder: """ . romPath . "\" . textRomFolder . "\""")

      }

    }

  }

  Else

  {

    If (textRomFolder = "")

    {

      gameSerial := romName

      If (Fileexist(textGameFolder . "\" . romName . "\PS3_GAME\USRDIR\EBOOT.BIN"))

      {

        gameType := "disc"

        romPath := textGameFolder . "\" . romName . "\PS3_GAME\USRDIR"

      }

      Else If (Fileexist(textGameFolder . "\" . romName . "\USRDIR\EBOOT.BIN"))

      {

        gameType := "game"

        romPath := textGameFolder . "\" . romName . "\USRDIR"

      }

      Else

      {

        ScriptError("Unable to find EBOOT.BIN within the folder: """ . textGameFolder . "\" . romName . "\""")

      }

    }

    Else

    {

      gameSerial := textRomFolder

      If (Fileexist(textGameFolder . "\" . textRomFolder . "\PS3_GAME\USRDIR\EBOOT.BIN"))

      {

        gameType := "disc"

        romPath := textGameFolder . "\" . textRomFolder . "\PS3_GAME\USRDIR"

      }

      Else If (Fileexist(textGameFolder . "\" . textRomFolder . "\USRDIR\EBOOT.BIN"))

      {

        gameType := "game"

        romPath := textGameFolder . "\" . textRomFolder . "\USRDIR"

      }

      Else

      {

        ScriptError("Unable to find EBOOT.BIN within the folder: """ . textGameFolder . "\" . textRomFolder . "\""")

      }

    }

  }

}

Else If (romExtension = ".lnk" && Fileexist(romPath . "\" . romName . romExtension))

{

  FileGetShortCut, %romPath%\%romName%%romExtension%, shortcutTarget

  StringReplace, romPath, shortcutTarget, \EBOOT.BIN

}

Else If (InStr(sevenZFormats, romExtension)) {

  gameSerial := RLObject.getZipRootFolder(romPath . "\" . romName . romExtension)

}


; Store old values for later

originalRomPath := romPath

originalRomName := romName

originalRomExtension := romExtension

originalSevenZRomPath := sevenZRomPath

originalGameName := gameInfo["Name"].Value


; Extract PPU files if they exist

If (archivePPU = "true" && Fileexist(gamePPUarchive))

{

  gameInfo["Name"].Value := "EXTRACTING COMPILED PPU FILES"

  romExPercentage := 0

  layer3Percentage := 0

  rootFolder := RLObject.getZipRootFolder(gamePPUarchive)

  romExSize := RLObject.getZipExtractedSize(gamePPUarchive)

  sevenZRomPath := gamePPUemuPath . "\" . rootFolder

  use7zAnimation := "true"

  Gdip_GraphicsClear(Fade_G5)

  Gosub, UpdateFadeFor7z

;  7z(gamePPUromPath, gamePPUromName, gamePPUromExtension, gamePPUemuPath)

  RunWait, %ComSpec% /c ""%sevenZPath%" x "%gamePPUarchive%" -aos -o"%gamePPUemuPath%", sevenZPID, Hide

  gamePPU := "true"

}


; Extract Game Data files if they exist

If (archiveDATA = "true" && Fileexist(gameDATAarchive))

{

  gameInfo["Name"].Value := "EXTRACTING ADDITIONAL GAME DATA"

  romExPercentage := 0

  layer3Percentage := 0

  rootFolder := RLObject.getZipRootFolder(gameDATAarchive)

  romExSize := RLObject.getZipExtractedSize(gameDATAarchive)

  sevenZRomPath := gameDATAemuPath . "\" . rootFolder

  use7zAnimation := "true"

  Gdip_GraphicsClear(Fade_G5)

  Gosub, UpdateFadeFor7z

;  7z(gameDATAromPath, gameDATAromName, gameDATAromExtension, gameDATAemuPath)

  RunWait, %ComSpec% /c ""%sevenZPath%" x "%gameDATAarchive%" -aos -o"%gameDATAemuPath%", sevenZPID, Hide

  gameDATA := "true"

}


; Extract Game Data files if they exist

If (archiveCACHES = "true" && Fileexist(gameCACHESarchive))

{

  gameInfo["Name"].Value := "EXTRACTING ADDITIONAL GAME CACHES"

  romExPercentage := 0

  layer3Percentage := 0

  rootFolder := RLObject.getZipRootFolder(gameCACHESarchive)

  romExSize := RLObject.getZipExtractedSize(gameCACHESarchive)

  sevenZRomPath := gameCACHESemuPath . "\" . rootFolder

  use7zAnimation := "true"

  Gdip_GraphicsClear(Fade_G5)

  Gosub, UpdateFadeFor7z

;  7z(gameCACHESromPath, gameCACHESromName, gameCACHESromExtension, gameCACHESemuPath)

  RunWait, %ComSpec% /c ""%sevenZPath%" x "%gameCACHESarchive%" -aos -o"%gameCACHESemuPath%", sevenZPID, Hide

  gameCACHES := "true"

}


If (gamePPU := "true" || gameDATA := "true" || gameCACHES := "true")

{

  sevenZRomPath := originalSevenZRomPath

  gameInfo["Name"].Value := originalGameName

  Gdip_GraphicsClear(Fade_G5)

}

romPath := originalRomPath

romName := originalRomName

romExtension := originalRomExtension

romExPercentage := 0

layer3Percentage := 0

romExSize := 1000000000

use7zAnimation := "true"

Gosub, UpdateFadeFor7z


7z(romPath, romName, romExtension, sevenZExtractPath)


IfInString, romPath, \USRDIR

{

  FoundPos := InStr(romPath, "\USRDIR") + 6

  StringLeft, romPath, romPath, %FoundPos%

}


romFolder := romPath


; Find the game location and determine the type of game (disc or hdd)

StringRight, stringTest, romFolder, 6

If (stringTest = "USRDIR")

{

  StringReplace, romFolder, romFolder, \USRDIR

  paramFile := romFolder . "\PARAM.SFO"

  FileRead, data, *c %paramFile%

  offset := StrLen(data)-24

  SetFormat, IntegerFast, hex

  offset += 0

  offset .= ""

  SetFormat, IntegerFast, d

  gameSerial := StrGet(&data + offset, "UTF-8")

  StringLeft, stringTest, gameSerial, 2

  If (stringTest = "NP")

  {

    gameType := "game"

  }

  Else

  {

    gameType := "disc"

  }

  

  ; Create the directory junction

  If (gameSerial != "" && gameType != "")

  {

    If (!Fileexist(emuPath . "\dev_hdd0\" . gameType . "\" . gameSerial))

    {

      StringReplace, romFolder, romFolder, \PS3_GAME

      RunWait, %ComSpec% /c "mklink /J "%emuPath%\dev_hdd0\%gameType%\%gameSerial%" "%romFolder%", , Hide

      RunWait, %ComSpec% /c "mklink /D "%emuPath%\dev_hdd0\%gameType%\%gameSerial%" "%romFolder%", , Hide

      gameDirectoryJunction := "true"

    }

  }

}

Else

{

  ScriptError("Rom was not found in the USRDIR directory. Please make sure ""bin"" is an RPCS3 extension and also verify the folder structure of your rom.")

}


;MsgBox, romPath: %romPath%`nromName: %romName%`nromExtension: %romExtension%`ngameType: %gameType%`ngameSerial: %gameSerial%`ngameDirectoryJunction: %gameDirectoryJunction%`ngamePPU: %gamePPU%`ngameDATA: %gameDATA%`nsevenZEnabled: %sevenZEnabled%


; Run the game

If (gameType = "game")

{

  primaryExe.Run(" """ . emuPath . "\dev_hdd0\" . gameType . "\" . gameSerial . "\USRDIR\EBOOT.BIN""")

}

Else If (Fileexist(emuPath . "\dev_hdd0\" . gameType . "\" . gameSerial . "\PS3_GAME\USRDIR\EBOOT.BIN"))

{

  primaryExe.Run(" """ . emuPath . "\dev_hdd0\" . gameType . "\" . gameSerial . "\PS3_GAME\USRDIR\EBOOT.BIN""")

}

Else If (Fileexist(romPath . "\PS3_GAME\USRDIR\EBOOT.BIN"))

{

  primaryExe.Run(" """ . romPath . "\PS3_GAME\USRDIR\EBOOT.BIN""")

}

Else If (Fileexist(romPath . "\EBOOT.BIN"))

{

  primaryExe.Run(" """ . romPath . "\EBOOT.BIN""")

}

Else If (Fileexist(romPath . "\" . romName . ".BIN"))

{

  primaryExe.Run(" """ . romPath . "\" . romName . ".BIN""")

}

Else If (Fileexist(romPath . "\" . romName . romExtension))

{

  primaryExe.Run(" """ . romPath . "\" . romName . romExtension . """")

}

Else

{

  

}


; Waiting for main emulator window

emuPrimaryWindow.Wait()

emuPrimaryWindow.Active()

emuPrimaryWindow.WaitActive()


; Waiting up to 5 seconds to see if compiling window appears

If (gameSerial != "" && gamePPU != "true")

{

  Loop, 5

  {

    WinHide, Compiling

    WinWait, Compiling, , 1

    If (!ErrorLevel)

    {

      gameInfo["Name"].Value := "COMPILING PPU FILES"

      use7zAnimation := "true"

      Gdip_GraphicsClear(Fade_G5)

      Gosub, UpdateFadeFor7z

      WinHide, Compiling

      WinWaitClose, Compiling

      gameInfo["Name"].Value := originalGameName

      use7zAnimation := "true"

      Gdip_GraphicsClear(Fade_G5)

      Gosub, UpdateFadeFor7z

      Break

    }

  }

}


BezelDraw()

HideAppEnd(hideEmuObj,hideEmu)

FadeInExit()

primaryExe.Process("WaitClose")


; Remove the PPU files if they were extracted or creates PPU archive file if needed

If ((archivePPU = "true" || removePPU = "true") && gameSerial != "")

{

  IfExist, %gamePPUemuPath%\%gameSerial%

  {

    If (archivePPU = "true")

    {

      IfNotExist, %gamePPUarchive%

      {

        FadeInStart()

        gameInfo["Name"].Value := "ARCHIVING COMPILED PPU FILES"

        romExPercentage := 0

        layer3Percentage := 0

        use7zAnimation := "true"

        Gdip_GraphicsClear(Fade_G5)

        Gosub, UpdateFadeFor7z

        RunWait, %ComSpec% /c ""%sevenZPath%" a "%gamePPUarchive%" "%gamePPUemuPath%\%gameSerial%", , Hide

        FadeInExit()

      }

      Else

      {

        MostRecentTime := 0

        Loop, %gamePPUemuPath%\%gameSerial%\*, 2

        {

          If (A_LoopFileTimeModified > MostRecentTime)

          {

            MostRecentTime := A_LoopFileTimeModified

          }

        }

        FileGetTime, gamePPUtime, %gamePPUarchive%, M

        If (MostRecentTime > gamePPUtime)

        {

          FadeInStart()

          gameInfo["Name"].Value := "ARCHIVING COMPILED PPU FILES"

          romExPercentage := 0

          layer3Percentage := 0

          use7zAnimation := "true"

          Gdip_GraphicsClear(Fade_G5)

          Gosub, UpdateFadeFor7z

          RunWait, %ComSpec% /c ""%sevenZPath%" a "%gamePPUarchive%" "%gamePPUemuPath%\%gameSerial%", , Hide

          FadeInExit()

        }

      }

    }

    If (removePPU = "true")

    {

      FileRemoveDir, %gamePPUemuPath%\%gameSerial%, 1

    }

  }

  Else

  {

    MostRecentTime := 0

    MostRecentFile := ""

    MostRecentName := ""

    Loop, %gamePPUemuPath%\*, 2

    {

      If (A_LoopFileTimeModified > MostRecentTime)

      {

        MostRecentTime := A_LoopFileTimeModified

        MostRecentFile := A_LoopFileLongPath

        MostRecentName := A_LoopFileName

      }

    }

    If (StrLen(MostRecentName) = 9)

    {

      If (archivePPU = "true")

      {

        IfNotExist, %gamePPUarchive%

        {

          FadeInStart()

          gameInfo["Name"].Value := "ARCHIVING COMPILED PPU FILES"

          romExPercentage := 0

          layer3Percentage := 0

          use7zAnimation := "true"

          Gdip_GraphicsClear(Fade_G5)

          Gosub, UpdateFadeFor7z

          RunWait, %ComSpec% /c ""%sevenZPath%" a "%gamePPUarchive%" "%MostRecentFile%", , Hide

          FadeInExit()

        }

        Else

        {

          MostRecentTime := 0

          Loop, %gamePPUemuPath%\%MostRecentName%\*, 2

          {

            If (A_LoopFileTimeModified > MostRecentTime)

            {

              MostRecentTime := A_LoopFileTimeModified

            }

          }

          FileGetTime, gamePPUtime, %gamePPUarchive%, M

          If (MostRecentTime > gamePPUtime)

          {

            FadeInStart()

            gameInfo["Name"].Value := "ARCHIVING COMPILED PPU FILES"

            romExPercentage := 0

            layer3Percentage := 0

            use7zAnimation := "true"

            Gdip_GraphicsClear(Fade_G5)

            Gosub, UpdateFadeFor7z

            RunWait, %ComSpec% /c ""%sevenZPath%" a "%gamePPUarchive%" "%MostRecentFile%", , Hide

            FadeInExit()

          }

        }

      }

      If (removePPU = "true")

      {

        FileRemoveDir, %MostRecentFile%, 1

      }

    }

  }

}


; Remove the Game Data files if they were extracted or creates Game Data archive file if needed

If ((archiveDATA = "true" || removeDATA = "true") && gameSerial != "" && gameType = "disc")

{

  archiveFileArray := []

  archiveFileCount := 0

  Loop, %gameDATAemuPath%\*, 2

  {

    IfInString, A_LoopFileName, %gameSerial%

    {

      archiveFileCount := archiveFileCount + 1

      archiveFileArray[archiveFileCount] := A_LoopFileLongPath

    }

  }

  MostRecentTime := 0

  MostRecentFile := ""

  MostRecentName := ""

  Loop, %gameDATAemuPath%\*, 2

  {

    If (A_LoopFileTimeModified > MostRecentTime)

    {

      MostRecentTime := A_LoopFileTimeModified

      MostRecentFile := A_LoopFileLongPath

      MostRecentName := A_LoopFileName

    }

  }

  fileOne := MostRecentFile . "\ICON0.PNG"

  fileTwo := emuPath . "\dev_hdd0\" . gameType . "\" . gameSerial . "\PS3_GAME\ICON0.PNG"

  FileGetSize, dataSizeOne, %fileOne%

  FileGetSize, dataSizeTwo, %fileTwo%

  FileGetVersion, dataVersionOne, %fileOne%

  FileGetVersion, dataVersionTwo, %fileTwo%

  StringLeft, testRecentFour, MostRecentName, 4

  StringLeft, testSerialFour, gameSerial, 4

  If (dataSizeOne = dataSizeTwo && dataVersionOne = dataVersionTwo && MostRecentName != ".locks" && MostRecentName != "TEST12345" && testRecentFour = testSerialFour)

  {

    If !HasVal(archiveFileArray, MostRecentFile)

    {

      archiveFileCount := archiveFileCount + 1

      archiveFileArray[archiveFileCount] := MostRecentFile

    }

  }

  If (archiveFileCount > 0)

  {

    archiveFileString := ""

    Loop % archiveFileCount

    {

      If (archiveFileString != "")

      {

        archiveFileString := archiveFileString . " "

      }

      archiveFileString := archiveFileString . """" . archiveFileArray[A_Index] . """"

    }

    If (archiveDATA = "true")

    {

      IfNotExist, %gameDATAarchive%

      {

        FadeInStart()

        gameInfo["Name"].Value := "ARCHIVING ADDITIONAL GAME DATA"

        romExPercentage := 0

        layer3Percentage := 0

        use7zAnimation := "true"

        Gdip_GraphicsClear(Fade_G5)

        Gosub, UpdateFadeFor7z

        RunWait, %ComSpec% /c ""%sevenZPath%" a -mx=0 "%gameDATAarchive%" %archiveFileString%, , Hide

        FadeInExit()

      }

      Else

      {

        Loop % archiveFileCount

        {

          archiveElement := archiveFileArray[A_Index]

          MostRecentTime := 0

          Loop, %archiveElement%\*, 2

          {

            If (A_LoopFileTimeModified > MostRecentTime)

            {

              MostRecentTime := A_LoopFileTimeModified

            }

          }

          FileGetTime, gameDATAtime, %gameDATAarchive%, M

          FileGetTime, gameDATAarchiveTime, %archiveElement%, M

          If (MostRecentTime > gameDATAtime || gameDATAarchiveTime > gameDATAtime)

          {

            FadeInStart()

            gameInfo["Name"].Value := "ARCHIVING ADDITIONAL GAME DATA"

            romExPercentage := 0

            layer3Percentage := 0

            use7zAnimation := "true"

            Gdip_GraphicsClear(Fade_G5)

            Gosub, UpdateFadeFor7z

            RunWait, %ComSpec% /c ""%sevenZPath%" a -mx=0 "%gameDATAarchive%" %archiveFileString%, , Hide

            FadeInExit()

            Break

          }

        }

      }

    }

    If (removeDATA = "true")

    {

      Loop % archiveFileCount

      {

        archiveElement := archiveFileArray[A_Index]

        FileRemoveDir, %archiveElement%, 1

      }

    }

  }

}


; Remove the Game Caches if they were extracted or creates Game Caches archive file if needed

If ((archiveCACHES = "true" || removeCACHES = "true") && gameSerial != "")

{

  archiveFileArray := []

  archiveFileCount := 0

  Loop, %gameCACHESemuPath%\*, 2

  {

    IfInString, A_LoopFileName, %gameSerial%

    {

      archiveFileCount := archiveFileCount + 1

      archiveFileArray[archiveFileCount] := A_LoopFileLongPath

    }

  }

  MostRecentTime := 0

  MostRecentFile := ""

  MostRecentName := ""

  Loop, %gameCACHESemuPath%\*, 2

  {

    If (A_LoopFileTimeModified > MostRecentTime)

    {

      MostRecentTime := A_LoopFileTimeModified

      MostRecentFile := A_LoopFileLongPath

      MostRecentName := A_LoopFileName

    }

  }

  StringLeft, testRecentFour, MostRecentName, 4

  StringLeft, testSerialFour, gameSerial, 4

  If (MostRecentName != ".locks" && MostRecentName != "TEST12345" && testRecentFour = testSerialFour)

  {

    If !HasVal(archiveFileArray, MostRecentFile)

    {

      archiveFileCount := archiveFileCount + 1

      archiveFileArray[archiveFileCount] := MostRecentFile

    }

  }

  If (archiveFileCount > 0)

  {

    archiveFileString := ""

    Loop % archiveFileCount

    {

      If (archiveFileString != "")

      {

        archiveFileString := archiveFileString . " "

      }

      archiveFileString := archiveFileString . """" . archiveFileArray[A_Index] . """"

    }

    If (archiveCACHES = "true")

    {

      IfNotExist, %gameCACHESarchive%

      {

        FadeInStart()

        gameInfo["Name"].Value := "ARCHIVING ADDITIONAL GAME CACHES"

        romExPercentage := 0

        layer3Percentage := 0

        use7zAnimation := "true"

        Gdip_GraphicsClear(Fade_G5)

        Gosub, UpdateFadeFor7z

        RunWait, %ComSpec% /c ""%sevenZPath%" a -mx=0 "%gameCACHESarchive%" %archiveFileString%, , Hide

        FadeInExit()

      }

      Else

      {

        Loop % archiveFileCount

        {

          archiveElement := archiveFileArray[A_Index]

          MostRecentTime := 0

          Loop, %archiveElement%\*, 2

          {

            If (A_LoopFileTimeModified > MostRecentTime)

            {

              MostRecentTime := A_LoopFileTimeModified

            }

          }

          FileGetTime, gameCACHEStime, %gameCACHESarchive%, M

          FileGetTime, gameCACHESarchiveTime, %archiveElement%, M

          If (MostRecentTime > gameCACHEStime || gameCACHESarchiveTime > gameCACHEStime)

          {

            FadeInStart()

            gameInfo["Name"].Value := "ARCHIVING ADDITIONAL GAME CACHES"

            romExPercentage := 0

            layer3Percentage := 0

            use7zAnimation := "true"

            Gdip_GraphicsClear(Fade_G5)

            Gosub, UpdateFadeFor7z

            RunWait, %ComSpec% /c ""%sevenZPath%" a -mx=0 "%gameCACHESarchive%" %archiveFileString%, , Hide

            Break

          }

        }

      }

    }

    If (removeCACHES = "true")

    {

      Loop % archiveFileCount

      {

        archiveElement := archiveFileArray[A_Index]

        FileRemoveDir, %archiveElement%, 1

      }

    }

  }

}

FadeInExit()

; Remove the directory junction

If (gameDirectoryJunction = "true")

{

  RunWait, %ComSpec% /c "rmdir "%emuPath%\dev_hdd0\%gameType%\%gameSerial%", , Hide

}


7zCleanUp()

BezelExit()

FadeOutExit()

ExitModule()


BezelLabel:

  disableHideBorder := "true"

  disableHideTitleBar := "true"

  disableHideToggleMenu := "true"

Return


HasVal(haystack, needle) {

  for index, value in haystack

    if (value = needle)

      return index

  if !(IsObject(haystack))

    throw Exception("Bad haystack!", -1, haystack)

  return 0

}


RelativeToFull(relativePath, relativeOf) {

  StringLeft, stringTest, relativePath, 2

  If (stringTest = ".\")

  {

    StringTrimLeft, relativePath, relativePath, 1

    relativePath := relativeOf . relativePath

  }

  Else If (stringTest = "..")

  {

    StringSplit, relativePaths, relativePath, "\"

    relativePathsCount := 0

    tempPath := ""

    Loop, %relativePaths0%

    {

      element := relativePaths%A_Index%

      If (element = "..")

      {

        relativePathsCount := relativePathsCount + 1

      }

      Else

      {

        tempPath := tempPath . element

        If (A_Index != relativePaths0)

        {

          tempPath := tempPath . "\"

        }

      }

    }

    relativePath := tempPath

    StringSplit, relativeOfFolders, relativeOf, "\"

    romGameFoldersCount := relativeOfFolders0 - relativePathsCount

    If (romGameFoldersCount > 0)

    {

      tempPath := ""

      Loop, %romGameFoldersCount%

      {

        element := relativeOfFolders%A_Index%

        tempPath := tempPath . element . "\"

      }

      relativePath := tempPath . relativePath

    }

  }

  return relativePath

}


CloseProcess:

Process, Close, %executable%

FadeOutStart()

Return

<?xml version="1.0" encoding="UTF-8"?>

<INISCHEMA>

<INIFILES>

<INIFILE name="%ModuleName%" required="false">

<INITYPE>Module</INITYPE>

<SECTIONS>

<SECTION name="Settings" required="false">

<SECTIONTYPE>Global</SECTIONTYPE>

<KEYS>

<KEY name="Fullscreen" required="false" nullable="false">

<KEYTYPE>Boolean</KEYTYPE>

<DESCRIPTION>If true emulator will run fullscreen.</DESCRIPTION>

</KEY>

</KEYS>

</SECTION>

</SECTIONS>

</INIFILE>

</INIFILES>

</INISCHEMA>

[Settings]

Fullscreen=true