From 0668a9aebca5117cc51d358bea5bf541c986fd40 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sun, 15 Sep 2024 21:12:38 -0400 Subject: [PATCH] fix #4207 (Indomitable Creativity) rework to follow game rules for effect order --- .../mage/cards/i/IndomitableCreativity.java | 78 ++++++++++--------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java index 8d2360d22e5..d09f8b15156 100644 --- a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java +++ b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java @@ -1,4 +1,3 @@ - package mage.cards.i; import mage.abilities.Ability; @@ -15,9 +14,7 @@ import mage.players.Player; import mage.target.TargetPermanent; import mage.target.targetadjustment.XTargetsCountAdjuster; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; /** * @author LevelX2 @@ -67,37 +64,48 @@ class IndomitableCreativityEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - List destroyedPermanents = new ArrayList<>(); - for (UUID targetId : getTargetPointer().getTargets(game, source)) { - Permanent target = game.getPermanent(targetId); - if (target != null) { - if (target.destroy(source, game, false)) { - destroyedPermanents.add(target); - } - } - } - for (Permanent permanent : destroyedPermanents) { - Player controllerOfDestroyedCreature = game.getPlayer(permanent.getControllerId()); - if (controllerOfDestroyedCreature != null) { - Library library = controllerOfDestroyedCreature.getLibrary(); - if (library.hasCards()) { - Cards cardsToReaveal = new CardsImpl(); - for (Card card : library.getCards(game)) { - cardsToReaveal.add(card); - if (card.isCreature(game) || card.isArtifact(game)) { - controllerOfDestroyedCreature.moveCards(card, Zone.EXILED, source, game); - controllerOfDestroyedCreature.moveCards(card, Zone.BATTLEFIELD, source, game); - break; - } - } - controllerOfDestroyedCreature.revealCards(source, " for destroyed " + permanent.getIdName(), cardsToReaveal, game); - controllerOfDestroyedCreature.shuffleLibrary(source, game); - } - } - } - return true; + if (controller == null) { + return false; } - return false; + List destroyedPermanents = new ArrayList<>(); + for (UUID targetId : getTargetPointer().getTargets(game, source)) { + Permanent target = game.getPermanent(targetId); + if (target != null && target.destroy(source, game, false)) { + destroyedPermanents.add(target); + } + } + if (destroyedPermanents.isEmpty()) { + return false; + } + game.processAction(); + Map> playerToBattlefield = new HashMap<>(); + for (Permanent permanent : destroyedPermanents) { + Player controllerOfDestroyedCreature = game.getPlayer(permanent.getControllerId()); + if (controllerOfDestroyedCreature != null) { + Library library = controllerOfDestroyedCreature.getLibrary(); + if (library.hasCards()) { + playerToBattlefield.computeIfAbsent(controllerOfDestroyedCreature.getId(), x -> new HashSet<>()); + Cards cardsToReveal = new CardsImpl(); + for (Card card : library.getCards(game)) { + cardsToReveal.add(card); + if (card.isCreature(game) || card.isArtifact(game)) { + controllerOfDestroyedCreature.moveCards(card, Zone.EXILED, source, game); + playerToBattlefield.computeIfAbsent(controllerOfDestroyedCreature.getId(), x -> new HashSet<>()).add(card); + break; + } + } + controllerOfDestroyedCreature.revealCards(source, " for destroyed " + permanent.getIdName(), cardsToReveal, game); + } + } + } + game.processAction(); + for (Map.Entry> entry: playerToBattlefield.entrySet()) { + Player player = game.getPlayer(entry.getKey()); + if (player != null) { + player.moveCards(entry.getValue(), Zone.BATTLEFIELD, source, game); + player.shuffleLibrary(source, game); + } + } + return true; } }