Пример #1
0
 public Projectile(Texture2D sprite)
 {
     Sprite = new SpriteAnimation(sprite, 50, 1);
     Speed = 20;
     CollisionRadius = 18;
     Collision = false;
 }
Пример #2
0
 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
            }
        }