public override IEnumerator BeforeFlipCardImmediateResponse(FlipCardAction flip)
        {
            CardSource cardSource = flip.CardSource;

            if (cardSource == null && flip.ActionSource != null)
            {
                cardSource = flip.ActionSource.CardSource;
            }
            if (cardSource == null)
            {
                cardSource = base.GetCardSource();
            }

            if (!flip.CardToFlip.Card.IsFlipped)
            {
                IEnumerator coroutine = base.GameController.RemoveTarget(base.Card, cardSource: cardSource);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
            }
            yield break;
        }
        //private ITrigger heroPlayedTrigger;
        //private ITrigger heroUsedPowerTrigger;

        private IEnumerator SelfDestructResponse(FlipCardAction fca)
        {
            // "When {Momentum} flips, each player discards 1 card."
            IEnumerator discardCoroutine = base.GameController.EachPlayerDiscardsCards(1, 1, cardSource: GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(this.GameController.StartCoroutine(discardCoroutine));
            }
            else
            {
                this.GameController.ExhaustCoroutine(discardCoroutine);
            }

            // "Then, destroy this card."
            IEnumerator destroyCoroutine = base.DestroyThisCardResponse(fca);

            if (base.UseUnityCoroutines)
            {
                yield return(this.GameController.StartCoroutine(destroyCoroutine));
            }
            else
            {
                this.GameController.ExhaustCoroutine(destroyCoroutine);
            }
            yield break;
        }
        //When a {Tiamat} head is destroyed, flip her.
        public override IEnumerator DestroyAttempted(DestroyCardAction destroyCard)
        {
            FlipCardAction action    = new FlipCardAction(base.GameController, this, false, false, destroyCard.ActionSource);
            IEnumerator    coroutine = base.DoAction(action);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
            yield break;
        }
        private IEnumerator SelfDestructResponse(FlipCardAction fca)
        {
            // "When {Momentum} flips to its "Under Pressure" side, destroy this card and play the top card of the villain deck."
            IEnumerator destroyCoroutine = base.GameController.DestroyCard(this.DecisionMaker, this.Card, optional: false, postDestroyAction: () => base.PlayTheTopCardOfTheVillainDeckResponse(fca), actionSource: fca, responsibleCard: this.Card, cardSource: GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(this.GameController.StartCoroutine(destroyCoroutine));
            }
            else
            {
                this.GameController.ExhaustCoroutine(destroyCoroutine);
            }

            yield break;
        }
        public override IEnumerator BeforeFlipCardImmediateResponse(FlipCardAction flip)
        {
            CardSource cardSource = flip.CardSource;

            if (cardSource == null && flip.ActionSource != null)
            {
                cardSource = flip.ActionSource.CardSource;
            }
            if (cardSource == null)
            {
                cardSource = GetCardSource();
            }
            IEnumerator coroutine = base.GameController.RemoveTarget(base.Card, leavesPlayIfInPlay: true, cardSource);

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(coroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(coroutine);
            }
        }
        //override flip response to remove resetting token pools
        public override IEnumerator BeforeFlipCardImmediateResponse(FlipCardAction flip)
        {
            if (base.CardWithoutReplacements.IsFlipped)
            {
                yield break;
            }
            IEnumerable <Card> enumerable = from c in base.TurnTakerControllerWithoutReplacements.TurnTaker.GetAllCards()
                                            where c.Location.IsEnvironment && (c.Location.IsDeck || c.Location.IsTrash)
                                            select c;

            if (enumerable.Count() > 0)
            {
                IEnumerator coroutine = RemoveCardsFromGame(enumerable);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine);
                }
            }
            if (base.CardWithoutReplacements.IsTarget)
            {
                RemoveTargetAction action     = new RemoveTargetAction(base.GameController, base.CardWithoutReplacements);
                IEnumerator        coroutine2 = DoAction(action);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine2));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine2);
                }
            }
            if (base.TurnTakerControllerWithoutReplacements.IsIncapacitatedOrOutOfGame)
            {
                base.GameController.RemoveTriggers((ITrigger t) => t.CardSource != null && t.CardSource.CardController.TurnTakerControllerWithoutReplacements == base.TurnTakerControllerWithoutReplacements && !t.IsStatusEffect && !t.IsOutOfPlayTrigger && t.CardSource != null && (t.CardSource.CardController == this || !t.CardSource.Card.IsInPlayAndNotUnderCard));
                IEnumerable <Card> cards = base.TurnTakerControllerWithoutReplacements.TurnTaker.GetAllCards();
                List <Card>        list  = new List <Card>();
                list.AddRange(cards.Where((Card c) => !c.IsHeroCharacterCard).SelectMany((Card c) => c.UnderLocation.Cards.Where((Card co) => co.Owner != base.TurnTakerControllerWithoutReplacements.TurnTaker)));
                if (base.TurnTakerControllerWithoutReplacements.TurnTaker.IsHero)
                {
                    HeroTurnTaker heroTurnTaker = base.TurnTakerControllerWithoutReplacements.ToHero().HeroTurnTaker;
                    list.AddRange(from c in heroTurnTaker.Hand.Cards.Union(heroTurnTaker.Deck.Cards).Union(heroTurnTaker.Trash.Cards)
                                  where c.Owner != base.TurnTakerControllerWithoutReplacements.TurnTaker
                                  select c);
                }
                foreach (Card item in list)
                {
                    MoveCardDestination trashDestination = FindCardController(item).GetTrashDestination();
                    IEnumerator         coroutine3       = base.GameController.MoveCard(base.TurnTakerController, item, trashDestination.Location, trashDestination.ToBottom);
                    if (base.UseUnityCoroutines)
                    {
                        yield return(base.GameController.StartCoroutine(coroutine3));
                    }
                    else
                    {
                        base.GameController.ExhaustCoroutine(coroutine3);
                    }
                }
                if (base.Game.IsOblivAeonMode)
                {
                    IEnumerable <Card> enumerable2 = FindCardsWhere((Card c) => c.IsObjective && c.IsInLocation(base.TurnTakerControllerWithoutReplacements.TurnTaker.PlayArea));
                    Log.Debug("Objectives: " + enumerable2.ToRecursiveString());
                    if (enumerable2.Count() > 0)
                    {
                        TurnTaker   turnTaker  = FindTurnTakersWhere((TurnTaker tt) => tt.Identifier == "OblivAeon", ignoreBattleZone: true).FirstOrDefault();
                        IEnumerator coroutine4 = base.GameController.BulkMoveCards(base.TurnTakerController, enumerable2, turnTaker.FindSubDeck("MissionDeck"), toBottom: true, performBeforeDestroyActions: true, null, isDiscard: false, GetCardSource());
                        if (base.UseUnityCoroutines)
                        {
                            yield return(base.GameController.StartCoroutine(coroutine4));
                        }
                        else
                        {
                            base.GameController.ExhaustCoroutine(coroutine4);
                        }
                    }
                    IEnumerable <Card> enumerable3 = FindCardsWhere((Card c) => c.DoKeywordsContain("reward", evenIfUnderCard: true, evenIfFaceDown: true) && !c.IsOutOfGame && c.Owner == base.TurnTakerControllerWithoutReplacements.TurnTaker && (!c.IsUnderCard || !c.Location.OwnerCard.IsIncapacitated), realCardsOnly: false, null, ignoreBattleZone: true);
                    if (enumerable3.Count() > 0)
                    {
                        IEnumerator coroutine5 = base.GameController.BulkMoveCards(base.TurnTakerController, enumerable3, base.Card.UnderLocation);
                        if (base.UseUnityCoroutines)
                        {
                            yield return(base.GameController.StartCoroutine(coroutine5));
                        }
                        else
                        {
                            base.GameController.ExhaustCoroutine(coroutine5);
                        }
                    }
                }
                IEnumerator coroutine6 = RemoveCardsFromGame(cards);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine6));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine6);
                }

                IEnumerator coroutine7 = base.GameController.UpdateTurnPhasesForTurnTaker(base.TurnTakerControllerWithoutReplacements, incapacitated: true);
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(coroutine7));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(coroutine7);
                }
            }
            else
            {
                RemoveAllTriggers();
            }
        }