Imports System.IO Imports System.Text Imports System.IO.Compression Partial Class Form1 Private Sub ImportCode_Click(sender As Object, e As EventArgs) Handles ImportCode.Click If Not UserRadio.Checked And Not CDExtraBtn.Checked Then MsgBox("YOU CAN IMPORT ONLY IN USER OR CDEXTRA ISO!!!") : Exit Sub Dim cd = New ISOTools 'OpensFile OpenFileDialog1.Multiselect = True If OpenFileDialog1.ShowDialog <> DialogResult.OK Then Exit Sub OpenFileDialog1.Multiselect = False For Each filee In OpenFileDialog1.FileNames Dim fileInfo = Path.GetFileName(filee) Dim f = File.ReadAllBytes(filee) If fileInfo.Contains("SLPS_028.25") And UserRadio.Checked Then cd.saveCDfile(UserPath.Text, 27, UBound(f) + 1, f) End If If fileInfo.Contains("SLPS_028.26") And CDExtraBtn.Checked Then cd.saveCDfile(CDEXTRApath.Text, 28, UBound(f) + 1, f) End If Next MsgBox(String.Format("Imported {0} files ", UBound(OpenFileDialog1.FileNames) + 1), MsgBoxStyle.Exclamation) End Sub Private Sub ExpMainExe_Click(sender As Object, e As EventArgs) Handles ExpMainExe.Click Dim iso = New ISOTools Dim targetSector = 27 If CDExtraBtn.Checked Then targetSector = 28 Dim fil = iso.getCDfile(getFilnam, targetSector, 1812408) Dim fn = "" If CDExtraBtn.Checked Then fn = "SLPS_028.26" Else fn = "SLPS_028.25" End If SaveFileDialog1.FileName = WorkDir.Text & fn If SaveFileDialog1.ShowDialog <> DialogResult.OK Then Exit Sub My.Computer.FileSystem.WriteAllBytes(SaveFileDialog1.FileName, fil.ToArray, False) End Sub Private Sub Export181RUS_Click(sender As Object, e As EventArgs) Handles Export181RUS.Click Dim files As New List(Of String) files = IO.Directory.GetFiles("D:\Games\PSX\Persona 2 - Batsu (NTSC-J) [SLPS-02825]\Export\UnRLE\0057_ALL_SCENERY\", "*.TRNSL").ToList Dim OutPut_Dir = "D:\Games\PSX\Persona 2 - Batsu (NTSC-J) [SLPS-02825]\Export\UnRLE\0057_ALL_SCENERY\TRANSLATED_RAW\" Dim iso = New ISOTools Dim filnam = getFilnam() Dim r = New rleTools For a = 57 To 397 Dim fil = iso.getCDfile(filnam, files1(a).Sector, files1(a).Sizw) If a = 397 Then fil = iso.getCDfile(filnam, files1(390).Sector, files1(390).Sizw) 'заменяем последний файл... My.Computer.FileSystem.WriteAllBytes(OutPut_Dir & a.ToString("D4") & "_orig.bin", fil.ToArray, False) : Continue For End If Dim ind = files.FindIndex(Function(x) x.Contains(a.ToString("D4"))) 'If file withoout translation If ind = -1 Then My.Computer.FileSystem.WriteAllBytes(OutPut_Dir & a.ToString("D4") & "_orig.bin", fil.ToArray, False) : Continue For End If Debug.WriteLine("Working On......" & a.ToString("D4")) DeconstructFile(fil.ToArray) 'here is separated binfile Dim curfile As rleFile = binFile.Last Dim RusFile = My.Computer.FileSystem.ReadAllBytes(files(ind)) binFile.Last.Bytes = r.decodeRLEnew(RusFile, curfile).ToArray 'Pack and replace 8th file 'АРХИВИРУЕМ МАССИВ ФАЙЛОВ ДЛЯ ЗАПИСИ В ОДИН ФАЙЛ Dim lastSectorID As Integer = 0 Dim finalPack = New List(Of Byte) For Each bin In binFile 'filling sector to end (making sectorgap) in the middle of the file If bin.SectorID <> lastSectorID Then Dim gap = 2048 - (finalPack.Count Mod 2048) For g = 0 To gap - 1 finalPack.Add(0) Next End If 'Adding currentfile Sector Size (for at least 0004) bin.SectorSize = bin.Bytes.Count \ 2048 If bin.Bytes.Count Mod 2048 > 0 Then bin.SectorSize += 1 'adding currentfile and address for 0x0090 finalPack.AddRange(bin.Bytes) 'AddingBytesAfter For g = 0 To bin.BytesAfter - 1 finalPack.Add(0) Next lastSectorID = bin.SectorID Next 'Fill file to END of Sector If finalPack.Count Mod 2048 > 0 Then For g = 1 To (2048 - (finalPack.Count Mod 2048)) finalPack.Add(0) Next g End If My.Computer.FileSystem.WriteAllBytes(OutPut_Dir & a.ToString("D4") & "_rus.bin", finalPack.ToArray, False) Next MsgBox("Export Done") End Sub Private Sub SceneryImport_Click(sender As Object, e As EventArgs) Handles SceneryImport.Click If Not UserRadio.Checked Then MsgBox("YOU CAN IMPORT ONLY IN USER ISO!!!") : Exit Sub If IsNothing(files1) Then MsgBox("PLEASE READ CD FILES FIRST!") : Exit Sub Dim files = IO.Directory.GetFiles("D:\Games\PSX\Persona 2 - Batsu (NTSC-J) [SLPS-02825]\Export\UnRLE\0057_ALL_SCENERY\TRANSLATED_RAW\", "*.bin").ToList Dim filesSize = 0 'For Each f In files ' filesSize += My.Computer.FileSystem.GetFileInfo(f).Length 'Next Dim curSector = files1(57).Sector Dim max = files1(398).Sector 'MsgBox($"Sectors have - {max - curSector}" & vbCrLf & $"Sectors in files - {filesSize / 2048}") : Exit Sub Dim iso = New ISOTools Dim filnam = getFilnam() For a = 57 To 397 'reading files Debug.WriteLine("Working On......" & a.ToString("D4")) Dim ind = files.FindIndex(Function(x) x.Contains(a.ToString("D4"))) If ind = -1 Then Debug.WriteLine("NOT FOUND") : Continue For Dim impFile = My.Computer.FileSystem.ReadAllBytes(files(ind)) Dim SectorSizw As Integer = (UBound(impFile) + 1) / 2048 'Overload check If curSector + SectorSizw >= max Then MsgBox("!!!OVERLOAD at file " & a) : Exit For 'debugfile move to end of disk ' If a = 570 Then curSector = 278100 iso.saveCDfile(filnam, curSector, UBound(impFile) + 1, impFile) 'Update SectorNumber and FileSize In FileArray files1(a).Sizw = UBound(impFile) + 1 files1(a).Sector = curSector curSector += SectorSizw Next 'Update FileTable In ISO iso.UpdateFileListTable(filnam, files1) MsgBox("Files Imported") End Sub Private Sub Export1112RUS_Click(sender As Object, e As EventArgs) Handles Export1112RUS.Click Dim files As New List(Of String) files = IO.Directory.GetFiles("D:\Games\PSX\Persona.2.Innocent.Sin\Export\UnRLE\1112_ALL_CITIES_SCRIPTS", "*.TRNSL").ToList Dim OutPut_Dir = "D:\Games\PSX\Persona.2.Innocent.Sin\Export\UnRLE\1112_ALL_CITIES_SCRIPTS\TRANSLATED_RAW\" Dim iso = New ISOTools Dim filnam = getFilnam() Dim r = New rleTools For a = 1112 To 1117 Dim fil = iso.getCDfile(filnam, files1(a).Sector, files1(a).Sizw) Dim ind = files.FindIndex(Function(x) x.Contains(a.ToString("D4"))) 'If file withoout translation If ind = -1 Then My.Computer.FileSystem.WriteAllBytes(OutPut_Dir & a.ToString("D4") & "_orig.bin", fil.ToArray, False) : Continue For End If Debug.WriteLine("Working On......" & a.ToString("D4")) DeconstructFile(fil.ToArray) 'here is separated binfile Dim curfile As rleFile = binFile(binFile.Count - 1) Dim RusFile = My.Computer.FileSystem.ReadAllBytes(files(ind)) binFile(binFile.Count - 1).Bytes = r.decodeRLEnew(RusFile, curfile).ToArray 'Pack and replace 8th file 'АРХИВИРУЕМ МАССИВ ФАЙЛОВ ДЛЯ ЗАПИСИ В ОДИН ФАЙЛ Dim lastSectorID As Integer = 0 Dim finalPack = New List(Of Byte) Dim addresses = New List(Of Integer) 'Start Addr for all files For Each bin In binFile 'filling sector to end (making sectorgap) in the middle of the file If bin.SectorID <> lastSectorID Then Dim gap = 2048 - (finalPack.Count Mod 2048) For g = 0 To gap - 1 finalPack.Add(0) Next End If 'Adding currentfile Sector Size (for at least 0004) bin.SectorSize = bin.Bytes.Count \ 2048 If bin.Bytes.Count Mod 2048 > 0 Then bin.SectorSize += 1 'adding currentfile and address for 0x0090 addresses.Add(finalPack.Count) finalPack.AddRange(bin.Bytes) 'AddingBytesAfter For g = 0 To bin.BytesAfter - 1 finalPack.Add(0) Next lastSectorID = bin.SectorID Next 'Fill file to END of Sector If finalPack.Count Mod 2048 > 0 Then For g = 1 To (2048 - (finalPack.Count Mod 2048)) finalPack.Add(0) Next g End If 'SAVING POINTERS TABLE SavePointersTableToFile(addresses, OutPut_Dir & a.ToString("D4") & ".pointers", binFile) My.Computer.FileSystem.WriteAllBytes(OutPut_Dir & a.ToString("D4") & "_rus.bin", finalPack.ToArray, False) Next MsgBox("Export Done") End Sub Private Sub ConvertEventsForEditing_Click(sender As Object, e As EventArgs) Handles ConvertEventsForEditing.Click Dim srcDir = "D:\Games\PSX\Persona 2 - Batsu (NTSC-J) [SLPS-02825]\Export\UnRLE\0057_ALL_SCENERY" Dim destDir = "D:\Games\PSX\Persona 2 - Batsu (NTSC-J) [SLPS-02825]\Export\P2EP_Editing\" Dim files As New List(Of String) files = IO.Directory.GetFiles(srcDir, "*.txt").ToList Dim s = New ScriptTools For Each f In files Dim a = Path.GetFileName(f) s.ConvertForEdit(f, destDir & Path.GetFileName(f)) Next MsgBox("Done!") End Sub Private Sub MakePointers_Click(sender As Object, e As EventArgs) Handles MakePointers.Click If binFile.Count = 0 Or CDFileList.SelectedIndex = -1 Then Exit Sub Dim fil = MakePointersArray() If CreateBinDirCheck.Checked And CDFileList.SelectedIndex > -1 Then Dim cat = WorkDir.Text & Strings.Left(FilnamLabel.Text, 4) & "_" & files1(CDFileList.SelectedIndex).Descript If Not Directory.Exists(cat) Then Directory.CreateDirectory(cat) End If ExportBinPath.Text = cat & "\" End If Dim filename = ExportBinPath.Text & Strings.Left(FilnamLabel.Text, 4) If japRadio.Checked Then filename &= "_J" If EngRadio.Checked Then filename &= "_E" If UserRadio.Checked Then filename &= "_U" 'SAVING POINTERS TABLE My.Computer.FileSystem.WriteAllBytes(filename & ".pointers", fil.ToArray, False) 'SavePointersTableToFile(addresses, filename & ".pointers", binFile) 'My.Computer.FileSystem.WriteAllBytes(filename & ".TEMPPACK", finalPack.ToArray, False) Savedlbl.Text = "SAVED TO " & filename End Sub Private Sub SearchPointers_Click(sender As Object, e As EventArgs) Handles SearchPointers.Click If CDFileList.Items.Count = 0 Or CDFileList.SelectedIndex = -1 Then Exit Sub If Not IsNumeric(CompareBTS.Text) Then Exit Sub Dim xxx = Convert.ToInt16(CompareBTS.Text) Dim fil As List(Of Byte) = MakePointersArray() Dim finfil = New List(Of Byte) For a = 0 To xxx If a > fil.Count - 1 Then Exit For finfil.Add(fil(a)) Next Dim cd = New ISOTools Dim exeFile = cd.getCDfile(getFilnam, 27, 1812408) 'search in exe Dim res = ByteSearch(exeFile.ToArray, finfil.ToArray) If res > -1 Then MsgBox("FOUND! IN SLPS!" & vbCrLf & "Offset: " & res) : Exit Sub 'all files to video For a = 0 To 864 Dim curFile = cd.getCDfile(getFilnam, files1(a).Sector, files1(a).Sizw) 'If curFile(0) = 1 Or curFile(0) = 2 Then Continue For 'IF ARCHIVE 'If curFile(1) = 1 Or curFile(1) = 2 Then Continue For Debug.WriteLine("Searching... " & a) res = ByteSearch(curFile.ToArray, finfil.ToArray) If res > -1 Then MsgBox("FOUND! IN file #" & a & vbCrLf & "Offset: " & res) : Exit For Next End Sub Public Function MakePointersArray() 'АРХИВИРУЕМ МАССИВ ФАЙЛОВ ДЛЯ ЗАПИСИ В ОДИН ФАЙЛ Dim lastSectorID As Integer = 0 Dim finalPack = New List(Of Byte) Dim addresses = New List(Of Integer) 'Start Addr for all files For Each bin In binFile 'filling sector to end (making sectorgap) in the middle of the file If bin.SectorID <> lastSectorID Then Dim gap = 2048 - (finalPack.Count Mod 2048) For g = 0 To gap - 1 finalPack.Add(0) Next End If 'Adding currentfile Sector Size (for at least 0004) bin.SectorSize = bin.Bytes.Count \ 2048 If bin.Bytes.Count Mod 2048 > 0 Then bin.SectorSize += 1 addresses.Add(finalPack.Count) finalPack.AddRange(bin.Bytes) 'AddingBytesAfter For g = 0 To bin.BytesAfter - 1 finalPack.Add(0) Next lastSectorID = bin.SectorID Next 'Fill file to END of Sector If finalPack.Count Mod 2048 > 0 Then For g = 1 To (2048 - (finalPack.Count Mod 2048)) finalPack.Add(0) Next g End If 'Making POINTERS TABLE Dim fil = New List(Of Byte) For a = 0 To binFile.Count - 1 'Dim curAddr = a * 8 + offset Dim cursect As Int16 = addresses(a) \ 2048 Dim modSect As Int16 = addresses(a) Mod 2048 fil.Add(BitConverter.GetBytes(modSect)(0)) fil.Add(BitConverter.GetBytes(modSect)(1)) 'BE or LE??? fil.Add(BitConverter.GetBytes(cursect)(0)) fil.Add(BitConverter.GetBytes(cursect)(1)) 'BE or LE??? Dim bts As Integer = binFile(a).Bytes.Count If Tim8Shift.Checked And binFile(a).Compr = 0 Then bts -= 8 'Its Uncompressed TIM?? fil.Add(BitConverter.GetBytes(bts)(0)) 'Saving Size of file fil.Add(BitConverter.GetBytes(bts)(1)) 'BE or LE??? fil.Add(BitConverter.GetBytes(bts)(2)) fil.Add(BitConverter.GetBytes(bts)(3)) Next Return fil End Function Private Sub RelpaceTextExecs_Click(sender As Object, e As EventArgs) Handles RelpaceTextExecs.Click If CDFileList.Items.Count = 0 Or CDFileList.SelectedIndex = -1 Then Exit Sub Dim sb = New List(Of Byte) From {&HEA, &H68, 0, &HC} Dim cd = New ISOTools Dim curFile = cd.getCDfile(getFilnam, files1(CDFileList.SelectedIndex).Sector, files1(CDFileList.SelectedIndex).Sizw) Dim replaceCount As Integer = 0 For a = 0 To curFile.Count - 1 Step 4 If curFile(a) = sb(0) And curFile(a + 1) = sb(1) And curFile(a + 2) = sb(2) And curFile(a + 3) = sb(3) Then replaceCount += 1 curFile(a) = 0 : curFile(a + 1) = &H40 : curFile(a + 2) = &H2 : curFile(a + 3) = &HC End If Next cd.saveCDfile(getFilnam, files1(CDFileList.SelectedIndex).Sector, files1(CDFileList.SelectedIndex).Sizw, curFile.ToArray) MsgBox("Found and replaced " & replaceCount & " text calls.") End Sub Private Sub ExportDUNGScripts_Click(sender As Object, e As EventArgs) Handles ExportDUNGScripts.Click Dim lengths = New List(Of Integer) lengths.AddRange({232, 228, 328, 336, 328, 336, 328, 336, 316, 332}) Dim DungScr = New List(Of PointerAndSize) Dim initaddr = 114232 For Each l In lengths DungScr.Add(New PointerAndSize With {.Addr = initaddr, .Sizw = l}) initaddr += l Next DungScr.Add(New PointerAndSize With {.Addr = 119336, .Sizw = 240}) DungScr.Add(New PointerAndSize With {.Addr = 119576, .Sizw = 240}) Dim cd = New ISOTools Dim txt = New ScriptTools 'Reading filetable and make array files1 = cd.makeFileList(UserPath.Text) 'files2 = cd.makeFileList(EngISOPath.Text) Dim CurFile() As Byte = cd.getCDfile(UserPath.Text, files1(736).Sector, files1(736).Sizw).ToArray 'Dim EngFile() As Byte = cd.getCDfile(EngISOPath.Text, files2(736).Sector, files2(736).Sizw).ToArray 'loading files Dim JRes = New ScriptFile Dim ERes = New ScriptFile For Each scr In DungScr Dim JapBytes(scr.Sizw - 1) As Byte : Dim EngBytes(scr.Sizw - 1) As Byte Array.Copy(CurFile, scr.Addr, JapBytes, 0, scr.Sizw) 'Array.Copy(EngFile, scr.Addr, EngBytes, 0, scr.Sizw) 'Copying Arrays txt.ParseResource(JapBytes, JRes) : txt.ParseText(JRes, False) 'txt.ParseResource(EngBytes, ERes) : txt.ParseText(ERes, True) Dim combText = txt.CombineParsedText(ERes, JRes) Dim combResData = txt.compileData(JRes) Dim fil = "D:\Games\PSX\Persona 2 - Batsu (NTSC-J) [SLPS-02825]\Export\0736_DUNG_SCRIPTS\" & DungScr.IndexOf(scr).ToString("D4") & ".txt" My.Computer.FileSystem.WriteAllText(fil, combResData & combText, False) Next End Sub Private Sub ConvertContact_Click(sender As Object, e As EventArgs) Handles ExportContact.Click Dim Japfiles = IO.Directory.GetFiles("D:\Games\PSX\Persona.2.Innocent.Sin\Export\1075_Battle_Contacts", "*_J").ToList Dim Engfiles = IO.Directory.GetFiles("D:\Games\PSX\Persona.2.Innocent.Sin\Export\1075_Battle_Contacts", "*_E*").ToList Dim OutPut_Dir = "D:\Games\PSX\Persona.2.Innocent.Sin\Export\1075_Battle_Contacts\Processing\Back\" Dim scr = New ScriptTools Dim cnt = 0 For Each fil In Japfiles Dim contact As String = scr.MakeExportFile(My.Computer.FileSystem.ReadAllBytes(fil), My.Computer.FileSystem.ReadAllBytes(Engfiles(Japfiles.IndexOf(fil))), cnt) Dim filename = OutPut_Dir & Path.GetFileName(fil) & "_exp.txt" My.Computer.FileSystem.WriteAllText(filename, contact, False, Encoding.GetEncoding(1251)) Next MsgBox("Converted " & cnt & " dialogs!", MsgBoxStyle.Information) End Sub Private Sub Summon_Export_Click(sender As Object, e As EventArgs) Handles Summon_Export.Click Dim Japfiles = IO.Directory.GetFiles("D:\Games\PSX\Persona.2.Innocent.Sin\Export\0077_Summon_Text", "*_U").ToList Dim Engfiles = IO.Directory.GetFiles("D:\Games\PSX\Persona.2.Innocent.Sin\Export\0077_Summon_Text", "*_E*").ToList Dim OutPut_Dir = "D:\Games\PSX\Persona.2.Innocent.Sin\Export\0077_Summon_Text\Processing\Back\" Dim scr = New ScriptTools Dim cnt = 0 For Each fil In Japfiles Dim contact As String = scr.MakeSummonExport(My.Computer.FileSystem.ReadAllBytes(fil), My.Computer.FileSystem.ReadAllBytes(Engfiles(Japfiles.IndexOf(fil))), cnt) Dim filename = OutPut_Dir & Path.GetFileName(fil) & "_exp.txt" My.Computer.FileSystem.WriteAllText(filename, contact, False, Encoding.GetEncoding(1251)) Next MsgBox("Converted " & cnt & " dialogs!", MsgBoxStyle.Information) End Sub Private Sub Convert_Summon_Click(sender As Object, e As EventArgs) Handles Convert_Summon.Click Dim Japfiles = IO.Directory.GetFiles("D:\Games\PSX\Persona.2.Innocent.Sin\Export\0077_Summon_Text\Processing\", "*.txt").ToList DialogCounter = 0 Dim txt = New ScriptTools For Each JFile In Japfiles Debug.WriteLine("Converting " & JFile) txt.convertSummonScript(JFile, DialogCounter) Next MsgBox("Success! Converted " & UBound(OpenFileDialog1.FileNames) + 1 & " file(s)" & vbCrLf & "Overall Dialogs Count: " & DialogCounter) End Sub Private Sub PSP_UNPACK_EVENT_BIN_Click(sender As Object, e As EventArgs) Handles PSP_UNPACK_EVENT_BIN.Click Dim zips = New List(Of Byte()) Dim fil = My.Computer.FileSystem.ReadAllBytes("D:\Games\PSX\Persona 2 - Innocent Sin USA\PSP_GAME\USRDIR\pack\unpack\event.bin") Dim filenames = New List(Of String) For a = 0 To 396 Dim a1 = BitConverter.ToInt32(fil, a * 8) Dim a2 = BitConverter.ToInt32(fil, a * 8 + 4) Dim zzz(a2 - a1) As Byte Array.Copy(fil, a1, zzz, 0, a2 - a1) Dim fn = "" For bbb = 0 To 8 fn &= Chr(zzz(bbb + 10)) Next filenames.Add(fn) Dim Decomp = DecompressGZip(zzz) zips.Add(Decomp) 'My.Computer.FileSystem.WriteAllBytes("D:\Games\PSX\Persona 2 - Innocent Sin USA\PSP_GAME\USRDIR\pack\unpack\Event\" & a.ToString("D4") & "_" & (a + 181).ToString("D3") & "_" & fn, Decomp, False) Next Dim scr = New ScriptTools For Each zip In zips Dim filePack = New List(Of Byte()) Dim startRead As Integer = 48 For a = 0 To 8 Dim a1 = BitConverter.ToInt32(zip, a * 4 + 4) Dim curFil(a1 - 1) As Byte Array.Copy(zip, startRead, curFil, 0, a1) startRead += a1 Dim BA = startRead Mod 16 If BA > 0 Then startRead += 16 - BA filePack.Add(curFil) Next Dim b = zips.IndexOf(zip) Dim fn = "D:\Games\PSX\Persona 2 - Innocent Sin USA\PSP_GAME\USRDIR\pack\unpack\Event\" & b.ToString("D4") & "_" & (b + 181).ToString("D3") & "_" & filenames(b) 'SAVING 8th LAST FILE!!! Dim txt = scr.ConvertPSPTextFile(filePack.Last) ' My.Computer.FileSystem.WriteAllBytes(fn & ".txt", filePack.Last, False) My.Computer.FileSystem.WriteAllText(fn & ".txt", txt, False, Encoding.GetEncoding(1251)) Next 'For Each z In MsgBox("EXPORTED") End Sub Public Function DecompressGZip(bytesToDecompress As Byte()) As Byte() Using stream As New GZipStream(New MemoryStream(bytesToDecompress), CompressionMode.Decompress) Const size As Integer = 4096 Dim buffer As Byte() = New Byte(size - 1) {} Using memoryStream As New MemoryStream() Dim count As Integer Do count = stream.Read(buffer, 0, size) If count > 0 Then memoryStream.Write(buffer, 0, count) End If Loop While count > 0 Return memoryStream.ToArray() End Using End Using End Function End Class Public Class PointerAndSize Public Addr As Integer Public Sizw As Integer End Class