diff --git a/Mage.Sets/src/mage/cards/b/BloodOperative.java b/Mage.Sets/src/mage/cards/b/BloodOperative.java index 9ffe0c5b8e7..f1e43565b15 100644 --- a/Mage.Sets/src/mage/cards/b/BloodOperative.java +++ b/Mage.Sets/src/mage/cards/b/BloodOperative.java @@ -73,7 +73,7 @@ class BloodOperativeTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEIL; + return event.getType() == GameEvent.EventType.SURVEILED; } @Override diff --git a/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java b/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java index 63c882dbb02..62610350a32 100644 --- a/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java +++ b/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java @@ -106,7 +106,7 @@ class DarkbladeAgentWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.SURVEIL) { + if (event.getType() == GameEvent.EventType.SURVEILED) { this.surveiledThisTurn.add(event.getPlayerId()); } } diff --git a/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java b/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java index 1d438b4d7bd..ab9a61804ff 100644 --- a/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java +++ b/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java @@ -65,7 +65,7 @@ class DisinformationCampaignTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEIL; + return event.getType() == GameEvent.EventType.SURVEILED; } @Override diff --git a/Mage.Sets/src/mage/cards/e/EnhancedSurveillance.java b/Mage.Sets/src/mage/cards/e/EnhancedSurveillance.java new file mode 100644 index 00000000000..6784a38dedc --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EnhancedSurveillance.java @@ -0,0 +1,113 @@ +package mage.cards.e; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.ExileSourceCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; + +/** + * + * @author TheElk801 + */ +public final class EnhancedSurveillance extends CardImpl { + + public EnhancedSurveillance(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + + // You may look at an additional two cards each time you surveil. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new EnhancedSurveillanceReplacementEffect() + )); + + // Exile Enhanced Surveillance: Shuffle your graveyard into your library. + this.addAbility(new SimpleActivatedAbility( + new EnhancedSurveillanceShuffleEffect(), new ExileSourceCost() + )); + } + + public EnhancedSurveillance(final EnhancedSurveillance card) { + super(card); + } + + @Override + public EnhancedSurveillance copy() { + return new EnhancedSurveillance(this); + } +} + +class EnhancedSurveillanceReplacementEffect extends ReplacementEffectImpl { + + public EnhancedSurveillanceReplacementEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "You may look at an additional " + + "two cards each time you surveil."; + } + + public EnhancedSurveillanceReplacementEffect(final EnhancedSurveillanceReplacementEffect effect) { + super(effect); + } + + @Override + public EnhancedSurveillanceReplacementEffect copy() { + return new EnhancedSurveillanceReplacementEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SURVEIL; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(event.getAmount() + 2); + return false; + } +} + +class EnhancedSurveillanceShuffleEffect extends OneShotEffect { + + public EnhancedSurveillanceShuffleEffect() { + super(Outcome.Neutral); + this.staticText = "Shuffle your graveyard into your library"; + } + + public EnhancedSurveillanceShuffleEffect(final EnhancedSurveillanceShuffleEffect effect) { + super(effect); + } + + @Override + public EnhancedSurveillanceShuffleEffect copy() { + return new EnhancedSurveillanceShuffleEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (Card card : controller.getGraveyard().getCards(game)) { + controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD, true, true); + } + controller.shuffleLibrary(source, game); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/f/FeldonsCane.java b/Mage.Sets/src/mage/cards/f/FeldonsCane.java index d343b48226d..18ffbb30a5b 100644 --- a/Mage.Sets/src/mage/cards/f/FeldonsCane.java +++ b/Mage.Sets/src/mage/cards/f/FeldonsCane.java @@ -45,7 +45,7 @@ class FeldonsCaneEffect extends OneShotEffect { FeldonsCaneEffect() { super(Outcome.Neutral); - this.staticText = "Shuffles your graveyard into your library"; + this.staticText = "Shuffle your graveyard into your library"; } FeldonsCaneEffect(final FeldonsCaneEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java b/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java index 69403d7c5a1..1c0041ff36c 100644 --- a/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java +++ b/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java @@ -81,7 +81,7 @@ class ThoughtboundPhantasmTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEIL; + return event.getType() == GameEvent.EventType.SURVEILED; } @Override diff --git a/Mage.Sets/src/mage/cards/w/WhisperingSnitch.java b/Mage.Sets/src/mage/cards/w/WhisperingSnitch.java index c307771f184..c28daf08416 100644 --- a/Mage.Sets/src/mage/cards/w/WhisperingSnitch.java +++ b/Mage.Sets/src/mage/cards/w/WhisperingSnitch.java @@ -60,7 +60,7 @@ class WhisperingSnitchTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEIL; + return event.getType() == GameEvent.EventType.SURVEILED; } @Override @@ -100,7 +100,7 @@ class WhisperingSnitchWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.SURVEIL) { + if (event.getType() == GameEvent.EventType.SURVEILED) { timesSurveiled.put(event.getPlayerId(), getTimesSurveiled(event.getPlayerId()) + 1); } } diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 21c87c3b667..80989a12a43 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -63,6 +63,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); + cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); diff --git a/Mage/src/main/java/mage/game/events/GameEvent.java b/Mage/src/main/java/mage/game/events/GameEvent.java index 5afa0fe839d..6678cd8fdfb 100644 --- a/Mage/src/main/java/mage/game/events/GameEvent.java +++ b/Mage/src/main/java/mage/game/events/GameEvent.java @@ -209,7 +209,7 @@ public class GameEvent implements Serializable { SHUFFLE_LIBRARY, LIBRARY_SHUFFLED, ENCHANT_PLAYER, ENCHANTED_PLAYER, CAN_TAKE_MULLIGAN, - FLIP_COIN, COIN_FLIPPED, SCRY, SURVEIL, FATESEAL, + FLIP_COIN, COIN_FLIPPED, SCRY, SURVEIL, SURVEILED, FATESEAL, ROLL_DICE, DICE_ROLLED, ROLL_PLANAR_DIE, PLANAR_DIE_ROLLED, PLANESWALK, PLANESWALKED, diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index a7901dd0684..bfc87919f69 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -3914,9 +3914,13 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean surveil(int value, Ability source, Game game) { - game.informPlayers(getLogName() + " surveils " + value); + GameEvent event = new GameEvent(GameEvent.EventType.SURVEIL, getId(), source == null ? null : source.getSourceId(), getId(), value, true); + if (game.replaceEvent(event)) { + return false; + } + game.informPlayers(getLogName() + " surveils " + event.getAmount()); Cards cards = new CardsImpl(); - cards.addAll(getLibrary().getTopCards(game, value)); + cards.addAll(getLibrary().getTopCards(game, event.getAmount())); if (!cards.isEmpty()) { String text; if (cards.size() == 1) { @@ -3930,7 +3934,7 @@ public abstract class PlayerImpl implements Player, Serializable { cards.removeAll(target.getTargets()); putCardsOnTopOfLibrary(cards, game, source, true); } - game.fireEvent(new GameEvent(GameEvent.EventType.SURVEIL, getId(), source == null ? null : source.getSourceId(), getId(), value, true)); + game.fireEvent(new GameEvent(GameEvent.EventType.SURVEILED, getId(), source == null ? null : source.getSourceId(), getId(), event.getAmount(), true)); return true; }