Files
P2EP_Toolkit/p2isPSX_CDToolkit/CityEditor.vb
2025-12-29 19:03:54 +05:00

242 lines
8.7 KiB
VB.net

Imports System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox
Public Class CityEditor
Public files1 As List(Of fileInfo)
Public files2 As List(Of fileInfo)
Public CurFile As rleFile
Public CurFileUnrle As Byte()
Public EngFile As rleFile
Public EngFileUnrle As Byte()
Private Sub DungeonEditor_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim cd = New ISOTools
'Reading filetable and make array
files1 = cd.makeFileList(Form1.UserPath.Text)
files2 = cd.makeFileList(Form1.EngISOPath.Text)
LoadDistrict()
End Sub
Private Sub SecondVariant_CheckedChanged(sender As Object, e As EventArgs) Handles SecondVariant.CheckedChanged
LoadDistrict()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If ID.Text = 713 Then
ID.Text = 719
Else
ID.Text -= 1
End If
LoadDistrict()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
If ID.Text = 719 Then
ID.Text = 713
Else
ID.Text += 1
End If
LoadDistrict()
End Sub
Public Sub LoadDistrict()
Dim cd = New ISOTools
Dim rle = New rleTools
Form1.DeconstructFile(cd.getCDfile(Form1.UserPath.Text, files1(ID.Text).Sector, files1(ID.Text).Sizw).ToArray) 'here is separated binfile
CurFile = Form1.binFile(Form1.binFile.Count - 3 + Convert.ToInt32(SecondVariant.Checked)) 'Get Before Last File
CurFileUnrle = rle.UnrleNocompr(CurFile.Bytes).ToArray
Form1.DeconstructFile(cd.getCDfile(Form1.EngISOPath.Text, files2(ID.Text).Sector, files2(ID.Text).Sizw).ToArray) 'here is separated binfile
EngFile = Form1.binFile(Form1.binFile.Count - 3 + Convert.ToInt32(SecondVariant.Checked)) 'Get Before Last File
EngFileUnrle = rle.UnrleNocompr(EngFile.Bytes).ToArray
'Dim curfile As rleFile = binFile(8)
Dim JapBlock1Len = CurFileUnrle(0)
Dim JapBlock2Len = CurFileUnrle(1)
Dim JapBlockLines = CurFileUnrle(2)
Dim EnBlock1Len = EngFileUnrle(0)
Dim EnBlock2Len = EngFileUnrle(1)
Dim EnBlockLines = EngFileUnrle(2)
Dim JapTextStart = JapBlock1Len * 16 + JapBlock2Len * 8 + 4 'header 8 + head 4 block
Dim EngTextStart = EnBlock1Len * 16 + EnBlock2Len * 8 + 4
Try
EngTitle.Text = readEngText(EngTextStart + 4) 'after coords...
UserTitle.Text = readRusText(JapTextStart + 4) 'after coords...
DataGridView1.Rows.Clear()
For a = 1 To JapBlockLines - 1
JapTextStart += 40
EngTextStart += 40 'Move to Next Block...
Dim jap_X As String = BitConverter.ToInt16(CurFileUnrle, JapTextStart)
Dim jap_Y As Integer = BitConverter.ToInt16(CurFileUnrle, JapTextStart + 2)
Dim japLoc = readRusText(JapTextStart + 4 + 14) ' aftercoords
Dim en_coords As String = BitConverter.ToInt16(CurFileUnrle, EngTextStart) & " x " & BitConverter.ToInt16(CurFileUnrle, EngTextStart + 2)
Dim enLoc = readEngText(JapTextStart + 4 + 14) ' aftercoords
DataGridView1.Rows.Add(jap_X, jap_Y, japLoc, enLoc, en_coords)
Next
Catch ex As Exception
MsgBox("Error reading this district. Try another variant.")
End Try
End Sub
Public Function readEngText(ByVal Curbt As Integer)
Dim a = ""
Do
If EngFileUnrle(Curbt) = 3 Or EngFileUnrle(Curbt) = 0 Then Exit Do
If EngFileUnrle(Curbt) > 128 Then EngFileUnrle(Curbt) = Asc("-")
a &= Chr(EngFileUnrle(Curbt))
Curbt += 1
Loop
Return a
End Function
Public Function readRusText(ByVal Curbt As Integer)
Dim a = ""
If BitConverter.ToInt16(CurFileUnrle, Curbt) And &H2000 Then
Dim len = BitConverter.ToInt16(CurFileUnrle, Curbt) And &HFF
Curbt += 2
For b = 0 To len - 1
a &= Chr(CurFileUnrle(Curbt))
Curbt += 1
Next
Else
Dim b = BitConverter.ToInt16(CurFileUnrle, Curbt)
Do
Dim curChar = BitConverter.ToInt16(CurFileUnrle, Curbt)
If (curChar < &H1000) Then a &= Form1.chars(curChar)
'a &= CurFileUnrle(Curbt).ToString("X2") & CurFileUnrle(Curbt + 1).ToString("X2")
Curbt += 2
If Curbt >= CurFileUnrle.Count Then Exit Do
b = BitConverter.ToInt16(CurFileUnrle, Curbt)
Loop Until (b And &H1000)
End If
Return a
End Function
Private Sub UserTitle_TextChanged(sender As Object, e As EventArgs) Handles UserTitle.TextChanged
ChrCount.Text = UserTitle.Text.Length
If UserTitle.Text.Length > 14 Then
ChrCount.ForeColor = Color.Red
Else
ChrCount.ForeColor = Color.DarkGreen
End If
End Sub
Private Sub DataGridView1_CurrentCellChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellChanged
If IsNothing(DataGridView1.CurrentCell) Then Exit Sub
Dim a = DataGridView1.CurrentCell.Value.ToString.Length
AreaCount.Text = a
If a > 20 Then
AreaCount.ForeColor = Color.Red
Else
AreaCount.ForeColor = Color.DarkGreen
End If
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles SaveToISO.Click
'CHANGING FILE!
Dim cd = New ISOTools
Dim rle = New rleTools
'Dim curfile As rleFile = binFile(8)
Dim JapBlock1Len = CurFileUnrle(0)
Dim JapBlock2Len = CurFileUnrle(1)
Dim JapBlockLines = CurFileUnrle(2)
Dim JapTextStart = JapBlock1Len * 16 + JapBlock2Len * 8 + 4 'header 8 + head 4 block
MakeSaveRussianString(UserTitle.Text, 14, JapTextStart + 4)
CurFileUnrle(18) = 0
CurFileUnrle(19) = 10
For Each row In DataGridView1.Rows
JapTextStart += 40
Dim xxx = Convert.ToInt16(row.Cells(0).Value)
Dim yyy = Convert.ToInt16(row.Cells(1).Value)
CurFileUnrle(JapTextStart) = BitConverter.GetBytes(xxx)(0)
CurFileUnrle(JapTextStart + 1) = BitConverter.GetBytes(xxx)(1)
CurFileUnrle(JapTextStart + 2) = BitConverter.GetBytes(yyy)(0)
CurFileUnrle(JapTextStart + 3) = BitConverter.GetBytes(yyy)(1)
Dim japLoc = readRusText(JapTextStart + 4 + 14)
MakeSaveRussianString(Trim(row.Cells(2).Value), 22, JapTextStart + 4 + 14)
Next
Form1.DeconstructFile(cd.getCDfile(Form1.UserPath.Text, files1(ID.Text).Sector, files1(ID.Text).Sizw).ToArray) 'Deconstruct again!
Form1.binFile(Form1.binFile.Count - 3 + Convert.ToInt32(SecondVariant.Checked)).Bytes = rle.attachNoCompressionHeader(CurFile, CurFileUnrle).ToArray
'Packing
Dim finalPack = New List(Of Byte)
For Each bin In Form1.binFile
finalPack.AddRange(bin.Bytes)
'Adding SectorGaps (ONLY FOR CITY DISTRICTS!!!!!!!)
Dim gap = 2048 - (finalPack.Count Mod 2048)
For g = 0 To gap - 1
finalPack.Add(0)
Next
Next
Dim beforePackSize As Integer = cd.getCDfile(Form1.UserPath.Text, files1(ID.Text).Sector, files1(ID.Text).Sizw).Count
If finalPack.Count = beforePackSize Then
'If sizw matched
cd.saveCDfile(Form1.UserPath.Text, files1(ID.Text).Sector, finalPack.Count, finalPack.ToArray)
ElseIf MsgBox($"finalPack is not match source :( {vbCrLf} Source size {beforePackSize}{vbCrLf} Final Pack Size {finalPack.Count} {vbCrLf} Wanna save it to a file for inspect?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
My.Computer.FileSystem.WriteAllBytes(Form1.SaveFileDialog1.FileName, finalPack.ToArray, False)
End If
End Sub
Public Sub MakeSaveRussianString(ByVal str As String, ByVal maxBytes As Integer, ByVal offs As String)
Dim a = New List(Of Byte)
If str = "0010" Then
For zzz = 0 To maxBytes - 1 Step 2
CurFileUnrle(offs + zzz) = 0
CurFileUnrle(offs + zzz + 1) = &H10
Next
Exit Sub
End If
a.Add(str.Length)
a.Add(&H20)
For zzz = 0 To str.Length - 1
a.Add(Asc(str(zzz)))
Next
' a.Add(0)
' a.Add(&H10)
For zzz = 0 To maxBytes - str.Length - 3
a.Add(0)
Next
For zzz = 0 To maxBytes - 1
CurFileUnrle(zzz + offs) = a(zzz)
Next
End Sub
End Class