Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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;
            }
        }