/// <summary> /// check if we have coin in hand, and play it if needed /// </summary> private IEnumerator TryToPlayCoin() { // Coin card ID const string coinId = "GAME_005"; // Should we play coin? if (TritonHS.GetCards(CardZone.Hand).Any(s => s.Id == coinId) // Do we have coin in hand? && !TritonHS.GetCards(CardZone.Hand) .Any(s => s.CanBeUsed // Ensure we cant play cards with current mana avaible && TritonHS.GetCards(CardZone.Hand) .Any(c => c.Cost == TritonHS.CurrentMana + 1 && c.IsMinion && !c.HasBattlecry))) // A card is awaible with currentmana + 1 (more checks are needed!!) { HSCard coin = TritonHS.GetCards(CardZone.Hand).FirstOrDefault(s => s.Id == coinId); if (coin != null) { Logging.Write("Lets play coin!"); coin.DoGrab(); yield return(Coroutine.Sleep(500)); coin.DoDrop(); yield return(Coroutine.Sleep(500)); } } }
public IEnumerator SelectCard() { // Some verbose Logging.Write("------- Turn " + TritonHS.CurrentTurn + " Loop " + _loopCount + " -------"); _loopCount++; // ----- First : drops // Try to play coin : yield return(TryToPlayCoin()); // Retrieve our cards in hand which can be used // Can be used do a lot of check for us : enough mana, battlefield is not full to drop a minion, this spell can be used, etc... // Use this function to determine if a card can be played from you hand // Retrieve cards priority var lowPriority = new List <HSCard>(); var normalPriority = new List <HSCard>(); var highPriority = new List <HSCard>(); var ultraPriority = new List <HSCard>(); Logging.Write("Checking hand cards priorities :"); foreach (HSCard card in TritonHS.GetCards(CardZone.Hand).Where(s => s.CanBeUsed)) { // Retrieve priority PlayPriority priority = MurlocMap[card.Id].GetPlayPriority(); //Logging.Write("Card " + c.GetName() + " has priority " + priority); switch (priority) { case PlayPriority.VeryLow: //Logging.Write("\tCard " + c.GetName() + " has a very low priority"); break; case PlayPriority.Low: lowPriority.Add(card); Logging.Write("\tCard " + card.Name + " has a low priority"); break; case PlayPriority.Normal: normalPriority.Add(card); Logging.Write("\tCard " + card.Name + " has a normal priority"); break; case PlayPriority.High: highPriority.Add(card); Logging.Write("\tCard " + card.Name + " has a high priority!"); break; case PlayPriority.Ultra: ultraPriority.Add(card); Logging.Write("\tCard " + card.Name + " has an ULTRA priority!"); break; default: //Dont play Logging.Write("\tCard " + card.Name + " must be ignored"); break; } } if (ultraPriority.Count != 0) { HSCard best = null; foreach (HSCard card in ultraPriority.Where(s => s.IsMinion)) { if (best == null) { best = card; } if (card.Cost == TritonHS.CurrentMana && best.Cost != TritonHS.CurrentMana) { best = card; } // for minions priority is choosed with atk (in a first time) if (best.Attack < card.Attack) { best = card; } } Logging.Write("Lets play " + best.Name + " !"); best.DoGrab(); yield return(Coroutine.Sleep(500)); best.DoDrop(); yield return(Coroutine.Sleep(500)); yield break; } else if (highPriority.Count != 0) { HSCard best = null; foreach (HSCard card in highPriority.Where(s => s.IsMinion)) { if (best == null) { best = card; } if (card.Cost == TritonHS.CurrentMana && best.Cost != TritonHS.CurrentMana) { best = card; } // for minions priority is choosed with atk (in a first time) if (best.Attack < card.Attack) { best = card; } } Logging.Write("Lets play " + best.Name + " !"); best.DoGrab(); yield return(Coroutine.Sleep(500)); best.DoDrop(); yield return(Coroutine.Sleep(500)); yield break; } else if (normalPriority.Count != 0) { HSCard best = null; foreach (HSCard card in normalPriority.Where(s => s.IsMinion)) { if (best == null) { best = card; } if (card.Cost == TritonHS.CurrentMana && best.Cost != TritonHS.CurrentMana) { best = card; } // for minions priority is choosed with atk (in a first time) if (best.Attack < card.Attack) { best = card; } } Logging.Write("Lets play " + best.Name + " !"); best.DoGrab(); yield return(Coroutine.Sleep(500)); best.DoDrop(); yield return(Coroutine.Sleep(500)); yield break; } else if (lowPriority.Count != 0) // Dont play low priority if coin if used [... =0 && !_coinPlayed { HSCard best = null; foreach (HSCard card in lowPriority.Where(s => s.IsMinion)) { if (best == null) { best = card; } if (card.Cost == TritonHS.CurrentMana && best.Cost != TritonHS.CurrentMana) { best = card; } // for minions priority is choosed with atk (in a first time) if (best.Attack < card.Attack) { best = card; } } Logging.Write("Lets play " + best.Name + " !"); best.DoGrab(); yield return(Coroutine.Sleep(500)); best.DoDrop(); yield return(Coroutine.Sleep(500)); yield break; } // ----- Second : check hero power if (TritonHS.OurHeroPowerCard.CanBeUsed) { // We can use our hero power if (TritonHS.OurHero.Class == TAG_CLASS.WARLOCK && TritonHS.OurHeroHealthAndArmor < 10) // Be careful with warlock power { Logging.Write("We are a warlock and we are low life : ignore our hero power."); } else { Logging.Write("Lets use our hero power."); // Grab card : only a grab is needed for spells TritonHS.OurHeroPowerCard.DoGrab(); yield return(Coroutine.Sleep(1000)); // Game need to load some stuff // Is a target needed for hero power? // Check if target retrieved is not null (maybe we did a misstake in our RetrieveTargetForHeroPower function) if (TritonHS.IsInTargetMode() && RetrieveTargetForHeroPower() != null) { // So, find a target TritonHS.OurHeroPowerCard.DoTarget(RetrieveTargetForHeroPower()); yield return(Coroutine.Sleep(1000)); // Game need to load some stuff } yield break; // Get out of this loop => return at the start of the function => check if we can use new cards (maybe we have drawn a card?) } } // ------ Third : use our Hero // Our hero can be used : our hero ATK is > 0 && we are not frozen // Dont focus taunters with our hero -> Focus enemy hero // Enemy hero can be attacked if (TritonHS.OurHero.CanBeUsed && !DoTheEnemyHasATaunter() && TritonHS.EnemyHero.CanBeTargetedByOpponents) { TritonHS.OurHero.DoAttack(TritonHS.EnemyHero); } // ----- Fourth : attacks // Retrive cards on our battlefield which can be used // CanbeUsed function is checking if we can attack with this minion (it is not frozen, not exhausted, has atk > 0, etc...) foreach (HSCard card in TritonHS.GetCards(CardZone.Battlefield).Where(s => s.CanBeUsed)) { HSCard BestEnnemy = null; //Seek if a dangerous monster is on the field foreach (HSCard EnnemyCard in TritonHS.GetCards(CardZone.Battlefield, false).Where(s => s.CanBeAttacked)) { double level = TradeHelper.DetermineMinionDangerousLevel(EnnemyCard); Logging.Write("Level of : " + EnnemyCard.Name + " -> " + level); if (DoTheEnemyHasATaunter()) { if (EnnemyCard.HasTaunt) { if (EnnemyCard.Health <= card.Attack) //Can we kill it ? { // Do our attack on enemy taunter BestEnnemy = EnnemyCard; Logging.Write("Kill the Taunter : " + card.Name + " -> " + EnnemyCard.Name); // Get out of this loop => return at the start of the function => check if we can use new cards (maybe we have drawn a card?) } else { BestEnnemy = null; } } } else { if (level <= 14) { if (EnnemyCard.Health <= card.Attack && card.Health > EnnemyCard.Attack) { Logging.Write("Best ennemy for : " + card.Name + " -> " + EnnemyCard.Name); BestEnnemy = EnnemyCard; } } if (level > 14 && level < 20) { if (EnnemyCard.Health <= card.Attack) { Logging.Write("Best ennemy for : " + card.Name + " -> " + EnnemyCard.Name); BestEnnemy = EnnemyCard; } } if (level >= 20) { if (EnnemyCard.Health / 2 <= card.Attack) { Logging.Write("Best ennemy for : " + card.Name + " -> " + EnnemyCard.Name); BestEnnemy = EnnemyCard; } } } } if (BestEnnemy != null) { card.DoAttack(BestEnnemy); yield return(Coroutine.Sleep(1000)); // Little sleep after an attack } else if (TritonHS.EnemyHero.CanBeTargetedByOpponents) { // Do our attack Logging.Write("Do attack : " + card.Name + " -> " + TritonHS.EnemyHero.Name); card.DoAttack(TritonHS.EnemyHero); yield return(Coroutine.Sleep(1000)); // Little sleep after an attack // Get out of this loop => return at the start of the function => check if we can use new cards (maybe we have drawn a card?) } yield break; } // ----- Finally : end our turn // If we reach this point : all our hand cards avaible are dropped & all our usable cards on battlefield are exhausted. // Ensure we are not in target mode (maybe we failed somewhere) // If game is still in target mode, endturn will fail if (TritonHS.IsInTargetMode()) { TritonHS.CancelTargetingMode(); } sure++; if (sure == 2) { // End our turn _loopCount = 1; sure = 0; Logging.Write("End turn."); TritonHS.EndTurn(); } else { Logging.Write("Last check"); yield break; } }