diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/TrinketMage.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/TrinketMage.java new file mode 100644 index 00000000000..b7440bffcba --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/TrinketMage.java @@ -0,0 +1,58 @@ +/* + * 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.elspethvstezzeret; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.cards.CardImpl; + +/** + * + * @author ayrant + */ +public class TrinketMage extends mage.sets.scarsofmirrodin.TrinketMage { + + public TrinketMage (UUID ownerId) { + super(ownerId); + this.expansionSetCode = "DDF"; + this.cardNumber = 49; + } + + public TrinketMage (final TrinketMage card) { + super(card); + } + + @Override + public TrinketMage copy() { + return new TrinketMage(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/DissipationField.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/DissipationField.java new file mode 100644 index 00000000000..8367f7f6cb7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/DissipationField.java @@ -0,0 +1,107 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.sets.scarsofmirrodin; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.TargetStackObject; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author ayratn + */ +public class DissipationField extends CardImpl { + + public DissipationField (UUID ownerId) { + super(ownerId, 32, "Dissipation Field", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); + this.expansionSetCode = "SOM"; + this.color.setBlue(true); + this.addAbility(new DissipationFieldEffect()); + } + + public DissipationField (final DissipationField card) { + super(card); + } + + @Override + public DissipationField copy() { + return new DissipationField(this); + } + + public class DissipationFieldEffect extends TriggeredAbilityImpl { + + public DissipationFieldEffect() { + super(Constants.Zone.BATTLEFIELD, new ReturnToHandTargetEffect()); + } + + public DissipationFieldEffect(DissipationFieldEffect effect) { + super(effect); + } + + @Override + public DissipationFieldEffect copy() { + return new DissipationFieldEffect(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER && event.getTargetId().equals(this.controllerId)) { + Permanent permanent = game.getPermanent(event.getSourceId()); + if (permanent != null) { + this.getTargets().clear(); + TargetCreaturePermanent target = new TargetCreaturePermanent(); + target.add(permanent.getId(), game); + this.addTarget(target); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a permanent deals damage to you, return it to its owner's hand."; + } + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/LumengridDrake.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/LumengridDrake.java new file mode 100644 index 00000000000..522e9e56164 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/LumengridDrake.java @@ -0,0 +1,78 @@ +/* + * 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.scarsofmirrodin; + +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.Metalcraft; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author ayrat + */ +public class LumengridDrake extends CardImpl { + + private static final String text = "Metalcraft - When Lumengrid Drake enters the battlefield, if you control three or more artifacts, return target creature to its owner's hand."; + + public LumengridDrake(UUID ownerId) { + super(ownerId, 36, "Lumengrid Drake", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "SOM"; + this.subtype.add("Drake"); + this.color.setBlue(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + Effect effect = new ReturnToHandTargetEffect(); + TriggeredAbility conditional = new ConditionalTriggeredAbility( + new EntersBattlefieldTriggeredAbility(effect), effect, Metalcraft.getInstance(), text); + conditional.addTarget(new TargetCreaturePermanent()); + this.addAbility(conditional); + } + + public LumengridDrake(final LumengridDrake card) { + super(card); + } + + @Override + public LumengridDrake copy() { + return new LumengridDrake(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/QuicksilverGargantuan.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/QuicksilverGargantuan.java new file mode 100644 index 00000000000..6f353188f9e --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/QuicksilverGargantuan.java @@ -0,0 +1,128 @@ +/* + * 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.scarsofmirrodin; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author ayratn + */ +public class QuicksilverGargantuan extends CardImpl { + + private static final String text = "You may have Quicksilver Gargantuan enter the battlefield as a copy of any creature on the battlefield, except it's still 7/7"; + + public QuicksilverGargantuan(UUID ownerId) { + super(ownerId, 39, "Quicksilver Gargantuan", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "SOM"; + this.subtype.add("Shapeshifter"); + this.color.setBlue(true); + this.power = new MageInt(7); + this.toughness = new MageInt(7); + + Ability ability = new EntersBattlefieldAbility(new QuicksilverGargantuanCopyEffect(), text); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public QuicksilverGargantuan(final QuicksilverGargantuan card) { + super(card); + } + + @Override + public QuicksilverGargantuan copy() { + return new QuicksilverGargantuan(this); + } + + private class QuicksilverGargantuanCopyEffect extends ContinuousEffectImpl { + + public QuicksilverGargantuanCopyEffect() { + super(Constants.Duration.WhileOnBattlefield, Constants.Layer.CopyEffects_1, Constants.SubLayer.NA, Constants.Outcome.BecomeCreature); + } + + public QuicksilverGargantuanCopyEffect(final QuicksilverGargantuanCopyEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Card card = game.getCard(source.getFirstTarget()); + Permanent permanent = game.getPermanent(source.getSourceId()); + permanent.setName(card.getName()); + permanent.getColor().setColor(card.getColor()); + permanent.getManaCost().clear(); + permanent.getManaCost().add(card.getManaCost()); + permanent.getCardType().clear(); + for (CardType type : card.getCardType()) { + permanent.getCardType().add(type); + } + permanent.getSubtype().clear(); + for (String type : card.getSubtype()) { + permanent.getSubtype().add(type); + } + permanent.getSupertype().clear(); + for (String type : card.getSupertype()) { + permanent.getSupertype().add(type); + } + permanent.setExpansionSetCode(card.getExpansionSetCode()); + permanent.getAbilities().clear(); + for (Ability ability : card.getAbilities()) { + permanent.addAbility(ability); + } + permanent.getLoyalty().setValue(card.getLoyalty().getValue()); + permanent.setArt(card.getArt()); + + return true; + } + + @Override + public QuicksilverGargantuanCopyEffect copy() { + return new QuicksilverGargantuanCopyEffect(this); + } + + @Override + public String getText(Ability source) { + return "You may have {this} enter the battlefield as a copy of any " + source.getTargets().get(0).getTargetName() + " on the battlefield, except it's still 7/7"; + } + + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/ScrapdiverSerpent.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/ScrapdiverSerpent.java new file mode 100644 index 00000000000..9b01cef79ec --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/ScrapdiverSerpent.java @@ -0,0 +1,98 @@ +/* + * 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.scarsofmirrodin; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.ControlsPermanent; +import mage.abilities.decorator.ConditionalContinousEffect; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continious.GainAbilitySourceEffect; +import mage.abilities.keyword.UnblockableAbility; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.FilterPermanent; +import mage.game.Game; + +/** + * + * @author Loki + */ +public class ScrapdiverSerpent extends CardImpl { + + private static final String text = "Scrapdiver Serpent is unblockable as long as defending player controls an artifact"; + + private static final FilterPermanent filter = new FilterPermanent(); + + static { + filter.getCardType().add(Constants.CardType.ARTIFACT); + filter.setScopeCardType(Filter.ComparisonScope.Any); + } + + private class DefendingPlayerControlsArtifact implements Condition { + @Override + public boolean apply(Game game, Ability source) { + UUID defendingPlayer = game.getCombat().getDefendingPlayer(source.getSourceId()); + if (defendingPlayer != null) { + return game.getBattlefield().countAll(filter, defendingPlayer) > 0; + } + return false; + } + } + + public ScrapdiverSerpent (UUID ownerId) { + super(ownerId, 41, "Scrapdiver Serpent", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{U}{U}"); + this.expansionSetCode = "SOM"; + this.subtype.add("Serpent"); + this.color.setBlue(true); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + ContinuousEffect gainAbility = new GainAbilitySourceEffect(UnblockableAbility.getInstance(), Constants.Duration.WhileOnBattlefield); + Effect effect = new ConditionalContinousEffect(gainAbility, new DefendingPlayerControlsArtifact(), text); + this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, effect)); + } + + public ScrapdiverSerpent (final ScrapdiverSerpent card) { + super(card); + } + + @Override + public ScrapdiverSerpent copy() { + return new ScrapdiverSerpent(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/ScreechingSilcaw.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/ScreechingSilcaw.java new file mode 100644 index 00000000000..8b9708de0b5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/ScreechingSilcaw.java @@ -0,0 +1,80 @@ +/* + * 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.scarsofmirrodin; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.Metalcraft; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DiscardTargetEffect; +import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.target.TargetPlayer; + +/** + * + * @author Loki + */ +public class ScreechingSilcaw extends CardImpl { + + private static final String text = "Metalcraft - Whenever Screeching Silcaw deals combat damage to a player, if you control three or more artifacts, that player puts the top four cards of his or her library into his or her graveyard."; + + public ScreechingSilcaw (UUID ownerId) { + super(ownerId, 42, "Screeching Silcaw", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "SOM"; + this.subtype.add("Bird"); + this.color.setBlue(true); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + this.addAbility(FlyingAbility.getInstance()); + + Effect effect = new PutLibraryIntoGraveTargetEffect(4); + TriggeredAbility ability = new DealsCombatDamageToAPlayerTriggeredAbility(effect, false); + TriggeredAbility conditional = new ConditionalTriggeredAbility( + ability, effect, Metalcraft.getInstance(), text); + this.addAbility(conditional); + } + + public ScreechingSilcaw (final ScreechingSilcaw card) { + super(card); + } + + @Override + public ScreechingSilcaw copy() { + return new ScreechingSilcaw(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/ShapeAnew.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/ShapeAnew.java new file mode 100644 index 00000000000..a04ba7fbce2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/ShapeAnew.java @@ -0,0 +1,126 @@ +/* + * 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.scarsofmirrodin; + +import java.util.List; +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.filter.Filter; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +/** + * + * @author ayratn + */ +public class ShapeAnew extends CardImpl { + + private static FilterPermanent filter = new FilterPermanent("an artifact"); + + static { + filter.getCardType().add(CardType.ARTIFACT); + } + + public ShapeAnew (UUID ownerId) { + super(ownerId, 43, "Shape Anew", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}"); + this.expansionSetCode = "SOM"; + this.color.setBlue(true); + this.getSpellAbility().addEffect(new SacrificeTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + this.getSpellAbility().addEffect(new ShapeAnewEffect()); + } + + public ShapeAnew (final ShapeAnew card) { + super(card); + } + + @Override + public ShapeAnew copy() { + return new ShapeAnew(this); + } + + private class ShapeAnewEffect extends OneShotEffect { + + public ShapeAnewEffect() { + super(Constants.Outcome.PutCardInPlay); + } + + public ShapeAnewEffect(ShapeAnewEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Card artifact = game.getLastKnownInformation(source.getFirstTarget(), Constants.Zone.BATTLEFIELD); + if (artifact == null) { + return false; + } + Player controller = game.getPlayer(((Permanent)artifact).getControllerId()); + if (controller == null) { + return false; + } + Cards revealed = new CardsImpl(); + Card artifactCard = null; + Cards nonArtifactCards = new CardsImpl(); + Player player = game.getPlayer(source.getControllerId()); + while (artifactCard == null && player.getLibrary().size() > 0) { + Card card = player.getLibrary().removeFromTop(game); + revealed.add(card); + if (card.getCardType().contains(CardType.ARTIFACT)) + artifactCard = card; + else + nonArtifactCards.add(card); + } + player.revealCards("Shape Anew", revealed, game); + artifactCard.putOntoBattlefield(game, Constants.Zone.LIBRARY, source.getId(), controller.getId()); + player.getLibrary().addAll(nonArtifactCards.getCards(game), game); + player.getLibrary().shuffle(); + return true; + } + + @Override + public ShapeAnewEffect copy() { + return new ShapeAnewEffect(this); + } + } +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/StoicRebuttal.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/StoicRebuttal.java new file mode 100644 index 00000000000..c3efaadfaef --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/StoicRebuttal.java @@ -0,0 +1,99 @@ +/* + * 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.scarsofmirrodin; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.condition.common.Metalcraft; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCost; +import mage.abilities.costs.mana.ManaCosts; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.CostModificationEffectImpl; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.target.TargetSpell; +import mage.watchers.WatcherImpl; + +import java.util.UUID; + +/** + * @author ayrat + */ +public class StoicRebuttal extends CardImpl { + + public StoicRebuttal(UUID ownerId) { + super(ownerId, 46, "Stoic Rebuttal", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}{U}"); + this.expansionSetCode = "SOM"; + this.color.setBlue(true); + this.getSpellAbility().addTarget(new TargetSpell()); + this.getSpellAbility().addEffect(new CounterTargetEffect()); + } + + public StoicRebuttal(final StoicRebuttal card) { + super(card); + } + + @Override + public void adjustCosts(Ability ability, Game game) { + if (Metalcraft.getInstance().apply(game, ability)) { + /*ManaCosts previousCost = ability.getManaCostsToPay(); + ManaCosts adjustedCost = new ManaCostsImpl(); + boolean reduced = false; + for (ManaCost manaCost : previousCost) { + Mana mana = manaCost.getOptions().get(0); + if (!reduced && mana != null && mana.getColorless() > 0) { + mana.setColorless(0); + adjustedCost.add(manaCost); + reduced = true; + } else { + adjustedCost.add(manaCost); + } + } + ability.getManaCostsToPay().clear(); + ability.getManaCostsToPay().addAll(adjustedCost);*/ + ability.getManaCostsToPay().clear(); + ability.getManaCostsToPay().load("{U}{U}"); + } + } + + @Override + public StoicRebuttal copy() { + return new StoicRebuttal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/TrinketMage.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/TrinketMage.java new file mode 100644 index 00000000000..664893227a9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/TrinketMage.java @@ -0,0 +1,80 @@ +/* + * 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.scarsofmirrodin; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.SearchEffect; +import mage.abilities.effects.common.SearchLibraryRevealPutInHandEffect; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.FilterCard; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author ayratn + */ +public class TrinketMage extends CardImpl { + + private static FilterCard filter = new FilterCard("an artifact card with converted mana cost 1 or less"); + + static { + filter.getCardType().add(CardType.ARTIFACT); + filter.setConvertedManaCost(2); + filter.setConvertedManaCostComparison(Filter.ComparisonType.LessThan); + } + + public TrinketMage(UUID ownerId) { + super(ownerId, 48, "Trinket Mage", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "SOM"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.color.setBlue(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + TargetCardInLibrary target = new TargetCardInLibrary(0, 1, filter); + SearchEffect effect = new SearchLibraryRevealPutInHandEffect(target); + this.addAbility(new EntersBattlefieldTriggeredAbility(effect, true)); + } + + public TrinketMage(final TrinketMage card) { + super(card); + } + + @Override + public TrinketMage copy() { + return new TrinketMage(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/TurnAside.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/TurnAside.java new file mode 100644 index 00000000000..831f2f88fb1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/TurnAside.java @@ -0,0 +1,176 @@ +/* + * 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.scarsofmirrodin; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.filter.Filter; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; +import mage.target.TargetObject; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.UUID; + +/** + * @author ayratn + */ +public class TurnAside extends CardImpl { + + private static FilterSpell filter = new FilterSpell("spell that targets a permanent you control"); + + public TurnAside(UUID ownerId) { + super(ownerId, 49, "Turn Aside", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{U}"); + this.expansionSetCode = "SOM"; + this.color.setBlue(true); + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new CustomTargetSpell(filter)); + } + + public TurnAside(final TurnAside card) { + super(card); + } + + @Override + public TurnAside copy() { + return new TurnAside(this); + } + + private class CustomTargetSpell extends TargetObject { + + protected FilterSpell filter; + + public CustomTargetSpell() { + this(1, 1, new FilterSpell()); + } + + public CustomTargetSpell(FilterSpell filter) { + this(1, 1, filter); + } + + public CustomTargetSpell(int numTargets, FilterSpell filter) { + this(numTargets, numTargets, filter); + } + + public CustomTargetSpell(int minNumTargets, int maxNumTargets, FilterSpell filter) { + this.minNumberOfTargets = minNumTargets; + this.maxNumberOfTargets = maxNumTargets; + this.zone = Constants.Zone.STACK; + this.filter = filter; + this.targetName = filter.getMessage(); + } + + public CustomTargetSpell(final CustomTargetSpell target) { + super(target); + this.filter = target.filter.copy(); + } + + @Override + public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { + return canChoose(sourceControllerId, game); + } + + @Override + public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { + return possibleTargets(sourceControllerId, game); + } + + @Override + public boolean canTarget(UUID id, Ability source, Game game) { + if (super.canTarget(id, source, game)) { + if (targetsMyPermanent(id, source.getControllerId(), game)) { + return true; + } + } + return false; + } + + @Override + public boolean canChoose(UUID sourceControllerId, Game game) { + int count = 0; + for (StackObject stackObject : game.getStack()) { + if (stackObject instanceof Spell && game.getPlayer(sourceControllerId).getInRange().contains(stackObject.getControllerId()) && filter.match((Spell) stackObject)) { + if (targetsMyPermanent(stackObject.getId(), sourceControllerId, game)) { + count++; + if (count >= this.minNumberOfTargets) + return true; + } + } + } + return false; + } + + @Override + public Set possibleTargets(UUID sourceControllerId, Game game) { + Set possibleTargets = new HashSet(); + for (StackObject stackObject : game.getStack()) { + if (stackObject instanceof Spell && game.getPlayer(sourceControllerId).getInRange().contains(stackObject.getControllerId()) && filter.match((Spell) stackObject)) { + if (targetsMyPermanent(stackObject.getId(), sourceControllerId, game)) { + + possibleTargets.add(stackObject.getId()); + } + } + } + return possibleTargets; + } + + @Override + public Filter getFilter() { + return filter; + } + + private boolean targetsMyPermanent(UUID id, UUID controllerId, Game game) { + StackObject spell = game.getStack().getStackObject(id); + if (spell != null) { + Ability ability = spell.getStackAbility(); + for (UUID permanentId : ability.getTargets().get(0).getTargets()) { + Permanent permanent = game.getPermanent(permanentId); + if (permanent != null && permanent.getControllerId().equals(controllerId)) { + return true; + } + } + } + return false; + } + + @Override + public CustomTargetSpell copy() { + return new CustomTargetSpell(this); + } + } +} diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/TwistedImage.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/TwistedImage.java new file mode 100644 index 00000000000..0fbc2841959 --- /dev/null +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/TwistedImage.java @@ -0,0 +1,65 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.sets.scarsofmirrodin; + +import java.util.UUID; + +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.effects.common.DrawCardControllerEffect; +import mage.abilities.effects.common.continious.SwitchPowerToughnessTargetEffect; +import mage.cards.CardImpl; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author ayratn + */ +public class TwistedImage extends CardImpl { + + public TwistedImage (UUID ownerId) { + super(ownerId, 50, "Twisted Image", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{U}"); + this.expansionSetCode = "SOM"; + this.color.setBlue(true); + this.getSpellAbility().addEffect(new SwitchPowerToughnessTargetEffect(Constants.Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new DrawCardControllerEffect(1)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public TwistedImage (final TwistedImage card) { + super(card); + } + + @Override + public TwistedImage copy() { + return new TwistedImage(this); + } + +}