Пример #1
0
        /// <summary>
        /// Coupe un soutien à l'aide de l'ordre d'attaque donné.
        /// </summary>
        /// <param name="ordre">Ordre à appliquer.</param>
        private void CoupeSoutien(Attaquer ordre)
        {
            OrdreRegional ordreRegional      = this.Dictionnaire[ordre.Region];
            OrdreRegional ordreRegionalCoupe = this.Dictionnaire[ordre.RegionAttaquee];

            if (ordreRegionalCoupe.TypeOrdre != EOrdre.Attaque && ordreRegionalCoupe.TypeOrdre != EOrdre.Tenir)
            {
                OrdreRegional ordreRegionalSoutenu = this.Dictionnaire[ordreRegionalCoupe.RegionCiblee];
                if (ordreRegionalCoupe.TypeOrdre == EOrdre.SoutienDefensif)
                {
                    ordreRegionalCoupe.TypeOrdre = EOrdre.SoutienDefensifCoupe;
                    this.Dictionnaire[ordreRegionalCoupe.RegionCiblee].ForceDefensive--;
                }
                else if (ordreRegionalCoupe.TypeOrdre == EOrdre.SoutienOffensif &&
                         ordreRegionalSoutenu.RegionCiblee != ordreRegional.Region)
                {
                    ordreRegionalCoupe.TypeOrdre = EOrdre.SoutienOffensifCoupe;
                    this.Dictionnaire[ordreRegionalCoupe.RegionCiblee].ForceOffensive--;
                }
                else
                {
                    // Rien à faire.
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Enregistre les ordres passés pour un nouveau tour.
 /// </summary>
 /// <param name="ordres">Liste des ordres donnés par les belligérants.</param>
 /// <param name="dictionnaireOccupation">Dictionnaire d'occupation des régions.</param>
 public void EnregistreOrdres(List <OrdreAbstrait> ordres, Dictionary <String, OccupationRegion> dictionnaireOccupation)
 {
     // Normalement, tout ce qui arrive à ce niveau là est d'ores et déjà valide.
     this.Reinitialise(dictionnaireOccupation);
     foreach (var ordre in ordres)
     {
         OrdreRegional ordreRegional = this.Dictionnaire[ordre.Region];
         if (ordre.GetType() == typeof(Attaquer))
         {
             ordreRegional.EnregistreAttaque(ordre as Attaquer);
         }
         else if (ordre.GetType() == typeof(Convoyer))
         {
             ordreRegional.EnregistreConvoi(ordre as Convoyer);
         }
         else if (ordre.GetType() == typeof(SoutenirDefensif))
         {
             ordreRegional.EnregistreSoutienDefensif(ordre as SoutenirDefensif);
         }
         else if (ordre.GetType() == typeof(SoutenirOffensif))
         {
             ordreRegional.EnregistreSoutienOffensif(ordre as SoutenirOffensif);
         }
         else
         {
             ordreRegional.EnregistreTenir(ordre as Tenir);
         }
     }
 }
Пример #3
0
        /// <summary>
        /// Coupe le convoi correspondant à l'ordre donné.
        /// </summary>
        /// <param name="ordre">Ordre à appliquer.</param>
        private void CoupeConvoi(Convoyer ordre)
        {
            OrdreRegional ordreRegional = this.Dictionnaire[ordre.Region];

            if (ordreRegional.ForceDefensive < 0)
            {
                ordreRegional.TypeOrdre = EOrdre.ConvoiCoupe;
            }
        }
Пример #4
0
        /// <summary>
        /// Applique un ordre de soutien offensif.
        /// </summary>
        /// <param name="ordre">Ordre à appliquer.</param>
        private void AppliqueSoutienOffensif(SoutenirOffensif ordre)
        {
            OrdreRegional ordreSoutenu = this.Dictionnaire[ordre.RegionSoutenue];

            if (ordreSoutenu.TypeOrdre == EOrdre.Attaque && ordreSoutenu.RegionCiblee == ordre.RegionAttaquee)
            {
                ordreSoutenu.ForceOffensive++;
            }
        }
Пример #5
0
        /// <summary>
        /// Applique un ordre de soutien défensif.
        /// </summary>
        /// <param name="ordre">Ordre à appliquer.</param>
        private void AppliqueSoutienDefensif(SoutenirDefensif ordre)
        {
            OrdreRegional ordreSoutenu = this.Dictionnaire[ordre.RegionSoutenue];

            if (ordreSoutenu.TypeOrdre != EOrdre.Attaque)
            {
                ordreSoutenu.ForceDefensive++;
            }
        }
Пример #6
0
        /// <summary>
        /// Rétablit le soutien coupé par un convoi lui-même coupé.
        /// </summary>
        /// <param name="ordre">Ordre à appliquer.</param>
        private void RetablitSoutien(Convoyer ordre)
        {
            OrdreRegional ordreRegional = this.Dictionnaire[ordre.Region];

            if (ordreRegional.TypeOrdre == EOrdre.ConvoiCoupe)
            {
                OrdreRegional ordreSoutenu = this.Dictionnaire[ordre.RegionSoutenue];

                this.Dictionnaire[ordre.RegionAttaquee].ForceDefensive += ordreSoutenu.ForceOffensive;
                ordreSoutenu.ForceOffensive = 0;
            }
        }
Пример #7
0
        /// <summary>
        /// Marque les régions dans lesquelles les unités seront amenées à faire retraite.
        /// </summary>
        /// <param name="ordre">Ordre à appliquer.</param>
        private void MarqueRetraite(Attaquer ordre)
        {
            OrdreRegional ordreRegional = this.Dictionnaire[ordre.Region];

            if (ordreRegional.TypeOrdre == EOrdre.AttaqueReussie)
            {
                OrdreRegional ordreRegionalCible = this.Dictionnaire[ordre.RegionAttaquee];
                if (ordreRegionalCible.TypeOrdre != EOrdre.AttaqueReussie)
                {
                    ordreRegionalCible.Attaquant = ordreRegional.Region;
                    ordreRegionalCible.Retraite  = true;
                }
            }
        }
Пример #8
0
        /// <summary>
        /// Réévalue les ordres d'attaque du fait de la réussite ou de l'échec de l'ordre en argument.
        /// </summary>
        /// <param name="ordre">Ordre impliquant une réévaluation d'autres ordres.</param>
        private void ReevalueAttaques(OrdreRegional ordre)
        {
            List <OrdreRegional> ordresImpactes = this.Dictionnaire.Values.ToList().FindAll(item => item.RegionCiblee == ordre.Region &&
                                                                                            (item.TypeOrdre == EOrdre.Attaque || item.TypeOrdre == EOrdre.AttaqueEchouee || item.TypeOrdre == EOrdre.AttaqueReussie));

            Int32 forceMax = 0;

            if (ordre.TypeOrdre == EOrdre.AttaqueReussie)
            {
                /// Cette ligne est inutile, mais elle permet de mieux se repérer dans le code.
                forceMax = 0;
            }
            else if (ordre.TypeOrdre == EOrdre.AttaqueEchouee)
            {
                forceMax = ordre.ForceDefensive;
            }

            foreach (OrdreRegional ordreImpacte in ordresImpactes)
            {
                if (ordreImpacte.ForceOffensive > forceMax)
                {
                    forceMax = ordreImpacte.ForceOffensive;
                    ordreImpacte.TypeOrdre = EOrdre.AttaqueReussie;
                    this.ReevalueAttaques(ordreImpacte);
                }
                else if (ordreImpacte.ForceOffensive == forceMax)
                {
                    forceMax++;
                }
            }

            foreach (OrdreRegional ordreImpacte in ordresImpactes)
            {
                if (ordreImpacte.ForceOffensive < forceMax)
                {
                    ordreImpacte.TypeOrdre = EOrdre.AttaqueEchouee;
                }
            }
        }
Пример #9
0
        /// <summary>
        /// Applique un ordre d'attaque.
        /// </summary>
        /// <param name="ordre">Ordre à appliquer.</param>
        private void AppliqueAttaque(Attaquer ordre)
        {
            OrdreRegional ordreRegional      = this.Dictionnaire[ordre.Region];
            OrdreRegional ordreRegionalCible = this.Dictionnaire[ordre.RegionAttaquee];

            if (((ordreRegional.ForceOffensive > ordreRegionalCible.ForceDefensive) &&
                 (ordreRegional.Possesseur != ordreRegionalCible.Possesseur)) ||
                (ordreRegionalCible.TypeOrdre == EOrdre.AttaqueReussie))
            {
                ordreRegional.TypeOrdre = EOrdre.AttaqueReussie;
                foreach (OrdreRegional ordreRegionalConcurrent in this.Dictionnaire.Values)
                {
                    if ((ordreRegionalConcurrent.RegionCiblee == ordreRegional.RegionCiblee) &&
                        (ordreRegionalConcurrent.TypeOrdre == EOrdre.AttaqueReussie) &&
                        (ordreRegionalConcurrent.Region != ordreRegional.Region))
                    {
                        if (ordreRegionalConcurrent.ForceOffensive < ordreRegional.ForceOffensive)
                        {
                            ordreRegionalConcurrent.TypeOrdre = EOrdre.AttaqueEchouee;
                            this.ReevalueAttaques(ordreRegionalConcurrent);
                        }
                        else if (ordreRegionalConcurrent.ForceOffensive == ordreRegional.ForceOffensive)
                        {
                            ordreRegional.TypeOrdre           = EOrdre.AttaqueEchouee;
                            ordreRegionalConcurrent.TypeOrdre = EOrdre.AttaqueEchouee;
                            this.ReevalueAttaques(ordreRegionalConcurrent);
                        }
                    }
                }

                this.ReevalueAttaques(ordreRegional);
            }
            else
            {
                ordreRegional.TypeOrdre = EOrdre.AttaqueEchouee;
            }
        }