示例#1
0
 public void UpdateData(Enemy enemy)
 {
     this.Stats = enemy.Stats;
     this.Melee = enemy.Melee;
     this.SpriteSetName = SpriteSetName;
     this.Loot = Loot;
     this.MaxTargetDistance = MaxTargetDistance;
     this.FollowRange = FollowRange;
     this.DeathTimer = DeathTimer;
     this.RespawnTime = RespawnTime;
 }
        private void lbxEnemies_SelectedIndexChanged(object sender, EventArgs e)
        {
            currentEnemy = lbxEnemies.SelectedIndex == -1 ? null : Enemies[lbxEnemies.SelectedIndex];
            spritePreviewControl1.CurrentCharacter = currentEnemy;
            spriteSelectionControl1.SelectedIndex = currentEnemy == null ? -1 : Editor.SpriteCollection.FindIndex(s => s.Name == currentEnemy.SpriteSetName);

            if (lbxEnemies.SelectedIndex != -1)
            {
                enemyDetailsTabs.Enabled = true;
                GetEnemyProperties();
            }
        }
        private void btnNewEnemy_Click(object sender, EventArgs e)
        {
            Enemy en = new Enemy();

            en.Name = "Inimigo";

            if (Editor.SpriteCollection.Any())
            {
                en.CharSprite = new CharacterSprite(Editor.SpriteCollection.FirstOrDefault());
                en.CharSprite.AnimateAction(AnimationType.Walking);

                en.SpriteSetName = en.CharSprite?.SpriteSet?.Name;
            }

            Editor.Project.Enemies.Add(en);
            LoadEnemies();
        }
示例#4
0
        private void enemySelectionControl1_Click(object sender, EventArgs e)
        {
            int index = (int)(MouseEnemyControlIndex.Y * enemySelectionControl1.Columns + MouseEnemyControlIndex.X);

            if (Project.Enemies.Count > index)
            {
                cbbLayerType.SelectedIndex = (int)LayerType.ObjectLayer;

                enemySelectionControl1.SelectedIndex = index;
                textureSelectionControl.SelectedTile = -1;
                objectSelectionControl1.SelectedIndex = -1;

                CurrentEnemyId = Project.Enemies[index].Id;
                CurrentEnemy = new Enemy();
                CurrentEnemy = Project.Enemies.Find(delegate(Enemy o) { return o.Id == CurrentEnemyId; }); ;
            }
        }
        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 UpdateEnemyBehavior(Enemy enemy)
        {
            enemy.MovementEngine.PathFinding.GameObjects = gameObjects;
            Vector2 movement = Vector2.Zero;

            var allies = new List<Character.Character>();
            allies.AddRange(AliveNpcs);
            allies.Add(Player);

            if (enemy.ActionState != ActionState.Attacking)
            {
                //If creature has target, check behavior
                //if no target, wander til target is found
                foreach (ActionBehavior action in enemy.Behavior.Actions)
                {
                    bool isValid = false;
                    Character.Character target = null;

                    #region Check if condition is valid

                    switch (action.Condition.Target)
                    {
                        case ConditionTarget.Self:
                            target = enemy;
                            break;
                        case ConditionTarget.Enemy:
                            if (allies.Count > 0)
                                target = allies[0];
                            break;
                        case ConditionTarget.Friend:
                            List<Enemy> targets = AliveEnemies.FindAll(x => x.HealthPercentage <= action.Condition.Value);
                            if (targets.Count > 0) target = targets[0];
                            break;
                    }

                    if (action.Condition.Target == ConditionTarget.Friend)
                    {
                        switch (action.Condition.Type)
                        {
                            case ConditionType.HealthLower:
                                isValid = AliveEnemies.FindAll(x => x.Stats.Hp <= action.Condition.Value).Count > 0;
                                break;
                            case ConditionType.HealthLowerPC:
                                isValid =
                                    AliveEnemies.FindAll(x => x.HealthPercentage <= action.Condition.Value).Count > 0;
                                break;
                            case ConditionType.HealthHigher:
                                isValid = AliveEnemies.FindAll(x => x.Stats.Hp >= action.Condition.Value).Count > 0;
                                break;
                            case ConditionType.HealthHigherPC:
                                isValid =
                                    AliveEnemies.FindAll(x => x.HealthPercentage >= action.Condition.Value).Count > 0;
                                break;
                            case ConditionType.None:
                                isValid = true;
                                break;
                        }
                    }
                    else
                    {
                        if (target != null)
                        {
                            switch (action.Condition.Type)
                            {
                                case ConditionType.HealthLower:
                                    isValid = target.Stats.Hp <= action.Condition.Value;
                                    break;
                                case ConditionType.HealthLowerPC:
                                    isValid = target.HealthPercentage <= action.Condition.Value;
                                    break;
                                case ConditionType.HealthHigher:
                                    isValid = target.Stats.Hp >= action.Condition.Value;
                                    break;
                                case ConditionType.HealthHigherPC:
                                    isValid = target.HealthPercentage >= action.Condition.Value;
                                    break;
                                case ConditionType.None:
                                    isValid = true;
                                    break;
                            }
                        }
                    }

                    #endregion

                    if (isValid)
                    {
                        switch (action.ActionType)
                        {
                            case ActionType.Attack:
                                break;
                            case ActionType.Skill:
                                if (target != null)
                                {
                                    var actionSkill = enemy.Skills.FirstOrDefault(s => s.Id == action.SkillId);
                                    if (actionSkill != null)
                                    {
                                        CastEnemySkill(enemy, actionSkill, target);
                                    }
                                }
                                break;
                            case ActionType.Behavior:
                                enemy.Behavior.BehaviorType = action.NewBehavior;
                                break;
                        }
                    }
                }

                if (enemy.HasTarget && enemy.Target.IsAlive)
                {
                    #region Check behavior

                    if (enemy.Behavior.BehaviorType == BehaviorType.Scared)
                    {
                        if (!enemy.IsInAttackRange(enemy.Target))
                        {
                            movement = Steering.KeepDistance(enemy, enemy.Target, 200);

                            //if (enemy.DistanceToTarget > enemy.MaxTargetDistance)
                            //    enemy.Target = null;
                        }
                    }
                    else if (enemy.Behavior.BehaviorType == BehaviorType.Agressive)
                    {
                        if (enemy.HasTarget && !enemy.IsInAttackRange(enemy.Target))
                        {
                            movement = Steering.Seek(enemy, enemy.Target, enemy.CurrentWeapon.AttackRange);

                            //if (enemy.DistanceToTarget > enemy.MaxTargetDistance)
                            //    enemy.Target = null;
                        }
                    }
                    else if (enemy.Behavior.BehaviorType == BehaviorType.Coward)
                    {
                        movement = Steering.KeepDistance(enemy, Player, 500);
                    }
                    else if (enemy.Behavior.BehaviorType == BehaviorType.Passive)
                    {
                        enemy.Behavior.Wandering();
                    }

                    #endregion
                }
                else // Wander
                {
                    Character.Character target = allies.Find(x => x.IsAlive && (enemy.CanHear(x) || enemy.IsInVisionRange(x.Position)));
                    //gameObjects.Find(delegate(GameObject o) { return (o is Character) && ((o as Character).IsPlayer || (o is Npc && (o as Npc).IsAlly)); }) as Character;

                    if (target != null)
                    {
                        enemy.Target = target;
                    }
                    else
                    {
                        enemy.Behavior.Wandering();
                    }
                }

                #region Idle

                if (movement != Vector2.Zero)
                {
                    enemy.StopMovement();
                    enemy.Move(movement);
                }
                else if (enemy.MovementEngine.CurrentWaypoint == null && enemy.ActionState != ActionState.Attacking)
                {
                    Log.ScreenLog.Add(string.Format("{0}. {1} going idle", enemy.UniqueObjectId, enemy.Name));

                    enemy.Idle();
                    if (enemy.HasTarget)
                    {
                        enemy.Face(enemy.Target);
                    }
                }

                #endregion
            }

            if (enemy.HasTarget && enemy.MeleeReady && enemy.CanAttackCharacter(enemy.Target))
            {
                if (enemy.IsInAttackRange(enemy.Target))
                {
                    enemy.StartAttack();
                    attackQueue.Add(new MeleeAttack(enemy, enemy.Target, enemy.AttackDelay, null));
                }
            }
        }