From 49a0f1134d184467437dc4142555d64b8309cdb3 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Thu, 3 Oct 2024 20:54:23 -0400 Subject: [PATCH] [ACR] Implement Become Anonymous --- .../src/mage/cards/b/BecomeAnonymous.java | 88 +++++++++++++++++++ Mage.Sets/src/mage/sets/AssassinsCreed.java | 1 + .../effects/keyword/ManifestEffect.java | 11 ++- 3 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/b/BecomeAnonymous.java diff --git a/Mage.Sets/src/mage/cards/b/BecomeAnonymous.java b/Mage.Sets/src/mage/cards/b/BecomeAnonymous.java new file mode 100644 index 00000000000..27e56fc651b --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BecomeAnonymous.java @@ -0,0 +1,88 @@ +package mage.cards.b; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.keyword.ManifestEffect; +import mage.cards.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +import java.util.Set; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BecomeAnonymous extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("nontoken creature you own"); + + static { + filter.add(TokenPredicate.FALSE); + filter.add(TargetController.YOU.getOwnerPredicate()); + } + + public BecomeAnonymous(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); + + // Exile target nontoken creature you own and the top two cards of your library in a face-down pile, shuffle that pile, then cloak those cards. They enter the battlefield tapped. + this.getSpellAbility().addEffect(new BecomeAnonymousEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + private BecomeAnonymous(final BecomeAnonymous card) { + super(card); + } + + @Override + public BecomeAnonymous copy() { + return new BecomeAnonymous(this); + } +} + +class BecomeAnonymousEffect extends OneShotEffect { + + BecomeAnonymousEffect() { + super(Outcome.Benefit); + staticText = "exile target nontoken creature you own and the top two cards of your library in " + + "a face-down pile, shuffle that pile, then cloak those cards. They enter the battlefield tapped"; + } + + private BecomeAnonymousEffect(final BecomeAnonymousEffect effect) { + super(effect); + } + + @Override + public BecomeAnonymousEffect copy() { + return new BecomeAnonymousEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (player == null || permanent == null) { + return false; + } + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 2)); + cards.add(permanent); + player.moveCards(cards, Zone.EXILED, source, game); + cards.retainZone(Zone.EXILED, game); + if (cards.isEmpty()) { + return true; + } + Set cardSet = cards.getCards(game); + cardSet.stream().forEach(card -> card.setFaceDown(true, game)); + game.processAction(); + return !ManifestEffect.doManifestCards(game, source, player, cardSet, true, true).isEmpty(); + } +} diff --git a/Mage.Sets/src/mage/sets/AssassinsCreed.java b/Mage.Sets/src/mage/sets/AssassinsCreed.java index 3150e3f8845..531396e3e2c 100644 --- a/Mage.Sets/src/mage/sets/AssassinsCreed.java +++ b/Mage.Sets/src/mage/sets/AssassinsCreed.java @@ -37,6 +37,7 @@ public final class AssassinsCreed extends ExpansionSet { cards.add(new SetCardInfo("Basim Ibn Ishaq", 49, Rarity.RARE, mage.cards.b.BasimIbnIshaq.class)); cards.add(new SetCardInfo("Battlefield Improvisation", 276, Rarity.COMMON, mage.cards.b.BattlefieldImprovisation.class)); cards.add(new SetCardInfo("Bayek of Siwa", 50, Rarity.RARE, mage.cards.b.BayekOfSiwa.class)); + cards.add(new SetCardInfo("Become Anonymous", 14, Rarity.UNCOMMON, mage.cards.b.BecomeAnonymous.class)); cards.add(new SetCardInfo("Black Market Connections", 87, Rarity.RARE, mage.cards.b.BlackMarketConnections.class)); cards.add(new SetCardInfo("Bleeding Effect", 51, Rarity.UNCOMMON, mage.cards.b.BleedingEffect.class)); cards.add(new SetCardInfo("Brotherhood Ambushers", 285, Rarity.UNCOMMON, mage.cards.b.BrotherhoodAmbushers.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java index 1d1b9954d18..459acaca2ad 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java @@ -18,7 +18,10 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.util.CardUtil; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; /** * Manifest @@ -115,6 +118,10 @@ public class ManifestEffect extends OneShotEffect { } public static List doManifestCards(Game game, Ability source, Player manifestPlayer, Set cardsToManifest, boolean cloakNotManifest) { + return doManifestCards(game, source, manifestPlayer, cardsToManifest, cloakNotManifest, false); + } + + public static List doManifestCards(Game game, Ability source, Player manifestPlayer, Set cardsToManifest, boolean cloakNotManifest, boolean tapped) { if (cardsToManifest.isEmpty()) { return Collections.emptyList(); } @@ -149,7 +156,7 @@ public class ManifestEffect extends OneShotEffect { List manifested = new ArrayList<>(); // move cards to battlefield as face down // TODO: possible buggy for multiple cards, see rule 701.34e - it require manifest one by one (card to check: Omarthis, Ghostfire Initiate) - manifestPlayer.moveCards(cardsToManifest, Zone.BATTLEFIELD, source, game, false, true, false, null); + manifestPlayer.moveCards(cardsToManifest, Zone.BATTLEFIELD, source, game, tapped, true, false, null); for (Card card : cardsToManifest) { Card battlefieldCard = BecomesFaceDownCreatureEffect.findDefaultCardSideForFaceDown(game, card);