From 8950d35ec709700c473fa5b6e6bb6529e52ac269 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 7 Apr 2021 09:18:36 -0400 Subject: [PATCH] [STX] Implemented Test of Talents --- Mage.Sets/src/mage/cards/t/TestOfTalents.java | 102 ++++++++++++++++++ .../mage/sets/StrixhavenSchoolOfMages.java | 1 + ...dHandLibraryForCardNameAndExileEffect.java | 12 ++- 3 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/t/TestOfTalents.java diff --git a/Mage.Sets/src/mage/cards/t/TestOfTalents.java b/Mage.Sets/src/mage/cards/t/TestOfTalents.java new file mode 100644 index 00000000000..3051c0f0aed --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TestOfTalents.java @@ -0,0 +1,102 @@ +package mage.cards.t; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.stack.StackObject; +import mage.players.Player; +import mage.target.TargetSpell; +import mage.util.CardUtil; + +import java.util.Objects; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TestOfTalents extends CardImpl { + + public TestOfTalents(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); + + // Counter target instant or sorcery spell. Search its controller's graveyard, hand, and library for any number of cards with the same name as that spell and exile them. That player shuffles, then draws a card for each card exiled from their hand this way. + this.getSpellAbility().addEffect(new TestOfTalentsEffect()); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); + } + + private TestOfTalents(final TestOfTalents card) { + super(card); + } + + @Override + public TestOfTalents copy() { + return new TestOfTalents(this); + } +} + +class TestOfTalentsEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExileEffect { + + TestOfTalentsEffect() { + super(false, "its controller's", "all cards with the same name as that spell"); + staticText = "counter target instant or sorcery spell. Search its controller's graveyard, hand, " + + "and library for any number of cards with the same name as that spell and exile them. " + + "That player shuffles, then draws a card for each card exiled from their hand this way"; + } + + private TestOfTalentsEffect(final TestOfTalentsEffect effect) { + super(effect); + } + + @Override + public TestOfTalentsEffect copy() { + return new TestOfTalentsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + StackObject stackObject = game.getStack().getStackObject(source.getFirstTarget()); + if (stackObject == null) { + return false; + } + MageObject targetObject = game.getObject(stackObject.getSourceId()); + String cardName; + if (targetObject instanceof Card) { + cardName = targetObject.getName(); + } else { + cardName = ""; + } + UUID searchPlayerId = stackObject.getControllerId(); + Player player = game.getPlayer(searchPlayerId); + if (player == null) { + return false; + } + int previousCount = player + .getHand() + .getCards(game) + .stream() + .map(MageObject::getName) + .filter(Objects::nonNull) + .mapToInt(s -> CardUtil.haveSameNames(s, cardName) ? 1 : 0) + .sum(); + game.getStack().counter(source.getFirstTarget(), source, game); + this.applySearchAndExile(game, source, cardName, searchPlayerId); + int newCount = player + .getHand() + .getCards(game) + .stream() + .map(MageObject::getName) + .filter(Objects::nonNull) + .mapToInt(s -> CardUtil.haveSameNames(s, cardName) ? 1 : 0) + .sum(); + if (previousCount > newCount) { + player.drawCards(previousCount - newCount, source, game); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java index fa17181e318..8c006f0f67a 100644 --- a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java +++ b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java @@ -244,6 +244,7 @@ public final class StrixhavenSchoolOfMages extends ExpansionSet { cards.add(new SetCardInfo("Tempted by the Oriq", 58, Rarity.RARE, mage.cards.t.TemptedByTheOriq.class)); cards.add(new SetCardInfo("Tend the Pests", 242, Rarity.UNCOMMON, mage.cards.t.TendThePests.class)); cards.add(new SetCardInfo("Tenured Inkcaster", 88, Rarity.UNCOMMON, mage.cards.t.TenuredInkcaster.class)); + cards.add(new SetCardInfo("Test of Talents", 59, Rarity.UNCOMMON, mage.cards.t.TestOfTalents.class)); cards.add(new SetCardInfo("Thrilling Discovery", 243, Rarity.COMMON, mage.cards.t.ThrillingDiscovery.class)); cards.add(new SetCardInfo("Thunderous Orator", 35, Rarity.UNCOMMON, mage.cards.t.ThunderousOrator.class)); cards.add(new SetCardInfo("Tome Shredder", 117, Rarity.COMMON, mage.cards.t.TomeShredder.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java b/Mage/src/main/java/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java index 2a4f1f90cca..feb921e3c6c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java @@ -1,7 +1,6 @@ package mage.abilities.effects.common.search; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; @@ -16,8 +15,9 @@ import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** - * * @author LevelX2 */ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect extends OneShotEffect { @@ -48,12 +48,11 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect } /** - * * @param game * @param source - * @param cardName name of the card to exile + * @param cardName name of the card to exile * @param targetPlayerId id of the target player to exile card name from his - * or her zones + * or her zones * @return */ public boolean applySearchAndExile(Game game, Ability source, String cardName, UUID targetPlayerId) { @@ -102,6 +101,9 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect @Override public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } StringBuilder sb = new StringBuilder(); sb.append("search ").append(this.searchWhatText); sb.append(" graveyard, hand, and library for ");