diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 1e23924216..2cb9a38765 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -2187,7 +2187,7 @@ public final class GamePanel extends javax.swing.JPanel { public void installComponents() { jLayeredPane.setOpaque(false); - jLayeredPane.add(abilityPicker); + jLayeredPane.add(abilityPicker, JLayeredPane.MODAL_LAYER); jLayeredPane.add(DialogManager.getManager(gameId), JLayeredPane.MODAL_LAYER, 0); abilityPicker.setVisible(false); } diff --git a/Mage.Sets/src/mage/cards/a/AsForetold.java b/Mage.Sets/src/mage/cards/a/AsForetold.java new file mode 100644 index 0000000000..62b523ddd0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AsForetold.java @@ -0,0 +1,228 @@ +/* + * 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.cards.a; + +import java.util.UUID; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.watchers.Watcher; + +/** + * + * @author stravant + * + * Note, this card is pretty hacky in its implementation due to the fact that the alternative cost system doesn't + * really support "once each turn" alternative costs in an obvious way, but it should work in all scenarios as far + * as I can see. + */ +public class AsForetold extends CardImpl { + public AsForetold(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + + + // At the beginning of your upkeep, put a time counter on As Foretold. + addAbility( + new BeginningOfUpkeepTriggeredAbility( + new AddCountersSourceEffect(CounterType.TIME.createInstance(), new StaticValue(1), true), + TargetController.YOU, + /* optional = */false)); + + // Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on As Foretold. + addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AsForetoldAddAltCostEffect()), new AsForetoldAltCostUsedWatcher()); + } + + public AsForetold(final AsForetold card) { + super(card); + } + + @Override + public AsForetold copy() { + return new AsForetold(this); + } +} + +/** + * Used to determine what cast objects to apply the alternative cost to + */ +class SpellWithManaCostLessThanOrEqualToCondition implements Condition { + private int counters; + + public SpellWithManaCostLessThanOrEqualToCondition(int counters) { + this.counters = counters; + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject object = game.getObject(source.getSourceId()); + return object != null && !object.isLand() && object.getConvertedManaCost() <= counters; + } +} + + +/** + * Special AlternativeCostSourceAbility implementation. We wrap the call to askToActivateAlternativeCosts in order to + * tell when the alternative cost is used, and mark it as having been used this turn in the watcher + */ +class AsForetoldAlternativeCost extends AlternativeCostSourceAbility { + private UUID sourceAsForetold; + + AsForetoldAlternativeCost(UUID sourceAsForetold, int timeCounters) { + super(new ManaCostsImpl("{0}"), new SpellWithManaCostLessThanOrEqualToCondition(timeCounters)); + this.sourceAsForetold = sourceAsForetold; + } + + AsForetoldAlternativeCost(final AsForetoldAlternativeCost ability) { + super(ability); + this.sourceAsForetold = ability.sourceAsForetold; + } + + @Override + public AsForetoldAlternativeCost copy() { + return new AsForetoldAlternativeCost(this); + } + + @Override + public boolean askToActivateAlternativeCosts(Ability ability, Game game) { + boolean activated = super.askToActivateAlternativeCosts(ability, game); + if (activated) { + // Get the watcher + AsForetoldAltCostUsedWatcher asForetoldAltCostUsedWatcher = + (AsForetoldAltCostUsedWatcher)game.getState().getWatchers() + .get("asForetoldAltCostUsedWatcher", sourceAsForetold); + + // Mark as used + asForetoldAltCostUsedWatcher.markUsedThisTurn(); + } + return activated; + } +} + +/** + * The continuous effect that adds the option to pay the alternative cost if we haven't used it yet this turn + */ +class AsForetoldAddAltCostEffect extends ContinuousEffectImpl { + public AsForetoldAddAltCostEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "Once each turn, you may pay {0} rather than pay the mana cost for a spelly ou cast with converted mana cost X or less, where X is the number of time counters on {this}."; + } + + public AsForetoldAddAltCostEffect(final AsForetoldAddAltCostEffect effect) { + super(effect); + } + + @Override + public AsForetoldAddAltCostEffect copy() { + return new AsForetoldAddAltCostEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent != null) { + // Get the watcher + AsForetoldAltCostUsedWatcher asForetoldAltCostUsedWatcher = + (AsForetoldAltCostUsedWatcher)game.getState().getWatchers() + .get("asForetoldAltCostUsedWatcher", sourcePermanent.getId()); + + // If we haven't used it yet this turn, give the option of using the zero alternative cost + if (!asForetoldAltCostUsedWatcher.hasBeenUsedThisTurn()) { + int timeCounters = sourcePermanent.getCounters(game).getCount("time"); + controller.getAlternativeSourceCosts().add(new AsForetoldAlternativeCost(sourcePermanent.getId(), timeCounters)); + } + + // Return true even if we didn't add the alt cost. We still applied the effect + return true; + } + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.RulesEffects; + } +} + +/** + * Watcher used as extra storage to record whether a given As Foretold has been used this turn. + * Technically speaking this watcher doesn't *watch* any GameEvents, but it does "watch" the + * alternative cost being used. That just isn't possible to watch through a game event. It's still + * helpfull to co-op the Watcher system for this since it automatically handles ZoneChangeCounter + * stuff and resetting the condition at the end of the turn. + */ +class AsForetoldAltCostUsedWatcher extends Watcher { + public AsForetoldAltCostUsedWatcher() { + super("asForetoldAltCostUsedWatcher", WatcherScope.CARD); + } + + public AsForetoldAltCostUsedWatcher(final AsForetoldAltCostUsedWatcher watcher) { + super(watcher); + } + + @Override + public void watch(GameEvent event, Game game) { + // Nothing to do, we explicitly mark used in the alternative cost + } + + public boolean hasBeenUsedThisTurn() { + return conditionMet(); + } + + public void markUsedThisTurn() { + condition = true; + } + + @Override + public AsForetoldAltCostUsedWatcher copy() { + return new AsForetoldAltCostUsedWatcher(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java b/Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java new file mode 100644 index 0000000000..6773af8f0c --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java @@ -0,0 +1,93 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CartoucheOfAmbition extends CardImpl { + + public CartoucheOfAmbition(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + + this.subtype.add("Aura"); + this.subtype.add("Cartouche"); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Cartouche of Ambition enters the battlefield, you may put a -1/-1 counter on target creature. + ability = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance(1)), true); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Enchanted creature gets +1/+1 and has lifelink. + ability =new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)); + Effect effect = new GainAbilityAttachedEffect(LifelinkAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has lifelink"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public CartoucheOfAmbition(final CartoucheOfAmbition card) { + super(card); + } + + @Override + public CartoucheOfAmbition copy() { + return new CartoucheOfAmbition(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java b/Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java new file mode 100644 index 0000000000..f304bffecc --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java @@ -0,0 +1,89 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CartoucheOfKnowledge extends CardImpl { + + public CartoucheOfKnowledge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + + this.subtype.add("Aura"); + this.subtype.add("Cartouche"); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Cartouche of Knowledge enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + + // Enchanted creature gets +1/+1 and has flying. + ability =new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)); + Effect effect = new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has flying"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public CartoucheOfKnowledge(final CartoucheOfKnowledge card) { + super(card); + } + + @Override + public CartoucheOfKnowledge copy() { + return new CartoucheOfKnowledge(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java b/Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java new file mode 100644 index 0000000000..db3fcc72d7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java @@ -0,0 +1,92 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CartoucheOfZeal extends CardImpl { + + public CartoucheOfZeal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}"); + + this.subtype.add("Aura"); + this.subtype.add("Cartouche"); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Cartouche of Zeal enters the battlefield, target creature can't block this turn. + ability = new EntersBattlefieldTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Enchanted creature gets +1/+1 and has haste. + ability =new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)); + Effect effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has haste"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public CartoucheOfZeal(final CartoucheOfZeal card) { + super(card); + } + + @Override + public CartoucheOfZeal copy() { + return new CartoucheOfZeal(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/Censor.java b/Mage.Sets/src/mage/cards/c/Censor.java new file mode 100644 index 0000000000..25441b412a --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Censor.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.cards.c; + +import java.util.UUID; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class Censor extends CardImpl { + + public Censor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); + + // Counter target spell unless its controller pays {1}. + this.getSpellAbility().addTarget(new TargetSpell()); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new GenericManaCost(1))); + + // Cycling {U} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{U}"))); + + } + + public Censor(final Censor card) { + super(card); + } + + @Override + public Censor copy() { + return new Censor(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java b/Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java new file mode 100644 index 0000000000..6f6d4dbf4d --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java @@ -0,0 +1,67 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; +import mage.abilities.keyword.ExertAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterCreatureCard; + +/** + * + * @author fireshoes + */ +public class ChampionOfRhonas extends CardImpl { + + public ChampionOfRhonas(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + + this.subtype.add("Jackal"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // You may exert Champion of Rhonas as it attacks. When you do, you may put a creature card from your hand onto the battlefield. + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new PutPermanentOnBattlefieldEffect(new FilterCreatureCard("a creature card"))); + this.addAbility(new ExertAbility(ability)); + } + + public ChampionOfRhonas(final ChampionOfRhonas card) { + super(card); + } + + @Override + public ChampionOfRhonas copy() { + return new ChampionOfRhonas(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CompanionOfTheTrials.java b/Mage.Sets/src/mage/cards/c/CompanionOfTheTrials.java new file mode 100644 index 0000000000..2eb8443dbf --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CompanionOfTheTrials.java @@ -0,0 +1,86 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.CountType; +import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.common.FilterPlaneswalkerPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class CompanionOfTheTrials extends CardImpl { + + private static final FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("you control a Gideon planeswalker"); + static { + filter.add(new SubtypePredicate("Gideon")); + } + + public CompanionOfTheTrials(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add("Bird"); + this.subtype.add("Soldier"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {1}{W}: Untap target creature. Activate this ability only if you control a Gideon planeswalker. + Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, + new UntapTargetEffect(), + new ManaCostsImpl("{1}{W}"), + new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public CompanionOfTheTrials(final CompanionOfTheTrials card) { + super(card); + } + + @Override + public CompanionOfTheTrials copy() { + return new CompanionOfTheTrials(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java b/Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java new file mode 100644 index 0000000000..8a28906324 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java @@ -0,0 +1,113 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.CycleOrDiscardControllerTriggeredAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author fireshoes + */ +public class CuratorOfMysteries extends CardImpl { + + public CuratorOfMysteries(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + + this.subtype.add("Sphinx"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever you cycle or discard another card, scry 1. + this.addAbility(new CycleOrDiscardControllerTriggeredAbility(new ScryEffect(1), false)); + + // Cycling {U} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{U}"))); + + } + + public CuratorOfMysteries(final CuratorOfMysteries card) { + super(card); + } + + @Override + public CuratorOfMysteries copy() { + return new CuratorOfMysteries(this); + } +} + +class CuratorOfMysteriesTriggeredAbility extends TriggeredAbilityImpl { + + CuratorOfMysteriesTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect, false); + } + + CuratorOfMysteriesTriggeredAbility(final CuratorOfMysteriesTriggeredAbility ability) { + super(ability); + } + + @Override + public CuratorOfMysteriesTriggeredAbility copy() { + return new CuratorOfMysteriesTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DISCARDED_CARD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (getControllerId().equals(event.getPlayerId())) { + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever you cycle or discard a card, " + super.getRule(); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DesiccatedNaga.java b/Mage.Sets/src/mage/cards/d/DesiccatedNaga.java new file mode 100644 index 0000000000..b2be8bbba5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DesiccatedNaga.java @@ -0,0 +1,88 @@ +/* + * 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.cards.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.CountType; +import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.common.FilterPlaneswalkerPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class DesiccatedNaga extends CardImpl { + + private static final FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("you control a Liliana planeswalker"); + + static { + filter.add(new SubtypePredicate("Liliana")); + } + + public DesiccatedNaga(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add("Zombie"); + this.subtype.add("Naga"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // {3}{B}: Target opponent loses 2 life and you gain 2 life. Activate this ability only if you control a Liliana planeswalker. + Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, + new LoseLifeTargetEffect(2), + new ManaCostsImpl("{3}{B}"), + new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0)); + ability.addTarget(new TargetOpponent()); + Effect effect = new GainLifeEffect(2); + effect.setText("and you gain 2 life"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public DesiccatedNaga(final DesiccatedNaga card) { + super(card); + } + + @Override + public DesiccatedNaga copy() { + return new DesiccatedNaga(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/Floodwaters.java b/Mage.Sets/src/mage/cards/f/Floodwaters.java new file mode 100644 index 0000000000..6a04b19f3b --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/Floodwaters.java @@ -0,0 +1,68 @@ +/* + * 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.cards.f; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Floodwaters extends CardImpl { + + public Floodwaters(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{U}{U}"); + + // Return up to two target creatures to their owners' hands. + Effect effect = new ReturnToHandTargetEffect(); + effect.setText("Return up to two target creatures to their owners' hands"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + + } + + public Floodwaters(final Floodwaters card) { + super(card); + } + + @Override + public Floodwaters copy() { + return new Floodwaters(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GideonsResolve.java b/Mage.Sets/src/mage/cards/g/GideonsResolve.java new file mode 100644 index 0000000000..476b9cb6cf --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GideonsResolve.java @@ -0,0 +1,74 @@ +/* + * 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.cards.g; + +import java.util.UUID; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; + +/** + * + * @author fireshoes + */ +public class GideonsResolve extends CardImpl { + + private final static FilterCard filter = new FilterCard("Gideon, Martial Paragon"); + + static { + filter.add(new NamePredicate("Gideon, Martial Paragon")); + } + + public GideonsResolve(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}"); + + // When Gideon's Resolve enters the battlefield, you may search your library and/or graveyard for a card named Gideon, Martial Paragon, + // reveal it, and put it into your hand. If you search your library this way, shuffle it. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryGraveyardPutInHandEffect(filter), true)); + + // Creature you control get +1/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield))); + } + + public GideonsResolve(final GideonsResolve card) { + super(card); + } + + @Override + public GideonsResolve copy() { + return new GideonsResolve(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java b/Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java new file mode 100644 index 0000000000..079c01a3a1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.ExertAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author fireshoes + */ +public class GloryBoundInitiate extends CardImpl { + + public GloryBoundInitiate(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // You may exert Glory-Bound Initiate as it attacks. When you do, it gets +1/+3 and gains lifelink until end of turn. + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new BoostSourceEffect(1, 3, Duration.EndOfTurn)); + ability.addEffect(new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn)); + this.addAbility(new ExertAbility(ability)); + } + + public GloryBoundInitiate(final GloryBoundInitiate card) { + super(card); + } + + @Override + public GloryBoundInitiate copy() { + return new GloryBoundInitiate(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/Glorybringer.java b/Mage.Sets/src/mage/cards/g/Glorybringer.java new file mode 100644 index 0000000000..d65e980439 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/Glorybringer.java @@ -0,0 +1,90 @@ +/* + * 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.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.ExertAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes + */ +public class Glorybringer extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Dragon creature an opponent controls"); + + static { + filter.add(Predicates.not(new SubtypePredicate("Dragon"))); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public Glorybringer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + + this.subtype.add("Dragon"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // You may exert Glorybringer as it attacks. When you do, it deals 4 damage to target non-Dragon creature an opponent controls. + Effect effect = new DamageTargetEffect(4); + effect.setText("it deals 4 damage to target non-Dragon creature an opponent controls"); + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(effect); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(new ExertAbility(ability)); + } + + public Glorybringer(final Glorybringer card) { + super(card); + } + + @Override + public Glorybringer copy() { + return new Glorybringer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GreelMindRaker.java b/Mage.Sets/src/mage/cards/g/GreelMindRaker.java index a27293dcbb..7a5ac37e67 100644 --- a/Mage.Sets/src/mage/cards/g/GreelMindRaker.java +++ b/Mage.Sets/src/mage/cards/g/GreelMindRaker.java @@ -42,6 +42,9 @@ import mage.constants.Zone; import mage.target.TargetPlayer; import java.util.UUID; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.filter.FilterCard; +import mage.target.common.TargetCardInHand; /** * @@ -61,6 +64,7 @@ public class GreelMindRaker extends CardImpl { // {X}{B}, {tap}, Discard two cards: Target player discards X cards at random. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DiscardTargetEffect(new ManacostVariableValue(), true), new ManaCostsImpl("{X}{B}")); ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, new FilterCard()))); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/h/HazoretsFavor.java b/Mage.Sets/src/mage/cards/h/HazoretsFavor.java new file mode 100644 index 0000000000..3667e49701 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HazoretsFavor.java @@ -0,0 +1,112 @@ +/* + * 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.cards.h; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author fireshoes + */ +public class HazoretsFavor extends CardImpl { + + public HazoretsFavor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + + // At the beginning of combat on your turn, you may have target creature you control get +2/+0 and gain haste until end of turn. + // If you do, sacrifice it at the beginning of the next end step. + Effect effect = new BoostTargetEffect(2, 0, Duration.EndOfTurn); + effect.setText("you may have target creature you control get +2/+0"); + Ability ability = new BeginningOfCombatTriggeredAbility(effect, TargetController.YOU, true); + effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setText(" and gain haste until end of turn"); + ability.addEffect(effect); + ability.addTarget(new TargetControlledCreaturePermanent()); + ability.addEffect(new HazoretsFavorSacrificeEffect()); + this.addAbility(ability); + } + + public HazoretsFavor(final HazoretsFavor card) { + super(card); + } + + @Override + public HazoretsFavor copy() { + return new HazoretsFavor(this); + } + + private static class HazoretsFavorSacrificeEffect extends OneShotEffect { + + public HazoretsFavorSacrificeEffect() { + super(Outcome.Sacrifice); + this.staticText = "If you do, sacrifice it at the beginning of the next end step"; + } + + public HazoretsFavorSacrificeEffect(final HazoretsFavorSacrificeEffect effect) { + super(effect); + } + + @Override + public HazoretsFavorSacrificeEffect copy() { + return new HazoretsFavorSacrificeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanent(source.getFirstTarget()); + if (creature != null) { + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect("sacrifice boosted " + creature.getName(), source.getControllerId()); + sacrificeEffect.setTargetPointer(new FixedTarget(creature, game)); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); + game.addDelayedTriggeredAbility(delayedAbility, source); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/h/HerosDownfall.java b/Mage.Sets/src/mage/cards/h/HerosDownfall.java index f356d6f699..528d41d754 100644 --- a/Mage.Sets/src/mage/cards/h/HerosDownfall.java +++ b/Mage.Sets/src/mage/cards/h/HerosDownfall.java @@ -32,11 +32,7 @@ import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.target.Target; -import mage.target.TargetPermanent; +import mage.target.common.TargetCreatureOrPlaneswalker; /** * @@ -44,19 +40,13 @@ import mage.target.TargetPermanent; */ public class HerosDownfall extends CardImpl { - private static final FilterPermanent filter = new FilterPermanent("creature or planeswalker"); - static { - filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.PLANESWALKER))); - } - public HerosDownfall(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{B}{B}"); // Destroy target creature or planeswalker. this.getSpellAbility().addEffect(new DestroyTargetEffect()); - Target target = new TargetPermanent(filter); - this.getSpellAbility().addTarget(target); + this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); } public HerosDownfall(final HerosDownfall card) { diff --git a/Mage.Sets/src/mage/cards/h/HonoredHydra.java b/Mage.Sets/src/mage/cards/h/HonoredHydra.java new file mode 100644 index 0000000000..f1d215c703 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HonoredHydra.java @@ -0,0 +1,69 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.EmbalmAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author fireshoes + */ +public class HonoredHydra extends CardImpl { + + public HonoredHydra(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}"); + + this.subtype.add("Snake"); + this.subtype.add("Hydra"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Embalm {3}{G} + this.addAbility(new EmbalmAbility(new ManaCostsImpl("{3}{G}"), this)); + + } + + public HonoredHydra(final HonoredHydra card) { + super(card); + } + + @Override + public HonoredHydra copy() { + return new HonoredHydra(this); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LilianasInfluence.java b/Mage.Sets/src/mage/cards/l/LilianasInfluence.java new file mode 100644 index 0000000000..a72273df41 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LilianasInfluence.java @@ -0,0 +1,74 @@ +/* + * 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.cards.l; + +import java.util.UUID; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author fireshoes + */ +public class LilianasInfluence extends CardImpl { + + private final static FilterCard filter = new FilterCard("Liliana, Death Wielder"); + private final static FilterCreaturePermanent filterCreatures = new FilterCreaturePermanent("creature you don't control"); + + static { + filter.add(new NamePredicate("Liliana, Death Wielder")); + filterCreatures.add(new ControllerPredicate(TargetController.NOT_YOU)); + } + + public LilianasInfluence(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}{B}"); + + // Put a -1/-1 counter on each creature you don't control. You may search your library and/or graveyard for a card named Liliana, Death Wielder, + // reveal it, and put it into your hand. If you search your library this way, shuffle it. + getSpellAbility().addEffect(new AddCountersAllEffect(CounterType.M1M1.createInstance(1), filterCreatures)); + getSpellAbility().addEffect(new SearchLibraryGraveyardPutInHandEffect(filter)); + } + + public LilianasInfluence(final LilianasInfluence card) { + super(card); + } + + @Override + public LilianasInfluence copy() { + return new LilianasInfluence(this); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LilianasMastery.java b/Mage.Sets/src/mage/cards/l/LilianasMastery.java new file mode 100644 index 0000000000..36979f9166 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LilianasMastery.java @@ -0,0 +1,74 @@ +/* + * 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.cards.l; + +import java.util.UUID; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.permanent.token.ZombieToken; + +/** + * + * @author fireshoes + */ +public class LilianasMastery extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Zombie creatures"); + + static { + filter.add(new SubtypePredicate("Zombie")); + } + + public LilianasMastery(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); + + // Zombies creatures you control get +1/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, false))); + + // When Liliana's Army enters the battlefield, create two 2/2 black Zombie creature tokens. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 2))); + } + + public LilianasMastery(final LilianasMastery card) { + super(card); + } + + @Override + public LilianasMastery copy() { + return new LilianasMastery(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/Manglehorn.java b/Mage.Sets/src/mage/cards/m/Manglehorn.java new file mode 100644 index 0000000000..4119ef0a64 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/Manglehorn.java @@ -0,0 +1,121 @@ +/* + * 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.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetArtifactPermanent; + +/** + * + * @author fireshoes + */ +public class Manglehorn extends CardImpl { + + public Manglehorn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Beast"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Manglehorn enters the battlefield, you may destroy target artifact. + Ability ability = new EntersBattlefieldTriggeredAbility(new DestroyTargetEffect(), true); + ability.addTarget(new TargetArtifactPermanent()); + this.addAbility(ability); + + // Artifacts your opponents control enter the battlefield tapped. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ManglehornTapEffect())); + } + + public Manglehorn(final Manglehorn card) { + super(card); + } + + @Override + public Manglehorn copy() { + return new Manglehorn(this); + } +} + +class ManglehornTapEffect extends ReplacementEffectImpl { + + ManglehornTapEffect() { + super(Duration.WhileOnBattlefield, Outcome.Tap); + staticText = "Artifacts your opponents control enter the battlefield tapped"; + } + + ManglehornTapEffect(final ManglehornTapEffect effect) { + super(effect); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Permanent target = ((EntersTheBattlefieldEvent) event).getTarget(); + if (target != null) { + target.setTapped(true); + } + return false; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) { + Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget(); + if (permanent != null && permanent.isArtifact()) { + return true; + } + } + return false; + } + + @Override + public ManglehornTapEffect copy() { + return new ManglehornTapEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NehebTheWorthy.java b/Mage.Sets/src/mage/cards/n/NehebTheWorthy.java new file mode 100644 index 0000000000..efe152b4fd --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NehebTheWorthy.java @@ -0,0 +1,100 @@ +/* + * 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.cards.n; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.CountType; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CardsInHandCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author fireshoes + */ +public class NehebTheWorthy extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Minotaurs"); + + static { + filter.add(new SubtypePredicate("Minotaur")); + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public NehebTheWorthy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{R}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("Minotaur"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Other Minotaurs you control have first strike. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter, true))); + + // As long as you have one or fewer cards in hand, Minotaurs you control get +2/+0. + Condition condition = new CardsInHandCondition(CountType.FEWER_THAN, 2); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( + new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield, filter), condition, "As long as you have one or fewer cards in hand, Minotaurs you control gets +2/+0")); + this.addAbility(ability); + + // Whenever Neheb, the Worthy deals combat damage to a player, each player discards a card. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardEachPlayerEffect(), false)); + } + + public NehebTheWorthy(final NehebTheWorthy card) { + super(card); + } + + @Override + public NehebTheWorthy copy() { + return new NehebTheWorthy(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NeverReturn.java b/Mage.Sets/src/mage/cards/n/NeverReturn.java new file mode 100644 index 0000000000..5e58ac303d --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NeverReturn.java @@ -0,0 +1,73 @@ +/* + * 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.cards.n; + +import java.util.UUID; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.game.permanent.token.ZombieToken; +import mage.target.common.TargetCardInGraveyard; +import mage.target.common.TargetCreatureOrPlaneswalker; + +/** + * + * @author fireshoes + */ +public class NeverReturn extends SplitCard { + + public NeverReturn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}{B}", "{3}{B}", false); + + // Never + // Destroy target creature or planeswalker. + getLeftHalfCard().getSpellAbility().addEffect(new DestroyTargetEffect()); + getLeftHalfCard().getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); + + // Return + // Exile target card from a graveyard. Create a 2/2 black Zombie creature token. + ((CardImpl)(getRightHalfCard())).addAbility(new AftermathAbility()); + getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect()); + getRightHalfCard().getSpellAbility().addTarget(new TargetCardInGraveyard()); + getRightHalfCard().getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken())); + } + + public NeverReturn(final NeverReturn card) { + super(card); + } + + @Override + public NeverReturn copy() { + return new NeverReturn(this); + } +} diff --git a/Mage.Sets/src/mage/cards/o/OathOfChandra.java b/Mage.Sets/src/mage/cards/o/OathOfChandra.java index cebc05133a..680cac01ef 100644 --- a/Mage.Sets/src/mage/cards/o/OathOfChandra.java +++ b/Mage.Sets/src/mage/cards/o/OathOfChandra.java @@ -49,6 +49,7 @@ import mage.watchers.Watcher; import java.util.HashSet; import java.util.Set; import java.util.UUID; +import mage.abilities.effects.Effect; /** * @@ -67,7 +68,9 @@ public class OathOfChandra extends CardImpl { addSuperType(SuperType.LEGENDARY); // When Oath of Chandra enters the battlefield, it deals 3 damage to target creature an opponent controls. - Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3), false); + Effect effect = new DamageTargetEffect(3); + effect.setText("it deals 3 damage to target creature an opponent controls"); + Ability ability = new EntersBattlefieldTriggeredAbility(effect, false); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); // At the beginning of each end step, if a planeswalker entered the battlefield under your control this turn, Oath of Chandra deals 2 damage to each opponent. diff --git a/Mage.Sets/src/mage/cards/o/OketraTheTrue.java b/Mage.Sets/src/mage/cards/o/OketraTheTrue.java new file mode 100644 index 0000000000..a44e16c5c3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OketraTheTrue.java @@ -0,0 +1,131 @@ +/* + * 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.cards.o; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.CountType; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.WarriorVigilantToken; +import mage.players.Player; + +/** + * + * @author fireshoes + */ +public class OketraTheTrue extends CardImpl { + + public OketraTheTrue(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("God"); + this.power = new MageInt(3); + this.toughness = new MageInt(6); + + // Double strike + this.addAbility(DoubleStrikeAbility.getInstance()); + + // Indestructible + this.addAbility(IndestructibleAbility.getInstance()); + + // Oketra the True can't attack or block unless you control three or more creatures. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OketraTheTrueRestrictionEffect())); + + // {3}{W}: Create a 1/1 white Warrior creature token with vigilance. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new WarriorVigilantToken()), new ManaCostsImpl("{3}{W}"))); + } + + public OketraTheTrue(final OketraTheTrue card) { + super(card); + } + + @Override + public OketraTheTrue copy() { + return new OketraTheTrue(this); + } +} + +class OketraTheTrueRestrictionEffect extends RestrictionEffect { + + public OketraTheTrueRestrictionEffect() { + super(Duration.WhileOnBattlefield); + staticText = "{this} can't attack or block unless you control at least three other creatures"; + } + + public OketraTheTrueRestrictionEffect(final OketraTheTrueRestrictionEffect effect) { + super(effect); + } + + @Override + public OketraTheTrueRestrictionEffect copy() { + return new OketraTheTrueRestrictionEffect(this); + } + + @Override + public boolean canAttack(Game game) { + return false; + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + return false; + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate(source.getControllerId())); + if (permanent.getId().equals(source.getSourceId())) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int permanentsOnBattlefield = game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game); + return (CountType.compare(permanentsOnBattlefield, CountType.FEWER_THAN, 4)); + } + return true; + } // do not apply to other creatures. + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/o/OnwardVictory.java b/Mage.Sets/src/mage/cards/o/OnwardVictory.java index 3dc2f5b1a1..552a41b10c 100644 --- a/Mage.Sets/src/mage/cards/o/OnwardVictory.java +++ b/Mage.Sets/src/mage/cards/o/OnwardVictory.java @@ -28,37 +28,20 @@ package mage.cards.o; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.dynamicvalue.common.TargetPermanentPowerCount; import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.*; -import mage.abilities.effects.common.combat.MustBeBlockedByAllTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.AftermathAbility; import mage.abilities.keyword.DoubleStrikeAbility; -import mage.abilities.keyword.IndestructibleAbility; -import mage.abilities.keyword.LifelinkAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.SplitCard; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.Filter; -import mage.filter.FilterCard; -import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import java.util.Set; import java.util.UUID; /** diff --git a/Mage.Sets/src/mage/cards/p/PainfulLesson.java b/Mage.Sets/src/mage/cards/p/PainfulLesson.java new file mode 100644 index 0000000000..c41e67a2b6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PainfulLesson.java @@ -0,0 +1,64 @@ +/* + * 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.cards.p; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardTargetEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class PainfulLesson extends CardImpl { + + public PainfulLesson(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); + + // Target player draws two cards and loses 2 life. + this.getSpellAbility().addTarget(new TargetPlayer()); + this.getSpellAbility().addEffect(new DrawCardTargetEffect(2)); + Effect effect = new LoseLifeTargetEffect(2); + effect.setText("and loses 2 life"); + this.getSpellAbility().addEffect(effect); + } + + public PainfulLesson(final PainfulLesson card) { + super(card); + } + + @Override + public PainfulLesson copy() { + return new PainfulLesson(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java b/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java new file mode 100644 index 0000000000..951c443e13 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java @@ -0,0 +1,63 @@ +/* + * 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.cards.p; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.discard.DiscardControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author fireshoes + */ +public class PullFromTomorrow extends CardImpl { + + public PullFromTomorrow(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{U}"); + + // Draw X cards, then discard a card. + getSpellAbility().addEffect(new DrawCardSourceControllerEffect(new ManacostVariableValue())); + Effect effect = new DiscardControllerEffect(1); + effect.setText(", then discard a card"); + getSpellAbility().addEffect(effect); + } + + public PullFromTomorrow(final PullFromTomorrow card) { + super(card); + } + + @Override + public PullFromTomorrow copy() { + return new PullFromTomorrow(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/ReduceRubble.java b/Mage.Sets/src/mage/cards/r/ReduceRubble.java new file mode 100644 index 0000000000..299c1ca41f --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ReduceRubble.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.cards.r; + +import java.util.UUID; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.filter.common.FilterLandPermanent; +import mage.target.TargetPermanent; +import mage.target.TargetSpell; + +/** + * + * @author fireshoes + */ +public class ReduceRubble extends SplitCard { + + public ReduceRubble(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{2}{U}", "{2}{R}", false); + + // Reduce + // Counter target spell unless its controller pays {3}. + getLeftHalfCard().getSpellAbility().addTarget(new TargetSpell()); + getLeftHalfCard().getSpellAbility().addEffect(new CounterUnlessPaysEffect(new GenericManaCost(3))); + + // Rubble + // Up to three target lands don't untap during their controller's next untap step. + ((CardImpl)(getRightHalfCard())).addAbility(new AftermathAbility()); + Effect effect = new DontUntapInControllersNextUntapStepTargetEffect(); + effect.setText("Up to three target lands don't untap during their controller's next untap step"); + getRightHalfCard().getSpellAbility().addEffect(effect); + getRightHalfCard().getSpellAbility().addTarget(new TargetPermanent(0, 3, new FilterLandPermanent(), false)); + } + + public ReduceRubble(final ReduceRubble card) { + super(card); + } + + @Override + public ReduceRubble copy() { + return new ReduceRubble(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RegalCaracal.java b/Mage.Sets/src/mage/cards/r/RegalCaracal.java new file mode 100644 index 0000000000..bc3cf77112 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RegalCaracal.java @@ -0,0 +1,89 @@ +/* + * 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.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.permanent.token.CatToken2; + +/** + * + * @author fireshoes + */ +public class RegalCaracal extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Cats"); + + static { + filter.add(new SubtypePredicate("Cat")); + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public RegalCaracal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); + + this.subtype.add("Cat"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Other Cats you control get +1/+1 and have lifelink. + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true)); + GainAbilityControlledEffect effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, filter, true); + effect.setText("and have lifelink"); + ability.addEffect(effect); + this.addAbility(ability); + + // When Regal Caracal enters the battlefield, create two 1/1 white Cat creature tokens with lifelink. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new CatToken2(), 2))); + } + + public RegalCaracal(final RegalCaracal card) { + super(card); + } + + @Override + public RegalCaracal copy() { + return new RegalCaracal(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TahCropElite.java b/Mage.Sets/src/mage/cards/t/TahCropElite.java new file mode 100644 index 0000000000..37a3ebf8f3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TahCropElite.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.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.keyword.ExertAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author fireshoes + */ +public class TahCropElite extends CardImpl { + + public TahCropElite(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + + this.subtype.add("Bird"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // You may exert Tah-Crop Elite as it attacks. When you do, creatures you control get +1/+1 until end of turn. + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new BoostControlledEffect(1, 1, Duration.EndOfTurn)); + this.addAbility(new ExertAbility(ability)); + } + + public TahCropElite(final TahCropElite card) { + super(card); + } + + @Override + public TahCropElite copy() { + return new TahCropElite(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java index 99026dce25..3c673bf04c 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java @@ -30,37 +30,26 @@ package mage.cards.t; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import mage.MageObject; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.CompoundCondition; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.SourceIsSpellCondition; -import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.effects.common.continuous.CastFromHandWithoutPayingManaCostEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.SplitCardHalf; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Layer; import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterNonlandCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; @@ -68,7 +57,6 @@ import mage.game.command.Emblem; import mage.game.events.DamagedEvent; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; diff --git a/Mage.Sets/src/mage/cards/t/TrialOfAmbition.java b/Mage.Sets/src/mage/cards/t/TrialOfAmbition.java new file mode 100644 index 0000000000..02a3f1e853 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TrialOfAmbition.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.cards.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.SacrificeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class TrialOfAmbition extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Cartouche"); + + static { + filter.add(new SubtypePredicate("Cartouche")); + } + + public TrialOfAmbition(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + + // When Trial of Ambition enters the battlefield, target opponent sacrifices a creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new SacrificeEffect(new FilterCreaturePermanent(), 1, "Target opponent")); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + + // When a Cartouche enters the battlefield under your control, return Trial of Ambition to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter, + "When a Cartouche enters the battlefield under your control, return {this} to its owner's hand")); + } + + public TrialOfAmbition(final TrialOfAmbition card) { + super(card); + } + + @Override + public TrialOfAmbition copy() { + return new TrialOfAmbition(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TrialOfSolidarity.java b/Mage.Sets/src/mage/cards/t/TrialOfSolidarity.java new file mode 100644 index 0000000000..27eb2fe928 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TrialOfSolidarity.java @@ -0,0 +1,84 @@ +/* + * 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.cards.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +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.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author fireshoes + */ +public class TrialOfSolidarity extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Cartouche"); + + static { + filter.add(new SubtypePredicate("Cartouche")); + } + + public TrialOfSolidarity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + + // When Trial of Solidarity enters the battlefield, creatures you control get +2/+1 and gain vigilance until end of turn. + Effect effect = new BoostControlledEffect(2, 1, Duration.EndOfTurn, new FilterCreaturePermanent()); + effect.setText("creatures you control get +2/+1"); + Ability ability = new EntersBattlefieldTriggeredAbility(effect); + effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent()); + effect.setText(" and gain vigilance until end of turn"); + ability.addEffect(effect); + this.addAbility(ability); + + // When a Cartouche enters the battlefield under you control, return Trial of Solidarity to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter, + "When a Cartouche enters the battlefield under your control, return {this} to its owner's hand")); + } + + public TrialOfSolidarity(final TrialOfSolidarity card) { + super(card); + } + + @Override + public TrialOfSolidarity copy() { + return new TrialOfSolidarity(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TrialOfStrength.java b/Mage.Sets/src/mage/cards/t/TrialOfStrength.java new file mode 100644 index 0000000000..649c3ac341 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TrialOfStrength.java @@ -0,0 +1,73 @@ +/* + * 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.cards.t; + +import java.util.UUID; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.permanent.token.BeastToken3; + +/** + * + * @author fireshoes + */ +public class TrialOfStrength extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Cartouche"); + + static { + filter.add(new SubtypePredicate("Cartouche")); + } + + public TrialOfStrength(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + + // When Trial of Strength enters the battlefield, create a 4/2 green Beast creature token. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new BeastToken3()))); + + // When a Cartouche enters the battlefield under your control, return Trial of Strength to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter, + "When a Cartouche enters the battlefield under your control, return {this} to its owner's hand")); + } + + public TrialOfStrength(final TrialOfStrength card) { + super(card); + } + + @Override + public TrialOfStrength copy() { + return new TrialOfStrength(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TrialOfZeal.java b/Mage.Sets/src/mage/cards/t/TrialOfZeal.java new file mode 100644 index 0000000000..8665ee809e --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TrialOfZeal.java @@ -0,0 +1,79 @@ +/* + * 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.cards.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author fireshoes + */ +public class TrialOfZeal extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Cartouche"); + + static { + filter.add(new SubtypePredicate("Cartouche")); + } + + public TrialOfZeal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + + // When Trial of Zeal enters the battlefield, it deals 3 damage to target creature or player. + Effect effect = new DamageTargetEffect(3); + effect.setText("it deals 3 damage to target creature an opponent controls"); + Ability ability = new EntersBattlefieldTriggeredAbility(effect); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + + // When a Cartouche enters the battlefield under your control, return Trial of Zeal to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter, + "When a Cartouche enters the battlefield under your control, return {this} to its owner's hand")); + } + + public TrialOfZeal(final TrialOfZeal card) { + super(card); + } + + @Override + public TrialOfZeal copy() { + return new TrialOfZeal(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/Unburden.java b/Mage.Sets/src/mage/cards/u/Unburden.java index 136aafbd74..b6acd7fbfd 100644 --- a/Mage.Sets/src/mage/cards/u/Unburden.java +++ b/Mage.Sets/src/mage/cards/u/Unburden.java @@ -48,6 +48,7 @@ public class Unburden extends CardImpl { // Target player discards two cards. this.getSpellAbility().addEffect(new DiscardTargetEffect(2)); this.getSpellAbility().addTarget(new TargetPlayer()); + // Cycling {2} this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); } diff --git a/Mage.Sets/src/mage/cards/w/WatchfulNaga.java b/Mage.Sets/src/mage/cards/w/WatchfulNaga.java new file mode 100644 index 0000000000..3c98e18bda --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WatchfulNaga.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.cards.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.ExertAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author fireshoes + */ +public class WatchfulNaga extends CardImpl { + + public WatchfulNaga(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Naga"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // You may exert Watchful Naga as it attacks. When you do, draw a card. + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)); + this.addAbility(new ExertAbility(ability)); + } + + public WatchfulNaga(final WatchfulNaga card) { + super(card); + } + + @Override + public WatchfulNaga copy() { + return new WatchfulNaga(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Amonkhet.java b/Mage.Sets/src/mage/sets/Amonkhet.java index 5b77ea5f65..46986e5f57 100644 --- a/Mage.Sets/src/mage/sets/Amonkhet.java +++ b/Mage.Sets/src/mage/sets/Amonkhet.java @@ -72,19 +72,28 @@ public class Amonkhet extends ExpansionSet { cards.add(new SetCardInfo("Angler Drake", 41, Rarity.UNCOMMON, mage.cards.a.AnglerDrake.class)); cards.add(new SetCardInfo("Anointer Priest", 3, Rarity.COMMON, mage.cards.a.AnointerPriest.class)); cards.add(new SetCardInfo("Archfiend of Ifnir", 78, Rarity.RARE, mage.cards.a.ArchfiendOfIfnir.class)); + cards.add(new SetCardInfo("As Foretold", 42, Rarity.MYTHIC, mage.cards.a.AsForetold.class)); cards.add(new SetCardInfo("Aven Mindcensor", 5, Rarity.RARE, mage.cards.a.AvenMindcensor.class)); cards.add(new SetCardInfo("Bontu's Monument", 225, Rarity.UNCOMMON, mage.cards.b.BontusMonument.class)); cards.add(new SetCardInfo("Canyon Slough", 239, Rarity.RARE, mage.cards.c.CanyonSlough.class)); + cards.add(new SetCardInfo("Cartouche of Ambition", 83, Rarity.COMMON, mage.cards.c.CartoucheOfAmbition.class)); + cards.add(new SetCardInfo("Cartouche of Knowledge", 45, Rarity.COMMON, mage.cards.c.CartoucheOfKnowledge.class)); cards.add(new SetCardInfo("Cartouche of Solidarity", 7, Rarity.COMMON, mage.cards.c.CartoucheOfSolidarity.class)); + cards.add(new SetCardInfo("Cartouche of Zeal", 124, Rarity.COMMON, mage.cards.c.CartoucheOfZeal.class)); cards.add(new SetCardInfo("Cast Out", 8, Rarity.UNCOMMON, mage.cards.c.CastOut.class)); + cards.add(new SetCardInfo("Censor", 46, Rarity.UNCOMMON, mage.cards.c.Censor.class)); + cards.add(new SetCardInfo("Champion of Rhonas", 159, Rarity.RARE, mage.cards.c.ChampionOfRhonas.class)); cards.add(new SetCardInfo("Channeler Initiate", 160, Rarity.RARE, mage.cards.c.ChannelerInitiate.class)); cards.add(new SetCardInfo("Colossapede", 161, Rarity.COMMON, mage.cards.c.Colossapede.class)); cards.add(new SetCardInfo("Combat Celebrant", 125, Rarity.MYTHIC, mage.cards.c.CombatCelebrant.class)); + cards.add(new SetCardInfo("Companion of the Trials", 271, Rarity.UNCOMMON, mage.cards.c.CompanionOfTheTrials.class)); cards.add(new SetCardInfo("Consuming Fervor", 126, Rarity.UNCOMMON, mage.cards.c.ConsumingFervor.class)); cards.add(new SetCardInfo("Crocodile of the Crossing", 162, Rarity.UNCOMMON, mage.cards.c.CrocodileOfTheCrossing.class)); + cards.add(new SetCardInfo("Curator of Mysteries", 49, Rarity.RARE, mage.cards.c.CuratorOfMysteries.class)); cards.add(new SetCardInfo("Cursed Minotaur", 85, Rarity.COMMON, mage.cards.c.CursedMinotaur.class)); cards.add(new SetCardInfo("Cut // Ribbons", 223, Rarity.RARE, mage.cards.c.CutRibbons.class)); cards.add(new SetCardInfo("Decision Paralysis", 50, Rarity.COMMON, mage.cards.d.DecisionParalysis.class)); + cards.add(new SetCardInfo("Desiccated Naga", 276, Rarity.UNCOMMON, mage.cards.d.DesiccatedNaga.class)); cards.add(new SetCardInfo("Destined // Lead", 217, Rarity.UNCOMMON, mage.cards.d.DestinedLead.class)); cards.add(new SetCardInfo("Dissenter's Deliverance", 164, Rarity.COMMON, mage.cards.d.DissentersDeliverance.class)); cards.add(new SetCardInfo("Djeru's Resolve", 11, Rarity.COMMON, mage.cards.d.DjerusResolve.class)); @@ -96,6 +105,7 @@ public class Amonkhet extends ExpansionSet { cards.add(new SetCardInfo("Fetid Pools", 243, Rarity.RARE, mage.cards.f.FetidPools.class)); cards.add(new SetCardInfo("Flameblade Adept", 131, Rarity.UNCOMMON, mage.cards.f.FlamebladeAdept.class)); cards.add(new SetCardInfo("Fling", 132, Rarity.COMMON, mage.cards.f.Fling.class)); + cards.add(new SetCardInfo("Floodwaters", 53, Rarity.COMMON, mage.cards.f.Floodwaters.class)); cards.add(new SetCardInfo("Forest", 254, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Forest", 267, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Forest", 268, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); @@ -103,11 +113,16 @@ public class Amonkhet extends ExpansionSet { cards.add(new SetCardInfo("Foul Orchard", 279, Rarity.COMMON, mage.cards.f.FoulOrchard.class)); cards.add(new SetCardInfo("Giant Spider", 166, Rarity.COMMON, mage.cards.g.GiantSpider.class)); cards.add(new SetCardInfo("Gideon of the Trials", 14, Rarity.MYTHIC, mage.cards.g.GideonOfTheTrials.class)); + cards.add(new SetCardInfo("Gideon's Resolve", 272, Rarity.RARE, mage.cards.g.GideonsResolve.class)); cards.add(new SetCardInfo("Gideon, Martial Paragon", 270, Rarity.MYTHIC, mage.cards.g.GideonMartialParagon.class)); + cards.add(new SetCardInfo("Glory-Bound Initiate", 16, Rarity.RARE, mage.cards.g.GloryBoundInitiate.class)); + cards.add(new SetCardInfo("Glorybringer", 174, Rarity.RARE, mage.cards.g.Glorybringer.class)); cards.add(new SetCardInfo("Graceful Cat", 273, Rarity.COMMON, mage.cards.g.GracefulCat.class)); cards.add(new SetCardInfo("Gravedigger", 93, Rarity.UNCOMMON, mage.cards.g.Gravedigger.class)); cards.add(new SetCardInfo("Hazoret the Fervent", 136, Rarity.MYTHIC, mage.cards.h.HazoretTheFervent.class)); + cards.add(new SetCardInfo("Hazoret's Favor", 137, Rarity.RARE, mage.cards.h.HazoretsFavor.class)); cards.add(new SetCardInfo("Hazoret's Monument", 229, Rarity.UNCOMMON, mage.cards.h.HazoretsMonument.class)); + cards.add(new SetCardInfo("Honored Hydra", 172, Rarity.RARE, mage.cards.h.HonoredHydra.class)); cards.add(new SetCardInfo("Hyena Pack", 139, Rarity.COMMON, mage.cards.h.HyenaPack.class)); cards.add(new SetCardInfo("Impeccable Timing", 18, Rarity.COMMON, mage.cards.i.ImpeccableTiming.class)); cards.add(new SetCardInfo("In Oketra's Name", 19, Rarity.COMMON, mage.cards.i.InOketrasName.class)); @@ -120,10 +135,13 @@ public class Amonkhet extends ExpansionSet { cards.add(new SetCardInfo("Kefnet the Mindful", 59, Rarity.MYTHIC, mage.cards.k.KefnetTheMindful.class)); cards.add(new SetCardInfo("Kefnet's Monument", 231, Rarity.UNCOMMON, mage.cards.k.KefnetsMonument.class)); cards.add(new SetCardInfo("Lay Bare the Heart", 96, Rarity.UNCOMMON, mage.cards.l.LayBareTheHeart.class)); + cards.add(new SetCardInfo("Liliana's Mastery", 98, Rarity.RARE, mage.cards.l.LilianasMastery.class)); + cards.add(new SetCardInfo("Liliana's Influence", 277, Rarity.RARE, mage.cards.l.LilianasInfluence.class)); cards.add(new SetCardInfo("Liliana, Death Wielder", 274, Rarity.MYTHIC, mage.cards.l.LilianaDeathWielder.class)); cards.add(new SetCardInfo("Liliana, Death's Majesty", 97, Rarity.MYTHIC, mage.cards.l.LilianaDeathsMajesty.class)); cards.add(new SetCardInfo("Limits of Solidarity", 140, Rarity.UNCOMMON, mage.cards.l.LimitsOfSolidarity.class)); cards.add(new SetCardInfo("Magma Spray", 141, Rarity.COMMON, mage.cards.m.MagmaSpray.class)); + cards.add(new SetCardInfo("Manglehorn", 175, Rarity.UNCOMMON, mage.cards.m.Manglehorn.class)); cards.add(new SetCardInfo("Miasma Mummy", 100, Rarity.COMMON, mage.cards.m.MiasmaMummy.class)); cards.add(new SetCardInfo("Mighty Leap", 20, Rarity.COMMON, mage.cards.m.MightyLeap.class)); cards.add(new SetCardInfo("Mountain", 253, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); @@ -131,10 +149,14 @@ public class Amonkhet extends ExpansionSet { cards.add(new SetCardInfo("Mountain", 265, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Mountain", 266, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Mouth // Feed", 214, Rarity.RARE, mage.cards.m.MouthFeed.class)); + cards.add(new SetCardInfo("Neheb, the Worthy", 203, Rarity.RARE, mage.cards.n.NehebTheWorthy.class)); + cards.add(new SetCardInfo("Never // Return", 212, Rarity.RARE, mage.cards.n.NeverReturn.class)); cards.add(new SetCardInfo("Nimble-Blade Khenra", 145, Rarity.COMMON, mage.cards.n.NimbleBladeKhenra.class)); + cards.add(new SetCardInfo("Oketra the True", 21, Rarity.MYTHIC, mage.cards.o.OketraTheTrue.class)); cards.add(new SetCardInfo("Oketra's Monument", 233, Rarity.UNCOMMON, mage.cards.o.OketrasMonument.class)); cards.add(new SetCardInfo("Onward // Victory", 218, Rarity.UNCOMMON, mage.cards.o.OnwardVictory.class)); cards.add(new SetCardInfo("Oracle's Vault", 234, Rarity.RARE, mage.cards.o.OraclesVault.class)); + cards.add(new SetCardInfo("Painful Lesson", 102, Rarity.COMMON, mage.cards.p.PainfulLesson.class)); cards.add(new SetCardInfo("Plains", 250, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Plains", 255, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Plains", 256, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); @@ -142,7 +164,10 @@ public class Amonkhet extends ExpansionSet { cards.add(new SetCardInfo("Pouncing Cheetah", 179, Rarity.COMMON, mage.cards.p.PouncingCheetah.class)); cards.add(new SetCardInfo("Prepared // Fight", 220, Rarity.RARE, mage.cards.p.PreparedFight.class)); cards.add(new SetCardInfo("Prowling Serpopard", 180, Rarity.RARE, mage.cards.p.ProwlingSerpopard.class)); + cards.add(new SetCardInfo("Pull from Tomorrow", 65, Rarity.RARE, mage.cards.p.PullFromTomorrow.class)); cards.add(new SetCardInfo("Rags // Riches", 222, Rarity.RARE, mage.cards.r.RagsRiches.class)); + cards.add(new SetCardInfo("Reduce // Rubble", 216, Rarity.UNCOMMON, mage.cards.r.ReduceRubble.class)); + cards.add(new SetCardInfo("Regal Caracal", 24, Rarity.RARE, mage.cards.r.RegalCaracal.class)); cards.add(new SetCardInfo("Renewed Faith", 25, Rarity.UNCOMMON, mage.cards.r.RenewedFaith.class)); cards.add(new SetCardInfo("Rhonas's Monument", 236, Rarity.UNCOMMON, mage.cards.r.RhonassMonument.class)); cards.add(new SetCardInfo("Sacred Cat", 27, Rarity.COMMON, mage.cards.s.SacredCat.class)); @@ -158,11 +183,18 @@ public class Amonkhet extends ExpansionSet { cards.add(new SetCardInfo("Swamp", 261, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Swamp", 263, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Tah-Crop Elite", 31, Rarity.COMMON, mage.cards.t.TahCropElite.class)); cards.add(new SetCardInfo("Tattered Mummy", 278, Rarity.COMMON, mage.cards.t.TatteredMummy.class)); cards.add(new SetCardInfo("Temmet, Vizier of Naktamun", 207, Rarity.RARE, mage.cards.t.TemmetVizierOfNaktamun.class)); + cards.add(new SetCardInfo("Trial of Ambition", 113, Rarity.UNCOMMON, mage.cards.t.TrialOfAmbition.class)); cards.add(new SetCardInfo("Trial of Knowledge", 73, Rarity.UNCOMMON, mage.cards.t.TrialOfKnowledge.class)); + cards.add(new SetCardInfo("Trial of Solidarity", 34, Rarity.UNCOMMON, mage.cards.t.TrialOfSolidarity.class)); + cards.add(new SetCardInfo("Trial of Strength", 191, Rarity.UNCOMMON, mage.cards.t.TrialOfStrength.class)); + cards.add(new SetCardInfo("Trial of Zeal", 152, Rarity.UNCOMMON, mage.cards.t.TrialOfZeal.class)); cards.add(new SetCardInfo("Trueheart Duelist", 35, Rarity.UNCOMMON, mage.cards.t.TrueheartDuelist.class)); + cards.add(new SetCardInfo("Unburden", 114, Rarity.COMMON, mage.cards.u.Unburden.class)); cards.add(new SetCardInfo("Unwavering Initiate", 36, Rarity.COMMON, mage.cards.u.UnwaveringInitiate.class)); + cards.add(new SetCardInfo("Watchful Naga", 193, Rarity.UNCOMMON, mage.cards.w.WatchfulNaga.class)); cards.add(new SetCardInfo("Winged Shepherd", 39, Rarity.COMMON, mage.cards.w.WingedShepherd.class)); } diff --git a/Mage.Sets/src/mage/sets/GameDay.java b/Mage.Sets/src/mage/sets/GameDay.java index 120200f18c..dc77cc23e5 100644 --- a/Mage.Sets/src/mage/sets/GameDay.java +++ b/Mage.Sets/src/mage/sets/GameDay.java @@ -61,6 +61,7 @@ public class GameDay extends ExpansionSet { cards.add(new SetCardInfo("Elite Inquisitor", 13, Rarity.RARE, mage.cards.e.EliteInquisitor.class)); cards.add(new SetCardInfo("Essence Extraction", 55, Rarity.UNCOMMON, mage.cards.e.EssenceExtraction.class)); cards.add(new SetCardInfo("Firemane Avenger", 24, Rarity.RARE, mage.cards.f.FiremaneAvenger.class)); + cards.add(new SetCardInfo("Glorybringer", 59, Rarity.RARE, mage.cards.g.Glorybringer.class)); cards.add(new SetCardInfo("Goblin Diplomats", 29, Rarity.RARE, mage.cards.g.GoblinDiplomats.class)); cards.add(new SetCardInfo("Hall of Triumph", 36, Rarity.RARE, mage.cards.h.HallOfTriumph.class)); cards.add(new SetCardInfo("Heir of the Wilds", 37, Rarity.UNCOMMON, mage.cards.h.HeirOfTheWilds.class)); diff --git a/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java b/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java index 6798cc2400..18b783f003 100644 --- a/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java +++ b/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java @@ -69,9 +69,11 @@ public class MasterpieceSeriesAmonkhet extends ExpansionSet { cards.add(new SetCardInfo("Entomb", 23, Rarity.SPECIAL, mage.cards.e.Entomb.class)); cards.add(new SetCardInfo("Force of Will", 14, Rarity.SPECIAL, mage.cards.f.ForceOfWill.class)); cards.add(new SetCardInfo("Hazoret the Fervent", 27, Rarity.SPECIAL, mage.cards.h.HazoretTheFervent.class)); + cards.add(new SetCardInfo("Kefnet the Mindful", 15, Rarity.SPECIAL, mage.cards.k.KefnetTheMindful.class)); cards.add(new SetCardInfo("Loyal Retainers", 4, Rarity.SPECIAL, mage.cards.l.LoyalRetainers.class)); cards.add(new SetCardInfo("Maelstrom Pulse", 29, Rarity.SPECIAL, mage.cards.m.MaelstromPulse.class)); cards.add(new SetCardInfo("Mind Twist", 24, Rarity.SPECIAL, mage.cards.m.MindTwist.class)); + cards.add(new SetCardInfo("Oketra the True", 5, Rarity.SPECIAL, mage.cards.o.OketraTheTrue.class)); cards.add(new SetCardInfo("Pact of Negation", 16, Rarity.SPECIAL, mage.cards.p.PactOfNegation.class)); cards.add(new SetCardInfo("Spell Pierce", 17, Rarity.SPECIAL, mage.cards.s.SpellPierce.class)); cards.add(new SetCardInfo("Stifle", 18, Rarity.SPECIAL, mage.cards.s.Stifle.class)); diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 1f3365e3c6..ca4f014e73 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -286,6 +286,17 @@ public abstract class AbilityImpl implements Ability { } } + // 117.6. Some mana costs contain no mana symbols. This represents an unpayable cost. An ability can + // also have an unpayable cost if its cost is based on the mana cost of an object with no mana cost. + // Attempting to cast a spell or activate an ability that has an unpayable cost is a legal action. + // However, attempting to pay an unpayable cost is an illegal action. + // + // We apply this now, *AFTER* the user has made the choice to pay an alternative cost for the + // spell. You can also still cast a spell with an unplayable cost by... not paying it's mana cost. + if (getAbilityType() == AbilityType.SPELL && getManaCostsToPay().isEmpty() && !noMana) { + return false; + } + // 20121001 - 601.2b // If the spell has a variable cost that will be paid as it's being cast (such as an {X} in // its mana cost; see rule 107.3), the player announces the value of that variable. diff --git a/Mage/src/main/java/mage/abilities/common/CycleOrDiscardControllerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/CycleOrDiscardControllerTriggeredAbility.java new file mode 100644 index 0000000000..e6f0940bf7 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/CycleOrDiscardControllerTriggeredAbility.java @@ -0,0 +1,69 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.abilities.common; + +import mage.constants.Zone; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author fireshoes + */ +public class CycleOrDiscardControllerTriggeredAbility extends TriggeredAbilityImpl { + + public CycleOrDiscardControllerTriggeredAbility(Effect effect, boolean optional) { + super(Zone.BATTLEFIELD, effect, optional); + } + + public CycleOrDiscardControllerTriggeredAbility(final CycleOrDiscardControllerTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DISCARDED_CARD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getPlayerId().equals(controllerId); + } + + @Override + public String getRule() { + return "Whenever you cycle or discard a card, " + super.getRule(); + } + + @Override + public CycleOrDiscardControllerTriggeredAbility copy() { + return new CycleOrDiscardControllerTriggeredAbility(this); + } +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/EffectImpl.java b/Mage/src/main/java/mage/abilities/effects/EffectImpl.java index 89db5169f8..c0117cff6b 100644 --- a/Mage/src/main/java/mage/abilities/effects/EffectImpl.java +++ b/Mage/src/main/java/mage/abilities/effects/EffectImpl.java @@ -61,8 +61,8 @@ public abstract class EffectImpl implements Effect { public EffectImpl(final EffectImpl effect) { this.id = effect.id; this.outcome = effect.outcome; - this.effectType = effect.effectType; this.staticText = effect.staticText; + this.effectType = effect.effectType; this.targetPointer = effect.targetPointer.copy(); if (effect.values != null) { values = new HashMap<>(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java index 0f1ca827f6..a97b997d28 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/FightTargetSourceEffect.java @@ -30,7 +30,6 @@ package mage.abilities.effects.common; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; -import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; diff --git a/Mage/src/main/java/mage/game/permanent/token/BeastToken3.java b/Mage/src/main/java/mage/game/permanent/token/BeastToken3.java new file mode 100644 index 0000000000..450a8640ba --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/BeastToken3.java @@ -0,0 +1,65 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; + +/** + * + * @author fireshoes + */ +public class BeastToken3 extends Token { + + public BeastToken3() { + this(null, 0); + } + + public BeastToken3(String setCode) { + this(setCode, 0); + } + + public BeastToken3(String setCode, int tokenType) { + super("Beast", "4/2 green Beast creature token"); + setOriginalExpansionSetCode("AKH"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add("Beast"); + power = new MageInt(4); + toughness = new MageInt(2); + } + + public BeastToken3(final BeastToken3 token) { + super(token); + } + + @Override + public BeastToken3 copy() { + return new BeastToken3(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/CatToken2.java b/Mage/src/main/java/mage/game/permanent/token/CatToken2.java new file mode 100644 index 0000000000..2e664ec2d5 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/CatToken2.java @@ -0,0 +1,59 @@ +/* +* 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.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.LifelinkAbility; +import mage.constants.CardType; + +/** + * + * @author fireshoes + */ +public class CatToken2 extends Token { + + public CatToken2() { + this(null, 0); + } + + public CatToken2(String setCode) { + this(setCode, 0); + } + + public CatToken2(String setCode, int tokenType) { + super("Cat", "1/1 white Cat creature token with lifelink"); + setOriginalExpansionSetCode("AKH"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add("Cat"); + power = new MageInt(1); + toughness = new MageInt(1); + addAbility(LifelinkAbility.getInstance()); + } +} diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index dae0698619..a346270c3a 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1281,9 +1281,6 @@ public abstract class PlayerImpl implements Player, Serializable { if (Zone.GRAVEYARD == zone && canPlayCardsFromGraveyard()) { for (ActivatedAbility ability : candidateAbilites.getPlayableAbilities(Zone.HAND)) { if (canUse || ability.getAbilityType() == AbilityType.SPECIAL_ACTION) { - if (ability.getManaCosts().isEmpty() && ability.getCosts().isEmpty() && ability instanceof SpellAbility) { - continue; // You can't play spells from graveyard that have no costs - } if (ability.canActivate(playerId, game)) { output.put(ability.getId(), ability); } @@ -1293,9 +1290,6 @@ public abstract class PlayerImpl implements Player, Serializable { if (zone != Zone.BATTLEFIELD && game.getContinuousEffects().asThough(object.getId(), AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, this.getId(), game)) { for (Ability ability : candidateAbilites) { if (canUse || ability.getAbilityType() == AbilityType.SPECIAL_ACTION) { - if (ability.getManaCosts().isEmpty() && ability.getCosts().isEmpty() && ability instanceof SpellAbility && !(Objects.equals(ability.getSourceId(), getCastSourceIdWithAlternateMana()))) { - continue; // You can't play spells that have no costs, unless you can play them without paying their mana costs - } ability.setControllerId(this.getId()); if (ability instanceof ActivatedAbility && ability.getZone().match(Zone.HAND) && ((ActivatedAbility) ability).canActivate(playerId, game)) { diff --git a/Utils/gen-list-implemented-cards-for-set.pl b/Utils/gen-list-implemented-cards-for-set.pl index 2e330ae0f4..664b6077e5 100755 --- a/Utils/gen-list-implemented-cards-for-set.pl +++ b/Utils/gen-list-implemented-cards-for-set.pl @@ -67,7 +67,7 @@ my $toPrint = ''; foreach my $card (sort cardSort @setCards) { my $className = toCamelCase(@{$card}[0]); - my $currentFileName = "../Mage.Sets/src/mage/sets/" . $knownSets{$setName} . "/" . $className . ".java"; + my $currentFileName = "../Mage.Sets/src/mage/cards/" . lc(substr($className, 0, 1)) . "/" . $className . ".java"; if (-e $currentFileName) { if ($toPrint) { $toPrint .= "\n"; diff --git a/Utils/gen-list-unimplemented-cards-for-set.pl b/Utils/gen-list-unimplemented-cards-for-set.pl index a01e5662e8..15df889f21 100755 --- a/Utils/gen-list-unimplemented-cards-for-set.pl +++ b/Utils/gen-list-unimplemented-cards-for-set.pl @@ -94,7 +94,7 @@ foreach my $card (sort cardSort @setCards) { $cardNames {@{$card}[0]} = 1; - my $currentFileName = "../Mage.Sets/src/mage/sets/" . $knownSets{$setName} . "/" . $className . ".java"; + my $currentFileName = "../Mage.Sets/src/mage/cards/" . lc(substr($className, 0, 1)) . "/" . $className . ".java"; if(! -e $currentFileName) { $cardNames {@{$card}[0]} = 0; if ($toPrint) { diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 706a1ce446..600cbb5fb1 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -30009,6 +30009,7 @@ Austere Command|Masterpiece Series Amonkhet|1|Special|{4}{W}{W}|Sorcery|||Choose Aven Mindcensor|Masterpiece Series Amonkhet|2|Special|{2}{W}|Creature - Bird Wizard|2|1|Flash$Flying$If an opponent would search a library, that player search the top four cards of that library instead.| Containment Priest|Masterpiece Series Amonkhet|3|Special|{1}{W}|Creature - Human Cleric|2|2|Flash$If a nontoken creature would enter the battlefield and it wasn't cast, exile it instead.| Loyal Retainers|Masterpiece Series Amonkhet|4|Special|{2}{W}|Creature - Human Advisor|1|1|Sacrifice Loyal Retainers: Return target legendary creature card from your graveyard to the battlefield. Activate this ability only during your turn, before attackers are declared.| +Oketra the True|Masterpiece Series Amonkhet|5|Special|{3}{W}|Legendary Creature - God|3|6|Double strike, indestructible$Oketra the True can't attack or block unless you control at least three other creatures.${3}{W}: Create a 1/1 white Warrior creature token with vigilance.| Worship|Masterpiece Series Amonkhet|6|Special|{3}{W}|Enchantment|||If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instant.| Wrath of God|Masterpiece Series Amonkhet|7|Special|{2}{W}{W}|Sorcery|||Destroy all creatures. They can't be regenerated.| Consecrated Sphinx|Masterpiece Series Amonkhet|8|Special|{4}{U}{U}|Creature - Sphinx|4|6|Flying$Whenever an opponent draws a card, you may draw two cards.| @@ -30018,6 +30019,7 @@ Cryptic Command|Masterpiece Series Amonkhet|11|Special|{1}{U}{U}{U}|Instant|||Ch Daze|Masterpiece Series Amonkhet|12|Special|{1}{U}|Instant|||You may return an Island you control to its owner's hand rather than pay Daze's mana cost.$Counter target spell unless its controller pays {1}.| Divert|Masterpiece Series Amonkhet|13|Special|{U}|Instant|||Change the target of target spell with a single target unless that spell's controller pays {2}.| Force of Will|Masterpiece Series Amonkhet|14|Special|{3}{U}{U}|Instant|||You may pay 1 life and exile a blue card from your hand rather than pay Force of Will's mana cost.$Counter target spell.| +Kefnet the Mindful|Masterpiece Series Amonkhet|15|Special|{2}{U}|Legendary Creature - God|5|5|Flying, indestructible$Kefnet the Mindful can't attack or block unless you have seven or more cards in hand.${3}{U}: Draw a card, then you may return a land you control to its owner's hand.| Pact of Negation|Masterpiece Series Amonkhet|16|Special|{0}|Instant|||Counter target spell.$At the beginning of your next upkeep, pay {3}{U}{U}. If you don't, you lose the game.| Spell Pierce|Masterpiece Series Amonkhet|17|Special|{U}|Instant|||Counter target noncreature spell unless its controller pays {2}.| Stifle|Masterpiece Series Amonkhet|18|Special|{U}|Instant|||Counter target activated or triggered ability.| @@ -30839,6 +30841,7 @@ Glory-Bound Initiate|Amonkhet|16|R|{1}{W}|Creature - Human Warrior|3|1|You may e Impeccable Timing|Amonkhet|18|C|{1}{W}|Instant|||Impeccable Timing deals 3 damage to target attacking or blocking creature.| In Oketra's Name|Amonkhet|19|C|{1}{W}|Instant|||Zombies you control get +2/+1 until end of turn. Other creatures you control get +1/+1 until end of turn.| Mighty Leap|Amonkhet|20|C|{1}{W}|Instant|||Target creature gets +2/+2 and gains flying until end of turn.| +Oketra the True|Amonkhet|21|M|{3}{W}|Legendary Creature - God|3|6|Double strike, indestructible$Oketra the True can't attack or block unless you control at least three other creatures.${3}{W}: Create a 1/1 white Warrior creature token with vigilance.| Regal Caracal|Amonkhet|24|R|{3}{W}{W}|Creature - Cat|3|3|Other Cats you control get +1/+1 and have lifelink.$When Regal Caracal enters the battlefield, create two 1/1 white Cat creature tokens with lifelink.| Renewed Faith|Amonkhet|25|U|{2}{W}|Instant|||You gain 6 life.$Cycling {1}{W}$When you cycle Renewed Faith, you may gain 2 life.| Sacred Cat|Amonkhet|27|C|{W}|Creature - Cat|1|1|Lifelink$Embalm {W}| @@ -30852,6 +30855,7 @@ Ancient Crab|Amonkhet|40|C|{1}{U}{U}|Creature - Crab|1|5|| Angler Drake|Amonkhet|41|U|{4}{U}{U}|Creature - Drake|4|4|Flying$When Angler Drake enters the battlefield, you may return target creature to its owner's hand.| As Foretold|Amonkhet|42|M|{2}{U}|Enchantment|||At the beginning of your upkeep, put a time counter on As Foretold.$Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on As Foretold.| Cartouche of Knowledge|Amonkhet|45|C|{1}{U}|Enchantment - Aura Cartouche|||Enchant creature you control$When Cartouche of Knowledge enters the battlefield, draw a card.$Enchanted creature gets +1/+1 and has flying.| +Censor|Amonkhet|46|U|{1}{U}|Instant|||Counter target spell unless its controller pays {1}.$Cycling {U}| Curator of Mysteries|Amonkhet|49|R|{2}{U}{U}|Creature - Sphinx|4|4|Flying$Whenever you cycle or discard another card, scry 1.$Cycling {U}| Decision Paralysis|Amonkhet|50|C|{3}{U}|Instant|||Tap up to two target creatures. Those creatures don't untap during their controller's next untap step.| Drake Haven|Amonkhet|51|R|{2}{U}|Enchantment|||When you cycle or discard a card, you may pay {1}. If you do, create a 2/2 blue Drake creature token with flying.| @@ -30859,6 +30863,7 @@ Essence Scatter|Amonkhet|52|C|{1}{U}|Instant|||Counter target creature spell.| Floodwaters|Amonkhet|53|C|{4}{U}{U}|Sorcery|||Return up to two target creatures to their owners' hands.$Cycling {2}| Kefnet the Mindful|Amonkhet|59|M|{2}{U}|Legendary Creature - God|5|5|Flying, indestructible$Kefnet the Mindful can't attack or block unless you have seven or more cards in hand.${3}{U}: Draw a card, then you may return a land you control to its owner's hand.| New Perspectives|Amonkhet|63|R|{5}{U}|Enchantment|||When New Perspectives enters the battlefield, draw three cards.$As long as you have seven or more cards in hand, you may pay {0} rather than pay cycling costs.| +Pull from Tomorrow|Amonkhet|65|R|{X}{U}{U}|Instant|||Draw X cards, then discard a card.| Scribe of the Mindful|Amonkhet|68|C|{2}{U}|Creature - Human Cleric|2|2|{1}, {T}, Sacrifice Scribe of the Mindful: Return target instant or sorcery card from your graveyard to your hand.| Trial of Knowledge|Amonkhet|73|U|{3}{U}|Enchantment|||When Trial of Knowledge enters the battlefield, draw three cards, then discard a card.$When a Cartouche enters the battlefield under your control, return Trial of Knowledge to its owner's hand.| Archfiend of Ifnir|Amonkhet|78|R|{3}{B}{B}|Creature - Demon|5|4|Flying$Whenever you cycle or discard another card, put a -1/-1 counter on each creature your opponents control.$Cycling {2}| @@ -30869,12 +30874,14 @@ Dune Beetle|Amonkhet|89|C|{1}{B}|Creature - Insect|1|4|| Gravedigger|Amonkhet|93|U|{3}{B}|Creature - Zombie|2|2|When Gravedigger enters the battlefield, you may return target creature card from your graveyard to your hand.| Lay Bare the Heart|Amonkhet|96|U|{1}{B}|Sorcery|||Target opponent reveals his or her hand. You choose a nonlegendary, nonland card from it. That player discards that card.| Liliana, Death's Majesty|Amonkhet|97|M|{3}{B}{B}|Planeswalker - Liliana|||+1: Create a 2/2 black Zombie creature token. Put the top two cards of your library into your graveyard.$-3: Return target creature card from your graveyard to the battlefield. That creature is a black Zombie in addition to its other colors and types.$-7: Destroy all non-Zombie creatures.| +Liliana's Mastery|Amonkhet|98|R|{3}{B}{B}|Enchantment|||Zombies you control get +1/+1.When Liliana's Mastery enters the battlefield, create two 2/2 black Zombie creature tokens.| Miasma Mummy|Amonkhet|100|C|{1}{B}|Creature - Zombie Jackal|2|2|When Miasma Mummy enters the battlefield, each player discards a card.| Nest of Scarabs|Amonkhet|101|U|{2}{B}|Enchantment|||Whenever you put one or more -1/-1 counters on a creature, create that many 1/1 black Insect tokens.| Painful Lesson|Amonkhet|102|C|{2}{B}|Sorcery|||Target player draws two cards and loses 2 life.| Scarab Feast|Amonkhet|106|C|{B}|Instant|||Exile up to three target cards from a single graveyard.$Cycling {B}| Splendid Agony|Amonkhet|109|C|{2}{B}|Instant|||Distribute two -1/-1 counters among one or two target creatures.| Trial of Ambition|Amonkhet|113|U|{1}{B}|Enchantment|||When Trial of Ambition enters the battlefield, target opponent sacrifices a creature.$When a Cartouche enters the battlefield under your control, return Trial of Ambition to its owner's hand.| +Unburden|Amonkhet|114|C|{1}{B}{B}|Sorcery|||Target player discards two cards.$Cycling {2}| Ahn-Crop Crasher|Amonkhet|117|U|{2}{R}|Creature - Minotaur Warrior|3|2|Haste$You may exert Ahn-Crop Crasher as it attacks. When you do, target creature can't block this turn.| Battlefield Scavenger|Amonkhet|118|U|{1}{R}|Creature - Jackal Rogue|2|2|You may exert Battlefield Scavenger as it attacks.$Whenever you exert a creature, you may discard a card. If you do, draw a card.| Cartouche of Zeal|Amonkhet|124|C|{R}|Enchantment - Aura Cartouche|||Enchant creature you control$When Cartouche of Zeal enters the battlefield, target creature can't block this turn.$Enchanted creature gets +1/+1 and has haste.| @@ -30889,37 +30896,47 @@ Limits of Solidarity|Amonkhet|140|U|{3}{R}|Sorcery|||Gain control of target crea Magma Spray|Amonkhet|141|C|{R}|Instant|||Magma Spray deals 2 damage to target creature. If that creature would die this turn, exile it instead.| Hyena Pack|Amonkhet|139|C|{2}{R}{R}|Creature - Hyena|3|4|| Nimble-Blade Khenra|Amonkhet|145|C|{1}{R}|Creature - Jackal Warrior|1|3|Prowess| -Soul-Scar Mage|Amonkhet|149|{R}|Creature - Human Wizard|1|2|Prowess$If a source you control would deal noncombat damage to a creature an opponent controls, put that many -1/-1 counters on that creature instead.| +Soul-Scar Mage|Amonkhet|149|R|{R}|Creature - Human Wizard|1|2|Prowess$If a source you control would deal noncombat damage to a creature an opponent controls, put that many -1/-1 counters on that creature instead.| Trial of Zeal|Amonkhet|152|U|{2}{R}|Enchantment|||When Trial of Zeal enters the battlefield, it deals 3 damage to target creature or player.$When a Cartouche enters the battlefield under your control, return Trial of Zeal to its owner's hand.| Cartouche of Strength|Amonkhet|158|C|{2}{G}|Enchantment - Aura Cartouche|||Enchant creature you control$When Cartouche of Strength enters the battlefield, you may have enchanted creature fight target creature an opponent controls.$Enchanted creature gets +1/+1 and has trample.| +Champion of Rhonas|Amonkhet|159|R|{3}{G}|Creature - Jackal Warrior|3|3|You may exert Champion of Rhonas as it attacks. When you do, you may put a creature card from your hand onto the battlefield.| Channeler Initiate|Amonkhet|160|R|{1}{G}|Creature - Human Druid|3|4|When Channeler Initiate enters the battlefield, put three -1/-1 counters on target creature you control.${T}, Remove a -1/-1 counter from Channeler Initiate: Add one mana of any color to your mana pool.| Colossapede|Amonkhet|161|C|{4}{G}|Creature - Insect|5|5|| Crocodile of the Crossing|Amonkhet|162|U|{3}{G}|Creature - Crocodile|5|4|Haste$When Crocodile of the Crossing enters the battlefield, put a -1/-1 counter on target creature you control.| Dissenter's Deliverance|Amonkhet|164|C|{1}{G}|Instant|||Destroy target artifact.$Cycling {G}| Exemplar of Strength|Amonkhet|165|U|{1}{G}|Creature - Human Warrior|4|4|When Exemplar of Strength enters the battlefield, put three -1/-1 counters on target creature you control.$Whenever Exemplar of Strength attacks, remove a -1/-1 counter from it. If you do, you gain 1 life.| Giant Spider|Amonkhet|166|C|{3}{G}|Creature - Spider|2|4|Reach| +Honored Hydra|Amonkhet|172|R|{5}{G}|Creature - Snake Hydra|6|6|Trample$Embalm {3}{G}| Manglehorn|Amonkhet|175|U|{2}{G}|Creature - Beast|2|2|When Manglehorn enters the battlefield, you may destroy target artifact.$Artifacts your opponents control enter the battlefield tapped.| Pouncing Cheetah|Amonkhet|179|C|{2}{G}|Creature - Cat|3|2|Flash| Prowling Serpopard|Amonkhet|180|R|{1}{G}{G}|Creature - Cat Snake|4|3|Prowling Serpopard can't be countered.$Creature spells you control can't be countered.| Sixth Sense|Amonkhet|187|U|{G}|Enchantment - Aura|||Enchant creature$Enchanted creature has "Whenever this creature deals combat damage to a player, you may draw a card."| Spidery Grasp|Amonkhet|188|C|{2}{G}|Instant|||Untap target creature. It gets +2/+4 and gains reach until end of turn.| Trial of Strength|Amonkhet|191|U|{2}{G}|Enchantment|||When Trial of Strength enters the battlefield, create a 4/2 green Beast creature token.$When a Cartouche enters the battlefield under your control, return Trial of Strength to its owner's hand.| +Vizier of the Menagerie|Amonkhet|192|M|{3}{G}|Creature - Naga Cleric|3|4|You may look at the top card of your library. (You may do this at any time)$You may cast the top card of your library if it's a creature card.$You may spend mana as though it were mana of any type to cast creature spells.| Watchful Naga|Amonkhet|193|U|{2}{G}|Creature - Naga Wizard|2|2|You may exert Watchful Naga as it attacks. When you do, draw a card.| Bounty of the Luxa|Amonkhet|196|R|{2}{G}{U}|Enchantment|||At the beginning of your precombat main phase, remove all flood counters from Bounty of the Luxa. If no counters were removed this way, put a flood counter on Bounty of the Luxa and draw a card. Otherwise, add {C}{G}{U} to your mana pool.| Hapatra, Vizier of Poisons|Amonkhet|199|R|{B}{G}|Legendary Creature - Human Cleric|2|2|Whenever Hapatra, Vizier of Poisons deals combat damage to a player, you may put a -1/-1 counter on target creature.$Whenever you put one or more -1/-1 counters on a creature, create a 1/1 green Snake creature token with deathtouch.| +Neheb, the Worthy|Amonkhet|203|R|{1}{B}{R}|Legendary Creature - Minotaur Warrior|2|2|First strike$Other Minotaurs you control have first strike.$As long as you have one or fewer cards in hand, Minotaurs you control get +2/+0.$Whenever Neheb, the Worthy deals combat damage to a player, each player discards a card.| Temmet, Vizier of Naktamun|Amonkhet|207|R|{W}{U}|Legendary Creature - Human Cleric|2|2|At the beginning of combat on your turn, target creature token you control gets +1/+1 until end of turn and can't be blocked this turn.$Embalm {3}{W}{U}| Dusk|Amonkhet|210a|R|{2}{W}{W}|Sorcery|||Destroy all creatures with power 3 or greater.| Dawn|Amonkhet|210b|R|{3}{W}{W}|Sorcery|||Aftermath (Cast this spell only from your graveyard. Then exile it.)$Return all creature cards with power 2 or less from your graveyard to your hand.| +Never|Amonkhet|212a|R|{1}{B}{B}|Sorcery|||Destroy target creature or planeswalker.| +Return|Amonkhet|212b|R|{3}{B}|Sorcery|||Aftermath$Exile target card from a graveyard. Create a 2/2 black Zombie creature token.| Insult|Amonkhet|213a|R|{2}{R}|Sorcery|||Damage can't be prevented this turn. If a source you control would deal damage this turn, it deals double that damage instead.| Injury|Amonkhet|213b|R|{2}{R}|Sorcery|||Aftermath$Injury deals 2 damage to target creature and 2 damage to target player.| Mouth|Amonkhet|214a|R|{2}{G}|Sorcery|||Create a 3/3 green Hippo creature token.| Feed|Amonkhet|214b|R|{3}{G}|Sorcery|||Aftermath$Draw a card for each creature you control with power 3 or greater.| +Reduce|Amonkhet|216a|U|{2}{U}|Instant|||Counter target spell unless its controller pays {3}.| +Rubble|Amonkhet|216b|U|{2}{R}|Sorcery|||Aftermath$Up to three target lands don't untap during their controller's next untap step.| Destined|Amonkhet|217a|U|{1}{B}|Instant|||Target creature gets +1/+0 and gains indestuctible until end of turn.| Lead|Amonkhet|217b|U|{3}{G}|Sorcery|||Aftermath (Cast this spell only from your graveyard. Then exile it.)$All creatures able to block target creature this turn do so.| Onward|Amonkhet|218a|U|{2}{R}|Instant|||Target creature gets +X/+0 until end of turn, where X is its power.| Victory|Amonkhet|218b|U|{2}{W}|Sorcery|||Aftermath$Target creature gains double strike until end of turn.| Prepared|Amonkhet|220a|R|{1}{W}|Instant|||Untap target creature. It gains +2/+2 and has lifelink until end of turn.| Fight|Amonkhet|220b|R|{3}{G}|Sorcery|||Target creature you control fights target an opponent controls.| +Failure|Amonkhet|221a|R|{1}{U}|Instant|||Return target spell to its owner's hand.| +Comply|Amonkhet|221b|R|{W}|Sorcery|||Aftermath$Choose a card name. Until your next turn, your opponents can't cast spells with the chosen name.| Rags|Amonkhet|222a|R|{2}{B}{B}|Sorcery|||All creatures get -2/-2 until end of turn.| Riches|Amonkhet|222b|R|{5}{U}{U}|Sorcery|Aftermath$Each opponent chooses a creature he or she controls. You gain control of those creatures.| Cut|Amonkhet|223a|R|{1}{R}|Sorcery|||Cut deals 4 damage to target creature.| @@ -30958,7 +30975,7 @@ Forest|Amonkhet|267|L||Basic Land - Forest|||| Forest|Amonkhet|268|L||Basic Land - Forest|||| Forest|Amonkhet|269|L||Basic Land - Forest|||| Gideon, Martial Paragon|Amonkhet|270|M|{4}{W}|Planeswalker - Gideon|||+2: Untap all creatures you control. Those creatures get +1/+1 until end of turn.$0: Until end of turn, Gideon, Martial Paragon, becomes a 5/5 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn.$-10: Creatures you control get +2/+2 until end of turn. Tap all creatures your opponents control.| -Champion of the Trials|Amonkhet|271|U|{2}{W}|Creature - Bird Soldier|2|2|Flying${1}{W}: Untap target creature. Activate this ability only if you control a Gideon planeswalker.| +Companion of the Trials|Amonkhet|271|U|{2}{W}|Creature - Bird Soldier|2|2|Flying${1}{W}: Untap target creature. Activate this ability only if you control a Gideon planeswalker.| Gideon's Resolve|Amonkhet|272|R|{4}{W}|Enchantment|||When Gideon's Resolve enters the battlefield, you may search your library and/or graveyard for a card named Gideon, Martial Paragon, reveal it, and put it into your hand. If you search your library this way, shuffle it.$Creature you control get +1/+1.| Graceful Cat|Amonkhet|273|C|{2}{W}|Creature - Cat|2|2|Whenever Graceful Cat attacks, it gets +1/+1 until end of turn.| Stone Quarry|Amonkhet|274|C||Land|||Stone Quarry enters the battlefield tapped.${T}: Add {R} or {W} to your mana pool.|