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

StringArchive() private method

private StringArchive ( AssetManager manager, BinaryReader reader, string name, long length ) : System
manager AssetManager
reader System.IO.BinaryReader
name string
length long
return System
        internal StringArchive(AssetManager manager, BinaryReader reader, string name, long length)
            : base(manager, name)
        {
            ByteOrder = ByteOrder.LittleEndian;

            Encoding = Encoding.Unicode;
            if (reader is BigEndianBinaryReader)
                Encoding = Encoding.BigEndianUnicode;

            using (reader) {
                reader.Require(Magic1);

                int totalFileLength = reader.ReadInt32();
                if (totalFileLength != length) {
                    if (totalFileLength.ReverseBytes() == length) {
                        ByteOrder = ByteOrder.BigEndian;
                        Encoding = Encoding.BigEndianUnicode;
                    } else
                        throw new InvalidDataException();
                }

                int magic2 = reader.ReadInt32();
                if (magic2 != Magic2 && magic2 != Magic2BE)
                    throw new InvalidDataException();

                int groupCount = reader.ReadInt32(ByteOrder);
                int stringCount = reader.ReadInt32(ByteOrder);
                int stringOffset = reader.ReadInt32(ByteOrder);
                reader.RequireZeroes(4 * 1);

                for (int index = 0; index < groupCount; index++)
                    groups.Add(new StringGroup(reader, ByteOrder));

                int[] stringOffsets = reader.ReadArrayInt32(stringCount, ByteOrder);

                for (int index = 0; index < stringCount; index++) {
                    int offset = stringOffsets[index];

                    if (offset == 0)
                        strings.Add(null);
                    else {
                        reader.BaseStream.Position = offset;
                        string value = reader.ReadStringz(Encoding);
                        strings.Add(value);
                    }
                }

                foreach (StringGroup group in groups) {
                    for (int index = 0; index < group.StringCount; index++) {
                        int stringIndex = group.StringsIndex + index;
                        string stringValue = strings[stringIndex];
                        int realIndex = group.IndexStart + index;

                        if (stringValue != null)
                            stringsById[realIndex] = stringValue;
                    }
                }
            }
        }