Пример #1
0
        /// <summary>
        /// Calcule le bonus de défense
        /// </summary>
        /// <param name="crea">créature en combat</param>
        /// <param name="arme">groupe dont elle fait partie</param>
        /// <returns>bonus de force en défense</returns>
        private int calculBonusDefense(Creature crea, Armee arme)
        {
            int bonus = 0;

            // +1 par héros dans l'armée
            for (int i = 0; i < arme.getTaille(); i++)
            {
                Creature copain = arme.getCreature(i);
                if (copain.description.heros)
                {
                    bonus++;
                }
            }
            if ((crea.description.bonusDefense == CreatureDescription.BonusUrbain.EXTERIEUR) && (!_dansVille))
            {
                bonus += 2;
            }
            else if ((crea.description.bonusDefense == CreatureDescription.BonusUrbain.VILLE) && _dansVille)
            {
                // Augmente le bonus de défense de 2
                bonus += 2;
            }
            // Si dans ville, bonus de la ville
            if (_dansVille)
            {
                bonus += _defenseVille;
            }
            // la taille compte
            bonus += (2 * arme.getTaille()) / 5;

            // Enfin la force de la créature...
            bonus += crea.description.force;

            return(bonus);
        }
Пример #2
0
 // Ajoute une armée nouvellement créée
 public void addArmee(Armee armee)
 {
     // fusion des armées si une armée est déjà à cet emplacement
     foreach (Armee autre in _armees)
     {
         if (autre.positionCarte == armee.positionCarte)
         {
             // Fusionne les deux si c'est possible
             if (autre.getTaille() + armee.getTaille() > Armee.MAX_TAILLE)
             {
                 Point pt = armee.getPositionLibre(armee.positionCarte, false, false).Value;
                 armee.positionCarte = pt;
                 // récursif
                 addArmee(armee);
                 return;
             }
             else
             {
                 autre.ajouteTroupes(armee);
             }
             return;
         }
     }
     // Toute seule
     _armees.Add(armee);
 }
Пример #3
0
 // Fusionne une armée avec this
 public void ajouteTroupes(Armee autre)
 {
     if ((autre.getTaille() + getTaille()) > MAX_TAILLE)
     {
         throw new SdGException("Bug : tentative de fusion d'armées volumineuses !");
     }
     foreach (Creature crea in autre._troupe)
     {
         this.addCreature(crea);
     }
 }
Пример #4
0
        /// <summary>
        /// Transition vers le round suivant : supprime l'armée perdante
        /// </summary>
        /// <param name="resultatRound">résultat du round précédent : true si l'attaquant gagne, false sinon</param>
        /// <returns>true si le combat est fini, false si des rounds supplémentaires sont nécessaires</returns>
        public bool roundSuivant(bool resultatRound)
        {
            Armee perdante = resultatRound ? _defense : _attaque;
            bool  retVal;

            if (perdante.getTaille() == 1)
            {
                // Une armée a été décimée
                retVal = true;
            }
            else
            {
                perdante.removeCreature(perdante.getCreature(0));
                retVal = false;
            }
            _bonusAttaque = calculBonusAttaque(_attaque.getCreature(0), _attaque);
            _bonusDefense = calculBonusDefense(_defense.getCreature(0), _defense);
            return(retVal);
        }
Пример #5
0
        /// <summary>
        /// Créer une pop up d'info sur click droit
        /// </summary>
        /// <param name="mouseX"></param>
        /// <param name="mouseY"></param>
        public void createInfoPopup(int mouseX, int mouseY)
        {
            // Détermine où on a cliqué : terrain, ville, armée...

            float            extraHeight = 0;
            int              extraWidth  = 0;
            Armee            armeeClick  = null;
            VilleDescription villeClick  = null;

            TerrainDescription.TerrainCell cellClick = getClicked(mouseX, mouseY, ref armeeClick, ref villeClick);
            string titre = "(bug)";

            // Priorité aux armées
            if (armeeClick != null)
            {
                titre       = armeeClick.proue.vraiNom + " (" + _jeu.factions.getFaction(armeeClick.faction).nom + ")";
                extraHeight = Creatures.CREATURE_SIZE + PopWindow.MARGE_TITRE;
                extraWidth  = Creatures.CREATURE_SIZE * Armee.MAX_TAILLE + PopWindow.MARGE_TITRE * 2;
            }
            // puis les villes
            else if (villeClick != null)
            {
                titre       = villeClick.nom + " (" + _jeu.factions.getFaction(villeClick.faction).nom + ")";
                extraHeight = -2.5f;
                extraWidth  = 300;
            }
            // Enfin le terrain
            else
            {
                // Ruines
                if (cellClick.ruine)
                {
                    int carteX = (mouseX + _jeu.terrain.offsetCarte.X) / _jeu.blockSize;
                    int carteY = (mouseY + _jeu.terrain.offsetCarte.Y) / _jeu.blockSize;
                    Ruines.RuineDescription desc = _jeu.ruines.ruines[new Point(carteX, carteY)];
                    titre = "Ruine de " + desc.nom + " (" + (desc.visite ? "déjà visité" : "non exploré") + ")";
                }
                else if (cellClick.route)
                {
                    titre = "Route - le chemin le plus rapide";
                }
                else
                {
                    switch (cellClick.type)
                    {
                    case TerrainDescription.TypeTerrain.COLLINE:
                        titre = "Collines - difficile de les traverser";
                        break;

                    case TerrainDescription.TypeTerrain.EAU:
                        titre = "Eau - il vous faut ou voler, nager ou prendre un bateau";
                        break;

                    case TerrainDescription.TypeTerrain.FORET:
                        titre = "Forêt - difficile de la traverser";
                        break;

                    case TerrainDescription.TypeTerrain.HERBE:
                        titre = "Plaine - le terrain le plus rapide après la route";
                        break;

                    case TerrainDescription.TypeTerrain.MARECAGE:
                        titre = "Marécages - difficile de les traverser";
                        break;

                    case TerrainDescription.TypeTerrain.MONTAGNE:
                        titre = "Montagnes - A moins de les survoler, on ne peut les traverser";
                        break;
                    }
                }
            }
            // Taille du texte
            Vector2 fontSize = _jeu.font.MeasureString(titre);

            Point taille = PopWindow.getPopWindowSize(_jeu, titre);

            // Ajoute un bord
            if (taille.X < extraWidth)
            {
                taille.X = extraWidth;
            }
            if (extraHeight < 0)
            {
                taille.Y = (int)((float)taille.Y * (-extraHeight));
            }
            else
            {
                taille.Y = (int)((float)taille.Y + extraHeight);
            }
            PopWindow info = new PopWindow(_jeu, Overlay.Position.SOURIS, taille.X, taille.Y, mouseX, mouseY, titre);

            // Custom Draw pour afficher l'armée s'il le faut
            if (armeeClick != null)
            {
                info.drawCallBack = delegate(SpriteBatch spriteBatch, GraphicsDevice GraphicsDevice, GameTime gameTime) {
                    int x = info.xoverlay + _jeu.terrain.offsetCarte.X + PopWindow.MARGE_TITRE / 2;
                    int y = info.yoverlay + info.height - Creatures.CREATURE_SIZE - PopWindow.MARGE_TITRE / 2 + _jeu.terrain.offsetCarte.Y;
                    for (int i = 0; i < armeeClick.getTaille(); i++)
                    {
                        Creature crea = armeeClick.getCreature(i);
                        _jeu.creatures.draw(spriteBatch, GraphicsDevice, gameTime, x, y, 0f, crea.typeCreature);
                        x += Creatures.CREATURE_SIZE;
                    }
                };
            }
            // Custom draw pour les villes
            else if (villeClick != null)
            {
                info.drawCallBack = delegate(SpriteBatch spriteBatch, GraphicsDevice GraphicsDevice, GameTime gameTime) {
                    float x = info.xoverlay + PopWindow.MARGE_TITRE / 2;
                    float y = info.yoverlay + PopWindow.MARGE_TITRE + fontSize.Y;
                    spriteBatch.DrawString(_jeu.font, "Défense :" + villeClick.niveauDefense, new Vector2(x, y), Color.BlanchedAlmond);
                    if (villeClick.capitaleFaction != 0)
                    {
                        y += fontSize.Y;
                        spriteBatch.DrawString(_jeu.font, "Capitale de : " + _jeu.factions.getFaction(villeClick.capitaleFaction).nom, new Vector2(x, y),
                                               _jeu.factions.getFaction(villeClick.capitaleFaction).couleur);
                    }
                };
            }

            _jeu.addOverlay(info);
            _jeu.curseur.forme = Cursor.FormeCurseur.INTERROGATION;
        }