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