diff --git a/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java new file mode 100644 index 0000000000..bfe50914d2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.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.commander; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +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; + +/** + * + * @author fireshoes + */ +public class AvatarOfSlaughter extends CardImpl { + + public AvatarOfSlaughter(UUID ownerId) { + super(ownerId, 111, "Avatar of Slaughter", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{R}{R}"); + this.expansionSetCode = "CMD"; + this.subtype.add("Avatar"); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // All creatures have double strike and attack each turn if able. + Effect effect = new GainAbilityAllEffect(DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield); + effect.setText("All creatures have double strike"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures")); + effect.setText("and attack each turn if able"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public AvatarOfSlaughter(final AvatarOfSlaughter card) { + super(card); + } + + @Override + public AvatarOfSlaughter copy() { + return new AvatarOfSlaughter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java b/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java index 0af8c57cf1..9b30e45ef2 100644 --- a/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java +++ b/Mage.Sets/src/mage/sets/conspiracy/ExtractFromDarkness.java @@ -29,14 +29,10 @@ package mage.sets.conspiracy; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; -import mage.abilities.keyword.HasteAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; @@ -45,7 +41,6 @@ import mage.game.Game; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCardInGraveyard; -import mage.target.targetpointer.FixedTarget; /** * @@ -126,13 +121,7 @@ class ExtractFromDarknessReturnFromGraveyardToBattlefieldEffect extends OneShotE if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && player.chooseTarget(outcome, target, source, game)) { Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - if (card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), source.getControllerId())) { - ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); - } - } + player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId()); } return true; } diff --git a/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java b/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java index 195d592eae..71a562bab0 100644 --- a/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java +++ b/Mage.Sets/src/mage/sets/conspiracy/MuzzioVisionaryArchitect.java @@ -43,7 +43,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.FilterCard; import mage.filter.common.FilterArtifactCard; import mage.filter.common.FilterArtifactPermanent; import mage.game.Game; @@ -139,21 +138,7 @@ class MuzzioVisionaryArchitectEffect extends OneShotEffect { } } - - TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { - player.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } + player.putCardsOnBottomOfLibrary(cards, game, source, true); return true; } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java b/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java index 0f293697d6..17e16b89c3 100644 --- a/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java +++ b/Mage.Sets/src/mage/sets/invasion/FirebrandRanger.java @@ -41,12 +41,10 @@ import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.common.FilterLandCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SupertypePredicate; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInHand; @@ -82,7 +80,7 @@ public class FirebrandRanger extends CardImpl { class PutLandOnBattlefieldEffect extends OneShotEffect { - private static final FilterCard filter = new FilterCard("card other than a basic land card"); + private static final FilterCard filter = new FilterCard("basic land card"); static { filter.add(Predicates.and(new CardTypePredicate(CardType.LAND), new SupertypePredicate("Basic"))); @@ -116,10 +114,7 @@ class PutLandOnBattlefieldEffect extends OneShotEffect { Card card = game.getCard(target.getFirstTarget()); if (card != null) { card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - Permanent permanent = game.getPermanent(card.getId()); - if (permanent != null) { - permanent.setTapped(true); - } + return true; } } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java b/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java index 4fc4e9d651..c0da2b6ed2 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/NessianGameWarden.java @@ -1,151 +1,136 @@ -/* - * 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.journeyintonyx; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.OneShotEffect; -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.filter.FilterCard; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.TargetCard; - -/** - * - * @author LevelX2 - */ -public class NessianGameWarden extends CardImpl { - - public NessianGameWarden(UUID ownerId) { - super(ownerId, 132, "Nessian Game Warden", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); - this.expansionSetCode = "JOU"; - this.subtype.add("Beast"); - - this.power = new MageInt(4); - this.toughness = new MageInt(5); - - // When Nessian Game Warden enters the battlefield, look at the top X cards of your library, where X is the number of forests you control. 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. - this.addAbility(new EntersBattlefieldTriggeredAbility(new NessianGameWardenEffect(), false)); - } - - public NessianGameWarden(final NessianGameWarden card) { - super(card); - } - - @Override - public NessianGameWarden copy() { - return new NessianGameWarden(this); - } -} - -class NessianGameWardenEffect extends OneShotEffect { - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("forests you control"); - - static { - filter.add(new SubtypePredicate("Forest")); - } - - public NessianGameWardenEffect() { - super(Outcome.DrawCard); - this.staticText = "look at the top X cards of your library, where X is the number of forests you control. 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"; - } - - public NessianGameWardenEffect(final NessianGameWardenEffect effect) { - super(effect); - } - - @Override - public NessianGameWardenEffect copy() { - return new NessianGameWardenEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (player == null || sourcePermanent == null) { - return false; - } - - Cards cards = new CardsImpl(); - int count = new PermanentsOnBattlefieldCount(filter).calculate(game, source, this); - count = Math.min(player.getLibrary().size(), count); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); - if (card != null) { - cards.add(card); - } - } - player.lookAtCards(sourcePermanent.getName(), cards, game); - - if (!cards.isEmpty()) { - TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to put into your hand")); - if (target.canChoose(source.getSourceId(), player.getId(), game) && player.choose(Outcome.DrawCard, cards, target, game)) { - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - player.revealCards(sourcePermanent.getName(), new CardsImpl(card), game); - cards.remove(card); - player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); - } - } - } - - - TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library")); - while (player.isInGame() && cards.size() > 1) { - player.choose(Outcome.Neutral, cards, target, game); - Card card = cards.get(target.getFirstTarget(), game); - if (card != null) { - cards.remove(card); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - target.clearChosen(); - } - if (cards.size() == 1) { - Card card = cards.get(cards.iterator().next(), game); - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false); - } - return true; - } -} +/* + * 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.journeyintonyx; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.OneShotEffect; +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.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author LevelX2 + */ +public class NessianGameWarden extends CardImpl { + + public NessianGameWarden(UUID ownerId) { + super(ownerId, 132, "Nessian Game Warden", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + this.expansionSetCode = "JOU"; + this.subtype.add("Beast"); + + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // When Nessian Game Warden enters the battlefield, look at the top X cards of your library, where X is the number of forests you control. 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. + this.addAbility(new EntersBattlefieldTriggeredAbility(new NessianGameWardenEffect(), false)); + } + + public NessianGameWarden(final NessianGameWarden card) { + super(card); + } + + @Override + public NessianGameWarden copy() { + return new NessianGameWarden(this); + } +} + +class NessianGameWardenEffect extends OneShotEffect { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("forests you control"); + + static { + filter.add(new SubtypePredicate("Forest")); + } + + public NessianGameWardenEffect() { + super(Outcome.DrawCard); + this.staticText = "look at the top X cards of your library, where X is the number of forests you control. 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"; + } + + public NessianGameWardenEffect(final NessianGameWardenEffect effect) { + super(effect); + } + + @Override + public NessianGameWardenEffect copy() { + return new NessianGameWardenEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (player == null || sourcePermanent == null) { + return false; + } + + Cards cards = new CardsImpl(); + int count = new PermanentsOnBattlefieldCount(filter).calculate(game, source, this); + count = Math.min(player.getLibrary().size(), count); + for (int i = 0; i < count; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + cards.add(card); + } + } + player.lookAtCards(sourcePermanent.getName(), cards, game); + + if (!cards.isEmpty()) { + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCreatureCard("creature card to put into your hand")); + if (target.canChoose(source.getSourceId(), player.getId(), game) && player.choose(Outcome.DrawCard, cards, target, game)) { + Card card = cards.get(target.getFirstTarget(), game); + if (card != null) { + player.revealCards(sourcePermanent.getName(), new CardsImpl(card), game); + cards.remove(card); + player.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.LIBRARY); + } + } + } + + player.putCardsOnBottomOfLibrary(cards, game, source, true); + return true; + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 2a635f134a..1b5eb9831c 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -11088,7 +11088,7 @@ Faerie Noble|Masters Edition III|117|U|{2}{G}|Creature - Faerie|1|2|Flying$Other Fire Sprites|Masters Edition III|118|C|{1}{G}|Creature - Faerie|1|1|Flying${G}, {tap}: Add {R} to your mana pool.| Freyalise's Winds|Masters Edition III|119|R|{2}{G}{G}|Enchantment|||Whenever a permanent becomes tapped, put a wind counter on it.$If a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead.| Guan Yu, Sainted Warrior|Masters Edition III|12|U|{3}{W}{W}|Legendary Creature - Human Soldier Warrior|3|5|Horsemanship (This creature can't be blocked except by creatures with horsemanship.)$When Guan Yu, Sainted Warrior is put into your graveyard from the battlefield, you may shuffle Guan Yu into your library.| -Gaea's Touch|Masters Edition III|120|U|{G}{G}|Enchantment|||You may play an additional land during your turn if that land is a basic Forest.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| +Gaea's Touch|Masters Edition III|120|U|{G}{G}|Enchantment|||You may put a basic Forest card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery and only once each turn.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| Giant Growth|Masters Edition III|121|C|{G}|Instant|||Target creature gets +3/+3 until end of turn.| Heavy Fog|Masters Edition III|122|C|{1}{G}|Instant|||Cast Heavy Fog only during the declare attackers step and only if you've been attacked this step.$Prevent all damage that would be dealt to you this turn by attacking creatures.| Hua Tuo, Honored Physician|Masters Edition III|123|R|{1}{G}{G}|Legendary Creature - Human|1|2|{tap}: Put target creature card from your graveyard on top of your library. Activate this ability only during your turn, before attackers are declared.| @@ -19206,7 +19206,7 @@ Riptide|The Dark|38|C|{U}|Instant|||Tap all blue creatures.| Carnivorous Plant|The Dark|38|C|{3}{G}|Creature - Plant Wall|4|5|Defender| Elves of Deep Shadow|The Dark|39|U|{G}|Creature - Elf Druid|1|1|{tap}: Add {B} to your mana pool. Elves of Deep Shadow deals 1 damage to you.| Bog Rats|The Dark|4|C|{B}|Creature - Rat|1|1|Bog Rats can't be blocked by Walls.| -Gaea's Touch|The Dark|40|C|{G}{G}|Enchantment|||You may play an additional land during your turn if that land is a basic Forest.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| +Gaea's Touch|The Dark|40|C|{G}{G}|Enchantment|||You may put a basic Forest card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery and only once each turn.$Sacrifice Gaea's Touch: Add {G}{G} to your mana pool.| Hidden Path|The Dark|41|R|{2}{G}{G}{G}{G}|Enchantment|||Green creatures have forestwalk.| Land Leeches|The Dark|42|C|{1}{G}{G}|Creature - Leech|2|2|First strike| Marsh Viper|The Dark|44|C|{3}{G}|Creature - Snake|1|2|Whenever Marsh Viper deals damage to a player, that player gets two poison counters. (A player with ten or more poison counters loses the game.)|