示例#1
0
    /// <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);
    }
示例#2
0
        public override Skill Clone(int value)
        {
            var tmp = new Bombardier
            {
                Description = Description,
                MaxValue    = MaxValue,
                Name        = Name,
                Value       = value
            };

            return(tmp);
        }
示例#3
0
    /// <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);
            }
        }
    }
示例#4
0
 public BomberJewel1()
 {
     Name  = "Bomber Jewel 1";
     Skill = new Bombardier(1);
     Type  = SlotType.Small;
 }