From f119965f461d9a11080b239263504bd4ce03325e Mon Sep 17 00:00:00 2001 From: Jeff Date: Mon, 10 Apr 2017 14:53:43 -0500 Subject: [PATCH 1/6] - Fixed cost of Greel, Mind Raker. --- Mage.Sets/src/mage/cards/g/GreelMindRaker.java | 4 ++++ 1 file changed, 4 insertions(+) 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); } From 1ce32eb24ecc3c2470e1856848a9ad7da2c753e1 Mon Sep 17 00:00:00 2001 From: Mark Langen Date: Sun, 9 Apr 2017 23:39:52 -0600 Subject: [PATCH 2/6] Fix a couple of the perl scripts to work properly with the cards.f.FirstLetter style card class reorg --- Utils/gen-list-implemented-cards-for-set.pl | 2 +- Utils/gen-list-unimplemented-cards-for-set.pl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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) { From b33e03862a8b863fbabce3f7766b3b6480b5c0bc Mon Sep 17 00:00:00 2001 From: Mark Langen Date: Sun, 9 Apr 2017 23:41:03 -0600 Subject: [PATCH 3/6] Work in progress changes to support As Foretold * Modifies how cards with no mana cost are handled. You can now begin to cast them if there is an AlternativeCost that would allow you to play them. --- Mage.Sets/src/mage/cards/a/AsForetold.java | 228 ++++++++++++++++++ Mage.Sets/src/mage/sets/Amonkhet.java | 1 + .../mage/abilities/effects/EffectImpl.java | 2 +- .../main/java/mage/players/PlayerImpl.java | 6 - 4 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/a/AsForetold.java 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/sets/Amonkhet.java b/Mage.Sets/src/mage/sets/Amonkhet.java index 5b77ea5f65..215df454a3 100644 --- a/Mage.Sets/src/mage/sets/Amonkhet.java +++ b/Mage.Sets/src/mage/sets/Amonkhet.java @@ -72,6 +72,7 @@ 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)); 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/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)) { From c22a8f717ea7ff00f463db49bb97b0b499f1a5f5 Mon Sep 17 00:00:00 2001 From: Mark Langen Date: Mon, 10 Apr 2017 16:10:40 -0600 Subject: [PATCH 4/6] Fix for problem introduced in 321f5597b72a78ec6420bdc81eee944f569517a1 * Fixes a problem introduced in the JInternalFrame -> JLayeredPane change where the AbilityPicker wouldn't show up. --- Mage.Client/src/main/java/mage/client/game/GamePanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); } From 2b08d5a101216f04efc0d89cd3a878513e7ebca5 Mon Sep 17 00:00:00 2001 From: Mark Langen Date: Mon, 10 Apr 2017 17:00:27 -0600 Subject: [PATCH 5/6] As Foretold Implemented * Final change to card casting code to support as foretold. Removed all of the "Can't cast cards with no mana cost" code from the earlier parts of the casting process and simplified it to just the PlayerImpl::canPlay check and one final check in the main AbilityImpl::activate code after alternative costs have been chosen. --- Mage/src/main/java/mage/abilities/AbilityImpl.java | 11 +++++++++++ 1 file changed, 11 insertions(+) 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. From 5fbcf759d6fd0fcba25884f8cca60d62d39be8c6 Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 10 Apr 2017 18:45:48 -0500 Subject: [PATCH 6/6] [ANK] Added 4/10 spoilers to mtg-cards-data.txt and implemented a many cards. --- .../src/mage/cards/c/CartoucheOfAmbition.java | 93 +++++++++++++ .../mage/cards/c/CartoucheOfKnowledge.java | 89 ++++++++++++ .../src/mage/cards/c/CartoucheOfZeal.java | 92 ++++++++++++ Mage.Sets/src/mage/cards/c/Censor.java | 66 +++++++++ .../src/mage/cards/c/ChampionOfRhonas.java | 67 +++++++++ .../mage/cards/c/CompanionOfTheTrials.java | 86 ++++++++++++ .../src/mage/cards/c/CuratorOfMysteries.java | 113 +++++++++++++++ .../src/mage/cards/d/DesiccatedNaga.java | 88 ++++++++++++ Mage.Sets/src/mage/cards/f/Floodwaters.java | 68 +++++++++ .../src/mage/cards/g/GideonsResolve.java | 74 ++++++++++ .../src/mage/cards/g/GloryBoundInitiate.java | 70 ++++++++++ Mage.Sets/src/mage/cards/g/Glorybringer.java | 90 ++++++++++++ Mage.Sets/src/mage/cards/h/HazoretsFavor.java | 112 +++++++++++++++ Mage.Sets/src/mage/cards/h/HerosDownfall.java | 14 +- Mage.Sets/src/mage/cards/h/HonoredHydra.java | 69 +++++++++ .../src/mage/cards/l/LilianasInfluence.java | 74 ++++++++++ .../src/mage/cards/l/LilianasMastery.java | 74 ++++++++++ Mage.Sets/src/mage/cards/m/Manglehorn.java | 121 ++++++++++++++++ .../src/mage/cards/n/NehebTheWorthy.java | 100 +++++++++++++ Mage.Sets/src/mage/cards/n/NeverReturn.java | 73 ++++++++++ Mage.Sets/src/mage/cards/o/OathOfChandra.java | 5 +- Mage.Sets/src/mage/cards/o/OketraTheTrue.java | 131 ++++++++++++++++++ Mage.Sets/src/mage/cards/o/OnwardVictory.java | 17 --- Mage.Sets/src/mage/cards/p/PainfulLesson.java | 64 +++++++++ .../src/mage/cards/p/PullFromTomorrow.java | 63 +++++++++ Mage.Sets/src/mage/cards/r/ReduceRubble.java | 75 ++++++++++ Mage.Sets/src/mage/cards/r/RegalCaracal.java | 89 ++++++++++++ Mage.Sets/src/mage/cards/t/TahCropElite.java | 71 ++++++++++ .../mage/cards/t/TamiyoFieldResearcher.java | 12 -- .../src/mage/cards/t/TrialOfAmbition.java | 77 ++++++++++ .../src/mage/cards/t/TrialOfSolidarity.java | 84 +++++++++++ .../src/mage/cards/t/TrialOfStrength.java | 73 ++++++++++ Mage.Sets/src/mage/cards/t/TrialOfZeal.java | 79 +++++++++++ Mage.Sets/src/mage/cards/u/Unburden.java | 1 + Mage.Sets/src/mage/cards/w/WatchfulNaga.java | 66 +++++++++ Mage.Sets/src/mage/sets/Amonkhet.java | 31 +++++ Mage.Sets/src/mage/sets/GameDay.java | 1 + .../mage/sets/MasterpieceSeriesAmonkhet.java | 2 + ...leOrDiscardControllerTriggeredAbility.java | 69 +++++++++ .../common/FightTargetSourceEffect.java | 1 - .../game/permanent/token/BeastToken3.java | 65 +++++++++ .../mage/game/permanent/token/CatToken2.java | 59 ++++++++ Utils/mtg-cards-data.txt | 21 ++- 43 files changed, 2744 insertions(+), 45 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java create mode 100644 Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java create mode 100644 Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java create mode 100644 Mage.Sets/src/mage/cards/c/Censor.java create mode 100644 Mage.Sets/src/mage/cards/c/ChampionOfRhonas.java create mode 100644 Mage.Sets/src/mage/cards/c/CompanionOfTheTrials.java create mode 100644 Mage.Sets/src/mage/cards/c/CuratorOfMysteries.java create mode 100644 Mage.Sets/src/mage/cards/d/DesiccatedNaga.java create mode 100644 Mage.Sets/src/mage/cards/f/Floodwaters.java create mode 100644 Mage.Sets/src/mage/cards/g/GideonsResolve.java create mode 100644 Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java create mode 100644 Mage.Sets/src/mage/cards/g/Glorybringer.java create mode 100644 Mage.Sets/src/mage/cards/h/HazoretsFavor.java create mode 100644 Mage.Sets/src/mage/cards/h/HonoredHydra.java create mode 100644 Mage.Sets/src/mage/cards/l/LilianasInfluence.java create mode 100644 Mage.Sets/src/mage/cards/l/LilianasMastery.java create mode 100644 Mage.Sets/src/mage/cards/m/Manglehorn.java create mode 100644 Mage.Sets/src/mage/cards/n/NehebTheWorthy.java create mode 100644 Mage.Sets/src/mage/cards/n/NeverReturn.java create mode 100644 Mage.Sets/src/mage/cards/o/OketraTheTrue.java create mode 100644 Mage.Sets/src/mage/cards/p/PainfulLesson.java create mode 100644 Mage.Sets/src/mage/cards/p/PullFromTomorrow.java create mode 100644 Mage.Sets/src/mage/cards/r/ReduceRubble.java create mode 100644 Mage.Sets/src/mage/cards/r/RegalCaracal.java create mode 100644 Mage.Sets/src/mage/cards/t/TahCropElite.java create mode 100644 Mage.Sets/src/mage/cards/t/TrialOfAmbition.java create mode 100644 Mage.Sets/src/mage/cards/t/TrialOfSolidarity.java create mode 100644 Mage.Sets/src/mage/cards/t/TrialOfStrength.java create mode 100644 Mage.Sets/src/mage/cards/t/TrialOfZeal.java create mode 100644 Mage.Sets/src/mage/cards/w/WatchfulNaga.java create mode 100644 Mage/src/main/java/mage/abilities/common/CycleOrDiscardControllerTriggeredAbility.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/BeastToken3.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/CatToken2.java 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/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..09884a5d52 100644 --- a/Mage.Sets/src/mage/sets/Amonkhet.java +++ b/Mage.Sets/src/mage/sets/Amonkhet.java @@ -75,16 +75,24 @@ public class Amonkhet extends ExpansionSet { 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 +104,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 +112,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 +134,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 +148,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 +163,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 +182,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/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/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/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.|