示例#1
0
        private void ClearDeaths(Board defenderBoard)
        {
            Dictionary <IMinion, int> deaths = new Dictionary <IMinion, int>();

            for (int i = 0; i < PlayedMinions.Count; i++)
            {
                var minion = PlayedMinions[i];
                if (minion.IsDead)
                {
                    deaths[minion] = i;
                    int index = PlayedMinions.IndexOf(minion);
                    PlayedMinions.Remove(minion);
                    Graveyard.Add(minion);
                }
            }

            foreach (var kv in deaths)
            {
                kv.Key.OnDeath(new TriggerParams()
                {
                    Activator = kv.Key, Board = this, RivalBoard = defenderBoard, Index = kv.Value
                });
                OnMinionDied(kv.Key, defenderBoard);
            }
        }
示例#2
0
        public IMinion RemoveSmallestMinion()
        {
            var minion = PlayedMinions.OrderBy(m => m.Health).ThenBy(m => m.Attack).First();

            Remove(minion);
            return(minion);
        }
示例#3
0
        private void ClearDeaths()
        {
            Dictionary <IMinion, int> deaths = new Dictionary <IMinion, int>();

            for (int i = 0; i < PlayedMinions.Count; i++)
            {
                var minion = PlayedMinions[i];
                if (minion.IsDead)
                {
                    deaths[minion] = i;
                    int index = PlayedMinions.IndexOf(minion);
                    Remove(minion);
                    Graveyard.Add(minion);
                }
            }

            foreach (var kv in deaths)
            {
                int auraLevel = BoardAuras.Where(a => a.Value == AuraType.Deathrattle).Select(b => b.Key.Level).DefaultIfEmpty().Max() + 1;
                for (int i = 0; i < auraLevel; i++)
                {
                    kv.Key.OnDeath(new TriggerParams()
                    {
                        Activator = kv.Key, Board = this, RivalBoard = RivalBoard, Index = kv.Value
                    });
                }

                OnMinionDied(kv.Key);
            }
        }
示例#4
0
        public IMinion RemoveRandomMinion()
        {
            int index  = RandomNumber(0, PlayedMinions.Count);
            var minion = PlayedMinions[index];

            PlayedMinions.Remove(minion);
            return(minion);
        }
示例#5
0
        public Board Clone()
        {
            var board = this.MemberwiseClone() as Board;

            board.PlayedMinions = new ObservableCollection <IMinion>(PlayedMinions.Select(m => m.Clone()).ToList());
            board.BoardAuras.Clear();
            board.Graveyard = new List <IMinion>();
            return(board);
        }
示例#6
0
 private void OnMinionTookDamage(IMinion tookDamage)
 {
     foreach (var minion in PlayedMinions.Where(m => m != tookDamage))
     {
         minion.OnMinionDamaged(new TriggerParams()
         {
             Activator = minion, Board = this, Target = tookDamage
         });
     }
 }
示例#7
0
 public void BuffAllOfType(IMinion buffer, MinionType type, int attack = 0, int health = 0, Attribute attributes = Attribute.None, Action <TriggerParams> deathRattle = null, bool aura = false)
 {
     foreach (var minion in PlayedMinions.Where(m => m != buffer))
     {
         if ((type & minion.MinionType) != 0)
         {
             Buff(buffer, minion, attack, health, attributes, deathRattle, aura);
         }
     }
 }
示例#8
0
        public void Remove(IMinion defendingMinion)
        {
            int i = PlayedMinions.IndexOf(defendingMinion);

            if (i < NextAttacker)
            {
                NextAttacker--;
            }
            PlayedMinions.Remove(defendingMinion);
        }
示例#9
0
 private void OnMinionDied(IMinion deadMinion, Board defenderBoard)
 {
     foreach (var minion in PlayedMinions.Where(m => m != deadMinion))
     {
         minion.OnMinionDied(new TriggerParams()
         {
             Activator = minion, Target = deadMinion, Board = this, RivalBoard = defenderBoard
         });
     }
 }
示例#10
0
        public IMinion GetMinionWithMinAttack()
        {
            List <IMinion> targets = PlayedMinions.GroupBy(m => m.Attack).OrderBy(g => g.Key).FirstOrDefault()?.Select(m => m).ToList();

            if (targets != null)
            {
                return(targets[RandomNumber(0, targets.Count)]);
            }

            return(null);
        }
示例#11
0
 public void Play(IMinion minion, int index = 0, IMinion target = null)
 {
     OnMinionSummon(minion, index);
     PlayedMinions.Insert(index, minion);
     for (int j = 0; j < minion.Level; j++)
     {
         minion.OnPlayed(new TriggerParams()
         {
             Activator = minion, Index = index, Target = target, Board = this, Player = Player
         });
     }
 }
示例#12
0
        public IMinion GetRandomMinion(MinionType type = MinionType.All, List <IMinion> excludes = null)
        {
            var minions = PlayedMinions.Except(excludes ?? new List <IMinion>()).Where(m => (m.MinionType & type) != 0).ToArray();

            if (!minions.Any())
            {
                return(null);
            }

            var minion = minions[RandomNumber(0, minions.Length)];

            return(minion);
        }
示例#13
0
        public void Summon(string minionName, int index, Direction direction = Direction.Right, int amount = 1)
        {
            for (int i = 0; i < amount; i++)
            {
                if (IsFull)
                {
                    return;
                }

                var summoned = Pool.Instance.GetFreshCopy(minionName);
                PlayedMinions.Insert(index + (int)direction, summoned);
                OnMinionSummon(summoned, index);
            }
        }
示例#14
0
        private void ActivateSummonAura(int index, Direction direction, IMinion summoned)
        {
            int auraLevel = BoardAuras.Where(a => a.Value == AuraType.Summon).Select(b => b.Key.Level).DefaultIfEmpty().Max();

            for (int j = 0; j < auraLevel; j++)
            {
                if (IsFull)
                {
                    break;
                }
                var copy = summoned.Clone();
                PlayedMinions.Insert(index + (int)direction, copy);
            }
        }
示例#15
0
        public IMinion GetRandomDefender()
        {
            if (IsEmpty)
            {
                return(null);
            }

            var taunters = PlayedMinions.Where(m => m.Attributes.HasFlag(Attribute.Taunt)).ToArray();

            if (taunters.Any())
            {
                return(taunters[RandomNumber(0, taunters.Length)]);
            }

            return(PlayedMinions[RandomNumber(0, PlayedMinions.Count)]);
        }
示例#16
0
        private List <IMinion> GetAdjacentMinions(IMinion minion)
        {
            List <IMinion> adjacent = new List <IMinion>();
            int            index    = PlayedMinions.IndexOf(minion);
            int            right    = index - 1;
            int            left     = index + 1;

            if (right >= 0)
            {
                adjacent.Add(PlayedMinions[right]);
            }
            if (left < PlayedMinions.Count)
            {
                adjacent.Add(PlayedMinions[left]);
            }

            return(adjacent);
        }
示例#17
0
        public void Play(IMinion minion, int index = 0, IMinion target = null)
        {
            OnMinionSummon(minion, index);
            minion.OnApplyAura(new TriggerParams()
            {
                Activator = minion, Index = index, Board = this, Player = Player
            });
            int auraLevel = BoardAuras.Where(a => a.Value == AuraType.BattleCry).Select(b => b.Key.Level).DefaultIfEmpty().Max() + 1;

            PlayedMinions.Insert(index, minion);
            for (int j = 0; j < auraLevel; j++)
            {
                minion.OnPlayed(new TriggerParams()
                {
                    Activator = minion, Index = index, Target = target, Board = this, Player = Player
                });
            }
        }
示例#18
0
        public void TryMagnet(IMinion magnetic, int index)
        {
            if (index++ > PlayedMinions.Count)
            {
                return;
            }

            var minion = PlayedMinions[index];

            if ((magnetic.ValidTargets & minion.MinionType) != 0)
            {
                minion.Attack     += magnetic.Attack;
                minion.Health     += magnetic.Health;
                minion.Attributes |= magnetic.Attributes;
                PlayedMinions.Remove(magnetic);
                Pool.Instance.Return(magnetic);
            }
        }
示例#19
0
 public bool Controls(MinionType murloc, IMinion exclude = null)
 {
     return(PlayedMinions.Any(m => (m.MinionType & MinionType.Murloc) != 0 && (exclude == null || m != exclude)));
 }
示例#20
0
 public List <IMinion> GetValidTargets(MinionType validTargets)
 {
     return(PlayedMinions.Where(m => (validTargets & m.MinionType) != 0).ToList());
 }
示例#21
0
 public void Remove(IMinion minion)
 {
     RemoveAuras(minion);
     PlayedMinions.Remove(minion);
 }