diff --git a/Mage.Common/src/main/java/mage/view/CardView.java b/Mage.Common/src/main/java/mage/view/CardView.java index 7386f810296..ed63fd19e4a 100644 --- a/Mage.Common/src/main/java/mage/view/CardView.java +++ b/Mage.Common/src/main/java/mage/view/CardView.java @@ -8,7 +8,7 @@ import mage.abilities.Abilities; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.SpellAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.abilities.hint.HintUtils; @@ -743,18 +743,10 @@ public class CardView extends SimpleCardView { } // icon - x cost - if (showCard != null - && showCard.getManaCost().containsX() - && showAbility != null + if (showCard != null && showAbility != null + && (showCard.getManaCost().containsX() || CardUtil.checkSourceCostsTagExists(game, showAbility, "X")) && (showZone.match(Zone.BATTLEFIELD) || showZone.match(Zone.STACK))) { - int costX; - if (showCard instanceof Permanent) { - // permanent on battlefield (can show x icon multiple turns, so use end_game source) - costX = ManacostVariableValue.END_GAME.calculate(game, showAbility, null); - } else { - // other like Stack (can show x icon on stack only, so use normal source) - costX = ManacostVariableValue.REGULAR.calculate(game, showAbility, null); - } + int costX = GetXValue.instance.calculate(game, showAbility, null); this.cardIcons.add(CardIconImpl.variableCost(costX)); } diff --git a/Mage.Common/src/main/java/mage/view/StackAbilityView.java b/Mage.Common/src/main/java/mage/view/StackAbilityView.java index 150f041021e..c92d655786e 100644 --- a/Mage.Common/src/main/java/mage/view/StackAbilityView.java +++ b/Mage.Common/src/main/java/mage/view/StackAbilityView.java @@ -3,11 +3,9 @@ package mage.view; import mage.MageObject; import mage.abilities.Mode; import mage.abilities.Modes; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.Effect; import mage.abilities.hint.Hint; import mage.abilities.hint.HintUtils; -import mage.abilities.icon.CardIconImpl; import mage.cards.Card; import mage.constants.AbilityType; import mage.constants.CardType; @@ -16,7 +14,6 @@ import mage.game.Game; import mage.game.stack.StackAbility; import mage.game.stack.StackObject; import mage.target.Target; -import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.TargetPointer; import mage.util.GameLog; diff --git a/Mage.Sets/src/mage/cards/a/AbandonHope.java b/Mage.Sets/src/mage/cards/a/AbandonHope.java index f2be8574112..a36a92f52d0 100644 --- a/Mage.Sets/src/mage/cards/a/AbandonHope.java +++ b/Mage.Sets/src/mage/cards/a/AbandonHope.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.common.DiscardTargetCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.InfoEffect; import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect; import mage.cards.CardImpl; @@ -15,6 +15,7 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetCardInHand; import mage.target.common.TargetOpponent; +import mage.util.CardUtil; import java.util.UUID; @@ -34,7 +35,7 @@ public final class AbandonHope extends CardImpl { this.addAbility(ability); // Look at target opponent's hand and choose X cards from it. That player discards those cards. - this.getSpellAbility().addEffect(new LookTargetHandChooseDiscardEffect(false, ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new LookTargetHandChooseDiscardEffect(false, GetXValue.instance)); this.getSpellAbility().addTarget(new TargetOpponent()); this.getSpellAbility().setCostAdjuster(AbandonHopeAdjuster.instance); } @@ -54,7 +55,7 @@ enum AbandonHopeAdjuster implements CostAdjuster { @Override public void adjustCosts(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); if (xValue > 0) { ability.addCost(new DiscardTargetCost(new TargetCardInHand(xValue, xValue, StaticFilters.FILTER_CARD_CARDS))); } diff --git a/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java b/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java index 54a23770f8b..4c35ce005dd 100644 --- a/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java +++ b/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java @@ -1,7 +1,7 @@ package mage.cards.a; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -75,7 +75,7 @@ class AbuelosAwakeningEffect extends ReturnFromGraveyardToBattlefieldTargetEffec @Override public boolean apply(Game game, Ability source) { - int counterAmount = ManacostVariableValue.REGULAR.calculate(game, source, this); + int counterAmount = GetXValue.instance.calculate(game, source, this); for (UUID targetId : getTargetPointer().getTargets(game, source)) { AbuelosAwakeningContinuousEffect continuousEffect = new AbuelosAwakeningContinuousEffect(); continuousEffect.setTargetPointer(new FixedTarget(targetId, game)); diff --git a/Mage.Sets/src/mage/cards/a/AetherTide.java b/Mage.Sets/src/mage/cards/a/AetherTide.java index eefc692a975..885f74c69f0 100644 --- a/Mage.Sets/src/mage/cards/a/AetherTide.java +++ b/Mage.Sets/src/mage/cards/a/AetherTide.java @@ -16,6 +16,7 @@ import mage.game.Game; import mage.target.common.TargetCardInHand; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.XTargetsCountAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -58,7 +59,7 @@ enum AetherTideCostAdjuster implements CostAdjuster { @Override public void adjustCosts(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); if (xValue > 0) { ability.addCost(new DiscardTargetCost(new TargetCardInHand(xValue, xValue, StaticFilters.FILTER_CARD_CREATURES))); } diff --git a/Mage.Sets/src/mage/cards/a/AgadeemsAwakening.java b/Mage.Sets/src/mage/cards/a/AgadeemsAwakening.java index 3e0d09a4bba..2171e0573c3 100644 --- a/Mage.Sets/src/mage/cards/a/AgadeemsAwakening.java +++ b/Mage.Sets/src/mage/cards/a/AgadeemsAwakening.java @@ -17,6 +17,7 @@ import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.Set; import java.util.UUID; @@ -74,7 +75,7 @@ enum AgadeemsAwakeningAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); - ability.addTarget(new AgadeemsAwakeningTarget(ability.getManaCostsToPay().getX())); + ability.addTarget(new AgadeemsAwakeningTarget(CardUtil.getSourceCostsTag(game, ability, "X", 0))); } } diff --git a/Mage.Sets/src/mage/cards/a/AggressiveBiomancy.java b/Mage.Sets/src/mage/cards/a/AggressiveBiomancy.java index a6ae3f6726c..d2e1c91525f 100644 --- a/Mage.Sets/src/mage/cards/a/AggressiveBiomancy.java +++ b/Mage.Sets/src/mage/cards/a/AggressiveBiomancy.java @@ -1,7 +1,5 @@ package mage.cards.a; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -18,6 +16,9 @@ import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +import java.util.UUID; /** * @author Cguy7777 @@ -72,7 +73,7 @@ class AggressiveBiomancyEffect extends OneShotEffect { source.getControllerId(), null, false, - source.getManaCostsToPay().getX()); + CardUtil.getSourceCostsTag(game, source, "X", 0)); effect.addAdditionalAbilities(fightAbility); effect.setTargetPointer(new FixedTarget(creatureToCopy, game)); return effect.apply(game, source); diff --git a/Mage.Sets/src/mage/cards/a/AlabasterPotion.java b/Mage.Sets/src/mage/cards/a/AlabasterPotion.java index 1462eaca09c..88bb7d6b236 100644 --- a/Mage.Sets/src/mage/cards/a/AlabasterPotion.java +++ b/Mage.Sets/src/mage/cards/a/AlabasterPotion.java @@ -3,7 +3,7 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.GainLifeTargetEffect; import mage.abilities.effects.common.PreventDamageToTargetEffect; import mage.cards.CardImpl; @@ -23,9 +23,9 @@ public final class AlabasterPotion extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{W}{W}"); // Choose one - Target player gains X life; or prevent the next X damage that would be dealt to any target this turn. - this.getSpellAbility().addEffect(new GainLifeTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new GainLifeTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer()); - Mode mode = new Mode(new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, ManacostVariableValue.REGULAR)); + Mode mode = new Mode(new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, GetXValue.instance)); mode.addTarget(new TargetAnyTarget()); this.getSpellAbility().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/a/AladdinsLamp.java b/Mage.Sets/src/mage/cards/a/AladdinsLamp.java index 1ac58812920..8d46ca9c8e8 100644 --- a/Mage.Sets/src/mage/cards/a/AladdinsLamp.java +++ b/Mage.Sets/src/mage/cards/a/AladdinsLamp.java @@ -1,14 +1,16 @@ package mage.cards.a; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; import mage.abilities.effects.ReplacementEffectImpl; -import mage.cards.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; @@ -18,6 +20,9 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; import mage.target.TargetCard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -73,7 +78,7 @@ class AladdinsLampEffect extends ReplacementEffectImpl { return false; } - Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, CardUtil.getSourceCostsTag(game, source, "X", 0))); controller.lookAtCards(source, null, cards, game); TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to stay at the top of library")); if (controller.choose(outcome, cards, target, source, game)) { diff --git a/Mage.Sets/src/mage/cards/a/AlquistProftMasterSleuth.java b/Mage.Sets/src/mage/cards/a/AlquistProftMasterSleuth.java index 40936d21dc4..7c7ba450b06 100644 --- a/Mage.Sets/src/mage/cards/a/AlquistProftMasterSleuth.java +++ b/Mage.Sets/src/mage/cards/a/AlquistProftMasterSleuth.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.keyword.InvestigateEffect; @@ -43,11 +43,11 @@ public final class AlquistProftMasterSleuth extends CardImpl { // {X}{W}{U}{U}, {T}, Sacrifice a Clue: You draw X cards and gain X life. Ability ability = new SimpleActivatedAbility( - new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR, "you"), new ManaCostsImpl<>("{X}{W}{U}{U}") + new DrawCardSourceControllerEffect(GetXValue.instance, "you"), new ManaCostsImpl<>("{X}{W}{U}{U}") ); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_CLUE)); - ability.addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR).setText("and gain X life")); + ability.addEffect(new GainLifeEffect(GetXValue.instance).setText("and gain X life")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AnimistsAwakening.java b/Mage.Sets/src/mage/cards/a/AnimistsAwakening.java index 34dbc5f5b16..28202eee797 100644 --- a/Mage.Sets/src/mage/cards/a/AnimistsAwakening.java +++ b/Mage.Sets/src/mage/cards/a/AnimistsAwakening.java @@ -1,9 +1,6 @@ package mage.cards.a; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.condition.common.SpellMasteryCondition; @@ -16,6 +13,11 @@ import mage.filter.common.FilterLandCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; /** * @@ -61,7 +63,7 @@ class AnimistsAwakeningEffect extends OneShotEffect { return false; } Cards cards = new CardsImpl(); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); cards.addAllCards(controller.getLibrary().getTopCards(game, xValue)); if (!cards.isEmpty()) { controller.revealCards(sourceObject.getIdName(), cards, game); diff --git a/Mage.Sets/src/mage/cards/a/AnotherRound.java b/Mage.Sets/src/mage/cards/a/AnotherRound.java index af9119ca608..8353ebb028f 100644 --- a/Mage.Sets/src/mage/cards/a/AnotherRound.java +++ b/Mage.Sets/src/mage/cards/a/AnotherRound.java @@ -2,7 +2,7 @@ package mage.cards.a; import mage.MageObjectReference; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileThenReturnTargetEffect; import mage.cards.CardImpl; @@ -60,7 +60,7 @@ class AnotherRoundEffect extends OneShotEffect { return false; } - int xValue = ManacostVariableValue.REGULAR.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent( 0, Integer.MAX_VALUE, diff --git a/Mage.Sets/src/mage/cards/a/Anthroplasm.java b/Mage.Sets/src/mage/cards/a/Anthroplasm.java index a6dcedf41aa..b30d64a8d38 100644 --- a/Mage.Sets/src/mage/cards/a/Anthroplasm.java +++ b/Mage.Sets/src/mage/cards/a/Anthroplasm.java @@ -18,6 +18,7 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import java.util.UUID; @@ -75,7 +76,7 @@ class AnthroplasmEffect extends OneShotEffect { //Remove all +1/+1 counters permanent.removeAllCounters(CounterType.P1P1.getName(), source, game); //put X +1/+1 counters - permanent.addCounters(CounterType.P1P1.createInstance(source.getManaCostsToPay().getX()), source.getControllerId(), source, game); + permanent.addCounters(CounterType.P1P1.createInstance(CardUtil.getSourceCostsTag(game, source, "X", 0)), source.getControllerId(), source, game); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/a/ArashiTheSkyAsunder.java b/Mage.Sets/src/mage/cards/a/ArashiTheSkyAsunder.java index 85c8ed3cb32..ffd442f5838 100644 --- a/Mage.Sets/src/mage/cards/a/ArashiTheSkyAsunder.java +++ b/Mage.Sets/src/mage/cards/a/ArashiTheSkyAsunder.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.ChannelAbility; @@ -43,13 +43,13 @@ public final class ArashiTheSkyAsunder extends CardImpl { this.toughness = new MageInt(5); // {X}{G}, {tap}: Arashi, the Sky Asunder deals X damage to target creature with flying. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}{G}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{G}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); // Channel - {X}{G}{G}, Discard Arashi: Arashi deals X damage to each creature with flying. - this.addAbility(new ChannelAbility("{X}{G}{G}", new DamageAllEffect(ManacostVariableValue.REGULAR, filter))); + this.addAbility(new ChannelAbility("{X}{G}{G}", new DamageAllEffect(GetXValue.instance, filter))); } private ArashiTheSkyAsunder(final ArashiTheSkyAsunder card) { diff --git a/Mage.Sets/src/mage/cards/a/ArborealAlliance.java b/Mage.Sets/src/mage/cards/a/ArborealAlliance.java index 1697b52e705..9ed0e10de4d 100644 --- a/Mage.Sets/src/mage/cards/a/ArborealAlliance.java +++ b/Mage.Sets/src/mage/cards/a/ArborealAlliance.java @@ -3,7 +3,7 @@ package mage.cards.a; import mage.abilities.Ability; import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.PopulateEffect; @@ -66,7 +66,7 @@ class ArborealAllianceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { return new CreateTokenEffect( - new SylvanOfferingTreefolkToken(ManacostVariableValue.ETB.calculate(game, source, this)) + new SylvanOfferingTreefolkToken(GetXValue.instance.calculate(game, source, this)) ).apply(game, source); } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/a/AscendFromAvernus.java b/Mage.Sets/src/mage/cards/a/AscendFromAvernus.java index 5ea871a4d58..683b57294da 100644 --- a/Mage.Sets/src/mage/cards/a/AscendFromAvernus.java +++ b/Mage.Sets/src/mage/cards/a/AscendFromAvernus.java @@ -14,6 +14,7 @@ import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -73,7 +74,7 @@ class AscendFromAvernusEffect extends OneShotEffect { return false; } Cards cards = new CardsImpl(player.getGraveyard().getCards(filter, game)); - cards.removeIf(uuid -> game.getCard(uuid).getManaValue() > source.getManaCostsToPay().getX()); + cards.removeIf(uuid -> game.getCard(uuid).getManaValue() > CardUtil.getSourceCostsTag(game, source, "X", 0)); return player.moveCards(cards, Zone.BATTLEFIELD, source, game); } } diff --git a/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java b/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java index bd6a4ce935b..d23eb46706a 100644 --- a/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java +++ b/Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java @@ -2,8 +2,6 @@ package mage.cards.a; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.costs.VariableCostImpl; -import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect; import mage.cards.*; @@ -111,9 +109,7 @@ class AshiokNightmareWeaverPutIntoPlayEffect extends OneShotEffect { return false; } - int cmc = CardUtil.castStream( - source.getCosts().stream(), PayVariableLoyaltyCost.class - ).mapToInt(VariableCostImpl::getAmount).sum(); + int cmc = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCard filter = new FilterCreatureCard("creature card with mana value " + cmc); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, cmc)); diff --git a/Mage.Sets/src/mage/cards/a/AssaultOnOsgiliath.java b/Mage.Sets/src/mage/cards/a/AssaultOnOsgiliath.java index b38b06d67cd..e44530ceada 100644 --- a/Mage.Sets/src/mage/cards/a/AssaultOnOsgiliath.java +++ b/Mage.Sets/src/mage/cards/a/AssaultOnOsgiliath.java @@ -1,6 +1,6 @@ package mage.cards.a; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.keyword.AmassEffect; import mage.abilities.keyword.DoubleStrikeAbility; @@ -33,7 +33,7 @@ public final class AssaultOnOsgiliath extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}{R}"); // Amass Orcs X, then Goblins and Orcs you control gain double strike and haste until end of turn. - this.getSpellAbility().addEffect(new AmassEffect(ManacostVariableValue.REGULAR, SubType.ORC)); + this.getSpellAbility().addEffect(new AmassEffect(GetXValue.instance, SubType.ORC)); this.getSpellAbility().addEffect(new GainAbilityControlledEffect( DoubleStrikeAbility.getInstance(), Duration.EndOfTurn, filter ).setText(", then Goblins and Orcs you control gain double strike")); diff --git a/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java b/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java index 12d19fb01b8..455024ec04f 100644 --- a/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java +++ b/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java @@ -10,7 +10,7 @@ import mage.abilities.costs.VariableCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.PreventDamageToTargetEffect; import mage.cards.CardImpl; @@ -41,7 +41,7 @@ public final class AtalyaSamiteMaster extends CardImpl { this.toughness = new MageInt(3); // {X}, {tap}: Choose one - Prevent the next X damage that would be dealt to target creature this turn; or you gain X life. Spend only white mana on X. - PreventDamageToTargetEffect effect = new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, ManacostVariableValue.REGULAR); + PreventDamageToTargetEffect effect = new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, GetXValue.instance); effect.setText("Prevent the next X damage that would be dealt to target creature this turn. Spend only white mana on X."); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); @@ -54,7 +54,7 @@ public final class AtalyaSamiteMaster extends CardImpl { ability.addTarget(new TargetCreaturePermanent()); // or you gain X life - Mode mode = new Mode(new GainLifeEffect(ManacostVariableValue.REGULAR).setText("You gain X life. Spend only white mana on X.")); + Mode mode = new Mode(new GainLifeEffect(GetXValue.instance).setText("You gain X life. Spend only white mana on X.")); ability.addMode(mode); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/a/AttemptedMurder.java b/Mage.Sets/src/mage/cards/a/AttemptedMurder.java index a595efdc41b..f643bf100b3 100644 --- a/Mage.Sets/src/mage/cards/a/AttemptedMurder.java +++ b/Mage.Sets/src/mage/cards/a/AttemptedMurder.java @@ -11,6 +11,7 @@ import mage.game.Game; import mage.game.permanent.token.StormCrowToken; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import java.util.Map; import java.util.Optional; @@ -62,7 +63,7 @@ class AttemptedMurderEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/a/AureliasFury.java b/Mage.Sets/src/mage/cards/a/AureliasFury.java index 142b6ad8307..1febd70e70c 100644 --- a/Mage.Sets/src/mage/cards/a/AureliasFury.java +++ b/Mage.Sets/src/mage/cards/a/AureliasFury.java @@ -4,7 +4,7 @@ package mage.cards.a; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; @@ -61,7 +61,7 @@ public final class AureliasFury extends CardImpl { // Aurelia's Fury deals X damage divided as you choose among any number of target creatures and/or players. // Tap each creature dealt damage this way. Players dealt damage this way can't cast noncreature spells this turn. - DynamicValue xValue = ManacostVariableValue.REGULAR; + DynamicValue xValue = GetXValue.instance; this.getSpellAbility().addEffect(new DamageMultiEffect(xValue)); this.getSpellAbility().addEffect(new AureliasFuryEffect()); this.getSpellAbility().addTarget(new TargetAnyTargetAmount(xValue)); diff --git a/Mage.Sets/src/mage/cards/a/AvacynsJudgment.java b/Mage.Sets/src/mage/cards/a/AvacynsJudgment.java index 8746129321a..5d6601dfba0 100644 --- a/Mage.Sets/src/mage/cards/a/AvacynsJudgment.java +++ b/Mage.Sets/src/mage/cards/a/AvacynsJudgment.java @@ -1,7 +1,6 @@ package mage.cards.a; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; @@ -14,6 +13,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.game.Game; import mage.target.common.TargetAnyTargetAmount; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -55,7 +57,7 @@ class AvacynsJudgmentManacostVariableValue implements DynamicValue { if (manaCosts.getVariableCosts().isEmpty()) { return 2; } - return sourceAbility.getManaCostsToPay().getX(); + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); } @Override diff --git a/Mage.Sets/src/mage/cards/a/Avalanche.java b/Mage.Sets/src/mage/cards/a/Avalanche.java index 1305495ca58..8f5e4fe1b14 100644 --- a/Mage.Sets/src/mage/cards/a/Avalanche.java +++ b/Mage.Sets/src/mage/cards/a/Avalanche.java @@ -1,7 +1,7 @@ package mage.cards.a; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -30,7 +30,7 @@ public final class Avalanche extends CardImpl { // Destroy X target snow lands. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target snow lands")); this.getSpellAbility().addTarget(new TargetPermanent(1, 1, filter, false)); - this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR)); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(GetXValue.instance)); } diff --git a/Mage.Sets/src/mage/cards/a/AwakenTheWoods.java b/Mage.Sets/src/mage/cards/a/AwakenTheWoods.java index 710b4147821..19e45e91d92 100644 --- a/Mage.Sets/src/mage/cards/a/AwakenTheWoods.java +++ b/Mage.Sets/src/mage/cards/a/AwakenTheWoods.java @@ -1,6 +1,6 @@ package mage.cards.a; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,7 +18,7 @@ public final class AwakenTheWoods extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}{G}"); // Create X 1/1 green Forest Dryad land creature tokens. - this.getSpellAbility().addEffect(new CreateTokenEffect(new ForestDryadToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ForestDryadToken(), GetXValue.instance)); } private AwakenTheWoods(final AwakenTheWoods card) { diff --git a/Mage.Sets/src/mage/cards/a/AwakenedAwareness.java b/Mage.Sets/src/mage/cards/a/AwakenedAwareness.java index 54bcf1b071d..852ae736ffa 100644 --- a/Mage.Sets/src/mage/cards/a/AwakenedAwareness.java +++ b/Mage.Sets/src/mage/cards/a/AwakenedAwareness.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.counter.AddCountersAttachedEffect; import mage.constants.*; @@ -38,7 +38,7 @@ public final class AwakenedAwareness extends CardImpl { // When Awakened Awareness enters the battlefield, put X +1/+1 counters on enchanted permanent. this.addAbility(new EntersBattlefieldTriggeredAbility( - new AddCountersAttachedEffect(CounterType.P1P1.createInstance(), ManacostVariableValue.ETB, "enchanted permanent") + new AddCountersAttachedEffect(CounterType.P1P1.createInstance(), GetXValue.instance, "enchanted permanent") )); // As long as enchanted permanent is a creature, it has base power and toughness 1/1. diff --git a/Mage.Sets/src/mage/cards/b/BackInTown.java b/Mage.Sets/src/mage/cards/b/BackInTown.java index c92a9d5059b..bca1b5f3cd3 100644 --- a/Mage.Sets/src/mage/cards/b/BackInTown.java +++ b/Mage.Sets/src/mage/cards/b/BackInTown.java @@ -1,6 +1,6 @@ package mage.cards.b; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -30,7 +30,7 @@ public final class BackInTown extends CardImpl { this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect() .setText("return X target outlaw creature cards from your graveyard to the battlefield")); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); - this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(ManacostVariableValue.REGULAR)); + this.getSpellAbility().setTargetAdjuster(new TargetsCountAdjuster(GetXValue.instance)); } private BackInTown(final BackInTown card) { diff --git a/Mage.Sets/src/mage/cards/b/BalduvianRage.java b/Mage.Sets/src/mage/cards/b/BalduvianRage.java index 19a8567cb59..8adf853365b 100644 --- a/Mage.Sets/src/mage/cards/b/BalduvianRage.java +++ b/Mage.Sets/src/mage/cards/b/BalduvianRage.java @@ -3,7 +3,7 @@ package mage.cards.b; import java.util.UUID; import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -25,7 +25,7 @@ public final class BalduvianRage extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{R}"); // Target attacking creature gets +X/+0 until end of turn. - this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostTargetEffect(GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterAttackingCreature())); // Draw a card at the beginning of the next turn's upkeep. diff --git a/Mage.Sets/src/mage/cards/b/BallistaSquad.java b/Mage.Sets/src/mage/cards/b/BallistaSquad.java index 96703eb65df..6d492a1ae78 100644 --- a/Mage.Sets/src/mage/cards/b/BallistaSquad.java +++ b/Mage.Sets/src/mage/cards/b/BallistaSquad.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -30,7 +30,7 @@ public final class BallistaSquad extends CardImpl { this.toughness = new MageInt(2); // {X}{W}, {T}: Ballista Squad deals X damage to target attacking or blocking creature. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}{W}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{W}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetAttackingOrBlockingCreature()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/b/Banefire.java b/Mage.Sets/src/mage/cards/b/Banefire.java index 66b9784c53b..eecbbbc3995 100644 --- a/Mage.Sets/src/mage/cards/b/Banefire.java +++ b/Mage.Sets/src/mage/cards/b/Banefire.java @@ -1,11 +1,10 @@ package mage.cards.b; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; @@ -21,6 +20,9 @@ import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -90,7 +92,7 @@ class BaneFireEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player targetPlayer = game.getPlayer(source.getFirstTarget()); Permanent targetCreature = game.getPermanent(source.getFirstTarget()); - int damage = source.getManaCostsToPay().getX(); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); boolean preventable = damage < 5; if (targetPlayer != null) { targetPlayer.damage(damage, source.getSourceId(), source, game, false, preventable); @@ -106,7 +108,7 @@ class BaneFireEffect extends OneShotEffect { class BanefireCantCounterEffect extends ContinuousRuleModifyingEffectImpl { - private Condition condition = new testCondition(ManacostVariableValue.REGULAR, 5); + private Condition condition = new testCondition(GetXValue.instance, 5); public BanefireCantCounterEffect() { super(Duration.WhileOnStack, Outcome.Benefit); diff --git a/Mage.Sets/src/mage/cards/b/Banshee.java b/Mage.Sets/src/mage/cards/b/Banshee.java index 09d173aef39..8cb1bb21ada 100644 --- a/Mage.Sets/src/mage/cards/b/Banshee.java +++ b/Mage.Sets/src/mage/cards/b/Banshee.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.HalfValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -31,9 +31,9 @@ public final class Banshee extends CardImpl { this.toughness = new MageInt(1); // {X}, {T}: Banshee deals half X damage, rounded down, to any target, and half X damage, rounded up, to you. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new HalfValue(ManacostVariableValue.REGULAR, false)).setText("Banshee deals half X damage, rounded down, to any target,"), new ManaCostsImpl<>("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new HalfValue(GetXValue.instance, false)).setText("Banshee deals half X damage, rounded down, to any target,"), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); - ability.addEffect(new DamageControllerEffect(new HalfValue(ManacostVariableValue.REGULAR, true)).setText(" and half X damage, rounded up, to you")); + ability.addEffect(new DamageControllerEffect(new HalfValue(GetXValue.instance, true)).setText(" and half X damage, rounded up, to you")); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BaradDur.java b/Mage.Sets/src/mage/cards/b/BaradDur.java index de281b8f23c..18328b28d58 100644 --- a/Mage.Sets/src/mage/cards/b/BaradDur.java +++ b/Mage.Sets/src/mage/cards/b/BaradDur.java @@ -7,7 +7,7 @@ import mage.abilities.condition.common.MorbidCondition; import mage.abilities.condition.common.YouControlPermanentCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.keyword.AmassEffect; import mage.abilities.mana.BlackManaAbility; import mage.cards.CardImpl; @@ -48,7 +48,7 @@ public final class BaradDur extends CardImpl { // {X}{X}{B}, {T}: Amass Orcs X. Activate only if a creature died this turn. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, - new AmassEffect(ManacostVariableValue.REGULAR, SubType.ORC, false), + new AmassEffect(GetXValue.instance, SubType.ORC, false), new ManaCostsImpl<>("{X}{X}{B}"), MorbidCondition.instance ); diff --git a/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java b/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java index e20f023fedf..a8e91d4f365 100644 --- a/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java +++ b/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java @@ -3,7 +3,7 @@ package mage.cards.b; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -20,7 +20,7 @@ import mage.target.common.TargetCreaturePermanent; */ public final class BattleAtTheBridge extends CardImpl { - private static final DynamicValue xValue = new SignInversionDynamicValue(ManacostVariableValue.REGULAR); + private static final DynamicValue xValue = new SignInversionDynamicValue(GetXValue.instance); public BattleAtTheBridge(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}"); @@ -32,7 +32,7 @@ public final class BattleAtTheBridge extends CardImpl { this.getSpellAbility().addEffect(new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance)); } private BattleAtTheBridge(final BattleAtTheBridge card) { diff --git a/Mage.Sets/src/mage/cards/b/BeginTheInvasion.java b/Mage.Sets/src/mage/cards/b/BeginTheInvasion.java index 6b53c9bb3af..87d93d07150 100644 --- a/Mage.Sets/src/mage/cards/b/BeginTheInvasion.java +++ b/Mage.Sets/src/mage/cards/b/BeginTheInvasion.java @@ -10,6 +10,7 @@ import mage.constants.Outcome; import mage.filter.FilterCard; import mage.game.Game; import mage.target.common.TargetCardWithDifferentNameInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -60,7 +61,7 @@ class BeginTheInvasionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); return new SearchLibraryPutInPlayEffect( new TargetCardWithDifferentNameInLibrary(0, xValue, filter), false ).apply(game, source); diff --git a/Mage.Sets/src/mage/cards/b/BelbesArmor.java b/Mage.Sets/src/mage/cards/b/BelbesArmor.java index 62aeae273c0..76e54f9858c 100644 --- a/Mage.Sets/src/mage/cards/b/BelbesArmor.java +++ b/Mage.Sets/src/mage/cards/b/BelbesArmor.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -25,8 +25,8 @@ public final class BelbesArmor extends CardImpl { // {X}, {tap}: Target creature gets -X/+X until end of turn. Ability ability = new SimpleActivatedAbility(new BoostTargetEffect( - new MultipliedValue(ManacostVariableValue.REGULAR, -1), - ManacostVariableValue.REGULAR, Duration.EndOfTurn + new MultipliedValue(GetXValue.instance, -1), + GetXValue.instance, Duration.EndOfTurn ).setText("Target creature gets -X/+X until end of turn"), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/b/BiomassMutation.java b/Mage.Sets/src/mage/cards/b/BiomassMutation.java index 026594b2000..a3a5b75a344 100644 --- a/Mage.Sets/src/mage/cards/b/BiomassMutation.java +++ b/Mage.Sets/src/mage/cards/b/BiomassMutation.java @@ -3,7 +3,7 @@ package mage.cards.b; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.SetBasePowerToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -22,7 +22,7 @@ public final class BiomassMutation extends CardImpl { // Creatures you control have base power and toughness X/X until end of turn. - DynamicValue variableMana = ManacostVariableValue.REGULAR; + DynamicValue variableMana = GetXValue.instance; this.getSpellAbility().addEffect(new SetBasePowerToughnessAllEffect(variableMana, variableMana, Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES)); } diff --git a/Mage.Sets/src/mage/cards/b/BlackManaBattery.java b/Mage.Sets/src/mage/cards/b/BlackManaBattery.java index 741a8976b1b..b96e9100c3b 100644 --- a/Mage.Sets/src/mage/cards/b/BlackManaBattery.java +++ b/Mage.Sets/src/mage/cards/b/BlackManaBattery.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.IntPlusDynamicValue; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -38,7 +38,7 @@ public final class BlackManaBattery extends CardImpl { // Add {B}, then add an additional {B} for each charge counter removed this way. ability = new DynamicManaAbility( Mana.BlackMana(1), - new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance), + new IntPlusDynamicValue(1, GetXValue.instance), new TapSourceCost(), "Add {B}, then add {B} for each charge counter removed this way", true, new IntPlusDynamicValue(1, new CountersSourceCount(CounterType.CHARGE))); diff --git a/Mage.Sets/src/mage/cards/b/BlackSunsTwilight.java b/Mage.Sets/src/mage/cards/b/BlackSunsTwilight.java index b5d0950e465..cc8d0a1b262 100644 --- a/Mage.Sets/src/mage/cards/b/BlackSunsTwilight.java +++ b/Mage.Sets/src/mage/cards/b/BlackSunsTwilight.java @@ -1,10 +1,8 @@ package mage.cards.b; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -20,13 +18,16 @@ import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @author TheElk801 */ public final class BlackSunsTwilight extends CardImpl { - private static final DynamicValue xValue = new SignInversionDynamicValue(ManacostVariableValue.REGULAR); + private static final DynamicValue xValue = new SignInversionDynamicValue(GetXValue.instance); public BlackSunsTwilight(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{B}"); @@ -69,7 +70,7 @@ class BlackSunsTwilightEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 5) { return false; } diff --git a/Mage.Sets/src/mage/cards/b/BlackSunsZenith.java b/Mage.Sets/src/mage/cards/b/BlackSunsZenith.java index a17cecae0f9..b66151c959d 100644 --- a/Mage.Sets/src/mage/cards/b/BlackSunsZenith.java +++ b/Mage.Sets/src/mage/cards/b/BlackSunsZenith.java @@ -2,7 +2,6 @@ package mage.cards.b; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ShuffleSpellEffect; @@ -13,6 +12,9 @@ import mage.constants.Outcome; import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -51,7 +53,7 @@ class BlackSunsZenithEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); for (Permanent permanent : game.getBattlefield().getAllActivePermanents()) { if (permanent != null && permanent.isCreature(game)) { permanent.addCounters(CounterType.M1M1.createInstance(amount), source.getControllerId(), source, game); diff --git a/Mage.Sets/src/mage/cards/b/BlademaneBaku.java b/Mage.Sets/src/mage/cards/b/BlademaneBaku.java index 4bfd4b7e7dc..3538121037b 100644 --- a/Mage.Sets/src/mage/cards/b/BlademaneBaku.java +++ b/Mage.Sets/src/mage/cards/b/BlademaneBaku.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostSourceEffect; @@ -27,7 +27,7 @@ import mage.filter.StaticFilters; */ public final class BlademaneBaku extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(RemovedCountersForCostValue.instance, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public BlademaneBaku(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}"); diff --git a/Mage.Sets/src/mage/cards/b/BlastZone.java b/Mage.Sets/src/mage/cards/b/BlastZone.java index 76dafb4dea1..ec7319abe93 100644 --- a/Mage.Sets/src/mage/cards/b/BlastZone.java +++ b/Mage.Sets/src/mage/cards/b/BlastZone.java @@ -7,7 +7,7 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -46,7 +46,7 @@ public final class BlastZone extends CardImpl { // {X}{X}, {T}: Put X charge counters on Blast Zone. Ability ability = new SimpleActivatedAbility(new AddCountersSourceEffect( - CounterType.CHARGE.createInstance(), ManacostVariableValue.REGULAR, true + CounterType.CHARGE.createInstance(), GetXValue.instance, true ), new ManaCostsImpl<>("{X}{X}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/b/Blaze.java b/Mage.Sets/src/mage/cards/b/Blaze.java index 8a12e8c9cec..4f5e10e8ab7 100644 --- a/Mage.Sets/src/mage/cards/b/Blaze.java +++ b/Mage.Sets/src/mage/cards/b/Blaze.java @@ -2,7 +2,7 @@ package mage.cards.b; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,7 +20,7 @@ public final class Blaze extends CardImpl { // Blaze deals X damage to any target. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); } diff --git a/Mage.Sets/src/mage/cards/b/BlotOutTheSky.java b/Mage.Sets/src/mage/cards/b/BlotOutTheSky.java index a0acafec349..a7f2ffd27b2 100644 --- a/Mage.Sets/src/mage/cards/b/BlotOutTheSky.java +++ b/Mage.Sets/src/mage/cards/b/BlotOutTheSky.java @@ -3,7 +3,7 @@ package mage.cards.b; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyAllEffect; import mage.cards.CardImpl; @@ -14,6 +14,7 @@ import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.Predicates; import mage.game.Game; import mage.game.permanent.token.InklingToken; +import mage.util.CardUtil; import java.util.UUID; @@ -33,7 +34,7 @@ public final class BlotOutTheSky extends CardImpl { // Create X tapped 2/1 white and black Inkling creature tokens with flying. If X is 6 or more, destroy all noncreature, nonland permanents. this.getSpellAbility().addEffect(new CreateTokenEffect( - new InklingToken(), ManacostVariableValue.REGULAR, true, false + new InklingToken(), GetXValue.instance, true, false )); this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new DestroyAllEffect(filter), BlotOutTheSkyCondition.instance, @@ -56,6 +57,6 @@ enum BlotOutTheSkyCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return source.getManaCostsToPay().getX() >= 6; + return CardUtil.getSourceCostsTag(game, source, "X", 0) >= 6; } } diff --git a/Mage.Sets/src/mage/cards/b/BlueManaBattery.java b/Mage.Sets/src/mage/cards/b/BlueManaBattery.java index f71987d5315..f3c55611adb 100644 --- a/Mage.Sets/src/mage/cards/b/BlueManaBattery.java +++ b/Mage.Sets/src/mage/cards/b/BlueManaBattery.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.IntPlusDynamicValue; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -37,7 +37,7 @@ public final class BlueManaBattery extends CardImpl { // then add an additional {U} for each charge counter removed this way. ability = new DynamicManaAbility( Mana.BlueMana(1), - new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance), + new IntPlusDynamicValue(1, GetXValue.instance), new TapSourceCost(), "Add {U}, then add {U} for each charge counter removed this way", true, new IntPlusDynamicValue(1, new CountersSourceCount(CounterType.CHARGE))); diff --git a/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java b/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java index c98b8d7cd43..90c093937db 100644 --- a/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java +++ b/Mage.Sets/src/mage/cards/b/BlueSunsTwilight.java @@ -13,6 +13,7 @@ import mage.constants.Duration; import mage.game.Game; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.XManaValueTargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -50,6 +51,6 @@ enum BlueSunsTwilightCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return source.getManaCostsToPay().getX() >= 5; + return CardUtil.getSourceCostsTag(game, source, "X", 0) >= 5; } } diff --git a/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java b/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java index 432ab51d2be..7e78a0909e5 100644 --- a/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java +++ b/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java @@ -3,7 +3,7 @@ package mage.cards.b; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.abilities.effects.common.ShuffleSpellEffect; import mage.cards.CardImpl; @@ -21,7 +21,7 @@ public final class BlueSunsZenith extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{U}{U}{U}"); // Target player draws X cards. Shuffle Blue Sun's Zenith into its owner's library. - this.getSpellAbility().addEffect(new DrawCardTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardTargetEffect(GetXValue.instance)); this.getSpellAbility().addEffect(ShuffleSpellEffect.getInstance()); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/b/BondOfAgony.java b/Mage.Sets/src/mage/cards/b/BondOfAgony.java index 37788e5e409..fc4decf7cb4 100644 --- a/Mage.Sets/src/mage/cards/b/BondOfAgony.java +++ b/Mage.Sets/src/mage/cards/b/BondOfAgony.java @@ -4,7 +4,7 @@ package mage.cards.b; import java.util.UUID; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,7 +18,7 @@ public final class BondOfAgony extends CardImpl { public BondOfAgony(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{B}"); - DynamicValue xValue = ManacostVariableValue.REGULAR; + DynamicValue xValue = GetXValue.instance; // As an additional cost to cast Bond of Agony, pay X life. // magenoxx: here we don't use PayVariableLifeCost as {X} shouldn't actually be announced diff --git a/Mage.Sets/src/mage/cards/b/BonfireOfTheDamned.java b/Mage.Sets/src/mage/cards/b/BonfireOfTheDamned.java index be414e0c10c..d9b95e21ef4 100644 --- a/Mage.Sets/src/mage/cards/b/BonfireOfTheDamned.java +++ b/Mage.Sets/src/mage/cards/b/BonfireOfTheDamned.java @@ -12,6 +12,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetPlayerOrPlaneswalker; +import mage.util.CardUtil; import java.util.UUID; @@ -55,7 +56,7 @@ class BonfireOfTheDamnedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int damage = source.getManaCostsToPay().getX(); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); if (damage < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java b/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java index e94140c5333..24d0911e000 100644 --- a/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java +++ b/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java @@ -2,7 +2,7 @@ package mage.cards.b; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageEverythingEffect; import mage.abilities.keyword.HorsemanshipAbility; import mage.cards.CardImpl; @@ -27,7 +27,7 @@ public final class BorrowingTheEastWind extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{G}{G}"); // Borrowing the East Wind deals X damage to each creature with horsemanship and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.REGULAR, filter)); } + this.getSpellAbility().addEffect(new DamageEverythingEffect(GetXValue.instance, filter)); } private BorrowingTheEastWind(final BorrowingTheEastWind card) { super(card); diff --git a/Mage.Sets/src/mage/cards/b/BottomlessVault.java b/Mage.Sets/src/mage/cards/b/BottomlessVault.java index aa4d3266e76..a545651b2b8 100644 --- a/Mage.Sets/src/mage/cards/b/BottomlessVault.java +++ b/Mage.Sets/src/mage/cards/b/BottomlessVault.java @@ -12,7 +12,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -44,7 +44,7 @@ public final class BottomlessVault extends CardImpl { // {tap}, Remove any number of storage counters from Bottomless Vault: Add {B} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.BlackMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {B} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/b/BrainInAJar.java b/Mage.Sets/src/mage/cards/b/BrainInAJar.java index de3b3a123e0..60e702b582a 100644 --- a/Mage.Sets/src/mage/cards/b/BrainInAJar.java +++ b/Mage.Sets/src/mage/cards/b/BrainInAJar.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -112,7 +112,7 @@ class BrainInAJarScryEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int x = RemovedCountersForCostValue.instance.calculate(game, source, this); + int x = GetXValue.instance.calculate(game, source, this); if (x > 0) { return controller.scry(x, source, game); } diff --git a/Mage.Sets/src/mage/cards/b/Braingeyser.java b/Mage.Sets/src/mage/cards/b/Braingeyser.java index 0aa9a0dc160..38faaccf65b 100644 --- a/Mage.Sets/src/mage/cards/b/Braingeyser.java +++ b/Mage.Sets/src/mage/cards/b/Braingeyser.java @@ -2,7 +2,7 @@ package mage.cards.b; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -21,7 +21,7 @@ public final class Braingeyser extends CardImpl { // Target player draws X cards. - this.getSpellAbility().addEffect(new DrawCardTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/b/Breakthrough.java b/Mage.Sets/src/mage/cards/b/Breakthrough.java index e69df78e1a5..e2a54278d99 100644 --- a/Mage.Sets/src/mage/cards/b/Breakthrough.java +++ b/Mage.Sets/src/mage/cards/b/Breakthrough.java @@ -12,6 +12,7 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInHand; +import mage.util.CardUtil; import java.util.UUID; @@ -62,7 +63,7 @@ class BreakthroughEffect extends OneShotEffect { if (player == null) { return false; } - int amountToKeep = source.getManaCostsToPay().getX(); + int amountToKeep = CardUtil.getSourceCostsTag(game, source, "X", 0); if (amountToKeep == 0) { player.discard(player.getHand(), false, source, game); } else if (amountToKeep < player.getHand().size()) { diff --git a/Mage.Sets/src/mage/cards/b/Brightflame.java b/Mage.Sets/src/mage/cards/b/Brightflame.java index 063f3b13711..18bc830fa12 100644 --- a/Mage.Sets/src/mage/cards/b/Brightflame.java +++ b/Mage.Sets/src/mage/cards/b/Brightflame.java @@ -3,7 +3,7 @@ package mage.cards.b; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -27,7 +27,7 @@ public final class Brightflame extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}{W}{W}"); // Radiance - Brightflame deals X damage to target creature and each other creature that shares a color with it. You gain life equal to the damage dealt this way. - this.getSpellAbility().addEffect(new BrightflameEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new BrightflameEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().setAbilityWord(AbilityWord.RADIANCE); } diff --git a/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java b/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java index d503e6e8530..ded0e76df2a 100644 --- a/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java +++ b/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java @@ -1,7 +1,7 @@ package mage.cards.b; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ClashEffect; import mage.abilities.effects.common.CounterUnlessPaysEffect; @@ -25,7 +25,7 @@ public final class BrokenAmbitions extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}"); // Counter target spell unless its controller pays {X}. Clash with an opponent. If you win, that spell's controller puts the top four cards of their library into their graveyard. - this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new BrokenAmbitionsEffect()); this.getSpellAbility().addTarget(new TargetSpell()); } diff --git a/Mage.Sets/src/mage/cards/b/BronzebeakForagers.java b/Mage.Sets/src/mage/cards/b/BronzebeakForagers.java index 230771b4ccd..b6e9a72d1bf 100644 --- a/Mage.Sets/src/mage/cards/b/BronzebeakForagers.java +++ b/Mage.Sets/src/mage/cards/b/BronzebeakForagers.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.abilities.effects.common.GainLifeEffect; @@ -58,7 +58,7 @@ public final class BronzebeakForagers extends CardImpl { new ManaCostsImpl<>("{X}{W}") ); dissolveAbility.setTargetAdjuster(BronzebeakForagerDissolveAdjuster.instance); - dissolveAbility.addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); + dissolveAbility.addEffect(new GainLifeEffect(GetXValue.instance)); this.addAbility(dissolveAbility); } @@ -79,7 +79,7 @@ enum BronzebeakForagerDissolveAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); FilterCard filter = new FilterCard("card with mana value " + xValue); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); ability.addTarget(new TargetCardInExile(filter, CardUtil.getExileZoneId(game, ability))); diff --git a/Mage.Sets/src/mage/cards/b/Broodlord.java b/Mage.Sets/src/mage/cards/b/Broodlord.java index 5bd3c6f8d1d..1119984f9b4 100644 --- a/Mage.Sets/src/mage/cards/b/Broodlord.java +++ b/Mage.Sets/src/mage/cards/b/Broodlord.java @@ -3,7 +3,7 @@ package mage.cards.b; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.RavenousAbility; import mage.cards.CardImpl; @@ -37,7 +37,7 @@ public final class Broodlord extends CardImpl { // Brood Telepathy -- When Broodlord enters the battlefield, distribute X +1/+1 counters among any number of other target creatures you control. Ability ability = new EntersBattlefieldTriggeredAbility(new BroodlordEffect()); - ability.addTarget(new TargetPermanentAmount(ManacostVariableValue.ETB, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)); + ability.addTarget(new TargetPermanentAmount(GetXValue.instance, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)); this.addAbility(ability.withFlavorWord("Brood Telepathy")); } diff --git a/Mage.Sets/src/mage/cards/b/BurnFromWithin.java b/Mage.Sets/src/mage/cards/b/BurnFromWithin.java index 287066b6cc8..0ba796657ad 100644 --- a/Mage.Sets/src/mage/cards/b/BurnFromWithin.java +++ b/Mage.Sets/src/mage/cards/b/BurnFromWithin.java @@ -17,6 +17,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -69,7 +70,7 @@ class BurnFromWithinEffect extends OneShotEffect { return false; } - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); // Target is a creature Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); diff --git a/Mage.Sets/src/mage/cards/c/CabalInterrogator.java b/Mage.Sets/src/mage/cards/c/CabalInterrogator.java index 4753d6b507b..fe9cb15bea8 100644 --- a/Mage.Sets/src/mage/cards/c/CabalInterrogator.java +++ b/Mage.Sets/src/mage/cards/c/CabalInterrogator.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -31,7 +31,7 @@ public final class CabalInterrogator extends CardImpl { // {X}{B}, {tap}: Target player reveals X cards from their hand and you choose one of them. That player discards that card. // Activate only as a sorcery. Ability ability = new ActivateAsSorceryActivatedAbility( - new DiscardCardYouChooseTargetEffect(ManacostVariableValue.REGULAR), + new DiscardCardYouChooseTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{B}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPlayer()); diff --git a/Mage.Sets/src/mage/cards/c/CacklingWitch.java b/Mage.Sets/src/mage/cards/c/CacklingWitch.java index dc565ca83ab..635c8d5455d 100644 --- a/Mage.Sets/src/mage/cards/c/CacklingWitch.java +++ b/Mage.Sets/src/mage/cards/c/CacklingWitch.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -33,7 +33,7 @@ public final class CacklingWitch extends CardImpl { this.toughness = new MageInt(1); // {X}{B}, {tap}, Discard a card: Target creature gets +X/+0 until end of turn. - ManacostVariableValue manaX = ManacostVariableValue.REGULAR; + GetXValue manaX = GetXValue.instance; Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(manaX, StaticValue.get(0), Duration.EndOfTurn), new ManaCostsImpl<>("{X}{B}")); diff --git a/Mage.Sets/src/mage/cards/c/CalciformPools.java b/Mage.Sets/src/mage/cards/c/CalciformPools.java index 9c16e8a472e..53346c4624e 100644 --- a/Mage.Sets/src/mage/cards/c/CalciformPools.java +++ b/Mage.Sets/src/mage/cards/c/CalciformPools.java @@ -7,7 +7,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.mana.ColorlessManaAbility; @@ -36,7 +36,7 @@ public final class CalciformPools extends CardImpl { this.addAbility(ability); // {1}, Remove X storage counters from Calciform Pools: Add X mana in any combination of {W} and/or {U}. ability = new SimpleManaAbility(Zone.BATTLEFIELD, - new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, + new AddManaInAnyCombinationEffect(GetXValue.instance, new CountersSourceCount(CounterType.STORAGE), ColoredManaSymbol.W, ColoredManaSymbol.U), new GenericManaCost(1)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/c/CaptainsManeuver.java b/Mage.Sets/src/mage/cards/c/CaptainsManeuver.java index 8a7ce213126..7a2ab00fc92 100644 --- a/Mage.Sets/src/mage/cards/c/CaptainsManeuver.java +++ b/Mage.Sets/src/mage/cards/c/CaptainsManeuver.java @@ -2,7 +2,7 @@ package mage.cards.c; import mage.MageObjectReference; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.RedirectionEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -73,7 +73,7 @@ class CaptainsManeuverEffect extends RedirectionEffect { @Override public void init(Ability source, Game game) { super.init(source, game); - amountToRedirect = ManacostVariableValue.REGULAR.calculate(game, source, this); + amountToRedirect = GetXValue.instance.calculate(game, source, this); redirectToObject = new MageObjectReference(source.getTargets().get(1).getFirstTarget(), game); } diff --git a/Mage.Sets/src/mage/cards/c/CataclysmicProspecting.java b/Mage.Sets/src/mage/cards/c/CataclysmicProspecting.java index f0335fcfaa0..b195270fbc3 100644 --- a/Mage.Sets/src/mage/cards/c/CataclysmicProspecting.java +++ b/Mage.Sets/src/mage/cards/c/CataclysmicProspecting.java @@ -3,7 +3,7 @@ package mage.cards.c; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DamageAllEffect; @@ -40,7 +40,7 @@ public final class CataclysmicProspecting extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}"); // Cataclysmic Prospecting deals X damage to each creature. For each mana from a Desert spent to cast this spell, create a tapped Treasure token. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, StaticFilters.FILTER_PERMANENT_CREATURE)); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, StaticFilters.FILTER_PERMANENT_CREATURE)); this.getSpellAbility().addEffect(new CreateTokenEffect(new TreasureToken(), CataclysmicProspectingValue.instance, true, false) .setText("For each mana from a Desert spent to cast this spell, create a tapped Treasure token.")); this.getSpellAbility().addWatcher(new CataclysmicProspectingWatcher()); diff --git a/Mage.Sets/src/mage/cards/c/ChamberSentry.java b/Mage.Sets/src/mage/cards/c/ChamberSentry.java index 1fc0ae862f8..f3e9ec0aba0 100644 --- a/Mage.Sets/src/mage/cards/c/ChamberSentry.java +++ b/Mage.Sets/src/mage/cards/c/ChamberSentry.java @@ -11,7 +11,7 @@ import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -25,6 +25,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -45,7 +46,7 @@ public final class ChamberSentry extends CardImpl { "with a +1/+1 counter on it for each color of mana spent to cast it")); // {X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR) + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance) .setText("It deals X damage to any target"), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); @@ -128,6 +129,6 @@ class ChamberSentryRemoveVariableCountersSourceCost extends VariableCostImpl { @Override public int announceXValue(Ability source, Game game) { - return source.getManaCostsToPay().getX(); + return CardUtil.getSourceCostsTag(game, source, "X", 0); } } diff --git a/Mage.Sets/src/mage/cards/c/ChandraAwakenedInferno.java b/Mage.Sets/src/mage/cards/c/ChandraAwakenedInferno.java index 266ff93741e..7d6a4909601 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraAwakenedInferno.java +++ b/Mage.Sets/src/mage/cards/c/ChandraAwakenedInferno.java @@ -3,7 +3,7 @@ package mage.cards.c; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CantBeCounteredSourceAbility; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -51,7 +51,7 @@ public final class ChandraAwakenedInferno extends CardImpl { this.addAbility(new LoyaltyAbility(new DamageAllEffect(3, filter), -3)); // -X: Chandra, Awakened Inferno deals X damage to target creature or planeswalker. If a permanent dealt damage this way would die this turn, exile it instead. - Ability ability = new LoyaltyAbility(new DamageTargetEffect(GetXLoyaltyValue.instance)); + Ability ability = new LoyaltyAbility(new DamageTargetEffect(GetXValue.instance)); ability.addEffect( new ExileTargetIfDiesEffect() .setText("If a permanent dealt damage this way would die this turn, exile it instead.") diff --git a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java index 8364c6fe1ae..f38591d5010 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java +++ b/Mage.Sets/src/mage/cards/c/ChandraFlamecaller.java @@ -2,7 +2,7 @@ package mage.cards.c; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DamageAllEffect; @@ -39,7 +39,7 @@ public final class ChandraFlamecaller extends CardImpl { // -X: Chandra, Flamecaller deals X damage to each creature. this.addAbility(new LoyaltyAbility(new DamageAllEffect( - GetXLoyaltyValue.instance, StaticFilters.FILTER_PERMANENT_CREATURE + GetXValue.instance, StaticFilters.FILTER_PERMANENT_CREATURE ))); } diff --git a/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java b/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java index 737b6801135..9142b8bcffb 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java +++ b/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java @@ -5,7 +5,7 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CopyTargetStackObjectEffect; @@ -52,7 +52,7 @@ public class ChandraHopesBeacon extends CardImpl { //−X: Chandra, Hope’s Beacon deals X damage to each of up to two targets. LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new DamageTargetEffect( - GetXLoyaltyValue.instance, true, "each of up to two targets" + GetXValue.instance, true, "each of up to two targets" )); loyaltyAbility.addTarget(new TargetAnyTarget(0, 2)); this.addAbility(loyaltyAbility); diff --git a/Mage.Sets/src/mage/cards/c/ChandraNalaar.java b/Mage.Sets/src/mage/cards/c/ChandraNalaar.java index 1964fb95ad2..7b61e7b0d76 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraNalaar.java +++ b/Mage.Sets/src/mage/cards/c/ChandraNalaar.java @@ -1,7 +1,7 @@ package mage.cards.c; import mage.abilities.LoyaltyAbility; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllControlledTargetEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -9,7 +9,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.common.FilterCreaturePermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlayerOrPlaneswalker; @@ -33,7 +32,7 @@ public final class ChandraNalaar extends CardImpl { this.addAbility(ability1); // -X: Chandra Nalaar deals X damage to target creature. - LoyaltyAbility ability2 = new LoyaltyAbility(new DamageTargetEffect(GetXLoyaltyValue.instance)); + LoyaltyAbility ability2 = new LoyaltyAbility(new DamageTargetEffect(GetXValue.instance)); ability2.addTarget(new TargetCreaturePermanent()); this.addAbility(ability2); diff --git a/Mage.Sets/src/mage/cards/c/ChimericCoils.java b/Mage.Sets/src/mage/cards/c/ChimericCoils.java index 0dfeaadba59..34efa55d955 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericCoils.java +++ b/Mage.Sets/src/mage/cards/c/ChimericCoils.java @@ -12,6 +12,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import java.util.UUID; @@ -74,7 +75,7 @@ class ChimericCoilsEffect extends ContinuousEffectImpl { break; case PTChangingEffects_7: if (sublayer == SubLayer.SetPT_7b) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); permanent.getPower().setModifiedBaseValue(xValue); permanent.getToughness().setModifiedBaseValue(xValue); } diff --git a/Mage.Sets/src/mage/cards/c/ChimericStaff.java b/Mage.Sets/src/mage/cards/c/ChimericStaff.java index 13908c2770e..1cc20dc76dc 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericStaff.java +++ b/Mage.Sets/src/mage/cards/c/ChimericStaff.java @@ -9,6 +9,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import java.util.UUID; @@ -69,7 +70,7 @@ class ChimericStaffEffect extends ContinuousEffectImpl { break; case PTChangingEffects_7: if (sublayer == SubLayer.SetPT_7b) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); permanent.getPower().setModifiedBaseValue(xValue); permanent.getToughness().setModifiedBaseValue(xValue); } diff --git a/Mage.Sets/src/mage/cards/c/CinderElemental.java b/Mage.Sets/src/mage/cards/c/CinderElemental.java index 19aea72d13c..c965f0950fb 100644 --- a/Mage.Sets/src/mage/cards/c/CinderElemental.java +++ b/Mage.Sets/src/mage/cards/c/CinderElemental.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -31,7 +31,7 @@ public final class CinderElemental extends CardImpl { this.toughness = new MageInt(2); // {X}{R}, {tap}, Sacrifice Cinder Elemental: Cinder Elemental deals X damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR, "it"), new ManaCostsImpl<>("{X}{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance, "it"), new ManaCostsImpl<>("{X}{R}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetAnyTarget()); diff --git a/Mage.Sets/src/mage/cards/c/CitanulFlute.java b/Mage.Sets/src/mage/cards/c/CitanulFlute.java index 6625f446c5b..0dffff9999e 100644 --- a/Mage.Sets/src/mage/cards/c/CitanulFlute.java +++ b/Mage.Sets/src/mage/cards/c/CitanulFlute.java @@ -19,6 +19,7 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -73,7 +74,7 @@ class CitanulFluteSearchEffect extends OneShotEffect { FilterCard filter = new FilterCreatureCard("creature card with mana value X or less"); //Set the mana cost one higher to 'emulate' a less than or equal to comparison. - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); TargetCardInLibrary target = new TargetCardInLibrary(filter); player.searchLibrary(target, source, game); diff --git a/Mage.Sets/src/mage/cards/c/ClanDefiance.java b/Mage.Sets/src/mage/cards/c/ClanDefiance.java index a1a622f778d..14e388c5e43 100644 --- a/Mage.Sets/src/mage/cards/c/ClanDefiance.java +++ b/Mage.Sets/src/mage/cards/c/ClanDefiance.java @@ -1,7 +1,7 @@ package mage.cards.c; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -35,14 +35,14 @@ public final class ClanDefiance extends CardImpl { this.getSpellAbility().getModes().setMinModes(1); this.getSpellAbility().getModes().setMaxModes(3); // Clan Defiance deals X damage to target creature with flying; - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filterFlying).withChooseHint("deals X damage, with flying")); // Clan Defiance deals X damage to target creature without flying; - Mode mode1 = new Mode(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + Mode mode1 = new Mode(new DamageTargetEffect(GetXValue.instance)); mode1.addTarget(new TargetCreaturePermanent(filterWithoutFlying).withChooseHint("deals X damage, without flying")); this.getSpellAbility().addMode(mode1); // and/or Clan Defiance deals X damage to target player. - Mode mode2 = new Mode(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + Mode mode2 = new Mode(new DamageTargetEffect(GetXValue.instance)); mode2.addTarget(new TargetPlayerOrPlaneswalker().withChooseHint("deals X damage")); this.getSpellAbility().addMode(mode2); diff --git a/Mage.Sets/src/mage/cards/c/ClashOfWills.java b/Mage.Sets/src/mage/cards/c/ClashOfWills.java index e57ebdbabca..10d919f51e1 100644 --- a/Mage.Sets/src/mage/cards/c/ClashOfWills.java +++ b/Mage.Sets/src/mage/cards/c/ClashOfWills.java @@ -2,7 +2,7 @@ package mage.cards.c; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class ClashOfWills extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{U}"); // Counter target spell unless its controller pays {X}. - this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetSpell()); } diff --git a/Mage.Sets/src/mage/cards/c/ClockworkAvian.java b/Mage.Sets/src/mage/cards/c/ClockworkAvian.java index 1b7c5f3ea57..d532799878f 100644 --- a/Mage.Sets/src/mage/cards/c/ClockworkAvian.java +++ b/Mage.Sets/src/mage/cards/c/ClockworkAvian.java @@ -21,6 +21,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import mage.watchers.common.AttackedOrBlockedThisCombatWatcher; import java.util.UUID; @@ -97,7 +98,7 @@ class ClockworkAvianEffect extends OneShotEffect { return false; } int maxCounters = Integer.min( - 4 - permanent.getCounters(game).getCount(CounterType.P1P0), source.getManaCostsToPay().getX() + 4 - permanent.getCounters(game).getCount(CounterType.P1P0), CardUtil.getSourceCostsTag(game, source, "X", 0) ); if (maxCounters < 1) { return false; diff --git a/Mage.Sets/src/mage/cards/c/ClockworkBeast.java b/Mage.Sets/src/mage/cards/c/ClockworkBeast.java index 4d0c2b8bdff..c091cf4ad66 100644 --- a/Mage.Sets/src/mage/cards/c/ClockworkBeast.java +++ b/Mage.Sets/src/mage/cards/c/ClockworkBeast.java @@ -21,6 +21,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import mage.watchers.common.AttackedOrBlockedThisCombatWatcher; import java.util.UUID; @@ -94,7 +95,7 @@ class ClockworkBeastEffect extends OneShotEffect { return false; } int maxCounters = Integer.min( - 7 - permanent.getCounters(game).getCount(CounterType.P1P0), source.getManaCostsToPay().getX() + 7 - permanent.getCounters(game).getCount(CounterType.P1P0), CardUtil.getSourceCostsTag(game, source, "X", 0) ); if (maxCounters < 1) { return false; diff --git a/Mage.Sets/src/mage/cards/c/ClockworkSteed.java b/Mage.Sets/src/mage/cards/c/ClockworkSteed.java index 7ab435ef583..e3c2c117c13 100644 --- a/Mage.Sets/src/mage/cards/c/ClockworkSteed.java +++ b/Mage.Sets/src/mage/cards/c/ClockworkSteed.java @@ -23,6 +23,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import mage.watchers.common.AttackedOrBlockedThisCombatWatcher; import java.util.UUID; @@ -102,7 +103,7 @@ class ClockworkSteedEffect extends OneShotEffect { return false; } int maxCounters = Integer.min( - 4 - permanent.getCounters(game).getCount(CounterType.P1P0), source.getManaCostsToPay().getX() + 4 - permanent.getCounters(game).getCount(CounterType.P1P0), CardUtil.getSourceCostsTag(game, source, "X", 0) ); if (maxCounters < 1) { return false; diff --git a/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java b/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java index 2e8c15776d8..8902726f6fb 100644 --- a/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java +++ b/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java @@ -23,6 +23,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import mage.watchers.common.AttackedOrBlockedThisCombatWatcher; import java.util.UUID; @@ -106,7 +107,7 @@ class ClockworkSwarmEffect extends OneShotEffect { return false; } int maxCounters = Integer.min( - 4 - permanent.getCounters(game).getCount(CounterType.P1P0), source.getManaCostsToPay().getX() + 4 - permanent.getCounters(game).getCount(CounterType.P1P0), CardUtil.getSourceCostsTag(game, source, "X", 0) ); if (maxCounters < 1) { return false; diff --git a/Mage.Sets/src/mage/cards/c/ClownCar.java b/Mage.Sets/src/mage/cards/c/ClownCar.java index 0c91340c0fe..afe6693e22c 100644 --- a/Mage.Sets/src/mage/cards/c/ClownCar.java +++ b/Mage.Sets/src/mage/cards/c/ClownCar.java @@ -3,7 +3,7 @@ package mage.cards.c; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.CrewAbility; import mage.cards.CardImpl; @@ -72,7 +72,7 @@ class ClownCarEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = ManacostVariableValue.ETB.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/c/CometStorm.java b/Mage.Sets/src/mage/cards/c/CometStorm.java index 07d72fe74bf..10f6784588d 100644 --- a/Mage.Sets/src/mage/cards/c/CometStorm.java +++ b/Mage.Sets/src/mage/cards/c/CometStorm.java @@ -14,6 +14,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; import mage.target.targetadjustment.TargetsCountAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -58,7 +59,7 @@ class CometStormEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int damage = source.getManaCostsToPay().getX(); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { for (UUID uuid : this.getTargetPointer().getTargets(game, source)) { diff --git a/Mage.Sets/src/mage/cards/c/CommandersInsight.java b/Mage.Sets/src/mage/cards/c/CommandersInsight.java index 574ac38d687..354d4b8be14 100644 --- a/Mage.Sets/src/mage/cards/c/CommandersInsight.java +++ b/Mage.Sets/src/mage/cards/c/CommandersInsight.java @@ -10,6 +10,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; +import mage.util.CardUtil; import mage.watchers.common.CommanderPlaysCountWatcher; import java.util.UUID; @@ -94,7 +95,7 @@ class CommandersInsightEffect extends OneShotEffect { if (player == null || watcher == null) { return false; } - int toDraw = watcher.getPlayerCount(player.getId()) + source.getManaCostsToPay().getX(); + int toDraw = watcher.getPlayerCount(player.getId()) + CardUtil.getSourceCostsTag(game, source, "X", 0); return player.drawCards(toDraw, source, game) > 0; } } diff --git a/Mage.Sets/src/mage/cards/c/CommuneWithLava.java b/Mage.Sets/src/mage/cards/c/CommuneWithLava.java index bb70926fcff..39a94aa59c8 100644 --- a/Mage.Sets/src/mage/cards/c/CommuneWithLava.java +++ b/Mage.Sets/src/mage/cards/c/CommuneWithLava.java @@ -60,7 +60,7 @@ class CommuneWithLavaEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Card sourceCard = game.getCard(source.getSourceId()); if (controller != null && sourceCard != null) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); Set cards = controller.getLibrary().getTopCards(game, amount); controller.moveCardsToExile(cards, source, game, true, CardUtil.getCardExileZoneId(game, source), sourceCard.getIdName()); diff --git a/Mage.Sets/src/mage/cards/c/Condescend.java b/Mage.Sets/src/mage/cards/c/Condescend.java index 8c3b33fcf6c..af2c6deff23 100644 --- a/Mage.Sets/src/mage/cards/c/Condescend.java +++ b/Mage.Sets/src/mage/cards/c/Condescend.java @@ -2,7 +2,7 @@ package mage.cards.c; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.cards.CardImpl; @@ -21,7 +21,7 @@ public final class Condescend extends CardImpl { // Counter target spell unless its controller pays {X}. - this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetSpell()); // Scry 2. this.getSpellAbility().addEffect(new ScryEffect(2)); diff --git a/Mage.Sets/src/mage/cards/c/Conflagrate.java b/Mage.Sets/src/mage/cards/c/Conflagrate.java index 7309e60ae93..5b328705cb5 100644 --- a/Mage.Sets/src/mage/cards/c/Conflagrate.java +++ b/Mage.Sets/src/mage/cards/c/Conflagrate.java @@ -1,21 +1,19 @@ package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.DiscardXTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageMultiEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.target.common.TargetAnyTargetAmount; +import java.util.UUID; + /** * * @author LevelX2 @@ -26,9 +24,8 @@ public final class Conflagrate extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{R}"); // Conflagrate deals X damage divided as you choose among any number of targets. - DynamicValue xValue = new ConflagrateVariableValue(); - this.getSpellAbility().addEffect(new DamageMultiEffect(xValue)); - this.getSpellAbility().addTarget(new TargetAnyTargetAmount(xValue)); + this.getSpellAbility().addEffect(new DamageMultiEffect(GetXValue.instance)); + this.getSpellAbility().addTarget(new TargetAnyTargetAmount(GetXValue.instance)); // Flashback-{R}{R}, Discard X cards. Ability ability = new FlashbackAbility(this, new ManaCostsImpl<>("{R}{R}")); @@ -46,32 +43,3 @@ public final class Conflagrate extends CardImpl { return new Conflagrate(this); } } - -class ConflagrateVariableValue implements DynamicValue { - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - int xValue = sourceAbility.getManaCostsToPay().getX(); - for (Cost cost : sourceAbility.getCosts()) { - if (cost instanceof DiscardXTargetCost) { - xValue = ((DiscardXTargetCost) cost).getAmount(); - } - } - return xValue; - } - - @Override - public ConflagrateVariableValue copy() { - return new ConflagrateVariableValue(); - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return ""; - } -} diff --git a/Mage.Sets/src/mage/cards/c/ConfrontThePast.java b/Mage.Sets/src/mage/cards/c/ConfrontThePast.java index 22b49a6b394..edb4bff4de0 100644 --- a/Mage.Sets/src/mage/cards/c/ConfrontThePast.java +++ b/Mage.Sets/src/mage/cards/c/ConfrontThePast.java @@ -16,6 +16,7 @@ import mage.game.permanent.Permanent; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetPlaneswalkerPermanent; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -65,7 +66,7 @@ enum ConfrontThePastAdjuster implements TargetAdjuster { public void adjustTargets(Ability ability, Game game) { if (ability.getEffects().size() == 1 && ability.getEffects().get(0) instanceof ReturnFromGraveyardToBattlefieldTargetEffect) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); ability.getTargets().clear(); FilterPermanentCard filter = new FilterPermanentCard("planeswalker card with mana value X or less"); filter.add(CardType.PLANESWALKER.getPredicate()); @@ -93,7 +94,7 @@ class ConfrontThePastLoyaltyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Permanent target = game.getPermanent(source.getFirstTarget()); target.removeCounters(CounterType.LOYALTY.createInstance(xValue * 2), source, game); return true; diff --git a/Mage.Sets/src/mage/cards/c/ConsumeSpirit.java b/Mage.Sets/src/mage/cards/c/ConsumeSpirit.java index aff7a131bf9..5b5c1df69e4 100644 --- a/Mage.Sets/src/mage/cards/c/ConsumeSpirit.java +++ b/Mage.Sets/src/mage/cards/c/ConsumeSpirit.java @@ -4,7 +4,7 @@ package mage.cards.c; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.VariableCost; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.InfoEffect; @@ -38,8 +38,8 @@ public final class ConsumeSpirit extends CardImpl { // Consume Spirit deals X damage to any target and you gain X life. this.getSpellAbility().addTarget(new TargetAnyTarget()); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR).concatBy("and")); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance).concatBy("and")); VariableCost variableCost = this.getSpellAbility().getManaCostsToPay().getVariableCosts().get(0); if (variableCost instanceof VariableManaCost) { ((VariableManaCost) variableCost).setFilter(filterBlack); diff --git a/Mage.Sets/src/mage/cards/c/ContaminatedDrink.java b/Mage.Sets/src/mage/cards/c/ContaminatedDrink.java index 0a9bb208832..b85d25fc02f 100644 --- a/Mage.Sets/src/mage/cards/c/ContaminatedDrink.java +++ b/Mage.Sets/src/mage/cards/c/ContaminatedDrink.java @@ -1,7 +1,7 @@ package mage.cards.c; import mage.abilities.dynamicvalue.common.HalfValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.counter.AddCountersPlayersEffect; import mage.cards.CardImpl; @@ -21,9 +21,9 @@ public final class ContaminatedDrink extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{B}"); // Draw X cards, then you get half X rad counters, rounded up. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new AddCountersPlayersEffect( - CounterType.RAD.createInstance(), new HalfValue(ManacostVariableValue.REGULAR, true), TargetController.YOU + CounterType.RAD.createInstance(), new HalfValue(GetXValue.instance, true), TargetController.YOU ).setText(", then you get half X rad counters, rounded up")); } diff --git a/Mage.Sets/src/mage/cards/c/CorrosiveGale.java b/Mage.Sets/src/mage/cards/c/CorrosiveGale.java index 54032508cb4..97b5cffea5c 100644 --- a/Mage.Sets/src/mage/cards/c/CorrosiveGale.java +++ b/Mage.Sets/src/mage/cards/c/CorrosiveGale.java @@ -2,7 +2,7 @@ package mage.cards.c; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -27,7 +27,7 @@ public final class CorrosiveGale extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{G/P}"); - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filter)); } private CorrosiveGale(final CorrosiveGale card) { diff --git a/Mage.Sets/src/mage/cards/c/CrackleWithPower.java b/Mage.Sets/src/mage/cards/c/CrackleWithPower.java index 6afbb3bf74a..c36d6f8c4d5 100644 --- a/Mage.Sets/src/mage/cards/c/CrackleWithPower.java +++ b/Mage.Sets/src/mage/cards/c/CrackleWithPower.java @@ -2,7 +2,7 @@ package mage.cards.c; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -17,7 +17,7 @@ import java.util.UUID; */ public final class CrackleWithPower extends CardImpl { - private static final DynamicValue value = new MultipliedValue(ManacostVariableValue.REGULAR, 5); + private static final DynamicValue value = new MultipliedValue(GetXValue.instance, 5); public CrackleWithPower(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{X}{R}{R}"); diff --git a/Mage.Sets/src/mage/cards/c/CratersClaws.java b/Mage.Sets/src/mage/cards/c/CratersClaws.java index b75d9af7961..60d078f25db 100644 --- a/Mage.Sets/src/mage/cards/c/CratersClaws.java +++ b/Mage.Sets/src/mage/cards/c/CratersClaws.java @@ -3,7 +3,7 @@ package mage.cards.c; import mage.abilities.condition.common.FerociousCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.IntPlusDynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.hint.common.FerociousHint; import mage.cards.CardImpl; @@ -24,8 +24,8 @@ public final class CratersClaws extends CardImpl { // Crater's Claws deals X damage to any target. // Ferocious — Crater's Claws deals X plus 2 damage to that creature or player instead if you control a creature with power 4 or greater. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageTargetEffect(new IntPlusDynamicValue(2, ManacostVariableValue.REGULAR)), - new DamageTargetEffect(ManacostVariableValue.REGULAR), + new DamageTargetEffect(new IntPlusDynamicValue(2, GetXValue.instance)), + new DamageTargetEffect(GetXValue.instance), FerociousCondition.instance, "{this} deals X damage to any target." + "
Ferocious — {this} deals X plus 2 damage instead if you control a creature with power 4 or greater")); diff --git a/Mage.Sets/src/mage/cards/c/CrimePunishment.java b/Mage.Sets/src/mage/cards/c/CrimePunishment.java index 841858e84ef..81ac6f91c91 100644 --- a/Mage.Sets/src/mage/cards/c/CrimePunishment.java +++ b/Mage.Sets/src/mage/cards/c/CrimePunishment.java @@ -1,7 +1,6 @@ package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; @@ -15,6 +14,9 @@ import mage.filter.predicate.Predicates; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCardInOpponentsGraveyard; +import mage.util.CardUtil; + +import java.util.UUID; public final class CrimePunishment extends SplitCard { @@ -69,7 +71,7 @@ class PunishmentEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { for (Permanent permanent : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) { if (permanent != null - && permanent.getManaValue() == source.getManaCostsToPay().getX() + && permanent.getManaValue() == CardUtil.getSourceCostsTag(game, source, "X", 0) && (permanent.isArtifact(game) || permanent.isCreature(game) || permanent.isEnchantment(game))) { diff --git a/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java b/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java index e1593cc6330..8b32f1e67d2 100644 --- a/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java +++ b/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java @@ -9,7 +9,7 @@ import mage.abilities.costs.VariableCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -43,7 +43,7 @@ public final class CrimsonHellkite extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // {X}, {tap}: Crimson Hellkite deals X damage to target creature. Spend only red mana on X. - Effect effect = new DamageTargetEffect(ManacostVariableValue.REGULAR); + Effect effect = new DamageTargetEffect(GetXValue.instance); effect.setText("{this} deals X damage to target creature. Spend only red mana on X"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java b/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java index ccb640a7ce9..457aed3658f 100644 --- a/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java +++ b/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java @@ -11,7 +11,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.ConditionalAnyColorManaAbility; @@ -44,7 +44,7 @@ public final class CrucibleOfTheSpiritDragon extends CardImpl { // {T}, Remove X storage counters from Crucible of the Spirit Dragon: Add X mana in any combination of colors. Spend this mana only to cast Dragon spells or activate abilities of Dragons. ability = new ConditionalAnyColorManaAbility( new TapSourceCost(), - RemovedCountersForCostValue.instance, + GetXValue.instance, new CountersSourceCount(CounterType.STORAGE), new CrucibleOfTheSpiritDragonManaBuilder(), false diff --git a/Mage.Sets/src/mage/cards/c/CruelSadist.java b/Mage.Sets/src/mage/cards/c/CruelSadist.java index 3254c1976ca..48eba90c79f 100644 --- a/Mage.Sets/src/mage/cards/c/CruelSadist.java +++ b/Mage.Sets/src/mage/cards/c/CruelSadist.java @@ -8,7 +8,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -45,7 +45,7 @@ public final class CruelSadist extends CardImpl { // {2}{B}, {T}, Remove X +1/+1 counters from Cruel Sadist: Cruel Sadist deals X damage to target creature. ability = new SimpleActivatedAbility( - new DamageTargetEffect(RemovedCountersForCostValue.instance, "it"), new ManaCostsImpl<>("{2}{B}") + new DamageTargetEffect(GetXValue.instance, "it"), new ManaCostsImpl<>("{2}{B}") ); ability.addCost(new TapSourceCost()); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1)); diff --git a/Mage.Sets/src/mage/cards/c/CryptRats.java b/Mage.Sets/src/mage/cards/c/CryptRats.java index 84fbd6e9aa1..fedf3955a9d 100644 --- a/Mage.Sets/src/mage/cards/c/CryptRats.java +++ b/Mage.Sets/src/mage/cards/c/CryptRats.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.VariableCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageEverythingEffect; import mage.cards.CardImpl; @@ -38,7 +38,7 @@ public final class CryptRats extends CardImpl { this.toughness = new MageInt(1); // {X}: Crypt Rats deals X damage to each creature and each player. Spend only black mana on X. - Effect effect = new DamageEverythingEffect(ManacostVariableValue.REGULAR); + Effect effect = new DamageEverythingEffect(GetXValue.instance); effect.setText("{this} deals X damage to each creature and each player. Spend only black mana on X"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect,new ManaCostsImpl<>("{X}")); VariableCost variableCost = ability.getManaCostsToPay().getVariableCosts().get(0); diff --git a/Mage.Sets/src/mage/cards/c/CulminationOfStudies.java b/Mage.Sets/src/mage/cards/c/CulminationOfStudies.java index 2e75841878b..fca970a708b 100644 --- a/Mage.Sets/src/mage/cards/c/CulminationOfStudies.java +++ b/Mage.Sets/src/mage/cards/c/CulminationOfStudies.java @@ -18,6 +18,7 @@ import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; import mage.game.permanent.token.TreasureToken; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -75,7 +76,7 @@ class CulminationOfStudiesEffect extends OneShotEffect { if (player == null) { return false; } - Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, CardUtil.getSourceCostsTag(game, source, "X", 0))); player.moveCards(cards, Zone.EXILED, source, game); cards.removeIf(uuid -> game.getState().getZone(uuid) != Zone.EXILED); int landCards = cards.count(StaticFilters.FILTER_CARD_LAND, game); diff --git a/Mage.Sets/src/mage/cards/c/CutOfTheProfits.java b/Mage.Sets/src/mage/cards/c/CutOfTheProfits.java index ff4d0cf76c6..fc5070841a8 100644 --- a/Mage.Sets/src/mage/cards/c/CutOfTheProfits.java +++ b/Mage.Sets/src/mage/cards/c/CutOfTheProfits.java @@ -1,6 +1,6 @@ package mage.cards.c; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.keyword.CasualtyAbility; @@ -22,8 +22,8 @@ public final class CutOfTheProfits extends CardImpl { this.addAbility(new CasualtyAbility(3)); // You draw X cards and you lose X life. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR, "you")); - this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR).concatBy("and")); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance, "you")); + this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(GetXValue.instance).concatBy("and")); } private CutOfTheProfits(final CutOfTheProfits card) { diff --git a/Mage.Sets/src/mage/cards/c/CutRibbons.java b/Mage.Sets/src/mage/cards/c/CutRibbons.java index f008463772e..46f1fa21685 100644 --- a/Mage.Sets/src/mage/cards/c/CutRibbons.java +++ b/Mage.Sets/src/mage/cards/c/CutRibbons.java @@ -1,7 +1,7 @@ package mage.cards.c; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.keyword.AftermathAbility; @@ -28,7 +28,7 @@ public final class CutRibbons extends SplitCard { // Ribbons // Each opponent loses X life. getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true)); - getRightHalfCard().getSpellAbility().addEffect(new LoseLifeOpponentsEffect(ManacostVariableValue.REGULAR)); + getRightHalfCard().getSpellAbility().addEffect(new LoseLifeOpponentsEffect(GetXValue.instance)); } diff --git a/Mage.Sets/src/mage/cards/d/DamnablePact.java b/Mage.Sets/src/mage/cards/d/DamnablePact.java index 1706b04ba43..3f8e1a6241f 100644 --- a/Mage.Sets/src/mage/cards/d/DamnablePact.java +++ b/Mage.Sets/src/mage/cards/d/DamnablePact.java @@ -1,7 +1,6 @@ package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -11,6 +10,9 @@ import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -52,8 +54,8 @@ class DamnablePactEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); if (targetPlayer != null) { - targetPlayer.drawCards(source.getManaCostsToPay().getX(), source, game); - targetPlayer.loseLife(source.getManaCostsToPay().getX(), game, source, false); + targetPlayer.drawCards(CardUtil.getSourceCostsTag(game, source, "X", 0), source, game); + targetPlayer.loseLife(CardUtil.getSourceCostsTag(game, source, "X", 0), game, source, false); return true; } return false; diff --git a/Mage.Sets/src/mage/cards/d/DanceOfTheManse.java b/Mage.Sets/src/mage/cards/d/DanceOfTheManse.java index b37b798811c..12bf590c605 100644 --- a/Mage.Sets/src/mage/cards/d/DanceOfTheManse.java +++ b/Mage.Sets/src/mage/cards/d/DanceOfTheManse.java @@ -19,6 +19,7 @@ import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.Collection; import java.util.Objects; @@ -53,7 +54,7 @@ enum DanceOfTheManseAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); FilterCard filter = new FilterCard("artifact and/or non-Aura enchantment cards " + "each with mana value " + xValue + " or less from your graveyard"); filter.add(Predicates.or( @@ -102,7 +103,7 @@ class DanceOfTheManseEffect extends OneShotEffect { .filter(Objects::nonNull) .collect(Collectors.toSet())); player.moveCards(cards, Zone.BATTLEFIELD, source, game); - if (source.getManaCostsToPay().getX() < 6) { + if (CardUtil.getSourceCostsTag(game, source, "X", 0) < 6) { return true; } cards.stream() diff --git a/Mage.Sets/src/mage/cards/d/DarkSalvation.java b/Mage.Sets/src/mage/cards/d/DarkSalvation.java index 2da315aa70c..aaf8410078c 100644 --- a/Mage.Sets/src/mage/cards/d/DarkSalvation.java +++ b/Mage.Sets/src/mage/cards/d/DarkSalvation.java @@ -3,7 +3,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -31,7 +31,7 @@ public final class DarkSalvation extends CardImpl { // Target player creates X 2/2 black Zombie creature tokens, then up to one target creature gets -1/-1 until end of turn for each Zombie that player controls. this.getSpellAbility().addTarget(new TargetPlayer()); - this.getSpellAbility().addEffect(new CreateTokenTargetEffect(new ZombieToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenTargetEffect(new ZombieToken(), GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1)); Effect effect = new BoostTargetEffect( diff --git a/Mage.Sets/src/mage/cards/d/DauntlessDismantler.java b/Mage.Sets/src/mage/cards/d/DauntlessDismantler.java index 8213842b69e..f3c752e4396 100644 --- a/Mage.Sets/src/mage/cards/d/DauntlessDismantler.java +++ b/Mage.Sets/src/mage/cards/d/DauntlessDismantler.java @@ -16,6 +16,7 @@ import mage.filter.common.FilterArtifactPermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import java.util.UUID; @@ -81,7 +82,7 @@ class DauntlessDismantlerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { FilterPermanent filter = new FilterArtifactPermanent(); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, source.getManaCostsToPay().getX())); + filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, CardUtil.getSourceCostsTag(game, source, "X", 0))); boolean destroyed = false; for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { diff --git a/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java b/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java index 4b33429655c..ae41a005306 100644 --- a/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java +++ b/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java @@ -5,13 +5,12 @@ import java.util.UUID; import mage.abilities.condition.common.ManaWasSpentCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.InfoEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ColoredManaSymbol; /** * @@ -23,7 +22,7 @@ public final class DawnglowInfusion extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{G/W}"); // You gain X life if {G} was spent to cast Dawnglow Infusion and X life if {W} was spent to cast it. - DynamicValue xValue = ManacostVariableValue.REGULAR; + DynamicValue xValue = GetXValue.instance; this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new GainLifeEffect(xValue), ManaWasSpentCondition.GREEN, "You gain X life if {G} was spent to cast this spell")); diff --git a/Mage.Sets/src/mage/cards/d/DeathCloud.java b/Mage.Sets/src/mage/cards/d/DeathCloud.java index d6ec8a2f913..048f2bf268c 100644 --- a/Mage.Sets/src/mage/cards/d/DeathCloud.java +++ b/Mage.Sets/src/mage/cards/d/DeathCloud.java @@ -3,7 +3,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeAllPlayersEffect; import mage.abilities.effects.common.SacrificeAllEffect; @@ -25,7 +25,7 @@ public final class DeathCloud extends CardImpl { // Each player loses X life, discards X cards, sacrifices X creatures, then sacrifices X lands. - DynamicValue xValue = ManacostVariableValue.REGULAR; + DynamicValue xValue = GetXValue.instance; this.getSpellAbility().addEffect(new LoseLifeAllPlayersEffect(xValue)); Effect effect = new DiscardEachPlayerEffect(xValue, false); effect.setText(", discards X cards"); diff --git a/Mage.Sets/src/mage/cards/d/DeathGrasp.java b/Mage.Sets/src/mage/cards/d/DeathGrasp.java index deab07391e2..6b9c76ad047 100644 --- a/Mage.Sets/src/mage/cards/d/DeathGrasp.java +++ b/Mage.Sets/src/mage/cards/d/DeathGrasp.java @@ -3,7 +3,7 @@ package mage.cards.d; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -21,8 +21,8 @@ public final class DeathGrasp extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{W}{B}"); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); } diff --git a/Mage.Sets/src/mage/cards/d/DeathWind.java b/Mage.Sets/src/mage/cards/d/DeathWind.java index 5f9d7167aaa..5a6833c026e 100644 --- a/Mage.Sets/src/mage/cards/d/DeathWind.java +++ b/Mage.Sets/src/mage/cards/d/DeathWind.java @@ -2,7 +2,7 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -16,7 +16,7 @@ import mage.target.common.TargetCreaturePermanent; */ public final class DeathWind extends CardImpl { - private static final DynamicValue xValue = new SignInversionDynamicValue(ManacostVariableValue.REGULAR); + private static final DynamicValue xValue = new SignInversionDynamicValue(GetXValue.instance); public DeathWind(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{B}"); diff --git a/Mage.Sets/src/mage/cards/d/DebtToTheDeathless.java b/Mage.Sets/src/mage/cards/d/DebtToTheDeathless.java index 36766c84201..25e1cbb2cb3 100644 --- a/Mage.Sets/src/mage/cards/d/DebtToTheDeathless.java +++ b/Mage.Sets/src/mage/cards/d/DebtToTheDeathless.java @@ -2,7 +2,7 @@ package mage.cards.d; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.LoseLifeOpponentsYouGainLifeLostEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -16,7 +16,7 @@ import java.util.UUID; */ public final class DebtToTheDeathless extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public DebtToTheDeathless(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{W}{W}{B}{B}"); diff --git a/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java b/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java index 567d6f7f138..8bf3ad54f89 100644 --- a/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java +++ b/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java @@ -3,7 +3,7 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.common.CycleTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.CyclingAbility; @@ -28,7 +28,7 @@ public final class DecreeOfJustice extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{2}{W}{W}"); // Create X 4/4 white Angel creature tokens with flying. - this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), GetXValue.instance)); // Cycling {2}{W} this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}{W}"))); diff --git a/Mage.Sets/src/mage/cards/d/DefendersOfHumanity.java b/Mage.Sets/src/mage/cards/d/DefendersOfHumanity.java index 871775e11e5..e20d84241bd 100644 --- a/Mage.Sets/src/mage/cards/d/DefendersOfHumanity.java +++ b/Mage.Sets/src/mage/cards/d/DefendersOfHumanity.java @@ -10,7 +10,6 @@ import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.ExileSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.GetXValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.hint.common.CreaturesYouControlHint; import mage.abilities.hint.common.MyTurnHint; @@ -42,14 +41,14 @@ public final class DefendersOfHumanity extends CardImpl { // When Defenders of Humanity enters the battlefield, create X 2/2 white Astartes Warrior creature tokens with vigilance. this.addAbility(new EntersBattlefieldTriggeredAbility( - new CreateTokenEffect(new WhiteAstartesWarriorToken(), ManacostVariableValue.ETB) + new CreateTokenEffect(new WhiteAstartesWarriorToken(), GetXValue.instance) )); // {X}{2}{W}, Exile Defenders of Humanity: Create X 2/2 white Astartes Warrior creature tokens with vigilance. Activate only if you control no creatures and only during your turn. Ability ability = new ActivateIfConditionActivatedAbility( Zone.BATTLEFIELD, new CreateTokenEffect( - new WhiteAstartesWarriorToken(), GetXValue.instance + new WhiteAstartesWarriorToken(), mage.abilities.dynamicvalue.common.GetXValue.instance ), new ManaCostsImpl<>("{X}{2}{W}"), condition ).addHint(CreaturesYouControlHint.instance).addHint(MyTurnHint.instance); ability.addCost(new ExileSourceCost()); diff --git a/Mage.Sets/src/mage/cards/d/Delete.java b/Mage.Sets/src/mage/cards/d/Delete.java index 97a718b9e66..b7f62c996dd 100644 --- a/Mage.Sets/src/mage/cards/d/Delete.java +++ b/Mage.Sets/src/mage/cards/d/Delete.java @@ -1,6 +1,6 @@ package mage.cards.d; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageEverythingEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -25,7 +25,7 @@ public final class Delete extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}"); // Delete deals X damage to each nonartifact creature and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageEverythingEffect(GetXValue.instance, filter)); } private Delete(final Delete card) { diff --git a/Mage.Sets/src/mage/cards/d/Demonfire.java b/Mage.Sets/src/mage/cards/d/Demonfire.java index 6a8301b0964..fc9191b441c 100644 --- a/Mage.Sets/src/mage/cards/d/Demonfire.java +++ b/Mage.Sets/src/mage/cards/d/Demonfire.java @@ -7,7 +7,7 @@ import mage.abilities.condition.InvertCondition; import mage.abilities.condition.common.HellbentCondition; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CantBeCounteredSourceEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -31,7 +31,7 @@ public final class Demonfire extends CardImpl { // Demonfire deals X damage to any target. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageTargetEffect(ManacostVariableValue.REGULAR), + new DamageTargetEffect(GetXValue.instance), new InvertCondition(HellbentCondition.instance), "{this} deals X damage to any target")); @@ -41,7 +41,7 @@ public final class Demonfire extends CardImpl { // Hellbent - If you have no cards in hand, Demonfire can't be countered and the damage can't be prevented. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageTargetEffect(ManacostVariableValue.REGULAR, false), + new DamageTargetEffect(GetXValue.instance, false), HellbentCondition.instance, "
Hellbent — If you have no cards in hand, this spell can't be countered and the damage can't be prevented.")); // can't be countered diff --git a/Mage.Sets/src/mage/cards/d/DemonspineWhip.java b/Mage.Sets/src/mage/cards/d/DemonspineWhip.java index 62441f4e9d7..258fe5c1ba3 100644 --- a/Mage.Sets/src/mage/cards/d/DemonspineWhip.java +++ b/Mage.Sets/src/mage/cards/d/DemonspineWhip.java @@ -1,7 +1,6 @@ package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; @@ -13,12 +12,11 @@ import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.keyword.EquipAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -51,7 +49,7 @@ class XPaid implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - int paid = sourceAbility.getManaCostsToPay().getX(); + int paid = CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); return paid; } diff --git a/Mage.Sets/src/mage/cards/d/Detonate.java b/Mage.Sets/src/mage/cards/d/Detonate.java index 867c3e37f4c..44b075e2d02 100644 --- a/Mage.Sets/src/mage/cards/d/Detonate.java +++ b/Mage.Sets/src/mage/cards/d/Detonate.java @@ -1,7 +1,7 @@ package mage.cards.d; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetControllerEffect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -25,7 +25,7 @@ public final class Detonate extends CardImpl { // Destroy target artifact with converted mana cost X. It can't be regenerated. Detonate deals X damage to that artifact's controller. this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); this.getSpellAbility().addTarget(new TargetArtifactPermanent(new FilterArtifactPermanent("artifact with mana value X"))); - Effect effect = new DamageTargetControllerEffect(ManacostVariableValue.REGULAR); + Effect effect = new DamageTargetControllerEffect(GetXValue.instance); effect.setText("{this} deals X damage to that artifact's controller"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetArtifactPermanent()); diff --git a/Mage.Sets/src/mage/cards/d/DevilsPlay.java b/Mage.Sets/src/mage/cards/d/DevilsPlay.java index b25a36186ec..6ff0356cbe9 100644 --- a/Mage.Sets/src/mage/cards/d/DevilsPlay.java +++ b/Mage.Sets/src/mage/cards/d/DevilsPlay.java @@ -3,13 +3,12 @@ package mage.cards.d; import java.util.UUID; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TimingRule; import mage.target.common.TargetAnyTarget; /** @@ -23,7 +22,7 @@ public final class DevilsPlay extends CardImpl { // Devil's Play deals X damage to any target. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); // Flashback {X}{R}{R}{R} this.addAbility(new FlashbackAbility(this, new ManaCostsImpl<>("{X}{R}{R}{R}"))); diff --git a/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java b/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java index 8e82a67d2b2..994a8b1f68d 100644 --- a/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java +++ b/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java @@ -10,6 +10,7 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -57,7 +58,7 @@ class DiabolicRevelationEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue < 1) { player.shuffleLibrary(source, game); return true; diff --git a/Mage.Sets/src/mage/cards/d/Disintegrate.java b/Mage.Sets/src/mage/cards/d/Disintegrate.java index b4d6fc9b4f2..7bb2401eb26 100644 --- a/Mage.Sets/src/mage/cards/d/Disintegrate.java +++ b/Mage.Sets/src/mage/cards/d/Disintegrate.java @@ -2,7 +2,7 @@ package mage.cards.d; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.ExileTargetIfDiesEffect; @@ -23,7 +23,7 @@ public final class Disintegrate extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}"); // Disintegrate deals X damage to any target. That creature can't be regenerated this turn. If the creature would die this turn, exile it instead. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new CantRegenerateTargetEffect(Duration.EndOfTurn, "That creature")); Effect effect = new ExileTargetIfDiesEffect(); effect.setText("If the creature would die this turn, exile it instead"); diff --git a/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java b/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java index 1ed4b3ceb2e..44ecbc8db0e 100644 --- a/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java +++ b/Mage.Sets/src/mage/cards/d/DisorderInTheCourt.java @@ -2,7 +2,7 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect; @@ -80,7 +80,7 @@ class DisorderInTheCourtEffect extends OneShotEffect { controller.moveCardsToExile(toExile, source, game, true, CardUtil.getExileZoneId(game, source), CardUtil.getSourceName(game, source)); game.processAction(); } - new InvestigateEffect(ManacostVariableValue.REGULAR).apply(game, source); + new InvestigateEffect(GetXValue.instance).apply(game, source); if (!toExile.isEmpty()) { Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect(true, true); effect.setTargetPointer(new FixedTargets(toExile diff --git a/Mage.Sets/src/mage/cards/d/DisplacementWave.java b/Mage.Sets/src/mage/cards/d/DisplacementWave.java index 39bf606d4bc..c0634a2aa3f 100644 --- a/Mage.Sets/src/mage/cards/d/DisplacementWave.java +++ b/Mage.Sets/src/mage/cards/d/DisplacementWave.java @@ -12,6 +12,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -62,7 +63,7 @@ class DisplacementWaveEffect extends OneShotEffect { } Cards cards = new CardsImpl(); for (Permanent permanent : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) { - if (!permanent.isLand(game) && permanent.getManaValue() <= source.getManaCostsToPay().getX()) { + if (!permanent.isLand(game) && permanent.getManaValue() <= CardUtil.getSourceCostsTag(game, source, "X", 0)) { cards.add(permanent); } } diff --git a/Mage.Sets/src/mage/cards/d/DisruptingShoal.java b/Mage.Sets/src/mage/cards/d/DisruptingShoal.java index c9bb5dfca47..88c58d74f8d 100644 --- a/Mage.Sets/src/mage/cards/d/DisruptingShoal.java +++ b/Mage.Sets/src/mage/cards/d/DisruptingShoal.java @@ -2,7 +2,6 @@ package mage.cards.d; import mage.ObjectColor; import mage.abilities.Ability; -import mage.abilities.Mode; import mage.abilities.costs.AlternativeCostSourceAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.ExileFromHandCost; @@ -19,6 +18,7 @@ import mage.game.Game; import mage.game.stack.Spell; import mage.target.TargetSpell; import mage.target.common.TargetCardInHand; +import mage.util.CardUtil; import java.util.UUID; @@ -78,13 +78,13 @@ class DisruptingShoalCounterTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Spell spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source)); - if (spell != null && isManaValueEqual(source, spell.getManaValue())) { + if (spell != null && isManaValueEqual(source, spell.getManaValue(), game)) { return game.getStack().counter(source.getFirstTarget(), source, game); } return false; } - private boolean isManaValueEqual(Ability sourceAbility, int amount) { + private boolean isManaValueEqual(Ability sourceAbility, int amount, Game game) { for (Cost cost : sourceAbility.getCosts()) { if (cost.isPaid() && cost instanceof ExileFromHandCost) { for (Card card : ((ExileFromHandCost) cost).getCards()) { @@ -94,6 +94,6 @@ class DisruptingShoalCounterTargetEffect extends OneShotEffect { } } // No alternate costs payed so compare to X value - return sourceAbility.getManaCostsToPay().getX() == amount; + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0) == amount; } } diff --git a/Mage.Sets/src/mage/cards/d/DivineDeflection.java b/Mage.Sets/src/mage/cards/d/DivineDeflection.java index 22f0abcd382..cbfd3abeb19 100644 --- a/Mage.Sets/src/mage/cards/d/DivineDeflection.java +++ b/Mage.Sets/src/mage/cards/d/DivineDeflection.java @@ -12,6 +12,7 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -108,7 +109,7 @@ class DivineDeflectionPreventDamageTargetEffect extends PreventionEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { if (!this.used && super.applies(event, source, game)) { if (amountToPrevent == Integer.MIN_VALUE) { - amountToPrevent = source.getManaCostsToPay().getX(); + amountToPrevent = CardUtil.getSourceCostsTag(game, source, "X", 0); } // check permanent first Permanent permanent = game.getPermanent(event.getTargetId()); diff --git a/Mage.Sets/src/mage/cards/d/DivinersPortent.java b/Mage.Sets/src/mage/cards/d/DivinersPortent.java index cb8f5a731dc..0795197206e 100644 --- a/Mage.Sets/src/mage/cards/d/DivinersPortent.java +++ b/Mage.Sets/src/mage/cards/d/DivinersPortent.java @@ -2,7 +2,7 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.RollDieWithResultTableEffect; @@ -12,6 +12,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -31,7 +32,7 @@ public final class DivinersPortent extends CardImpl { this.getSpellAbility().addEffect(effect); // 1-14 | Draw X cards. - effect.addTableEntry(1, 14, new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + effect.addTableEntry(1, 14, new DrawCardSourceControllerEffect(GetXValue.instance)); // 15+ | Scry X, then draw X cards. effect.addTableEntry(15, Integer.MAX_VALUE, new DivinersPortentEffect()); @@ -66,7 +67,7 @@ class DivinersPortentEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/d/Doppelgang.java b/Mage.Sets/src/mage/cards/d/Doppelgang.java index ce8b93cf106..eb66ce64fe1 100644 --- a/Mage.Sets/src/mage/cards/d/Doppelgang.java +++ b/Mage.Sets/src/mage/cards/d/Doppelgang.java @@ -11,6 +11,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.targetadjustment.XTargetsCountAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -56,7 +57,7 @@ class DoppelgangEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/d/DrainLife.java b/Mage.Sets/src/mage/cards/d/DrainLife.java index 03202ee2817..230bb7e1b18 100644 --- a/Mage.Sets/src/mage/cards/d/DrainLife.java +++ b/Mage.Sets/src/mage/cards/d/DrainLife.java @@ -17,6 +17,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -73,7 +74,7 @@ class DrainLifeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); int lifetogain = amount; if (amount == 0) { return true; diff --git a/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java b/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java index 6854718ecab..be1085ddc11 100644 --- a/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java +++ b/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BoostSourceEffect; @@ -37,8 +37,8 @@ public final class DranaKalastriaBloodchief extends CardImpl { this.toughness = new MageInt(4); this.addAbility(FlyingAbility.getInstance()); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(StaticValue.get(0), new SignInversionDynamicValue(ManacostVariableValue.REGULAR), Duration.EndOfTurn), new ManaCostsImpl<>("{X}{B}{B}")); - ability.addEffect(new BoostSourceEffect(ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn).concatBy("and")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(StaticValue.get(0), new SignInversionDynamicValue(GetXValue.instance), Duration.EndOfTurn), new ManaCostsImpl<>("{X}{B}{B}")); + ability.addEffect(new BoostSourceEffect(GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn).concatBy("and")); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/d/DreadSummons.java b/Mage.Sets/src/mage/cards/d/DreadSummons.java index 5d1702c6720..12c542b725d 100644 --- a/Mage.Sets/src/mage/cards/d/DreadSummons.java +++ b/Mage.Sets/src/mage/cards/d/DreadSummons.java @@ -11,6 +11,7 @@ import mage.game.Game; import mage.game.permanent.token.Token; import mage.game.permanent.token.ZombieToken; import mage.players.Player; +import mage.util.CardUtil; import java.util.Objects; import java.util.UUID; @@ -65,7 +66,7 @@ class DreadSummonsEffect extends OneShotEffect { continue; } creatureCount += player - .millCards(source.getManaCostsToPay().getX(), source, game) + .millCards(CardUtil.getSourceCostsTag(game, source, "X", 0), source, game) .getCards(game) .stream() .filter(Objects::nonNull) diff --git a/Mage.Sets/src/mage/cards/d/DreadshipReef.java b/Mage.Sets/src/mage/cards/d/DreadshipReef.java index 2fb38965a5c..7a2b404fbb7 100644 --- a/Mage.Sets/src/mage/cards/d/DreadshipReef.java +++ b/Mage.Sets/src/mage/cards/d/DreadshipReef.java @@ -7,7 +7,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.mana.ColorlessManaAbility; @@ -36,7 +36,7 @@ public final class DreadshipReef extends CardImpl { this.addAbility(ability); // {1}, Remove X storage counters from Dreadship Reef: Add X mana in any combination of {U} and/or {B}. ability = new SimpleManaAbility(Zone.BATTLEFIELD, - new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, + new AddManaInAnyCombinationEffect(GetXValue.instance, new CountersSourceCount(CounterType.STORAGE), ColoredManaSymbol.U, ColoredManaSymbol.B), new GenericManaCost(1)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java b/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java index bbcc971b87d..55c1aeb8995 100644 --- a/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java +++ b/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java @@ -1,6 +1,6 @@ package mage.cards.d; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; @@ -22,7 +22,7 @@ public final class DregsOfSorrow extends CardImpl { // Destroy X target nonblack creatures. Draw X cards. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target nonblack creatures")); - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK)); this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } diff --git a/Mage.Sets/src/mage/cards/d/DroningBureaucrats.java b/Mage.Sets/src/mage/cards/d/DroningBureaucrats.java index 4108ab86b72..f92ab3432fe 100644 --- a/Mage.Sets/src/mage/cards/d/DroningBureaucrats.java +++ b/Mage.Sets/src/mage/cards/d/DroningBureaucrats.java @@ -1,7 +1,6 @@ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -9,16 +8,15 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.combat.CantAttackBlockAllEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.constants.Duration; -import mage.constants.Outcome; +import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -68,7 +66,7 @@ class DroningBureaucratsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with mana value X"); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); game.addEffect(new CantAttackBlockAllEffect(Duration.EndOfTurn, filter), source); diff --git a/Mage.Sets/src/mage/cards/d/DrownInDreams.java b/Mage.Sets/src/mage/cards/d/DrownInDreams.java index af19fab078e..39ae58f77c6 100644 --- a/Mage.Sets/src/mage/cards/d/DrownInDreams.java +++ b/Mage.Sets/src/mage/cards/d/DrownInDreams.java @@ -4,7 +4,7 @@ import mage.abilities.Mode; import mage.abilities.condition.common.ControlACommanderCondition; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.abilities.effects.common.MillCardsTargetEffect; import mage.cards.CardImpl; @@ -19,7 +19,7 @@ import java.util.UUID; */ public final class DrownInDreams extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public DrownInDreams(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{2}{U}"); @@ -31,7 +31,7 @@ public final class DrownInDreams extends CardImpl { this.getSpellAbility().getModes().setMoreCondition(ControlACommanderCondition.instance); // • Target player draws X cards. - this.getSpellAbility().addEffect(new DrawCardTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer().withChooseHint("draws X cards")); // • Target player mills twice X cards. diff --git a/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java b/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java index 0163e74992f..d08553454ab 100644 --- a/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java +++ b/Mage.Sets/src/mage/cards/d/DwarvenCatapult.java @@ -1,7 +1,6 @@ package mage.cards.d; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllControlledTargetEffect; @@ -13,6 +12,9 @@ import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.target.common.TargetOpponent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -53,7 +55,7 @@ class DwarvenCatapultEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int howMany = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getFirstTarget(), game).size(); - int amount = source.getManaCostsToPay().getX()/howMany; + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0)/howMany; DamageAllControlledTargetEffect dmgEffect = new DamageAllControlledTargetEffect(amount, new FilterCreaturePermanent()); return dmgEffect.apply(game, source); diff --git a/Mage.Sets/src/mage/cards/d/DwarvenHold.java b/Mage.Sets/src/mage/cards/d/DwarvenHold.java index 492df645ced..2fc09a07c35 100644 --- a/Mage.Sets/src/mage/cards/d/DwarvenHold.java +++ b/Mage.Sets/src/mage/cards/d/DwarvenHold.java @@ -12,7 +12,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -44,7 +44,7 @@ public final class DwarvenHold extends CardImpl { // {tap}, Remove any number of storage counters from Dwarven Hold: Add {R} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.RedMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {R} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/e/Earthquake.java b/Mage.Sets/src/mage/cards/e/Earthquake.java index 2f9bdbcb47c..740027d8206 100644 --- a/Mage.Sets/src/mage/cards/e/Earthquake.java +++ b/Mage.Sets/src/mage/cards/e/Earthquake.java @@ -3,7 +3,7 @@ package mage.cards.e; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageEverythingEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -29,7 +29,7 @@ public final class Earthquake extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{R}"); // Hurricane deals X damage to each creature with flying and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageEverythingEffect(GetXValue.instance, filter)); } private Earthquake(final Earthquake card) { diff --git a/Mage.Sets/src/mage/cards/e/EcologicalAppreciation.java b/Mage.Sets/src/mage/cards/e/EcologicalAppreciation.java index 2300d63134e..abd709f2ee1 100644 --- a/Mage.Sets/src/mage/cards/e/EcologicalAppreciation.java +++ b/Mage.Sets/src/mage/cards/e/EcologicalAppreciation.java @@ -74,7 +74,7 @@ class EcologicalAppreciationEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCard filter = new FilterCreatureCard(); filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); TargetCardInLibrary targetCardsInLibrary = new TargetCardWithDifferentNameInLibrary(0, 4, filter); diff --git a/Mage.Sets/src/mage/cards/e/EiganjoUprising.java b/Mage.Sets/src/mage/cards/e/EiganjoUprising.java index eb19f579af4..13fef2c522c 100644 --- a/Mage.Sets/src/mage/cards/e/EiganjoUprising.java +++ b/Mage.Sets/src/mage/cards/e/EiganjoUprising.java @@ -13,6 +13,7 @@ import mage.game.Game; import mage.game.permanent.token.SamuraiToken; import mage.game.permanent.token.Token; import mage.target.targetpointer.FixedTargets; +import mage.util.CardUtil; import java.util.UUID; @@ -59,7 +60,7 @@ class EiganjoUprisingEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); if (amount < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/e/Electrodominance.java b/Mage.Sets/src/mage/cards/e/Electrodominance.java index 39a61cb31c7..c6971527658 100644 --- a/Mage.Sets/src/mage/cards/e/Electrodominance.java +++ b/Mage.Sets/src/mage/cards/e/Electrodominance.java @@ -1,7 +1,7 @@ package mage.cards.e; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -27,7 +27,7 @@ public final class Electrodominance extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{R}{R}"); // Electrodominance deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); this.getSpellAbility().addEffect(new ElectrodominanceEffect()); } @@ -67,7 +67,7 @@ class ElectrodominanceEffect extends OneShotEffect { } FilterCard filter = new FilterCard(); filter.add(new ManaValuePredicate( - ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1 + ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1 )); return CardUtil.castSpellWithAttributesForFree(controller, source, game, controller.getHand(), filter); } diff --git a/Mage.Sets/src/mage/cards/e/ElusiveOtter.java b/Mage.Sets/src/mage/cards/e/ElusiveOtter.java index 64d7fb88435..bd427e0393a 100644 --- a/Mage.Sets/src/mage/cards/e/ElusiveOtter.java +++ b/Mage.Sets/src/mage/cards/e/ElusiveOtter.java @@ -2,7 +2,7 @@ package mage.cards.e; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesWithLessPowerEffect; import mage.abilities.effects.common.counter.DistributeCountersEffect; import mage.abilities.keyword.ProwessAbility; @@ -38,10 +38,10 @@ public final class ElusiveOtter extends AdventureCard { // Grove's Bounty // Distribute X +1/+1 counters among any number of target creatures you control. this.getSpellCard().getSpellAbility().addEffect(new DistributeCountersEffect( - CounterType.P1P1, ManacostVariableValue.REGULAR, false, + CounterType.P1P1, GetXValue.instance, false, "any number of target creatures you control" )); - Target target = new TargetCreaturePermanentAmount(ManacostVariableValue.REGULAR, StaticFilters.FILTER_CONTROLLED_CREATURES); + Target target = new TargetCreaturePermanentAmount(GetXValue.instance, StaticFilters.FILTER_CONTROLLED_CREATURES); target.setMinNumberOfTargets(0); target.setMaxNumberOfTargets(Integer.MAX_VALUE); this.getSpellCard().getSpellAbility().addTarget(target); diff --git a/Mage.Sets/src/mage/cards/e/EmblazonedGolem.java b/Mage.Sets/src/mage/cards/e/EmblazonedGolem.java index 8ddf7f98ae4..80b18654f2a 100644 --- a/Mage.Sets/src/mage/cards/e/EmblazonedGolem.java +++ b/Mage.Sets/src/mage/cards/e/EmblazonedGolem.java @@ -7,7 +7,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.KickedCondition; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.GetKickerXValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SunburstCount; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.InfoEffect; @@ -66,7 +66,7 @@ enum EmblazonedGolemKickerValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { int sunburst = SunburstCount.instance.calculate(game, sourceAbility, effect); // the amount of different colors spent on casting this - int kickerX = GetKickerXValue.instance.calculate(game, sourceAbility, effect); + int kickerX = GetXValue.instance.calculate(game, sourceAbility, effect); Spell spell = game.getSpellOrLKIStack(sourceAbility.getSourceId()); if (spell == null || spell.getSpellAbility() == null) { diff --git a/Mage.Sets/src/mage/cards/e/EmptyTheLaboratory.java b/Mage.Sets/src/mage/cards/e/EmptyTheLaboratory.java index 729df9beb42..0bf4af6fd69 100644 --- a/Mage.Sets/src/mage/cards/e/EmptyTheLaboratory.java +++ b/Mage.Sets/src/mage/cards/e/EmptyTheLaboratory.java @@ -14,8 +14,8 @@ import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; -import mage.target.TargetPermanent; import mage.target.common.TargetSacrifice; +import mage.util.CardUtil; import java.util.UUID; @@ -73,7 +73,7 @@ class EmptyTheLaboratoryEffect extends OneShotEffect { return false; } int toSacrifice = Math.min( - source.getManaCostsToPay().getX(), + CardUtil.getSourceCostsTag(game, source, "X", 0), game.getBattlefield().count( filter, source.getControllerId(), source, game ) diff --git a/Mage.Sets/src/mage/cards/e/EmptyThePits.java b/Mage.Sets/src/mage/cards/e/EmptyThePits.java index 9378cb5f50b..2086a177778 100644 --- a/Mage.Sets/src/mage/cards/e/EmptyThePits.java +++ b/Mage.Sets/src/mage/cards/e/EmptyThePits.java @@ -2,7 +2,7 @@ package mage.cards.e; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.DelveAbility; import mage.cards.CardImpl; @@ -24,7 +24,7 @@ public final class EmptyThePits extends CardImpl { this.addAbility(new DelveAbility()); // create X 2/2 black Zombie creature tokens tapped. - this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken(), ManacostVariableValue.REGULAR, true, false)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken(), GetXValue.instance, true, false)); } private EmptyThePits(final EmptyThePits card) { diff --git a/Mage.Sets/src/mage/cards/e/EnergyBolt.java b/Mage.Sets/src/mage/cards/e/EnergyBolt.java index cafa302b3a2..b25fc91cee7 100644 --- a/Mage.Sets/src/mage/cards/e/EnergyBolt.java +++ b/Mage.Sets/src/mage/cards/e/EnergyBolt.java @@ -3,7 +3,7 @@ package mage.cards.e; import java.util.UUID; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GainLifeTargetEffect; import mage.cards.CardImpl; @@ -22,9 +22,9 @@ public final class EnergyBolt extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{W}"); // Choose one - Energy Bolt deals X damage to target player; or target player gains X life. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); - Mode mode = new Mode(new GainLifeTargetEffect(ManacostVariableValue.REGULAR)); + Mode mode = new Mode(new GainLifeTargetEffect(GetXValue.instance)); mode.addTarget(new TargetPlayer()); this.getSpellAbility().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/e/EnergyVortex.java b/Mage.Sets/src/mage/cards/e/EnergyVortex.java index e3eaa828ad2..c9d789e1dd7 100644 --- a/Mage.Sets/src/mage/cards/e/EnergyVortex.java +++ b/Mage.Sets/src/mage/cards/e/EnergyVortex.java @@ -9,7 +9,7 @@ import mage.abilities.condition.common.IsStepCondition; import mage.abilities.costs.Cost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ChooseOpponentEffect; import mage.abilities.effects.common.RemoveAllCountersSourceEffect; @@ -56,7 +56,7 @@ public final class EnergyVortex extends CardImpl { Zone.BATTLEFIELD, new AddCountersSourceEffect( CounterType.VORTEX.createInstance(), - ManacostVariableValue.REGULAR, true + GetXValue.instance, true ), new ManaCostsImpl<>("{X}"), new IsStepCondition(PhaseStep.UPKEEP) )); diff --git a/Mage.Sets/src/mage/cards/e/Enrage.java b/Mage.Sets/src/mage/cards/e/Enrage.java index d40c72c34ee..ba37bd60b7d 100644 --- a/Mage.Sets/src/mage/cards/e/Enrage.java +++ b/Mage.Sets/src/mage/cards/e/Enrage.java @@ -2,7 +2,7 @@ package mage.cards.e; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -22,7 +22,7 @@ public final class Enrage extends CardImpl { // Target creature gets +X/+0 until end of turn. - this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostTargetEffect(GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java b/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java index b7db87f83c9..2e053bc0668 100644 --- a/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java +++ b/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java @@ -1,7 +1,7 @@ package mage.cards.e; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class EnshrinedMemories extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}"); // Reveal the top X cards of your library. Put all creature cards revealed this way into your hand and the rest on the bottom of your library in any order. - this.getSpellAbility().addEffect(new RevealLibraryPutIntoHandEffect(ManacostVariableValue.REGULAR, StaticFilters.FILTER_CARD_CREATURES, Zone.LIBRARY, true)); + this.getSpellAbility().addEffect(new RevealLibraryPutIntoHandEffect(GetXValue.instance, StaticFilters.FILTER_CARD_CREATURES, Zone.LIBRARY, true)); } private EnshrinedMemories(final EnshrinedMemories card) { diff --git a/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java b/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java index 8297b96ab98..3b67816f283 100644 --- a/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java +++ b/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java @@ -1,6 +1,6 @@ package mage.cards.e; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.MiracleAbility; import mage.cards.CardImpl; @@ -19,7 +19,7 @@ public final class EntreatTheAngels extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{W}{W}{W}"); // Create X 4/4 white Angel creature tokens with flying. - this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), GetXValue.instance)); // Miracle {X}{W}{W} this.addAbility(new MiracleAbility("{X}{W}{W}")); diff --git a/Mage.Sets/src/mage/cards/e/EpicExperiment.java b/Mage.Sets/src/mage/cards/e/EpicExperiment.java index e35c50b97c2..a3a596dcce7 100644 --- a/Mage.Sets/src/mage/cards/e/EpicExperiment.java +++ b/Mage.Sets/src/mage/cards/e/EpicExperiment.java @@ -65,10 +65,10 @@ class EpicExperimentEffect extends OneShotEffect { if (controller == null || sourceObject == null) { return false; } - Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); + Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, CardUtil.getSourceCostsTag(game, source, "X", 0))); controller.moveCards(cards, Zone.EXILED, source, game); FilterCard filter = new FilterInstantOrSorceryCard(); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); CardUtil.castMultipleWithAttributeForFree(controller, source, game, cards, filter); controller.moveCards(cards, Zone.GRAVEYARD, source, game); return true; diff --git a/Mage.Sets/src/mage/cards/e/EpiphanyAtTheDrownyard.java b/Mage.Sets/src/mage/cards/e/EpiphanyAtTheDrownyard.java index 8c4f61b40df..615fe8c8912 100644 --- a/Mage.Sets/src/mage/cards/e/EpiphanyAtTheDrownyard.java +++ b/Mage.Sets/src/mage/cards/e/EpiphanyAtTheDrownyard.java @@ -2,7 +2,7 @@ package mage.cards.e; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.IntPlusDynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.RevealAndSeparatePilesEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -17,7 +17,7 @@ import java.util.UUID; */ public final class EpiphanyAtTheDrownyard extends CardImpl { - private static final DynamicValue xValue = new IntPlusDynamicValue(1, ManacostVariableValue.REGULAR); + private static final DynamicValue xValue = new IntPlusDynamicValue(1, GetXValue.instance); public EpiphanyAtTheDrownyard(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}"); diff --git a/Mage.Sets/src/mage/cards/e/ErebossIntervention.java b/Mage.Sets/src/mage/cards/e/ErebossIntervention.java index b1136c3161e..db2f78e1f60 100644 --- a/Mage.Sets/src/mage/cards/e/ErebossIntervention.java +++ b/Mage.Sets/src/mage/cards/e/ErebossIntervention.java @@ -2,9 +2,12 @@ package mage.cards.e; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -14,11 +17,9 @@ import mage.game.Game; import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; -import mage.abilities.effects.common.continuous.BoostTargetEffect; /** * @author TheElk801 @@ -30,9 +31,9 @@ public final class ErebossIntervention extends CardImpl { // Choose one — // • Target creature gets -X/-X until end of turn. You gain X life. - DynamicValue x = new SignInversionDynamicValue(ManacostVariableValue.REGULAR); + DynamicValue x = new SignInversionDynamicValue(GetXValue.instance); this.getSpellAbility().addEffect(new BoostTargetEffect(x,x,Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR) + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance) .setText("You gain X life")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); @@ -63,7 +64,7 @@ enum ErebossInterventionAdjuster implements TargetAdjuster { } mode.getTargets().clear(); mode.addTarget(new TargetCardInGraveyard( - 0, 2 * ability.getManaCostsToPay().getX(), StaticFilters.FILTER_CARD_CARDS + 0, 2 * CardUtil.getSourceCostsTag(game, ability, "X", 0), StaticFilters.FILTER_CARD_CARDS )); } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/e/EvenTheScore.java b/Mage.Sets/src/mage/cards/e/EvenTheScore.java index 290e2f01b1c..4d614e5524c 100644 --- a/Mage.Sets/src/mage/cards/e/EvenTheScore.java +++ b/Mage.Sets/src/mage/cards/e/EvenTheScore.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class EvenTheScore extends CardImpl { ).setRuleAtTheTop(true)); // Draw X cards. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); } private EvenTheScore(final EvenTheScore card) { diff --git a/Mage.Sets/src/mage/cards/e/Evershrike.java b/Mage.Sets/src/mage/cards/e/Evershrike.java index 951bbab2dae..0cb258c58a4 100644 --- a/Mage.Sets/src/mage/cards/e/Evershrike.java +++ b/Mage.Sets/src/mage/cards/e/Evershrike.java @@ -21,6 +21,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; +import mage.util.CardUtil; import java.util.UUID; @@ -79,7 +80,7 @@ class EvershrikeEffect extends OneShotEffect { if (controller == null || evershrikeCard == null) { return false; } - int xAmount = source.getManaCostsToPay().getX(); + int xAmount = CardUtil.getSourceCostsTag(game, source, "X", 0); controller.moveCards(evershrikeCard, Zone.BATTLEFIELD, source, game); Permanent evershrikePermanent = game.getPermanent(evershrikeCard.getId()); if (evershrikePermanent == null) { diff --git a/Mage.Sets/src/mage/cards/e/EverythingamajigC.java b/Mage.Sets/src/mage/cards/e/EverythingamajigC.java index f24d31ed650..883f7c3784b 100644 --- a/Mage.Sets/src/mage/cards/e/EverythingamajigC.java +++ b/Mage.Sets/src/mage/cards/e/EverythingamajigC.java @@ -21,6 +21,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPlayer; +import mage.util.CardUtil; import java.util.ArrayList; import java.util.List; @@ -159,7 +160,7 @@ class ChimericStaffEffect extends ContinuousEffectImpl { break; case PTChangingEffects_7: if (sublayer == SubLayer.SetPT_7b) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); permanent.getPower().setModifiedBaseValue(xValue); permanent.getToughness().setModifiedBaseValue(xValue); } diff --git a/Mage.Sets/src/mage/cards/e/Excise.java b/Mage.Sets/src/mage/cards/e/Excise.java index e390c7ba97c..6835e169b00 100644 --- a/Mage.Sets/src/mage/cards/e/Excise.java +++ b/Mage.Sets/src/mage/cards/e/Excise.java @@ -2,7 +2,7 @@ package mage.cards.e; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.CardImpl; @@ -28,7 +28,7 @@ public final class Excise extends CardImpl { // Excise target nonwhite attacking creature unless its controller pays {X}. this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - this.getSpellAbility().addEffect(new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new ExileTargetEffect(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new ExileTargetEffect(), GetXValue.instance)); } private Excise(final Excise card) { diff --git a/Mage.Sets/src/mage/cards/e/Exocrine.java b/Mage.Sets/src/mage/cards/e/Exocrine.java index 2e9333bda62..bb281b96306 100644 --- a/Mage.Sets/src/mage/cards/e/Exocrine.java +++ b/Mage.Sets/src/mage/cards/e/Exocrine.java @@ -3,7 +3,7 @@ package mage.cards.e; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.keyword.RavenousAbility; @@ -42,9 +42,9 @@ public final class Exocrine extends CardImpl { // Bio-plasmic Barrage -- When Exocrine enters the battlefield, it deals X damage to each player and each other creature. Ability ability = new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect( - Outcome.Damage, ManacostVariableValue.ETB, TargetController.ANY, "it" + Outcome.Damage, GetXValue.instance, TargetController.ANY, "it" )); - ability.addEffect(new DamageAllEffect(ManacostVariableValue.ETB, filter).setText("and each other creature")); + ability.addEffect(new DamageAllEffect(GetXValue.instance, filter).setText("and each other creature")); this.addAbility(ability.withFlavorWord("Bio-plasmic Barrage")); } diff --git a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java index 44cf4307951..4c6fb4651f6 100644 --- a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java +++ b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java @@ -21,6 +21,7 @@ import mage.target.TargetPlayer; import mage.target.TargetSpell; import mage.target.common.TargetAnyTarget; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -80,7 +81,7 @@ class ExplosionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Effect effect = new DamageTargetEffect(StaticValue.get(xValue), true, "", true); effect.setTargetPointer(new FixedTarget(source.getFirstTarget(), game)); effect.apply(game, source); diff --git a/Mage.Sets/src/mage/cards/e/ExponentialGrowth.java b/Mage.Sets/src/mage/cards/e/ExponentialGrowth.java index 7702eef86fa..ef40a856c74 100644 --- a/Mage.Sets/src/mage/cards/e/ExponentialGrowth.java +++ b/Mage.Sets/src/mage/cards/e/ExponentialGrowth.java @@ -60,7 +60,7 @@ class ExponentialGrowthEffect extends OneShotEffect { if (permanent == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); int multiplier = 1; for (int i = 0; i < xValue; i++) { multiplier = CardUtil.overflowMultiply(multiplier, 2); diff --git a/Mage.Sets/src/mage/cards/e/Exsanguinate.java b/Mage.Sets/src/mage/cards/e/Exsanguinate.java index e0bb79d517b..2d900fb4017 100644 --- a/Mage.Sets/src/mage/cards/e/Exsanguinate.java +++ b/Mage.Sets/src/mage/cards/e/Exsanguinate.java @@ -1,6 +1,6 @@ package mage.cards.e; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.LoseLifeOpponentsYouGainLifeLostEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,7 +18,7 @@ public final class Exsanguinate extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{B}"); // Each opponent loses X life. You gain life equal to the life lost this way. - this.getSpellAbility().addEffect(new LoseLifeOpponentsYouGainLifeLostEffect(ManacostVariableValue.REGULAR, "X life")); + this.getSpellAbility().addEffect(new LoseLifeOpponentsYouGainLifeLostEffect(GetXValue.instance, "X life")); } private Exsanguinate(final Exsanguinate card) { diff --git a/Mage.Sets/src/mage/cards/e/ExtractBrain.java b/Mage.Sets/src/mage/cards/e/ExtractBrain.java index 9f856ddb1b0..9f33ad20f40 100644 --- a/Mage.Sets/src/mage/cards/e/ExtractBrain.java +++ b/Mage.Sets/src/mage/cards/e/ExtractBrain.java @@ -61,7 +61,7 @@ class ExtractBrainEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player opponent = game.getPlayer(source.getFirstTarget()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (controller == null || opponent == null || opponent.getHand().isEmpty() || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/f/FaerieFencing.java b/Mage.Sets/src/mage/cards/f/FaerieFencing.java index 46425a520f5..82bcfabeea7 100644 --- a/Mage.Sets/src/mage/cards/f/FaerieFencing.java +++ b/Mage.Sets/src/mage/cards/f/FaerieFencing.java @@ -1,8 +1,5 @@ package mage.cards.f; -import java.util.HashMap; -import java.util.UUID; - import mage.MageObject; import mage.MageObjectReference; import mage.abilities.Ability; @@ -10,18 +7,18 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.WatcherScope; +import mage.constants.*; import mage.filter.FilterPermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import mage.watchers.Watcher; +import java.util.HashMap; +import java.util.UUID; + /** * * @author Xanderhall @@ -63,7 +60,7 @@ class FaerieFencingEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { ControlledFaerieAsSpellCastWatcher watcher = game.getState().getWatcher(ControlledFaerieAsSpellCastWatcher.class); MageObject mo = source.getSourceObject(game); - int reduction = source.getManaCostsToPay().getX(); + int reduction = CardUtil.getSourceCostsTag(game, source, "X", 0); if (watcher != null && mo != null && watcher.getCount(new MageObjectReference(mo, game)) > 0) { reduction += 3; diff --git a/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java b/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java index f3c871cb5ab..499d0a3a875 100644 --- a/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java +++ b/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java @@ -2,7 +2,7 @@ package mage.cards.f; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.SurgeAbility; import mage.cards.CardImpl; @@ -21,7 +21,7 @@ public final class FallOfTheTitans extends CardImpl { // Fall of the Titans deals X damage to each of up to two target creatures and/or players. this.getSpellAbility().addTarget(new TargetAnyTarget(0, 2)); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR, true, "each of up to two targets")); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance, true, "each of up to two targets")); // Surge {X}{R} addAbility(new SurgeAbility(this, "{X}{R}")); diff --git a/Mage.Sets/src/mage/cards/f/FanningTheFlames.java b/Mage.Sets/src/mage/cards/f/FanningTheFlames.java index 49213bfe2aa..901c2c6c575 100644 --- a/Mage.Sets/src/mage/cards/f/FanningTheFlames.java +++ b/Mage.Sets/src/mage/cards/f/FanningTheFlames.java @@ -2,7 +2,7 @@ package mage.cards.f; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.BuybackAbility; import mage.cards.CardImpl; @@ -23,7 +23,7 @@ public final class FanningTheFlames extends CardImpl { this.addAbility(new BuybackAbility("{3}")); // Fanning the Flames deals X damage to any target. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); } diff --git a/Mage.Sets/src/mage/cards/f/FarmerCotton.java b/Mage.Sets/src/mage/cards/f/FarmerCotton.java index 0a6ac4315d7..854a4fe2e1b 100644 --- a/Mage.Sets/src/mage/cards/f/FarmerCotton.java +++ b/Mage.Sets/src/mage/cards/f/FarmerCotton.java @@ -3,7 +3,7 @@ package mage.cards.f; import mage.MageInt; import mage.abilities.TriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -32,10 +32,10 @@ public final class FarmerCotton extends CardImpl { // When Farmer Cotton enters the battlefield, create X 1/1 white Halfling creature tokens and X Food tokens. TriggeredAbility trigger = new EntersBattlefieldTriggeredAbility( - new CreateTokenEffect(new HalflingToken(), ManacostVariableValue.ETB) + new CreateTokenEffect(new HalflingToken(), GetXValue.instance) ); trigger.addEffect( - new CreateTokenEffect(new FoodToken(), ManacostVariableValue.ETB) + new CreateTokenEffect(new FoodToken(), GetXValue.instance) .setText("and X Food tokens") ); diff --git a/Mage.Sets/src/mage/cards/f/Fascination.java b/Mage.Sets/src/mage/cards/f/Fascination.java index 086dcac4970..2dfcc4d75af 100644 --- a/Mage.Sets/src/mage/cards/f/Fascination.java +++ b/Mage.Sets/src/mage/cards/f/Fascination.java @@ -3,7 +3,7 @@ package mage.cards.f; import java.util.UUID; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardAllEffect; import mage.abilities.effects.common.MillCardsEachPlayerEffect; import mage.cards.CardImpl; @@ -22,10 +22,10 @@ public final class Fascination extends CardImpl { // Choose one - // * Each player draws X cards. - this.getSpellAbility().addEffect(new DrawCardAllEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardAllEffect(GetXValue.instance)); // * Each player puts the top X cards of their library into their graveyard. - Mode mode = new Mode(new MillCardsEachPlayerEffect(ManacostVariableValue.REGULAR, TargetController.ANY)); + Mode mode = new Mode(new MillCardsEachPlayerEffect(GetXValue.instance, TargetController.ANY)); this.getSpellAbility().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/f/FaultLine.java b/Mage.Sets/src/mage/cards/f/FaultLine.java index 417aab4a06a..7c2bdb4d06c 100644 --- a/Mage.Sets/src/mage/cards/f/FaultLine.java +++ b/Mage.Sets/src/mage/cards/f/FaultLine.java @@ -13,6 +13,7 @@ import mage.filter.predicate.mageobject.AbilityPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -62,7 +63,7 @@ class FaultLineEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { permanent.damage(amount, source.getSourceId(), source, game, false, true); } diff --git a/Mage.Sets/src/mage/cards/f/FearFireFoes.java b/Mage.Sets/src/mage/cards/f/FearFireFoes.java index 0ac6f7a9116..230a0c21a29 100644 --- a/Mage.Sets/src/mage/cards/f/FearFireFoes.java +++ b/Mage.Sets/src/mage/cards/f/FearFireFoes.java @@ -1,7 +1,7 @@ package mage.cards.f; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -34,7 +34,7 @@ public final class FearFireFoes extends CardImpl { this.getSpellAbility().addEffect(new DamageCantBePreventedEffect( Duration.EndOfTurn )); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new FearFireFoesEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java b/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java index 858c5b4a678..7e35006e136 100644 --- a/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java +++ b/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java @@ -2,7 +2,7 @@ package mage.cards.f; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.PreventDamageToControllerEffect; import mage.cards.CardImpl; @@ -20,7 +20,7 @@ public final class FestivalOfTheGuildpact extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{W}"); // Prevent the next X damage that would be dealt to you this turn. - this.getSpellAbility().addEffect(new PreventDamageToControllerEffect(Duration.EndOfTurn, false, true, ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new PreventDamageToControllerEffect(Duration.EndOfTurn, false, true, GetXValue.instance)); // Draw a card. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); diff --git a/Mage.Sets/src/mage/cards/f/FiendArtisan.java b/Mage.Sets/src/mage/cards/f/FiendArtisan.java index 74ea4067346..cfb037a98b9 100644 --- a/Mage.Sets/src/mage/cards/f/FiendArtisan.java +++ b/Mage.Sets/src/mage/cards/f/FiendArtisan.java @@ -21,7 +21,7 @@ import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.target.common.TargetCardInLibrary; -import mage.target.common.TargetControlledPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -83,7 +83,7 @@ class FiendArtisanEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCard filter = new FilterCreatureCard("creature card with mana value " + xValue + " or less"); filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); return new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)).apply(game, source); diff --git a/Mage.Sets/src/mage/cards/f/FinaleOfDevastation.java b/Mage.Sets/src/mage/cards/f/FinaleOfDevastation.java index 95c003323f5..610da3d1936 100644 --- a/Mage.Sets/src/mage/cards/f/FinaleOfDevastation.java +++ b/Mage.Sets/src/mage/cards/f/FinaleOfDevastation.java @@ -15,6 +15,7 @@ import mage.constants.Outcome; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; +import mage.util.CardUtil; import java.util.UUID; @@ -60,7 +61,7 @@ class FinaleOfDevastationEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue >= 10) { ContinuousEffect effect1 = new BoostControlledEffect(xValue, xValue, Duration.EndOfTurn); game.addEffect(effect1, source); diff --git a/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java b/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java index 971da2a7115..6ab8fd8ae4d 100644 --- a/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java +++ b/Mage.Sets/src/mage/cards/f/FinaleOfEternity.java @@ -14,6 +14,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.targetadjustment.ToughnessTargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -60,7 +61,7 @@ class FinaleOfEternityEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - if (source.getManaCostsToPay().getX() < 10) { + if (CardUtil.getSourceCostsTag(game, source, "X", 0) < 10) { return true; } Player player = game.getPlayer(source.getControllerId()); diff --git a/Mage.Sets/src/mage/cards/f/FinaleOfGlory.java b/Mage.Sets/src/mage/cards/f/FinaleOfGlory.java index 9f1017131f6..58ed8875c9e 100644 --- a/Mage.Sets/src/mage/cards/f/FinaleOfGlory.java +++ b/Mage.Sets/src/mage/cards/f/FinaleOfGlory.java @@ -10,6 +10,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.AngelVigilanceToken; import mage.game.permanent.token.SoldierVigilanceToken; +import mage.util.CardUtil; import java.util.UUID; @@ -54,7 +55,7 @@ class FinaleOfGloryEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue == 0) { return false; } diff --git a/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java b/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java index 9ee7b94bf0f..36005478a76 100644 --- a/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java +++ b/Mage.Sets/src/mage/cards/f/FinaleOfPromise.java @@ -1,7 +1,7 @@ package mage.cards.f; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.MayCastTargetCardEffect; import mage.cards.Card; @@ -65,7 +65,7 @@ enum FinaleOfPromiseAdjuster implements TargetAdjuster { public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); - int xValue = ManacostVariableValue.REGULAR.calculate(game, ability, null); + int xValue = GetXValue.instance.calculate(game, ability, null); // <= must be replaced to <= for html view FilterCard filter1 = FinaleOfPromise.filterInstant.copy(); @@ -140,7 +140,7 @@ class FinaleOfPromiseEffect extends OneShotEffect { } // If X is 10 or more, copy each of those spells twice. You may choose new targets for the copies - int xValue = ManacostVariableValue.REGULAR.calculate(game, source, null); + int xValue = GetXValue.instance.calculate(game, source, null); if (xValue >= 10) { for (UUID id : cardsToCast) { Card card = game.getCard(id); diff --git a/Mage.Sets/src/mage/cards/f/FinaleOfRevelation.java b/Mage.Sets/src/mage/cards/f/FinaleOfRevelation.java index 5f426c9c2cd..90601d2fa1c 100644 --- a/Mage.Sets/src/mage/cards/f/FinaleOfRevelation.java +++ b/Mage.Sets/src/mage/cards/f/FinaleOfRevelation.java @@ -12,6 +12,7 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -63,7 +64,7 @@ class FinaleOfRevelationEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue < 10) { player.drawCards(xValue, source, game); diff --git a/Mage.Sets/src/mage/cards/f/Fireball.java b/Mage.Sets/src/mage/cards/f/Fireball.java index 620514ae30e..acb030d570e 100644 --- a/Mage.Sets/src/mage/cards/f/Fireball.java +++ b/Mage.Sets/src/mage/cards/f/Fireball.java @@ -12,6 +12,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; import java.util.*; @@ -67,7 +68,7 @@ class FireballEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int numTargets = getTargetPointer().getTargets(game, source).size(); - int damage = source.getManaCostsToPay().getX(); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); if (numTargets > 0) { int damagePer = damage / numTargets; if (damagePer > 0) { @@ -116,7 +117,7 @@ class FireballTargetCreatureOrPlayer extends TargetAnyTarget { public List getTargetOptions(Ability source, Game game) { List options = new ArrayList<>(); - int xVal = source.getManaCostsToPay().getX(); + int xVal = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xVal < 1) { return options; diff --git a/Mage.Sets/src/mage/cards/f/FirecatBlitz.java b/Mage.Sets/src/mage/cards/f/FirecatBlitz.java index b94e79443f1..472befadb6c 100644 --- a/Mage.Sets/src/mage/cards/f/FirecatBlitz.java +++ b/Mage.Sets/src/mage/cards/f/FirecatBlitz.java @@ -1,7 +1,6 @@ package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.costs.Cost; @@ -14,13 +13,19 @@ import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.ElementalCatToken; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -76,7 +81,7 @@ class FirecatBlitzEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); for (Cost cost : source.getCosts()) { if (cost instanceof SacrificeTargetCost) { xValue = ((SacrificeTargetCost) cost).getPermanents().size(); diff --git a/Mage.Sets/src/mage/cards/f/FlameDischarge.java b/Mage.Sets/src/mage/cards/f/FlameDischarge.java index 67df1a5c5c8..dedc1777a40 100644 --- a/Mage.Sets/src/mage/cards/f/FlameDischarge.java +++ b/Mage.Sets/src/mage/cards/f/FlameDischarge.java @@ -1,7 +1,5 @@ package mage.cards.f; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.condition.common.ControlledModifiedCreatureAsSpellCastCondition; import mage.abilities.effects.OneShotEffect; @@ -12,8 +10,11 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreatureOrPlaneswalker; +import mage.util.CardUtil; import mage.watchers.common.ControlledModifiedCreatureAsSpellCastWatcher; +import java.util.UUID; + /** * * @author weirddan455 @@ -61,7 +62,7 @@ class FlameDischargeEffect extends OneShotEffect { if (permanent == null) { return false; } - int damageAmount = source.getManaCostsToPay().getX(); + int damageAmount = CardUtil.getSourceCostsTag(game, source, "X", 0); if (ControlledModifiedCreatureAsSpellCastCondition.instance.apply(game, source)) { damageAmount += 2; } diff --git a/Mage.Sets/src/mage/cards/f/FlamingGambit.java b/Mage.Sets/src/mage/cards/f/FlamingGambit.java index 48d2e0a7021..06ff2253198 100644 --- a/Mage.Sets/src/mage/cards/f/FlamingGambit.java +++ b/Mage.Sets/src/mage/cards/f/FlamingGambit.java @@ -2,7 +2,7 @@ package mage.cards.f; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -69,7 +69,7 @@ class FlamingGambitEffect extends OneShotEffect { if (player == null) { return false; } - int damage = ManacostVariableValue.REGULAR.calculate(game, source, this); + int damage = GetXValue.instance.calculate(game, source, this); if (game.getBattlefield().count(StaticFilters.FILTER_PERMANENT_CREATURE, player.getId(), source, game) > 0) { String message = "Choose a creature you control to deal " + damage + " damage to instead?"; if (player.chooseUse(outcome, message, source, game)) { diff --git a/Mage.Sets/src/mage/cards/f/FlashOfInsight.java b/Mage.Sets/src/mage/cards/f/FlashOfInsight.java index 2ff903d45a9..f702e323adc 100644 --- a/Mage.Sets/src/mage/cards/f/FlashOfInsight.java +++ b/Mage.Sets/src/mage/cards/f/FlashOfInsight.java @@ -2,11 +2,9 @@ package mage.cards.f; import mage.ObjectColor; import mage.abilities.Ability; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.ExileXFromYourGraveCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -15,7 +13,6 @@ import mage.constants.CardType; import mage.constants.PutCards; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.Game; import java.util.UUID; @@ -35,7 +32,7 @@ public final class FlashOfInsight extends CardImpl { // Look at the top X cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect( - FlashOfInsightValue.instance, 1, PutCards.HAND, PutCards.BOTTOM_ANY)); + GetXValue.instance, 1, PutCards.HAND, PutCards.BOTTOM_ANY)); // Flashback-{1}{U}, Exile X blue cards from your graveyard. Ability ability = new FlashbackAbility(this, new ManaCostsImpl<>("{1}{U}")); @@ -52,33 +49,3 @@ public final class FlashOfInsight extends CardImpl { return new FlashOfInsight(this); } } - -enum FlashOfInsightValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - int xValue = sourceAbility.getManaCostsToPay().getX(); - for (Cost cost : sourceAbility.getCosts()) { - if (cost instanceof ExileXFromYourGraveCost) { - xValue = ((ExileXFromYourGraveCost) cost).getAmount(); - } - } - return xValue; - } - - @Override - public FlashOfInsightValue copy() { - return instance; - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return ""; - } -} diff --git a/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java b/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java index 109e8475f1b..d829279db45 100644 --- a/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java +++ b/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java @@ -1,7 +1,6 @@ package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -12,6 +11,9 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.RabidSheepToken; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -56,7 +58,7 @@ class FlockOfRabidSheepEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int repeat = source.getManaCostsToPay().getX(); + int repeat = CardUtil.getSourceCostsTag(game, source, "X", 0); int wonCount = 0; for (int i = 1; i <= repeat; i++) { if (controller.flipCoin(source, game, true)) { diff --git a/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java b/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java index 0c97a0c69c8..a3578840b09 100644 --- a/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java +++ b/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java @@ -3,7 +3,7 @@ package mage.cards.f; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; @@ -20,8 +20,8 @@ public final class FlowstoneSlide extends CardImpl { public FlowstoneSlide(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{2}{R}{R}"); - DynamicValue xPos = ManacostVariableValue.REGULAR; - DynamicValue xNeg = new SignInversionDynamicValue(ManacostVariableValue.REGULAR); + DynamicValue xPos = GetXValue.instance; + DynamicValue xNeg = new SignInversionDynamicValue(GetXValue.instance); // All creatures get +X/-X until end of turn. this.getSpellAbility().addEffect(new BoostAllEffect(xPos, xNeg, Duration.EndOfTurn)); diff --git a/Mage.Sets/src/mage/cards/f/FolioOfFancies.java b/Mage.Sets/src/mage/cards/f/FolioOfFancies.java index 24763f5cc76..89c4638ef5e 100644 --- a/Mage.Sets/src/mage/cards/f/FolioOfFancies.java +++ b/Mage.Sets/src/mage/cards/f/FolioOfFancies.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardAllEffect; import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect; @@ -36,7 +36,7 @@ public final class FolioOfFancies extends CardImpl { // {X}{X}, {T}: Each player draws X cards. Ability ability = new SimpleActivatedAbility( - new DrawCardAllEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}{X}") + new DrawCardAllEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{X}") ); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/f/ForTheCommonGood.java b/Mage.Sets/src/mage/cards/f/ForTheCommonGood.java index 2a98d0e8a5b..1d90d44e6ad 100644 --- a/Mage.Sets/src/mage/cards/f/ForTheCommonGood.java +++ b/Mage.Sets/src/mage/cards/f/ForTheCommonGood.java @@ -22,6 +22,7 @@ import mage.filter.predicate.permanent.TokenPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -82,7 +83,7 @@ class ForTheCommonGoodEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); return permanent != null && xValue > 0 && new CreateTokenCopyTargetEffect(null, null, false, xValue) diff --git a/Mage.Sets/src/mage/cards/f/ForceLightning.java b/Mage.Sets/src/mage/cards/f/ForceLightning.java index 67016b67f51..45550190228 100644 --- a/Mage.Sets/src/mage/cards/f/ForceLightning.java +++ b/Mage.Sets/src/mage/cards/f/ForceLightning.java @@ -1,9 +1,8 @@ package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -13,6 +12,9 @@ import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -24,7 +26,7 @@ public final class ForceLightning extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}"); // Force Lightning deals X damage to any target. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); // Scry X. @@ -62,7 +64,7 @@ class ForceLightningEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int x = source.getManaCostsToPay().getX(); + int x = CardUtil.getSourceCostsTag(game, source, "X", 0); if (x > 0) { return controller.scry(x, source, game); } diff --git a/Mage.Sets/src/mage/cards/f/ForcedMarch.java b/Mage.Sets/src/mage/cards/f/ForcedMarch.java index 0c6ef0fc961..e9141576197 100644 --- a/Mage.Sets/src/mage/cards/f/ForcedMarch.java +++ b/Mage.Sets/src/mage/cards/f/ForcedMarch.java @@ -1,6 +1,5 @@ package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,6 +9,9 @@ import mage.constants.Outcome; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @author nick.myers @@ -56,7 +58,7 @@ class ForcedMarchEffect extends OneShotEffect { for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source, game)) { - if (permanent.getManaValue() <= source.getManaCostsToPay().getX()) { + if (permanent.getManaValue() <= CardUtil.getSourceCostsTag(game, source, "X", 0)) { permanent.destroy(source, game, false); } } diff --git a/Mage.Sets/src/mage/cards/f/FormAPosse.java b/Mage.Sets/src/mage/cards/f/FormAPosse.java index f7b0afa4380..1d77a1fdce8 100644 --- a/Mage.Sets/src/mage/cards/f/FormAPosse.java +++ b/Mage.Sets/src/mage/cards/f/FormAPosse.java @@ -1,6 +1,6 @@ package mage.cards.f; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,7 +18,7 @@ public final class FormAPosse extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{W}"); // Create X 1/1 red Mercenary creature tokens with "{T}: Target creature you control gets +1/+0 until end of turn. Activate only as a sorcery." - this.getSpellAbility().addEffect(new CreateTokenEffect(new MercenaryToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new MercenaryToken(), GetXValue.instance)); } private FormAPosse(final FormAPosse card) { diff --git a/Mage.Sets/src/mage/cards/f/ForthEorlingas.java b/Mage.Sets/src/mage/cards/f/ForthEorlingas.java index 408f8d26958..af939cbdd69 100644 --- a/Mage.Sets/src/mage/cards/f/ForthEorlingas.java +++ b/Mage.Sets/src/mage/cards/f/ForthEorlingas.java @@ -3,7 +3,7 @@ package mage.cards.f; import java.util.UUID; import mage.abilities.DelayedTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.BecomesMonarchSourceEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -30,7 +30,7 @@ public final class ForthEorlingas extends CardImpl { // Create X 2/2 red Human Knight creature tokens with trample and haste. this.getSpellAbility().addEffect(new CreateTokenEffect( - new HumanKnightToken(), ManacostVariableValue.REGULAR, false, false + new HumanKnightToken(), GetXValue.instance, false, false )); // Whenever one or more creatures you control deal combat damage to one or more players this turn, you become the monarch. diff --git a/Mage.Sets/src/mage/cards/f/FountainOfCho.java b/Mage.Sets/src/mage/cards/f/FountainOfCho.java index 4c4b503ece3..2f1aefd4f7a 100644 --- a/Mage.Sets/src/mage/cards/f/FountainOfCho.java +++ b/Mage.Sets/src/mage/cards/f/FountainOfCho.java @@ -9,7 +9,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class FountainOfCho extends CardImpl { // {T}, Remove any number of storage counters from Fountain of Cho: Add {W} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.WhiteMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {W} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/f/FractalHarness.java b/Mage.Sets/src/mage/cards/f/FractalHarness.java index 8910caf727d..8f509f6f687 100644 --- a/Mage.Sets/src/mage/cards/f/FractalHarness.java +++ b/Mage.Sets/src/mage/cards/f/FractalHarness.java @@ -3,7 +3,7 @@ package mage.cards.f; import mage.abilities.Ability; import mage.abilities.common.AttacksAttachedTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DoubleCountersTargetEffect; import mage.abilities.keyword.EquipAbility; @@ -73,7 +73,7 @@ class FractalHarnessTokenEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Token token = new FractalToken(); token.putOntoBattlefield(1, game, source, source.getControllerId()); - int xValue = ManacostVariableValue.ETB.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); boolean flag = true; for (UUID tokenId : token.getLastAddedTokenIds()) { Permanent permanent = game.getPermanent(tokenId); diff --git a/Mage.Sets/src/mage/cards/f/FractalSummoning.java b/Mage.Sets/src/mage/cards/f/FractalSummoning.java index 5ecda1518cb..701de3d11cd 100644 --- a/Mage.Sets/src/mage/cards/f/FractalSummoning.java +++ b/Mage.Sets/src/mage/cards/f/FractalSummoning.java @@ -1,6 +1,6 @@ package mage.cards.f; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -21,7 +21,7 @@ public final class FractalSummoning extends CardImpl { // Create a 0/0 green and blue Fractal creature token. Put X +1/+1 counters on it. this.getSpellAbility().addEffect(FractalToken.getEffect( - ManacostVariableValue.REGULAR, "Put X +1/+1 counters on it" + GetXValue.instance, "Put X +1/+1 counters on it" )); } diff --git a/Mage.Sets/src/mage/cards/f/FromUnderTheFloorboards.java b/Mage.Sets/src/mage/cards/f/FromUnderTheFloorboards.java index 014a7754548..afa132f97fc 100644 --- a/Mage.Sets/src/mage/cards/f/FromUnderTheFloorboards.java +++ b/Mage.Sets/src/mage/cards/f/FromUnderTheFloorboards.java @@ -1,7 +1,6 @@ package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; @@ -15,6 +14,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.game.Game; import mage.game.permanent.token.ZombieToken; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -57,7 +59,7 @@ class FromUnderTheFloorboardsManacostVariableValue implements DynamicValue { if (manaCosts.getVariableCosts().isEmpty()) { return 3; } - return sourceAbility.getManaCostsToPay().getX(); + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); } @Override diff --git a/Mage.Sets/src/mage/cards/f/FullFlowering.java b/Mage.Sets/src/mage/cards/f/FullFlowering.java index 2370bfb0d56..48f9e2bfc77 100644 --- a/Mage.Sets/src/mage/cards/f/FullFlowering.java +++ b/Mage.Sets/src/mage/cards/f/FullFlowering.java @@ -9,6 +9,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; +import mage.util.CardUtil; import java.util.UUID; import java.util.stream.IntStream; @@ -55,7 +56,7 @@ class FullFloweringEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue == 0) { return true; } diff --git a/Mage.Sets/src/mage/cards/f/FungalReaches.java b/Mage.Sets/src/mage/cards/f/FungalReaches.java index 88552e7ba83..c042338edc6 100644 --- a/Mage.Sets/src/mage/cards/f/FungalReaches.java +++ b/Mage.Sets/src/mage/cards/f/FungalReaches.java @@ -7,7 +7,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.mana.ColorlessManaAbility; @@ -38,7 +38,7 @@ public final class FungalReaches extends CardImpl { // {1}, Remove X storage counters from Fungal Reaches: Add X mana in any combination of {R} and/or {G}. ability = new SimpleManaAbility(Zone.BATTLEFIELD, - new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, + new AddManaInAnyCombinationEffect(GetXValue.instance, new CountersSourceCount(CounterType.STORAGE), ColoredManaSymbol.R, ColoredManaSymbol.G), new GenericManaCost(1)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/g/GadwickTheWizened.java b/Mage.Sets/src/mage/cards/g/GadwickTheWizened.java index 63a44e20646..bb243648b91 100644 --- a/Mage.Sets/src/mage/cards/g/GadwickTheWizened.java +++ b/Mage.Sets/src/mage/cards/g/GadwickTheWizened.java @@ -5,7 +5,7 @@ import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.TapTargetEffect; import mage.cards.CardImpl; @@ -48,7 +48,7 @@ public final class GadwickTheWizened extends CardImpl { // When Gadwick, the Wizened enters the battlefield, draw X cards. this.addAbility(new EntersBattlefieldTriggeredAbility( - new DrawCardSourceControllerEffect(ManacostVariableValue.ETB) + new DrawCardSourceControllerEffect(GetXValue.instance) )); // Whenever you cast a blue spell, tap target nonland permanent an opponent controls. diff --git a/Mage.Sets/src/mage/cards/g/GazeOfGranite.java b/Mage.Sets/src/mage/cards/g/GazeOfGranite.java index d7d112c9781..145ec03a164 100644 --- a/Mage.Sets/src/mage/cards/g/GazeOfGranite.java +++ b/Mage.Sets/src/mage/cards/g/GazeOfGranite.java @@ -1,7 +1,6 @@ package mage.cards.g; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -13,6 +12,9 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -62,7 +64,7 @@ class GazeOfGraniteEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { for (Permanent permanent : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) { - if (!permanent.isLand(game) && permanent.getManaValue() <= source.getManaCostsToPay().getX()) { + if (!permanent.isLand(game) && permanent.getManaValue() <= CardUtil.getSourceCostsTag(game, source, "X", 0)) { permanent.destroy(source, game, false); } } diff --git a/Mage.Sets/src/mage/cards/g/GelatinousCube.java b/Mage.Sets/src/mage/cards/g/GelatinousCube.java index 99bb1224c36..b4bc0b8acdd 100644 --- a/Mage.Sets/src/mage/cards/g/GelatinousCube.java +++ b/Mage.Sets/src/mage/cards/g/GelatinousCube.java @@ -71,7 +71,7 @@ enum GelatinousCubeAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); FilterCard filter = new FilterCreatureCard("creature card with mana value " + xValue); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); ability.addTarget(new TargetCardInExile(filter, CardUtil.getExileZoneId(game, ability))); diff --git a/Mage.Sets/src/mage/cards/g/GelatinousGenesis.java b/Mage.Sets/src/mage/cards/g/GelatinousGenesis.java index 77b923a8ea5..d91c07dcc8f 100644 --- a/Mage.Sets/src/mage/cards/g/GelatinousGenesis.java +++ b/Mage.Sets/src/mage/cards/g/GelatinousGenesis.java @@ -1,7 +1,6 @@ package mage.cards.g; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,6 +9,9 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.OozeToken; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -48,7 +50,7 @@ class GelatinousGenesisEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int count = source.getManaCostsToPay().getX(); + int count = CardUtil.getSourceCostsTag(game, source, "X", 0); OozeToken oozeToken = new OozeToken(); oozeToken.setPower(count); diff --git a/Mage.Sets/src/mage/cards/g/GenesisHydra.java b/Mage.Sets/src/mage/cards/g/GenesisHydra.java index e2a8c0fdae5..0a5112802cf 100644 --- a/Mage.Sets/src/mage/cards/g/GenesisHydra.java +++ b/Mage.Sets/src/mage/cards/g/GenesisHydra.java @@ -1,7 +1,6 @@ package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.SpellAbility; @@ -10,11 +9,7 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CastSourceTriggeredAbility; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.cards.*; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.Zone; +import mage.constants.*; import mage.counters.CounterType; import mage.filter.FilterCard; import mage.filter.common.FilterPermanentCard; @@ -23,6 +18,9 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -71,7 +69,7 @@ class GenesisHydraPutOntoBattlefieldEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Object obj = getValue(CastSourceTriggeredAbility.SOURCE_CAST_SPELL_ABILITY); if (controller != null && obj instanceof SpellAbility) { - int count = ((SpellAbility) obj).getManaCostsToPay().getX(); + int count = CardUtil.getSourceCostsTag(game, ((SpellAbility) obj), "X", 0); if (count > 0) { Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, count)); controller.revealCards(source, cards, game); diff --git a/Mage.Sets/src/mage/cards/g/GenesisWave.java b/Mage.Sets/src/mage/cards/g/GenesisWave.java index 6a3531c94f6..84e1977f547 100644 --- a/Mage.Sets/src/mage/cards/g/GenesisWave.java +++ b/Mage.Sets/src/mage/cards/g/GenesisWave.java @@ -1,11 +1,12 @@ package mage.cards.g; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.Outcome; @@ -16,6 +17,9 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @author BetaSteward_at_googlemail.com @@ -59,7 +63,7 @@ class GenesisWaveEffect extends OneShotEffect { if (controller == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); if (!cards.isEmpty()) { controller.revealCards(source, cards, game); diff --git a/Mage.Sets/src/mage/cards/g/GhiredsBelligerence.java b/Mage.Sets/src/mage/cards/g/GhiredsBelligerence.java index 87ea5818fe1..2d5cb7bfd5c 100644 --- a/Mage.Sets/src/mage/cards/g/GhiredsBelligerence.java +++ b/Mage.Sets/src/mage/cards/g/GhiredsBelligerence.java @@ -3,7 +3,7 @@ package mage.cards.g; import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageMultiEffect; import mage.abilities.effects.common.PopulateEffect; @@ -31,7 +31,7 @@ public final class GhiredsBelligerence extends CardImpl { // Ghired's Belligerence deals X damage divided as you choose among any number of target creatures. Whenever a creature dealt damage this way dies this turn, populate. this.getSpellAbility().addEffect(new GhiredsBelligerenceEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(GetXValue.instance)); } private GhiredsBelligerence(final GhiredsBelligerence card) { @@ -46,7 +46,7 @@ public final class GhiredsBelligerence extends CardImpl { class GhiredsBelligerenceEffect extends OneShotEffect { - private static final DamageMultiEffect effect = new DamageMultiEffect(ManacostVariableValue.REGULAR); + private static final DamageMultiEffect effect = new DamageMultiEffect(GetXValue.instance); GhiredsBelligerenceEffect() { super(Outcome.Benefit); diff --git a/Mage.Sets/src/mage/cards/g/GhituFire.java b/Mage.Sets/src/mage/cards/g/GhituFire.java index 537bfabd649..cc84f1d6ef2 100644 --- a/Mage.Sets/src/mage/cards/g/GhituFire.java +++ b/Mage.Sets/src/mage/cards/g/GhituFire.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.PayMoreToCastAsThoughtItHadFlashAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -23,7 +23,7 @@ public final class GhituFire extends CardImpl { public GhituFire(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}"); - Effect effect = new DamageTargetEffect(ManacostVariableValue.REGULAR); + Effect effect = new DamageTargetEffect(GetXValue.instance); // You may cast Ghitu Fire as though it had flash if you pay {2} more to cast it. Ability ability = new PayMoreToCastAsThoughtItHadFlashAbility(this, new ManaCostsImpl<>("{2}")); ability.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/g/Gigantoplasm.java b/Mage.Sets/src/mage/cards/g/Gigantoplasm.java index 185895b6cfc..d2198161414 100644 --- a/Mage.Sets/src/mage/cards/g/Gigantoplasm.java +++ b/Mage.Sets/src/mage/cards/g/Gigantoplasm.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CopyPermanentEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; @@ -53,7 +53,7 @@ class GigantoplasmCopyApplier extends CopyApplier { @Override public boolean apply(Game game, MageObject blueprint, Ability source, UUID copyToObjectId) { - Effect effect = new SetBasePowerToughnessSourceEffect(ManacostVariableValue.REGULAR, Duration.Custom); + Effect effect = new SetBasePowerToughnessSourceEffect(GetXValue.instance, Duration.Custom); effect.setText("This creature has base power and toughness X/X"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}")); blueprint.getAbilities().add(ability); diff --git a/Mage.Sets/src/mage/cards/g/GlacianPowerstoneEngineer.java b/Mage.Sets/src/mage/cards/g/GlacianPowerstoneEngineer.java index ba4b85c29b9..06630c8c767 100644 --- a/Mage.Sets/src/mage/cards/g/GlacianPowerstoneEngineer.java +++ b/Mage.Sets/src/mage/cards/g/GlacianPowerstoneEngineer.java @@ -21,6 +21,7 @@ import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetControlledPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -80,13 +81,7 @@ class GlacianPowerstoneEngineerEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); - for (Cost cost : source.getCosts()) { - if (cost instanceof GlacianPowerstoneEngineerCost) { - xValue = ((GlacianPowerstoneEngineerCost) cost).getAmount(); - break; - } - } + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/g/GoblinDynamo.java b/Mage.Sets/src/mage/cards/g/GoblinDynamo.java index aa66c0f606d..64690122cbf 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinDynamo.java +++ b/Mage.Sets/src/mage/cards/g/GoblinDynamo.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -36,7 +36,7 @@ public final class GoblinDynamo extends CardImpl { this.addAbility(ability); //{X}{R}, {T}, Sacrifice Goblin Dynamo: Goblin Dynamo deals X damage to any target. - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,new DamageTargetEffect(ManacostVariableValue.REGULAR, "it"), new ManaCostsImpl<>("{X}{R}")); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,new DamageTargetEffect(GetXValue.instance, "it"), new ManaCostsImpl<>("{X}{R}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetAnyTarget()); diff --git a/Mage.Sets/src/mage/cards/g/GoblinOffensive.java b/Mage.Sets/src/mage/cards/g/GoblinOffensive.java index 6d11a6d8842..3cf6927e56d 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinOffensive.java +++ b/Mage.Sets/src/mage/cards/g/GoblinOffensive.java @@ -2,7 +2,7 @@ package mage.cards.g; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class GoblinOffensive extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{1}{R}{R}"); // create X 1/1 red Goblin creature tokens. - this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(), GetXValue.instance)); } private GoblinOffensive(final GoblinOffensive card) { diff --git a/Mage.Sets/src/mage/cards/g/GrandCrescendo.java b/Mage.Sets/src/mage/cards/g/GrandCrescendo.java index 496606e7506..5775dbab327 100644 --- a/Mage.Sets/src/mage/cards/g/GrandCrescendo.java +++ b/Mage.Sets/src/mage/cards/g/GrandCrescendo.java @@ -1,6 +1,6 @@ package mage.cards.g; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.IndestructibleAbility; @@ -23,7 +23,7 @@ public final class GrandCrescendo extends CardImpl { // Create X 1/1 green and white Citizen creature tokens. Creatures you control gain indestructible until end of turn. this.getSpellAbility().addEffect(new CreateTokenEffect( - new CitizenGreenWhiteToken(), ManacostVariableValue.REGULAR + new CitizenGreenWhiteToken(), GetXValue.instance )); this.getSpellAbility().addEffect(new GainAbilityAllEffect( IndestructibleAbility.getInstance(), Duration.EndOfTurn, diff --git a/Mage.Sets/src/mage/cards/g/GreelMindRaker.java b/Mage.Sets/src/mage/cards/g/GreelMindRaker.java index a6ac6cceb0a..d4faf9f9d61 100644 --- a/Mage.Sets/src/mage/cards/g/GreelMindRaker.java +++ b/Mage.Sets/src/mage/cards/g/GreelMindRaker.java @@ -6,14 +6,13 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.target.TargetPlayer; import mage.target.common.TargetCardInHand; @@ -36,7 +35,7 @@ public final class GreelMindRaker extends CardImpl { // {X}{B}, {tap}, Discard two cards: Target player discards X cards at random. Ability ability = new SimpleActivatedAbility(new DiscardTargetEffect( - ManacostVariableValue.REGULAR, true + GetXValue.instance, true ), new ManaCostsImpl<>("{X}{B}")); ability.addCost(new TapSourceCost()); ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, StaticFilters.FILTER_CARD_CARDS))); diff --git a/Mage.Sets/src/mage/cards/g/GreenManaBattery.java b/Mage.Sets/src/mage/cards/g/GreenManaBattery.java index 20f442d94df..4981a108587 100644 --- a/Mage.Sets/src/mage/cards/g/GreenManaBattery.java +++ b/Mage.Sets/src/mage/cards/g/GreenManaBattery.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.IntPlusDynamicValue; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -37,7 +37,7 @@ public final class GreenManaBattery extends CardImpl { // then add an additional {G} for each charge counter removed this way. ability = new DynamicManaAbility( Mana.GreenMana(1), - new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance), + new IntPlusDynamicValue(1, GetXValue.instance), new TapSourceCost(), "Add {G}, then add {G} for each charge counter removed this way", true, new IntPlusDynamicValue(1, new CountersSourceCount(CounterType.CHARGE))); diff --git a/Mage.Sets/src/mage/cards/g/GreenSunsTwilight.java b/Mage.Sets/src/mage/cards/g/GreenSunsTwilight.java index d1f1cc7da87..4d26eb87e65 100644 --- a/Mage.Sets/src/mage/cards/g/GreenSunsTwilight.java +++ b/Mage.Sets/src/mage/cards/g/GreenSunsTwilight.java @@ -2,7 +2,10 @@ package mage.cards.g; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -10,6 +13,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardAndOrCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -60,7 +64,7 @@ class GreenSunsTwilightEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, xValue + 1)); player.revealCards(source, cards, game); TargetCard target = new TargetCardAndOrCardInLibrary(CardType.CREATURE, CardType.LAND); diff --git a/Mage.Sets/src/mage/cards/g/GuardianAngel.java b/Mage.Sets/src/mage/cards/g/GuardianAngel.java index df10965a220..ef3aa13dcfb 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianAngel.java +++ b/Mage.Sets/src/mage/cards/g/GuardianAngel.java @@ -1,7 +1,6 @@ package mage.cards.g; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.SpecialAction; @@ -22,6 +21,9 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -78,7 +80,7 @@ class GuardianAngelEffect extends OneShotEffect { } else { targetName = "player " + targetPlayer.getName(); } - ContinuousEffect effect = new PreventDamageToTargetEffect(Duration.EndOfTurn, source.getManaCostsToPay().getX(), false); + ContinuousEffect effect = new PreventDamageToTargetEffect(Duration.EndOfTurn, CardUtil.getSourceCostsTag(game, source, "X", 0), false); effect.setTargetPointer(this.getTargetPointer().copy()); game.addEffect(effect, source); SpecialAction specialAction = new GuardianAngelAction(); diff --git a/Mage.Sets/src/mage/cards/h/HailOfArrows.java b/Mage.Sets/src/mage/cards/h/HailOfArrows.java index 0e11d72867f..939e29198a9 100644 --- a/Mage.Sets/src/mage/cards/h/HailOfArrows.java +++ b/Mage.Sets/src/mage/cards/h/HailOfArrows.java @@ -1,7 +1,7 @@ package mage.cards.h; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageMultiEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,8 +19,8 @@ public final class HailOfArrows extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}"); // Hail of Arrows deals X damage divided as you choose among any number of target attacking creatures. - this.getSpellAbility().addEffect(new DamageMultiEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(ManacostVariableValue.REGULAR, StaticFilters.FILTER_ATTACKING_CREATURES)); + this.getSpellAbility().addEffect(new DamageMultiEffect(GetXValue.instance)); + this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(GetXValue.instance, StaticFilters.FILTER_ATTACKING_CREATURES)); } private HailOfArrows(final HailOfArrows card) { diff --git a/Mage.Sets/src/mage/cards/h/HammerMage.java b/Mage.Sets/src/mage/cards/h/HammerMage.java index 9aa1375cce1..0ead20826ad 100644 --- a/Mage.Sets/src/mage/cards/h/HammerMage.java +++ b/Mage.Sets/src/mage/cards/h/HammerMage.java @@ -1,7 +1,6 @@ package mage.cards.h; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -11,15 +10,14 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.ComparisonType; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterArtifactPermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -70,7 +68,7 @@ class HammerMageEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { FilterArtifactPermanent filter = new FilterArtifactPermanent(); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); for(Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) { permanent.destroy(source, game, false); } diff --git a/Mage.Sets/src/mage/cards/h/Haruspex.java b/Mage.Sets/src/mage/cards/h/Haruspex.java index 28686ee7119..0d9027768a7 100644 --- a/Mage.Sets/src/mage/cards/h/Haruspex.java +++ b/Mage.Sets/src/mage/cards/h/Haruspex.java @@ -8,7 +8,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -49,7 +49,7 @@ public final class Haruspex extends CardImpl { // Devouring Monster -- {T}, Remove X +1/+1 counters from Haruspex: Add X mana of any one color. Ability ability = new DynamicManaAbility( - Mana.AnyMana(1), RemovedCountersForCostValue.instance, new TapSourceCost(), + Mana.AnyMana(1), GetXValue.instance, new TapSourceCost(), "Add X mana of any one color", true, xValue ); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1)); diff --git a/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java b/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java index 0da27ae8bfb..784150b7027 100644 --- a/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java +++ b/Mage.Sets/src/mage/cards/h/HazduhrTheAbbot.java @@ -1,7 +1,6 @@ package mage.cards.h; -import java.util.UUID; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; @@ -11,11 +10,7 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.RedirectionEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; -import mage.constants.SuperType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; @@ -23,6 +18,9 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -77,7 +75,7 @@ class HazduhrTheAbbotRedirectDamageEffect extends RedirectionEffect { @Override public void init(Ability source, Game game) { super.init(source, game); - amountToRedirect = source.getManaCostsToPay().getX(); + amountToRedirect = CardUtil.getSourceCostsTag(game, source, "X", 0); } @Override diff --git a/Mage.Sets/src/mage/cards/h/HeatRay.java b/Mage.Sets/src/mage/cards/h/HeatRay.java index 9975b2d0ddb..573af78dd34 100644 --- a/Mage.Sets/src/mage/cards/h/HeatRay.java +++ b/Mage.Sets/src/mage/cards/h/HeatRay.java @@ -2,7 +2,7 @@ package mage.cards.h; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class HeatRay extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{R}"); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/h/HeavenEarth.java b/Mage.Sets/src/mage/cards/h/HeavenEarth.java index 607ff5bdf55..02536851d55 100644 --- a/Mage.Sets/src/mage/cards/h/HeavenEarth.java +++ b/Mage.Sets/src/mage/cards/h/HeavenEarth.java @@ -1,7 +1,7 @@ package mage.cards.h; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.AftermathAbility; import mage.abilities.keyword.FlyingAbility; @@ -32,13 +32,13 @@ public final class HeavenEarth extends SplitCard { // Falling // Falling deals X damage to each creature with flying. - getLeftHalfCard().getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filterFlying)); + getLeftHalfCard().getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filterFlying)); // to // Earth // Earth deals X damage to each creature without flying. getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true)); - getRightHalfCard().getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filterWithouFlying)); + getRightHalfCard().getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filterWithouFlying)); } private HeavenEarth(final HeavenEarth card) { diff --git a/Mage.Sets/src/mage/cards/h/HeliodsIntervention.java b/Mage.Sets/src/mage/cards/h/HeliodsIntervention.java index 092753bf4b9..15542e716a8 100644 --- a/Mage.Sets/src/mage/cards/h/HeliodsIntervention.java +++ b/Mage.Sets/src/mage/cards/h/HeliodsIntervention.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.GainLifeTargetEffect; import mage.cards.CardImpl; @@ -15,6 +15,7 @@ import mage.game.Game; import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -23,7 +24,7 @@ import java.util.UUID; */ public final class HeliodsIntervention extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public HeliodsIntervention(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{W}{W}"); @@ -61,7 +62,7 @@ enum HeliodsInterventionAdjuster implements TargetAdjuster { } mode.getTargets().clear(); mode.addTarget(new TargetPermanent( - ability.getManaCostsToPay().getX(), StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT + CardUtil.getSourceCostsTag(game, ability, "X", 0), StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT )); } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/h/HelixPinnacle.java b/Mage.Sets/src/mage/cards/h/HelixPinnacle.java index 78e5926bafe..39e446228fd 100644 --- a/Mage.Sets/src/mage/cards/h/HelixPinnacle.java +++ b/Mage.Sets/src/mage/cards/h/HelixPinnacle.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.WinGameSourceControllerEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.ShroudAbility; @@ -34,7 +34,7 @@ public final class HelixPinnacle extends CardImpl { // {X}: Put X tower counters on Helix Pinnacle. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, - new AddCountersSourceEffect(CounterType.TOWER.createInstance(), ManacostVariableValue.REGULAR, true), + new AddCountersSourceEffect(CounterType.TOWER.createInstance(), GetXValue.instance, true), new ManaCostsImpl<>("{X}"))); // At the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game. diff --git a/Mage.Sets/src/mage/cards/h/HellToPay.java b/Mage.Sets/src/mage/cards/h/HellToPay.java index 280b226071e..640b2be38b8 100644 --- a/Mage.Sets/src/mage/cards/h/HellToPay.java +++ b/Mage.Sets/src/mage/cards/h/HellToPay.java @@ -10,6 +10,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.TreasureToken; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -59,7 +60,7 @@ class HellToPayEffect extends OneShotEffect { if (permanent == null) { return false; } - int damage = source.getManaCostsToPay().getX(); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); int lethal = Math.min(permanent.getLethalDamage(source.getSourceId(), game), damage); permanent.damage(damage, source.getSourceId(), source, game); if (damage > lethal) { diff --git a/Mage.Sets/src/mage/cards/h/HelmOfObedience.java b/Mage.Sets/src/mage/cards/h/HelmOfObedience.java index c05d21ef075..a0498fd6251 100644 --- a/Mage.Sets/src/mage/cards/h/HelmOfObedience.java +++ b/Mage.Sets/src/mage/cards/h/HelmOfObedience.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.cards.*; import mage.constants.CardType; @@ -70,7 +70,7 @@ class HelmOfObedienceEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player targetOpponent = game.getPlayer(source.getFirstTarget()); - int max = ManacostVariableValue.REGULAR.calculate(game, source, this); + int max = GetXValue.instance.calculate(game, source, this); if (targetOpponent == null || controller == null || max < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/h/HeroesPodium.java b/Mage.Sets/src/mage/cards/h/HeroesPodium.java index c21b9ccd4cd..ec8b41ab4a4 100644 --- a/Mage.Sets/src/mage/cards/h/HeroesPodium.java +++ b/Mage.Sets/src/mage/cards/h/HeroesPodium.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; @@ -47,7 +47,7 @@ public final class HeroesPodium extends CardImpl { // You may reveal a legendary creature card from among them and put it into your hand. // Put the rest on the bottom of your library in a random order. Ability ability = new SimpleActivatedAbility( - new LookLibraryAndPickControllerEffect(ManacostVariableValue.REGULAR, 1, filter2, PutCards.HAND, PutCards.BOTTOM_RANDOM), + new LookLibraryAndPickControllerEffect(GetXValue.instance, 1, filter2, PutCards.HAND, PutCards.BOTTOM_RANDOM), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/h/HexParasite.java b/Mage.Sets/src/mage/cards/h/HexParasite.java index dd9b22c3eb7..d4d4f2e3be2 100644 --- a/Mage.Sets/src/mage/cards/h/HexParasite.java +++ b/Mage.Sets/src/mage/cards/h/HexParasite.java @@ -13,6 +13,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -70,7 +71,7 @@ class HexParasiteEffect extends OneShotEffect { return false; } - int toRemove = source.getManaCostsToPay().getX(); + int toRemove = CardUtil.getSourceCostsTag(game, source, "X", 0); if (toRemove == 0) { return true; } diff --git a/Mage.Sets/src/mage/cards/h/HollowTrees.java b/Mage.Sets/src/mage/cards/h/HollowTrees.java index 131ceb07bd5..7b9185287cc 100644 --- a/Mage.Sets/src/mage/cards/h/HollowTrees.java +++ b/Mage.Sets/src/mage/cards/h/HollowTrees.java @@ -12,7 +12,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -44,7 +44,7 @@ public final class HollowTrees extends CardImpl { // {tap}, Remove any number of storage counters from Hollow Trees: Add {G} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.GreenMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {G} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/h/HornOfValhalla.java b/Mage.Sets/src/mage/cards/h/HornOfValhalla.java index ff6a69d2d16..6120a9664e7 100644 --- a/Mage.Sets/src/mage/cards/h/HornOfValhalla.java +++ b/Mage.Sets/src/mage/cards/h/HornOfValhalla.java @@ -3,7 +3,7 @@ package mage.cards.h; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.hint.common.CreaturesYouControlHint; @@ -39,7 +39,7 @@ public final class HornOfValhalla extends AdventureCard { // Ysgard's Call // Create X 1/1 white Soldier creature tokens. this.getSpellCard().getSpellAbility().addEffect(new CreateTokenEffect( - new SoldierToken(), ManacostVariableValue.REGULAR + new SoldierToken(), GetXValue.instance )); this.finalizeAdventure(); diff --git a/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java b/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java index 108178c2250..6b148d7c9f8 100644 --- a/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java +++ b/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java @@ -2,7 +2,7 @@ package mage.cards.h; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -23,7 +23,7 @@ public final class HowlFromBeyond extends CardImpl { // Target creature gets +X/+0 until end of turn. - this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostTargetEffect(GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java b/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java index 67438b81a11..5b11a882b00 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java +++ b/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java @@ -2,8 +2,7 @@ package mage.cards.h; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.GreatestPowerAmongControlledCreaturesValue; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; @@ -46,7 +45,7 @@ public final class HuatliWarriorPoet extends CardImpl { // -X: Huatli, Warrior Poet deals X damage divided as you choose among any number of target creatures. Creatures dealt damage this way can't block this turn. Ability ability = new LoyaltyAbility(new HuatliWarriorPoetDamageEffect()); - ability.addTarget(new TargetCreaturePermanentAmount(GetXLoyaltyValue.instance)); + ability.addTarget(new TargetCreaturePermanentAmount(GetXValue.instance)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/h/HugsGrislyGuardian.java b/Mage.Sets/src/mage/cards/h/HugsGrislyGuardian.java index 86de52c1bac..ec184354541 100644 --- a/Mage.Sets/src/mage/cards/h/HugsGrislyGuardian.java +++ b/Mage.Sets/src/mage/cards/h/HugsGrislyGuardian.java @@ -3,7 +3,7 @@ package mage.cards.h; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect; import mage.abilities.effects.common.continuous.PlayAdditionalLandsControllerEffect; import mage.abilities.keyword.TrampleAbility; @@ -35,7 +35,7 @@ public final class HugsGrislyGuardian extends CardImpl { // When Hugs, Grisly Guardian enters, exile the top X cards of your library. Until the end of your next turn, you may play those cards. this.addAbility(new EntersBattlefieldTriggeredAbility(new ExileTopXMayPlayUntilEffect( - ManacostVariableValue.ETB, Duration.UntilEndOfYourNextTurn + GetXValue.instance, Duration.UntilEndOfYourNextTurn ))); // You may play an additional land on each of your turns. diff --git a/Mage.Sets/src/mage/cards/h/HuntToExtinction.java b/Mage.Sets/src/mage/cards/h/HuntToExtinction.java index 5c15103d9f9..e6d68916061 100644 --- a/Mage.Sets/src/mage/cards/h/HuntToExtinction.java +++ b/Mage.Sets/src/mage/cards/h/HuntToExtinction.java @@ -1,7 +1,7 @@ package mage.cards.h; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -33,10 +33,10 @@ public final class HuntToExtinction extends CardImpl { this.getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent(0, 1)); // Hunt to Extinction deals X damage to each creature. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, new FilterCreaturePermanent())); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, new FilterCreaturePermanent())); // Hunt to Exctinction deals an additional X damage to each creature with a bounty counter on it. - Effect effect = new DamageAllEffect(ManacostVariableValue.REGULAR, filter); + Effect effect = new DamageAllEffect(GetXValue.instance, filter); effect.setText("Hunt to Exctinction deals an additional X damage to each creature with a bounty counter on it"); this.getSpellAbility().addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/h/Hurricane.java b/Mage.Sets/src/mage/cards/h/Hurricane.java index ff28a61cc25..cb196c777c8 100644 --- a/Mage.Sets/src/mage/cards/h/Hurricane.java +++ b/Mage.Sets/src/mage/cards/h/Hurricane.java @@ -2,7 +2,7 @@ package mage.cards.h; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageEverythingEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -28,7 +28,7 @@ public final class Hurricane extends CardImpl { // Hurricane deals X damage to each creature with flying and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageEverythingEffect(GetXValue.instance, filter)); } private Hurricane(final Hurricane card) { diff --git a/Mage.Sets/src/mage/cards/h/HydroidKrasis.java b/Mage.Sets/src/mage/cards/h/HydroidKrasis.java index a8b9024938e..6ea02809dcd 100644 --- a/Mage.Sets/src/mage/cards/h/HydroidKrasis.java +++ b/Mage.Sets/src/mage/cards/h/HydroidKrasis.java @@ -17,6 +17,7 @@ import mage.constants.SubType; import mage.counters.CounterType; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -85,7 +86,7 @@ class HydroidKrasisEffect extends OneShotEffect { if (!(obj instanceof SpellAbility)) { return false; } - int halfCost = Math.floorDiv(((SpellAbility) obj).getManaCostsToPay().getX(), 2); + int halfCost = Math.floorDiv(CardUtil.getSourceCostsTag(game, ((SpellAbility) obj), "X", 0), 2); player.drawCards(halfCost, source, game); player.gainLife(halfCost, game, source); return true; diff --git a/Mage.Sets/src/mage/cards/i/IcatianStore.java b/Mage.Sets/src/mage/cards/i/IcatianStore.java index fe051890a7f..446e2eeb884 100644 --- a/Mage.Sets/src/mage/cards/i/IcatianStore.java +++ b/Mage.Sets/src/mage/cards/i/IcatianStore.java @@ -12,7 +12,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -44,7 +44,7 @@ public final class IcatianStore extends CardImpl { // {tap}, Remove any number of storage counters from Icatian Store: Add {W} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.WhiteMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {W} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/i/Illuminate.java b/Mage.Sets/src/mage/cards/i/Illuminate.java index dced3323cb7..4495fbc7307 100644 --- a/Mage.Sets/src/mage/cards/i/Illuminate.java +++ b/Mage.Sets/src/mage/cards/i/Illuminate.java @@ -4,7 +4,7 @@ package mage.cards.i; import java.util.UUID; import mage.abilities.condition.common.KickedCostCondition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -28,14 +28,14 @@ public final class Illuminate extends CardImpl { kickerAbility.addKickerCost("{3}{U}"); this.addAbility(kickerAbility); // Illuminate deals X damage to target creature. If Illuminate was kicked with its {2}{R} kicker, it deals X damage to that creature's controller. If Illuminate was kicked with its {3}{U} kicker, you draw X cards. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageTargetControllerEffect(ManacostVariableValue.REGULAR), + new DamageTargetControllerEffect(GetXValue.instance), new KickedCostCondition("{2}{R}"), "if this spell was kicked with its {2}{R} kicker, it deals X damage to that creature's controller.")); this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR), + new DrawCardSourceControllerEffect(GetXValue.instance), new KickedCostCondition("{3}{U}"), " if this spell was kicked with its {3}{U} kicker, you draw X cards.")); diff --git a/Mage.Sets/src/mage/cards/i/ImmortalServitude.java b/Mage.Sets/src/mage/cards/i/ImmortalServitude.java index a9361aff594..7aa3ab35512 100644 --- a/Mage.Sets/src/mage/cards/i/ImmortalServitude.java +++ b/Mage.Sets/src/mage/cards/i/ImmortalServitude.java @@ -11,6 +11,7 @@ import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.Objects; import java.util.Set; @@ -60,7 +61,7 @@ class ImmortalServitudeEffect extends OneShotEffect { if (you == null) { return false; } - int count = source.getManaCostsToPay().getX(); + int count = CardUtil.getSourceCostsTag(game, source, "X", 0); Set cards = you.getGraveyard().getCards(StaticFilters.FILTER_CARD_CREATURE, game); cards.removeIf(Objects::isNull); cards.removeIf(card -> !card.isCreature(game)); diff --git a/Mage.Sets/src/mage/cards/i/IncreasingConfusion.java b/Mage.Sets/src/mage/cards/i/IncreasingConfusion.java index 0b755543b71..30ca5d52ebd 100644 --- a/Mage.Sets/src/mage/cards/i/IncreasingConfusion.java +++ b/Mage.Sets/src/mage/cards/i/IncreasingConfusion.java @@ -5,7 +5,7 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.MillCardsTargetEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; @@ -20,14 +20,14 @@ import java.util.UUID; */ public final class IncreasingConfusion extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public IncreasingConfusion(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}"); // Target player puts the top X cards of their library into their graveyard. If this spell was cast from a graveyard, that player puts twice that many cards into their graveyard instead. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new MillCardsTargetEffect(xValue), new MillCardsTargetEffect(ManacostVariableValue.REGULAR), + new MillCardsTargetEffect(xValue), new MillCardsTargetEffect(GetXValue.instance), CastFromGraveyardSourceCondition.instance, "target player mills X cards. " + "If this spell was cast from a graveyard, that player mills twice that many cards" )); diff --git a/Mage.Sets/src/mage/cards/i/InfusedArrows.java b/Mage.Sets/src/mage/cards/i/InfusedArrows.java index df6e1a96551..30332a5d41b 100644 --- a/Mage.Sets/src/mage/cards/i/InfusedArrows.java +++ b/Mage.Sets/src/mage/cards/i/InfusedArrows.java @@ -6,7 +6,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.keyword.SunburstAbility; @@ -23,7 +23,7 @@ import mage.target.common.TargetCreaturePermanent; */ public final class InfusedArrows extends CardImpl { - private static final DynamicValue xValue = new SignInversionDynamicValue(RemovedCountersForCostValue.instance); + private static final DynamicValue xValue = new SignInversionDynamicValue(GetXValue.instance); public InfusedArrows(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); diff --git a/Mage.Sets/src/mage/cards/i/IngeniousMastery.java b/Mage.Sets/src/mage/cards/i/IngeniousMastery.java index 64f58a06c11..4f5011f40bc 100644 --- a/Mage.Sets/src/mage/cards/i/IngeniousMastery.java +++ b/Mage.Sets/src/mage/cards/i/IngeniousMastery.java @@ -12,6 +12,7 @@ import mage.game.Game; import mage.game.permanent.token.TreasureToken; import mage.players.Player; import mage.target.common.TargetOpponent; +import mage.util.CardUtil; import java.util.UUID; @@ -71,7 +72,7 @@ class IngeniousMasteryEffect extends OneShotEffect { if (!AlternativeCostSourceAbility.getActivatedStatus( game, source, this.alternativeCostOriginalID, false )) { - return player.drawCards(source.getManaCostsToPay().getX(), source, game) > 0; + return player.drawCards(CardUtil.getSourceCostsTag(game, source, "X", 0), source, game) > 0; } player.drawCards(3, source, game); diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java b/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java index 9cf0c702476..babbe2657ba 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfIkoria.java @@ -2,7 +2,7 @@ package mage.cards.i; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.search.SearchLibraryGraveyardPutOntoBattlefieldEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -60,6 +60,6 @@ enum InvasionOfIkoriaPredicate implements ObjectSourcePlayerPredicate { @Override public boolean apply(ObjectSourcePlayer input, Game game) { return input.getObject().getManaValue() - <= ManacostVariableValue.ETB.calculate(game, input.getSource(), null); + <= GetXValue.instance.calculate(game, input.getSource(), null); } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java b/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java index fb3ed001e21..314ce51080c 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfNewPhyrexia.java @@ -2,7 +2,7 @@ package mage.cards.i; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SiegeAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +28,7 @@ public final class InvasionOfNewPhyrexia extends CardImpl { this.addAbility(new SiegeAbility()); // When Invasion of New Phyrexia enters the battlefield, create X 2/2 white and blue Knight creature tokens with vigilance. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightWhiteBlueToken(), ManacostVariableValue.ETB))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightWhiteBlueToken(), GetXValue.instance))); } private InvasionOfNewPhyrexia(final InvasionOfNewPhyrexia card) { diff --git a/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java b/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java index 6cebbb512ec..67c476cec77 100644 --- a/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java +++ b/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java @@ -3,7 +3,7 @@ package mage.cards.i; import java.util.UUID; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; @@ -21,8 +21,8 @@ public final class InvokeTheFiremind extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{U}{R}"); - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); - Mode mode = new Mode(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); + Mode mode = new Mode(new DamageTargetEffect(GetXValue.instance)); mode.addTarget(new TargetAnyTarget()); this.getSpellAbility().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/j/JaceThePerfectedMind.java b/Mage.Sets/src/mage/cards/j/JaceThePerfectedMind.java index 71b5d7636f4..aece94d4a10 100644 --- a/Mage.Sets/src/mage/cards/j/JaceThePerfectedMind.java +++ b/Mage.Sets/src/mage/cards/j/JaceThePerfectedMind.java @@ -3,7 +3,7 @@ package mage.cards.j; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.MillCardsTargetEffect; @@ -47,7 +47,7 @@ public final class JaceThePerfectedMind extends CardImpl { this.addAbility(ability2); // -X: Target player mills three times X cards. Ability ability3 = new LoyaltyAbility(new MillCardsTargetEffect(new MultipliedValue - (GetXLoyaltyValue.instance, 3)).setText("Target player mills three times X cards.")); + (GetXValue.instance, 3)).setText("Target player mills three times X cards.")); ability3.addTarget(new TargetPlayer()); this.addAbility(ability3); } diff --git a/Mage.Sets/src/mage/cards/j/JadelightSpelunker.java b/Mage.Sets/src/mage/cards/j/JadelightSpelunker.java index 462769b455e..b834fb13c38 100644 --- a/Mage.Sets/src/mage/cards/j/JadelightSpelunker.java +++ b/Mage.Sets/src/mage/cards/j/JadelightSpelunker.java @@ -2,7 +2,7 @@ package mage.cards.j; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.keyword.ExploreSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -26,7 +26,7 @@ public final class JadelightSpelunker extends CardImpl { // When Jadelight Spelunker enters the battlefield, it explores X times. this.addAbility(new EntersBattlefieldTriggeredAbility( - new ExploreSourceEffect(ManacostVariableValue.ETB, false, "it") + new ExploreSourceEffect(GetXValue.instance, false, "it") .setText("it explores X times. (To have it explore, reveal the top card of your library. " + "Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on that creature, " + "then put the card back or put it into your graveyard.)") diff --git a/Mage.Sets/src/mage/cards/j/JamesWanderingDad.java b/Mage.Sets/src/mage/cards/j/JamesWanderingDad.java index 6f026f44a79..ebab71ed6c6 100644 --- a/Mage.Sets/src/mage/cards/j/JamesWanderingDad.java +++ b/Mage.Sets/src/mage/cards/j/JamesWanderingDad.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.keyword.InvestigateEffect; import mage.abilities.mana.ConditionalColorlessManaAbility; import mage.abilities.mana.builder.ConditionalManaBuilder; @@ -45,7 +45,7 @@ public final class JamesWanderingDad extends AdventureCard { // Instant — Adventure // Investigate X times. this.getSpellCard().getSpellAbility().addEffect( - new InvestigateEffect(ManacostVariableValue.REGULAR) + new InvestigateEffect(GetXValue.instance) .setText("Investigate X times") ); diff --git a/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java b/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java index d910d6ab47e..8201aca22a5 100644 --- a/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java +++ b/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java @@ -3,7 +3,7 @@ package mage.cards.j; import java.util.UUID; import mage.abilities.common.LegendarySpellAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -25,7 +25,7 @@ public final class JayasImmolatingInferno extends CardImpl { this.addAbility(new LegendarySpellAbility()); // Jaya's Immolating Inferno deals X damage to each of up to three targets. - Effect effect = new DamageTargetEffect(ManacostVariableValue.REGULAR); + Effect effect = new DamageTargetEffect(GetXValue.instance); effect.setText("{this} deals X damage to each of up to three targets"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetAnyTarget(1, 3)); diff --git a/Mage.Sets/src/mage/cards/j/JeskaThriceReborn.java b/Mage.Sets/src/mage/cards/j/JeskaThriceReborn.java index c2475cec878..452be542f47 100644 --- a/Mage.Sets/src/mage/cards/j/JeskaThriceReborn.java +++ b/Mage.Sets/src/mage/cards/j/JeskaThriceReborn.java @@ -5,7 +5,7 @@ import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.DamageTargetEffect; @@ -53,7 +53,7 @@ public final class JeskaThriceReborn extends CardImpl { this.addAbility(ability); // −X: Jeska, Thrice Reborn deals X damage to each of up to three targets. - ability = new LoyaltyAbility(new DamageTargetEffect(GetXLoyaltyValue.instance) + ability = new LoyaltyAbility(new DamageTargetEffect(GetXValue.instance) .setText("{this} deals X damage to each of up to three targets")); ability.addTarget(new TargetAnyTarget(0, 3)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java b/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java index 598d6ddf84d..3f0e267254c 100644 --- a/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java +++ b/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.ChannelAbility; @@ -44,13 +44,13 @@ public final class JiwariTheEarthAflame extends CardImpl { this.toughness = new MageInt(3); // {X}{R}, {tap}: Jiwari, the Earth Aflame deals X damage to target creature without flying. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{R}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); // Channel - {X}{R}{R}{R}, Discard Jiwari: Jiwari deals X damage to each creature without flying. - this.addAbility(new ChannelAbility("{X}{R}{R}{R}", new DamageAllEffect(ManacostVariableValue.REGULAR, filter))); + this.addAbility(new ChannelAbility("{X}{R}{R}{R}", new DamageAllEffect(GetXValue.instance, filter))); } private JiwariTheEarthAflame(final JiwariTheEarthAflame card) { diff --git a/Mage.Sets/src/mage/cards/k/KaerveksTorch.java b/Mage.Sets/src/mage/cards/k/KaerveksTorch.java index 31d55b058f8..85f0f63d044 100644 --- a/Mage.Sets/src/mage/cards/k/KaerveksTorch.java +++ b/Mage.Sets/src/mage/cards/k/KaerveksTorch.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class KaerveksTorch extends CardImpl { // As long as Kaervek's Torch is on the stack, spells that target it cost {2} more to cast. this.addAbility(new SimpleStaticAbility(Zone.STACK, new KaerveksTorchCostIncreaseEffect())); // Kaervek's Torch deals X damage to any target. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); } diff --git a/Mage.Sets/src/mage/cards/k/KahoMinamoHistorian.java b/Mage.Sets/src/mage/cards/k/KahoMinamoHistorian.java index fec2f6425da..bf6d37604de 100644 --- a/Mage.Sets/src/mage/cards/k/KahoMinamoHistorian.java +++ b/Mage.Sets/src/mage/cards/k/KahoMinamoHistorian.java @@ -132,7 +132,7 @@ class KahoMinamoHistorianCastEffect extends OneShotEffect { } FilterCard filter = new FilterCard(); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, source.getManaCostsToPay().getX())); + filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, CardUtil.getSourceCostsTag(game, source, "X", 0))); return CardUtil.castSpellWithAttributesForFree(controller, source, game, cards, filter); } } diff --git a/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java b/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java index 7e45cf1b49b..ee527d33bb6 100644 --- a/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java +++ b/Mage.Sets/src/mage/cards/k/KamahlsDruidicVow.java @@ -1,6 +1,5 @@ package mage.cards.k; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.LegendarySpellAbility; import mage.abilities.effects.OneShotEffect; @@ -8,11 +7,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.constants.Outcome; -import mage.constants.SuperType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterCard; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.Predicates; @@ -20,6 +15,9 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @author JRHerlehy Created on 4/8/18. @@ -67,7 +65,7 @@ class KamahlsDruidicVowEffect extends OneShotEffect { if (controller == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); controller.lookAtCards(source, null, cards, game); if (!cards.isEmpty()) { diff --git a/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java b/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java index 4b0256b660f..4b1d3ca1cdb 100644 --- a/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java +++ b/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.KickedCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.GetKickerXValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -49,7 +49,7 @@ public final class KangeeAerieKeeper extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Kangee, Aerie Keeper enters the battlefield, if it was kicked, put X feather counters on it. - TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.FEATHER.createInstance(), GetKickerXValue.instance, true)); + TriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new AddCountersSourceEffect(CounterType.FEATHER.createInstance(), GetXValue.instance, true)); this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, KickedCondition.ONCE, "When {this} enters the battlefield, if it was kicked, put X feather counters on it.")); // Other Bird creatures get +1/+1 for each feather counter on Kangee, Aerie Keeper. diff --git a/Mage.Sets/src/mage/cards/k/KarnsSylex.java b/Mage.Sets/src/mage/cards/k/KarnsSylex.java index 005096e9fed..df61aadcc9b 100644 --- a/Mage.Sets/src/mage/cards/k/KarnsSylex.java +++ b/Mage.Sets/src/mage/cards/k/KarnsSylex.java @@ -12,14 +12,13 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; -import java.util.Objects; import java.util.UUID; /** @@ -97,7 +96,7 @@ class KarnsSylexDestroyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { FilterNonlandPermanent filter = new FilterNonlandPermanent(); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); boolean destroyed = false; for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { diff --git a/Mage.Sets/src/mage/cards/k/KasminaEnigmaSage.java b/Mage.Sets/src/mage/cards/k/KasminaEnigmaSage.java index 74cfccc14ae..add1508df59 100644 --- a/Mage.Sets/src/mage/cards/k/KasminaEnigmaSage.java +++ b/Mage.Sets/src/mage/cards/k/KasminaEnigmaSage.java @@ -4,7 +4,7 @@ import mage.ApprovingObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.keyword.ScryEffect; @@ -46,7 +46,7 @@ public final class KasminaEnigmaSage extends CardImpl { // −X: Create a 0/0 green and blue Fractal creature token. Put X +1/+1 counters on it. this.addAbility(new LoyaltyAbility(FractalToken.getEffect( - GetXLoyaltyValue.instance, "Put X +1/+1 counters on it" + GetXValue.instance, "Put X +1/+1 counters on it" ))); // −8: Search your library for an instant or sorcery card that shares a color with this planeswalker, exile that card, then shuffle. You may cast that card without paying its mana cost. diff --git a/Mage.Sets/src/mage/cards/k/KaylasReconstruction.java b/Mage.Sets/src/mage/cards/k/KaylasReconstruction.java index 09fcd342a7b..353fdf5ca31 100644 --- a/Mage.Sets/src/mage/cards/k/KaylasReconstruction.java +++ b/Mage.Sets/src/mage/cards/k/KaylasReconstruction.java @@ -16,6 +16,7 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -77,7 +78,7 @@ class KaylasReconstructionEffect extends OneShotEffect { return false; } Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 7)); - TargetCardInLibrary target = new TargetCardInLibrary(0, source.getManaCostsToPay().getX(), filter); + TargetCardInLibrary target = new TargetCardInLibrary(0, CardUtil.getSourceCostsTag(game, source, "X", 0), filter); player.choose(outcome, cards, target, source, game); Cards toBattlefield = new CardsImpl(target.getTargets()); player.moveCards(toBattlefield, Zone.BATTLEFIELD, source, game); diff --git a/Mage.Sets/src/mage/cards/k/KessigWolfRun.java b/Mage.Sets/src/mage/cards/k/KessigWolfRun.java index ef5f2241c73..49ddb921325 100644 --- a/Mage.Sets/src/mage/cards/k/KessigWolfRun.java +++ b/Mage.Sets/src/mage/cards/k/KessigWolfRun.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -34,7 +34,7 @@ public final class KessigWolfRun extends CardImpl { TrampleAbility.getInstance(), Duration.EndOfTurn ).setText("Target creature gets +X/+0"), new ManaCostsImpl<>("{X}{R}{G}")); ability.addEffect(new BoostTargetEffect( - ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn + GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn ).setText("and gains trample until end of turn")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java b/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java index 93834aa827d..9989529f7f5 100644 --- a/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java +++ b/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java @@ -20,6 +20,7 @@ import mage.game.permanent.token.FractalToken; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInExile; +import mage.util.CardUtil; import java.util.List; import java.util.Objects; @@ -203,7 +204,7 @@ class ImbrahamDeanOfTheoryEffect extends OneShotEffect { if (player == null) { return false; } - Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); + Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, CardUtil.getSourceCostsTag(game, source, "X", 0))); player.moveCards(cards, Zone.EXILED, source, game); for (Card card : cards.getCards(game)) { if (card == null) { diff --git a/Mage.Sets/src/mage/cards/k/KillingWave.java b/Mage.Sets/src/mage/cards/k/KillingWave.java index 6ee23e678f1..883c9865204 100644 --- a/Mage.Sets/src/mage/cards/k/KillingWave.java +++ b/Mage.Sets/src/mage/cards/k/KillingWave.java @@ -2,7 +2,7 @@ package mage.cards.k; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -61,7 +61,7 @@ class KillingWaveEffect extends OneShotEffect { return false; } - int amount = (ManacostVariableValue.REGULAR).calculate(game, source, this); + int amount = (GetXValue.instance).calculate(game, source, this); if (amount > 0) { List sacrifices = new LinkedList<>(); Map lifePaidAmounts = new HashMap<>(); diff --git a/Mage.Sets/src/mage/cards/k/KlauthsWill.java b/Mage.Sets/src/mage/cards/k/KlauthsWill.java index 882db834cd7..bb3b0345926 100644 --- a/Mage.Sets/src/mage/cards/k/KlauthsWill.java +++ b/Mage.Sets/src/mage/cards/k/KlauthsWill.java @@ -3,7 +3,7 @@ package mage.cards.k; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.condition.common.ControlACommanderCondition; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -18,6 +18,7 @@ import mage.filter.predicate.mageobject.AbilityPredicate; import mage.game.Game; import mage.target.TargetPermanent; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -42,7 +43,7 @@ public final class KlauthsWill extends CardImpl { this.getSpellAbility().getModes().setMoreCondition(ControlACommanderCondition.instance); // • Breathe Flame — Klauth's Will deals X damage to each creature without flying. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filter)); this.getSpellAbility().withFirstModeFlavorWord("Breathe Flame"); // • Smash Relics — Destroy up to X target artifacts and/or enchantments. @@ -70,7 +71,7 @@ enum KlauthsWillAdjuster implements TargetAdjuster { if (ability.getEffects().stream().anyMatch(DestroyTargetEffect.class::isInstance)) { ability.getTargets().clear(); ability.addTarget(new TargetPermanent( - 0, ability.getManaCostsToPay().getX(), + 0, CardUtil.getSourceCostsTag(game, ability, "X", 0), StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT )); } diff --git a/Mage.Sets/src/mage/cards/k/KnickknackOuphe.java b/Mage.Sets/src/mage/cards/k/KnickknackOuphe.java index ad54221a35a..369aeb81c02 100644 --- a/Mage.Sets/src/mage/cards/k/KnickknackOuphe.java +++ b/Mage.Sets/src/mage/cards/k/KnickknackOuphe.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.cards.Card; @@ -76,7 +76,7 @@ class KnickknackOuphePutOntoBattlefieldEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int count = ManacostVariableValue.ETB.calculate(game, source, null); + int count = GetXValue.instance.calculate(game, source, null); if (count > 0) { Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, count)); controller.revealCards(source, cards, game); diff --git a/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java b/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java index 79ca003c7ef..3c6575704e3 100644 --- a/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java +++ b/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java @@ -6,7 +6,7 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,6 +18,7 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetCardInHand; +import mage.util.CardUtil; import java.util.UUID; @@ -32,7 +33,7 @@ public final class KnollspineInvocation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}{R}"); // {X}, Discard a card with converted mana cost X: Knollspine Invocation deals X damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR, true), new ManaCostsImpl<>("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance, true), new ManaCostsImpl<>("{X}")); ability.addCost(new DiscardTargetCost(new TargetCardInHand(filter))); ability.addTarget(new TargetAnyTarget()); ability.setCostAdjuster(KnollspineInvocationAdjuster.instance); @@ -54,7 +55,7 @@ enum KnollspineInvocationAdjuster implements CostAdjuster { @Override public void adjustCosts(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); for (Cost cost : ability.getCosts()) { if (!(cost instanceof DiscardTargetCost)) { continue; diff --git a/Mage.Sets/src/mage/cards/k/KozileksCommand.java b/Mage.Sets/src/mage/cards/k/KozileksCommand.java index af3b2d6b06b..fd0c2b9c9fa 100644 --- a/Mage.Sets/src/mage/cards/k/KozileksCommand.java +++ b/Mage.Sets/src/mage/cards/k/KozileksCommand.java @@ -2,7 +2,7 @@ package mage.cards.k; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.abilities.effects.common.DrawCardTargetEffect; @@ -23,6 +23,7 @@ import mage.target.TargetPlayer; import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -41,11 +42,11 @@ public final class KozileksCommand extends CardImpl { this.getSpellAbility().getModes().setMaxModes(2); // * Target player creates X 0/1 colorless Eldrazi Spawn creature tokens with "Sacrifice this creature: Add {C}." - this.getSpellAbility().addEffect(new CreateTokenTargetEffect(new EldraziSpawnToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenTargetEffect(new EldraziSpawnToken(), GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer().withChooseHint("create tokens")); // * Target player scries X, then draws a card. - Mode mode = new Mode(new ScryTargetEffect(ManacostVariableValue.REGULAR)); + Mode mode = new Mode(new ScryTargetEffect(GetXValue.instance)); mode.addEffect(new DrawCardTargetEffect(1).setText(", then draws a card")); mode.addTarget(new TargetPlayer().withChooseHint("scries then draw")); this.getSpellAbility().addMode(mode); @@ -82,7 +83,7 @@ enum KozileksCommandAdjuster implements TargetAdjuster { public void adjustTargets(Ability ability, Game game) { // adjust targets is called for every selected mode Mode mode = ability.getModes().getMode(); - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); for (Effect effect : mode.getEffects()) { if (effect instanceof ExileTargetEffect) { Target target = mode.getTargets().get(0); diff --git a/Mage.Sets/src/mage/cards/k/KyrenToy.java b/Mage.Sets/src/mage/cards/k/KyrenToy.java index c30f4ee326f..52959265579 100644 --- a/Mage.Sets/src/mage/cards/k/KyrenToy.java +++ b/Mage.Sets/src/mage/cards/k/KyrenToy.java @@ -3,12 +3,11 @@ package mage.cards.k; import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.mana.ManaEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.mana.ManaEffect; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,6 +17,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import java.util.ArrayList; import java.util.List; @@ -85,12 +85,7 @@ public final class KyrenToy extends CardImpl { if (player == null) { return mana; } - int numberOfMana = 0; - for (Cost cost : source.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - numberOfMana = ((RemoveVariableCountersSourceCost) cost).getAmount(); - } - } + int numberOfMana = CardUtil.getSourceCostsTag(game, source, "X", 0); return Mana.ColorlessMana(numberOfMana + 1); } diff --git a/Mage.Sets/src/mage/cards/l/LairOfTheHydra.java b/Mage.Sets/src/mage/cards/l/LairOfTheHydra.java index 7a769536a69..26003176637 100644 --- a/Mage.Sets/src/mage/cards/l/LairOfTheHydra.java +++ b/Mage.Sets/src/mage/cards/l/LairOfTheHydra.java @@ -1,7 +1,5 @@ package mage.cards.l; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -20,6 +18,9 @@ import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; import mage.game.Game; import mage.game.permanent.token.custom.CreatureToken; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -85,7 +86,7 @@ class LairOfTheHydraEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); game.addEffect(new BecomesCreatureSourceEffect( new CreatureToken(xValue, xValue, "X/X green Hydra creature") .withColor("G") diff --git a/Mage.Sets/src/mage/cards/l/LanternFlare.java b/Mage.Sets/src/mage/cards/l/LanternFlare.java index b127bd8df92..4b4244a716e 100644 --- a/Mage.Sets/src/mage/cards/l/LanternFlare.java +++ b/Mage.Sets/src/mage/cards/l/LanternFlare.java @@ -2,7 +2,7 @@ package mage.cards.l; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.hint.common.CreaturesYouControlHint; @@ -24,9 +24,9 @@ public final class LanternFlare extends CardImpl { // Cleave {X}{R}{W} Ability ability = new CleaveAbility( - this, new DamageTargetEffect(ManacostVariableValue.REGULAR), "{X}{R}{W}" + this, new DamageTargetEffect(GetXValue.instance), "{X}{R}{W}" ); - ability.addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); + ability.addEffect(new GainLifeEffect(GetXValue.instance)); ability.addTarget(new TargetCreatureOrPlaneswalker()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java b/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java index e0b2b999406..40231d88d66 100644 --- a/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java +++ b/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -16,7 +16,6 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.target.common.TargetCardInHand; import mage.target.common.TargetAnyTarget; @@ -36,7 +35,7 @@ public final class LatullaKeldonOverseer extends CardImpl { this.toughness = new MageInt(3); // {X}{R}, {tap}, Discard two cards: Latulla, Keldon Overseer deals X damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{R}")); ability.addCost(new TapSourceCost()); ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, StaticFilters.FILTER_CARD_CARDS))); ability.addTarget(new TargetAnyTarget()); diff --git a/Mage.Sets/src/mage/cards/l/LavaclawReaches.java b/Mage.Sets/src/mage/cards/l/LavaclawReaches.java index 08317e7bdd9..722eabedc3f 100644 --- a/Mage.Sets/src/mage/cards/l/LavaclawReaches.java +++ b/Mage.Sets/src/mage/cards/l/LavaclawReaches.java @@ -5,7 +5,7 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; @@ -60,7 +60,7 @@ class LavaclawReachesToken extends TokenImpl { color.setBlack(true); power = new MageInt(2); toughness = new MageInt(2); - addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn), new ManaCostsImpl<>("{X}"))); + addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn), new ManaCostsImpl<>("{X}"))); } private LavaclawReachesToken(final LavaclawReachesToken token) { super(token); diff --git a/Mage.Sets/src/mage/cards/l/Lavalanche.java b/Mage.Sets/src/mage/cards/l/Lavalanche.java index 0713cd2c33b..3b8daafbad2 100644 --- a/Mage.Sets/src/mage/cards/l/Lavalanche.java +++ b/Mage.Sets/src/mage/cards/l/Lavalanche.java @@ -2,7 +2,7 @@ package mage.cards.l; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -27,7 +27,7 @@ public final class Lavalanche extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{R}{G}"); // Lavalanche deals X damage to target player and each creature they control. - this.getSpellAbility().addEffect(new LavalancheEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new LavalancheEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker()); } diff --git a/Mage.Sets/src/mage/cards/l/LetTheGalaxyBurn.java b/Mage.Sets/src/mage/cards/l/LetTheGalaxyBurn.java index 30722444def..0add6868173 100644 --- a/Mage.Sets/src/mage/cards/l/LetTheGalaxyBurn.java +++ b/Mage.Sets/src/mage/cards/l/LetTheGalaxyBurn.java @@ -2,7 +2,7 @@ package mage.cards.l; import mage.abilities.dynamicvalue.AdditiveDynamicValue; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.CascadeAbility; @@ -22,7 +22,7 @@ import java.util.UUID; public final class LetTheGalaxyBurn extends CardImpl { private static final DynamicValue xValue = new AdditiveDynamicValue( - ManacostVariableValue.REGULAR, StaticValue.get(2) + GetXValue.instance, StaticValue.get(2) ); private static final FilterPermanent filter = new FilterCreaturePermanent(); diff --git a/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java b/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java index b75bbe4704b..14b6adf5ddb 100644 --- a/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java +++ b/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java @@ -3,7 +3,7 @@ package mage.cards.l; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; @@ -38,7 +38,7 @@ public final class LifecraftAwakening extends CardImpl { // Put X +1/+1 counters on target artifact you control. If it isn't a creature or Vehicle, it becomes a 0/0 Construct artifact creature. getSpellAbility().addEffect(new AddCountersTargetEffect( - CounterType.P1P1.createInstance(), ManacostVariableValue.REGULAR + CounterType.P1P1.createInstance(), GetXValue.instance ).setText("put X +1/+1 counters on target artifact you control")); getSpellAbility().addTarget(new TargetArtifactPermanent(filter)); getSpellAbility().addEffect(new LifecraftAwakeningEffect()); diff --git a/Mage.Sets/src/mage/cards/l/LightUpTheNight.java b/Mage.Sets/src/mage/cards/l/LightUpTheNight.java index 49813378205..12053d405ec 100644 --- a/Mage.Sets/src/mage/cards/l/LightUpTheNight.java +++ b/Mage.Sets/src/mage/cards/l/LightUpTheNight.java @@ -16,6 +16,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -69,7 +70,7 @@ class LightUpTheNightEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { // Normal cast + Flashback cast - int damage = source.getManaCostsToPay().getX() + GetXValue.instance.calculate(game, source, this); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0) + GetXValue.instance.calculate(game, source, this); UUID targetId = getTargetPointer().getFirst(game, source); Player player = game.getPlayer(targetId); if (player != null) { diff --git a/Mage.Sets/src/mage/cards/l/LilianasIndignation.java b/Mage.Sets/src/mage/cards/l/LilianasIndignation.java index c1e5be71492..7ec487c2c02 100644 --- a/Mage.Sets/src/mage/cards/l/LilianasIndignation.java +++ b/Mage.Sets/src/mage/cards/l/LilianasIndignation.java @@ -10,6 +10,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; +import mage.util.CardUtil; import java.util.Objects; import java.util.UUID; @@ -59,7 +60,7 @@ class LilianasIndignationEffect extends OneShotEffect { if (controller == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue < 1) { return true; } diff --git a/Mage.Sets/src/mage/cards/l/LinSivviDefiantHero.java b/Mage.Sets/src/mage/cards/l/LinSivviDefiantHero.java index 8e8d7eaf360..1053d99d7e8 100644 --- a/Mage.Sets/src/mage/cards/l/LinSivviDefiantHero.java +++ b/Mage.Sets/src/mage/cards/l/LinSivviDefiantHero.java @@ -1,7 +1,6 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -21,6 +20,9 @@ import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInYourGraveyard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -91,7 +93,7 @@ class LinSivviDefiantHeroEffect extends OneShotEffect { return false; } - int xCost = source.getManaCostsToPay().getX(); + int xCost = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterPermanentCard filter = new FilterPermanentCard("Rebel permanent card with mana value " + xCost + " or less"); filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xCost + 1)); diff --git a/Mage.Sets/src/mage/cards/l/LogicKnot.java b/Mage.Sets/src/mage/cards/l/LogicKnot.java index c6daf3e9695..5b2902a354d 100644 --- a/Mage.Sets/src/mage/cards/l/LogicKnot.java +++ b/Mage.Sets/src/mage/cards/l/LogicKnot.java @@ -2,7 +2,7 @@ package mage.cards.l; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.keyword.DelveAbility; import mage.cards.CardImpl; @@ -24,7 +24,7 @@ public final class LogicKnot extends CardImpl { this.addAbility(new DelveAbility()); // Counter target spell unless its controller pays {X}. - this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetSpell()); } diff --git a/Mage.Sets/src/mage/cards/l/LongRest.java b/Mage.Sets/src/mage/cards/l/LongRest.java index 2efba798956..04e84e63d25 100644 --- a/Mage.Sets/src/mage/cards/l/LongRest.java +++ b/Mage.Sets/src/mage/cards/l/LongRest.java @@ -1,9 +1,5 @@ package mage.cards.l; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileSpellEffect; @@ -18,6 +14,11 @@ import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; /** * @@ -89,7 +90,7 @@ enum LongRestAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); - ability.addTarget(new LongRestTarget(ability.getManaCostsToPay().getX())); + ability.addTarget(new LongRestTarget(CardUtil.getSourceCostsTag(game, ability, "X", 0))); } } diff --git a/Mage.Sets/src/mage/cards/l/LunarFrenzy.java b/Mage.Sets/src/mage/cards/l/LunarFrenzy.java index 82240f08d69..ec15f4d592e 100644 --- a/Mage.Sets/src/mage/cards/l/LunarFrenzy.java +++ b/Mage.Sets/src/mage/cards/l/LunarFrenzy.java @@ -1,6 +1,6 @@ package mage.cards.l; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -24,7 +24,7 @@ public final class LunarFrenzy extends CardImpl { // Target creature you control gets +X/+0 and gains first strike and trample until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect( - ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn + GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn ).setText("target creature you control gets +X/+0")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect( FirstStrikeAbility.getInstance(), Duration.EndOfTurn diff --git a/Mage.Sets/src/mage/cards/l/LuxuriousLibation.java b/Mage.Sets/src/mage/cards/l/LuxuriousLibation.java index 8d1a47af15b..10b021d39cb 100644 --- a/Mage.Sets/src/mage/cards/l/LuxuriousLibation.java +++ b/Mage.Sets/src/mage/cards/l/LuxuriousLibation.java @@ -1,6 +1,6 @@ package mage.cards.l; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -22,7 +22,7 @@ public final class LuxuriousLibation extends CardImpl { // Target creature gets +X/+X until end of turn. Create a 1/1 green and white Citizen creature token. this.getSpellAbility().addEffect(new BoostTargetEffect( - ManacostVariableValue.REGULAR, ManacostVariableValue.REGULAR, Duration.EndOfTurn + GetXValue.instance, GetXValue.instance, Duration.EndOfTurn )); this.getSpellAbility().addEffect(new CreateTokenEffect(new CitizenGreenWhiteToken())); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/m/MageRingNetwork.java b/Mage.Sets/src/mage/cards/m/MageRingNetwork.java index 642187e2ef8..b92d5aa6bf4 100644 --- a/Mage.Sets/src/mage/cards/m/MageRingNetwork.java +++ b/Mage.Sets/src/mage/cards/m/MageRingNetwork.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.abilities.mana.DynamicManaAbility; @@ -39,7 +39,7 @@ public final class MageRingNetwork extends CardImpl { // {T}, Remove any number of storage counters from Mage-Ring Network: Add {C} for each storage counter removed this way. ability = new DynamicManaAbility( Mana.ColorlessMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {C} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/m/Magmaquake.java b/Mage.Sets/src/mage/cards/m/Magmaquake.java index 4bada2e85c3..27ed62d96f0 100644 --- a/Mage.Sets/src/mage/cards/m/Magmaquake.java +++ b/Mage.Sets/src/mage/cards/m/Magmaquake.java @@ -2,7 +2,7 @@ package mage.cards.m; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -33,7 +33,7 @@ public final class Magmaquake extends CardImpl { // Magmaquake deals X damage to each creature without flying and each planeswalker. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filter)); } private Magmaquake(final Magmaquake card) { diff --git a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java index c0d3ca4c69b..60d904fa1f9 100644 --- a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java +++ b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java @@ -1,7 +1,7 @@ package mage.cards.m; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.effects.common.TapTargetEffect; @@ -37,7 +37,7 @@ public final class MaliciousAdvice extends CardImpl { Effect effect = new TapTargetEffect(); effect.setText("Tap X target artifacts, creatures, and/or lands"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPermanent(filter)); this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } diff --git a/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java b/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java index 7e8abd78a7b..c6b1fb11ff2 100644 --- a/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java +++ b/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java @@ -12,7 +12,7 @@ import mage.abilities.costs.VariableCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; import mage.abilities.dynamicvalue.common.ManaSpentToCastCount; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -55,14 +55,14 @@ public final class MarathWillOfTheWild extends CardImpl { this.addAbility(new EntersBattlefieldAbility(effect)); // {X}, Remove X +1/+1 counters from Marath: Choose one - Put X +1/+1 counters on target creature; - effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), ManacostVariableValue.REGULAR); + effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), GetXValue.instance); effect.setText("Put X +1/+1 counters on target creature"); Ability ability = new SimpleActivatedAbility(effect, new ManaCostsImpl<>("{X}")); ability.addCost(new MarathWillOfTheWildRemoveCountersCost()); ability.addTarget(new TargetCreaturePermanent()); // or Marath deals X damage to any target; - Mode mode = new Mode(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + Mode mode = new Mode(new DamageTargetEffect(GetXValue.instance)); mode.addTarget(new TargetAnyTarget()); ability.addMode(mode); @@ -110,7 +110,7 @@ class MarathWillOfTheWildCreateTokenEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - int amount = ManacostVariableValue.REGULAR.calculate(game, source, this); + int amount = GetXValue.instance.calculate(game, source, this); Token token = new MarathWillOfTheWildElementalToken(); token.setPower(amount); token.setToughness(amount); @@ -143,7 +143,7 @@ class MarathWillOfTheWildRemoveCountersCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { - int amount = ManacostVariableValue.REGULAR.calculate(game, ability, null); + int amount = GetXValue.instance.calculate(game, ability, null); Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null && permanent.getCounters(game).getCount(CounterType.P1P1) >= amount) { permanent.removeCounters(CounterType.P1P1.getName(), amount, source, game); diff --git a/Mage.Sets/src/mage/cards/m/MarchOfRecklessJoy.java b/Mage.Sets/src/mage/cards/m/MarchOfRecklessJoy.java index 62c57a2d779..78d3dd1e562 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfRecklessJoy.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfRecklessJoy.java @@ -78,7 +78,7 @@ class MarchOfRecklessJoyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 1 || player.getLibrary().size() < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/m/MarchOfTheCanonized.java b/Mage.Sets/src/mage/cards/m/MarchOfTheCanonized.java index e12aff77d4f..57846af4e43 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfTheCanonized.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfTheCanonized.java @@ -7,7 +7,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.IntCompareCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.DevotionCount; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -27,7 +27,7 @@ public final class MarchOfTheCanonized extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{X}{W}{W}"); // When March of the Canonized enters the battlefield, create X 1/1 white Vampire creature tokens with lifelink. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new IxalanVampireToken(), ManacostVariableValue.ETB))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new IxalanVampireToken(), GetXValue.instance))); // At the beginning of your upkeep, if your devotion to white and black is seven or greater, create a 4/3 white and black Vampire Demon creature token with flying. this.addAbility(new ConditionalInterveningIfTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java b/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java index 5a88761ebb9..7de904d701d 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java @@ -1,7 +1,7 @@ package mage.cards.m; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.ConvokeAbility; import mage.cards.CardImpl; @@ -24,7 +24,7 @@ public final class MarchOfTheMultitudes extends CardImpl { // Create X 1/1 white Soldier creature tokens with lifelink. this.getSpellAbility().addEffect(new CreateTokenEffect( new SoldierLifelinkToken(), - ManacostVariableValue.REGULAR + GetXValue.instance )); } diff --git a/Mage.Sets/src/mage/cards/m/MarchOfWretchedSorrow.java b/Mage.Sets/src/mage/cards/m/MarchOfWretchedSorrow.java index 3c61d72da59..0881d123130 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfWretchedSorrow.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfWretchedSorrow.java @@ -2,7 +2,7 @@ package mage.cards.m; import mage.ObjectColor; import mage.abilities.costs.costadjusters.ExileCardsFromHandAdjuster; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -32,8 +32,8 @@ public final class MarchOfWretchedSorrow extends CardImpl { ExileCardsFromHandAdjuster.addAdjusterAndMessage(this, filter); // March of Wretched Sorrow deals X damage to target creature or planeswalker and you gain X life. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR).concatBy("and")); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance).concatBy("and")); this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); } diff --git a/Mage.Sets/src/mage/cards/m/MartialCoup.java b/Mage.Sets/src/mage/cards/m/MartialCoup.java index 0f02d894908..e968a0201e1 100644 --- a/Mage.Sets/src/mage/cards/m/MartialCoup.java +++ b/Mage.Sets/src/mage/cards/m/MartialCoup.java @@ -1,8 +1,6 @@ package mage.cards.m; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -13,6 +11,10 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.SoldierToken; +import mage.util.CardUtil; + +import java.util.List; +import java.util.UUID; /** * @@ -57,7 +59,7 @@ class MartialCoupEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); token.putOntoBattlefield(amount, game, source, source.getControllerId()); List tokens = token.getLastAddedTokenIds(); if (amount > 4) { diff --git a/Mage.Sets/src/mage/cards/m/MaskOfTheJadecrafter.java b/Mage.Sets/src/mage/cards/m/MaskOfTheJadecrafter.java index 30f037ed55b..b29bb19a0f6 100644 --- a/Mage.Sets/src/mage/cards/m/MaskOfTheJadecrafter.java +++ b/Mage.Sets/src/mage/cards/m/MaskOfTheJadecrafter.java @@ -13,6 +13,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.GolemXXToken; +import mage.util.CardUtil; import java.util.UUID; @@ -64,6 +65,6 @@ class MaskOfTheJadecrafterEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - return new GolemXXToken(source.getManaCostsToPay().getX()).putOntoBattlefield(1, game, source); + return new GolemXXToken(CardUtil.getSourceCostsTag(game, source, "X", 0)).putOntoBattlefield(1, game, source); } } diff --git a/Mage.Sets/src/mage/cards/m/Meltdown.java b/Mage.Sets/src/mage/cards/m/Meltdown.java index 84671781ee3..656c5d3f792 100644 --- a/Mage.Sets/src/mage/cards/m/Meltdown.java +++ b/Mage.Sets/src/mage/cards/m/Meltdown.java @@ -1,7 +1,6 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,6 +9,9 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -54,7 +56,7 @@ class MeltdownEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { for (Permanent permanent : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) { - if (permanent != null && permanent.isArtifact(game) && permanent.getManaValue() <= source.getManaCostsToPay().getX()) { + if (permanent != null && permanent.isArtifact(game) && permanent.getManaValue() <= CardUtil.getSourceCostsTag(game, source, "X", 0)) { permanent.destroy(source, game, false); } } diff --git a/Mage.Sets/src/mage/cards/m/MercadianBazaar.java b/Mage.Sets/src/mage/cards/m/MercadianBazaar.java index a7aee261376..b0122d7d889 100644 --- a/Mage.Sets/src/mage/cards/m/MercadianBazaar.java +++ b/Mage.Sets/src/mage/cards/m/MercadianBazaar.java @@ -9,7 +9,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class MercadianBazaar extends CardImpl { // {tap}, Remove any number of storage counters from Mercadian Bazaar: Add {R} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.RedMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {R} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/m/MercadianLift.java b/Mage.Sets/src/mage/cards/m/MercadianLift.java index 4bed0f24e0f..c05150145ed 100644 --- a/Mage.Sets/src/mage/cards/m/MercadianLift.java +++ b/Mage.Sets/src/mage/cards/m/MercadianLift.java @@ -1,9 +1,7 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; @@ -22,6 +20,9 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInHand; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -74,12 +75,7 @@ class MercadianLiftEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int numberOfCounters = 0; - for (Cost cost : source.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - numberOfCounters = ((RemoveVariableCountersSourceCost) cost).getAmount(); - } - } + int numberOfCounters = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCreatureCard filter = new FilterCreatureCard(); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, numberOfCounters)); filter.setMessage("creature card with mana value " + numberOfCounters); diff --git a/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java b/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java index 67926553b6e..75f86ddc779 100644 --- a/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java +++ b/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java @@ -23,6 +23,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetControlledPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -79,14 +80,7 @@ class MerchantsDockhandEffect extends OneShotEffect { return false; } - int xValue = source.getManaCostsToPay().getX(); - - for (Cost cost : source.getCosts()) { - if (cost instanceof TapXTargetCost) { - xValue = ((TapXTargetCost) cost).getAmount(); - break; - } - } + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); controller.lookAtCards(sourceObject.getIdName(), cards, game); diff --git a/Mage.Sets/src/mage/cards/m/MetathranAerostat.java b/Mage.Sets/src/mage/cards/m/MetathranAerostat.java index 792a3bf82ea..70dbe900df6 100644 --- a/Mage.Sets/src/mage/cards/m/MetathranAerostat.java +++ b/Mage.Sets/src/mage/cards/m/MetathranAerostat.java @@ -1,6 +1,5 @@ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -8,17 +7,20 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -74,7 +76,7 @@ class MetathranAerostatEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCreatureCard filter = new FilterCreatureCard("a creature with mana value " + xValue); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); if (new PutCardFromHandOntoBattlefieldEffect(filter).apply(game, source)) { diff --git a/Mage.Sets/src/mage/cards/m/MeteorShower.java b/Mage.Sets/src/mage/cards/m/MeteorShower.java index 10598994c9d..bef6bc4aaf1 100644 --- a/Mage.Sets/src/mage/cards/m/MeteorShower.java +++ b/Mage.Sets/src/mage/cards/m/MeteorShower.java @@ -4,7 +4,7 @@ package mage.cards.m; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.IntPlusDynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageMultiEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -21,7 +21,7 @@ public final class MeteorShower extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{R}"); // Meteor Shower deals X plus 1 damage divided as you choose among any number of targets. - DynamicValue xValue = new IntPlusDynamicValue(1, ManacostVariableValue.REGULAR); + DynamicValue xValue = new IntPlusDynamicValue(1, GetXValue.instance); this.getSpellAbility().addEffect(new DamageMultiEffect(xValue)); this.getSpellAbility().addTarget(new TargetAnyTargetAmount(xValue)); } diff --git a/Mage.Sets/src/mage/cards/m/MindGrind.java b/Mage.Sets/src/mage/cards/m/MindGrind.java index aa61e4cd911..dd9940fa56f 100644 --- a/Mage.Sets/src/mage/cards/m/MindGrind.java +++ b/Mage.Sets/src/mage/cards/m/MindGrind.java @@ -1,21 +1,19 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.VariableCost; import mage.abilities.costs.mana.VariableManaCost; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; +import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -64,7 +62,7 @@ class MindGrindEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/m/MindShatter.java b/Mage.Sets/src/mage/cards/m/MindShatter.java index 788a9550213..6f2dca5c55c 100644 --- a/Mage.Sets/src/mage/cards/m/MindShatter.java +++ b/Mage.Sets/src/mage/cards/m/MindShatter.java @@ -2,7 +2,7 @@ package mage.cards.m; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class MindShatter extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{B}{B}"); // Target player discards X cards at random. - this.getSpellAbility().addEffect(new DiscardTargetEffect(ManacostVariableValue.REGULAR, true)); + this.getSpellAbility().addEffect(new DiscardTargetEffect(GetXValue.instance, true)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/m/MindSpring.java b/Mage.Sets/src/mage/cards/m/MindSpring.java index fa71768f053..bd2ea9b3802 100644 --- a/Mage.Sets/src/mage/cards/m/MindSpring.java +++ b/Mage.Sets/src/mage/cards/m/MindSpring.java @@ -3,7 +3,7 @@ package mage.cards.m; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,7 +18,7 @@ public final class MindSpring extends CardImpl { public MindSpring(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{U}"); - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); } private MindSpring(final MindSpring card) { diff --git a/Mage.Sets/src/mage/cards/m/MindTwist.java b/Mage.Sets/src/mage/cards/m/MindTwist.java index c38398af0d8..bd68da24b68 100644 --- a/Mage.Sets/src/mage/cards/m/MindTwist.java +++ b/Mage.Sets/src/mage/cards/m/MindTwist.java @@ -2,7 +2,7 @@ package mage.cards.m; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.discard.DiscardTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,7 +20,7 @@ public final class MindTwist extends CardImpl { // Target player discards X cards at random. - this.getSpellAbility().addEffect(new DiscardTargetEffect(ManacostVariableValue.REGULAR, true)); + this.getSpellAbility().addEffect(new DiscardTargetEffect(GetXValue.instance, true)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/m/MindWarp.java b/Mage.Sets/src/mage/cards/m/MindWarp.java index 634a63c3f18..8be54dd06d4 100644 --- a/Mage.Sets/src/mage/cards/m/MindWarp.java +++ b/Mage.Sets/src/mage/cards/m/MindWarp.java @@ -1,6 +1,6 @@ package mage.cards.m; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.discard.LookTargetHandChooseDiscardEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,7 +18,7 @@ public final class MindWarp extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{3}{B}"); // Look at target player's hand and choose X cards from it. That player discards those cards. - this.getSpellAbility().addEffect(new LookTargetHandChooseDiscardEffect(false, ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new LookTargetHandChooseDiscardEffect(false, GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/m/Mindswipe.java b/Mage.Sets/src/mage/cards/m/Mindswipe.java index 312fba4555b..c3a7762b7b8 100644 --- a/Mage.Sets/src/mage/cards/m/Mindswipe.java +++ b/Mage.Sets/src/mage/cards/m/Mindswipe.java @@ -2,7 +2,7 @@ package mage.cards.m; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CounterUnlessPaysEffect; @@ -28,7 +28,7 @@ public final class Mindswipe extends CardImpl { // Counter target spell unless its controller pays {X}. Mindswipe deals X damage to that spell's controller. - Effect effect = new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR); + Effect effect = new CounterUnlessPaysEffect(GetXValue.instance); effect.setText("Counter target spell unless its controller pays {X}."); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetSpell()); @@ -73,7 +73,7 @@ class MindswipeEffect extends OneShotEffect { Spell spell = (Spell) object; Player spellController = game.getPlayer(spell.getControllerId()); if (spellController != null) { - int damage = ManacostVariableValue.REGULAR.calculate(game, source, this); + int damage = GetXValue.instance.calculate(game, source, this); spellController.damage(damage, source.getSourceId(), source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/m/MinscBelovedRanger.java b/Mage.Sets/src/mage/cards/m/MinscBelovedRanger.java index 7dd30460b1f..c403188197a 100644 --- a/Mage.Sets/src/mage/cards/m/MinscBelovedRanger.java +++ b/Mage.Sets/src/mage/cards/m/MinscBelovedRanger.java @@ -15,6 +15,7 @@ import mage.constants.*; import mage.game.Game; import mage.game.permanent.token.BooToken; import mage.target.common.TargetControlledCreaturePermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -72,7 +73,7 @@ class MinscBelovedRangerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); game.addEffect(new SetBasePowerToughnessTargetEffect(xValue, xValue, Duration.EndOfTurn), source); game.addEffect(new AddCardSubTypeTargetEffect(SubType.GIANT, Duration.EndOfTurn), source); return true; diff --git a/Mage.Sets/src/mage/cards/m/MirrorEntity.java b/Mage.Sets/src/mage/cards/m/MirrorEntity.java index 0435a4e80ce..25447c05cd1 100644 --- a/Mage.Sets/src/mage/cards/m/MirrorEntity.java +++ b/Mage.Sets/src/mage/cards/m/MirrorEntity.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.VariableCostType; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.continuous.SetBasePowerToughnessAllEffect; import mage.abilities.keyword.ChangelingAbility; @@ -37,7 +37,7 @@ public final class MirrorEntity extends CardImpl { // {X}: Until end of turn, creatures you control have base power and toughness X/X and gain all creature types. Ability ability = new SimpleActivatedAbility(new SetBasePowerToughnessAllEffect( - ManacostVariableValue.REGULAR, ManacostVariableValue.REGULAR, + GetXValue.instance, GetXValue.instance, Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES ).setText("Until end of turn, creatures you control have base power and toughness X/X"), new VariableManaCost(VariableCostType.NORMAL)); ability.addEffect(new MirrorEntityEffect()); diff --git a/Mage.Sets/src/mage/cards/m/MishrasCommand.java b/Mage.Sets/src/mage/cards/m/MishrasCommand.java index 4c4d496db50..fc4c5de032d 100644 --- a/Mage.Sets/src/mage/cards/m/MishrasCommand.java +++ b/Mage.Sets/src/mage/cards/m/MishrasCommand.java @@ -2,7 +2,7 @@ package mage.cards.m; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -19,6 +19,7 @@ import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetPlaneswalkerPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -40,17 +41,17 @@ public final class MishrasCommand extends CardImpl { // * This spell deals X damage to target creature. this.getSpellAbility().addMode(new Mode(new DamageTargetEffect( - ManacostVariableValue.REGULAR, "this spell" + GetXValue.instance, "this spell" )).addTarget(new TargetCreaturePermanent())); // * This spell deals X damage to target planeswalker. this.getSpellAbility().addMode(new Mode(new DamageTargetEffect( - ManacostVariableValue.REGULAR, "this spell" + GetXValue.instance, "this spell" )).addTarget(new TargetPlaneswalkerPermanent())); // * Target creature gets +X/+0 and gains haste until end of turn. this.getSpellAbility().addMode(new Mode(new BoostTargetEffect( - ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn + GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn ).setText("target creature gets +X/+0")).addEffect(new GainAbilityTargetEffect( HasteAbility.getInstance(), Duration.EndOfTurn ).setText("and gains haste until end of turn")).addTarget(new TargetCreaturePermanent())); @@ -86,7 +87,7 @@ class MishrasCommandEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player != null && xValue > 0) { player.drawCards(player.discard( 0, xValue, false, source, game diff --git a/Mage.Sets/src/mage/cards/m/Molder.java b/Mage.Sets/src/mage/cards/m/Molder.java index 2710f98ad14..ca98b05ead8 100644 --- a/Mage.Sets/src/mage/cards/m/Molder.java +++ b/Mage.Sets/src/mage/cards/m/Molder.java @@ -1,7 +1,7 @@ package mage.cards.m; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -23,7 +23,7 @@ public final class Molder extends CardImpl { // Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life. this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target artifact or enchantment with mana value X. It can't be regenerated", true)); - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); } diff --git a/Mage.Sets/src/mage/cards/m/MoltenDisaster.java b/Mage.Sets/src/mage/cards/m/MoltenDisaster.java index d5ed2814f18..cbff8a2c0c0 100644 --- a/Mage.Sets/src/mage/cards/m/MoltenDisaster.java +++ b/Mage.Sets/src/mage/cards/m/MoltenDisaster.java @@ -3,7 +3,7 @@ package mage.cards.m; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageEverythingEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.KickerAbility; @@ -45,7 +45,7 @@ public final class MoltenDisaster extends CardImpl { this.addAbility(new KickerAbility("{R}")); // Molten Disaster deals X damage to each creature without flying and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageEverythingEffect(GetXValue.instance, filter)); } private MoltenDisaster(final MoltenDisaster card) { diff --git a/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java b/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java index c96b9641021..e09fb62c2b9 100644 --- a/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java +++ b/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java @@ -7,7 +7,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.mana.ColorlessManaAbility; @@ -36,7 +36,7 @@ public final class MoltenSlagheap extends CardImpl { this.addAbility(ability); // {1}, Remove X storage counters from Molten Slagheap: Add X mana in any combination of {B} and/or {R}. ability = new SimpleManaAbility(Zone.BATTLEFIELD, - new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, + new AddManaInAnyCombinationEffect(GetXValue.instance, new CountersSourceCount(CounterType.STORAGE), ColoredManaSymbol.B, ColoredManaSymbol.R), new GenericManaCost(1)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/m/MultipleChoice.java b/Mage.Sets/src/mage/cards/m/MultipleChoice.java index 9d1db65134e..80d14f10572 100644 --- a/Mage.Sets/src/mage/cards/m/MultipleChoice.java +++ b/Mage.Sets/src/mage/cards/m/MultipleChoice.java @@ -15,6 +15,7 @@ import mage.players.Player; import mage.target.TargetPermanent; import mage.target.TargetPlayer; import mage.target.common.TargetControlledCreaturePermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -68,7 +69,7 @@ class MultipleChoiceEffect extends OneShotEffect { if (controller == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue == 1 || xValue >= 4) { controller.scry(1, source, game); controller.drawCards(1, source, game); diff --git a/Mage.Sets/src/mage/cards/m/MuseVortex.java b/Mage.Sets/src/mage/cards/m/MuseVortex.java index dbfd7a95930..c9894ab1a7e 100644 --- a/Mage.Sets/src/mage/cards/m/MuseVortex.java +++ b/Mage.Sets/src/mage/cards/m/MuseVortex.java @@ -64,7 +64,7 @@ class MuseVortexEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/n/NahiriStormOfStone.java b/Mage.Sets/src/mage/cards/n/NahiriStormOfStone.java index 28fe7ece81e..37046561238 100644 --- a/Mage.Sets/src/mage/cards/n/NahiriStormOfStone.java +++ b/Mage.Sets/src/mage/cards/n/NahiriStormOfStone.java @@ -6,7 +6,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.MyTurnCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.decorator.ConditionalCostModificationEffect; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.cost.AbilitiesCostReductionControllerEffect; @@ -62,7 +62,7 @@ public final class NahiriStormOfStone extends CardImpl { this.addAbility(ability); // -X: Nahiri, Storm of Stone deals X damage to target tapped creature. - ability = new LoyaltyAbility(new DamageTargetEffect(GetXLoyaltyValue.instance)); + ability = new LoyaltyAbility(new DamageTargetEffect(GetXValue.instance)); ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/n/NahirisLithoforming.java b/Mage.Sets/src/mage/cards/n/NahirisLithoforming.java index abe16f7cc80..8e0d6198d30 100644 --- a/Mage.Sets/src/mage/cards/n/NahirisLithoforming.java +++ b/Mage.Sets/src/mage/cards/n/NahirisLithoforming.java @@ -14,6 +14,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetSacrifice; +import mage.util.CardUtil; import java.util.UUID; @@ -62,14 +63,14 @@ class NahirisLithoformingSacrificeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - if (player == null || source.getManaCostsToPay().getX() == 0) { + if (player == null || CardUtil.getSourceCostsTag(game, source, "X", 0) == 0) { return false; } int landCount = game.getBattlefield().count( TargetSacrifice.makeFilter(StaticFilters.FILTER_LAND), source.getControllerId(), source, game ); - landCount = Math.min(source.getManaCostsToPay().getX(), landCount); + landCount = Math.min(CardUtil.getSourceCostsTag(game, source, "X", 0), landCount); TargetSacrifice target = new TargetSacrifice( landCount, landCount, StaticFilters.FILTER_LAND ); @@ -83,7 +84,7 @@ class NahirisLithoformingSacrificeEffect extends OneShotEffect { } player.drawCards(counter, source, game); game.addEffect(new PlayAdditionalLandsControllerEffect( - source.getManaCostsToPay().getX(), Duration.EndOfTurn + CardUtil.getSourceCostsTag(game, source, "X", 0), Duration.EndOfTurn ), source); return true; } diff --git a/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java b/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java index 99ac69681c7..24d17a718b1 100644 --- a/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java +++ b/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java @@ -1,9 +1,11 @@ package mage.cards.n; -import mage.abilities.Ability; -import mage.abilities.costs.*; +import mage.abilities.costs.Cost; +import mage.abilities.costs.SacrificeCost; +import mage.abilities.costs.VariableCostImpl; +import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageMultiEffect; import mage.cards.CardImpl; @@ -13,8 +15,6 @@ import mage.constants.ComparisonType; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ManaValuePredicate; -import mage.game.Game; -import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreaturePermanentAmount; import java.util.UUID; @@ -41,11 +41,10 @@ public final class NahirisSacrifice extends CardImpl { this.getSpellAbility().addCost(new SacrificeXManaValueCost(filter,true)); // Nahiri’s Sacrifice deals X damage divided as you choose among any number of target creatures. - DynamicValue damage = new SacrificeXCostConvertedMana("artifact or creature"); - Effect effect = new DamageMultiEffect(damage); + Effect effect = new DamageMultiEffect(GetXValue.instance); effect.setText("{this} deals X damage divided as you choose among any number of target creatures."); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(damage)); + this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(GetXValue.instance)); } private NahirisSacrifice(final NahirisSacrifice card) { @@ -92,42 +91,3 @@ class SacrificeXManaValueCost extends VariableCostImpl implements SacrificeCost } } - -class SacrificeXCostConvertedMana implements DynamicValue { - - private final String type; - - public SacrificeXCostConvertedMana(String type) { - this.type = type; - } - - private SacrificeXCostConvertedMana(final SacrificeXCostConvertedMana value) { - this.type = value.type; - } - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (VariableCost cost : sourceAbility.getCosts().getVariableCosts()) { - if (cost instanceof SacrificeXManaValueCost) { - //Announced X Value - return cost.getAmount(); - } - } - return 0; - } - - @Override - public SacrificeXCostConvertedMana copy() { - return new SacrificeXCostConvertedMana(this); - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return "the sacrificed " + type + "'s mana value"; - } -} diff --git a/Mage.Sets/src/mage/cards/n/Nebuchadnezzar.java b/Mage.Sets/src/mage/cards/n/Nebuchadnezzar.java index b9594554644..20048051a12 100644 --- a/Mage.Sets/src/mage/cards/n/Nebuchadnezzar.java +++ b/Mage.Sets/src/mage/cards/n/Nebuchadnezzar.java @@ -15,6 +15,7 @@ import mage.constants.*; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetOpponent; +import mage.util.CardUtil; import java.util.UUID; @@ -69,7 +70,7 @@ class NebuchadnezzarEffect extends OneShotEffect { if (opponent == null || sourceObject == null || cardName.isEmpty()) { return false; } - int costX = source.getManaCostsToPay().getX(); + int costX = CardUtil.getSourceCostsTag(game, source, "X", 0); if (costX <= 0 || opponent.getHand().isEmpty()) { return true; } diff --git a/Mage.Sets/src/mage/cards/n/NecronOverlord.java b/Mage.Sets/src/mage/cards/n/NecronOverlord.java index e8ef7a3fd2f..7dcf86c23ae 100644 --- a/Mage.Sets/src/mage/cards/n/NecronOverlord.java +++ b/Mage.Sets/src/mage/cards/n/NecronOverlord.java @@ -1,26 +1,28 @@ package mage.cards.n; -import java.util.UUID; import mage.MageInt; -import mage.constants.SubType; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.Cost; +import mage.abilities.costs.VariableCostImpl; +import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.StaticFilters; +import mage.game.Game; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetOpponent; -import mage.abilities.costs.VariableCostImpl; -import mage.abilities.costs.VariableCostType; -import mage.game.Game; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -80,6 +82,6 @@ class NecronOverlordTapVariableArtifactCost extends VariableCostImpl { @Override public int announceXValue(Ability source, Game game) { - return source.getManaCostsToPay().getX(); + return CardUtil.getSourceCostsTag(game, source, "X", 0); } } diff --git a/Mage.Sets/src/mage/cards/n/NecropolisFiend.java b/Mage.Sets/src/mage/cards/n/NecropolisFiend.java index fb46ad6c84f..343aa8810e5 100644 --- a/Mage.Sets/src/mage/cards/n/NecropolisFiend.java +++ b/Mage.Sets/src/mage/cards/n/NecropolisFiend.java @@ -12,7 +12,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.VariableManaCost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -31,6 +31,7 @@ import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -53,7 +54,7 @@ public final class NecropolisFiend extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // {X}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn. - DynamicValue xValue = new SignInversionDynamicValue(ManacostVariableValue.REGULAR); + DynamicValue xValue = new SignInversionDynamicValue(GetXValue.instance); Effect effect = new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn); effect.setText("Target creature gets -X/-X until end of turn"); Ability ability = new SimpleActivatedAbility( @@ -103,7 +104,7 @@ enum NecropolisFiendTargetAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); for (Cost cost : ability.getCosts()) { if (!(cost instanceof ExileFromGraveCost)) { continue; diff --git a/Mage.Sets/src/mage/cards/n/NewFrontiers.java b/Mage.Sets/src/mage/cards/n/NewFrontiers.java index c51f92731d5..51d44d3a24d 100644 --- a/Mage.Sets/src/mage/cards/n/NewFrontiers.java +++ b/Mage.Sets/src/mage/cards/n/NewFrontiers.java @@ -5,6 +5,7 @@ import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -12,9 +13,9 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; -import mage.cards.CardsImpl; /** * @@ -59,7 +60,7 @@ class NewFrontiersEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); if (player != null && player.chooseUse(outcome, "Search your library for up to " + amount + " basic lands?", source, game)) { diff --git a/Mage.Sets/src/mage/cards/n/NightDealings.java b/Mage.Sets/src/mage/cards/n/NightDealings.java index 75c9014aa5c..20bd3f493f4 100644 --- a/Mage.Sets/src/mage/cards/n/NightDealings.java +++ b/Mage.Sets/src/mage/cards/n/NightDealings.java @@ -3,7 +3,6 @@ package mage.cards.n; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; @@ -24,6 +23,7 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -140,13 +140,7 @@ public final class NightDealings extends CardImpl { return false; } - int cmc = 0; - for (Cost cost : source.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - cmc = ((RemoveVariableCountersSourceCost) cost).getAmount(); - break; - } - } + int cmc = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCard filter = new FilterNonlandCard("nonland card with mana value " + cmc); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, cmc)); diff --git a/Mage.Sets/src/mage/cards/n/NikoAris.java b/Mage.Sets/src/mage/cards/n/NikoAris.java index b6993038de9..6ae70c73fef 100644 --- a/Mage.Sets/src/mage/cards/n/NikoAris.java +++ b/Mage.Sets/src/mage/cards/n/NikoAris.java @@ -7,7 +7,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; import mage.abilities.dynamicvalue.common.CardsDrawnThisTurnDynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -54,7 +54,7 @@ public final class NikoAris extends CardImpl { // When Niko Aris enters the battlefield, create X Shard tokens. this.addAbility(new EntersBattlefieldTriggeredAbility( - new CreateTokenEffect(new ShardToken(), ManacostVariableValue.ETB) + new CreateTokenEffect(new ShardToken(), GetXValue.instance) )); // +1: Up to one target creature you control can't be blocked this turn. Whenever that creature deals damage this turn, return it to its owner's hand. diff --git a/Mage.Sets/src/mage/cards/n/NinThePainArtist.java b/Mage.Sets/src/mage/cards/n/NinThePainArtist.java index b5571dce4a7..eb960a8fce7 100644 --- a/Mage.Sets/src/mage/cards/n/NinThePainArtist.java +++ b/Mage.Sets/src/mage/cards/n/NinThePainArtist.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DrawCardTargetControllerEffect; import mage.cards.CardImpl; @@ -35,10 +35,10 @@ public final class NinThePainArtist extends CardImpl { // {X}{U}{R}, {tap}: Nin, the Pain Artist deals X damage to target creature. That creature's controller draws X cards. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, - new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}{U}{R}")); + new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{U}{R}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent()); - ability.addEffect(new DrawCardTargetControllerEffect(ManacostVariableValue.REGULAR) + ability.addEffect(new DrawCardTargetControllerEffect(GetXValue.instance) .setText("that creature's controller draws X cards")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/n/NuclearFallout.java b/Mage.Sets/src/mage/cards/n/NuclearFallout.java index 11c6eeef06f..9073b80687c 100644 --- a/Mage.Sets/src/mage/cards/n/NuclearFallout.java +++ b/Mage.Sets/src/mage/cards/n/NuclearFallout.java @@ -2,7 +2,7 @@ package mage.cards.n; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.effects.common.counter.AddCountersPlayersEffect; import mage.cards.CardImpl; @@ -20,7 +20,7 @@ import java.util.UUID; */ public final class NuclearFallout extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, -2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, -2); public NuclearFallout(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{B}"); @@ -31,7 +31,7 @@ public final class NuclearFallout extends CardImpl { "Each creature gets twice -X/-X until end of turn" )); this.getSpellAbility().addEffect( - new AddCountersPlayersEffect(CounterType.RAD.createInstance(), ManacostVariableValue.REGULAR, TargetController.ANY) + new AddCountersPlayersEffect(CounterType.RAD.createInstance(), GetXValue.instance, TargetController.ANY) ); } diff --git a/Mage.Sets/src/mage/cards/n/NyleasIntervention.java b/Mage.Sets/src/mage/cards/n/NyleasIntervention.java index fae1b80bca7..99670ae105f 100644 --- a/Mage.Sets/src/mage/cards/n/NyleasIntervention.java +++ b/Mage.Sets/src/mage/cards/n/NyleasIntervention.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; @@ -19,6 +19,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AbilityPredicate; import mage.game.Game; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -33,7 +34,7 @@ public final class NyleasIntervention extends CardImpl { filter.add(new AbilityPredicate(FlyingAbility.class)); } - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public NyleasIntervention(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}{G}"); @@ -76,7 +77,7 @@ class NyleasInterventionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); return new SearchLibraryPutInHandEffect(new TargetCardInLibrary( 0, xValue, StaticFilters.FILTER_CARD_LAND ), true).apply(game, source); diff --git a/Mage.Sets/src/mage/cards/o/OccultEpiphany.java b/Mage.Sets/src/mage/cards/o/OccultEpiphany.java index ed9e8d2a8ef..97514475f90 100644 --- a/Mage.Sets/src/mage/cards/o/OccultEpiphany.java +++ b/Mage.Sets/src/mage/cards/o/OccultEpiphany.java @@ -9,6 +9,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.SpiritWhiteToken; import mage.players.Player; +import mage.util.CardUtil; import java.util.Collection; import java.util.UUID; @@ -55,7 +56,7 @@ class OccultEpiphanyEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/o/OldStickfingers.java b/Mage.Sets/src/mage/cards/o/OldStickfingers.java index c23f0d21b4e..b791d663517 100644 --- a/Mage.Sets/src/mage/cards/o/OldStickfingers.java +++ b/Mage.Sets/src/mage/cards/o/OldStickfingers.java @@ -13,6 +13,7 @@ import mage.constants.*; import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.LinkedHashSet; import java.util.Set; @@ -69,7 +70,7 @@ class OldStickfingersEffect extends OneShotEffect { if (!(obj instanceof SpellAbility)) { return false; } - int xValue = ((SpellAbility) obj).getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ((SpellAbility) obj), "X", 0); if (xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/o/OonaQueenOfTheFae.java b/Mage.Sets/src/mage/cards/o/OonaQueenOfTheFae.java index 940a550e3aa..44c222a1e5f 100644 --- a/Mage.Sets/src/mage/cards/o/OonaQueenOfTheFae.java +++ b/Mage.Sets/src/mage/cards/o/OonaQueenOfTheFae.java @@ -14,6 +14,7 @@ import mage.game.Game; import mage.game.permanent.token.OonaQueenFaerieRogueToken; import mage.players.Player; import mage.target.common.TargetOpponent; +import mage.util.CardUtil; import java.util.UUID; @@ -76,7 +77,7 @@ class OonaQueenOfTheFaeEffect extends OneShotEffect { } int cardsWithColor = 0; Cards cardsToExile = new CardsImpl(); - cardsToExile.addAllCards(opponent.getLibrary().getTopCards(game, source.getManaCostsToPay().getX())); + cardsToExile.addAllCards(opponent.getLibrary().getTopCards(game, CardUtil.getSourceCostsTag(game, source, "X", 0))); for (Card card : cardsToExile.getCards(game)) { if (card != null && card.getColor(game).contains(choice.getColor())) { diff --git a/Mage.Sets/src/mage/cards/o/OozeFlux.java b/Mage.Sets/src/mage/cards/o/OozeFlux.java index f1e70df4654..b5638031a8a 100644 --- a/Mage.Sets/src/mage/cards/o/OozeFlux.java +++ b/Mage.Sets/src/mage/cards/o/OozeFlux.java @@ -1,10 +1,8 @@ package mage.cards.o; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.RemoveVariableCountersTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; @@ -18,6 +16,9 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.token.OozeToken; import mage.game.permanent.token.Token; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -66,13 +67,7 @@ class OozeFluxCreateTokenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = 0; - for (Cost cost : source.getCosts()) { - if (cost instanceof RemoveVariableCountersTargetCost) { - xValue = ((RemoveVariableCountersTargetCost) cost).getAmount(); - break; - } - } + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Token tokenCopy = token.copy(); tokenCopy.getAbilities().newId(); tokenCopy.getPower().setModifiedBaseValue(xValue); diff --git a/Mage.Sets/src/mage/cards/o/OpenTheWay.java b/Mage.Sets/src/mage/cards/o/OpenTheWay.java index 68c4896fc8b..52f49155a0a 100644 --- a/Mage.Sets/src/mage/cards/o/OpenTheWay.java +++ b/Mage.Sets/src/mage/cards/o/OpenTheWay.java @@ -75,7 +75,7 @@ class OpenTheWayEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/o/OracleOfNectars.java b/Mage.Sets/src/mage/cards/o/OracleOfNectars.java index d3cdb1535e2..97dba68e3db 100644 --- a/Mage.Sets/src/mage/cards/o/OracleOfNectars.java +++ b/Mage.Sets/src/mage/cards/o/OracleOfNectars.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -30,7 +30,7 @@ public final class OracleOfNectars extends CardImpl { this.toughness = new MageInt(2); // {X}, {tap}: You gain X life. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(GetXValue.instance), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OrcishSettlers.java b/Mage.Sets/src/mage/cards/o/OrcishSettlers.java index 2c517841ee5..0b868203a44 100644 --- a/Mage.Sets/src/mage/cards/o/OrcishSettlers.java +++ b/Mage.Sets/src/mage/cards/o/OrcishSettlers.java @@ -1,8 +1,6 @@ package mage.cards.o; -import java.util.List; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -13,13 +11,17 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetLandPermanent; +import mage.util.CardUtil; + +import java.util.List; +import java.util.UUID; /** * @@ -70,7 +72,7 @@ class OrcishSettlersEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); if (amount == 0) { return false; } diff --git a/Mage.Sets/src/mage/cards/o/OrcusPrinceOfUndeath.java b/Mage.Sets/src/mage/cards/o/OrcusPrinceOfUndeath.java index 518cd746f61..06463aad899 100644 --- a/Mage.Sets/src/mage/cards/o/OrcusPrinceOfUndeath.java +++ b/Mage.Sets/src/mage/cards/o/OrcusPrinceOfUndeath.java @@ -7,7 +7,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; @@ -90,7 +90,7 @@ class OrcusPrinceOfUndeathBoostEffect extends OneShotEffect { if (controller == null) { return false; } - int xValue = ManacostVariableValue.ETB.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); game.addEffect(new BoostAllEffect(-xValue, -xValue, Duration.EndOfTurn, true), source); controller.loseLife(xValue, game, source, false); return true; @@ -141,7 +141,7 @@ enum OrcusPrinceOfUndeathAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { - int xValue = ManacostVariableValue.ETB.calculate(game, ability, null); + int xValue = GetXValue.instance.calculate(game, ability, null); FilterCreatureCard filter = new FilterCreatureCard("creature cards with total mana value " + xValue + " or less from your graveyard"); for (Mode mode : ability.getModes().values()) { boolean setTarget = false; diff --git a/Mage.Sets/src/mage/cards/o/OsgirTheReconstructor.java b/Mage.Sets/src/mage/cards/o/OsgirTheReconstructor.java index da8cb6e5599..72bb088da9a 100644 --- a/Mage.Sets/src/mage/cards/o/OsgirTheReconstructor.java +++ b/Mage.Sets/src/mage/cards/o/OsgirTheReconstructor.java @@ -7,13 +7,10 @@ import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.CostAdjuster; -import mage.abilities.costs.VariableCost; import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -25,17 +22,13 @@ import mage.constants.*; import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.filter.common.FilterArtifactCard; -import mage.filter.common.FilterControlledArtifactPermanent; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; -import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetControlledPermanent; -import mage.target.common.TargetCreaturePermanent; -import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -89,7 +82,7 @@ enum OsgirTheReconstructorCostAdjuster implements CostAdjuster { @Override public void adjustCosts(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); Player controller = game.getPlayer(ability.getControllerId()); if (controller == null) { return; diff --git a/Mage.Sets/src/mage/cards/o/OutrageousRobbery.java b/Mage.Sets/src/mage/cards/o/OutrageousRobbery.java index f4cd5e3739e..01754959114 100644 --- a/Mage.Sets/src/mage/cards/o/OutrageousRobbery.java +++ b/Mage.Sets/src/mage/cards/o/OutrageousRobbery.java @@ -1,6 +1,6 @@ package mage.cards.o; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.ExileFaceDownTopNLibraryYouMayPlayAsLongAsExiledTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -21,7 +21,7 @@ public final class OutrageousRobbery extends CardImpl { // Target opponent exiles the top X cards of their library face down. You may look at and play those cards for as long as they remain exiled. If you cast a spell this way, you may spend mana as though it were mana of any type to cast it. this.getSpellAbility().addEffect( new ExileFaceDownTopNLibraryYouMayPlayAsLongAsExiledTargetEffect( - false, CastManaAdjustment.AS_THOUGH_ANY_MANA_TYPE, ManacostVariableValue.REGULAR + false, CastManaAdjustment.AS_THOUGH_ANY_MANA_TYPE, GetXValue.instance ).setText("Target opponent exiles the top X cards of their library face down. " + "You may look at and play those cards for as long as they remain exiled. " + "If you cast a spell this way, you may spend mana as though it were mana of any type to cast it.") diff --git a/Mage.Sets/src/mage/cards/o/Overrule.java b/Mage.Sets/src/mage/cards/o/Overrule.java index e2e0852c6f8..c793ea7418f 100644 --- a/Mage.Sets/src/mage/cards/o/Overrule.java +++ b/Mage.Sets/src/mage/cards/o/Overrule.java @@ -2,7 +2,7 @@ package mage.cards.o; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -20,11 +20,11 @@ public final class Overrule extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}{U}"); // Counter target spell unless its controller pays {X}. - this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetSpell()); // You gain X life. - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance)); } private Overrule(final Overrule card) { diff --git a/Mage.Sets/src/mage/cards/p/PainKami.java b/Mage.Sets/src/mage/cards/p/PainKami.java index 5216627200e..329e693c226 100644 --- a/Mage.Sets/src/mage/cards/p/PainKami.java +++ b/Mage.Sets/src/mage/cards/p/PainKami.java @@ -8,7 +8,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +28,7 @@ public final class PainKami extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR, "it"), new ManaCostsImpl<>("{X}{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance, "it"), new ManaCostsImpl<>("{X}{R}")); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/p/Panacea.java b/Mage.Sets/src/mage/cards/p/Panacea.java index aec61e49670..4c002b12623 100644 --- a/Mage.Sets/src/mage/cards/p/Panacea.java +++ b/Mage.Sets/src/mage/cards/p/Panacea.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.PreventDamageToTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -25,7 +25,7 @@ public final class Panacea extends CardImpl { // {X}{X}, {tap}: Prevent the next X damage that would be dealt to any target this turn. Ability ability = new SimpleActivatedAbility( - new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, ManacostVariableValue.REGULAR), + new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, GetXValue.instance), new ManaCostsImpl<>("{X}{X}") ); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/p/PanopticMirror.java b/Mage.Sets/src/mage/cards/p/PanopticMirror.java index 9587af8e37c..baf35508b62 100644 --- a/Mage.Sets/src/mage/cards/p/PanopticMirror.java +++ b/Mage.Sets/src/mage/cards/p/PanopticMirror.java @@ -66,8 +66,8 @@ class PanopticMirrorExileEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - source.getManaCostsToPay().getX(); - int count = source.getManaCostsToPay().getX(); + CardUtil.getSourceCostsTag(game, source, "X", 0); + int count = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterInstantOrSorceryCard filter = new FilterInstantOrSorceryCard("instant or sorcery card with mana value equal to " + count); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, count)); diff --git a/Mage.Sets/src/mage/cards/p/PathOfTheGhosthunter.java b/Mage.Sets/src/mage/cards/p/PathOfTheGhosthunter.java index 93672203c01..6939ac6e850 100644 --- a/Mage.Sets/src/mage/cards/p/PathOfTheGhosthunter.java +++ b/Mage.Sets/src/mage/cards/p/PathOfTheGhosthunter.java @@ -1,6 +1,6 @@ package mage.cards.p; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.WillOfThePlaneswalkersEffect; import mage.cards.CardImpl; @@ -19,7 +19,7 @@ public final class PathOfTheGhosthunter extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{1}{W}"); // Create X 1/1 white Spirit creature tokens with flying. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), GetXValue.instance)); // Will of the Planeswalkers -- Starting with you, each player votes for planeswalk or chaos. If planeswalk gets more votes, planeswalk. If chaos gets more votes or the vote is tied, chaos ensues. this.getSpellAbility().addEffect(new WillOfThePlaneswalkersEffect()); diff --git a/Mage.Sets/src/mage/cards/p/PerniciousDeed.java b/Mage.Sets/src/mage/cards/p/PerniciousDeed.java index 27e9f7b3d94..ecb80b093a3 100644 --- a/Mage.Sets/src/mage/cards/p/PerniciousDeed.java +++ b/Mage.Sets/src/mage/cards/p/PerniciousDeed.java @@ -17,6 +17,7 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; +import mage.util.CardUtil; import java.util.UUID; @@ -69,7 +70,7 @@ class PerniciousDeedEffect extends OneShotEffect { CardType.ARTIFACT.getPredicate(), CardType.CREATURE.getPredicate(), CardType.ENCHANTMENT.getPredicate())); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); return new DestroyAllEffect(filter).apply(game, source); } diff --git a/Mage.Sets/src/mage/cards/p/PestInfestation.java b/Mage.Sets/src/mage/cards/p/PestInfestation.java index 066a8c0077e..e41a56e7b2a 100644 --- a/Mage.Sets/src/mage/cards/p/PestInfestation.java +++ b/Mage.Sets/src/mage/cards/p/PestInfestation.java @@ -2,7 +2,7 @@ package mage.cards.p; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; @@ -20,7 +20,7 @@ import java.util.UUID; */ public final class PestInfestation extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public PestInfestation(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{G}"); diff --git a/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java b/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java index 01bc8bc8e00..4f75542a530 100644 --- a/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java +++ b/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java @@ -8,7 +8,7 @@ import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -36,7 +36,7 @@ public final class PetalmaneBaku extends CardImpl { // {1}, Remove X ki counters from Petalmane Baku: Add X mana of any one color. Ability ability = new DynamicManaAbility( new Mana(0, 0, 0, 0, 0, 0, 1, 0), - RemovedCountersForCostValue.instance, + GetXValue.instance, new GenericManaCost(1), "Add X mana of any one color", true, new CountersSourceCount(CounterType.KI)); diff --git a/Mage.Sets/src/mage/cards/p/PowerSink.java b/Mage.Sets/src/mage/cards/p/PowerSink.java index 5d12222db10..3c3e8c52d0a 100644 --- a/Mage.Sets/src/mage/cards/p/PowerSink.java +++ b/Mage.Sets/src/mage/cards/p/PowerSink.java @@ -15,6 +15,7 @@ import mage.game.permanent.Permanent; import mage.game.stack.StackObject; import mage.players.Player; import mage.target.TargetSpell; +import mage.util.CardUtil; import mage.util.ManaUtil; import java.util.List; @@ -67,7 +68,7 @@ class PowerSinkCounterUnlessPaysEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source); if (player != null && controller != null && sourceObject != null) { - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); if (amount > 0) { Cost cost = ManaUtil.createManaCost(amount, true); if (player.chooseUse(Outcome.Benefit, "Pay " + cost.getText() + " to prevent?", source, game)) { diff --git a/Mage.Sets/src/mage/cards/p/PrimalMight.java b/Mage.Sets/src/mage/cards/p/PrimalMight.java index 8e73d8ffb43..0261579b899 100644 --- a/Mage.Sets/src/mage/cards/p/PrimalMight.java +++ b/Mage.Sets/src/mage/cards/p/PrimalMight.java @@ -1,6 +1,6 @@ package mage.cards.p; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.FightTargetsEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -25,7 +25,7 @@ public final class PrimalMight extends CardImpl { // Target creature you control gets +X/+X until end of turn. Then it fights up to one target creature you don’t control. this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); - this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.REGULAR, ManacostVariableValue.REGULAR, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostTargetEffect(GetXValue.instance, GetXValue.instance, Duration.EndOfTurn)); // this.getSpellAbility().addEffect(new FightTargetsEffect() .concatBy("Then") diff --git a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java index 83cff5d98c7..ebe372bff1c 100644 --- a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java +++ b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java @@ -3,7 +3,7 @@ package mage.cards.p; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeTargetEffect; @@ -25,6 +25,7 @@ import mage.target.TargetPlayer; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -37,7 +38,7 @@ public final class ProfaneCommand extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{B}"); - DynamicValue xValue = ManacostVariableValue.REGULAR; + DynamicValue xValue = GetXValue.instance; // Choose two - this.getSpellAbility().getModes().setMinModes(2); this.getSpellAbility().getModes().setMaxModes(2); @@ -83,7 +84,7 @@ enum ProfaneCommandAdjuster implements TargetAdjuster { public void adjustTargets(Ability ability, Game game) { // adjust targets is called for every selected mode Mode mode = ability.getModes().getMode(); - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); for (Effect effect : mode.getEffects()) { if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) { mode.getTargets().clear(); diff --git a/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java b/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java index bf0f7e47cc1..7b7111ac3e3 100644 --- a/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java +++ b/Mage.Sets/src/mage/cards/p/ProgenitorExarch.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TransformTargetEffect; import mage.abilities.effects.keyword.IncubateEffect; @@ -81,7 +81,7 @@ class ProgenitorExarchEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = ManacostVariableValue.ETB.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); if (xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/p/Prosperity.java b/Mage.Sets/src/mage/cards/p/Prosperity.java index 2224a6fe897..e18c9df60e6 100644 --- a/Mage.Sets/src/mage/cards/p/Prosperity.java +++ b/Mage.Sets/src/mage/cards/p/Prosperity.java @@ -2,7 +2,7 @@ package mage.cards.p; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class Prosperity extends CardImpl { // Each player draws X cards. - this.getSpellAbility().addEffect(new DrawCardAllEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardAllEffect(GetXValue.instance)); } private Prosperity(final Prosperity card) { diff --git a/Mage.Sets/src/mage/cards/p/PsychicDrain.java b/Mage.Sets/src/mage/cards/p/PsychicDrain.java index 2afe59ce15c..9eb3a9a8324 100644 --- a/Mage.Sets/src/mage/cards/p/PsychicDrain.java +++ b/Mage.Sets/src/mage/cards/p/PsychicDrain.java @@ -2,7 +2,7 @@ package mage.cards.p; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.MillCardsTargetEffect; @@ -21,9 +21,9 @@ public final class PsychicDrain extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{B}"); // Target player puts the top X cards of their library into their graveyard and you gain X life. - this.getSpellAbility().addEffect(new MillCardsTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new MillCardsTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer()); - Effect effect = new GainLifeEffect(ManacostVariableValue.REGULAR); + Effect effect = new GainLifeEffect(GetXValue.instance); effect.setText("and you gain X life"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/cards/p/PufferExtract.java b/Mage.Sets/src/mage/cards/p/PufferExtract.java index 9dfc29df0c2..88adefa88fd 100644 --- a/Mage.Sets/src/mage/cards/p/PufferExtract.java +++ b/Mage.Sets/src/mage/cards/p/PufferExtract.java @@ -16,6 +16,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -63,7 +64,7 @@ class PufferExtractEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); game.addEffect(new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn), source); game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility( new DestroyTargetEffect().setTargetPointer(new FixedTarget(source.getFirstTarget(), game)) diff --git a/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java b/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java index 300caf73139..3224e309c15 100644 --- a/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java +++ b/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java @@ -2,7 +2,7 @@ package mage.cards.p; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.discard.DiscardControllerEffect; @@ -20,7 +20,7 @@ public final class PullFromTomorrow extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{U}"); // Draw X cards, then discard a card. - getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); Effect effect = new DiscardControllerEffect(1); effect.setText(", then discard a card"); getSpellAbility().addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/p/PurphorossIntervention.java b/Mage.Sets/src/mage/cards/p/PurphorossIntervention.java index 78b9ebb9452..3bd02e33600 100644 --- a/Mage.Sets/src/mage/cards/p/PurphorossIntervention.java +++ b/Mage.Sets/src/mage/cards/p/PurphorossIntervention.java @@ -5,7 +5,7 @@ import mage.abilities.Mode; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.SacrificeTargetEffect; @@ -18,6 +18,7 @@ import mage.game.permanent.token.PurphorossInterventionToken; import mage.game.permanent.token.Token; import mage.target.common.TargetCreatureOrPlaneswalker; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -26,7 +27,7 @@ import java.util.UUID; */ public final class PurphorossIntervention extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public PurphorossIntervention(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}"); @@ -71,7 +72,7 @@ class PurphorossInterventionEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Token token = new PurphorossInterventionToken(source.getManaCostsToPay().getX()); + Token token = new PurphorossInterventionToken(CardUtil.getSourceCostsTag(game, source, "X", 0)); token.putOntoBattlefield(1, game, source, source.getControllerId()); token.getLastAddedTokenIds() .stream() diff --git a/Mage.Sets/src/mage/cards/r/RakdossReturn.java b/Mage.Sets/src/mage/cards/r/RakdossReturn.java index 501a62d9869..d7922f5a094 100644 --- a/Mage.Sets/src/mage/cards/r/RakdossReturn.java +++ b/Mage.Sets/src/mage/cards/r/RakdossReturn.java @@ -3,7 +3,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -27,7 +27,7 @@ public final class RakdossReturn extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{R}"); // Rakdos's Return deals X damage to target opponent or planeswalker. That player or that planeswalker’s controller discards X cards. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new RakdossReturnEffect()); this.getSpellAbility().addTarget(new TargetOpponentOrPlaneswalker()); } @@ -64,7 +64,7 @@ class RakdossReturnEffect extends OneShotEffect { if (player == null) { return false; } - Effect effect = new DiscardTargetEffect(ManacostVariableValue.REGULAR); + Effect effect = new DiscardTargetEffect(GetXValue.instance); effect.setTargetPointer(new FixedTarget(player.getId(), game)); return effect.apply(game, source); } diff --git a/Mage.Sets/src/mage/cards/r/RallyTheAncestors.java b/Mage.Sets/src/mage/cards/r/RallyTheAncestors.java index ac3c9c06d24..8e7492b429f 100644 --- a/Mage.Sets/src/mage/cards/r/RallyTheAncestors.java +++ b/Mage.Sets/src/mage/cards/r/RallyTheAncestors.java @@ -21,6 +21,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.targetpointer.FixedTargets; +import mage.util.CardUtil; import java.util.ArrayList; import java.util.List; @@ -72,7 +73,7 @@ class RallyTheAncestorsEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCreatureCard filter = new FilterCreatureCard(); filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, xValue + 1)); Set cards = player.getGraveyard().getCards(filter, game); diff --git a/Mage.Sets/src/mage/cards/r/RampagingWarMammoth.java b/Mage.Sets/src/mage/cards/r/RampagingWarMammoth.java index bf708fa3857..36302890eb2 100644 --- a/Mage.Sets/src/mage/cards/r/RampagingWarMammoth.java +++ b/Mage.Sets/src/mage/cards/r/RampagingWarMammoth.java @@ -16,6 +16,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.StackObject; import mage.target.common.TargetArtifactPermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -79,7 +80,7 @@ class RampagingWarMammothTriggeredAbility extends ZoneChangeTriggeredAbility { CyclingAbility cyclingAbility = (CyclingAbility) object.getStackAbility(); // If X is 0, or cycling from another ability that does not have {X} in cost, // this should trigger (but do nothing). - int xValue = cyclingAbility.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, cyclingAbility, "X", 0); this.getEffects().clear(); this.getTargets().clear(); diff --git a/Mage.Sets/src/mage/cards/r/RasputinTheOneiromancer.java b/Mage.Sets/src/mage/cards/r/RasputinTheOneiromancer.java index cd7f60303f1..13fb743a141 100644 --- a/Mage.Sets/src/mage/cards/r/RasputinTheOneiromancer.java +++ b/Mage.Sets/src/mage/cards/r/RasputinTheOneiromancer.java @@ -10,7 +10,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.dynamicvalue.common.OpponentsCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenAllEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -52,7 +52,7 @@ public final class RasputinTheOneiromancer extends CardImpl { // {T}, Remove one or more dream counters from Rasputin: Add that much {C}. Ability ability2 = new DynamicManaAbility( Mana.ColorlessMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add that much {C}", true, new CountersSourceCount(CounterType.DREAM)); diff --git a/Mage.Sets/src/mage/cards/r/RavagingBlaze.java b/Mage.Sets/src/mage/cards/r/RavagingBlaze.java index ecc1bd79504..40c11a6cc3f 100644 --- a/Mage.Sets/src/mage/cards/r/RavagingBlaze.java +++ b/Mage.Sets/src/mage/cards/r/RavagingBlaze.java @@ -4,7 +4,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.condition.common.SpellMasteryCondition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; @@ -22,10 +22,10 @@ public final class RavagingBlaze extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{R}{R}"); // Ravaging Blaze deals X damage to target creature. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); // Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller. - this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DamageTargetControllerEffect(ManacostVariableValue.REGULAR), + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DamageTargetControllerEffect(GetXValue.instance), SpellMasteryCondition.instance, "
Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller.")); } diff --git a/Mage.Sets/src/mage/cards/r/ReadTheRunes.java b/Mage.Sets/src/mage/cards/r/ReadTheRunes.java index 2fd72cf5b92..23ffb6fc179 100644 --- a/Mage.Sets/src/mage/cards/r/ReadTheRunes.java +++ b/Mage.Sets/src/mage/cards/r/ReadTheRunes.java @@ -1,7 +1,6 @@ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -9,13 +8,14 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.filter.StaticFilters; -import mage.filter.common.FilterControlledPermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; -import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetSacrifice; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -61,7 +61,7 @@ class ReadTheRunesEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int drawnCards = controller.drawCards(source.getManaCostsToPay().getX(), source, game); + int drawnCards = controller.drawCards(CardUtil.getSourceCostsTag(game, source, "X", 0), source, game); Target target = new TargetSacrifice(0, drawnCards, StaticFilters.FILTER_PERMANENT); controller.choose(Outcome.Sacrifice, target, source, game); int sacrificedPermanents = 0; diff --git a/Mage.Sets/src/mage/cards/r/ReapIntellect.java b/Mage.Sets/src/mage/cards/r/ReapIntellect.java index 2385ec13cb4..1e9f975dbfc 100644 --- a/Mage.Sets/src/mage/cards/r/ReapIntellect.java +++ b/Mage.Sets/src/mage/cards/r/ReapIntellect.java @@ -82,7 +82,7 @@ class ReapIntellectEffect extends OneShotEffect { // Chose cards to exile from hand Cards exiledCards = new CardsImpl(); - int xCost = Math.min(source.getManaCostsToPay().getX(), targetPlayer.getHand().size()); + int xCost = Math.min(CardUtil.getSourceCostsTag(game, source, "X", 0), targetPlayer.getHand().size()); TargetCard target = new TargetCard(0, xCost, Zone.HAND, filterNonLands); target.withNotTarget(true); controller.chooseTarget(Outcome.Benefit, targetPlayer.getHand(), target, source, game); diff --git a/Mage.Sets/src/mage/cards/r/ReapThePast.java b/Mage.Sets/src/mage/cards/r/ReapThePast.java index f43604279d2..c0f838b1579 100644 --- a/Mage.Sets/src/mage/cards/r/ReapThePast.java +++ b/Mage.Sets/src/mage/cards/r/ReapThePast.java @@ -12,6 +12,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -59,7 +60,7 @@ class ReapThePastEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Cards cards = new CardsImpl(player.getGraveyard()); while (cards.size() > xValue) { cards.remove(cards.getRandom(game)); diff --git a/Mage.Sets/src/mage/cards/r/Recall.java b/Mage.Sets/src/mage/cards/r/Recall.java index 29148ab2618..463ac96dc69 100644 --- a/Mage.Sets/src/mage/cards/r/Recall.java +++ b/Mage.Sets/src/mage/cards/r/Recall.java @@ -1,7 +1,6 @@ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ExileSpellEffect; @@ -16,6 +15,9 @@ import mage.filter.FilterCard; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -63,7 +65,7 @@ class RecallEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { // Discard X cards - Cards cardsDiscarded = controller.discard(source.getManaCostsToPay().getX(), false, false, source, game); + Cards cardsDiscarded = controller.discard(CardUtil.getSourceCostsTag(game, source, "X", 0), false, false, source, game); if (!cardsDiscarded.isEmpty()) { // then return a card from your graveyard to your hand for each card discarded this way TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(cardsDiscarded.size(), new FilterCard()); diff --git a/Mage.Sets/src/mage/cards/r/RedManaBattery.java b/Mage.Sets/src/mage/cards/r/RedManaBattery.java index b9568a63257..e29bbad4065 100644 --- a/Mage.Sets/src/mage/cards/r/RedManaBattery.java +++ b/Mage.Sets/src/mage/cards/r/RedManaBattery.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.IntPlusDynamicValue; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -37,7 +37,7 @@ public final class RedManaBattery extends CardImpl { // then add an additional {R} for each charge counter removed this way. ability = new DynamicManaAbility( Mana.RedMana(1), - new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance), + new IntPlusDynamicValue(1, GetXValue.instance), new TapSourceCost(), "Add {R}, then add {R} for each charge counter removed this way", true, new IntPlusDynamicValue(1, new CountersSourceCount(CounterType.CHARGE))); diff --git a/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java b/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java index 09391ac2978..4a221b4fbae 100644 --- a/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java +++ b/Mage.Sets/src/mage/cards/r/RedSunsTwilight.java @@ -16,6 +16,7 @@ import mage.players.Player; import mage.target.common.TargetArtifactPermanent; import mage.target.targetadjustment.XTargetsCountAdjuster; import mage.target.targetpointer.FixedTargets; +import mage.util.CardUtil; import java.util.ArrayList; import java.util.List; @@ -67,7 +68,7 @@ class RedSunsTwilightEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Player player = game.getPlayer(source.getControllerId()); if (player == null) { return false; diff --git a/Mage.Sets/src/mage/cards/r/RedSunsZenith.java b/Mage.Sets/src/mage/cards/r/RedSunsZenith.java index 4ddda3619c1..6d988a20cea 100644 --- a/Mage.Sets/src/mage/cards/r/RedSunsZenith.java +++ b/Mage.Sets/src/mage/cards/r/RedSunsZenith.java @@ -2,7 +2,7 @@ package mage.cards.r; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.ShuffleSpellEffect; import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies; @@ -26,7 +26,7 @@ public final class RedSunsZenith extends CardImpl { // If a creature dealt damage this way would die this turn, exile it instead. // Shuffle Red Sun's Zenith into its owner's library. this.getSpellAbility().addTarget(new TargetAnyTarget()); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn)); this.getSpellAbility().addEffect(ShuffleSpellEffect.getInstance()); this.getSpellAbility().addWatcher(new DamagedByWatcher(false)); diff --git a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java index 02c84b7e8e4..5dabff47617 100644 --- a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java +++ b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java @@ -1,7 +1,7 @@ package mage.cards.r; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; @@ -27,7 +27,7 @@ public final class ReleaseTheGremlins extends CardImpl { this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); // Create X 2/2 red Gremlin creature tokens. - this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), GetXValue.instance)); } diff --git a/Mage.Sets/src/mage/cards/r/RepulsiveMutation.java b/Mage.Sets/src/mage/cards/r/RepulsiveMutation.java index decf8f36f55..af9c72f5d80 100644 --- a/Mage.Sets/src/mage/cards/r/RepulsiveMutation.java +++ b/Mage.Sets/src/mage/cards/r/RepulsiveMutation.java @@ -3,7 +3,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.dynamicvalue.common.GreatestPowerAmongControlledCreaturesValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; @@ -26,7 +26,7 @@ public final class RepulsiveMutation extends CardImpl { // Put X +1/+1 counters on target creature you control. getSpellAbility().addEffect(new AddCountersTargetEffect( - CounterType.P1P1.createInstance(), ManacostVariableValue.REGULAR)); + CounterType.P1P1.createInstance(), GetXValue.instance)); getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); // Then counter up to one target spell unless its controller pays mana equal to the greatest power among creatures you control. diff --git a/Mage.Sets/src/mage/cards/r/RoaringEarth.java b/Mage.Sets/src/mage/cards/r/RoaringEarth.java index 18d6fd25763..9012fc7505c 100644 --- a/Mage.Sets/src/mage/cards/r/RoaringEarth.java +++ b/Mage.Sets/src/mage/cards/r/RoaringEarth.java @@ -2,7 +2,7 @@ package mage.cards.r; import mage.abilities.Ability; import mage.abilities.common.LandfallAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.keyword.ChannelAbility; @@ -46,7 +46,7 @@ public final class RoaringEarth extends CardImpl { // Channel — {X}{G}{G}, Discard Roaring Earth; Put X +1/+1 counters on target land you control. It becomes a 0/0 green Spirit creature with haste. It's still a land. ability = new ChannelAbility("{X}{G}{G}", new AddCountersTargetEffect( - CounterType.P1P1.createInstance(0), ManacostVariableValue.REGULAR + CounterType.P1P1.createInstance(0), GetXValue.instance ).setText("Put X +1/+1 counters on target land you control.")); ability.addEffect(new BecomesCreatureTargetEffect( new CreatureToken(0, 0) diff --git a/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java b/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java index ce6c2b13a0c..40ed2aac21b 100644 --- a/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java +++ b/Mage.Sets/src/mage/cards/r/RoccoCabarettiCaterer.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CastFromEverywhereSourceCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -73,6 +73,6 @@ enum RoccoCabarettiCatererPredicate implements ObjectSourcePlayerPredicate return false; } return input.getObject().getManaValue() - <= ManacostVariableValue.ETB.calculate(game, input.getSource(), null); + <= GetXValue.instance.calculate(game, input.getSource(), null); } } diff --git a/Mage.Sets/src/mage/cards/r/RockSlide.java b/Mage.Sets/src/mage/cards/r/RockSlide.java index 102ec690c7b..72e8b3ddf5e 100644 --- a/Mage.Sets/src/mage/cards/r/RockSlide.java +++ b/Mage.Sets/src/mage/cards/r/RockSlide.java @@ -2,7 +2,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageMultiEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -29,7 +29,7 @@ public final class RockSlide extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{R}"); // Rock Slide deals X damage divided as you choose among any number of target attacking or blocking creatures without flying. - DynamicValue xValue = ManacostVariableValue.REGULAR; + DynamicValue xValue = GetXValue.instance; this.getSpellAbility().addEffect(new DamageMultiEffect(xValue)); this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(xValue, filter)); } diff --git a/Mage.Sets/src/mage/cards/r/RodOfAbsorption.java b/Mage.Sets/src/mage/cards/r/RodOfAbsorption.java index ecc73b156cb..e3c2ff36421 100644 --- a/Mage.Sets/src/mage/cards/r/RodOfAbsorption.java +++ b/Mage.Sets/src/mage/cards/r/RodOfAbsorption.java @@ -180,7 +180,7 @@ class RodOfAbsorptionCastEffect extends OneShotEffect { CardUtil.castMultipleWithAttributeForFree( player, source, game, cards, StaticFilters.FILTER_CARD, Integer.MAX_VALUE, - new RodOfAbsorptionTracker(source.getManaCostsToPay().getX()) + new RodOfAbsorptionTracker(CardUtil.getSourceCostsTag(game, source, "X", 0)) ); return true; } diff --git a/Mage.Sets/src/mage/cards/r/RollingEarthquake.java b/Mage.Sets/src/mage/cards/r/RollingEarthquake.java index 96faf7d3210..7c84a5cc1bf 100644 --- a/Mage.Sets/src/mage/cards/r/RollingEarthquake.java +++ b/Mage.Sets/src/mage/cards/r/RollingEarthquake.java @@ -2,7 +2,7 @@ package mage.cards.r; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageEverythingEffect; import mage.abilities.keyword.HorsemanshipAbility; import mage.cards.CardImpl; @@ -29,7 +29,7 @@ public final class RollingEarthquake extends CardImpl { // Rolling Earthquake deals X damage to each creature without horsemanship and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageEverythingEffect(GetXValue.instance, filter)); } private RollingEarthquake(final RollingEarthquake card) { diff --git a/Mage.Sets/src/mage/cards/r/RollingThunder.java b/Mage.Sets/src/mage/cards/r/RollingThunder.java index ae6d7b033a1..c3fded58cdb 100644 --- a/Mage.Sets/src/mage/cards/r/RollingThunder.java +++ b/Mage.Sets/src/mage/cards/r/RollingThunder.java @@ -2,7 +2,7 @@ package mage.cards.r; import java.util.UUID; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageMultiEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class RollingThunder extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{R}{R}"); // Rolling Thunder deals X damage divided as you choose among any number of targets. - DynamicValue xValue = ManacostVariableValue.REGULAR; + DynamicValue xValue = GetXValue.instance; this.getSpellAbility().addEffect(new DamageMultiEffect(xValue)); this.getSpellAbility().addTarget(new TargetAnyTargetAmount(xValue)); } diff --git a/Mage.Sets/src/mage/cards/r/RushwoodGrove.java b/Mage.Sets/src/mage/cards/r/RushwoodGrove.java index 68fc8faf5d9..6e0ebdf05ff 100644 --- a/Mage.Sets/src/mage/cards/r/RushwoodGrove.java +++ b/Mage.Sets/src/mage/cards/r/RushwoodGrove.java @@ -9,7 +9,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class RushwoodGrove extends CardImpl { // {T}, Remove any number of storage counters from Rushwood Grove: Add {G} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.GreenMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {G} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/s/SaheelisDirective.java b/Mage.Sets/src/mage/cards/s/SaheelisDirective.java index c0617efd515..610aa5dd9b0 100644 --- a/Mage.Sets/src/mage/cards/s/SaheelisDirective.java +++ b/Mage.Sets/src/mage/cards/s/SaheelisDirective.java @@ -1,6 +1,5 @@ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.ImproviseAbility; @@ -18,6 +17,9 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -66,7 +68,7 @@ class SaheelisDirectiveEffect extends OneShotEffect { if (controller == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, xValue)); if (!cards.isEmpty()) { controller.revealCards(source, cards, game); diff --git a/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java b/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java index 0cf308a55d2..48649c20c4d 100644 --- a/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java +++ b/Mage.Sets/src/mage/cards/s/SaltcrustedSteppe.java @@ -7,7 +7,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.abilities.mana.ColorlessManaAbility; @@ -36,7 +36,7 @@ public final class SaltcrustedSteppe extends CardImpl { this.addAbility(ability); // {1}, Remove X storage counters from Saltcrusted Steppe: Add X mana in any combination of {G} and/or {W}. ability = new SimpleManaAbility(Zone.BATTLEFIELD, - new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, + new AddManaInAnyCombinationEffect(GetXValue.instance, new CountersSourceCount(CounterType.STORAGE), ColoredManaSymbol.G, ColoredManaSymbol.W), new GenericManaCost(1)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/s/SandSilos.java b/Mage.Sets/src/mage/cards/s/SandSilos.java index dbf63501a0d..eb91cd10c9c 100644 --- a/Mage.Sets/src/mage/cards/s/SandSilos.java +++ b/Mage.Sets/src/mage/cards/s/SandSilos.java @@ -12,7 +12,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -44,7 +44,7 @@ public final class SandSilos extends CardImpl { // {tap}, Remove any number of storage counters from Sand Silos: Add {U} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.BlueMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {U} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/s/SandsOfDelirium.java b/Mage.Sets/src/mage/cards/s/SandsOfDelirium.java index 9131b491a37..eebbfcedee6 100644 --- a/Mage.Sets/src/mage/cards/s/SandsOfDelirium.java +++ b/Mage.Sets/src/mage/cards/s/SandsOfDelirium.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.MillCardsTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,7 +24,7 @@ public final class SandsOfDelirium extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); // {X}, {tap}: Target player puts the top X cards of their library into their graveyard. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MillCardsTargetEffect(ManacostVariableValue.REGULAR), new VariableManaCost(VariableCostType.NORMAL)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MillCardsTargetEffect(GetXValue.instance), new VariableManaCost(VariableCostType.NORMAL)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SanguineSacrament.java b/Mage.Sets/src/mage/cards/s/SanguineSacrament.java index bbccf8ba5c8..daf0228aa94 100644 --- a/Mage.Sets/src/mage/cards/s/SanguineSacrament.java +++ b/Mage.Sets/src/mage/cards/s/SanguineSacrament.java @@ -10,6 +10,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.game.Game; +import mage.util.CardUtil; import java.util.UUID; @@ -41,7 +42,7 @@ enum SanguineSacramentValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return sourceAbility.getManaCostsToPay().getX() * 2; + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0) * 2; } @Override diff --git a/Mage.Sets/src/mage/cards/s/SaprazzanCove.java b/Mage.Sets/src/mage/cards/s/SaprazzanCove.java index 05d48a49716..111cb356495 100644 --- a/Mage.Sets/src/mage/cards/s/SaprazzanCove.java +++ b/Mage.Sets/src/mage/cards/s/SaprazzanCove.java @@ -9,7 +9,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class SaprazzanCove extends CardImpl { // {tap}, Remove any number of storage counters from Saprazzan Cove: Add {U} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.BlueMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {U} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/s/SavageTwister.java b/Mage.Sets/src/mage/cards/s/SavageTwister.java index c7c68e06835..6994a8e1814 100644 --- a/Mage.Sets/src/mage/cards/s/SavageTwister.java +++ b/Mage.Sets/src/mage/cards/s/SavageTwister.java @@ -2,7 +2,7 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,7 +20,7 @@ public final class SavageTwister extends CardImpl { // Savage Twister deals X damage to each creature. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, new FilterCreaturePermanent())); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, new FilterCreaturePermanent())); } private SavageTwister(final SavageTwister card) { diff --git a/Mage.Sets/src/mage/cards/s/ScorchedEarth.java b/Mage.Sets/src/mage/cards/s/ScorchedEarth.java index a40996fc00d..2eb04885c64 100644 --- a/Mage.Sets/src/mage/cards/s/ScorchedEarth.java +++ b/Mage.Sets/src/mage/cards/s/ScorchedEarth.java @@ -17,6 +17,7 @@ import mage.game.Game; import mage.target.common.TargetCardInHand; import mage.target.common.TargetLandPermanent; import mage.target.targetadjustment.XTargetsCountAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -57,7 +58,7 @@ enum ScorchedEarthCostAdjuster implements CostAdjuster { @Override public void adjustCosts(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); if (xValue > 0) { ability.addCost(new DiscardTargetCost(new TargetCardInHand(xValue, xValue, new FilterLandCard("land cards")))); } diff --git a/Mage.Sets/src/mage/cards/s/SealedFate.java b/Mage.Sets/src/mage/cards/s/SealedFate.java index a0e0af78545..e1ea9b6f42f 100644 --- a/Mage.Sets/src/mage/cards/s/SealedFate.java +++ b/Mage.Sets/src/mage/cards/s/SealedFate.java @@ -11,6 +11,7 @@ import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetOpponent; +import mage.util.CardUtil; import java.util.UUID; @@ -58,7 +59,7 @@ class SealedFateEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player opponent = game.getPlayer(source.getFirstTarget()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (controller == null || opponent == null) { return false; diff --git a/Mage.Sets/src/mage/cards/s/SecureTheWastes.java b/Mage.Sets/src/mage/cards/s/SecureTheWastes.java index d785c1f354b..d8aabf00e27 100644 --- a/Mage.Sets/src/mage/cards/s/SecureTheWastes.java +++ b/Mage.Sets/src/mage/cards/s/SecureTheWastes.java @@ -2,7 +2,7 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class SecureTheWastes extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}"); // create X 1/1 white Warrior creature tokens. - this.getSpellAbility().addEffect(new CreateTokenEffect(new WarriorToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new WarriorToken(), GetXValue.instance)); } private SecureTheWastes(final SecureTheWastes card) { diff --git a/Mage.Sets/src/mage/cards/s/SelectiveSnare.java b/Mage.Sets/src/mage/cards/s/SelectiveSnare.java index 4cdb936bad7..b5e46dcde13 100644 --- a/Mage.Sets/src/mage/cards/s/SelectiveSnare.java +++ b/Mage.Sets/src/mage/cards/s/SelectiveSnare.java @@ -1,6 +1,5 @@ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; @@ -16,6 +15,9 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -60,7 +62,7 @@ enum SelectiveSnareAdjuster implements TargetAdjuster { return; } SubType subType = SubType.byDescription(choice.getChoiceKey()); - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); FilterPermanent filter = new FilterCreaturePermanent(subType.toString() + " creatures"); filter.add(subType.getPredicate()); ability.getTargets().clear(); diff --git a/Mage.Sets/src/mage/cards/s/SequenceEngine.java b/Mage.Sets/src/mage/cards/s/SequenceEngine.java index bc18b054552..604e0fea830 100644 --- a/Mage.Sets/src/mage/cards/s/SequenceEngine.java +++ b/Mage.Sets/src/mage/cards/s/SequenceEngine.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -32,7 +32,7 @@ public final class SequenceEngine extends CardImpl { ); ability.addCost(new TapSourceCost()); ability.addEffect(FractalToken.getEffect( - ManacostVariableValue.REGULAR, "Put X +1/+1 counters on it" + GetXValue.instance, "Put X +1/+1 counters on it" )); ability.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_A_GRAVEYARD)); ability.setTargetAdjuster(new XManaValueTargetAdjuster()); diff --git a/Mage.Sets/src/mage/cards/s/SharkTyphoon.java b/Mage.Sets/src/mage/cards/s/SharkTyphoon.java index 7af2bdc2946..93f2129b3ae 100644 --- a/Mage.Sets/src/mage/cards/s/SharkTyphoon.java +++ b/Mage.Sets/src/mage/cards/s/SharkTyphoon.java @@ -19,6 +19,7 @@ import mage.game.events.GameEvent; import mage.game.permanent.token.SharkToken; import mage.game.stack.Spell; import mage.game.stack.StackObject; +import mage.util.CardUtil; import java.util.UUID; @@ -106,7 +107,7 @@ class SharkTyphoonTriggeredAbility extends ZoneChangeTriggeredAbility { return false; } this.getEffects().clear(); - this.addEffect(new CreateTokenEffect(new SharkToken(object.getStackAbility().getManaCostsToPay().getX()))); + this.addEffect(new CreateTokenEffect(new SharkToken(CardUtil.getSourceCostsTag(game, object.getStackAbility(), "X", 0)))); return true; } diff --git a/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java b/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java index 2e599343b55..ad0d0e5481b 100644 --- a/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java +++ b/Mage.Sets/src/mage/cards/s/ShatteredCrypt.java @@ -1,7 +1,7 @@ package mage.cards.s; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; @@ -26,7 +26,7 @@ public final class ShatteredCrypt extends CardImpl { Effect effect = new ReturnFromGraveyardToHandTargetEffect(); effect.setText("Return X target creature cards from your graveyard to your hand"); this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); this.getSpellAbility().setTargetAdjuster(new XTargetsCountAdjuster()); } diff --git a/Mage.Sets/src/mage/cards/s/ShatterskullSmashing.java b/Mage.Sets/src/mage/cards/s/ShatterskullSmashing.java index 3cbf82a1954..0b9889da8c8 100644 --- a/Mage.Sets/src/mage/cards/s/ShatterskullSmashing.java +++ b/Mage.Sets/src/mage/cards/s/ShatterskullSmashing.java @@ -7,7 +7,7 @@ import mage.abilities.costs.common.PayLifeCost; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageMultiEffect; import mage.abilities.effects.common.TapSourceUnlessPaysEffect; import mage.abilities.mana.RedManaAbility; @@ -19,6 +19,7 @@ import mage.game.Game; import mage.target.TargetAmount; import mage.target.common.TargetCreatureOrPlaneswalkerAmount; import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -27,7 +28,7 @@ import java.util.UUID; */ public final class ShatterskullSmashing extends ModalDoubleFacedCard { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public ShatterskullSmashing(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, @@ -41,7 +42,7 @@ public final class ShatterskullSmashing extends ModalDoubleFacedCard { // Shatterskull Smashing deals X damage divided as you choose among up to two target creatures and/or planeswalkers. If X is 6 or more, Shatterskull Smashing deals twice X damage divided as you choose among them instead. this.getLeftHalfCard().getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageMultiEffect(xValue), new DamageMultiEffect(ManacostVariableValue.REGULAR), + new DamageMultiEffect(xValue), new DamageMultiEffect(GetXValue.instance), ShatterskullSmashingCondition.instance, "{this} deals X damage divided as you choose " + "among up to two target creatures and/or planeswalkers. If X is 6 or more, " + "{this} deals twice X damage divided as you choose among them instead." @@ -77,7 +78,7 @@ enum ShatterskullSmashingCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return source.getManaCostsToPay().getX() >= 6; + return CardUtil.getSourceCostsTag(game, source, "X", 0) >= 6; } } @@ -88,10 +89,10 @@ enum ShatterskullSmashingAdjuster implements TargetAdjuster { public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); TargetAmount target; - if (ability.getManaCostsToPay().getX() >= 6) { - target = new TargetCreatureOrPlaneswalkerAmount(2 * ability.getManaCostsToPay().getX()); + if (CardUtil.getSourceCostsTag(game, ability, "X", 0) >= 6) { + target = new TargetCreatureOrPlaneswalkerAmount(2 * CardUtil.getSourceCostsTag(game, ability, "X", 0)); } else { - target = new TargetCreatureOrPlaneswalkerAmount(ability.getManaCostsToPay().getX()); + target = new TargetCreatureOrPlaneswalkerAmount(CardUtil.getSourceCostsTag(game, ability, "X", 0)); } target.setMinNumberOfTargets(0); target.setMaxNumberOfTargets(2); diff --git a/Mage.Sets/src/mage/cards/s/ShelobDreadWeaver.java b/Mage.Sets/src/mage/cards/s/ShelobDreadWeaver.java index 9bed8776f54..977647c8cf7 100644 --- a/Mage.Sets/src/mage/cards/s/ShelobDreadWeaver.java +++ b/Mage.Sets/src/mage/cards/s/ShelobDreadWeaver.java @@ -169,7 +169,7 @@ enum ShelobDreadWeaverAdjuster implements TargetAdjuster { @Override public void adjustTargets(Ability ability, Game game) { ability.getTargets().clear(); - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); FilterCard filter = new FilterCreatureCard("creature card with mana value " + xValue); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); ability.addTarget(new TargetCardInExile(filter, CardUtil.getExileZoneId(game, ability))); diff --git a/Mage.Sets/src/mage/cards/s/SilklashSpider.java b/Mage.Sets/src/mage/cards/s/SilklashSpider.java index 229199ec03b..6e7e7698e3a 100644 --- a/Mage.Sets/src/mage/cards/s/SilklashSpider.java +++ b/Mage.Sets/src/mage/cards/s/SilklashSpider.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ReachAbility; @@ -40,7 +40,7 @@ public final class SilklashSpider extends CardImpl { this.addAbility(ReachAbility.getInstance()); // {X}{G}{G}: Silklash Spider deals X damage to each creature with flying. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, - new DamageAllEffect(ManacostVariableValue.REGULAR, filter), + new DamageAllEffect(GetXValue.instance, filter), new ManaCostsImpl<>("{X}{G}{G}"))); } diff --git a/Mage.Sets/src/mage/cards/s/SilverScrutiny.java b/Mage.Sets/src/mage/cards/s/SilverScrutiny.java index e0fb792ed91..ee03bd131de 100644 --- a/Mage.Sets/src/mage/cards/s/SilverScrutiny.java +++ b/Mage.Sets/src/mage/cards/s/SilverScrutiny.java @@ -1,16 +1,16 @@ package mage.cards.s; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.CastAsThoughItHadFlashIfConditionAbility; import mage.abilities.condition.Condition; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.game.Game; import mage.game.stack.Spell; +import mage.util.CardUtil; import java.util.UUID; @@ -30,7 +30,7 @@ public final class SilverScrutiny extends CardImpl { )); // Draw X cards. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); } private SilverScrutiny(final SilverScrutiny card) { @@ -52,6 +52,6 @@ enum SilverScrutinyCondition implements Condition { if (spell == null) { return false; } - return spell.getStackAbility().getManaCostsToPay().getX() < 4; + return CardUtil.getSourceCostsTag(game, spell.getStackAbility(), "X", 0) < 4; } } diff --git a/Mage.Sets/src/mage/cards/s/SimicManipulator.java b/Mage.Sets/src/mage/cards/s/SimicManipulator.java index 2d7a78b6d27..b86d77495ce 100644 --- a/Mage.Sets/src/mage/cards/s/SimicManipulator.java +++ b/Mage.Sets/src/mage/cards/s/SimicManipulator.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.keyword.EvolveAbility; import mage.cards.CardImpl; @@ -49,7 +49,7 @@ public final class SimicManipulator extends CardImpl { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainControlTargetEffect(Duration.Custom, true), new TapSourceCost()); ability.addTarget(new TargetCreaturePermanent(filter)); ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1, 1, "Remove one or more +1/+1 counters from {this}")); - ability.setTargetAdjuster(new PowerTargetAdjuster(RemovedCountersForCostValue.instance, ComparisonType.OR_LESS)); + ability.setTargetAdjuster(new PowerTargetAdjuster(GetXValue.instance, ComparisonType.OR_LESS)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SkeletalScrying.java b/Mage.Sets/src/mage/cards/s/SkeletalScrying.java index 9996b0e404e..f89a8dded84 100644 --- a/Mage.Sets/src/mage/cards/s/SkeletalScrying.java +++ b/Mage.Sets/src/mage/cards/s/SkeletalScrying.java @@ -4,10 +4,10 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.common.ExileFromGraveCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -15,6 +15,7 @@ import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; +import mage.util.CardUtil; import java.util.UUID; @@ -39,10 +40,10 @@ public final class SkeletalScrying extends CardImpl { // You draw X cards and you lose X life. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect( - ManacostVariableValue.REGULAR + GetXValue.instance ).setText("you draw X cards")); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect( - ManacostVariableValue.REGULAR + GetXValue.instance ).concatBy("and")); } @@ -61,7 +62,7 @@ enum SkeletalScryingAdjuster implements CostAdjuster { @Override public void adjustCosts(Ability ability, Game game) { - int xValue = ability.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, ability, "X", 0); if (xValue > 0) { ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(xValue, xValue, StaticFilters.FILTER_CARDS_FROM_YOUR_GRAVEYARD))); } diff --git a/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java b/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java index d28b4b4137b..2ae43cc87df 100644 --- a/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java +++ b/Mage.Sets/src/mage/cards/s/SkullmaneBaku.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -27,7 +27,7 @@ import mage.target.common.TargetCreaturePermanent; */ public final class SkullmaneBaku extends CardImpl { - private static final DynamicValue xValue = new SignInversionDynamicValue(RemovedCountersForCostValue.instance); + private static final DynamicValue xValue = new SignInversionDynamicValue(GetXValue.instance); public SkullmaneBaku(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); diff --git a/Mage.Sets/src/mage/cards/s/Skyscribing.java b/Mage.Sets/src/mage/cards/s/Skyscribing.java index d486c2dc63b..68ec553d4bd 100644 --- a/Mage.Sets/src/mage/cards/s/Skyscribing.java +++ b/Mage.Sets/src/mage/cards/s/Skyscribing.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardAllEffect; import mage.abilities.keyword.ForecastAbility; import mage.cards.CardImpl; @@ -20,7 +20,7 @@ public final class Skyscribing extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{U}"); // Each player draws X cards. - this.getSpellAbility().addEffect(new DrawCardAllEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardAllEffect(GetXValue.instance)); // Forecast - {2}{U}, Reveal Skyscribing from your hand: Each player draws a card. this.addAbility(new ForecastAbility(new DrawCardAllEffect(1), new ManaCostsImpl<>("{2}{U}"))); } diff --git a/Mage.Sets/src/mage/cards/s/SliceFromTheShadows.java b/Mage.Sets/src/mage/cards/s/SliceFromTheShadows.java index d77b24572e9..9e26817fd22 100644 --- a/Mage.Sets/src/mage/cards/s/SliceFromTheShadows.java +++ b/Mage.Sets/src/mage/cards/s/SliceFromTheShadows.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.abilities.common.CantBeCounteredSourceAbility; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; @@ -18,7 +18,7 @@ import java.util.UUID; */ public final class SliceFromTheShadows extends CardImpl { - private static final DynamicValue xValue = new SignInversionDynamicValue(ManacostVariableValue.REGULAR); + private static final DynamicValue xValue = new SignInversionDynamicValue(GetXValue.instance); public SliceFromTheShadows(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{B}"); diff --git a/Mage.Sets/src/mage/cards/s/SlimeMolding.java b/Mage.Sets/src/mage/cards/s/SlimeMolding.java index fd7b93ca5f1..8c11a32b10d 100644 --- a/Mage.Sets/src/mage/cards/s/SlimeMolding.java +++ b/Mage.Sets/src/mage/cards/s/SlimeMolding.java @@ -1,7 +1,6 @@ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,6 +9,9 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.OozeToken; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -48,7 +50,7 @@ class SlimeMoldingEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int count = source.getManaCostsToPay().getX(); + int count = CardUtil.getSourceCostsTag(game, source, "X", 0); OozeToken oozeToken = new OozeToken(); oozeToken.setPower(count); diff --git a/Mage.Sets/src/mage/cards/s/SnakeBasket.java b/Mage.Sets/src/mage/cards/s/SnakeBasket.java index 56717e19fd9..9b6f105482d 100644 --- a/Mage.Sets/src/mage/cards/s/SnakeBasket.java +++ b/Mage.Sets/src/mage/cards/s/SnakeBasket.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; @@ -25,7 +25,7 @@ public final class SnakeBasket extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); // {X}, Sacrifice Snake Basket: create X 1/1 green Snake creature tokens. Activate this ability only any time you could cast a sorcery. - Effect effect = new CreateTokenEffect(new SnakeToken(), ManacostVariableValue.REGULAR); + Effect effect = new CreateTokenEffect(new SnakeToken(), GetXValue.instance); Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}")); ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SongOfTotentanz.java b/Mage.Sets/src/mage/cards/s/SongOfTotentanz.java index f50e41b354d..45adc1454c0 100644 --- a/Mage.Sets/src/mage/cards/s/SongOfTotentanz.java +++ b/Mage.Sets/src/mage/cards/s/SongOfTotentanz.java @@ -1,6 +1,6 @@ package mage.cards.s; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.HasteAbility; @@ -22,7 +22,7 @@ public final class SongOfTotentanz extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}"); // Create X 1/1 black Rat creature tokens with “This creature can’t block.” Creatures you control gain haste until end of turn. - this.getSpellAbility().addEffect(new CreateTokenEffect(new RatCantBlockToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new RatCantBlockToken(), GetXValue.instance)); this.getSpellAbility().addEffect(new GainAbilityControlledEffect( HasteAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURES)); } diff --git a/Mage.Sets/src/mage/cards/s/Soothsaying.java b/Mage.Sets/src/mage/cards/s/Soothsaying.java index 5b5294375e5..82a7200ccc9 100644 --- a/Mage.Sets/src/mage/cards/s/Soothsaying.java +++ b/Mage.Sets/src/mage/cards/s/Soothsaying.java @@ -4,7 +4,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.LookLibraryControllerEffect; import mage.abilities.effects.common.ShuffleLibrarySourceEffect; @@ -27,7 +27,7 @@ public final class Soothsaying extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ShuffleLibrarySourceEffect(), new ManaCostsImpl<>("{3}{U}{U}"))); // {X}: Look at the top X cards of your library, then put them back in any order. - Effect effect = new LookLibraryControllerEffect(ManacostVariableValue.REGULAR); + Effect effect = new LookLibraryControllerEffect(GetXValue.instance); effect.setText("Look at the top X cards of your library, then put them back in any order"); this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{X}"))); } diff --git a/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java b/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java index 2dfff37778d..730bce29b97 100644 --- a/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java +++ b/Mage.Sets/src/mage/cards/s/SorinGrimNemesis.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -33,9 +33,9 @@ public final class SorinGrimNemesis extends CardImpl { this.addAbility(new LoyaltyAbility(new SorinGrimNemesisRevealEffect(), 1)); // -X: Sorin, Grim Nemesis deals X damage to target creature or planeswalker and you gain X life. - Ability ability = new LoyaltyAbility(new DamageTargetEffect(GetXLoyaltyValue.instance)); + Ability ability = new LoyaltyAbility(new DamageTargetEffect(GetXValue.instance)); ability.addTarget(new TargetCreatureOrPlaneswalker()); - ability.addEffect(new GainLifeEffect(GetXLoyaltyValue.instance).concatBy("and")); + ability.addEffect(new GainLifeEffect(GetXValue.instance).concatBy("and")); this.addAbility(ability); // -9: Create a number of 1/1 black Vampire Knight creature tokens with lifelink equal to the highest life total among all players. diff --git a/Mage.Sets/src/mage/cards/s/SoulStrings.java b/Mage.Sets/src/mage/cards/s/SoulStrings.java index 4baa0b5c03d..2e16a9e682f 100644 --- a/Mage.Sets/src/mage/cards/s/SoulStrings.java +++ b/Mage.Sets/src/mage/cards/s/SoulStrings.java @@ -10,7 +10,7 @@ import mage.filter.StaticFilters; import mage.target.common.TargetCardInYourGraveyard; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; /** * @author jmharmon @@ -23,7 +23,7 @@ public final class SoulStrings extends CardImpl { // Return two target creature cards from your graveyard to your hand unless any player pays {X}. Effect effect = new DoUnlessAnyPlayerPaysEffect( - new ReturnFromGraveyardToHandTargetEffect(), ManacostVariableValue.REGULAR); + new ReturnFromGraveyardToHandTargetEffect(), GetXValue.instance); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); } diff --git a/Mage.Sets/src/mage/cards/s/SphinxsRevelation.java b/Mage.Sets/src/mage/cards/s/SphinxsRevelation.java index cad0789e7c0..a49d4305c72 100644 --- a/Mage.Sets/src/mage/cards/s/SphinxsRevelation.java +++ b/Mage.Sets/src/mage/cards/s/SphinxsRevelation.java @@ -1,6 +1,6 @@ package mage.cards.s; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -18,7 +18,7 @@ public final class SphinxsRevelation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{W}{U}{U}"); // You gain X life and draw X cards. - ManacostVariableValue manaX = ManacostVariableValue.REGULAR; + GetXValue manaX = GetXValue.instance; this.getSpellAbility().addEffect(new GainLifeEffect(manaX)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(manaX).concatBy("and")); } diff --git a/Mage.Sets/src/mage/cards/s/SpinningWheelKick.java b/Mage.Sets/src/mage/cards/s/SpinningWheelKick.java index c4dedd9b9db..d84719dd43b 100644 --- a/Mage.Sets/src/mage/cards/s/SpinningWheelKick.java +++ b/Mage.Sets/src/mage/cards/s/SpinningWheelKick.java @@ -13,6 +13,7 @@ import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetpointer.SecondTargetPointer; +import mage.util.CardUtil; import java.util.UUID; @@ -47,7 +48,7 @@ enum SpinningWheelKickAdjuster implements TargetAdjuster { ability.getTargets().clear(); ability.addTarget(new TargetControlledCreaturePermanent()); ability.addTarget(new TargetPermanent( - ability.getManaCostsToPay().getX(), + CardUtil.getSourceCostsTag(game, ability, "X", 0), StaticFilters.FILTER_PERMANENT_CREATURE_OR_PLANESWALKER )); } diff --git a/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java b/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java index f1bdf523696..a939208659b 100644 --- a/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java +++ b/Mage.Sets/src/mage/cards/s/SpitefulBanditry.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DamageAllEffect; import mage.cards.CardImpl; @@ -23,7 +23,7 @@ public final class SpitefulBanditry extends CardImpl { // When Spiteful Banditry enters the battlefield, it deals X damage to each creature. this.addAbility(new EntersBattlefieldTriggeredAbility(new DamageAllEffect( - ManacostVariableValue.ETB, StaticFilters.FILTER_PERMANENT_CREATURE + GetXValue.instance, StaticFilters.FILTER_PERMANENT_CREATURE ))); // Whenever one or more creatures your opponents control die, you create a Treasure token. This ability triggers only once each turn. diff --git a/Mage.Sets/src/mage/cards/s/Sporocyst.java b/Mage.Sets/src/mage/cards/s/Sporocyst.java index 252839e66ec..b0687e6ba2e 100644 --- a/Mage.Sets/src/mage/cards/s/Sporocyst.java +++ b/Mage.Sets/src/mage/cards/s/Sporocyst.java @@ -3,7 +3,7 @@ package mage.cards.s; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.abilities.keyword.DefenderAbility; @@ -70,7 +70,7 @@ class SporocystEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = ManacostVariableValue.ETB.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); return new SearchLibraryPutInPlayEffect(new TargetCardInLibrary( 0, xValue, StaticFilters.FILTER_CARD_BASIC_LANDS ), true).apply(game, source); diff --git a/Mage.Sets/src/mage/cards/s/SquallLine.java b/Mage.Sets/src/mage/cards/s/SquallLine.java index b6e5749c47b..cc3faa1929d 100644 --- a/Mage.Sets/src/mage/cards/s/SquallLine.java +++ b/Mage.Sets/src/mage/cards/s/SquallLine.java @@ -2,7 +2,7 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageEverythingEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -27,7 +27,7 @@ public final class SquallLine extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{G}{G}"); // Squall Line deals X damage to each creature with flying and each player. - this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.REGULAR, filter)); } + this.getSpellAbility().addEffect(new DamageEverythingEffect(GetXValue.instance, filter)); } private SquallLine(final SquallLine card) { super(card); diff --git a/Mage.Sets/src/mage/cards/s/Stargaze.java b/Mage.Sets/src/mage/cards/s/Stargaze.java index bc584e56180..5a4c391cdda 100644 --- a/Mage.Sets/src/mage/cards/s/Stargaze.java +++ b/Mage.Sets/src/mage/cards/s/Stargaze.java @@ -14,6 +14,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -59,7 +60,7 @@ class StargazeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/s/StarnheimUnleashed.java b/Mage.Sets/src/mage/cards/s/StarnheimUnleashed.java index 97030d2990a..d5051698a31 100644 --- a/Mage.Sets/src/mage/cards/s/StarnheimUnleashed.java +++ b/Mage.Sets/src/mage/cards/s/StarnheimUnleashed.java @@ -4,7 +4,7 @@ import java.util.UUID; import mage.abilities.condition.common.ForetoldCondition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.ForetellAbility; import mage.cards.CardImpl; @@ -23,7 +23,7 @@ public final class StarnheimUnleashed extends CardImpl { // Create a 4/4 white Angel Warrior creature token with flying and vigilance. If this spell was foretold, create X of those tokens instead. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new CreateTokenEffect(new AngelWarriorVigilanceToken(), ManacostVariableValue.REGULAR), + new CreateTokenEffect(new AngelWarriorVigilanceToken(), GetXValue.instance), new CreateTokenEffect(new AngelWarriorVigilanceToken()), ForetoldCondition.instance, "Create a 4/4 white Angel Warrior creature token with flying and vigilance. If this spell was foretold, create X of those tokens instead" diff --git a/Mage.Sets/src/mage/cards/s/Starstorm.java b/Mage.Sets/src/mage/cards/s/Starstorm.java index 351bb1c049e..3a1d6257d66 100644 --- a/Mage.Sets/src/mage/cards/s/Starstorm.java +++ b/Mage.Sets/src/mage/cards/s/Starstorm.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.CyclingAbility; import mage.cards.CardImpl; @@ -22,7 +22,7 @@ public final class Starstorm extends CardImpl { // Starstorm deals X damage to each creature. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, new FilterCreaturePermanent())); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, new FilterCreaturePermanent())); // Cycling {3} this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{3}"))); } diff --git a/Mage.Sets/src/mage/cards/s/SteelHellkite.java b/Mage.Sets/src/mage/cards/s/SteelHellkite.java index 02c2db2a1d4..c4f7dc42cc0 100644 --- a/Mage.Sets/src/mage/cards/s/SteelHellkite.java +++ b/Mage.Sets/src/mage/cards/s/SteelHellkite.java @@ -24,6 +24,7 @@ import mage.game.Game; import mage.game.events.DamagedEvent; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import mage.watchers.Watcher; import java.util.*; @@ -93,7 +94,7 @@ class SteelHellkiteDestroyEffect extends OneShotEffect { predicateSet.add(new ControllerIdPredicate(playerId)); } FilterPermanent filter = new FilterNonlandPermanent(); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, source.getManaCostsToPay().getX())); + filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, CardUtil.getSourceCostsTag(game, source, "X", 0))); filter.add(Predicates.or(predicateSet)); return new DestroyAllEffect(filter).apply(game, source); } diff --git a/Mage.Sets/src/mage/cards/s/StolenByTheFae.java b/Mage.Sets/src/mage/cards/s/StolenByTheFae.java index 7d533d2bd6f..2e065913363 100644 --- a/Mage.Sets/src/mage/cards/s/StolenByTheFae.java +++ b/Mage.Sets/src/mage/cards/s/StolenByTheFae.java @@ -1,6 +1,6 @@ package mage.cards.s; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; @@ -23,7 +23,7 @@ public final class StolenByTheFae extends CardImpl { // Return target creature with converted mana cost X to its owner's hand. You create X 1/1 blue Faerie creature tokens with flying. this.getSpellAbility().addEffect(new ReturnToHandTargetEffect() .setText("Return target creature with mana value X to its owner's hand")); - this.getSpellAbility().addEffect(new CreateTokenEffect(new FaerieToken(), ManacostVariableValue.REGULAR) + this.getSpellAbility().addEffect(new CreateTokenEffect(new FaerieToken(), GetXValue.instance) .setText("You create X 1/1 blue Faerie creature tokens with flying")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().setTargetAdjuster(new XManaValueTargetAdjuster()); diff --git a/Mage.Sets/src/mage/cards/s/StonesplitterBolt.java b/Mage.Sets/src/mage/cards/s/StonesplitterBolt.java index 7880be847e8..b7bbc75872f 100644 --- a/Mage.Sets/src/mage/cards/s/StonesplitterBolt.java +++ b/Mage.Sets/src/mage/cards/s/StonesplitterBolt.java @@ -3,7 +3,7 @@ package mage.cards.s; import mage.abilities.condition.common.BargainedCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.BargainAbility; import mage.cards.CardImpl; @@ -26,8 +26,8 @@ public final class StonesplitterBolt extends CardImpl { // Stonesplitter Bolt deals X damage to target creature or planeswalker. If this spell was bargained, it deals twice X damage to that permanent instead. this.getSpellAbility().addEffect(new ConditionalOneShotEffect( - new DamageTargetEffect(new MultipliedValue(ManacostVariableValue.REGULAR, 2)), - new DamageTargetEffect(ManacostVariableValue.REGULAR), + new DamageTargetEffect(new MultipliedValue(GetXValue.instance, 2)), + new DamageTargetEffect(GetXValue.instance), BargainedCondition.instance, "{this} deals X damage to target creature or planeswalker. If this spell " + "was bargained, it deals twice X damage to that permanent instead." diff --git a/Mage.Sets/src/mage/cards/s/StormKingsThunder.java b/Mage.Sets/src/mage/cards/s/StormKingsThunder.java index ec6d8484d03..bdb92029a53 100644 --- a/Mage.Sets/src/mage/cards/s/StormKingsThunder.java +++ b/Mage.Sets/src/mage/cards/s/StormKingsThunder.java @@ -11,6 +11,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.Spell; +import mage.util.CardUtil; import java.util.UUID; @@ -55,7 +56,7 @@ class StormKingsThunderEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - game.addDelayedTriggeredAbility(new StormKingsThunderAbility(source.getManaCostsToPay().getX()), source); + game.addDelayedTriggeredAbility(new StormKingsThunderAbility(CardUtil.getSourceCostsTag(game, source, "X", 0)), source); return true; } } diff --git a/Mage.Sets/src/mage/cards/s/StreamOfLife.java b/Mage.Sets/src/mage/cards/s/StreamOfLife.java index 53445c05197..7b0cee2e8f5 100644 --- a/Mage.Sets/src/mage/cards/s/StreamOfLife.java +++ b/Mage.Sets/src/mage/cards/s/StreamOfLife.java @@ -2,7 +2,7 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.GainLifeTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,7 +20,7 @@ public final class StreamOfLife extends CardImpl { // Target player gains X life. - this.getSpellAbility().addEffect(new GainLifeTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new GainLifeTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/s/StreetSpasm.java b/Mage.Sets/src/mage/cards/s/StreetSpasm.java index fd6410f1899..4492e3de0d0 100644 --- a/Mage.Sets/src/mage/cards/s/StreetSpasm.java +++ b/Mage.Sets/src/mage/cards/s/StreetSpasm.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -36,10 +36,10 @@ public final class StreetSpasm extends CardImpl { // Street Spasm deals X damage to target creature without flying you don't control. this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); // Overload {X}{X}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") - this.addAbility(new OverloadAbility(this, new DamageAllEffect(ManacostVariableValue.REGULAR, filter), new ManaCostsImpl<>("{X}{X}{R}{R}"))); + this.addAbility(new OverloadAbility(this, new DamageAllEffect(GetXValue.instance, filter), new ManaCostsImpl<>("{X}{X}{R}{R}"))); } private StreetSpasm(final StreetSpasm card) { diff --git a/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java b/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java index 3b3d13695d8..81133636e13 100644 --- a/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java +++ b/Mage.Sets/src/mage/cards/s/StrengthOfTheTajuru.java @@ -15,6 +15,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.TargetsCountAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -59,7 +60,7 @@ class StrengthOfTheTajuruAddCountersTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { int affectedTargets = 0; - int amount = source.getManaCostsToPay().getX(); + int amount = CardUtil.getSourceCostsTag(game, source, "X", 0); Counter counter = CounterType.P1P1.createInstance(amount); for (UUID uuid : getTargetPointer().getTargets(game, source)) { Permanent permanent = game.getPermanent(uuid); diff --git a/Mage.Sets/src/mage/cards/s/StrokeOfGenius.java b/Mage.Sets/src/mage/cards/s/StrokeOfGenius.java index 7a7c34e2d47..1af7c1d87a7 100644 --- a/Mage.Sets/src/mage/cards/s/StrokeOfGenius.java +++ b/Mage.Sets/src/mage/cards/s/StrokeOfGenius.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -21,7 +21,7 @@ public final class StrokeOfGenius extends CardImpl { // Target player draws X cards. - this.getSpellAbility().addEffect(new DrawCardTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetPlayer()); } diff --git a/Mage.Sets/src/mage/cards/s/StumpsquallHydra.java b/Mage.Sets/src/mage/cards/s/StumpsquallHydra.java index cd1f12f3a8b..fa390531622 100644 --- a/Mage.Sets/src/mage/cards/s/StumpsquallHydra.java +++ b/Mage.Sets/src/mage/cards/s/StumpsquallHydra.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -91,7 +91,7 @@ class StumpsquallHydraEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = ManacostVariableValue.ETB.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); if (player == null || xValue < 1 || game.getBattlefield().count(filter, player.getId(), source, game) < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/s/SubterraneanHangar.java b/Mage.Sets/src/mage/cards/s/SubterraneanHangar.java index 4d31bf20015..d6c96264990 100644 --- a/Mage.Sets/src/mage/cards/s/SubterraneanHangar.java +++ b/Mage.Sets/src/mage/cards/s/SubterraneanHangar.java @@ -9,7 +9,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveVariableCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class SubterraneanHangar extends CardImpl { // {tap}, Remove any number of storage counters from Subterranean Hangar: Add {B} for each storage counter removed this way. Ability ability = new DynamicManaAbility( Mana.BlackMana(1), - RemovedCountersForCostValue.instance, + GetXValue.instance, new TapSourceCost(), "Add {B} for each storage counter removed this way", true, new CountersSourceCount(CounterType.STORAGE)); diff --git a/Mage.Sets/src/mage/cards/s/SubterraneanTremors.java b/Mage.Sets/src/mage/cards/s/SubterraneanTremors.java index 528b4b9b6be..8c9a1bac74d 100644 --- a/Mage.Sets/src/mage/cards/s/SubterraneanTremors.java +++ b/Mage.Sets/src/mage/cards/s/SubterraneanTremors.java @@ -1,8 +1,6 @@ package mage.cards.s; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; @@ -17,6 +15,10 @@ import mage.filter.predicate.mageobject.AbilityPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.SubterraneanTremorsLizardToken; +import mage.util.CardUtil; + +import java.util.List; +import java.util.UUID; /** * @@ -68,7 +70,7 @@ class SubterraneanTremorsEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int damage = source.getManaCostsToPay().getX(); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); UUID sourceId = source != null ? source.getSourceId() : null; UUID controllerId = source.getControllerId(); diff --git a/Mage.Sets/src/mage/cards/s/SuddenDemise.java b/Mage.Sets/src/mage/cards/s/SuddenDemise.java index 8f1d1bf6211..39ebf3e49b1 100644 --- a/Mage.Sets/src/mage/cards/s/SuddenDemise.java +++ b/Mage.Sets/src/mage/cards/s/SuddenDemise.java @@ -1,7 +1,6 @@ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -15,6 +14,9 @@ import mage.filter.predicate.mageobject.ColorPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -61,7 +63,7 @@ class SuddenDemiseDamageEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); ChoiceColor choice = new ChoiceColor(); if (controller != null && controller.choose(outcome, choice, game)) { - final int damage = source.getManaCostsToPay().getX(); + final int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterPermanent filter = new FilterCreaturePermanent(); filter.add(new ColorPredicate(choice.getColor())); for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source, game)) { diff --git a/Mage.Sets/src/mage/cards/s/SufferThePast.java b/Mage.Sets/src/mage/cards/s/SufferThePast.java index 4f2d3509d28..db76c2b50d2 100644 --- a/Mage.Sets/src/mage/cards/s/SufferThePast.java +++ b/Mage.Sets/src/mage/cards/s/SufferThePast.java @@ -13,6 +13,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetCardInOpponentsGraveyard; +import mage.util.CardUtil; import java.util.UUID; @@ -64,7 +65,7 @@ class SufferThePastEffect extends OneShotEffect { if (you == null || targetPlayer == null) { return false; } - int numberToTarget = Math.min(targetPlayer.getGraveyard().size(), source.getManaCostsToPay().getX()); + int numberToTarget = Math.min(targetPlayer.getGraveyard().size(), CardUtil.getSourceCostsTag(game, source, "X", 0)); if (numberToTarget < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/s/SummonsOfSaruman.java b/Mage.Sets/src/mage/cards/s/SummonsOfSaruman.java index dc2f9ea562a..237d6faaa44 100644 --- a/Mage.Sets/src/mage/cards/s/SummonsOfSaruman.java +++ b/Mage.Sets/src/mage/cards/s/SummonsOfSaruman.java @@ -1,11 +1,9 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.ExileXFromYourGraveCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.keyword.AmassEffect; import mage.abilities.keyword.FlashbackAbility; @@ -32,7 +30,7 @@ public final class SummonsOfSaruman extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}{R}"); // Amass Orcs X. Mill X cards. You may cast an instant or sorcery spell with mana value X or less from among them without paying its mana cost. (To amass Orcs X, put X +1/+1 counters on an Army you control. It’s also an Orc. If you don’t control an Army, create a 0/0 black Orc Army creature token first.) - this.getSpellAbility().addEffect(new AmassEffect(SummonsOfSarumanVariableValue.instance, SubType.ORC, false)); + this.getSpellAbility().addEffect(new AmassEffect(GetXValue.instance, SubType.ORC, false)); this.getSpellAbility().addEffect(new SummonsOfSarumanEffect()); // Flashback--{3}{U}{R}, Exile X cards from your graveyard. @@ -51,36 +49,6 @@ public final class SummonsOfSaruman extends CardImpl { } } -enum SummonsOfSarumanVariableValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - int xValue = sourceAbility.getManaCostsToPay().getX(); - for (Cost cost : sourceAbility.getCosts()) { - if (cost instanceof ExileXFromYourGraveCost) { - xValue = ((ExileXFromYourGraveCost) cost).getAmount(); - } - } - return xValue; - } - - @Override - public SummonsOfSarumanVariableValue copy() { - return this; - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return ""; - } -} - class SummonsOfSarumanEffect extends OneShotEffect { SummonsOfSarumanEffect() { @@ -103,7 +71,7 @@ class SummonsOfSarumanEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - int xValue = SummonsOfSarumanVariableValue.instance.calculate(game, source, this); + int xValue = GetXValue.instance.calculate(game, source, this); if (player == null || xValue < 1) { return false; } diff --git a/Mage.Sets/src/mage/cards/s/SupplyDemand.java b/Mage.Sets/src/mage/cards/s/SupplyDemand.java index b3faf815436..9f93d1f0f48 100644 --- a/Mage.Sets/src/mage/cards/s/SupplyDemand.java +++ b/Mage.Sets/src/mage/cards/s/SupplyDemand.java @@ -2,7 +2,7 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.cards.CardSetInfo; @@ -31,7 +31,7 @@ public final class SupplyDemand extends SplitCard { // Supply // create X 1/1 green Saproling creature tokens. - getLeftHalfCard().getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), ManacostVariableValue.REGULAR)); + getLeftHalfCard().getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), GetXValue.instance)); // Demand // Search your library for a multicolored card, reveal it, and put it into your hand. Then shuffle your library. diff --git a/Mage.Sets/src/mage/cards/s/SwallowingPlague.java b/Mage.Sets/src/mage/cards/s/SwallowingPlague.java index a7b0e7ce253..80c8671e535 100644 --- a/Mage.Sets/src/mage/cards/s/SwallowingPlague.java +++ b/Mage.Sets/src/mage/cards/s/SwallowingPlague.java @@ -2,7 +2,7 @@ package mage.cards.s; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -23,8 +23,8 @@ public final class SwallowingPlague extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{B}{B}"); this.subtype.add(SubType.ARCANE); - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR).concatBy("and")); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance).concatBy("and")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/s/SwellOfCourage.java b/Mage.Sets/src/mage/cards/s/SwellOfCourage.java index fbaf108b9a9..0f175991828 100644 --- a/Mage.Sets/src/mage/cards/s/SwellOfCourage.java +++ b/Mage.Sets/src/mage/cards/s/SwellOfCourage.java @@ -3,7 +3,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.keyword.ReinforceAbility; import mage.cards.CardImpl; @@ -24,7 +24,7 @@ public final class SwellOfCourage extends CardImpl { // Creatures you control get +2/+2 until end of turn. this.getSpellAbility().addEffect(new BoostControlledEffect(2,2, Duration.EndOfTurn)); // Reinforce X-{X}{W}{W} - this.addAbility(new ReinforceAbility(ManacostVariableValue.REGULAR, new ManaCostsImpl<>("{X}{W}{W}"))); + this.addAbility(new ReinforceAbility(GetXValue.instance, new ManaCostsImpl<>("{X}{W}{W}"))); } private SwellOfCourage(final SwellOfCourage card) { diff --git a/Mage.Sets/src/mage/cards/s/SylvanOffering.java b/Mage.Sets/src/mage/cards/s/SylvanOffering.java index f90287a6383..dc14ae99138 100644 --- a/Mage.Sets/src/mage/cards/s/SylvanOffering.java +++ b/Mage.Sets/src/mage/cards/s/SylvanOffering.java @@ -15,6 +15,7 @@ import mage.players.Player; import mage.target.Target; import mage.target.common.TargetOpponent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -66,7 +67,7 @@ class SylvanOfferingEffect1 extends OneShotEffect { target.choose(Outcome.Sacrifice, source.getControllerId(), source.getSourceId(), source, game); Player opponent = game.getPlayer(target.getFirstTarget()); if (opponent != null) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Effect effect = new CreateTokenTargetEffect(new SylvanOfferingTreefolkToken(xValue)); effect.setTargetPointer(new FixedTarget(controller.getId())); effect.apply(game, source); @@ -103,7 +104,7 @@ class SylvanOfferingEffect2 extends OneShotEffect { target.choose(Outcome.Sacrifice, source.getControllerId(), source.getSourceId(), source, game); Player opponent = game.getPlayer(target.getFirstTarget()); if (opponent != null) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Effect effect = new CreateTokenTargetEffect(new ElfWarriorToken(), xValue); effect.setTargetPointer(new FixedTarget(controller.getId())); effect.apply(game, source); diff --git a/Mage.Sets/src/mage/cards/s/Syncopate.java b/Mage.Sets/src/mage/cards/s/Syncopate.java index fd0b687d58b..53ae256958c 100644 --- a/Mage.Sets/src/mage/cards/s/Syncopate.java +++ b/Mage.Sets/src/mage/cards/s/Syncopate.java @@ -1,6 +1,6 @@ package mage.cards.s; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -18,7 +18,7 @@ public final class Syncopate extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}"); // Counter target spell unless its controller pays {X}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. - this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR, true)); + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(GetXValue.instance, true)); this.getSpellAbility().addTarget(new TargetSpell()); } diff --git a/Mage.Sets/src/mage/cards/t/TaiiWakeenPerfectShot.java b/Mage.Sets/src/mage/cards/t/TaiiWakeenPerfectShot.java index 8007bf09ed2..4426c69af63 100644 --- a/Mage.Sets/src/mage/cards/t/TaiiWakeenPerfectShot.java +++ b/Mage.Sets/src/mage/cards/t/TaiiWakeenPerfectShot.java @@ -116,7 +116,7 @@ class TaiiWakeenPerfectShotEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(CardUtil.overflowInc(event.getAmount(), source.getManaCostsToPay().getX())); + event.setAmount(CardUtil.overflowInc(event.getAmount(), CardUtil.getSourceCostsTag(game, source, "X", 0))); return false; } diff --git a/Mage.Sets/src/mage/cards/t/TalonOfPain.java b/Mage.Sets/src/mage/cards/t/TalonOfPain.java index 32b4571e422..ecb6b7222c3 100644 --- a/Mage.Sets/src/mage/cards/t/TalonOfPain.java +++ b/Mage.Sets/src/mage/cards/t/TalonOfPain.java @@ -9,7 +9,7 @@ import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -23,6 +23,7 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; import java.util.UUID; @@ -42,7 +43,7 @@ public final class TalonOfPain extends CardImpl { this.addAbility(new TalonOfPainTriggeredAbility()); // {X}, {T}, Remove X charge counters from Talon of Pain: Talon of Pain deals X damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.REGULAR, "it"), new ManaCostsImpl<>("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(GetXValue.instance, "it"), new ManaCostsImpl<>("{X}")); ability.addCost(new TapSourceCost()); ability.addCost(new TalonOfPainRemoveVariableCountersSourceCost(CounterType.CHARGE.createInstance())); ability.addTarget(new TargetAnyTarget()); @@ -161,7 +162,7 @@ class TalonOfPainRemoveVariableCountersSourceCost extends VariableCostImpl { @Override public int announceXValue(Ability source, Game game) { - return source.getManaCostsToPay().getX(); + return CardUtil.getSourceCostsTag(game, source, "X", 0); } } diff --git a/Mage.Sets/src/mage/cards/t/TectonicBreak.java b/Mage.Sets/src/mage/cards/t/TectonicBreak.java index b77a65f441d..e67f29a6e84 100644 --- a/Mage.Sets/src/mage/cards/t/TectonicBreak.java +++ b/Mage.Sets/src/mage/cards/t/TectonicBreak.java @@ -2,7 +2,7 @@ package mage.cards.t; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.SacrificeAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class TectonicBreak extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{R}{R}"); // Each player sacrifices X lands. - this.getSpellAbility().addEffect(new SacrificeAllEffect(ManacostVariableValue.REGULAR, new FilterControlledLandPermanent("lands"))); + this.getSpellAbility().addEffect(new SacrificeAllEffect(GetXValue.instance, new FilterControlledLandPermanent("lands"))); } private TectonicBreak(final TectonicBreak card) { diff --git a/Mage.Sets/src/mage/cards/t/Temper.java b/Mage.Sets/src/mage/cards/t/Temper.java index e6e5759e9cc..56e84ea56ba 100644 --- a/Mage.Sets/src/mage/cards/t/Temper.java +++ b/Mage.Sets/src/mage/cards/t/Temper.java @@ -2,7 +2,7 @@ package mage.cards.t; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.PreventionEffectImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +28,7 @@ public final class Temper extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{1}{W}"); // Prevent the next X damage that would be dealt to target creature this turn. For each 1 damage prevented this way, put a +1/+1 counter on that creature. - this.getSpellAbility().addEffect(new TemperPreventDamageTargetEffect(ManacostVariableValue.REGULAR, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new TemperPreventDamageTargetEffect(GetXValue.instance, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java b/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java index 9f54668fca4..dcf5c20014c 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithVengeance.java @@ -1,7 +1,6 @@ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -12,6 +11,9 @@ import mage.game.Game; import mage.game.permanent.token.Elemental11HasteToken; import mage.game.permanent.token.Token; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -55,7 +57,7 @@ class TemptWithVengeanceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (controller != null && xValue > 0) { Token tokenCopy = new Elemental11HasteToken(); diff --git a/Mage.Sets/src/mage/cards/t/TerisiaresDevastation.java b/Mage.Sets/src/mage/cards/t/TerisiaresDevastation.java index 313d4c944f7..9a9e4ae84f1 100644 --- a/Mage.Sets/src/mage/cards/t/TerisiaresDevastation.java +++ b/Mage.Sets/src/mage/cards/t/TerisiaresDevastation.java @@ -1,7 +1,7 @@ package mage.cards.t; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; @@ -26,8 +26,8 @@ public final class TerisiaresDevastation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{2}{B}{B}"); // You lose X life and create X tapped Powerstone tokens. Then all creatures get -1/-1 until end of turn for each artifact you control. - this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR)); - this.getSpellAbility().addEffect(new CreateTokenEffect(new PowerstoneToken(), ManacostVariableValue.REGULAR, true, false).concatBy("and")); + this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(GetXValue.instance)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new PowerstoneToken(), GetXValue.instance, true, false).concatBy("and")); this.getSpellAbility().addEffect(new BoostAllEffect( xValue, xValue, Duration.EndOfTurn) .concatBy("Then")); diff --git a/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java b/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java index 4bb62afb722..524cec21d69 100644 --- a/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java +++ b/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.VariableCostType; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; @@ -27,7 +27,7 @@ public final class TestamentOfFaith extends CardImpl { // {X}: Testament of Faith becomes an X/X Wall creature with defender in addition to its other types until end of turn. Ability ability = new SimpleActivatedAbility(new SetBasePowerToughnessSourceEffect( - ManacostVariableValue.REGULAR, Duration.EndOfTurn + GetXValue.instance, Duration.EndOfTurn ).setText("{this} becomes an X/X"), new VariableManaCost(VariableCostType.NORMAL)); ability.addEffect(new TestamentOfFaithEffect()); ability.addEffect(new GainAbilitySourceEffect( diff --git a/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java b/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java index 5140e8aa1ad..8ac4fc2e510 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java @@ -1,12 +1,8 @@ package mage.cards.t; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -22,6 +18,10 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetArtifactPermanent; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; + +import java.util.List; +import java.util.UUID; /** * @@ -79,12 +79,7 @@ class TezzeretTheSeekerEffect2 extends OneShotEffect { return false; } - int cmc = 0; - for (Cost cost : source.getCosts()) { - if (cost instanceof PayVariableLoyaltyCost) { - cmc = ((PayVariableLoyaltyCost) cost).getAmount(); - } - } + int cmc = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterArtifactCard filter = new FilterArtifactCard("artifact card with mana value " + cmc + " or less"); filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, cmc + 1)); diff --git a/Mage.Sets/src/mage/cards/t/ThassasIntervention.java b/Mage.Sets/src/mage/cards/t/ThassasIntervention.java index 25f59fe9797..5135ca9f1cc 100644 --- a/Mage.Sets/src/mage/cards/t/ThassasIntervention.java +++ b/Mage.Sets/src/mage/cards/t/ThassasIntervention.java @@ -3,7 +3,7 @@ package mage.cards.t; import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.CardImpl; @@ -19,7 +19,7 @@ import java.util.UUID; */ public final class ThassasIntervention extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.REGULAR, 2); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); public ThassasIntervention(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{U}"); @@ -27,7 +27,7 @@ public final class ThassasIntervention extends CardImpl { // Choose one- // • Look at the top X cards of your library. Put up to two of them into your hand and the rest on the bottom of your library in a random order. this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect( - ManacostVariableValue.REGULAR, 2, PutCards.HAND, PutCards.BOTTOM_RANDOM, true)); + GetXValue.instance, 2, PutCards.HAND, PutCards.BOTTOM_RANDOM, true)); // • Counter target spell unless its controller pays twice {X}. Mode mode = new Mode(new CounterUnlessPaysEffect(xValue) diff --git a/Mage.Sets/src/mage/cards/t/TheBattleOfEndor.java b/Mage.Sets/src/mage/cards/t/TheBattleOfEndor.java index a297e52f374..0f7f0b0222f 100644 --- a/Mage.Sets/src/mage/cards/t/TheBattleOfEndor.java +++ b/Mage.Sets/src/mage/cards/t/TheBattleOfEndor.java @@ -1,8 +1,7 @@ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; @@ -21,6 +20,9 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.EwokToken; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -32,7 +34,7 @@ public final class TheBattleOfEndor extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{X}{G}{G}{G}"); // Create X 1/1 green Ewok creature tokens. - this.getSpellAbility().addEffect(new CreateTokenEffect(new EwokToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new EwokToken(), GetXValue.instance)); // Put X +1/+1 counters on each creature you control. this.getSpellAbility().addEffect(new TheBattleOfEndorEffect()); @@ -78,7 +80,7 @@ class TheBattleOfEndorEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterControlledCreaturePermanent(), source.getControllerId(), source, game)) { - permanent.addCounters(CounterType.P1P1.createInstance(source.getManaCostsToPay().getX()), source.getControllerId(), source, game); + permanent.addCounters(CounterType.P1P1.createInstance(CardUtil.getSourceCostsTag(game, source, "X", 0)), source.getControllerId(), source, game); } return true; } diff --git a/Mage.Sets/src/mage/cards/t/TheBattleOfGeonosis.java b/Mage.Sets/src/mage/cards/t/TheBattleOfGeonosis.java index df6181cf995..085d0f7f7f4 100644 --- a/Mage.Sets/src/mage/cards/t/TheBattleOfGeonosis.java +++ b/Mage.Sets/src/mage/cards/t/TheBattleOfGeonosis.java @@ -3,7 +3,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.dynamicvalue.IntPlusDynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageAllEffect; @@ -27,15 +27,15 @@ public final class TheBattleOfGeonosis extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{R}{R}"); // The Battle of Geonosis deals X + 1 damage to each opponent and each creature your opponents control. - Effect effect = new DamagePlayersEffect(Outcome.Damage, new IntPlusDynamicValue(1, ManacostVariableValue.REGULAR), TargetController.OPPONENT); + Effect effect = new DamagePlayersEffect(Outcome.Damage, new IntPlusDynamicValue(1, GetXValue.instance), TargetController.OPPONENT); effect.setText("The Battle of Geonosis deals X plus 1 damage to each opponent"); this.getSpellAbility().addEffect(effect); - effect = new DamageAllEffect(new IntPlusDynamicValue(1, ManacostVariableValue.REGULAR), new FilterOpponentsCreaturePermanent()); + effect = new DamageAllEffect(new IntPlusDynamicValue(1, GetXValue.instance), new FilterOpponentsCreaturePermanent()); effect.setText("and each creature your opponents control"); this.getSpellAbility().addEffect(effect); // Creatures you control get +X/+0 until end of turn. - this.getSpellAbility().addEffect(new BoostControlledEffect(ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostControlledEffect(GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn)); } diff --git a/Mage.Sets/src/mage/cards/t/TheBattleOfHoth.java b/Mage.Sets/src/mage/cards/t/TheBattleOfHoth.java index 356b801ed54..7ec0ecefbc1 100644 --- a/Mage.Sets/src/mage/cards/t/TheBattleOfHoth.java +++ b/Mage.Sets/src/mage/cards/t/TheBattleOfHoth.java @@ -2,7 +2,7 @@ package mage.cards.t; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class TheBattleOfHoth extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{W}{W}{W}"); // Create X 5/5 white artifact AT-AT creature tokens wiht "When this creature dies, create two 1/1 white Trooper creature tokens." - this.getSpellAbility().addEffect(new CreateTokenEffect(new ATATToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new ATATToken(), GetXValue.instance)); } private TheBattleOfHoth(final TheBattleOfHoth card) { diff --git a/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java b/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java index 26c265dabe9..1fafbe45683 100644 --- a/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java +++ b/Mage.Sets/src/mage/cards/t/TheBattleOfNaboo.java @@ -13,6 +13,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import mage.target.targetadjustment.XTargetsCountAdjuster; +import mage.util.CardUtil; import java.util.UUID; @@ -63,7 +64,7 @@ class TheBattleOfNabooEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - int x = source.getManaCostsToPay().getX(); + int x = CardUtil.getSourceCostsTag(game, source, "X", 0); if (x > 0) { player.drawCards(2 * x, source, game); } diff --git a/Mage.Sets/src/mage/cards/t/TheBattleOfYavin.java b/Mage.Sets/src/mage/cards/t/TheBattleOfYavin.java index 8cc0f416af2..e083e045774 100644 --- a/Mage.Sets/src/mage/cards/t/TheBattleOfYavin.java +++ b/Mage.Sets/src/mage/cards/t/TheBattleOfYavin.java @@ -5,7 +5,7 @@ import java.util.LinkedList; import java.util.List; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -65,7 +65,7 @@ class TheBattleOfYavinEffect extends OneShotEffect { return false; } - int amount = (ManacostVariableValue.REGULAR).calculate(game, source, this); + int amount = (GetXValue.instance).calculate(game, source, this); if (amount > 0) { LinkedList sacrifices = new LinkedList<>(); diff --git a/Mage.Sets/src/mage/cards/t/TheGooseMother.java b/Mage.Sets/src/mage/cards/t/TheGooseMother.java index 1d41708a81d..30b6dc9bbb1 100644 --- a/Mage.Sets/src/mage/cards/t/TheGooseMother.java +++ b/Mage.Sets/src/mage/cards/t/TheGooseMother.java @@ -7,7 +7,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.HalfValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.DrawCardSourceControllerEffect; @@ -29,7 +29,7 @@ import java.util.UUID; */ public final class TheGooseMother extends CardImpl { - private static final DynamicValue halfX = new HalfValue(ManacostVariableValue.ETB, true); + private static final DynamicValue halfX = new HalfValue(GetXValue.instance, true); public TheGooseMother(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{U}"); diff --git a/Mage.Sets/src/mage/cards/t/TheManaRig.java b/Mage.Sets/src/mage/cards/t/TheManaRig.java index d206c1a20f5..c61a456409f 100644 --- a/Mage.Sets/src/mage/cards/t/TheManaRig.java +++ b/Mage.Sets/src/mage/cards/t/TheManaRig.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.cards.CardImpl; @@ -34,7 +34,7 @@ public final class TheManaRig extends CardImpl { // {X}{X}{X}, {T}: Look at the top X cards of your library. Put up to two of them into your hand and the rest on the bottom of your library in a random order. Ability ability = new SimpleActivatedAbility(new LookLibraryAndPickControllerEffect( - ManacostVariableValue.REGULAR, 2, PutCards.HAND, PutCards.BOTTOM_RANDOM, true + GetXValue.instance, 2, PutCards.HAND, PutCards.BOTTOM_RANDOM, true ).setText("Look at the top X cards of your library. " + "Put up to two of them into your hand and the rest on the bottom of your library in a random order"), new ManaCostsImpl<>("{X}{X}{X}") diff --git a/Mage.Sets/src/mage/cards/t/TheMeathookMassacre.java b/Mage.Sets/src/mage/cards/t/TheMeathookMassacre.java index 278556e04c9..9cc167289ab 100644 --- a/Mage.Sets/src/mage/cards/t/TheMeathookMassacre.java +++ b/Mage.Sets/src/mage/cards/t/TheMeathookMassacre.java @@ -4,7 +4,7 @@ import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.MultipliedValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; @@ -22,7 +22,7 @@ import java.util.UUID; */ public final class TheMeathookMassacre extends CardImpl { - private static final DynamicValue xValue = new MultipliedValue(ManacostVariableValue.ETB, -1); + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, -1); public TheMeathookMassacre(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{X}{B}{B}"); diff --git a/Mage.Sets/src/mage/cards/t/TheirNumberIsLegion.java b/Mage.Sets/src/mage/cards/t/TheirNumberIsLegion.java index 94422c4db91..be8bfc7973f 100644 --- a/Mage.Sets/src/mage/cards/t/TheirNumberIsLegion.java +++ b/Mage.Sets/src/mage/cards/t/TheirNumberIsLegion.java @@ -2,7 +2,7 @@ package mage.cards.t; import mage.abilities.common.MayCastFromGraveyardSourceAbility; import mage.abilities.dynamicvalue.common.ArtifactYouControlCount; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ExileSpellEffect; import mage.abilities.effects.common.GainLifeEffect; @@ -23,7 +23,7 @@ public final class TheirNumberIsLegion extends CardImpl { // Create X tapped 2/2 black Necron Warrior artifact creature tokens, then you gain life equal to the number of artifacts you control. Exile Their Number Is Legion. this.getSpellAbility().addEffect(new CreateTokenEffect( - new NecronWarriorToken(), ManacostVariableValue.REGULAR, true, false + new NecronWarriorToken(), GetXValue.instance, true, false )); this.getSpellAbility().addEffect(new GainLifeEffect(ArtifactYouControlCount.instance) .setText(", then you gain life equal to the number of artifacts you control")); diff --git a/Mage.Sets/src/mage/cards/t/ThoughtDissector.java b/Mage.Sets/src/mage/cards/t/ThoughtDissector.java index 16b496b5208..be534090e70 100644 --- a/Mage.Sets/src/mage/cards/t/ThoughtDissector.java +++ b/Mage.Sets/src/mage/cards/t/ThoughtDissector.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.VariableManaCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -49,7 +49,7 @@ public final class ThoughtDissector extends CardImpl { class ThoughtDissectorEffect extends OneShotEffect { - private static final ManacostVariableValue amount = ManacostVariableValue.REGULAR; + private static final GetXValue amount = GetXValue.instance; public ThoughtDissectorEffect() { super(Outcome.Detriment); diff --git a/Mage.Sets/src/mage/cards/t/Timecrafting.java b/Mage.Sets/src/mage/cards/t/Timecrafting.java index 3866ac29ec3..e6dc9db81a2 100644 --- a/Mage.Sets/src/mage/cards/t/Timecrafting.java +++ b/Mage.Sets/src/mage/cards/t/Timecrafting.java @@ -1,7 +1,6 @@ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; @@ -16,6 +15,9 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetPermanentOrSuspendedCard; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -71,7 +73,7 @@ class TimecraftingRemoveEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { permanent.removeCounters(CounterType.TIME.createInstance(xValue), source, game); @@ -108,7 +110,7 @@ class TimecraftingAddEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { permanent.addCounters(CounterType.TIME.createInstance(xValue), source.getControllerId(), source, game); diff --git a/Mage.Sets/src/mage/cards/t/TitansRevenge.java b/Mage.Sets/src/mage/cards/t/TitansRevenge.java index 4002f0a911c..4036e171587 100644 --- a/Mage.Sets/src/mage/cards/t/TitansRevenge.java +++ b/Mage.Sets/src/mage/cards/t/TitansRevenge.java @@ -2,7 +2,7 @@ package mage.cards.t; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DoIfClashWonEffect; import mage.abilities.effects.common.ReturnToHandSpellEffect; @@ -22,7 +22,7 @@ public final class TitansRevenge extends CardImpl { // Titan's Revenge deals X damage to any target. Clash with an opponent. If you win, return Titan's Revenge to its owner's hand. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); this.getSpellAbility().addEffect(new DoIfClashWonEffect(ReturnToHandSpellEffect.getInstance())); } diff --git a/Mage.Sets/src/mage/cards/t/TorchBreath.java b/Mage.Sets/src/mage/cards/t/TorchBreath.java index e3ec989f658..e9aa76474ea 100644 --- a/Mage.Sets/src/mage/cards/t/TorchBreath.java +++ b/Mage.Sets/src/mage/cards/t/TorchBreath.java @@ -5,7 +5,7 @@ import mage.abilities.common.CantBeCounteredSourceAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; import mage.abilities.condition.common.SourceTargetsPermanentCondition; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; import mage.cards.CardImpl; @@ -44,7 +44,7 @@ public final class TorchBreath extends CardImpl { this.addAbility(new CantBeCounteredSourceAbility().setRuleAtTheTop(true)); // Torch Breath deals X damage to target creature or planeswalker. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); } diff --git a/Mage.Sets/src/mage/cards/t/TorchTheWitness.java b/Mage.Sets/src/mage/cards/t/TorchTheWitness.java index 0e3debc6624..283c3409be3 100644 --- a/Mage.Sets/src/mage/cards/t/TorchTheWitness.java +++ b/Mage.Sets/src/mage/cards/t/TorchTheWitness.java @@ -10,6 +10,7 @@ import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -60,7 +61,7 @@ class TorchTheWitnessEffect extends OneShotEffect { return false; } int lethal = permanent.getLethalDamage(source.getSourceId(), game); - if (lethal < permanent.damage(2 * source.getManaCostsToPay().getX(), source, game)) { + if (lethal < permanent.damage(2 * CardUtil.getSourceCostsTag(game, source, "X", 0), source, game)) { InvestigateEffect.doInvestigate(source.getControllerId(), 1, game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java index e8907636797..b795375e9ed 100644 --- a/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java +++ b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java @@ -1,6 +1,5 @@ package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -13,6 +12,9 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -58,7 +60,7 @@ class TormentOfHailfireEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int repeat = source.getManaCostsToPay().getX(); + int repeat = CardUtil.getSourceCostsTag(game, source, "X", 0); for (int i = 1; i <= repeat; i++) { for (UUID opponentId : game.getOpponents(source.getControllerId())) { diff --git a/Mage.Sets/src/mage/cards/t/TorrentOfLava.java b/Mage.Sets/src/mage/cards/t/TorrentOfLava.java index 4ad328c94c8..baef9a30aad 100644 --- a/Mage.Sets/src/mage/cards/t/TorrentOfLava.java +++ b/Mage.Sets/src/mage/cards/t/TorrentOfLava.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.effects.common.PreventDamageToSourceEffect; @@ -41,7 +41,7 @@ public final class TorrentOfLava extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}"); // Torrent of Lava deals X damage to each creature without flying. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filter)); // As long as Torrent of Lava is on the stack, each creature has // "{tap}: Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn." diff --git a/Mage.Sets/src/mage/cards/t/TovolarTheMidnightScourge.java b/Mage.Sets/src/mage/cards/t/TovolarTheMidnightScourge.java index 4f72fce9f2c..4f6a6f75d0a 100644 --- a/Mage.Sets/src/mage/cards/t/TovolarTheMidnightScourge.java +++ b/Mage.Sets/src/mage/cards/t/TovolarTheMidnightScourge.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -58,7 +58,7 @@ public final class TovolarTheMidnightScourge extends CardImpl { TrampleAbility.getInstance(), Duration.EndOfTurn ).setText("Target Wolf or Werewolf you control gets +X/+0"), new ManaCostsImpl<>("{X}{R}{G}")); ability.addEffect(new BoostTargetEffect( - ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn + GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn ).setText("and gains trample until end of turn")); ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TranscendentMessage.java b/Mage.Sets/src/mage/cards/t/TranscendentMessage.java index e068f0038cb..346af0ad93c 100644 --- a/Mage.Sets/src/mage/cards/t/TranscendentMessage.java +++ b/Mage.Sets/src/mage/cards/t/TranscendentMessage.java @@ -1,6 +1,6 @@ package mage.cards.t; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.ConvokeAbility; import mage.cards.CardImpl; @@ -21,7 +21,7 @@ public final class TranscendentMessage extends CardImpl { this.addAbility(new ConvokeAbility()); // Draw X cards. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); } private TranscendentMessage(final TranscendentMessage card) { diff --git a/Mage.Sets/src/mage/cards/t/TreasureVault.java b/Mage.Sets/src/mage/cards/t/TreasureVault.java index cc39a506293..ee7db5c78bc 100644 --- a/Mage.Sets/src/mage/cards/t/TreasureVault.java +++ b/Mage.Sets/src/mage/cards/t/TreasureVault.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; @@ -29,7 +29,7 @@ public final class TreasureVault extends CardImpl { // {X}{X}, {T}, Sacrifice Treasure Vault: Create X Treasure tokens. Ability ability = new SimpleActivatedAbility( - new CreateTokenEffect(new TreasureToken(), ManacostVariableValue.REGULAR), + new CreateTokenEffect(new TreasureToken(), GetXValue.instance), new ManaCostsImpl<>("{X}{X}") ); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/t/TribalUnity.java b/Mage.Sets/src/mage/cards/t/TribalUnity.java index 8fcda7125b2..9e0829c0672 100644 --- a/Mage.Sets/src/mage/cards/t/TribalUnity.java +++ b/Mage.Sets/src/mage/cards/t/TribalUnity.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; @@ -29,7 +29,7 @@ public final class TribalUnity extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{2}{G}"); // Creatures of the creature type of your choice get +X/+X until end of turn. - this.getSpellAbility().addEffect(new TribalUnityEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new TribalUnityEffect(GetXValue.instance)); } private TribalUnity(final TribalUnity card) { diff --git a/Mage.Sets/src/mage/cards/t/TropicalStorm.java b/Mage.Sets/src/mage/cards/t/TropicalStorm.java index 3990c86d6cf..d1b8392b927 100644 --- a/Mage.Sets/src/mage/cards/t/TropicalStorm.java +++ b/Mage.Sets/src/mage/cards/t/TropicalStorm.java @@ -3,7 +3,7 @@ package mage.cards.t; import java.util.UUID; import mage.ObjectColor; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -31,7 +31,7 @@ public final class TropicalStorm extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}"); // Tropical Storm deals X damage to each creature with flying and 1 additional damage to each blue creature. - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filter)); this.getSpellAbility().addEffect(new DamageAllEffect(1, filter2).setText("and 1 additional damage to each blue creature")); } diff --git a/Mage.Sets/src/mage/cards/t/TyvarsStand.java b/Mage.Sets/src/mage/cards/t/TyvarsStand.java index 3a9e2d8e382..c1f43736396 100644 --- a/Mage.Sets/src/mage/cards/t/TyvarsStand.java +++ b/Mage.Sets/src/mage/cards/t/TyvarsStand.java @@ -1,6 +1,6 @@ package mage.cards.t; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HexproofAbility; @@ -23,7 +23,7 @@ public final class TyvarsStand extends CardImpl { // Target creature you control gets +X/+X and gains hexproof and indestructible until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect( - ManacostVariableValue.REGULAR, ManacostVariableValue.REGULAR, Duration.EndOfTurn + GetXValue.instance, GetXValue.instance, Duration.EndOfTurn ).setText("target creature you control gets +X/+X")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HexproofAbility.getInstance()) .setText("and gains hexproof")); diff --git a/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java b/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java index 1ab8217f9fc..97a04b60c3f 100644 --- a/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java +++ b/Mage.Sets/src/mage/cards/u/UginTheSpiritDragon.java @@ -1,25 +1,15 @@ package mage.cards.u; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.PayVariableLoyaltyCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.ComparisonType; -import mage.constants.Outcome; -import mage.constants.SuperType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterPermanent; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.Predicates; @@ -27,8 +17,13 @@ import mage.filter.predicate.mageobject.ColorlessPredicate; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; -import mage.target.common.TargetCardInHand; import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetCardInHand; +import mage.util.CardUtil; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; /** * @@ -90,12 +85,7 @@ class UginTheSpiritDragonEffect2 extends OneShotEffect { return false; } - int cmc = 0; - for (Cost cost : source.getCosts()) { - if (cost instanceof PayVariableLoyaltyCost) { - cmc = ((PayVariableLoyaltyCost) cost).getAmount(); - } - } + int cmc = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterPermanent filter = new FilterPermanent("permanent with mana value X or less that's one or more colors"); filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, cmc + 1)); diff --git a/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java index 90a6a007311..cca1729abf7 100644 --- a/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java +++ b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java @@ -13,6 +13,7 @@ import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.target.common.TargetCardWithDifferentNameInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -57,7 +58,7 @@ class UncageTheMenagerieEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); FilterCard filter = new FilterCreatureCard(xValue + " creature cards with different names that each have mana value " + xValue); filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, xValue)); return new SearchLibraryPutInHandEffect( diff --git a/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java b/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java index 09400019947..f4e3f5eb224 100644 --- a/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java +++ b/Mage.Sets/src/mage/cards/u/UnexpectedlyAbsent.java @@ -1,6 +1,5 @@ package mage.cards.u; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -12,6 +11,9 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -60,7 +62,7 @@ class UnexpectedlyAbsentEffect extends OneShotEffect { if (controller != null) { Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { - controller.putCardOnTopXOfLibrary(permanent, game, source, source.getManaCostsToPay().getX() + 1, true); + controller.putCardOnTopXOfLibrary(permanent, game, source, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1, true); return true; } } diff --git a/Mage.Sets/src/mage/cards/u/UniversalSurveillance.java b/Mage.Sets/src/mage/cards/u/UniversalSurveillance.java index d45a25ce2bd..9d33b314635 100644 --- a/Mage.Sets/src/mage/cards/u/UniversalSurveillance.java +++ b/Mage.Sets/src/mage/cards/u/UniversalSurveillance.java @@ -1,6 +1,6 @@ package mage.cards.u; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.ImproviseAbility; import mage.cards.CardImpl; @@ -21,7 +21,7 @@ public final class UniversalSurveillance extends CardImpl { this.addAbility(new ImproviseAbility()); // Draw X cards. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance)); } private UniversalSurveillance(final UniversalSurveillance card) { diff --git a/Mage.Sets/src/mage/cards/u/UntamedMight.java b/Mage.Sets/src/mage/cards/u/UntamedMight.java index 302e603a706..625df6fcee4 100644 --- a/Mage.Sets/src/mage/cards/u/UntamedMight.java +++ b/Mage.Sets/src/mage/cards/u/UntamedMight.java @@ -3,7 +3,7 @@ package mage.cards.u; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,7 +20,7 @@ public final class UntamedMight extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{G}"); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.REGULAR, ManacostVariableValue.REGULAR, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostTargetEffect(GetXValue.instance, GetXValue.instance, Duration.EndOfTurn)); } private UntamedMight(final UntamedMight card) { diff --git a/Mage.Sets/src/mage/cards/u/UnwillingRecruit.java b/Mage.Sets/src/mage/cards/u/UnwillingRecruit.java index 15a3789390c..57c09d81cd3 100644 --- a/Mage.Sets/src/mage/cards/u/UnwillingRecruit.java +++ b/Mage.Sets/src/mage/cards/u/UnwillingRecruit.java @@ -1,7 +1,7 @@ package mage.cards.u; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -26,7 +26,7 @@ public final class UnwillingRecruit extends CardImpl { // Gain control of target creature until end of turn. Untap that creature. It gets +X/+0 and gains haste until end of turn. this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)); this.getSpellAbility().addEffect(new UntapTargetEffect().setText("Untap that creature")); - this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.REGULAR, StaticValue.get(0), Duration.EndOfTurn) + this.getSpellAbility().addEffect(new BoostTargetEffect(GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn) .setText("It gets +X/+0")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn) .setText("and gains haste until end of turn.")); diff --git a/Mage.Sets/src/mage/cards/v/ValkiGodOfLies.java b/Mage.Sets/src/mage/cards/v/ValkiGodOfLies.java index 11c45624354..35ad5c79eed 100644 --- a/Mage.Sets/src/mage/cards/v/ValkiGodOfLies.java +++ b/Mage.Sets/src/mage/cards/v/ValkiGodOfLies.java @@ -167,7 +167,7 @@ class ValkiGodOfLiesCopyExiledEffect extends OneShotEffect { && Valki != null) { UUID exileId = CardUtil.getCardExileZoneId(game, source); FilterCard filter = new FilterCard(); - filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, source.getManaCostsToPay().getX())); + filter.add(new ManaValuePredicate(ComparisonType.EQUAL_TO, CardUtil.getSourceCostsTag(game, source, "X", 0))); TargetCardInExile target = new TargetCardInExile(filter, exileId); Cards cards = game.getExile().getExileZone(exileId); if (cards != null diff --git a/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java b/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java index e8702a9aec5..b26abe9cb33 100644 --- a/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java +++ b/Mage.Sets/src/mage/cards/v/VenarianGlimmer.java @@ -1,7 +1,6 @@ package mage.cards.v; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -17,6 +16,9 @@ import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -63,7 +65,7 @@ class VenarianGlimmerEffect extends OneShotEffect { Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); if (player != null) { FilterCard filter = new FilterNonlandCard(); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); Effect effect = new DiscardCardYouChooseTargetEffect(filter); effect.setTargetPointer(this.getTargetPointer().copy()); effect.apply(game, source); diff --git a/Mage.Sets/src/mage/cards/v/VenarianGold.java b/Mage.Sets/src/mage/cards/v/VenarianGold.java index 7bd6453fdf5..dbc473ad063 100644 --- a/Mage.Sets/src/mage/cards/v/VenarianGold.java +++ b/Mage.Sets/src/mage/cards/v/VenarianGold.java @@ -1,6 +1,5 @@ package mage.cards.v; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; @@ -24,6 +23,9 @@ import mage.game.Game; import mage.game.stack.StackObject; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; + +import java.util.UUID; /** * @author L_J @@ -71,7 +73,7 @@ class VenarianGoldValue implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { MageObject mageObject = game.getLastKnownInformation(sourceAbility.getSourceId(), Zone.STACK); if (mageObject instanceof StackObject) { - return ((StackObject) mageObject).getStackAbility().getManaCostsToPay().getX(); + return CardUtil.getSourceCostsTag(game, ((StackObject) mageObject).getStackAbility(), "X", 0); } return 0; } diff --git a/Mage.Sets/src/mage/cards/v/VengefulArchon.java b/Mage.Sets/src/mage/cards/v/VengefulArchon.java index cf2dcb1d448..8a3e37a158f 100644 --- a/Mage.Sets/src/mage/cards/v/VengefulArchon.java +++ b/Mage.Sets/src/mage/cards/v/VengefulArchon.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.PreventionEffectData; import mage.abilities.effects.common.PreventDamageToControllerEffect; import mage.abilities.keyword.FlyingAbility; @@ -56,7 +56,7 @@ public final class VengefulArchon extends CardImpl { class VengefulArchonEffect extends PreventDamageToControllerEffect { VengefulArchonEffect() { - super(Duration.EndOfTurn, false, true, ManacostVariableValue.REGULAR); + super(Duration.EndOfTurn, false, true, GetXValue.instance); staticText = "Prevent the next X damage that would be dealt to you this turn. If damage is prevented this way, {this} deals that much damage to target player or planeswalker"; } diff --git a/Mage.Sets/src/mage/cards/v/VentifactBottle.java b/Mage.Sets/src/mage/cards/v/VentifactBottle.java index aa5d41ea03f..75a07de6752 100644 --- a/Mage.Sets/src/mage/cards/v/VentifactBottle.java +++ b/Mage.Sets/src/mage/cards/v/VentifactBottle.java @@ -10,7 +10,7 @@ import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -36,7 +36,7 @@ public final class VentifactBottle extends CardImpl { // {X}{1}, {tap}: Put X charge counters on Ventifact Bottle. Activate this ability only any time you could cast a sorcery. Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, - new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), ManacostVariableValue.REGULAR, true), + new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), GetXValue.instance, true), new ManaCostsImpl<>("{X}{1}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VerdelothTheAncient.java b/Mage.Sets/src/mage/cards/v/VerdelothTheAncient.java index 93e17473347..3f671b184a3 100644 --- a/Mage.Sets/src/mage/cards/v/VerdelothTheAncient.java +++ b/Mage.Sets/src/mage/cards/v/VerdelothTheAncient.java @@ -6,7 +6,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.KickedCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.dynamicvalue.common.GetKickerXValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.keyword.KickerAbility; @@ -55,7 +55,7 @@ public final class VerdelothTheAncient extends CardImpl { // When Verdeloth the Ancient enters the battlefield, if it was kicked, create X 1/1 green Saproling creature tokens. this.addAbility(new ConditionalInterveningIfTriggeredAbility(new EntersBattlefieldTriggeredAbility( - new CreateTokenEffect(new SaprolingToken(), GetKickerXValue.instance), false + new CreateTokenEffect(new SaprolingToken(), GetXValue.instance), false ), KickedCondition.ONCE, "When {this} enters the battlefield, " + "if it was kicked, create X 1/1 green Saproling creature tokens.")); } diff --git a/Mage.Sets/src/mage/cards/v/ViciousBetrayal.java b/Mage.Sets/src/mage/cards/v/ViciousBetrayal.java index 1c5a03303d6..5f3bc17cc86 100644 --- a/Mage.Sets/src/mage/cards/v/ViciousBetrayal.java +++ b/Mage.Sets/src/mage/cards/v/ViciousBetrayal.java @@ -1,17 +1,15 @@ package mage.cards.v; -import mage.abilities.Ability; -import mage.abilities.costs.VariableCost; import mage.abilities.costs.common.SacrificeXTargetCost; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.MultipliedValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.game.Game; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -21,6 +19,8 @@ import java.util.UUID; */ public final class ViciousBetrayal extends CardImpl { + private static final DynamicValue xValue = new MultipliedValue(GetXValue.instance, 2); + public ViciousBetrayal(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{B}"); @@ -29,7 +29,8 @@ public final class ViciousBetrayal extends CardImpl { this.getSpellAbility().addCost(new SacrificeXTargetCost(new FilterControlledCreaturePermanent(), true)); // Target creature gets +2/+2 until end of turn for each creature sacrificed this way. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new BoostTargetEffect(GetXValue.instance, GetXValue.instance, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn) + .setText("target creature gets +2/+2 until end of turn for each creature sacrificed this way")); } private ViciousBetrayal(final ViciousBetrayal card) { @@ -41,31 +42,3 @@ public final class ViciousBetrayal extends CardImpl { return new ViciousBetrayal(this); } } - -enum GetXValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - int amount = 0; - for (VariableCost cost : sourceAbility.getCosts().getVariableCosts()) { - amount += cost.getAmount(); - } - return 2 * amount; - } - - @Override - public GetXValue copy() { - return GetXValue.instance; - } - - @Override - public String toString() { - return "2"; - } - - @Override - public String getMessage() { - return "creature sacrificed this way"; - } -} diff --git a/Mage.Sets/src/mage/cards/v/VillainousWealth.java b/Mage.Sets/src/mage/cards/v/VillainousWealth.java index 415fdb7bb79..15bbf0c8b63 100644 --- a/Mage.Sets/src/mage/cards/v/VillainousWealth.java +++ b/Mage.Sets/src/mage/cards/v/VillainousWealth.java @@ -65,14 +65,14 @@ class VillainousWealthEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source)); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (controller == null || opponent == null || xValue < 1) { return false; } Cards cards = new CardsImpl(opponent.getLibrary().getTopCards(game, xValue)); opponent.moveCards(cards, Zone.EXILED, source, game); FilterCard filter = new FilterCard(); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); CardUtil.castMultipleWithAttributeForFree(controller, source, game, cards, filter); return true; } diff --git a/Mage.Sets/src/mage/cards/v/VitalizingCascade.java b/Mage.Sets/src/mage/cards/v/VitalizingCascade.java index 0d932cfb6e1..1bebf20a1ce 100644 --- a/Mage.Sets/src/mage/cards/v/VitalizingCascade.java +++ b/Mage.Sets/src/mage/cards/v/VitalizingCascade.java @@ -1,14 +1,11 @@ - package mage.cards.v; -import mage.abilities.Ability; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; +import mage.abilities.dynamicvalue.IntPlusDynamicValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.game.Game; import java.util.UUID; @@ -21,7 +18,8 @@ public final class VitalizingCascade extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{G}{W}"); // You gain X plus 3 life. - this.getSpellAbility().addEffect(new GainLifeEffect(VitalizingCascadeValue.instance)); + this.getSpellAbility().addEffect(new GainLifeEffect(new IntPlusDynamicValue(3, GetXValue.instance)) + .setText("you gain X plus 3 life")); } private VitalizingCascade(final VitalizingCascade card) { @@ -33,28 +31,3 @@ public final class VitalizingCascade extends CardImpl { return new VitalizingCascade(this); } } - -enum VitalizingCascadeValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - return sourceAbility.getManaCosts().getX() + 3; - } - - @Override - public VitalizingCascadeValue copy() { - return instance; - } - - @Override - public String getMessage() { - return ""; - } - - @Override - public String toString() { - return "X plus 3"; - } -} - diff --git a/Mage.Sets/src/mage/cards/v/ViviensArkbow.java b/Mage.Sets/src/mage/cards/v/ViviensArkbow.java index eaa669eb071..24f9166c0a6 100644 --- a/Mage.Sets/src/mage/cards/v/ViviensArkbow.java +++ b/Mage.Sets/src/mage/cards/v/ViviensArkbow.java @@ -15,6 +15,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -71,7 +72,7 @@ class ViviensArkbowEffect extends OneShotEffect { if (player == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, xValue)); player.lookAtCards(source, null, cards, game); diff --git a/Mage.Sets/src/mage/cards/v/VolcanicGeyser.java b/Mage.Sets/src/mage/cards/v/VolcanicGeyser.java index 3f79f985e46..fca6caaf4d9 100644 --- a/Mage.Sets/src/mage/cards/v/VolcanicGeyser.java +++ b/Mage.Sets/src/mage/cards/v/VolcanicGeyser.java @@ -2,7 +2,7 @@ package mage.cards.v; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -20,7 +20,7 @@ public final class VolcanicGeyser extends CardImpl { // Volcanic Geyser deals X damage to any target. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addTarget(new TargetAnyTarget()); } diff --git a/Mage.Sets/src/mage/cards/w/WakerOfTheWilds.java b/Mage.Sets/src/mage/cards/w/WakerOfTheWilds.java index 01bd6b29f72..93688b916f5 100644 --- a/Mage.Sets/src/mage/cards/w/WakerOfTheWilds.java +++ b/Mage.Sets/src/mage/cards/w/WakerOfTheWilds.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -40,7 +40,7 @@ public final class WakerOfTheWilds extends CardImpl { Zone.BATTLEFIELD, new AddCountersTargetEffect( CounterType.P1P1.createInstance(0), - ManacostVariableValue.REGULAR + GetXValue.instance ).setText("Put X +1/+1 counters on target land you control."), new ManaCostsImpl<>("{X}{G}{G}") ); diff --git a/Mage.Sets/src/mage/cards/w/WarCadence.java b/Mage.Sets/src/mage/cards/w/WarCadence.java index 62c16341272..5385b0ab96b 100644 --- a/Mage.Sets/src/mage/cards/w/WarCadence.java +++ b/Mage.Sets/src/mage/cards/w/WarCadence.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.ReplacementEffectImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -44,7 +44,7 @@ public final class WarCadence extends CardImpl { class WarCadenceReplacementEffect extends ReplacementEffectImpl { - DynamicValue xCosts = ManacostVariableValue.REGULAR; + DynamicValue xCosts = GetXValue.instance; WarCadenceReplacementEffect() { super(Duration.EndOfTurn, Outcome.Neutral); diff --git a/Mage.Sets/src/mage/cards/w/WarTax.java b/Mage.Sets/src/mage/cards/w/WarTax.java index 76285aa68e2..471d0eb6941 100644 --- a/Mage.Sets/src/mage/cards/w/WarTax.java +++ b/Mage.Sets/src/mage/cards/w/WarTax.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.PayCostToAttackBlockEffectImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -45,7 +45,7 @@ public final class WarTax extends CardImpl { class WarTaxCantAttackUnlessPaysEffect extends PayCostToAttackBlockEffectImpl { - DynamicValue xCosts = ManacostVariableValue.REGULAR; + DynamicValue xCosts = GetXValue.instance; WarTaxCantAttackUnlessPaysEffect() { super(Duration.EndOfTurn, Outcome.Neutral, RestrictType.ATTACK); diff --git a/Mage.Sets/src/mage/cards/w/WeirdHarvest.java b/Mage.Sets/src/mage/cards/w/WeirdHarvest.java index 0ce2d8e597b..a64fae3d1bf 100644 --- a/Mage.Sets/src/mage/cards/w/WeirdHarvest.java +++ b/Mage.Sets/src/mage/cards/w/WeirdHarvest.java @@ -1,8 +1,5 @@ package mage.cards.w; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -17,6 +14,11 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; /** * @@ -62,7 +64,7 @@ class WeirdHarvestEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source); if (controller != null && sourceObject != null) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue > 0) { List usingPlayers = new ArrayList<>(); this.chooseAndSearchLibrary(usingPlayers, controller, xValue, source, sourceObject, game); diff --git a/Mage.Sets/src/mage/cards/w/WelcomeToTheFold.java b/Mage.Sets/src/mage/cards/w/WelcomeToTheFold.java index 6908b9bf6ce..3a8aa85cd9a 100644 --- a/Mage.Sets/src/mage/cards/w/WelcomeToTheFold.java +++ b/Mage.Sets/src/mage/cards/w/WelcomeToTheFold.java @@ -14,6 +14,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -67,7 +68,7 @@ class WelcomeToTheFoldEffect extends GainControlTargetEffect { int maxToughness = 2; ManaCosts manaCosts = source.getManaCostsToPay(); if (!manaCosts.getVariableCosts().isEmpty()) { - maxToughness = source.getManaCostsToPay().getX(); + maxToughness = CardUtil.getSourceCostsTag(game, source, "X", 0); } Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent != null && permanent.getToughness().getValue() > maxToughness) { diff --git a/Mage.Sets/src/mage/cards/w/Whetwheel.java b/Mage.Sets/src/mage/cards/w/Whetwheel.java index 4766cdaef8f..8888ddcabe7 100644 --- a/Mage.Sets/src/mage/cards/w/Whetwheel.java +++ b/Mage.Sets/src/mage/cards/w/Whetwheel.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.MillCardsTargetEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; @@ -26,7 +26,7 @@ public final class Whetwheel extends CardImpl { // {X}{X}, {tap}: Target player puts the top X cards of their library into their graveyard. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MillCardsTargetEffect( - ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}{X}")); + GetXValue.instance), new ManaCostsImpl<>("{X}{X}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPlayer()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/w/WhiteManaBattery.java b/Mage.Sets/src/mage/cards/w/WhiteManaBattery.java index 9a73e40057f..74641cc3b6e 100644 --- a/Mage.Sets/src/mage/cards/w/WhiteManaBattery.java +++ b/Mage.Sets/src/mage/cards/w/WhiteManaBattery.java @@ -9,7 +9,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.IntPlusDynamicValue; import mage.abilities.dynamicvalue.common.CountersSourceCount; -import mage.abilities.dynamicvalue.common.RemovedCountersForCostValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -37,7 +37,7 @@ public final class WhiteManaBattery extends CardImpl { // then add an additional {W} for each charge counter removed this way. ability = new DynamicManaAbility( Mana.WhiteMana(1), - new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance), + new IntPlusDynamicValue(1, GetXValue.instance), new TapSourceCost(), "Add {W}, then add {W} for each charge counter removed this way", true, new IntPlusDynamicValue(1, new CountersSourceCount(CounterType.CHARGE))); diff --git a/Mage.Sets/src/mage/cards/w/WhiteSunsTwilight.java b/Mage.Sets/src/mage/cards/w/WhiteSunsTwilight.java index 6efd54106e6..fa59603e8eb 100644 --- a/Mage.Sets/src/mage/cards/w/WhiteSunsTwilight.java +++ b/Mage.Sets/src/mage/cards/w/WhiteSunsTwilight.java @@ -1,10 +1,7 @@ package mage.cards.w; -import java.util.List; -import java.util.UUID; - import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -16,6 +13,10 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.PhyrexianMiteToken; import mage.game.permanent.token.Token; +import mage.util.CardUtil; + +import java.util.List; +import java.util.UUID; /** * @author TheElk801 @@ -26,7 +27,7 @@ public final class WhiteSunsTwilight extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{W}{W}"); // You gain X life. Create X 1/1 colorless Phyrexian Mite artifact creature tokens with toxic 1 and "This creature can't block." If X is 5 or more, destroy all other creatures. - this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new GainLifeEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new WhiteSunsTwilightEffect()); } @@ -59,7 +60,7 @@ class WhiteSunsTwilightEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); Token token = new PhyrexianMiteToken(); token.putOntoBattlefield(xValue, game, source); if (xValue < 5) { diff --git a/Mage.Sets/src/mage/cards/w/WhiteSunsZenith.java b/Mage.Sets/src/mage/cards/w/WhiteSunsZenith.java index 799950a54a5..c70fb521dae 100644 --- a/Mage.Sets/src/mage/cards/w/WhiteSunsZenith.java +++ b/Mage.Sets/src/mage/cards/w/WhiteSunsZenith.java @@ -3,7 +3,7 @@ package mage.cards.w; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.ShuffleSpellEffect; import mage.cards.CardImpl; @@ -20,7 +20,7 @@ public final class WhiteSunsZenith extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}{W}{W}"); // create X 2/2 white Cat creature tokens. Shuffle White Sun's Zenith into its owner's library. - this.getSpellAbility().addEffect(new CreateTokenEffect(new CatToken(), ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new CatToken(), GetXValue.instance)); this.getSpellAbility().addEffect(ShuffleSpellEffect.getInstance()); } diff --git a/Mage.Sets/src/mage/cards/w/Wildcall.java b/Mage.Sets/src/mage/cards/w/Wildcall.java index 5c3a01da852..b262a48ec64 100644 --- a/Mage.Sets/src/mage/cards/w/Wildcall.java +++ b/Mage.Sets/src/mage/cards/w/Wildcall.java @@ -1,7 +1,6 @@ package mage.cards.w; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -16,6 +15,9 @@ import mage.counters.CounterType; import mage.game.Game; import mage.players.Player; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -64,7 +66,7 @@ class WildcallEffect extends OneShotEffect { Card card = controller.getLibrary().getFromTop(game); if (card != null) { new ManifestEffect(1).apply(game, source); - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue > 0) { Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(xValue)); effect.setTargetPointer(new FixedTarget(card.getId())); diff --git a/Mage.Sets/src/mage/cards/w/WildfireAwakener.java b/Mage.Sets/src/mage/cards/w/WildfireAwakener.java index 49b64734d99..c21f44af661 100644 --- a/Mage.Sets/src/mage/cards/w/WildfireAwakener.java +++ b/Mage.Sets/src/mage/cards/w/WildfireAwakener.java @@ -2,7 +2,7 @@ package mage.cards.w; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.ConvokeAbility; import mage.cards.CardImpl; @@ -30,7 +30,7 @@ public final class WildfireAwakener extends CardImpl { // When Wildfire Awakener enters the battlefield, create X 1/1 red Elemental creature tokens // with "Whenever this creature becomes tapped, it deals 1 damage to target player." this.addAbility(new EntersBattlefieldTriggeredAbility( - new CreateTokenEffect(new WildfireAwakenerToken(), ManacostVariableValue.ETB) + new CreateTokenEffect(new WildfireAwakenerToken(), GetXValue.instance) )); } diff --git a/Mage.Sets/src/mage/cards/w/Windstorm.java b/Mage.Sets/src/mage/cards/w/Windstorm.java index cbd3e678940..bd29496642c 100644 --- a/Mage.Sets/src/mage/cards/w/Windstorm.java +++ b/Mage.Sets/src/mage/cards/w/Windstorm.java @@ -2,7 +2,7 @@ package mage.cards.w; import java.util.UUID; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -27,7 +27,7 @@ public final class Windstorm extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{G}"); - this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.REGULAR, filter)); + this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, filter)); } private Windstorm(final Windstorm card) { diff --git a/Mage.Sets/src/mage/cards/w/WizardsRockets.java b/Mage.Sets/src/mage/cards/w/WizardsRockets.java index d23101078a9..ce2bd2eb16c 100644 --- a/Mage.Sets/src/mage/cards/w/WizardsRockets.java +++ b/Mage.Sets/src/mage/cards/w/WizardsRockets.java @@ -7,7 +7,7 @@ import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.mana.DynamicManaAbility; import mage.cards.CardImpl; @@ -29,7 +29,7 @@ public final class WizardsRockets extends CardImpl { // {X}, {T}, Sacrifice Wizard's Rockets: Add X mana in any combination of colors. Ability ability = new DynamicManaAbility( - Mana.AnyMana(1), ManacostVariableValue.REGULAR, + Mana.AnyMana(1), GetXValue.instance, new ManaCostsImpl<>("{X}"), "Add X mana in any combination of colors." ); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/w/WorldsoulsRage.java b/Mage.Sets/src/mage/cards/w/WorldsoulsRage.java index e13a332c8f1..00c1c48e295 100644 --- a/Mage.Sets/src/mage/cards/w/WorldsoulsRage.java +++ b/Mage.Sets/src/mage/cards/w/WorldsoulsRage.java @@ -1,19 +1,10 @@ package mage.cards.w; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - import mage.abilities.Ability; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; +import mage.cards.*; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -23,6 +14,12 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; + +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; /** * @@ -34,7 +31,7 @@ public final class WorldsoulsRage extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{G}"); // Worldsoul's Rage deals X damage to any target. Put up to X land cards from your hand and/or graveyard onto the battlefield tapped. - this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.REGULAR)); + this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance)); this.getSpellAbility().addEffect(new WorldsoulsRageEffect()); this.getSpellAbility().addTarget(new TargetAnyTarget()); } @@ -81,7 +78,7 @@ class WorldsoulsRageEffect extends OneShotEffect { return false; } - int maxTargets = source.getManaCostsToPay().getX(); + int maxTargets = CardUtil.getSourceCostsTag(game, source, "X", 0); if (maxTargets == 0) { return false; } diff --git a/Mage.Sets/src/mage/cards/w/WrathOfTheSkies.java b/Mage.Sets/src/mage/cards/w/WrathOfTheSkies.java index 8a8d5971689..c8fee5f8ad8 100644 --- a/Mage.Sets/src/mage/cards/w/WrathOfTheSkies.java +++ b/Mage.Sets/src/mage/cards/w/WrathOfTheSkies.java @@ -12,6 +12,7 @@ import mage.constants.Outcome; import mage.counters.CounterType; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -61,7 +62,7 @@ class WrathOfTheSkiesEffect extends OneShotEffect { if (controller == null) { return false; } - int xValue = source.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); if (xValue > 0) { new GetEnergyCountersControllerEffect(xValue).apply(game, source); } diff --git a/Mage.Sets/src/mage/cards/w/WrensRunHydra.java b/Mage.Sets/src/mage/cards/w/WrensRunHydra.java index ff33269cd84..fe5153a8b19 100644 --- a/Mage.Sets/src/mage/cards/w/WrensRunHydra.java +++ b/Mage.Sets/src/mage/cards/w/WrensRunHydra.java @@ -3,7 +3,7 @@ package mage.cards.w; import mage.MageInt; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.keyword.ReachAbility; import mage.abilities.keyword.ReinforceAbility; @@ -34,7 +34,7 @@ public final class WrensRunHydra extends CardImpl { this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance()))); // Reinforce X—{X}{G}{G} - this.addAbility(new ReinforceAbility(ManacostVariableValue.REGULAR, new ManaCostsImpl<>("{X}{G}{G}"))); + this.addAbility(new ReinforceAbility(GetXValue.instance, new ManaCostsImpl<>("{X}{G}{G}"))); } private WrensRunHydra(final WrensRunHydra card) { diff --git a/Mage.Sets/src/mage/cards/w/Wurmcalling.java b/Mage.Sets/src/mage/cards/w/Wurmcalling.java index b139d242fbd..c2977bf3a14 100644 --- a/Mage.Sets/src/mage/cards/w/Wurmcalling.java +++ b/Mage.Sets/src/mage/cards/w/Wurmcalling.java @@ -1,7 +1,6 @@ package mage.cards.w; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.BuybackAbility; @@ -11,6 +10,9 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.token.WurmCallingWurmToken; +import mage.util.CardUtil; + +import java.util.UUID; /** * @@ -50,7 +52,7 @@ class WurmcallingEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int count = source.getManaCostsToPay().getX(); + int count = CardUtil.getSourceCostsTag(game, source, "X", 0); WurmCallingWurmToken token = new WurmCallingWurmToken(); token.setPower(count); token.setToughness(count); diff --git a/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java b/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java index 5b45c5c7f24..9a1981741c4 100644 --- a/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java +++ b/Mage.Sets/src/mage/cards/z/ZaxaraTheExemplary.java @@ -19,6 +19,7 @@ import mage.game.permanent.token.Token; import mage.game.permanent.token.ZaxaraTheExemplaryHydraToken; import mage.game.stack.Spell; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -119,7 +120,8 @@ class ZaxaraTheExemplaryHydraTokenEffect extends OneShotEffect { // create token if (needObject instanceof Spell) { Spell spell = (Spell) needObject; - int xValue = spell.getSpellAbility().getManaCostsToPay().getX(); + + int xValue = CardUtil.getSourceCostsTag(game, spell.getSpellAbility(), "X", 0); Token hydraToken = new ZaxaraTheExemplaryHydraToken(); hydraToken.putOntoBattlefield(1, game, source, source.getControllerId()); diff --git a/Mage.Sets/src/mage/cards/z/Zoanthrope.java b/Mage.Sets/src/mage/cards/z/Zoanthrope.java index 29c72a288b1..54caba82829 100644 --- a/Mage.Sets/src/mage/cards/z/Zoanthrope.java +++ b/Mage.Sets/src/mage/cards/z/Zoanthrope.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.RavenousAbility; @@ -40,7 +40,7 @@ public final class Zoanthrope extends CardImpl { // Warp Blast -- When Zoanthrope enters the battlefield, it deals X damage to any target. Ability ability = new EntersBattlefieldTriggeredAbility( - new DamageTargetEffect(ManacostVariableValue.ETB, "it") + new DamageTargetEffect(GetXValue.instance, "it") ); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability.withFlavorWord("Warp Blast")); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaPoolTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaPoolTest.java index 666e05427ac..b4b88302da2 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaPoolTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaPoolTest.java @@ -4,7 +4,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.mana.AddConditionalManaEffect; @@ -221,7 +221,7 @@ public class ManaPoolTest extends CardTestPlayerBase { public void test_MultipleMana_OneXAbility() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); // - Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}")); ability.addTarget(new TargetAnyTarget()); addCustomCardWithAbility("damage X", playerA, ability); @@ -252,7 +252,7 @@ public class ManaPoolTest extends CardTestPlayerBase { new AddConditionalManaEffect(Mana.RedMana(10), new SimpleActivatedAbilityManaBuilder()), new ManaCostsImpl<>(""))); // - Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("{X}")); ability.addTarget(new TargetAnyTarget()); addCustomCardWithAbility("damage X", playerA, ability); @@ -279,12 +279,12 @@ public class ManaPoolTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Lightning Bolt"); // {R} addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1 + 3 + 1); // - Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("")); + Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("")); ability.addTarget(new TargetAnyTarget()); addCustomCardWithAbility("damage X", playerA, ability); // // {X}: Counter target spell - ability = new SimpleActivatedAbility(Zone.ALL, new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}")); + ability = new SimpleActivatedAbility(Zone.ALL, new CounterUnlessPaysEffect(GetXValue.instance), new ManaCostsImpl<>("{X}")); ability.addTarget(new TargetSpell()); addCustomCardWithAbility("counter until pay X", playerB, ability); addCard(Zone.BATTLEFIELD, playerB, "Island", 3); @@ -327,12 +327,12 @@ public class ManaPoolTest extends CardTestPlayerBase { new AddConditionalManaEffect(Mana.RedMana(10), new SimpleActivatedAbilityManaBuilder()), new ManaCostsImpl<>(""))); // - Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("")); + Ability ability = new SimpleActivatedAbility(Zone.ALL, new DamageTargetEffect(GetXValue.instance), new ManaCostsImpl<>("")); ability.addTarget(new TargetAnyTarget()); addCustomCardWithAbility("damage X", playerA, ability); // // {X}: Counter target spell - ability = new SimpleActivatedAbility(Zone.ALL, new CounterUnlessPaysEffect(ManacostVariableValue.REGULAR), new ManaCostsImpl<>("{X}")); + ability = new SimpleActivatedAbility(Zone.ALL, new CounterUnlessPaysEffect(GetXValue.instance), new ManaCostsImpl<>("{X}")); ability.addTarget(new TargetSpell()); addCustomCardWithAbility("counter until pay X", playerB, ability); addCard(Zone.BATTLEFIELD, playerB, "Island", 3); diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/CardIconsTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/CardIconsTest.java index 945128de452..4d882b976dd 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/CardIconsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/CardIconsTest.java @@ -265,7 +265,7 @@ public class CardIconsTest extends CardTestPlayerBase { GameView gameView = getGameView(player); Assert.assertEquals("ability activated - must have 1 card in stack", 1, gameView.getStack().values().size()); CardView cardView = gameView.getStack().values().stream().findFirst().get(); - Assert.assertEquals("ability activated - must have x cost card icons in stack", 1, cardView.getCardIcons().size()); + Assert.assertTrue("ability activated - must have x cost card icons in stack", cardView.getCardIcons().stream().anyMatch(x -> x.getText().equals("x=2"))); }); // battlefield (ability activated, not visible) diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index efef9970e41..dd28682388b 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -272,7 +272,7 @@ public abstract class AbilityImpl implements Ability { // For Flashback ability can be set X before, so the X costs have to be restored for the flashbacked ability if (noMana) { if (!this.getManaCostsToPay().getVariableCosts().isEmpty()) { - int xValue = this.getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, this, "X", 0); this.clearManaCostsToPay(); VariableManaCost xCosts = new VariableManaCost(VariableCostType.ADDITIONAL); // no x events - rules from Unbound Flourishing: @@ -438,7 +438,7 @@ public abstract class AbilityImpl implements Ability { game.informPlayers(announceString); } if (variableManaCost != null) { - int xValue = getManaCostsToPay().getX(); + int xValue = CardUtil.getSourceCostsTag(game, this, "X", 0); game.informPlayers(controller.getLogName() + " announces a value of " + xValue + " for " + variableManaCost.getText() + CardUtil.getSourceLogName(game, this)); } diff --git a/Mage/src/main/java/mage/abilities/SpellAbility.java b/Mage/src/main/java/mage/abilities/SpellAbility.java index 7a492567c0a..ed9121f4c5d 100644 --- a/Mage/src/main/java/mage/abilities/SpellAbility.java +++ b/Mage/src/main/java/mage/abilities/SpellAbility.java @@ -3,8 +3,6 @@ package mage.abilities; import mage.ApprovingObject; import mage.MageIdentifier; import mage.MageObject; -import mage.abilities.costs.Cost; -import mage.abilities.costs.VariableCost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.VariableManaCost; import mage.abilities.keyword.FlashAbility; @@ -251,7 +249,6 @@ public class SpellAbility extends ActivatedAbilityImpl { public int getConvertedXManaCost(Card card) { int xMultiplier = 0; - int amount = 0; if (card == null) { return 0; } @@ -265,18 +262,11 @@ public class SpellAbility extends ActivatedAbilityImpl { } // mana cost final X value - boolean hasNonManaXCost = false; - for (Cost cost : getCosts()) { - if (cost instanceof VariableCost) { - hasNonManaXCost = true; - amount = ((VariableCost) cost).getAmount(); - break; - } - } - - if (!hasNonManaXCost) { - amount = getManaCostsToPay().getX(); + Map tagMap = this.getCostsTagMap(); + if (tagMap == null) { + return 0; } + int amount = (int) tagMap.getOrDefault("X", 0); return amount * xMultiplier; } diff --git a/Mage/src/main/java/mage/abilities/common/TurnFaceUpAbility.java b/Mage/src/main/java/mage/abilities/common/TurnFaceUpAbility.java index d4975fb0d4f..da8ff7f944c 100644 --- a/Mage/src/main/java/mage/abilities/common/TurnFaceUpAbility.java +++ b/Mage/src/main/java/mage/abilities/common/TurnFaceUpAbility.java @@ -13,6 +13,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; /** * @author LevelX2 @@ -74,7 +75,7 @@ class TurnFaceUpEffect extends OneShotEffect { if (megamorph) { sourcePermanent.addCounters(CounterType.P1P1.createInstance(), source.getControllerId(), source, game); } - game.getState().setValue(source.getSourceId().toString() + "TurnFaceUpX", source.getManaCostsToPay().getX()); + game.getState().setValue(source.getSourceId().toString() + "TurnFaceUpX", CardUtil.getSourceCostsTag(game, source, "X", 0)); return true; } } diff --git a/Mage/src/main/java/mage/abilities/costs/mana/ManaCosts.java b/Mage/src/main/java/mage/abilities/costs/mana/ManaCosts.java index def7aef85c8..8d2d8e488fb 100644 --- a/Mage/src/main/java/mage/abilities/costs/mana/ManaCosts.java +++ b/Mage/src/main/java/mage/abilities/costs/mana/ManaCosts.java @@ -19,10 +19,12 @@ public interface ManaCosts extends List, ManaCost { List getVariableCosts(); + /** + * + * @return if the mana cost contains an X - note that this is specifically for *mana* X costs + */ boolean containsX(); - int getX(); - /** * @param xValue final X value -- announced X * xMultiplier, where xMultiplier can be changed by replace events like Unbound Flourishing) * @param xPay real number of pay amount (x * xMultiplier * xInstances, where xInstances is number of {X} in pay like 1, 2, 3) diff --git a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java index 849596e9d49..d347227a078 100644 --- a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java +++ b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java @@ -267,16 +267,6 @@ public class ManaCostsImpl extends ArrayList implements M return !getVariableCosts().isEmpty(); } - @Override - public int getX() { - int amount = 0; - List variableCosts = getVariableCosts(); - if (!variableCosts.isEmpty()) { - amount = variableCosts.get(0).getAmount(); - } - return amount; - } - @Override public void setX(int xValue, int xPay) { List variableCosts = getVariableCosts(); @@ -430,8 +420,12 @@ public class ManaCostsImpl extends ArrayList implements M // TODO: checks Word of Command with Unbound Flourishing's X multiplier // TODO: checks Word of Command with {X}{X} cards - int xValue = referenceCosts.getX(); - this.setX(xValue, xValue); + int amount = 0; + List variableCosts = getVariableCosts(); + if (!variableCosts.isEmpty()) { + amount = variableCosts.get(0).getAmount(); + } + this.setX(amount, amount); player.getManaPool().restoreMana(pool.getPoolBookmark()); game.bookmarkState(); diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java index 087b567287c..37e97391ea9 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ExileFromHandCostCardConvertedMana.java @@ -8,10 +8,11 @@ import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.cards.Card; import mage.game.Game; +import mage.util.CardUtil; /** * Calculates the converted mana costs of a card that was exiled from hand as - * cost. If no card was exiled the getManaCostsToPay().getX() will be used as + * cost. If no card was exiled CardUtil.getSourceCostsTag(game, the, "X", 0) will be used as * value. * * @author LevelX2 @@ -30,7 +31,7 @@ public enum ExileFromHandCostCardConvertedMana implements DynamicValue { return xValue; } } - return sourceAbility.getManaCostsToPay().getX(); + return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); } @Override diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetKickerXValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetKickerXValue.java deleted file mode 100644 index 43a84eea66a..00000000000 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetKickerXValue.java +++ /dev/null @@ -1,39 +0,0 @@ -package mage.abilities.dynamicvalue.common; - -import mage.abilities.Ability; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; -import mage.game.Game; -import mage.util.CardUtil; - - -/** - * Kicker {X} - * - * @author JayDi85 - */ -public enum GetKickerXValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - // Currently identical logic to the Manacost X value - // which should be fine since you can only have one X at a time - return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); - } - - @Override - public GetKickerXValue copy() { - return GetKickerXValue.instance; - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return ""; - } -} diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXLoyaltyValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXLoyaltyValue.java deleted file mode 100644 index 97531fe46bf..00000000000 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXLoyaltyValue.java +++ /dev/null @@ -1,34 +0,0 @@ -package mage.abilities.dynamicvalue.common; - -import mage.abilities.Ability; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; -import mage.game.Game; -import mage.util.CardUtil; - -/** - * @author TheElk801 - */ -public enum GetXLoyaltyValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); - } - - @Override - public GetXLoyaltyValue copy() { - return instance; - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return ""; - } -} diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java index afe4acdd784..775f991add2 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GetXValue.java @@ -6,9 +6,6 @@ import mage.abilities.effects.Effect; import mage.game.Game; import mage.util.CardUtil; -/** - * @author BetaSteward_at_googlemail.com - */ public enum GetXValue implements DynamicValue { instance; diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java deleted file mode 100644 index c8be9bd58b9..00000000000 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/ManacostVariableValue.java +++ /dev/null @@ -1,36 +0,0 @@ -package mage.abilities.dynamicvalue.common; - -import mage.abilities.Ability; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; -import mage.game.Game; -import mage.util.CardUtil; - -public enum ManacostVariableValue implements DynamicValue { - //TODO: all three of these variants plus GetXValue, GetKickerXValue, and GetXLoyaltyValue use the same logic - // and should be consolidated into a single instance - REGULAR, // if you need X on cast/activate (in stack) - reset each turn - ETB, // if you need X after ETB (in battlefield) - reset each turn - END_GAME; // if you need X until end game - keep data forever - - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - return CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0); - } - - @Override - public ManacostVariableValue copy() { - return this; - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return ""; - } -} diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/RemovedCountersForCostValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/RemovedCountersForCostValue.java deleted file mode 100644 index 7fd6808010a..00000000000 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/RemovedCountersForCostValue.java +++ /dev/null @@ -1,40 +0,0 @@ -package mage.abilities.dynamicvalue.common; - -import mage.abilities.Ability; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.RemoveVariableCountersSourceCost; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; -import mage.game.Game; - -/** - * @author LevelX2 - */ -public enum RemovedCountersForCostValue implements DynamicValue { - instance; - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - for (Cost cost : sourceAbility.getCosts()) { - if (cost instanceof RemoveVariableCountersSourceCost) { - return ((RemoveVariableCountersSourceCost) cost).getAmount(); - } - } - return 0; - } - - @Override - public String getMessage() { - return ""; - } - - @Override - public RemovedCountersForCostValue copy() { - return RemovedCountersForCostValue.instance; - } - - @Override - public String toString() { - return "X"; - } -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardWithLessMVPutIntoPlay.java b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardWithLessMVPutIntoPlay.java index adb80f5f1c9..0f683f953e5 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardWithLessMVPutIntoPlay.java +++ b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryGraveyardWithLessMVPutIntoPlay.java @@ -2,10 +2,10 @@ package mage.abilities.effects.common.search; import mage.MageObject; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardsImpl; +import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; @@ -14,6 +14,7 @@ import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; /** * @author antoni-g @@ -50,7 +51,7 @@ public class SearchLibraryGraveyardWithLessMVPutIntoPlay extends OneShotEffect { if (controller != null && sourceObject != null) { // create x cost filter FilterCard advancedFilter = filter.copy(); // never change static objects so copy the object here before - advancedFilter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + advancedFilter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); if (controller.chooseUse(outcome, "Search your library for a " + filter.getMessage() + " with mana value X or less" + '?', source, game)) { TargetCardInLibrary target = new TargetCardInLibrary(advancedFilter); diff --git a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryWithLessCMCPutInPlayEffect.java b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryWithLessCMCPutInPlayEffect.java index 002770f56c4..86304e387ea 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryWithLessCMCPutInPlayEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryWithLessCMCPutInPlayEffect.java @@ -2,9 +2,9 @@ package mage.abilities.effects.common.search; import mage.abilities.Ability; -import mage.constants.ComparisonType; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; +import mage.constants.ComparisonType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; @@ -41,7 +41,7 @@ public class SearchLibraryWithLessCMCPutInPlayEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { FilterCard advancedFilter = filter.copy(); // never change static objects so copy the object here before - advancedFilter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, source.getManaCostsToPay().getX() + 1)); + advancedFilter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, CardUtil.getSourceCostsTag(game, source, "X", 0) + 1)); TargetCardInLibrary target = new TargetCardInLibrary(advancedFilter); if (controller.searchLibrary(target, source, game)) { if (!target.getTargets().isEmpty()) { diff --git a/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java b/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java index e1ebfc885c4..e7555cc659e 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MonstrosityAbility.java @@ -4,7 +4,6 @@ import mage.abilities.Ability; import mage.abilities.ActivatedAbilityImpl; import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.hint.common.MonstrousHint; import mage.constants.Outcome; @@ -108,7 +107,7 @@ class BecomeMonstrousSourceEffect extends OneShotEffect { int monstrosityValue = ((MonstrosityAbility) source).getMonstrosityValue(); // handle monstrosity = X if (monstrosityValue == Integer.MAX_VALUE) { - monstrosityValue = source.getManaCostsToPay().getX(); + monstrosityValue = CardUtil.getSourceCostsTag(game, source, "X", 0); } permanent.addCounters( CounterType.P1P1.createInstance(monstrosityValue), diff --git a/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java b/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java index 2c79a0474ca..1d74ff16803 100644 --- a/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/RavenousAbility.java @@ -5,7 +5,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.counters.CounterType; @@ -48,6 +48,6 @@ enum RavenousAbilityCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return ManacostVariableValue.ETB.calculate(game, source, null) >= 5; + return GetXValue.instance.calculate(game, source, null) >= 5; } } \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java b/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java index 3b9271c14e0..df811a37cfa 100644 --- a/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/RenownAbility.java @@ -85,7 +85,7 @@ class BecomesRenownedSourceEffect extends OneShotEffect { int renownValue = ((RenownAbility) source).getRenownValue(); // handle renown = X if (renownValue == Integer.MAX_VALUE) { - renownValue = source.getManaCostsToPay().getX(); + renownValue = CardUtil.getSourceCostsTag(game, source, "X", 0); } new AddCountersSourceEffect(CounterType.P1P1.createInstance(renownValue), true).apply(game, source); permanent.setRenowned(true); diff --git a/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java b/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java index ed6e2691fa3..64f4d4843ef 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SuspendAbility.java @@ -269,7 +269,7 @@ class SuspendExileEffect extends OneShotEffect { if (controller.moveCardToExileWithInfo(card, exileId, "Suspended cards of " + controller.getName(), source, game, Zone.HAND, true)) { if (suspend == Integer.MAX_VALUE) { - suspend = source.getManaCostsToPay().getX(); + suspend = CardUtil.getSourceCostsTag(game, source, "X", 0); } card.addCounters(CounterType.TIME.createInstance(suspend), source.getControllerId(), source, game); game.informPlayers(controller.getLogName() diff --git a/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java b/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java index ede372976fb..c7ffa4172d4 100644 --- a/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java @@ -20,6 +20,7 @@ import mage.game.Game; import mage.game.command.Emblem; import mage.game.permanent.token.Token; import mage.game.permanent.token.custom.CreatureToken; +import mage.util.CardUtil; import mage.util.RandomUtil; import mage.util.functions.CopyTokenFunction; @@ -70,7 +71,7 @@ class MomirEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int value = source.getManaCostsToPay().getX(); + int value = CardUtil.getSourceCostsTag(game, source, "X", 0); if (game.isSimulation()) { // Create dummy token to prevent multiple DB find cards what causes H2 java.lang.IllegalStateException if AI cancels calculation because of time out Token token = new CreatureToken(value, value + 1); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 55c11b2daa2..76291b671de 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -1268,7 +1268,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { if (this.isPlaneswalker(game)) { int loyalty; if (this.getStartingLoyalty() == -2) { - loyalty = source.getManaCostsToPay().getX(); + loyalty = CardUtil.getSourceCostsTag(game, source, "X", 0); } else { loyalty = this.getStartingLoyalty(); } @@ -1285,7 +1285,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { if (this.isBattle(game)) { int defense; if (this.getStartingDefense() == -2) { - defense = source.getManaCostsToPay().getX(); + defense = CardUtil.getSourceCostsTag(game, source, "X", 0); } else { defense = this.getStartingDefense(); } diff --git a/Mage/src/main/java/mage/target/targetadjustment/PowerTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/PowerTargetAdjuster.java index 8b49eb8ce32..55119224eee 100644 --- a/Mage/src/main/java/mage/target/targetadjustment/PowerTargetAdjuster.java +++ b/Mage/src/main/java/mage/target/targetadjustment/PowerTargetAdjuster.java @@ -3,7 +3,7 @@ package mage.target.targetadjustment; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.constants.ComparisonType; import mage.filter.Filter; import mage.filter.predicate.mageobject.PowerPredicate; @@ -29,7 +29,7 @@ public class PowerTargetAdjuster extends GenericTargetAdjuster { } public PowerTargetAdjuster(ComparisonType comparison) { - this(ManacostVariableValue.REGULAR, comparison); + this(GetXValue.instance, comparison); } diff --git a/Mage/src/main/java/mage/target/targetadjustment/ToughnessTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/ToughnessTargetAdjuster.java index 11bb667d5ca..0bb00f4ec76 100644 --- a/Mage/src/main/java/mage/target/targetadjustment/ToughnessTargetAdjuster.java +++ b/Mage/src/main/java/mage/target/targetadjustment/ToughnessTargetAdjuster.java @@ -3,7 +3,7 @@ package mage.target.targetadjustment; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.constants.ComparisonType; import mage.filter.Filter; import mage.filter.predicate.mageobject.ToughnessPredicate; @@ -29,7 +29,7 @@ public class ToughnessTargetAdjuster extends GenericTargetAdjuster { } public ToughnessTargetAdjuster(ComparisonType comparison) { - this(ManacostVariableValue.REGULAR, comparison); + this(GetXValue.instance, comparison); } @Override diff --git a/Mage/src/main/java/mage/target/targetadjustment/XManaValueTargetAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XManaValueTargetAdjuster.java index e529f369237..166b323fe08 100644 --- a/Mage/src/main/java/mage/target/targetadjustment/XManaValueTargetAdjuster.java +++ b/Mage/src/main/java/mage/target/targetadjustment/XManaValueTargetAdjuster.java @@ -1,6 +1,6 @@ package mage.target.targetadjustment; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.constants.ComparisonType; /** @@ -9,10 +9,10 @@ import mage.constants.ComparisonType; public class XManaValueTargetAdjuster extends ManaValueTargetAdjuster { public XManaValueTargetAdjuster() { - super(ManacostVariableValue.REGULAR, ComparisonType.EQUAL_TO); + super(GetXValue.instance, ComparisonType.EQUAL_TO); } public XManaValueTargetAdjuster(ComparisonType comparison) { - super(ManacostVariableValue.REGULAR, comparison); + super(GetXValue.instance, comparison); } } diff --git a/Mage/src/main/java/mage/target/targetadjustment/XTargetsCountAdjuster.java b/Mage/src/main/java/mage/target/targetadjustment/XTargetsCountAdjuster.java index 3a471890132..03b028a4245 100644 --- a/Mage/src/main/java/mage/target/targetadjustment/XTargetsCountAdjuster.java +++ b/Mage/src/main/java/mage/target/targetadjustment/XTargetsCountAdjuster.java @@ -1,6 +1,6 @@ package mage.target.targetadjustment; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; /** * @author notgreat @@ -8,6 +8,6 @@ import mage.abilities.dynamicvalue.common.ManacostVariableValue; public class XTargetsCountAdjuster extends TargetsCountAdjuster { public XTargetsCountAdjuster() { - super(ManacostVariableValue.REGULAR); + super(GetXValue.instance); } } diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index 9c850577269..5b873d3170e 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -1737,6 +1737,9 @@ public final class CardUtil { */ public static Map getSourceCostsTagsMap(Game game, Ability source) { Map costTags; + if (game == null) { + return null; + } // from spell ability - direct access costTags = source.getCostsTagMap(); diff --git a/Mage/src/main/java/mage/util/ManaUtil.java b/Mage/src/main/java/mage/util/ManaUtil.java index 21b1f9fb01b..9ffd783400e 100644 --- a/Mage/src/main/java/mage/util/ManaUtil.java +++ b/Mage/src/main/java/mage/util/ManaUtil.java @@ -10,7 +10,7 @@ import mage.abilities.costs.VariableCostType; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.*; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.effects.Effect; import mage.abilities.mana.*; import mage.cards.AdventureCard; @@ -689,7 +689,7 @@ public final class ManaUtil { public static ManaCost createManaCost(DynamicValue genericManaCount, Game game, Ability sourceAbility, Effect effect) { int costValue = genericManaCount.calculate(game, sourceAbility, effect); - if (genericManaCount instanceof ManacostVariableValue) { + if (genericManaCount instanceof GetXValue) { // variable (X must be final value after all events and effects) return createManaCost(costValue, true); } else {