예제 #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 les gestionnaires de sorts et d'états.
 /// Par défaut, l'acteur peut bouger et lancer des sorts.
 /// </summary>
 /// <param name="position"> La position de l'acteur dans le monde </param>
 protected ControlledActor(Point position) : base(position)
 {
     _blockingMoves = 0;
     _blockingCasts = 0;
     SpellHandler   = new SpellHandler(this);
     _stateHandler  = new StateHandler(this);
     ResiduData     = new ResiduData(this, AnimationType.Death, false);
 }
예제 #3
0
        /// <summary>
        /// Créer l'explosion lancée par l'acteur indiqué à la position donnée, avec les données fournies.
        /// Ainsi, le délai d'explosion, les dégâts de l'explosion (modifiés par les caractéristiques du lanceur), ses
        /// animations Birth et Death ainsi que son éventuel effet appliqué aux ennemis touchés sont définis.
        /// </summary>
        /// <param name="position"> La position de l'explosion </param>
        /// <param name="owner"> Le lanceur de l'explosion </param>
        /// <param name="data"> Les données de l'explosion </param>
        public Explosion(Point position, LivingActor owner, ExplosionData data) : base(position)
        {
            _data   = data;
            _owner  = owner;
            Faction = _owner.Faction;
            var anim = new AnimationHandler(this, _data.Animations);

            anim.PlayAnimation(AnimationType.Birth, false, _data.Delay);
            SpriteHandler = anim;
            ResiduData    = new ResiduData(this, AnimationType.Death, false);
        }
예제 #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();
                }
            })
                         );
        }