diff --git a/forge-core/src/main/java/forge/card/mana/ManaCost.java b/forge-core/src/main/java/forge/card/mana/ManaCost.java index 3b90a03cb77..54bab8c80f1 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCost.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCost.java @@ -226,6 +226,13 @@ public final class ManaCost implements Comparable { return this.stringValue; } + /** + * @return unformatted cost string + */ + public String getCostString() { + return ManaCostParser.stripFormatting(this.toString()); + } + /** * TODO: Write javadoc for this method. * @return diff --git a/forge-core/src/main/java/forge/card/mana/ManaCostParser.java b/forge-core/src/main/java/forge/card/mana/ManaCostParser.java index 1d515063002..91c4109a593 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCostParser.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCostParser.java @@ -10,7 +10,7 @@ public class ManaCostParser implements IParserManaCost { private final String[] cost; private int nextToken; private int colorlessCost; - + /** * Parse the given cost and output formatted cost string * @@ -22,6 +22,15 @@ public class ManaCostParser implements IParserManaCost { return manaCost.toString(); } + /** + * Strip formatting from the given formatted cost string + * + * @param formattedCost + */ + public static String stripFormatting(final String formattedCost) { + return formattedCost.replaceAll("\\{([A-Z0-9/]+)\\}", "$1 ").trim(); + } + /** * Instantiates a new parser cardname txt mana cost. * diff --git a/forge-gui/src/main/java/forge/ai/ComputerUtilMana.java b/forge-gui/src/main/java/forge/ai/ComputerUtilMana.java index 553d168a06c..1b6dbf1283b 100644 --- a/forge-gui/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-gui/src/main/java/forge/ai/ComputerUtilMana.java @@ -375,7 +375,7 @@ public class ComputerUtilMana { if (abMana.isComboMana()) { int amount = manaAb.hasParam("Amount") ? AbilityUtils.calculateAmount(source, manaAb.getParam("Amount"), saRoot) : 1; - final ManaCostBeingPaid testCost = new ManaCostBeingPaid(cost.toString().replace("X ", "")); + final ManaCostBeingPaid testCost = new ManaCostBeingPaid(cost.getCostString().replace("X ", "")); final String[] comboColors = abMana.getComboColors().split(" "); for (int nMana = 1; nMana <= amount; nMana++) { String choice = ""; diff --git a/forge-gui/src/main/java/forge/game/GameActionUtil.java b/forge-gui/src/main/java/forge/game/GameActionUtil.java index 697de450802..2d352fae94e 100644 --- a/forge-gui/src/main/java/forge/game/GameActionUtil.java +++ b/forge-gui/src/main/java/forge/game/GameActionUtil.java @@ -306,10 +306,10 @@ public final class GameActionUtil { if (sa.isSpell() && keyword.equals("You may cast CARDNAME any time you could cast an instant if you pay 2 more to cast it.")) { final SpellAbility newSA = sa.copy(); newSA.setBasicSpell(false); - String cost = source.getManaCost().toString(); + String cost = source.getManaCost().getCostString(); ManaCostBeingPaid newCost = new ManaCostBeingPaid(cost); newCost.increaseColorlessMana(2); - cost = newCost.toString(); + cost = newCost.getCostString(); final Cost actualcost = new Cost(cost, false); newSA.setPayCosts(actualcost); SpellAbilityRestriction sar = new SpellAbilityRestriction(); diff --git a/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java b/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java index 1aeeb117809..3e0b04a9974 100644 --- a/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-gui/src/main/java/forge/game/ability/AbilityUtils.java @@ -3,11 +3,11 @@ package forge.game.ability; import java.util.ArrayList; import java.util.List; - import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCost; import forge.card.MagicColor; import forge.card.mana.ManaCostShard; + import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Iterables; @@ -82,7 +82,7 @@ public class AbilityUtils { final List cards = new ArrayList(); final String defined = (def == null) ? "Self" : def; // default to Self final Game game = hostCard.getGame(); - + Card c = null; if (defined.equals("Self")) { @@ -230,7 +230,7 @@ public class AbilityUtils { else if (defined.startsWith("Tapped")) { list = sa.getRootAbility().getPaidList("Tapped"); } - + else if (defined.startsWith("Untapped")) { list = sa.getRootAbility().getPaidList("Untapped"); } @@ -297,14 +297,14 @@ public class AbilityUtils { public static int calculateAmount(final Card card, String amount, final SpellAbility ability) { // return empty strings and constants if (StringUtils.isBlank(amount)) { return 0; } - final Game game = card.getController().getGame(); + final Game game = card.getController().getGame(); // Strip and save sign for calculations final boolean startsWithPlus = amount.charAt(0) == '+'; final boolean startsWithMinus = amount.charAt(0) == '-'; if (startsWithPlus || startsWithMinus) { amount = amount.substring(1); } int multiplier = startsWithMinus ? -1 : 1; - + // return result soon for plain numbers if (StringUtils.isNumeric(amount)) { return Integer.parseInt(amount) * multiplier; } @@ -321,8 +321,8 @@ public class AbilityUtils { } svarval = card.getSVar(amount); } - - if (StringUtils.isBlank(svarval)) { + + if (StringUtils.isBlank(svarval)) { // Some variables may be not chosen yet at this moment // So return 0 and don't issue an error. if (amount.equals("ChosenX")) { @@ -442,7 +442,7 @@ public class AbilityUtils { } return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; - } + } if (calcX[0].matches("Enchanted")) { // Add whole Enchanted list to handlePaid @@ -458,7 +458,7 @@ public class AbilityUtils { if (ability == null) return 0; - + // Player attribute counting if (calcX[0].startsWith("TargetedPlayer")) { final ArrayList players = new ArrayList(); @@ -705,7 +705,7 @@ public class AbilityUtils { if (eqIndex >= 0) { char reference = valid.charAt(eqIndex + 2); // take whatever goes after EQ if( Character.isLetter(reference)) { - String varName = valid.substring(eqIndex + 2, eqIndex + 3); + String varName = valid.substring(eqIndex + 2, eqIndex + 3); valid = valid.replace("EQ" + varName, "EQ" + Integer.toString(calculateAmount(source, varName, sa))); } } @@ -786,7 +786,7 @@ public class AbilityUtils { if (!players.contains(p)) { players.add(p); } - } + } } else if (defined.equals("Remembered")) { for (final Object rem : card.getRemembered()) { if (rem instanceof Player) { @@ -875,7 +875,7 @@ public class AbilityUtils { } else if (defined.startsWith("OppNonTriggered")) { players.addAll(sa.getActivatingPlayer().getOpponents()); players.removeAll(getDefinedPlayers(card, defined.substring(6), sa)); - + } else if (defined.startsWith("Replaced")) { final SpellAbility root = sa.getRootAbility(); Object o = null; @@ -1014,7 +1014,7 @@ public class AbilityUtils { final ArrayList sas = new ArrayList(); final String defined = (def == null) ? "Self" : def; // default to Self final Game game = sa.getActivatingPlayer().getGame(); - + SpellAbility s = null; // TODO - this probably needs to be fleshed out a bit, but the basics @@ -1130,20 +1130,20 @@ public class AbilityUtils { final boolean execSubsWhenPaid = "WhenPaid".equals(resolveSubs) || StringUtils.isBlank(resolveSubs); final boolean execSubsWhenNotPaid = "WhenNotPaid".equals(resolveSubs) || StringUtils.isBlank(resolveSubs); final boolean isSwitched = sa.hasParam("UnlessSwitched"); - + // The cost if (unlessCost.equals("CardManaCost")) { - unlessCost = source.getManaCost().toString(); + unlessCost = source.getManaCost().getCostString(); } else if (unlessCost.equals("RememberedCostMinus2")) { if (source.getRemembered().isEmpty() || !(source.getRemembered().get(0) instanceof Card)) { sa.resolve(); resolveSubAbilities(sa, game); } Card rememberedCard = (Card) source.getRemembered().get(0); - unlessCost = rememberedCard.getManaCost().toString(); + unlessCost = rememberedCard.getManaCost().getCostString(); ManaCostBeingPaid newCost = new ManaCostBeingPaid(unlessCost.toString()); newCost.decreaseColorlessMana(2); - unlessCost = newCost.toString(); + unlessCost = newCost.getCostString(); } else if( !StringUtils.isBlank(sa.getSVar(unlessCost)) || !StringUtils.isBlank(source.getSVar(unlessCost))) { // check for X costs (stored in SVars int xCost = calculateAmount(source, sa.getParam("UnlessCost").replace(" ", ""), sa); @@ -1151,12 +1151,11 @@ public class AbilityUtils { ManaCostBeingPaid toPay = new ManaCostBeingPaid("0"); byte xColor = MagicColor.fromName(sa.hasParam("UnlessXColor") ? sa.getParam("UnlessXColor") : "1"); toPay.increaseShard(ManaCostShard.valueOf(xColor), xCost); - unlessCost = toPay.toString(); + unlessCost = toPay.getCostString(); } final Cost cost = new Cost(unlessCost, true); - boolean paid = false; for (Player payer : payers) { final Ability ability = new AbilityStatic(source, cost, sa.getTargetRestrictions()) { @Override public void resolve() { } }; @@ -1172,7 +1171,7 @@ public class AbilityUtils { } } - if( paid == isSwitched ) { + if( paid == isSwitched ) { sa.resolve(); } @@ -1262,7 +1261,7 @@ public class AbilityUtils { return CardFactoryUtil.doXMath(Integer.parseInt(sq[2]), expr, c); // not Kicked } } - + //Count$SearchedLibrary. if(sq[0].contains("SearchedLibrary")) { int sum = 0; @@ -1270,7 +1269,7 @@ public class AbilityUtils { { sum += p.getLibrarySearched(); } - + return sum; } diff --git a/forge-gui/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-gui/src/main/java/forge/game/ability/effects/ManaEffect.java index fb680c1b163..b2cc4ca9c80 100644 --- a/forge-gui/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-gui/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -168,7 +168,7 @@ public class ManaEffect extends SpellAbilityEffect { if (card.getEnchanting() != null ) { Card enchanted = card.getEnchantingCard(); // Remove X and phyrexian mana - choice = enchanted.getManaCost().toString().replaceAll("X|/P", "").trim(); + choice = enchanted.getManaCost().getCostString().replaceAll("X|/P", "").trim(); } } if (choice.equals("no cost") || choice.isEmpty()) { diff --git a/forge-gui/src/main/java/forge/game/card/Card.java b/forge-gui/src/main/java/forge/game/card/Card.java index bcfcc59d0fa..8fc1e638e7e 100644 --- a/forge-gui/src/main/java/forge/game/card/Card.java +++ b/forge-gui/src/main/java/forge/game/card/Card.java @@ -2113,7 +2113,6 @@ public class Card extends GameEntity implements Comparable { } else if (keyword.equals("Unblockable")) { sbLong.append(this.getName()).append(" can't be blocked.\r\n"); } - else { if ((i != 0) && (sb.length() != 0)) { sb.append(", "); diff --git a/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java index aaebb5a207e..f0c2c670438 100644 --- a/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-gui/src/main/java/forge/game/card/CardFactoryUtil.java @@ -519,7 +519,7 @@ public class CardFactoryUtil { * @return a int. */ public static int getNumberOfManaSymbolsByColor(final String colorAbb, final Card card) { - return countOccurrences(card.getManaCost().toString().trim(), colorAbb); + return countOccurrences(card.getManaCost().getCostString(), colorAbb); } /** diff --git a/forge-gui/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-gui/src/main/java/forge/game/mana/ManaCostBeingPaid.java index e7e5b2ac6fa..c513f994468 100644 --- a/forge-gui/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-gui/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -118,7 +118,7 @@ public class ManaCostBeingPaid { private final String sourceRestriction; private byte sunburstMap = 0; private int cntX = 0; - + /** * Copy constructor * @param manaCostBeingPaid @@ -494,6 +494,13 @@ public class ManaCostBeingPaid { return this.toString(true); } + /** + * @return unformatted cost string + */ + public String getCostString() { + return ManaCostParser.stripFormatting(this.toString()); + } + /** *

* getConvertedManaCost. diff --git a/forge-gui/src/main/java/forge/game/staticability/StaticAbilityCostChange.java b/forge-gui/src/main/java/forge/game/staticability/StaticAbilityCostChange.java index eb10ca7ec9e..f48fca30066 100644 --- a/forge-gui/src/main/java/forge/game/staticability/StaticAbilityCostChange.java +++ b/forge-gui/src/main/java/forge/game/staticability/StaticAbilityCostChange.java @@ -165,7 +165,7 @@ public class StaticAbilityCostChange { if (!params.containsKey("Color")) { manaCost.increaseColorlessMana(value); - if (manaCost.toString().equals("0") && params.containsKey("MinMana")) { + if (manaCost.toString().equals("{0}") && params.containsKey("MinMana")) { manaCost.increaseColorlessMana(Integer.valueOf(params.get("MinMana"))); } } else { @@ -195,7 +195,7 @@ public class StaticAbilityCostChange { */ public static void applyReduceCostAbility(final StaticAbility staticAbility, final SpellAbility sa, final ManaCostBeingPaid manaCost) { //Can't reduce zero cost - if (manaCost.toString().equals("0")) { + if (manaCost.toString().equals("{0}")) { return; } final HashMap params = staticAbility.getMapParams(); diff --git a/forge-gui/src/main/java/forge/gui/input/InputPayManaSimple.java b/forge-gui/src/main/java/forge/gui/input/InputPayManaSimple.java index 3c7523445a0..57890a014cc 100644 --- a/forge-gui/src/main/java/forge/gui/input/InputPayManaSimple.java +++ b/forge-gui/src/main/java/forge/gui/input/InputPayManaSimple.java @@ -36,7 +36,7 @@ public class InputPayManaSimple extends InputPayMana { public InputPayManaSimple(final Game game, final SpellAbility sa, final ManaCostBeingPaid manaCostToPay) { super(sa); - this.originalManaCost = manaCostToPay.toString(); // Change + this.originalManaCost = manaCostToPay.getCostString(); // Change this.originalCard = sa.getSourceCard(); if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { diff --git a/forge-gui/src/test/java/forge/card/mana/ManaPartTest.java b/forge-gui/src/test/java/forge/card/mana/ManaPartTest.java index a134aa40bc5..58d07632bfd 100644 --- a/forge-gui/src/test/java/forge/card/mana/ManaPartTest.java +++ b/forge-gui/src/test/java/forge/card/mana/ManaPartTest.java @@ -379,10 +379,10 @@ public class ManaPartTest { this.check(35, p24.isAnyPartPayableWith(MagicColor.GREEN)); p24.payMana("B"); - this.check(36, p24.toString().equals("2/B 2/B")); + this.check(36, p24.toString().equals("{2/B}{2/B}")); p24.payMana("B"); - this.check(37, p24.toString().equals("2/B")); + this.check(37, p24.toString().equals("{2/B}")); p24.payMana("B"); this.check(38, p24.isPaid()); @@ -390,18 +390,18 @@ public class ManaPartTest { final ManaCostBeingPaid p25 = new ManaCostBeingPaid("2/G"); p25.payMana("1"); - this.check(39, p25.toString().equals("1")); + this.check(39, p25.toString().equals("{1}")); p25.payMana("W"); this.check(40, p25.isPaid()); - final ManaCostBeingPaid p27 = new ManaCostBeingPaid("2/R 2/R"); + final ManaCostBeingPaid p27 = new ManaCostBeingPaid("{2/R}{2/R}"); p27.payMana("1"); - this.check(41, p27.toString().equals("2/R 1")); + this.check(41, p27.toString().equals("{2/R}{1}")); p27.payMana("W"); - this.check(42, p27.toString().equals("2/R")); + this.check(42, p27.toString().equals("{2/R}")); final ManaCostBeingPaid p26 = new ManaCostBeingPaid("2/W 2/W");