diff --git a/Mage.Sets/src/mage/cards/a/AuditoreAmbush.java b/Mage.Sets/src/mage/cards/a/AuditoreAmbush.java new file mode 100644 index 000000000000..727ece23a432 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AuditoreAmbush.java @@ -0,0 +1,54 @@ +package mage.cards.a; + +import java.util.UUID; + +import mage.abilities.Mode; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect; +import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandTargetPlayerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * @author balazskristof + */ +public final class AuditoreAmbush extends CardImpl { + + private static final FilterCard filter = new FilterCard("Ezio, Blade of Vengeance"); + + static { + filter.add(new NamePredicate("Ezio, Blade of Vengeance")); + } + + public AuditoreAmbush(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{B}"); + + + // Choose one or both -- + this.getSpellAbility().getModes().setMinModes(1); + this.getSpellAbility().getModes().setMaxModes(2); + + // * Return target creature to its owner's hand. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // * Target player searches their library and/or graveyard for a card named Ezio, Blade of Vengeance, reveals it, and puts it into their hand. If they search their library this way, they shuffle. + Mode mode = new Mode(new SearchLibraryGraveyardPutInHandTargetPlayerEffect(filter, false)); + mode.addTarget(new TargetPlayer()); + this.getSpellAbility().addMode(mode); + } + + private AuditoreAmbush(final AuditoreAmbush card) { + super(card); + } + + @Override + public AuditoreAmbush copy() { + return new AuditoreAmbush(this); + } +} diff --git a/Mage.Sets/src/mage/sets/AssassinsCreed.java b/Mage.Sets/src/mage/sets/AssassinsCreed.java index 50c650837f97..02cb09731306 100644 --- a/Mage.Sets/src/mage/sets/AssassinsCreed.java +++ b/Mage.Sets/src/mage/sets/AssassinsCreed.java @@ -54,7 +54,7 @@ private AssassinsCreed() { cards.add(new SetCardInfo("Assassin's Trophy", 166, Rarity.RARE, mage.cards.a.AssassinsTrophy.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Assassin's Trophy", 228, Rarity.RARE, mage.cards.a.AssassinsTrophy.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Assassin's Trophy", 95, Rarity.RARE, mage.cards.a.AssassinsTrophy.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Auditore Ambush", 295, Rarity.RARE, mage.cards.a.AuditoreAmbush.class)); + cards.add(new SetCardInfo("Auditore Ambush", 295, Rarity.RARE, mage.cards.a.AuditoreAmbush.class)); cards.add(new SetCardInfo("Aveline de Grandpre", 135, Rarity.RARE, mage.cards.a.AvelineDeGrandpre.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aveline de Grandpre", 220, Rarity.RARE, mage.cards.a.AvelineDeGrandpre.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aveline de Grandpre", 40, Rarity.RARE, mage.cards.a.AvelineDeGrandpre.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardPutInHandTargetPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardPutInHandTargetPlayerEffect.java new file mode 100644 index 000000000000..45c6f925ac26 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardPutInHandTargetPlayerEffect.java @@ -0,0 +1,87 @@ +package mage.abilities.effects.common.search; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardsImpl; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetCardInYourGraveyard; + +public class SearchLibraryGraveyardPutInHandTargetPlayerEffect extends OneShotEffect { + private FilterCard filter; + private boolean forceToSearchBoth; + + public SearchLibraryGraveyardPutInHandTargetPlayerEffect(FilterCard filter) { + this(filter, false); + } + + public SearchLibraryGraveyardPutInHandTargetPlayerEffect(FilterCard filter, boolean forceToSearchBoth) { + super(Outcome.Benefit); + this.filter = filter; + this.forceToSearchBoth = forceToSearchBoth; + } + + protected SearchLibraryGraveyardPutInHandTargetPlayerEffect(final SearchLibraryGraveyardPutInHandTargetPlayerEffect effect) { + super(effect); + this.filter = effect.filter; + this.forceToSearchBoth = effect.forceToSearchBoth; + staticText = "Target player searches their library and" + (forceToSearchBoth ? "" : "/or") + + " graveyard for " + (filter.getMessage().contains(" card") ? "" : "a card named ") + + filter.getMessage() + ", reveals it, and puts it into their hand. " + + (forceToSearchBoth ? "Then shuffle" : "If they search their library this way, they shuffle"); + } + + @Override + public SearchLibraryGraveyardPutInHandTargetPlayerEffect copy() { + return new SearchLibraryGraveyardPutInHandTargetPlayerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); + MageObject sourceObject = source.getSourceObject(game); + Card cardFound = null; + boolean needShuffle = false; + if (player != null && sourceObject != null) { + if (forceToSearchBoth || player.chooseUse(outcome, "Search your library for a card named " + filter.getMessage() + "?", source, game)) { + TargetCardInLibrary target = new TargetCardInLibrary(0, 1, filter); + target.clearChosen(); + if (player.searchLibrary(target, source, game)) { + if (!target.getTargets().isEmpty()) { + cardFound = game.getCard(target.getFirstTarget()); + } + } + needShuffle = true; + } + + if (cardFound == null && player.chooseUse(outcome, "Search your graveyard for a card named " + filter.getMessage() + "?", source, game)) { + TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(0, 1, filter); + target.clearChosen(); + if (player.choose(outcome, player.getGraveyard(), target, source, game)) { + if (!target.getTargets().isEmpty()) { + cardFound = game.getCard(target.getFirstTarget()); + } + } + } + + if (cardFound != null) { + player.revealCards(sourceObject.getIdName(), new CardsImpl(cardFound), game); + player.moveCards(cardFound, Zone.HAND, source, game); + } + + if (needShuffle) { + player.shuffleLibrary(source, game); + } + + return true; + } + + return false; + } +}