diff --git a/Mage.Sets/src/mage/cards/a/AbandonHope.java b/Mage.Sets/src/mage/cards/a/AbandonHope.java
index ca314d3902f..f2be8574112 100644
--- a/Mage.Sets/src/mage/cards/a/AbandonHope.java
+++ b/Mage.Sets/src/mage/cards/a/AbandonHope.java
@@ -6,11 +6,10 @@ import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.common.DiscardTargetCost;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.common.InfoEffect;
-import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
@@ -35,9 +34,7 @@ public final class AbandonHope extends CardImpl {
this.addAbility(ability);
// Look at target opponent's hand and choose X cards from it. That player discards those cards.
- this.getSpellAbility().addEffect(
- new DiscardCardYouChooseTargetEffect(ManacostVariableValue.REGULAR, TargetController.ANY)
- .setText("Look at target opponent's hand and choose X cards from it. That player discards those cards"));
+ this.getSpellAbility().addEffect(new LookTargetHandChooseDiscardEffect(false, ManacostVariableValue.REGULAR));
this.getSpellAbility().addTarget(new TargetOpponent());
this.getSpellAbility().setCostAdjuster(AbandonHopeAdjuster.instance);
}
diff --git a/Mage.Sets/src/mage/cards/a/AcquisitionsExpert.java b/Mage.Sets/src/mage/cards/a/AcquisitionsExpert.java
index 85f7fe6757b..3a9dc115ea2 100644
--- a/Mage.Sets/src/mage/cards/a/AcquisitionsExpert.java
+++ b/Mage.Sets/src/mage/cards/a/AcquisitionsExpert.java
@@ -10,7 +10,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.target.common.TargetOpponent;
import java.util.UUID;
@@ -30,7 +29,7 @@ public final class AcquisitionsExpert extends CardImpl {
// When Acquisitions Expert enters the battlefield, target opponent reveals a number of cards from their hand equal to the number of creatures in your party. You choose one of those cards. That player discards that card.
Ability ability = new EntersBattlefieldTriggeredAbility(
- new DiscardCardYouChooseTargetEffect(TargetController.OPPONENT, PartyCount.instance)
+ new DiscardCardYouChooseTargetEffect(PartyCount.instance)
.setText("target opponent reveals a number of cards from their hand " +
"equal to the number of creatures in your party. You choose one of those cards. " +
"That player discards that card. " + PartyCount.getReminder())
diff --git a/Mage.Sets/src/mage/cards/b/BalaGedThief.java b/Mage.Sets/src/mage/cards/b/BalaGedThief.java
index 574025d2f60..a88be971965 100644
--- a/Mage.Sets/src/mage/cards/b/BalaGedThief.java
+++ b/Mage.Sets/src/mage/cards/b/BalaGedThief.java
@@ -12,7 +12,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPlayer;
@@ -34,7 +33,7 @@ public final class BalaGedThief extends CardImpl {
// Whenever Bala Ged Thief or another Ally enters the battlefield under your control,
// target player reveals a number of cards from their hand equal to the number of Allies you control.
// You choose one of them. That player discards that card.
- Ability ability = new AllyEntersBattlefieldTriggeredAbility(new DiscardCardYouChooseTargetEffect(TargetController.ANY, xValue), false);
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(new DiscardCardYouChooseTargetEffect(xValue), false);
ability.addTarget(new TargetPlayer());
this.addAbility(ability.setAbilityWord(null));
}
diff --git a/Mage.Sets/src/mage/cards/b/Blackmail.java b/Mage.Sets/src/mage/cards/b/Blackmail.java
index efd9838a5a2..42687b8a232 100644
--- a/Mage.Sets/src/mage/cards/b/Blackmail.java
+++ b/Mage.Sets/src/mage/cards/b/Blackmail.java
@@ -6,7 +6,6 @@ import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.target.TargetPlayer;
/**
@@ -20,7 +19,7 @@ public final class Blackmail extends CardImpl {
// Target player reveals three cards from their hand and you choose one of them. That player discards that card.
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(TargetController.ANY, 3));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(3));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/c/CabalInterrogator.java b/Mage.Sets/src/mage/cards/c/CabalInterrogator.java
index 546f10d889b..4753d6b507b 100644
--- a/Mage.Sets/src/mage/cards/c/CabalInterrogator.java
+++ b/Mage.Sets/src/mage/cards/c/CabalInterrogator.java
@@ -11,7 +11,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.target.TargetPlayer;
import java.util.UUID;
@@ -32,7 +31,7 @@ public final class CabalInterrogator extends CardImpl {
// {X}{B}, {tap}: Target player reveals X cards from their hand and you choose one of them. That player discards that card.
// Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
- new DiscardCardYouChooseTargetEffect(TargetController.ANY, ManacostVariableValue.REGULAR),
+ new DiscardCardYouChooseTargetEffect(ManacostVariableValue.REGULAR),
new ManaCostsImpl<>("{X}{B}"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetPlayer());
diff --git a/Mage.Sets/src/mage/cards/c/CollectiveBrutality.java b/Mage.Sets/src/mage/cards/c/CollectiveBrutality.java
index a5242bb7fa0..17a02642c6e 100644
--- a/Mage.Sets/src/mage/cards/c/CollectiveBrutality.java
+++ b/Mage.Sets/src/mage/cards/c/CollectiveBrutality.java
@@ -12,7 +12,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.target.common.TargetCreaturePermanent;
@@ -45,7 +44,7 @@ public final class CollectiveBrutality extends CardImpl {
this.getSpellAbility().getModes().setMaxModes(3);
// Target opponent reveals their hand. You choose an instant or sorcery card from it. That player discards that card.
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter, TargetController.OPPONENT));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter));
this.getSpellAbility().addTarget(new TargetOpponent().withChooseHint("reveals hand, you choose to discard"));
// Target creature gets -2/-2 until end of turn.
diff --git a/Mage.Sets/src/mage/cards/d/DiscipleOfPhenax.java b/Mage.Sets/src/mage/cards/d/DiscipleOfPhenax.java
index fa3d079d89e..c0abe5bcbe4 100644
--- a/Mage.Sets/src/mage/cards/d/DiscipleOfPhenax.java
+++ b/Mage.Sets/src/mage/cards/d/DiscipleOfPhenax.java
@@ -9,7 +9,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.target.TargetPlayer;
import java.util.UUID;
@@ -29,7 +28,7 @@ public final class DiscipleOfPhenax extends CardImpl {
// When Disciple of Phenax enters the battlefield, target player reveals a number of cards
// from their hand equal to your devotion to black. You choose one of them. That player discards that card.
- Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardCardYouChooseTargetEffect(TargetController.ANY, DevotionCount.B));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardCardYouChooseTargetEffect(DevotionCount.B));
ability.addTarget(new TargetPlayer());
ability.addHint(DevotionCount.B.getHint());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/d/DiscordantDirge.java b/Mage.Sets/src/mage/cards/d/DiscordantDirge.java
index fc837732405..58953d8e1c6 100644
--- a/Mage.Sets/src/mage/cards/d/DiscordantDirge.java
+++ b/Mage.Sets/src/mage/cards/d/DiscordantDirge.java
@@ -7,19 +7,16 @@ import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
-import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
-import mage.players.Player;
-import mage.target.TargetCard;
import mage.target.common.TargetOpponent;
import java.util.UUID;
@@ -74,20 +71,7 @@ class DiscordantDirgeEffect extends OneShotEffect {
return false;
}
int verseCounters = discordantDirge.getCounters(game).getCount(CounterType.VERSE);
- Player targetOpponent = game.getPlayer(source.getFirstTarget());
- Player controller = game.getPlayer(source.getControllerId());
- if (targetOpponent == null
- || controller == null) {
- return false;
- }
- controller.lookAtCards(targetOpponent.getName() + " hand", targetOpponent.getHand(), game);
- TargetCard target = new TargetCard(0, verseCounters, Zone.HAND, new FilterCard());
- target.setNotTarget(true);
- if (!controller.choose(Outcome.Benefit, targetOpponent.getHand(), target, source, game)) {
- return false;
- }
- targetOpponent.discard(new CardsImpl(target.getTargets()), false, source, game);
- return true;
+ return new LookTargetHandChooseDiscardEffect(true, verseCounters).apply(game, source);
}
@Override
diff --git a/Mage.Sets/src/mage/cards/d/Distress.java b/Mage.Sets/src/mage/cards/d/Distress.java
index 5d2eda30401..97ca0572912 100644
--- a/Mage.Sets/src/mage/cards/d/Distress.java
+++ b/Mage.Sets/src/mage/cards/d/Distress.java
@@ -6,7 +6,6 @@ import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.target.TargetPlayer;
@@ -21,7 +20,7 @@ public final class Distress extends CardImpl {
// Target player reveals their hand. You choose a nonland card from it. That player discards that card.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND));
}
private Distress(final Distress card) {
diff --git a/Mage.Sets/src/mage/cards/d/Divest.java b/Mage.Sets/src/mage/cards/d/Divest.java
index 5ca23291feb..0830d660b8d 100644
--- a/Mage.Sets/src/mage/cards/d/Divest.java
+++ b/Mage.Sets/src/mage/cards/d/Divest.java
@@ -7,7 +7,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
-import mage.constants.TargetController;
import mage.target.TargetPlayer;
/**
@@ -22,7 +21,7 @@ public final class Divest extends CardImpl {
// Target player reveals their hand. You choose an artifact or creature card from it. That player discards that card.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_ARTIFACT_OR_CREATURE, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_ARTIFACT_OR_CREATURE));
}
private Divest(final Divest card) {
diff --git a/Mage.Sets/src/mage/cards/d/DoomsdaySpecter.java b/Mage.Sets/src/mage/cards/d/DoomsdaySpecter.java
index e39491dbcd7..63b81886ada 100644
--- a/Mage.Sets/src/mage/cards/d/DoomsdaySpecter.java
+++ b/Mage.Sets/src/mage/cards/d/DoomsdaySpecter.java
@@ -1,4 +1,3 @@
-
package mage.cards.d;
import java.util.UUID;
@@ -7,7 +6,7 @@ import mage.ObjectColor;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandChosenControlledPermanentEffect;
-import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -20,11 +19,10 @@ import mage.filter.predicate.mageobject.ColorPredicate;
/**
*
* @author LoneFox
-
*/
public final class DoomsdaySpecter extends CardImpl {
- static final private FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("blue or black creature you control");
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("blue or black creature you control");
static {
filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLUE), new ColorPredicate(ObjectColor.BLACK)));
@@ -41,7 +39,7 @@ public final class DoomsdaySpecter extends CardImpl {
// When Doomsday Specter enters the battlefield, return a blue or black creature you control to its owner's hand.
this.addAbility(new EntersBattlefieldTriggeredAbility(new ReturnToHandChosenControlledPermanentEffect(filter), false));
// Whenever Doomsday Specter deals combat damage to a player, look at that player's hand and choose a card from it. The player discards that card.
- this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardCardYouChooseTargetEffect(), false, true));
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new LookTargetHandChooseDiscardEffect(), false, true));
}
private DoomsdaySpecter(final DoomsdaySpecter card) {
diff --git a/Mage.Sets/src/mage/cards/d/DreadFugue.java b/Mage.Sets/src/mage/cards/d/DreadFugue.java
index 1ef552f24fa..de16ae660f1 100644
--- a/Mage.Sets/src/mage/cards/d/DreadFugue.java
+++ b/Mage.Sets/src/mage/cards/d/DreadFugue.java
@@ -29,13 +29,13 @@ public final class DreadFugue extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}");
// Cleave {2}{B}
- Ability ability = new CleaveAbility(this, new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY), "{2}{B}");
+ Ability ability = new CleaveAbility(this, new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND), "{2}{B}");
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
// Target player reveals their hand. Choose a nonland card from it [with mana value 2 or less]. That player discards that card.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter));
}
private DreadFugue(final DreadFugue card) {
diff --git a/Mage.Sets/src/mage/cards/d/DrillBit.java b/Mage.Sets/src/mage/cards/d/DrillBit.java
index f33065fee49..f9cb1799b7d 100644
--- a/Mage.Sets/src/mage/cards/d/DrillBit.java
+++ b/Mage.Sets/src/mage/cards/d/DrillBit.java
@@ -6,7 +6,6 @@ import mage.abilities.keyword.SpectacleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.target.TargetPlayer;
@@ -22,7 +21,7 @@ public final class DrillBit extends CardImpl {
// Target player reveals their hand. You choose a nonland card from it. That player discards that card.
this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(
- StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY
+ StaticFilters.FILTER_CARD_NON_LAND
));
this.getSpellAbility().addTarget(new TargetPlayer());
diff --git a/Mage.Sets/src/mage/cards/e/Encroach.java b/Mage.Sets/src/mage/cards/e/Encroach.java
index b15c28dfdba..9b0e14f5456 100644
--- a/Mage.Sets/src/mage/cards/e/Encroach.java
+++ b/Mage.Sets/src/mage/cards/e/Encroach.java
@@ -7,7 +7,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SuperType;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.target.TargetPlayer;
@@ -29,7 +28,7 @@ public final class Encroach extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}");
// Target player reveals their hand. You choose a nonbasic land card from it. That player discards that card.
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/e/Extortion.java b/Mage.Sets/src/mage/cards/e/Extortion.java
index a772a90ff91..9de2e2e9304 100644
--- a/Mage.Sets/src/mage/cards/e/Extortion.java
+++ b/Mage.Sets/src/mage/cards/e/Extortion.java
@@ -1,18 +1,10 @@
package mage.cards.e;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.cards.CardsImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.filter.StaticFilters;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.TargetCard;
import mage.target.TargetPlayer;
-import mage.target.common.TargetCardInHand;
import java.util.UUID;
@@ -25,7 +17,7 @@ public final class Extortion extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{B}");
// Look at target player's hand and choose up to two cards from it. That player discards those cards.
- this.getSpellAbility().addEffect(new ExtortionEffect());
+ this.getSpellAbility().addEffect(new LookTargetHandChooseDiscardEffect(true, 2));
this.getSpellAbility().addTarget(new TargetPlayer());
}
@@ -38,35 +30,3 @@ public final class Extortion extends CardImpl {
return new Extortion(this);
}
}
-
-class ExtortionEffect extends OneShotEffect {
-
- ExtortionEffect() {
- super(Outcome.Discard);
- staticText = "Look at target player's hand and choose up to two cards from it. That player discards those cards.";
- }
-
- private ExtortionEffect(final ExtortionEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player targetPlayer = game.getPlayer(source.getFirstTarget());
- Player you = game.getPlayer(source.getControllerId());
- if (targetPlayer == null || you == null) {
- return false;
- }
- you.lookAtCards("Discard", targetPlayer.getHand(), game);
- TargetCard target = new TargetCardInHand(0, 2, StaticFilters.FILTER_CARD_CARDS);
- target.setNotTarget(true);
- you.choose(Outcome.Discard, targetPlayer.getHand(), target, source, game);
- targetPlayer.discard(new CardsImpl(target.getTargets()), false, source, game);
- return true;
- }
-
- @Override
- public ExtortionEffect copy() {
- return new ExtortionEffect(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/e/ExtractTheTruth.java b/Mage.Sets/src/mage/cards/e/ExtractTheTruth.java
index 631e9731f88..cf05c0407a3 100644
--- a/Mage.Sets/src/mage/cards/e/ExtractTheTruth.java
+++ b/Mage.Sets/src/mage/cards/e/ExtractTheTruth.java
@@ -30,9 +30,7 @@ public final class ExtractTheTruth extends CardImpl {
// Choose one—
// • Target opponent reveals their hand. You may choose a creature, enchantment, or planeswalker card from it. That player discards that card.
- DiscardCardYouChooseTargetEffect effect = new DiscardCardYouChooseTargetEffect(filter);
- effect.setOptional(true);
- this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter).setOptional(true));
this.getSpellAbility().addTarget(new TargetOpponent());
// • Target opponent sacrifices an enchantment.
diff --git a/Mage.Sets/src/mage/cards/g/GixsCaress.java b/Mage.Sets/src/mage/cards/g/GixsCaress.java
index 4b25c02dcb8..caf1c57f95e 100644
--- a/Mage.Sets/src/mage/cards/g/GixsCaress.java
+++ b/Mage.Sets/src/mage/cards/g/GixsCaress.java
@@ -5,7 +5,6 @@ import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.game.permanent.token.PowerstoneToken;
import mage.target.common.TargetOpponent;
@@ -22,7 +21,7 @@ public final class GixsCaress extends CardImpl {
// Target opponent reveals their hand. You choose a nonland card from it. That player discards that card.
this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(
- StaticFilters.FILTER_CARD_NON_LAND, TargetController.OPPONENT
+ StaticFilters.FILTER_CARD_NON_LAND
));
this.getSpellAbility().addTarget(new TargetOpponent());
diff --git a/Mage.Sets/src/mage/cards/g/Grief.java b/Mage.Sets/src/mage/cards/g/Grief.java
index 8c2a87c0f7c..dcebd2ed40d 100644
--- a/Mage.Sets/src/mage/cards/g/Grief.java
+++ b/Mage.Sets/src/mage/cards/g/Grief.java
@@ -12,7 +12,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.predicate.mageobject.ColorPredicate;
@@ -45,7 +44,7 @@ public final class Grief extends CardImpl {
// When Grief enters the battlefield, target opponent reveals their hand. You choose a nonland card from it. That player discards that card.
Ability ability = new EntersBattlefieldTriggeredAbility(
- new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.OPPONENT)
+ new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND)
);
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/g/GruesomeDiscovery.java b/Mage.Sets/src/mage/cards/g/GruesomeDiscovery.java
index 7358a243817..7e01a657557 100644
--- a/Mage.Sets/src/mage/cards/g/GruesomeDiscovery.java
+++ b/Mage.Sets/src/mage/cards/g/GruesomeDiscovery.java
@@ -1,6 +1,5 @@
package mage.cards.g;
-import mage.abilities.Ability;
import mage.abilities.condition.common.MorbidCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
@@ -9,7 +8,6 @@ import mage.abilities.hint.common.MorbidHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.target.TargetPlayer;
@@ -26,7 +24,7 @@ public final class GruesomeDiscovery extends CardImpl {
// Target player discards two cards.
// Morbid — If a creature died this turn, instead that player reveals their hand, you choose two cards from it, then that player discards those cards.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new DiscardCardYouChooseTargetEffect(2, TargetController.ANY), new DiscardTargetEffect(2),
+ new DiscardCardYouChooseTargetEffect(2, StaticFilters.FILTER_CARD_CARDS), new DiscardTargetEffect(2),
MorbidCondition.instance, "Target player discards two cards. " +
"
Morbid — If a creature died this turn, instead that player reveals their hand, " +
"you choose two cards from it, then that player discards those cards"
diff --git a/Mage.Sets/src/mage/cards/h/HollowSpecter.java b/Mage.Sets/src/mage/cards/h/HollowSpecter.java
index 418cfcee0ac..55f43651e48 100644
--- a/Mage.Sets/src/mage/cards/h/HollowSpecter.java
+++ b/Mage.Sets/src/mage/cards/h/HollowSpecter.java
@@ -10,12 +10,10 @@ import mage.cards.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.game.Game;
import mage.players.Player;
import mage.util.ManaUtil;
-import java.util.List;
import java.util.UUID;
/**
@@ -72,7 +70,7 @@ class HollowSpecterEffect extends OneShotEffect {
if (targetPlayer != null && controller != null && controller.chooseUse(Outcome.Benefit, "Pay {X}?", source, game)) {
int payCount = ManaUtil.playerPaysXGenericMana(true, "Hollow Specter", controller, source, game);
if (payCount > 0) {
- return new DiscardCardYouChooseTargetEffect(TargetController.ANY, payCount).setTargetPointer(targetPointer).apply(game, source);
+ return new DiscardCardYouChooseTargetEffect(payCount).setTargetPointer(targetPointer).apply(game, source);
}
return true;
}
diff --git a/Mage.Sets/src/mage/cards/h/Humiliate.java b/Mage.Sets/src/mage/cards/h/Humiliate.java
index 4e0730d49d0..04b749c6ae0 100644
--- a/Mage.Sets/src/mage/cards/h/Humiliate.java
+++ b/Mage.Sets/src/mage/cards/h/Humiliate.java
@@ -7,7 +7,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Game;
@@ -29,7 +28,7 @@ public final class Humiliate extends CardImpl {
// Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. Put a +1/+1 counter on a creature you control.
this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(
- StaticFilters.FILTER_CARD_NON_LAND, TargetController.OPPONENT
+ StaticFilters.FILTER_CARD_NON_LAND
));
this.getSpellAbility().addEffect(new HumiliateEffect());
this.getSpellAbility().addTarget(new TargetOpponent());
diff --git a/Mage.Sets/src/mage/cards/i/InquisitionOfKozilek.java b/Mage.Sets/src/mage/cards/i/InquisitionOfKozilek.java
index 71fffde96ab..1d9cb1932a4 100644
--- a/Mage.Sets/src/mage/cards/i/InquisitionOfKozilek.java
+++ b/Mage.Sets/src/mage/cards/i/InquisitionOfKozilek.java
@@ -8,7 +8,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ManaValuePredicate;
@@ -31,7 +30,7 @@ public final class InquisitionOfKozilek extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}");
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter));
}
private InquisitionOfKozilek(final InquisitionOfKozilek card) {
diff --git a/Mage.Sets/src/mage/cards/j/JandorsRing.java b/Mage.Sets/src/mage/cards/j/JandorsRing.java
index 9401fe61436..868c8d834b1 100644
--- a/Mage.Sets/src/mage/cards/j/JandorsRing.java
+++ b/Mage.Sets/src/mage/cards/j/JandorsRing.java
@@ -16,7 +16,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.constants.TargetController;
import mage.constants.WatcherScope;
import mage.constants.Zone;
import mage.filter.FilterCard;
@@ -77,7 +76,7 @@ class JandorsRingEffect extends OneShotEffect {
if (card != null) {
FilterCard filter = new FilterCard(card.getName());
filter.add(new CardIdPredicate(card.getId()));
- DiscardCardYouChooseTargetEffect effect = new DiscardCardYouChooseTargetEffect(filter, TargetController.YOU);
+ DiscardCardYouChooseTargetEffect effect = new DiscardCardYouChooseTargetEffect(filter);
if (effect.apply(game, source)) {//Conditional was already checked, card should be in hand, but if for some weird reason it fails, the card won't be drawn, although the cost will already be paid
Player controller = game.getPlayer(source.getControllerId());
if(controller != null) {
diff --git a/Mage.Sets/src/mage/cards/l/LastRites.java b/Mage.Sets/src/mage/cards/l/LastRites.java
index 0d06036cdbc..f09e365e2a7 100644
--- a/Mage.Sets/src/mage/cards/l/LastRites.java
+++ b/Mage.Sets/src/mage/cards/l/LastRites.java
@@ -9,7 +9,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.game.Game;
@@ -73,7 +72,7 @@ class LastRitesEffect extends OneShotEffect {
FilterCard filter = new FilterCard((discardCount > 1 ? "" : "a")
+ " nonland card" + (discardCount > 1 ? "s" : ""));
filter.add(Predicates.not(CardType.LAND.getPredicate()));
- Effect effect = new DiscardCardYouChooseTargetEffect(StaticValue.get(discardCount), filter, TargetController.ANY);
+ Effect effect = new DiscardCardYouChooseTargetEffect(StaticValue.get(discardCount), filter);
effect.setTargetPointer(new FixedTarget(targetPlayer.getId()));
effect.apply(game, source);
return true;
diff --git a/Mage.Sets/src/mage/cards/l/LeshracsSigil.java b/Mage.Sets/src/mage/cards/l/LeshracsSigil.java
index 8bcb6385200..46d788a08dc 100644
--- a/Mage.Sets/src/mage/cards/l/LeshracsSigil.java
+++ b/Mage.Sets/src/mage/cards/l/LeshracsSigil.java
@@ -1,4 +1,3 @@
-
package mage.cards.l;
import java.util.UUID;
@@ -8,7 +7,7 @@ import mage.abilities.common.SpellCastOpponentTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
-import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -34,7 +33,7 @@ public final class LeshracsSigil extends CardImpl {
// Whenever an opponent casts a green spell, you may pay {B}{B}. If you do, look at that player's hand and choose a card from it. The player discards that card.
this.addAbility(new SpellCastOpponentTriggeredAbility(
- Zone.BATTLEFIELD, new DoIfCostPaid(new DiscardCardYouChooseTargetEffect(), new ManaCostsImpl<>("{B}{B}")), filter, false, SetTargetPointer.PLAYER));
+ Zone.BATTLEFIELD, new DoIfCostPaid(new LookTargetHandChooseDiscardEffect(), new ManaCostsImpl<>("{B}{B}")), filter, false, SetTargetPointer.PLAYER));
// {B}{B}: Return Leshrac's Sigil to its owner's hand.
this.addAbility(new SimpleActivatedAbility(new ReturnToHandSourceEffect(true), new ManaCostsImpl<>("{B}{B}")));
diff --git a/Mage.Sets/src/mage/cards/m/MemoryTheft.java b/Mage.Sets/src/mage/cards/m/MemoryTheft.java
index ea88bfaf0c4..3c60f5b0e93 100644
--- a/Mage.Sets/src/mage/cards/m/MemoryTheft.java
+++ b/Mage.Sets/src/mage/cards/m/MemoryTheft.java
@@ -8,7 +8,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
@@ -66,7 +65,7 @@ class MemoryTheftEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
new DiscardCardYouChooseTargetEffect(
- StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY
+ StaticFilters.FILTER_CARD_NON_LAND
).apply(game, source);
Player controller = game.getPlayer(source.getControllerId());
Player player = game.getPlayer(source.getFirstTarget());
@@ -84,4 +83,4 @@ class MemoryTheftEffect extends OneShotEffect {
Card card = game.getCard(target.getFirstTarget());
return controller.moveCards(card, Zone.GRAVEYARD, source, game);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/m/MindWarp.java b/Mage.Sets/src/mage/cards/m/MindWarp.java
index 692fe4a4007..634a63c3f18 100644
--- a/Mage.Sets/src/mage/cards/m/MindWarp.java
+++ b/Mage.Sets/src/mage/cards/m/MindWarp.java
@@ -1,18 +1,11 @@
package mage.cards.m;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.dynamicvalue.common.ManacostVariableValue;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.cards.CardsImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.filter.StaticFilters;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.TargetCard;
import mage.target.TargetPlayer;
-import mage.target.common.TargetCardInHand;
import java.util.UUID;
@@ -25,7 +18,7 @@ public final class MindWarp extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{3}{B}");
// Look at target player's hand and choose X cards from it. That player discards those cards.
- this.getSpellAbility().addEffect(new MindWarpEffect());
+ this.getSpellAbility().addEffect(new LookTargetHandChooseDiscardEffect(false, ManacostVariableValue.REGULAR));
this.getSpellAbility().addTarget(new TargetPlayer());
}
@@ -38,34 +31,3 @@ public final class MindWarp extends CardImpl {
return new MindWarp(this);
}
}
-
-class MindWarpEffect extends OneShotEffect {
-
- MindWarpEffect() {
- super(Outcome.Discard);
- staticText = "Look at target player's hand and choose X cards from it. That player discards those cards.";
- }
-
- private MindWarpEffect(final MindWarpEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player targetPlayer = game.getPlayer(source.getFirstTarget());
- Player you = game.getPlayer(source.getControllerId());
- if (targetPlayer == null || you == null) {
- return false;
- }
- int amountToDiscard = source.getManaCostsToPay().getX();
- TargetCard target = new TargetCardInHand(amountToDiscard, StaticFilters.FILTER_CARD_CARDS);
- you.choose(outcome, targetPlayer.getHand(), target, source, game);
- targetPlayer.discard(new CardsImpl(target.getTargets()), false, source, game);
- return true;
- }
-
- @Override
- public MindWarpEffect copy() {
- return new MindWarpEffect(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/m/MiresToll.java b/Mage.Sets/src/mage/cards/m/MiresToll.java
index 46140f6ed21..c48ecf6c356 100644
--- a/Mage.Sets/src/mage/cards/m/MiresToll.java
+++ b/Mage.Sets/src/mage/cards/m/MiresToll.java
@@ -31,7 +31,7 @@ public final class MiresToll extends CardImpl {
// Target player reveals a number of cards from their hand equal to the number of Swamps you control. You choose one of them. That player discards that card.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(TargetController.ANY, new PermanentsOnBattlefieldCount(filter)));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(new PermanentsOnBattlefieldCount(filter)));
}
diff --git a/Mage.Sets/src/mage/cards/n/NightmareVoid.java b/Mage.Sets/src/mage/cards/n/NightmareVoid.java
index 6ec2b073162..efd4926c76a 100644
--- a/Mage.Sets/src/mage/cards/n/NightmareVoid.java
+++ b/Mage.Sets/src/mage/cards/n/NightmareVoid.java
@@ -7,7 +7,6 @@ import mage.abilities.keyword.DredgeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.target.TargetPlayer;
/**
@@ -22,7 +21,7 @@ public final class NightmareVoid extends CardImpl {
// Target player reveals their hand. You choose a card from it. That player discards that card.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect());
// Dredge 2
this.addAbility(new DredgeAbility(2));
}
diff --git a/Mage.Sets/src/mage/cards/n/NogginWhack.java b/Mage.Sets/src/mage/cards/n/NogginWhack.java
index 2753905ff2d..0fe907b49d2 100644
--- a/Mage.Sets/src/mage/cards/n/NogginWhack.java
+++ b/Mage.Sets/src/mage/cards/n/NogginWhack.java
@@ -1,16 +1,13 @@
package mage.cards.n;
-import mage.abilities.Ability;
import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.abilities.keyword.ProwlAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.target.TargetPlayer;
-import java.util.List;
import java.util.UUID;
/**
@@ -25,7 +22,7 @@ public final class NogginWhack extends CardImpl {
// Prowl {1}{B}
this.addAbility(new ProwlAbility(this, "{1}{B}"));
// Target player reveals three cards from their hand. You choose two of them. That player discards those cards.
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(2, TargetController.ANY, 3));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(2, 3));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/p/Pilfer.java b/Mage.Sets/src/mage/cards/p/Pilfer.java
index 7988c0336aa..b0c4f6cd4c6 100644
--- a/Mage.Sets/src/mage/cards/p/Pilfer.java
+++ b/Mage.Sets/src/mage/cards/p/Pilfer.java
@@ -4,7 +4,6 @@ import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.target.common.TargetOpponent;
@@ -20,7 +19,7 @@ public final class Pilfer extends CardImpl {
// Target opponent reveals their hand. You choose a nonland card from it. That player discards that card.
this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(
- StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY
+ StaticFilters.FILTER_CARD_NON_LAND
));
this.getSpellAbility().addTarget(new TargetOpponent());
}
diff --git a/Mage.Sets/src/mage/cards/p/PilferingImp.java b/Mage.Sets/src/mage/cards/p/PilferingImp.java
index 3a533cfe8ca..330dc1fd674 100644
--- a/Mage.Sets/src/mage/cards/p/PilferingImp.java
+++ b/Mage.Sets/src/mage/cards/p/PilferingImp.java
@@ -13,7 +13,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.target.common.TargetOpponent;
@@ -38,8 +37,7 @@ public final class PilferingImp extends CardImpl {
Ability ability = new ActivateAsSorceryActivatedAbility(
Zone.BATTLEFIELD,
new DiscardCardYouChooseTargetEffect(
- StaticFilters.FILTER_CARD_NON_LAND,
- TargetController.OPPONENT
+ StaticFilters.FILTER_CARD_NON_LAND
), new ManaCostsImpl<>("{1}{B}")
);
ability.addCost(new TapSourceCost());
diff --git a/Mage.Sets/src/mage/cards/p/PsychicSpear.java b/Mage.Sets/src/mage/cards/p/PsychicSpear.java
index 8b0bea766a8..a87c646df4e 100644
--- a/Mage.Sets/src/mage/cards/p/PsychicSpear.java
+++ b/Mage.Sets/src/mage/cards/p/PsychicSpear.java
@@ -7,7 +7,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.target.TargetPlayer;
@@ -30,7 +29,7 @@ public final class PsychicSpear extends CardImpl {
// Target player reveals their hand. You choose a Spirit or Arcane card from it. That player discards that card.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter));
}
private PsychicSpear(final PsychicSpear card) {
diff --git a/Mage.Sets/src/mage/cards/p/PulseOfTheDross.java b/Mage.Sets/src/mage/cards/p/PulseOfTheDross.java
index b3974ada97a..f5f7f947239 100644
--- a/Mage.Sets/src/mage/cards/p/PulseOfTheDross.java
+++ b/Mage.Sets/src/mage/cards/p/PulseOfTheDross.java
@@ -10,7 +10,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
@@ -26,7 +25,7 @@ public final class PulseOfTheDross extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{B}{B}");
// Target player reveals three cards from their hand and you choose one of them. That player discards that card.
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(TargetController.ANY, 3));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(3));
this.getSpellAbility().addEffect(new PulseOfTheDrossReturnToHandEffect());
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/r/RiversGrasp.java b/Mage.Sets/src/mage/cards/r/RiversGrasp.java
index 2136a51891e..901bf75f361 100644
--- a/Mage.Sets/src/mage/cards/r/RiversGrasp.java
+++ b/Mage.Sets/src/mage/cards/r/RiversGrasp.java
@@ -1,6 +1,5 @@
package mage.cards.r;
-import mage.abilities.Ability;
import mage.abilities.condition.common.ManaWasSpentCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.InfoEffect;
@@ -9,8 +8,6 @@ import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.ColoredManaSymbol;
-import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
@@ -32,7 +29,7 @@ public final class RiversGrasp extends CardImpl {
ManaWasSpentCondition.BLUE,
"If {U} was spent to cast this spell, return up to one target creature to its owner's hand"));
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY),
+ new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND),
ManaWasSpentCondition.BLACK,
"If {B} was spent to cast this spell, target player reveals their hand, you choose a nonland card from it, then that player discards that card")
.setTargetPointer(new SecondTargetPointer()));
diff --git a/Mage.Sets/src/mage/cards/s/SeersVision.java b/Mage.Sets/src/mage/cards/s/SeersVision.java
index ce8c726b3c4..07b6ffd30e3 100644
--- a/Mage.Sets/src/mage/cards/s/SeersVision.java
+++ b/Mage.Sets/src/mage/cards/s/SeersVision.java
@@ -1,4 +1,3 @@
-
package mage.cards.s;
import java.util.UUID;
@@ -7,7 +6,7 @@ import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.effects.common.continuous.PlayWithHandRevealedEffect;
-import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -27,7 +26,7 @@ public final class SeersVision extends CardImpl {
// Your opponents play with their hands revealed.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayWithHandRevealedEffect(TargetController.OPPONENT)));
// Sacrifice Seer's Vision: Look at target player's hand and choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery.
- Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new DiscardCardYouChooseTargetEffect(TargetController.ANY).setText("look at target player's hand and choose a card from it. That player discards that card"), new SacrificeSourceCost());
+ Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new LookTargetHandChooseDiscardEffect(), new SacrificeSourceCost());
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/s/SplittingHeadache.java b/Mage.Sets/src/mage/cards/s/SplittingHeadache.java
index 0337ec3f741..16d777a4e66 100644
--- a/Mage.Sets/src/mage/cards/s/SplittingHeadache.java
+++ b/Mage.Sets/src/mage/cards/s/SplittingHeadache.java
@@ -6,7 +6,6 @@ import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.target.TargetPlayer;
import java.util.UUID;
@@ -26,7 +25,7 @@ public final class SplittingHeadache extends CardImpl {
this.getSpellAbility().addEffect(new DiscardTargetEffect(2));
// • Target player reveals their hand. You choose a card from it. That player discards that card.
- Mode mode = new Mode(new DiscardCardYouChooseTargetEffect(TargetController.ANY));
+ Mode mode = new Mode(new DiscardCardYouChooseTargetEffect());
mode.addTarget(new TargetPlayer());
this.getSpellAbility().addMode(mode);
}
diff --git a/Mage.Sets/src/mage/cards/t/ThievingSprite.java b/Mage.Sets/src/mage/cards/t/ThievingSprite.java
index f10d8706951..d5e3fcb0b79 100644
--- a/Mage.Sets/src/mage/cards/t/ThievingSprite.java
+++ b/Mage.Sets/src/mage/cards/t/ThievingSprite.java
@@ -11,7 +11,6 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.TargetController;
import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPlayer;
@@ -41,7 +40,7 @@ public final class ThievingSprite extends CardImpl {
// When Thieving Sprite enters the battlefield, target player reveals X cards from their hand,
// where X is the number of Faeries you control. You choose one of those cards.
// That player discards that card.
- Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardCardYouChooseTargetEffect(TargetController.ANY, xValue).setText(rule));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardCardYouChooseTargetEffect(xValue).setText(rule));
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/t/Thoughtseize.java b/Mage.Sets/src/mage/cards/t/Thoughtseize.java
index 95f06391d8a..70ec6d27e45 100644
--- a/Mage.Sets/src/mage/cards/t/Thoughtseize.java
+++ b/Mage.Sets/src/mage/cards/t/Thoughtseize.java
@@ -6,7 +6,6 @@ import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.target.TargetPlayer;
@@ -21,7 +20,7 @@ public final class Thoughtseize extends CardImpl {
// Target player reveals their hand. You choose a nonland card from it. That player discards that card. You lose 2 life.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND));
this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(2));
}
diff --git a/Mage.Sets/src/mage/cards/t/ThrullSurgeon.java b/Mage.Sets/src/mage/cards/t/ThrullSurgeon.java
index ec2cd11ffd3..325dc3b79d7 100644
--- a/Mage.Sets/src/mage/cards/t/ThrullSurgeon.java
+++ b/Mage.Sets/src/mage/cards/t/ThrullSurgeon.java
@@ -1,4 +1,3 @@
-
package mage.cards.t;
import mage.MageInt;
@@ -6,24 +5,18 @@ import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
+import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
-import mage.filter.FilterCard;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.TargetCard;
import mage.target.TargetPlayer;
import java.util.UUID;
/**
- * @author jeffwadsworth
+ * @author xenohedron
*/
public final class ThrullSurgeon extends CardImpl {
@@ -35,7 +28,7 @@ public final class ThrullSurgeon extends CardImpl {
this.toughness = new MageInt(1);
// {1}{B}, Sacrifice Thrull Surgeon: Look at target player's hand and choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery.
- Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new ThrullSurgeonEffect(), new ManaCostsImpl<>("{1}{B}"));
+ Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new LookTargetHandChooseDiscardEffect(), new ManaCostsImpl<>("{1}{B}"));
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
@@ -50,38 +43,3 @@ public final class ThrullSurgeon extends CardImpl {
return new ThrullSurgeon(this);
}
}
-
-class ThrullSurgeonEffect extends OneShotEffect {
-
- public ThrullSurgeonEffect() {
- super(Outcome.Discard);
- staticText = "Look at target player's hand and choose a card from it. That player discards that card.";
- }
-
- public ThrullSurgeonEffect(final ThrullSurgeonEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player targetPlayer = game.getPlayer(source.getFirstTarget());
- Player you = game.getPlayer(source.getControllerId());
- if (targetPlayer != null && you != null) {
- you.lookAtCards("Discard", targetPlayer.getHand(), game);
- TargetCard target = new TargetCard(Zone.HAND, new FilterCard());
- target.setNotTarget(true);
- if (you.choose(Outcome.Benefit, targetPlayer.getHand(), target, source, game)) {
- Card card = targetPlayer.getHand().get(target.getFirstTarget(), game);
- return targetPlayer.discard(card, false, source, game);
-
- }
-
- }
- return false;
- }
-
- @Override
- public ThrullSurgeonEffect copy() {
- return new ThrullSurgeonEffect(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/u/Unmask.java b/Mage.Sets/src/mage/cards/u/Unmask.java
index debad117470..738883cb8a4 100644
--- a/Mage.Sets/src/mage/cards/u/Unmask.java
+++ b/Mage.Sets/src/mage/cards/u/Unmask.java
@@ -7,7 +7,6 @@ import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.predicate.mageobject.ColorPredicate;
@@ -35,7 +34,7 @@ public final class Unmask extends CardImpl {
// Target player reveals their hand. You choose a nonland card from it. That player discards that card.
this.getSpellAbility().addTarget(new TargetPlayer());
- this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY));
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND));
}
private Unmask(final Unmask card) {
diff --git a/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java b/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java
index e8ae651d73f..171d5fd0133 100644
--- a/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java
+++ b/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java
@@ -11,7 +11,6 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome;
-import mage.constants.TargetController;
import mage.filter.FilterCard;
import mage.filter.common.FilterNonlandCard;
import mage.filter.predicate.mageobject.ManaValuePredicate;
@@ -65,7 +64,7 @@ class VenarianGlimmerEffect extends OneShotEffect {
if (player != null) {
FilterCard filter = new FilterNonlandCard();
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1));
- Effect effect = new DiscardCardYouChooseTargetEffect(filter, TargetController.ANY);
+ Effect effect = new DiscardCardYouChooseTargetEffect(filter);
effect.setTargetPointer(targetPointer);
effect.apply(game, source);
return true;
diff --git a/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java
index bb343a7ce96..d11c024de78 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java
@@ -1,6 +1,7 @@
package mage.abilities.effects.common.discard;
import mage.abilities.Ability;
+import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
@@ -8,7 +9,6 @@ import mage.cards.Card;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.Outcome;
-import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
@@ -26,7 +26,6 @@ import java.util.UUID;
public class DiscardCardYouChooseTargetEffect extends OneShotEffect {
private final FilterCard filter;
- private final TargetController targetController;
private DynamicValue numberCardsToReveal;
private final DynamicValue numberCardsToDiscard;
private final boolean revealAllCards;
@@ -36,76 +35,56 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect {
this(StaticFilters.FILTER_CARD_A);
}
- public DiscardCardYouChooseTargetEffect(TargetController targetController) {
- this(StaticFilters.FILTER_CARD_A, targetController);
- }
-
public DiscardCardYouChooseTargetEffect(FilterCard filter) {
- this(filter, TargetController.OPPONENT);
+ this(1, filter);
}
- public DiscardCardYouChooseTargetEffect(FilterCard filter, TargetController targetController) {
- this(StaticValue.get(1), filter, targetController);
+ public DiscardCardYouChooseTargetEffect(int numberCardsToDiscard, FilterCard filter) {
+ this(StaticValue.get(numberCardsToDiscard), filter);
}
- public DiscardCardYouChooseTargetEffect(int numberCardsToDiscard, TargetController targetController) {
- this(StaticValue.get(numberCardsToDiscard), targetController);
- }
-
- public DiscardCardYouChooseTargetEffect(DynamicValue numberCardsToDiscard, TargetController targetController) {
- this(numberCardsToDiscard, StaticFilters.FILTER_CARD_CARDS, targetController);
- }
-
- public DiscardCardYouChooseTargetEffect(DynamicValue numberCardsToDiscard,
- FilterCard filter, TargetController targetController) {
+ public DiscardCardYouChooseTargetEffect(DynamicValue numberCardsToDiscard, FilterCard filter) {
super(Outcome.Discard);
- this.targetController = targetController;
this.filter = filter;
this.numberCardsToDiscard = numberCardsToDiscard;
this.numberCardsToReveal = null;
this.revealAllCards = true;
-
- staticText = this.setText();
}
- public DiscardCardYouChooseTargetEffect(TargetController targetController, int numberCardsToReveal) {
- this(targetController, StaticValue.get(numberCardsToReveal));
+ public DiscardCardYouChooseTargetEffect(int numberCardsToReveal) {
+ this(StaticValue.get(numberCardsToReveal));
}
- public DiscardCardYouChooseTargetEffect(TargetController targetController, DynamicValue numberCardsToReveal) {
- this(StaticValue.get(1), StaticFilters.FILTER_CARD_A, targetController, numberCardsToReveal);
+ public DiscardCardYouChooseTargetEffect(DynamicValue numberCardsToReveal) {
+ this(StaticValue.get(1), StaticFilters.FILTER_CARD_A, numberCardsToReveal);
}
- public DiscardCardYouChooseTargetEffect(int numberCardsToDiscard, TargetController targetController, int numberCardsToReveal) {
- this(StaticValue.get(numberCardsToDiscard), StaticFilters.FILTER_CARD_CARDS, targetController, StaticValue.get(numberCardsToReveal));
+ public DiscardCardYouChooseTargetEffect(int numberCardsToDiscard, int numberCardsToReveal) {
+ this(StaticValue.get(numberCardsToDiscard), StaticFilters.FILTER_CARD_CARDS, StaticValue.get(numberCardsToReveal));
}
- public DiscardCardYouChooseTargetEffect(DynamicValue numberCardsToDiscard, FilterCard filter, TargetController targetController, DynamicValue numberCardsToReveal) {
+ public DiscardCardYouChooseTargetEffect(DynamicValue numberCardsToDiscard, FilterCard filter, DynamicValue numberCardsToReveal) {
super(Outcome.Discard);
- this.targetController = targetController;
this.filter = filter;
this.revealAllCards = false;
this.numberCardsToReveal = numberCardsToReveal;
this.numberCardsToDiscard = numberCardsToDiscard;
-
- staticText = this.setText();
}
protected DiscardCardYouChooseTargetEffect(final DiscardCardYouChooseTargetEffect effect) {
super(effect);
this.filter = effect.filter;
- this.targetController = effect.targetController;
this.numberCardsToDiscard = effect.numberCardsToDiscard;
this.numberCardsToReveal = effect.numberCardsToReveal;
this.revealAllCards = effect.revealAllCards;
this.optional = effect.optional;
}
- public void setOptional(boolean optional) {
+ public DiscardCardYouChooseTargetEffect setOptional(boolean optional) {
this.optional = optional;
- staticText = this.setText();
+ return this;
}
@Override
@@ -165,19 +144,13 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect {
return new DiscardCardYouChooseTargetEffect(this);
}
- private String setText() {
- boolean discardMultipleCards = !numberCardsToDiscard.toString().equals("1");
- StringBuilder sb = new StringBuilder("target ");
- switch (targetController) {
- case OPPONENT:
- sb.append("opponent");
- break;
- case ANY:
- sb.append("player");
- break;
- default:
- throw new UnsupportedOperationException("target controller not supported");
+ @Override
+ public String getText(Mode mode) {
+ if (staticText != null && !staticText.isEmpty()) {
+ return staticText;
}
+ boolean discardMultipleCards = !numberCardsToDiscard.toString().equals("1");
+ StringBuilder sb = new StringBuilder(getTargetPointer().describeTargets(mode.getTargets(), "that player"));
sb.append(" reveals ");
if (revealAllCards) {
sb.append("their hand. You ");
diff --git a/Mage/src/main/java/mage/abilities/effects/common/discard/LookTargetHandChooseDiscardEffect.java b/Mage/src/main/java/mage/abilities/effects/common/discard/LookTargetHandChooseDiscardEffect.java
new file mode 100644
index 00000000000..23e11e36107
--- /dev/null
+++ b/Mage/src/main/java/mage/abilities/effects/common/discard/LookTargetHandChooseDiscardEffect.java
@@ -0,0 +1,85 @@
+package mage.abilities.effects.common.discard;
+
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardsImpl;
+import mage.constants.Outcome;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetCardInHand;
+import mage.util.CardUtil;
+
+/**
+ * @author xenohedron
+ */
+public class LookTargetHandChooseDiscardEffect extends OneShotEffect {
+
+ private final boolean upTo;
+ private final DynamicValue numberToDiscard;
+
+ public LookTargetHandChooseDiscardEffect() {
+ this(false, 1);
+ }
+
+ public LookTargetHandChooseDiscardEffect(boolean upTo, int numberToDiscard) {
+ this(upTo, StaticValue.get(numberToDiscard));
+ }
+
+ public LookTargetHandChooseDiscardEffect(boolean upTo, DynamicValue numberToDiscard) {
+ super(Outcome.Discard);
+ this.upTo = upTo;
+ this.numberToDiscard = numberToDiscard;
+ }
+
+ protected LookTargetHandChooseDiscardEffect(final LookTargetHandChooseDiscardEffect effect) {
+ super(effect);
+ this.upTo = effect.upTo;
+ this.numberToDiscard = effect.numberToDiscard;
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
+ Player controller = game.getPlayer(source.getControllerId());
+ if (player == null || controller == null) {
+ return false;
+ }
+ int num = numberToDiscard.calculate(game, source, this);
+ if (num == 0) {
+ if (!player.getHand().isEmpty()) {
+ controller.lookAtCards("Looking at hand", player.getHand(), game);
+ }
+ return true;
+ }
+ TargetCard target = new TargetCardInHand(upTo ? 0 : num, num, num > 1 ? StaticFilters.FILTER_CARD_CARDS : StaticFilters.FILTER_CARD);
+ if (controller.choose(Outcome.Discard, player.getHand(), target, source, game)) {
+ player.discard(new CardsImpl(target.getTargets()), false, source, game);
+ }
+ return true;
+ }
+
+ @Override
+ public LookTargetHandChooseDiscardEffect copy() {
+ return new LookTargetHandChooseDiscardEffect(this);
+ }
+
+ @Override
+ public String getText(Mode mode) {
+ if (staticText != null && !staticText.isEmpty()) {
+ return staticText;
+ }
+ String numberValue = numberToDiscard instanceof StaticValue ?
+ CardUtil.numberToText(((StaticValue) numberToDiscard).getValue(), "a") : "X";
+ boolean plural = !numberValue.equals("a");
+ String targetDescription = getTargetPointer().describeTargets(mode.getTargets(), "that player");
+ return "look at " + targetDescription + "'s hand and choose " + (upTo ? "up to " : "") + numberValue
+ + (plural ? " cards" : " card") + " from it. "
+ + (targetDescription.equals("that player") ? "The" : "That")
+ + " player discards " + (plural ? "those cards." : "that card.");
+ }
+}