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