fixed a bunch of discard issues (#6532)

This commit is contained in:
Evan Kranzler 2020-05-15 21:19:04 -04:00
parent 713a7ab35d
commit c24851b4a9
13 changed files with 89 additions and 116 deletions

View file

@ -8,7 +8,7 @@ import mage.abilities.keyword.KickerAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.filter.common.FilterControlledLandPermanent; import mage.filter.StaticFilters;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
@ -24,7 +24,7 @@ public final class BogDown extends CardImpl {
// Kicker-Sacrifice two lands. // Kicker-Sacrifice two lands.
this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2,
new FilterControlledLandPermanent("two lands"), true)))); StaticFilters.FILTER_CONTROLLED_LAND_SHORT_TEXT, true))));
// Target player discards two cards. If Bog Down was kicked, that player discards three cards instead. // Target player discards two cards. If Bog Down was kicked, that player discards three cards instead.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DiscardTargetEffect(3), this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DiscardTargetEffect(3),

View file

@ -43,7 +43,7 @@ public final class CabalTherapist extends CardImpl {
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility( ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(
new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.NON_LAND_NAME), new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.NON_LAND_NAME),
false, "choose a nonland card name, then target player " + false, "choose a nonland card name, then target player " +
"reveals their hand and discards all cards with that name." "reveals their hand and discards all cards with that name"
); );
ability.addEffect(new CabalTherapistDiscardEffect()); ability.addEffect(new CabalTherapistDiscardEffect());
ability.addTarget(new TargetPlayer()); ability.addTarget(new TargetPlayer());

View file

@ -1,7 +1,5 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
@ -15,17 +13,19 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.constants.Zone;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import mage.target.common.TargetCardInHand; import mage.target.common.TargetCardInHand;
import java.util.UUID;
/** /**
*
* @author Styxo * @author Styxo
*/ */
public final class GreelMindRaker extends CardImpl { public final class GreelMindRaker extends CardImpl {
private static final FilterCard filter = new FilterCard("two cards");
public GreelMindRaker(UUID ownerId, CardSetInfo setInfo) { public GreelMindRaker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
@ -36,14 +36,16 @@ public final class GreelMindRaker extends CardImpl {
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
// {X}{B}, {tap}, Discard two cards: Target player discards X cards at random. // {X}{B}, {tap}, Discard two cards: Target player discards X cards at random.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DiscardTargetEffect(ManacostVariableValue.instance, true), new ManaCostsImpl("{X}{B}")); Ability ability = new SimpleActivatedAbility(new DiscardTargetEffect(
ManacostVariableValue.instance, true
), new ManaCostsImpl("{X}{B}"));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, new FilterCard()))); ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, filter)));
ability.addTarget(new TargetPlayer()); ability.addTarget(new TargetPlayer());
this.addAbility(ability); this.addAbility(ability);
} }
public GreelMindRaker(final GreelMindRaker card) { private GreelMindRaker(final GreelMindRaker card) {
super(card); super(card);
} }

View file

@ -113,7 +113,7 @@ class InsidiousDreamsAdditionalCost extends VariableCostImpl {
InsidiousDreamsAdditionalCost() { InsidiousDreamsAdditionalCost() {
super("cards to discard"); super("cards to discard");
this.text = "as an additional cost to cast this spell, discard X cards"; this.text = "discard X cards";
} }
InsidiousDreamsAdditionalCost(final InsidiousDreamsAdditionalCost cost) { InsidiousDreamsAdditionalCost(final InsidiousDreamsAdditionalCost cost) {

View file

@ -1,30 +1,34 @@
package mage.cards.k; package mage.cards.k;
import java.util.UUID;
import mage.abilities.costs.common.DiscardHandCost; import mage.abilities.costs.common.DiscardHandCost;
import mage.abilities.costs.common.SacrificeAllCost; import mage.abilities.costs.common.SacrificeAllCost;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPlayer;
import java.util.UUID;
public final class KaerveksSpite extends CardImpl { public final class KaerveksSpite extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent("permanents you control");
public KaerveksSpite(UUID ownerId, CardSetInfo cardSetInfo) { public KaerveksSpite(UUID ownerId, CardSetInfo cardSetInfo) {
super(ownerId, cardSetInfo, new CardType[]{CardType.INSTANT}, "{B}{B}{B}"); super(ownerId, cardSetInfo, new CardType[]{CardType.INSTANT}, "{B}{B}{B}");
// As an additional cost to cast Kaervek's Spite, sacrifice all permanents you control and discard your hand. // As an additional cost to cast Kaervek's Spite, sacrifice all permanents you control and discard your hand.
this.getSpellAbility().addCost(new SacrificeAllCost(new FilterControlledPermanent("permanents you control"))); this.getSpellAbility().addCost(new SacrificeAllCost(filter));
this.getSpellAbility().addCost(new DiscardHandCost()); this.getSpellAbility().addCost(new DiscardHandCost());
// Target player loses 5 life. // Target player loses 5 life.=
Effect effect = new LoseLifeTargetEffect(5); this.getSpellAbility().addEffect(new LoseLifeTargetEffect(5));
this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetPlayer());
} }
public KaerveksSpite(final KaerveksSpite other) { private KaerveksSpite(final KaerveksSpite other) {
super(other); super(other);
} }

View file

@ -1,14 +1,11 @@
package mage.cards.m; package mage.cards.m;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfDrawTriggeredAbility; import mage.abilities.common.BeginningOfDrawTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.dynamicvalue.common.CountersSourceCount;
import mage.abilities.effects.Effect; import mage.abilities.effects.common.DiscardCardControllerTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect; import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect;
@ -20,42 +17,48 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.Counter;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent; import java.util.UUID;
import mage.game.events.GameEvent.EventType;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class MidnightOil extends CardImpl { public final class MidnightOil extends CardImpl {
public MidnightOil(UUID ownerId, CardSetInfo setInfo) { public MidnightOil(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}");
// Midnight Oil enters the battlefield with seven hour counters on it. // Midnight Oil enters the battlefield with seven hour counters on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(new Counter(CounterType.HOUR.createInstance(7))), this.addAbility(new EntersBattlefieldAbility(
"with seven hour counters on it")); new AddCountersSourceEffect(
CounterType.HOUR.createInstance(7)
), "with seven hour counters on it"
));
// At the beginning of your draw step, draw an additional card and remove two hour counters from Midnight Oil. // At the beginning of your draw step, draw an additional card and remove two hour counters from Midnight Oil.
Ability ability = new BeginningOfDrawTriggeredAbility(new DrawCardSourceControllerEffect(1), TargetController.YOU, false); Ability ability = new BeginningOfDrawTriggeredAbility(
Effect effect = new RemoveCounterSourceEffect(CounterType.HOUR.createInstance(2)); new DrawCardSourceControllerEffect(1),
effect.setText("and remove two hour counters from {this}"); TargetController.YOU, false
ability.addEffect(effect); );
ability.addEffect(new RemoveCounterSourceEffect(
CounterType.HOUR.createInstance(2)
).concatBy("and"));
this.addAbility(ability); this.addAbility(ability);
// Your maximum hand size is equal to the number of hour counters on Midnight Oil. // Your maximum hand size is equal to the number of hour counters on Midnight Oil.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MaximumHandSizeControllerEffect(new CountersSourceCount(CounterType.HOUR), Duration.WhileOnBattlefield, HandSizeModification.SET, TargetController.YOU))); this.addAbility(new SimpleStaticAbility(new MaximumHandSizeControllerEffect(
new CountersSourceCount(CounterType.HOUR), Duration.WhileOnBattlefield,
HandSizeModification.SET, TargetController.YOU
).setText("your maximum hand size is equal to the number of hour counters on {this}")));
// Whenever you discard a card, you lose 1 life. // Whenever you discard a card, you lose 1 life.
this.addAbility(new MidnightOilTriggeredAbility(new LoseLifeSourceControllerEffect(1))); this.addAbility(new DiscardCardControllerTriggeredAbility(
new LoseLifeSourceControllerEffect(1), false
));
} }
public MidnightOil(final MidnightOil card) { private MidnightOil(final MidnightOil card) {
super(card); super(card);
} }
@ -64,35 +67,3 @@ public final class MidnightOil extends CardImpl {
return new MidnightOil(this); return new MidnightOil(this);
} }
} }
class MidnightOilTriggeredAbility extends TriggeredAbilityImpl {
MidnightOilTriggeredAbility(Effect effect) {
super(Zone.BATTLEFIELD, effect, false);
}
MidnightOilTriggeredAbility(final MidnightOilTriggeredAbility ability) {
super(ability);
}
@Override
public MidnightOilTriggeredAbility copy() {
return new MidnightOilTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.DISCARDED_CARD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return isControlledBy(event.getPlayerId());
}
@Override
public String getRule() {
return "Whenever you discard a card, " + super.getRule();
}
}

View file

@ -93,7 +93,7 @@ class NogginWhackEffect extends OneShotEffect {
if (!revealedCards.isEmpty()) { if (!revealedCards.isEmpty()) {
targetPlayer.revealCards(source, revealedCards, game); targetPlayer.revealCards(source, revealedCards, game);
controller.chooseTarget(Outcome.Exile, revealedCards, targetInHand, source, game); controller.chooseTarget(Outcome.Exile, revealedCards, targetInHand, source, game);
targetPlayer.discard(new CardsImpl(target.getTargets()), source, game); targetPlayer.discard(new CardsImpl(targetInHand.getTargets()), source, game);
} }
return true; return true;
} }

View file

@ -1,24 +1,23 @@
package mage.cards.p; package mage.cards.p;
import java.util.Set;
import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.cards.Cards; import mage.cards.CardsImpl;
import mage.choices.ChoiceColor; import mage.choices.ChoiceColor;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class Persecute extends CardImpl { public final class Persecute extends CardImpl {
@ -29,7 +28,6 @@ public final class Persecute extends CardImpl {
// Choose a color. Target player reveals their hand and discards all cards of that color. // Choose a color. Target player reveals their hand and discards all cards of that color.
this.getSpellAbility().addEffect(new PersecuteEffect()); this.getSpellAbility().addEffect(new PersecuteEffect());
this.getSpellAbility().addTarget(new TargetPlayer()); this.getSpellAbility().addTarget(new TargetPlayer());
} }
public Persecute(final Persecute card) { public Persecute(final Persecute card) {
@ -44,12 +42,12 @@ public final class Persecute extends CardImpl {
class PersecuteEffect extends OneShotEffect { class PersecuteEffect extends OneShotEffect {
public PersecuteEffect() { PersecuteEffect() {
super(Outcome.Discard); super(Outcome.Discard);
this.staticText = "Choose a color. Target player reveals their hand and discards all cards of that color"; this.staticText = "Choose a color. Target player reveals their hand and discards all cards of that color";
} }
public PersecuteEffect(final PersecuteEffect effect) { private PersecuteEffect(final PersecuteEffect effect) {
super(effect); super(effect);
} }
@ -64,17 +62,16 @@ class PersecuteEffect extends OneShotEffect {
MageObject sourceObject = game.getObject(source.getSourceId()); MageObject sourceObject = game.getObject(source.getSourceId());
Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
ChoiceColor choice = new ChoiceColor(); ChoiceColor choice = new ChoiceColor();
if (controller != null && sourceObject != null && targetPlayer != null && controller.choose(outcome, choice, game)) { if (controller == null
Cards hand = targetPlayer.getHand(); || sourceObject == null
targetPlayer.revealCards(sourceObject.getIdName(), hand, game); || targetPlayer == null
Set<Card> cards = hand.getCards(game); || !controller.choose(outcome, choice, game)) {
for (Card card : cards) { return false;
if (card != null && card.getColor(game).shares(choice.getColor())) {
targetPlayer.discard(card, source, game);
}
}
return true;
} }
return false; FilterCard filterCard = new FilterCard();
filterCard.add(new ColorPredicate(choice.getColor()));
targetPlayer.revealCards(source, targetPlayer.getHand(), game);
targetPlayer.discard(new CardsImpl(targetPlayer.getHand().getCards(filterCard, game)), source, game);
return true;
} }
} }

View file

@ -32,7 +32,7 @@ public final class Probe extends CardImpl {
this.getSpellAbility().addEffect(new ConditionalOneShotEffect( this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new DiscardTargetEffect(2), new DiscardTargetEffect(2),
KickedCondition.instance, KickedCondition.instance,
"<br><br>if this spell was kicked, target player discards two cards")); "<br><br>If this spell was kicked, target player discards two cards"));
this.getSpellAbility().setTargetAdjuster(ProbeAdjuster.instance); this.getSpellAbility().setTargetAdjuster(ProbeAdjuster.instance);
} }

View file

@ -55,7 +55,7 @@ public final class PsychicVortex extends CardImpl {
class PsychicVortexCost extends CostImpl { class PsychicVortexCost extends CostImpl {
PsychicVortexCost() { PsychicVortexCost() {
this.text = "Draw a card."; this.text = "Draw a card";
} }
@Override @Override

View file

@ -47,7 +47,7 @@ class SickeningDreamsAdditionalCost extends VariableCostImpl {
SickeningDreamsAdditionalCost() { SickeningDreamsAdditionalCost() {
super("cards to discard"); super("cards to discard");
this.text = "as an additional cost to cast this spell, discard X cards"; this.text = "discard X cards";
} }
SickeningDreamsAdditionalCost(final SickeningDreamsAdditionalCost cost) { SickeningDreamsAdditionalCost(final SickeningDreamsAdditionalCost cost) {

View file

@ -1,7 +1,5 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -11,22 +9,23 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import java.util.UUID;
/** /**
*
* @author jeffwadsworth * @author jeffwadsworth
*/ */
public final class ThoughtGorger extends CardImpl { public final class ThoughtGorger extends CardImpl {
public ThoughtGorger(UUID ownerId, CardSetInfo setInfo) { public ThoughtGorger(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
this.subtype.add(SubType.HORROR); this.subtype.add(SubType.HORROR);
this.power = new MageInt(2); this.power = new MageInt(2);
@ -35,15 +34,13 @@ public final class ThoughtGorger extends CardImpl {
this.addAbility(TrampleAbility.getInstance()); this.addAbility(TrampleAbility.getInstance());
// When Thought Gorger enters the battlefield, put a +1/+1 counter on it for each card in your hand. If you do, discard your hand. // When Thought Gorger enters the battlefield, put a +1/+1 counter on it for each card in your hand. If you do, discard your hand.
Ability ability1 = new EntersBattlefieldTriggeredAbility(new ThoughtGorgerEffectEnters()); this.addAbility(new EntersBattlefieldTriggeredAbility(new ThoughtGorgerEffectEnters()));
this.addAbility(ability1);
// When Thought Gorger leaves the battlefield, draw a card for each +1/+1 counter on it. // When Thought Gorger leaves the battlefield, draw a card for each +1/+1 counter on it.
Ability ability2 = new LeavesBattlefieldTriggeredAbility(new ThoughtGorgerEffectLeaves(), false); this.addAbility(new LeavesBattlefieldTriggeredAbility(new ThoughtGorgerEffectLeaves(), false));
this.addAbility(ability2);
} }
public ThoughtGorger(final ThoughtGorger card) { private ThoughtGorger(final ThoughtGorger card) {
super(card); super(card);
} }
@ -56,12 +53,12 @@ public final class ThoughtGorger extends CardImpl {
class ThoughtGorgerEffectEnters extends OneShotEffect { class ThoughtGorgerEffectEnters extends OneShotEffect {
public ThoughtGorgerEffectEnters() { ThoughtGorgerEffectEnters() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "put a +1/+1 counter on it for each card in your hand. If you do, discard your hand."; this.staticText = "put a +1/+1 counter on it for each card in your hand. If you do, discard your hand.";
} }
public ThoughtGorgerEffectEnters(final ThoughtGorgerEffectEnters effect) { private ThoughtGorgerEffectEnters(final ThoughtGorgerEffectEnters effect) {
super(effect); super(effect);
} }
@ -74,24 +71,27 @@ class ThoughtGorgerEffectEnters extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(source.getControllerId());
Permanent thoughtGorger = game.getPermanent(source.getSourceId()); Permanent thoughtGorger = game.getPermanent(source.getSourceId());
if (player != null && !player.getHand().isEmpty() && thoughtGorger != null ) { if (player == null
int cardsInHand = player.getHand().size(); || player.getHand().isEmpty()
thoughtGorger.addCounters(CounterType.P1P1.createInstance(cardsInHand), source, game); || thoughtGorger == null
player.discard(cardsInHand, false, source, game); || !thoughtGorger.addCounters(
return true; CounterType.P1P1.createInstance(player.getHand().size()), source, game
)) {
return false;
} }
return false; player.discard(player.getHand(), source, game);
return true;
} }
} }
class ThoughtGorgerEffectLeaves extends OneShotEffect { class ThoughtGorgerEffectLeaves extends OneShotEffect {
public ThoughtGorgerEffectLeaves() { ThoughtGorgerEffectLeaves() {
super(Outcome.Neutral); super(Outcome.Neutral);
this.staticText = "draw a card for each +1/+1 counter on it."; this.staticText = "draw a card for each +1/+1 counter on it.";
} }
public ThoughtGorgerEffectLeaves(final ThoughtGorgerEffectLeaves effect) { private ThoughtGorgerEffectLeaves(final ThoughtGorgerEffectLeaves effect) {
super(effect); super(effect);
} }

View file

@ -41,7 +41,6 @@ public class DrawCardSourceControllerEffect extends OneShotEffect {
super(effect); super(effect);
this.amount = effect.amount.copy(); this.amount = effect.amount.copy();
this.whoDrawCard = effect.whoDrawCard; this.whoDrawCard = effect.whoDrawCard;
setText();
} }
@Override @Override