示例#1
0
        private static void ApplyNewBehaviours(ref MonsterDef result, XmlElement apply, XmlNamespaceManager namespaceManager)
        {
            var mobilityAfterInjury = (XmlElement)apply.SelectSingleNode("ns:" + nameof(result.MobilityAfterInjury), namespaceManager);

            if (mobilityAfterInjury != null)
            {
                result.MobilityAfterInjury = Setting <MonsterMobility> .NewSetting((MonsterMobility)Enum.Parse(typeof(MonsterMobility), mobilityAfterInjury.GetAttribute("value")));
            }

            var changeRoomsAfterInjury = (XmlElement)apply.SelectSingleNode("ns:" + nameof(ChangeRoomsAfterInjury), namespaceManager);

            if (changeRoomsAfterInjury != null)
            {
                result.ChangeRoomsAfterInjury = Setting <ChangeRooms> .NewSetting((ChangeRooms)Enum.Parse(typeof(ChangeRooms), changeRoomsAfterInjury.GetAttribute("value")));
            }

            var isEgg = (XmlElement)apply.SelectSingleNode("ns:" + nameof(result.IsEgg), namespaceManager);

            if (isEgg != null)
            {
                result.IsEgg = true;
                result.TimeBeforeHatching  = int.Parse(isEgg.GetAttribute(nameof(TimeBeforeHatching)));
                result.TimeBeforeHatching |= 1; // not sure why the original game does this...
            }

            var laysEggs = (XmlElement)apply.SelectSingleNode("ns:" + nameof(result.LaysEggs), namespaceManager);

            if (laysEggs != null)
            {
                result.LaysEggs = true;
            }

            var laysMushrooms = (XmlElement)apply.SelectSingleNode("ns:" + nameof(result.LaysMushrooms), namespaceManager);

            if (laysMushrooms != null)
            {
                result.LaysMushrooms = true;
            }

            var splitsOnHit = (XmlElement)apply.SelectSingleNode("ns:" + nameof(SplitsOnHit), namespaceManager);

            if (splitsOnHit != null)
            {
                result.SplitsOnHit = true;
            }

            var shootsAtPlayer = (XmlElement)apply.SelectSingleNode("ns:" + nameof(ShootsAtPlayer), namespaceManager);

            if (shootsAtPlayer != null)
            {
                result.ShootsAtPlayer = Setting <ShootsAtPlayer> .NewSetting((ShootsAtPlayer)Enum.Parse(typeof(ShootsAtPlayer), shootsAtPlayer.GetAttribute("value")));
            }

            var shotsBounceOff = (XmlElement)apply.SelectSingleNode("ns:" + nameof(ShotsBounceOff), namespaceManager);

            if (shotsBounceOff != null)
            {
                result.ShotsBounceOff = true;
            }
        }
        private void AddMonster(XmlElement monsterDef, XmlNamespaceManager namespaceManager)
        {
            MonsterDef md      = MonsterDef.FromXml(monsterDef, namespaceManager);
            var        tilePos = new TilePos(int.Parse(monsterDef.GetAttribute("Left")), int.Parse(monsterDef.GetAttribute("Top")));

            md.Position = tilePos.ToPosition();
            this._gameState.AddMonster(md);
        }
示例#3
0
        internal static MonsterDef FromXml([NotNull] XmlElement mdef, XmlNamespaceManager namespaceManager)
        {
            MonsterDef result = new MonsterDef
            {
                Breed  = mdef.GetAttribute(nameof(result.Breed)),
                Energy = int.Parse(mdef.GetAttribute(nameof(result.Energy)))
            };

            string mobility = mdef.GetAttribute(nameof(result.Mobility));

            if (!string.IsNullOrEmpty(mobility))
            {
                result.Mobility = (MonsterMobility)Enum.Parse(typeof(MonsterMobility), mobility);
            }

            string initialDirection = mdef.GetAttribute(nameof(result.InitialDirection));

            if (!string.IsNullOrEmpty(initialDirection))
            {
                result.InitialDirection = (Direction)Enum.Parse(typeof(Direction), initialDirection);
            }

            string changeRooms = mdef.GetAttribute(nameof(result.ChangeRooms));

            if (!string.IsNullOrEmpty(changeRooms))
            {
                result.ChangeRooms = (ChangeRooms)Enum.Parse(typeof(ChangeRooms), changeRooms);
            }

            string isActiveAttribute = mdef.GetAttribute(nameof(result.IsActive));

            if (!string.IsNullOrEmpty(isActiveAttribute))
            {
                result.IsActive = XmlConvert.ToBoolean(isActiveAttribute);
            }

            // additional behaviours
            var apply = (XmlElement)mdef.SelectSingleNode("ns:Apply", namespaceManager);

            if (apply != null)
            {
                ApplyNewBehaviours(ref result, apply, namespaceManager);
            }

            // remove behaviours
            var remove = (XmlElement)mdef.SelectSingleNode("ns:Remove", namespaceManager);

            if (remove != null)
            {
                RemoveUnwantedBehaviours(ref result, remove, namespaceManager);
            }

            return(result);
        }
示例#4
0
        public void AddGameObjects(GameState gameState)
        {
            var lines = this._layout.Split(new [] { "\r\n" }, StringSplitOptions.None);

            for (int y = 0; y < lines.Count(); y++)
            {
                for (int x = 0; x < lines[y].Length; x++)
                {
                    var tp       = new TilePos(x, y);
                    var position = tp.ToPosition();
                    var c        = lines[y][x];
                    switch (c)
                    {
                    case ' ':
                        break;

                    case '#':
                        Trace.WriteLine(System.IO.Directory.GetCurrentDirectory());
                        gameState.AddWall(position, "Tiles/Floor1");
                        break;

                    case 'p':
                        gameState.AddPlayer(position, 255, 0);
                        break;

                    case 'b':
                        gameState.AddBoulder(position);
                        break;

                    case 'g':
                        gameState.AddGrave(tp);
                        break;

                    case 'm':
                        var mdef = new MonsterDef();
                        mdef.Type = typeof(DummyMonster);

                        gameState.AddMonster(mdef);

                    default:
                        throw new InvalidOperationException();
                    }
                }
            }
        }
示例#5
0
        public static RandomMonsterDistribution FromXml(XmlElement node, XmlNamespaceManager xnm)
        {
            var result = new RandomMonsterDistribution
            {
                DiceRoll        = new DiceRoll(node.GetAttribute("DiceToRoll")),
                CountOfMonsters = int.Parse(node.GetAttribute("CountOfMonsters"))
            };

            // ReSharper disable once PossibleNullReferenceException
            foreach (XmlElement mdef in node.SelectNodes("ns:MonsterTemplates/ns:Monster", xnm))
            {
                var md = MonsterDef.FromXml(mdef, xnm);
                int matchingDiceRoll = int.Parse(mdef.GetAttribute("MatchingDiceRoll"));
                result.Templates.Add(matchingDiceRoll, md);
            }

            return(result);
        }
示例#6
0
        private static void RemoveUnwantedBehaviours(ref MonsterDef result, XmlElement remove, XmlNamespaceManager namespaceManager)
        {
            var mobilityAfterInjury = (XmlElement)remove.SelectSingleNode("ns:" + nameof(result.MobilityAfterInjury), namespaceManager);

            if (mobilityAfterInjury != null)
            {
                if (!result.MobilityAfterInjury.UseBreedDefault)
                {
                    throw new InvalidOperationException("Contradictory setting for MobilityAfterInjury");
                }
                result.MobilityAfterInjury = Setting <MonsterMobility> .SettingNoBehaviour();
            }

            var changeRoomsAfterInjury = (XmlElement)remove.SelectSingleNode("ns:" + nameof(ChangeRoomsAfterInjury), namespaceManager);

            if (changeRoomsAfterInjury != null)
            {
                if (!result.ChangeRoomsAfterInjury.UseBreedDefault)
                {
                    throw new InvalidOperationException("Contradictory setting for ChangeRoomsAfterInjury");
                }
                result.ChangeRoomsAfterInjury = Setting <ChangeRooms> .SettingNoBehaviour();
            }

            var laysEggs = (XmlElement)remove.SelectSingleNode("ns:" + nameof(result.LaysEggs), namespaceManager);

            if (laysEggs != null)
            {
                if (result.LaysEggs.HasValue)
                {
                    throw new InvalidOperationException("Contradictory setting for LaysEggs");
                }
                result.LaysEggs = false;
            }

            var laysMushrooms = (XmlElement)remove.SelectSingleNode("ns:" + nameof(result.LaysMushrooms), namespaceManager);

            if (laysMushrooms != null)
            {
                if (result.LaysMushrooms.HasValue)
                {
                    throw new InvalidOperationException("Contradictory setting for LaysMushrooms");
                }
                result.LaysMushrooms = false;
            }

            var splitsOnHit = (XmlElement)remove.SelectSingleNode("ns:" + nameof(result.SplitsOnHit), namespaceManager);

            if (splitsOnHit != null)
            {
                if (result.SplitsOnHit.HasValue)
                {
                    throw new InvalidOperationException("Contradictory setting for SplitsOnHit");
                }
                result.SplitsOnHit = false;
            }

            var shootsAtPlayer = (XmlElement)remove.SelectSingleNode("ns:" + nameof(result.ShootsAtPlayer), namespaceManager);

            if (shootsAtPlayer != null)
            {
                if (!result.ShootsAtPlayer.UseBreedDefault)
                {
                    throw new InvalidOperationException("Contradictory setting for ShootsAtPlayer");
                }
                result.ShootsAtPlayer = Setting <ShootsAtPlayer> .SettingNoBehaviour();
            }

            var shotsBounceOffAttribute = (XmlElement)remove.SelectSingleNode("ns:" + nameof(result.ShotsBounceOff), namespaceManager);

            if (shotsBounceOffAttribute != null)
            {
                if (result.ShotsBounceOff.HasValue)
                {
                    throw new InvalidOperationException("Contradictory setting for ShotsBounceOff");
                }
                result.ShotsBounceOff = false;
            }
        }