using System.Collections; using System.Collections.Generic; using UnityEngine; using TcgEngine.Client; using TcgEngine.Gameplay; namespace TcgEngine.AI { /// /// AI player making completely random decisions, really bad AI but useful for testing /// public class AIPlayerRandom : AIPlayer { private bool is_playing = false; private bool is_selecting = false; private System.Random rand = new System.Random(); public AIPlayerRandom(GameLogic gameplay, int id, int level) { this.gameplay = gameplay; player_id = id; } public override void Update() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); Player player = game_data.GetPlayer(player_id); if (game_data.IsPlayerTurn(player) && !gameplay.IsResolving()) { if(!is_playing && game_data.selector == SelectorType.None && game_data.current_player == player_id) { is_playing = true; TimeTool.StartCoroutine(AiTurn()); } if (!is_selecting && game_data.selector != SelectorType.None && game_data.selector_player_id == player_id) { if (game_data.selector == SelectorType.SelectTarget) { //AI select target is_selecting = true; TimeTool.StartCoroutine(AiSelectTarget()); } if (game_data.selector == SelectorType.SelectorCard) { //AI select target is_selecting = true; TimeTool.StartCoroutine(AiSelectCard()); } if (game_data.selector == SelectorType.SelectorChoice) { //AI select target is_selecting = true; TimeTool.StartCoroutine(AiSelectChoice()); } if (game_data.selector == SelectorType.SelectorCost) { //AI select target is_selecting = true; TimeTool.StartCoroutine(AiSelectCost()); } } } if (!is_selecting && game_data.IsPlayerMulliganTurn(player)) { is_selecting = true; TimeTool.StartCoroutine(AiSelectMulligan()); } } private IEnumerator AiTurn() { yield return new WaitForSeconds(1f); PlayCard(); yield return new WaitForSeconds(0.5f); PlayCard(); yield return new WaitForSeconds(0.5f); PlayCard(); yield return new WaitForSeconds(0.5f); Attack(); yield return new WaitForSeconds(0.5f); Attack(); yield return new WaitForSeconds(0.5f); AttackPlayer(); yield return new WaitForSeconds(0.5f); EndTurn(); is_playing = false; } private IEnumerator AiSelectCard() { yield return new WaitForSeconds(0.5f); SelectCard(); yield return new WaitForSeconds(0.5f); CancelSelect(); is_selecting = false; } private IEnumerator AiSelectTarget() { yield return new WaitForSeconds(0.5f); SelectTarget(); yield return new WaitForSeconds(0.5f); CancelSelect(); is_selecting = false; } private IEnumerator AiSelectChoice() { yield return new WaitForSeconds(0.5f); SelectChoice(); yield return new WaitForSeconds(0.5f); CancelSelect(); is_selecting = false; } private IEnumerator AiSelectCost() { yield return new WaitForSeconds(0.5f); SelectCost(); yield return new WaitForSeconds(0.5f); CancelSelect(); is_selecting = false; } private IEnumerator AiSelectMulligan() { yield return new WaitForSeconds(0.5f); SelectMulligan(); yield return new WaitForSeconds(0.5f); is_selecting = false; } //---------- public void PlayCard() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); Player player = game_data.GetPlayer(player_id); if (player.cards_hand.Count > 0 && game_data.IsPlayerActionTurn(player)) { Card random = player.GetRandomCard(player.cards_hand, rand); Slot slot = player.GetRandomEmptySlot(rand); if (random != null && random.CardData.IsRequireTargetSpell()) slot = game_data.GetRandomSlot(rand); //Spell can target any slot, not just your side if(random != null && random.CardData.IsEquipment()) slot = player.GetRandomOccupiedSlot(rand); if (random != null) gameplay.PlayCard(random, slot); } } public void Attack() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); Player player = game_data.GetPlayer(player_id); if (player.cards_board.Count > 0 && game_data.IsPlayerActionTurn(player)) { Card random = player.GetRandomCard(player.cards_board, rand); Card rtarget = game_data.GetRandomBoardCard(rand); if (random != null && rtarget != null) gameplay.AttackTarget(random, rtarget); } } public void AttackPlayer() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); Player player = game_data.GetPlayer(player_id); Player oplayer = game_data.GetRandomPlayer(rand); if (player.cards_board.Count > 0 && game_data.IsPlayerActionTurn(player)) { Card random = player.GetRandomCard(player.cards_board, rand); if (random != null && oplayer != null && oplayer != player) gameplay.AttackPlayer(random, oplayer); } } public void SelectCard() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); Player player = game_data.GetPlayer(player_id); AbilityData ability = AbilityData.Get(game_data.selector_ability_id); Card caster = game_data.GetCard(game_data.selector_caster_uid); if (player != null && ability != null && caster != null) { List card_list = ability.GetCardTargets(game_data, caster); if (card_list.Count > 0) { Card card = card_list[rand.Next(0, card_list.Count)]; gameplay.SelectCard(card); } } } public void SelectTarget() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); if (game_data.selector != SelectorType.None) { int target_player = player_id; AbilityData ability = AbilityData.Get(game_data.selector_ability_id); if (ability != null && ability.target == AbilityTarget.SelectTarget) target_player = (player_id == 0 ? 1 : 0); Player tplayer = game_data.GetPlayer(target_player); if (tplayer.cards_board.Count > 0) { Card random = tplayer.GetRandomCard(tplayer.cards_board, rand); if (random != null) gameplay.SelectCard(random); } } } public void SelectChoice() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); if (game_data.selector != SelectorType.None) { AbilityData ability = AbilityData.Get(game_data.selector_ability_id); if (ability != null && ability.chain_abilities.Length > 0) { int choice = rand.Next(0, ability.chain_abilities.Length); gameplay.SelectChoice(choice); } } } public void SelectCost() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); if (game_data.selector != SelectorType.None) { Player player = game_data.GetPlayer(player_id); Card card = game_data.GetCard(game_data.selector_caster_uid); if (player != null && card != null) { int max = Mathf.Clamp(player.mana, 0, 9); int choice = rand.Next(0, max + 1); gameplay.SelectCost(choice); } } } public void CancelSelect() { if (CanPlay()) { gameplay.CancelSelection(); } } public void SelectMulligan() { if (!CanPlay()) return; Game game_data = gameplay.GetGameData(); if (game_data.phase == GamePhase.Mulligan) { Player player = game_data.GetPlayer(player_id); string[] cards = new string[0]; //Don't mulligan gameplay.Mulligan(player, cards); } } public void EndTurn() { if (CanPlay()) { gameplay.EndTurn(); } } } }