Alexandria.Engines.DarkSouls.ArchiveRecord.ArchiveRecord C# (CSharp) Method

ArchiveRecord() private method

private ArchiveRecord ( Archive archive, int index, BinaryReader reader, int recordHeaderSize ) : System
archive Archive
index int
reader System.IO.BinaryReader
recordHeaderSize int
return System
        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);
        }