/// <summary> /// Indique si les unités sélectionnées peuvent attaquer ensemble. Pour cela, elles doivent être /// </summary> /// <returns>bool true si les unités sont compatibles, false autrement.</returns> protected bool CanAttackTogether(Territoire toAttack) { if (this.GetType().Name == "Bombardier") { if (toAttack.unites.Count > 0) { // On vérifie pour chaque unité si elle est du même type et stationnée à portée de tire de la cible foreach (Unite unit in selectedList) { if (unit.GetType().Name != "Bombardier") { return(false); } Bombardier bombardier = unit as Bombardier; if (!toAttack.GetVoisinsNDegree(3, true, true).Contains(bombardier.territoire)) { return(false); } } } } else // Seuls les bombardiers peuvent poursuivre { return(false); } return(true); }
public override Skill Clone(int value) { var tmp = new Bombardier { Description = Description, MaxValue = MaxValue, Name = Name, Value = value }; return(tmp); }
/// <summary> /// Détruit les unités terrestres et aériennes en fonction du résultat des dés. /// </summary> /// <param name="diceAtt">int[] Les dés de l'attaquant.</param> /// <param name="diceDef">int[] Les dés du défenseur</param> /// <param name="ranged">bool Variable d'état définissant si l'attaque est à distance ou non.</param> private void DestroyUnits(int[] diceAtt, int[] diceDef, bool ranged) { int toDestroyAtt = 0, toDestroyDef = 0; int totalAtt = 0, totalDef = 0, i = 0; // Tri dans l'ordre croissant Array.Sort(diceAtt); Array.Sort(diceDef); // Comparaison des plus gros chiffres tirés par chaque joueur if (diceAtt[diceAtt.Length - 1] > diceDef[diceDef.Length - 1]) { toDestroyDef++; } else { toDestroyAtt++; } // Comparaison des seconds plus gros chiffres tirés par chaque joueur if (diceAtt.Length > 1 && diceDef.Length > 1) { if (diceAtt[diceAtt.Length - 2] > diceDef[diceDef.Length - 2]) { toDestroyDef++; } else { toDestroyAtt++; } } // Somme des dés de l'attaque for (i = 0; i < diceAtt.Length; i++) { totalAtt += diceAtt[i]; } // Somme des dés de la défense for (i = 0; i < diceDef.Length; i++) { totalDef += diceDef[i]; } // Si la somme de l'attaquant est supérieure au défenseur, on détruit un tank du défenseur s'il y en a if (totalAtt > totalDef) { unitDef = DestroyTank(unitDef, true); } else// Autrement, c'est un tank de l'attaquant { unitAtt = DestroyTank(unitAtt, false); } List <Dca> dcasInRange = territoireCible.GetDcaInRange(); if (toDestroyAtt > 0 && unitAtt.Count > 0 && (!ranged || (unitAtt[0].GetType().Name == "Bombardier" && dcasInRange.Count > 0))) { List <Unite> .Enumerator unitesEnum = unitAtt.GetEnumerator(); List <Unite> toDestroy = new List <Unite>(); // On ne peut détruire plus de bombardier qu'il n'y a de DCA. // Si unitAtt[0] == null alors il s'agissait d'un tank donc la liste ne contient pas de bombardier if (unitAtt[0] != null && unitAtt[0].GetType().Name == "Bombardier") { toDestroyAtt = Math.Min(toDestroyAtt, dcasInRange.Count); } while (toDestroyAtt > 0 && unitesEnum.MoveNext()) { if (unitesEnum.Current.GetType().Name != "Tank") { if (unitesEnum.Current.GetType().Name == "Bombardier") { unitesDetruitesAtt[(int)Utils.unitCode.Bombardier]++; } if (unitesEnum.Current.GetType().Name == "Infanterie") { unitesDetruitesAtt[(int)Utils.unitCode.Infanterie]++; } foreach (Unite unit in unitAtt) { if (!unit.Equals(unitesEnum.Current)) { unit.RemoveFromSelection(unitesEnum.Current); } } toDestroy.Add(unitesEnum.Current); --toDestroyAtt; } } foreach (Unite unit in toDestroy) { if (unit.GetType().Name == "Bombardier") { Bombardier bomber = unit as Bombardier; bomber.territoire.unites.Remove(bomber); } if (unit.GetType().Name == "Infanterie") { Infanterie infanterie = unit as Infanterie; infanterie.territoire.unites.Remove(infanterie); } unit.Joueur.Unites.Remove(unit); unitAtt.Remove(unit); Destroy(unit.gameObject); } } // Si c'est une attaque à distance, on laisse une unité en vie. int minUnitToLeaveAlive = ranged ? 1 : 0; if (toDestroyDef > minUnitToLeaveAlive) { List <Bombardier> bombardiers = new List <Bombardier>(); List <Dca> dcas = new List <Dca>(); List <Artillerie> artilleries = new List <Artillerie>(); List <Infanterie> infanteries = new List <Infanterie>(); foreach (Unite unit in unitDef) { if (unit.GetType().Name == "Bombardier") { bombardiers.Add(unit as Bombardier); } if (unit.GetType().Name == "Dca") { dcas.Add(unit as Dca); } if (unit.GetType().Name == "Artillerie") { artilleries.Add(unit as Artillerie); } if (unit.GetType().Name == "Infanterie") { infanteries.Add(unit as Infanterie); } } List <Bombardier> .Enumerator bombardiersEnum = bombardiers.GetEnumerator(); List <Dca> .Enumerator dcasEnum = dcas.GetEnumerator(); List <Artillerie> .Enumerator artilleriesEnum = artilleries.GetEnumerator(); List <Infanterie> .Enumerator infanteriesEnum = infanteries.GetEnumerator(); List <Unite> toDestroy = new List <Unite>(); while (toDestroyDef > minUnitToLeaveAlive && bombardiersEnum.MoveNext()) { unitesDetruitesDef[(int)Utils.unitCode.Bombardier]++; bombardiersEnum.Current.territoire.unites.Remove(bombardiersEnum.Current); toDestroy.Add(bombardiersEnum.Current); --toDestroyDef; } while (toDestroyDef > minUnitToLeaveAlive && dcasEnum.MoveNext()) { unitesDetruitesDef[(int)Utils.unitCode.DCA]++; dcasEnum.Current.territoire.unites.Remove(dcasEnum.Current); toDestroy.Add(dcasEnum.Current); --toDestroyDef; } while (toDestroyDef > minUnitToLeaveAlive && artilleriesEnum.MoveNext()) { unitesDetruitesDef[(int)Utils.unitCode.Artillerie]++; artilleriesEnum.Current.territoire.unites.Remove(artilleriesEnum.Current); toDestroy.Add(artilleriesEnum.Current); --toDestroyDef; } while (toDestroyDef > minUnitToLeaveAlive && infanteriesEnum.MoveNext()) { unitesDetruitesDef[(int)Utils.unitCode.Infanterie]++; infanteriesEnum.Current.territoire.unites.Remove(infanteriesEnum.Current); toDestroy.Add(infanteriesEnum.Current); --toDestroyDef; } foreach (Unite unit in toDestroy) { unit.Joueur.Unites.Remove(unit); unitDef.Remove(unit); Destroy(unit.gameObject); } } }
public BomberJewel1() { Name = "Bomber Jewel 1"; Skill = new Bombardier(1); Type = SlotType.Small; }