public void PlaySound(AudioClip clip, PlayPriority priority = PlayPriority.NORMAL, float volume = 1.0f, float pitch = 1.0f, bool loop = false) { AudioSource audioComp = AudioComponent; if (audioComp == null || clip == null) { Debug.LogError("Audio component is not ready, or the clip provided is null"); return; } audioComp.clip = clip; audioComp.pitch = pitch; audioComp.volume = volume; audioComp.loop = loop; _playPriority = priority; audioComp.Play(); }
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; } }