예제 #1
0
        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();
            }
        }
예제 #2
0
 public void Dispose()
 {
     br.Close();
     fs.Close();
 }
예제 #3
0
        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();
            }
        }
예제 #4
0
파일: Program.cs 프로젝트: usnail/Ninokuni
        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;
        }
예제 #5
0
        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();
            }
        }