diff --git a/Mage.Sets/src/mage/cards/a/AmmitEternal.java b/Mage.Sets/src/mage/cards/a/AmmitEternal.java new file mode 100644 index 00000000000..16d1b5278ad --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AmmitEternal.java @@ -0,0 +1,42 @@ +package mage.cards.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SpellCastOpponentTriggeredAbility; +import mage.abilities.effects.common.RemoveAllCountersSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; + +public class AmmitEternal extends CardImpl { + + public AmmitEternal(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + subtype.add("Zombie"); + subtype.add("Crocodile"); + subtype.add("Demon"); + power = new MageInt(5); + toughness = new MageInt(5); + + // Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.) + this.addAbility(new AfflictAbility(3)); + + // Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal. + this.addAbility(new SpellCastOpponentTriggeredAbility(new AddCountersSourceEffect(CounterType.M1M1.createInstance()), false)); + + // Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new RemoveAllCountersSourceEffect(CounterType.M1M1), false)); + } + + public AmmitEternal(final AmmitEternal ammitEternal) { + super(ammitEternal); + } + + public AmmitEternal copy() { + return new AmmitEternal(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BanewhipPunisher.java b/Mage.Sets/src/mage/cards/b/BanewhipPunisher.java new file mode 100644 index 00000000000..e33df9b007d --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BanewhipPunisher.java @@ -0,0 +1,57 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.CounterPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +public class BanewhipPunisher extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with a -1/-1 counter on it"); + + static { + filter.add(new CounterPredicate(CounterType.M1M1)); + } + + public BanewhipPunisher(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + subtype.add("Human"); + subtype.add("Warrior"); + power = new MageInt(2); + toughness = new MageInt(2); + + // When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature. + Ability etbAbility = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance(1)), true); + etbAbility.addTarget(new TargetCreaturePermanent()); + this.addAbility(etbAbility); + + // {B}, sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it. + Ability destroyAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{B}")); + destroyAbility.addCost(new SacrificeSourceCost()); + destroyAbility.addTarget(new TargetPermanent(filter)); + this.addAbility(destroyAbility); + + } + + public BanewhipPunisher(final BanewhipPunisher banewhipPunisher) { + super(banewhipPunisher); + } + + public BanewhipPunisher copy() { + return new BanewhipPunisher(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java b/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java index 96f475d41f6..fc4e0ff04a3 100644 --- a/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java +++ b/Mage.Sets/src/mage/cards/g/GideonOfTheTrials.java @@ -27,13 +27,9 @@ */ package mage.cards.g; -import java.util.UUID; import mage.MageInt; - -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect; @@ -42,15 +38,14 @@ import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.common.FilterPlaneswalkerPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.events.GameEvent; +import mage.constants.CardType; +import mage.constants.Duration; import mage.game.command.emblems.GideonOfTheTrialsEmblem; import mage.game.permanent.token.Token; import mage.target.TargetPermanent; +import java.util.UUID; + /** * * @author JRHerlehy @@ -94,45 +89,6 @@ public class GideonOfTheTrials extends CardImpl { } } -class GideonOfTheTrialsCantLoseEffect extends ContinuousRuleModifyingEffectImpl { - - private static final FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("a Gideon planeswalker"); - - static { - filter.add(new SubtypePredicate(SubType.GIDEON)); - } - - public GideonOfTheTrialsCantLoseEffect() { - super(Duration.EndOfGame, Outcome.Benefit); - staticText = "As long as you control a Gideon planeswalker, you can't lose the game and your opponents can't win the game"; - } - - public GideonOfTheTrialsCantLoseEffect(final GideonOfTheTrialsCantLoseEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if ((event.getType() == GameEvent.EventType.WINS && game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) - || (event.getType() == GameEvent.EventType.LOSES && event.getPlayerId().equals(source.getControllerId()))) { - if (game.getBattlefield().contains(filter, source.getControllerId(), 1, game)) { - return true; - } - } - return false; - } - - @Override - public GideonOfTheTrialsCantLoseEffect copy() { - return new GideonOfTheTrialsCantLoseEffect(this); - } -} - class GideonOfTheTrialsToken extends Token { public GideonOfTheTrialsToken() { diff --git a/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java b/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java new file mode 100644 index 00000000000..92239a97c02 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java @@ -0,0 +1,129 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.g; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.EmptyToken; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +/** + * + * @author jeffwadsworth + */ +public class GodPharaohsGift extends CardImpl { + + public GodPharaohsGift(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{7}"); + + // At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn. + this.addAbility(new BeginningOfCombatTriggeredAbility(Zone.BATTLEFIELD, new GodPharaohsGiftEffect(), TargetController.YOU, true, false)); + + } + + public GodPharaohsGift(final GodPharaohsGift card) { + super(card); + } + + @Override + public GodPharaohsGift copy() { + return new GodPharaohsGift(this); + } +} + +class GodPharaohsGiftEffect extends OneShotEffect { + + private static final FilterCreatureCard filter = new FilterCreatureCard("creature card from your graveyard"); + private UUID exileId = UUID.randomUUID(); + + public GodPharaohsGiftEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn"; + } + + public GodPharaohsGiftEffect(final GodPharaohsGiftEffect effect) { + super(effect); + } + + @Override + public GodPharaohsGiftEffect copy() { + return new GodPharaohsGiftEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(filter); + target.setNotTarget(true); + if (controller != null + && !controller.getGraveyard().getCards(filter, game).isEmpty() + && controller.choose(Outcome.PutCreatureInPlay, target, source.getId(), game)) { + Card cardChosen = game.getCard(target.getFirstTarget()); + if (cardChosen != null + && cardChosen.moveToExile(exileId, "God-Pharaoh's Gift", source.getId(), game)) { + EmptyToken token = new EmptyToken(); + CardUtil.copyTo(token).from(cardChosen); + token.getPower().modifyBaseValue(4); + token.getToughness().modifyBaseValue(4); + token.getColor(game).setColor(ObjectColor.BLACK); + token.getSubtype(game).clear(); + token.getSubtype(game).add("Zombie"); + if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) { + Permanent tokenPermanent = game.getPermanent(token.getLastAddedToken()); + if (tokenPermanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(tokenPermanent.getId())); + game.addEffect(effect, source); + return true; + } + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/g/GravenAbomination.java b/Mage.Sets/src/mage/cards/g/GravenAbomination.java new file mode 100644 index 00000000000..f5ab49b21ba --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GravenAbomination.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.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.predicate.other.OwnerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author jeffwadsworth + */ +public class GravenAbomination extends CardImpl { + + private final UUID originalId; + + private final static String rule = "Whenever {this} attacks, exile target card from defending player's graveyard."; + + public GravenAbomination(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + + this.subtype.add("Horror"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Whenever Graven Abomination attacks, exile target card from defending player's graveyard. + Ability ability = new AttacksTriggeredAbility(new ExileTargetEffect(), false, rule); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + originalId = ability.getOriginalId(); + + } + + @Override + public void adjustTargets(Ability ability, Game game) { + UUID gravenAbominationId = ability.getSourceId(); + FilterCard filter = new FilterCard("target card from defending player's graveyard"); + if (ability.getOriginalId().equals(originalId)) { + UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(gravenAbominationId, game); + Player defendingPlayer = game.getPlayer(defendingPlayerId); + if (defendingPlayer != null) { + filter.add(new OwnerIdPredicate(defendingPlayerId)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetCardInGraveyard(filter)); + } + } + } + + public GravenAbomination(final GravenAbomination card) { + super(card); + this.originalId = card.originalId; + } + + @Override + public GravenAbomination copy() { + return new GravenAbomination(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HollowOne.java b/Mage.Sets/src/mage/cards/h/HollowOne.java new file mode 100644 index 00000000000..8c994f38b63 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HollowOne.java @@ -0,0 +1,123 @@ +/* + * 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.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; +import mage.watchers.common.CardsCycledOrDiscardedThisTurnWatcher; + +/** + * + * @author spjspj + */ +public class HollowOne extends CardImpl { + + public HollowOne(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{5}"); + + this.subtype.add("Golem"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Hollow One costs {2} less to cast for each card you've cycled or discarded this turn. + Ability ability = new SimpleStaticAbility(Zone.ALL, new HollowOneReductionEffect()); + ability.setRuleAtTheTop(true); + this.addAbility(ability, new CardsCycledOrDiscardedThisTurnWatcher()); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + } + + public HollowOne(final HollowOne card) { + super(card); + } + + @Override + public HollowOne copy() { + return new HollowOne(this); + } +} + +class HollowOneReductionEffect extends CostModificationEffectImpl { + + public HollowOneReductionEffect() { + super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = "{this} costs {2} less to cast for each card you've cycled or discarded this turn"; + } + + protected HollowOneReductionEffect(HollowOneReductionEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + Player controller = game.getPlayer(source.getControllerId()); + CardsCycledOrDiscardedThisTurnWatcher watcher = (CardsCycledOrDiscardedThisTurnWatcher) game.getState().getWatchers().get(CardsCycledOrDiscardedThisTurnWatcher.class.getSimpleName()); + int reductionAmount = 0; + if (controller != null + && watcher != null) { + for (Card card : watcher.getCardsCycledOrDiscardedThisTurn(controller.getId()).getCards(game)) { + if (card.getOwnerId().equals(controller.getId())) { + reductionAmount++; + } + } + CardUtil.reduceCost(abilityToModify, reductionAmount * 2); + return true; + } + return false; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + return abilityToModify instanceof SpellAbility + && abilityToModify.getSourceId().equals(source.getSourceId()) + && game.getCard(abilityToModify.getSourceId()) != null; + } + + @Override + public HollowOneReductionEffect copy() { + return new HollowOneReductionEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/IfnirDeadlands.java b/Mage.Sets/src/mage/cards/i/IfnirDeadlands.java new file mode 100644 index 00000000000..f3439bb23b2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IfnirDeadlands.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.i; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.mana.BlackManaAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author jeffwadsworth + */ +public class IfnirDeadlands extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Desert"); + + static { + filter.add(new SubtypePredicate(SubType.DESERT)); + } + + public IfnirDeadlands(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add("Desert"); + + // {t}: Add {C} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {t}, Pay 1 life: Add {B} to your mana pool. + Ability manaAbility = new BlackManaAbility(); + manaAbility.addCost(new PayLifeCost(1)); + this.addAbility(manaAbility); + + // {2}{B}{B}, {t}, Sacrifice a Desert: Put two -1/-1 counters on target creature an opponent controls. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.M1M1.createInstance(2)), new ManaCostsImpl("{2}{B}{B}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filter, true))); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + + } + + public IfnirDeadlands(final IfnirDeadlands card) { + super(card); + } + + @Override + public IfnirDeadlands copy() { + return new IfnirDeadlands(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/ImaginaryThreats.java b/Mage.Sets/src/mage/cards/i/ImaginaryThreats.java new file mode 100644 index 00000000000..14f997c4f98 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/ImaginaryThreats.java @@ -0,0 +1,106 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.i; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.RequirementEffect; +import mage.abilities.effects.common.DontUntapInOpponentsNextUntapStepAllEffect; +import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class ImaginaryThreats extends CardImpl { + + public ImaginaryThreats(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); + + // Creatures target opponent controls attack this turn if able. During that player's next untap step, creatures he or she controls don't untap. + getSpellAbility().addEffect(new ImaginaryThreatsEffect()); + getSpellAbility().addTarget(new TargetOpponent()); + getSpellAbility().addEffect(new DontUntapInOpponentsNextUntapStepAllEffect(new FilterCreaturePermanent()) + .setText("During that player's next untap step, creatures he or she controls don't untap")); + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + + } + + public ImaginaryThreats(final ImaginaryThreats card) { + super(card); + } + + @Override + public ImaginaryThreats copy() { + return new ImaginaryThreats(this); + } +} + +class ImaginaryThreatsEffect extends OneShotEffect { + + public ImaginaryThreatsEffect() { + super(Outcome.Detriment); + staticText = "Creatures target opponent controls attack this turn if able"; + } + + public ImaginaryThreatsEffect(final ImaginaryThreatsEffect effect) { + super(effect); + } + + @Override + public ImaginaryThreatsEffect copy() { + return new ImaginaryThreatsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (player != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate(player.getId())); + RequirementEffect effect = new AttacksIfAbleAllEffect(filter, Duration.EndOfTurn); + game.addEffect(effect, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InciteWar.java b/Mage.Sets/src/mage/cards/i/InciteWar.java index 8e97aeb00ce..26dcef22f1c 100644 --- a/Mage.Sets/src/mage/cards/i/InciteWar.java +++ b/Mage.Sets/src/mage/cards/i/InciteWar.java @@ -63,7 +63,7 @@ public class InciteWar extends CardImpl { } public InciteWar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); // Choose one - Creatures target player controls attack this turn if able; this.getSpellAbility().addEffect(new InciteWarMustAttackEffect()); @@ -93,7 +93,7 @@ class InciteWarMustAttackEffect extends OneShotEffect { public InciteWarMustAttackEffect() { super(Outcome.Detriment); - staticText = "Creatures target player control attack this turn if able"; + staticText = "Creatures target player controls attack this turn if able"; } public InciteWarMustAttackEffect(final InciteWarMustAttackEffect effect) { diff --git a/Mage.Sets/src/mage/cards/n/NehebTheEternal.java b/Mage.Sets/src/mage/cards/n/NehebTheEternal.java new file mode 100644 index 00000000000..64831197814 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NehebTheEternal.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.n; + +import java.util.UUID; +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfPostCombatMainTriggeredAbility; +import mage.abilities.dynamicvalue.common.OpponentsLostLifeCount; +import mage.abilities.effects.common.ManaEffect; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class NehebTheEternal extends CardImpl { + + public NehebTheEternal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("Zombie"); + this.subtype.add("Minotaur"); + this.subtype.add("Warrior"); + this.power = new MageInt(4); + this.toughness = new MageInt(6); + + // Afflict 3 + addAbility(new AfflictAbility(3)); + + // At the beginning of your postcombat main phase, add {R} to your mana pool for each 1 life your opponents have lost this turn. + this.addAbility(new BeginningOfPostCombatMainTriggeredAbility(new NehebTheEternalManaEffect(), TargetController.YOU, false)); + } + + public NehebTheEternal(final NehebTheEternal card) { + super(card); + } + + @Override + public NehebTheEternal copy() { + return new NehebTheEternal(this); + } +} + +class NehebTheEternalManaEffect extends ManaEffect { + + NehebTheEternalManaEffect() { + super(); + this.staticText = "add {R} to your mana pool for each 1 life your opponents have lost this turn"; + } + + NehebTheEternalManaEffect(final NehebTheEternalManaEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + OpponentsLostLifeCount dynamicValue = new OpponentsLostLifeCount(); + int amount = dynamicValue.calculate(game, source, this); + if (amount > 0) { + controller.getManaPool().addMana(Mana.RedMana(amount), game, source); + return true; + } + } + return false; + } + + @Override + public NehebTheEternalManaEffect copy() { + return new NehebTheEternalManaEffect(this); + } + + @Override + public Mana getMana(Game game, Ability source) { + return null; + } +} diff --git a/Mage.Sets/src/mage/cards/n/NissasEncouragement.java b/Mage.Sets/src/mage/cards/n/NissasEncouragement.java new file mode 100644 index 00000000000..3f902d16d49 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NissasEncouragement.java @@ -0,0 +1,191 @@ +/* + * 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.HashMap; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author spjspj + */ +public class NissasEncouragement extends CardImpl { + + public NissasEncouragement(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}"); + + // Search your library and graveyard for a card named Forest, a card named Brambleweft Behemoth, and a card named Nissa, Genesis Mage. Reveal those cards, put them into your hand, then shuffle your library. + this.getSpellAbility().addEffect(new NissasEncouragementEffect()); + + } + + public NissasEncouragement(final NissasEncouragement card) { + super(card); + } + + @Override + public NissasEncouragement copy() { + return new NissasEncouragement(this); + } +} + +class NissasEncouragementEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard("card named Forest, a card named Brambleweft Behemoth, and a card named Nissa, Genesis Mage"); + private static final FilterCard filterGY = new FilterCard(); + + static { + filter.add(Predicates.or(new NamePredicate("Forest"), new NamePredicate("Brambleweft Behemoth"), new NamePredicate("Nissa, Genesis Mage"))); + } + + public NissasEncouragementEffect() { + super(Outcome.DrawCard); + this.staticText = "Search your library and graveyard for a card named Forest, a card named Brambleweft Behemoth, and a card named Nissa, Genesis Mage. Reveal those cards, put them into your hand, then shuffle your library."; + } + + public NissasEncouragementEffect(final NissasEncouragementEffect effect) { + super(effect); + } + + @Override + public NissasEncouragementEffect copy() { + return new NissasEncouragementEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Card sourceCard = game.getCard(source.getSourceId()); + if (player == null || sourceCard == null) { + return false; + } + + NissasEncouragementTarget target = new NissasEncouragementTarget(filter); + if (player.searchLibrary(target, game)) { + boolean searchGY = false; + + if (target.getTargets().size() < 3) { + searchGY = true; + } + + HashMap foundCards = new HashMap<>(); + foundCards.put("Forest", 0); + foundCards.put("Brambleweft Behemoth", 0); + foundCards.put("Nissa, Genesis Mage", 0); + Cards cards = new CardsImpl(); + + if (!target.getTargets().isEmpty()) { + for (UUID cardId : target.getTargets()) { + Card card = player.getLibrary().remove(cardId, game); + + if (card != null) { + cards.add(card); + foundCards.put(card.getName(), 1); + } + } + } + + if (searchGY) { + for (String name : foundCards.keySet()) { + if (foundCards.get(name) == 1) { + continue; + } + // Look in graveyard for any with this name + FilterCard namedFilterGY = filterGY.copy(); // never change static objects so copy the object here before + namedFilterGY.add(new NamePredicate(name)); + if (player.getGraveyard().count(namedFilterGY, game) > 0) { + TargetCard targetGY = new TargetCard(0, 1, Zone.GRAVEYARD, namedFilterGY); + if (player.choose(Outcome.ReturnToHand, player.getGraveyard(), targetGY, game)) { + for (UUID cardIdGY : targetGY.getTargets()) { + Card cardGY = player.getGraveyard().get(cardIdGY, game); + cards.add(cardGY); + } + } + } + } + } + + if (!cards.isEmpty()) { + player.revealCards(sourceCard.getIdName(), cards, game); + player.moveCards(cards, Zone.HAND, source, game); + player.shuffleLibrary(source, game); + return true; + } + } + player.shuffleLibrary(source, game); + return false; + } +} + +class NissasEncouragementTarget extends TargetCardInLibrary { + + public NissasEncouragementTarget(FilterCard filter) { + super(0, 3, filter); + } + + public NissasEncouragementTarget(final NissasEncouragementTarget target) { + super(target); + } + + @Override + public NissasEncouragementTarget copy() { + return new NissasEncouragementTarget(this); + } + + @Override + public boolean canTarget(UUID id, Cards cards, Game game) { + Card card = cards.get(id, game); + if (card != null) { + for (UUID targetId : this.getTargets()) { + Card iCard = game.getCard(targetId); + if (iCard != null && iCard.getName().equals(card.getName())) { + return false; + } + } + return filter.match(card, game); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShefetDunes.java b/Mage.Sets/src/mage/cards/s/ShefetDunes.java index 9af17369650..7e97900ad88 100644 --- a/Mage.Sets/src/mage/cards/s/ShefetDunes.java +++ b/Mage.Sets/src/mage/cards/s/ShefetDunes.java @@ -29,7 +29,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; @@ -73,7 +73,7 @@ public class ShefetDunes extends CardImpl { this.addAbility(ability); // {2}{W}{W}, {T}, Sacrifice a Desert: Creatures you control get +1/+1 until end of turn. Activate this ability only any time you could cast a sorcery. - Ability ability2 = new SimpleActivatedAbility( + Ability ability2 = new ActivateAsSorceryActivatedAbility( Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{2}{W}{W}")); diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 1bc1cb218f1..f0f979838df 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -71,6 +71,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Aerial Guide", 29, Rarity.COMMON, mage.cards.a.AerialGuide.class)); cards.add(new SetCardInfo("Ambuscade", 110, Rarity.COMMON, mage.cards.a.Ambuscade.class)); + cards.add(new SetCardInfo("Ammit Eternal", 57, Rarity.RARE, mage.cards.a.AmmitEternal.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); @@ -78,6 +79,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Appeal // Authority", 152, Rarity.UNCOMMON, mage.cards.a.AppealAuthority.class)); cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); + cards.add(new SetCardInfo("Banewhip Punisher", 59, Rarity.UNCOMMON, mage.cards.b.BanewhipPunisher.class)); cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); cards.add(new SetCardInfo("Bitterbow Sharpshooters", 112, Rarity.COMMON, mage.cards.b.BitterbowSharpshooters.class)); cards.add(new SetCardInfo("Blur of Blades", 84, Rarity.COMMON, mage.cards.b.BlurOfBlades.class)); @@ -126,47 +128,44 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Gift of Strength", 117, Rarity.COMMON, mage.cards.g.GiftOfStrength.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("God-Pharaoh's Faithful", 14, Rarity.COMMON, mage.cards.g.GodPharaohsFaithful.class)); + cards.add(new SetCardInfo("God-Pharaoh's Gift", 161, Rarity.RARE, mage.cards.g.GodPharaohsGift.class)); cards.add(new SetCardInfo("Granitic Titan", 95, Rarity.COMMON, mage.cards.g.GraniticTitan.class)); + cards.add(new SetCardInfo("Graven Abomination", 162, Rarity.COMMON, mage.cards.g.GravenAbomination.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); + cards.add(new SetCardInfo("Hollow One", 163, Rarity.RARE, mage.cards.h.HollowOne.class)); cards.add(new SetCardInfo("Hour of Eternity", 36, Rarity.RARE, mage.cards.h.HourOfEternity.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Promise", 120, Rarity.RARE, mage.cards.h.HourOfPromise.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); + cards.add(new SetCardInfo("Ifnir Deadlands", 179, Rarity.UNCOMMON, mage.cards.i.IfnirDeadlands.class)); + cards.add(new SetCardInfo("Imaginary Threats", 37, Rarity.UNCOMMON, mage.cards.i.ImaginaryThreats.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); - cards.add(new SetCardInfo("Ipnu Rivulet", 180, Rarity.UNCOMMON, mage.cards.i.IpnuRivulet.class)); cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Island", 192, Rarity.LAND, mage.cards.basiclands.Island.class)); cards.add(new SetCardInfo("Island", 193, Rarity.LAND, mage.cards.basiclands.Island.class)); - cards.add(new SetCardInfo("Jace's Defeat", 38, Rarity.UNCOMMON, mage.cards.j.JacesDefeat.class)); - cards.add(new SetCardInfo("Kefnet's Last Word", 39, Rarity.RARE, mage.cards.k.KefnetsLastWord.class)); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Kindled Fury", 101, Rarity.COMMON, mage.cards.k.KindledFury.class)); - cards.add(new SetCardInfo("Lethal Sting", 67, Rarity.COMMON, mage.cards.l.LethalSting.class)); cards.add(new SetCardInfo("Life Goes On", 121, Rarity.COMMON, mage.cards.l.LifeGoesOn.class)); cards.add(new SetCardInfo("Leave // Chance", 153, Rarity.RARE, mage.cards.l.LeaveChance.class)); - cards.add(new SetCardInfo("Lethal Sting", 67, Rarity.COMMON, mage.cards.l.LethalSting.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); cards.add(new SetCardInfo("Magmaroth", 102, Rarity.UNCOMMON, mage.cards.m.Magmaroth.class)); - cards.add(new SetCardInfo("Majestic Myriarch", 122, Rarity.MYTHIC, mage.cards.m.MajesticMyriarch.class)); cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); - cards.add(new SetCardInfo("Manticore Eternal", 103, Rarity.UNCOMMON, mage.cards.m.ManticoreEternal.class)); + cards.add(new SetCardInfo("Manticore Elemental", 103, Rarity.UNCOMMON, mage.cards.m.ManticoreElemental.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); - cards.add(new SetCardInfo("Merciless Eternal", 71, Rarity.UNCOMMON, mage.cards.m.MercilessEternal.class)); - cards.add(new SetCardInfo("Mirage Mirror", 165, Rarity.RARE, mage.cards.m.MirageMirror.class)); cards.add(new SetCardInfo("Moaning Wall", 72, Rarity.COMMON, mage.cards.m.MoaningWall.class)); cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Mountain", 196, Rarity.LAND, mage.cards.basiclands.Mountain.class)); cards.add(new SetCardInfo("Mountain", 197, Rarity.LAND, mage.cards.basiclands.Mountain.class)); cards.add(new SetCardInfo("Mummy Paramount", 16, Rarity.COMMON, mage.cards.m.MummyParamount.class)); + cards.add(new SetCardInfo("Neheb, the Eternal", 104, Rarity.MYTHIC, mage.cards.n.NehebTheEternal.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Nicol Bolas, the Deceiver", 205, Rarity.MYTHIC, mage.cards.n.NicolBolasTheDeceiver.class)); - cards.add(new SetCardInfo("Nissa's Defeat", 123, Rarity.UNCOMMON, mage.cards.n.NissasDefeat.class)); + cards.add(new SetCardInfo("Nissa's Encouragement", 203, Rarity.RARE, mage.cards.n.NissasEncouragement.class)); cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); cards.add(new SetCardInfo("Oasis Ritualist", 124, Rarity.COMMON, mage.cards.o.OasisRitualist.class)); - cards.add(new SetCardInfo("Obelisk Spider", 141, Rarity.UNCOMMON, mage.cards.o.ObeliskSpider.class)); cards.add(new SetCardInfo("Oketra's Avenger", 17, Rarity.COMMON, mage.cards.o.OketrasAvenger.class)); cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); cards.add(new SetCardInfo("Ominous Sphinx", 41, Rarity.UNCOMMON, mage.cards.o.OminousSphinx.class)); @@ -183,7 +182,6 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Rampaging Hippo", 128, Rarity.COMMON, mage.cards.r.RampagingHippo.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); - cards.add(new SetCardInfo("Ramunap Ruins", 181, Rarity.UNCOMMON, mage.cards.r.RamunapRuins.class)); cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); cards.add(new SetCardInfo("Razaketh's Rite", 74, Rarity.UNCOMMON, mage.cards.r.RazakethsRite.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java new file mode 100644 index 00000000000..531ecf77927 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java @@ -0,0 +1,32 @@ +package org.mage.test.cards.mana; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class MycosynthLatticeTest extends CardTestPlayerBase { + + + @Test + public void testMycoSynthLatticeWithCrystallineCrawler(){ + String crawler = "Crystalline Crawler"; + String lattice = "Mycosynth Lattice"; + + addCard(Zone.BATTLEFIELD, playerA, lattice); + addCard(Zone.BATTLEFIELD, playerA, "Plains"); + addCard(Zone.BATTLEFIELD, playerA, "Island"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + addCard(Zone.HAND, playerA, crawler); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, crawler); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + + assertCounterCount(playerA, crawler, CounterType.P1P1, 4); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java index 81d25066c5e..d3a78b02406 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java @@ -34,7 +34,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.PhaseStep; -import mage.constants.TargetController; import mage.filter.FilterPermanent; import mage.game.Game; import mage.game.events.GameEvent; @@ -49,23 +48,23 @@ public class DontUntapInOpponentsNextUntapStepAllEffect extends ContinuousRuleMo private int validForTurnNum; //private String targetName; - TargetController targetController; FilterPermanent filter; /** * Attention: This effect won't work with targets controlled by different * controllers If this is needed, the validForTurnNum has to be saved per * controller. + * + * @param filter */ public DontUntapInOpponentsNextUntapStepAllEffect(FilterPermanent filter) { super(Duration.Custom, Outcome.Detriment, false, true); - this.filter = filter; + this.filter = filter; } public DontUntapInOpponentsNextUntapStepAllEffect(final DontUntapInOpponentsNextUntapStepAllEffect effect) { super(effect); this.validForTurnNum = effect.validForTurnNum; - this.targetController = effect.targetController; this.filter = effect.filter; } @@ -127,7 +126,8 @@ public class DontUntapInOpponentsNextUntapStepAllEffect extends ContinuousRuleMo if (controller != null && !game.isOpponent(controller, permanent.getControllerId())) { return false; } - if (game.getActivePlayerId().equals(permanent.getControllerId()) && // controller's untap step + if (game.getActivePlayerId().equals(permanent.getControllerId()) + && // controller's untap step filter.match(permanent, source.getSourceId(), source.getControllerId(), game)) { return true; } diff --git a/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java index 7c9fa13d682..4451fc77110 100644 --- a/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java @@ -62,7 +62,7 @@ class GideonOfTheTrialsCantLoseEffect extends ContinuousRuleModifyingEffectImpl } public GideonOfTheTrialsCantLoseEffect() { - super(Duration.EndOfGame, Outcome.Benefit); + super(Duration.EndOfGame, Outcome.Benefit, false, false); staticText = "As long as you control a Gideon planeswalker, you can't lose the game and your opponents can't win the game"; }