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