private void LoadAreas() { OnProgress("Building world areas"); var areas = this._xmlRoot.SelectSingleNode("ns:Areas", this._xnm); if (areas == null) { throw new InvalidOperationException(); } XmlNodeList areaList = areas.SelectNodes("ns:Area", this._xnm); if (areaList == null) { throw new InvalidOperationException(); } this._playerStartStates.Clear(); this._tileDefinitionCollections.Clear(); this._randomMonsterDistributions.Clear(); this._randomFruitDistributions.Clear(); foreach (XmlElement area in areaList) { var areaRect = RectangleExtensions.GetRectangleFromDefinition(area); var startPos = (XmlElement)area.SelectSingleNode("ns:PlayerStartState", this._xnm); if (startPos != null) { var pss = PlayerStartState.FromXml(startPos); pss.Area = areaRect; this._playerStartStates.Add(pss); } var tileDefinitions = area.SelectNodes("ns:TileDefinitions/ns:*", this._xnm); if (tileDefinitions != null && tileDefinitions.Count != 0) { var td = TileDefinitionCollection.FromXml(tileDefinitions); td.Area = areaRect; this._tileDefinitionCollections.Add(td); } var fruitPopulation = (XmlElement)area.SelectSingleNode("ns:FruitDefinitions", this._xnm); if (fruitPopulation != null && fruitPopulation.ChildNodes.Count != 0) { var fd = RandomFruitDistribution.FromXml(fruitPopulation); fd.Area = areaRect; this._randomFruitDistributions.Add(fd); } var randomMonsterDistribution = (XmlElement)area.SelectSingleNode("ns:RandomMonsterDistribution", this._xnm); if (randomMonsterDistribution != null) { var md = RandomMonsterDistribution.FromXml(randomMonsterDistribution, this._xnm); md.Area = areaRect; this._randomMonsterDistributions.Add(md); } } }
public static TileDefinitionCollection FromXml(XmlNodeList tiledefs) { var result = new TileDefinitionCollection(); foreach (XmlElement tiledef in tiledefs) { string symbol = tiledef.GetAttribute("Symbol"); switch (tiledef.Name) { case "Wall": { string texture = tiledef.GetAttribute("Tile"); var td = new TileWallDefinition(symbol, texture); result.Add(td); break; } case "Floor": { string texture = tiledef.GetAttribute("Tile"); bool.TryParse(tiledef.GetAttribute("IsDefault"), out var isDefault); var td = new TileFloorDefinition(symbol, texture, isDefault); result.Add(td); break; } case "Object": { string description = tiledef.GetAttribute("Description"); var td = new TileObjectDefinition(symbol, description); result.Add(td); break; } } } var countOfDefaultFloorTiles = result._definitions.Values.OfType <TileFloorDefinition>().Count(item => item.IsDefault); if (countOfDefaultFloorTiles > 1) { throw new InvalidOperationException("More than one floor tile is marked as the default."); } if (countOfDefaultFloorTiles == 0 && result._definitions.Values.OfType <TileFloorDefinition>().Count() > 1) { throw new InvalidOperationException("There are more than one floor tiles, and none of them is marked as the default."); } return(result); }
public WorldArea(XmlElement area, XmlNamespaceManager xnm) { this.Area = RectangleExtensions.GetRectangleFromDefinition(area); string worldStart = area.GetAttribute("WorldStart"); this.IsInitialArea = !string.IsNullOrWhiteSpace(worldStart) && bool.Parse(worldStart); var startPos = (XmlElement)area.SelectSingleNode("ns:PlayerStartState", xnm); if (startPos != null) { var pss = PlayerStartState.FromXml(startPos); if (!this.Area.ContainsTile(pss.Position)) { throw new InvalidOperationException("Invalid player start position - co-ordinate is not within the area."); } this.PlayerStartState = pss; } var tileDefinitions = area.SelectNodes("ns:TileDefinitions/ns:*", xnm); if (tileDefinitions != null) { var td = TileDefinitionCollection.FromXml(tileDefinitions); td.Area = this.Area; this.TileDefinitionCollection = td; } var fruitPopulation = area.SelectNodes("ns:FruitDefinitions/ns:FruitDef", xnm); if (fruitPopulation != null) { var fd = RandomFruitDistribution.FromXml(fruitPopulation); fd.Area = this.Area; this.FruitDefinitions = fd; } var randomMonsterDistribution = (XmlElement)area.SelectSingleNode("ns:RandomMonsterDistribution", xnm); if (randomMonsterDistribution != null) { var md = RandomMonsterDistribution.FromXml(randomMonsterDistribution, xnm); md.Area = this.Area; this.RandomMonsterDistribution = md; } }