diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java b/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java index fb6eca52ca0..528f3419818 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java @@ -34,13 +34,16 @@ import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.SourceMatchesFilterCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.EntersBattlefieldEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyEffect; import mage.abilities.effects.common.CopyPermanentEffect; import mage.cards.CardImpl; import mage.filter.common.FilterCreaturePermanent; @@ -68,7 +71,9 @@ public class ProgenitorMimic extends CardImpl { this.power = new MageInt(0); this.toughness = new MageInt(0); - // You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield except it gains "At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature." + // You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield + // except it gains "At the beginning of your upkeep, if this creature isn't a token, + // put a token onto the battlefield that's a copy of this creature." this.addAbility(new SimpleStaticAbility( Zone.BATTLEFIELD, new EntersBattlefieldEffect(new CopyPermanentEffect(new ProgenitorMimicApplyToPermanent()), @@ -85,6 +90,7 @@ public class ProgenitorMimic extends CardImpl { return new ProgenitorMimic(this); } } + class ProgenitorMimicApplyToPermanent extends ApplyToPermanent { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("no Token"); @@ -94,7 +100,7 @@ class ProgenitorMimicApplyToPermanent extends ApplyToPermanent { @Override public Boolean apply(Game game, Permanent permanent) { Ability ability = new ConditionalTriggeredAbility( - new BeginningOfUpkeepTriggeredAbility(new CopySourceEffect(), TargetController.YOU, false), + new BeginningOfUpkeepTriggeredAbility(new ProgenitorMimicCopyEffect(), TargetController.YOU, false), new SourceMatchesFilterCondition(filter), "At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature."); permanent.addAbility(ability, game); @@ -102,30 +108,46 @@ class ProgenitorMimicApplyToPermanent extends ApplyToPermanent { } } -class CopySourceEffect extends OneShotEffect { +class ProgenitorMimicCopyEffect extends OneShotEffect { - public CopySourceEffect() { + public ProgenitorMimicCopyEffect() { super(Outcome.PutCreatureInPlay); this.staticText = "put a token onto the battlefield that's a copy of this creature"; } - public CopySourceEffect(final CopySourceEffect effect) { + public ProgenitorMimicCopyEffect(final ProgenitorMimicCopyEffect effect) { super(effect); } @Override - public CopySourceEffect copy() { - return new CopySourceEffect(this); + public ProgenitorMimicCopyEffect copy() { + return new ProgenitorMimicCopyEffect(this); } @Override public boolean apply(Game game, Ability source) { - Permanent copyFromPermanent = game.getPermanent(source.getSourceId()); + Permanent copyFromPermanent = null; + // retrieve the copied permanent of Progenitor Mimic + for (Effect effect : game.getState().getContinuousEffects().getLayeredEffects(game)) { + if (effect instanceof CopyEffect) { + CopyEffect copyEffect = (CopyEffect) effect; + // take the exiting copy effect of Progenitor Mimic + if (copyEffect.getSourceId().equals(source.getSourceId())) { + MageObject object = ((CopyEffect) effect).getTarget(); + if (object instanceof Permanent) { + copyFromPermanent = (Permanent)object; + } + } + } + } if (copyFromPermanent != null) { EmptyToken token = new EmptyToken(); - CardUtil.copyTo(token).from(copyFromPermanent); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); - return true; + Permanent sourcePermanent = game.getPermanent(token.getLastAddedToken()); + if (sourcePermanent != null) { + game.copyPermanent(copyFromPermanent, sourcePermanent, source, new ProgenitorMimicApplyToPermanent()); + return true; + } } return false; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/ProgenitorMimicTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/ProgenitorMimicTest.java new file mode 100644 index 00000000000..d5a579a336d --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/ProgenitorMimicTest.java @@ -0,0 +1,114 @@ +package org.mage.test.cards.copy; + +import junit.framework.Assert; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author LevelX2 + */ +public class ProgenitorMimicTest extends CardTestPlayerBase { + + /** + * Tests triggers working on both sides after Clone coming onto battlefield + */ + @Test + public void testCloneTriggered() { + addCard(Zone.BATTLEFIELD, playerA, "Runeclaw Bear", 1); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 4); + + addCard(Zone.HAND, playerB, "Progenitor Mimic"); + addCard(Zone.BATTLEFIELD, playerB, "Island", 3); + addCard(Zone.BATTLEFIELD, playerB, "Forest", 3); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Progenitor Mimic"); + + castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Anaconda"); + + setStopAt(4, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + assertPermanentCount(playerA, "Runeclaw Bear", 1); + assertPermanentCount(playerB, "Runeclaw Bear", 2); + + int tokens = 0; + int nonTokens = 0; + for (Permanent permanent : currentGame.getBattlefield().getAllPermanents()) { + if (permanent.getControllerId().equals(playerB.getId())) { + if (permanent.getCardType().contains(CardType.CREATURE)) { + if (permanent instanceof PermanentToken) { + tokens++; + } else { + nonTokens++; + } + + } + } + } + + Assert.assertTrue("Only one non token permanent ",nonTokens == 1); + Assert.assertTrue("Only one token permanent ",tokens == 1); + } + +// /** +// * Tests Clone is sacrificed and only one effect is turned on +// */ +// @Test +// public void testCloneSacrifice() { +// addCard(Zone.BATTLEFIELD, playerA, "Bloodgift Demon", 1); +// +// addCard(Zone.HAND, playerA, "Diabolic Edict"); +// addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); +// +// addCard(Zone.HAND, playerB, "Clone"); +// addCard(Zone.BATTLEFIELD, playerB, "Island", 4); +// +// castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Clone"); +// castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Diabolic Edict", playerB); +// +// setStopAt(4, PhaseStep.END_TURN); +// execute(); +// +// assertPermanentCount(playerA, "Bloodgift Demon", 1); +// assertGraveyardCount(playerA, "Diabolic Edict", 1); +// assertPermanentCount(playerB, "Bloodgift Demon", 0); +// assertGraveyardCount(playerB, "Clone", 1); +// +// // 1 from draw steps + 2 from Demon +// assertHandCount(playerA, 3); +// // 2 from draw steps + no from Demon (should be sacrificed) +// assertHandCount(playerB, 2); +// +// assertLife(playerA, 18); +// assertLife(playerB, 20); +// } +// +// @Test +// public void testCard3() { +// addCard(Zone.BATTLEFIELD, playerA, "Island", 6); +// addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6); +// addCard(Zone.HAND, playerA, "Public Execution"); +// addCard(Zone.HAND, playerA, "Clone"); +// +// addCard(Zone.BATTLEFIELD, playerB, "Llanowar Elves"); +// addCard(Zone.BATTLEFIELD, playerB, "Craw Wurm"); +// +// castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Public Executio", "Llanowar Elves"); +// castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Clone"); +// +// setStopAt(1, PhaseStep.END_TURN); +// execute(); +// +// assertPermanentCount(playerB, "Llanowar Elves", 0); +// assertPowerToughness(playerB, "Craw Wurm", 4, 4); +// assertPowerToughness(playerA, "Craw Wurm", 6, 4); +// } +} diff --git a/Mage/src/mage/abilities/effects/common/CopyEffect.java b/Mage/src/mage/abilities/effects/common/CopyEffect.java index 7c91306737d..6cdee302f90 100644 --- a/Mage/src/mage/abilities/effects/common/CopyEffect.java +++ b/Mage/src/mage/abilities/effects/common/CopyEffect.java @@ -36,6 +36,8 @@ import mage.game.Game; import mage.game.permanent.Permanent; import java.util.UUID; +import mage.cards.Card; +import mage.game.permanent.PermanentCard; /** * @@ -98,6 +100,12 @@ public class CopyEffect extends ContinuousEffectImpl { permanent.setTransformed(((Permanent)target).isTransformed()); permanent.setSecondCardFace(((Permanent) target).getSecondCardFace()); } + // to get the image of the copied permanent copy number und expansionCode + if (target instanceof PermanentCard) { + permanent.setCardNumber(((PermanentCard) target).getCard().getCardNumber()); + permanent.setExpansionSetCode(((PermanentCard) target).getCard().getExpansionSetCode()); + } + permanent.setCopy(true); return true;