Example #1
0
    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();
        }
    }