private void SetCombatScreen(bool active)
    {
        combatant_0 = GameManager.playerCombat;

        if (active == true && !CombatScreen.activeSelf)
        {
            if (combatant_regions[0] == null || combatant_regions[1] == null)
            {
                Debug.LogError("Combatant regions not settup properly! Unable to complete combat task.");

                return;
            }

            playersTurn = Random.Range(0, 1) == 1;

            inventoryPanel.SetActive(false);

            logger.Enqueue($"{combatant_1.Name} encountered!");

            SetupUI();

            Invoke("Logger_DisplayNext", 0);
        }

        CombatScreen.SetActive(active);
    }
    private void CheckToSeeIfAttackLeveledUp(int attackNo, CombatUniversals combatant_A)
    {
        if (combatant_A.attacks.ToArray()[attackNo].experience >= combatant_A.attacks.ToArray()[attackNo].maxExperience)
        {
            if (combatant_A.attacks.ToArray()[attackNo].Upgrade != null)
            {
                logger.Enqueue($"{combatant_A.attacks.ToArray()[attackNo].name} leveled up to {combatant_A.attacks.ToArray()[attackNo].Upgrade.name} for {combatant_A.Name}!");

                combatant_A.attacks.Add(combatant_A.attacks.ToArray()[attackNo].Upgrade);

                combatant_A.attacks.Remove(combatant_A.attacks.ToArray()[attackNo]);

                combatant_A.attacks.ToArray()[attackNo].experience = 0;
            }
            else
            {
                logger.Enqueue($"{combatant_A.attacks.ToArray()[attackNo].name} leveled up! But there are no upgrades available...");
            }
        }
    }
    private void SetUiElements(GameObject uiParent, CombatUniversals combatant)
    {
        foreach (var item in uiParent.GetComponentsInChildren <Transform>())
        {
            if (item == uiParent.transform)
            {
                continue;
            }

            Text text = item.GetComponent <Text>();

            if (text)
            {
                if (text.name.Contains("Health"))
                {
                    string state = "";

                    switch (combatant.CurrentState)
                    {
                    case GameManager.States.Normal:
                        state = "Fine";
                        break;

                    case GameManager.States.GrossOut:
                        state = "Grossed out";
                        break;

                    case GameManager.States.Burn:
                        state = "Burned";
                        break;

                    case GameManager.States.Freeze:
                        state = "Frozen";
                        break;

                    case GameManager.States.Paralysis:
                        state = "Paralized";
                        break;

                    case GameManager.States.Poison:
                        state = "Poisoned";
                        break;

                    case GameManager.States.Confusion:
                        state = "Confused";
                        break;

                    case GameManager.States.Heal:
                        state = "Healing";
                        break;

                    case GameManager.States.Taunt:
                        state = "Enraged";
                        break;

                    case GameManager.States.Protection:
                        state = "Blocking";
                        break;

                    default:
                        break;
                    }

                    text.text = $"{combatant.CurrentHealth}/{combatant.MaxHealth} : {state}";
                }
                else
                {
                    text.text = combatant.Name;
                }
            }

            Slider slider = item.GetComponent <Slider>();

            if (slider)
            {
                slider.value    = combatant.CurrentHealth;
                slider.maxValue = combatant.MaxHealth;
            }
        }
    }
    private void CommitAttack(int attackNo, CombatUniversals combatant_A, CombatUniversals combatant_B)
    {
        bool hit = false;

        int special = 0;

        int power = combatant_A.attacks.ToArray()[attackNo].power;

        logger.Enqueue($"{combatant_A.Name} used {combatant_A.attacks.ToArray()[attackNo].name}...");

        switch (combatant_A.attacks.ToArray()[attackNo].Effect)
        {
        case GameManager.States.Normal:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level - combatant_B.Chin.level;

            hit = CalculateChances(power, combatant_B.Agility.level);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Mathf.Abs(Random.Range(power, power + special));

                if (damageToDeal <= 0)
                {
                    logger.Enqueue("It does nothing...");
                }
                else
                {
                    logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                    if (damageToDeal >= power + special)
                    {
                        logger.Enqueue("Critical!");
                    }

                    combatant_A.attacks.ToArray()[attackNo].experience += Random.Range(0, damageToDeal);

                    combatant_B.CurrentHealth -= damageToDeal;

                    CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);
                }
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.GrossOut:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level;

            hit = CalculateChances(power, combatant_B.Agility.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("Critical hit!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                combatant_B.CurrentHealth -= damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_B.CurrentState = GameManager.States.GrossOut;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.Burn:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level;

            hit = CalculateChances(power, combatant_B.Agility.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("Critical hit!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                combatant_B.CurrentHealth -= damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_B.CurrentState = GameManager.States.Burn;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.Freeze:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level;

            hit = CalculateChances(power, combatant_B.Agility.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("Critical hit!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                combatant_B.CurrentHealth -= damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_B.CurrentState = GameManager.States.Freeze;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.Paralysis:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level;

            hit = CalculateChances(power, combatant_B.Agility.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("Critical hit!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                combatant_B.CurrentHealth -= damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_B.CurrentState = GameManager.States.Paralysis;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.Poison:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level;

            hit = CalculateChances(power, combatant_B.Agility.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("Critical hit!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                combatant_B.CurrentHealth -= damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_B.CurrentState = GameManager.States.Poison;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.Confusion:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level;

            hit = CalculateChances(power, combatant_B.Agility.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("Critical hit!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                combatant_B.CurrentHealth -= damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_B.CurrentState = GameManager.States.Confusion;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.Heal:
        {
            power += combatant_A.Strength.level + combatant_A.Chin.level;

            hit = CalculateChances(power, combatant_B.Strength.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Chin.level));

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} successfully healing.");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("It's extremely effective!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_A.CurrentState = GameManager.States.Heal;

                combatant_A.CurrentHealth += damageToDeal;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It failed...</i>");
            }
        }
        break;

        case GameManager.States.Taunt:
        {
            power += combatant_A.Strength.level + combatant_A.Agility.level;

            hit = CalculateChances(power, combatant_B.Agility.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Agility.level)) - combatant_B.Chin.level;

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} hit {combatant_B.Name} for {damageToDeal}hp!");

                if (damageToDeal >= power + special)
                {
                    logger.Enqueue("Critical hit!");
                }

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                combatant_B.CurrentHealth -= damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_B.CurrentState = GameManager.States.Taunt;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It missed...</i>");
            }
        }
        break;

        case GameManager.States.Protection:
        {
            power += combatant_A.Strength.level + combatant_A.Chin.level;

            hit = CalculateChances(power, combatant_B.Strength.level * 2);

            special = (combatant_A.attacks.ToArray()[attackNo].power * (combatant_A.Strength.level + combatant_A.Chin.level));

            if (hit == true)
            {
                //Hit
                int damageToDeal = Random.Range(power, power + special + 1);

                logger.Enqueue($"{combatant_A.Name} is blocking.");

                combatant_A.attacks.ToArray()[attackNo].experience += damageToDeal;

                CheckToSeeIfAttackLeveledUp(attackNo, combatant_A);

                combatant_A.CurrentState = GameManager.States.Protection;
            }
            else
            {
                //miss

                logger.Enqueue($"<i>It failed...</i>");
            }
        }
        break;

        default:
            break;
        }

        if (hit && combatant_A.attacks.ToArray()[attackNo].Effect == combatant_B.weakness)
        {
            int dam = Random.Range(1, power);

            combatant_B.CurrentHealth -= dam;

            logger.Enqueue($"It's super effective!\nAn extra {dam}HP dealt!");
        }

        logging = true;

        Invoke("Logger_DisplayNext", 0);

        if (combatant_1.CurrentHealth <= 0 && (!logger.Contains($"{combatant_1.Name}") && !logger.Contains("knocked out")))
        {
            if (combatant_1.CurrentHealth <= -1 && (!logger.Contains($"{combatant_1.Name}") && !logger.Contains("knocked out")))
            {
                logger.Enqueue($"{combatant_1.Name} got knocked the F**K out!");
            }
            else
            {
                logger.Enqueue($"{combatant_1.Name} got knocked out!");
            }

            int experienceAdded = Random.Range(combatant_1.PowerLevel, combatant_1.PowerLevel + 10);

            combatant_0.experience += (experienceAdded);

            logger.Enqueue($"Gained {experienceAdded} XP.");
        }

        if (combatant_0.CurrentHealth <= 0 && (!logger.Contains($"{combatant_0.Name}") && !logger.Contains("knocked out")))
        {
            if (combatant_0.CurrentHealth <= -2 && (!logger.Contains($"{combatant_0.Name}") && !logger.Contains("knocked out")))
            {
                logger.Enqueue($"{combatant_0.Name} got knocked the f**k out!");
            }
            logger.Enqueue($"{combatant_0.Name} got knocked out.");
        }
    }
    public void Attack(int attackNo, CombatUniversals combatA, CombatUniversals combatb)
    {
        bool freed = false;

        string state = "";

        int damage = 0;

        switch (combatA.CurrentState)
        {
        case GameManager.States.Normal:
            CommitAttack(attackNo, combatA, combatb);
            break;

        case GameManager.States.GrossOut:
            freed = CalculateChances(combatA.Chin.level, 0.6f);

            state = "gross out";
            break;

        case GameManager.States.Burn:
            freed = CalculateChances(combatA.Chin.level, 0.6f);

            state = "burn";
            break;

        case GameManager.States.Freeze:
            freed = CalculateChances(combatA.Chin.level, 0.6f);

            state = "frozen";
            break;

        case GameManager.States.Paralysis:
            freed = CalculateChances(combatA.Chin.level, 0.6f);

            state = "paralysis";
            break;

        case GameManager.States.Poison:
            freed = CalculateChances(combatA.Chin.level, 0.6f);

            state = "poison";
            break;

        case GameManager.States.Confusion:
            freed = CalculateChances(combatA.Chin.level, 0.6f);

            logger.Enqueue($"{combatA.Name} is confused...");

            CommitAttack(attackNo, combatA, combatA);

            state = "confusion";
            break;

        case GameManager.States.Heal:
            freed = CalculateChances(combatA.Chin.level, 0f);

            state = "healing";
            break;

        case GameManager.States.Taunt:
            freed = CalculateChances(combatA.Chin.level, 0.6f);

            state = "taunting";
            break;

        case GameManager.States.Protection:
            freed = CalculateChances(combatA.Chin.level, 0f);

            state = "blocking";
            break;

        default:
            break;
        }

        if (freed)
        {
            playersTurn = !playersTurn;

            logger.Enqueue($"{combatA.Name} recovered from {state}...");

            combatA.CurrentState = GameManager.States.Normal;

            Invoke("Logger_DisplayNext", 0);
        }
        else if (state != "")
        {
            logger.Enqueue($"{combatA.Name} is {state}...");

            if (damage > 0)
            {
                logger.Enqueue($"{combatA.Name} hurt for {damage}hp!");
            }

            Invoke("Logger_DisplayNext", 0);
        }
    }