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); }
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); }
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); }
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; } } } }
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); } } } } }
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); }
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); }