From 418ad8a3b333855740190965da9eefd202adf19a Mon Sep 17 00:00:00 2001 From: xenohedron Date: Wed, 17 Jan 2024 19:26:01 -0500 Subject: [PATCH] fix Sanwell Avenger Ace allowing casting for free (#11674) --- .../src/mage/cards/s/SanwellAvengerAce.java | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/SanwellAvengerAce.java b/Mage.Sets/src/mage/cards/s/SanwellAvengerAce.java index 730095c6545..0b75c806d97 100644 --- a/Mage.Sets/src/mage/cards/s/SanwellAvengerAce.java +++ b/Mage.Sets/src/mage/cards/s/SanwellAvengerAce.java @@ -1,7 +1,9 @@ package mage.cards.s; +import mage.ApprovingObject; import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.SpellAbility; import mage.abilities.common.BecomesTappedSourceTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; @@ -9,10 +11,7 @@ import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalPreventionEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; +import mage.cards.*; import mage.constants.*; import mage.filter.FilterCard; import mage.filter.FilterPermanent; @@ -22,8 +21,12 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.AttackingPredicate; import mage.game.Game; import mage.players.Player; +import mage.target.TargetCard; import mage.util.CardUtil; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.UUID; /** @@ -102,9 +105,45 @@ class SanwellAvengerAceEffect extends OneShotEffect { } Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 6)); player.moveCards(cards, Zone.EXILED, source, game); - CardUtil.castSpellWithAttributesForFree(player, source, game, cards, filter); + castSpell(cards, player, source, game); cards.retainZone(Zone.EXILED, game); player.putCardsOnBottomOfLibrary(cards, game, source, false); return true; } + + // Based on CardUtil.castSpellWithAttributesForFree + // also see Anrakyr the Traveller + // this sort of thing probably deserves refactoring + private static void castSpell(Cards cards, Player player, Ability source, Game game) { + Map> cardMap = new HashMap<>(); + for (Card card : cards.getCards(game)) { + List castableComponents = CardUtil.getCastableComponents(card, filter, source, player, game, null, false); + if (!castableComponents.isEmpty()) { + cardMap.put(card.getId(), castableComponents); + } + } + if (cardMap.isEmpty()) { + return; + } + Cards castableCards = new CardsImpl(cardMap.keySet()); + TargetCard target = new TargetCard(0, 1, Zone.ALL, filter); + target.withNotTarget(true); + target.withChooseHint("to cast"); + player.choose(Outcome.Benefit, castableCards, target, source, game); + Card cardToCast = castableCards.get(target.getFirstTarget(), game); + if (cardToCast == null) { + return; + } + List partsToCast = cardMap.get(cardToCast.getId()); + if (partsToCast.isEmpty()) { + return; + } + partsToCast.forEach(card -> game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), Boolean.TRUE)); + SpellAbility chosenAbility = player.chooseAbilityForCast(cardToCast, game, false); + if (chosenAbility != null) { + player.cast(chosenAbility, game, false, new ApprovingObject(source, game)); + } + partsToCast.forEach(card -> game.getState().setValue("PlayFromNotOwnHandZone" + card.getId(), null)); + } + }