public readonly int OffsetToResourceList; //32 bit from beginning of file, see figure above //const int ReservedSize = 116; public ErfHeader(LatinBinaryReader br) { var pos = br.Stream.Position; br.Stream.Position = 0; var fileType = new string(br.ReadChars(TypeLength)); if (fileType == "ERF " || fileType == "MOD " || fileType == "SAV " || fileType == "HAK ") { //Version = new string(br.ReadChars(VersionLength)); br.ReadChars(VersionLength); LanguageCount = br.ReadInt32(); //LocalizedStringSize = br.ReadInt32(); br.ReadInt32(); EntryCount = br.ReadInt32(); OffsetToLocalizedString = br.ReadInt32(); OffsetToKeyList = br.ReadInt32(); OffsetToResourceList = br.ReadInt32(); //BuildYear = br.ReadInt32(); //BuildDay = br.ReadInt32(); //DescriptionStrRef = br.ReadInt32(); //Reserved = br.ReadBytes(ReservedSize); } else { throw new ApplicationException("Le fichier n'est pas un fichier ERF valide."); } br.Stream.Position = pos; }
public void Load(string path) { if (File.Exists(path)) { if (Path.GetExtension(path) == Ext) { var lBf = new List <BiffFile>(); var br = new LatinBinaryReader(File.OpenRead(path)); var kh = new KeyHeader(br); br.Stream.Position = kh.OffsetToFileTable; for (var i = 0; i < kh.BiffCount; i++) { br.Stream.Seek(sizeof(uint), SeekOrigin.Current); var nameOffset = br.ReadUInt32(); var nameSize = br.ReadUInt16(); br.Stream.Seek(sizeof(ushort), SeekOrigin.Current); var pos = br.Stream.Position; br.Stream.Position = nameOffset; var name = new string(br.ReadChars(nameSize)).TrimEnd('\0').ToLower(); br.Stream.Position = pos; lBf.Add(new BiffFile(Path.GetDirectoryName(path) + "/" + name)); } br.Stream.Position = kh.OffsetToKeyTable; for (var i = 0; i < kh.KeyCount; i++) { var resref = new ResRef(br.ReadChars(ResRef.Length)); br.Stream.Seek(sizeof(ushort), SeekOrigin.Current); var rawid = br.ReadUInt32(); var biffId = (int)(rawid >> BitShift); var resId = (int)(rawid - (biffId << BitShift)); var res = lBf[biffId][resId]; Add(new ContentObject(lBf[biffId].FilePath, resref, res.ResType, res.Offset, res.Size)); } } else { throw new ApplicationException("Le fichier n'est pas un fichier .key valide."); } } else { throw new ApplicationException("Le fichier n'existe pas."); } }
public void Load(LatinBinaryReader br) { var pos = br.Stream.Position; br.Stream.Position = 0; Type = new string(br.ReadChars(FileTypeSize)).Trim(); Version = new string(br.ReadChars(FileVersionSize)).Trim(); var q = br.GetUInt32Queue(DwordTableSize); var i = 0; while (q.Count > 0) { Infos[i++] = q.Dequeue(); } br.Stream.Position = pos; }
public void Load(string path) { var br = new LatinBinaryReader(File.OpenRead(path)); var h = new ErfHeader(br); _lDesc = new Dictionary <uint, string>(); var keys = new List <ErfKeyFrame>(); var values = new List <ErfResFrame>(); br.Stream.Position = h.OffsetToLocalizedString; for (var i = 0; i < h.LanguageCount; i++) { var langId = br.ReadUInt32(); var strSize = br.ReadUInt32(); var str = new string(br.ReadChars((int)strSize)).TrimEnd('\0'); _lDesc.Add(langId, str); } br.Stream.Position = h.OffsetToKeyList; for (var i = 0; i < h.EntryCount; i++) { var resref = new ResRef(br.ReadChars(ResRef.Length)); br.ReadUInt32(); // ResId var restype = (ResType)br.ReadUInt16(); br.ReadUInt16(); // Unused keys.Add(new ErfKeyFrame(resref, restype)); } br.Stream.Position = h.OffsetToResourceList; for (var i = 0; i < h.EntryCount; i++) { values.Add(new ErfResFrame(br.ReadUInt32(), br.ReadUInt32())); } for (var i = 0; i < h.EntryCount; i++) { Add(new ContentObject(path, keys[i].ResRef, keys[i].ResType, values[i].OffsetToResource, values[i].ResourceSize)); } }
private void LoadLabels() { var pos = _br.Stream.Position; _br.Stream.Position = _gb.Header.LabelOffset; for (var i = 0; i < _gb.Header.LabelCount; i++) { var lbl = new string(_br.ReadChars(GffConst.LabelLength)); lbl = lbl.TrimEnd(GffConst.LabelPaddingCharacter); _gb.LabelArray.Add(lbl); } _br.Stream.Position = pos; }
public void Parse(GffField fld) { if (fld.Type != GffType.CExoLocString) { throw new ApplicationException("Impossible de parser ce type " + Enum.GetName(typeof(GffType), fld.Type) + " en ExoLocString."); } var br = new LatinBinaryReader(new MemoryStream(fld.Bytes)); _strref = (int)br.ReadUInt32(); var strcount = br.ReadUInt32(); _dic = new Dictionary <int, string>((int)strcount); for (var i = 0; i < strcount; i++) { var id = br.ReadInt32(); var size = br.ReadInt32(); _dic.Add(id, new string(br.ReadChars(size))); } }