From 702f0eb34edffcbefa0c436bf87fe7d1d5e307da Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 5 Jan 2016 18:31:07 -0600 Subject: [PATCH] [OGW] Added 1/5 spoilers to mtg-card-data.txt. Added 11 cards. Updated "second spell cast" cards to use a different watcher. --- .../sets/gatecrash/IncursionSpecialist.java | 261 ++++++++---------- .../src/mage/sets/guildpact/Castigate.java | 5 - .../sets/oathofthegatewatch/BalothNull.java | 69 +++++ .../oathofthegatewatch/BondsOfMortality.java | 86 ++++++ .../oathofthegatewatch/CliffhavenVampire.java | 69 +++++ .../sets/oathofthegatewatch/DranasChosen.java | 86 ++++++ .../oathofthegatewatch/FallOfTheTitans.java | 65 +++++ .../oathofthegatewatch/InverterOfTruth.java | 110 ++++++++ .../oathofthegatewatch/JoriEnRuinDiver.java | 49 +--- .../oathofthegatewatch/MundasVanguard.java | 13 +- .../PyromancersAssault.java | 49 +--- .../oathofthegatewatch/StormchaserMage.java | 69 +++++ .../oathofthegatewatch/SylvanAdvocate.java | 93 +++++++ .../oathofthegatewatch/ThoughtKnotSeer.java | 83 ++++++ .../sets/oathofthegatewatch/VoidGrafter.java | 86 ++++++ .../oathofthegatewatch/WeaponsTrainer.java | 80 ++++++ Mage/src/main/java/mage/players/Player.java | 2 +- Utils/mtg-cards-data.txt | 14 + 18 files changed, 1036 insertions(+), 253 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/BalothNull.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/BondsOfMortality.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/CliffhavenVampire.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/DranasChosen.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/FallOfTheTitans.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/InverterOfTruth.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/StormchaserMage.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/SylvanAdvocate.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/ThoughtKnotSeer.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/VoidGrafter.java create mode 100644 Mage.Sets/src/mage/sets/oathofthegatewatch/WeaponsTrainer.java diff --git a/Mage.Sets/src/mage/sets/gatecrash/IncursionSpecialist.java b/Mage.Sets/src/mage/sets/gatecrash/IncursionSpecialist.java index 915acc973a2..e6e49c66bd3 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/IncursionSpecialist.java +++ b/Mage.Sets/src/mage/sets/gatecrash/IncursionSpecialist.java @@ -1,151 +1,110 @@ -/* - * 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.TriggeredAbilityImpl; -import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; -import mage.abilities.effects.common.continuous.BoostSourceEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; -import mage.constants.WatcherScope; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.stack.Spell; -import mage.watchers.Watcher; - -/** - * - * @author jeffwadsworth - */ -public class IncursionSpecialist extends CardImpl { - - public IncursionSpecialist(UUID ownerId) { - super(ownerId, 38, "Incursion Specialist", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); - this.expansionSetCode = "GTC"; - this.subtype.add("Human"); - this.subtype.add("Wizard"); - - this.power = new MageInt(1); - this.toughness = new MageInt(3); - - // Whenever you cast your second spell each turn, Incursion Specialist gets +2/+0 until end of turn and can't be blocked this turn. - this.addAbility(new IncursionTriggeredAbility(), new IncursionWatcher()); - } - - public IncursionSpecialist(final IncursionSpecialist card) { - super(card); - } - - @Override - public IncursionSpecialist copy() { - return new IncursionSpecialist(this); - } -} - -class IncursionTriggeredAbility extends TriggeredAbilityImpl { - - public IncursionTriggeredAbility() { - super(Zone.BATTLEFIELD, new BoostSourceEffect(2, 0, Duration.EndOfTurn)); - this.addEffect(new CantBeBlockedSourceEffect(Duration.EndOfTurn)); - } - - public IncursionTriggeredAbility(final IncursionTriggeredAbility ability) { - super(ability); - } - - @Override - public IncursionTriggeredAbility copy() { - return new IncursionTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.SPELL_CAST; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getPlayerId().equals(controllerId)) { - Watcher watcher = game.getState().getWatchers().get("SecondSpellCast", controllerId); - if (watcher != null && watcher.conditionMet()) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever you cast your second spell each turn, Incursion Specialist gets +2/+0 until end of turn and can't be blocked this turn."; - } -} - -class IncursionWatcher extends Watcher { - - int spellCount = 0; - - public IncursionWatcher() { - super("SecondSpellCast", WatcherScope.PLAYER); - } - - public IncursionWatcher(final IncursionWatcher watcher) { - super(watcher); - this.spellCount = watcher.spellCount; - } - - @Override - public IncursionWatcher copy() { - return new IncursionWatcher(this); - } - - @Override - public void watch(GameEvent event, Game game) { - condition = false; - if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getPlayerId().equals(controllerId)) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null) { - spellCount++; - if (spellCount == 2) { - condition = true; - } - } - } - } - - @Override - public void reset() { - super.reset(); - spellCount = 0; - } -} \ No newline at end of file +/* + * 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.TriggeredAbilityImpl; +import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.watchers.common.CastSpellLastTurnWatcher; + +/** + * + * @author jeffwadsworth + */ +public class IncursionSpecialist extends CardImpl { + + public IncursionSpecialist(UUID ownerId) { + super(ownerId, 38, "Incursion Specialist", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "GTC"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Whenever you cast your second spell each turn, Incursion Specialist gets +2/+0 until end of turn and can't be blocked this turn. + this.addAbility(new IncursionTriggeredAbility(), new CastSpellLastTurnWatcher()); + } + + public IncursionSpecialist(final IncursionSpecialist card) { + super(card); + } + + @Override + public IncursionSpecialist copy() { + return new IncursionSpecialist(this); + } +} + +class IncursionTriggeredAbility extends TriggeredAbilityImpl { + + public IncursionTriggeredAbility() { + super(Zone.BATTLEFIELD, new BoostSourceEffect(2, 0, Duration.EndOfTurn)); + this.addEffect(new CantBeBlockedSourceEffect(Duration.EndOfTurn)); + } + + public IncursionTriggeredAbility(final IncursionTriggeredAbility ability) { + super(ability); + } + + @Override + public IncursionTriggeredAbility copy() { + return new IncursionTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(controllerId)) { + CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get("CastSpellLastTurnWatcher"); + if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever you cast your second spell each turn, Incursion Specialist gets +2/+0 until end of turn and can't be blocked this turn."; + } +} diff --git a/Mage.Sets/src/mage/sets/guildpact/Castigate.java b/Mage.Sets/src/mage/sets/guildpact/Castigate.java index b21755aab2f..b0a9aa10912 100644 --- a/Mage.Sets/src/mage/sets/guildpact/Castigate.java +++ b/Mage.Sets/src/mage/sets/guildpact/Castigate.java @@ -28,17 +28,13 @@ package mage.sets.guildpact; import java.util.UUID; - import mage.abilities.effects.common.ExileCardYouChooseTargetOpponentEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.filter.Filter; import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.target.common.TargetOpponent; /** @@ -57,7 +53,6 @@ public class Castigate extends CardImpl { super(ownerId, 106, "Castigate", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{W}{B}"); this.expansionSetCode = "GPT"; - // Target opponent reveals his or her hand. You choose a nonland card from it and exile that card. this.getSpellAbility().addEffect(new ExileCardYouChooseTargetOpponentEffect(filter)); this.getSpellAbility().addTarget(new TargetOpponent()); diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/BalothNull.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/BalothNull.java new file mode 100644 index 00000000000..1f1bcb14d29 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/BalothNull.java @@ -0,0 +1,69 @@ +/* + * 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.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class BalothNull extends CardImpl { + + public BalothNull(UUID ownerId) { + super(ownerId, 152, "Baloth Null", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{B}{G}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Zombie"); + this.subtype.add("Beast"); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // When Baloth Null enters the battlefield, return up to two target creature cards from your graveyard to your hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect(), false); + ability.addTarget(new TargetCardInYourGraveyard(0, 2, new FilterCreatureCard("creature cards from your graveyard"))); + this.addAbility(ability); + } + + public BalothNull(final BalothNull card) { + super(card); + } + + @Override + public BalothNull copy() { + return new BalothNull(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/BondsOfMortality.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/BondsOfMortality.java new file mode 100644 index 00000000000..0d0d32bf29d --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/BondsOfMortality.java @@ -0,0 +1,86 @@ +/* + * 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.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.LoseAbilityAllEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author fireshoes + */ +public class BondsOfMortality extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures your opponents control"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public BondsOfMortality(UUID ownerId) { + super(ownerId, 128, "Bonds of Mortality", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + this.expansionSetCode = "OGW"; + + // When Bonds of Mortality enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); + + // {G}: Creatures your opponents control lose hexproof and indestructible until end of turn. + Effect effect = new LoseAbilityAllEffect(filter, HexproofAbility.getInstance(), Duration.EndOfTurn); + effect.setText("Creatures your opponents control lose hexproof"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{G}")); + effect = new LoseAbilityAllEffect(filter, IndestructibleAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and indestructible until end of turn"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public BondsOfMortality(final BondsOfMortality card) { + super(card); + } + + @Override + public BondsOfMortality copy() { + return new BondsOfMortality(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/CliffhavenVampire.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/CliffhavenVampire.java new file mode 100644 index 00000000000..0d736073577 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/CliffhavenVampire.java @@ -0,0 +1,69 @@ +/* + * 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.common.GainLifeControllerTriggeredAbility; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class CliffhavenVampire extends CardImpl { + + public CliffhavenVampire(UUID ownerId) { + super(ownerId, 153, "Cliffhaven Vampire", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}{B}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Vampire"); + this.subtype.add("Warrior"); + this.subtype.add("Ally"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever you gain life, each opponent loses 1 life. + this.addAbility(new GainLifeControllerTriggeredAbility(new LoseLifeOpponentsEffect(1), false)); + } + + public CliffhavenVampire(final CliffhavenVampire card) { + super(card); + } + + @Override + public CliffhavenVampire copy() { + return new CliffhavenVampire(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/DranasChosen.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/DranasChosen.java new file mode 100644 index 00000000000..151e31cf7e8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/DranasChosen.java @@ -0,0 +1,86 @@ +/* + * 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.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.permanent.token.ZombieToken; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class DranasChosen extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("an untapped Ally you control"); + + static { + filter.add(new SubtypePredicate("Ally")); + filter.add(Predicates.not(new TappedPredicate())); + } + + public DranasChosen(UUID ownerId) { + super(ownerId, 84, "Drana's Chosen", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Vampire"); + this.subtype.add("Shaman"); + this.subtype.add("Ally"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Cohort — {T}, Tap an untapped Ally you control: Put a 2/2 black Zombie creature token onto the battlefield tapped. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new ZombieToken(), 1, true, false), new TapSourceCost()); + ability.addCost(new TapTargetCost(new TargetControlledPermanent(filter))); + ability.setAbilityWord(AbilityWord.COHORT); + this.addAbility(ability); + } + + public DranasChosen(final DranasChosen card) { + super(card); + } + + @Override + public DranasChosen copy() { + return new DranasChosen(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/FallOfTheTitans.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/FallOfTheTitans.java new file mode 100644 index 00000000000..73a37808e60 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/FallOfTheTitans.java @@ -0,0 +1,65 @@ +/* + * 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.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.SurgeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class FallOfTheTitans extends CardImpl { + + public FallOfTheTitans(UUID ownerId) { + super(ownerId, 109, "Fall of the Titans", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{X}{X}{R}"); + this.expansionSetCode = "OGW"; + + // Fall of the Titans deals X damage to each of up to two target creatures and/or players. + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer(0, 2)); + this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue())); + + // Surge {X}{R} + addAbility(new SurgeAbility(this, "{X}{R}")); + } + + public FallOfTheTitans(final FallOfTheTitans card) { + super(card); + } + + @Override + public FallOfTheTitans copy() { + return new FallOfTheTitans(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/InverterOfTruth.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/InverterOfTruth.java new file mode 100644 index 00000000000..a182186ab92 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/InverterOfTruth.java @@ -0,0 +1,110 @@ +/* + * 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.OneShotEffect; +import mage.abilities.keyword.DevoidAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class InverterOfTruth extends CardImpl { + + public InverterOfTruth(UUID ownerId) { + super(ownerId, 72, "Inverter of Truth", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Eldrazi"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Devoid + this.addAbility(new DevoidAbility(this.color)); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Inverter of Truth enters the battlefield, exile all cards from your library face down, then shuffle all cards from your graveyard into your library. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ExileLibraryEffect(), false)); + } + + public InverterOfTruth(final InverterOfTruth card) { + super(card); + } + + @Override + public InverterOfTruth copy() { + return new InverterOfTruth(this); + } +} + +class ExileLibraryEffect extends OneShotEffect { + + public ExileLibraryEffect() { + super(Outcome.Exile); + staticText = "exile all cards from your library face down, then shuffle all cards from your graveyard into your library"; + } + + @java.lang.Override + public ExileLibraryEffect copy() { + return new ExileLibraryEffect(); + } + + @java.lang.Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int count = controller.getLibrary().size(); + if (count > 0) { + for (Card cardToExile: controller.getLibrary().getCards(game)) { + cardToExile.moveToExile(null, "", source.getSourceId(), game); + cardToExile.setFaceDown(true, game); + } + } + for (Card cardToLibrary: controller.getGraveyard().getCards(game)) { + controller.moveCardToLibraryWithInfo(cardToLibrary, source.getSourceId(), game, Zone.GRAVEYARD, true, true); + } + controller.shuffleLibrary(game); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/JoriEnRuinDiver.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/JoriEnRuinDiver.java index 5d36252e759..88396f9c5b1 100644 --- a/Mage.Sets/src/mage/sets/oathofthegatewatch/JoriEnRuinDiver.java +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/JoriEnRuinDiver.java @@ -34,13 +34,11 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.WatcherScope; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import mage.game.stack.Spell; -import mage.watchers.Watcher; +import mage.watchers.common.CastSpellLastTurnWatcher; /** * @@ -58,7 +56,7 @@ public class JoriEnRuinDiver extends CardImpl { this.toughness = new MageInt(3); // Whenever you cast your second spell each turn, draw a card. - this.addAbility(new JoriEnTriggeredAbility(), new JoriEnWatcher()); + this.addAbility(new JoriEnTriggeredAbility(), new CastSpellLastTurnWatcher()); } public JoriEnRuinDiver(final JoriEnRuinDiver card) { @@ -94,8 +92,8 @@ class JoriEnTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getPlayerId().equals(controllerId)) { - Watcher watcher = game.getState().getWatchers().get("SecondSpellCast", controllerId); - if (watcher != null && watcher.conditionMet()) { + CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get("CastSpellLastTurnWatcher"); + if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2) { return true; } } @@ -107,42 +105,3 @@ class JoriEnTriggeredAbility extends TriggeredAbilityImpl { return "Whenever you cast your second spell each turn, draw a card."; } } - -class JoriEnWatcher extends Watcher { - - int spellCount = 0; - - public JoriEnWatcher() { - super("SecondSpellCast", WatcherScope.PLAYER); - } - - public JoriEnWatcher(final JoriEnWatcher watcher) { - super(watcher); - this.spellCount = watcher.spellCount; - } - - @Override - public JoriEnWatcher copy() { - return new JoriEnWatcher(this); - } - - @Override - public void watch(GameEvent event, Game game) { - condition = false; - if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getPlayerId().equals(controllerId)) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null) { - spellCount++; - if (spellCount == 2) { - condition = true; - } - } - } - } - - @Override - public void reset() { - super.reset(); - spellCount = 0; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/MundasVanguard.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/MundasVanguard.java index a6d7e934a9c..77fd534295d 100644 --- a/Mage.Sets/src/mage/sets/oathofthegatewatch/MundasVanguard.java +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/MundasVanguard.java @@ -41,19 +41,20 @@ import mage.constants.Rarity; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.TappedPredicate; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetControlledPermanent; /** * * @author fireshoes */ public class MundasVanguard extends CardImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Ally you control"); - + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("an untapped Ally you control"); + static { filter.add(new SubtypePredicate("Ally")); filter.add(Predicates.not(new TappedPredicate())); @@ -69,9 +70,9 @@ public class MundasVanguard extends CardImpl { this.toughness = new MageInt(3); // Cohort — {T}, Tap an untapped Ally you control: Put a +1/+1 counter on each creature you control. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersAllEffect(CounterType.P1P1.createInstance(), new FilterControlledCreaturePermanent()), + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersAllEffect(CounterType.P1P1.createInstance(), new FilterControlledCreaturePermanent()), new TapSourceCost()); - ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(filter))); + ability.addCost(new TapTargetCost(new TargetControlledPermanent(filter))); ability.setAbilityWord(AbilityWord.COHORT); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/PyromancersAssault.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/PyromancersAssault.java index 9e85489e807..20b0ac73ed9 100644 --- a/Mage.Sets/src/mage/sets/oathofthegatewatch/PyromancersAssault.java +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/PyromancersAssault.java @@ -34,14 +34,12 @@ import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.WatcherScope; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import mage.game.stack.Spell; import mage.target.common.TargetCreatureOrPlayer; -import mage.watchers.Watcher; +import mage.watchers.common.CastSpellLastTurnWatcher; /** * @@ -56,7 +54,7 @@ public class PyromancersAssault extends CardImpl { // Whenever you cast your second spell each turn, Pyromancer's Assault deals 2 damage to target creature or player. Ability ability = new PyromancersAssaultTriggeredAbility(); ability.addTarget(new TargetCreatureOrPlayer()); - this.addAbility(ability, new PyromancersAssaultWatcher()); + this.addAbility(ability, new CastSpellLastTurnWatcher()); } public PyromancersAssault(final PyromancersAssault card) { @@ -92,8 +90,8 @@ class PyromancersAssaultTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getPlayerId().equals(controllerId)) { - Watcher watcher = game.getState().getWatchers().get("SecondSpellCast", controllerId); - if (watcher != null && watcher.conditionMet()) { + CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get("CastSpellLastTurnWatcher"); + if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2) { return true; } } @@ -105,42 +103,3 @@ class PyromancersAssaultTriggeredAbility extends TriggeredAbilityImpl { return "Whenever you cast your second spell each turn, {this} deals 2 damage to target creature or player."; } } - -class PyromancersAssaultWatcher extends Watcher { - - int spellCount = 0; - - public PyromancersAssaultWatcher() { - super("SecondSpellCast", WatcherScope.PLAYER); - } - - public PyromancersAssaultWatcher(final PyromancersAssaultWatcher watcher) { - super(watcher); - this.spellCount = watcher.spellCount; - } - - @Override - public PyromancersAssaultWatcher copy() { - return new PyromancersAssaultWatcher(this); - } - - @Override - public void watch(GameEvent event, Game game) { - condition = false; - if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getPlayerId().equals(controllerId)) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null) { - spellCount++; - if (spellCount == 2) { - condition = true; - } - } - } - } - - @Override - public void reset() { - super.reset(); - spellCount = 0; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/StormchaserMage.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/StormchaserMage.java new file mode 100644 index 00000000000..152141edf93 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/StormchaserMage.java @@ -0,0 +1,69 @@ +/* + * 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.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.ProwessAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class StormchaserMage extends CardImpl { + + public StormchaserMage(UUID ownerId) { + super(ownerId, 159, "Stormchaser Mage", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{U}{R}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Haste + this.addAbility(HasteAbility.getInstance()); + // Prowess + this.addAbility(new ProwessAbility()); + } + + public StormchaserMage(final StormchaserMage card) { + super(card); + } + + @Override + public StormchaserMage copy() { + return new StormchaserMage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/SylvanAdvocate.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/SylvanAdvocate.java new file mode 100644 index 00000000000..e06552a0b33 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/SylvanAdvocate.java @@ -0,0 +1,93 @@ +/* + * 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.SimpleStaticAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author fireshoes + */ +public class SylvanAdvocate extends CardImpl { + + private static final String rule1 = "As long as you control six or more lands, {this}"; + private static final String rule2 = "and land creatures you control get +2/+2."; + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("land creatures"); + + static { + filter.add(new CardTypePredicate(CardType.LAND)); + } + + public SylvanAdvocate(UUID ownerId) { + super(ownerId, 144, "Sylvan Advocate", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Elf"); + this.subtype.add("Druid"); + this.subtype.add("Ally"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // As long as you control six or more lands, Sylvan Advocate and land creatures you control get +2/+2. + ConditionalContinuousEffect effect1 = new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), + new PermanentsOnTheBattlefieldCondition(new FilterControlledLandPermanent(), CountType.MORE_THAN, 5), rule1); + ConditionalContinuousEffect effect2 = new ConditionalContinuousEffect(new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, filter, true), + new PermanentsOnTheBattlefieldCondition(new FilterControlledLandPermanent(), CountType.MORE_THAN, 5), rule2); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect1); + ability.addEffect(effect2); + this.addAbility(ability); + } + + public SylvanAdvocate(final SylvanAdvocate card) { + super(card); + } + + @Override + public SylvanAdvocate copy() { + return new SylvanAdvocate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/ThoughtKnotSeer.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/ThoughtKnotSeer.java new file mode 100644 index 00000000000..b11b41e287e --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/ThoughtKnotSeer.java @@ -0,0 +1,83 @@ +/* + * 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.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DrawCardTargetEffect; +import mage.abilities.effects.common.ExileCardYouChooseTargetOpponentEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class ThoughtKnotSeer extends CardImpl { + + private static final FilterCard filter = new FilterCard("a nonland card"); + + static { + filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); + } + + public ThoughtKnotSeer(UUID ownerId) { + super(ownerId, 9, "Thought-Knot Seer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{C}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Eldrazi"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When Thought-Knot Seer enters the battlefield, target opponent reveals his or her hand. You choose a nonland card from it and exile that card. + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileCardYouChooseTargetOpponentEffect(filter), false); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + + // When Thought-Knot Seer leaves the battlefield, target opponent draws a card. + ability = new LeavesBattlefieldTriggeredAbility(new DrawCardTargetEffect(1), false); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public ThoughtKnotSeer(final ThoughtKnotSeer card) { + super(card); + } + + @Override + public ThoughtKnotSeer copy() { + return new ThoughtKnotSeer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/VoidGrafter.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/VoidGrafter.java new file mode 100644 index 00000000000..e4384dcfc89 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/VoidGrafter.java @@ -0,0 +1,86 @@ +/* + * 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.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.DevoidAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.HexproofAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class VoidGrafter extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control"); + + static { + filter.add(new AnotherPredicate()); + } + + public VoidGrafter(UUID ownerId) { + super(ownerId, 150, "Void Grafter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{G}{U}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Eldrazi"); + this.subtype.add("Drone"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Devoid + this.addAbility(new DevoidAbility(this.color)); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // When Void Grafter enters the battlefield, another target creature you control gain hexproof until end of turn. + Ability ability = new EntersBattlefieldTriggeredAbility(new GainAbilityTargetEffect(HexproofAbility.getInstance(), Duration.EndOfTurn), false); + ability.addTarget(new TargetControlledCreaturePermanent(filter)); + this.addAbility(ability); + } + + public VoidGrafter(final VoidGrafter card) { + super(card); + } + + @Override + public VoidGrafter copy() { + return new VoidGrafter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/WeaponsTrainer.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/WeaponsTrainer.java new file mode 100644 index 00000000000..6cbcbd7a1e4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/WeaponsTrainer.java @@ -0,0 +1,80 @@ +/* + * 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.common.SimpleStaticAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class WeaponsTrainer extends CardImpl { + + private static final String rule = "Other creatures you control get +1/+0 as long as you control an Equipment."; + private static final FilterControlledPermanent filter = new FilterControlledPermanent("an Equipment"); + + static { + filter.add(new SubtypePredicate("Equipment")); + } + + public WeaponsTrainer(UUID ownerId) { + super(ownerId, 160, "Weapons Trainer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}{W}"); + this.expansionSetCode = "OGW"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.subtype.add("Ally"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Other creatures you control get +1/+0 as long as you control an Equipment. + ConditionalContinuousEffect effect = new ConditionalContinuousEffect(new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield, true), + new PermanentsOnTheBattlefieldCondition(filter), rule); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + } + + public WeaponsTrainer(final WeaponsTrainer card) { + super(card); + } + + @Override + public WeaponsTrainer copy() { + return new WeaponsTrainer(this); + } +} diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index d2565bd84a1..654f503e0c8 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -678,7 +678,7 @@ public interface Player extends MageItem, Copyable { * @param toZone * @param source * @param game - * @param tapped tha cards are tapped on the battlefield + * @param tapped the cards are tapped on the battlefield * @param faceDown the cards are face down in the to zone * @param byOwner the card is moved (or put onto battlefield) by the owner * of the card and if target zone is battlefield controls the permanent diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 16ea813145c..8c726ae3cc9 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -28247,7 +28247,9 @@ Deceiver of Form|Oath of the Gatewatch|1|R|{6}{C}|Creature - Eldrazi|8|8|At the Eldrazi Mimic|Oath of the Gatewatch|2|R|{2}|Creature - Eldrazi|2|1|Whenever another colorless creature enters the battlefield under your control, you may have the base power and toughness of Eldrazi Mimic become that creature's power and toughness until end of turn.| Endbringer|Oath of the Gatewatch|3|R|{5}{C}|Creature - Eldrazi|5|5|Untap Endbringer during each other player's untap step.${T}: Endbringer deals 1 damage to target creature or player.${C}, {T}: Target creature can't attack or block this turn.${C}{C}, {T}: Draw a card.| Kozilek, the Great Distortion|Oath of the Gatewatch|4|M|{8}{C}{C}|Legendary Creature - Eldrazi|12|12|When you cast Kozilek, the Great Distortion, if you have fewer than seven cards in hand, draw cards equal to the difference.$Menace$Discard a card with converted mana cost X: Counter target spell with converted mana cost X.| +Reality Smasher|Oath of the Gatewatch|7|R|{4}{C}|Creature - Eldrazi|5|5|Trample, haste$Whenever Reality Smasher becomes the target of a spell an opponent controls, counter that spell unless its controller discards a card.| Spatial Contortion|Oath of the Gatewatch|8|U|{1}{C}|Instant|||Target creature gets +3/-3 until end of turn.| +Thought-Knot Seer|Oath of the Gatewatch|9|R|{3}{C}|Creature - Eldrazi|4|4|When Thought-Knot Seer enters the battlefield, target opponent reveals his or her hand. You choose a nonland card from it and exile that card.$When Thought-Knot Seer leaves the battlefield, target opponent draws a card.| Walker of the Wastes|Oath of the Gatewatch|10|U|{4}{C}|Creature - Eldrazi|4|4|Trample$Walker of the Wastes gets +1/+1 for each land you control named Wastes.| Eldrazi Displacer|Oath of the Gatewatch|13|R|{2}{W}|Creature - Eldrazi|3|3|Devoid (This card has no color.)${2}{C}: Exile another target creature, then return it to the battlefield tapped under its owner's control.| Call the Gatewatch|Oath of the Gatewatch|16|R|{2}{W}|Sorcery|||Search your library for a planeswalker card, reveal it, and put it into your hand. Then shuffle your library.| @@ -28262,12 +28264,15 @@ Deepfathom Skulker|Oath of the Gatewatch|43|R|{5}{U}|Creature - Eldrazi|4|4|Devo Prophet of Distortion|Oath of the Gatewatch|46|U|{U}|Creature - Eldrazi Drone|1|2|Devoid (This card has no color.)${3}{C}: Draw a card.| Comparative Analysis|Oath of the Gatewatch|51|C|{3}{U}|Instant|||Surge {2}{U} $Target player draws two cards.| Crush of Tentacles|Oath of the Gatewatch|53|M|{4}{U}{U}|Sorcery|||Surge {3}{U}{U} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Return all nonland permanents to their owners' hands. If Crush of Tentacles surge cost was paid, put an 8/8 blue Octopus creature token onto the battlefield.| +Hedron Alignment|Oath of the Gatewatch|57|R|{2}{U}|Enchantment|||Hexproof$At the beginning of your upkeep, you may reveal your hand. If you do, you win the game if you own a card named Hedron Alignment in exile, in your hand, in your graveyard, and on the battlefield.${1}{U}: Scry 1.| Oath of Jace|Oath of the Gatewatch|60|R|{2}{U}|Legendary Enchantment|||When Oath of Jace enters the battlefield, draw three cards, then discard two cards.$At the beginning of your upkeep, scry X, where X is the number of planeswalkers you control.| Overwhelming Denial|Oath of the Gatewatch|61|R|{2}{U}{U}|Instant|||Surge {U}{U} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Overwhelming Denial can't be countered by spell or abilities.$Counter target spell.| Sphinx of the Final Word|Oath of the Gatewatch|63|M|{5}{U}{U}|Creature - Sphinx|5|5|Sphinx of the Final Word can't be countered.$Flying, hexproof$Instant and sorcery spells you control can't be countered by spells or abilities.| Dread Defiler|Oath of the Gatewatch|68|R|{6}{B}|Creature - Eldrazi|6|8|Devoid (This card has no color.)${3}{C}, Exile a creature card from your graveyard: Target opponent loses life equal to the exiled card's power.| Skinning Tendrils|Oath of the Gatewatch|70|U|{1}{B}{B}|Sorcery|||Devoid (This card has no color.)$All creatures get -2/-2 until end of turn. If a creature would die this turn, exile it instead.| +Inverter of Truth|Oath of the Gatewatch|72|M|{2}{B}{B}|Creature - Eldrazi|6|6|Devoid (This card has no color.)$Flying$When Inverter of Truth enters the battlefield, exile all cards from your library face down, then shuffle all cards from your graveyard into your library.| Sifter of Skulls|Oath of the Gatewatch|77|R|{3}{B}|Creature - Eldrazi|4|3|Devoid (This card has no color.)$Whenever another nontoken creature you control dies, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."| +Drana's Chosen|Oath of the Gatewatch|84|R|{3}{B}|Creature - Vampire Shaman Ally|2|2|Cohort — {T}, Tap an untapped Ally you control: Put a 2/2 black Zombie creature token onto the battlefield tapped.| 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.| Remorseless Punishment|Oath of the Gatewatch|89|R|{3}{B}{B}|Sorcery|||Target opponent loses 5 life unless that player discards two cards or sacrifices a creature or planeswalker. Repeat this process once.| Eldrazi Obligator|Oath of the Gatewatch|96|R|{2}{R}|Creature - Eldrazi Drone|3|1|Devoid (This card has no color.)$Haste$When you cast Eldrazi Obligator, you may pay {1}{C}. If you do, gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.| @@ -28275,25 +28280,34 @@ Kozilek's Return|Oath of the Gatewatch|98|M|{2}{R}|Instant|||Devoid (This car Boulder Salvo|Oath of the Gatewatch|102|C|{4}{R}|Sorcery|||Surge {1}{R} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Boulder Salvo deals 4 damage to target 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.| Embodiment of Fury|Oath of the Gatewatch|107|U|{3}{R}|Creature - Elemental|4|3|Trample$Land creatures you control have trample.$Landfall - Whenever a land enters the battlefield under your control, you may have target land you control become a 3/3 Elemental creature with haste until end of turn. It's still a land.| +Fall of the Titans|Oath of the Gatewatch|109|R|{X}{X}{R}|Instant|||Surge {X}{R} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Fall of the Titans deals X damage to each of up to two target creatures and/or players.| 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.| +Oath of Chandra|Oath of the Gatewatch|113|R|{1}{R}|Legendary Enchantment|||When Oath of Chandra enters the battlefield, it deals 3 damage to target creature an opponent controls.$At the beginning of each end step, if a planeswalker entered the battlefield under your control this turn, Oath of Chandra deals 2 damage to each opponent.| Pyromancer's Assault|Oath of the Gatewatch|115|U|{3}{R}|Enchantment|||Whenever you cast your second spell each turn, Pyromancer's Assault deals 2 damage to target creature or player.| Reckless Bushwhacker|Oath of the Gatewatch|116|U|{2}{R}|Creature - Goblin Warrior Ally|2|1|Surge {1}{R} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Haste$When Reckless Bushwhacker enters the battlefield, if its surge cost was paid, other creatures you control get +1/+0 and gain haste until end of turn.| Tyrant of Valakut|Oath of the Gatewatch|119|R|{5}{R}{R}|Creature - Dragon|5|4|Surge {3}{R}{R} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Flying$When Tyrant of Valakut enters the battlefield, if its surge cost was paid, it deals 3 damage to target creature or player.| Scion Summoner|Oath of the Gatewatch|123|C|{2}{G}|Creature - Eldrazi Drone|2|2|Devoid (This card has no color.)$When Scion Summoner enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."| Vile Redeemer|Oath of the Gatewatch|125|R|{2}{G}|Creature - Eldrazi|3|3|Devoid (This card has no color.)$Flash$When you cast Vile Redeemer, you may pay {C}. If you do put a 1/1 colorless Eldrazi Scion creature token onto the battlefield for each nontoken creature that died under your control this turn. They have "Sacrifice this creature: Add {C} to your mana pool."| 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.)| +Bonds of Mortality|Oath of the Gatewatch|128|U|{1}{G}|Enchantment|||When Bonds of Mortality enters the battlefield, draw a card.${G}: Creatures your opponents control lose hexproof and indestructible until end of turn.| Embodiment of Insight|Oath of the Gatewatch|131|U|{4}{G}|Creature - Elemental|4|4|Vigilance$Land creatures you control have vigilance.$Landfall - Whenever a land enters the battlefield under you control, you may have target land you control become a 3/3 Elemental creature with haste until end of turn. It's still a land.| Gladehart Cavalry|Oath of the Gatewatch|132|R|{5}{G}{G}|Creature - Elf Knight|6|6|When Gladehart Cavalry enters the battlefield, support 6. (Put a +1/+1 counter on each of up to six other target creatures.)$Whenever a creature you control with a +1/+1 counter on it dies, you gain 2 life.| 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.| Oath of Nissa|Oath of the Gatewatch|140|R|{G}|Legendary Enchantment|||When Oath of Nissa enters the battlefield, look at the top three cards of your library. You may reveal a creature, land, or planeswalker card from among them and put it into your hand. Put the rest on the bottom of your library in any order.$You may spend mana as though it were mana of any color to cast planeswalker spells.| +Sylvan Advocate|Oath of the Gatewatch|144|R|{1}{G}|Creature - Elf Druid Ally|2|3|Vigilance$As long as you control six or more lands, Sylvan Advocate and land creatures you control get +2/+2.| Flayer Drone|Oath of the Gatewatch|148|U|{1}{B}{R}|Creature - Eldrazi Drone|3|1|Devoid (This card has no color.)$First strike$Whenever another colorless creature enters the battlefield under your control, target opponent loses 1 life.| Mindmelter|Oath of the Gatewatch|149|U|{1}{U}{B}|Creature - Eldrazi Drone|2|2|Devoid (This card has no color.)$Mindmelter can't be blocked.${3}{C}: Target opponent exiles a card from his or her hand. Activate this ability only any time you could cast a sorcery. ({C} represents colorless mana.)| +Void Grafter|Oath of the Gatewatch|150|U|{1}{G}{U}|Creature - Eldrazi Drone|2|4|Devoid (This card has no color.)$Flash (You may cast this spell any time you could cast an instant.)$When Void Grafter enters the battlefield, another target creature you control gain hexproof until end of turn.| 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.| +Baloth Null|Oath of the Gatewatch|152|U|{4}{B}{G}|Creature - Zombie Beast|4|5|When Baloth Null enters the battlefield, return up to two target creature cards from your graveyard to your hand.| +Cliffhaven Vampire|Oath of the Gatewatch|153|U|{2}{W}{B}|Creature - Vampire Warrior Ally|2|4|Flying$Whenever you gain life, each opponent loses 1 life.| Joraga Auxiliary|Oath of the Gatewatch|154|U|{1}{G}{W}|Creature - Elf Soldier Ally|2|3|{4}{G}{W}: Support 2. (Put a +1/+1 counter on each of up to two other target creatures.)| Jori En, Ruin Diver|Oath of the Gatewatch|155|R|{1}{U}{R}|Legendary Creature - Merfolk Wizard|2|3|Whenever you cast your second spell each turn, draw a card.| Mina and Denn, Wildborn|Oath of the Gatewatch|156|R|{2}{R}{G}|Legendary Creature - Elf Ally|4|4|You may play an additional land on each of your turns.${R}{G}, Return a land you control to its owner's hand: Target creature gains trample until end of turn.| Reflector Mage|Oath of the Gatewatch|157|U|{1}{W}{U}|Creature - Human Wizard|2|3|When Reflector Mage enters the battlefield, return target creature an opponent controls to its owner's hand. That creature's owner can't cast spells with the same name as that creature until your next turn.| Relentless Hunter|Oath of the Gatewatch|158|U|{1}{R}{G}|Creature - Human Warrior|3|3|{1}{R}{G}: Relentless Hunter gets +1/+1 and gains trample until end of turn.| +Stormchaser Mage|Oath of the Gatewatch|159|U|{U}{R}|Creature - Human Wizard|1|3|Flying, haste$Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)| +Weapons Trainer|Oath of the Gatewatch|160|U|{R}{W}|Creature - Human Soldier Ally|3|2|Other creatures you control get +1/+0 as long as you control an Equipment.| Bone Saw|Oath of the Gatewatch|161|C|{0}|Artifact - Equipment|||Equipped creature gets +1/+0.$Equip {1}| Stoneforge Masterwork|Oath of the Gatewatch|166|R|{1}|Artifact - Equipment|||Equipped creature gets +1/+1 for each other creature you control that shares a creature type with it.$Equip {2}| Cinder Barrens|Oath of the Gatewatch|168|U||Land|||Cinder Barrens enters the battlefield tapped.${T}: Add {B} or {R} to your mana pool.|