internal TextureArchiveRecord(TextureArchive archive, BinaryReader reader, ByteOrder order) : base(archive, "") { Offset = reader.ReadInt32(order); Size = reader.ReadInt32(order); if (Archive.Platform == DSPlatform.PS3) { int format = reader.ReadInt16(order); Id = reader.ReadInt16(order); Ps3Dimensions = new Vector2i(reader.ReadUInt16(order), reader.ReadUInt16(order)); switch (format) { case 0: Ps3Format = Glare.Graphics.Formats.DXT1; break; case 0x0500: Ps3Format = Glare.Graphics.Formats.DXT5; break; case 0x0900: Ps3Format = Glare.Graphics.Formats.Vector4nb; break; default: throw new NotSupportedException(string.Format("PS3 format 0x{0:X4} (dimensions {1}, data size {2}) is not known.", format, Ps3Dimensions, Size)); } Unknowns.ReadInt32s(reader, 1); reader.RequireZeroes(4); } else { Id = reader.ReadInt32(order); } Name = reader.ReadStringzAtUInt32(order, Alexandria.Engines.DarkSouls.Archive.ShiftJis); reader.RequireZeroes(4); }
internal ArchiveRecord(Archive archive, int index, BinaryReader reader, int recordHeaderSize) : base(archive, "") { archive.records.Add(this); Index = index; switch (archive.Variant) { case ArchiveVariant.V3: reader.Require(0x40); Size = reader.ReadInt32(); Offset = reader.ReadInt32(); Id = reader.ReadInt32(); Name = reader.ReadStringzAtUInt32(Archive.ShiftJis); int size2 = reader.ReadInt32(); if (Size != size2) throw new Exception(); fixedUncompressedSize = Size; break; case ArchiveVariant.V4: Compression = reader.ReadInt32(); // 2 or 3 - compression? reader.ReadMatch(-1); Size = reader.ReadInt64(); if (recordHeaderSize == 0x1C) { Offset = reader.ReadInt64(); Name = reader.ReadStringzAtUInt32(Archive.ShiftJis); } else { fixedUncompressedSize = reader.ReadInt64(); Offset = reader.ReadUInt32(); Unknowns.ReadInt32s(reader, 1); // 'Compression' = 2, Unknown = 0, Encoding = UTF8 Name = reader.ReadStringzAtUInt32(Archive.ShiftJis); } Id = DarkSouls.Archive.HashFilename(Name); break; case ArchiveVariant.V5: Id = reader.ReadInt32(); Size = reader.ReadInt32(); Offset = reader.ReadInt32(); reader.RequireZeroes(4); // NameOffset, but zero? string foundName; if (!Archive.KnownFiles.TryGetValue(Id, out foundName)) Name = string.Format("#{0:X}", Id); else Name = foundName; break; default: throw new NotImplementedException(); } MoveIntoPath(Name); }