Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports System.Linq
- Public Class Form1
- 'Read RARC Stuff
- Const HeaderSize As Integer = 64
- Const NodeSize As Integer = 16
- Const EntrySize As Integer = 20
- 'File Header Vars
- Dim headerTag As String
- Dim DataStartOffset As UInt32
- Dim NumNodes As UInt32
- Dim FileEntriesOffset As UInt32
- Dim StringTableOffset As UInt32
- 'Global Stuff
- Dim CurrStageName As String
- Dim CurrRoomName As String
- Dim AllStages As String
- Dim AllRooms As String
- Dim Output As String
- Dim FoundSCLS As Boolean
- Dim TableType As String
- Dim CurrentExitTable_Stages As New Collection()
- Dim CurrentExitTable_Rooms As New Collection()
- Dim CurrentExitTable_Spawns As New Collection()
- Dim CurrentExitTable_States As New Collection()
- Private Sub Main()
- Dim StageFolder As New IO.DirectoryInfo("ExtractedStages")
- For Each Stage As IO.DirectoryInfo In StageFolder.GetDirectories()
- CurrStageName = Stage.Name
- For Each Room As IO.FileInfo In Stage.GetFiles() 'Only Stage (put it first)
- If Room.Name.Contains("STG") = False Then
- Continue For
- End If
- CurrRoomName = "Stage (Global)"
- Dim FileContent As Byte() = My.Computer.FileSystem.ReadAllBytes(Room.FullName)
- Dim index As String = ReadString(FileContent, 0, 4)
- Dim outputSize As UInt32
- Dim outputBuffer As Byte()
- 'Decompress if neccesary
- If (index = "Yaz0") Then
- outputSize = Read32(FileContent, 4)
- outputBuffer = New Byte(outputSize) {}
- DecompressYaz0(FileContent, 0, outputBuffer)
- Else
- outputSize = FileContent.GetLength(0)
- outputBuffer = FileContent
- End If
- 'File Header
- headerTag = ReadString(outputBuffer, 0, 4)
- DataStartOffset = Read32(outputBuffer, 12)
- NumNodes = Read32(outputBuffer, 32)
- FileEntriesOffset = Read32(outputBuffer, 44)
- StringTableOffset = Read32(outputBuffer, 52)
- 'Get Root and Files
- GetFileNode(outputBuffer, 0, outputSize)
- Next
- Dim Searching As Boolean = True
- Dim Counter_Rooms As Integer = 0
- For Each Room As IO.FileInfo In Stage.GetFiles()
- If Room.Name.Contains("STG") = True Then
- Continue For
- End If
- CurrRoomName = Room.Name
- Dim FileContent As Byte() = My.Computer.FileSystem.ReadAllBytes(Room.FullName)
- Dim index As String = ReadString(FileContent, 0, 4)
- Dim outputSize As UInt32
- Dim outputBuffer As Byte()
- 'Decompress if neccesary
- If (index = "Yaz0") Then
- outputSize = Read32(FileContent, 4)
- outputBuffer = New Byte(outputSize) {}
- DecompressYaz0(FileContent, 0, outputBuffer)
- Else
- outputSize = FileContent.GetLength(0)
- outputBuffer = FileContent
- End If
- 'File Header
- headerTag = ReadString(outputBuffer, 0, 4)
- DataStartOffset = Read32(outputBuffer, 12)
- NumNodes = Read32(outputBuffer, 32)
- FileEntriesOffset = Read32(outputBuffer, 44)
- StringTableOffset = Read32(outputBuffer, 52)
- 'Get Root and Files
- GetFileNode(outputBuffer, 0, outputSize)
- Next
- Next
- MsgBox("Done!", vbInformation, "Done")
- End Sub
- Public Function FindStageDesc(StageName As String) As String
- If AllStages.Contains(StageName) = False Then
- Return "Deleted"
- End If
- Try
- Dim StageDesc As String = AllStages.Substring(AllStages.IndexOf(StageName))
- StageDesc = StageDesc.Substring(StageDesc.IndexOf("wxT(") + 5)
- StageDesc = StageDesc.Substring(0, StageDesc.IndexOf(Chr(34)))
- StageDesc = StageDesc.Replace("--", "")
- Return StageDesc
- Catch ex As Exception
- Return "Deleted"
- End Try
- End Function
- Public Function FindRoomDesc(StageName As String, RoomNumber As String) As String
- If AllRooms.Contains(StageName) = False Then
- Return FindStageDesc(StageName)
- End If
- Dim tempNum As Integer = Convert.ToInt32(RoomNumber)
- RoomNumber = tempNum
- Try
- Dim RoomDesc As String = AllRooms.Substring(AllRooms.IndexOf(StageName))
- RoomDesc = RoomDesc.Substring(0, RoomDesc.IndexOf("};"))
- RoomDesc = RoomDesc.Substring(0, RoomDesc.IndexOf("," & vbCrLf & RoomNumber) - 1)
- RoomDesc = RoomDesc.Substring(RoomDesc.LastIndexOf(Chr(34)) + 1)
- RoomDesc = RoomDesc.Replace("--", "")
- Return RoomDesc
- Catch ex As Exception
- Return "Deleted"
- End Try
- End Function
- Private Sub GetFileNode(Data() As Byte, Offset As UInt32, Size As UInt32)
- 'File Node
- Dim nodeTag As String
- Dim FilenameOffset As UInt32
- Dim NumFileEntries As UInt16
- Dim FirstFileEntryOffset As UInt32
- Dim NodeName As String
- Offset = HeaderSize + (Offset * NodeSize)
- nodeTag = ReadString(Data, Convert.ToInt32(Offset), 4)
- FilenameOffset = Read32(Data, Convert.ToInt32(Offset) + 4)
- NumFileEntries = Read16(Data, Convert.ToInt32(Offset) + 10)
- FirstFileEntryOffset = Read32(Data, Convert.ToInt32(Offset) + 12)
- NodeName = ReadStringFull(Data, Convert.ToInt32((FilenameOffset + StringTableOffset + 32)), Size)
- Dim i As Integer = 0
- While (i < NumFileEntries)
- Dim ReadOffset As UInt32 = Convert.ToInt32((FileEntriesOffset + (FirstFileEntryOffset * EntrySize) + (i * EntrySize) + 32))
- 'File Entry
- Dim ID As UInt16
- Dim Unknown1 As UInt16
- Dim Unknown2 As UInt16
- Dim FilenameOffset_FileEntry As UInt16
- Dim DataOffset As UInt32
- Dim DataSize As UInt32
- Dim FileName As String
- Dim IsCompressed As Boolean
- ID = Read16(Data, Convert.ToInt32(ReadOffset))
- Unknown1 = Read16(Data, Convert.ToInt32(ReadOffset + 2))
- Unknown2 = Read16(Data, Convert.ToInt32(ReadOffset + 4))
- FilenameOffset_FileEntry = Read16(Data, Convert.ToInt32(ReadOffset + 6))
- DataOffset = Read32(Data, Convert.ToInt32(ReadOffset + 8))
- DataSize = Read32(Data, Convert.ToInt32(ReadOffset + 12))
- FileName = ReadStringFull(Data, Convert.ToInt32((FilenameOffset_FileEntry + StringTableOffset + 32)), Size)
- If CurrRoomName.Contains("Stage") = True Then
- 'MsgBox(ID)
- 'MsgBox(FileName)
- End If
- If (ID = &HFFFF Or Unknown2 = &H200) Then '0x2000 correct???
- If (FilenameOffset_FileEntry <> 0 And FilenameOffset_FileEntry <> 2) Then
- GetFileNode(Data, DataOffset, Size)
- End If
- Else
- Dim fileExtension As String
- Try
- fileExtension = FileName.Substring(FileName.LastIndexOf("."))
- Catch ex As Exception
- fileExtension = "." & FileName
- End Try
- If (fileExtension = ".dzr" Or fileExtension = ".dzs") Then
- Dim tempOffset As UInt32 = (DataStartOffset + DataOffset + 32)
- Dim tempString As String = ReadString(Data, Convert.ToInt32(tempOffset), 4)
- If (tempString = "Yaz0") Then
- IsCompressed = True
- Else
- IsCompressed = False
- End If
- Dim fileData As Byte()
- Dim realSize As UInt32
- If (IsCompressed = True) Then
- Dim fileDataSize As UInt32 = Read32(Data, Convert.ToInt32((tempOffset + 4)))
- fileData = New Byte(fileDataSize) {}
- DecompressYaz0(Data, tempOffset, fileData)
- realSize = fileDataSize
- Else
- fileData = New Byte(DataSize) {}
- Dim n As UInt32 = 0
- While n < DataSize
- Dim address As UInt32 = tempOffset + n
- fileData(n) = Data(address)
- n = n + 1
- End While
- realSize = DataSize
- End If
- 'Check File Contents
- 'DZx
- Dim dZxOffset As Integer = 0
- Dim ChunkCount As UInt32 = Read32(fileData, dZxOffset)
- If (ChunkCount = 0) Then
- i = i + 1
- Continue While
- End If
- dZxOffset += 4
- Dim z As UInt32 = 0
- While z < ChunkCount 'Chunks
- Dim Tag As String
- Dim Elements, chunkOffset As UInt32
- Tag = ReadString(fileData, dZxOffset, 4)
- Elements = Read32(fileData, dZxOffset + 4)
- chunkOffset = Read32(fileData, dZxOffset + 8)
- Dim chunkReadOffset As Integer = Convert.ToInt32(chunkOffset)
- Dim x As UInt32 = 0
- Dim counter As Integer = 0
- While x < Elements 'Chunk Elements
- 'First Switch
- If (Tag = "TGOB" Or Tag = "TRES") Then
- chunkReadOffset += &H20
- Exit While
- ElseIf (Tag = "RPPN" Or Tag = "SHIP") Then
- chunkReadOffset += &H10
- Exit While
- ElseIf (Tag = "Door") Then
- chunkReadOffset += &H24
- Exit While
- ElseIf (Tag = "LGTV") Then
- chunkReadOffset += &H1C
- Exit While '?????
- ElseIf (Tag = "MULT") Then 'Typically in DZS
- chunkReadOffset += &HC
- Exit While
- ElseIf (Tag = "PLYR") Then 'Typically in DZR
- 'Add Spawn Point to list
- 'AddSpawnPoint(&fileData[0], chunkReadOffset);
- chunkReadOffset += &H20
- 'x = x + 1
- 'Continue While
- Exit While
- ElseIf (Tag = "SCLS") Then 'Read Exit IDs
- chunkReadOffset += &HC
- Exit While
- End If
- 'Second Switch
- If (Tag.Substring(0, 3) = "ACT") Then
- Dim Name As String = ReadString(fileData, chunkReadOffset, 8)
- If (Name.ToLower().Contains(TextBox4.Text.ToLower())) Then
- TextBox1.Text = TextBox1.Text & vbCrLf & "Actor: " & Name & " found in " & CurrStageName & "->" & CurrRoomName
- End If
- chunkReadOffset += &H20
- x = x + 1
- Continue While
- ElseIf (Tag.Substring(0, 3) = "TRE") Then
- chunkReadOffset += &H20
- Exit While
- ElseIf (Tag.Substring(0, 3) = "SCO") Then
- Dim Name As String = ReadString(fileData, chunkReadOffset, 8)
- If (Name.ToLower().Contains(TextBox4.Text.ToLower())) Then
- TextBox1.Text = TextBox1.Text & vbCrLf & "Scaleable Object: " & Name & " found in " & CurrStageName & "->" & CurrRoomName
- End If
- chunkReadOffset += &H24
- x = x + 1
- Continue While
- ElseIf (Tag.Substring(0, 3) = "PLY") Then
- chunkReadOffset += &H20
- Exit While
- Else
- Exit While
- End If
- x = x + 1
- End While
- dZxOffset += 12
- z = z + 1
- End While
- End If
- End If
- i = i + 1
- End While
- End Sub
- Private Sub DecompressYaz0(Input() As Byte, Offset As UInt32, ByRef Output() As Byte)
- Dim Size As UInt32 = Read32(Input, Convert.ToInt32(Offset + 4))
- Output = New Byte(Size) {}
- Dim SrcPlace As Integer = Convert.ToInt32(Offset) + &H10
- Dim DstPlace As Integer = 0
- Dim ValidBitCount As UInt32 = 0
- Dim CodeByte As Byte = 0
- While (DstPlace < Size)
- If (ValidBitCount = 0) Then
- CodeByte = Input(SrcPlace)
- SrcPlace = SrcPlace + 1
- ValidBitCount = 8
- End If
- If ((CodeByte And &H80) <> 0) Then
- Output(DstPlace) = Input(SrcPlace)
- DstPlace = DstPlace + 1
- SrcPlace = SrcPlace + 1
- Else
- Dim Byte1 As Byte = Input(SrcPlace)
- Dim Byte2 As Byte = Input(SrcPlace + 1)
- SrcPlace += 2
- Dim Dist As UInt32 = Convert.ToUInt32((((Byte1 And &HF) << 8) Or Byte2))
- Dim CopySource As UInt32 = Convert.ToUInt32((DstPlace - (Dist + 1)))
- Dim NumBytes As UInt32 = Convert.ToUInt32((Byte1 >> 4))
- If (NumBytes = 0) Then
- NumBytes = Convert.ToUInt32((Input(SrcPlace) + &H12))
- SrcPlace = SrcPlace + 1
- Else
- NumBytes += 2
- End If
- Dim i As Integer = 0
- While (i < NumBytes)
- Output(DstPlace) = Output(CopySource)
- CopySource = CopySource + 1
- DstPlace = DstPlace + 1
- i = i + 1
- End While
- End If
- CodeByte <<= 1
- ValidBitCount -= 1
- End While
- End Sub
- Private Function Read8(Data() As Byte, Offset As Integer) As Byte
- Return Buffer.GetByte(Data, Offset)
- End Function
- Private Function Read16(Data() As Byte, Offset As Integer) As UInt16
- Dim Output(1) As Byte
- Output(0) = Buffer.GetByte(Data, Offset + 1)
- Output(1) = Buffer.GetByte(Data, Offset) << 8
- Return BitConverter.ToUInt16(Output, 0)
- End Function
- Private Function Read32(Data() As Byte, Offset As Integer) As UInt32
- Dim Output(3) As Byte
- Output(0) = Buffer.GetByte(Data, Offset + 3)
- Output(1) = Buffer.GetByte(Data, Offset + 2) << 8
- Output(2) = Buffer.GetByte(Data, Offset + 1) << 16
- Output(3) = Buffer.GetByte(Data, Offset) << 24
- Return BitConverter.ToUInt32(Output, 0)
- End Function
- Private Function ReadString(Data() As Byte, Offset As Integer, Length As Integer) As String
- Dim output As String = ""
- Dim i As Integer = 0
- While (i < Length)
- Dim address As Integer = Offset + i
- Dim result As Char = ""
- Dim var As Byte = Data(address)
- If var = 0 Then
- Exit While
- End If
- result = ChrW(var)
- output = output & result
- i = i + 1
- End While
- Return output
- End Function
- Function ReadStringFull(Data() As Byte, Offset As Integer, dataSize As UInt32) As String
- If (Convert.ToUInt32(Offset) >= dataSize) Then
- Return ""
- End If
- Dim startOffset As Integer
- Dim Length As Integer = 0
- While (Data(Offset) = 0)
- Offset = Offset + 1
- End While
- startOffset = Offset
- While (Data(Offset) <> 0)
- Offset = Offset + 1
- Length = Length + 1
- End While
- Return ReadString(Data, startOffset, Length)
- End Function
- End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement