public void SelectEnemyMove()
    {
        List <MoveData> selectableMovesList = new List <MoveData>();
        List <MoveData> strongMovesList     = new List <MoveData>();

        MoveData[] selectable;
        MoveData[] strong;

        foreach (MoveData move in enemyMon.learnedMoves)
        {
            if (move != null)
            {
                selectableMovesList.Add(move);
            }
        }

        foreach (MoveData move in selectableMovesList)
        {
            if (playerMon.GetEffectiveness(move.moveType) > 0)
            {
                strongMovesList.Add(move);
            }
        }
        selectable = selectableMovesList.ToArray();
        strong     = strongMovesList.ToArray();

        if (strong.Length > 0)
        {
            enemyMon.selectedMove = strong[Random.Range(0, strong.Length)];
        }
        else
        {
            enemyMon.selectedMove = selectable[Random.Range(0, selectable.Length)];
        }
    }
    void ResolveNonDamagingAttack(MoveData move, MonBattleData attacker, MonBattleData defender)
    {
        Effectiveness effectiveness;

        if (attacker == playerMon)
        {
            playerModel.GetComponent <Animator>().SetTrigger("Attack");
        }
        else
        {
            enemyModel.GetComponent <Animator>().SetTrigger("Attack");
        }

        effectiveness = defender.GetEffectiveness(move.moveType);
        if (effectiveness != Effectiveness.immune && CheckIfHit(move, attacker, defender))
        {
            if (move.causesStatus != StatusEffect.none)
            {
                ResolveStatus(move, defender);
            }
            if (move.statToChange != MonStat.none)
            {
                if (move.affectSelf)
                {
                    ResolveStatChange(move, attacker);
                }
                else
                {
                    ResolveStatChange(move, defender);
                }
            }

            if (defender == playerMon)
            {
                playerModel.GetComponent <Animator>().SetTrigger("Damage");
            }
            else
            {
                enemyModel.GetComponent <Animator>().SetTrigger("Damage");
            }

            UpdateHPBar(defender);
            UpdateHPBar(attacker);
        }
        else
        {
            battleDialogue.AddToMessages("It had no effect...");
        }
    }
    private int CalculateDamageModifier(MoveData move, MonBattleData attacker, MonBattleData defender, bool criticalHit)
    {
        float modifier;
        int   rand     = 100; // Random number that gives some variance in damage
        float stab     = 1f;  // Stands for Same Type Attack Bonus, applies a modifier if the move used is the same type as the user
        float burn     = 1f;  // Weakens physical moves if the user is burned
        float effect   = 1f;  // Type effectiveness
        float critical = 1f;

        rand = Random.Range(85, 101);
        stab = 1f;

        if (attacker.primaryType == move.moveType)
        {
            stab = 1.5f;
        }
        else if (attacker.secondaryType != null)
        {
            if (attacker.secondaryType == move.moveType)
            {
                stab = 1.5f;
            }
        }

        if (move.physSpec == PhysSpec.Physical && attacker.hasStatus == StatusEffect.Burn)
        {
            burn = 0.5f;
        }
        else
        {
            burn = 1.0f;
        }

        if (criticalHit)
        {
            critical = 2f;
        }

        effect = GetEffectivenessModifier(defender.GetEffectiveness(move.moveType));

        modifier = rand * stab * effect * burn * critical;

        return(Mathf.FloorToInt(modifier));
    }
    void ResolveDamagingAttack(MoveData move, MonBattleData attacker, MonBattleData defender)
    {
        bool          crit;
        Effectiveness effectiveness;
        int           damage;

        if (attacker == playerMon)
        {
            playerModel.GetComponent <Animator>().SetTrigger("Attack");
        }
        else
        {
            enemyModel.GetComponent <Animator>().SetTrigger("Attack");
        }

        if (CheckIfHit(move, attacker, defender))
        {
            crit          = CheckIfCrit(move);
            effectiveness = defender.GetEffectiveness(move.moveType);
            damage        = CalculateDamage(move, attacker, defender, crit);
            if (crit)
            {
                battleDialogue.AddToMessages("A critical hit!");
            }
            if (effectiveness == Effectiveness.resist2x || effectiveness == Effectiveness.resist4x)
            {
                battleDialogue.AddToMessages("It's not very effective...");
            }
            else if (effectiveness == Effectiveness.weak2x || effectiveness == Effectiveness.weak4x)
            {
                battleDialogue.AddToMessages("It's super effective!!!");
            }
            if (effectiveness == Effectiveness.immune)
            {
                battleDialogue.AddToMessages("It had no effect...");
            }
            defender.TakeDamage(damage);
            if (defender == playerMon)
            {
                playerModel.GetComponent <Animator>().SetTrigger("Damage");
            }
            else
            {
                enemyModel.GetComponent <Animator>().SetTrigger("Damage");
            }

            if (move.causesStatus != StatusEffect.none)
            {
                ResolveStatus(move, defender);
            }
            if (move.statToChange != MonStat.none)
            {
                if (move.affectSelf)
                {
                    ResolveStatChange(move, attacker);
                }
                else
                {
                    ResolveStatChange(move, defender);
                }
            }

            UpdateHPBar(defender);
            UpdateHPBar(attacker);
        }
        else
        {
            battleDialogue.AddToMessages("But it missed!");
        }
    }