diff --git a/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java b/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java
index 21565e11e57..76cc5071a7c 100644
--- a/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java
+++ b/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java
@@ -1,191 +1,191 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets.gatecrash;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.ReplacementEffectImpl;
-import mage.abilities.keyword.FlyingAbility;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.FilterCard;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.mageobject.CardTypePredicate;
-import mage.filter.predicate.other.OwnerIdPredicate;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.events.ZoneChangeEvent;
-import mage.players.Player;
-import mage.target.Target;
-import mage.target.common.TargetCardInOpponentsGraveyard;
-import mage.target.targetpointer.FixedTarget;
-
-/**
- *
- * @author LevelX2
- */
-public class DiluvianPrimordial extends CardImpl {
-
- public DiluvianPrimordial(UUID ownerId) {
- super(ownerId, 33, "Diluvian Primordial", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{U}{U}");
- this.expansionSetCode = "GTC";
- this.subtype.add("Avatar");
-
- this.power = new MageInt(5);
- this.toughness = new MageInt(5);
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
-
- // When Diluvian Primordial enters the battlefield, for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterCard filter = new FilterCard("instant or sorcery card from " + opponent.getLogName() + "'s graveyard");
- filter.add(new OwnerIdPredicate(opponentId));
- filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY)));
- TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0, 1, filter);
- ability.addTarget(target);
- }
- }
- }
- }
-
- public DiluvianPrimordial(final DiluvianPrimordial card) {
- super(card);
- }
-
- @Override
- public DiluvianPrimordial copy() {
- return new DiluvianPrimordial(this);
- }
-}
-
-class DiluvianPrimordialEffect extends OneShotEffect {
-
- public DiluvianPrimordialEffect() {
- super(Outcome.PlayForFree);
- this.staticText = "for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead";
- }
-
- public DiluvianPrimordialEffect(final DiluvianPrimordialEffect effect) {
- super(effect);
- }
-
- @Override
- public DiluvianPrimordialEffect copy() {
- return new DiluvianPrimordialEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- for (Target target : source.getTargets()) {
- if (target instanceof TargetCardInOpponentsGraveyard) {
- Card targetCard = game.getCard(target.getFirstTarget());
- if (targetCard != null) {
- if (controller.chooseUse(outcome, "Cast " + targetCard.getLogName() + "?", source, game)) {
- if (controller.cast(targetCard.getSpellAbility(), game, true)) {
- ContinuousEffect effect = new DiluvianPrimordialReplacementEffect();
- effect.setTargetPointer(new FixedTarget(targetCard.getId(), game.getState().getZoneChangeCounter(targetCard.getId())));
- game.addEffect(effect, source);
- }
- }
- }
- }
- }
- return true;
- }
- return false;
- }
-}
-
-class DiluvianPrimordialReplacementEffect extends ReplacementEffectImpl {
-
- public DiluvianPrimordialReplacementEffect() {
- super(Duration.EndOfTurn, Outcome.Exile);
- staticText = "If a card cast this way would be put into a graveyard this turn, exile it instead";
- }
-
- public DiluvianPrimordialReplacementEffect(final DiluvianPrimordialReplacementEffect effect) {
- super(effect);
- }
-
- @Override
- public DiluvianPrimordialReplacementEffect copy() {
- return new DiluvianPrimordialReplacementEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return true;
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- Card card = game.getCard(getTargetPointer().getFirst(game, source));
- if (card != null) {
- controller.moveCards(card, Zone.STACK, Zone.EXILED, source, game);
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == EventType.ZONE_CHANGE;
- }
-
- @Override
- public boolean applies(GameEvent event, Ability source, Game game) {
- ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
- return zEvent.getToZone() == Zone.GRAVEYARD
- && ((ZoneChangeEvent) event).getTargetId().equals(getTargetPointer().getFirst(game, source));
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.gatecrash;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.other.OwnerIdPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.events.ZoneChangeEvent;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetCardInOpponentsGraveyard;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DiluvianPrimordial extends CardImpl {
+
+ public DiluvianPrimordial(UUID ownerId) {
+ super(ownerId, 33, "Diluvian Primordial", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{U}{U}");
+ this.expansionSetCode = "GTC";
+ this.subtype.add("Avatar");
+
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // When Diluvian Primordial enters the battlefield, for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (ability instanceof EntersBattlefieldTriggeredAbility) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ FilterCard filter = new FilterCard("instant or sorcery card from " + opponent.getLogName() + "'s graveyard");
+ filter.add(new OwnerIdPredicate(opponentId));
+ filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY)));
+ TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0, 1, filter);
+ ability.addTarget(target);
+ }
+ }
+ }
+ }
+
+ public DiluvianPrimordial(final DiluvianPrimordial card) {
+ super(card);
+ }
+
+ @Override
+ public DiluvianPrimordial copy() {
+ return new DiluvianPrimordial(this);
+ }
+}
+
+class DiluvianPrimordialEffect extends OneShotEffect {
+
+ public DiluvianPrimordialEffect() {
+ super(Outcome.PlayForFree);
+ this.staticText = "for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead";
+ }
+
+ public DiluvianPrimordialEffect(final DiluvianPrimordialEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DiluvianPrimordialEffect copy() {
+ return new DiluvianPrimordialEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ for (Target target : source.getTargets()) {
+ if (target instanceof TargetCardInOpponentsGraveyard) {
+ Card targetCard = game.getCard(target.getFirstTarget());
+ if (targetCard != null) {
+ if (controller.chooseUse(outcome, "Cast " + targetCard.getLogName() + "?", source, game)) {
+ if (controller.cast(targetCard.getSpellAbility(), game, true)) {
+ ContinuousEffect effect = new DiluvianPrimordialReplacementEffect();
+ effect.setTargetPointer(new FixedTarget(targetCard.getId(), game.getState().getZoneChangeCounter(targetCard.getId())));
+ game.addEffect(effect, source);
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
+
+class DiluvianPrimordialReplacementEffect extends ReplacementEffectImpl {
+
+ public DiluvianPrimordialReplacementEffect() {
+ super(Duration.EndOfTurn, Outcome.Exile);
+ staticText = "If a card cast this way would be put into a graveyard this turn, exile it instead";
+ }
+
+ public DiluvianPrimordialReplacementEffect(final DiluvianPrimordialReplacementEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DiluvianPrimordialReplacementEffect copy() {
+ return new DiluvianPrimordialReplacementEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Card card = game.getCard(getTargetPointer().getFirst(game, source));
+ if (card != null) {
+ controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.STACK, true);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ZONE_CHANGE;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
+ return zEvent.getToZone() == Zone.GRAVEYARD
+ && ((ZoneChangeEvent) event).getTargetId().equals(getTargetPointer().getFirst(game, source));
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/GoblinDarkDwellers.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/GoblinDarkDwellers.java
new file mode 100644
index 00000000000..faddcda1825
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/GoblinDarkDwellers.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.oathofthegatewatch;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.keyword.MenaceAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.common.FilterInstantOrSorceryCard;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.ZoneChangeEvent;
+import mage.players.Player;
+import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GoblinDarkDwellers extends CardImpl {
+
+ private static final FilterInstantOrSorceryCard filter = new FilterInstantOrSorceryCard("instant or sorcery card with converted mana cost 3 or less");
+
+ static {
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 4));
+ }
+
+ public GoblinDarkDwellers(UUID ownerId) {
+ super(ownerId, 110, "Goblin Dark-Dwellers", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
+ this.expansionSetCode = "OGW";
+ this.subtype.add("Goblin");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Menace
+ this.addAbility(new MenaceAbility());
+
+ // When Goblin Dark-Dwellers enters the battlefield, you may cast target instant or sorcery card with converted mana cost 3 or less
+ // from your graveyard without paying its mana cost. If that card would be put into your graveyard this turn, exile it instead.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new GoblinDarkDwellersEffect());
+ ability.addTarget(new TargetCardInYourGraveyard(filter));
+ this.addAbility(ability);
+ }
+
+ public GoblinDarkDwellers(final GoblinDarkDwellers card) {
+ super(card);
+ }
+
+ @Override
+ public GoblinDarkDwellers copy() {
+ return new GoblinDarkDwellers(this);
+ }
+}
+
+class GoblinDarkDwellersEffect extends OneShotEffect {
+
+ GoblinDarkDwellersEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "you may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard without paying its mana cost. "
+ + "If that card would be put into your graveyard this turn, exile it instead";
+ }
+
+ GoblinDarkDwellersEffect(final GoblinDarkDwellersEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GoblinDarkDwellersEffect copy() {
+ return new GoblinDarkDwellersEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Card card = game.getCard(this.getTargetPointer().getFirst(game, source));
+ if (card != null) {
+ if (controller.chooseUse(outcome, "Cast " + card.getLogName() + "?", source, game)) {
+ if (controller.cast(card.getSpellAbility(), game, true)) {
+ ContinuousEffect effect = new GoblinDarkDwellersReplacementEffect(card.getId());
+ effect.setTargetPointer(new FixedTarget(card.getId(), game.getState().getZoneChangeCounter(card.getId())));
+ game.addEffect(effect, source);
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
+
+class GoblinDarkDwellersReplacementEffect extends ReplacementEffectImpl {
+
+ private final UUID cardId;
+
+ GoblinDarkDwellersReplacementEffect(UUID cardId) {
+ super(Duration.EndOfTurn, Outcome.Exile);
+ this.cardId = cardId;
+ staticText = "If that card would be put into your graveyard this turn, exile it instead";
+ }
+
+ GoblinDarkDwellersReplacementEffect(final GoblinDarkDwellersReplacementEffect effect) {
+ super(effect);
+ this.cardId = effect.cardId;
+ }
+
+ @Override
+ public GoblinDarkDwellersReplacementEffect copy() {
+ return new GoblinDarkDwellersReplacementEffect(this);
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Card card = game.getCard(this.cardId);
+ if (controller != null && card != null) {
+ controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.STACK, true);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ZONE_CHANGE;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
+ return zEvent.getToZone() == Zone.GRAVEYARD
+ && zEvent.getTargetId().equals(this.cardId);
+ }
+}
diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt
index 80e219a940c..fe22f84a221 100644
--- a/Utils/mtg-cards-data.txt
+++ b/Utils/mtg-cards-data.txt
@@ -28247,6 +28247,7 @@ Sphinx of the Final Word|Oath of the Gatewatch|63|M|{5}{U}{U}|Creature - Sphinx|
Kalitas, Traitor of Ghet|Oath of the Gatewatch|86|M|{2}{B}{B}|Legendary Creature - Vampire Warrior|3|4|Lifelink$If a nontoken creature an opponent controls would die, instead exile that card and put a 2/2 black Zombie creature token onto the battlefield.${2}{B}, Sacrifice another Vampire or Zombie: Put two +1/+1 counters on Kalitas, Traitor of Ghet.|
Kozilek's Return|Oath of the Gatewatch|98|M|{2}{R}|Instant|||Devoid (This card has no color.)$Kozilek's Return deals 2 damage to each creature.$Whenever you cast an Eldrazi creature spell with converted mana cost 7 or greater, you may exile Kozilek's Return from your graveyard. If you do, Kozilek's Return deals 5 damage to each creature.|
Chandra, Flamecaller|Oath of the Gatewatch|104|M|{4}{R}{R}|Planeswalker - Chandra|||+1: Put two 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step.$0: Discard all the cards in your hand, then draw that many cards plus one.$-X: Chandra, Flamecaller deals X damage to each creature.|
+Goblin Dark-Dwellers|Oath of the Gatewatch|110|R|{3}{R}{R}|Creature - Goblin|4|4|Menace$When Goblin Dark-Dwellers enters the battlefield, you may cast target instant or sorcery card with converted mana cost 3 or less from your graveyard without paying its mana cost. If that card would be put into your graveyard this turn, exile it instead.|
World Breaker|Oath of the Gatewatch|126|M|{6}{G}|Creature - Eldrazi|5|7|Devoid (This card has no color.)$When you cast World Breaker, exile target artifact, enchantment, or land.$Reach${2}{C}, Sacrifice a land: Return World Breaker from your graveyard to your hand. ({C} represents colorless mana.)|
Nissa, Voice of Zendikar|Oath of the Gatewatch|138|M|{1}{G}{G}|Planeswalker - Nissa|||+1: Put a 0/1 green Plant creature token onto the battlefield.$-2: Put a +1/+1 counter on each creature you control.$-7: You gain X life and draw X cards, where X is the number of lands you control.|
Ayli, Eternal Pilgrim|Oath of the Gatewatch|151|R|{W}{B}|Legendary Creature - Kor Cleric|2|3|Deathtouch${1}, Sacrifice another creature: You gain life equal to the sacrificed creature's toughness.${1}{W}{B}, Sacrifice another creature: Exile target nonland permanent. Activate this ability only if you have at least 10 life more than your starting life total.|