Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Filename: RARCTemplate.bt
- * Last Modified: 2014-06-12
- * Author: Phillip "Antidote" Michael Thomas Stephens
- * Purpose: J3D Engine Archives (RARC)
- * License: GPLv2
- * 010 Version: >= 5.0
- */
- BigEndian();
- struct FileDescriptor
- {
- ushort ID;
- ushort Unknown1 <format = hex>;
- ushort Unknown2 <format = hex>;
- ushort FilenameOffset;
- uint DataStart <format = hex>;
- uint DataSize <format = hex>;
- uint Zero;
- };
- struct Node
- {
- char Type[4];
- uint FilenameOffset;
- ushort Unknown <format = hex>;
- ushort FileEntryCount;
- uint FirstFileStart;
- };
- struct FileEntry;
- struct FileEntry
- {
- FileDescriptor Descriptor;
- local int tmp = FTell();
- FSeek((file.StringTableStart + file.HeaderSize) + Descriptor.FilenameOffset);
- string Filename;
- FSeek(tmp);
- if (Descriptor.ID == 0xFFFF && Filename != "." && Filename != "..")
- {
- FSeek(file.FileEntriesStart + (file.Nodes[Descriptor.DataStart].FirstFileStart * sizeof(FileDescriptor)) + 0x20);
- FileEntry FileEntries[file.Nodes[Descriptor.DataStart].FileEntryCount] <optimize = false>;
- FSeek(tmp);
- }
- else if (Filename != "." && Filename != "..")
- {
- FSeek(file.DataStart + Descriptor.DataStart + 0x20);
- ubyte Data[Descriptor.DataSize];
- FSeek(tmp);
- }
- };
- struct RARCHeader
- {
- uint Magic <format = hex>;
- if (Magic != 0x52415243)
- {
- Warning("Not a valid RARC File");
- return;
- }
- uint FileSize <format = hex>;
- if (FileSize != FileSize())
- {
- Warning("Malformed file, stored size does not match actual size");
- return;
- }
- uint HeaderSize;
- uint DataStart <format = hex>;
- uint Unknown[4] <format = hex>;
- uint NodeCount;
- uint Unknown2[2] <format = hex>;
- uint FileEntriesStart <format = hex>;
- uint StringTableSize <format = hex>;
- uint StringTableStart <format = hex>;
- uint Unknown4[2] <format = hex>;
- Node Nodes[NodeCount] <optimize = false>;
- local int tmp = FTell();
- FSeek(FileEntriesStart + Nodes[0].FirstFileStart + 0x20);
- FileEntry FileEntries[Nodes[0].FileEntryCount] <optimize = false>;
- FSeek(tmp);
- }file;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement