public void AddStatusEffect(ActorEffect statusEffect) { if (statusEffect.effectType == EffectType.BUFF || statusEffect.effectType == EffectType.DEBUFF) { if (statusEffect is SourcedActorEffect namedEffect) { buffEffects.Add(namedEffect); statusEffect.OnApply(); Data.UpdateActorData(); } else { Debug.Log("Should not have buff type."); } } else { List <ActorEffect> existingStatus = statusEffects.FindAll(x => x.GetType() == statusEffect.GetType()); if (statusEffect.Source.GetActorType() != this.GetActorType()) { statusEffect.duration *= Data.AfflictedStatusDuration; } int stackCount; if (existingStatus.Count > 0 && statusEffect.StacksIncrementExistingEffect) { stackCount = existingStatus[0].Stacks; } else { stackCount = existingStatus.Count; } if (statusEffect.StacksIncrementExistingEffect && stackCount > 0) { if (stackCount < statusEffect.MaxStacks) { existingStatus[0].SetStacks(existingStatus[0].Stacks + 1); } return; } else { if (stackCount == statusEffect.MaxStacks) { ActorEffect effectToRemove = existingStatus.Find(x => x.GetSimpleEffectValue() < statusEffect.GetSimpleEffectValue()); if (effectToRemove != null) { RemoveStatusEffect(effectToRemove, true); } else { existingStatus.OrderBy(x => x.duration).First().RefreshDuration(statusEffect.duration); return; } } else if (stackCount > statusEffect.MaxStacks) { return; } } statusEffects.Add(statusEffect); //Debug.Log(Data.Name + " " + statusEffect + " " + statusEffect.GetSimpleEffectValue()); statusEffect.OnApply(); actorTags.Add(statusEffect.StatusTag); Data.UpdateActorData(); } }