From 418b7b1e8e0f6487f8f0a94c1c8eb13e2e2f019c Mon Sep 17 00:00:00 2001 From: fireshoes Date: Thu, 17 Mar 2016 16:26:41 -0500 Subject: [PATCH] [SOI] Updated additional 3/17 spoilers. Added some more cards. --- .../BearerOfOverwhelmingTruths.java | 72 ++++++ .../shadowsoverinnistrad/DaringSleuth.java | 105 +++++++++ .../DeathcapCultivator.java | 77 +++++++ .../DiregrafColossus.java | 125 ++++++++++ .../shadowsoverinnistrad/DrownyardTemple.java | 65 ++++++ .../shadowsoverinnistrad/JacesScrutiny.java | 65 ++++++ .../OngoingInvestigation.java | 138 +++++++++++ .../OrmendahlProfanePrince.java | 76 ++++++ .../SilverfurPartisan.java | 124 ++++++++++ .../SorinGrimNemesis.java | 218 ++++++++++++++++++ .../shadowsoverinnistrad/TamiyosJournal.java | 4 +- .../shadowsoverinnistrad/TrailOfEvidence.java | 70 ++++++ .../TraverseTheUlvenwald.java | 83 +++++++ .../VesselOfVolatility.java | 66 ++++++ .../shadowsoverinnistrad/WestvaleAbbey.java | 103 +++++++++ .../effects/keyword/InvestigateEffect.java | 1 + Utils/mtg-cards-data.txt | 10 +- 17 files changed, 1399 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/BearerOfOverwhelmingTruths.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/DeathcapCultivator.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/DiregrafColossus.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/DrownyardTemple.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/JacesScrutiny.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/OngoingInvestigation.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/OrmendahlProfanePrince.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/SorinGrimNemesis.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/TrailOfEvidence.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/TraverseTheUlvenwald.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfVolatility.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/WestvaleAbbey.java diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BearerOfOverwhelmingTruths.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BearerOfOverwhelmingTruths.java new file mode 100644 index 00000000000..144b5c6c434 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BearerOfOverwhelmingTruths.java @@ -0,0 +1,72 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.abilities.keyword.ProwessAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class BearerOfOverwhelmingTruths extends CardImpl { + + public BearerOfOverwhelmingTruths(UUID ownerId) { + super(ownerId, 54, "Bearer of Overwhelming Truths", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, ""); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + this.color.setBlue(true); + + // this card is the second face of double-faced card + this.nightCard = true; + + // Prowess + this.addAbility(new ProwessAbility()); + + // Whenever Bearer of Overwhelming Truths deals combat damage to a player, investigate. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new InvestigateEffect(), false)); + } + + public BearerOfOverwhelmingTruths(final BearerOfOverwhelmingTruths card) { + super(card); + } + + @Override + public BearerOfOverwhelmingTruths copy() { + return new BearerOfOverwhelmingTruths(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java new file mode 100644 index 00000000000..f87e984175e --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java @@ -0,0 +1,105 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author fireshoes + */ +public class DaringSleuth extends CardImpl { + + public DaringSleuth(UUID ownerId) { + super(ownerId, 54, "Daring Sleuth", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + this.canTransform = true; + this.secondSideCard = new BearerOfOverwhelmingTruths(ownerId); + + // When you sacrifice a Clue, transform Daring Sleuth. + this.addAbility(new TransformAbility()); + this.addAbility(new DaringSleuthTriggeredAbility()); + } + + public DaringSleuth(final DaringSleuth card) { + super(card); + } + + @Override + public DaringSleuth copy() { + return new DaringSleuth(this); + } +} + +class DaringSleuthTriggeredAbility extends TriggeredAbilityImpl { + + public DaringSleuthTriggeredAbility() { + super(Zone.BATTLEFIELD, new TransformSourceEffect(true)); + } + + public DaringSleuthTriggeredAbility(final DaringSleuthTriggeredAbility ability) { + super(ability); + } + + @Override + public DaringSleuthTriggeredAbility copy() { + return new DaringSleuthTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.SACRIFICED_PERMANENT; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getPlayerId().equals(this.getControllerId()) + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype().contains("Clue"); + } + + @Override + public String getRule() { + return "When you sacrifice a Clue, " + super.getRule(); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DeathcapCultivator.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DeathcapCultivator.java new file mode 100644 index 00000000000..ceaff0f3286 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DeathcapCultivator.java @@ -0,0 +1,77 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.mana.BlackManaAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class DeathcapCultivator extends CardImpl { + + public DeathcapCultivator(UUID ownerId) { + super(ownerId, 202, "Deathcap Cultivator", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Druid"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // {T}: Add {B} or {G} to your mana pool. + this.addAbility(new BlackManaAbility()); + this.addAbility(new GreenManaAbility()); + + // Delirium — Deathcap Cultivator has deathtouch as long as there are four or more card types among cards in your graveyard. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new ConditionalContinuousEffect(new GainAbilitySourceEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield), + new DeliriumCondition(), "Delirium — {this} has deathtouch as long as there are four or more card types among cards in your graveyard"))); + } + + public DeathcapCultivator(final DeathcapCultivator card) { + super(card); + } + + @Override + public DeathcapCultivator copy() { + return new DeathcapCultivator(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DiregrafColossus.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DiregrafColossus.java new file mode 100644 index 00000000000..f9fa8b4338b --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DiregrafColossus.java @@ -0,0 +1,125 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.filter.FilterSpell; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.ZombieToken; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class DiregrafColossus extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a Zombie spell"); + + static { + filter.add(new SubtypePredicate("Zombie")); + } + + public DiregrafColossus(UUID ownerId) { + super(ownerId, 107, "Diregraf Colossus", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Zombie"); + this.subtype.add("Giant"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Diregraf Colossus enters the battlefield with a +1/+1 counter on it for each Zombie card in your graveyard. + this.addAbility(new EntersBattlefieldAbility(new DiregrafColossusEffect(), "with a +1/+1 counter on it for each Zombie card in your graveyard")); + + // Whenever you cast a Zombie spell, put a 2/2 black Zombie creature token onto the battlefield tapped. + this.addAbility(new SpellCastControllerTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1, true, false), filter, false)); + + } + + public DiregrafColossus(final DiregrafColossus card) { + super(card); + } + + @Override + public DiregrafColossus copy() { + return new DiregrafColossus(this); + } +} + +class DiregrafColossusEffect extends OneShotEffect { + + private static final FilterCreatureCard filter = new FilterCreatureCard(); + + static { + filter.add(new SubtypePredicate("Zombie")); + } + + public DiregrafColossusEffect() { + super(Outcome.BoostCreature); + staticText = "{this} enters the battlefield with a +1/+1 counter on it for each Zombie card in your graveyard"; + } + + public DiregrafColossusEffect(final DiregrafColossusEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanentEntering(source.getSourceId()); + if (permanent != null && player != null) { + int amount = 0; + amount += player.getGraveyard().count(filter, game); + if (amount > 0) { + permanent.addCounters(CounterType.P1P1.createInstance(amount), game); + } + return true; + } + return false; + } + + @Override + public DiregrafColossusEffect copy() { + return new DiregrafColossusEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DrownyardTemple.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DrownyardTemple.java new file mode 100644 index 00000000000..33ed6106a2d --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DrownyardTemple.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class DrownyardTemple extends CardImpl { + + public DrownyardTemple(UUID ownerId) { + super(ownerId, 271, "Drownyard Temple", Rarity.RARE, new CardType[]{CardType.LAND}, ""); + this.expansionSetCode = "SOI"; + + // {T}: Add {C} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {3}: Return Drownyard Temple from your graveyard to the battlefield tapped. + this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(true), new GenericManaCost(3))); + } + + public DrownyardTemple(final DrownyardTemple card) { + super(card); + } + + @Override + public DrownyardTemple copy() { + return new DrownyardTemple(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/JacesScrutiny.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/JacesScrutiny.java new file mode 100644 index 00000000000..9522110db92 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/JacesScrutiny.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class JacesScrutiny extends CardImpl { + + public JacesScrutiny(UUID ownerId) { + super(ownerId, 70, "Jace's Scrutiny", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "SOI"; + + // Target creature gets -4/-0 until end of turn. + getSpellAbility().addEffect(new BoostTargetEffect(-4, -0, Duration.EndOfTurn)); + getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Investigate + getSpellAbility().addEffect(new InvestigateEffect()); + } + + public JacesScrutiny(final JacesScrutiny card) { + super(card); + } + + @Override + public JacesScrutiny copy() { + return new JacesScrutiny(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/OngoingInvestigation.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/OngoingInvestigation.java new file mode 100644 index 00000000000..6868c903295 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/OngoingInvestigation.java @@ -0,0 +1,138 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.events.DamagedPlayerEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author fireshoes + */ +public class OngoingInvestigation extends CardImpl { + + public OngoingInvestigation(UUID ownerId) { + super(ownerId, 77, "Ongoing Investigation", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "SOI"; + + // Whenever one or more creatures you control deal combat damage to a player, investigate. + this.addAbility(new OngoingInvestigationTriggeredAbility()); + + // {1}{G}, Exile a creature card from your graveyard: Investigate. You gain 2 life. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new InvestigateEffect(), new ManaCostsImpl("{1}{G}")); + ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(new FilterCreatureCard("a creature card from your graveyard")))); + ability.addEffect(new GainLifeEffect(2)); + this.addAbility(ability); + } + + public OngoingInvestigation(final OngoingInvestigation card) { + super(card); + } + + @Override + public OngoingInvestigation copy() { + return new OngoingInvestigation(this); + } +} + +class OngoingInvestigationTriggeredAbility extends TriggeredAbilityImpl { + + private boolean madeDamage = false; + private Set damagedPlayers = new HashSet(); + + public OngoingInvestigationTriggeredAbility() { + super(Zone.BATTLEFIELD, new InvestigateEffect(), false); + } + + public OngoingInvestigationTriggeredAbility(final OngoingInvestigationTriggeredAbility ability) { + super(ability); + this.madeDamage = ability.madeDamage; + this.damagedPlayers = new HashSet(); + this.damagedPlayers.addAll(ability.damagedPlayers); + } + + @Override + public OngoingInvestigationTriggeredAbility copy() { + return new OngoingInvestigationTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGED_PLAYER || event.getType() == EventType.COMBAT_DAMAGE_STEP_POST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == EventType.DAMAGED_PLAYER) { + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; + Permanent p = game.getPermanent(event.getSourceId()); + if (damageEvent.isCombatDamage() && p != null && p.getControllerId().equals(this.getControllerId())) { + madeDamage = true; + damagedPlayers.add(event.getPlayerId()); + } + } + if (event.getType().equals(EventType.COMBAT_DAMAGE_STEP_POST)) { + if (madeDamage) { + Set damagedPlayersCopy = new HashSet(); + damagedPlayersCopy.addAll(damagedPlayers); + for(Effect effect: this.getEffects()) { + effect.setValue("damagedPlayers", damagedPlayersCopy); + } + damagedPlayers.clear(); + madeDamage = false; + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever one or more creatures you control deal combat damage to a player, " + super.getRule(); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/OrmendahlProfanePrince.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/OrmendahlProfanePrince.java new file mode 100644 index 00000000000..4fbb8c0321a --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/OrmendahlProfanePrince.java @@ -0,0 +1,76 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author fireshoes + */ +public class OrmendahlProfanePrince extends CardImpl { + + public OrmendahlProfanePrince(UUID ownerId) { + super(ownerId, 281, "Ormendahl, Profane Prince", Rarity.RARE, new CardType[]{CardType.CREATURE}, ""); + this.expansionSetCode = "SOI"; + this.supertype.add("Legendary"); + this.subtype.add("Demon"); + this.power = new MageInt(9); + this.toughness = new MageInt(7); + this.color.setBlack(true); + + // this card is the second face of double-faced card + this.nightCard = true; + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + // Indestructible + this.addAbility(IndestructibleAbility.getInstance()); + // Haste + this.addAbility(HasteAbility.getInstance()); + } + + public OrmendahlProfanePrince(final OrmendahlProfanePrince card) { + super(card); + } + + @Override + public OrmendahlProfanePrince copy() { + return new OrmendahlProfanePrince(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java new file mode 100644 index 00000000000..c5330e0b32d --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java @@ -0,0 +1,124 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.WolfToken; +import mage.game.stack.Spell; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class SilverfurPartisan extends CardImpl { + + public SilverfurPartisan(UUID ownerId) { + super(ownerId, 226, "Silverfur Partisan", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Wolf"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Whenever a Wolf or Werewolf you control becomes the target of an instant or sorcery spell, put a 2/2 green Wolf creature token onto the battlefield. + this.addAbility(new CreaturesYouControlBecomesTargetTriggeredAbility(new CreateTokenEffect(new WolfToken()))); + } + + public SilverfurPartisan(final SilverfurPartisan card) { + super(card); + } + + @Override + public SilverfurPartisan copy() { + return new SilverfurPartisan(this); + } +} + +class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityImpl { + + public CreaturesYouControlBecomesTargetTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect); + } + + public CreaturesYouControlBecomesTargetTriggeredAbility(final CreaturesYouControlBecomesTargetTriggeredAbility ability) { + super(ability); + } + + @Override + public CreaturesYouControlBecomesTargetTriggeredAbility copy() { + return new CreaturesYouControlBecomesTargetTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TARGETED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null && permanent.getControllerId().equals(this.controllerId) && (permanent.getSubtype().contains("Wolf") || permanent.getSubtype().contains("Werewolf"))) { + MageObject object = game.getObject(event.getSourceId()); + if (object != null && object instanceof Spell) { + Card c = (Spell) object; + if (c.getCardType().contains(CardType.INSTANT) || c.getCardType().contains(CardType.SORCERY)) { + if (getTargets().size() == 0) { + for (Effect effect : getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getTargetId())); + } + } + return true; + } + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a Wolf or Werewolf you control becomes the target of an instant or sorcery spell, put a 2/2 green Wolf creature token onto the battlefield."; + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SorinGrimNemesis.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SorinGrimNemesis.java new file mode 100644 index 00000000000..5dcf9c09972 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SorinGrimNemesis.java @@ -0,0 +1,218 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.PayVariableLoyaltyCost; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.token.Token; +import mage.players.Player; +import mage.players.PlayerList; +import mage.target.common.TargetCreatureOrPlaneswalker; + +/** + * + * @author fireshoes + */ +public class SorinGrimNemesis extends CardImpl { + + public SorinGrimNemesis(UUID ownerId) { + super(ownerId, 251, "Sorin, Grim Nemesis", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{4}{W}{B}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Sorin"); + + this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); + + // +1: Reveal the top card of your library and put that card into your hand. Each opponent loses life equal to its converted mana cost. + this.addAbility(new LoyaltyAbility(new SorinGrimNemesisRevealEffect(), 1)); + + // -X: Sorin, Grim Nemesis deals X damage to target creature or planeswalker and you gain X life. + Ability ability = new LoyaltyAbility(new DamageTargetEffect(SorinXValue.getDefault())); + ability.addTarget(new TargetCreatureOrPlaneswalker()); + ability.addEffect(new GainLifeEffect(SorinXValue.getDefault())); + this.addAbility(ability); + + // -9: Put a number of 1/1 black Vampire Knight creature tokens with lifelink onto the battlefield equal to the highest life total among all players. + this.addAbility(new LoyaltyAbility(new SorinTokenEffect(), -9)); + } + + public SorinGrimNemesis(final SorinGrimNemesis card) { + super(card); + } + + @Override + public SorinGrimNemesis copy() { + return new SorinGrimNemesis(this); + } +} + +class SorinGrimNemesisRevealEffect extends OneShotEffect { + + public SorinGrimNemesisRevealEffect() { + super(Outcome.DrawCard); + this.staticText = "reveal the top card of your library and put that card into your hand. Each opponent loses life equal to that card's converted mana cost"; + } + + public SorinGrimNemesisRevealEffect(final SorinGrimNemesisRevealEffect effect) { + super(effect); + } + + @Override + public SorinGrimNemesisRevealEffect copy() { + return new SorinGrimNemesisRevealEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + + if (player.getLibrary().size() > 0) { + Card card = player.getLibrary().getFromTop(game); + Cards cards = new CardsImpl(); + cards.add(card); + player.revealCards("Sorin, Grim Nemesis", cards, game); + + if (card != null && + card.moveToZone(Zone.HAND, source.getSourceId(), game, false)) { + for (UUID playerId : game.getOpponents(source.getControllerId())) { + if (card.getManaCost().convertedManaCost() > 0) { + Player opponent = game.getPlayer(playerId); + if (opponent != null) { + opponent.loseLife(card.getManaCost().convertedManaCost(), game); + } + } + } + return true; + } + } + return false; + } +} + +class SorinXValue implements DynamicValue { + + private static final SorinXValue defaultValue = new SorinXValue(); + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + for (Cost cost : sourceAbility.getCosts()) { + if (cost instanceof PayVariableLoyaltyCost) { + return ((PayVariableLoyaltyCost) cost).getAmount(); + } + } + return 0; + } + + @Override + public DynamicValue copy() { + return defaultValue; + } + + @Override + public String getMessage() { + return ""; + } + + @Override + public String toString() { + return "X"; + } + + public static SorinXValue getDefault() { + return defaultValue; + } +} + +class SorinTokenEffect extends OneShotEffect { + SorinTokenEffect() { + super(Outcome.GainLife); + staticText = "Put a number of 1/1 black Vampire Knight creature tokens with lifelink onto the battlefield equal to the highest life total among all players"; + } + + SorinTokenEffect(final SorinTokenEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + int maxLife = 0; + PlayerList playerList = game.getState().getPlayersInRange(source.getControllerId(), game); + for (UUID pid : playerList) { + Player p = game.getPlayer(pid); + if (p != null) { + if (maxLife < p.getLife()) { + maxLife = p.getLife(); + } + } + } + new CreateTokenEffect(new VampireKnightToken(), maxLife).apply(game, source); + return true; + } + + @Override + public SorinTokenEffect copy() { + return new SorinTokenEffect(this); + } +} + +class VampireKnightToken extends Token { + + public VampireKnightToken() { + super("Vampire Knight", "1/1 black Vampire Knight creature token with lifelink"); + cardType.add(CardType.CREATURE); + subtype.add("Vampire"); + subtype.add("Knight"); + color.setBlack(true); + power = new MageInt(1); + toughness = new MageInt(1); + addAbility(LifelinkAbility.getInstance()); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TamiyosJournal.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TamiyosJournal.java index 1b2b8562913..6f048f5815e 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TamiyosJournal.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TamiyosJournal.java @@ -41,7 +41,7 @@ import mage.constants.Rarity; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetControlledPermanent; @@ -54,7 +54,7 @@ public class TamiyosJournal extends CardImpl { private static final FilterControlledPermanent filter = new FilterControlledPermanent("three Clues"); static { - filter.add(new NamePredicate("Clue")); + filter.add(new SubtypePredicate("Clue")); } public TamiyosJournal(UUID ownerId) { diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TrailOfEvidence.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TrailOfEvidence.java new file mode 100644 index 00000000000..d7357eb0963 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TrailOfEvidence.java @@ -0,0 +1,70 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author fireshoes + */ +public class TrailOfEvidence extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("an instant or sorcery spell"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.SORCERY))); + } + + public TrailOfEvidence(UUID ownerId) { + super(ownerId, 93, "Trail of Evidence", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + this.expansionSetCode = "SOI"; + + // Whenever you cast an instant or sorcery spell, investigate. + this.addAbility(new SpellCastControllerTriggeredAbility(new InvestigateEffect(), filter, false)); + } + + public TrailOfEvidence(final TrailOfEvidence card) { + super(card); + } + + @Override + public TrailOfEvidence copy() { + return new TrailOfEvidence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TraverseTheUlvenwald.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TraverseTheUlvenwald.java new file mode 100644 index 00000000000..ecb6973b5b4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TraverseTheUlvenwald.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.condition.InvertCondition; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.common.FilterBasicLandCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author fireshoes + */ +public class TraverseTheUlvenwald extends CardImpl { + + private static final FilterCard filter = new FilterCard("a creature or land card"); + + static { + filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND))); + } + + public TraverseTheUlvenwald(UUID ownerId) { + super(ownerId, 234, "Traverse the Ulvenwald", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{G}"); + this.expansionSetCode = "SOI"; + + // Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(1, 1, new FilterBasicLandCard()), true), + new InvertCondition(DeliriumCondition.getInstance()), + "Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.")); + + // Delirium — If there are four or more card types among cards in your graveyard, instead search your library + // for a creature or land card, reveal it, put it into your hand, then shuffle your library. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(1, 1, filter), true), + DeliriumCondition.getInstance(), + "
Delirium — If there are four or more card types among cards in your graveyard, instead search your library for a creature or land card, " + + "reveal it, put it into your hand, then shuffle your library.")); + } + + public TraverseTheUlvenwald(final TraverseTheUlvenwald card) { + super(card); + } + + @Override + public TraverseTheUlvenwald copy() { + return new TraverseTheUlvenwald(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfVolatility.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfVolatility.java new file mode 100644 index 00000000000..4fc7e2c3417 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfVolatility.java @@ -0,0 +1,66 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.BasicManaEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class VesselOfVolatility extends CardImpl { + + public VesselOfVolatility(UUID ownerId) { + super(ownerId, 189, "Vessel of Volatility", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "SOI"; + + // {1}{R}, Sacrifice Vessel of Volatility: Add {R}{R}{R}{R} to your mana pool. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BasicManaEffect(Mana.RedMana(4)), new ManaCostsImpl("{1}{R}")); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public VesselOfVolatility(final VesselOfVolatility card) { + super(card); + } + + @Override + public VesselOfVolatility copy() { + return new VesselOfVolatility(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/WestvaleAbbey.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/WestvaleAbbey.java new file mode 100644 index 00000000000..e788d3b00e3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/WestvaleAbbey.java @@ -0,0 +1,103 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.UntapSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.permanent.token.Token; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author fireshoes + */ +public class WestvaleAbbey extends CardImpl { + + public WestvaleAbbey(UUID ownerId) { + super(ownerId, 281, "Westvale Abbey", Rarity.RARE, new CardType[]{CardType.LAND}, ""); + this.expansionSetCode = "SOI"; + + this.canTransform = true; + this.secondSideCard = new OrmendahlProfanePrince(ownerId); + + // {T}: Add {C} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {5}, {T}, Pay 1 life: Put a 1/1 white and black Human Cleric creature token onto the battlefield. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new HumanClericToken()), new GenericManaCost(5)); + ability.addCost(new TapSourceCost()); + ability.addCost(new PayLifeCost(1)); + this.addAbility(ability); + + // {5}, {T}, Sacrifice five creatures: Transform Westvale Abbey and untap it. + this.addAbility(new TransformAbility()); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), new GenericManaCost(5)); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(5, 5, new FilterControlledCreaturePermanent("five creatures"), true))); + ability.addEffect(new UntapSourceEffect()); + this.addAbility(ability); + } + + public WestvaleAbbey(final WestvaleAbbey card) { + super(card); + } + + @Override + public WestvaleAbbey copy() { + return new WestvaleAbbey(this); + } +} +class HumanClericToken extends Token { + + public HumanClericToken() { + super("Human Cleric", "1/1 white and black Human Cleric creature token"); + cardType.add(CardType.CREATURE); + subtype.add("Human"); + subtype.add("Cleric"); + color.setWhite(true); + color.setBlack(true); + power = new MageInt(1); + toughness = new MageInt(1); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java index bd29fc58200..b9b4a33b739 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/InvestigateEffect.java @@ -43,6 +43,7 @@ class ClueArtifactToken extends Token { super("Clue", "colorless Clue artifact token onto the battlefield with \"{2}, Sacrifice this artifact: Draw a card.\""); this.setOriginalExpansionSetCode("SOI"); this.cardType.add(CardType.ARTIFACT); + this.subtype.add("Clue"); // {2}, Sacrifice this artifact: Draw a card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index e61d1927ddc..46992f1bdfd 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -56957,15 +56957,19 @@ Topplegeist|Shadows over Innistrad|45|U|{W}|Creature - Spirit|1|1|Flying$When To Aberrant Researcher|Shadows over Innistrad|49a|U|{3}{U}|Creature - Human Insect|3|2|Flying$At the beginning of your upkeep, put the top card of your library into your graveyard. If it's an instant or sorcery card, transform Aberrant Researcher.| Perfected Form|Shadows over Innistrad|49b|U||Creature - Insect Horror|5|4|Flying| Compelling Deterrence|Shadows over Innistrad|52|U|{1}{U}|Instant|||Return target nonland permanent to its owner's hand. Then that player discards a card if you control a Zombie.| +Daring Sleuth|Shadows over Innistrad|54a|U|{1}{U}|Creature - Human Rogue|2|1|When you sacrifice a Clue, transform Daring Sleuth.| +Bearer of Overwhelming Truths|Shadows over Innistrad|54b|U||Creature - Human Wizard|3|2|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Whenever Bearer of Overwhelming Truths deals combat damage to a player, investigate. (Put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")| Epiphany at the Drownyard|Shadows over Innistrad|59|R|{X}{U}|Instant|||Reveal the top X plus one cards of your library and separate them into two pilse. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard.| Furtive Homunculus|Shadows over Innistrad|64|C|{1}{U}|Creature - Homunculus|2|1|Skulk (This creature can't be blocked by creatures with greater power.)| Geralf's Masterpiece|Shadows over Innistrad|65|M|{3}{U}{U}|Creature - Zombie Horror|7|7|Flying$Geralf's Masterpiece gets -1/-1 for each card in your hand.${3}{U}, Discard three cards: Return Geralf's Masterpiece from your graveyard to the battlefield tapped.| Invasive Surgery|Shadows over Innistrad|68|U|{U}|Instant|||Counter target sorcery spell.$Delirium — If there are four or more card types among cards in your graveyard, search the graveyard, hand, and library of that spell's controller for any number of cards with the same name as that spell, exile those cards, then that player shuffles his or her library.| Jace, Unraveler of Secrets|Shadows over Innistrad|69|M|{3}{U}{U}|Planeswalker - Jace|||+1: Scry 1, then draw a card.$-2: Return target creature to its owner's hand.$-8: You get an emblem with "Whenever an opponent casts his or her first spell each turn, counter that spell."| +Jace's Scrutiny|Shadows over Innistrad|70|C|{1}{U}|Instant|||Target creature gets -4/-0 until end of turn.$Investigate (Put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")| Just the Wind|Shadows over Innistrad|71|C|{1}{U}|Instant|||Return target creature to its owner's hand.$Madness {U} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.)| Lamplighter of Selhoff|Shadows over Innistrad|72|C|{4}{U}|Creature - Zombie Horror|3|5|When Lamplighter of Selhoff enters the battlefield, if you control another Zombie, you may draw a card. If you do, discard a card.| Nephalia Moondrakes|Shadows over Innistrad|75|R|{5}{U}{U}|Creature - Drake|5|5|Flying$When Nephalia Moondrakes enters the battlefield, target creature gains flying until end of turn.${4}{U}{U}, Exile Nephalia Moondrakes from your graveyard: Creatures you control gain flying until end of turn.| Niblis of Dusk|Shadows over Innistrad|76|C|{2}{U}|Creature - Spirit|2|1|Flying$Prowess| +Ongoing Investigation|Shadows over Innistrad|77|U|{1}{U}|Enchantment|||Whenever one or more creatures you control deal combat damage to a player, investigate. (Put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")${1}{G}, Exile a creature card from your graveyard: Investigate. You gain 2 life.| Pieces of the Puzzle|Shadows over Innistrad|78|C|{2}{U}|Sorcery|||Reveal the top five cards of your library. Put up to two instant and/or sorcery cards from among them into your hand and the rest into your graveyard.| Pore Over the Pages|Shadows over Innistrad|79|U|{3}{U}{U}|Sorcery|||Draw three cards, untap up to two lands, then discard a card.| Rattlechains|Shadows over Innistrad|81|R|{1}{U}|Creature - Spirit|2|1|Flash$Flying$When Rattlechains enters the battlefield, target spirit gains hexproof until end of turn.$You may cast spirit cards as though they had flash.| @@ -56975,8 +56979,10 @@ Persistent Nightmare|Shadows over Innistrad|88b|M||Creature - Nightmare|1|1|Skul Stitched Mangler|Shadows over Innistrad|89|C|{2}{U}|Creature - Zombie Horror|2|3|Stitched Mangler enters the battlefield tapped.$When Stitched Mangler enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step.| Thing in the Ice|Shadows over Innistrad|92a|R|{1}{U}|Creature - Horror|0|4|Defender$Thing in the Ice enters the battlefield with four ice counters on it.$Whenever you cast an instant or sorcery spell, remove an ice counter from Thing in the Ice. Then if it has no ice counters on it, transform it.| Awoken Horror|Shadows over Innistrad|92b|R||Creature - Kraken Horror|7|8|When this creature transforms into Awoken Horrow, return all non-Horror creatures to their owners' hands.| +Trail of Evidence|Shadows over Innistrad|93|U|{2}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, investigate. (Put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")| Crow of Dark Tidings|Shadows over Innistrad|105|C|{2}{B}|Creature - Zombie Bird|2|2|Flying$When Crow of Dark Tidings enters the battlefield or dies, put the top two cards of your library into your graveyard.| Dead Weight|Shadows over Innistrad|106|C|{B}|Enchantment - Aura|||Enchant creature$Enchanted creature gets -2/-2.| +Diregraf Colossus|Shadows over Innistrad|107|R|{2}{B}|Creature - Zombie Giant|2|2|Diregraf Colossus enters the battlefield with a +1/+1 counter on it for each Zombie card in your graveyard.$Whenever you cast a Zombie spell, put a 2/2 black Zombie creature token onto the battlefield tapped.| Elusive Tormentor|Shadows over Innistrad|108a|R|{2}{B}{B}|Creature - Vampire Wizard|4|4|{1}, Discard a card: Transform Elusive Tormentor.| Insidious Mist|Shadows over Innistrad|108b|R||Creature - Elemental|0|1|Hexproof, indestructible$Insideous Mist can't block and can't be blocked.$Whenever Insideous Mist attacks and isn't blocked, you may pay {2}{B}. If you do, transform it.| Farbog Revenant|Shadows over Innistrad|110|C|{2}{B}|Creature - Spirit|1|3|Skulk (This creature can't be blocked by creature with greater power.)$Lifelink (Damage dealt by this creature also causes you to gain that much life.)| @@ -57012,9 +57018,10 @@ Magmatic Chasm|Shadows over Innistrad|172|C|{1}{R}|Sorcery|||Creatures without f Ravenous Bloodseeker|Shadows over Innistrad|175|U|{1}{R}|Creature - Vampire Berserker|1|3|Discard a card: Ravenous Bloodseeker gets +2/-2 until end of turn.| Sanguinary Mage|Shadows over Innistrad|178|C|{1}{R}|Creature - Vampire Wizard|1|3|Prowess| Structural Distortion|Shadows over Innistrad|185|C|{3}{R}|Sorcery|||Exile target artifact or land. Structural Distortion deals 2 damage to that permanent's controller.| -Vessel of VOlatility|Shadows over Innistrad|189|C|{1}{R}|Enchantment|||{1}{R}, Sacrifice Vessel of Volatility: Add {R}{R}{R}{R} to your mana pool.| +Vessel of Volatility|Shadows over Innistrad|189|C|{1}{R}|Enchantment|||{1}{R}, Sacrifice Vessel of Volatility: Add {R}{R}{R}{R} to your mana pool.| Voldaren Duelist|Shadows over Innistrad|191|C|{3}{R}|Creature - Vampire Warrior|3|2|Haste$When Voldaren Duelist enters the battlefield, target creature can't block this turn.| Wolf of Devil's Breach|Shadows over Innistrad|192|M|{3}{R}{R}|Creature - Elemental Wolf|5|5|Whenever Wolf of Devil's Breach attacks, you may pay {1}{R} and discard a card. If you do, Wolf of Devil's Breach deals damage to target creature or planeswalker equal to the discarded card's converted mana cost.| +Briarbridge Patrol|Shadows over Innistrad|195|U|{3}{G}|Creature - Human Warrior|3|3|Whenever Briarbridge Patrol deals damage to one or more creatures, investigate. (Put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")$At the beginning of each end step, if you sacrificed three or more Clues this turn, you may put a creature card from your hand onto the battlefield.|3:52 PM 3/17/2016 Clip Wings|Shadows over Innistrad|197|C|{1}{G}|Instant|||Each opponent sacrifices a creature with flying.| Deathcap Cultivator|Shadows over Innistrad|202|R|{1}{G}|Creature - Human Druid|2|1|{T}: Add {B} or {G} to your mana pool.$Delirium — Deathcap Cultivator has deathtouch as long as there are four or more card types among cards in your graveyard.| Duskwatch Recruiter|Shadows over Innistrad|203a|U|{1}{G}|Creature - Human Warrior Werewolf|2|2|{2}{G}: Look at the top three cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order.$At the beginning of each upkeep, if no spells were cast last turn, transform Duskwatch Recruiter.| @@ -57026,6 +57033,7 @@ Pack Guardian|Shadows over Innistrad|221|U|{2}{G}{G}|Creature - Wolf Spirit|4|3| Quilled Wolf|Shadows over Innistrad|222|C|{1}{G}|Creature - Wolf|2|2|{5}{G}: Quilled Wolf gets +4/+4 until end of turn.| Sage of Ancient Lore|Shadows over Innistrad|225a|R|{4}{G}|Creature - Human Shaman Werewolf|0|0|Sage of Ancient Lore's power and toughness are each equal to the number of cards in your hand.$When Sage of Ancient Lore enters the battlefield, draw a card.$At the beginning of each upkeep, if no spells were cast last turn, transform Sage of Ancient Lore.| Werewolf of Ancient Hunger|Shadows over Innistrad|225b|R||Creature - Werewolf|0|0|Vigilance, trample$Werewolf of Ancient Hunger's power and toughness are each equal to the total number of cards in all players' hands.$At the beginning of each upkeep, if a player cast two or more spells last turn, transform Werewolf of Ancient Hunger.| +Silverfur Partisan|Shadows over Innistrad|226|R|{2}{G}|Creature - Wolf Warrior|2|2|Trample$Whenever a Wolf or Werewolf you control becomes the target of an instant or sorcery spell, put a 2/2 green Wolf creature token onto the battlefield.| Soul Swallower|Shadows over Innistrad|230|R|{2}{G}{G}|Creature - Wurm|3|3|Trample$Delirium — At the beginning of your upkeep, if there are four or more card types among cards in your graveyard, put three +1/+1 counters on Soul Swallower.| Stoic Builder|Shadows over Innistrad|231|C|{2}{G}|Creature - Human|2|3|When Stoic Builder enters the battlefield, you may return target land card from your graveyard to your hand.| Traverse the Ulvenwald|Shadows over Innistrad|234|R|{G}|Sorcery|||Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.$Delirium — If there are four or more card types among cards in your graveyard, instead search your library for a creature or land card, reveal it, put it into your hand, then shuffle your library.|