public IEnumerator DestroyReplaceResponse(GameAction ga)
        {
            // "... destroy {H - 1} Equipment cards."
            List <DestroyCardAction> destroyed       = new List <DestroyCardAction>();
            LinqCardCriteria         equipmentInPlay = new LinqCardCriteria((Card c) => c.DoKeywordsContain("equipment") && c.IsInPlayAndHasGameText && base.GameController.IsCardVisibleToCardSource(c, GetCardSource()), "Equipment");
            IEnumerator destroyCoroutine             = base.GameController.SelectAndDestroyCards(DecisionMaker, equipmentInPlay, H - 1, requiredDecisions: H - 1, storedResultsAction: destroyed, responsibleCard: base.Card, allowAutoDecide: base.GameController.FindCardsWhere(equipmentInPlay).Count() <= H - 1, cardSource: GetCardSource());

            if (base.UseUnityCoroutines)
            {
                yield return(base.GameController.StartCoroutine(destroyCoroutine));
            }
            else
            {
                base.GameController.ExhaustCoroutine(destroyCoroutine);
            }
            // "If fewer than {H - 1} cards were destroyed this way, replace the hero character card with the highest HP with a variant of that hero."
            if (destroyed.Where((DestroyCardAction dca) => dca.WasCardDestroyed).Count() < H - 1)
            {
                List <Card> highest       = new List <Card>();
                IEnumerator findCoroutine = base.GameController.FindTargetWithHighestHitPoints(1, (Card c) => c.IsHeroCharacterCard, highest, evenIfCannotDealDamage: true, cardSource: GetCardSource());
                if (base.UseUnityCoroutines)
                {
                    yield return(base.GameController.StartCoroutine(findCoroutine));
                }
                else
                {
                    base.GameController.ExhaustCoroutine(findCoroutine);
                }
                Card highestHero = highest.FirstOrDefault();
                if (highestHero != null)
                {
                    // Replace highestHero with another variant
                    // Copy-pasted from Completionist Guise, be careful
                    // If you selected a hero to store...
                    List <string> list = new List <string>();
                    list.Add(highestHero.ParentDeck.QualifiedIdentifier);
                    list.Add(highestHero.QualifiedPromoIdentifierOrIdentifier);
                    base.GameController.AddCardPropertyJournalEntry(highestHero, "OverrideTurnTaker", list);
                    List <SelectFromBoxDecision> storedBox           = new List <SelectFromBoxDecision>();
                    Func <string, bool>          identifierCriteria2 = delegate(string s)
                    {
                        if (FindCardsWhere((Card c) => (c.Identifier == highestHero.Identifier || (highestHero.SharedIdentifier != null && highestHero.SharedIdentifier == c.SharedIdentifier)) && c.QualifiedPromoIdentifierOrIdentifier == s && c.Owner.CharacterCards.Contains(c)).Any())
                        {
                            return(false);
                        }
                        if (highestHero.SharedIdentifier != null)
                        {
                            string         identifier      = highestHero.Identifier;
                            CardDefinition cardDefinition2 = highestHero.ParentDeck.GetAllCardDefinitions().FirstOrDefault((CardDefinition d) => d.QualifiedPromoIdentifierOrIdentifier == s);
                            if (cardDefinition2 == null)
                            {
                                cardDefinition2 = ModHelper.GetPromoDefinition(highestHero.ParentDeck.QualifiedIdentifier, s);
                            }
                            if (cardDefinition2 != null)
                            {
                                return(cardDefinition2.Identifier == identifier);
                            }
                            return(false);
                        }
                        if (highestHero.ParentDeck.InitialCardIdentifiers.Count() > 1)
                        {
                            IEnumerable <Card> source = FindCardsWhere((Card c) => c.Identifier == highestHero.Identifier && c.Owner.CharacterCards.Contains(c) && (c.PromoIdentifierOrIdentifier.Contains(s) || s.Contains(c.PromoIdentifierOrIdentifier)));
                            source.Select((Card c) => c.PromoIdentifierOrIdentifier);
                            return(source.Any((Card c) => c.PromoIdentifierOrIdentifier != s));
                        }
                        return(true);
                    };
                    Func <string, bool> turnTakerCriteria2 = (string tt) => tt == highestHero.ParentDeck.QualifiedIdentifier;
                    // Choose replacement hero
                    IEnumerator coroutine = base.GameController.SelectFromBox(DecisionMaker, identifierCriteria2, turnTakerCriteria2, SelectionType.HeroCharacterCard, storedBox, optional: false, allowMultiCardSelection: false, GetCardSource());
                    if (base.UseUnityCoroutines)
                    {
                        yield return(base.GameController.StartCoroutine(coroutine));
                    }
                    else
                    {
                        base.GameController.ExhaustCoroutine(coroutine);
                    }
                    CardController        newCC               = null;
                    SelectFromBoxDecision selection           = storedBox.FirstOrDefault();
                    TurnTakerController   turnTakerController = FindTurnTakerController(highestHero.Owner);
                    if (selection != null && selection.SelectedIdentifier != null && selection.SelectedTurnTakerIdentifier != null)
                    {
                        Log.Debug("Selected from box: SelectedIdentifier = " + selection.SelectedIdentifier);
                        Log.Debug("Selected from box: SelectedTurnTakerIdentifier = " + selection.SelectedTurnTakerIdentifier);
                        Card modelCard = FindCardsWhere((Card c) => c.QualifiedPromoIdentifierOrIdentifier == selection.SelectedIdentifier && !c.Owner.CharacterCards.Contains(c), realCardsOnly: false, null, ignoreBattleZone: true).FirstOrDefault();
                        if (modelCard == null)
                        {
                            Log.Debug("Creating a card for the variant");
                            DeckDefinition parentDeck = highestHero.ParentDeck;
                            Log.Debug("Owner deck definition: " + parentDeck);
                            CardDefinition cardDefinition = (from cd in parentDeck.CardDefinitions.Concat(parentDeck.PromoCardDefinitions)
                                                             where cd.QualifiedPromoIdentifierOrIdentifier == selection.SelectedIdentifier
                                                             select cd).FirstOrDefault();
                            if (cardDefinition == null)
                            {
                                cardDefinition = ModHelper.GetPromoDefinition(selection.SelectedTurnTakerIdentifier, selection.SelectedIdentifier);
                            }
                            Log.Debug("Card definition: " + cardDefinition);
                            if (cardDefinition != null)
                            {
                                // modelCard: the new card being created
                                modelCard = new Card(cardDefinition, base.TurnTaker, 0, selection.UseFoilVersion);
                                base.TurnTaker.OffToTheSide.AddCard(modelCard);
                                Log.Debug("Creating card controller!");
                                string overrideNamespace = selection.SelectedTurnTakerIdentifier;
                                if (!string.IsNullOrEmpty(cardDefinition.Namespace))
                                {
                                    overrideNamespace = $"{cardDefinition.Namespace}.{parentDeck.Identifier}";
                                }
                                newCC = CardControllerFactory.CreateInstance(modelCard, base.TurnTakerController, overrideNamespace);
                                base.TurnTakerController.AddCardController(newCC);
                                List <string> list2 = new List <string>();
                                list2.Add(selection.SelectedTurnTakerIdentifier);
                                list2.Add(selection.SelectedIdentifier);
                                base.GameController.AddCardPropertyJournalEntry(modelCard, "OverrideTurnTaker", list2);
                                if (modelCard.SharedIdentifier != null)
                                {
                                    // enumerable2: all cards from parentDeck that match modelCard's SharedIdentifier but not its QualifiedPromoIdentifierOrIdentifier
                                    IEnumerable <CardDefinition> enumerable2 = from cd in parentDeck.GetAllCardDefinitions()
                                                                               where cd.QualifiedPromoIdentifierOrIdentifier != modelCard.QualifiedPromoIdentifierOrIdentifier && cd.SharedIdentifier == modelCard.SharedIdentifier
                                                                               select cd;
                                    if (modelCard.IsPromoCard && modelCard.IsModContent)
                                    {
                                        IEnumerable <CardDefinition> second = from cd in ModHelper.GetSharedPromoDefinitions(cardDefinition)
                                                                              where cd.QualifiedPromoIdentifierOrIdentifier != modelCard.QualifiedPromoIdentifierOrIdentifier
                                                                              select cd;
                                        enumerable2 = enumerable2.Concat(second);
                                    }
                                    foreach (CardDefinition item3 in enumerable2)
                                    {
                                        Card card = new Card(item3, base.TurnTaker, 0);
                                        base.TurnTaker.OffToTheSide.AddCard(card);
                                        CardController card2 = CardControllerFactory.CreateInstance(card, base.TurnTakerController, overrideNamespace);
                                        base.TurnTakerController.AddCardController(card2);
                                        List <string> list3 = new List <string>();
                                        list3.Add(modelCard.ParentDeck.QualifiedIdentifier);
                                        list3.Add(card.QualifiedPromoIdentifierOrIdentifier);
                                        base.GameController.AddCardPropertyJournalEntry(card, "OverrideTurnTaker", list3);
                                    }
                                }
                            }
                            else
                            {
                                Log.Error("Could not find card definition: " + selection.SelectedIdentifier);
                            }
                        }
                        else
                        {
                            newCC = FindCardController(modelCard);
                        }
                        if (newCC != null)
                        {
                            if (highestHero.SharedIdentifier != null)
                            {
                                Log.Debug("Shared identifier: " + highestHero.SharedIdentifier);
                                List <Card> list4 = turnTakerController.TurnTaker.OffToTheSide.Cards.Where((Card c) => c.SharedIdentifier == highestHero.SharedIdentifier).ToList();
                                foreach (Card otherSize in list4)
                                {
                                    Log.Debug("Switching other card: " + otherSize.QualifiedPromoIdentifierOrIdentifier);
                                    if (base.GameController.GetCardPropertyJournalEntryStringList(base.Card, "OverrideTurnTaker", supressWarnings: true) == null)
                                    {
                                        List <string> list5 = new List <string>();
                                        list5.Add(newCC.Card.ParentDeck.QualifiedIdentifier);
                                        list5.Add(otherSize.QualifiedPromoIdentifierOrIdentifier);
                                        base.GameController.AddCardPropertyJournalEntry(otherSize, "OverrideTurnTaker", list5);
                                    }
                                    Card card3 = base.TurnTaker.GetCardsWhere((Card c) => c.Identifier == otherSize.Identifier && c.SharedIdentifier == newCC.Card.SharedIdentifier).FirstOrDefault();
                                    if (card3 != null)
                                    {
                                        IEnumerator coroutine2 = base.GameController.SwitchCards(otherSize, card3, playCardIfMovingToPlayArea: false, ignoreFlipped: false, ignoreHitPoints: false, GetCardSource());
                                        if (base.UseUnityCoroutines)
                                        {
                                            yield return(base.GameController.StartCoroutine(coroutine2));
                                        }
                                        else
                                        {
                                            base.GameController.ExhaustCoroutine(coroutine2);
                                        }
                                    }
                                    else
                                    {
                                        Log.Warning("Could not find Guise's copy of the card!");
                                    }
                                }
                            }
                            coroutine = base.GameController.SwitchCards(highestHero, newCC.Card, playCardIfMovingToPlayArea: false, ignoreFlipped: false, ignoreHitPoints: false, GetCardSource());
                            if (base.UseUnityCoroutines)
                            {
                                yield return(base.GameController.StartCoroutine(coroutine));
                            }
                            else
                            {
                                base.GameController.ExhaustCoroutine(coroutine);
                            }
                            if (newCC.TurnTaker.IsHero && newCC.Card.HitPoints > newCC.Card.MaximumHitPoints)
                            {
                                newCC.Card.SetHitPoints(newCC.Card.MaximumHitPoints.Value);
                            }
                            if (newCC.Card.IsTarget && !highestHero.HitPoints.HasValue)
                            {
                                newCC.Card.RemoveTarget();
                            }
                            Card cardToMove = highestHero;
                            coroutine = base.GameController.MoveCard(base.TurnTakerController, cardToMove, cardToMove.Owner.InTheBox, toBottom: false, isPutIntoPlay: false, playCardIfMovingToPlayArea: true, null, showMessage: false, null, base.TurnTaker, null, evenIfIndestructible: false, flipFaceDown: false, null, isDiscard: false, evenIfPretendGameOver: false, shuffledTrashIntoDeck: false, doesNotEnterPlay: false, GetCardSource());
                            if (base.UseUnityCoroutines)
                            {
                                yield return(base.GameController.StartCoroutine(coroutine));
                            }
                            else
                            {
                                base.GameController.ExhaustCoroutine(coroutine);
                            }
                            cardToMove.PlayIndex = null;
                        }
                    }
                    // ??? SHOULD work

                    IEnumerator messageCoroutine = base.GameController.SendMessageAction("Reality flickers in the feedback. Things look different...", Priority.Medium, GetCardSource(), showCardSource: true);
                    if (base.UseUnityCoroutines)
                    {
                        yield return(base.GameController.StartCoroutine(messageCoroutine));
                    }
                    else
                    {
                        base.GameController.ExhaustCoroutine(messageCoroutine);
                    }
                }
            }
            yield break;
        }