public void CardsFight(CardController attacker, CardController defender)
    {
        defender.Card.GetDamage(attacker.Card.Attack);
        attacker.OnDamageDeal();
        defender.OnTakeDamage(attacker);

        attacker.Card.GetDamage(defender.Card.Attack);
        attacker.OnTakeDamage();

        attacker.CheckForAlive();
        defender.CheckForAlive();
    }
    public void UseSpell(CardController target)
    {
        switch (Card.Spell)
        {
        case Card.SpellType.HEAL_ALLY_FIELD_CARDS:

            var allyCards = IsPlayerCard ?
                            gameManager.PlayerFieldCards :
                            gameManager.EnemyFieldCards;

            foreach (var card in allyCards)
            {
                card.Card.Defense += Card.SpellValue;
                card.Info.RefreshData();
            }

            break;

        case Card.SpellType.DAMAGE_ENEMY_FIELD_CARDS:

            var enemyCards = IsPlayerCard ?
                             new List <CardController>(gameManager.EnemyFieldCards):
                             new List <CardController>(gameManager.PlayerFieldCards);

            foreach (var card in enemyCards)
            {
                GiveDamageTo(card, Card.SpellValue);
            }

            break;

        case Card.SpellType.HEAL_ALLY_HERO:

            if (IsPlayerCard)
            {
                gameManager.PlayerHP += Card.SpellValue;
            }
            else
            {
                gameManager.EnemyHP += Card.SpellValue;
            }

            gameManager.ShowHP();

            break;

        case Card.SpellType.DAMAGE_ENEMY_HERO:

            if (IsPlayerCard)
            {
                gameManager.EnemyHP -= Card.SpellValue;
            }
            else
            {
                gameManager.PlayerHP -= Card.SpellValue;
            }

            gameManager.ShowHP();
            gameManager.CheckForResult();

            break;

        case Card.SpellType.HEAL_ALLY_CARD:
            target.Card.Defense += Card.SpellValue;
            break;

        case Card.SpellType.DAMAGE_ENEMY_CARD:
            GiveDamageTo(target, Card.SpellValue);
            break;

        case Card.SpellType.SHIELD_ON_ALLY_CARD:
            if (!target.Card.Abilities.Exists(x => x == Card.AbilityType.SHIELD))
            {
                target.Card.Abilities.Add(Card.AbilityType.SHIELD);
            }
            break;

        case Card.SpellType.PROVOCATION_ON_ALLY_CARD:
            if (!target.Card.Abilities.Exists(x => x == Card.AbilityType.PROVOCATION))
            {
                target.Card.Abilities.Add(Card.AbilityType.PROVOCATION);
            }
            break;

        case Card.SpellType.BUFF_CARD_DAMAGE:
            target.Card.Attack += Card.SpellValue;
            break;

        case Card.SpellType.DEBUFF_CARD_DAMAGE:
            target.Card.Attack = Mathf.Clamp(target.Card.Attack - Card.SpellValue, 0, int.MaxValue);
            break;
        }

        if (target != null)
        {
            target.Ability.OnCast();
            target.CheckForAlive();
        }

        DestroyCard();
    }
 void GiveDamageTo(CardController card, int damage)
 {
     card.Card.GetDamage(damage);
     card.CheckForAlive();
     card.OnTakeDamage();
 }