From 46566361e7010726f47a396beff49685ce16cdec Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 12 Aug 2016 15:42:50 +0200 Subject: [PATCH] * Fixed a bug that if a copy token creature of a transformed creature was created (e.g. Mirror Mockery), the front side instead of the transformed side was copied. --- .../mage/sets/commander2014/CrownOfDoom.java | 5 ++- .../UnimpededTrespasser.java | 2 +- .../shadowsoverinnistrad/UninvitedGeist.java | 2 +- .../abilities/keywords/TransformTest.java | 39 +++++++++++++++++++ .../util/functions/CopyTokenFunction.java | 7 +++- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander2014/CrownOfDoom.java b/Mage.Sets/src/mage/sets/commander2014/CrownOfDoom.java index 9788818df81..009ef2e3e19 100644 --- a/Mage.Sets/src/mage/sets/commander2014/CrownOfDoom.java +++ b/Mage.Sets/src/mage/sets/commander2014/CrownOfDoom.java @@ -85,7 +85,7 @@ public class CrownOfDoom extends CardImpl { Card sourceCard = game.getCard(ability.getSourceId()); if (sourceCard != null) { ability.getTargets().clear(); - FilterPlayer filter = new FilterPlayer("player other than " + sourceCard.getName() + "'s owner"); + FilterPlayer filter = new FilterPlayer("player other than " + sourceCard.getIdName() + "'s owner"); filter.add(Predicates.not(new OwnerIdPredicate(sourceCard.getOwnerId()))); ability.addTarget(new TargetPlayer(1, 1, false, filter)); } @@ -124,7 +124,8 @@ class CrownOfDoomEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Player newController = game.getPlayer(getTargetPointer().getFirst(game, source)); if (controller != null && newController != null && controller.getId() != newController.getId()) { - ContinuousEffect effect = new GainControlTargetEffect(Duration.EndOfGame, newController.getId()); + // Duration.Custom = effect ends if Artifact leaves the current zone (battlefield) + ContinuousEffect effect = new GainControlTargetEffect(Duration.Custom, newController.getId()); effect.setTargetPointer(new FixedTarget(source.getSourceId())); game.addEffect(effect, source); return true; diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UnimpededTrespasser.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UnimpededTrespasser.java index e4211f78426..361524fe9dd 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UnimpededTrespasser.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UnimpededTrespasser.java @@ -51,7 +51,7 @@ public class UnimpededTrespasser extends CardImpl { // this card is the second face of double-faced card this.nightCard = true; - // Unimpeded Geist can't be blocked. + // Unimpeded Trespasser can't be blocked. this.addAbility(new CantBeBlockedSourceAbility()); } diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UninvitedGeist.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UninvitedGeist.java index 5d806f0c294..d92bcce4ab8 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UninvitedGeist.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UninvitedGeist.java @@ -53,7 +53,7 @@ public class UninvitedGeist extends CardImpl { this.canTransform = true; this.secondSideCard = new UnimpededTrespasser(ownerId); - // Skulk + // Skulk (This creature can't be blocked by creatures with greater power.) this.addAbility(new SkulkAbility()); // When Uninvited Geist deals combat damage to a player, transform it. diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/TransformTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/TransformTest.java index 39a27bafa77..07b2241f46c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/TransformTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/TransformTest.java @@ -245,4 +245,43 @@ public class TransformTest extends CardTestPlayerBase { assertPermanentCount(playerB, "Lambholt Pacifist", 1); } + + /** + * Mirror Mockery copies the front face of a Transformed card rather than + * the current face. + * + * It's worth pointing out that my opponent cast Mirror Mockery the previous + * turn - after it had transformed. I should have included the part of the + * log that showed that Mirror Mockery was applied to the Unimpeded + * Trespasser. + */ + @Test + public void testTransformCopyrnansformed() { + // Skulk (This creature can't be blocked by creatures with greater power.) + // When Uninvited Geist deals combat damage to a player, transform it. + addCard(Zone.BATTLEFIELD, playerA, "Uninvited Geist"); // Creature 2/2 {2}{U} + // Transformed side: Unimpeded Trespasser - Creature 3/3 + // Unimpeded Trespasser can't be blocked. + + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + // Enchant creature + // Whenever enchanted creature attacks, you may put a token onto the battlefield that's a copy of that creature. Exile that token at the end of combat. + addCard(Zone.HAND, playerB, "Mirror Mockery"); // {1}{U} + + attack(1, playerA, "Uninvited Geist"); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Mirror Mockery", "Unimpeded Trespasser"); + + attack(3, playerA, "Unimpeded Trespasser"); + + setStopAt(3, PhaseStep.COMBAT_DAMAGE); + execute(); + + assertLife(playerB, 15); + + assertPermanentCount(playerB, "Mirror Mockery", 1); + assertPermanentCount(playerA, "Unimpeded Trespasser", 1); + assertPermanentCount(playerB, "Unimpeded Trespasser", 1); + assertPowerToughness(playerB, "Unimpeded Trespasser", 3, 3); + } } diff --git a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java index b5452b3ff1e..f10e9bd2c4d 100644 --- a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java +++ b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java @@ -70,7 +70,12 @@ public class CopyTokenFunction implements Function { MorphAbility.setPermanentToFaceDownCreature(target); return target; } else { - sourceObj = ((PermanentCard) source).getCard(); + if (((PermanentCard) source).isTransformed() && source.getSecondCardFace() != null) { + sourceObj = ((PermanentCard) source).getSecondCardFace(); + } else { + sourceObj = ((PermanentCard) source).getCard(); + } + target.setOriginalExpansionSetCode(source.getExpansionSetCode()); target.setOriginalCardNumber(source.getCardNumber()); target.setCopySourceCard((Card) sourceObj);