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);
}