// ---------------------------------- // Calcul de la trajectoire // ----------------------------------- public void calculTrajectoire() { Point courant = _armee.positionCarte; Point arrivee = _armee.moveTarget.GetValueOrDefault(); _chemin = new List <Etape>(); // Seulement si la cible est accessible if (_armee.isPlaceLibre(arrivee, false)) { int[] mouvements = new int[_armee.getTaille()]; int mouvementMin = Int32.MaxValue; int mouvementMinNage = Int32.MaxValue; for (int i = 0; i < mouvements.Length; i++) { mouvements[i] = _armee.getCreature(i).mouvementCourant; if (mouvementMin > mouvements[i]) { mouvementMin = mouvements[i]; } if (_armee.getCreature(i).description.nage) { if (mouvementMinNage > mouvements[i]) { mouvementMinNage = mouvements[i]; } } } List <Point> path = CalculateBestPath(); if (path != null) { for (int idx = path.Count - 1; idx >= 0; idx--) { _chemin.Add(new Etape(path[idx], ((mouvementMin > 0) && (mouvementMinNage == Int32.MaxValue)) || ((mouvementMinNage != Int32.MaxValue) && (mouvementMinNage > 0)))); mouvementMin = Int32.MaxValue; mouvementMinNage = Int32.MaxValue; for (int i = 0; i < mouvements.Length; i++) { mouvements[i] -= _armee.getCreature(i).getMouvementCost(path[idx], _armee); if (mouvementMin > mouvements[i]) { mouvementMin = mouvements[i]; } if (_armee.getCreature(i).description.nage) { if (mouvementMinNage > mouvements[i]) { mouvementMinNage = mouvements[i]; } } } } } } }
// Boutons ------------------------------------------------------------------------------------------------------- private void boutonScinderClick() { if ((_jeu.selectedArmee != null) && (_jeu.selectedArmee.getTaille() != _group.Count) && (_group.Count > 0)) { // Crée une autre armée Armee nouvelle = new Armee(_jeu); // Déplace les créatures sélectionnées dedans foreach (Creature crea in _group) { _jeu.selectedArmee.removeCreature(crea); nouvelle.addCreature(crea); } // Déselectionne les armées sorites for (int i = 0; i < nouvelle.getTaille(); i++) { Creature crea = nouvelle.getCreature(i); _group.Remove(crea); } // Place la nouvelle armée à un emplacement libre à coté si il y a de la place Point?posNouvelle = nouvelle.getPositionLibre(_jeu.selectedArmee.positionCarte, true, true); // Si pas de place, annule tout ! if (posNouvelle == null) { _jeu.selectedArmee.ajouteTroupes(nouvelle); _jeu.messageInfo = "Pas de place pour placer cette armée"; } else { // Regarde si on a assez de mouvement pour aller jusqu'à la nouvelle position bool ok = true; for (int i = 0; i < nouvelle.getTaille(); i++) { Creature crea = nouvelle.getCreature(i); int mvtCost = crea.getMouvementCost(posNouvelle.Value, nouvelle); if (crea.mouvementCourant < mvtCost) { ok = false; break; } } if (!ok) { // annule tout ! _jeu.selectedArmee.ajouteTroupes(nouvelle); _jeu.messageInfo = "Plus assez de mouvement pour se séparer"; } else { // enlève le mouvement cette fois... Sinon on peut tricher avec des déplacements à coût 0 ! for (int i = 0; i < nouvelle.getTaille(); i++) { Creature crea = nouvelle.getCreature(i); int mvtCost = crea.getMouvementCost(posNouvelle.Value, nouvelle); crea.mouvementCourant -= mvtCost; } nouvelle.positionCarte = posNouvelle.Value; _jeu.addArmee(nouvelle); // change sans doute le mouvement et donc la trajectoire de l'armée sélectionnée _jeu.selectedArmee.reinitTrajectoire(); } } } }