Exemplo n.º 1
0
        public static WAD Load(string path)
        {
            FileInfo fi = new FileInfo(path);
            Logger.LogToFile(Logger.LogLevel.Info, "{0}", path);
            WAD wad = new WAD();

            wad.name = Path.GetFileNameWithoutExtension(path);
            wad.location = Path.GetDirectoryName(path) + "\\";

            using (var br = new BinaryReader(fi.OpenRead()))
            {
                if (br.ReadByte() != 0x34 ||
                    br.ReadByte() != 0x12)
                {
                    Logger.LogToFile(Logger.LogLevel.Error, "{0} isn't a valid WAD file", path);
                    return null;
                }

                byte minor = br.ReadByte();
                byte major = br.ReadByte();

                wad.version = new Version(major, minor);
                wad.flags = (int)br.ReadUInt32();

                int xmlLength = (int)br.ReadUInt32();
                if (xmlLength > 0)
                {
                    Logger.LogToFile(Logger.LogLevel.Error, "Unexpected data discovered.  Aborting");
                    return null;
                }

                int namesLength = (int)br.ReadUInt32();
                int endOfNamesBlock = (int)br.BaseStream.Position + namesLength;

                while (br.BaseStream.Position < endOfNamesBlock)
                {
                    var entry = new WADEntry();
                    entry.Name = br.ReadString();
                    wad.contents.Add(entry);
                }
            }

            return wad;
        }
Exemplo n.º 2
0
        public static WAD Load(string path)
        {
            FileInfo fi = new FileInfo(path);

            Logger.LogToFile(Logger.LogLevel.Info, "{0}", path);
            WAD wad = new WAD
            {
                Name     = Path.GetFileNameWithoutExtension(path),
                Location = Path.GetDirectoryName(path)
            };

            using (BinaryReader br = new BinaryReader(fi.OpenRead()))
            {
                if (br.ReadByte() != 0x34 ||
                    br.ReadByte() != 0x12)
                {
                    Logger.LogToFile(Logger.LogLevel.Error, "{0} isn't a valid WAD file", path);
                    return(null);
                }

                byte minor = br.ReadByte();
                byte major = br.ReadByte();

                wad.Version = new Version(major, minor);
                wad.Flags   = (WADFlags)br.ReadUInt32();

                int xmlLength = (int)br.ReadUInt32();
                if (xmlLength > 0)
                {
                    Logger.LogToFile(Logger.LogLevel.Error, "Unexpected data discovered.  Aborting");
                    return(null);
                }

                int namesLength                = (int)br.ReadUInt32();
                int nameBlockStart             = (int)br.BaseStream.Position;
                int nameBlockEnd               = (int)br.BaseStream.Position + namesLength;
                Dictionary <int, string> names = new Dictionary <int, string>();

                while (br.BaseStream.Position < nameBlockEnd && br.PeekChar() != 0)
                {
                    names.Add((int)(br.BaseStream.Position - nameBlockStart), br.ReadNullTerminatedString());
                }

                br.BaseStream.Seek(nameBlockEnd, SeekOrigin.Begin);

                if (wad.Flags.HasFlag(WADFlags.HasDataTimes))
                {
                    int count = br.ReadInt32();

                    for (int i = 0; i < count; i++)
                    {
                        br.ReadInt32();     // index (with bit 0x1 set)
                        br.ReadInt32();     // dos date time?  time added to archive?
                    }
                }

                int fileCount   = br.ReadInt32();
                int folderCount = br.ReadInt32();

                int        offsetCount = br.ReadInt32();
                List <int> offsets     = new List <int>();
                for (int i = 0; i < offsetCount; i++)
                {
                    offsets.Add(br.ReadInt32());
                }

                void processFileEntry(WADEntry parent)
                {
                    WADEntry entry = new WADEntry
                    {
                        Name        = names[br.ReadInt32()],
                        Size        = br.ReadInt32(),
                        ParentEntry = parent,
                        Offset      = offsets[(int)(br.ReadUInt32() & 0x00FFFFFF)]
                    };

                    br.ReadInt32(); // Unknown

                    wad.Contents.Add(entry);
                }

                void processDirectoryEntry(WADEntry parent = null)
                {
                    WADEntry entry = new WADEntry
                    {
                        Name        = names[br.ReadInt32()],
                        IsDirectory = true,
                        ParentEntry = parent
                    };

                    wad.Contents.Add(entry);

                    int fileEntries   = br.ReadInt32();
                    int folderEntries = br.ReadInt32();

                    br.ReadInt32(); // unknown

                    for (int i = 0; i < folderEntries; i++)
                    {
                        processDirectoryEntry(entry);
                    }

                    for (int i = 0; i < fileEntries; i++)
                    {
                        processFileEntry(entry);
                    }
                }

                processDirectoryEntry();
            }

            return(wad);
        }