private static ClassMember ReadClassMember(EndianBinaryReader reader, int level, string baseType, string baseName) { var varType = reader.ReadStringToNull(); var varName = reader.ReadStringToNull(); var size = reader.ReadInt32(); var index = reader.ReadInt32(); var isArray = reader.ReadInt32() != 0; var dummy = reader.ReadInt32(); var flags = reader.ReadInt32(); var childrenCount = reader.ReadInt32(); var children = new List <ClassMember>(); for (var i = 0; i < childrenCount; ++i) { var member = ReadClassMember(reader, level + 1, varType, varName); children.Add(member); } var classMember = new ClassMember(level, baseType, baseName, varType, varName, size, flags, children); return(classMember); }
private void ReadClassMember5(EndianBinaryReader reader, int fileFormatVersion, bool baseDefinitions) { var classID = reader.ReadInt32(); if (fileFormatVersion > 15) { reader.ReadByte(); var type1 = (int)reader.ReadInt16(); if (type1 >= 0) { type1 = -(1 + type1); } else { type1 = classID; } var classIDs = _classIDs ?? (_classIDs = new List <(int Type1, int Type2)>()); classIDs.Add((type1, classID)); if (classID == 114) { reader.Position += 16; } classID = type1; } else if (classID < 0) { reader.Position += 16; } reader.Position += 16; if (baseDefinitions) { var varCount = reader.ReadInt32(); var stringSize = reader.ReadInt32(); reader.Position += varCount * 24; var stringBlockData = reader.ReadBytes(stringSize); var classVars = new List <ClassMember>(); reader.Position -= varCount * 24 + stringSize; string baseName = null, baseType = null; int baseSize = 0, baseIndex = 0, baseFlags = 0; using (var stringBlockMemory = new MemoryStream(stringBlockData, false)) { using (var stringReader = new EndianBinaryReader(stringBlockMemory, Endian.BigEndian)) { for (var i = 0; i < varCount; ++i) { var dummy = reader.ReadInt16(); var level = reader.ReadByte(); var isArray = reader.ReadBoolean(); var varTypeIndex = reader.ReadUInt16(); var isUserDefinedName = reader.ReadUInt16(); string varTypeStr; if (isUserDefinedName == 0) { stringReader.Position = varTypeIndex; varTypeStr = stringReader.ReadStringToNull(); } else { varTypeStr = CommonStrings.ContainsKey(varTypeIndex) ? CommonStrings[varTypeIndex] : varTypeIndex.ToString(); } var varNameIndex = reader.ReadUInt16(); isUserDefinedName = reader.ReadUInt16(); string varNameStr; if (isUserDefinedName == 0) { stringReader.Position = varNameIndex; varNameStr = stringReader.ReadStringToNull(); } else { varNameStr = CommonStrings.ContainsKey(varNameIndex) ? CommonStrings[varNameIndex] : varNameIndex.ToString(); } var size = reader.ReadInt32(); var index = reader.ReadInt32(); var flags = reader.ReadInt32(); if (index == 0) { baseName = varNameStr; baseType = varTypeStr; baseSize = size; baseIndex = index; baseFlags = flags; } else { var member = new ClassMember(level - 1, baseType, baseName, varTypeStr, varNameStr, size, flags, null); classVars.Add(member); } } } } var baseMember = new ClassMember(0, string.Empty, string.Empty, baseType, baseName, baseSize, baseFlags, classVars); _objects[classID] = baseMember; reader.Position += stringSize; } }