diff --git a/Mage.Sets/src/mage/cards/m/MirroredLotus.java b/Mage.Sets/src/mage/cards/m/MirroredLotus.java new file mode 100644 index 00000000000..e8f06531322 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MirroredLotus.java @@ -0,0 +1,140 @@ + +package mage.cards.m; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.ExileSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +import java.util.Set; +import java.util.UUID; + +/** + * @author Susucr + */ +public final class MirroredLotus extends CardImpl { + + public MirroredLotus(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{0}"); + + // Reflect {0} (As this enters the battlefield, each opponent may pay {0}. When they do, they create a token copy of this except it lacks this ability.) + this.addAbility(new MirroredLotusAbility()); + + // {tap}, Exile Black Lotus: Add three mana of any one color. + Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new TapSourceCost()); + ability.addCost(new ExileSourceCost()); + this.addAbility(ability); + } + + private MirroredLotus(final MirroredLotus card) { + super(card); + } + + @Override + public MirroredLotus copy() { + return new MirroredLotus(this); + } +} + +// Is a class to be removed from the token. +class MirroredLotusAbility extends SimpleStaticAbility { + MirroredLotusAbility() { + super(Zone.ALL, new MirroredLotusReplacementEffect()); + } + + private MirroredLotusAbility(final MirroredLotusAbility ability) { + super(ability); + } + + @Override + public MirroredLotusAbility copy() { + return new MirroredLotusAbility(this); + } +} + +class MirroredLotusReplacementEffect extends ReplacementEffectImpl { + + MirroredLotusReplacementEffect() { + super(Duration.EndOfGame, Outcome.Detriment); + staticText = "Reflect {0} (As this enters the battlefield, each opponent may pay {0}. When they do, they create a token copy of this except it lacks this ability.)"; + } + + private MirroredLotusReplacementEffect(final MirroredLotusReplacementEffect effect) { + super(effect); + } + + @Override + public MirroredLotusReplacementEffect copy() { + return new MirroredLotusReplacementEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getTargetId().equals(source.getSourceId()); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Set opponentsIds = game.getOpponents(source.getControllerId()); + + for (UUID playerId : game.getPlayerList()) { + if (!opponentsIds.contains(playerId)) { + continue; + } + Player opponent = game.getPlayer(playerId); + if (opponent == null) { + continue; + } + + Cost cost = new ManaCostsImpl<>("{0}"); + if (!cost.canPay(source, source, playerId, game)) { + continue; + } + + if (opponent.chooseUse(Outcome.Benefit, "Pay " + cost.getText() + " for Reflect?", source, game)) { + if (cost.pay(source, game, source, playerId, false)) { + game.informPlayers(opponent.getLogName() + " paid the Reflect cost"); + + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(playerId); + effect.addAbilityClassesToRemoveFromTokens(MirroredLotusAbility.class); + effect.setTargetPointer(new FixedTarget(source.getSourceId(), game)); + + ReflexiveTriggeredAbility reflexive = new ReflexiveTriggeredAbility( + effect, false, + "create a token copy of {this} except it lacks the Reflect ability" + ); + reflexive.setControllerId(playerId); + game.fireReflexiveTriggeredAbility(reflexive, source); + } + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/MysteryBoosterPlaytest.java b/Mage.Sets/src/mage/sets/MysteryBoosterPlaytest.java index 59522d60330..55c123eb519 100644 --- a/Mage.Sets/src/mage/sets/MysteryBoosterPlaytest.java +++ b/Mage.Sets/src/mage/sets/MysteryBoosterPlaytest.java @@ -28,6 +28,7 @@ public class MysteryBoosterPlaytest extends ExpansionSet { cards.add(new SetCardInfo("Frogkin Kidnapper", 42, Rarity.RARE, mage.cards.f.FrogkinKidnapper.class)); cards.add(new SetCardInfo("How to Keep an Izzet Mage Busy", 93, Rarity.RARE, mage.cards.h.HowToKeepAnIzzetMageBusy.class)); cards.add(new SetCardInfo("Innocuous Insect", 23, Rarity.RARE, mage.cards.i.InnocuousInsect.class)); + cards.add(new SetCardInfo("Mirrored Lotus", 107, Rarity.RARE, mage.cards.m.MirroredLotus.class)); cards.add(new SetCardInfo("Recycla-bird", 28, Rarity.RARE, mage.cards.r.RecyclaBird.class)); cards.add(new SetCardInfo("Slivdrazi Monstrosity", 102, Rarity.RARE, mage.cards.s.SlivdraziMonstrosity.class)); cards.add(new SetCardInfo("Unicycle", 110, Rarity.RARE, mage.cards.u.Unicycle.class));