public Projectile(Unite tireur, Unite target) { Sprite = tireur.ProjectileSprite; Position = ConvertUnits.ToDisplayUnits(tireur.body.Position); Tireur = tireur; Target = target; Vitesse = 14; Timer = (int)Outil.DistanceUnites(tireur, target) / Vitesse; }
public override void UpdateSort() { foreach (Unite u in Map.unites) { if (u != unite && Outil.DistanceUnites(unite, u) <= 500) { u.uniteAttacked = null; u.ObjectifListe.Clear(); u.body.LinearVelocity = new Vector2((float)Math.Cos(Outil.AngleUnites(u, unite)), (float)Math.Sin(Outil.AngleUnites(u, unite))) * 100; } } }
protected override void IA(List <Unite> unitsOnMap) { if (!isAtRange) { if (Outil.DistanceUnites(Outil.GetJoueur(Client.id).champion, this) <= 600) { isAtRange = true; } } if (isAtRange) { if (!timer.IsRunning) { timer.Start(); } if (timer.Elapsed.Seconds < 1) { color = Color.Red; } if (timer.Elapsed.Seconds > 1 && timer.Elapsed.Seconds < 8) { if (IsCastable(0)) { for (int i = 0; i < spellsUpdate.Count; i++) { if (spellsUpdate[i].idSort == 45) { spellsUpdate.RemoveAt(i); } } ((NovaDeFeu)spells[0]).Positions.Clear(); Cast(spells[0], Vector2.Zero, null); ObjectifListe.Clear(); color = Color.White; } uniteAttacked = null; } else { spellsUpdate.Clear(); uniteAttacked = Outil.GetJoueur(Client.id).champion; if (timer.Elapsed.Seconds > 11) { timer.Reset(); } } } }
public bool SpeakToPNJ() // Renvoie si on parle a un PNJ, et modifie l'UI si c'est le cas { // Stoque les PNJ pres du joueurs dans une liste List <Unite> result = Map.unites.Where(i => Outil.DistanceUnites(i, champion) <= 64 && i.isApnj).ToList(); PNJSelected = (result.Count > 0) ? result[0] : null; // prend le premier et le met dans la variable PNJSelected if (PNJSelected != null) // Si on est assez proche du PNJ, on draw le dialogue { Interface.DrawDialogue = Outil.DistancePoints(champion.PositionTile, PNJSelected.PositionTile) <= 46; } else { Interface.DrawDialogue = false; } return(Interface.DrawDialogue); }
public void Suivre(Unite unite) { List <Unite> liste = new List <Unite> { }; double distance = Outil.DistanceUnites(this, unite); bool ok = distance > Portee * Map.TailleTiles.X; if (ok) { foreach (Unite u in Map.unites) { if (Outil.DistanceUnites(this, u) <= 1 * Map.TailleTiles.X) { if (u != unite && u != this) { liste.Add(u); } } } suivreactuel = 0; List <Noeud> chemin = PathFinding.TrouverChemin(PositionTile, unite.PositionTile, Map.Taille, liste, Map.unitesStatic, false); if (chemin != null) { ObjectifListe = chemin; ObjectifListe.RemoveAt(0); } else { ObjectifListe.Clear(); body.LinearVelocity = Vector2.Zero; } } else { suivreactuel++; } }
public void Pop(GameTime GT) { if (id == 0) // si on commence a pop , on assisgne un id à la vague { id = GT.TotalGameTime.TotalMilliseconds; } bool NextWave = true; foreach (Unite u in Map.unites) { if (u.idWave == id) // Si il y'a encore des unités de la vague précédente, on ne pop rien { NextWave = false; break; } } // Sinon on pop if (NextWave && unites.Count > 0) { Map.waveNumber++; while (unites[0].Count != 0) // Tant qu'il y'a des unités a pop { foreach (Vector2 v in PointsSpawn) // on les dispatche sur les points de spawn { if (unites[0].Count != 0) { if (unites[0][0] is Cavalier) { Map.unites.Add(new Cavalier(v, unites[0][0].Level)); } else if (unites[0][0] is Grunt) { Map.unites.Add(new Grunt(v, unites[0][0].Level)); } else if (unites[0][0] is Archer) { Map.unites.Add(new Archer(v, unites[0][0].Level)); } else if (unites[0][0] is Troll) { Map.unites.Add(new Troll(v, unites[0][0].Level)); } else if (unites[0][0] is Demon) { Map.unites.Add(new Demon(v, unites[0][0].Level)); } else if (unites[0][0] is Ogre) { Map.unites.Add(new Ogre(v, unites[0][0].Level)); } else if (unites[0][0] is Odin) { Map.unites.Add(new Odin(v, unites[0][0].Level)); } else if (unites[0][0] is Voleur) { Map.unites.Add(new Voleur(v, unites[0][0].Level)); } else { throw new Exception("Modif la wave!"); } // Fait attaquer l'unité la plus proche if (!Map.unites[Map.unites.Count - 1].isAChamp && !Map.unites[Map.unites.Count - 1].isApnj) { float distanceInit = 9000; Unite focus = null; foreach (Unite u in Map.unites) { float distance = 0; if (u.isAChamp && (distance = Outil.DistanceUnites(Map.unites[Map.unites.Count - 1], u)) <= distanceInit) { distanceInit = distance; focus = u; } } Map.unites[Map.unites.Count - 1].uniteAttacked = focus; } //Map.unites[Map.unites.Count - 1].uniteAttacked = focus; Map.unites[Map.unites.Count - 1].idWave = id; unites[0].RemoveAt(0); } else // Si il y'a moins d'unité que de points de spawn, on arrete { break; } } } unites.RemoveAt(0); Map.nombreDeVaguesPop++; } }
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(); } } } } } }
public override void Update(List <Unite> unitsOnMap, List <Effet> effets) { Animer(); Deplacer(); TestMort(effets); Debug(); // Update l'IA if (!isAChamp) { IA(unitsOnMap); } // Pour Update et Draw les sorts try { foreach (Spell s in spellsUpdate) { s.Update(); } } catch { } // Retire les sorts qui sont finis for (int i = 0; i < spellsUpdate.Count; i++) { if (!spellsUpdate[i].Activated) { spellsUpdate.RemoveAt(i); } } // Pour Update et Draw les items de l'inventaire foreach (Item i in Inventory) { if (i.Activated) { i.spell.Update(); } } // Pour Update les projectiles ProjectileUpdate(); // On ajoute du mana ManaUpdate(); // On Update l'inventaire de l'unité InventoryUpdate(); // On rafraichit la propriete suivante, elle est juste indicative et n'affecte pas le draw, mais le pathfinding PositionTile = new Vector2((int)(ConvertUnits.ToDisplayUnits(body.Position.X) / Map.TailleTiles.X), (int)(ConvertUnits.ToDisplayUnits(body.Position.Y) / Map.TailleTiles.Y)); // Refresh l'attaque et le pathfinding correspondant if (uniteAttacked != null) { Attaquer(uniteAttacked); } else if (OlduniteAttacked != null && ObjectifListe.Count == 0 && IsRanged) // si l'unité se déplacait pour tirer { uniteAttacked = OlduniteAttacked; } // Fait attaquer l'unité la plus proche if (!isAChamp && !isApnj && uniteAttacked != null) { float distanceInit = 9000; Unite focus = null; foreach (Unite u in Map.unites) { float distance = 0; if (u.isAChamp && (distance = Outil.DistanceUnites(this, u)) <= distanceInit) { distanceInit = distance; focus = u; } } uniteAttacked = focus; } // Reseau UpdateReseau(); }