public Projectile(Texture2D sprite) { Sprite = new SpriteAnimation(sprite, 50, 1); Speed = 20; CollisionRadius = 18; Collision = false; }
public MeleeAttack(Character.Character attacker, GameObject target, int delay, SpriteAnimation targetAnimation) { Delay = delay; Attacker = attacker; Target = target; TargetAnimation = targetAnimation; Timer = 0; }
public void CastEnemySkill(Enemy character, Skill skill, Character.Character target = null) { if (character.CanCastSkill(skill)) { var affected = new List<Character.Character>(); if (affected.Count > 0 || target != null) { character.StatusEffects.AddRange(skill.SelfEffects); skill.CooldownTimer = skill.Cooldown; #region Target effects if (skill.AnimateAction) { character.StopMovement(); character.ActionState = ActionState.Attacking; character.CharSprite.AnimateAction(AnimationType.Attack1); } if (skill.TargetArea == TargetArea.SingleTarget) { if (target != null && (target.Position - character.Position).Length() <= skill.Range) affected.Add(target); } if (skill.Damage > 0) { affected.ForEach(x => { var args = new AttackEventArgs(Player, x, -skill.Damage, false); x.ChangeHealth(args, true); }); } if (skill.Healing > 0) { affected.ForEach(x => { var args = new AttackEventArgs(Player, x, skill.Healing, false); x.ChangeHealth(args, true); }); } affected.ForEach(x => x.StatusEffects.AddRange(skill.TargetEffects)); #endregion #region Caster animation effects if (skill.CasterAnimation != null) { skill.CasterAnimation.Position = character.Position; animations.Add(skill.CasterAnimation); } #endregion #region Caster movement //if (skill.CasterMovement == CasterMovement.TeleportToTarget) //{ // character.Position = InputManager.MouseToMapVector; //} //else if (skill.CasterMovement == CasterMovement.Dash) //{ // float mouseAngle = MapHelper.GetAngleBetweenPoints(Player.Position, InputManager.MouseToMapVector); // Direction d = MapHelper.GetDirectionFromAngle(mouseAngle); // //Player.Dash(MapHelper.GetVectorFromDirection(d), (Player.Position - InputManager.MouseToMapVector).Length()); //} #endregion #region Target animation effects if (skill.TargetAnimation != null) { switch (skill.TargetArea) { case TargetArea.SelfArea: case TargetArea.SingleTarget: case TargetArea.RangedArea: foreach (Character.Character enemy in affected) { var animation = new SpriteAnimation(skill.TargetAnimation.Texture, skill.TargetAnimation.SpriteFormat, skill.TargetAnimation.Interval); animation.Target = enemy; animations.Add(animation); } break; case TargetArea.Self: skill.TargetAnimation.Target = character; animations.Add(skill.TargetAnimation); break; } } #endregion } } }
private void CheckPlayerMouseAttack() { float angle = MapHelper.GetAngleBetweenPoints(Player.Position, InputManager.MouseToMapVector); if (angle < 0) angle += 360; Direction dir = MapHelper.GetDirectionFromAngle(angle); Player.Turn(dir); if (Player.MeleeReady) { Player.StartAttack(); bool enemyAttacked = false; foreach (Enemy en in AliveEnemies) { if (en.CollisionBounds.Contains(InputManager.MouseToMapPoint)) { if (Player.CanAttackCharacter(en)) { if (Player.IsInAttackRange(en)) { attackQueue.Add(new MeleeAttack(Player, en, Player.AttackDelay, null)); enemyAttacked = true; } } } } if (!enemyAttacked) { // Check attack on map objects foreach (MapObject mapObj in Game.CurrentMap.MapObjects) { if (mapObj.CollisionBounds.Contains(InputManager.MouseToMapPoint) && Player.CanAttackCharacter(mapObj) && Player.IsInAttackRange(mapObj)) { var animation = new SpriteAnimation(Game.Content.Load<Texture2D>("Sprites/Animations/Earth 5"), new Vector2(5, 3), 10); animation.Color = Color.Brown; attackQueue.Add(new MeleeAttack(Player, mapObj, Player.AttackDelay, animation)); break; } } } } }
public void CastSkill(Character.Character character, Skill skill) { if ((InputManager.MouseToMapVector - Player.Position).Length() > skill.Range) { currentPreCastSkill = null; return; } if (character.CanCastSkill(skill)) { var affected = new List<Enemy>(); character.Stats.Mana -= skill.ManaCost; character.StatusEffects.AddRange(skill.SelfEffects); skill.CooldownTimer = skill.Cooldown; #region Player Skills if (character.IsPlayer) { #region Target effects if (skill.AnimateAction) { character.StopMovement(); character.ActionState = ActionState.Attacking; character.CharSprite.AnimateAction(AnimationType.Attack1); } if (skill.TargetArea == TargetArea.SelfArea) { affected = AliveEnemies.FindAll(e => (e.Position - character.Position).Length() <= skill.Range); } else if (skill.TargetArea == TargetArea.SingleTarget) { if (currentTarget is Enemy) affected.Add(currentTarget as Enemy); } if (skill.DamageModificerPercentage > 0) { float damageBuff = skill.DamageModificerPercentage/100; foreach (Enemy e in affected) { var damage = (int) (damageBuff*BattleHelper.CalculatePhysicalDamage(character, e)); var args = new AttackEventArgs(Player, e, -damage, false); e.ChangeHealth(args, true); } } if (skill.Damage > 0) { affected.ForEach(x => { var args = new AttackEventArgs(Player, x, -skill.Damage, false); x.ChangeHealth(args, true); }); } affected.ForEach(x => x.StatusEffects.AddRange(skill.TargetEffects)); #endregion #region Caster animation effects if (skill.CasterAnimation != null) { skill.CasterAnimation.Position = character.Position; animations.Add(skill.CasterAnimation); } #endregion #region Caster movement if (skill.CasterMovement == CasterMovement.TeleportToTarget) { Player.Position = InputManager.MouseToMapVector; } else if (skill.CasterMovement == CasterMovement.Dash) { float mouseAngle = MapHelper.GetAngleBetweenPoints(Player.Position, InputManager.MouseToMapVector); Direction d = MapHelper.GetDirectionFromAngle(mouseAngle); //Player.Dash(MapHelper.GetVectorFromDirection(d), (Player.Position - InputManager.MouseToMapVector).Length()); } #endregion #region Target animation effects if (skill.TargetAnimation != null) { switch (skill.TargetArea) { case TargetArea.SelfArea: case TargetArea.SingleTarget: case TargetArea.RangedArea: foreach (Enemy target in affected) { var animation = new SpriteAnimation(skill.TargetAnimation.Texture, skill.TargetAnimation.SpriteFormat, skill.TargetAnimation.Interval); animation.Target = target; animations.Add(animation); } break; case TargetArea.Self: skill.TargetAnimation.Target = character; animations.Add(skill.TargetAnimation); break; default: break; } } #endregion currentPreCastSkill = null; } #endregion #region Enemy Skills #endregion } }