Advertisement
Guest User

RARC Template

a guest
Jun 12th, 2014
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.02 KB | None | 0 0
  1. /*
  2.  * Filename: RARCTemplate.bt
  3.  * Last Modified: 2014-06-12
  4.  * Author: Phillip "Antidote" Michael Thomas Stephens
  5.  * Purpose: J3D Engine Archives (RARC)
  6.  * License: GPLv2
  7.  * 010 Version: >= 5.0
  8.  */
  9. BigEndian();
  10.  
  11. struct FileDescriptor
  12. {
  13.     ushort ID;
  14.     ushort Unknown1 <format = hex>;
  15.     ushort Unknown2 <format = hex>;
  16.     ushort FilenameOffset;
  17.     uint   DataStart <format = hex>;
  18.     uint   DataSize <format = hex>;
  19.     uint   Zero;
  20. };
  21.  
  22. struct Node
  23. {
  24.     char Type[4];
  25.     uint   FilenameOffset;
  26.     ushort Unknown <format = hex>;
  27.     ushort FileEntryCount;
  28.     uint   FirstFileStart;
  29. };
  30. struct FileEntry;
  31. struct FileEntry
  32. {
  33.     FileDescriptor Descriptor;
  34.     local int tmp = FTell();
  35.     FSeek((file.StringTableStart + file.HeaderSize) + Descriptor.FilenameOffset);
  36.     string Filename;
  37.     FSeek(tmp);
  38.     if (Descriptor.ID == 0xFFFF && Filename != "." && Filename != "..")
  39.     {
  40.         FSeek(file.FileEntriesStart + (file.Nodes[Descriptor.DataStart].FirstFileStart * sizeof(FileDescriptor)) + 0x20);
  41.         FileEntry FileEntries[file.Nodes[Descriptor.DataStart].FileEntryCount] <optimize = false>;
  42.         FSeek(tmp);
  43.     }
  44.     else if (Filename != "." && Filename != "..")
  45.     {
  46.         FSeek(file.DataStart + Descriptor.DataStart + 0x20);
  47.         ubyte Data[Descriptor.DataSize];
  48.         FSeek(tmp);
  49.     }
  50. };
  51.  
  52. struct RARCHeader
  53. {
  54.     uint Magic <format = hex>;
  55.     if (Magic != 0x52415243)
  56.     {
  57.         Warning("Not a valid RARC File");
  58.         return;
  59.     }
  60.     uint FileSize <format = hex>;
  61.     if (FileSize != FileSize())
  62.     {
  63.         Warning("Malformed file, stored size does not match actual size");
  64.         return;
  65.     }
  66.     uint HeaderSize;
  67.     uint DataStart <format = hex>;
  68.     uint Unknown[4] <format = hex>;
  69.     uint NodeCount;
  70.     uint Unknown2[2] <format = hex>;
  71.     uint FileEntriesStart <format = hex>;
  72.     uint StringTableSize <format = hex>;
  73.     uint StringTableStart <format = hex>;
  74.     uint Unknown4[2] <format = hex>;
  75.  
  76.     Node Nodes[NodeCount] <optimize = false>;
  77.     local int tmp = FTell();
  78.     FSeek(FileEntriesStart + Nodes[0].FirstFileStart + 0x20);
  79.     FileEntry FileEntries[Nodes[0].FileEntryCount] <optimize = false>;
  80.     FSeek(tmp);
  81. }file;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement