diff --git a/Mage.Sets/src/mage/sets/magic2013/Switcheroo.java b/Mage.Sets/src/mage/sets/magic2013/Switcheroo.java index fa8db47aba8..9a4410890d7 100644 --- a/Mage.Sets/src/mage/sets/magic2013/Switcheroo.java +++ b/Mage.Sets/src/mage/sets/magic2013/Switcheroo.java @@ -27,9 +27,12 @@ */ package mage.sets.magic2013; +import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.abilities.effects.common.continious.ExchangeControlTargetEffect; import mage.cards.CardImpl; +import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -38,6 +41,8 @@ import java.util.UUID; */ public class Switcheroo extends CardImpl { + private static final String rule = "Exchange control of two target creatures"; + public Switcheroo(UUID ownerId) { super(ownerId, 71, "Switcheroo", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{4}{U}"); this.expansionSetCode = "M13"; @@ -45,7 +50,8 @@ public class Switcheroo extends CardImpl { this.color.setBlue(true); // Exchange control of two target creatures. - // TODO: implement + this.getSpellAbility().addEffect(new ExchangeControlTargetEffect(Constants.Duration.EndOfGame, rule)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(2)); } public Switcheroo(final Switcheroo card) { diff --git a/Mage/src/mage/abilities/effects/common/continious/ExchangeControlTargetEffect.java b/Mage/src/mage/abilities/effects/common/continious/ExchangeControlTargetEffect.java new file mode 100644 index 00000000000..972212518d9 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/continious/ExchangeControlTargetEffect.java @@ -0,0 +1,102 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.abilities.effects.common.continious; + +import mage.Constants.Duration; +import mage.Constants.Layer; +import mage.Constants.Outcome; +import mage.Constants.SubLayer; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.UUID; + +/** + * @author magenoxx_at_googlemail.com + */ +public class ExchangeControlTargetEffect extends ContinuousEffectImpl { + + private String rule; + + public ExchangeControlTargetEffect(Duration duration, String rule) { + super(duration, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + this.rule = rule; + } + + public ExchangeControlTargetEffect(final ExchangeControlTargetEffect effect) { + super(effect); + this.rule = effect.rule; + } + + @Override + public ExchangeControlTargetEffect copy() { + return new ExchangeControlTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Set controllers = new HashSet(); + for (UUID permanentId : targetPointer.getTargets(game, source)) { + Permanent permanent = game.getPermanent(permanentId); + if (permanent != null) { + controllers.add(permanent.getControllerId()); + } + } + // exchange works only for two different controllers + if (controllers.size() != 2) { + // discard effect + this.discarded = true; + return false; + } + + Iterator it = controllers.iterator(); + UUID firstController = it.next(); + UUID secondController = it.next(); + + for (UUID permanentId : targetPointer.getTargets(game, source)) { + Permanent permanent = game.getPermanent(permanentId); + if (permanent != null) { + permanent.changeControllerId(permanent.getControllerId().equals(firstController) ? secondController : firstController, game); + } + } + + return true; + } + + @Override + public String getText(Mode mode) { + return this.rule; + } +}