diff --git a/Mage.Sets/src/mage/sets/conflux/NicolBolasPlaneswalker.java b/Mage.Sets/src/mage/sets/conflux/NicolBolasPlaneswalker.java new file mode 100644 index 00000000000..492ea7e4877 --- /dev/null +++ b/Mage.Sets/src/mage/sets/conflux/NicolBolasPlaneswalker.java @@ -0,0 +1,97 @@ +/* + * 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.conflux; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.DiscardTargetEffect; +import mage.abilities.effects.common.SacrificeEffect; +import mage.abilities.effects.common.continious.GainControlTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.target.TargetPermanent; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author North + */ +public class NicolBolasPlaneswalker extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("noncreature permanent"); + + static { + filter.getNotCardType().add(CardType.CREATURE); + filter.setNotCardType(true); + } + + public NicolBolasPlaneswalker(UUID ownerId) { + super(ownerId, 120, "Nicol Bolas, Planeswalker", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{4}{U}{B}{B}{R}"); + this.expansionSetCode = "CON"; + this.subtype.add("Bolas"); + + this.color.setRed(true); + this.color.setBlue(true); + this.color.setBlack(true); + + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(5)), "")); + + // +3: Destroy target noncreature permanent. + LoyaltyAbility ability = new LoyaltyAbility(new DestroyTargetEffect(), 3); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + // -2: Gain control of target creature. + ability = new LoyaltyAbility(new GainControlTargetEffect(Duration.Custom), -2); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + // -9: Nicol Bolas, Planeswalker deals 7 damage to target player. That player discards seven cards, then sacrifices seven permanents. + ability = new LoyaltyAbility(new DamageTargetEffect(7), -9); + ability.addTarget(new TargetPlayer()); + ability.addEffect(new DiscardTargetEffect(7)); + ability.addEffect(new SacrificeEffect(new FilterPermanent(), 7, "then")); + this.addAbility(ability); + } + + public NicolBolasPlaneswalker(final NicolBolasPlaneswalker card) { + super(card); + } + + @Override + public NicolBolasPlaneswalker copy() { + return new NicolBolasPlaneswalker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/BloodTribute.java b/Mage.Sets/src/mage/sets/zendikar/BloodTribute.java new file mode 100644 index 00000000000..56673a045ca --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/BloodTribute.java @@ -0,0 +1,146 @@ +/* + * 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.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.filter.Filter.ComparisonScope; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author North + */ +public class BloodTribute extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Vampire you control"); + + static { + filter.setTapped(false); + filter.setUseTapped(true); + filter.getSubtype().add("Vampire"); + filter.setScopeSubtype(ComparisonScope.Any); + } + + public BloodTribute(UUID ownerId) { + super(ownerId, 81, "Blood Tribute", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{B}{B}"); + this.expansionSetCode = "ZEN"; + + this.color.setBlack(true); + + // Target opponent loses half his or her life, rounded up. + this.getSpellAbility().addTarget(new TargetOpponent()); + this.getSpellAbility().addEffect(new BloodTributeLoseLifeEffect()); + // Kicker - Tap an untapped Vampire you control. + // If Blood Tribute was kicked, you gain life equal to the life lost this way. + KickerAbility ability = new KickerAbility(new BloodTributeGainLifeEffect(), false); + ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true))); + this.addAbility(ability); + } + + public BloodTribute(final BloodTribute card) { + super(card); + } + + @Override + public BloodTribute copy() { + return new BloodTribute(this); + } +} + +class BloodTributeLoseLifeEffect extends OneShotEffect { + + public BloodTributeLoseLifeEffect() { + super(Outcome.Damage); + this.staticText = "Target opponent loses half his or her life, rounded up"; + } + + public BloodTributeLoseLifeEffect(final BloodTributeLoseLifeEffect effect) { + super(effect); + } + + @Override + public BloodTributeLoseLifeEffect copy() { + return new BloodTributeLoseLifeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player != null) { + Integer amount = (int) Math.ceil(player.getLife() / 2f); + if (amount > 0) { + player.loseLife(amount, game); + game.getState().setValue(source.getSourceId().toString() + "_BloodTribute", amount); + return true; + } + } + return false; + } +} + +class BloodTributeGainLifeEffect extends OneShotEffect { + + public BloodTributeGainLifeEffect() { + super(Outcome.GainLife); + this.staticText = "If Blood Tribute was kicked, you gain life equal to the life lost this way"; + } + + public BloodTributeGainLifeEffect(final BloodTributeGainLifeEffect effect) { + super(effect); + } + + @Override + public BloodTributeGainLifeEffect copy() { + return new BloodTributeGainLifeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + Integer amount = (Integer) game.getState().getValue(source.getSourceId().toString() + "_BloodTribute"); + if (amount != null && amount > 0) { + player.gainLife(amount, game); + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/DesecratedEarth.java b/Mage.Sets/src/mage/sets/zendikar/DesecratedEarth.java new file mode 100644 index 00000000000..44c4fbdc824 --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/DesecratedEarth.java @@ -0,0 +1,101 @@ +/* + * 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.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author North + */ +public class DesecratedEarth extends CardImpl { + + public DesecratedEarth(UUID ownerId) { + super(ownerId, 86, "Desecrated Earth", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{4}{B}"); + this.expansionSetCode = "ZEN"; + + this.color.setBlack(true); + + // Destroy target land. Its controller discards a card. + this.getSpellAbility().addTarget(new TargetLandPermanent()); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addEffect(new DesecratedEarthEffect()); + + } + + public DesecratedEarth(final DesecratedEarth card) { + super(card); + } + + @Override + public DesecratedEarth copy() { + return new DesecratedEarth(this); + } +} + +class DesecratedEarthEffect extends OneShotEffect { + + public DesecratedEarthEffect() { + super(Outcome.DrawCard); + this.staticText = "Its controller discards a card"; + } + + public DesecratedEarthEffect(final DesecratedEarthEffect effect) { + super(effect); + } + + @Override + public DesecratedEarthEffect copy() { + return new DesecratedEarthEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) game.getLastKnownInformation(source.getFirstTarget(), Zone.BATTLEFIELD); + if (permanent != null) { + Player player = game.getPlayer(permanent.getControllerId()); + if (player != null) { + player.discard(1, source, game); + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/EmeriaTheSkyRuin.java b/Mage.Sets/src/mage/sets/zendikar/EmeriaTheSkyRuin.java new file mode 100644 index 00000000000..33941c64dd6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/EmeriaTheSkyRuin.java @@ -0,0 +1,110 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.mana.WhiteManaAbility; +import mage.cards.CardImpl; +import mage.filter.Filter.ComparisonScope; +import mage.filter.common.FilterCreatureCard; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author North + */ +public class EmeriaTheSkyRuin extends CardImpl { + + public EmeriaTheSkyRuin(UUID ownerId) { + super(ownerId, 213, "Emeria, the Sky Ruin", Rarity.RARE, new CardType[]{CardType.LAND}, ""); + this.expansionSetCode = "ZEN"; + + // Emeria, the Sky Ruin enters the battlefield tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + // At the beginning of your upkeep, if you control seven or more Plains, you may return target creature card from your graveyard to the battlefield. + this.addAbility(new EmeriaTheSkyRuinTriggeredAbility()); + // {tap}: Add {W} to your mana pool. + this.addAbility(new WhiteManaAbility()); + } + + public EmeriaTheSkyRuin(final EmeriaTheSkyRuin card) { + super(card); + } + + @Override + public EmeriaTheSkyRuin copy() { + return new EmeriaTheSkyRuin(this); + } +} + +class EmeriaTheSkyRuinTriggeredAbility extends TriggeredAbilityImpl { + + static final FilterLandPermanent filter = new FilterLandPermanent("Plains"); + + static { + filter.getSubtype().add("Plains"); + filter.setScopeSubtype(ComparisonScope.Any); + } + + public EmeriaTheSkyRuinTriggeredAbility() { + super(Zone.BATTLEFIELD, new ReturnFromGraveyardToBattlefieldTargetEffect(), true); + this.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); + } + + public EmeriaTheSkyRuinTriggeredAbility(final EmeriaTheSkyRuinTriggeredAbility ability) { + super(ability); + } + + @Override + public EmeriaTheSkyRuinTriggeredAbility copy() { + return new EmeriaTheSkyRuinTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE && event.getPlayerId().equals(this.controllerId) + && game.getBattlefield().count(filter, this.controllerId, game) > 6) { + return true; + } + return false; + } + + @Override + public String getRule() { + return "At the beginning of your upkeep, if you control seven or more Plains, you may return target creature card from your graveyard to the battlefield."; + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/FeastOfBlood.java b/Mage.Sets/src/mage/sets/zendikar/FeastOfBlood.java new file mode 100644 index 00000000000..6c46a97a097 --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/FeastOfBlood.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.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.costs.CostImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.Game; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author North + */ +public class FeastOfBlood extends CardImpl { + + public FeastOfBlood(UUID ownerId) { + super(ownerId, 88, "Feast of Blood", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{1}{B}"); + this.expansionSetCode = "ZEN"; + + this.color.setBlack(true); + + // Cast Feast of Blood only if you control two or more Vampires. + this.getSpellAbility().addCost(new FeastOfBloodCost()); + // Destroy target creature. You gain 4 life. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addEffect(new GainLifeEffect(4)); + } + + public FeastOfBlood(final FeastOfBlood card) { + super(card); + } + + @Override + public FeastOfBlood copy() { + return new FeastOfBlood(this); + } +} + +class FeastOfBloodCost extends CostImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.getSubtype().add("Vampire"); + filter.setScopeSubtype(Filter.ComparisonScope.Any); + } + + public FeastOfBloodCost() { + this.text = "you must control two or more Vampires"; + } + + public FeastOfBloodCost(final FeastOfBloodCost cost) { + super(cost); + } + + @Override + public boolean canPay(UUID sourceId, UUID controllerId, Game game) { + return game.getBattlefield().contains(filter, controllerId, 2); + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { + this.paid = true; + return paid; + } + + @Override + public FeastOfBloodCost copy() { + return new FeastOfBloodCost(this); + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/HellfireMongrel.java b/Mage.Sets/src/mage/sets/zendikar/HellfireMongrel.java new file mode 100644 index 00000000000..47c417ecbd4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/HellfireMongrel.java @@ -0,0 +1,106 @@ +/* + * 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.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author North + */ +public class HellfireMongrel extends CardImpl { + + public HellfireMongrel(UUID ownerId) { + super(ownerId, 130, "Hellfire Mongrel", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "ZEN"; + this.subtype.add("Elemental"); + this.subtype.add("Hound"); + + this.color.setRed(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Hellfire Mongrel deals 2 damage to him or her. + this.addAbility(new HellfireMongrelTriggeredAbility()); + } + + public HellfireMongrel(final HellfireMongrel card) { + super(card); + } + + @Override + public HellfireMongrel copy() { + return new HellfireMongrel(this); + } +} + +class HellfireMongrelTriggeredAbility extends TriggeredAbilityImpl { + + public HellfireMongrelTriggeredAbility() { + super(Zone.BATTLEFIELD, null); + } + + public HellfireMongrelTriggeredAbility(final HellfireMongrelTriggeredAbility ability) { + super(ability); + } + + @Override + public HellfireMongrelTriggeredAbility copy() { + return new HellfireMongrelTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE && game.getOpponents(controllerId).contains(event.getPlayerId())) { + Player player = game.getPlayer(event.getPlayerId()); + if (player != null && player.getHand().size() < 3) { + DamageTargetEffect effect = new DamageTargetEffect(2); + effect.setTargetPointer(new FixedTarget(player.getId())); + this.addEffect(effect); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, {this} deals 2 damage to him or her."; + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/RiteOfReplication.java b/Mage.Sets/src/mage/sets/zendikar/RiteOfReplication.java new file mode 100644 index 00000000000..400d374225b --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/RiteOfReplication.java @@ -0,0 +1,107 @@ +/* + * 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.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.costs.mana.KickerManaCost; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.sets.tokens.EmptyToken; +import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; + +/** + * + * @author North + */ +public class RiteOfReplication extends CardImpl { + + public RiteOfReplication(UUID ownerId) { + super(ownerId, 61, "Rite of Replication", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{U}{U}"); + this.expansionSetCode = "ZEN"; + + this.color.setBlue(true); + + // Kicker {5} + this.getSpellAbility().addOptionalCost(new KickerManaCost("{5}")); + // Put a token that's a copy of target creature onto the battlefield. If Rite of Replication was kicked, put five of those tokens onto the battlefield instead. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new RiteOfReplicationEffect(5), + new RiteOfReplicationEffect(1), KickedCondition.getInstance(), + "Put a token that's a copy of target creature onto the battlefield. If {this} was kicked, put five of those tokens onto the battlefield instead")); + } + + public RiteOfReplication(final RiteOfReplication card) { + super(card); + } + + @Override + public RiteOfReplication copy() { + return new RiteOfReplication(this); + } +} + +class RiteOfReplicationEffect extends OneShotEffect { + + private int amount; + + public RiteOfReplicationEffect(int amount) { + super(Outcome.PutCreatureInPlay); + this.amount = amount; + } + + public RiteOfReplicationEffect(final RiteOfReplicationEffect effect) { + super(effect); + this.amount = effect.amount; + } + + @Override + public RiteOfReplicationEffect copy() { + return new RiteOfReplicationEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Card card = game.getCard(source.getFirstTarget()); + if (card != null) { + EmptyToken token = new EmptyToken(); + CardUtil.copyTo(token).from(card); + token.putOntoBattlefield(amount, game, source.getSourceId(), source.getControllerId()); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/SoulStairExpedition.java b/Mage.Sets/src/mage/sets/zendikar/SoulStairExpedition.java new file mode 100644 index 00000000000..ce8f2efe2ec --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/SoulStairExpedition.java @@ -0,0 +1,75 @@ +/* + * 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.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.Ability; +import mage.abilities.common.LandfallAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.counters.CounterType; +import mage.filter.common.FilterCreatureCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author North + */ +public class SoulStairExpedition extends CardImpl { + + public SoulStairExpedition(UUID ownerId) { + super(ownerId, 112, "Soul Stair Expedition", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}"); + this.expansionSetCode = "ZEN"; + + this.color.setBlack(true); + + // Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on Soul Stair Expedition. + this.addAbility(new LandfallAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.QUEST.createInstance()), true)); + // Remove three quest counters from Soul Stair Expedition and sacrifice it: Return up to two target creature cards from your graveyard to your hand. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new RemoveCountersSourceCost(CounterType.QUEST.createInstance(3))); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCardInYourGraveyard(0, 2, new FilterCreatureCard("creature cards from your graveyard"))); + this.addAbility(ability); + } + + public SoulStairExpedition(final SoulStairExpedition card) { + super(card); + } + + @Override + public SoulStairExpedition copy() { + return new SoulStairExpedition(this); + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/TrailblazersBoots.java b/Mage.Sets/src/mage/sets/zendikar/TrailblazersBoots.java new file mode 100644 index 00000000000..0a0f88375e6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/TrailblazersBoots.java @@ -0,0 +1,91 @@ +/* + * 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.zendikar; + +import java.util.UUID; +import mage.Constants.AttachmentType; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continious.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.LandwalkAbility; +import mage.cards.CardImpl; +import mage.filter.common.FilterLandPermanent; + +/** + * + * @author North + */ +public class TrailblazersBoots extends CardImpl { + + public TrailblazersBoots(UUID ownerId) { + super(ownerId, 208, "Trailblazer's Boots", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "ZEN"; + this.subtype.add("Equipment"); + + // Equipped creature has nonbasic landwalk. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new NonbasicLandwalkAbility(), AttachmentType.EQUIPMENT))); + // Equip {2} + this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2))); + } + + public TrailblazersBoots(final TrailblazersBoots card) { + super(card); + } + + @Override + public TrailblazersBoots copy() { + return new TrailblazersBoots(this); + } +} + +class NonbasicLandwalkAbility extends LandwalkAbility { + + private static final FilterLandPermanent filter = new FilterLandPermanent("nonbasic land"); + + static { + filter.getSupertype().add("Basic"); + } + + public NonbasicLandwalkAbility() { + super(filter); + } + + public NonbasicLandwalkAbility(final NonbasicLandwalkAbility ability) { + super(ability); + } + + @Override + public NonbasicLandwalkAbility copy() { + return new NonbasicLandwalkAbility(this); + } +} diff --git a/Mage.Sets/src/mage/sets/zendikar/ZektarShrineExpedition.java b/Mage.Sets/src/mage/sets/zendikar/ZektarShrineExpedition.java new file mode 100644 index 00000000000..ab252de4f5a --- /dev/null +++ b/Mage.Sets/src/mage/sets/zendikar/ZektarShrineExpedition.java @@ -0,0 +1,129 @@ +/* + * 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.zendikar; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.common.LandfallAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.delayed.AtEndOfTurnDelayedTriggeredAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.token.Token; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author North + */ +public class ZektarShrineExpedition extends CardImpl { + + public ZektarShrineExpedition(UUID ownerId) { + super(ownerId, 155, "Zektar Shrine Expedition", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "ZEN"; + + this.color.setRed(true); + + // Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on Zektar Shrine Expedition. + this.addAbility(new LandfallAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.QUEST.createInstance()), true)); + // Remove three quest counters from Zektar Shrine Expedition and sacrifice it: Put a 7/1 red Elemental creature token with trample and haste onto the battlefield. Exile it at the beginning of the next end step. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ZektarShrineExpeditionEffect(), new RemoveCountersSourceCost(CounterType.QUEST.createInstance(3))); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public ZektarShrineExpedition(final ZektarShrineExpedition card) { + super(card); + } + + @Override + public ZektarShrineExpedition copy() { + return new ZektarShrineExpedition(this); + } +} + +class ZektarShrineExpeditionEffect extends OneShotEffect { + + public ZektarShrineExpeditionEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "Put a 7/1 red Elemental creature token with trample and haste onto the battlefield. Exile it at the beginning of the next end step"; + } + + public ZektarShrineExpeditionEffect(final ZektarShrineExpeditionEffect effect) { + super(effect); + } + + @Override + public ZektarShrineExpeditionEffect copy() { + return new ZektarShrineExpeditionEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + ElementalToken token = new ElementalToken(); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); + + ExileTargetEffect exileEffect = new ExileTargetEffect(); + exileEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken())); + DelayedTriggeredAbility delayedAbility = new AtEndOfTurnDelayedTriggeredAbility(exileEffect); + delayedAbility.setSourceId(source.getSourceId()); + delayedAbility.setControllerId(source.getControllerId()); + game.addDelayedTriggeredAbility(delayedAbility); + + return true; + } +} + +class ElementalToken extends Token { + + public ElementalToken() { + super("Elemental", "7/1 red Elemental creature token with trample and haste"); + cardType.add(CardType.CREATURE); + color = ObjectColor.RED; + subtype.add("Elemental"); + power = new MageInt(7); + toughness = new MageInt(1); + addAbility(TrampleAbility.getInstance()); + addAbility(HasteAbility.getInstance()); + } +}