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