public override void Load(Stream fileStream) { // Header var reader = new ExtendedBinaryReader(fileStream); // Apparently SEGA doesn't even do signature checking (try loading an AR in-game // with the first 0xC bytes set to 0, it works just fine), so why should we? reader.JumpAhead(0xC); Padding = reader.ReadUInt32(); // Data while (fileStream.Position < fileStream.Length) { reader.Offset = (uint)fileStream.Position; uint dataEndOffset = reader.ReadUInt32(); uint dataLength = reader.ReadUInt32(); uint dataStartOffset = reader.ReadUInt32(); uint unknown1 = reader.ReadUInt32(); uint unknown2 = reader.ReadUInt32(); string name = reader.ReadNullTerminatedString(); reader.JumpTo(dataStartOffset, false); var data = reader.ReadBytes((int)dataLength); reader.JumpTo(dataEndOffset, false); var file = new ArchiveFile() { Name = name, Data = data }; Data.Add(file); } }
// TODO protected void LoadShadowArchive(ExtendedBinaryReader reader) { reader.JumpAhead(0x4); // Unknown, Seems to always be 0 uint fileSize = reader.ReadUInt32(); // File Size - 0xC uint magic = reader.ReadUInt32(); // Magic string ONEVersion = reader.ReadNullTerminatedString(); // Gets the version String reader.FixPadding(); // Aligns the reader uint fileCount = reader.ReadUInt32(); // File Count reader.JumpAhead(0x38 * 2 + 0x20); // Jump to the third/first entry bool isVersion6 = ONEVersion == "ONE Ver 0.60"; // Checks if its version is 0.60 int fileNameLength = isVersion6 ? 0x2C : 0x20; // The max file name size // Read File List var files = new FileEntry[FileEntryCount]; for (int i = 0; i < fileCount; i++) { var entry = new FileEntry(); entry.FileName = reader.ReadSignature( fileNameLength).Replace("\0", string.Empty); entry.UncompressedSize = reader.ReadUInt32(); entry.DataOffset = reader.ReadUInt32(); reader.JumpAhead(4); // Unknown, Seems to always be 1 if (!isVersion6) { reader.JumpAhead(0xC); // Unknown, Seems to always be 0 } files[i] = entry; } // Read File Data if (files.Length > 0) { reader.JumpTo(files[0].DataOffset + 0xC); for (int i = 0; i < fileCount; ++i) { // Compute the file's data length files[i].DataLength = ((i == fileCount - 1) ? fileSize + 0xC : files[i + 1].DataOffset) - files[i].DataOffset; var file = new ArchiveFile() { Name = files[i].FileName, Data = reader.ReadBytes( (int)files[i].DataLength) // TODO: Decompress file }; Data.Add(file); } } }