diff --git a/Mage.Sets/src/mage/cards/d/DesecrateReality.java b/Mage.Sets/src/mage/cards/d/DesecrateReality.java new file mode 100644 index 00000000000..4224d3e99e2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DesecrateReality.java @@ -0,0 +1,134 @@ +package mage.cards.d; + +import mage.abilities.Ability; +import mage.abilities.condition.common.AdamantCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterPermanentCard; +import mage.filter.predicate.mageobject.ManaValueParityPredicate; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetadjustment.TargetAdjuster; +import mage.target.targetpointer.EachTargetPointer; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class DesecrateReality extends CardImpl { + + public DesecrateReality(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{7}"); + + + // For each opponent, exile up to one target permanent that player controls with an even mana value. + this.getSpellAbility().addEffect(new ExileTargetEffect() + .setTargetPointer(new EachTargetPointer()) + .setText("for each opponent, exile up to one target permanent that player controls with an even mana value.")); + this.getSpellAbility().setTargetAdjuster(DesecrateRealityAdjuster.instance); + + // Adamant -- If at least three colorless mana was spent to cast this spell, return a permanent card with an odd mana value from your graveyard to the battlefield. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new DesecrateRealityEffect(), + AdamantCondition.COLORLESS, "
Adamant — " + + "If at least three colorless mana was spent to cast this spell, " + + "return a permanent card with an odd mana value from your graveyard to the battlefield." + )); + } + + private DesecrateReality(final DesecrateReality card) { + super(card); + } + + @Override + public DesecrateReality copy() { + return new DesecrateReality(this); + } +} + +enum DesecrateRealityAdjuster implements TargetAdjuster { + instance; + + private static final FilterControlledPermanent filterCount = new FilterControlledPermanent(""); + + static { + filterCount.add(ManaValueParityPredicate.EVEN); + } + + @Override + public void adjustTargets(Ability ability, Game game) { + ability.getTargets().clear(); + for (UUID opponentId : game.getOpponents(ability.getControllerId())) { + Player opponent = game.getPlayer(opponentId); + + if (opponent == null || game.getBattlefield().count( + filterCount, + opponentId, ability, game + ) < 1) { + continue; + } + FilterPermanent filter = new FilterPermanent("permanent controlled by " + opponent.getName() + " with an even mana value."); + filter.add(new ControllerIdPredicate(opponentId)); + filter.add(ManaValueParityPredicate.EVEN); + TargetPermanent targetPermanent = new TargetPermanent(0, 1, filter); + ability.addTarget(targetPermanent); + } + } +} + +class DesecrateRealityEffect extends OneShotEffect { + + private static final FilterCard filter + = new FilterPermanentCard("permanent card with an odd mana value in your graveyard"); + + static { + filter.add(ManaValueParityPredicate.ODD); + } + + DesecrateRealityEffect() { + super(Outcome.PutCardInPlay); + } + + private DesecrateRealityEffect(final DesecrateRealityEffect effect) { + super(effect); + } + + @Override + public DesecrateRealityEffect copy() { + return new DesecrateRealityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + + // return a permanent card with an odd mana value from your graveyard to the battlefield. + Target target = new TargetCardInYourGraveyard(filter); + target.setNotTarget(true); + if (controller.choose(outcome, target, source, game)) { + Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); + effect.setTargetPointer(new FixedTarget(target.getFirstTarget(), game)); + effect.apply(game, source); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/CommanderMasters.java b/Mage.Sets/src/mage/sets/CommanderMasters.java index 83490e50d3c..932785bde0b 100644 --- a/Mage.Sets/src/mage/sets/CommanderMasters.java +++ b/Mage.Sets/src/mage/sets/CommanderMasters.java @@ -162,6 +162,7 @@ public final class CommanderMasters extends ExpansionSet { cards.add(new SetCardInfo("Demonlord Belzenlok", 151, Rarity.RARE, mage.cards.d.DemonlordBelzenlok.class)); cards.add(new SetCardInfo("Deploy the Gatewatch", 819, Rarity.MYTHIC, mage.cards.d.DeployTheGatewatch.class)); cards.add(new SetCardInfo("Deranged Assistant", 87, Rarity.COMMON, mage.cards.d.DerangedAssistant.class)); + cards.add(new SetCardInfo("Desecrate Reality", 714, Rarity.RARE, mage.cards.d.DesecrateReality.class)); cards.add(new SetCardInfo("Destiny Spinner", 890, Rarity.UNCOMMON, mage.cards.d.DestinySpinner.class)); cards.add(new SetCardInfo("Diffusion Sliver", 845, Rarity.UNCOMMON, mage.cards.d.DiffusionSliver.class)); cards.add(new SetCardInfo("Disrupt Decorum", 215, Rarity.RARE, mage.cards.d.DisruptDecorum.class)); diff --git a/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java b/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java index b748b502834..030f8b6e949 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/AdamantCondition.java @@ -19,22 +19,33 @@ public enum AdamantCondition implements Condition { BLACK(ColoredManaSymbol.B), RED(ColoredManaSymbol.R), GREEN(ColoredManaSymbol.G), + COLORLESS(null, true), ANY(null); private final ColoredManaSymbol coloredManaSymbol; + private final boolean colorless; + private AdamantCondition(ColoredManaSymbol coloredManaSymbol) { + this(coloredManaSymbol, false); + } + + private AdamantCondition(ColoredManaSymbol coloredManaSymbol, boolean colorless) { this.coloredManaSymbol = coloredManaSymbol; + this.colorless = colorless; } @Override public boolean apply(Game game, Ability source) { if (source.getAbilityType() == AbilityType.SPELL) { + if (colorless) { + return source.getManaCostsToPay().getUsedManaToPay().getColorless() > 2; + } if (coloredManaSymbol == null) { return Arrays - .stream(ColoredManaSymbol.values()) - .map(source.getManaCostsToPay().getUsedManaToPay()::getColor) - .anyMatch(i -> i > 2); + .stream(ColoredManaSymbol.values()) + .map(source.getManaCostsToPay().getUsedManaToPay()::getColor) + .anyMatch(i -> i > 2); } return source.getManaCostsToPay().getUsedManaToPay().getColor(coloredManaSymbol) > 2; } @@ -46,11 +57,14 @@ public enum AdamantCondition implements Condition { if (payment == null) { return false; } + if (colorless) { + return payment.getColorless() > 2; + } if (coloredManaSymbol == null) { return Arrays - .stream(ColoredManaSymbol.values()) - .map(payment::getColor) - .anyMatch(i -> i > 2); + .stream(ColoredManaSymbol.values()) + .map(payment::getColor) + .anyMatch(i -> i > 2); } return payment.getColor(coloredManaSymbol) > 2; }