internal DatFile(IFile source, DatSpecification specification, DatFileIndex index, bool lazyLoad = true) { _source = source; _spec = specification; _idx = index; if (!lazyLoad) { Load(); } }
public DatRow(ref Span <byte> rowData, ref Span <byte> data, DatSpecification specification, DatFileIndex index) { Underlying = new Dictionary <string, DatValue>(); var offset = 0; foreach (var field in specification.Fields) { var k = field.Key; var v = field.Value; object value; if (v.ClrType.IsReference) { int dataOffset; if (v.ClrType.IsList) { var elements = (int)rowData.Slice(offset, 4).To <uint>(); offset += 4; dataOffset = (int)rowData.Slice(offset, 4).To <uint>(); offset += 4; value = ReadList(v.ClrType.DefinedType, dataOffset, elements, ref data); } else { dataOffset = (int)rowData.Slice(offset, 4).To <uint>(); offset += 4; if (v.ClrType.DefinedType == typeof(string)) { if (dataOffset > data.Length) { continue; } var length = data.Slice(dataOffset).IndexOf(StringNullTerminator); if (length % 2 != 0) { length++; } value = data.Slice(dataOffset, length).ToUnicodeText(); } else { value = data.Slice(dataOffset, SizeTable[v.ClrType.DefinedType]) .To(v.ClrType.DefinedType); } } } else { var size = SizeTable[v.ClrType.DefinedType]; value = rowData.Slice(offset, size).To(v.ClrType.DefinedType); offset += size; } var datValue = new DatValue(v, value, index); Underlying.Add(k, datValue); } }