From 2709614508e5c9653c40cbf40ca575e28596bbb3 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sun, 30 Jun 2024 13:57:14 +0200 Subject: [PATCH] tweak [BLB] Salvation Swan's effect, and add test with Meld. --- .../cards/single/blb/SalvationSwanTest.java | 30 +++++++++ ...tlefieldUnderOwnerControlTargetEffect.java | 61 ++++++++++--------- ...erOwnerControlWithCounterTargetEffect.java | 4 +- 3 files changed, 65 insertions(+), 30 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/blb/SalvationSwanTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/blb/SalvationSwanTest.java index bec19d13004..4115b1915fe 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/blb/SalvationSwanTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/blb/SalvationSwanTest.java @@ -41,4 +41,34 @@ public class SalvationSwanTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Grizzly Bears", 1); assertCounterCount(playerA, "Grizzly Bears", CounterType.FLYING, 1); } + + @Test + public void test_Meld() { + setStrictChooseMode(true); + + addCard(Zone.BATTLEFIELD, playerA, "Plateau", 4 + 5); + addCard(Zone.BATTLEFIELD, playerA, "Hanweir Battlements"); + addCard(Zone.BATTLEFIELD, playerA, "Hanweir Garrison"); + addCard(Zone.HAND, playerA, swan); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}{R}{R}, {T}: If you both own and control"); + setChoice(playerA, "Hanweir Garrison"); + waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, swan); + addTarget(playerA, "Hanweir, the Writhing Township"); + + checkExileCount("Battlements in exile", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Hanweir Battlements", 1); + checkExileCount("Garrison in exile", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Hanweir Garrison", 1); + + // Only 1 trigger to return both meld parts. + + setStopAt(2, PhaseStep.UPKEEP); + execute(); + + assertPermanentCount(playerA, "Hanweir Battlements", 1); + assertCounterCount(playerA, "Hanweir Battlements", CounterType.FLYING, 1); + assertPermanentCount(playerA, "Hanweir Garrison", 1); + assertCounterCount(playerA, "Hanweir Garrison", CounterType.FLYING, 1); + } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java index 0a6ea1f6b1e..89c11839294 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java @@ -44,38 +44,43 @@ public class ReturnToBattlefieldUnderOwnerControlTargetEffect extends OneShotEff return new ReturnToBattlefieldUnderOwnerControlTargetEffect(this); } - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Cards cardsToBattlefield = new CardsImpl(); - if (returnFromExileZoneOnly) { - for (UUID targetId : this.getTargetPointer().getTargets(game, source)) { - if (game.getExile().containsId(targetId, game)) { - cardsToBattlefield.add(targetId); - } else { - Card card = game.getCard(targetId); - if (card instanceof MeldCard) { - MeldCard meldCard = (MeldCard) card; - Card topCard = meldCard.getTopHalfCard(); - Card bottomCard = meldCard.getBottomHalfCard(); - if (topCard.getZoneChangeCounter(game) == meldCard.getTopLastZoneChangeCounter() && game.getExile().containsId(topCard.getId(), game)) { - cardsToBattlefield.add(topCard); - } - if (bottomCard.getZoneChangeCounter(game) == meldCard.getBottomLastZoneChangeCounter() && game.getExile().containsId(bottomCard.getId(), game)) { - cardsToBattlefield.add(bottomCard); - } + protected Cards getCardsToReturn(Game game, Ability source) { + Cards cardsToBattlefield = new CardsImpl(); + if (returnFromExileZoneOnly) { + for (UUID targetId : this.getTargetPointer().getTargets(game, source)) { + if (game.getExile().containsId(targetId, game)) { + cardsToBattlefield.add(targetId); + } else { + Card card = game.getCard(targetId); + if (card instanceof MeldCard) { + MeldCard meldCard = (MeldCard) card; + Card topCard = meldCard.getTopHalfCard(); + Card bottomCard = meldCard.getBottomHalfCard(); + if (topCard.getZoneChangeCounter(game) == meldCard.getTopLastZoneChangeCounter() && game.getExile().containsId(topCard.getId(), game)) { + cardsToBattlefield.add(topCard); + } + if (bottomCard.getZoneChangeCounter(game) == meldCard.getBottomLastZoneChangeCounter() && game.getExile().containsId(bottomCard.getId(), game)) { + cardsToBattlefield.add(bottomCard); } } } - } else { - cardsToBattlefield.addAll(getTargetPointer().getTargets(game, source)); } - if (!cardsToBattlefield.isEmpty()) { - controller.moveCards(cardsToBattlefield.getCards(game), Zone.BATTLEFIELD, source, game, tapped, false, true, null); - } - return true; + } else { + cardsToBattlefield.addAll(getTargetPointer().getTargets(game, source)); } - return false; + return cardsToBattlefield; + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + Cards cardsToBattlefield = getCardsToReturn(game, source); + if (!cardsToBattlefield.isEmpty()) { + controller.moveCards(cardsToBattlefield.getCards(game), Zone.BATTLEFIELD, source, game, tapped, false, true, null); + } + return true; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlWithCounterTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlWithCounterTargetEffect.java index 817629134ce..ceef1b58aa3 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlWithCounterTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlWithCounterTargetEffect.java @@ -41,8 +41,8 @@ public class ReturnToBattlefieldUnderOwnerControlWithCounterTargetEffect extends @Override public boolean apply(Game game, Ability source) { - for (UUID targetId : getTargetPointer().getTargets(game, source)) { - game.setEnterWithCounters(targetId, counters.copy()); + for (UUID cardId : getCardsToReturn(game, source)) { + game.setEnterWithCounters(cardId, counters.copy()); } return super.apply(game, source); }