/// <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); }
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)); }
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); }
/// <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); }
/// <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; } } }
public int FreezeDontMove(Personnage cible) { return((int)(DÉGATS_FREEZE_DONT_MOVE * Attaquer())); }
/// <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()); }
/// <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(); } }