コード例 #1
0
        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();
        }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
        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()
                        });
                    }
                });
            }
        }