Example #1
0
        /*
         * public class QFont
         * {
         * public uint Width;
         * public uint Height;
         * public uint RowCount;
         * public uint RowHeight;
         * public CharInfo[] FontInfo; //Size = 256
         * public byte[] data; //Size = 4
         * }*/


        /// <summary>
        /// Load and read WAD3 file.
        /// </summary>
        /// <param name="inputFile">Input file.</param>
        /// <exception cref="HLToolsUnsupportedFile"></exception>
        public void LoadFile(string inputFile)
        {
            Filename = inputFile;

            //Reset previous loaded data
            LumpsInfo.Clear();
            Close();

            fs        = new FileStream(inputFile, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
            binReader = new BinaryReader(fs);

            //First try get header ID
            header = new WADHeader
            {
                Id = binReader.ReadChars(4)
            };

            string magic = new string(header.Id);

            if (magic != System.Text.Encoding.ASCII.GetString(WadHeaderId)) //if invalid WAD file
            {
                Close();
                throw new HLToolsUnsupportedFile("Invalid or unsupported WAD File!");
            }

            header.LumpCount  = binReader.ReadUInt32();
            header.LumpOffset = binReader.ReadUInt32();

            //Load all lumps info
            LoadLumpsInfo();
        }
        /// <summary>
        /// Load basic lumps data.
        /// </summary>
        private void LoadLumpsInfo()
        {
            //Seek to first lump
            binReader.BaseStream.Seek(header.LumpOffset, SeekOrigin.Begin);

            //Iterate all lumps, insert every lump to array
            for (int i = 0; i < header.LumpCount; i++)
            {
                WADLump lump = new WADLump();
                lump.Offset           = binReader.ReadUInt32();
                lump.CompressedLength = binReader.ReadUInt32();
                lump.FullLength       = binReader.ReadUInt32();
                lump.Type             = binReader.ReadByte();
                lump.Compression      = binReader.ReadByte();
                //Padding, 2-bytes
                binReader.BaseStream.Seek(2, SeekOrigin.Current);
                lump.Name = GetNullTerminatedString(binReader.ReadChars(MaxNameLength));

                LumpsInfo.Add(lump);
            }
        }