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;