public virtual void ClearDecks()
    {
        if (!AbilityDiscard.IsEmpty)
        {
            AbilityDiscard.Empty();
            RaiseDiscard(AbilityDiscard);
        }

        if (!AbilityDeck.IsEmpty)
        {
            AbilityDeck.Empty();
            RaiseMain(AbilityDeck);
        }

        if (!Hand.IsEmpty)
        {
            Hand.Empty();
            RaiseHand(Hand);
        }

        if (!BoostDeck.IsEmpty)
        {
            BoostDeck.Empty();
            RaiseBoost(BoostDeck);
        }
    }
    // TODO I don't think it's best that this goes here, but I don't know a better way to organize it yet
    // TODO these if checks are kinda disgusting
    IEnumerator AbilityCardSelection(AbilityCard card, int index)
    {
        SelectedAbilityCard?.Invoke(card);
        if (_selectedAudio)
        {
            AudioHelper.PlayClip2D(_selectedAudio, 0.5f);
        }
        yield return(new WaitForEndOfFrame());

        while (true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                RaycastHit hit   = GetPointerRaycast();
                BoardSpace space = hit.collider?.GetComponent <BoardSpace>();
                if (space != null) // && hit.collider.gameObject.layer == LayerMask.NameToLayer("PlayerSpace"))
                {
                    if (!space.UseCard(card))
                    {
                        EndedSelection?.Invoke();
                        _abilityRoutine = null;
                        yield break;
                    }
                    Actions -= card.Cost;
                    Hand.Remove(index);
                    AbilityDiscard.Add(card);

                    RaiseActions(Actions);
                    RaiseDiscard(AbilityDiscard);
                    RaiseHand(Hand);
                    EndedSelection?.Invoke();

                    _abilityRoutine = null;
                    yield break;
                }
                else
                {
                    if (_clickFailAudio)
                    {
                        AudioHelper.PlayClip2D(_clickFailAudio, 0.5f);
                    }
                }
            }
            else if (Input.GetMouseButtonDown(1))
            {
                EndedSelection?.Invoke();
                if (_droppedAudio)
                {
                    AudioHelper.PlayClip2D(_droppedAudio, 0.5f);
                }
                _abilityRoutine = null;
                yield break;
            }

            yield return(null);
        }
    }
    public virtual void PlayAbilityCard(int index)
    {
        AbilityCard targetCard = Hand.GetCard(index);

        if (targetCard != null && Actions > 0 && Actions >= targetCard.Cost)
        {
            targetCard.Play();
            Actions -= targetCard.Cost;
            Hand.Remove(index);
            AbilityDiscard.Add(targetCard);

            RaiseActions(Actions);
            RaiseDiscard(AbilityDiscard);
            RaiseHand(Hand);
        }
    }
 public virtual void ReshuffleDiscard()
 {
     // add event for reshuffling discard feedback?
     if (AbilityDiscard.Count > 0)
     {
         int _discardCount = AbilityDiscard.Count;
         for (int i = 0; i < _discardCount; i++)
         {
             // TODO might do something more here with the Add(List<T> function)
             AbilityDeck.Add(AbilityDiscard.Draw());
         }
         RaiseMain(AbilityDeck);
         RaiseDiscard(AbilityDiscard);
     }
     // shuffle ability deck only if it contains more than 1 item
     if (AbilityDeck.Count > 1)
     {
         AbilityDeck.Shuffle();
     }
 }