public void EnemyChooseAndAttack()
    {
        //raise hero hp sum to 0 if below
        HPsum = 0;
        foreach (var Hero in targetControl.baseHeros)
        {
            if (Hero.curHP < 0)
            {
                Hero.curHP = 0;
            }
            HPsum += Hero.curHP;
        }
        if (targetControl.Hero1Data.curHP < 1)
        {
            HPsum1 = 0;
        }
        else
        {
            HPsum1 = HPsum / targetControl.Hero1Data.curHP;
        }
        if (targetControl.Hero2Data.curHP < 1)
        {
            HPsum2 = 0;
        }
        else
        {
            HPsum2 = HPsum / targetControl.Hero2Data.curHP;
        }
        if (targetControl.Hero3Data.curHP < 1)
        {
            HPsum3 = 0;
        }
        else
        {
            HPsum3 = HPsum / targetControl.Hero3Data.curHP;
        }
        if (targetControl.Hero4Data.curHP < 1)
        {
            HPsum4 = 0;
        }
        else
        {
            HPsum4 = HPsum / targetControl.Hero4Data.curHP;
        }

        //assign hero to chosen hero reference
        var TargetSum = Random.Range(1, (HPsum1 + HPsum2 + HPsum3 + HPsum4));

        if (TargetSum > 0 && TargetSum <= (HPsum1))
        {
            //Target Hero1
            Debug.Log("Hero1 Targeted!");
            targetControl.HeroData = targetControl.Hero1Data;
        }
        else if (TargetSum > HPsum1 && TargetSum <= (HPsum1 + HPsum2))
        {
            //Target Hero2
            Debug.Log("Hero2 Targeted!");
            targetControl.HeroData = targetControl.Hero2Data;
        }
        else if (TargetSum > (HPsum1 + HPsum2) && TargetSum <= (HPsum1 + HPsum2 + HPsum3))
        {
            //Target Hero3
            Debug.Log("Hero3 Targeted!");
            targetControl.HeroData = targetControl.Hero3Data;
        }
        else if (TargetSum > (HPsum1 + HPsum2 + HPsum3) && TargetSum <= (HPsum1 + HPsum2 + HPsum3 + HPsum4))
        {
            //Target Hero4
            Debug.Log("Hero4 Targeted!");
            targetControl.HeroData = targetControl.Hero4Data;
        }

        //get defence values from armour pieces
        int armourDef = 0;

        if (targetControl.HeroData.EquippedHelmet != null)
        {
            armourDef += targetControl.HeroData.EquippedHelmet.armourDefence;
        }
        if (targetControl.HeroData.EquippedChestplate != null)
        {
            armourDef += targetControl.HeroData.EquippedChestplate.armourDefence;
        }
        if (targetControl.HeroData.EquippedLegguards != null)
        {
            armourDef += targetControl.HeroData.EquippedLegguards.armourDefence;
        }
        if (targetControl.HeroData.EquippedBoots != null)
        {
            armourDef += targetControl.HeroData.EquippedBoots.armourDefence;
        }

        //roll to choose which action to take by the enemy
        var choiceVal = Random.Range(1, 100);

        if (choiceVal > 0 && choiceVal < 61)
        {
            choiceVal = 1;
        }
        else if (choiceVal > 60 && choiceVal < 85)
        {
            choiceVal = 2;
        }
        else if (choiceVal > 84 && choiceVal < 96)
        {
            choiceVal = 3;
        }
        else if (choiceVal > 95 && choiceVal <= 100)
        {
            choiceVal = 4;
        }
        switch (choiceVal)
        {
        case 1:
            //standard attack
            targetControl.ChatBox.text = ("Enemy Chose to Standard Attack!");

            //calculate damage value of the attack
            DamageMultiplier = ((float)Random.Range(75, 125)) / 100;
            Damage           = (((targetControl.EnemyData.enemyCurATK) * (targetControl.EnemyData.enemyCurATK)) / ((targetControl.EnemyData.enemyCurATK) + (targetControl.HeroData.curDEF + armourDef)));
            Damage          *= DamageMultiplier;
            Damage           = Mathf.Floor(Damage);


            //calculate miss chance and dead damage appropriately
            int HitChance = Random.Range(1, 10);
            if (HitChance > 8)
            {
                targetControl.ChatBox.text = (targetControl.EnemyData.enemyName + " missed!");
            }
            else
            {
                targetControl.ChatBox.text = (targetControl.EnemyData.enemyName + " Has attacked " + targetControl.HeroData.name + " for " + Damage + "!");

                targetControl.HeroData.curHP -= (int)Damage;
            }

            //hero hp check
            if (targetControl.HeroData.curHP < 0)
            {
                targetControl.HeroData.curHP = 0;
            }

            EnemyAttackAnim();
            break;

        case 2:
            //ability use
            targetControl.ChatBox.text = ("Enemy Chose To Use An Ability!");

            //choosed random ability from list of abilities
            int numberOfAbilities = targetControl.EnemyData.Abilities.Count;
            if (numberOfAbilities != 0)
            {
                int i = (Random.Range(0, numberOfAbilities));
                if (targetControl.EnemyData.Abilities[i].manaCost < targetControl.EnemyData.enemyCurMP)
                {
                    //calculate damage value of the attack
                    DamageMultiplier = ((float)Random.Range(75, 125)) / 100;
                    Damage           = (((targetControl.EnemyData.enemyCurWIS + targetControl.EnemyData.Abilities[i].baseDamage) * (targetControl.EnemyData.enemyCurWIS + targetControl.EnemyData.Abilities[i].baseDamage)) / ((targetControl.EnemyData.enemyCurWIS + targetControl.EnemyData.Abilities[i].baseDamage) + (targetControl.HeroData.curDEF)));
                    Damage          *= DamageMultiplier;
                    Damage           = Mathf.Floor(Damage);

                    //deal damage to target hero
                    targetControl.HeroData.curHP       -= (int)Damage;
                    targetControl.EnemyData.enemyCurMP -= targetControl.EnemyData.Abilities[i].manaCost;
                }
                else
                {
                    targetControl.ChatBox.text = (targetControl.EnemyData.enemyName + " does not have enough mana to cast " + targetControl.EnemyData.Abilities[i].name);
                }

                if (targetControl.HeroData.curHP < 0)
                {
                    targetControl.HeroData.curHP = 0;
                }
            }
            else
            {
                targetControl.ChatBox.text = (targetControl.EnemyData.enemyName + " has not learnt any abilties!");
            }

            break;

        case 3:
            //defend
            targetControl.ChatBox.text = ("Enemy Chose to Defend!");

            //raise defence value when defending or remove defence bonus when finished defending
            if (targetControl.EnemyData.isDefending == true)
            {
                targetControl.EnemyData.enemyCurDEF -= targetControl.EnemyData.defendingValue;
            }
            targetControl.EnemyData.enemyCurDEF += targetControl.EnemyData.defendingValue;
            targetControl.EnemyData.isDefending  = true;

            break;

        case 4:
            //flee
            targetControl.ChatBox.text = ("Enemy Chose to Try and Flee!");
            Damage           = targetControl.EnemyData.enemyCurAGI + (targetControl.Hero1Data.curAGI + targetControl.Hero2Data.curAGI + targetControl.Hero3Data.curAGI + targetControl.Hero4Data.curAGI) / 4;
            DamageMultiplier = Random.Range(0, Damage);
            if (DamageMultiplier < targetControl.EnemyData.enemyCurAGI)
            {
                //Flee successful
                targetControl.ChatBox.text = (targetControl.EnemyData.name + " fleed successfully!");
                Debug.Log("Enemy Flee");
                targetControl.Flee();
            }
            else
            {
                //Flee unsuccessful
                targetControl.ChatBox.text = (targetControl.EnemyData.name + " failed to flee!");
                targetControl.StateControl();
                Invoke("Delay", 1);
            }
            break;
        }
        UIdetails.HeroBarUpdate();
        targetControl.DieAnimHeroes();
    }