diff --git a/Mage.Sets/src/mage/sets/invasion/UrzasFilter.java b/Mage.Sets/src/mage/sets/invasion/UrzasFilter.java new file mode 100644 index 00000000000..18b96f3dfbd --- /dev/null +++ b/Mage.Sets/src/mage/sets/invasion/UrzasFilter.java @@ -0,0 +1,67 @@ +/* + * 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.SimpleStaticAbility; +import mage.abilities.effects.common.cost.SpellsCostReductionAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.MulticoloredPredicate; + +/** + * + * @author LevelX2 + */ +public class UrzasFilter extends CardImpl { + private static final FilterCard filter = new FilterCard("multicolored spells"); + + static { + filter.add(new MulticoloredPredicate()); + } + + public UrzasFilter(UUID ownerId) { + super(ownerId, 318, "Urza's Filter", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}"); + this.expansionSetCode = "INV"; + + // Multicolored spells cost up to {2} less to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionAllEffect(filter, 2, true))); + } + + public UrzasFilter(final UrzasFilter card) { + super(card); + } + + @Override + public UrzasFilter copy() { + return new UrzasFilter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/ManaMatrix.java b/Mage.Sets/src/mage/sets/legends/ManaMatrix.java new file mode 100644 index 00000000000..efcc4ba9f45 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/ManaMatrix.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.legends; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class ManaMatrix extends mage.sets.masterseditioniv.ManaMatrix { + + public ManaMatrix(UUID ownerId) { + super(ownerId); + this.cardNumber = 230; + this.expansionSetCode = "LEG"; + } + + public ManaMatrix(final ManaMatrix card) { + super(card); + } + + @Override + public ManaMatrix copy() { + return new ManaMatrix(this); + } +} diff --git a/Mage.Sets/src/mage/sets/legends/PlanarGate.java b/Mage.Sets/src/mage/sets/legends/PlanarGate.java new file mode 100644 index 00000000000..1c2af675dc3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/legends/PlanarGate.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.legends; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class PlanarGate extends mage.sets.masterseditioniv.PlanarGate { + + public PlanarGate(UUID ownerId) { + super(ownerId); + this.cardNumber = 235; + this.expansionSetCode = "LEG"; + this.rarity = Rarity.RARE; + } + + public PlanarGate(final PlanarGate card) { + super(card); + } + + @Override + public PlanarGate copy() { + return new PlanarGate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mastersedition/StoneCalendar.java b/Mage.Sets/src/mage/sets/mastersedition/StoneCalendar.java new file mode 100644 index 00000000000..39d8ff52090 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/StoneCalendar.java @@ -0,0 +1,62 @@ +/* + * 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.mastersedition; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; + +/** + * + * @author LevelX2 + */ +public class StoneCalendar extends CardImpl { + + public StoneCalendar(UUID ownerId) { + super(ownerId, 167, "Stone Calendar", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{5}"); + this.expansionSetCode = "MED"; + + // Spells you cast cost up to {1} less to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(new FilterCard("spells"), 1, true))); + + } + + public StoneCalendar(final StoneCalendar card) { + super(card); + } + + @Override + public StoneCalendar copy() { + return new StoneCalendar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/ManaMatrix.java b/Mage.Sets/src/mage/sets/masterseditioniv/ManaMatrix.java new file mode 100644 index 00000000000..620d0dbe48a --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/ManaMatrix.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.masterseditioniv; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author LevelX2 + */ +public class ManaMatrix extends CardImpl { + + private static final FilterCard filter = new FilterCard("instant and enchantment spells"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.ENCHANTMENT) + )); + } + + public ManaMatrix(UUID ownerId) { + super(ownerId, 213, "Mana Matrix", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{6}"); + this.expansionSetCode = "ME4"; + + // Instant and enchantment spells you cast cost up to {2} less to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 2, true))); + } + + public ManaMatrix(final ManaMatrix card) { + super(card); + } + + @Override + public ManaMatrix copy() { + return new ManaMatrix(this); + } +} diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/PlanarGate.java b/Mage.Sets/src/mage/sets/masterseditioniv/PlanarGate.java new file mode 100644 index 00000000000..5d2eaa3ad2b --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/PlanarGate.java @@ -0,0 +1,61 @@ +/* + * 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.masterseditioniv; + +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; + +/** + * + * @author LevelX2 + */ +public class PlanarGate extends CardImpl { + + public PlanarGate(UUID ownerId) { + super(ownerId, 221, "Planar Gate", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{6}"); + this.expansionSetCode = "ME4"; + + // Creature spells you cast cost up to {2} less to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(new FilterCreatureCard("creature spells"), 2, true))); + } + + public PlanarGate(final PlanarGate card) { + super(card); + } + + @Override + public PlanarGate copy() { + return new PlanarGate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java index 0022b2defbc..771b76a7360 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java @@ -33,10 +33,7 @@ import java.util.Set; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.ActivatedAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.ManaCost; -import mage.abilities.costs.mana.ManaCosts; import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.cards.CardImpl; import mage.choices.ChoiceImpl; diff --git a/Mage.Sets/src/mage/sets/thedark/StoneCalendar.java b/Mage.Sets/src/mage/sets/thedark/StoneCalendar.java new file mode 100644 index 00000000000..733b0e1ced4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/thedark/StoneCalendar.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.thedark; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class StoneCalendar extends mage.sets.mastersedition.StoneCalendar { + + public StoneCalendar(UUID ownerId) { + super(ownerId); + this.cardNumber = 108; + this.expansionSetCode = "DRK"; + this.rarity = Rarity.RARE; + } + + public StoneCalendar(final StoneCalendar card) { + super(card); + } + + @Override + public StoneCalendar copy() { + return new StoneCalendar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/urzassaga/Fluctuator.java b/Mage.Sets/src/mage/sets/urzassaga/Fluctuator.java new file mode 100644 index 00000000000..931c2d8a008 --- /dev/null +++ b/Mage.Sets/src/mage/sets/urzassaga/Fluctuator.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.urzassaga; + +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.choices.ChoiceImpl; +import mage.constants.AbilityType; +import mage.constants.CardType; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author LevelX2 + */ +public class Fluctuator extends CardImpl { + + public Fluctuator(UUID ownerId) { + super(ownerId, 295, "Fluctuator", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "USG"; + + // Cycling abilities you activate cost you up to {2} less to activate. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FluctuatorEffect())); + } + + public Fluctuator(final Fluctuator card) { + super(card); + } + + @Override + public Fluctuator copy() { + return new Fluctuator(this); + } +} + +class FluctuatorEffect extends CostModificationEffectImpl { + + private static final String effectText = "Cycling abilities you activate cost you up to {2} less to activate"; + + public FluctuatorEffect() { + super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = effectText; + } + + public FluctuatorEffect(final FluctuatorEffect effect) { + super(effect); + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + return abilityToModify.getControllerId().equals(source.getControllerId()) && + abilityToModify.getAbilityType().equals(AbilityType.ACTIVATED) && + (abilityToModify instanceof CyclingAbility); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + Player controller = game.getPlayer(abilityToModify.getControllerId()); + if (controller != null){ + Mana mana = abilityToModify.getManaCostsToPay().getMana(); + int reduceMax = mana.getColorless(); + if (reduceMax > 2){ + reduceMax = 2; + } + if (reduceMax > 0) { + ChoiceImpl choice = new ChoiceImpl(true); + Set set = new LinkedHashSet<>(); + + for(int i = 0; i <= reduceMax; i++){ + set.add(String.valueOf(i)); + } + choice.setChoices(set); + choice.setMessage("Reduce cycling cost"); + if(controller.choose(Outcome.Benefit, choice, game)){ + int reduce = Integer.parseInt(choice.getChoice()); + CardUtil.reduceCost(abilityToModify, reduce); + } + } + return true; + } + return false; + } + + @Override + public FluctuatorEffect copy() { + return new FluctuatorEffect(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java b/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java index 6447efcce1f..7384cc01ac1 100644 --- a/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java +++ b/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java @@ -27,16 +27,20 @@ */ package mage.abilities.effects.common.cost; +import java.util.LinkedHashSet; +import java.util.Set; +import mage.Mana; import mage.abilities.Ability; import mage.abilities.SpellAbility; -import mage.abilities.keyword.FlashbackAbility; import mage.cards.Card; +import mage.choices.ChoiceImpl; import mage.constants.CostModificationType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.FilterCard; import mage.game.Game; import mage.game.stack.Spell; +import mage.players.Player; import mage.util.CardUtil; /** @@ -47,27 +51,61 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl { private FilterCard filter; private int amount; + private final boolean upTo; public SpellsCostReductionAllEffect(int amount) { this(new FilterCard("All Spells "), amount); } public SpellsCostReductionAllEffect(FilterCard filter, int amount) { + this(filter, amount, false); + } + + public SpellsCostReductionAllEffect(FilterCard filter, int amount, boolean upTo) { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); this.filter = filter; this.amount = amount; - this.staticText = new StringBuilder(filter.getMessage()).append(" cost {").append(amount).append("} less to cast").toString(); + this.upTo = upTo; + + this.staticText = filter.getMessage() + " cost " + (upTo ?"up to " :"") + "{" +amount + "} less to cast"; } protected SpellsCostReductionAllEffect(SpellsCostReductionAllEffect effect) { super(effect); this.filter = effect.filter; this.amount = effect.amount; + this.upTo = effect.upTo; } @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { - CardUtil.reduceCost(abilityToModify, this.amount); + if (upTo) { + Mana mana = abilityToModify.getManaCostsToPay().getMana(); + int reduceMax = mana.getColorless(); + if (reduceMax > 2) { + reduceMax = 2; + } + if (reduceMax > 0) { + Player controller = game.getPlayer(abilityToModify.getControllerId()); + if (controller == null) { + return false; + } + ChoiceImpl choice = new ChoiceImpl(true); + Set set = new LinkedHashSet<>(); + for (int i = 0; i <= reduceMax; i++) { + set.add(String.valueOf(i)); + } + choice.setChoices(set); + choice.setMessage("Reduce cost of " + filter); + if (controller.choose(Outcome.Benefit, choice, game)) { + int reduce = Integer.parseInt(choice.getChoice()); + CardUtil.reduceCost(abilityToModify, reduce); + } + } + } else { + + CardUtil.reduceCost(abilityToModify, this.amount); + } return true; } diff --git a/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java b/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java index c3a0b8239ef..d8149f33cb1 100644 --- a/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java +++ b/Mage/src/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java @@ -27,17 +27,22 @@ */ package mage.abilities.effects.common.cost; +import java.util.LinkedHashSet; +import java.util.Set; +import mage.Mana; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.cards.Card; +import mage.choices.ChoiceImpl; import mage.constants.CostModificationType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.FilterCard; import mage.game.Game; import mage.game.stack.Spell; +import mage.players.Player; import mage.util.CardUtil; /** @@ -48,6 +53,7 @@ public class SpellsCostReductionControllerEffect extends CostModificationEffectI private final FilterCard filter; private final int amount; + private final boolean upTo; private ManaCosts manaCostsToReduce = null; @@ -56,7 +62,8 @@ public class SpellsCostReductionControllerEffect extends CostModificationEffectI this.filter = filter; this.amount = 0; this.manaCostsToReduce = manaCostsToReduce; - + this.upTo = false; + StringBuilder sb = new StringBuilder(); sb.append(filter.getMessage()).append(" you cast cost "); for (String manaSymbol :manaCostsToReduce.getSymbols()) { @@ -66,15 +73,16 @@ public class SpellsCostReductionControllerEffect extends CostModificationEffectI this.staticText = sb.toString(); } - public SpellsCostReductionControllerEffect(FilterCard filter, int amount) { + this(filter, amount, false); + } + + public SpellsCostReductionControllerEffect(FilterCard filter, int amount, boolean upTo) { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST); this.filter = filter; this.amount = amount; - - StringBuilder sb = new StringBuilder(); - sb.append(filter.getMessage()).append(" you cast cost {").append(amount).append("} less to cast"); - this.staticText = sb.toString(); + this.upTo = upTo; + this.staticText = filter.getMessage() + " you cast cost " + (upTo ?"up to " :"") + "{" +amount + "} less to cast"; } protected SpellsCostReductionControllerEffect(final SpellsCostReductionControllerEffect effect) { @@ -82,6 +90,7 @@ public class SpellsCostReductionControllerEffect extends CostModificationEffectI this.filter = effect.filter; this.amount = effect.amount; this.manaCostsToReduce = effect.manaCostsToReduce; + this.upTo = effect.upTo; } @Override @@ -89,7 +98,32 @@ public class SpellsCostReductionControllerEffect extends CostModificationEffectI if (manaCostsToReduce != null){ CardUtil.adjustCost((SpellAbility) abilityToModify, manaCostsToReduce, false); } else { - CardUtil.reduceCost(abilityToModify, this.amount); + if (upTo) { + Mana mana = abilityToModify.getManaCostsToPay().getMana(); + int reduceMax = mana.getColorless(); + if (reduceMax > 2){ + reduceMax = 2; + } + if (reduceMax > 0) { + Player controller = game.getPlayer(abilityToModify.getControllerId()); + if (controller == null){ + return false; + } + ChoiceImpl choice = new ChoiceImpl(true); + Set set = new LinkedHashSet<>(); + for(int i = 0; i <= reduceMax; i++){ + set.add(String.valueOf(i)); + } + choice.setChoices(set); + choice.setMessage("Reduce cost of " + filter); + if(controller.choose(Outcome.Benefit, choice, game)){ + int reduce = Integer.parseInt(choice.getChoice()); + CardUtil.reduceCost(abilityToModify, reduce); + } + } + } else { + CardUtil.reduceCost(abilityToModify, this.amount); + } } return true; }