diff --git a/Mage.Sets/src/mage/sets/apocalypse/DesolationGiant.java b/Mage.Sets/src/mage/sets/apocalypse/DesolationGiant.java new file mode 100644 index 00000000000..ba7062ff42d --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/DesolationGiant.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author LoneFox + */ +public class DesolationGiant extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("other creatures you control"); + + static { + filter.add(new AnotherPredicate()); + filter2.add(new AnotherPredicate()); + filter2.add(new ControllerPredicate(TargetController.YOU)); + } + + public DesolationGiant(UUID ownerId) { + super(ownerId, 59, "Desolation Giant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + this.expansionSetCode = "APC"; + this.subtype.add("Giant"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Kicker {W}{W} + this.addAbility(new KickerAbility("{W}{W}")); + // When Desolation Giant enters the battlefield, destroy all other creatures you control. If it was kicked, destroy all other creatures instead. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(new DestroyAllEffect(filter), + new DestroyAllEffect(filter2), KickedCondition.getInstance(), "destroy all other creatures you control. If it was kicked, destroy all other creatures instead."))); +} + + public DesolationGiant(final DesolationGiant card) { + super(card); + } + + @Override + public DesolationGiant copy() { + return new DesolationGiant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/FerventCharge.java b/Mage.Sets/src/mage/sets/apocalypse/FerventCharge.java new file mode 100644 index 00000000000..495197d62de --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/FerventCharge.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.sets.apocalypse; + +import java.util.UUID; +import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class FerventCharge extends CardImpl { + + public FerventCharge(UUID ownerId) { + super(ownerId, 98, "Fervent Charge", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{B}{R}"); + this.expansionSetCode = "APC"; + + // Whenever a creature you control attacks, it gets +2/+2 until end of turn. + Effect effect = new BoostTargetEffect(2, 2, Duration.EndOfTurn); + effect.setText("it gets +2/+2 until end of turn"); + this.addAbility(new AttacksCreatureYouControlTriggeredAbility(effect, false, true)); + } + + public FerventCharge(final FerventCharge card) { + super(card); + } + + @Override + public FerventCharge copy() { + return new FerventCharge(this); + } +} diff --git a/Mage.Sets/src/mage/sets/apocalypse/ShieldOfDutyAndReason.java b/Mage.Sets/src/mage/sets/apocalypse/ShieldOfDutyAndReason.java new file mode 100644 index 00000000000..c1f2b60d39b --- /dev/null +++ b/Mage.Sets/src/mage/sets/apocalypse/ShieldOfDutyAndReason.java @@ -0,0 +1,87 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.apocalypse; + +import java.util.UUID; +import mage.ObjectColor; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class ShieldOfDutyAndReason extends CardImpl { + + private static final FilterCard filter = new FilterCard("green and from blue"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.GREEN), new ColorPredicate(ObjectColor.BLUE))); + } + + public ShieldOfDutyAndReason(UUID ownerId) { + super(ownerId, 16, "Shield of Duty and Reason", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + this.expansionSetCode = "APC"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature has protection from green and from blue. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new ProtectionAbility(filter), + AttachmentType.AURA, Duration.WhileOnBattlefield))); + } + + public ShieldOfDutyAndReason(final ShieldOfDutyAndReason card) { + super(card); + } + + @Override + public ShieldOfDutyAndReason copy() { + return new ShieldOfDutyAndReason(this); + } +} diff --git a/Mage.Sets/src/mage/sets/archenemy/WaxWane.java b/Mage.Sets/src/mage/sets/archenemy/WaxWane.java new file mode 100644 index 00000000000..6a8c6b9c1f3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/archenemy/WaxWane.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.sets.archenemy; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetEnchantmentPermanent; + +/** + * + * @author LoneFox + */ +public class WaxWane extends SplitCard { + + public WaxWane(UUID ownerId) { + super(ownerId, 101, "Wax", "Wane", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{G}", "{W}", false); + this.expansionSetCode = "ARC"; + + // Wax + // Target creature gets +2/+2 until end of turn. + this.getLeftHalfCard().getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); + this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); + // Wane + // Destroy target enchantment. + this.getRightHalfCard().getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getRightHalfCard().getSpellAbility().addTarget(new TargetEnchantmentPermanent()); + } + + public WaxWane(final WaxWane card) { + super(card); + } + + @Override + public WaxWane copy() { + return new WaxWane(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/CrosisThePurger.java b/Mage.Sets/src/mage/sets/invasion/CrosisThePurger.java new file mode 100644 index 00000000000..2f40090c3d0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/CrosisThePurger.java @@ -0,0 +1,127 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LoneFox + + */ +public class CrosisThePurger extends CardImpl { + + public CrosisThePurger(UUID ownerId) { + super(ownerId, 242, "Crosis, the Purger", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}{B}{R}"); + this.expansionSetCode = "INV"; + this.supertype.add("Legendary"); + this.subtype.add("Dragon"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DoIfCostPaid(new CrosisThePurgerEffect(), + new ManaCostsImpl("{2}{B}")), false, true)); + } + + public CrosisThePurger(final CrosisThePurger card) { + super(card); + } + + @Override + public CrosisThePurger copy() { + return new CrosisThePurger(this); + } +} + +class CrosisThePurgerEffect extends OneShotEffect { + + CrosisThePurgerEffect() { + super(Outcome.Discard); + this.staticText = "choose a color, then that player reveals his or her hand and discards all cards of that color."; + } + + CrosisThePurgerEffect(final CrosisThePurgerEffect effect) { + super(effect); + } + + @Override + public CrosisThePurgerEffect copy() { + return new CrosisThePurgerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if(player != null) { + ChoiceColor choice = new ChoiceColor(); + player.choose(outcome, choice, game); + if(choice.getColor() != null) { + game.informPlayers(new StringBuilder(player.getLogName()).append(" chooses ").append(choice.getColor()).toString()); + Player damagedPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + damagedPlayer.revealCards("hand of " + damagedPlayer.getName(), damagedPlayer.getHand(), game); + FilterCard filter = new FilterCard(); + filter.add(new ColorPredicate(choice.getColor())); + List toDiscard = new ArrayList<>(); + for(UUID cardId : damagedPlayer.getHand()) { + Card card = game.getCard(cardId); + if(filter.match(card, game)) { + toDiscard.add(card); + } + } + for(Card card: toDiscard) { + damagedPlayer.discard(card, source, game); + } + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/PhyrexianInfiltrator.java b/Mage.Sets/src/mage/sets/invasion/PhyrexianInfiltrator.java new file mode 100644 index 00000000000..788b052ddf1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/PhyrexianInfiltrator.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class PhyrexianInfiltrator extends CardImpl { + + public PhyrexianInfiltrator(UUID ownerId) { + super(ownerId, 116, "Phyrexian Infiltrator", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "INV"; + this.subtype.add("Minion"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {2}{U}{U}: Exchange control of Phyrexian Infiltrator and target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExchangeControlTargetEffect(Duration.EndOfGame, + "Exchange control of {this} and target creature", true), new ManaCostsImpl("{2}{U}{U}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + } + + public PhyrexianInfiltrator(final PhyrexianInfiltrator card) { + super(card); + } + + @Override + public PhyrexianInfiltrator copy() { + return new PhyrexianInfiltrator(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/StandDeliver.java b/Mage.Sets/src/mage/sets/invasion/StandDeliver.java new file mode 100644 index 00000000000..2496b7cd4ef --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/StandDeliver.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.sets.invasion; + +import java.util.UUID; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class StandDeliver extends SplitCard { + + public StandDeliver(UUID ownerId) { + super(ownerId, 292, "Stand", "Deliver", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{W}", "{2}{U}", false); + this.expansionSetCode = "INV"; + + // Stand + // Prevent the next 2 damage that would be dealt to target creature this turn. + this.getLeftHalfCard().getSpellAbility().addEffect(new PreventDamageToTargetEffect(Duration.EndOfTurn, 2)); + this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); + // Deliver + // Return target permanent to its owner's hand. + this.getRightHalfCard().getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getRightHalfCard().getSpellAbility().addTarget(new TargetPermanent()); + } + + public StandDeliver(final StandDeliver card) { + super(card); + } + + @Override + public StandDeliver copy() { + return new StandDeliver(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/VileConsumption.java b/Mage.Sets/src/mage/sets/invasion/VileConsumption.java new file mode 100644 index 00000000000..17af127878c --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/VileConsumption.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + +import java.util.UUID; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class VileConsumption extends CardImpl { + + public VileConsumption(UUID ownerId) { + super(ownerId, 285, "Vile Consumption", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}{B}"); + this.expansionSetCode = "INV"; + + // All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay 1 life." + Effect effect = new SacrificeSourceUnlessPaysEffect(new PayLifeCost(1)); + effect.setText("sacrifice this creature unless you pay 1 life"); + Effect effect2 = new GainAbilityAllEffect(new BeginningOfUpkeepTriggeredAbility(effect, TargetController.YOU, false), + Duration.WhileOnBattlefield, new FilterCreaturePermanent("all creatures")); + effect2.setText("All creatures have \"At the beginning of your upkeep, sacrifice this creature unless you pay 1 life.\""); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect2)); + } + + public VileConsumption(final VileConsumption card) { + super(card); + } + + @Override + public VileConsumption copy() { + return new VileConsumption(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/VodalianHypnotist.java b/Mage.Sets/src/mage/sets/invasion/VodalianHypnotist.java new file mode 100644 index 00000000000..40f09955e6c --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/VodalianHypnotist.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.sets.invasion; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPlayer; + +/** + * + * @author LoneFox + */ +public class VodalianHypnotist extends CardImpl { + + public VodalianHypnotist(UUID ownerId) { + super(ownerId, 84, "Vodalian Hypnotist", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "INV"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {2}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new DiscardTargetEffect(1), + new ManaCostsImpl("{2}{B}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public VodalianHypnotist(final VodalianHypnotist card) { + super(card); + } + + @Override + public VodalianHypnotist copy() { + return new VodalianHypnotist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/invasion/WaxWane.java b/Mage.Sets/src/mage/sets/invasion/WaxWane.java new file mode 100644 index 00000000000..d400f69ee06 --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/WaxWane.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.invasion; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class WaxWane extends mage.sets.archenemy.WaxWane { + + public WaxWane(UUID ownerId) { + super(ownerId); + this.cardNumber = 296; + this.expansionSetCode = "INV"; + } + + public WaxWane(final WaxWane card) { + super(card); + } + + @Override + public WaxWane copy() { + return new WaxWane(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java b/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java index b8bcb491aa1..1c4a58253cb 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java +++ b/Mage.Sets/src/mage/sets/magicorigins/NecromanticSummons.java @@ -57,10 +57,10 @@ public class NecromanticSummons extends CardImpl { // Put target creature card from a graveyard onto the battlefield under your control. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard"))); - + // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it. Effect effect = new ConditionalOneShotEffect(new NecromanticSummoningEffect(), - SpellMasteryCondition.getInstance(), "
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B} to your mana pool"); + SpellMasteryCondition.getInstance(), "
Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it"); this.getSpellAbility().addEffect(effect); } @@ -99,4 +99,4 @@ class NecromanticSummoningEffect extends OneShotEffect { } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/pdsgraveborn/CrosisThePurger.java b/Mage.Sets/src/mage/sets/pdsgraveborn/CrosisThePurger.java new file mode 100644 index 00000000000..ad66b29cc28 --- /dev/null +++ b/Mage.Sets/src/mage/sets/pdsgraveborn/CrosisThePurger.java @@ -0,0 +1,53 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.pdsgraveborn; + +import java.util.UUID; + +/** + * + * @author LoneFox + + */ +public class CrosisThePurger extends mage.sets.invasion.CrosisThePurger { + + public CrosisThePurger(UUID ownerId) { + super(ownerId); + this.cardNumber = 5; + this.expansionSetCode = "PD3"; + } + + public CrosisThePurger(final CrosisThePurger card) { + super(card); + } + + @Override + public CrosisThePurger copy() { + return new CrosisThePurger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planeshift/Hobble.java b/Mage.Sets/src/mage/sets/planeshift/Hobble.java index 1bbeccdb18e..ed0b5277512 100644 --- a/Mage.Sets/src/mage/sets/planeshift/Hobble.java +++ b/Mage.Sets/src/mage/sets/planeshift/Hobble.java @@ -33,7 +33,8 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.EnchantedCreatureColorCondition; -import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.decorator.ConditionalRestrictionEffect; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.combat.CantAttackAttachedEffect; @@ -70,8 +71,10 @@ public class Hobble extends CardImpl { // Enchanted creature can't attack. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackAttachedEffect(AttachmentType.AURA))); // Enchanted creature can't block if it's black. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new CantBlockAttachedEffect(AttachmentType.AURA), - new EnchantedCreatureColorCondition(ObjectColor.BLACK), "Enchanted creature can't block if it's black"))); + Effect effect = new ConditionalRestrictionEffect(new CantBlockAttachedEffect(AttachmentType.AURA), + new EnchantedCreatureColorCondition(ObjectColor.BLACK)); + effect.setText("Enchanted creature can't block if it's black."); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } public Hobble(final Hobble card) { diff --git a/Mage.Sets/src/mage/sets/timeshifted/DesolationGiant.java b/Mage.Sets/src/mage/sets/timeshifted/DesolationGiant.java new file mode 100644 index 00000000000..22daab2d556 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/DesolationGiant.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.timeshifted; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class DesolationGiant extends mage.sets.apocalypse.DesolationGiant { + + public DesolationGiant(UUID ownerId) { + super(ownerId); + this.cardNumber = 57; + this.expansionSetCode = "TSB"; + this.rarity = Rarity.SPECIAL; + } + + public DesolationGiant(final DesolationGiant card) { + super(card); + } + + @Override + public DesolationGiant copy() { + return new DesolationGiant(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/MaskOfLawAndGrace.java b/Mage.Sets/src/mage/sets/urzasdestiny/MaskOfLawAndGrace.java new file mode 100644 index 00000000000..03e7bdc436f --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzasdestiny/MaskOfLawAndGrace.java @@ -0,0 +1,87 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.urzasdestiny; + +import java.util.UUID; +import mage.ObjectColor; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class MaskOfLawAndGrace extends CardImpl { + + private static final FilterCard filter = new FilterCard("black and from red"); + + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLACK), new ColorPredicate(ObjectColor.RED))); + } + + public MaskOfLawAndGrace(UUID ownerId) { + super(ownerId, 11, "Mask of Law and Grace", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + this.expansionSetCode = "UDS"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature has protection from black and from red. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new ProtectionAbility(filter), + AttachmentType.AURA, Duration.WhileOnBattlefield))); + } + + public MaskOfLawAndGrace(final MaskOfLawAndGrace card) { + super(card); + } + + @Override + public MaskOfLawAndGrace copy() { + return new MaskOfLawAndGrace(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java index f435569bed1..2a3d5d3df58 100644 --- a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAttachedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -47,8 +47,8 @@ public class AttacksIfAbleAttachedEffect extends RequirementEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature attacks each turn if able"; } else { - this.staticText = "Equiped creature attacks each turn if able"; - } + this.staticText = "Equipped creature attacks each turn if able"; + } } public AttacksIfAbleAttachedEffect(final AttacksIfAbleAttachedEffect effect) { diff --git a/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java index d7584c2eb5b..02d817da833 100644 --- a/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/BlocksIfAbleAttachedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -47,8 +47,8 @@ public class BlocksIfAbleAttachedEffect extends RequirementEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature blocks each turn if able"; } else { - this.staticText = "Equiped creature blocks each turn if able"; - } + this.staticText = "Equipped creature blocks each turn if able"; + } } public BlocksIfAbleAttachedEffect(final BlocksIfAbleAttachedEffect effect) { diff --git a/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java index 7293e7b8a23..4c2c2141b0a 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantAttackAttachedEffect.java @@ -47,8 +47,8 @@ public class CantAttackAttachedEffect extends RestrictionEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature can't attack"; } else { - this.staticText = "Equiped creature can't attack"; - } + this.staticText = "Equipped creature can't attack"; + } } public CantAttackAttachedEffect(final CantAttackAttachedEffect effect) { diff --git a/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java index ba1c8e793f0..882fa731292 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantAttackBlockAttachedEffect.java @@ -45,7 +45,7 @@ public class CantAttackBlockAttachedEffect extends RestrictionEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature can't attack or block"; } else { - this.staticText = "Equiped creature can't attack or block"; + this.staticText = "Equipped creature can't attack or block"; } } @@ -67,7 +67,7 @@ public class CantAttackBlockAttachedEffect extends RestrictionEffect { public boolean canAttack(Game game) { return false; } - + @Override public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { return false; diff --git a/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java index 465cac1abfa..693b73307a0 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java @@ -1,16 +1,16 @@ /* * 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 @@ -20,7 +20,7 @@ * 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. @@ -38,7 +38,7 @@ import mage.game.permanent.Permanent; /** - * + * * @author LevelX2 */ @@ -49,8 +49,8 @@ public class CantAttackControllerAttachedEffect extends RestrictionEffect { if (attachmentType.equals(AttachmentType.AURA)) { this.staticText = "Enchanted creature can't attack you or a planeswalker you control"; } else { - this.staticText = "Equiped creature can't attack you or a planeswalker you control"; - } + this.staticText = "Equipped creature can't attack you or a planeswalker you control"; + } } public CantAttackControllerAttachedEffect(final CantAttackControllerAttachedEffect effect) { @@ -71,7 +71,7 @@ public class CantAttackControllerAttachedEffect extends RestrictionEffect { return plainswalker == null || !plainswalker.getControllerId().equals(source.getControllerId()); } - + @Override public CantAttackControllerAttachedEffect copy() { return new CantAttackControllerAttachedEffect(this); diff --git a/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java b/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java index 06749ce98de..d58293e927c 100644 --- a/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/CantBlockAttachedEffect.java @@ -40,17 +40,17 @@ import mage.game.permanent.Permanent; */ public class CantBlockAttachedEffect extends RestrictionEffect { - public CantBlockAttachedEffect(AttachmentType attachmentType) { + public CantBlockAttachedEffect(AttachmentType attachmentType) { this(attachmentType, Duration.WhileOnBattlefield); } - - public CantBlockAttachedEffect(AttachmentType attachmentType, Duration duration) { + + public CantBlockAttachedEffect(AttachmentType attachmentType, Duration duration) { super(duration); StringBuilder sb = new StringBuilder(); if (attachmentType.equals(AttachmentType.AURA)) { sb.append("Enchanted creature can't block"); } else { - sb.append("Equiped creature can't block"); + sb.append("Equipped creature can't block"); } if (!duration.toString().isEmpty()) { sb.append(" ").append(duration.toString()); diff --git a/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java b/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java index a795f208948..729dbfe325f 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/ExchangeControlTargetEffect.java @@ -25,9 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - + package mage.abilities.effects.common.continuous; - + import java.util.*; import mage.constants.Duration; import mage.constants.Layer; @@ -38,57 +38,57 @@ import mage.abilities.Mode; import mage.abilities.effects.ContinuousEffectImpl; import mage.game.Game; import mage.game.permanent.Permanent; - + /** * @author magenoxx_at_googlemail.com */ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { - + private String rule; private boolean withSource; private boolean withSecondTarget; private Map zoneChangeCounter = new HashMap<>(); private Map lockedControllers = new HashMap<>(); - + public ExchangeControlTargetEffect(Duration duration, String rule) { this(duration, rule, false); } - + public ExchangeControlTargetEffect(Duration duration, String rule, boolean withSource) { this(duration, rule, withSource, false); } - + public ExchangeControlTargetEffect(Duration duration, String rule, boolean withSource, boolean withSecondTarget) { super(duration, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); this.withSource = withSource; this.withSecondTarget = withSecondTarget; this.rule = rule; } - + public ExchangeControlTargetEffect(final ExchangeControlTargetEffect effect) { super(effect); this.rule = effect.rule; this.withSource = effect.withSource; this.withSecondTarget = effect.withSecondTarget; - this.lockedControllers = effect.lockedControllers; - this.zoneChangeCounter = effect.zoneChangeCounter; + this.lockedControllers = new HashMap(effect.lockedControllers); + this.zoneChangeCounter = new HashMap(effect.zoneChangeCounter); } - + @Override public ExchangeControlTargetEffect copy() { return new ExchangeControlTargetEffect(this); } - + @Override public boolean isInactive(Ability source, Game game) { return isDiscarded(); } - + @Override public void init(Ability source, Game game) { Permanent permanent1 = null; Permanent permanent2 = null; - + if (withSource) { permanent1 = game.getPermanent(targetPointer.getFirst(game, source)); permanent2 = game.getPermanent(source.getSourceId()); @@ -115,13 +115,13 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { this.lockedControllers.put(permanent1.getId(), permanent2.getControllerId()); this.zoneChangeCounter.put(permanent1.getId(), permanent1.getZoneChangeCounter(game)); this.lockedControllers.put(permanent2.getId(), permanent1.getControllerId()); - this.zoneChangeCounter.put(permanent2.getId(), permanent2.getZoneChangeCounter(game)); + this.zoneChangeCounter.put(permanent2.getId(), permanent2.getZoneChangeCounter(game)); } else { // discard if there are less than 2 permanents discard(); } } - + @Override public boolean apply(Game game, Ability source) { Set toDelete = new HashSet<>(); @@ -137,7 +137,7 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { } if (!toDelete.isEmpty()) { for(UUID uuid: toDelete) { - zoneChangeCounter.remove(uuid); + zoneChangeCounter.remove(uuid); } if (zoneChangeCounter.isEmpty()) { discard(); @@ -146,7 +146,7 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl { } return true; } - + @Override public String getText(Mode mode) { return this.rule; diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index c93b60b6a73..c0b550a7c16 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -7509,7 +7509,7 @@ Charging Troll|Invasion|239|U|{2}{G}{W}|Creature - Troll|3|3|Vigilance${G}: Rege Pledge of Loyalty|Invasion|24|U|{1}{W}|Enchantment - Aura|||Enchant creature$Enchanted creature has protection from the colors of permanents you control. This effect doesn't remove Pledge of Loyalty.| Cinder Shade|Invasion|240|U|{1}{B}{R}|Creature - Shade|1|1|{B}: Cinder Shade gets +1/+1 until end of turn.${R}, Sacrifice Cinder Shade: Cinder Shade deals damage equal to its power to target creature.| Coalition Victory|Invasion|241|R|{3}{W}{U}{B}{R}{G}|Sorcery|||You win the game if you control a land of each basic land type and a creature of each color.| -Crosis, the Purger|Invasion|242|R|{3}{U}|Legendary Creature - Dragon|6|6|Flying$Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color.| +Crosis, the Purger|Invasion|242|R|{3}{U}{B}{R}|Legendary Creature - Dragon|6|6|Flying$Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color.| Darigaaz, the Igniter|Invasion|243|R|{3}{B}{R}{G}|Legendary Creature - Dragon|6|6|Flying$Whenever Darigaaz, the Igniter deals combat damage to a player, you may pay {2}{R}. If you do, choose a color, then that player reveals his or her hand and Darigaaz deals damage to the player equal to the number of cards of that color revealed this way.| Dromar, the Banisher|Invasion|244|R|{3}{W}{U}{B}|Legendary Creature - Dragon|6|6|Flying$Whenever Dromar, the Banisher deals combat damage to a player, you may pay {2}{U}. If you do, choose a color, then return all creatures of that color to their owners' hands.| Dueling Grounds|Invasion|245|R|{1}{G}{W}|Enchantment|||No more than one creature can attack each turn.$No more than one creature can block each turn.|