예제 #1
0
    // Removing elements in iteration must be performed outside of foreach loop. Store its index and then delete it later.
    public void RemovePhysicalEffect(PhysicalEffectType type)
    {
        switch (type)
        {
        case PhysicalEffectType.Bleed:
            m_bleedEffects = 0;

            var indexList = new List <int>();
            for (int i = 0; i < physicalEffects.Count; i++)
            {
                if (physicalEffects[i] is Bleed)
                {
                    indexList.Add(i);
                }
            }

            foreach (var t in indexList)
            {
                Destroy(physicalEffects[t].gameObject);
                physicalEffects.RemoveAt(t);
            }

            break;

        case PhysicalEffectType.Infect:
            m_infectEffects = 0;

            var indexListI = new List <int>();
            for (int i = 0; i < physicalEffects.Count; i++)
            {
                if (physicalEffects[i] is Infect)
                {
                    indexListI.Add(i);
                }
            }

            foreach (var t in indexListI)
            {
                Destroy(physicalEffects[t].gameObject);
                physicalEffects.RemoveAt(t);
            }

            break;

        case PhysicalEffectType.Stun:
            if (m_stunEffects > 0)
            {
                m_stunEffects = 0;

                var index = 0;
                for (int i = 0; i < physicalEffects.Count; i++)
                {
                    if (physicalEffects[i] is Stun)
                    {
                        index = i;
                    }
                }

                Destroy(physicalEffects[index].gameObject);
                physicalEffects.RemoveAt(index);
            }
            break;

        case PhysicalEffectType.Buff:
            break;

        default:
            break;
        }
    }
예제 #2
0
    IEnumerator TakeEffectRoutine(Actor attacker, bool hasMentalEffect, int mentalDMG, bool hasPhysicalEffect, PhysicalEffectType type, int pow, int dur)
    {
        while (Commander.instance.IsActing)
        {
            yield return(null);
        }

        yield return(StartCoroutine(MentalEffectRoutine(attacker, hasMentalEffect, mentalDMG)));

        // Should Wait for Affliction check

        Commander.instance.IsMentalActing = Commander.instance.turnStateMachine.IsStillMentalActing();

        while (Commander.instance.IsMentalActing)
        {
            yield return(null);

            Commander.instance.IsMentalActing = Commander.instance.turnStateMachine.IsStillMentalActing();
        }

        yield return(new WaitForSeconds(0.1f));

        if (!hasPhysicalEffect)
        {
            m_isSubActionOver = true;
            yield break;
        }
        yield return(StartCoroutine(PhysicalEffectRoutine(type, pow, dur)));
    }
예제 #3
0
    protected virtual IEnumerator PhysicalEffectRoutine(PhysicalEffectType type, int pow, int dur)
    {
        if (this.onDodge)
        {
            m_isSubActionOver = true;
            yield break;
        }

        // Resistance Check
        switch (type)
        {
        case PhysicalEffectType.Bleed:
            var bRoll = Random.Range(0, 1f);
            if (bRoll <= this.m_bleedRes)
            {
                UIManager.instance.CreateEffect("BleedResist", this, 0);
                isResisted = true;
            }
            else
            {
                isResisted = false;
            }

            break;

        case PhysicalEffectType.Infect:
            var iRoll = Random.Range(0, 1f);
            if (iRoll <= this.m_infectRes)
            {
                UIManager.instance.CreateEffect("InfectResist", this, 0);
                isResisted = true;
            }
            else
            {
                isResisted = false;
            }

            break;

        case PhysicalEffectType.Stun:
            var sRoll = Random.Range(0, 1f);
            if (sRoll <= this.m_stunRes)
            {
                UIManager.instance.CreateEffect("StunResist", this, 0);
                isResisted = true;
            }
            else
            {
                isResisted = false;
            }

            break;

        case PhysicalEffectType.Move:

            // If this.isActive, then that means this character is casting moving forward skill
            if (!this.isActive)
            {
                var mRoll = Random.Range(0, 1f);
                if (mRoll <= this.m_moveRes)
                {
                    UIManager.instance.CreateEffect("MoveResist", this, 0);
                    isResisted = true;
                }
                else
                {
                    isResisted = false;
                }
            }

            break;

        default:
            break;
        }

        if (isResisted)
        {
            SoundManager.Instance.PlaySE(20);
            onCrit            = false;
            m_isSubActionOver = true;
            isResisted        = false;
            yield break;
        }

        Debug.Log("Actor Physical Effect Routine");
        var typeNumber = (int)type;

        var effectObject = Instantiate(Commander.instance.physicalEffectPrefabs[typeNumber]);

        effectObject.transform.SetParent(this.gameObject.transform);

        if (this is BaseCharacter)
        {
            effectObject.transform.localPosition = effectsPositions[typeNumber];
        }
        else
        {
            effectObject.transform.localPosition = effectsPositions[typeNumber] + enemyCorrection;
        }

        var effect = effectObject.GetComponent <PhysicalEffect>();

        effect.SetEffect(pow, dur, this);

        yield return(new WaitForSeconds(setEffectDelay));

        this.SetPhysicalEffect(effect);

        yield return(new WaitForSeconds(0.1f));

        if (effect is Move)
        {
            // Swap Position
            Destroy(effectObject, 1f);

            physicalEffects.Remove(effect);
        }

        onCrit            = false;
        m_isSubActionOver = true;
    }
예제 #4
0
    public void TakeEffect(Actor attacker, bool hasMentalEffect, int mentalDMG, bool hasPhysicalEffect, PhysicalEffectType type, int pow, int dur)
    {
        m_isSubActionOver = false;

        StartCoroutine(TakeEffectRoutine(attacker, hasMentalEffect, mentalDMG, hasPhysicalEffect, type, pow, dur));
    }