public void RemoveStatusEffect(StatusEffectInstance statusEffectInstance)
    {
        var removed = StatusEffectInstances.Remove(statusEffectInstance);

        if (!removed)
        {
            return;
        }

        var effects = statusEffectInstance.StatusEffect.Effects
                      .Where(effect => effect is IOnApplyPassiveEffect)
                      .Cast <IOnApplyPassiveEffect>();

        foreach (var effect in effects)
        {
            effect.OnUnapply(this);
        }

        RecalculateStats();

        if (statusEffectInstance.StatusEffect.Type != StatusEffect.StatusEffectType.None || statusEffectInstance.StatusEffect.CustomIcon != null)
        {
            RebuildStatusEffectIcons();
        }
    }
    public async Task TurnStart()
    {
        CurrentAp += GameSettings.Instance.ApGain;
        Debug.Log($"Começou o turno de {BattlerName}");

        StatusEffectInstances.ForEach(instance => { instance.TurnDuration--; });

        var expiredStatusEffects = StatusEffectInstances
                                   .Where(statusEffect => statusEffect.TurnDuration < 0)
                                   .ToArray();

        await Task.WhenAll(expiredStatusEffects
                           .Select(RemoveStatusEffectAsync));

        var effectsFromPassives = Passives
                                  .SelectMany(passive => passive.Effects
                                              .Where(effect => effect is ITurnStartPassiveEffect)
                                              .Select(effect => (passive as object, effect))).ToArray();

        var effectsFromStatuses = StatusEffectInstances
                                  .SelectMany(instance => instance.StatusEffect.Effects
                                              .Where(effect => effect is ITurnStartPassiveEffect)
                                              .Select(effect => (instance as object, effect))).ToArray();

        var turnStartEffects = effectsFromPassives
                               .Concat(effectsFromStatuses)
                               .OrderByDescending(turnStartEffect => turnStartEffect.effect.Priority)
                               .Select(turnStartEffect => (turnStartEffect.Item1, turnStartEffect.Item2 as ITurnStartPassiveEffect))
                               .ToArray();

        foreach (var turnStartPassive in turnStartEffects)
        {
            if (turnStartPassive.Item1 is Passive passive)
            {
                await turnStartPassive.Item2.OnTurnStart(new PassiveEffectInfo
                {
                    PassiveEffectSourceName = passive.PassiveName,
                    Source = this,
                    Target = this
                });
            }
            else if (turnStartPassive.Item1 is StatusEffectInstance statusEffectInstance)
            {
                await turnStartPassive.Item2.OnTurnStart(new PassiveEffectInfo
                {
                    PassiveEffectSourceName = statusEffectInstance.StatusEffect.StatusEffectName,
                    Source = statusEffectInstance.Source,
                    Target = statusEffectInstance.Target
                });
            }
            else
            {
                throw new ArgumentException();
            }
        }
    }
    public void ApplyStatusEffect(StatusEffectInstance statusEffectInstance)
    {
        var statusEffect        = statusEffectInstance.StatusEffect;
        var appliedStatusEffect = StatusEffectInstances.FirstOrDefault(sI => sI.StatusEffect == statusEffect);

        if (appliedStatusEffect != null)
        {
            if (statusEffectInstance.TurnDuration > appliedStatusEffect.TurnDuration)
            {
                appliedStatusEffect.TurnDuration = statusEffectInstance.TurnDuration;
            }
            return;
        }

        var cancellable            = statusEffect.Cancels;
        var cancelledStatusEffects = StatusEffectInstances
                                     .Where(sI => cancellable.Contains(sI.StatusEffect)).ToArray();

        foreach (var cancelledStatusEffect in cancelledStatusEffects)
        {
            RemoveStatusEffect(cancelledStatusEffect);
        }

        StatusEffectInstances.Add(statusEffectInstance);
        var effects = statusEffectInstance.StatusEffect.Effects
                      .Where(effect => effect is IOnApplyPassiveEffect)
                      .Cast <IOnApplyPassiveEffect>();

        foreach (var effect in effects)
        {
            effect.OnApply(this);
        }

        RecalculateStats();

        if (statusEffect.Type != StatusEffect.StatusEffectType.None ||
            statusEffectInstance.StatusEffect.CustomIcon != null)
        {
            RebuildStatusEffectIcons();
        }
    }