Пример #1
0
 // 지속 효과 적용 방안
 // 버그 발생 확인 필요 : lambda로 캡쳐한 변수가 시간이 지나면 달라질 수 있음
 // 해결 방안 2 : Timer에는 id만 보내고 실제 내용은 CharacterPara에 LinkedList 만들어서 관리하기
 protected void ApplyPersistEffect(CUseEffect.PersistEffect persistEffect)
 {
     // 초기화 값이 들어가는거 방지용
     if (persistEffect.IsValid())
     {
         _buffTimer.Register(persistEffect.id, persistEffect.time, persistEffect.maxStack, persistEffect.increaseStack,
                             (int buffStack) => StartPersistEffect(persistEffect, buffStack),
                             (int buffStack) => EndPersistEffect(persistEffect, buffStack));
     }
 }
Пример #2
0
    private static string CreatePersistEffectText(CUseEffect.PersistEffect persist)
    {
        if (!persist.IsValid())
        {
            return("");
        }

        StringBuilder sb = new StringBuilder();

        sb.Append(persist.time + "초 동안 ");

        // 틱 데미지(할)
        if (persist.HasTickHpChange())
        {
            sb.Append(persist.TickPeriod + "초 마다 ")
            .Append(CreateHpChangeText(persist.TickHpChange));
        }

        // 능력치 강화
        foreach (var ability in persist.changeAbilities)
        {
            if (!ability.IsValid())
            {
                continue;
            }

            if (!AbilityNameDict.TryGetValue(ability.ability, out string abilityName))
            {
                abilityName = "??";
            }
            string increasePerStackStr = ability.increasePerStack != 1 ? ability.increasePerStack.ToString() : "";
            sb.Append(abilityName + " " + ability.increaseBase + "+" + increasePerStackStr + "n% 만큼 ");
            sb.AppendLine(ability.isBuff ? "증가" : "감소");
        }

        sb.Append("최대 " + persist.maxStack + "중첩");

        CreateStackAccumulateEffectText(persist.stackAccumulateEffect);

        return(sb.ToString() + "\n");
    }
Пример #3
0
    // 지속 효과 끝
    protected void EndPersistEffect(CUseEffect.PersistEffect persistEffect, int stack)
    {
        // 지속 데미지(힐) 관련은 CCharacterPara에서 Update or Coroutine으로 관리
        // Coroutine 사용 이유 : 체력 변화는 오직 CCharacterPara 안에서만 일어나는 일
        // 체력 변화 대상 관리 등 복잡한 연산은 Timer에서 수행
        _DoTList.Remove(_DoTList.Find(x => x.id == persistEffect.id));

        // CC 관련

        // 능력치 변화 관련
        foreach (var changeAbility in persistEffect.changeAbilities)
        {
            EndChangeAbility(changeAbility, stack);
        }

        // 스택 효과 관련
        if (_buffTimer.GetBuffStack(persistEffect.id) <= 0)
        {
            _PersistStackList.Remove(_PersistStackList.Find(x => x.id == persistEffect.id));
        }
    }
Пример #4
0
    // 지속 효과 시작
    protected void StartPersistEffect(CUseEffect.PersistEffect persistEffect, int stack)
    {
        // 지속 데미지(힐) 관련은 CCharacterPara에서 Update or Coroutine으로 관리
        // Coroutine 사용 이유 : 체력 변화는 오직 CCharacterPara 안에서만 일어나는 일
        // 체력 변화 대상 관리 등 복잡한 연산은 Timer에서 수행
        if (persistEffect.TickHpChange.IsValid() && _DoTList.Find(x => x.id == persistEffect.id) == null)
        {
            _DoTList.Add(new DamageOfTime(persistEffect.id, persistEffect.TickHpChange, DamageOfTime.TimeBonus, persistEffect.TickPeriod));
        }

        // CC 관련

        // 능력치 변화 관련
        foreach (var changeAbility in persistEffect.changeAbilities)
        {
            StartChangeAbility(changeAbility, stack);
        }

        // 스택 추가 효과 관련
        StackAccumalateEffect(persistEffect.id, persistEffect.stackAccumulateEffect);
    }