Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove duplicate code for X costs #12551

Merged
merged 13 commits into from
Jul 23, 2024
  •  
  •  
  •  
16 changes: 4 additions & 12 deletions Mage.Common/src/main/java/mage/view/CardView.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
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;
Expand Down Expand Up @@ -743,18 +743,10 @@ private void generateCardIconsForAny(MageObject object, Ability ability, Game ga
}

// 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));
}

Expand Down
3 changes: 0 additions & 3 deletions Mage.Common/src/main/java/mage/view/StackAbilityView.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
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;
Expand All @@ -16,7 +14,6 @@
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;

Expand Down
7 changes: 4 additions & 3 deletions Mage.Sets/src/mage/cards/a/AbandonHope.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
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;
Expand All @@ -15,6 +15,7 @@
import mage.game.Game;
import mage.target.common.TargetCardInHand;
import mage.target.common.TargetOpponent;
import mage.util.CardUtil;

import java.util.UUID;

Expand All @@ -34,7 +35,7 @@ Zone.ALL, new InfoEffect("As an additional cost to cast this spell, discard X ca
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);
}
Expand All @@ -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)));
}
Expand Down
4 changes: 2 additions & 2 deletions Mage.Sets/src/mage/cards/a/AbuelosAwakening.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -75,7 +75,7 @@ public AbuelosAwakeningEffect copy() {

@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));
Expand Down
3 changes: 2 additions & 1 deletion Mage.Sets/src/mage/cards/a/AetherTide.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.XTargetsCountAdjuster;
import mage.util.CardUtil;

import java.util.UUID;

Expand Down Expand Up @@ -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)));
}
Expand Down
3 changes: 2 additions & 1 deletion Mage.Sets/src/mage/cards/a/AgadeemsAwakening.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
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;
Expand Down Expand Up @@ -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)));
}
}

Expand Down
7 changes: 4 additions & 3 deletions Mage.Sets/src/mage/cards/a/AggressiveBiomancy.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -18,6 +16,9 @@
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;

import java.util.UUID;

/**
* @author Cguy7777
Expand Down Expand Up @@ -72,7 +73,7 @@ public boolean apply(Game game, Ability source) {
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);
Expand Down
6 changes: 3 additions & 3 deletions Mage.Sets/src/mage/cards/a/AlabasterPotion.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

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;
Expand All @@ -23,9 +23,9 @@ public AlabasterPotion(UUID ownerId, CardSetInfo setInfo) {
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);
}
Expand Down
11 changes: 8 additions & 3 deletions Mage.Sets/src/mage/cards/a/AladdinsLamp.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -18,6 +20,9 @@
import mage.game.events.GameEvent;
import mage.players.Player;
import mage.target.TargetCard;
import mage.util.CardUtil;

import java.util.UUID;

/**
*
Expand Down Expand Up @@ -73,7 +78,7 @@ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
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)) {
Expand Down
6 changes: 3 additions & 3 deletions Mage.Sets/src/mage/cards/a/AlquistProftMasterSleuth.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
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;
Expand Down Expand Up @@ -43,11 +43,11 @@ public AlquistProftMasterSleuth(UUID ownerId, CardSetInfo setInfo) {

// {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);
}

Expand Down
10 changes: 6 additions & 4 deletions Mage.Sets/src/mage/cards/a/AnimistsAwakening.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -16,6 +13,11 @@
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;

/**
*
Expand Down Expand Up @@ -61,7 +63,7 @@ public boolean apply(Game game, Ability source) {
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);
Expand Down
4 changes: 2 additions & 2 deletions Mage.Sets/src/mage/cards/a/AnotherRound.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

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;
Expand Down Expand Up @@ -60,7 +60,7 @@ public boolean apply(Game game, Ability source) {
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,
Expand Down
3 changes: 2 additions & 1 deletion Mage.Sets/src/mage/cards/a/Anthroplasm.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.util.CardUtil;

import java.util.UUID;

Expand Down Expand Up @@ -75,7 +76,7 @@ public boolean apply(Game game, Ability source) {
//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;
Expand Down
6 changes: 3 additions & 3 deletions Mage.Sets/src/mage/cards/a/ArashiTheSkyAsunder.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
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;
Expand Down Expand Up @@ -43,13 +43,13 @@ public ArashiTheSkyAsunder(UUID ownerId, CardSetInfo setInfo) {
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) {
Expand Down
4 changes: 2 additions & 2 deletions Mage.Sets/src/mage/cards/a/ArborealAlliance.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
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;
Expand Down Expand Up @@ -66,7 +66,7 @@ public ArborealAllianceEffect copy() {
@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);
}
}
3 changes: 2 additions & 1 deletion Mage.Sets/src/mage/cards/a/AscendFromAvernus.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;

import java.util.UUID;

Expand Down Expand Up @@ -73,7 +74,7 @@ public boolean apply(Game game, Ability source) {
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);
}
}
6 changes: 1 addition & 5 deletions Mage.Sets/src/mage/cards/a/AshiokNightmareWeaver.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

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.*;
Expand Down Expand Up @@ -111,9 +109,7 @@ public boolean apply(Game game, Ability source) {
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));
Expand Down
Loading