/// <summary> /// Parses and XML document and initialises the class. /// </summary> /// <param name="xmlDocument">The XML Document to parse.</param> public void ParseXmlDocument(XmlDocument xmlDocument) { XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument); XmlSerializer xmlSerializer = new XmlSerializer(typeof(XmlLevelRules)); _xmlLevelRules = (XmlLevelRules)xmlSerializer.Deserialize(xmlNodeReader); }
/// <summary> /// Parses and XML document and initialises the class. /// </summary> /// <param name="xmlDocument">The XML Document to parse.</param> public void ParseXmlDocument(XmlDocument xmlDocument) { XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument); XmlSerializer xmlSerializer = new XmlSerializer(typeof (XmlLevelRules)); _xmlLevelRules = (XmlLevelRules) xmlSerializer.Deserialize(xmlNodeReader); }
/// <summary> /// Parses a level rules file bytes. /// </summary> /// <param name="fileBytes">The bytes of the level rules to parse.</param> public override void ParseFileBytes(byte[] fileBytes) { // sanity check if (fileBytes == null) { throw new ArgumentNullException("fileBytes", "File bytes cannot be null!"); } _xmlLevelRules = new XmlLevelRules(); int offset = 0; // file header checks UInt32 fileMagicWord = FileTools.ByteArrayToUInt32(fileBytes, ref offset); if (fileMagicWord != FileMagicWord) { throw new Exceptions.UnexpectedMagicWordException(); } UInt32 fileVersion = FileTools.ByteArrayToUInt32(fileBytes, ref offset); if (fileVersion != RequiredVersion) { throw new Exceptions.NotSupportedFileVersionException(); } // main file header _xmlLevelRules.FileHeader = FileTools.ByteArrayToStructure <LevelRulesHeader>(fileBytes, ref offset); LevelRulesHeader header = _xmlLevelRules.FileHeader; // static rules if (header.StaticRulesCount != 0 && header.StaticRulesFooterOffset != 0) { _xmlLevelRules.LevelRules = new LevelRule[header.StaticRulesCount]; int staticRulesFooterOffset = (int)header.StaticRulesFooterOffset; for (int i = 0; i < header.StaticRulesCount; i++) { int roomsCount = FileTools.ByteArrayToInt32(fileBytes, staticRulesFooterOffset); staticRulesFooterOffset += 8; int roomsOffset = FileTools.ByteArrayToInt32(fileBytes, staticRulesFooterOffset); staticRulesFooterOffset += 8; _xmlLevelRules.LevelRules[i] = new LevelRule { StaticRooms = FileTools.ByteArrayToArray <Room>(fileBytes, roomsOffset, roomsCount) }; offset += Marshal.SizeOf(typeof(Room)) * roomsCount + 16; _UpdateRoomsDesc(_xmlLevelRules.LevelRules[i].StaticRooms); } } else if (header.RandomRulesCount != 0 && header.RandomRulesFooterOffset != 0) { _xmlLevelRules.LevelRules = new LevelRule[header.RandomRulesCount]; // checked all files an no files have both static and random, so no chance of overwriting static above LevelRulesRandomFooter[] levelRulesFooters = FileTools.ByteArrayToArray <LevelRulesRandomFooter>(fileBytes, (int)header.RandomRulesFooterOffset, (int)header.RandomRulesCount); offset += Marshal.SizeOf(typeof(LevelRulesRandomFooter)) * (int)header.RandomRulesCount; for (int i = 0; i < header.RandomRulesCount; i++) { _xmlLevelRules.LevelRules[i] = new LevelRule { // get rule connector rooms ConnectorRooms = FileTools.ByteArrayToArray <Room>(fileBytes, (Int32)levelRulesFooters[i].ConnectorRuleOffset, (Int32)levelRulesFooters[i].ConnectorRoomCount), // then the actual level rules Rules = new Room[levelRulesFooters[i].RuleCount][] }; offset += Marshal.SizeOf(typeof(Room)) * (int)levelRulesFooters[i].ConnectorRoomCount; _UpdateRoomsDesc(_xmlLevelRules.LevelRules[i].ConnectorRooms); for (int j = 0; j < levelRulesFooters[i].RuleCount; j++) { _xmlLevelRules.LevelRules[i].Rules[j] = FileTools.ByteArrayToArray <Room>(fileBytes, (Int32)levelRulesFooters[i].RuleOffsets[j], levelRulesFooters[i].RoomCounts[j]); offset += Marshal.SizeOf(typeof(Room)) * levelRulesFooters[i].RoomCounts[j]; _UpdateRoomsDesc(_xmlLevelRules.LevelRules[i].Rules[j]); } } } // final debug check CT_Rule100 is corrupt or something - has extra bytes at end of it //Debug.Assert(offset == fileBytes.Length); }
/// <summary> /// Parses a level rules file bytes. /// </summary> /// <param name="fileBytes">The bytes of the level rules to parse.</param> public override void ParseFileBytes(byte[] fileBytes) { // sanity check if (fileBytes == null) throw new ArgumentNullException("fileBytes", "File bytes cannot be null!"); _xmlLevelRules = new XmlLevelRules(); int offset = 0; // file header checks UInt32 fileMagicWord = FileTools.ByteArrayToUInt32(fileBytes, ref offset); if (fileMagicWord != FileMagicWord) throw new Exceptions.UnexpectedMagicWordException(); UInt32 fileVersion = FileTools.ByteArrayToUInt32(fileBytes, ref offset); if (fileVersion != RequiredVersion) throw new Exceptions.NotSupportedFileVersionException(); // main file header _xmlLevelRules.FileHeader = FileTools.ByteArrayToStructure<LevelRulesHeader>(fileBytes, ref offset); LevelRulesHeader header = _xmlLevelRules.FileHeader; // static rules if (header.StaticRulesCount != 0 && header.StaticRulesFooterOffset != 0) { _xmlLevelRules.LevelRules = new LevelRule[header.StaticRulesCount]; int staticRulesFooterOffset = (int)header.StaticRulesFooterOffset; for (int i = 0; i < header.StaticRulesCount; i++) { int roomsCount = FileTools.ByteArrayToInt32(fileBytes, staticRulesFooterOffset); staticRulesFooterOffset += 8; int roomsOffset = FileTools.ByteArrayToInt32(fileBytes, staticRulesFooterOffset); staticRulesFooterOffset += 8; _xmlLevelRules.LevelRules[i] = new LevelRule { StaticRooms = FileTools.ByteArrayToArray<Room>(fileBytes, roomsOffset, roomsCount) }; offset += Marshal.SizeOf(typeof(Room)) * roomsCount + 16; _UpdateRoomsDesc(_xmlLevelRules.LevelRules[i].StaticRooms); } } else if (header.RandomRulesCount != 0 && header.RandomRulesFooterOffset != 0) { _xmlLevelRules.LevelRules = new LevelRule[header.RandomRulesCount]; // checked all files an no files have both static and random, so no chance of overwriting static above LevelRulesRandomFooter[] levelRulesFooters = FileTools.ByteArrayToArray<LevelRulesRandomFooter>(fileBytes, (int)header.RandomRulesFooterOffset, (int)header.RandomRulesCount); offset += Marshal.SizeOf(typeof(LevelRulesRandomFooter)) * (int)header.RandomRulesCount; for (int i = 0; i < header.RandomRulesCount; i++) { _xmlLevelRules.LevelRules[i] = new LevelRule { // get rule connector rooms ConnectorRooms = FileTools.ByteArrayToArray<Room>(fileBytes, (Int32)levelRulesFooters[i].ConnectorRuleOffset, (Int32)levelRulesFooters[i].ConnectorRoomCount), // then the actual level rules Rules = new Room[levelRulesFooters[i].RuleCount][] }; offset += Marshal.SizeOf(typeof(Room)) * (int)levelRulesFooters[i].ConnectorRoomCount; _UpdateRoomsDesc(_xmlLevelRules.LevelRules[i].ConnectorRooms); for (int j = 0; j < levelRulesFooters[i].RuleCount; j++) { _xmlLevelRules.LevelRules[i].Rules[j] = FileTools.ByteArrayToArray<Room>(fileBytes, (Int32)levelRulesFooters[i].RuleOffsets[j], levelRulesFooters[i].RoomCounts[j]); offset += Marshal.SizeOf(typeof(Room)) * levelRulesFooters[i].RoomCounts[j]; _UpdateRoomsDesc(_xmlLevelRules.LevelRules[i].Rules[j]); } } } // final debug check CT_Rule100 is corrupt or something - has extra bytes at end of it //Debug.Assert(offset == fileBytes.Length); }