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