/// <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); }
/// <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); }
/// <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(); } }) ); }