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; }
// 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()); }
//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); } }
private CardTemplate ConvertToBoardCard(Card.Cards MulliganCard) { return(CardTemplate.LoadFromId(MulliganCard)); }
/// <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)); }
/// <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()))); }
/// <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)); }
#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); }
private CardTemplate Load(Card.Cards id) { return(CardTemplate.LoadFromId(id)); }
//卡组列表 //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); }
/// <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(""); }
//获取下回合能攻击的可使用随从集合 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 }
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; }
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); }
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); }
/// <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); } } }
public void CardAttackTrade(PlayerSetup playerSetup, CardTemplate cardTemplate, int hp, int dmg) { Console.WriteLine(cardTemplate.GetNameType() + "[" + playerSetup.name + "](" + hp + " -> " + (hp - dmg) + ")"); }
/// <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); }
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); }
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); }
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); }
//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 }
private bool IsWorthyFourDrop(Card.Cards id) { return(CardTemplate.LoadFromId(id).Cost == 4 && CardTemplate.LoadFromId(id).Type == Card.CType.MINION); }
//获取下回合能攻击的可使用随从伤害总和 public static int GetPlayableMinionSequenceDamages(List <Card.Cards> minions, Board board) { //下回合能攻击的可使用随从集合攻击力相加 return(GetPlayableMinionSequenceAttacker(minions, board).Sum(x => CardTemplate.LoadFromId(x).Atk)); }
// 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); }
public void CardAttackTrade(PlayerSetup playerSetup, CardTemplate cardTemplate, int hp, int dmg) { }
public static bool HasBadEffect(CardTemplate _card) { return CardsWithBadProperties.Contains(_card.Name) || _card.Overload > 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); }
public static bool HasInspire(CardTemplate _card) { return _card.Inspire; }
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; } }