Example #1
0
 public SkillTargetContainer GetTargets(bool ignore_distance, eMoveTarget move_target)
 {
     return(GetTargets(Creature, Creature.IsTeam, ignore_distance, move_target));
 }
Example #2
0
    //     public List<ISkillTarget> GetTargets(bool is_team, bool ignore_distance)
    //     {
    //         return GetTargets(null, is_team, ignore_distance);
    //     }

    SkillTargetContainer GetTargets(BattleCreature self, bool is_team, bool ignore_distance, eMoveTarget move_target)
    {
        SkillTargetContainer skill_target = new SkillTargetContainer();

        skill_target.targets = new List <ISkillTarget>();

        try
        {
            switch (Info.TargetType)
            {
            case eTargetType.self:
                if (self == null)
                {
                    Debug.LogError("self is null");
                }
                skill_target.targets.Add(new SkillTarget(skill_target, this, self, 0));
                break;

            case eTargetType.position:
            case eTargetType.position_reverse:
            case eTargetType.all:
            case eTargetType.all_reverse:
            case eTargetType.all_center:
            case eTargetType.position_next:
            {
                List <ICreature> target_list = GetTargetList(is_team, Info.EnemyType);

                switch (Info.TargetType)
                {
                case eTargetType.position_reverse:
                case eTargetType.all_reverse:
                    target_list = target_list.Reverse <ICreature>().ToList();
                    break;

                case eTargetType.position_next:
                    skill_target.target_creatures = target_list;
                    break;
                }

                var main_action = Info.Actions[0];

                int selected_target_index = -1, first_target_index = -1;

                // provoke
                if (main_action.IsMultiTarget == false)
                {
                    for (int target_index = 0; target_index < target_list.Count; ++target_index)
                    {
                        var  creature = target_list[target_index] as BattleCreature;
                        Buff provoke  = creature.GetProvoke();
                        if (provoke != null)
                        {
                            int value = provoke.Value - (Level - provoke.Skill.Level) * GameConfig.Get <int>("stun_level_decrease");
                            if (BattleBase.Instance.Rand.NextRange(1, 10000) > value)
                            {
                                continue;
                            }

                            TextManager.Instance.PushMessage(creature, Localization.Get("Aggro"), eBuffColorType.Aggro, eTextPushType.Normal);
                            selected_target_index = target_index;
                            break;
                        }
                    }
                }

                if (selected_target_index == -1)
                {
                    for (int target_index = 0; target_index < target_list.Count; ++target_index)
                    {
                        BattleCreature target = target_list[target_index] as BattleCreature;
                        if (target == null || target.CanTarget() == false)
                        {
                            continue;
                        }

                        if (first_target_index == -1)
                        {
                            first_target_index = target_index;
                        }
                        if (Info.TargetType != eTargetType.all_center && Info.TargetType != eTargetType.all && Info.TargetType != eTargetType.all_reverse && main_action.CanDistance(self.Character.GetAction(Info.ActionName).Effect.GetFirstActionTime(), target) == false)
                        {
                            continue;
                        }

                        selected_target_index = target_index;
                        break;
                    }
                    if (selected_target_index == -1)
                    {
                        if (ignore_distance == true)
                        {
                            selected_target_index = first_target_index;
                        }

                        if (selected_target_index == -1)
                        {
                            return(null);
                        }
                    }
                }

                skill_target.targets.Add(new SkillTarget(skill_target, this, target_list[selected_target_index], 0));
                var value_percent = Info.Actions[0].action_value;
                for (int value_index = 1, target_index = 1; value_index < value_percent.value_percent.Length; value_index++, target_index++)
                {
                    if (value_percent.value_percent[value_index] > 0)
                    {
                        if (main_action.loop_target == true || selected_target_index + target_index < target_list.Count)
                        {
                            var target = target_list[(selected_target_index + target_index) % target_list.Count] as BattleCreature;
                            if (target == null || target.CanTarget() == false)
                            {
                                if (main_action.skip_dead)
                                {
                                    --value_index;
                                    continue;
                                }
                                skill_target.targets.Add(null);
                            }
                            else
                            {
                                skill_target.targets.Add(new SkillTarget(skill_target, this, target, value_index));
                            }
                        }
                        else
                        {
                            skill_target.targets.Add(null);
                        }
                        skill_target.targets.Add(null);
                    }
                }

                //                     if (Info.TargetType != eTargetType.all && main_action.check_distance == true && !targets.Any(t => t != null && t.Character.Creature.IsDead == false && (t.Character.transform.localPosition == Vector3.zero || ignore_distance == true)))
                //                         return null;
            }
            break;

            case eTargetType.hp_min:
            {
                List <ICreature> target_list = GetTargetList(is_team, Info.EnemyType);

                BattleCreature selected_target = null;
                foreach (BattleCreature creature in target_list)
                {
                    if (creature != null && creature.CanTarget() == true && (selected_target == null || creature.Stat.HP < selected_target.Stat.HP))
                    {
                        selected_target = creature;
                    }
                }
                skill_target.targets.Add(new SkillTarget(skill_target, this, selected_target, 0));
            }
            break;

            case eTargetType.hp_min_percent:
            {
                List <ICreature> target_list = GetTargetList(is_team, Info.EnemyType);

                BattleCreature selected_target = null;
                foreach (BattleCreature creature in target_list)
                {
                    if (creature != null && creature.CanTarget() == true && (selected_target == null || creature.Stat.HPPercent < selected_target.Stat.HPPercent))
                    {
                        selected_target = creature;
                    }
                }
                skill_target.targets.Add(new SkillTarget(skill_target, this, selected_target, 0));
            }
            break;

            case eTargetType.attack_max:
            {
                List <ICreature> target_list = GetTargetList(is_team, Info.EnemyType);

                BattleCreature selected_target = null;
                foreach (BattleCreature creature in target_list)
                {
                    if (creature != null && creature.CanTarget() == true && (selected_target == null || creature.GetDamageValue() > selected_target.GetDamageValue()))
                    {
                        selected_target = creature;
                    }
                }
                skill_target.targets.Add(new SkillTarget(skill_target, this, selected_target, 0));
            }
            break;
            }
        }
        catch (System.Exception ex)
        {
            throw new System.Exception(string.Format("[{0}] {1}", Info.ID, ex.Message), ex);
        }

        if (skill_target.main_target == null && Info.TargetType != eTargetType.position_next)
        {
            if (Info.TargetType == eTargetType.all_center)
            {
                skill_target.main_target = GetCenter(!is_team);
            }
            else
            {
                if (move_target == eMoveTarget.Character)
                {
                    skill_target.main_target = skill_target.targets[0].Character.transform;
                }
                else
                {
                    skill_target.main_target = skill_target.targets[0].Character.transform.parent;
                }
            }
        }

        return(skill_target);
    }
Example #3
0
    override public void Load(XmlNode skillInfoNode)
    {
        base.Load(skillInfoNode);
        Name = skillInfoNode.Attributes["name"].Value;
        Desc = skillInfoNode.Attributes["desc"].Value;
        Type = (eSkillType)Enum.Parse(typeof(eSkillType), skillInfoNode.Attributes["skill_type"].Value);

        XmlAttribute icon_id_attr = skillInfoNode.Attributes["icon_id"];

        if (icon_id_attr != null)
        {
            IconID = icon_id_attr.Value;
        }
        else
        {
            IconID = ID;
        }

        XmlAttribute show_icon_attr = skillInfoNode.Attributes["show_icon"];

        if (show_icon_attr != null)
        {
            ShowIcon = bool.Parse(show_icon_attr.Value);
        }
        else
        {
            ShowIcon = true;
        }

        switch (Type)
        {
        case eSkillType.passive:
        case eSkillType.passive_etc:
        {
            CanStack = true;
            XmlAttribute action_name_attr = skillInfoNode.Attributes["action_name"];
            if (action_name_attr != null)
            {
                ActionName = action_name_attr.Value;
            }
        }
        break;

        default:
            EnemyType  = (eEnemyType)Enum.Parse(typeof(eEnemyType), skillInfoNode.Attributes["enemy_type"].Value);
            TargetType = (eTargetType)Enum.Parse(typeof(eTargetType), skillInfoNode.Attributes["target_type"].Value);
            ActionName = skillInfoNode.Attributes["action_name"].Value;
            XmlAttribute move_target_attr = skillInfoNode.Attributes["move_target"];
            if (move_target_attr != null)
            {
                MoveTarget = (eMoveTarget)Enum.Parse(typeof(eMoveTarget), move_target_attr.Value);
            }
            break;
        }

        switch (Type)
        {
        case eSkillType.active_plus:
            return;
        }

        Actions = new List <Action>();
        foreach (XmlNode actionNode in skillInfoNode.SelectNodes("Action"))
        {
            Actions.Add(new Action(actionNode, this, null));
        }
    }