示例#1
0
 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;
 }
示例#2
0
 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;
         }
     }
 }
示例#3
0
        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();
                    }
                }
            }
        }
示例#4
0
        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);
        }
示例#5
0
        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++;
            }
        }
示例#6
0
        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++;
            }
        }
示例#7
0
        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();
                            }
                        }
                    }
                }
            }
        }
示例#8
0
        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();
        }