Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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.");
            }
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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));
            }
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        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)));
            }
        }