示例#1
0
        private uint GetFieldDataOrOffset(GffField f)
        {
            if (GffComponent.IsSimple(f.Type))
            {
                var lB = f.Bytes;
                if (lB.Length < 4)
                {
                    Array.Resize(ref lB, 4);
                }
                return(BitConverter.ToUInt32(lB, 0));
            }
            var br  = new LatinBinaryWriter(_gb.FieldDataBlock);
            var pos = _gb.FieldDataBlock.Position;

            switch (f.Type)
            {
            case GffType.ResRef:
                br.Write((byte)f.Bytes.Length);
                break;

            case GffType.CExoString:
            case GffType.CExoLocString:
            case GffType.Void:
                br.Write((uint)f.Bytes.Length);
                break;
            }
            br.Write(f.Bytes);
            return((uint)pos);
        }
示例#2
0
        public MemoryStream Save(GffRootStruct root)
        {
            _bw  = new LatinBinaryWriter(new MemoryStream());
            _rt  = root;
            _ext = root.Extention;
            DfaF = new DoubleDictionary <GffFieldFrame, GffComponent>();
            DsaS = new DoubleDictionary <GffStructFrame, GffStruct>();

            CreateFrames(_rt);
            FillFrames();
            WriteData();

            var res = _bw.BaseStream;

            _bw.Close();
            return((MemoryStream)res);
        }
示例#3
0
        private uint GetListDataOrOffset(ICollection <GffComponent> lst)
        {
            var br  = new LatinBinaryWriter(_gb.ListIndicesArray);
            var pos = _gb.ListIndicesArray.Position;

            br.Write((uint)lst.Count);
            foreach (var cpnt in lst)
            {
                if (cpnt is GffInListStruct)
                {
                    br.Write(_gb.StructArray.IndexOf(DsaS[cpnt as GffInListStruct]));
                }
                else
                {
                    throw new CompositeException(ErrorLabels.AddWrongStructureClassToList);
                }
            }
            return((uint)pos);
        }
示例#4
0
        private uint GetStructDataOrOffset(IList <GffComponent> vs)
        {
            switch (vs.Count)
            {
            case 0:
                return(uint.MaxValue);

            case 1:
                return((uint)_gb.FieldArray.IndexOf(DfaF[vs[0]]));

            default:
            {
                var br  = new LatinBinaryWriter(_gb.FieldIndicesArray);
                var pos = _gb.FieldIndicesArray.Position;
                foreach (var cpnt in vs)
                {
                    br.Write(_gb.FieldArray.IndexOf(DfaF[cpnt]));
                }
                return((uint)pos);
            }
            }
        }