From b5bfc158cc773dc6029eee2ba33f2e521fb8edcc Mon Sep 17 00:00:00 2001 From: fireshoes Date: Tue, 22 Mar 2016 22:53:03 -0500 Subject: [PATCH] [SOI] Implemented Always Watching, Howlpack Resurgence, Paranoid Parish-Blade, Confirm Suspicions, Obsessive Skinner, Second Harvest, Behold the Beyond, Gibbering Fiend, Manic Scribe, and Thalia's Lieutenant. --- .../shadowsoverinnistrad/AlwaysWatching.java | 78 ++++++++++++++ .../shadowsoverinnistrad/BeholdTheBeyond.java | 66 ++++++++++++ .../ConfirmSuspicions.java | 71 ++++++++++++ .../shadowsoverinnistrad/FeveredVisions.java | 2 +- .../shadowsoverinnistrad/GibberingFiend.java | 77 +++++++++++++ .../HowlpackResurgence.java | 85 +++++++++++++++ .../shadowsoverinnistrad/ManicScribe.java | 78 ++++++++++++++ .../ObsessiveSkinner.java | 83 ++++++++++++++ .../ParanoidParishBlade.java | 78 ++++++++++++++ .../shadowsoverinnistrad/SecondHarvest.java | 102 ++++++++++++++++++ .../ThaliasLieutenant.java | 80 ++++++++++++++ .../Triskaidekaphobia.java | 2 +- Utils/mtg-cards-data.txt | 3 +- 13 files changed, 802 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/AlwaysWatching.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/BeholdTheBeyond.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/ConfirmSuspicions.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/GibberingFiend.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/HowlpackResurgence.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/ManicScribe.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/ObsessiveSkinner.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/ParanoidParishBlade.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/SecondHarvest.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/ThaliasLieutenant.java diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/AlwaysWatching.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/AlwaysWatching.java new file mode 100644 index 00000000000..95ad1f6dfd5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/AlwaysWatching.java @@ -0,0 +1,78 @@ +/* + * 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.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +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.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TokenPredicate; + +/** + * + * @author fireshoes + */ +public class AlwaysWatching extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creatures you control"); + + static { + filter.add(Predicates.not(new TokenPredicate())); + } + + public AlwaysWatching(UUID ownerId) { + super(ownerId, 1, "Always Watching", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{W}"); + this.expansionSetCode = "SOI"; + + // Nontoken creatures you control get +1/+1 and have vigilance. + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter)); + Effect effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, filter); + effect.setText("and have vigilance"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public AlwaysWatching(final AlwaysWatching card) { + super(card); + } + + @Override + public AlwaysWatching copy() { + return new AlwaysWatching(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BeholdTheBeyond.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BeholdTheBeyond.java new file mode 100644 index 00000000000..c3cb2caccc6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BeholdTheBeyond.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.abilities.effects.Effect; +import mage.abilities.effects.common.discard.DiscardHandControllerEffect; +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.target.common.TargetCardInLibrary; + +/** + * + * @author fireshoes + */ +public class BeholdTheBeyond extends CardImpl { + + public BeholdTheBeyond(UUID ownerId) { + super(ownerId, 101, "Behold the Beyond", Rarity.MYTHIC, new CardType[]{CardType.SORCERY}, "{5}{B}{B}"); + this.expansionSetCode = "SOI"; + + // Discard your hand. Search your library for three cards and put those cards into your hand. Then shuffle your library. + this.getSpellAbility().addEffect(new DiscardHandControllerEffect()); + TargetCardInLibrary target = new TargetCardInLibrary(0, 3, new FilterCard("cards")); + Effect effect = new SearchLibraryPutInHandEffect(target); + effect.setText("Search your library for three cards and put those cards into your hand. Then shuffle your library"); + this.getSpellAbility().addEffect(effect); + } + + public BeholdTheBeyond(final BeholdTheBeyond card) { + super(card); + } + + @Override + public BeholdTheBeyond copy() { + return new BeholdTheBeyond(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ConfirmSuspicions.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ConfirmSuspicions.java new file mode 100644 index 00000000000..58c37b3d19a --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ConfirmSuspicions.java @@ -0,0 +1,71 @@ +/* + * 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.Effect; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.keyword.InvestigateEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class ConfirmSuspicions extends CardImpl { + + public ConfirmSuspicions(UUID ownerId) { + super(ownerId, 53, "Confirm Suspicions", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{U}{U}"); + this.expansionSetCode = "SOI"; + + // Counter target spell. + getSpellAbility().addEffect(new CounterTargetEffect()); + getSpellAbility().addTarget(new TargetSpell()); + + // Investigate three times. + Effect effect = new InvestigateEffect(); + effect.setText("

Investigate three times."); + getSpellAbility().addEffect(effect); + effect = new InvestigateEffect(); + effect.setText(null); + getSpellAbility().addEffect(effect); + getSpellAbility().addEffect(effect); + } + + public ConfirmSuspicions(final ConfirmSuspicions card) { + super(card); + } + + @Override + public ConfirmSuspicions copy() { + return new ConfirmSuspicions(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FeveredVisions.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FeveredVisions.java index 39bf2aa55a1..1e1f862f93f 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FeveredVisions.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FeveredVisions.java @@ -68,7 +68,7 @@ public class FeveredVisions extends CardImpl { class FeveredVisionsEffect extends OneShotEffect { public FeveredVisionsEffect() { - super(Outcome.LoseLife); + super(Outcome.DrawCard); staticText = "that player draws a card. If the player is your opponent and has four or more cards in hand, {this} deals 2 damage to him or her"; } diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/GibberingFiend.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/GibberingFiend.java new file mode 100644 index 00000000000..92eccef55a9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/GibberingFiend.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.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class GibberingFiend extends CardImpl { + + public GibberingFiend(UUID ownerId) { + super(ownerId, 161, "Gibbering Fiend", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Devil"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // When Gibbering Fiend enters the battlefield, it deals 1 damage to each opponent. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(1, TargetController.OPPONENT), false)); + + // Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, + // Gibbering Fiend deals 1 damage to that player. + this.addAbility(new ConditionalTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), TargetController.OPPONENT, false, true), + DeliriumCondition.getInstance(), + "Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, " + + "{this} deals 1 damage to that player.")); + } + + public GibberingFiend(final GibberingFiend card) { + super(card); + } + + @Override + public GibberingFiend copy() { + return new GibberingFiend(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/HowlpackResurgence.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/HowlpackResurgence.java new file mode 100644 index 00000000000..b377f0ec8b2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/HowlpackResurgence.java @@ -0,0 +1,85 @@ +/* + * 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.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class HowlpackResurgence extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control that's a Wolf or a Werewolf"); + + static { + filter.add(Predicates.or(new SubtypePredicate("Wolf"), + new SubtypePredicate("Werewolf"))); + } + + public HowlpackResurgence(UUID ownerId) { + super(ownerId, 211, "Howlpack Resurgence", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + this.expansionSetCode = "SOI"; + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Each creature you control that's a Wolf or a Werewolf gets +1/+1 and has trample. + Effect effect = new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter); + effect.setText("Each creature you control that's Wolf or a Werewolf gets +1/+1"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter); + effect.setText("and has trample"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public HowlpackResurgence(final HowlpackResurgence card) { + super(card); + } + + @Override + public HowlpackResurgence copy() { + return new HowlpackResurgence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ManicScribe.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ManicScribe.java new file mode 100644 index 00000000000..7e3b1f75d34 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ManicScribe.java @@ -0,0 +1,78 @@ +/* + * 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.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveEachPlayerEffect; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ManicScribe extends CardImpl { + + public ManicScribe(UUID ownerId) { + super(ownerId, 73, "Manic Scribe", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // When Manic Scribe enters the battlefield, each opponent puts the top three cards of his or her library into his or her graveyard. + this.addAbility(new EntersBattlefieldTriggeredAbility(new PutTopCardOfLibraryIntoGraveEachPlayerEffect(3, TargetController.OPPONENT), false)); + + // Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, + // that player puts the top three cards of his or her library into his or her graveyard. + this.addAbility(new ConditionalTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new PutTopCardOfLibraryIntoGraveTargetEffect(3), TargetController.OPPONENT, false, true), + DeliriumCondition.getInstance(), + "Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, " + + "that player puts the top three cards of his or her library into his or her graveyard.")); + } + + public ManicScribe(final ManicScribe card) { + super(card); + } + + @Override + public ManicScribe copy() { + return new ManicScribe(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ObsessiveSkinner.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ObsessiveSkinner.java new file mode 100644 index 00000000000..f70499e2044 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ObsessiveSkinner.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.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class ObsessiveSkinner extends CardImpl { + + public ObsessiveSkinner(UUID ownerId) { + super(ownerId, 220, "Obsessive Skinner", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{G}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Obsessive Skinner enters the battlefield, put a +1/+1 counter on target creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, + // put a +1/+1 counter on target creature. + ability = new ConditionalTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), TargetController.OPPONENT, false), + DeliriumCondition.getInstance(), + "Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, " + + "put a +1/+1 counter on target creature."); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public ObsessiveSkinner(final ObsessiveSkinner card) { + super(card); + } + + @Override + public ObsessiveSkinner copy() { + return new ObsessiveSkinner(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ParanoidParishBlade.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ParanoidParishBlade.java new file mode 100644 index 00000000000..be799d2b0ba --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ParanoidParishBlade.java @@ -0,0 +1,78 @@ +/* + * 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.SimpleStaticAbility; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ParanoidParishBlade extends CardImpl { + + public ParanoidParishBlade(UUID ownerId) { + super(ownerId, 33, "Paranoid Parish-Blade", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Delirium — Paranoid Parish-Blade gets +1/+0 and has first strike as long as there are four or more card types among cards in your graveyard. + ConditionalContinuousEffect effect = new ConditionalContinuousEffect(new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield), + DeliriumCondition.getInstance(), "Delirium — {this} gets +1/+0 "); + effect.setText("Delirium — {this} gets +1/+0"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new ConditionalContinuousEffect(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield), + DeliriumCondition.getInstance(), "and has first strike as long as there are four or more card types among cards in your graveyard."); + ability.addEffect(effect); + this.addAbility(ability); + } + + public ParanoidParishBlade(final ParanoidParishBlade card) { + super(card); + } + + @Override + public ParanoidParishBlade copy() { + return new ParanoidParishBlade(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SecondHarvest.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SecondHarvest.java new file mode 100644 index 00000000000..8ee2bb3eb7e --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SecondHarvest.java @@ -0,0 +1,102 @@ +/* + * 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.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutTokenOntoBattlefieldCopyTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class SecondHarvest extends CardImpl { + + public SecondHarvest(UUID ownerId) { + super(ownerId, 227, "Second Harvest", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{G}{G}"); + this.expansionSetCode = "SOI"; + + // For each token you control, put a token onto the battlefield that's a copy of that permanent. + this.getSpellAbility().addEffect(new SecondHarvestEffect()); + } + + public SecondHarvest(final SecondHarvest card) { + super(card); + } + + @Override + public SecondHarvest copy() { + return new SecondHarvest(this); + } +} + +class SecondHarvestEffect extends OneShotEffect { + + public SecondHarvestEffect() { + super(Outcome.Benefit); + this.staticText = "For each token you control, put a token onto the the battlefield that's a copy of that permanent"; + } + + public SecondHarvestEffect(final SecondHarvestEffect effect) { + super(effect); + } + + @Override + public SecondHarvestEffect copy() { + return new SecondHarvestEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + FilterControlledPermanent filter = new FilterControlledPermanent("each token you control"); + filter.add(new TokenPredicate()); + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, controller.getId(), game)) { + if (permanent != null) { + PutTokenOntoBattlefieldCopyTargetEffect effect = new PutTokenOntoBattlefieldCopyTargetEffect(); + effect.setTargetPointer(new FixedTarget(permanent, game)); + effect.apply(game, source); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ThaliasLieutenant.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ThaliasLieutenant.java new file mode 100644 index 00000000000..4b359a0681c --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ThaliasLieutenant.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author fireshoes + */ +public class ThaliasLieutenant extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("each other Human you control"); + + static { + filter.add(new AnotherPredicate()); + filter.add(new SubtypePredicate("Human")); + } + + public ThaliasLieutenant(UUID ownerId) { + super(ownerId, 43, "Thalia's Lieutenant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Thalia's Lieutenant enters the battlefield, put +1/+1 counter on each other Human you control. + this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), false)); + + // Whenever another Human enters the battlefield under you control, put a +1/+1 counter on Thalia's Lieutenant. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter)); + } + + public ThaliasLieutenant(final ThaliasLieutenant card) { + super(card); + } + + @Override + public ThaliasLieutenant copy() { + return new ThaliasLieutenant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Triskaidekaphobia.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Triskaidekaphobia.java index 3dd86a61a0e..b7f9573a027 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Triskaidekaphobia.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Triskaidekaphobia.java @@ -51,7 +51,7 @@ public class Triskaidekaphobia extends CardImpl { super(ownerId, 141, "Triskaidekaphobia", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}"); this.expansionSetCode = "SOI"; - // At the beginning of your upkeep, choose one &mdash Each player with exactly 13 life loses the game, then each player gains 1 life. + // At the beginning of your upkeep, choose one &mdash Each player with exactly 13 life loses the game, then each player gains 1 life. // Each player with exactly 13 life loses the game, then each player loses 1 life. Ability ability = new BeginningOfUpkeepTriggeredAbility(new TriskaidekaphobiaGainLifeEffect(), TargetController.YOU, false); Mode mode = new Mode(); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 4d8bcc64493..5d95e15375e 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -56958,12 +56958,13 @@ Paranoid Parish-Blade|Shadows over Innistrad|33|U|{2}{W}|Creature - Human Soldie Pious Evangel|Shadows over Innistrad|34a|U|{2}{W}|Creature - Human Cleric|2|2|Whenever Pious Evangel or another creature enters the battlefield under your control, you gain 1 life.${2}, {T}, Sacrifice another permanent: Transform Pious Evangel.| Wayward Disciple|Shadows over Innistrad|34b|U||Creature - Human Cleric|2|4|Whenever Wayward Disciple or another creature you control dies, target opponent loses 1 life and you gain 1 life.| Reaper of Flight Moonsilver|Shadows over Innistrad|36|U|{3}{W}{W}|Creature - Angel|3|3|Flying$Delirium — Sacrifice another creature: Reaper of Flight Moonsilver gets +2/+1 until end of turn. Activate this ability only if there are four or more card types among cards in your graveyard.| -Thalia's Lieutenant|Shadows over Innistrad|43|R|{1}{W}|Creature - Human Soldier|1|1|When Thalia's Lieutenant enters the bat +Thalia's Lieutenant|Shadows over Innistrad|43|R|{1}{W}|Creature - Human Soldier|1|1|When Thalia's Lieutenant enters the battlefield, put +1/+1 counter on each other Human you control.$Whenever another Human enters the battlefield under you control, put a +1/+1 counter on Thalia's Lieutenant.| Thraben Inspector|Shadows over Innistrad|44|C|{W}|Creature - Human Soldier|1|2|When Thraben Inspector enters the battlefield, investigate. (Put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")| Topplegeist|Shadows over Innistrad|45|U|{W}|Creature - Spirit|1|1|Flying$When Topplegeist enters the battlefield, tap target creature an opponent controls.$Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, tap target creature that player controls.| 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.| +Confirm Suspicions|Shadows over Innistrad|53|R|{3}{U}{U}|Instant|||Counter target spell.$Investigate three times. (To investigate, put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")| 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.")| Engulf the Shore|Shadows over Innistrad|58|R|{3}{U}|Instant|||Return to their owners' hands all creatures with toughness less than or equal to the number of Islands you control.|