Represents a decompresser that can decompress files in a FAR3 archive. If you have some kind of need to understand this code, go to: http://wiki.niotso.org/RefPack The code in this class was ported from DBPF4J: http://sc4dbpf4j.cvs.sourceforge.net/viewvc/sc4dbpf4j/DBPF4J/
コード例 #1
0
ファイル: FAR3Archive.cs プロジェクト: jwofles/ForkSO
        /// <summary>
        /// Gets an entry's data from a Far3Entry instance.
        /// </summary>
        /// <param name="Entry">The Far3Entry instance.</param>
        /// <returns>The entry's data.</returns>
        public byte[] GetEntry(Far3Entry Entry)
        {
            lock (m_Reader)
            {
                m_Reader.BaseStream.Seek((long)Entry.DataOffset, SeekOrigin.Begin);

                isReadingSomething = true;

                if (Entry.IsCompressed == 0x01)
                {
                    m_Reader.ReadBytes(9);
                    uint   Filesize      = m_Reader.ReadUInt32();
                    ushort CompressionID = m_Reader.ReadUInt16();

                    if (CompressionID == 0xFB10)
                    {
                        byte[] Dummy            = m_Reader.ReadBytes(3);
                        uint   DecompressedSize = (uint)((Dummy[0] << 0x10) | (Dummy[1] << 0x08) | +Dummy[2]);

                        Decompresser Dec = new Decompresser();
                        Dec.CompressedSize   = Filesize;
                        Dec.DecompressedSize = DecompressedSize;

                        byte[] DecompressedData = Dec.Decompress(m_Reader.ReadBytes((int)Filesize));
                        //m_Reader.Close();

                        isReadingSomething = false;

                        return(DecompressedData);
                    }
                    else
                    {
                        m_Reader.BaseStream.Seek((m_Reader.BaseStream.Position - 15), SeekOrigin.Begin);

                        byte[] Data = m_Reader.ReadBytes((int)Entry.DecompressedFileSize);
                        //m_Reader.Close();

                        isReadingSomething = false;

                        return(Data);
                    }
                }
                else
                {
                    byte[] Data = m_Reader.ReadBytes((int)Entry.DecompressedFileSize);
                    //m_Reader.Close();

                    isReadingSomething = false;

                    return(Data);
                }
            }

            throw new FAR3Exception("FAR3Entry didn't exist in archive - FAR3Archive.GetEntry()");
        }
コード例 #2
0
ファイル: Tuning.cs プロジェクト: Daribon/FreeSO
        private void Create(BinaryReader Reader)
        {
            byte BodyType = m_Reader.ReadByte();

            if (BodyType != 0x01 && BodyType != 0x03)
                throw (new Exception("Tuning.cs: Unknown Persist BodyType!"));

            uint DecompressedSize = m_Reader.ReadUInt32();
            uint CompressedSize = m_Reader.ReadUInt32();

            //This is ALSO decompressed size...
            uint StreamBodySize = m_Reader.ReadUInt32();
            //Note: wiki.niotso.org says this is actually one byte Compressor and four bytes CompressionParameters.
            ushort CompressionID = m_Reader.ReadUInt16();

            if (CompressionID != 0xFB10)
                throw (new Exception("Tuning.cs: Unknown CompressionID!"));

            byte[] Dummy = m_Reader.ReadBytes(3);
            //Why are there 11 bytes of decompressed size at the start of a COMPRESSION format? #wtfmaxis
            uint DecompressedSize2 = (uint)((Dummy[0] << 0x10) | (Dummy[1] << 0x08) | +Dummy[2]);

            Decompresser Dec = new Decompresser();
            Dec.CompressedSize = CompressedSize;
            Dec.DecompressedSize = DecompressedSize;

            var decompressedData = Dec.Decompress(m_Reader.ReadBytes((int)CompressedSize));

            if (decompressedData == null)
                throw (new Exception("Tuning.cs: Decompression failed!"));

            m_Reader = new BinaryReader(new MemoryStream(decompressedData));

            EntryCount = m_Reader.ReadUInt32();

            for (int i = 0; i < EntryCount; i++)
            {
                TuningEntry Entry = new TuningEntry();
                Entry.EntryName = DecodeString(m_Reader);
                Entry.KeyValueCount = m_Reader.ReadUInt32();
                Entry.KeyValues = new ConcurrentDictionary<string, string>();

                for (int j = 0; j < Entry.KeyValueCount; j++)
                {
                    string Key = DecodeString(m_Reader);
                    string Val = DecodeString(m_Reader);

                    Entry.KeyValues.TryAdd(Key, Val);
                }
                Entries.Add(Entry);
            }
        }
コード例 #3
0
ファイル: FAR3Archive.cs プロジェクト: RHY3756547/FreeSO
        /// <summary>
        /// Gets an entry's data from a Far3Entry instance.
        /// </summary>
        /// <param name="Entry">The Far3Entry instance.</param>
        /// <returns>The entry's data.</returns>
        public byte[] GetEntry(Far3Entry Entry)
        {
            lock (m_Reader)
            {
                m_Reader.BaseStream.Seek((long)Entry.DataOffset, SeekOrigin.Begin);

                isReadingSomething = true;

                if (Entry.IsCompressed == 0x01)
                {
                    m_Reader.ReadBytes(9);
                    uint Filesize = m_Reader.ReadUInt32();
                    ushort CompressionID = m_Reader.ReadUInt16();

                    if (CompressionID == 0xFB10)
                    {
                        byte[] Dummy = m_Reader.ReadBytes(3);
                        uint DecompressedSize = (uint)((Dummy[0] << 0x10) | (Dummy[1] << 0x08) | +Dummy[2]);

                        Decompresser Dec = new Decompresser();
                        Dec.CompressedSize = Filesize;
                        Dec.DecompressedSize = DecompressedSize;

                        byte[] DecompressedData = Dec.Decompress(m_Reader.ReadBytes((int)Filesize));
                        //m_Reader.Close();

                        isReadingSomething = false;

                        return DecompressedData;
                    }
                    else
                    {
                        m_Reader.BaseStream.Seek((m_Reader.BaseStream.Position - 15), SeekOrigin.Begin);

                        byte[] Data = m_Reader.ReadBytes((int)Entry.DecompressedFileSize);
                        //m_Reader.Close();

                        isReadingSomething = false;

                        return Data;
                    }
                }
                else
                {
                    byte[] Data = m_Reader.ReadBytes((int)Entry.DecompressedFileSize);
                    //m_Reader.Close();

                    isReadingSomething = false;

                    return Data;
                }
            }

            throw new FAR3Exception("FAR3Entry didn't exist in archive - FAR3Archive.GetEntry()");
        }
コード例 #4
0
ファイル: FAR3Archive.cs プロジェクト: HarryFreeMyLand/newso
        /// <summary>
        /// Gets an entry's data from a Far3Entry instance.
        /// </summary>
        /// <param name="Entry">The Far3Entry instance.</param>
        /// <returns>The entry's data.</returns>
        public byte[] GetEntry(Far3Entry Entry)
        {
            lock (m_Reader)
            {
                m_Reader.BaseStream.Seek((long)Entry.DataOffset, SeekOrigin.Begin);

                isReadingSomething = true;

                if (Entry.IsCompressed == 0x01)
                {
                    m_Reader.ReadBytes(9);
                    uint   Filesize      = m_Reader.ReadUInt32();
                    ushort CompressionID = m_Reader.ReadUInt16();

                    if (CompressionID == 0xFB10)
                    {
                        byte[] Dummy            = m_Reader.ReadBytes(3);
                        uint   DecompressedSize = (uint)((Dummy[0] << 0x10) | (Dummy[1] << 0x08) | +Dummy[2]);

                        var Dec = new Decompresser();
                        Dec.CompressedSize   = Filesize;
                        Dec.DecompressedSize = DecompressedSize;

                        byte[] DecompressedData = Dec.Decompress(m_Reader.ReadBytes((int)Filesize));
                        //m_Reader.Close();

                        isReadingSomething = false;

                        return(DecompressedData);
                    }
                    else
                    {
                        m_Reader.BaseStream.Seek((m_Reader.BaseStream.Position - 15), SeekOrigin.Begin);

                        byte[] Data = m_Reader.ReadBytes((int)Entry.DecompressedFileSize);
                        //m_Reader.Close();

                        isReadingSomething = false;

                        return(Data);
                    }
                }
                //if the file needs to use an override, load it from gamedata instead.
                if (Entry.IsOverride)
                {
                    BinaryReader binaryReader = new BinaryReader((Stream)File.Open("gamedata/skins/" + Entry.Filename, FileMode.Open, FileAccess.Read, FileShare.Read));
                    byte[]       Data         = binaryReader.ReadBytes((int)Entry.DecompressedFileSize);
                    binaryReader.Close();

                    //done
                    isReadingSomething             = false;
                    FAR3Archive.isReadingSomething = false;

                    return(Data);
                }
                else
                {
                    byte[] Data = m_Reader.ReadBytes((int)Entry.DecompressedFileSize);
                    //m_Reader.Close();

                    isReadingSomething = false;

                    return(Data);
                }
            }

            throw new FAR3Exception("FAR3Entry didn't exist in archive - FAR3Archive.GetEntry()");
        }