Пример #1
0
    public int GenerateTurrets(GameObject[] turretsPrefab, int index, int gunCount)
    {
        for (int i = 0; i < TurretMainSpec.Length; i++)
        {
            int childCount = TurretSets[i].transform.childCount;
            if (TurretMainSpec[i] == null)              // Generate only for specless turret sets
            {
                int cindex = index;
                for (int j = 0; j < childCount; j++)
                {
                    GameObject turretHardpointObject = TurretSets[i].transform.GetChild(j).gameObject;
                    GameObject turret = (GameObject)Instantiate(turretsPrefab[index], new Vector3(0, 0, 0), Quaternion.identity);
                    turret.transform.parent   = turretHardpointObject.transform;
                    turret.transform.position = turret.transform.parent.transform.position;
                    TurretSpec turretStat = (TurretSpec)turret.GetComponent("TurretSpec");
                    turretStat.totalBarrage = gunCount * turretStat.gunCount();
                    if (TurretMainSpec[i] == null)
                    {
                        TurretMainSpec[i] = turretStat;
                    }
                    turretStat.parent = this;
                    cindex            = turretStat.GenerateTurrets(turretsPrefab, index + 1, gunCount * childCount);
                }
                index = cindex;
            }
            else
            {
                TurretMainSpec[i].totalBarrage = gunCount * TurretMainSpec[i].gunCount() * childCount;
            }
        }



        return(index);
    }
Пример #2
0
 public void selectWeaponE()
 {
     if (!RangedBattle && attackAngle != Defender.UnitRotation)           // No counter in ranged or back attacks
     {
         float bestDamage = 0;
         foreach (TurretSpec turret in Defender.UnitBodySpec.turrets)
         {
             float   newDamage;
             GunSpec weapon = turret.gunStat;
             if (Defender.UnitRotation == GameUnit.OppositeRotationStatus(attackAngle) || // Head on attack
                 turret.turnableIndex() >= 0)                                             // Or the turret is turnable
             {
                 if (weapon.counter && canTarget(Defender, Attacker, distance, turret, weapon))
                 {
                     newDamage = estimateRawDamage(Attacker.getArmor(
                                                       attackAngle, false), weapon,
                                                   Attacker.UnitBodySpec.getNumbers());
                     if (newDamage > bestDamage)
                     {
                         bestDamage      = newDamage;
                         TurretOfChoiceE = turret;
                     }
                 }
             }
         }
     }
 }
    public TurretSpec[] getTurretsGameObjects()
    {
        ArrayList objects = new ArrayList();

        TurretSpec[] turrets;
        addTurretsGameobjects(objects);

        turrets = new TurretSpec[objects.Count];
        for (int i = 0; i < turrets.Length; i++)
        {
            turrets[i] = (TurretSpec)objects[i];
        }


        return(turrets);
    }
 public int turnableIndex()
 {
     if (turnable)         // Index is the current turret is 0
     {
         return(0);
     }
     else if (parent is TurretSpec)
     {
         TurretSpec parentTurret = (TurretSpec)parent;
         int        turretIndex  = parentTurret.turnableIndex();
         if (turretIndex >= 0)
         {
             return(turretIndex + 1);                // Index is at least the previous turnable index plus 1 (needs to descend atleast the parent's index + 1
         }
     }
     return(-1);
 }
Пример #5
0
    public static bool canTarget(GameUnit attacker, GameUnit defender, int distance, TurretSpec turret, GunSpec weapon)
    {
        //DIRECT ATTACKS
        if (distance <= 1)
        {
            if (!weapon.direct)
            {
                return(false);
            }
            return(canTargetDirectRules(attacker.terrainStatus, defender.terrainStatus, turret, weapon));
        }
        //LONG RANGE ATTTACKS
        else if (!attacker.HasMoved && weapon.minrange <= distance && weapon.maxrange >= distance)
        {
//			Debug.Log ("TESTU");
            // Homing weapons can target all except submerged, cannot be used while submerged
            if (weapon.type == GunSpec.GunType.Homing &&
                attacker.terrainStatus != GameUnit.UnitTerrainStatus.Deep &&
                defender.terrainStatus != GameUnit.UnitTerrainStatus.Deep)
            {
                return(true);
            }
            else if (attacker.terrainStatus == GameUnit.UnitTerrainStatus.Air ||  // Attacker is flying
                     attacker.terrainStatus == GameUnit.UnitTerrainStatus.Deep || // Attacker is submerged
                     weapon.type == GunSpec.GunType.Torpedo)                      // Torpedo weapons
            //use direct attack rules
            {
                return(canTargetDirectRules(attacker.terrainStatus, defender.terrainStatus, turret, weapon));
            }
            else if (turret.highDepression)              //Attacker is either grounded or on sea, turret need to have a good angle
            {
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:                 // Can only perform anti air against aerial units
                    return(defender.terrainStatus == GameUnit.UnitTerrainStatus.Air);

                case GunSpec.GunType.Heavy:                 // Can only perform attacks against non flying and non submerged units
                    return(defender.terrainStatus != GameUnit.UnitTerrainStatus.Air && defender.terrainStatus != GameUnit.UnitTerrainStatus.Deep);
                }
            }
        }
        return(false);
    }
Пример #6
0
    public void selectWeapon()
    {
        float bestDamage = 0;

        foreach (TurretSpec turret in Attacker.UnitBodySpec.turrets)
        {
            float   newDamage;
            GunSpec weapon = turret.gunStat;
            if (canTarget(Attacker, Defender, distance, turret, weapon))
            {
                newDamage = estimateRawDamage(Defender.getArmor(
                                                  GameUnit.OppositeRotationStatus(attackAngle)), weapon,
                                              Defender.UnitBodySpec.getNumbers());
                if (newDamage > bestDamage)
                {
                    bestDamage     = newDamage;
                    TurretOfChoice = turret;
                }
            }
        }
    }
Пример #7
0
 public void paintTurrets(Color color)
 {
     for (int i = 0; i < TurretMainSpec.Length; i++)
     {
         if (TurretMainSpec[i] != null)
         {
             int childCount = TurretSets[i].transform.childCount;
             for (int j = 0; j < childCount; j++)
             {
                 GameObject turretObject = TurretSets[i].transform.GetChild(j).GetChild(0).gameObject;
                 if (turretObject != null)
                 {
                     TurretSpec  spec    = (TurretSpec)turretObject.GetComponent("TurretSpec");
                     UnitPainter painter = (UnitPainter)turretObject.GetComponent("UnitPainter");
                     painter.paint(color);
                     spec.paint(color);
                 }
             }
         }
     }
 }
Пример #8
0
 public int GenerateGuns(GameObject[] gunsPrefab, int index)
 {
     for (int i = 0; i < TurretMainSpec.Length; i++)
     {
         if (TurretMainSpec[i] != null)
         {
             int childCount = TurretSets[i].transform.childCount;
             for (int j = 0; j < childCount; j++)
             {
                 GameObject turretObject = TurretSets[i].transform.GetChild(j).GetChild(0).gameObject;
                 int        cindex       = index;
                 if (turretObject != null)
                 {
                     TurretSpec spec = (TurretSpec)turretObject.GetComponent("TurretSpec");
                     cindex = spec.GenerateBody(gunsPrefab[index], gunsPrefab, index + 1);
                 }
                 index = cindex;
             }
         }
     }
     return(index);
 }
Пример #9
0
    public static bool canTargetDirectRules(GameUnit.UnitTerrainStatus attacker, GameUnit.UnitTerrainStatus defender, TurretSpec turret, GunSpec weapon)
    {
        // Homing weapons can target all except submerged, cannot be used while submerged
        if (weapon.type == GunSpec.GunType.Homing &&
            attacker != GameUnit.UnitTerrainStatus.Deep &&
            defender != GameUnit.UnitTerrainStatus.Deep)
        {
            return(true);
        }

        switch (attacker)
        {
        case GameUnit.UnitTerrainStatus.Air:
            switch (defender)
            {
            case GameUnit.UnitTerrainStatus.Air:             // A vs A
                return(weapon.type == GunSpec.GunType.Direct);

            case GameUnit.UnitTerrainStatus.Deep:             // A vs Sub
                return(weapon.type == GunSpec.GunType.Drop || weapon.type == GunSpec.GunType.Torpedo);

            case GameUnit.UnitTerrainStatus.High:             // A vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(true);

                case GunSpec.GunType.Drop:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.HighFloat:             // A vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(true);

                case GunSpec.GunType.Drop:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Land:             // A vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(true);

                case GunSpec.GunType.Drop:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Float:             // A vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(true);

                case GunSpec.GunType.Drop:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Water:             // A vs Sea
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(true);

                case GunSpec.GunType.Drop:
                    return(true);

                case GunSpec.GunType.Torpedo:
                    return(true);
                }
                break;
            }
            break;

        case GameUnit.UnitTerrainStatus.Deep:
            switch (defender)
            {
            case GameUnit.UnitTerrainStatus.Deep:              // Sub vs Sub
                return(weapon.type == GunSpec.GunType.Direct || weapon.type == GunSpec.GunType.Torpedo);

            case GameUnit.UnitTerrainStatus.Water:             // Sub vs Sea
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Torpedo:
                    return(true);
                }
                break;
            }
            break;



        case GameUnit.UnitTerrainStatus.High:
            switch (defender)
            {
            case GameUnit.UnitTerrainStatus.Air:             // G vs A
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);
                }
                break;

            case GameUnit.UnitTerrainStatus.High:              // GH vs GH
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.HighFloat:              // GH vs GH
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Land:             // GH vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Float:             // GH vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Water:               // G vs Sea
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;
            }
            break;


        case GameUnit.UnitTerrainStatus.Land:
            switch (defender)
            {
            case GameUnit.UnitTerrainStatus.Air:             // G vs A
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);
                }
                break;

            case GameUnit.UnitTerrainStatus.High:              // G vs GH
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(turret.highDepression);
                }
                break;

            case GameUnit.UnitTerrainStatus.HighFloat:              // G vs GH
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(turret.highDepression);
                }
                break;

            case GameUnit.UnitTerrainStatus.Land:             // G vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Float:             // G vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Water:               // G vs Sea
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;
            }
            break;



        case GameUnit.UnitTerrainStatus.Water:
            switch (defender)
            {
            case GameUnit.UnitTerrainStatus.Air:               // Sea vs A
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);
                }
                break;

            case GameUnit.UnitTerrainStatus.High:              // Sea vs GH
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(turret.highDepression);
                }
                break;

            case GameUnit.UnitTerrainStatus.HighFloat:              // Sea vs GH
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(turret.highDepression);

                case GunSpec.GunType.Heavy:
                    return(turret.highDepression);
                }
                break;

            case GameUnit.UnitTerrainStatus.Land:             // Sea vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Float:             // Sea vs G
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Water:              // Sea vs Sea
                switch (weapon.type)
                {
                case GunSpec.GunType.Direct:
                    return(true);

                case GunSpec.GunType.Heavy:
                    return(true);

                case GunSpec.GunType.Drop:
                    return(true);

                case GunSpec.GunType.Torpedo:
                    return(true);
                }
                break;

            case GameUnit.UnitTerrainStatus.Deep:              // Sea vs Sea
                switch (weapon.type)
                {
                case GunSpec.GunType.Drop:
                    return(true);

                case GunSpec.GunType.Torpedo:
                    return(true);
                }
                break;
            }
            break;
        }


        return(false);
    }