//  -------------------------------------- Space Marine Combat

    private IEnumerator MarineAssault(p_ship target)
    {
        int  disadvantage    = 0;
        bool boardSuccessful = false;

        disadvantage = HasMoreEngines(target);


        //Boarding process
        int i = 0;

        while (i < numActiveMarines && marines.Count >= 1)
        {
            Tuple <bool, int> temp;
            if (marines[i] != null && marines[(i)].GetActivity() == true)
            {
                temp = MarineRoll(disadvantage, (i));
                if (temp.Item1 == true)
                {
                    RollUIHandler(temp.Item2, marines[i].getLevel(), "marine assault success");
                    TransferMarine(marines[(i)], (i), target);
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                }
                else if (!temp.Item1)
                {
                    if (target.HasShields())
                    {
                        RollUIHandler(temp.Item2, marines[i].getLevel(), "marine assault fail destroyed");
                        yield return(new WaitForSeconds(3f));

                        GC.GetComponent <RollPopUp>().Close();
                        marines.RemoveAt(i);
                        numSpaceMarines--;
                        numActiveMarines--;
                    }
                    else
                    {
                        RollUIHandler(temp.Item2, marines[i].getLevel(), "marine assault fail");
                        yield return(new WaitForSeconds(3f));

                        GC.GetComponent <RollPopUp>().Close();
                        marines[(i)].ToggleActive();
                        numActiveMarines--;
                        i++;
                    }
                }
            }
            else
            {
                print("Null found");
            }
        }
        print("post board");
        if (target.GetNumSpaceMarines() > 0)
        {
            print("target has greater than 0 space marines");
            print(target.GetNumEnemy());

            // Each player rolls until one side no longer has any space marines
            do
            {
                int friendlyRoll = 0, enemyRoll = 0;
                friendlyRoll = UnityEngine.Random.Range(1, 6);
                enemyRoll    = UnityEngine.Random.Range(1, 6);

                if (friendlyRoll > enemyRoll)
                {
                    RollUIHandler(friendlyRoll, enemyRoll, "marine vs marine success");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                    target.marines.RemoveAt(0);
                    target.DecMarine();
                }
                else if (friendlyRoll < enemyRoll)
                {
                    RollUIHandler(friendlyRoll, enemyRoll, "marine vs marine fail");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                    target.enemyMarines.RemoveAt(0);
                    target.DecEnemyMarine();
                }
                else
                {
                    RollUIHandler(friendlyRoll, enemyRoll, "marine vs marine tie");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                    target.enemyMarines.RemoveAt(0);
                    target.marines.RemoveAt(0);
                    target.DecEnemyMarine();
                    target.DecMarine();
                }
            }while (target.GetNumSpaceMarines() > 0 && target.GetNumEnemy() > 0);

            if ((target.GetNumEnemy() > 0) == true && target.GetNumSpaceMarines() == 0)
            {
                boardSuccessful = true;
            }
        }
        else
        {
            print("board successful");
            print(target.marines.Count);
            print(target.GetNumSpaceMarines());
            boardSuccessful = true;
        }

        if (boardSuccessful == true)
        {
            MarineAssaultAssesmentHandler("Enemy ship was captured!");
            yield return(new WaitForSeconds(5f));

            GC.GetComponent <MarineAssaultAssesment>().Close();
            target.gameObject.tag = this.gameObject.tag;
            GC.GetComponent <GameController>().RecompileList();
            print("Ship Captured");
        }
        else
        {
            MarineAssaultAssesmentHandler("Enemy ship was not captured!");
            yield return(new WaitForSeconds(5f));

            GC.GetComponent <MarineAssaultAssesment>().Close();
            print("Failed Attempt");
            print(target.GetNumSpaceMarines());
            print(target.GetNumEnemy());
        }
    }
    private IEnumerator Attack(p_ship target)
    {
        int beamHit    = 0; // number of beam weapons that need to be calculated against shields
        int missileHit = 0; //number of missiles that need top be calculated against anitmissiles
        int dmgHits    = 0; //number of hits that actually make it through sheilds and anti missile

        print("In attack");
        print(target.numArmor);

        //RollUIHandler(3, 4);

        //------------------------------------------ Beam


        for (int i = 0; i < arrComponents.Count; i++)
        {
            Tuple <bool, int> temp;
            GC.GetComponent <RollPopUp>().Close();
            if (arrComponents[i] is p_beamWeapon && arrComponents[i].getActivity() == true)
            {
                temp = FireBeam(i);
                if (temp.Item1 == true)
                {
                    beamHit++;

                    RollUIHandler(temp.Item2, arrComponents[i].getLevel(), "beam hit");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                }
                else
                {
                    RollUIHandler(temp.Item2, arrComponents[i].getLevel(), "beam miss");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                }
            }
        }
        print(beamHit);

        //------------------------------------------- Missile

        for (int i = 0; i < arrComponents.Count; i++)
        {
            Tuple <bool, int> temp;
            if (arrComponents[i] is p_missileLauncher && arrComponents[i].getActivity() == true)
            {
                temp = FireMissile(i);
                if (temp.Item1 == true)
                {
                    missileHit++;

                    RollUIHandler(temp.Item2, arrComponents[i].getLevel(), "missile hit");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                }
                else
                {
                    RollUIHandler(temp.Item2, arrComponents[i].getLevel(), "missile miss");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                }
            }
        }

        print(missileHit);

        //------------------------------------------- Shields

        if (target.HasShields() == true)
        {
            int shieldGenLoc = 0;
            for (int i = 0; i < target.arrComponents.Count; i++)
            {
                if (target.arrComponents[i] is p_sheildGenerator && arrComponents[i].getActivity() == true)
                {
                    shieldGenLoc = i;
                    break;
                }
            }

            for (int i = 0; i < beamHit; i++)
            {
                Tuple <bool, int> temp;
                temp = ShieldDeflect(shieldGenLoc, target);

                if (temp.Item1 == true)
                {
                    dmgHits++;
                    RollUIHandler(arrComponents[shieldGenLoc].getLevel(), temp.Item2, "shield break");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                }
                else
                {
                    RollUIHandler(arrComponents[shieldGenLoc].getLevel(), temp.Item2, "shield deflect");
                    yield return(new WaitForSeconds(3f));

                    GC.GetComponent <RollPopUp>().Close();
                }
            }
        }
        else
        {
            dmgHits = beamHit;
        }

        //------------------------------------------- Anti-Missile

        if (target.HasAntiMissile() == true)
        {
            Tuple <bool, int> temp;
            for (int i = 0; i < target.arrComponents.Count; i++)
            {
                if (missileHit <= 0)
                {
                    break;
                }
                else if (target.arrComponents[i] is p_antiMissile && arrComponents[i].getActivity() == true)
                {
                    temp = MissileDeflect(i, target);

                    if (temp.Item1 == true)
                    {
                        dmgHits++;
                        missileHit--;
                        RollUIHandler(arrComponents[i].getLevel(), temp.Item2, "anti-missile hit");
                        yield return(new WaitForSeconds(3f));

                        GC.GetComponent <RollPopUp>().Close();
                    }
                    else
                    {
                        missileHit--;
                        RollUIHandler(arrComponents[i].getLevel(), temp.Item2, "anti-missile blocked");
                        yield return(new WaitForSeconds(3f));

                        GC.GetComponent <RollPopUp>().Close();
                    }
                }
            }

            if (missileHit > 0)
            {
                dmgHits = dmgHits + missileHit;
            }
        }
        else
        {
            dmgHits = dmgHits + missileHit;
        }

        print("dmg Hits " + dmgHits);

        //--------------------------------------- Armor

        if (dmgHits > target.numArmor)
        {
            target.numArmor = 0;

            do
            {
                int marker = UnityEngine.Random.Range(0, maxComponents);

                if (marker >= target.arrComponents.Count)
                {
                    print("Critical Hit!");
                    target.numCriticalHits--;
                    dmgHits--;
                }
                else if (target.arrComponents[marker].getActivity() == true)
                {
                    target.arrComponents[marker].ToggleActivity();
                    dmgHits--;
                    print("Component: " + target.arrComponents[marker].ToString() + " inactive");
                }
                else
                {
                    target.arrComponents.RemoveAt(marker);
                    dmgHits--;
                    print("Component: " + target.arrComponents[marker].ToString() + " Destroyed");
                }
            }while (dmgHits != 0 && target.numCriticalHits != 0);
        }
        else
        {
            print("Armor Before: " + target.numArmor);
            target.numArmor = target.numArmor - dmgHits;
            print("Armor After: " + target.numArmor);
        }

        // -------------------------------------- Critical Hits

        DmgAssesmentHandler(target);
        yield return(new WaitForSeconds(5f));

        GC.GetComponent <DamageAssesmentUI>().Close();

        if (target.numCriticalHits <= 0)
        {
            DmgAssesmentHandler(target);
            yield return(new WaitForSeconds(5f));

            GC.GetComponent <DamageAssesmentUI>().Close();
            Destroy(target.gameObject);
            GC.GetComponent <GameController>().RecompileList();
            print("Target Destroyed");
        }
    }