예제 #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);
                }
            }
        }
 public void Add([NotNull] PlayerStartState pss)
 {
     if (pss == null)
     {
         throw new ArgumentNullException(nameof(pss));
     }
     this.StartStates.Add(pss.Id, pss);
 }
예제 #3
0
        public static PlayerStartState FromXml(XmlElement startPos)
        {
            int id = int.Parse(startPos.GetAttribute("Id"));

            string worldStart    = startPos.GetAttribute("WorldStart");
            var    isInitialArea = !string.IsNullOrWhiteSpace(worldStart) && XmlConvert.ToBoolean(worldStart);

            int x  = int.Parse(startPos.GetAttribute("Left"));
            int y  = int.Parse(startPos.GetAttribute("Top"));
            var tp = new TilePos(x, y);

            var e      = int.Parse(startPos.GetAttribute("Energy"));
            var result = new PlayerStartState(id, isInitialArea, tp, e);

            return(result);
        }
예제 #4
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;
            }
        }
 public bool TryGetStartState(TilePos tp, out PlayerStartState pss)
 {
     pss = this.StartStates.Values.SingleOrDefault(item => item.Area.ContainsTile(tp));
     return(pss != null);
 }