예제 #1
0
    public bool Update()
    {
        float playback_time = m_Creature.Character.PlaybackTime;
        float past_time     = playback_time - StartTime;

        float percent = past_time / Duration;

        if (BuffContainer.Asset != null)
        {
            BuffContainer.Asset.OnUpdate(percent, AffectValuePercent);
        }

        bool is_finish = false;

        if (Action != null && Action.Update(playback_time) == false || Parent != null && Parent.IsFinish == true)
        {
            is_finish = true;
        }
        if (Action == null && Parent == null && past_time >= Duration && Duration != -1f)
        {
            is_finish = true;
        }

        if (IsFinish == true)
        {
            if (Action == null || is_finish == true)
            {
                return(false);
            }
            return(true);
        }

        if (BattleBase.Instance.IsBattleEnd == true)
        {
            return(true);
        }

        switch (ActionInfo.actionType)
        {
        case eActionType.dot_damage:
        case eActionType.dot_heal:
            if ((past_time - m_DotTime >= m_DotTick || is_finish == true))
            {
                m_DotValue = Value * (past_time - m_LastUpdateTime);
                int hit_value = (int)m_DotValue;
                m_DotValue      -= hit_value;
                m_LastUpdateTime = past_time;

                bool is_critical = false;
                if (BattleConfig.Instance.UseCritical && Skill.IsLeaderActive == false)
                {
                    is_critical = MNS.Random.Instance.NextRange(1, 10000) <= Skill.Creature.GetValue(eStatType.CriticalChance);
                    if (is_critical == false)
                    {
                        is_critical = ((m_Creature.IsTeam != Skill.Creature.IsTeam && (m_Creature.CanAction(Skill) == false || m_Creature.IsPlayingAction) || m_Creature.IsTeam == Skill.Creature.IsTeam && !(m_Creature.CanAction() == false || m_Creature.IsPlayingAction)));
                    }
                }

                int critical_power = Skill.Creature.GetValue(eStatType.CriticalPower);

                eTextPushType push_type = is_critical ? eTextPushType.CriticalDot : eTextPushType.Dot;
                if (is_critical)
                {
                    hit_value = hit_value * critical_power / 10000;
                }

                if (ActionInfo.actionType == eActionType.dot_damage)
                {
                    if (m_Creature.InvokeImmune(eImmuneType.dot, Skill.Creature.Info.AttackType, Skill.Level) == false)
                    {
                        if (Skill.Creature != null)
                        {
                            Skill.Creature.AddDeal(-hit_value);
                        }

                        m_Creature.SetDamage(hit_value, true);
                        TextManager.Instance.PushDamage(Skill.Creature.Info.AttackType == SharedData.eAttackType.physic, m_Creature, hit_value, push_type);

                        float damage_percent = -hit_value / (float)m_Creature.Stat.MaxHP;
                        m_Creature.AddMP(eMPFillType.Damage, damage_percent);

                        if (Skill.IsDefault == true)
                        {
                            Skill.Creature.AddMP(eMPFillType.Deal, damage_percent);
                        }

                        ActionInfo.Fire(Skill, eActionType.dot_damage, hit_value);
                    }
                }
                else
                {
                    m_Creature.SetHeal(hit_value, true);
                    TextManager.Instance.PushHeal(m_Creature, hit_value, push_type);

                    if (Skill.IsDefault == true)
                    {
                        float heal_percent = hit_value / (float)m_Creature.Stat.MaxHP;
                        Skill.Creature.AddMP(eMPFillType.Heal, heal_percent);
                    }
                }
                m_DotTime += m_DotTick;
            }

            break;

        case eActionType.dot_damage_mana:
        case eActionType.dot_heal_mana:
            if ((past_time - m_DotTime >= m_DotTick || is_finish == true))
            {
                m_DotValue = Value * (past_time - m_LastUpdateTime);
                int hit_value = (int)m_DotValue;
                m_DotValue      -= hit_value;
                m_LastUpdateTime = past_time;

                bool is_critical = false;
                if (BattleConfig.Instance.UseCritical && Skill.IsLeaderActive == false)
                {
                    is_critical = MNS.Random.Instance.NextRange(1, 10000) <= Skill.Creature.GetValue(eStatType.CriticalChance);
                    if (is_critical == false)
                    {
                        is_critical = ((m_Creature.IsTeam != Skill.Creature.IsTeam && (m_Creature.CanAction(Skill) == false || m_Creature.IsPlayingAction) || m_Creature.IsTeam == Skill.Creature.IsTeam && !(m_Creature.CanAction() == false || m_Creature.IsPlayingAction)));
                    }
                }

                int critical_power = Skill.Creature.GetValue(eStatType.CriticalPower);

                eTextPushType push_type = is_critical ? eTextPushType.CriticalDot : eTextPushType.Dot;
                if (is_critical)
                {
                    hit_value = hit_value * critical_power / 10000;
                }

                if (ActionInfo.actionType == eActionType.dot_damage_mana)
                {
                    if (m_Creature.InvokeImmune(eImmuneType.dot, Skill.Creature.Info.AttackType, Skill.Level) == false)
                    {
                        m_Creature.SetDamageMana(hit_value, true);
                        TextManager.Instance.PushMana(m_Creature, hit_value, push_type);
                    }
                }
                else
                {
                    m_Creature.SetHealMana(hit_value, true);
                    TextManager.Instance.PushMana(m_Creature, hit_value, push_type);
                }
                m_DotTime += m_DotTick;
            }

            break;
        }

        if (is_finish)
        {
            IsFinish = true;
            return(false);
        }
        return(true);
    }