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); }
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); } }