From d71956ef2f243a8bb93d42884944a90da1b68b35 Mon Sep 17 00:00:00 2001 From: Achilles Date: Fri, 17 Feb 2017 22:17:18 -0600 Subject: [PATCH] - Converted Dimir Doppleganger and Lazav, Dimir Mastermind to the CopyEffect method. Fixes an issue with copy of a copy, i.e. Stunt Double --- .../src/mage/cards/d/DimirDoppelganger.java | 100 +++++++------- .../mage/cards/l/LazavDimirMastermind.java | 124 +++++++++--------- 2 files changed, 112 insertions(+), 112 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java b/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java index 97b111a5266..d0dda81b589 100644 --- a/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java +++ b/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java @@ -29,23 +29,28 @@ package mage.cards.d; import java.util.UUID; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Layer; import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentCard; +import mage.players.Player; import mage.target.common.TargetCardInGraveyard; +import mage.util.functions.ApplyToPermanent; /** * @@ -54,7 +59,7 @@ import mage.target.common.TargetCardInGraveyard; public class DimirDoppelganger extends CardImpl { public DimirDoppelganger(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{B}"); this.subtype.add("Shapeshifter"); this.power = new MageInt(0); @@ -77,14 +82,14 @@ public class DimirDoppelganger extends CardImpl { } } -class DimirDoppelgangerEffect extends ContinuousEffectImpl { +class DimirDoppelgangerEffect extends OneShotEffect { - public DimirDoppelgangerEffect() { - super(Duration.WhileOnBattlefield, Layer.CopyEffects_1, SubLayer.NA, Outcome.BecomeCreature); + DimirDoppelgangerEffect() { + super(Outcome.Copy); staticText = "Exile target creature card from a graveyard. {this} becomes a copy of that card and gains this ability"; } - public DimirDoppelgangerEffect(final DimirDoppelgangerEffect effect) { + DimirDoppelgangerEffect(final DimirDoppelgangerEffect effect) { super(effect); } @@ -95,49 +100,48 @@ class DimirDoppelgangerEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - Card card = game.getCard(source.getFirstTarget()); - Permanent permanent = game.getPermanent(source.getSourceId()); - if (card == null || permanent == null) { - return false; - } - card.moveToExile(null, "Dimir Doppelganger", source.getSourceId(), game); - Card cardToCopy = card.copy(); - cardToCopy.assignNewId(); - permanent.setName(cardToCopy.getName()); - permanent.getPower().setValue(cardToCopy.getPower().getValue()); - permanent.getToughness().setValue(cardToCopy.getToughness().getValue()); - permanent.getColor(game).setColor(cardToCopy.getColor(game)); - permanent.getManaCost().clear(); - permanent.getManaCost().add(cardToCopy.getManaCost()); - permanent.getCardType().clear(); - for (CardType type : cardToCopy.getCardType()) { - if (!permanent.getCardType().contains(type)) { - permanent.getCardType().add(type); + Player controller = game.getPlayer(source.getControllerId()); + Permanent dimirDoppelganger = game.getPermanent(source.getSourceId()); + Permanent newBluePrint = null; + if (controller != null + && dimirDoppelganger != null) { + Card copyFromCard = game.getCard(source.getFirstTarget()); + if (copyFromCard != null) { + Cards cardsToExile = new CardsImpl(); + cardsToExile.add(copyFromCard); + controller.moveCards(cardsToExile, Zone.EXILED, source, game); + newBluePrint = new PermanentCard((Card) copyFromCard, source.getControllerId(), game); + newBluePrint.assignNewId(); + ApplyToPermanent applier = new DimirDoppelgangerApplier(); + applier.apply(game, newBluePrint); + CopyEffect copyEffect = new CopyEffect(Duration.Custom, newBluePrint, dimirDoppelganger.getId()); + copyEffect.newId(); + copyEffect.setApplier(applier); + Ability newAbility = source.copy(); + copyEffect.init(newAbility, game); + game.addEffect(copyEffect, newAbility); } + return true; } - permanent.getSubtype(game).clear(); - for (String type : cardToCopy.getSubtype(game)) { - if (!permanent.getSubtype(game).contains(type)) { - permanent.getSubtype(game).add(type); - } - } - permanent.getSupertype().clear(); - for (String type : cardToCopy.getSupertype()) { - if (!permanent.getSupertype().contains(type)) { - permanent.getSupertype().add(type); - } - } - permanent.removeAllAbilities(source.getSourceId(), game); - // gains ability of Dimir Doppelganger - Ability dimirDoppelgangerAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DimirDoppelgangerEffect(), new ManaCostsImpl("{1}{U}{B}")); - dimirDoppelgangerAbility.addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard"))); - permanent.addAbility(dimirDoppelgangerAbility, source.getSourceId(), game); + return false; + } +} - for (Ability ability : cardToCopy.getAbilities()) { - if (!permanent.getAbilities().contains(ability)) { - permanent.addAbility(ability, source.getSourceId(), game); - } - } +class DimirDoppelgangerApplier extends ApplyToPermanent { + + @Override + public Boolean apply(Game game, Permanent permanent) { + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DimirDoppelgangerEffect(), new ManaCostsImpl("{1}{U}{B}")); + ability.addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard"))); + permanent.getAbilities().add(ability); + return true; + } + + @Override + public Boolean apply(Game game, MageObject mageObject) { + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DimirDoppelgangerEffect(), new ManaCostsImpl("{1}{U}{B}")); + ability.addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card in a graveyard"))); + mageObject.getAbilities().add(ability); return true; } } diff --git a/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java b/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java index e3b356c8170..af79f4ed2e6 100644 --- a/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java +++ b/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java @@ -29,24 +29,27 @@ package mage.cards.l; import java.util.UUID; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; -import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyEffect; import mage.abilities.keyword.HexproofAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Layer; import mage.constants.Outcome; import mage.constants.SetTargetPointer; -import mage.constants.SubLayer; import mage.constants.TargetController; import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentCard; +import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.functions.ApplyToPermanent; /** * @@ -67,7 +70,7 @@ public class LazavDimirMastermind extends CardImpl { // Whenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card except its name is still Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it gains hexproof and this ability. this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( - new LazavDimirEffect(), true, + new LazavDimirMastermindEffect(), true, new FilterCreatureCard("a creature card"), TargetController.OPPONENT, SetTargetPointer.CARD)); } @@ -82,80 +85,73 @@ public class LazavDimirMastermind extends CardImpl { } } -class LazavDimirEffect extends ContinuousEffectImpl { +class LazavDimirMastermindEffect extends OneShotEffect { - protected Card cardToCopy; - - public LazavDimirEffect() { - super(Duration.WhileOnBattlefield, Layer.CopyEffects_1, SubLayer.NA, Outcome.BecomeCreature); - staticText = "have {this} become a copy of that card except its name is still {this}, it's legendary in addition to its other types, and it gains hexproof and this ability"; + LazavDimirMastermindEffect() { + super(Outcome.Copy); + staticText = "you may have {this} become a copy of that card except its name is still {this}, it's legendary in addition to its other types, and it gains hexproof and this ability"; } - public LazavDimirEffect(final LazavDimirEffect effect) { + LazavDimirMastermindEffect(final LazavDimirMastermindEffect effect) { super(effect); - this.cardToCopy = effect.cardToCopy; } @Override - public LazavDimirEffect copy() { - return new LazavDimirEffect(this); - } - - @Override - public void init(Ability source, Game game) { - super.init(source, game); - Card card = game.getCard(((FixedTarget) getTargetPointer()).getTarget()); - if (card != null) { - cardToCopy = card.copy(); - cardToCopy.assignNewId(); - } else { - discard(); - } + public LazavDimirMastermindEffect copy() { + return new LazavDimirMastermindEffect(this); } @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { - discard(); + Player controller = game.getPlayer(source.getControllerId()); + Permanent lazavDimirMastermind = game.getPermanent(source.getSourceId()); + Permanent newBluePrint = null; + if (controller != null + && lazavDimirMastermind != null) { + Card copyFromCard = game.getCard(((FixedTarget) getTargetPointer()).getTarget()); + if (copyFromCard != null) { + newBluePrint = new PermanentCard((Card) copyFromCard, source.getControllerId(), game); + newBluePrint.assignNewId(); + ApplyToPermanent applier = new LazavDimirMastermindApplier(); + applier.apply(game, newBluePrint); + CopyEffect copyEffect = new CopyEffect(Duration.Custom, newBluePrint, lazavDimirMastermind.getId()); + copyEffect.newId(); + copyEffect.setApplier(applier); + Ability newAbility = source.copy(); + copyEffect.init(newAbility, game); + game.addEffect(copyEffect, newAbility); + } return true; } - permanent.getPower().setValue(cardToCopy.getPower().getValue()); - permanent.getToughness().setValue(cardToCopy.getToughness().getValue()); - permanent.getColor(game).setColor(cardToCopy.getColor(game)); - permanent.getManaCost().clear(); - permanent.getManaCost().add(cardToCopy.getManaCost()); - permanent.getCardType().clear(); - for (CardType type : cardToCopy.getCardType()) { - if (!permanent.getCardType().contains(type)) { - permanent.getCardType().add(type); - } - } - permanent.getSubtype(game).clear(); - for (String type : cardToCopy.getSubtype(game)) { - if (!permanent.getSubtype(game).contains(type)) { - permanent.getSubtype(game).add(type); - } - } - permanent.getSupertype().clear(); - permanent.getSupertype().add("Legendary"); - for (String type : cardToCopy.getSupertype()) { - if (!permanent.getSupertype().contains(type)) { - permanent.getSupertype().add(type); - } - } - permanent.removeAllAbilities(source.getSourceId(), game); - permanent.addAbility(HexproofAbility.getInstance(), source.getSourceId(), game); - permanent.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( - new LazavDimirEffect(), true, - new FilterCreatureCard("a creature card"), - TargetController.OPPONENT, SetTargetPointer.CARD), source.getSourceId(), game); + return false; + } +} - for (Ability ability : cardToCopy.getAbilities()) { - if (!permanent.getAbilities().contains(ability)) { - permanent.addAbility(ability, source.getSourceId(), game); - } - } +class LazavDimirMastermindApplier extends ApplyToPermanent { + + @Override + public Boolean apply(Game game, Permanent permanent) { + Ability ability = new PutCardIntoGraveFromAnywhereAllTriggeredAbility( + new LazavDimirMastermindEffect(), true, + new FilterCreatureCard("a creature card"), + TargetController.OPPONENT, SetTargetPointer.CARD); + permanent.getAbilities().add(ability); + permanent.setName("Lazav, Dimir Mastermind"); + permanent.getSupertype().add("Legendary"); + permanent.getAbilities().add(HexproofAbility.getInstance()); + return true; + } + + @Override + public Boolean apply(Game game, MageObject mageObject) { + Ability ability = new PutCardIntoGraveFromAnywhereAllTriggeredAbility( + new LazavDimirMastermindEffect(), true, + new FilterCreatureCard("a creature card"), + TargetController.OPPONENT, SetTargetPointer.CARD); + mageObject.getAbilities().add(ability); + mageObject.setName("Lazav, Dimir Mastermind"); + mageObject.getSupertype().add("Legendary"); + mageObject.getAbilities().add(HexproofAbility.getInstance()); return true; } }