示例#1
0
 /// <summary>
 /// Crée un projectile avec les caractéristiques spécifiées.
 /// Il est crée avec la même faction que l'acteur qui l'a lancé et depuis l'extrémité de cet acteur
 /// correspondant à son orientation actuelle.
 /// Le projectile dispose par défaut d'un résidu prolongeant sa trajectoire avec son animation de mort
 /// lorsqu'il atteint sa durée de vie.
 /// </summary>
 /// <param name="owner"> L'acteur à l'origine du projectile </param>
 /// <param name="target"> La cible, qui va définir l'orientation du projectile </param>
 /// <param name="speed"> La vitesse en pixels par seconde du projectile </param>
 /// <param name="lifeTime"> La durée de vie du projectile en secondes </param>
 public Missile(Actor owner, Point target, int speed, double lifeTime) : base(owner.Muzzle())
 {
     _lifeTime   = new BoundedDouble(lifeTime, -1);
     Speed       = speed;
     Orientation = owner.Position.GetOrientation(target);
     Faction     = owner.Faction;
     ResiduData  = new ResiduData(this, AnimationType.Death, true);
 }
 /// <summary>
 /// Initialise la vie de l'acteur à sa valeur maximale donnée.
 /// Si showingLife est vrai, l'acteur affichera sa barre de vie au-dessus de lui un court instant lorsqu'elle
 /// est modifiée.
 /// </summary>
 /// <param name="position"> La position de l'acteur dans le monde </param>
 /// <param name="lifeMax"> La vie maximale de l'acteur </param>
 /// <param name="showingLife"> Indique si il faut afficher la vie de l'acteur. </param>
 public LivingActor(Point position, int lifeMax, bool showingLife = false) : base(position)
 {
     Life = new BoundedDouble(lifeMax);
     if (!showingLife)
     {
         return;
     }
     _lifeBar    = new ProgressingSprite(ColorBar, EmptyBar, PercentMerge);
     _lifeSprite = new SpriteHandler(this, _lifeBar, new FadingTransparency(FadingMs));
 }
示例#3
0
 /// <summary>
 /// Crée le sort en lui assignant son joueur et les données indiquées.
 /// Le sort est crée avec une charge.
 /// La statistique de CooldownReduction du joueur réduit le temps de recharge du sort.
 /// </summary>
 /// <param name="owner"> Le possesseur du sort </param>
 /// <param name="spellData"> Les données du sort </param>
 /// <param name="stats"> Les statistiques du joueur </param>
 public Spell(ControlledActor owner, SpellData spellData, PlayerStats stats)
 {
     _owner     = owner;
     _spellData = spellData;
     StateData  = new StateData(_spellData.CastTimeMs, null, (actor, arg) =>
     {
         actor.UnlockCasts();
         if (!_spellData.CanMove)
         {
             actor.UnlockMoves();
         }
     });
     _currentMs = DefaultMs;
     _cooldown  = new BoundedDouble(_spellData.Cooldown * stats.CooldownRatio(), -1)
     {
         Value = 0
     };
 }
示例#4
0
        /// <summary>
        /// Crée un projectile avec toutes les données fournies par la classe MissileData.
        /// Il est crée avec la même faction que l'acteur qui l'a lancé et depuis l'extrémité de cet acteur
        /// correspondant à son orientation actuelle.
        /// Le projectile d'un résidu prolongeant sa trajectoire avec son animation de mort lorsqu'il atteint sa durée
        /// de vie.
        /// Il possède une hitbox immatérielle et va mourir lorsqu'il rencontre un acteur (avec une hitobx non
        /// immatérielle )avec lequel il n'est pas ami et créer un résidu avec l'animation de type Explodes, si elle
        /// est disponible.
        /// Si cet acteur est un ennemi vivant, les dégâts indiqués dans MissileData lui seront infligés, modifiés par
        /// le SpellPowerRatio() de l'acteur à l'origine du projecile. De plus, si le lanceur du pojectile est vivant
        /// et possède un ratio de vampirisme non nul, il sera soigné d'après ce ratio en fonction des dégâts infligés.
        /// </summary>
        /// <param name="owner"> L'acteur à l'origine du projectile </param>
        /// <param name="target"> La cible, qui va définir l'orientation du projectile </param>
        /// <param name="data"> Les différents paramètres du missile </param>
        public Missile(Actor owner, Point target, MissileData data) : base(owner.Muzzle())
        {
            _lifeTime   = new BoundedDouble(data.Range / (double)data.Speed, -1);
            Speed       = data.Speed;
            Orientation = owner.Position.GetOrientation(target);
            SpeedVector = Orientation * Speed;
            Faction     = owner.Faction;

            ResiduData = new ResiduData(this, AnimationType.Death, true);

            SpriteHandler = new AnimationHandler(this, data.Animations);

            var damages     = data.Damage;
            var livingOwner = owner as LivingActor;
            var heal        = livingOwner?.VampirismRatio() ?? 0.0;

            // Création de la hitbox immatérielle en prenant en compte SpellPowerRatio() et VampirismRatio()
            SetCollision(new ActorCollision(this, new Rectangle(data.Size, data.Size), HitboxType.Immaterial,
                                            actor =>
            {
                if (actor == owner || actor.Collision.HitboxType == HitboxType.Immaterial)
                {
                    return;
                }
                var player = actor as LivingActor;
                if (EnnemyWith(actor) && player != null)
                {
                    player.Damages(damages * owner.SpellPowerRatio());
                    if (heal != 0.0)
                    {
                        livingOwner?.Heals(damages * heal);
                    }
                }
                if (!FriendWith(actor))
                {
                    ResiduData = new ResiduData(this, AnimationType.Explodes, false);
                    Kill();
                }
            })
                         );
        }