public virtual void Load(string filename) { BinaryReaderBE reader = new BinaryReaderBE(File.Open(filename, FileMode.Open)); try { // is it MacBinary? int fork_start = 0; if (MacBinaryHeader(reader.ReadBytes(128))) { fork_start = 128; } reader.BaseStream.Seek(fork_start, SeekOrigin.Begin); // read the header version = reader.ReadInt16(); DataVersion = reader.ReadInt16(); Filename = reader.ReadMacString(maxFilename); checksum = reader.ReadUInt32(); directoryOffset = reader.ReadInt32(); short wadCount = reader.ReadInt16(); applicationSpecificDirectoryDataSize = reader.ReadInt16(); entryHeaderSize = reader.ReadInt16(); directoryEntryBaseSize = reader.ReadInt16(); // sanity check the map if (Version < 2 || entryHeaderSize != 16 || directoryEntryBaseSize != 10) { throw new BadMapException("Only Marathon 2 and higher maps are supported"); } ParentChecksum = reader.ReadUInt32(); reader.ReadBytes(2 * 20); // unused // load the directory reader.BaseStream.Seek(directoryOffset + fork_start, SeekOrigin.Begin); for (int i = 0; i < wadCount; ++i) { DirectoryEntry entry = new DirectoryEntry(); entry.LoadEntry(reader); Directory[entry.Index] = entry; LoadApplicationSpecificDirectoryData(reader, entry.Index); } // load all the wads(!) foreach (KeyValuePair <int, DirectoryEntry> kvp in Directory) { reader.BaseStream.Seek(kvp.Value.Offset + fork_start, SeekOrigin.Begin); kvp.Value.LoadChunks(reader); } } finally { reader.Close(); } }
public void Dispose() { br.Close(); fs.Close(); }
public virtual void Load(string filename) { BinaryReaderBE reader = new BinaryReaderBE(File.Open(filename, FileMode.Open)); try { // is it MacBinary? int fork_start = 0; int resourceOffset = MacBinaryHeader(reader.ReadBytes(128)); if (resourceOffset > 0) { fork_start = 128; resourceOffset = 128 + ((resourceOffset + 0x7f) & ~0x7f); } reader.BaseStream.Seek(fork_start, SeekOrigin.Begin); // read the header version = reader.ReadInt16(); DataVersion = reader.ReadInt16(); Filename = reader.ReadMacString(maxFilename); checksum = reader.ReadUInt32(); directoryOffset = reader.ReadInt32(); short wadCount = reader.ReadInt16(); applicationSpecificDirectoryDataSize = reader.ReadInt16(); entryHeaderSize = reader.ReadInt16(); directoryEntryBaseSize = reader.ReadInt16(); // sanity check the map if (Version < 2 || entryHeaderSize != 16 || directoryEntryBaseSize != 10) { throw new BadMapException("Only Marathon 2 and higher maps are supported"); } ParentChecksum = reader.ReadUInt32(); reader.ReadBytes(2 * 20); // unused // load the directory reader.BaseStream.Seek(directoryOffset + fork_start, SeekOrigin.Begin); for (int i = 0; i < wadCount; ++i) { DirectoryEntry entry = new DirectoryEntry(); entry.LoadEntry(reader); Directory[entry.Index] = entry; LoadApplicationSpecificDirectoryData(reader, entry.Index); } // load all the wads(!) foreach (KeyValuePair <int, DirectoryEntry> kvp in Directory) { reader.BaseStream.Seek(kvp.Value.Offset + fork_start, SeekOrigin.Begin); kvp.Value.LoadChunks(reader); } if (resourceOffset > 0) { reader.BaseStream.Seek(resourceOffset, SeekOrigin.Begin); UInt32 dataOffset = reader.ReadUInt32(); UInt32 mapOffset = reader.ReadUInt32(); UInt32 dataLength = reader.ReadUInt32(); UInt32 mapLength = reader.ReadUInt32(); Debug.Log(resourceOffset); Debug.Log(dataOffset); Debug.Log(mapOffset); Debug.Log(dataLength); Debug.Log(mapLength); dataOffset += (UInt32)resourceOffset; mapOffset += (UInt32)resourceOffset; ResourceMap resourceMap = new ResourceMap(); resourceMap.load(ref reader, mapOffset); for (int i = 0; i < resourceMap.refs.Count; i++) { string name = ""; if (resourceMap.refs[i].nameListOffset > 0) { reader.BaseStream.Seek(resourceMap.refs[i].nameListOffset + resourceMap.nameListOffset + mapOffset, SeekOrigin.Begin); int nameLength = reader.ReadByte(); name = reader.ReadMacString(nameLength); } if (resourceMap.refs[i].type == Pict.Tag || resourceMap.refs[i].type == Pict.Tag2) { Pict pict = new Pict(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); pict.LoadWithName(reader, name); pictResources.Add(pict); } if (resourceMap.refs[i].type == Clut.Tag) { Clut clut = new Clut(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); clut.Load(reader); clutResources.Add(clut); } if (resourceMap.refs[i].type == SoundResource.Tag) { SoundResource snd = new SoundResource(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); snd.Load(reader); soundResources.Add(snd); } if (resourceMap.refs[i].type == TextResource.Tag || resourceMap.refs[i].type == TextResource.Tag2) { TextResource txt = new TextResource(); reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin); txt.Load(reader); textResources.Add(txt); } } } } finally { reader.Close(); } }
static void Read_BookPack(string fileIn, string folderOut) { Console.WriteLine("Reading\t\t{0}", fileIn); Console.WriteLine("Output folder\t{0}\n", folderOut); BinaryReaderBE br; try { br = new BinaryReaderBE(fileIn); } catch (Exception ex) { Console.WriteLine("ERROR opening file: {0}", ex.Message); return; } // Read header ulong header = br.ReadUInt64(); // TGDT0100 if (header != 0x5447445430313030) { Console.WriteLine("ERROR Invalid header! BOOK"); return; } uint num_entries = br.ReadUInt32(); // Should be 0xB5 uint data_offset = br.ReadUInt32(); // 0xB5 * 0x10 + padding Console.Write("Header:\t"); Show_String(header); Console.WriteLine("Pages:\t{0}", num_entries.ToString()); sGVD[] gvds = new sGVD[num_entries]; for (int i = 0; i < num_entries; i++) { br.BaseStream.Position = i * 0x10 + 0x10; // Each entry is 0x10 bytes uint pageName_offset = br.ReadUInt32() + data_offset; // Relative offset to page name uint pageName_size = br.ReadUInt32(); gvds[i].offset = br.ReadUInt32() + data_offset; // Relative offset to page data gvds[i].size = br.ReadUInt32(); // Get page name br.BaseStream.Position = pageName_offset; gvds[i].name = Encoding.ASCII.GetString(br.ReadBytes((int)pageName_size)); gvds[i].extension = Path.GetExtension(gvds[i].name); // Separate extension from name gvds[i].name = Path.GetFileNameWithoutExtension(gvds[i].name); // Check if we should extract this page bool extract = false; if (mode == 0) // Extract everything { extract = true; } if (mode == 1) // Extract page by number { for (int n = 0; n < pages_num.Length; n++) { if (pages_num[n] == i) { extract = true; } } } else if (mode == 2) // Extract page by name { for (int n = 0; n < pages_name.Length; n++) { if (pages_name[n] == gvds[i].name) { extract = true; } } } if (!extract) { continue; } string folderPage = folderOut; if (!nofolder) { folderPage = Path.Combine(folderOut, gvds[i].name); if (!Directory.Exists(folderPage)) { Directory.CreateDirectory(folderPage); } } Console.WriteLine("\t| Reading (GVD) page {0} ({1})", i.ToString(), gvds[i].name); Read_GVD(br, gvds[i], folderPage); } br.Close(); br = null; }
public void Load(string filename) { BinaryReaderBE reader = new BinaryReaderBE(File.Open(filename, FileMode.Open)); try { // is it MacBinary? int fork_start = 0; if (MacBinaryHeader(reader.ReadBytes(128))) { fork_start = 128; } reader.BaseStream.Seek(fork_start, SeekOrigin.Begin); // read the header version = reader.ReadInt16(); DataVersion = reader.ReadInt16(); Filename = reader.ReadMacString(maxFilename); checksum = reader.ReadUInt32(); directoryOffset = reader.ReadInt32(); short wadCount = reader.ReadInt16(); applicationSpecificDirectoryDataSize = reader.ReadInt16(); entryHeaderSize = reader.ReadInt16(); directoryEntryBaseSize = reader.ReadInt16(); // sanity check the map if (Version < 2 || DataVersion < 1 || entryHeaderSize != 16 || directoryEntryBaseSize != 10) { throw new BadMapException("Only Marathon 2 and higher maps are supported"); } ParentChecksum = reader.ReadUInt32(); reader.ReadBytes(2 * 20); // unused // load the directory reader.BaseStream.Seek(directoryOffset + fork_start, SeekOrigin.Begin); for (int i = 0; i < wadCount; ++i) { DirectoryEntry entry = new DirectoryEntry(); entry.LoadEntry(reader); if (applicationSpecificDirectoryDataSize == DirectoryEntry.DataSize) { entry.LoadData(reader); } else { reader.ReadBytes(applicationSpecificDirectoryDataSize); } Directory[entry.Index] = entry; } // load all the wads(!) foreach (KeyValuePair <int, DirectoryEntry> kvp in Directory) { reader.BaseStream.Seek(kvp.Value.Offset + fork_start, SeekOrigin.Begin); kvp.Value.LoadChunks(reader); } if (applicationSpecificDirectoryDataSize != DirectoryEntry.DataSize) { foreach (var kvp in Directory) { if (kvp.Value.Chunks.ContainsKey(MapInfo.Tag)) { MapInfo info = new MapInfo(); BinaryReaderBE chunkReader = new BinaryReaderBE(new MemoryStream(kvp.Value.Chunks[MapInfo.Tag])); info.Load(chunkReader); kvp.Value.MissionFlags = info.MissionFlags; kvp.Value.EnvironmentFlags = info.EnvironmentFlags; kvp.Value.EntryPointFlags = info.EntryPointFlags; kvp.Value.LevelName = info.Name; } } } } finally { reader.Close(); } }