Esempio n. 1
0
        static void UpdateVBoardCard(ref List <VCard> vBoard, _Func updateFunc)
        {
            VCard        updatedVCard = updateFunc.Invoke();
            List <VCard> updatedList  = new List <VCard>();

            foreach (var virtualCard in vBoard)
            {
                if (virtualCard.RealCard.GetEntity().GetCardId() == updatedVCard.RealCard.GetEntity().GetCardId() &&
                    virtualCard.IsAlly == updatedVCard.IsAlly)
                {
                    if (updatedVCard.Health > 0)
                    {
                        updatedList.Add(updatedVCard);
                    }
                }
                else
                {
                    updatedList.Add(virtualCard);
                }
            }
            vBoard = updatedList;
        }
Esempio n. 2
0
        private static List <BotPlaysResult> GetValidPermutations(List <BotPlay[]> perms)
        {
            List <BotPlaysResult> validPerms = new List <BotPlaysResult>();

            foreach (BotPlay[] playList in perms)
            {
                int            mana          = ManaCrystalMgr.Get().GetSpendableManaCrystals();
                List <VCard>   vBoard        = GetVirtualBoard();
                List <VCard>   vHand         = GetVirtualHand();
                List <VCard>   vSectetZone   = GetVirtualSecretZone();
                List <BotPlay> validPlayList = new List <BotPlay>();

                foreach (BotPlay play in playList)
                {
                    VCard vCard       = GetVCardInList(vHand, play.Source) ?? GetVCardInList(vBoard, play.Source);
                    VCard targetVCard = GetVCardInList(vBoard, play.Target);

                    if (vCard != null && play.IsSummonOnly && Found(vHand, play.Source))//inHand
                    {
                        if (vCard.Cost > mana || AllyMinionsCount(vBoard) >= 7)
                        {
                            continue;
                        }

                        vHand.Remove(vCard);

                        if (play.Source.GetEntity().IsMinion())
                        {
                            vCard.PlayedThisTurn = true;
                            vBoard.Add(vCard);
                        }
                        else if (play.Source.GetEntity().IsSecret())
                        {
                            vSectetZone.Add(vCard);
                        }
                        mana -= vCard.Cost;
                        validPlayList.Add(play);
                    }

                    if (vCard != null && targetVCard != null && play.IsTargeted && Found(vBoard, play.Target)) //onBoard
                    {
                        if (Found(vHand, play.Source) && play.Source.GetEntity().IsSpell())                    //spell in hand
                        {
                            if (vCard.Cost > mana || targetVCard.IsImmune || targetVCard.IsStealthed)
                            {
                                continue;
                            }

                            var   board = vBoard;
                            _Func f1    = delegate
                            {
                                int spellPower = GetSpellPower(board);
                                vCard.Health -= play.Source.GetEntity().GetDamage() + spellPower;
                                return(vCard);
                            };
                            UpdateVBoardCard(ref vBoard, f1);

                            vHand.Remove(vCard);
                            validPlayList.Add(play);
                        }
                        else if (vCard != null && targetVCard != null && Found(vBoard, play.Source) &&
                                 Found(vBoard, play.Target) && IsVAttackValid(vBoard, play) && vCard.CanAttack)//minion attack
                        {
                            if (targetVCard.IsImmune || targetVCard.IsStealthed)
                            {
                                continue;
                            }

                            _Func allyUpdate = delegate
                            {
                                targetVCard.Health -= vCard.Attack;
                                return(targetVCard);
                            };
                            _Func targetUpdate = delegate
                            {
                                vCard.Health -= targetVCard.Attack;
                                return(targetVCard);
                            };
                            UpdateVBoardCard(ref vBoard, allyUpdate);
                            UpdateVBoardCard(ref vBoard, targetUpdate);

                            vCard.VAttack();
                            validPlayList.Add(play);
                        }
                    }

                    if (targetVCard != null && play.IsTargetOnlyAction && Found(vBoard, play.Target))
                    {
                        var lastPlay = validPlayList[validPlayList.Count - 1];
                        if (lastPlay.IsSummonOnly && Lib.HasBattleCryTargetAction(lastPlay.Source))
                        {
                            #region HandleBattleCryAction

                            //Apply play on target
                            Lib.BattleCryTargetAction action = Lib.GetBattleCryTargetAction(play.Source);
                            if (!Lib.CorrespondsToBattleCryAction(play.Source, action))
                            {
                                continue;
                            }

                            if (targetVCard.IsImmune && !targetVCard.IsAlly)
                            {
                                continue;
                            }

                            if (action.OnlyIfHoldingDragon && !IsHoldingDragon(vHand))
                            {
                                continue;
                            }

                            if (action.OnlyIfSectretExists && !IsSecretActive(vSectetZone))
                            {
                                continue;
                            }

                            if (vCard != null && action.BecomeCopy)
                            {
                                vBoard.Remove(GetVCardInList(vBoard, play.Source));
                                var copy = targetVCard;
                                copy.IsAlly = true;
                                vBoard.Add(copy);
                            }
                            if (action.CopyDeathrattle)
                            {
                            }
                            //todo:add CopyDeathrattle
                            if (vCard != null && action.CopyStats)
                            {
                                var   card     = vCard;
                                var   card1    = targetVCard;
                                _Func allyFunc = delegate
                                {
                                    card.Attack = card1.Attack;
                                    card.Health = card1.Health;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, allyFunc);
                            }
                            if (action.DestroyLegendary && play.Target.GetEntity().GetRarity() == TAG_RARITY.LEGENDARY)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.Health = -1;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }
                            else
                            {
                                continue;
                            }

                            if (action.DestroyTaunt && targetVCard.HasTaunt && !targetVCard.IsSilenced)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    // ReSharper disable once AccessToModifiedClosure
                                    card.Health = -1;
                                    // ReSharper disable once AccessToModifiedClosure
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }
                            else
                            {
                                continue;
                            }

                            if (action.Freeze)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.IsFrozen = true;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.GiveDivineShield)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.HasDivineShield = true;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.GiveImmune)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.IsImmune = true;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.GiveStealth)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.IsStealthed = true;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.GiveTaunt)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.HasTaunt = true;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.GiveWindfury)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.HasWindFury = true;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.MakeCopy)
                            {
                                var copy = targetVCard;
                                copy.IsAlly = true;
                                vBoard.Add(copy);
                            }

                            if (action.Make_1_1_CopyForHand)
                            {
                                var copy = targetVCard;
                                copy.IsAlly   = true;
                                copy.Health   = 1;
                                copy.Attack   = 1;
                                copy.IsBuffed = false;
                                copy.Cost     = 1;
                                vHand.Add(copy);
                            }

                            if (action.ReturnTargetToHand)
                            {
                                if (targetVCard.IsAlly)
                                {
                                    vBoard.Remove(targetVCard);
                                    vHand.Add(targetVCard);
                                }
                                else
                                {
                                    vBoard.Remove(targetVCard);
                                }
                            }

                            if (action.SetAttackToExactValue)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.Attack = action.ExactAttack;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.SetHealthToExactValue)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.Attack = action.ExactHealth;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.Silence)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    card.IsSilenced = true;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (vCard != null && action.SwapHealth)
                            {
                                var   card       = targetVCard;
                                var   card1      = vCard;
                                _Func targetFunc = delegate
                                {
                                    card.Health = card1.Health;
                                    return(card);
                                };
                                _Func allyFunc = delegate
                                {
                                    card1.Health = card.Health;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, allyFunc);
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.SwapStatsOfTargetItself)
                            {
                                var   card       = targetVCard;
                                _Func targetFunc = delegate
                                {
                                    int h = card.Health;
                                    int a = card.Attack;
                                    card.Attack = h;
                                    card.Health = a;
                                    return(card);
                                };
                                UpdateVBoardCard(ref vBoard, targetFunc);
                            }

                            if (action.TransfromMinionInOneMoreCost)
                            {
                            }
                            //todo:Add TransfromMinionInOneMoreCost
                            if (action.TakeControl)
                            {
                                vBoard.Remove(targetVCard);
                                var c = targetVCard;
                                c.IsAlly = true;
                                vBoard.Add(c);
                            }

                            #endregion

                            validPlayList.Add(play);
                        }
                    }
                }

                validPerms.Add(new BotPlaysResult {
                    BotPlayList = validPlayList, VBoard = vBoard, VHand = vHand
                });
            }
            return(validPerms);
        }