Esempio n. 1
0
            public int    Parameter2; // Parameter #2

            public CTDAField(BinaryFileReader r, int dataSize, GameFormat format)
            {
                if (format == GameFormat.TES3)
                {
                    Index           = r.ReadByte();
                    Type            = r.ReadByte();
                    FunctionId      = r.ReadASCIIString(2);
                    CompareOp       = (byte)(r.ReadByte() << 1);
                    Name            = r.ReadASCIIString(dataSize - 5);
                    ComparisonValue = Parameter1 = Parameter2 = 0;
                    return;
                }
                CompareOp = r.ReadByte();
                r.Skip(3); // Unused
                ComparisonValue = r.ReadSingle();
                FunctionId      = r.ReadASCIIString(4);
                Parameter1      = r.ReadInt32();
                Parameter2      = r.ReadInt32();
                if (dataSize != 24)
                {
                    r.Skip(4); // Unused
                }
                Index = Type = 0;
                Name  = null;
            }
Esempio n. 2
0
 public HEDRField(BinaryFileReader r, int dataSize)
 {
     Version         = r.ReadSingle();
     FileType        = r.ReadUInt32();
     CompanyName     = r.ReadASCIIString(32, ASCIIFormat.ZeroPadded);
     FileDescription = r.ReadASCIIString(256, ASCIIFormat.ZeroPadded);
     NumRecords      = r.ReadUInt32();
 }
        public BYTVField?XRGD;              // Ragdoll Data (optional)

        public override bool CreateField(BinaryFileReader r, GameFormat format, string type, int dataSize)
        {
            switch (type)
            {
            case "EDID": EDID = r.ReadSTRV(dataSize); return(true);

            case "NAME": NAME = new FMIDField <Record>(r, dataSize); return(true);

            case "DATA": DATA = new REFRRecord.DATAField(r, dataSize); return(true);

            case "XPCI": XPCI = new FMIDField <CELLRecord>(r, dataSize); return(true);

            case "FULL": XPCI.Value.AddName(r.ReadASCIIString(dataSize)); return(true);

            case "XLOD": XLOD = r.ReadBYTV(dataSize); return(true);

            case "XESP": XESP = new REFRRecord.XESPField(r, dataSize); return(true);

            case "XMRC": XMRC = new FMIDField <REFRRecord>(r, dataSize); return(true);

            case "XHRS": XHRS = new FMIDField <ACRERecord>(r, dataSize); return(true);

            case "XSCL": XSCL = r.ReadT <FLTVField>(dataSize); return(true);

            case "XRGD": XRGD = r.ReadBYTV(dataSize); return(true);

            default: return(false);
            }
        }
Esempio n. 4
0
 public AI_FField(BinaryFileReader r, int dataSize)
 {
     X        = r.ReadSingle();
     Y        = r.ReadSingle();
     Z        = r.ReadSingle();
     Duration = r.ReadInt16();
     Id       = r.ReadASCIIString(32, ASCIIFormat.ZeroPadded);
     Unknown  = r.ReadInt16();
 }
Esempio n. 5
0
 public SCHDField(BinaryFileReader r, int dataSize)
 {
     Name           = r.ReadASCIIString(32, ASCIIFormat.ZeroPadded);
     NumShorts      = r.ReadInt32();
     NumLongs       = r.ReadInt32();
     NumFloats      = r.ReadInt32();
     ScriptDataSize = r.ReadInt32();
     LocalVarSize   = r.ReadInt32();
     // SCVRField
     Variables = null;
 }
Esempio n. 6
0
        public FormId <Record> Item;      // The ID of the item

        public CNTOField(BinaryFileReader r, int dataSize, GameFormat format)
        {
            if (format == GameFormat.TES3)
            {
                ItemCount = r.ReadUInt32();
                Item      = new FormId <Record>(r.ReadASCIIString(32, ASCIIFormat.ZeroPadded));
                return;
            }
            Item      = new FormId <Record>(r.ReadUInt32());
            ItemCount = r.ReadUInt32();
        }
 public SCITField(BinaryFileReader r, int dataSize)
 {
     Name         = "Script Effect";
     ScriptFormId = r.ReadInt32();
     if (dataSize == 4)
     {
         return;
     }
     School       = r.ReadInt32();
     VisualEffect = r.ReadASCIIString(4);
     Flags        = dataSize > 12 ? r.ReadUInt32() : 0;
 }
 public EFITField(BinaryFileReader r, int dataSize, GameFormat format)
 {
     if (format == GameFormat.TES3)
     {
         EffectId     = r.ReadASCIIString(2);
         SkillId      = r.ReadByte();
         AttributeId  = r.ReadByte();
         Type         = r.ReadInt32();
         Area         = r.ReadInt32();
         Duration     = r.ReadInt32();
         MagnitudeMin = r.ReadInt32();
         MagnitudeMax = r.ReadInt32();
         return;
     }
     EffectId     = r.ReadASCIIString(4);
     MagnitudeMin = r.ReadInt32();
     Area         = r.ReadInt32();
     Duration     = r.ReadInt32();
     Type         = r.ReadInt32();
     ActorValue   = r.ReadInt32();
 }
Esempio n. 9
0
 public RDSDField(BinaryFileReader r, int dataSize, GameFormat format)
 {
     if (format == GameFormat.TES3)
     {
         Sound  = new FormId <SOUNRecord>(r.ReadASCIIString(32, ASCIIFormat.ZeroPadded));
         Flags  = 0;
         Chance = r.ReadByte();
         return;
     }
     Sound  = new FormId <SOUNRecord>(r.ReadUInt32());
     Flags  = r.ReadUInt32();
     Chance = r.ReadUInt32(); //: float with TES5
 }
Esempio n. 10
0
 public Header(RecordGroup group, BinaryFileReader r, GameFormat format)
 {
     Group          = group;
     HeaderPosition = r.Position;
     Type           = r.ReadASCIIString(4);
     if (Type == "GRUP")
     {
         DataSize  = (uint)(r.ReadUInt32() - (format == GameFormat.TES4 ? 20 : 24));
         Label     = RecordGroup.ToLabel(Group.Depth == 0, r.ReadBytes(4));
         GroupType = (HeaderGroupType)r.ReadInt32();
         r.ReadUInt32(); // stamp | stamp + uknown
         if (format != GameFormat.TES4)
         {
             r.ReadUInt32(); // version + uknown
         }
         Position = r.Position;
         return;
     }
     DataSize = r.ReadUInt32();
     if (format == GameFormat.TES3)
     {
         r.ReadUInt32(); // unknown
     }
     Flags = (HeaderFlags)r.ReadUInt32();
     if (format == GameFormat.TES3)
     {
         Position = r.Position;
         return;
     }
     // tes4
     FormId = r.ReadUInt32();
     r.ReadUInt32();
     if (format == GameFormat.TES4)
     {
         Position = r.Position;
         return;
     }
     // tes5
     r.ReadUInt32();
     Position = r.Position;
 }
Esempio n. 11
0
        public static DATVField ReadDATV(this BinaryFileReader r, int length, char type)
        {
            switch (type)
            {
            case 'b': return(new DATVField {
                    B = r.ReadInt32() != 0
                });

            case 'i': return(new DATVField {
                    I = r.ReadInt32()
                });

            case 'f': return(new DATVField {
                    F = r.ReadSingle()
                });

            case 's': return(new DATVField {
                    S = r.ReadASCIIString(length, ASCIIFormat.PossiblyNullTerminated)
                });

            default: throw new InvalidOperationException($"{type}");
            }
        }
 public void FULLField(BinaryFileReader r, int dataSize) => Name = r.ReadASCIIString(dataSize, ASCIIFormat.PossiblyNullTerminated);
Esempio n. 13
0
 public void SCVRField(BinaryFileReader r, int dataSize) => VariableName = r.ReadASCIIString((int)dataSize, ASCIIFormat.PossiblyNullTerminated);
Esempio n. 14
0
 public AI_AField(BinaryFileReader r, int dataSize)
 {
     Name    = r.ReadASCIIString(32, ASCIIFormat.ZeroPadded);
     Unknown = r.ReadByte();
 }
Esempio n. 15
0
        public static void ReadTerrain(BinaryFileReader r, Header header, RecordGroup group)
        {
            var world = int.Parse(header.Label);
            var data  = new Data
            {
                Width         = r.ReadUInt32(),
                Height        = r.ReadUInt32(),
                Name          = r.ReadASCIIString(0x80, ASCIIFormat.ZeroTerminated),
                WaterLevel    = r.ReadUInt32(),
                WaveAmplitude = r.ReadUInt32(),
                Flags         = r.ReadUInt32(),
            };
            var       chunkCount   = (int)r.ReadUInt32();
            var       widthHeight  = (int)(data.Width * data.Height);
            var       indices      = data.Indices = r.ReadTArray <ushort>(widthHeight << 1, widthHeight);
            var       chunks       = data.Chunks = new Chunk[chunkCount];
            const int POINT_STRIDE = 16;

            for (var i = 0; i < chunks.Length; i++)
            {
                var points = r.ReadTArray <uint>(POINT_STRIDE * POINT_STRIDE * 4, POINT_STRIDE * POINT_STRIDE);
                chunks[i] = new Chunk
                {
                    VHGT  = points.Select(x => (ushort)(x & 0xFFF)).ToArray(),
                    VTEXF = points.Select(x => (byte)((x >> 16) & 0x1F)).ToArray(),
                    VTEX  = points.Select(x => (ushort)((x >> 22) & 0x3FF)).ToArray(), //: sky, >> 21?
                };
            }
            group.Tag = data;

            // transform
            //const int LAND_STRIDE = 64;
            //var records = new List<Record>();
            //var VHGTs = new Dictionary<int, ushort[]>();
            //for (var i = 0; i < POINT_STRIDE; i++)
            //    VHGTs.Add(i, Enumerable.Repeat((ushort)(i * 10), POINT_STRIDE * POINT_STRIDE).ToArray());
            //for (var y = 0; y < data.Height; y += 4)
            //    for (var x = 0; x < data.Width; x += 4)
            //    {
            //        var vhgt = new ushort[LAND_STRIDE * LAND_STRIDE];
            //        var vtex = new ushort[LAND_STRIDE * LAND_STRIDE];
            //        var vtexf = new byte[LAND_STRIDE * LAND_STRIDE];
            //        for (var sy = 0; sy < 4; sy++)
            //            for (var sx = 0; sx < 4; sx++)
            //            {
            //                var offset = ((sx * POINT_STRIDE) + (sy * POINT_STRIDE * LAND_STRIDE)) << 1;
            //                for (var i = 0; i < POINT_STRIDE; i++)
            //                {
            //                    Buffer.BlockCopy(VHGTs[i], i * POINT_STRIDE << 1, vhgt, offset + (i * LAND_STRIDE << 1), POINT_STRIDE << 1);
            //                }
            //            }
            //        records.Add(new LANDRecord
            //        {
            //            VHGT = vhgt,
            //            VTEX = vtex,
            //            VTEXF = vtexf,
            //            GridId = new Vector3Int(x / 4, y / 4, world),
            //        });
            //    }

            // transform
            const int LAND_STRIDE = 64;
            var       records     = new List <Record>();

            for (var y = 0; y < data.Height; y += 4)
            {
                for (var x = 0; x < data.Width; x += 4)
                {
                    var vhgt  = new ushort[LAND_STRIDE * LAND_STRIDE];
                    var vtex  = new ushort[LAND_STRIDE * LAND_STRIDE];
                    var vtexf = new byte[LAND_STRIDE * LAND_STRIDE];
                    for (var sy = 0; sy < 4; sy++)
                    {
                        for (var sx = 0; sx < 4; sx++)
                        {
                            var index = indices[x + sx + ((y + sy) * data.Width)];
                            if (index >= chunks.Length)
                            {
                                continue;
                            }
                            var chunk  = chunks[index];
                            var offset = ((sx * POINT_STRIDE) + (sy * POINT_STRIDE * LAND_STRIDE)) << 1;
                            for (var i = 0; i < POINT_STRIDE; i++)
                            {
                                Buffer.BlockCopy(chunk.VHGT, i * POINT_STRIDE << 1, vhgt, offset + (i * LAND_STRIDE << 1), POINT_STRIDE << 1);
                                Buffer.BlockCopy(chunk.VTEX, i * POINT_STRIDE << 1, vtex, offset + (i * LAND_STRIDE << 1), POINT_STRIDE << 1);
                                //Buffer.BlockCopy(chunk.VTEXF, i * POINT_STRIDE, vtexf, offset + (i * LAND_STRIDE), POINT_STRIDE);
                            }
                        }
                    }
                    records.Add(new LANDRecord
                    {
                        VHGT   = vhgt,
                        VTEX   = vtex,
                        VTEXF  = vtexf,
                        GridId = new Vector3Int(x / 4, y / 4, world),
                    });
                }
            }

            // insert
            group.LANDsById = records.ToDictionary(x => ((LANDRecord)x).GridId, x => (LANDRecord)x);
            group.Records.AddRange(records);
        }
        public override bool CreateField(BinaryFileReader r, GameFormat format, string type, int dataSize)
        {
            switch (type)
            {
            case "EDID": EDID = r.ReadSTRV(dataSize); return(true);

            case "NAME": NAME = new FMIDField <Record>(r, dataSize); return(true);

            case "XTEL": XTEL = new XTELField(r, dataSize); return(true);

            case "DATA": DATA = new DATAField(r, dataSize); return(true);

            case "XLOC": XLOC = new XLOCField(r, dataSize); return(true);

            case "XOWN": if (XOWNs == null)
                {
                    XOWNs = new List <CELLRecord.XOWNGroup>();
                }
                XOWNs.Add(new CELLRecord.XOWNGroup {
                    XOWN = new FMIDField <Record>(r, dataSize)
                }); return(true);

            case "XRNK": XOWNs.Last().XRNK = r.ReadT <IN32Field>(dataSize); return(true);

            case "XGLB": XOWNs.Last().XGLB = new FMIDField <Record>(r, dataSize); return(true);

            case "XESP": XESP = new XESPField(r, dataSize); return(true);

            case "XTRG": XTRG = new FMIDField <Record>(r, dataSize); return(true);

            case "XSED": XSED = new XSEDField(r, dataSize); return(true);

            case "XLOD": XLOD = r.ReadBYTV(dataSize); return(true);

            case "XCHG": XCHG = r.ReadT <FLTVField>(dataSize); return(true);

            case "XHLT": XCHG = r.ReadT <FLTVField>(dataSize); return(true);

            case "XPCI": XPCI = new FMIDField <CELLRecord>(r, dataSize); _nextFull = 1; return(true);

            case "FULL":
                if (_nextFull == 1)
                {
                    XPCI.Value.AddName(r.ReadASCIIString(dataSize));
                }
                else if (_nextFull == 2)
                {
                    XMRKs.Last().FULL = r.ReadSTRV(dataSize);
                }
                _nextFull = 0;
                return(true);

            case "XLCM": XLCM = r.ReadT <IN32Field>(dataSize); return(true);

            case "XRTM": XRTM = new FMIDField <REFRRecord>(r, dataSize); return(true);

            case "XACT": XACT = r.ReadT <UI32Field>(dataSize); return(true);

            case "XCNT": XCNT = r.ReadT <IN32Field>(dataSize); return(true);

            case "XMRK": if (XMRKs == null)
                {
                    XMRKs = new List <XMRKGroup>();
                }
                XMRKs.Add(new XMRKGroup()); _nextFull = 2; return(true);

            case "FNAM": XMRKs.Last().FNAM = r.ReadT <BYTEField>(dataSize); return(true);

            case "TNAM": XMRKs.Last().TNAM = r.ReadT <BYTEField>(dataSize); r.ReadByte(); return(true);

            case "ONAM": return(true);

            case "XRGD": XRGD = r.ReadBYTV(dataSize); return(true);

            case "XSCL": XSCL = r.ReadT <FLTVField>(dataSize); return(true);

            case "XSOL": XSOL = r.ReadT <BYTEField>(dataSize); return(true);

            default: return(false);
            }
        }
Esempio n. 17
0
 public static FILEField ReadFILE(this BinaryFileReader r, int length, ASCIIFormat format = ASCIIFormat.PossiblyNullTerminated) => new FILEField
 {
     Value = r.ReadASCIIString(length, format)
 };
Esempio n. 18
0
 public FieldHeader(BinaryFileReader r, GameFormat format)
 {
     Type     = r.ReadASCIIString(4);
     DataSize = (int)(format == GameFormat.TES3 ? r.ReadUInt32() : r.ReadUInt16());
 }
 public void NAM1Field(BinaryFileReader r, int dataSize) => ResponseText = r.ReadASCIIString(dataSize, ASCIIFormat.PossiblyNullTerminated);
 public void NAM2Field(BinaryFileReader r, int dataSize) => ActorNotes   = r.ReadASCIIString(dataSize, ASCIIFormat.PossiblyNullTerminated);