protected virtual void IA(List<Unite> unitsOnMap) { // Cast un heal si < à la moitié de vie if (Vie <= VieMax / 2 && IsCastable(0)) Cast( spells[0], Vector2.Zero, null); if (uniteAttacked != null) { if (IsRanged && NiveauDeBrain >= 3) { NiveauDeBrain = 0; // represente tous les noeuds possibles pour se rapprocher de la cible List<Noeud> Chemin = PathFinding.TrouverChemin(PositionTile, uniteAttacked.PositionTile, Map.Taille, new List<Unite> { }, Map.unitesStatic, false); Projectile = new Projectile(this, uniteAttacked); if (Chemin != null) { foreach (Noeud n in Chemin) // Pour chaque noeud possible { if (Projectile.CanReach(n.Position)) // Si on peut atteindre sa cible depuis ce noeud { ObjectifListe = new List<Noeud> { }; foreach (Noeud n2 in Chemin) // Alors on se déplace sur ce noeud { if (n2 != n) ObjectifListe.Add(n2); else { ObjectifListe.Add(n2); break; } } break; } } } OlduniteAttacked = uniteAttacked; uniteAttacked = null; } } }
public virtual void Attaquer(Unite unite) { float calcul = Outil.DistanceUnites(this, unite) - (26 * (unite.largeurPhysique + this.largeurPhysique) / 2); if (calcul >= Portee * Map.TailleTiles.X) Suivre(unite); else { if (CanAttack) { if (!uniteAttacked.isInvisible) { OlduniteAttacked = uniteAttacked; ObjectifListe.Clear(); body.LinearVelocity = Vector2.Zero; // Fait regarder l'unité vers l'unité attaqué if (Animation.Count == 0) { FlipH = false; float angle = Outil.AngleUnites(this, unite); if (angle >= Math.PI / 4 && angle <= 3 * Math.PI / 4) direction = Direction.Haut; else if (angle >= -3 * Math.PI / 4 && angle <= -Math.PI / 4) direction = Direction.Bas; else if (angle >= -Math.PI / 4 && angle <= Math.PI / 4) { direction = Direction.Gauche; FlipH = true; } else direction = Direction.Droite; } if (Map.gametime.TotalGameTime.TotalMilliseconds - LastAttack > Vitesse_Attaque * 1000) // Si le cooldown est fini { LastAttack = (float)Map.gametime.TotalGameTime.TotalMilliseconds; // On met à jour "l'heure de la dernière attaque" // projectile if (IsRanged) // Si l'unité attaque à distance, on creer un projectile, sinon on attaque direct Projectile = new Projectile(this, uniteAttacked); else { if (Dommages - unite.Defense <= 0) // Si armure > Dommages , degats = 1 { // On ne prend en compte les degats que si on est en local autrement ils sont effectués via le serveur unite.Vie -= 1; } else { unite.Vie -= Dommages - unite.Defense; } } // son effetUniteAttaque.Play(); // Fait regarder l'unité vers l'unité attaqué et l'anime AnimationCurrent = AnimationLimite; FlipH = false; float angle = Outil.AngleUnites(this, unite); if (angle >= Math.PI / 4 && angle <= 3 * Math.PI / 4) { direction = Direction.Haut; Animation = packAnimation.AttaquerHaut(); } else if (angle >= -3 * Math.PI / 4 && angle <= -Math.PI / 4) { direction = Direction.Bas; Animation = packAnimation.AttaquerBas(); } else if (angle >= -Math.PI / 4 && angle <= Math.PI / 4) { direction = Direction.Gauche; FlipH = true; Animation = packAnimation.AttaquerDroite(); } else { direction = Direction.Droite; Animation = packAnimation.AttaquerDroite(); } } } } } }