public override void Read(EndianBinaryReader reader, ISection section = null) { reader.PushBaseOffset(); int signature = reader.ReadInt32(); if (signature != 0x03505854) { reader.Endianness = Endianness = Endianness.BigEndian; signature = EndiannessSwapUtilities.Swap(signature); } if (signature != 0x03505854) { throw new InvalidDataException("Invalid signature (expected TXP with type 3)"); } int textureCount = reader.ReadInt32(); int textureCountWithRubbish = reader.ReadInt32(); Textures.Capacity = textureCount; for (int i = 0; i < textureCount; i++) { reader.ReadOffset(() => { Textures.Add(new Texture(reader)); }); } reader.PopBaseOffset(); }
public override void Read(EndianBinaryReader reader, ISection section = null) { var offsets = new List <long>(); // Try to determine endianness (apparently DT uses big endian string arrays) uint stringOffset = reader.ReadUInt32(); if (stringOffset >= reader.Length) { reader.Endianness = Endianness.BigEndian; stringOffset = EndiannessSwapUtilities.Swap(stringOffset); } Endianness = reader.Endianness; do { offsets.Add(stringOffset); stringOffset = reader.ReadUInt32(); } while (reader.Position < offsets[0] && stringOffset != 0); foreach (var offset in offsets) { reader.SeekBegin(offset); Strings.Add(reader.ReadString(StringBinaryFormat.NullTerminated)); } }
public override void Read(EndianBinaryReader reader, ISection section = null) { if (section != null) { ReadModern(); } else { ReadClassic(); } void ReadClassic() { var offsets = new List <long>(); // Try to determine endianness (apparently DT uses big endian string arrays) uint stringOffset = reader.ReadUInt32(); if (stringOffset >= reader.Length) { reader.Endianness = Endianness.BigEndian; stringOffset = EndiannessSwapUtilities.Swap(stringOffset); } Endianness = reader.Endianness; do { offsets.Add(stringOffset); stringOffset = reader.ReadUInt32(); } while (reader.Position < offsets[0] && stringOffset != 0); Strings.Capacity = offsets.Count; for (int i = 0; i < offsets.Count; i++) { long offset = offsets[i]; reader.SeekBegin(offset); string value = reader.ReadString(StringBinaryFormat.NullTerminated); if (!string.IsNullOrEmpty(value)) { Strings.Add(new StringEntry { Value = value, Id = i }); } } } void ReadModern() { int count = reader.ReadInt32(); reader.ReadOffset(() => { Strings.Capacity = count; for (int i = 0; i < count; i++) { Strings.Add(new StringEntry { Value = reader.ReadStringOffset(StringBinaryFormat.NullTerminated), Id = reader.ReadInt32() }); } }); } }