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