/// <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; } } } } } } } } }
/// <summary> /// Fouille une ruine /// </summary> /// <param name="heros">héros visiteur</param> /// <param name="ruine">ruine visitée</param> /// <param name="nomEnnemi">en sortie, le nom de l'ennemi rencontré</param> /// <param name="nomRecompense">en sortie (si vainqueur), le nom de la récompense</param> /// <returns>true si le héros gagne, false s'il meurt</returns> /// public bool fouilleRuine(Creature heros, RuineDescription ruine, ref string nomEnnemi, ref string nomRecompense) { // Détermine l'ennemi à combattre Creature ennemi; switch (_jeu.rnd.Next(3)) { case 0: ennemi = new Creature(_jeu, Creatures.TYPE_GRIFFON, 0, heros.positionCarte); nomEnnemi = "un griffon"; break; case 1: ennemi = new Creature(_jeu, Creatures.TYPE_GEANT, 0, heros.positionCarte); nomEnnemi = "un géant des montagnes"; break; default: ennemi = new Creature(_jeu, Creatures.TYPE_SORCIERE, 0, heros.positionCarte); nomEnnemi = "une sorcière"; break; } Armee aheros = new Armee(_jeu); aheros.addCreature(heros); Armee aennemi = new Armee(_jeu); aennemi.addCreature(ennemi); List <Armee> garnison = new List <Armee>(); garnison.Add(aennemi); Combat combat = new Combat(_jeu, aheros, garnison); bool herosGagne = combat.combatAuto(); // Détermine la récompense : item, troupe ou argent nomRecompense = ""; if (herosGagne) { ruine.visite = true; if (ruine.item != null) { nomRecompense = "l'objet : " + ruine.item.nom; heros.addItem(ruine.item); } else if (_jeu.rnd.Next(4) == 0) { int montant = _jeu.rnd.Next(1500) + 500; nomRecompense = montant + " pièces d'or"; _jeu.factions.getFaction(_jeu.tourFaction).or += montant; } else { // Alliés Armee allies = new Armee(_jeu); int typeAllie = _jeu.rnd.Next(Creatures.TYPE_ALLIEMAX + 1 - Creatures.TYPE_ALLIEMIN) + Creatures.TYPE_ALLIEMIN; int nbAllie = _jeu.rnd.Next(2) + 2; for (int i = 0; i < nbAllie; i++) { allies.addCreature(new Creature(_jeu, typeAllie, _jeu.tourFaction, heros.positionCarte)); } _jeu.addArmee(allies); nomRecompense = nbAllie + " alliés"; } } else { // Suppression du héros du jeu if (_jeu.selectedArmee.getTaille() == 1) { _jeu.removeArmee(_jeu.selectedArmee); _jeu.selectedArmee = null; } else { _jeu.selectedArmee.removeCreature(heros); } } return(herosGagne); }
/// <summary> /// Déplacement des armées : met à jour vdcible avec la meilleure cible pour une armée & une armée ennemie choisie /// </summary> /// <param name="armee">armee</param> /// <param name="cible">armée ciblée</param> private void choisitCibleArmee(Armee armee, Armee cible) { // Choisit la ville la plus proche et l'attaque si on peut gagner if (cible.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(cible.positionCarte.X - armee.positionCarte.X), Math.Abs(cible.positionCarte.Y - armee.positionCarte.Y)) < DISTANCE_MAX) { // Regarde ensuite si elle est dans une ville, si oui on l'ignore car c'est pris en compte dans le choix des cibles villes bool dansVille = false; foreach (VilleDescription vd in _jeu.villes.villeDesc) { if (vd.contains(cible.positionCarte)) { dansVille = true; break; } } if (!dansVille) { // Regarde d'abord si on gagnerait pour éviter de calculer des trajectoires pour rien // peut-on gagner le combat ? bool gagne; List <Armee> garnison = new List <Armee>(); garnison.Add(cible); Combat combat = new Combat(_jeu, armee, garnison); gagne = combat.simulationCombat(); if (gagne) { // Accessible ? // choisit un point accessible près de la cible Point?pcible = getPointPresDeArmee(armee, cible.positionCarte); if (pcible != null) // sinon inaccessible // Déjà là ? { if (armee.positionCarte == pcible) { minCheminArmee = 0; armeeCible = cible; } else { armee.moveTarget = pcible; if ((armee.trajectoire != null) && (armee.trajectoire.chemin != null)) { int lenChem = armee.trajectoire.chemin.Count; if (lenChem != 0 && lenChem < minCheminArmee) { if (minCheminArmee > lenChem) { minCheminArmee = lenChem; armeeCible = cible; } } } } } } } } } }