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; }
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); } }
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(); }
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; }
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(); }
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 }
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; }
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);
public void SCVRField(BinaryFileReader r, int dataSize) => VariableName = r.ReadASCIIString((int)dataSize, ASCIIFormat.PossiblyNullTerminated);
public AI_AField(BinaryFileReader r, int dataSize) { Name = r.ReadASCIIString(32, ASCIIFormat.ZeroPadded); Unknown = r.ReadByte(); }
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); } }
public static FILEField ReadFILE(this BinaryFileReader r, int length, ASCIIFormat format = ASCIIFormat.PossiblyNullTerminated) => new FILEField { Value = r.ReadASCIIString(length, format) };
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);