Exemplo n.º 1
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;
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }