diff --git a/Mage.Sets/src/mage/cards/v/ViviensStampede.java b/Mage.Sets/src/mage/cards/v/ViviensStampede.java new file mode 100644 index 00000000000..940a2e4f0b1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/ViviensStampede.java @@ -0,0 +1,113 @@ +package mage.cards.v; + +import mage.abilities.Ability; +import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.MeleeAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.constants.WatcherScope; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.watchers.Watcher; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ViviensStampede extends CardImpl { + + public ViviensStampede(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}{G}"); + + // Each creature you control gains vigilance, trample, and melee until end of turn. + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + VigilanceAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE + ).setText("each creature you control gains vigilance")); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE + ).setText(", trample")); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + new MeleeAbility(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE + ).setText(", and melee until end of turn")); + + // At the beginning of the next main phase this turn, draw a card for each player who was dealt combat damage this turn. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfMainPhaseDelayedTriggeredAbility( + new DrawCardSourceControllerEffect(ViviensStampedeValue.instance), + false, TargetController.ANY, + AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN_THIS_TURN + ) + ).concatBy("
")); + this.getSpellAbility().addWatcher(new ViviensStampedeWatcher()); + } + + private ViviensStampede(final ViviensStampede card) { + super(card); + } + + @Override + public ViviensStampede copy() { + return new ViviensStampede(this); + } +} + +enum ViviensStampedeValue implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + return ViviensStampedeWatcher.getCount(game); + } + + @Override + public ViviensStampedeValue copy() { + return this; + } + + @Override + public String getMessage() { + return "player who was dealt combat damage this turn"; + } +} + +class ViviensStampedeWatcher extends Watcher { + + private final Set players = new HashSet<>(); + + ViviensStampedeWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER + && ((DamagedEvent) event).isCombatDamage()) { + players.add(event.getTargetId()); + } + } + + @Override + public void reset() { + super.reset(); + players.clear(); + } + + static int getCount(Game game) { + return game.getState().getWatcher(ViviensStampedeWatcher.class).players.size(); + } +} diff --git a/Mage.Sets/src/mage/sets/NewCapennaCommander.java b/Mage.Sets/src/mage/sets/NewCapennaCommander.java index 9f60fd50236..cf69749ac5f 100644 --- a/Mage.Sets/src/mage/sets/NewCapennaCommander.java +++ b/Mage.Sets/src/mage/sets/NewCapennaCommander.java @@ -306,6 +306,7 @@ public final class NewCapennaCommander extends ExpansionSet { cards.add(new SetCardInfo("Vivid Creek", 444, Rarity.UNCOMMON, mage.cards.v.VividCreek.class)); cards.add(new SetCardInfo("Vivid Grove", 445, Rarity.UNCOMMON, mage.cards.v.VividGrove.class)); cards.add(new SetCardInfo("Vivid Meadow", 446, Rarity.UNCOMMON, mage.cards.v.VividMeadow.class)); + cards.add(new SetCardInfo("Vivien's Stampede", 65, Rarity.RARE, mage.cards.v.ViviensStampede.class)); cards.add(new SetCardInfo("Vorel of the Hull Clade", 357, Rarity.RARE, mage.cards.v.VorelOfTheHullClade.class)); cards.add(new SetCardInfo("Wall of Roots", 319, Rarity.COMMON, mage.cards.w.WallOfRoots.class)); cards.add(new SetCardInfo("Warstorm Surge", 277, Rarity.RARE, mage.cards.w.WarstormSurge.class)); diff --git a/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java index d23bc1098fa..34a406f8dc2 100644 --- a/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java @@ -20,12 +20,18 @@ public class AtTheBeginOfMainPhaseDelayedTriggeredAbility extends DelayedTrigger NEXT_PRECOMBAT_MAIN("next precombat main phase"), NEXT_POSTCOMAT_MAIN("next postcombat main phase"), NEXT_MAIN("next main phase"), - NEXT_MAIN_THIS_TURN("next main phase this turn"); + NEXT_MAIN_THIS_TURN("next main phase this turn", Duration.EndOfTurn); private final String text; + private final Duration duration; PhaseSelection(String text) { + this(text, Duration.EndOfGame); + } + + PhaseSelection(String text, Duration duration) { this.text = text; + this.duration = duration; } @Override @@ -38,7 +44,7 @@ public class AtTheBeginOfMainPhaseDelayedTriggeredAbility extends DelayedTrigger private final PhaseSelection phaseSelection; public AtTheBeginOfMainPhaseDelayedTriggeredAbility(Effect effect, boolean optional, TargetController targetController, PhaseSelection phaseSelection) { - super(effect, Duration.EndOfGame, true, optional); + super(effect, phaseSelection.duration, true, optional); this.targetController = targetController; this.phaseSelection = phaseSelection;