Пример #1
0
        public static HakHeader Read(string filename)
        {
            HakHeader    ret  = new HakHeader();
            BinaryReader read = new BinaryReader(File.OpenRead(filename));

            ret.Header            = coder.GetString(read.ReadBytes(8));
            ret.StringCount       = read.ReadInt32();
            ret.StringTableSize   = read.ReadInt32();
            ret.EntryCount        = read.ReadInt32();
            ret.OffsetToString    = read.ReadInt32();
            ret.OffsetToKeyList   = read.ReadInt32();
            ret.OffsetToResources = read.ReadInt32();
            ret.BuildYear         = read.ReadInt32();
            ret.BuildDay          = read.ReadInt32();
            ret.DescriptionIndex  = read.ReadInt32();
            ret.Reserved          = read.ReadBytes(116);

            return(ret);
        }
Пример #2
0
        public override void Compile()
        {
            HakHeader          header     = new HakHeader();
            List <HakKeyEntry> keys       = new List <HakKeyEntry>();
            List <HakResEntry> resEntries = new List <HakResEntry>();
            List <Byte[]>      resources  = new List <byte[]>();

            foreach (KeyValuePair <string, CTArtifact> pair in m_afx)
            {
                if (!File.Exists(pair.Value.Path))
                {
                    continue;
                }

                HakKeyEntry key = new HakKeyEntry();
                key.ResID    = keys.Count;
                key.Resref   = pair.Key;
                key.ResType  = pair.Value.ErfID;
                key.Reserved = 0;
                keys.Add(key);

                byte[] resVal = File.ReadAllBytes(pair.Value.Path);
                resources.Add(resVal);

                HakResEntry res = new HakResEntry();
                res.ResourceSize = resVal.Length;
                resEntries.Add(res);
            }

            try
            {
                if (File.Exists(Path))
                {
                    File.Delete(Path);
                }
                BinaryWriter writer = new BinaryWriter(File.OpenWrite(Path));

                header.Header            = "HAK V1.1";
                header.StringTableSize   = 0;
                header.StringCount       = 0;
                header.EntryCount        = keys.Count;
                header.OffsetToString    = HakHeader.Size;
                header.OffsetToKeyList   = HakHeader.Size;
                header.OffsetToResources = HakHeader.Size + (keys.Count * HakKeyEntry.Size);
                header.BuildYear         = DateTime.Now.Year - 1900;
                header.BuildDay          = DateTime.Now.Day;
                header.DescriptionIndex  = 0;

                header.Write(writer);
                foreach (var key in keys)
                {
                    key.Write(writer);
                }

                int ResourceOffset = header.OffsetToResources + (resEntries.Count * HakResEntry.Size);
                for (int i = 0; i < resEntries.Count; ++i)
                {
                    resEntries[i].OffsetToResource = ResourceOffset;
                    resEntries[i].Write(writer);
                    ResourceOffset += resEntries[i].ResourceSize;
                }

                for (int i = 0; i < resources.Count; ++i)
                {
                    writer.Write(resources[i]);
                }

                writer.Flush();
            }
            catch (Exception)
            {
                CTDebug.Error("Could not save {0}. Make sure the file is not in use.", Path);
            }
        }