Esempio n. 1
0
        /// <summary>
        /// Envoie une liste d'éffets spéciaux à appliquer sur une cible
        /// </summary>
        /// <param name="cible">personnage touché</param>
        /// <param name="allié">Personnage du joueur local?</param>
        /// <param name="nomÉtat">Nom des états à appliquer</param>
        /// <param name="estActif">États des états à appliquer</param>
        public void SendÉtatsSpéciaux(Personnage cible, bool allié, List <string> nomÉtat, List <bool> estActif)
        {
            var outMessage = _client.CreateMessage();

            outMessage.Write((byte)PacketType.ÉtatSpécial);
            outMessage.Write(allié ? Username : JoueurEnnemi.Username);
            outMessage.Write(ObtenirType(cible));
            outMessage.Write(nomÉtat.Count);
            for (int i = 0; i < nomÉtat.Count; ++i)
            {
                outMessage.Write(nomÉtat[i]);
                outMessage.Write(estActif[i]);
            }
            _client.SendMessage(outMessage, NetDeliveryMethod.ReliableOrdered);
        }
Esempio n. 2
0
        public Personnage FlècheRebondissante(Personnage cible, List <Personnage> CiblesPotentielles, out int dégâts)
        {
            dégâts = (int)(DÉGÂTS_FLÈCHE_REBONDISSANTE * Attaquer());
            float min = RAYON_FLÈCHE_REBONDISSANTE;

            foreach (Personnage p in CiblesPotentielles)
            {
                float distance = Vector3.Distance(p.Position, cible.Position);
                if (distance < min)
                {
                    min = distance;
                }
            }
            return(CiblesPotentielles.FirstOrDefault(p => Vector3.Distance(p.Position, cible.Position) == min));
        }
Esempio n. 3
0
 public IdentificateurPersonnage(Game jeu, Personnage personnage)
     : base(jeu)
 {
     PersonnageÀIdentifier = personnage;
     PtsVieMax             = PersonnageÀIdentifier.PtsDeVie;
     PtsViePersonnage      = PersonnageÀIdentifier.PtsDeVie;
     DéterminerNomImage();
     DéterminerPosition();
     ZoneAffichage   = new Rectangle(0, 0, Game.Window.ClientBounds.Width, Game.Window.ClientBounds.Height / 15);
     AfficheurPtsVie = new TexteCentré(Game, ":" + PtsViePersonnage.ToString() + "/" + PtsVieMax.ToString(), "Arial20",
                                       new Rectangle((int)Position.X + 2 * Game.Window.ClientBounds.Width / (3 * NB_CASES), (int)Position.Y, Game.Window.ClientBounds.Width / NB_CASES, Game.Window.ClientBounds.Height / 15),
                                       Color.Red, 0);
     AfficheurPtsVie.DrawOrder = (int)OrdreDraw.AVANT_PLAN;
     Game.Components.Add(AfficheurPtsVie);
 }
Esempio n. 4
0
        /// <summary>
        /// Méthode qui permet de déterminer quel personnage à été sélectionné pour être attaqué
        /// </summary>
        /// <param name="PersonnagesSélectionnables">La liste des personnages qui peuvent être attaqués</param>
        /// <returns>Le personnage à attaquer</returns>
        public Personnage DéterminerSélectionPersonnageÀAttaquer(List <Personnage> PersonnagesSélectionnables)
        {
            Personnage personnageÀAttaquer = null;

            if (EstNouveauClicDroit())
            {
                Ray   ray = CalculateCursorRay();
                float DistanceLaPlusPrès = float.MaxValue;
                foreach (Personnage perso in PersonnagesSélectionnables)
                {
                    DistanceRayon = perso.SphèreDeCollision.Intersects(ray);
                    if (DistanceRayon != null && DistanceRayon < DistanceLaPlusPrès)
                    {
                        DistanceLaPlusPrès  = (float)DistanceRayon;
                        personnageÀAttaquer = perso;
                    }
                }
            }

            return(personnageÀAttaquer);
        }
Esempio n. 5
0
        /// <summary>
        /// Lit les états spéciaux à appliquer sur un personnage à partir d'un message du serveur
        /// </summary>
        /// <param name="inc">Message du serveur</param>
        private void ReadÉtatsSpéciaux(NetIncomingMessage inc)
        {
            string     name       = inc.ReadString();
            int        index      = inc.ReadInt32();
            Personnage personnage = Players.Find(p => p.Username == name).Personnages[index];
            int        compteur   = inc.ReadInt32();

            for (int i = 0; i < compteur; ++i)
            {
                string nomÉtat    = inc.ReadString();
                bool   valeurÉtat = inc.ReadBoolean();
                switch (nomÉtat)
                {
                case ÉtatSpécial.EN_FEU:
                    personnage.SetEnFeu(valeurÉtat);
                    (Jeu.Components.First(c => c is IdentificateurEffet && (c as IdentificateurEffet).PersonnageÀIdentifier == personnage && (c as IdentificateurEffet).NomImage == ÉtatSpécial.EN_FEU) as DrawableGameComponent).Visible = valeurÉtat;
                    break;

                case ÉtatSpécial.BOUCLIER_DIVIN:
                    personnage.SetBouclierDivin(valeurÉtat);
                    (Jeu.Components.First(c => c is IdentificateurEffet && (c as IdentificateurEffet).PersonnageÀIdentifier == personnage && (c as IdentificateurEffet).NomImage == ÉtatSpécial.BOUCLIER_DIVIN) as DrawableGameComponent).Visible = valeurÉtat;
                    break;

                case ÉtatSpécial.FREEZE:
                    personnage.SetFreeze(valeurÉtat);
                    (Jeu.Components.First(c => c is IdentificateurEffet && (c as IdentificateurEffet).PersonnageÀIdentifier == personnage && (c as IdentificateurEffet).NomImage == ÉtatSpécial.FREEZE) as DrawableGameComponent).Visible = valeurÉtat;
                    break;

                case ÉtatSpécial.FOLIE:
                    (personnage as Guerrier).SetFolie(valeurÉtat);
                    (Jeu.Components.First(c => c is IdentificateurEffet && (c as IdentificateurEffet).PersonnageÀIdentifier == personnage && (c as IdentificateurEffet).NomImage == ÉtatSpécial.FOLIE) as DrawableGameComponent).Visible = valeurÉtat;
                    break;

                case ÉtatSpécial.SATAN:
                    (personnage as Guérisseur).SetSatan(valeurÉtat);
                    (Jeu.Components.First(c => c is IdentificateurEffet && (c as IdentificateurEffet).PersonnageÀIdentifier == personnage && (c as IdentificateurEffet).NomImage == ÉtatSpécial.SATAN) as DrawableGameComponent).Visible = valeurÉtat;
                    break;
                }
            }
        }
Esempio n. 6
0
 public int FreezeDontMove(Personnage cible)
 {
     return((int)(DÉGATS_FREEZE_DONT_MOVE * Attaquer()));
 }
Esempio n. 7
0
 /// <summary>
 /// Obtenir le type d'un personnage sous forme de string
 /// </summary>
 /// <param name="p"></param>
 /// <returns></returns>
 public string ObtenirType(Personnage p)
 {
     return(p.GetType().ToString());
 }
Esempio n. 8
0
        /// <summary>
        /// Vérifie et gère les attaques et les sorts des personnages selon leur classe.
        /// </summary>
        void VérifierAttaqueEtSorts()
        {
            if (PeutAttaquer)
            {
                Vector3    positionVérifiée;
                Personnage singleTargetÀAttaquer = null;
                int        dégats = 0;

                if (BoutonsActions.ÉtatSort1)
                {
                    bool ciblealliée = false;
                    switch (PersonnageActif.GetType().ToString())
                    {
                    case TypePersonnage.ARCHER:
                        positionVérifiée = GestionnaireInput.VérifierDéplacementMAX(GestionnaireInput.GetPositionSourisPlan(), PersonnageActif.Position, Archer.PORTÉE_PLUIE_DE_FLÈCHES - Archer.RAYON_PLUIE_DE_FLÈCHES);
                        ZoneDEffet.ChangerÉtendueEtPosition(new Vector2(Archer.RAYON_PLUIE_DE_FLÈCHES * 2), positionVérifiée);
                        Portée.ChangerÉtendueEtPosition(new Vector2(Archer.PORTÉE_PLUIE_DE_FLÈCHES * 2), PersonnageActif.Position);
                        ZoneDEffet.Visible = true;
                        Portée.Visible     = true;
                        if (GestionnaireInput.EstNouveauClicDroit())
                        {
                            Cibles             = (PersonnageActif as Archer).PluieDeFlèches(positionVérifiée, JoueurEnnemi.Personnages, out dégats);
                            PeutAttaquer       = false;
                            ZoneDEffet.Visible = false;
                            Portée.Visible     = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            goto default;
                        }
                        break;

                    case TypePersonnage.GUÉRISSEUR:
                        positionVérifiée = GestionnaireInput.VérifierDéplacementMAX(GestionnaireInput.GetPositionSourisPlan(), PersonnageActif.Position, Guérisseur.PORTÉE_SOIN_DE_ZONE - Guérisseur.RAYON_SOIN_DE_ZONE);
                        ZoneDEffet.ChangerÉtendueEtPosition(new Vector2(Guérisseur.RAYON_SOIN_DE_ZONE * 2), positionVérifiée);
                        Portée.ChangerÉtendueEtPosition(new Vector2(Guérisseur.PORTÉE_SOIN_DE_ZONE * 2), PersonnageActif.Position);
                        ZoneDEffet.Visible = true;
                        Portée.Visible     = true;
                        if (GestionnaireInput.EstNouveauClicDroit())
                        {
                            if ((PersonnageActif as Guérisseur)._SatanMode)
                            {
                                Cibles      = (PersonnageActif as Guérisseur).SoinDeZone(positionVérifiée, JoueurEnnemi.Personnages, out dégats);
                                ciblealliée = false;
                            }
                            else
                            {
                                Cibles      = (PersonnageActif as Guérisseur).SoinDeZone(positionVérifiée, JoueurLocal.Personnages, out dégats);
                                ciblealliée = true;
                            }
                            PeutAttaquer       = false;
                            ZoneDEffet.Visible = false;
                            Portée.Visible     = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            goto default;
                        }
                        break;

                    case TypePersonnage.GUERRIER:
                        Portée.ChangerÉtendueEtPosition(new Vector2(Guerrier.PORTÉE_TORNADE_FURIEUSE * 2), PersonnageActif.Position);
                        Portée.Visible = true;
                        if (GestionnaireInput.EstNouveauClicDroit())
                        {
                            Cibles         = (PersonnageActif as Guerrier).TornadeFurieuse(PersonnageActif.Position, JoueurEnnemi.Personnages, out dégats);
                            PeutAttaquer   = false;
                            Portée.Visible = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            goto default;
                        }
                        break;

                    case TypePersonnage.MAGE:
                        positionVérifiée = GestionnaireInput.VérifierDéplacementMAX(GestionnaireInput.GetPositionSourisPlan(), PersonnageActif.Position, Mage.PORTÉE_BRASIER - Mage.RAYON_BRASIER);
                        ZoneDEffet.ChangerÉtendueEtPosition(new Vector2(Mage.RAYON_BRASIER * 2), positionVérifiée);
                        Portée.ChangerÉtendueEtPosition(new Vector2(Mage.PORTÉE_BRASIER * 2), PersonnageActif.Position);
                        ZoneDEffet.Visible = true;
                        Portée.Visible     = true;
                        if (GestionnaireInput.EstNouveauClicDroit())
                        {
                            Cibles             = (PersonnageActif as Mage).Brasier(positionVérifiée, JoueurEnnemi.Personnages, out dégats);
                            PeutAttaquer       = false;
                            ZoneDEffet.Visible = false;
                            Portée.Visible     = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            foreach (Personnage cible in Cibles)
                            {
                                NetworkManager.SendÉtatsSpéciaux(cible, ciblealliée, new List <string>()
                                {
                                    ÉtatSpécial.EN_FEU
                                }, new List <bool> {
                                    true
                                });
                            }
                            goto default;
                        }
                        break;

                    case TypePersonnage.PALADIN:
                        Portée.ChangerÉtendueEtPosition(new Vector2(Paladin.PORTÉE_CLARITÉ * 2), PersonnageActif.Position);
                        Portée.Visible        = true;
                        singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurLocal.Personnages);
                        if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= Paladin.PORTÉE_CLARITÉ)
                        {
                            ciblealliée    = true;
                            PeutAttaquer   = false;
                            Portée.Visible = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            List <string> nomsÉtats = new List <string>()
                            {
                                ÉtatSpécial.EN_FEU, ÉtatSpécial.FREEZE
                            };
                            List <bool> valeursÉtats = new List <bool>()
                            {
                                false, false
                            };
                            if (singleTargetÀAttaquer is Guerrier)
                            {
                                nomsÉtats.Add(ÉtatSpécial.FOLIE);
                                valeursÉtats.Add(false);
                            }
                            NetworkManager.SendÉtatsSpéciaux(singleTargetÀAttaquer, ciblealliée, nomsÉtats, valeursÉtats);
                        }
                        break;

                    case TypePersonnage.VOLEUR:
                        positionVérifiée = GestionnaireInput.VérifierDéplacementMAX(GestionnaireInput.GetPositionSourisPlan(), PersonnageActif.Position, Voleur.PORTÉE_INVISIBILITÉ);
                        ZoneDEffet.ChangerÉtendueEtPosition(new Vector2(2), positionVérifiée);
                        Portée.ChangerÉtendueEtPosition(new Vector2(Voleur.PORTÉE_INVISIBILITÉ * 2), PersonnageActif.Position);
                        ZoneDEffet.Visible = true;
                        Portée.Visible     = true;
                        if (GestionnaireInput.EstNouveauClicDroit())
                        {
                            NetworkManager.SendNewPosition(positionVérifiée, JoueurLocal.Personnages.FindIndex(p => p is Voleur));
                            ZoneDéplacement.ChangerÉtendueEtPosition(new Vector2(DéplacementRestant * 2), positionVérifiée);
                            NetworkManager.SendInvisibilité(true);
                            PeutAttaquer       = false;
                            ZoneDEffet.Visible = false;
                            Portée.Visible     = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                        }
                        break;

                    default:
                        NetworkManager.SendDégât(Cibles.FindAll(cible => !cible.EstMort), dégats, ciblealliée);
                        break;
                    }
                }
                if (BoutonsActions.ÉtatSort2)
                {
                    bool ciblealliée = false;
                    switch (PersonnageActif.GetType().ToString())
                    {
                    case TypePersonnage.ARCHER:
                        positionVérifiée = GestionnaireInput.VérifierDéplacementMAX(GestionnaireInput.GetPositionSourisPlan(), PersonnageActif.Position, Archer.PORTÉE_FLÈCHE_REBONDISSANTE);
                        Portée.ChangerÉtendueEtPosition(new Vector2(Archer.PORTÉE_FLÈCHE_REBONDISSANTE * 2), PersonnageActif.Position);
                        ZoneDEffet.ChangerÉtendueEtPosition(new Vector2(Archer.RAYON_FLÈCHE_REBONDISSANTE * 2), positionVérifiée);
                        Portée.Visible        = true;
                        ZoneDEffet.Visible    = true;
                        singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurEnnemi.Personnages);
                        if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= Archer.PORTÉE_FLÈCHE_REBONDISSANTE)
                        {
                            Cibles.Add(singleTargetÀAttaquer);
                            Personnage deuxièmeCible = (PersonnageActif as Archer).FlècheRebondissante(singleTargetÀAttaquer, JoueurEnnemi.Personnages.FindAll(p => p != singleTargetÀAttaquer && !p.EstMort), out dégats);
                            if (deuxièmeCible != null)
                            {
                                Cibles.Add(deuxièmeCible);
                            }
                            PeutAttaquer       = false;
                            Portée.Visible     = false;
                            ZoneDEffet.Visible = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            goto default;
                        }
                        break;

                    case TypePersonnage.GUÉRISSEUR:
                        Portée.ChangerÉtendueEtPosition(new Vector2(Guérisseur.PORTÉE_RESURRECT * 2), PersonnageActif.Position);
                        Portée.Visible = true;
                        if ((PersonnageActif as Guérisseur)._SatanMode)
                        {
                            singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurEnnemi.Personnages);
                            if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= Guérisseur.PORTÉE_RESURRECT)
                            {
                                int vieVolée;
                                dégats      = (PersonnageActif as Guérisseur).VolDeVie(out vieVolée);
                                ciblealliée = true;
                                Cibles.Add(PersonnageActif);
                                NetworkManager.SendDégât(Cibles, vieVolée, ciblealliée);
                                Cibles.Clear();

                                Cibles.Add(singleTargetÀAttaquer);
                                ciblealliée    = false;
                                PeutAttaquer   = false;
                                Portée.Visible = false;
                                BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                                goto default;
                            }
                        }
                        else
                        {
                            singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurLocal.Personnages);
                            if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= Guérisseur.PORTÉE_RESURRECT && singleTargetÀAttaquer.EstMort)
                            {
                                dégats = (PersonnageActif as Guérisseur).Résurrection(singleTargetÀAttaquer);
                                Cibles.Add(singleTargetÀAttaquer);
                                ciblealliée    = true;
                                PeutAttaquer   = false;
                                Portée.Visible = false;
                                BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                                NetworkManager.SendÉtatsSpéciaux(PersonnageActif, ciblealliée, new List <string>()
                                {
                                    ÉtatSpécial.SATAN
                                }, new List <bool>()
                                {
                                    true
                                });
                                NetworkManager.SendDégât(Cibles, dégats, ciblealliée);
                            }
                        }
                        break;

                    case TypePersonnage.GUERRIER:
                        if (GestionnaireInput.EstNouveauClicDroit())
                        {
                            ciblealliée  = true;
                            PeutAttaquer = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            NetworkManager.SendÉtatsSpéciaux(PersonnageActif, ciblealliée, new List <string>()
                            {
                                ÉtatSpécial.FOLIE
                            }, new List <bool>()
                            {
                                true
                            });
                        }
                        break;

                    case TypePersonnage.MAGE:
                        Portée.ChangerÉtendueEtPosition(new Vector2(Mage.PORTÉE_FREEZE_DONT_MOVE * 2), PersonnageActif.Position);
                        Portée.Visible        = true;
                        singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurEnnemi.Personnages);
                        if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= Mage.PORTÉE_FREEZE_DONT_MOVE)
                        {
                            dégats = (PersonnageActif as Mage).FreezeDontMove(singleTargetÀAttaquer);
                            Cibles.Add(singleTargetÀAttaquer);
                            PeutAttaquer   = false;
                            Portée.Visible = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            NetworkManager.SendÉtatsSpéciaux(singleTargetÀAttaquer, ciblealliée, new List <string>()
                            {
                                ÉtatSpécial.FREEZE
                            }, new List <bool>()
                            {
                                true
                            });
                            goto default;
                        }
                        break;

                    case TypePersonnage.PALADIN:
                        Portée.ChangerÉtendueEtPosition(new Vector2(Paladin.PORTÉE_BOUCLIER_DIVIN * 2), PersonnageActif.Position);
                        Portée.Visible        = true;
                        singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurLocal.Personnages);
                        if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= Paladin.PORTÉE_BOUCLIER_DIVIN)
                        {
                            ciblealliée    = true;
                            PeutAttaquer   = false;
                            Portée.Visible = false;
                            BoutonsActions.RéinitialiserDialogueActions(PersonnageActif);
                            NetworkManager.SendÉtatsSpéciaux(singleTargetÀAttaquer, ciblealliée, new List <string>()
                            {
                                ÉtatSpécial.BOUCLIER_DIVIN
                            }, new List <bool>()
                            {
                                true
                            });
                        }
                        break;

                    case TypePersonnage.VOLEUR:
                        Portée.ChangerÉtendueEtPosition(new Vector2(Voleur.PORTÉE_LANCER_COUTEAU * 2), PersonnageActif.Position);
                        Portée.Visible        = true;
                        singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurEnnemi.Personnages);
                        if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= Voleur.PORTÉE_LANCER_COUTEAU)
                        {
                            dégats = (PersonnageActif as Voleur).LancerCouteau();
                            Cibles.Add(singleTargetÀAttaquer);
                            ciblealliée    = false;
                            Portée.Visible = false;
                            PeutAttaquer   = false;
                            goto default;
                        }
                        break;

                    default:
                        NetworkManager.SendDégât(Cibles.FindAll(cible => !cible.EstMort), dégats, ciblealliée);
                        break;
                    }
                }
                if (BoutonsActions.ÉtatAttaquer)
                {
                    bool ciblealliée = false;
                    Portée.ChangerÉtendueEtPosition(new Vector2(PersonnageActif.GetPortéeAttaque() * 2), PersonnageActif.Position);
                    Portée.Visible = true;
                    if (PersonnageActif is Guérisseur && !(PersonnageActif as Guérisseur)._SatanMode)
                    {
                        singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurLocal.Personnages);
                        ciblealliée           = true;
                    }
                    else
                    {
                        singleTargetÀAttaquer = GestionnaireInput.DéterminerSélectionPersonnageÀAttaquer(JoueurEnnemi.Personnages);
                    }
                    if (singleTargetÀAttaquer != null && (int)(singleTargetÀAttaquer.Position - PersonnageActif.Position).Length() <= PersonnageActif.GetPortéeAttaque())
                    {
                        Cibles.Add(singleTargetÀAttaquer);
                        Portée.Visible = false;
                        PeutAttaquer   = false;
                        BoutonsActions.Attaquer();
                        dégats = PersonnageActif.Attaquer();
                        NetworkManager.SendDégât(Cibles.FindAll(cible => !cible.EstMort), dégats, ciblealliée);
                    }
                }
                if (!BoutonsActions.ÉtatAttaquer && !BoutonsActions.ÉtatSort1 && !BoutonsActions.ÉtatSort2)
                {
                    ZoneDEffet.Visible = false;
                    Portée.Visible     = false;
                }
                ActiverAttaque();
            }
        }