From 570a2e966184ea8c7805102eb13966ad9874ff29 Mon Sep 17 00:00:00 2001 From: ssk97 Date: Wed, 7 Aug 2024 23:46:49 -0700 Subject: [PATCH] [BLB] Beza the Bounding Spring, Bandit's Talent, Persistent Marshstalker, fix some existing BLB cards (#12629) * Beza, the Bounding Spring * Bandit's Talent, minor change to DrawCardSourceControllerEffect text generation * Persistent Marshstalker * Patchwork Banner fix controller requirement * Fix FeatherOfFlight, LupinflowerVillage, HivespineWolverine, HazardrootHerbalist * Fix missing Zone on Persistent Marshstalker ability --- Mage.Sets/src/mage/cards/b/BanditsTalent.java | 186 ++++++++++++++++++ .../mage/cards/b/BezaTheBoundingSpring.java | 87 ++++++++ .../src/mage/cards/f/FeatherOfFlight.java | 4 + .../src/mage/cards/h/HazardrootHerbalist.java | 4 +- .../src/mage/cards/h/HivespineWolverine.java | 4 +- .../src/mage/cards/l/LupinflowerVillage.java | 2 + .../src/mage/cards/p/PatchworkBanner.java | 10 +- .../mage/cards/p/PersistentMarshstalker.java | 61 ++++++ Mage.Sets/src/mage/sets/Bloomburrow.java | 3 + .../DrawCardSourceControllerEffect.java | 4 +- 10 files changed, 359 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/b/BanditsTalent.java create mode 100644 Mage.Sets/src/mage/cards/b/BezaTheBoundingSpring.java create mode 100644 Mage.Sets/src/mage/cards/p/PersistentMarshstalker.java diff --git a/Mage.Sets/src/mage/cards/b/BanditsTalent.java b/Mage.Sets/src/mage/cards/b/BanditsTalent.java new file mode 100644 index 00000000000..42e671d61e0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BanditsTalent.java @@ -0,0 +1,186 @@ +package mage.cards.b; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfDrawTriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.abilities.effects.common.continuous.GainClassAbilitySourceEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.ClassLevelAbility; +import mage.abilities.keyword.ClassReminderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetDiscard; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +/** + * @author notgreat + */ +public final class BanditsTalent extends CardImpl { + + public BanditsTalent(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + + this.subtype.add(SubType.CLASS); + + // (Gain the next level as a sorcery to add its ability.) + this.addAbility(new ClassReminderAbility()); + // When Bandit's Talent enters, each opponent discards two cards unless they discard a nonland card. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new BanditsTalentDiscardEffect() + )); + + // {B}: Level 2 + this.addAbility(new ClassLevelAbility(2, "{B}")); + // At the beginning of each opponent's upkeep, if that player has one or fewer cards in hand, they lose 2 life. + this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(new BeginningOfUpkeepTriggeredAbility( + new ConditionalOneShotEffect(new LoseLifeTargetEffect(2), new CardsInHandCondition(ComparisonType.OR_LESS, 1, TargetController.ACTIVE)), + TargetController.OPPONENT, false), 2))); + + // {3}{B}: Level 3 + this.addAbility(new ClassLevelAbility(3, "{3}{B}")); + // At the beginning of your draw step, draw an additional card for each opponent who has one or fewer cards in hand. + this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(new BeginningOfDrawTriggeredAbility( + new DrawCardSourceControllerEffect(BanditsTalentValue.instance), TargetController.YOU, false), 3)) + .addHint(BanditsTalentValue.getHint())); + } + + private BanditsTalent(final BanditsTalent card) { + super(card); + } + + @Override + public BanditsTalent copy() { + return new BanditsTalent(this); + } +} + +//Combination of Wrench Mind and DiscardEachPlayerEffect +class BanditsTalentDiscardEffect extends OneShotEffect { + + BanditsTalentDiscardEffect() { + super(Outcome.Discard); + this.staticText = "each opponent discards two cards unless they discard a nonland card"; + } + + private BanditsTalentDiscardEffect(final BanditsTalentDiscardEffect effect) { + super(effect); + } + + @Override + public BanditsTalentDiscardEffect copy() { + return new BanditsTalentDiscardEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + // Store for each player the cards to discard, that's important because all discard shall happen at the same time + Map cardsToDiscard = new HashMap<>(); + if (controller == null) { + return false; + } + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player targetPlayer = game.getPlayer(playerId); + if (targetPlayer == null || targetPlayer.getHand().isEmpty()) { + continue; + } + + int numberOfCardsToDiscard = Math.min(2, targetPlayer.getHand().size()); + Cards cards = new CardsImpl(); + + if (numberOfCardsToDiscard > 0) { + if (targetPlayer.getHand().count(StaticFilters.FILTER_CARD_NON_LAND, game) < 1 + || !targetPlayer.chooseUse(Outcome.Discard, "Discard a nonland card?", source, game)) { + //Discard 2 cards + Target target = new TargetDiscard( + numberOfCardsToDiscard, numberOfCardsToDiscard, + StaticFilters.FILTER_CARD, playerId + ); + targetPlayer.chooseTarget(outcome, target, source, game); + cards.addAll(target.getTargets()); + } else { + //Discard a nonland + Target target = new TargetDiscard( + 1, 1, + StaticFilters.FILTER_CARD_NON_LAND, playerId + ); + targetPlayer.chooseTarget(outcome, target, source, game); + cards.addAll(target.getTargets()); + } + cardsToDiscard.put(playerId, cards); + } + } + + // discard all chosen cards + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player == null) { + continue; + } + player.discard(cardsToDiscard.get(playerId), false, source, game); + } + return true; + } +} + + +enum BanditsTalentValue implements DynamicValue { + instance; + private static final Hint hint = new ValueHint("opponents who have one or fewer cards in hand", instance); + + public static Hint getHint() { + return hint; + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + Player player = game.getPlayer(sourceAbility.getControllerId()); + if (player == null) { + return 0; + } + return game + .getOpponents(sourceAbility.getControllerId()) + .stream() + .map(game::getPlayer) + .map(Player::getHand) + .mapToInt(Set::size) + .map(x -> x <= 1 ? 1 : 0) + .sum(); + } + + @Override + public BanditsTalentValue copy() { + return this; + } + + @Override + public String getMessage() { + return "opponent who has one or fewer cards in hand"; + } + + @Override + public String toString() { + return "an additional card"; + } +} diff --git a/Mage.Sets/src/mage/cards/b/BezaTheBoundingSpring.java b/Mage.Sets/src/mage/cards/b/BezaTheBoundingSpring.java new file mode 100644 index 00000000000..cdf57adce26 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BezaTheBoundingSpring.java @@ -0,0 +1,87 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.OpponentControlsMoreCondition; +import mage.abilities.condition.common.OpponentHasMoreLifeCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.token.FishNoAbilityToken; +import mage.game.permanent.token.TreasureToken; +import mage.players.Player; + +import java.util.UUID; + +/** + * @author notgreat + */ +public final class BezaTheBoundingSpring extends CardImpl { + + public BezaTheBoundingSpring(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.ELK); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // When Beza, the Bounding Spring enters, create a Treasure token if an opponent controls more lands than you. You gain 4 life if an opponent has more life than you. Create two 1/1 blue Fish creature tokens if an opponent controls more creatures than you. Draw a card if an opponent has more cards in hand than you. + Ability ability = new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect( + new CreateTokenEffect(new TreasureToken()), new OpponentControlsMoreCondition(StaticFilters.FILTER_LANDS))); + ability.addEffect(new ConditionalOneShotEffect( + new GainLifeEffect(4), OpponentHasMoreLifeCondition.instance)); + ability.addEffect(new ConditionalOneShotEffect( + new CreateTokenEffect(new FishNoAbilityToken(), 2), new OpponentControlsMoreCondition(StaticFilters.FILTER_PERMANENT_CREATURES))); + ability.addEffect(new ConditionalOneShotEffect( + new DrawCardSourceControllerEffect(1), BezaOpponentHasMoreCardsInHandThanYouCondition.instance)); + this.addAbility(ability); + } + + private BezaTheBoundingSpring(final BezaTheBoundingSpring card) { + super(card); + } + + @Override + public BezaTheBoundingSpring copy() { + return new BezaTheBoundingSpring(this); + } +} + +//Based on MoreCardsInHandThanOpponentsCondition +enum BezaOpponentHasMoreCardsInHandThanYouCondition implements Condition { + + instance; + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + int cardsInHand = player.getHand().size(); + for (UUID playerId : game.getOpponents(source.getControllerId())) { + Player opponent = game.getPlayer(playerId); + if (opponent != null && opponent.getHand().size() > cardsInHand) { + return true; + } + } + } + return false; + } + + @Override + public String toString() { + return "an opponent has more cards in hand than you"; + } + +} diff --git a/Mage.Sets/src/mage/cards/f/FeatherOfFlight.java b/Mage.Sets/src/mage/cards/f/FeatherOfFlight.java index e7f86d7e5d3..10bd991243b 100644 --- a/Mage.Sets/src/mage/cards/f/FeatherOfFlight.java +++ b/Mage.Sets/src/mage/cards/f/FeatherOfFlight.java @@ -8,6 +8,7 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -30,6 +31,9 @@ public final class FeatherOfFlight extends CardImpl { this.subtype.add(SubType.AURA); + // Flash + this.addAbility(FlashAbility.getInstance()); + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); diff --git a/Mage.Sets/src/mage/cards/h/HazardrootHerbalist.java b/Mage.Sets/src/mage/cards/h/HazardrootHerbalist.java index 854bb481645..c7589565095 100644 --- a/Mage.Sets/src/mage/cards/h/HazardrootHerbalist.java +++ b/Mage.Sets/src/mage/cards/h/HazardrootHerbalist.java @@ -2,7 +2,7 @@ package mage.cards.h; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.TargetObjectMatchesFilterCondition; import mage.abilities.decorator.ConditionalOneShotEffect; @@ -35,7 +35,7 @@ public final class HazardrootHerbalist extends CardImpl { this.toughness = new MageInt(4); // Whenever you attack, target creature you control gets +1/+0 until end of turn. If that creature is a token, it also gains deathtouch until end of turn. - Ability ability = new AttacksTriggeredAbility(new BoostTargetEffect(1, 0)); + Ability ability = new AttacksCreatureYouControlTriggeredAbility(new BoostTargetEffect(1, 0)); ability.addEffect(new ConditionalOneShotEffect( new AddContinuousEffectToGame(new GainAbilityTargetEffect(DeathtouchAbility.getInstance())), condition, "if that creature is a token, it also gains deathtouch until end of turn" diff --git a/Mage.Sets/src/mage/cards/h/HivespineWolverine.java b/Mage.Sets/src/mage/cards/h/HivespineWolverine.java index b0b7bd4616d..4f75b92a369 100644 --- a/Mage.Sets/src/mage/cards/h/HivespineWolverine.java +++ b/Mage.Sets/src/mage/cards/h/HivespineWolverine.java @@ -39,8 +39,8 @@ public final class HivespineWolverine extends CardImpl { ability.addTarget(new TargetControlledCreaturePermanent()); // * Hivespine Wolverine fights target creature token. - ability.addMode(new Mode(new FightTargetSourceEffect())); - ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_TOKEN)); + ability.addMode(new Mode(new FightTargetSourceEffect()) + .addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_TOKEN))); // * Destroy target artifact or enchantment. ability.addMode(new Mode(new DestroyTargetEffect()) diff --git a/Mage.Sets/src/mage/cards/l/LupinflowerVillage.java b/Mage.Sets/src/mage/cards/l/LupinflowerVillage.java index 4073dc26d1c..5d6e1c6bc95 100644 --- a/Mage.Sets/src/mage/cards/l/LupinflowerVillage.java +++ b/Mage.Sets/src/mage/cards/l/LupinflowerVillage.java @@ -3,6 +3,7 @@ package mage.cards.l; import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; @@ -52,6 +53,7 @@ public final class LupinflowerVillage extends CardImpl { 6, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM ), new ManaCostsImpl<>("{1}{W}")); ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/PatchworkBanner.java b/Mage.Sets/src/mage/cards/p/PatchworkBanner.java index 92469365147..4f4732f7be0 100644 --- a/Mage.Sets/src/mage/cards/p/PatchworkBanner.java +++ b/Mage.Sets/src/mage/cards/p/PatchworkBanner.java @@ -10,6 +10,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; import java.util.UUID; @@ -18,6 +20,12 @@ import java.util.UUID; */ public final class PatchworkBanner extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control of the chosen type"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + } + public PatchworkBanner(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); @@ -26,7 +34,7 @@ public final class PatchworkBanner extends CardImpl { // Creatures you control of the chosen type get +1/+1. this.addAbility(new SimpleStaticAbility(new BoostAllOfChosenSubtypeEffect( - 1, 1, Duration.WhileOnBattlefield, false + 1, 1, Duration.WhileOnBattlefield, filter, false ))); // {T}: Add one mana of any color. diff --git a/Mage.Sets/src/mage/cards/p/PersistentMarshstalker.java b/Mage.Sets/src/mage/cards/p/PersistentMarshstalker.java new file mode 100644 index 00000000000..2f0874e6837 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PersistentMarshstalker.java @@ -0,0 +1,61 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.ThresholdCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; + +/** + * @author notgreat + */ +public final class PersistentMarshstalker extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("other Rat you control"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + filter.add(AnotherPredicate.instance); + filter.add(SubType.RAT.getPredicate()); + } + + public PersistentMarshstalker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.RAT); + this.subtype.add(SubType.BERSERKER); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Persistent Marshstalker gets +1/+0 for each other Rat you control. + this.addAbility(new SimpleStaticAbility(new BoostSourceEffect(new PermanentsOnBattlefieldCount(filter), StaticValue.get(0), Duration.WhileOnBattlefield))); + + // Threshold -- Whenever you attack with one or more Rats, if seven or more cards are in your graveyard, you may pay {2}{B}. If you do, return Persistent Marshstalker from your graveyard to the battlefield tapped and attacking. + this.addAbility(new AttacksWithCreaturesTriggeredAbility(Zone.GRAVEYARD, new ConditionalOneShotEffect(new DoIfCostPaid( + new ReturnSourceFromGraveyardToBattlefieldEffect(true, false, false, true), new ManaCostsImpl<>("{2}{B}")), + ThresholdCondition.instance), 1, filter).setTriggerPhrase("Whenever you attack with one or more Rats, ") + .setAbilityWord(AbilityWord.THRESHOLD)); + } + + private PersistentMarshstalker(final PersistentMarshstalker card) { + super(card); + } + + @Override + public PersistentMarshstalker copy() { + return new PersistentMarshstalker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Bloomburrow.java b/Mage.Sets/src/mage/sets/Bloomburrow.java index e771d83b727..9e0534dddd7 100644 --- a/Mage.Sets/src/mage/sets/Bloomburrow.java +++ b/Mage.Sets/src/mage/sets/Bloomburrow.java @@ -28,11 +28,13 @@ public final class Bloomburrow extends ExpansionSet { cards.add(new SetCardInfo("Artist's Talent", 124, Rarity.RARE, mage.cards.a.ArtistsTalent.class)); cards.add(new SetCardInfo("Azure Beastbinder", 41, Rarity.RARE, mage.cards.a.AzureBeastbinder.class)); cards.add(new SetCardInfo("Bakersbane Duo", 163, Rarity.COMMON, mage.cards.b.BakersbaneDuo.class)); + cards.add(new SetCardInfo("Bandit's Talent", 83, Rarity.UNCOMMON, mage.cards.b.BanditsTalent.class)); cards.add(new SetCardInfo("Banishing Light", 1, Rarity.COMMON, mage.cards.b.BanishingLight.class)); cards.add(new SetCardInfo("Bark-Knuckle Boxer", 164, Rarity.UNCOMMON, mage.cards.b.BarkKnuckleBoxer.class)); cards.add(new SetCardInfo("Barkform Harvester", 243, Rarity.COMMON, mage.cards.b.BarkformHarvester.class)); cards.add(new SetCardInfo("Baylen, the Haymaker", 205, Rarity.RARE, mage.cards.b.BaylenTheHaymaker.class)); cards.add(new SetCardInfo("Bellowing Crier", 42, Rarity.COMMON, mage.cards.b.BellowingCrier.class)); + cards.add(new SetCardInfo("Beza, the Bounding Spring", 2, Rarity.MYTHIC, mage.cards.b.BezaTheBoundingSpring.class)); cards.add(new SetCardInfo("Blacksmith's Talent", 125, Rarity.UNCOMMON, mage.cards.b.BlacksmithsTalent.class)); cards.add(new SetCardInfo("Blooming Blast", 126, Rarity.UNCOMMON, mage.cards.b.BloomingBlast.class)); cards.add(new SetCardInfo("Blossoming Sands", 396, Rarity.COMMON, mage.cards.b.BlossomingSands.class)); @@ -169,6 +171,7 @@ public final class Bloomburrow extends ExpansionSet { cards.add(new SetCardInfo("Pawpatch Formation", 186, Rarity.UNCOMMON, mage.cards.p.PawpatchFormation.class)); cards.add(new SetCardInfo("Pearl of Wisdom", 64, Rarity.COMMON, mage.cards.p.PearlOfWisdom.class)); cards.add(new SetCardInfo("Peerless Recycling", 188, Rarity.UNCOMMON, mage.cards.p.PeerlessRecycling.class)); + cards.add(new SetCardInfo("Persistent Marshstalker", 104, Rarity.UNCOMMON, mage.cards.p.PersistentMarshstalker.class)); cards.add(new SetCardInfo("Pileated Provisioner", 25, Rarity.COMMON, mage.cards.p.PileatedProvisioner.class)); cards.add(new SetCardInfo("Plains", 262, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Playful Shove", 145, Rarity.UNCOMMON, mage.cards.p.PlayfulShove.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DrawCardSourceControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DrawCardSourceControllerEffect.java index 56df0abd2a0..9efb5fc5811 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DrawCardSourceControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DrawCardSourceControllerEffect.java @@ -64,7 +64,9 @@ public class DrawCardSourceControllerEffect extends OneShotEffect { } String value = amount.toString(); sb.append(CardUtil.numberToText(value, "a")); - sb.append(value.equals("1") ? " card" : " cards"); + if (!value.contains("card")) { + sb.append(value.equals("1") ? " card" : " cards"); + } String message = amount.getMessage(); if (!message.isEmpty()) { sb.append(value.equals("X") ? ", where X is " : " for each ");