// 지속 효과 적용 방안 // 버그 발생 확인 필요 : 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)); } }
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"); }
// 지속 효과 끝 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)); } }
// 지속 효과 시작 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); }