/// <summary>
        /// Attaque d'une ville ennemie -- appelée aussi par l'IA
        /// </summary>
        /// <returns> true si on a gagné</returns>
        /// <param name="cible">ville cible</param>
        public bool attaqueVille(VilleDescription cible)
        {
            bool retVal = false;
            // Détermine toutes les armées de la ville
            List <Armee> garnison = new List <Armee>();

            foreach (Armee arme in _jeu.armees)
            {
                if (cible.contains(arme.positionCarte))
                {
                    garnison.Add(arme);
                }
            }
            // Mode auto ou graphique
            if (_jeu.factions.getFaction(_jeu.tourFaction).humanPlayer || _jeu.factions.getFaction(cible.faction).humanPlayer)
            {
                if (garnison.Count != 0)
                {
                    // Mode graphique
                    Combat     combat = new Combat(_jeu, _jeu.selectedArmee, garnison);
                    ZoneCombat zc     = new ZoneCombat(_jeu, combat, delegate(bool attaquantVainqueur) {
                        if (!attaquantVainqueur)
                        {
                            _jeu.selectedArmee = null;
                        }
                        else
                        {
                            // On gagne
                            cible.faction = _jeu.selectedArmee.faction;
                        }
                    });
                    _jeu.addOverlay(zc);
                }
                else
                {
                    // On gagne
                    cible.faction = _jeu.selectedArmee.faction;
                }
            }
            else
            {
                if (garnison.Count != 0)
                {
                    attaqueArmee(garnison);
                }
                // Si il y a encore un attaquant, c'est la victoire !
                if (_jeu.selectedArmee != null)
                {
                    // Capture la ville
                    cible.faction = _jeu.selectedArmee.faction;
                    retVal        = true;
                }
            }
            return(retVal);
        }
示例#2
0
 /// <summary>
 /// Déplacement des armées : met à jour vdcible avec la meilleure cible pour une armée & une ville choisie
 /// </summary>
 /// <param name="armee">armee</param>
 /// <param name="vd">ville</param>
 private void choisitCibleArmee(Armee armee, VilleDescription vd)
 {
     // Choisit la ville la plus proche et l'attaque si on peut gagner
     if (vd.faction != _jeu.tourFaction)
     {
         // Regarde d'abord si elle n'est pas trop loin... Taille max
         const int DISTANCE_MAX = 25;
         if (Math.Max(Math.Abs(vd.positionMap.X - armee.positionCarte.X), Math.Abs(vd.positionMap.Y - armee.positionCarte.Y)) < DISTANCE_MAX)
         {
             // Regarde d'abord si on gagnerait pour éviter de calculer des trajectoires pour rien
             // peut-on gagner le combat ?
             List <Armee> garnison = new List <Armee>();
             foreach (Armee arme in _jeu.armees)
             {
                 if (vd.contains(arme.positionCarte))
                 {
                     garnison.Add(arme);
                 }
             }
             bool gagne;
             if (garnison.Count != 0)
             {
                 Combat combat = new Combat(_jeu, armee, garnison);
                 gagne = combat.simulationCombat();
             }
             else
             {
                 gagne = true;
             }
             if (gagne)
             {
                 // Accessible ?
                 // choisit un point accessible près de la ville
                 Point?cible = getPointPresDeVille(armee, vd.positionMap);
                 if (cible != null)   // sinon inaccessible
                 // Déjà là ?
                 {
                     if (armee.positionCarte == cible)
                     {
                         minChemin = 0;
                         vdcible   = vd;
                     }
                     else
                     {
                         armee.moveTarget = cible;
                         if ((armee.trajectoire != null) && (armee.trajectoire.chemin != null))
                         {
                             int lenChem = armee.trajectoire.chemin.Count;
                             if (lenChem != 0 && lenChem < minChemin)
                             {
                                 if (minChemin > lenChem)
                                 {
                                     minChemin = lenChem;
                                     vdcible   = vd;
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }