Beispiel #1
0
        public CreateTokens(
      DynParam<int> count,
      CardTemplate token,
      Action<Card, Game> afterTokenComesToPlay = null,
      DynParam<Player> tokenController = null,
      Action<Effect, CardTemplate> tokenParameters = null)
        {
            _afterTokenComesToPlay = afterTokenComesToPlay ?? delegate { };
              _tokenController = tokenController;
              _setTokenParameters = tokenParameters ?? delegate { };

              _count = count;
              _tokenFactories.Add(token);

              RegisterDynamicParameters(count, tokenController);
        }
        /// <summary>
        /// load obvious whitelist first to determine if Value.InWhiteList
        /// </summary>
        /// <param name="NeutralMinionBoardCard"></param>
        public NeutralMinion(CardTemplate NeutralMinionBoardCard)
        {
            Card.Cards NeutralMinionMulliganCardCard = BoardToMulliganCard(NeutralMinionBoardCard);

            minionBoardCard = NeutralMinionBoardCard.Class != Card.CClass.NONE ||
                NeutralMinionMulliganCardCard.ToString() == "GAME_005"
                ?
                null
                :
                new BoardCard(NeutralMinionMulliganCardCard);

            thisCardValue =
                minionBoardCard != null ? MinionValue.SetCardValue(minionBoardCard) :
                MinionValue.Value.NotANeutralMinion;

            if (minionBoardCard != null && MainLists.whiteList.Contains(minionBoardCard.ResultingBoardCard.Name))
                thisCardValue = MinionValue.Value.InWhiteList;
        }
Beispiel #3
0
        // Get Current Local Archetype
        private static string GetCurrentLocalArchetype()
        {
            var localArchetype = ArchetypeDetector.DetectArchetype(Bot.GetSelectedDecks()[0].Cards.Select(x => CardTemplate.StringToCard(x)).ToList(), Bot.GetArchetypes());

            if (localArchetype == null)
            {
                return(string.Empty);                        //Couldn't find archetype
            }
            return(localArchetype.ArchetypeName());
        }
Beispiel #4
0
        //Get value of certain card in certain class
        public int GetCardValue(Card.Cards card, Card.CClass friendlyClass)
        {
            //Look for value in our class if the card is neutral or from our class. Otherwise look for value in the class that the card belongs to.
            var cclass = CardTemplate.LoadFromId(card).Class == Card.CClass.NONE ? friendlyClass : CardTemplate.LoadFromId(card).Class;

            try
            {
                //If there is no specific value for the requested class, use neutral value.
                return((int)Cards.Find(x => x.Id == card).Scores[cclass] == 0 ? (int)Cards.Find(x => x.Id == card).Scores[Card.CClass.NONE] : (int)Cards.Find(x => x.Id == card).Scores[cclass]);
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("The card " + card + " could not be found in the Tierlist.", e);
            }
        }
Beispiel #5
0
 private CardTemplate ConvertToBoardCard(Card.Cards MulliganCard)
 {
     return(CardTemplate.LoadFromId(MulliganCard));
 }
Beispiel #6
0
        /// <summary>
        ///     Mech Mages
        /// </summary>
        /// <param name="choices"></param>
        /// <param name="whiteList"></param>
        /// <param name="opponentClass"></param>
        /// <param name="hasCoin"></param>
        private static void MulliganMage(List <Card> choices, Dictionary <string, bool> whiteList, CClass opponentClass,
                                         bool hasCoin)
        {
            var          control       = false;
            var          oneDrop       = false;
            var          twoDrop       = false;
            var          threeDrop     = false;
            var          curve         = false;
            CardTemplate oneManaMinion = null;

            foreach (var c in choices)
            {
                var temp = CardTemplate.LoadFromId(c.Name);
                if (temp.Race == SmartBot.Plugins.API.Card.CRace.MECH)
                {
                    if (temp.Cost == 1)
                    {
                        oneManaMinion = CardTemplate.LoadFromId(c.Name);
                    }
                    if (temp.Cost == 2)
                    {
                        twoDrop = true;
                        whiteList.AddOrUpdate(c.Name, true);
                    }
                }
                if (temp.Race != SmartBot.Plugins.API.Card.CRace.MECH &&
                    temp.Quality != SmartBot.Plugins.API.Card.CQuality.Epic &&
                    temp.Type != SmartBot.Plugins.API.Card.CType.SPELL) //minions handler
                {
                    if (temp.Cost == 1 && temp.Race != SmartBot.Plugins.API.Card.CRace.MECH)
                    {
                        oneDrop = true;
                        whiteList.AddOrUpdate(c.Name, false);
                    }
                    if (temp.Cost == 2)
                    {
                        twoDrop = true;
                        whiteList.AddOrUpdate(c.Name, true);
                    }
                }

                switch (opponentClass)
                {
                case CClass.SHAMAN:
                    control = true;
                    break;

                case CClass.PRIEST:
                    control = true;
                    break;

                case CClass.MAGE:
                    break;

                case CClass.PALADIN:
                {
                    if (temp.Cost == 3 && temp.Quality == SmartBot.Plugins.API.Card.CQuality.Epic)
                    {
                        whiteList.AddOrUpdate(c.Name, false);
                    }
                    break;
                }

                case CClass.WARRIOR:
                    control = true;
                    break;

                case CClass.WARLOCK:
                    control = true;
                    break;

                case CClass.HUNTER:
                    break;

                case CClass.ROGUE:
                    control = true;
                    break;

                case CClass.DRUID:
                    control = true;
                    break;

                default:
                    throw new ArgumentOutOfRangeException("opponentClass", opponentClass, null);
                }

                if (temp.Type == SmartBot.Plugins.API.Card.CType.SPELL && temp.Cost == 2)
                {
                    whiteList.AddOrUpdate(c.Name, false);
                }

                if (!control)
                {
                    if (temp.Type == SmartBot.Plugins.API.Card.CType.SPELL && temp.Cost == 1)
                    {
                        whiteList.AddOrUpdate(c.Name, false);
                    }
                    continue;
                }
                if (temp.Cost == 4 && temp.Race == SmartBot.Plugins.API.Card.CRace.MECH && temp.Atk > 3)
                {
                    whiteList.AddOrUpdate(c.Name, false);
                }
            }
            foreach (var c in from c in choices let temp = CardTemplate.LoadFromId(c.Name) where twoDrop && temp.Cost == 3 && temp.Type == SmartBot.Plugins.API.Card.CType.MINION select c)
            {
                threeDrop = true;
                whiteList.AddOrUpdate(c.Name, hasCoin);
            }
            curve = twoDrop && threeDrop;
            if (oneManaMinion != null && (!oneDrop && oneManaMinion.Cost == 1))
            {
                whiteList.AddOrUpdate("GVG_082", false);
            }
            if (!threeDrop && !hasCoin)
            {
                return;
            }
            if (MMFelRever && threeDrop && hasCoin && choices.Any(c => c.Name == "GVG_016"))
            {
                whiteList.AddOrUpdate("GVG_016", false);
            }
            if (choices.Any(c => c.Name == "GVG_004") && threeDrop || curve)
            {
                whiteList.AddOrUpdate("GVG_004", false);
            }
        }
 private Card.Cards BoardToMulliganCard(CardTemplate boardCard)
 {
     return(CardTemplate.StringToCard(boardCard.Id.ToString()));
 }
 private Card.Cards BoardToMulliganCard(CardTemplate boardCard)
 {
     return CardTemplate.StringToCard(boardCard.Id.ToString());
 }
            /// <summary>
            /// For board cards
            /// </summary> 
            public static bool HasEffect(CardTemplate card, string PropertyName)
            {
                string property_STR = new PropertyEnumClass(PropertyName).Property;
                var boardCard = card;

                return
                    boardCard.Mechanics.Any(x => String.Equals(x,
                        property_STR, StringComparison.OrdinalIgnoreCase));
            }
Beispiel #10
0
 /// <summary>
 /// its redudndant method. I will remove it after we get out of beta
 /// </summary>
 /// <param name="choices"></param>
 /// <param name="cost"></param>
 /// <param name="badMinions"></param>
 /// <returns></returns>
 private static string GetBestOne(List <Card.Cards> choices, int cost, List <string> badMinions)
 {
     return(choices.Where(c => !badMinions.Contains(c.ToString())).Where(c => CardTemplate.LoadFromId(c.ToString()).Cost == cost).Aggregate("CS2_118", (current, c) => WhichIsStronger(current, c.ToString())));
 }
Beispiel #11
0
        /// <summary>
        /// Method is designed to look through your hand and whitelist best possible minions to fit your curve well
        /// </summary>
        /// <param name="choices">List of 3 to 4 card choices that are analyzed</param>
        /// <param name="whiteList">Dictionary list which contains cards that are kept</param>
        /// <returns></returns>
        private static Tuple <bool, bool, bool, bool> HandleMinions(List <Card.Cards> choices, IDictionary <string, bool> whiteList)
        {
            var one           = Bot.CurrentDeck().Cards.Count(c => CardTemplate.LoadFromId(c).Cost == 1);
            var two           = Bot.CurrentDeck().Cards.Count(c => CardTemplate.LoadFromId(c).Cost == 2);
            var three         = Bot.CurrentDeck().Cards.Count(c => CardTemplate.LoadFromId(c).Cost == 3);
            var four          = Bot.CurrentDeck().Cards.Count(c => CardTemplate.LoadFromId(c).Cost == 4);
            var five          = Bot.CurrentDeck().Cards.Count(c => CardTemplate.LoadFromId(c).Cost == 5);
            var allOneDrops   = (from q in Bot.CurrentDeck().Cards select CardTemplate.LoadFromId(q.ToString()) into qq where qq.Cost == 1 select qq.Name).ToList();
            var allTwoDrops   = (from q in Bot.CurrentDeck().Cards select CardTemplate.LoadFromId(q.ToString()) into qq where qq.Cost == 2 select qq.Name).ToList();
            var allThreeDrops = (from q in Bot.CurrentDeck().Cards select CardTemplate.LoadFromId(q.ToString()) into qq where qq.Cost == 3 select qq.Name).ToList();
            var allFourDrops  = (from q in Bot.CurrentDeck().Cards select CardTemplate.LoadFromId(q.ToString()) into qq where qq.Cost == 4 select qq.Name).ToList();

            var divineShield = Bot.CurrentDeck().Cards.Count(c => CardTemplate.LoadFromId(c).Divineshield);
            var spells       =
                Bot.CurrentDeck()
                .Cards.Count(c => CardTemplate.LoadFromId(c).Type == Card.CType.SPELL);
            var weapons =
                Bot.CurrentDeck()
                .Cards.Count(c => CardTemplate.LoadFromId(c).Type == Card.CType.WEAPON);
            var mechs =
                Bot.CurrentDeck()
                .Cards.Count(c => CardTemplate.LoadFromId(c).Race == Card.CRace.MECH);
            var beast =
                Bot.CurrentDeck()
                .Cards.Count(c => CardTemplate.LoadFromId(c).Race == Card.CRace.BEAST);
            var demon =
                Bot.CurrentDeck()
                .Cards.Count(c => CardTemplate.LoadFromId(c).Race == Card.CRace.DEMON);

            Bot.Log(string.Format("\n============================" +
                                  "\nMulligan adjusted with the following knowlege. \n\n" +
                                  " Your current arena deck contains:" +
                                  " \n Mechs {0} \n Beasts {1} \n Demons {2} \n Divine Shield Minions {3}\n" +
                                  " ============================\n" +
                                  "Minion Curve Breakdown \n" +
                                  "# 1 Mana Drops {4}\n" +
                                  "# 2 Mana Drops {5}\n" +
                                  "# 3 Mana Drops {6}\n" +
                                  "# 4 Mana Drops {7}\n" +
                                  "# 5 Mana Drops {8}\n\n" +
                                  "Weapon Count {9}\n" +
                                  "Spell Count {10}\n", mechs, beast, demon, divineShield, one, two, three, four, five, weapons, spells));

            // var has1Drop = false;
            var has2Drop   = false;
            var has3Drop   = false;
            var has4Drop   = false;
            var num2Drops  = 0;
            var num3Drops  = 0;
            var hasCoin    = choices.Count > 3;
            var badMinions = new List <string>
            {
                "CS2_173", "CS2_203", "FP1_017", "EX1_045", "NEW1_037", "EX1_055", "EX1_058", "NEW1_021",
                "GVG_025", "GVG_039", "EX1_306", "EX1_084", "EX1_582", "GVG_084", "CS2_118", "CS2_122",
                "CS2_124", "EX1_089", "EX1_050", "GVG_089", "EX1_005", "EX1_595", "EX1_396", "EX1_048", "AT_091",
                "EX1_584", "EX1_093", "GVG_094", "GVG_109", "GVG_107", "DS1_175", "EX1_362", "GVG_122", "EX1_011", "AT_075", "EX1_085"
            };

            GetOneDrops(choices, badMinions, whiteList);


            //checkTwoDrop()
            foreach (var c in choices)
            {
                if (badMinions.Contains(c.ToString()) || CardTemplate.LoadFromId(c.ToString()).Cost != 2)
                {
                    continue;
                }
                var minion = CardTemplate.LoadFromId(c.ToString());
                if (minion.Type == Card.CType.MINION)
                {
                    whiteList.AddOrUpdate(GetBestOne(choices, 2, badMinions), false);
                    num2Drops++;
                    has2Drop = true;
                }
                if (minion.Type == Card.CType.MINION && hasCoin)
                {
                    whiteList.AddOrUpdate(c.ToString(), true);
                    num2Drops++;
                }
                if (num2Drops >= 2)
                {
                    break;
                }
            }
            //CheckThreeDrops();
            foreach (var c in choices)
            {
                if (badMinions.Contains(c.ToString()) || CardTemplate.LoadFromId(c.ToString()).Cost != 3)
                {
                    continue;
                }

                var minion = CardTemplate.LoadFromId(c.ToString());
                if (minion.Type == Card.CType.MINION)
                {
                    whiteList.AddOrUpdate(GetBestOne(choices, 3, badMinions), hasCoin);
                    num3Drops++;
                    has3Drop = true;
                }
                if (has2Drop || num3Drops > 1 || minion.Health <= 2 || !hasCoin || badMinions.Contains(c.ToString()))
                {
                    continue;
                }
                whiteList.AddOrUpdate(c.ToString(), false);
                num3Drops++;
                has3Drop = true;
            }
            //checkFourDrops();
            foreach (var minion in choices.Where(c => !badMinions.Contains(c.ToString()) && has3Drop).Where(c => CardTemplate.LoadFromId(c.ToString()).Cost == 4 && has3Drop || hasCoin).Select(c => CardTemplate.LoadFromId(c.ToString())).Where(minion => minion.Type == Card.CType.MINION))
            {
                whiteList.AddOrUpdate(GetBestOne(choices, 4, badMinions), false);
                has4Drop = true;
            }

            return(new Tuple <bool, bool, bool, bool>(true, has2Drop, has3Drop, has4Drop));
        }
Beispiel #12
0
#pragma warning disable IDE0060 // Remove unused parameter
        public static void ClassInitialize(TestContext context)
#pragma warning restore IDE0060 // Remove unused parameter
        {
            otherUser = new User()
            {
                UserId   = Guid.NewGuid(),
                Email    = "*****@*****.**",
                Password = "******"
            };

            template = new CardTemplate()
            {
                UserId         = User.UserId,
                CardTemplateId = 1,
                Title          = "Default"
            };
            fieldDefinition1 = new CardFieldDefinition()
            {
                FieldId        = 1,
                CardTemplateId = template.CardTemplateId,
                FieldName      = "Front"
            };
            fieldDefinition2 = new CardFieldDefinition()
            {
                FieldId        = 2,
                CardTemplateId = template.CardTemplateId,
                FieldName      = "Back"
            };
            template.FieldDefinitions.Add(fieldDefinition1);
            template.FieldDefinitions.Add(fieldDefinition2);

            deck = new Deck()
            {
                DeckId = 1,
                Title  = "Default",
                DefaultCardTemplateId = template.CardTemplateId,
                UserId = User.UserId
            };
            card = new Card()
            {
                CardId         = 1,
                CardTemplateId = template.CardTemplateId,
                UserId         = User.UserId,
            };
            otherUserCard = new Card()
            {
                CardId         = 2,
                CardTemplateId = template.CardTemplateId,
                UserId         = otherUser.UserId,
            };
            field1 = new CardField()
            {
                FieldId             = 1,
                CardId              = card.CardId,
                CardFieldDefinition = fieldDefinition1,
                CardTemplateId      = template.CardTemplateId,
                FieldName           = "Front",
                Value = "Field1"
            };
            field2 = new CardField()
            {
                FieldId             = 2,
                CardId              = card.CardId,
                CardFieldDefinition = fieldDefinition2,
                CardTemplateId      = template.CardTemplateId,
                FieldName           = "Back",
                Value = "Field2"
            };
            card.Fields.Add(field1);
            card.Fields.Add(field2);
            deck.Cards.Add(card);
            deck.Cards.Add(otherUserCard);
        }
Beispiel #13
0
 private CardTemplate Load(Card.Cards id)
 {
     return(CardTemplate.LoadFromId(id));
 }
Beispiel #14
0
        //卡组列表
        //Card.Cards.EX1_607,//怒火中烧
        //Card.Cards.YOD_022,//冒进的艇长
        //Card.Cards.EX1_402,//铸甲师
        //Card.Cards.DRG_024,//空中悍匪
        //Card.Cards.EX1_392,//战斗怒火
        //Card.Cards.BT_124,//海盗藏品
        //Card.Cards.BT_156,//被禁锢的邪犬
        //Card.Cards.ULD_271,//受伤的托维尔人
        //Card.Cards.CS2_104,//狂暴
        //Card.Cards.DRG_025,//海盗之锚
        //Card.Cards.ULD_720,//血誓雇佣兵
        //Card.Cards.YOD_024,//炸弹牛仔
        //Card.Cards.NEW1_011,//库卡隆精英卫士
        //Card.Cards.DAL_063,//圣剑扳手
        //Card.Cards.NEW1_024,//绿皮船长
        //Card.Cards.DAL_064,//爆破之王砰砰
        //Card.Cards.BT_138,//沸血蛮兵
        //Card.Cards.DAL_060,//发条地精
        //Card.Cards.ULD_185,//神殿狂战士

        //具体策略
        public ProfileParameters GetParameters(Board board)
        {
            var p = new ProfileParameters(BaseProfile.Rush);

            p.DiscoverSimulationValueThresholdPercent = 10;

            //卡牌优先度调整
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_392, new Modifier(130));   //降低战斗怒火优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_607, new Modifier(150));   //降低怒火中烧优先度
            p.CastWeaponsModifiers.AddOrUpdate(Card.Cards.DAL_063, new Modifier(-10));  //提高圣剑扳手优先度
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.YOD_024, new Modifier(-140)); //提高炸弹牛仔优先度
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_185, new Modifier(-40));  //提高神殿狂战士优先度
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DAL_064, new Modifier(-140)); //提高王砰砰优先度
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DRG_056, new Modifier(130));  //空降歹徒 

            //自定义命名
            int a = (board.HeroFriend.CurrentHealth + board.HeroFriend.CurrentArmor) - BoardHelper.GetEnemyHealthAndArmor(board);//敌我血量差



            //针对一些随从优先解掉



            //攻击模式切换
            if (board.EnemyClass == Card.CClass.DEMONHUNTER ||
                board.EnemyClass == Card.CClass.HUNTER ||
                board.EnemyClass == Card.CClass.ROGUE ||
                board.EnemyClass == Card.CClass.SHAMAN ||
                board.EnemyClass == Card.CClass.PALADIN ||
                board.EnemyClass == Card.CClass.WARRIOR)
            {
                p.GlobalAggroModifier = (int)(a * 0.625 + 96.5);
            }
            else
            {
                p.GlobalAggroModifier = (int)(a * 0.625 + 103.5);
            }
            Bot.Log("攻击性:" + p.GlobalAggroModifier.Value);



            //武器调整

            if (board.ManaAvailable < 7 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.DRG_025))
            {
                p.CastWeaponsModifiers.AddOrUpdate(Card.Cards.DRG_025, new Modifier(-50));//7费前优先挂海盗之锚
            }

            if (board.ManaAvailable == 4 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.DAL_063) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.NEW1_024))
            {
                p.CastWeaponsModifiers.AddOrUpdate(Card.Cards.DAL_063, new Modifier(0));
            }//4费手里有圣剑扳手,绿皮船长,优先提刀

            if (BoardHelper.GetEnemyHealthAndArmor(board) <= 8)
            {
                p.WeaponsAttackModifiers.AddOrUpdate(Card.Cards.DAL_063, new Modifier(-100, board.HeroEnemy.Id));
            }//对面血少,优先砍脸



            //随从调整
            if ((board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DAL_063)//圣剑扳手
                 + board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DAL_060)) == 0 &&//发条地精
                !(board.WeaponFriend != null && board.WeaponFriend.Template.Id == Card.Cards.DAL_063) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.DAL_064) ||    //爆破之王砰砰
                board.MinionFriend.Count >= 5)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DAL_064, new Modifier(230));//爆破之王砰砰
            }//对方牌库没炸弹,不下爆破之王砰砰


            if (BoardHelper.GetSurvivalMinionEnemy(board).Count == 0 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.YOD_022) &&//冒进的艇长
                board.Hand.Exists(x => x.Template.Id == Card.Cards.DAL_064) &&//爆破之王砰砰
                board.ManaAvailable >= 8 &&
                board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DAL_063) >= 1)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DAL_064, new Modifier(-160)); //爆破之王砰砰
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.YOD_022, new Modifier(-100)); //冒进的艇长
            }//下艇长和王砰砰combo
            else if (board.MinionEnemy.Count == 0 &&
                     board.Hand.Exists(x => x.Template.Id == Card.Cards.YOD_022))          //冒进的艇长
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.YOD_022, new Modifier(200)); //冒进的艇长
            }//对面没随从,不轻易下艇长
            else if (board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DAL_063) >= 1 &&//圣剑扳手
                     board.Hand.Exists(x => x.Template.Id == Card.Cards.DAL_064))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DAL_064, new Modifier(-150));//爆破之王砰砰
            }//对方牌库炸弹多,优先下爆破之王砰砰


            if (board.ManaAvailable >= 5 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.DAL_064))               //爆破之王砰砰
            {
                p.CastWeaponsModifiers.AddOrUpdate(Card.Cards.DAL_063, new Modifier(-20)); //爆破之王砰砰
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DAL_060, new Modifier(80));  //发条地精
            }//手里有爆破之王砰砰,优先提圣剑扳手,优先下发条地精



            //法术调整
            if (board.Hand.Count <= 4 &&
                board.ManaAvailable >= 6)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_392, new Modifier(50));//战斗怒火
            }//手牌过少,增加战斗怒火优先度


            if (((board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Type == Card.CType.WEAPON)
                  + board.Hand.Count(x => x.Template.Type == Card.CType.WEAPON)) < 2 &&
                 board.WeaponFriend != null) ||
                ((board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Type == Card.CType.WEAPON)
                  + board.Hand.Count(x => x.Template.Type == Card.CType.WEAPON)) < 3 &&
                 board.WeaponFriend == null) &&
                board.Hand.Count <= 6)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.BT_124, new Modifier(-71));//提高海盗藏品优先度
            }
            else if (((board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Type == Card.CType.WEAPON)
                       + board.Hand.Count(x => x.Template.Type == Card.CType.WEAPON)) < 2 &&
                      board.WeaponFriend != null) ||
                     ((board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Type == Card.CType.WEAPON)
                       + board.Hand.Count(x => x.Template.Type == Card.CType.WEAPON)) < 3 &&
                      board.WeaponFriend == null) &&
                     board.Hand.Count > 6)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.BT_124, new Modifier(-50));//提高海盗藏品优先度
            }
            else
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.BT_124, new Modifier(1000));//降低海盗藏品优先度
            }
            return(p);
        }
Beispiel #15
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="choices"></param>
        /// <param name="hand">
        /// Sends a tuple with the following information:
        /// Whitelisted minions, hasOneManaDrop, hasTwoManaDrop, hasThreeManaDrop and hasFourManaDrop
        /// </param>
        /// <returns></returns>
        private static string HandleSpells(List <Card.Cards> choices, Tuple <bool, bool, bool, bool> hand)
        {
            var coin          = choices.Count() > 4;
            var allowedSpells = new List <string>
            {
                /*
                 * Mage: Frostbolt, Flamecannon, Unstable Portal, Arcane Missiles, Mirror Image
                 * Shaman: Rockbiter Weapon, Feral Spirit
                 * Priest: Holy Smite, Velens Chosen, Thoughtsteal
                 *
                 * Paladin: Noble Sac, Avenge, Seal of the Champion, Mustard for Butter
                 * Warrior: Bash, Slam, Shield Block
                 * Warlock: Mortal Coin, Darkbomb, ImpLosion
                 *
                 * Hunter: Tracking, Animal Companion, Secrets, Quick Shot, unleash
                 * Rogue: Deadly Poison, Burgle, Beneath the Grounds, Backstab
                 * Druid: Innervate, Wild Growth, Living Roots, Power of the Wild, Wrath
                 */
                "EX1_277", "GVG_001", "CS2_024", "CS2_027", "GVG_003",
                "CS2_045", "EX1_248",
                "CS1_130", "GVG_010", "EX1_339",
                "EX1_130", "FP1_020", "AT_074", "GVG_061",
                "AT_064", "EX1_391", "EX1_606",
                "EX1_302", "GVG_015", "GVG_045",
                "DS1_184", "NEW1_031", "BRM_013", "EX1_538",
                "CS2_074", "AT_033", "AT_035", "CS2_072",
                "EX1_169", "CS2_013", "AT_037", "EX1_160", "EX1_154"
            };
            var badSecrets = new List <string>

                             /*Bad secrets
                              * Hunter: Snipe, Misdirection
                              * Mage: Spellbender, Counterspell, Vaporize
                              * Paladin: Eye for an Eye, Competetive Spirit, Redemption, Repentance
                              */
            {
                "EX1_609", "EX1_533",
                "tt_010", "EX1_287", "EX1_594",
                "EX1_132", "AT_073", "EX1_136", "EX1_379"
            };

            foreach (var c in choices)
            {
                var spells = CardTemplate.LoadFromId(c.ToString());

                if (spells.Type == Card.CType.SPELL && allowedSpells.Contains(c.ToString()))
                {
                    if (spells.Cost == 0 && allowedSpells.Contains(c.ToString()))
                    {
                        return(c.ToString());
                    }
                    if (!spells.IsSecret && spells.Cost == 1 && !hand.Item1)
                    {
                        return(c.ToString());
                    }
                    if (!spells.IsSecret && spells.Cost == 2 && !hand.Item2 || coin)
                    {
                        return(c.ToString());
                    }
                    if (!spells.IsSecret && spells.Cost == 3 && !hand.Item3)
                    {
                        return(c.ToString());
                    }
                    if (!spells.IsSecret && spells.Cost == 4 && !hand.Item4)
                    {
                        return(c.ToString());
                    }
                }
                if (badSecrets.Contains(c.ToString()))
                {
                    continue;
                }
                if (spells.Cost == 1 && spells.IsSecret && !hand.Item1)
                {
                    return(c.ToString());
                }
                if (spells.Cost == 2 && spells.IsSecret && !hand.Item2)
                {
                    return(c.ToString());
                }
                if (spells.Cost == 3 && spells.IsSecret && !hand.Item3 && coin)
                {
                    return(c.ToString());
                }
            }

            return("");
        }
Beispiel #16
0
            //获取下回合能攻击的可使用随从集合
            public static List <Card.Cards> GetPlayableMinionSequenceAttacker(List <Card.Cards> minions, Board board)
            {
                //未处理的下回合能攻击的可使用随从集合
                var minionscopy = minions.ToArray().ToList();

                //遍历 以敌方随从攻击力 降序排序 的 场上敌方随从集合
                foreach (var mi in board.MinionEnemy.OrderByDescending(x => x.CurrentAtk))
                {
                    //以友方随从攻击力 降序排序 的 场上的所有友方随从集合,如果该集合存在生命值大于与敌方随从攻击力
                    if (minions.OrderByDescending(x => CardTemplate.LoadFromId(x).Atk).Any(x => CardTemplate.LoadFromId(x).Health <= mi.CurrentAtk))
                    {
                        //以友方随从攻击力 降序排序 的 场上的所有友方随从集合,找出该集合中友方随从的生命值小于等于敌方随从的攻击力的随从
                        var tar = minions.OrderByDescending(x => CardTemplate.LoadFromId(x).Atk).FirstOrDefault(x => CardTemplate.LoadFromId(x).Health <= mi.CurrentAtk);
                        //将该随从移除掉
                        minionscopy.Remove(tar);
                    }
                }

                return(minionscopy);
            }
        // Retrieve card details from SB
        public Card.Cards HandlePickDecision(Card.Cards originCard, List <Card.Cards> choices, Board board) //originCard; ID of card played by SB: choices; names of cards for selection: board; 3 states , Even, Losing, Winning
        {
            int    _standard = 0, _wild = 0, _indexDiscoverList = 0;
            bool   _wildCards   = false;
            string discoverFile = CardTemplate.LoadFromId(originCard).Name; // converts cardID to CardName from CardTemplate

            List <CardValue> choicesCardValue = new List <CardValue>();
            bool             _reDiscoverCard;

            do
            {
                if (_indexDiscoverList == 0)
                {
                    _iniTierList0 = new IniManager(Directory.GetCurrentDirectory() + @"\DiscoverCC\" + "Standard" + '\\' + discoverFile + ".ini"); // _iniTierList; name and location of data file with extension .ini
                    _iniTierList1 = new IniManager(Directory.GetCurrentDirectory() + @"\DiscoverCC\" + "Wild" + '\\' + discoverFile + ".ini");     // location and name of second preference file. IniManager; load into buffer
                }
                else
                {
                    _iniTierList0 = new IniManager(Directory.GetCurrentDirectory() + @"\DiscoverCC\" + "Standard" + '\\' + "discover.ini"); // _iniTierList; name and location of data file with extension .ini
                    _iniTierList1 = new IniManager(Directory.GetCurrentDirectory() + @"\DiscoverCC\" + "Wild" + '\\' + "discover.ini");     // location and name of second preference
                }
                choicesCardValue.Clear();

                // Decide to use standard or wild database
                for (int i = 0; i < 3; i++)
                {
                    foreach (var card in choices)                                                                  // loops for each card
                    {
                        var    cardTemplate = CardTemplate.LoadFromId(card);                                       //converts cardID to CardName
                        double p;
                        string HeroClass = board.FriendClass.ToString();                                           // Get friendly hero class
                        if (!_wildCards)                                                                           //Standard list
                        {
                            double.TryParse(_iniTierList0.GetString(cardTemplate.Name, HeroClass, "0"), out p);    //search for card from TierList hero class
                            if (p < 0.001)                                                                         // if points is zero, search for default points
                            {
                                double.TryParse(_iniTierList0.GetString(cardTemplate.Name, "points", "0"), out p); //search for card from TierList default points
                                HeroClass = "none";
                            }
                        }
                        else //Wild list
                        {
                            double.TryParse(_iniTierList1.GetString(cardTemplate.Name, HeroClass, "0"), out p); //search for card from TierList hero class
                            if (p < 0.001)                                                                         // if points is zero, search for default points
                            {
                                double.TryParse(_iniTierList1.GetString(cardTemplate.Name, "points", "0"), out p); //search for card from TierList default points
                                HeroClass = "none";
                            }
                        }
                        switch (i)
                        {
                        case 0:
                            if (p > 0)
                            {
                                _standard++;
                            }
                            break;

                        case 1:
                            if (p > 0)
                            {
                                _wild++;
                            }
                            break;

                        default:
                            int c = Array.IndexOf(heroes, HeroClass);
                            choicesCardValue.Add(new CardValue(card, p, c));     //add points, class to each card
                            break;
                        }
                    }
                    _wildCards = (i > 0 && _wild <= _standard) ? false : true; //toggle from false -> true 1st turn, 2nd turn select true/false on bestChoice of cards
                }
                int a = _standard + _wild + _indexDiscoverList;                //Break from loop when condition cards found
                if (a > 0)
                {
                    _reDiscoverCard = false; //Re-discover card?, Exit while loop if standard or wild card found or after loop2
                }
                else
                {
                    _reDiscoverCard = true; // if no cards found, repeat loop using cards from "discover.ini", wild and standard tierList
                    _indexDiscoverList++;   //index list
                }
            } while (_reDiscoverCard);

            // Select best card
            double bestPoints = 0;

            for (var i = 0; i < choicesCardValue.Count; i++)                                                   //loops through each card
            {
                var    cardValue = choicesCardValue[i];                                                        // index through cardValue
                double pts       = cardValue.GetPoints();                                                      // calls cardValue subroutine, get points
                int    heroIndex = cardValue.GetHeroClass();                                                   // calls cardValue subroutine, get hero class
                string hero      = heroIndex != 0 ? ", f - " + heroes[heroIndex] : "";                         //preparation to log
                Bot.Log(i + 1 + ") " + CardTemplate.LoadFromId(cardValue.GetCard()).Name + ": " + pts + hero); // output to SB log
                if (!(bestPoints < pts))
                {
                    continue;                     // selects highest points
                }
                bestChoice = cardValue.GetCard(); // calls cardValue subroutine, get card assign to bestChoice
                bestPoints = pts;                 // calls cardValue subroutine, get points assign to bestPoints
            }

            // Out to Bot log
            string fileName = _indexDiscoverList == 0 ? ": from " + discoverFile + ", " : ": from discover.ini, "; // retrieve name of file assign to fileName
            string tierList = !_wildCards ? "Standard tier-list" : "Wild tier-list";                               // get file directory

            Bot.Log("============================");
            Bot.Log("Best: " + CardTemplate.LoadFromId(bestChoice).Name + ": " + bestPoints + fileName + tierList);
            Bot.Log("============================");
            return(bestChoice); // returns bestChoice of card to SB
        }
Beispiel #18
0
 public static bool HasGoodEffect(CardTemplate _card)
 {
     return _card.Charge || _card.Divineshield || _card.Enrage || _card.Freeze ||
         _card.Stealth || _card.Taunt || _card.Windfury || _card.Spellpower > 0;
 }
 public SM_CZAR_CARD(CardTemplate card)
 {
     Card = card;
 }
Beispiel #20
0
        public void TestInitialize()
        {
            NotificationMessageProvider.Initialize(notificationProviderMock, 500000);

            template = new CardTemplate()
            {
                CardTemplateId = 1, Title = "template"
            };
            fieldDefinition1 = new CardFieldDefinition()
            {
                CardTemplate   = template,
                CardTemplateId = 1,
                FieldId        = 1,
                FieldName      = "Front"
            };
            fieldDefinition2 = new CardFieldDefinition()
            {
                CardTemplate   = template,
                CardTemplateId = 1,
                FieldId        = 2,
                FieldName      = "Back"
            };
            template.FieldDefinitions.Add(fieldDefinition1);
            template.FieldDefinitions.Add(fieldDefinition2);
            deck = new Deck()
            {
                DeckId = 1, DefaultCardTemplateId = 1, Title = "deck", DefaultCardTemplate = template
            };
            card1 = new Card()
            {
                CardId = 1, CardTemplateId = 1, CardTemplate = template, DeckId = 1, Deck = deck
            };
            field1 = new CardField()
            {
                CardFieldDefinition = fieldDefinition1,
                CardId         = 1,
                Card           = card1,
                CardTemplateId = 1,
                CardTemplate   = template,
                FieldId        = 1,
                FieldName      = "Front",
                Value          = "11",
                DueDate        = DateTime.Today
            };
            field2 = new CardField()
            {
                CardFieldDefinition = fieldDefinition2,
                CardId         = 1,
                Card           = card1,
                CardTemplateId = 1,
                CardTemplate   = template,
                FieldId        = 2,
                FieldName      = "Back",
                Value          = "12",
                DueDate        = DateTime.Today
            };
            card1.Fields.Add(field1);
            card1.Fields.Add(field2);
            card2 = new Card()
            {
                CardId = 2, CardTemplateId = 1, CardTemplate = template, DeckId = 1, Deck = deck
            };
            field3 = new CardField()
            {
                CardFieldDefinition = fieldDefinition1,
                CardId         = 2,
                Card           = card2,
                CardTemplateId = 1,
                CardTemplate   = template,
                FieldId        = 1,
                FieldName      = "Front",
                Value          = "21",
                DueDate        = DateTime.Today
            };
            field4 = new CardField()
            {
                CardFieldDefinition = fieldDefinition2,
                CardId         = 2,
                Card           = card2,
                CardTemplateId = 1,
                CardTemplate   = template,
                FieldId        = 2,
                FieldName      = "Back",
                Value          = "22",
                DueDate        = DateTime.Today.AddDays(1)
            };
            card2.Fields.Add(field3);
            card2.Fields.Add(field4);
            deck.Cards.Add(card1);
            deck.Cards.Add(card2);
        }
Beispiel #21
0
        public List <Card.Cards> HandleMulligan(List <Card.Cards> choices, Card.CClass opponentClass, Card.CClass ownClass)
        {
            GetDeck();

            var tierlistPath = Directory.GetCurrentDirectory() + @"\MulliganProfiles\MMTierlists\";

            if (Bot.CurrentMode() == Bot.Mode.Arena || Bot.CurrentMode() == Bot.Mode.Arena)
            {
                var arenaTierlist = _settingsManager.GetString("Decks", "Arena", "NoSetting");
                tierlistPath += arenaTierlist == "NoSetting" ? "SovietArena_TierList.ini" : arenaTierlist;
            }
            else
            {
                var rankedTierList = _settingsManager.GetString("Decks", Bot.CurrentDeck().Name, "NoSetting");
                tierlistPath += rankedTierList == "NoSetting" ? "SovietArena_TierList.ini" : rankedTierList;
            }

            _manager = new IniManager(tierlistPath);

            _keep          = new List <Card.Cards>();
            _opponentClass = opponentClass;
            _ownClass      = ownClass;
            _choices       = choices;
            _hand          = _choices.ToList();

            SimBoard.Opponnent = opponentClass;

            var curveImportance = ParseDouble(_manager.GetString("curve", "curveImportance", "0.5"));
            var fourDropMod     = ParseDouble(_manager.GetString("curve", "fourDropMod", "1"));

            SimBoard.OneDropMod   = ParseDouble(_manager.GetString("curve", "oneDropMod", "4")) / fourDropMod * curveImportance;
            SimBoard.TwoDropMod   = ParseDouble(_manager.GetString("curve", "twoDropMod", "3")) / fourDropMod * curveImportance;
            SimBoard.ThreeDropMod = ParseDouble(_manager.GetString("curve", "threeDropMod", "2")) / fourDropMod * curveImportance;
            SimBoard.FourDropMod  = curveImportance;

            _coin = _hand.Count >= 4;
            if (_coin)
            {
                _keep.Add(Card.Cards.GAME_005);
                _choices.Remove(Card.Cards.GAME_005);
                _deck.Add(Card.Cards.GAME_005);
            }

            _cardInfo = _manager.GetDict(_deck, ownClass);


            AddLog(Divider);

            AddLog("Deck:");
            foreach (Card.Cards card in _deck)
            {
                try
                {
                    AddLog("V: " + _cardInfo[card].CardPts.ToString().PadLeft(5) + " : " + CardTemplate.LoadFromId(card).Name);
                }
                catch (Exception)
                {
                    // ignored
                }
            }

            StartLog();

            string bestComboVal  = "0000";
            double bestComboPts  = double.MinValue;
            int    bestCardCount = 0;

            var combos = new Variations <bool>(new List <bool> {
                true, false
            }, _choices.Count, GenerateOption.WithRepetition);

            var deck = _deck.ToList();

            _hand.ForEach(x => deck.Remove(x));

            foreach (var combo in combos)
            {
                var comboCards = new List <Card.Cards>();
                for (var i = 0; i < _choices.Count; i++)
                {
                    if (combo[i])
                    {
                        comboCards.Add(_choices[i]);
                    }
                }

                var comboStr = "";
                foreach (bool b in combo)
                {
                    comboStr += b ? 1 : 0;
                }

                int count         = comboCards.Count;
                var startingHands = new Combinations <Card.Cards>(deck, _choices.Count - count).Select(x =>
                {
                    var ret = new List <Card.Cards>(x);
                    ret.AddRange(comboCards);
                    if (_coin)
                    {
                        ret.Add(Card.Cards.GAME_005);
                    }
                    return(ret);
                }).ToList();
                double combinationPts = (double)startingHands.Average(x => CurveSim(x));

                AddLog(String.Format("Combination: {0} -- Value: {1:###.###}", comboStr, combinationPts));

                if (bestComboPts < combinationPts || (Math.Abs(bestComboPts - combinationPts) < 0.01 && count > bestCardCount))
                {
                    bestCardCount = count;
                    bestComboPts  = combinationPts;
                    bestComboVal  = comboStr;
                }
            }

            #region EndLog

            AddLog(String.Format("Best Combination: {0} -- Value: {1:F3}", bestComboVal, bestComboPts));
            AddLog(Divider);

            AddLog("Finally keeping:");

            for (var i = _choices.Count - 1; i >= 0; i--)
            {
                if (bestComboVal[i] == '1')
                {
                    _keep.Add(_choices[i]);
                    var cardTmp = CardTemplate.LoadFromId(_choices[i]);
                    AddLog("> " + cardTmp.Name);
                }
            }

            if (_keep.Count == 0)
            {
                AddLog("Nothing");
            }

            AddLog(Divider);
            #endregion

            PrintLog();
            return(_keep);
        }
Beispiel #22
0
        /// <summary>
        /// </summary>
        /// <param name="choices"></param>
        /// <param name="whiteList"></param>
        /// <param name="opponentClass"></param>
        /// <param name="hasCoin"></param>
        /// <param name="removalSpells"></param>
        private static void MulliganShaman(List <Card> choices, Dictionary <string, bool> whiteList, CClass opponentClass,
                                           bool hasCoin, List <string> removalSpells)
        {
            //var gotWeapon = false;
            var control   = false;
            var oneDrop   = false;
            var twoDrop   = false;
            var threeDrop = false;

            foreach (var c in choices)
            {
                var temp = CardTemplate.LoadFromId(c.Name);
                if (temp.Race == SmartBot.Plugins.API.Card.CRace.TOTEM && temp.Cost == 2 && temp.Atk != 0)
                {
                    twoDrop = true;
                    whiteList.AddOrUpdate(c.Name, hasCoin);
                }

                switch (opponentClass)
                {
                case CClass.SHAMAN:
                    control = true;
                    break;

                case CClass.PRIEST:
                    control = true;
                    break;

                case CClass.MAGE:
                    //control = true;
                    break;

                case CClass.PALADIN:
                    break;

                case CClass.WARRIOR:
                    control = true;
                    break;

                case CClass.WARLOCK:
                {
                    whiteList.AddOrUpdate("EX1_245", false);     //earth shock because I assume it's a handlock
                    control = true;
                }
                break;

                case CClass.HUNTER:
                    break;

                case CClass.ROGUE:
                    control = true;
                    break;

                case CClass.DRUID:     // I assume that druids on the ladder are aggro
                    //control = true;
                    break;

                default:
                    throw new ArgumentOutOfRangeException("opponentClass", opponentClass, null);
                }
                if (temp.Type == SmartBot.Plugins.API.Card.CType.MINION &&
                    temp.Quality != SmartBot.Plugins.API.Card.CQuality.Epic)
                {
                    if (temp.Cost == 1)
                    {
                        oneDrop = true;
                        whiteList.AddOrUpdate(c.Name, !control);
                    }
                    if (temp.Cost == 2 && temp.Atk > 0)
                    {
                        twoDrop = true;
                        whiteList.AddOrUpdate(c.Name, false);
                    }
                    if (!control && temp.Cost == 3 && temp.Atk > 1)
                    {
                        threeDrop = true;
                        whiteList.AddOrUpdate(c.Name, hasCoin);
                    }
                }
                var curve = twoDrop || threeDrop && hasCoin;
                if (curve && temp.Cost == 4 && temp.Atk > 3)
                {
                    whiteList.AddOrUpdate(c.Name, false);
                }
            }
            foreach (var c in choices)
            {
                var temp = CardTemplate.LoadFromId(c.Name);
                if (temp.Type != SmartBot.Plugins.API.Card.CType.SPELL)
                {
                    continue;
                }
                if (control && temp.Cost == 1)
                {
                    whiteList.AddOrUpdate(c.Name, false);
                }
                if (!control && temp.Cost == 3 && !removalSpells.Contains(c.Name))
                {
                    whiteList.AddOrUpdate(c.Name, false);
                }
            }
        }
Beispiel #23
0
 public void CardAttackTrade(PlayerSetup playerSetup, CardTemplate cardTemplate, int hp, int dmg)
 {
     Console.WriteLine(cardTemplate.GetNameType() + "[" + playerSetup.name + "](" + hp + " -> " + (hp - dmg) + ")");
 }
Beispiel #24
0
        /// <summary>
        ///     Supported deck arthetypes:
        ///     Mech Warrior
        /// </summary>
        /// <param name="choices"></param>
        /// <param name="whiteList"></param>
        /// <param name="opponentClass"></param>
        /// <param name="coin"></param>
        private static void MulliganWarrior(IEnumerable <Card> choices, IDictionary <string, bool> whiteList,
                                            CClass opponentClass, bool coin)
        {
            var gotWeapon = false;
            var control   = false;
            var oneDrop   = false;
            var twoDrop   = false;
            var threeDrop = false;
            var weapons   = new List <string>();

            foreach (var c in choices)
            {
                var temp = CardTemplate.LoadFromId(c.Name);
                if (!gotWeapon && temp.Type == SmartBot.Plugins.API.Card.CType.WEAPON && temp.Cost == 2)
                {
                    twoDrop = true;
                    whiteList.AddOrUpdate(c.Name, false);
                    gotWeapon = true;
                }
                if (temp.Race == SmartBot.Plugins.API.Card.CRace.MECH)
                {
                    if (temp.Cost == 1)
                    {
                        oneDrop = true;
                        whiteList.AddOrUpdate(c.Name, false);
                    }
                    if (temp.Cost == 2)
                    {
                        twoDrop = true;
                        whiteList.AddOrUpdate(c.Name, false);
                    }
                    if (temp.Cost == 3)
                    {
                        threeDrop = true;
                        whiteList.AddOrUpdate(c.Name, false);
                    }
                }
                if (temp.Type != SmartBot.Plugins.API.Card.CType.WEAPON && temp.Cost <= 3 &&
                    temp.Type != SmartBot.Plugins.API.Card.CType.SPELL &&
                    temp.Race != SmartBot.Plugins.API.Card.CRace.MECH)
                {
                    whiteList.AddOrUpdate(c.Name, false);
                }
                switch (opponentClass)
                {
                case CClass.SHAMAN:
                    control = true;
                    break;

                case CClass.PRIEST:
                    control = true;
                    break;

                case CClass.MAGE:
                    //control = true;
                    break;

                case CClass.PALADIN:
                    break;

                case CClass.WARRIOR:
                    control = true;
                    break;

                case CClass.WARLOCK:
                    control = true;
                    break;

                case CClass.HUNTER:
                    break;

                case CClass.ROGUE:
                    control = true;
                    break;

                case CClass.DRUID:
                    control = true;
                    break;

                default:
                    throw new ArgumentOutOfRangeException("opponentClass", opponentClass, null);
                }
                if (!control)
                {
                    continue;
                }
                //var curve = twoDrop && threeDrop;
                if (temp.Type != SmartBot.Plugins.API.Card.CType.WEAPON && twoDrop && temp.Cost == 4 &&
                    temp.Race == SmartBot.Plugins.API.Card.CRace.MECH && temp.Atk > 3)
                {
                    whiteList.AddOrUpdate(c.Name, false);
                }
                //if (coin && temp.Quality == SmartBot.Plugins.API.Card.CQuality.Epic)
                //    _whiteList.AddOrUpdate(c.Name,false);
            }
            foreach (var c in from c in choices let temp = CardTemplate.LoadFromId(c.Name) where !gotWeapon && temp.Type == SmartBot.Plugins.API.Card.CType.WEAPON && c.Cost > 2 && c.Cost < 5 select c)
            {
                gotWeapon = true;
                whiteList.AddOrUpdate(c.Name, false);
                break;
            }
        }
        //Profile Version 1.15


        //攻击模式



        public ProfileParameters GetParameters(Board board)
        {
            var p = new ProfileParameters(BaseProfile.Rush);

            p.DiscoverSimulationValueThresholdPercent = 10;
            //自定义命名
            int LibraryResidueSecret = 2 - (board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).IsSecret) + board.Hand.Count(card => card.Template.IsSecret) + board.Secret.Count);//牌库剩余奥秘

            //针对一些随从优先解掉

            //攻击模式切换

            //具体策略

            //武器优先值
            // p.CastWeaponsModifiers.AddOrUpdate(Card.Cards.DRG_025, new Modifier(-80));//海盗之锚 Ancharrr  ID:DRG_025


            //武器攻击保守性
            p.WeaponsAttackModifiers.AddOrUpdate(Card.Cards.CS2_091, new Modifier(0)); //圣光的正义 Light's Justice  ID:CS2_091
            p.WeaponsAttackModifiers.AddOrUpdate(Card.Cards.BT_011t, new Modifier(0)); //迟到的正义 Overdue Justice  ID:BT_011t

            //法术

            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.GAME_005, new Modifier(50));//幸运币 The Coin  ID:GAME_005
            //p.CastSpellsModifiers.AddOrUpdate(Card.Cards.BT_011, new Modifier(140));//正义圣契 Libram of Justice  ID:BT_011


            //随从优先值
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.BT_020, new Modifier(-200)); //奥尔多侍从 Aldor Attendant  ID:BT_020
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.BT_026, new Modifier(-200)); //奥尔多真理追寻者 Aldor Truthseeker  ID:BT_026
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DRG_232, new Modifier(5));   //光铸狂热者 Lightforged Zealot  ID:DRG_232
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.BT_019t, new Modifier(15));  //终极莫戈尔格 Murgurgle Prime ID:BT_019t
            //p.CastMinionsModifiers.AddOrUpdate(Card.Cards.BT_334, new Modifier(20));//女伯爵莉亚德琳 Lady Liadrin  ID:BT_334

            //如果牌库里有炸弹或者鸽子不下光铸卡(实测无效,不影响)
            if (board.Deck.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.BOT_511t) >= 1 ||        //炸弹 Bomb ID:BOT_511t
                board.Deck.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DRG_071t) >= 1           //信天翁 Albatross ID:DRG_071t
                )
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DRG_231, new Modifier(150)); //光铸远征军 Lightforged Crusader ID:DRG_231
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DRG_232, new Modifier(150)); //光铸狂热者 Lightforged Zealot ID:DRG_232
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DMF_241, new Modifier(150)); //大主教伊瑞尔 High Exarch Yrel ID:DMF_241
            }

            //刀耐久为1,手上没武器,手牌太少本回合英雄不攻击
            if (board.Hand.Count <= 3 &&
                (board.WeaponFriend != null) &&
                !(board.HasCardInHand(Card.Cards.DMF_238)) &&
                !(board.HasCardInHand(Card.Cards.CS2_097))
                )
            {
                //对面是战士有可能会带黏指狗头人
                if (board.WeaponFriend.CurrentDurability == 1 &&
                    !(board.EnemyClass == Card.CClass.WARRIOR))
                {
                    p.WeaponsAttackModifiers.AddOrUpdate(Card.Cards.DMF_238, new Modifier(6000)); //纳鲁之锤 Hammer of the Naaru ID:DMF_238
                    p.WeaponsAttackModifiers.AddOrUpdate(Card.Cards.CS2_097, new Modifier(6000)); //真银圣剑 Truesilver Champion ID:CS2_097
                    Bot.Log("刀耐久为1,手上没武器,手牌太少本回合英雄不攻击");
                }
            }

            //手上有刀,手上有纳鲁之锤,先攻击后使用纳鲁之锤
            if ((board.WeaponFriend != null) &&
                (board.HasCardInHand(Card.Cards.DMF_238))
                )
            {
                p.WeaponsAttackModifiers.AddOrUpdate(Card.Cards.DMF_238, new Modifier(-600)); //纳鲁之锤 Hammer of the Naaru ID:DMF_238
                p.WeaponsAttackModifiers.AddOrUpdate(Card.Cards.CS2_097, new Modifier(-600)); //真银圣剑 Truesilver Champion ID:CS2_097
            }

            //如果新生入学给了安全检察员,给了中立卡,不下
            //漏掉了贼猫会给复生卡
            //如果手上有 安全检查员 Safety Inspector ID:DMF_125
            if (board.HasCardInHand(Card.Cards.DMF_125))
            {
                //判定手上有无其他中立卡
                if (
                    //通灵学院
                    board.HasCardInHand(Card.Cards.SCH_231) ||                 //新生刺头 Intrepid Initiate ID:SCH_231
                    board.HasCardInHand(Card.Cards.SCH_311) ||                    //活化扫帚 Animated Broomstick ID:SCH_311
                    board.HasCardInHand(Card.Cards.SCH_312) ||                    //巡游向导 Tour Guide ID:SCH_312
                    board.HasCardInHand(Card.Cards.SCH_248)                       //甩笔侏儒 Pen Flinger ID:SCH_248
                    //外域的灰烬
                    || board.HasCardInHand(Card.Cards.BT_722) ||                 //防护改装师 Guardian Augmerchant ID:BT_722
                    board.HasCardInHand(Card.Cards.BT_723) ||                    //火箭改装师 Rocket Augmerchant ID:BT_723
                    board.HasCardInHand(Card.Cards.BT_724) ||                    //虚灵改装师 Ethereal Augmerchant ID:BT_724
                    board.HasCardInHand(Card.Cards.BT_727) ||                    //魂缚灰舌 Soulbound Ashtongue ID:BT_727
                    board.HasCardInHand(Card.Cards.BT_731)                       //传染孢子 Infectious Sporeling ID:BT_731
                    //巨龙降临
                    || board.HasCardInHand(Card.Cards.DRG_239) ||                 //灼光战斗法师 Blazing Battlemage ID:DRG_239
                    board.HasCardInHand(Card.Cards.DRG_057) ||                    //热气球 Hot Air Balloon ID:DRG_057
                    board.HasCardInHand(Card.Cards.DRG_078)                       //深潜炸弹 Depth Charge ID:DRG_078
                    //奥丹姆奇兵
                    || board.HasCardInHand(Card.Cards.ULD_282) ||                 //陶罐商人 Jar Dealer ID:ULD_282
                    board.HasCardInHand(Card.Cards.ULD_191) ||                    //欢快的同伴 Beaming Sidekick ID:ULD_191
                    board.HasCardInHand(Card.Cards.ULD_705) ||                    //魔古信徒 Mogu Cultist ID:ULD_705
                    board.HasCardInHand(Card.Cards.ULD_723)                       //鱼人木乃伊 Murmy ID:ULD_723
                    //暗影崛起
                    || board.HasCardInHand(Card.Cards.DAL_544) ||                 //药水商人 Potion Vendor ID:DAL_544
                    board.HasCardInHand(Card.Cards.DAL_077)                       //毒鳍鱼人 Toxfin ID:DAL_077
                    //经典
                    || board.HasCardInHand(Card.Cards.EX1_080) ||                 //奥秘守护者 Secretkeeper ID:EX1_080
                    board.HasCardInHand(Card.Cards.CS2_188) ||                    //叫嚣的中士 Abusive Sergeant ID:CS2_188
                    board.HasCardInHand(Card.Cards.NEW1_017) ||                    //鱼人杀手蟹 Hungry Crab ID:NEW1_017
                    board.HasCardInHand(Card.Cards.EX1_509) ||                    //鱼人招潮者 Murloc Tidecaller ID:EX1_509
                    board.HasCardInHand(Card.Cards.CS2_169) ||                    //幼龙鹰 Young Dragonhawk ID:CS2_169
                    board.HasCardInHand(Card.Cards.EX1_029) ||                    //麻风侏儒 Leper Gnome ID:EX1_029
                    board.HasCardInHand(Card.Cards.CS2_146) ||                    //南海船工 Southsea Deckhand ID:CS2_146
                    board.HasCardInHand(Card.Cards.EX1_008) ||                    //银色侍从 Argent Squire ID:EX1_008
                    board.HasCardInHand(Card.Cards.EX1_405) ||                    //持盾卫士 Shieldbearer ID:EX1_405
                    board.HasCardInHand(Card.Cards.EX1_010) ||                    //狼人渗透者 Worgen Infiltrator ID:EX1_010
                    board.HasCardInHand(Card.Cards.NEW1_025) ||                    //血帆海盗 Bloodsail Corsair ID:NEW1_025
                    board.HasCardInHand(Card.Cards.EX1_004) ||                    //年轻的女祭司 Young Priestess ID:EX1_004
                    board.HasCardInHand(Card.Cards.EX1_001) ||                    //圣光护卫者 Lightwarden ID:EX1_001
                    board.HasCardInHand(Card.Cards.EX1_009)                       //愤怒的小鸡 Angry Chicken ID:EX1_009
                    //基本
                    || board.HasCardInHand(Card.Cards.EX1_011) ||                 //巫医 Voodoo Doctor ID:EX1_011
                    board.HasCardInHand(Card.Cards.CS2_168) ||                    //鱼人袭击者 Murloc Raider ID:CS2_168
                    board.HasCardInHand(Card.Cards.CS2_189) ||                    //精灵弓箭手 Elven Archer ID:CS2_189
                    board.HasCardInHand(Card.Cards.EX1_508) ||                    //暗鳞先知 Grimscale Oracle ID:EX1_508
                    board.HasCardInHand(Card.Cards.CS2_171) ||                    //石牙野猪 Stonetusk Boar ID:CS2_171
                    board.HasCardInHand(Card.Cards.CS1_042)                       //闪金镇步兵 Goldshire Footman ID:CS1_042
                    //贼猫给的复生卡
                    || board.HasCardInHand(Card.Cards.ULD_723) ||                 //鱼人木乃伊 Murmy ID:ULD_723
                    board.HasCardInHand(Card.Cards.ULD_185) ||                    //神殿狂战士 Temple Berserker ID:ULD_185
                    board.HasCardInHand(Card.Cards.ULD_205) ||                    //夺烛木乃伊 Candletaker ID:ULD_205
                    board.HasCardInHand(Card.Cards.ULD_214) ||                    //慷慨的木乃伊 Generous Mummy ID:ULD_214
                    board.HasCardInHand(Card.Cards.ULD_275) ||                    //白骨怨灵 Bone Wraith ID:ULD_275
                    board.HasCardInHand(Card.Cards.ULD_274) ||                    //废土刺客 Wasteland Assassin ID:ULD_274
                    board.HasCardInHand(Card.Cards.ULD_702) ||                    //机械法医 Mortuary Machine ID:ULD_702
                    board.HasCardInHand(Card.Cards.ULD_208) ||                    //卡塔图防御者 Khartut Defender ID:ULD_208
                    board.HasCardInHand(Card.Cards.ULD_215) ||                    //被缚的魔像 Wrapped Golem ID:ULD_215
                    board.Hand.Count(minion => minion.Template.Id == Card.Cards.DMF_125) >= 2 //如果给了2张安全检察员(发牌员你去死吧)!!!
                    //应该不会有月亮巨人洗到牌库里这个情况吧??他可是10费卡
                    )                                                                         //如果手上有中立卡
                //如果手上和牌库里有光铸卡,那么这张卡不能用
                {
                    if (board.Deck.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DRG_231) >= 1 ||                //光铸远征军 Lightforged Crusader ID:DRG_231
                        board.Deck.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DRG_232) >= 1 ||                //光铸狂热者 Lightforged Zealot ID:DRG_232
                        board.Deck.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.DMF_241) >= 1 ||                //大主教伊瑞尔 High Exarch Yrel ID:DMF_241
                        board.HasCardInHand(Card.Cards.DRG_231) ||                //光铸远征军 Lightforged Crusader ID:DRG_231
                        board.HasCardInHand(Card.Cards.DRG_232) ||                //光铸狂热者 Lightforged Zealot ID:DRG_232
                        board.HasCardInHand(Card.Cards.DMF_241)                   //大主教伊瑞尔 High Exarch Yrel ID:DMF_241
                        )
                    {
                        p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DMF_125, new Modifier(999));                        //安全检查员 Safety Inspector ID:DMF_125
                    }
                    else
                    {
                        //光铸卡打完了,直接过牌
                        p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DMF_125, new Modifier(-100));                        //安全检查员 Safety Inspector ID:DMF_125
                    }
                }
                else
                {
                    //手上没中立卡,过一张牌岂不美哉?
                    p.CastMinionsModifiers.AddOrUpdate(Card.Cards.DMF_125, new Modifier(-100));                    //安全检查员 Safety Inspector ID:DMF_125
                }
            }

            //对面没随从,降低扫帚和巴罗夫优先级
            if (board.MinionEnemy.Count <= 1 &&
                board.HasCardInHand(Card.Cards.SCH_311) ||        //活化扫帚 Animated Broomstick  ID:SCH_311
                board.HasCardInHand(Card.Cards.SCH_526)           //巴罗夫领主 Lord Barov  ID:SCH_526
                )
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.SCH_311, new Modifier(150));         //活化扫帚 Animated Broomstick  ID:SCH_311
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.SCH_526, new Modifier(200));         //巴罗夫领主 Lord Barov  ID:SCH_526
            }


            //送掉怪


            //随从优先解
            //提高战斗邪犬威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_351, new Modifier(200));
            //炸弹牛仔应该解
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOD_024, new Modifier(200));
            //提高相位威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_252, new Modifier(200));
            //提高热气球威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_057, new Modifier(200));
            //提高空中私掠者威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOD_016, new Modifier(200));
            //提高搬水工威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_270, new Modifier(200));
            //提高凶恶的废钢猎犬威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DAL_759, new Modifier(200));
            //提高神殿狂战士威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_185, new Modifier(200));
            //大法师瓦格斯
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DAL_558, new Modifier(200));
            //提高厄运信天翁
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_071, new Modifier(200));
            //提高高级跟班厄尔克
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOD_035, new Modifier(200));
            //提高狂奔的魔刃豹
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOD_006, new Modifier(200));
            //提高卡雷苟斯
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DAL_609, new Modifier(200));
            //提高希亚玛特
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_178, new Modifier(200));
            //提高齐恩瓦拉
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_104, new Modifier(200));
            //提高雏龙
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_116t, new Modifier(200));
            //提高铸甲师
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_402, new Modifier(200));
            //提高无面渗透者威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DAL_039, new Modifier(200));
            //提高鲨鱼之灵威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.TRL_092, new Modifier(200));
            //提高灭龙弩炮威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_256, new Modifier(200));
            //提高流放者奥图里斯威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_937, new Modifier(200));
            //提高暗影珠宝师汉纳尔威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_188, new Modifier(200));
            //提高萨特监工威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_352, new Modifier(200));
            //提高怒鳞纳迦威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_355, new Modifier(200));
            //提高特殊坐骑商人威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DAL_774, new Modifier(200));
            //提高鲨鳍后援威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.TRL_507, new Modifier(200));
            //提高小鬼骑士 Tiny Knight of Evil  ID:AT_021威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.AT_021, new Modifier(200));
            //提高对空奥术法师 Arcane Flakmage  ID:ULD_240威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_240, new Modifier(200));
            //提高巫师学徒 Sorcerer's Apprentice  ID:EX1_608威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_608, new Modifier(200));
            //提高银色神官帕尔崔丝 Confessor Paletress ID:AT_018威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.AT_018, new Modifier(200));
            //提高连环腿大师 Whirlkick Master ID:ULD_231威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_231, new Modifier(200));
            //提高了不起的杰弗里斯 Zephrys the Great ID:ULD_003威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_003, new Modifier(200));
            //塞泰克织巢者 Sethekk Veilweaver ID:BT_254
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_254, new Modifier(199));
            //艾德温·范克里夫 Edwin VanCleef ID:EX1_613
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_613, new Modifier(200));
            //伊格诺斯 Il'gynoth ID:DMF_230
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_230, new Modifier(200));
            //纳兹曼尼织血者 Nazmani Bloodweaver ID:DMF_120
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_120, new Modifier(200));
            //加基森拍卖师 Gadgetzan Auctioneer ID:EX1_095
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_095, new Modifier(200));
            //菲里克·飞刺 Flik Skyshiv ID:DRG_037
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_037, new Modifier(200));
            //死亡守望者 Deathwarden ID:YOP_012
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOP_012, new Modifier(200));

            //如果对面是猎人,需要提高矮人神射手的威胁值
            if (board.EnemyClass == Card.CClass.HUNTER &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DRG_253)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_253, new Modifier(200));                //矮人神射手 Dwarven Sharpshooter ID:DRG_253
                //Bot.Log("对面是猎人要优先解掉神射手");
            }

            //如果对面是贼,需要提高魔杖窃贼的威胁值
            if (board.EnemyClass == Card.CClass.ROGUE &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.SCH_350)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_350, new Modifier(199));                //魔杖窃贼 Wand Thief ID:SCH_350
                //Bot.Log("对面是潜行者要优先解掉魔杖窃贼");
            }

            //如果对面是贼,需要提高狐人老千的威胁值
            if (board.EnemyClass == Card.CClass.ROGUE &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_511)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_511, new Modifier(199));                //狐人老千 Foxy Fraud ID:DMF_511
                //Bot.Log("对面是潜行者要优先解掉狐人老千");
            }

            //如果对面是萨满,需要提高沙漠野兔的威胁值
            if (board.EnemyClass == Card.CClass.SHAMAN &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.ULD_719) ||
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_703) ||
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_703t) ||
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_706t)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_719, new Modifier(200));                //沙漠野兔 Desert Hare ID:ULD_719
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_703, new Modifier(200));                //死斗场管理者 Pit Master ID:DMF_703
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_703t, new Modifier(200));               //死斗场管理者(已腐蚀) Pit Master ID:DMF_703t
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_706t, new Modifier(200));               //大帐决斗者 Pavilion Duelist ID:DMF_706t
                Bot.Log("对面是萨满要优先解掉野兔、死斗场决斗者");
            }

            //如果对面是瞎子提高血法师威胁值
            if (board.EnemyClass == Card.CClass.DEMONHUNTER &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.EX1_012)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_012, new Modifier(199));                //血法师萨尔诺斯 Bloodmage Thalnos ID:EX1_012
                Bot.Log("对面是瞎子提高血法师威胁值");
            }

            //提高空中炮艇 Skybarge ID:DRG_023威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_023, new Modifier(200));
            //提高邪能领主贝图格 Fel Lord Betrug  ID:DAL_607威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DAL_607, new Modifier(200));
            //提高强能箭猪 Augmented Porcupine  ID:BT_201威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_201, new Modifier(200));
            //提高黑眼
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_307, new Modifier(200));
            //提高废料场巨像 Scrapyard Colossus  ID:BT_155
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_155, new Modifier(200));
            //改进型恐惧魔王 Enhanced Dreadlord  ID:BT_304
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_304, new Modifier(200));

            //狐人淬毒师 Vulpera Toxinblade  ID:SCH_519
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_519, new Modifier(200));
            //贪婪的书虫 Voracious Reader ID:SCH_142
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_142, new Modifier(200));
            //任务达人 Questing Adventurer ID:EX1_044
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_044, new Modifier(200));

            //提高空中炮艇 Skybarge ID:DRG_023威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_023, new Modifier(200));
            //提高邪能领主贝图格 Fel Lord Betrug  ID:DAL_607威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DAL_607, new Modifier(200));

            //降低攻击优先值
            //降低资深探险者 Licensed Adventurer ID:YOD_030威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOD_030, new Modifier(70));
            //降低龙裔小鬼威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_238t12t2, new Modifier(60));

            return(p);
        }
Beispiel #26
0
        private static int Arcanologist(Board board)
        {
            var v = Mtd.TierList.GetCardValue(Cards.Arcanologist, board.FriendClass);

            return(board.Deck.Any(x => CardTemplate.LoadFromId(x).IsSecret) ? v : Mtd.TierList.GetCardValue(Cards.RiverCrocolisk, Card.CClass.NONE));
        }
        //version 1.3 (2021-09-23)


        //攻击模式



        public ProfileParameters GetParameters(Board board)
        {
            //用BaseProfile函数调用加载云端的Rush策略
            var p = new ProfileParameters(BaseProfile.Rush);

            p.DiscoverSimulationValueThresholdPercent = 10;

            //贫瘠之地默认优先级-BAR

            //贫瘠之地铁匠 Barrens Blacksmith ID:BAR_073
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_073, new Modifier(200));
            //十字路口哨所 Crossroads Watch Post ID:BAR_075
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_075, new Modifier(200));
            //布鲁坎 Bru'kan ID:BAR_048
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_048, new Modifier(200));
            //凯瑞尔·罗姆 Cariel Roame ID:BAR_902
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_902, new Modifier(200));
            //战地医师老兵 Veteran Warmedic ID:BAR_878
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_878, new Modifier(200));
            //腐烂的普雷莫尔 Plaguemaw the Rotting ID:BAR_540
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_540, new Modifier(200));
            //钢鬃卫兵 Razormane Battleguard ID:BAR_537
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_537, new Modifier(200));
            //勘探者车队 Prospector's Caravan ID:BAR_033
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_033, new Modifier(200));
            //科卡尔驯犬者 Kolkar Pack Runner ID:BAR_035
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_035, new Modifier(200));
            //士兵车队 Soldier's Caravan ID:BAR_871
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_871, new Modifier(200));
            //占卜者车队 Soothsayer's Caravan ID:BAR_312
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_312, new Modifier(200));
            //高效八爪机器人 Efficient Octo-bot ID:BAR_320
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_320, new Modifier(200));
            //鱼人宝宝车队 Tinyfin's Caravan ID:BAR_043
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_043, new Modifier(200));
            //火焰术士弗洛格尔 Firemancer Flurgl ID:BAR_860
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_860, new Modifier(200));
            //剂师车队 Apothecary's Caravan ID:BAR_912
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_912, new Modifier(200));
            //甜水鱼人斥候 Lushwater Scout ID:BAR_063
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_063, new Modifier(200));
            //前沿哨所 Far Watch Post ID:BAR_074
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_074, new Modifier(200));
            //古夫·符文图腾 Guff Runetotem ID:BAR_720
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_720, new Modifier(200));
            //塔维什·雷矛 Tavish Stormpike ID:BAR_038
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_038, new Modifier(200));
            //奥术发光体 Arcane Luminary ID:BAR_545
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_545, new Modifier(200));
            //霜舌半人马 Rimetongue ID:BAR_888
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_888, new Modifier(200));
            //原野联络人 Field Contact ID:BAR_317
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_317, new Modifier(200));
            //莫尔杉哨所 Mor'shan Watch Post ID:BAR_076
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_076, new Modifier(200));
            //十字路口大嘴巴 Crossroads Gossiper ID:BAR_890
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_890, new Modifier(200));
            //贫瘠之地诱捕者 Barrens Trapper ID:BAR_082
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_082, new Modifier(200));

            //自定义命名
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.GAME_005, new Modifier(150));                                            //幸运币 The Coin  ID:GAME_005
            int a = (board.HeroFriend.CurrentHealth + board.HeroFriend.CurrentArmor) - BoardHelper.GetEnemyHealthAndArmor(board); //敌我血量差



            //随从优先解

            //核心
            //提高雏龙(暂定)
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.EX1_116t, new Modifier(200));
            //提高铸甲师 Armorsmith ID:CORE_EX1_402
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.CORE_EX1_402, new Modifier(200));
            //加基森拍卖师 Gadgetzan Auctioneer ID:CORE_EX1_095
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.CORE_EX1_095, new Modifier(200));

            //外域的灰烬-BT
            //灵魂之匣 Reliquary of Souls ID:BT_197
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_197, new Modifier(200));
            //星术师索兰莉安 Astromancer Solarian ID:BT_028
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_028, new Modifier(200));
            //莫戈尔·莫戈尔格 Murgur Murgurgle ID:BT_019
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_019, new Modifier(200));
            //坎雷萨德·埃伯洛克 Kanrethad Ebonlocke ID:BT_309
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_309, new Modifier(200));
            //孢子首领姆希菲 Archspore Msshi'fn ID:BT_136
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_136, new Modifier(200));
            //莫顶级捕食者兹克索尔 Zixor, Apex Predator ID:BT_210
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_210, new Modifier(200));
            //阿卡玛 Akama ID:BT_713
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_713, new Modifier(200));
            //瓦丝琪女士 Lady Vashj ID:BT_109
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_109, new Modifier(200));
            //卡加斯·刃拳 Kargath Bladefist ID:BT_123
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_123, new Modifier(200));
            //终极卡加斯 Kargath Prime ID:BT_123t
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_123t, new Modifier(200));
            //提高战斗邪犬威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_351, new Modifier(200));
            //提高流放者奥图里斯威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_937, new Modifier(200));
            //提高暗影珠宝师汉纳尔威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_188, new Modifier(200));
            //提高萨特监工威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_352, new Modifier(200));
            //提高怒鳞纳迦威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_355, new Modifier(200));
            //强能箭猪 Augmented Porcupine  ID:BT_201
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_201, new Modifier(200));
            //提高黑眼
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_307, new Modifier(200));
            //提高废料场巨像 Scrapyard Colossus  ID:BT_155
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_155, new Modifier(200));
            //改进型恐惧魔王 Enhanced Dreadlord  ID:BT_304
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_304, new Modifier(200));
            //塞泰克织巢者 Sethekk Veilweaver ID:BT_254
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_254, new Modifier(200));

            //通灵学院-SCH
            //决斗大师莫扎奇 Mozaki, Master Duelist ID:SCH_400
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_400, new Modifier(200));
            //狐人淬毒师 Vulpera Toxinblade  ID:SCH_519
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_519, new Modifier(200));
            //贪婪的书虫 Voracious Reader ID:SCH_142
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_142, new Modifier(200));

            //暗月马戏团-DMF
            //伊格诺斯 Il'gynoth ID:DMF_230
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_230, new Modifier(200));
            //纳兹曼尼织血者 Nazmani Bloodweaver ID:DMF_120
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_120, new Modifier(200));

            //暗月竞速赛-YOP
            //死亡守望者 Deathwarden ID:YOP_012
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOP_012, new Modifier(200));
            //铁锈特使拉斯维克斯 Envoy Rustwix ID:YOP_004
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOP_004, new Modifier(200));



            //贫瘠之地的锤炼-BAR
            //塔姆辛·罗姆 Tamsin Roame ID:BAR_918
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_918, new Modifier(200));
            //火焰术士弗洛格尔 Firemancer Flurgl ID:BAR_860
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_860, new Modifier(200));
            //古夫·符文图腾 Guff Runetotem ID:BAR_720
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_720, new Modifier(200));
            //塔维什·雷矛 Tavish Stormpike ID:BAR_038
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_038, new Modifier(200));
            //洛卡拉 Rokara ID:BAR_847
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_847, new Modifier(200));
            //腐烂的普雷莫尔 Plaguemaw the Rotting ID:BAR_540
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_540, new Modifier(200));
            //凯瑞尔·罗姆 Cariel Roame ID:BAR_902
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BAR_902, new Modifier(200));

            //针对职业

            //如果对面是贼,需要提高魔杖窃贼的威胁值
            if (board.EnemyClass == Card.CClass.ROGUE &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.SCH_350)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_350, new Modifier(199));                //魔杖窃贼 Wand Thief ID:SCH_350
                //Bot.Log("对面是潜行者要优先解掉魔杖窃贼");
            }

            //如果对面是贼,需要提高狐人老千的威胁值
            if (board.EnemyClass == Card.CClass.ROGUE &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_511)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_511, new Modifier(199));                //狐人老千 Foxy Fraud ID:DMF_511
                //Bot.Log("对面是潜行者要优先解掉狐人老千");
            }

            //如果对面是萨满,需要提高沙漠野兔的威胁值
            if (board.EnemyClass == Card.CClass.SHAMAN &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_703) ||
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_703t) ||
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_706t)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_703, new Modifier(200));                //死斗场管理者 Pit Master ID:DMF_703
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_703t, new Modifier(200));               //死斗场管理者(已腐蚀) Pit Master ID:DMF_703t
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_706t, new Modifier(200));               //大帐决斗者 Pavilion Duelist ID:DMF_706t
                //Bot.Log("对面是萨满要优先解掉野兔、死斗场决斗者");
            }

            //如果对面是萨满,需要优先解掉大眼睛
            if (board.EnemyClass == Card.CClass.SHAMAN &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.DMF_709)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DMF_709, new Modifier(200));                //巨型图腾埃索尔 Grand Totem Eys'or ID:DMF_709
                //Bot.Log("对面是萨满优先解掉大眼睛");
            }

            //如果对面是瞎子提高血法师威胁值
            if (board.EnemyClass == Card.CClass.DEMONHUNTER &&
                board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.CORE_EX1_012)
                )
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.CORE_EX1_012, new Modifier(199));                //血法师萨尔诺斯 Bloodmage Thalnos ID:CORE_EX1_012
                //Bot.Log("对面是瞎子提高血法师威胁值");
            }

            //如果对面是法师提高法强随从威胁值
            if (board.EnemyClass == Card.CClass.MAGE)
            {
                //p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_245, new Modifier(200));//卷轴管理者 Steward of Scrolls ID:SCH_245
                //p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BT_028, new Modifier(200));//星术师索兰莉安 Astromancer Solarian ID:BT_028
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_273, new Modifier(200));                //莱斯·霜语 Ras Frostwhisper ID:SCH_273
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.YOP_021, new Modifier(200));                //被禁锢的凤凰 Imprisoned Phoenix ID:YOP_021
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.SCH_310, new Modifier(200));                //研究伙伴 Lab Partner ID:SCH_310
                //Bot.Log("对面是法师提高法强随从威胁值");
            }



            //降低攻击优先值
            //降低龙裔小鬼威胁值
            //p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.DRG_238t12t2, new Modifier(60));

            //手工策略
            //牌库数量大于10张的时候,提高过牌的优先级,降低333优先级
            //Bot.Log("我方牌库剩余牌数" + board.FriendDeckCount);
            if (board.FriendDeckCount > 10)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.BAR_916, new Modifier(150));                //血岩碎片刺背野猪人 Blood Shard Bristleback ID:BAR_916
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.YOP_033, new Modifier(-200));                //赛车回火 Backfire ID:YOP_033
                p.CastHeroPowerModifier.AddOrUpdate(Card.Cards.CS2_056_H1, new Modifier(-100));           //生命分流 Life Tap ID:HERO_07bp
            }

            //亡者复生BUG
            //坟场怪数量==0,不用亡者复生
            if (board.HasCardInHand(Card.Cards.SCH_514) &&         //亡者复生 Raise Dead  ID:SCH_514
                board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).Type == Card.CType.MINION) == 0)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.SCH_514, new Modifier(9999));                //亡者复生 Raise Dead  ID:SCH_514
            }

            //对方没有随从降低333优先级
            if (board.MinionEnemy.Count == 0)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.BAR_916, new Modifier(150));                //血岩碎片刺背野猪人 Blood Shard Bristleback ID:BAR_916
            }
            //提高闪金镇狼人的优先级
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.SW_062, new Modifier(-200));            //闪金镇豺狼人 Goldshire Gnoll ID:SW_062
            //提高术士技能优先级

            //提高力量图腾、团队领袖的威胁值
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.CS2_058, new Modifier(200));            //力量图腾 Strength Totem ID:CS2_058
            p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.CORE_CS2_122, new Modifier(200));       //团队领袖 Raid Leader ID:CORE_CS2_122

            return(p);
        }
Beispiel #28
0
    private CardTemplate CreateChosenCardBy(CardPrestige cardSheet, int index)
    {
        var data = CardTemplate.CreateInstance();

        data.questionType = cardSheet.Rows[index]._Question_Type;

        data.scenarioID   = cardSheet.Rows[index]._Scenario_ID;
        data.scenarioText = cardSheet.Rows[index]._Scenario_Text;

        data.characterType = cardSheet.Rows[index]._Character_Type;
        data.extraIMGType  = cardSheet.Rows[index]._Extra_IMG_Type;

        switch (RandomChoiceController.GetSide(cardSheet.Rows[index]._Choice_RNG))
        {
        case SideOfChoice.Left:
            data.choiceLeft = new Choice
            {
                choice = cardSheet.Rows[index]._CT_Text,
                stats  = new int[4]
            };
            data.choiceLeft.stats[0] = cardSheet.Rows[index]._CT_Knowledge;
            data.choiceLeft.stats[1] = cardSheet.Rows[index]._CT_SS;
            data.choiceLeft.stats[2] = cardSheet.Rows[index]._CT_Money;
            data.choiceLeft.stats[3] = cardSheet.Rows[index]._CT_Prestige;

            data.choiceRight = new Choice
            {
                choice = cardSheet.Rows[index]._CF_Text,
                stats  = new int[4]
            };
            data.choiceRight.stats[0] = cardSheet.Rows[index]._CF_Knowledge;
            data.choiceRight.stats[1] = cardSheet.Rows[index]._CF_SS;
            data.choiceRight.stats[2] = cardSheet.Rows[index]._CF_Money;
            data.choiceRight.stats[3] = cardSheet.Rows[index]._CF_Prestige;
            break;

        case SideOfChoice.Right:
            data.choiceLeft = new Choice
            {
                choice = cardSheet.Rows[index]._CF_Text,
                stats  = new int[4]
            };
            data.choiceLeft.stats[0] = cardSheet.Rows[index]._CF_Knowledge;
            data.choiceLeft.stats[1] = cardSheet.Rows[index]._CF_SS;
            data.choiceLeft.stats[2] = cardSheet.Rows[index]._CF_Money;
            data.choiceLeft.stats[3] = cardSheet.Rows[index]._CF_Prestige;

            data.choiceRight = new Choice
            {
                choice = cardSheet.Rows[index]._CT_Text,
                stats  = new int[4]
            };
            data.choiceRight.stats[0] = cardSheet.Rows[index]._CT_Knowledge;
            data.choiceRight.stats[1] = cardSheet.Rows[index]._CT_SS;
            data.choiceRight.stats[2] = cardSheet.Rows[index]._CT_Money;
            data.choiceRight.stats[3] = cardSheet.Rows[index]._CT_Prestige;

            break;

        default:
            throw new System.Exception("WARNING : \n" +
                                       "In MoneyDeck.cs\\CreateChosenCardBy(cardSheet : Google2u.CardMoney, index : int) called following function\n" +
                                       " -> RandomChoiceController.cs\\GetSide(index : int) does not return a SideOfChoice type");
        }

        return(data);
    }
Beispiel #29
0
 private bool IsWorthyThreeDrop(Card.Cards id)
 {
     return(CardTemplate.LoadFromId(id).Cost == 3 && CardTemplate.LoadFromId(id).Atk >= 3 &&
            CardTemplate.LoadFromId(id).Health >= 3 && CardTemplate.LoadFromId(id).Type == Card.CType.MINION);
 }
Beispiel #30
0
        //private string description;

        public Card.Cards HandlePickDecision(Card.Cards originCard, List <Card.Cards> choices, Board board) //originCard; ID of card played by SB: choices; names of cards for selection: board; 3 states , Even, Losing, Winning
        {
            // Local variables declaration
            int    _discoverIndex = 1;
            string Version = "V4.9", description;
            string Divider     = new string('=', 47);
            string Divider2    = new string('=', 50);
            string Origin_Card = CardTemplate.LoadFromId(originCard).Name;

            // Get play mode
            _mode = CurrentMode(Bot.CurrentMode());

            //Create card list
            List <CardValue> choicesCardValue = new List <CardValue>();

            // Get custom file if exists
            try
            {
                string currentAchetype = !String.IsNullOrEmpty(GetCurrentHSReplayArchetype()) ? GetCurrentHSReplayArchetype() : GetCurrentLocalArchetype();
                // Only get files that contains with the word "Custom" and bot current deck or discover card name.
                string[] fileNames = Directory.GetFiles(Directory.GetCurrentDirectory() + @"\DiscoverCC\" + _mode + '\\', "Custom*.ini");
                foreach (string discoverFile in fileNames)
                {
                    // Get custom file if origin card name and current archetype matches
                    if (Regex.Replace(discoverFile, @"[\s+_,]", String.Empty).IndexOf(Regex.Replace(Origin_Card, @"[\s+_,]", String.Empty), StringComparison.OrdinalIgnoreCase) >= 0 && Regex.Replace(discoverFile, @"[\s+_,]", String.Empty).IndexOf(Regex.Replace(currentAchetype, @"[\s+_,]", String.Empty), StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        Bot.Log("Using archetype: " + currentAchetype);
                        _discoverFile  = discoverFile;
                        _discoverIndex = 0;
                        break;
                    }
                    else if (String.Equals(discoverFile, "Custom " + Origin_Card + ".ini", StringComparison.OrdinalIgnoreCase))
                    {
                        _discoverFile  = discoverFile;
                        _discoverIndex = 0;
                        break;
                    }
                }
            }
            catch (Exception)
            {
                Bot.Log("[Discover] -> File not found");
                Bot.Log("More information in SmartBot forums");
                Bot.Log("https://smartbot.ws/forums/index.php?/topic/9672-evil_eyes-hsreplay-discover-choices/");
                _discoverIndex = 1;
            }
            //Main loop starts here
            double TotalPoints = 0;

            LogChoice = 4;
            do
            {
                switch (_discoverIndex)
                {
                case 0:
                    fileName      = Path.GetFileName(_discoverFile);
                    _iniTierList0 = new IniManager(fileName);     // load custom file into List
                    break;

                case 1:
                    fileName      = Origin_Card + ".ini";
                    _iniTierList0 = new IniManager(Directory.GetCurrentDirectory() + @"\DiscoverCC\" + _mode + '\\' + fileName);     // load HSReplay file into List
                    break;

                case 2:
                    _iniTierList0 = new IniManager(Directory.GetCurrentDirectory() + @"\DiscoverCC\" + _mode + '\\' + "discover.ini");     // load "discover.ini" file into List
                    LogChoice     = 3;
                    break;
                }
                choicesCardValue.Clear();

                //Search for best points
                int heroIndex = 0;
                int friend;
                int.TryParse(_iniTierList0.GetString("Hero", "FriendClass", "0"), out friend);
                foreach (var card in choices) // loops for each card
                {
                    double points       = 0;
                    var    cardTemplate = CardTemplate.LoadFromId(card); //cardTemplate = Name of card + [CardId], card = CardId
                    // Check for any special conditions
                    if (originCard == Card.Cards.BAR_079)                //Kazakus, Golem Shaper
                    {
                        points    = KazakusGolemShaper(CardTemplate.LoadFromId(bestChoice).Name, cardTemplate.Name, board);
                        LogChoice = 1;
                    }
                    else if (originCard == Card.Cards.DMF_075)        //Guess the Weight
                    {
                        if (card == Card.Cards.DMF_075a2)             //Less!
                        {
                            Guess_The_Weight = GuessTheWeight(board); //Guess the Weight, sub program read once
                            points           = Convert.ToDouble(Guess_The_Weight.Split(new char[] { '/' })[0].Trim());
                        }
                        else if (card == Card.Cards.DMF_075a) //More!
                        {
                            points = Convert.ToDouble(Guess_The_Weight.Split(new char[] { '/' })[1].Trim());
                        }
                        else
                        {
                            Guess_The_Weight = cardTemplate.Name + ", Cost: " + cardTemplate.Cost.ToString(); //Display name and cost of weight card
                            LogChoice        = 2;
                        }
                    }
                    else
                    {
                        string HeroClass = friend == 1 ? board.FriendClass.ToString() : board.EnemyClass.ToString();                                             // Get friendly/opponent hero class
                        double.TryParse(_iniTierList0.GetString(cardTemplate.Name, HeroClass, "0"), NumberStyles.Any, CultureInfo.InvariantCulture, out points); // search for card from TierList
                        if (points < 0.001)                                                                                                                      // if points is zero, search for default points
                        {
                            double.TryParse(_iniTierList0.GetString(cardTemplate.Name, "points", "0"), NumberStyles.Any, CultureInfo.InvariantCulture, out points);
                        }
                        else
                        {
                            heroIndex = Array.IndexOf(heroes, HeroClass);
                        }
                    }
                    choicesCardValue.Add(new CardValue(card, points, heroIndex, friend)); //add points, class, hero to each card
                    TotalPoints += points;                                                // Adding points, check if points is not = zero
                }
                _discoverIndex++;
            } while (!(TotalPoints > 0 || _discoverIndex > 2));

            // Select best card
            double bestPoints = 0;

            for (var i = 0; i < choicesCardValue.Count; i++)                                                                              //index through each card
            {
                var    cardValue = choicesCardValue[i];                                                                                   // index through cardValue
                double pts       = cardValue.GetPoints();                                                                                 // calls cardValue subroutine, get points
                int    heroIndex = cardValue.GetHeroClass();                                                                              // calls cardValue subroutine, get hero class
                bool   friend    = Convert.ToBoolean(cardValue.GetFriend());                                                              // calls cardValue subroutine, get friend/opponent hero
                string hero      = heroIndex != 0 ? friend ? ", friend - " + heroes[heroIndex] : ", enemy - " + heroes[heroIndex] : null; //preparation to log
                Bot.Log(i + 1 + ") " + CardTemplate.LoadFromId(cardValue.GetCard()).Name + ": " + pts + hero);                            // output cards choices to log
                if (!(bestPoints < pts))
                {
                    continue;                     // selects highest points
                }
                bestChoice = cardValue.GetCard(); // calls cardValue subroutine, get card assign to bestChoice
                bestPoints = pts;                 // calls cardValue subroutine, get points assign to bestPoints
            }

            //Log description choices
            switch (LogChoice)
            {
            case 1:
                description = "From: Kazakus, Golem Shaper, minion count: " + board.MinionFriend.Count + " mana available: " + board.ManaAvailable;
                break;

            case 2:
                description = "From:  Guess the Weight: " + Guess_The_Weight;
                break;

            case 3:
                description = "No cards found from: " + Origin_Card + ".ini, using: discover.ini, Mode - " + _mode;
                break;

            default:
                description = "From: " + fileName + ", Mode - " + _mode;
                break;
            }

            // Out to Bot log
            Bot.Log(Version + Divider);
            Bot.Log("Best: " + CardTemplate.LoadFromId(bestChoice).Name + ": " + bestPoints);
            Bot.Log(description);
            Bot.Log(Divider2);
            return(bestChoice); // returns cardID
        }
Beispiel #31
0
 private bool IsWorthyFourDrop(Card.Cards id)
 {
     return(CardTemplate.LoadFromId(id).Cost == 4 && CardTemplate.LoadFromId(id).Type == Card.CType.MINION);
 }
Beispiel #32
0
 //获取下回合能攻击的可使用随从伤害总和
 public static int GetPlayableMinionSequenceDamages(List <Card.Cards> minions, Board board)
 {
     //下回合能攻击的可使用随从集合攻击力相加
     return(GetPlayableMinionSequenceAttacker(minions, board).Sum(x => CardTemplate.LoadFromId(x).Atk));
 }
Beispiel #33
0
 // When the card is clicked on, it gets added to the deck.
 void OnMouseDown()
 {
     // Quickly reload card to make sure we have the right one
     card = GetComponent <CardDisplay>().card;
     dc.AddCard(card);
 }
            public static bool HasBadEffect(CardTemplate card)
            {
                /// <summary>
                /// Some cards will be added to hand anyway because of other aspects
                /// </summary>
                List<string> CardsWithBadProperties = new List<string>
                {
                    "EX1_577",//The Beast
                    "CS2_227",//Venture Co. Mercenary
                    "EX1_045",//Ancient Watcher
                    "NEW1_030",//Deathwing
                    "FP1_001",//Zombie Chow
                    "TU4c_001",//King Mukla
                };

                return HasEffect(card, "Damage All") ||
                    HasEffect(card, "Overload") ||
                    CardsWithBadProperties.Contains(card.Name);
            }
Beispiel #35
0
 public void CardAttackTrade(PlayerSetup playerSetup, CardTemplate cardTemplate, int hp, int dmg)
 {
 }
Beispiel #36
0
 public static bool HasBadEffect(CardTemplate _card)
 {
     return CardsWithBadProperties.Contains(_card.Name) || _card.Overload > 0;
 }
Beispiel #37
0
        //具体策略
        public ProfileParameters GetParameters(Board board)
        {
            var p = new ProfileParameters(BaseProfile.Rush);

            p.DiscoverSimulationValueThresholdPercent = 10;

            //卡牌优先度调整
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_295, new Modifier(92));                      //降低冰箱优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_287, new Modifier(40));                      //提高法反优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_726, new Modifier(200));                     //降低远古谜团优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.CS2_023, new Modifier(30));                      //提高奥术智慧优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.AT_005, new Modifier(280));                      //降低变猪优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_239, new Modifier(120));                     //降低火焰结界优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.CS2_029, new Modifier(80, board.HeroEnemy.Id));  //提高火球打脸优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOE_002t, new Modifier(60, board.HeroEnemy.Id)); //提高火把打脸优先度
            p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOE_002, new Modifier(50, board.HeroEnemy.Id));  //提高火把打脸优先度
            p.CastMinionsModifiers.AddOrUpdate(Card.Cards.UNG_020, new Modifier(120));                    //降低秘法学家优先度
            //p.CastHeroPowerModifier.AddOrUpdate(Card.Cards.CS2_034, new Modifier(120));//降低火铳优先度
            p.CastWeaponsModifiers.AddOrUpdate(Cards.Aluneth, new Modifier(120));                         //降低提刀优先度
                                                                                                          //p.CastHeroPowerModifier.AddOrUpdate(Card.Cards.CS2_034, new Modifier(9999,board.HeroFriend.Id));
                                                                                                          //p.CastMinionsModifiers.AddOrUpdate(Card.Cards.KAR_092, new Modifier(9999,board.HeroFriend.Id));



            //自定义命名
            int twoHpMinionsCount    = board.MinionEnemy.Count(minion => minion.CurrentHealth <= 2);                                                                                              //对面小于等于2血的随从数量
            int LibraryResidueSecret = 8 - (board.FriendGraveyard.Count(card => CardTemplate.LoadFromId(card).IsSecret) + board.Hand.Count(card => card.Template.IsSecret) + board.Secret.Count); //牌库剩余奥秘
            int threeHpMinionsCount  = board.MinionEnemy.Count(minion => minion.CurrentHealth <= 3) - board.MinionFriend.FindAll(x => x.CurrentAtk >= 3).Count;                                   //对面小于等于3血的随从数量
            int fiveHpMinionsCount   = board.MinionEnemy.Count(minion => minion.CurrentHealth <= 5) - board.MinionFriend.FindAll(x => x.CurrentAtk >= 5).Count;                                   //对面小于等于5血的随从数量

            //针对一些随从优先解掉
            if (board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.BRM_002))
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BRM_002, new Modifier(400));
            }//如果对面场上有火妖,提高攻击优先度

            if (board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.ULD_276))
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.ULD_276, new Modifier(110));
            }//如果对面场上有202,提高攻击优先度

            if (board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.GVG_069))
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.GVG_069, new Modifier(150));
            }//如果对面场上有533,提高攻击优先度

            if (board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.GVG_084))
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.GVG_084, new Modifier(300));
            }//如果对面场上有314,提高攻击优先度

            if (board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.BOT_103))
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BOT_103, new Modifier(120));
            }//如果对面场上有露娜,提高攻击优先度

            if (board.MinionEnemy.Any(minion => minion.Template.Id == Card.Cards.BOT_407))
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.BOT_407, new Modifier(120));
            }//如果对面场上有雷云元素,提高攻击优先度

            if (!BoardHelper.HasPotentialLethalNextTurn(board) &&
                board.MinionEnemy.Count(minion => minion.Template.Id == Card.Cards.GVG_045t) >= 3 &&
                board.EnemyClass == Card.CClass.WARLOCK)
            {
                p.OnBoardBoardEnemyMinionsModifiers.AddOrUpdate(Card.Cards.GVG_045t, new Modifier(150));
            }//如果对面场上有1-1小鬼,提高攻击优先度

            //攻击模式切换
            if ((((board.MinionEnemy.FindAll(x => x.IsTaunt && !x.IsSilenced).Sum(x => x.CurrentHealth) + 9 * board.MinionEnemy.Count(x => x.Template.Id == Card.Cards.LOOT_368) - board.MinionFriend.Sum(x => x.CurrentAtk)) >= 8 &&
                  BoardHelper.GetEnemyHealthAndArmor(board) <= 15) ||
                 BoardHelper.GetSecondTurnLethalRange(board) <= 7) &&
                ((board.HeroFriend.CurrentHealth + board.HeroFriend.CurrentArmor) - board.MinionEnemy.Sum(x => x.CurrentAtk)) > 7)
            {
                //p = new ProfileParameters(BaseProfile.Face);
                //p.DiscoverSimulationValueThresholdPercent = 10;
                p.GlobalAggroModifier.Value = 130;
                //p.CastHeroPowerModifier.AddOrUpdate(Card.Cards.CS2_034, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.CS2_029, new Modifier(-40, board.HeroEnemy.Id));  //提高火球打脸优先度
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOE_002t, new Modifier(-40, board.HeroEnemy.Id)); //提高火把打脸优先度
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOE_002, new Modifier(-40, board.HeroEnemy.Id));  //提高火把打脸优先度
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_293, new Modifier(-40, board.HeroEnemy.Id)); //提高云雾王子打脸优先度
                p.CastSpellsModifiers.AddOrUpdate(TheCoin, new Modifier(0));
            }//对面嘲讽太多,抢脸,降低火铳优先度
            else if (BoardHelper.GetEnemyHealthAndArmor(board) <= 15 &&
                     ((board.HeroFriend.CurrentHealth + board.HeroFriend.CurrentArmor) - board.MinionEnemy.Sum(x => x.CurrentAtk)) > 7)
            {
                //p = new ProfileParameters(BaseProfile.Face);
                //p.DiscoverSimulationValueThresholdPercent = 10;
                p.GlobalAggroModifier.Value = 130;
                //p.CastHeroPowerModifier.AddOrUpdate(Card.Cards.CS2_034, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.CS2_029, new Modifier(30, board.HeroEnemy.Id));   //提高火球打脸优先度
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOE_002t, new Modifier(20, board.HeroEnemy.Id));  //提高火把打脸优先度
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOE_002, new Modifier(20, board.HeroEnemy.Id));   //提高火把打脸优先度
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_293, new Modifier(-40, board.HeroEnemy.Id)); //提高云雾王子打脸优先度
                p.CastSpellsModifiers.AddOrUpdate(TheCoin, new Modifier(0));
            }//对面少于15血,抢脸
            else if (board.ManaAvailable >= 3)
            {
                p.CastSpellsModifiers.AddOrUpdate(TheCoin, new Modifier(30));
            }//提高硬币优先度
            else if (board.WeaponFriend != null && board.WeaponFriend.Template.Id == Card.Cards.LOOT_108)
            {
                p.GlobalAggroModifier.Value = 120;
            }//有武器,攻击性提高
            else if (board.ManaAvailable < 6)
            {
                p.GlobalAggroModifier.Value = 100;
            }//6费前攻击性调整
            else if (board.ManaAvailable >= 6)
            {
                p.GlobalAggroModifier.Value = 110;
            }//6费后攻击性调整

            if (board.Secret.Contains(Cards.IceBlock) &&
                BoardHelper.HasPotentialLethalNextTurn(board) &&
                !(board.EnemyClass == Card.CClass.MAGE && board.SecretEnemy && !board.EnemyGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.EX1_295)))
            {
                p.GlobalAggroModifier.Value = 1000;
            }//如果有冰箱,下回合斩杀,攻击性提高
            else if (BoardHelper.HasPotentialLethalNextTurn(board) &&
                     ((board.HeroFriend.CurrentHealth + board.HeroFriend.CurrentArmor) - board.MinionEnemy.Sum(x => x.CurrentAtk)) > 7)
            {
                p.GlobalAggroModifier.Value = 200;
            }//下回合斩杀,攻击性提高

            if (BoardHelper.HasPotentialLethalNextTurn(board) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.EX1_295))
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_295, new Modifier(50));
            }//下回合斩杀,提高冰箱优先度

            if (BoardHelper.GetSurvivalMinionEnemy(board).Sum(x => x.CurrentHealth) > 18 &&
                BoardHelper.GetSecondTurnLethalRange(board) <= 7 &&
                board.Secret.Contains(Cards.IceBlock) &&
                !(board.EnemyClass == Card.CClass.MAGE && board.SecretEnemy && !board.EnemyGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.EX1_295)))
            {
                p.GlobalAggroModifier.Value = 1000;
            }//无法挽救场面,第二轮斩杀血线小于等于7,头上有冰箱,抢脸
            else if (BoardHelper.GetSurvivalMinionEnemy(board).Sum(x => x.CurrentHealth) > 23 &&
                     BoardHelper.GetSecondTurnLethalRange(board) <= 13 &&
                     board.Secret.Contains(Cards.IceBlock) &&
                     !(board.EnemyClass == Card.CClass.MAGE && board.SecretEnemy && !board.EnemyGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.EX1_295)))
            {
                p.GlobalAggroModifier.Value = 1000;
            }//无法挽救场面,第二轮斩杀血线小于等于12,头上有冰箱,抢脸
            else if (BoardHelper.GetSurvivalMinionEnemy(board).Sum(x => x.CurrentHealth) > 23)
            {
                p.GlobalAggroModifier.Value = 500;
            }//无法挽救场面,打脸

            //武器调整
            if (board.ManaAvailable >= 6 && board.Hand.Count <= 5 && board.HasCardInHand(Cards.Aluneth))
            {
                p.CastWeaponsModifiers.AddOrUpdate(Cards.Aluneth, new Modifier(50));
            }//如果当前剩余法力水晶大于等于6,手牌数量小于等于5并且手牌中有艾露尼斯,提高艾露尼斯的优先级



            //随从调整
            if (board.ManaAvailable >= 4 &&
                (board.HasCardInHand(Card.Cards.ULD_293)) &&
                board.Secret.Count > 0)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_293, new Modifier(100));
            }
            else
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_293, new Modifier(180));
            }//增加云雾王子的优先级

            if (board.ManaAvailable <= 3 &&
                (board.Hand.Exists(x => x.Template.Id == Card.Cards.FP1_004) || board.Hand.Exists(x => x.Template.Id == Card.Cards.UNG_020)) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_726))
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_726, new Modifier(400));
            }//2费下科学家或者秘法学家,不打远古谜团

            if (board.ManaAvailable == 1 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                board.Hand.Count(x => x.Template.Id == Card.Cards.UNG_020) == 1 &&
                (board.Hand.Exists(x => x.Template.Id == Card.Cards.KAR_092) || board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_240)) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_726))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.UNG_020, new Modifier(400));
            }//1费手里有硬币、麦迪文男仆、秘法学家,不打秘法学家

            if (board.EnemyClass == Card.CClass.MAGE &&
                board.SecretEnemy &&
                board.EnemyGraveyard.Count(card => CardTemplate.LoadFromId(card).Id == Card.Cards.LOOT_101) < 2 &&
                (board.EnemyGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.EX1_612) || board.EnemyGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.UNG_020) || board.EnemyGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.ULD_293)) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_066))
            {
                foreach (var card in board.Hand.FindAll(x => 6 - x.CurrentHealth >= (board.HeroFriend.CurrentHealth + board.HeroFriend.CurrentArmor)))
                {
                    p.CastMinionsModifiers.AddOrUpdate(card.Template.Id, new Modifier(5000));
                }//对阵奥秘法,对面可能有爆炸,防止自己被炸死
            }
            if (LibraryResidueSecret > 0 &&
                board.MinionFriend.Any(minion => minion.Template.Id == Card.Cards.FP1_004))
            {
                p.OnBoardFriendlyMinionsValuesModifiers.AddOrUpdate(Card.Cards.FP1_004, new Modifier(40));
            }//牌库有奥秘,提高送掉科学家的优先度

            if (board.ManaAvailable == 1 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_066) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.FP1_018) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.EX1_287) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.LOOT_101) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.EX1_295) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_239) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_620))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.CFM_066, new Modifier(500));
            }//1费手里有复制,不下暗金教侍从

            if (board.ManaAvailable <= 2 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_066) &&
                board.Hand.Count(card => card.Template.IsSecret) == 0)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.CFM_066, new Modifier(200));
            }//2费之前手里没奥秘,不打暗金教侍从

            if (board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_066) &&
                BoardHelper.GetPlayableSecret(board).Count == 0 &&
                board.EnemyClass == Card.CClass.WARLOCK)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.CFM_066, new Modifier(200));
            }//没可以打的奥秘,对面是术士,不打暗金教侍从

            if (board.ManaAvailable == 1 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.KAR_092) &&
                board.Hand.Count(x => x.Template.Id == Card.Cards.FP1_004) == 1 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.UNG_020) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_726) &&
                board.MinionEnemy.Count == 0)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.FP1_004, new Modifier(500));
            }//1费对面没有随从,不下科学家
            else if (board.ManaAvailable == 1 &&
                     board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                     board.Hand.Count(x => x.Template.Id == Card.Cards.FP1_004) == 1 &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_726) &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.UNG_020) &&
                     board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_240))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.FP1_004, new Modifier(2000));
            }//1费手里有科学家和对空奥术师,不跳费下科学家
            else if (board.ManaAvailable == 1 &&
                     board.Hand.Count(x => x.Template.Id == Card.Cards.FP1_004) == 1 &&
                     board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.KAR_092) &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.UNG_020) &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_726))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.FP1_004, new Modifier(300));
            }//1费有硬币,不下科学家

            if (LibraryResidueSecret == 0)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_726, new Modifier(6000));
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.UNG_020, new Modifier(5000));
            }//牌库没奥秘,不打远古谜团,降低秘法学家优先度
            else if (board.ManaAvailable >= 3 &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.EX1_612))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.UNG_020, new Modifier(250));
            }//降低秘法学家优先度

            if (board.Hand.Exists(x => x.Template.Id == Card.Cards.EX1_612) &&
                BoardHelper.GetPlayableSecret(board).Count == 0 &&
                board.Hand.Count >= 5 &&
                (board.Hand.Count(x => x.Type == Card.CType.MINION) - board.Hand.Count(x => x.Template.Id == Card.Cards.EX1_612) != board.Hand.Count(x => x.Template.Id == Card.Cards.ULD_240)) &&
                (board.Hand.Count(x => x.Type == Card.CType.MINION) - board.Hand.Count(x => x.Template.Id == Card.Cards.EX1_612) != 0))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.EX1_612, new Modifier(300));
            }//手里没有能打的奥秘,降低肯瑞托优先度

            if (board.ManaAvailable == 2 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_066) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                (board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_726) || board.Hand.Exists(x => x.Template.Id == Card.Cards.UNG_020) || board.Hand.Exists(x => x.Template.Id == Card.Cards.FP1_004)))
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.CFM_066, new Modifier(600));
            }//2费手里有暗金教侍从,秘法学家或者科学家或者远古谜团,不打暗金教侍从

            if (board.Hand.Count >= 7)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.CS2_023, new Modifier(300));
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.UNG_020, new Modifier(400));
            }//手牌太多,降低奥术智慧、秘法学家优先度



            //法术调整
            if (board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_239) &&
                threeHpMinionsCount <= 2 &&
                board.MinionEnemy.Sum(x => x.CurrentAtk) <= 4)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_239, new Modifier(200));
            }//对面随从给少,降低火焰结界优先度

            if (threeHpMinionsCount >= 3 ||
                (fiveHpMinionsCount >= 3 && board.MinionFriend.Any(minion => minion.Template.Id == Card.Cards.ULD_240)))
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_239, new Modifier(190 - 40 * threeHpMinionsCount));
            }//对面3血以下怪多,提高火焰结界优先度

            if (board.ManaAvailable <= 2 &&
                board.MinionEnemy.Sum(x => x.CurrentAtk) == 1 &&
                board.MinionFriend.Count == 0)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_239, new Modifier(1000));
            }//远古谜团拿到火焰结界对面场功太低,不打

            if ((board.WeaponFriend != null && board.WeaponFriend.Template.Id == Card.Cards.LOOT_108) &&
                board.Hand.Count >= 6 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.FP1_018))
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.FP1_018, new Modifier(150));
            }//有刀,手牌过多,降低复制优先度

            if (board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_760) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.ULD_726) &&
                board.Hand.FindAll(x => x.Template.Id == Card.Cards.CFM_760).Min(x => x.CurrentCost) <= board.ManaAvailable &&
                board.Hand.FindAll(x => x.Template.Id == Card.Cards.CFM_760).Min(x => x.CurrentCost) > board.ManaAvailable - 2 &&
                (LibraryResidueSecret > 0) &&
                (!board.Secret.Contains(Cards.Counterspell) || board.FriendGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.EX1_287)) &&
                (!board.Secret.Contains(Cards.ExplosiveRunes)) || board.FriendGraveyard.Exists(card => CardTemplate.LoadFromId(card).Id == Card.Cards.LOOT_101))
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.ULD_726, new Modifier(-700));
            }//先打远古谜团再打水晶侍女

            if (board.ManaAvailable == 4 &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                board.Hand.Count(x => x.Template.Id == Card.Cards.ULD_240) == 2 &&
                board.Hand.Count(card => card.Template.IsSecret) == 1 &&
                twoHpMinionsCount >= 3 &&
                board.MinionFriend.Count <= 1)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_287, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOOT_101, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_295, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.FP1_018, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.CFM_620, new Modifier(200));
            }//4费手里只有一张奥秘和2张对空奥术师,对面小于2血的怪多,不打奥秘

            else if (board.ManaAvailable == 4 &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                     board.Hand.Count(x => x.Template.Id == Card.Cards.ULD_240) == 1 &&
                     board.Hand.Count(card => card.Template.IsSecret) == 1 &&
                     twoHpMinionsCount >= 3 &&
                     board.MinionFriend.Count <= 1)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_240, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_287, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOOT_101, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_295, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.FP1_018, new Modifier(200));
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.CFM_620, new Modifier(200));
            }//4费手里只有一个对空奥术师,对面小于2血的怪多,不下对空奥术师,不打奥秘

            else if (board.ManaAvailable == 4 &&
                     !board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                     board.Hand.Count(x => x.Template.Id == Card.Cards.ULD_240) == 1 &&
                     board.Hand.Count(card => card.Template.IsSecret) >= 2 &&
                     twoHpMinionsCount >= 3 &&
                     board.MinionFriend.Count <= 1)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_240, new Modifier(200));
            }//4费手里只有一个对空奥术师,对面小于2血的怪多,不下对空奥术师

            if (board.ManaAvailable == 4 &&
                board.EnemyAbility.Template.Id == Card.Cards.AT_132_PALADIN &&
                board.Hand.Count(x => x.Template.Id == Card.Cards.ULD_240) == 1 &&
                board.Hand.Count(card => card.Template.IsSecret) >= 1)
            {
                p.CastMinionsModifiers.AddOrUpdate(Card.Cards.ULD_240, new Modifier(200));
            }//4费对面奇数骑,只有一个对空奥术师,手里有奥秘,不下对空奥术师

            if (board.ManaAvailable == 1 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.CFM_066) &&
                !board.Hand.Exists(x => x.Template.Id == Card.Cards.GAME_005) &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.EX1_287) &&
                board.Hand.Count(card => card.Template.IsSecret) > 1)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_287, new Modifier(120));
            }//1费对面有硬币,奥秘大于1个,降低法反优先度

            if (board.ManaAvailable <= 4 &&
                board.MinionEnemy.Count == 0 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.EX1_287) &&
                board.EnemyClass == Card.CClass.DRUID)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.EX1_287, new Modifier(-10));
            }//对面德鲁伊,4费前没随从,提高法反优先度

            if (board.FriendDeckCount <= 6 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.LOE_002))
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOE_002, new Modifier(20));
            }//牌库卡不多,提高打火把优先度

            if (board.EnemyClass == Card.CClass.WARLOCK &&
                board.Hand.Count(card => card.Template.IsSecret) > 1 &&
                board.Hand.Exists(x => x.Template.Id == Card.Cards.LOOT_101) &&
                board.ManaAvailable <= 6 &&
                board.MinionEnemy.Sum(x => x.CurrentAtk) <= 4)
            {
                p.CastSpellsModifiers.AddOrUpdate(Card.Cards.LOOT_101, new Modifier(200));
            }//对阵术士,降低爆炸优先度

            if (board.MinionEnemy.Count == 1 &&
                board.MinionEnemy.Exists(x => x.Template.Id == Card.Cards.NEW1_021) &&
                board.MinionFriend.Count == 0 &&
                BoardHelper.GetPlayableSecret(board).Count > 0)
            {
                foreach (var card1 in BoardHelper.GetPlayableSecret(board))
                {
                    p.CastSpellsModifiers.AddOrUpdate(card1, new Modifier(30));
                }
            }//对面有末日,提高奥秘优先度
            return(p);
        }
Beispiel #38
0
 public static bool HasInspire(CardTemplate _card)
 {
     return _card.Inspire;
 }
Beispiel #39
0
        public static bool WouldTakeMinion(CardTemplate boardCard)
        {
            try
            {
                if (new NeutralMinion(boardCard).minionBoardCard == null) //not a neutral minion
                    return false;
                //<= max mana
                Card.Cards card = CardTemplate.StringToCard(boardCard.Id.ToString());

                #region normalChecks

                if (MainLists.whiteList.Contains(boardCard.Id.ToString()))
                    return true;
                if (MainLists.blackList.Contains((boardCard.Id.ToString())))
                    return false;

                if (boardCard.Quality >= ValueReader.MinCardQualityToInstantAddMinion) //epic by default
                    return true;

                //card quality not hight enough and mana to high too
                if ((!ValueReader.AttendMinionValue ||
                     boardCard.Cost < ValueReader.MinManaCostToAttendValue) && boardCard.Cost <= MainLists.MaxManaCost)
                    return true;

                if (boardCard.Cost > MainLists.MaxManaCost)
                    return false;

                //value has to be attended
                var minionCard = new NeutralMinion(card);
                MinionValue.Value requiredMinNeutralMinionValue =
                    minionCard.minionBoardCard.IsMaxManaCard && ValueReader.IncreaseMinMinionValueIfMaxCost
                        ? ValueReader.IncreasedMinNeutralMinionValue
                        : ValueReader.MinNeutralMinionValue;

                return minionCard.thisCardValue >= requiredMinNeutralMinionValue;

                #endregion normalChecks
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }