diff --git a/Mage.Sets/src/mage/cards/r/RishkarsExpertise.java b/Mage.Sets/src/mage/cards/r/RishkarsExpertise.java index 76fdf736f37..d9812470b3d 100644 --- a/Mage.Sets/src/mage/cards/r/RishkarsExpertise.java +++ b/Mage.Sets/src/mage/cards/r/RishkarsExpertise.java @@ -25,28 +25,24 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ + package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.cost.CastWithoutPayingManaCostEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.Filter; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterNonlandCard; -import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; + +import java.util.UUID; /** - * * @author fireshoes */ public class RishkarsExpertise extends CardImpl { @@ -56,10 +52,10 @@ public class RishkarsExpertise extends CardImpl { // Draw cards equal to the greatest power among creatures you control. - getSpellAbility().addEffect(new RishkarsExpertiseDrawEffect()); + this.getSpellAbility().addEffect(new RishkarsExpertiseDrawEffect()); // You may cast a card with converted mana cost 5 or less from your hand without paying its mana cost. - getSpellAbility().addEffect(new RishkarsExpertiseCastEffect()); + this.getSpellAbility().addEffect(new CastWithoutPayingManaCostEffect(5)); } public RishkarsExpertise(final RishkarsExpertise card) { @@ -105,54 +101,3 @@ class RishkarsExpertiseDrawEffect extends OneShotEffect { } } - -class RishkarsExpertiseCastEffect extends OneShotEffect { - - private static final FilterNonlandCard filter = new FilterNonlandCard("card with converted mana cost 5 or less from your hand"); - - static { - filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 6)); - } - - public RishkarsExpertiseCastEffect() { - super(Outcome.PlayForFree); - this.staticText = "you may cast a card with converted mana cost 5 or less from your hand without paying its mana cost"; - } - - public RishkarsExpertiseCastEffect(final RishkarsExpertiseCastEffect effect) { - super(effect); - } - - @Override - public RishkarsExpertiseCastEffect copy() { - return new RishkarsExpertiseCastEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCardInHand(filter); - if (target.canChoose(source.getSourceId(), controller.getId(), game) && - controller.chooseUse(outcome, "Cast a card with converted mana cost 5 or less from your hand without paying its mana cost?", source, game)) { - Card cardToCast = null; - boolean cancel = false; - while (controller.canRespond() && !cancel) { - if (controller.chooseTarget(outcome, target, source, game)) { - cardToCast = game.getCard(target.getFirstTarget()); - if (cardToCast != null && cardToCast.getSpellAbility().canChooseTarget(game)) { - cancel = true; - } - } else { - cancel = true; - } - } - if (cardToCast != null) { - controller.cast(cardToCast.getSpellAbility(), game, true); - } - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/s/SramsExpertise.java b/Mage.Sets/src/mage/cards/s/SramsExpertise.java index 1996ea2741e..e05676f911d 100644 --- a/Mage.Sets/src/mage/cards/s/SramsExpertise.java +++ b/Mage.Sets/src/mage/cards/s/SramsExpertise.java @@ -25,28 +25,19 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ + package mage.cards.s; -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.cards.Card; +import mage.abilities.effects.common.cost.CastWithoutPayingManaCostEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.filter.Filter; -import mage.filter.common.FilterNonlandCard; -import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; -import mage.game.Game; import mage.game.permanent.token.ServoToken; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; + +import java.util.UUID; /** - * * @author fireshoes */ public class SramsExpertise extends CardImpl { @@ -56,10 +47,10 @@ public class SramsExpertise extends CardImpl { // Create three 1/1 colorless Servo artifact creature tokens. - getSpellAbility().addEffect(new CreateTokenEffect(new ServoToken(), 3)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ServoToken(), 3)); // You may cast a card with converted mana cost 3 or less from your hand without paying its mana cost. - getSpellAbility().addEffect(new SramsExpertiseCastEffect()); + this.getSpellAbility().addEffect(new CastWithoutPayingManaCostEffect(3)); } public SramsExpertise(final SramsExpertise card) { @@ -71,54 +62,3 @@ public class SramsExpertise extends CardImpl { return new SramsExpertise(this); } } - -class SramsExpertiseCastEffect extends OneShotEffect { - - private static final FilterNonlandCard filter = new FilterNonlandCard("card with converted mana cost 3 or less from your hand"); - - static { - filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 4)); - } - - public SramsExpertiseCastEffect() { - super(Outcome.PlayForFree); - this.staticText = "you may cast a card with converted mana cost 3 or less from your hand without paying its mana cost"; - } - - public SramsExpertiseCastEffect(final SramsExpertiseCastEffect effect) { - super(effect); - } - - @Override - public SramsExpertiseCastEffect copy() { - return new SramsExpertiseCastEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCardInHand(filter); - if (target.canChoose(source.getSourceId(), controller.getId(), game) && - controller.chooseUse(outcome, "Cast a card with converted mana cost 3 or less from your hand without paying its mana cost?", source, game)) { - Card cardToCast = null; - boolean cancel = false; - while (controller.canRespond() && !cancel) { - if (controller.chooseTarget(outcome, target, source, game)) { - cardToCast = game.getCard(target.getFirstTarget()); - if (cardToCast != null && cardToCast.getSpellAbility().canChooseTarget(game)) { - cancel = true; - } - } else { - cancel = true; - } - } - if (cardToCast != null) { - controller.cast(cardToCast.getSpellAbility(), game, true); - } - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/y/YahennisExpertise.java b/Mage.Sets/src/mage/cards/y/YahennisExpertise.java index d6360553e24..3cff025e55a 100644 --- a/Mage.Sets/src/mage/cards/y/YahennisExpertise.java +++ b/Mage.Sets/src/mage/cards/y/YahennisExpertise.java @@ -25,28 +25,19 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ + package mage.cards.y; -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; -import mage.cards.Card; +import mage.abilities.effects.common.cost.CastWithoutPayingManaCostEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Outcome; -import mage.filter.Filter; -import mage.filter.common.FilterNonlandCard; -import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; -import mage.game.Game; -import mage.players.Player; -import mage.target.Target; -import mage.target.common.TargetCardInHand; + +import java.util.UUID; /** - * * @author fireshoes */ public class YahennisExpertise extends CardImpl { @@ -56,10 +47,10 @@ public class YahennisExpertise extends CardImpl { // All creatures get -3/-3 until end of turn. - getSpellAbility().addEffect(new BoostAllEffect(-3, -3, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostAllEffect(-3, -3, Duration.EndOfTurn)); // You may cast a card with converted mana cost 3 or less from your hand without paying its mana cost. - getSpellAbility().addEffect(new YahennisExpertiseCastEffect()); + this.getSpellAbility().addEffect(new CastWithoutPayingManaCostEffect(3)); } public YahennisExpertise(final YahennisExpertise card) { @@ -71,54 +62,3 @@ public class YahennisExpertise extends CardImpl { return new YahennisExpertise(this); } } - -class YahennisExpertiseCastEffect extends OneShotEffect { - - private static final FilterNonlandCard filter = new FilterNonlandCard("card with converted mana cost 3 or less from your hand"); - - static { - filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 4)); - } - - public YahennisExpertiseCastEffect() { - super(Outcome.PlayForFree); - this.staticText = "you may cast a card with converted mana cost 3 or less from your hand without paying its mana cost"; - } - - public YahennisExpertiseCastEffect(final YahennisExpertiseCastEffect effect) { - super(effect); - } - - @Override - public YahennisExpertiseCastEffect copy() { - return new YahennisExpertiseCastEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Target target = new TargetCardInHand(filter); - if (target.canChoose(source.getSourceId(), controller.getId(), game) && - controller.chooseUse(outcome, "Cast a card with converted mana cost 3 or less from your hand without paying its mana cost?", source, game)) { - Card cardToCast = null; - boolean cancel = false; - while (controller.canRespond() && !cancel) { - if (controller.chooseTarget(outcome, target, source, game)) { - cardToCast = game.getCard(target.getFirstTarget()); - if (cardToCast != null && cardToCast.getSpellAbility().canChooseTarget(game)) { - cancel = true; - } - } else { - cancel = true; - } - } - if (cardToCast != null) { - controller.cast(cardToCast.getSpellAbility(), game, true); - } - } - return true; - } - return false; - } -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/CastWithoutPayingManaCostEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/CastWithoutPayingManaCostEffect.java new file mode 100644 index 00000000000..46294e4581e --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/CastWithoutPayingManaCostEffect.java @@ -0,0 +1,105 @@ +/* + * 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.cost; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.filter.Filter; +import mage.filter.common.FilterNonlandCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCardInHand; + +/** + * @author fireshoes - Original Code + * @author JRHerlehy - Implement as seperate class + *

+ * Allows player to choose to cast as card from hand without paying its mana cost. + *

+ */ +public class CastWithoutPayingManaCostEffect extends OneShotEffect { + + private final FilterNonlandCard filter; + private final int manaCost; + + /** + * @param maxCost Maximum converted mana cost for this effect to apply to + */ + public CastWithoutPayingManaCostEffect(int maxCost) { + super(Outcome.PlayForFree); + filter = new FilterNonlandCard("card with converted mana cost " + maxCost + " or less from your hand"); + filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, maxCost + 1)); + this.manaCost = maxCost; + this.staticText = "you may cast a card with converted mana cost " + maxCost + " or less from your hand without paying its mana cost"; + } + + public CastWithoutPayingManaCostEffect(final CastWithoutPayingManaCostEffect effect) { + super(effect); + this.filter = effect.filter.copy(); + this.manaCost = effect.manaCost; + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + + if (controller == null) return false; + + Target target = new TargetCardInHand(filter); + if (target.canChoose(source.getSourceId(), controller.getId(), game) && + controller.chooseUse(outcome, "Cast a card with converted mana cost " + manaCost + + " or less from your hand without paying its mana cost?", source, game)) { + Card cardToCast = null; + boolean cancel = false; + while (controller.canRespond() && !cancel) { + if (controller.chooseTarget(outcome, target, source, game)) { + cardToCast = game.getCard(target.getFirstTarget()); + if (cardToCast != null && cardToCast.getSpellAbility().canChooseTarget(game)) { + cancel = true; + } + } else { + cancel = true; + } + } + if (cardToCast != null) { + controller.cast(cardToCast.getSpellAbility(), game, true); + } + } + return true; + } + + @Override + public CastWithoutPayingManaCostEffect copy() { + return new CastWithoutPayingManaCostEffect(this); + } +}