예제 #1
0
    static public ISkillBuff DoBuff(SkillInfo.Action buff_action, BattleCreature creature, BattleCreature target_creature, BattleSkill skill, int target_index, ISkillBuff parent)
    {
        switch (buff_action.actionType)
        {
        case eActionType.stun:
        case eActionType.hidden:
        case eActionType.sleep:
        {
            if (target_creature.InvokeImmune(eImmuneType.cc, skill.Creature.Info.AttackType, skill.Level) == true)
            {
                return(null);
            }

            int value = skill.GetValueWithTargetIndex(buff_action, target_index, -(target_creature.Level - skill.Level) * GameConfig.Get <int>("stun_level_decrease"));
            if (BattleBase.Instance.Rand.NextRange(1, 10000) > value)
            {
                TextManager.Instance.PushMessage(target_creature, Localization.Get("Miss"), eBuffColorType.Immune, eTextPushType.Normal);
                return(null);
            }

            float duration = skill.GetDuration(buff_action, target_index);
            Buff  buff     = new Buff(target_creature, skill, buff_action, value, duration, parent);
            if (duration == 0f)
            {
                buff.DoAction();
            }
            else if (duration > 0f || duration == -1f)
            {
                target_creature.AddBuff(buff, skill.Info.CanStack);
                TextManager.Instance.PushMessage(target_creature, Localization.Get(buff_action.actionType.ToString()), eBuffColorType.Stun, eTextPushType.Normal);
            }
            else
            {
                Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name);
            }
            return(buff);
        }

        case eActionType.ignore_defense_damage:
        case eActionType.ignore_defense_damaged:
        case eActionType.worldboss:
        case eActionType.shield:
        case eActionType.immune:
        case eActionType.provoke:
        case eActionType.buff:
        case eActionType.buff_percent:
        {
            int value = skill.GetValueWithTargetIndex(buff_action, target_index, 0);

            float duration = skill.GetDuration(buff_action, target_index);

            Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent);
            if (duration == 0f)
            {
                buff.DoAction();
            }
            else if (duration > 0f || duration == -1f)
            {
                target_creature.AddBuff(buff, skill.Info.CanStack);
            }
            else
            {
                Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name);
            }
            target_creature.SetWait();

            if (buff_action.statType == eStatType.AttackSpeed && duration > 0f)
            {
                buff.Duration *= (1f + value * 0.0001f);
            }

            return(buff);
        }

        case eActionType.debuff:
        case eActionType.debuff_percent:
        {
            eImmuneType immune_type = eImmuneType.debuff;
            switch (buff_action.actionType)
            {
            default:
                if (target_creature.InvokeImmune(immune_type, skill.Creature.Info.AttackType, skill.Level) == true)
                {
                    return(null);
                }
                break;
            }

            int value = -skill.GetValueWithTargetIndex(buff_action, target_index, 0);

            float duration = skill.GetDuration(buff_action, target_index);

            Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent);
            if (duration == 0f)
            {
                buff.DoAction();
            }
            else if (duration > 0f || duration == -1f)
            {
                target_creature.AddBuff(buff, skill.Info.CanStack);
            }
            else
            {
                Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name);
            }

            target_creature.SetWait();

            if (buff_action.statType == eStatType.AttackSpeed && duration > 0f)
            {
                buff.Duration *= (1f - value * 0.0001f);
            }

            return(buff);
        }

        case eActionType.dot_damage:
        {
            int value = -skill.GetValueWithTargetIndex(buff_action, target_index, creature.GetDamageValue());

            value = Mathf.RoundToInt(value * (1f + (creature.GetValue(eStatType.IncreaseDamagePercent) - creature.GetValue(eStatType.DecreaseDamagePercent)) * 0.0001f));

            float duration = skill.GetDuration(buff_action, target_index);

            Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent);
            if (duration == 0f)
            {
                buff.DoAction();
            }
            else if (duration > 0f || duration == -1f)
            {
                target_creature.AddBuff(buff, skill.Info.CanStack);
            }
            else
            {
                Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name);
            }

            target_creature.SetWait();

            return(buff);
        }

        case eActionType.dot_damage_mana:
        {
            int value = -skill.GetValueWithTargetIndex(buff_action, target_index, 0);

            float decrease = (10000 - (target_creature.Level - skill.Level) * GameConfig.Get <int>("mana_level_decrease")) * 0.0001f;
            value = Mathf.RoundToInt(value * (1f + (creature.GetValue(eStatType.IncreaseDamagePercent) - creature.GetValue(eStatType.DecreaseDamagePercent)) * 0.0001f + decrease));

            float duration = skill.GetDuration(buff_action, target_index);

            Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent);
            if (duration == 0f)
            {
                buff.DoAction();
            }
            else if (duration > 0f || duration == -1f)
            {
                target_creature.AddBuff(buff, skill.Info.CanStack);
            }
            else
            {
                Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name);
            }

            target_creature.SetWait();
            return(buff);
        }

        case eActionType.dot_heal:
        {
            int value = skill.GetValueWithTargetIndex(buff_action, target_index, creature.GetDamageValue());
            value = Mathf.RoundToInt(value * (1f + creature.GetValue(eStatType.IncreaseDamagePercent) * 0.0001f));

            float duration = skill.GetDuration(buff_action, target_index);

            Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent);
            if (duration == 0f)
            {
                buff.DoAction();
            }
            else if (duration > 0f || duration == -1f)
            {
                target_creature.AddBuff(buff, skill.Info.CanStack);
            }
            else
            {
                Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name);
            }
            target_creature.SetWait();

            return(buff);
        }

        case eActionType.dot_heal_mana:
        {
            int   value    = skill.GetValueWithTargetIndex(buff_action, target_index, 0);
            float decrease = (10000 - (target_creature.Level - skill.Level) * GameConfig.Get <int>("mana_level_decrease")) * 0.0001f;
            value = Mathf.RoundToInt(value * (1f + creature.GetValue(eStatType.IncreaseDamagePercent) * 0.0001f) * decrease);

            float duration = skill.GetDuration(buff_action, target_index);

            Buff buff = new Buff(target_creature, skill, buff_action, value, duration, parent);
            if (duration == 0f)
            {
                buff.DoAction();
            }
            else if (duration > 0f || duration == -1f)
            {
                target_creature.AddBuff(buff, skill.Info.CanStack);
            }
            else
            {
                Debug.LogErrorFormat("duration is invalid : {0}", buff_action.SkillInfo.Name);
            }
            target_creature.SetWait();

            return(buff);
        }
        }
        return(null);
    }
예제 #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);
    }