From 50bd7d43c9beec544dbba4ab752ea8343c3b684d Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Mon, 25 Mar 2013 19:15:04 +0000 Subject: [PATCH] InputPayManaExecuteCommands takes ManaCost instead of String as a measure of mana to pay. ManaCost got a static factory method to get colorless mana costs. Methods in GameActionPlay to carry extra mana paid from previous multikicker payment removed. Extra mana goes to pool and can be used from there. --- .../cardfactory/CardFactorySorceries.java | 9 +- src/main/java/forge/card/mana/ManaCost.java | 3 +- .../input/InputPayManaExecuteCommands.java | 7 +- src/main/java/forge/game/GameActionPlay.java | 44 ------ src/main/java/forge/game/GameActionUtil.java | 2 +- src/main/java/forge/game/phase/Upkeep.java | 6 +- src/main/java/forge/game/zone/MagicStack.java | 139 ++---------------- 7 files changed, 29 insertions(+), 181 deletions(-) diff --git a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java index e26f8a6eb38..72d2b6dbd3b 100644 --- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java +++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java @@ -36,6 +36,7 @@ import forge.Constant; import forge.Singletons; import forge.card.CardType; import forge.card.cost.Cost; +import forge.card.mana.ManaCost; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; import forge.control.input.InputPayManaExecuteCommands; @@ -460,13 +461,13 @@ public class CardFactorySorceries { if (newCMC <= baseCMC) { game.getAction().moveToPlay(newArtifact[0]); } else { - final String diffCost = String.valueOf(newCMC - baseCMC); - InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, "Pay difference in artifacts CMC", diffCost); + final int diffCost = newCMC - baseCMC; + InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, "Pay difference in artifacts CMC", ManaCost.get(diffCost)); FThreads.setInputAndWait(inp); if ( inp.isPaid() ) - Singletons.getModel().getGame().getAction().moveToPlay(newArtifact[0]); + game.getAction().moveToPlay(newArtifact[0]); else - Singletons.getModel().getGame().getAction().moveToGraveyard(newArtifact[0]); + game.getAction().moveToGraveyard(newArtifact[0]); } // finally, shuffle library diff --git a/src/main/java/forge/card/mana/ManaCost.java b/src/main/java/forge/card/mana/ManaCost.java index a4b64035b24..cf3f7d7e695 100644 --- a/src/main/java/forge/card/mana/ManaCost.java +++ b/src/main/java/forge/card/mana/ManaCost.java @@ -49,15 +49,14 @@ public final class ManaCost implements Comparable { public static final ManaCost FOUR = new ManaCost(4); public static ManaCost get(int cntColorless) { - if(cntColorless >= 5 || cntColorless < 0) throw new IllegalArgumentException("Supports only 0-4"); switch (cntColorless) { case 0: return ZERO; case 1: return ONE; case 2: return TWO; case 3: return THREE; case 4: return FOUR; - default: return NO_COST; } + return cntColorless > 0 ? new ManaCost(cntColorless) : NO_COST; } // pass mana cost parser here diff --git a/src/main/java/forge/control/input/InputPayManaExecuteCommands.java b/src/main/java/forge/control/input/InputPayManaExecuteCommands.java index 336f742bebe..d65f1657405 100644 --- a/src/main/java/forge/control/input/InputPayManaExecuteCommands.java +++ b/src/main/java/forge/control/input/InputPayManaExecuteCommands.java @@ -18,6 +18,7 @@ package forge.control.input; import forge.Singletons; +import forge.card.mana.ManaCost; import forge.card.mana.ManaCostBeingPaid; import forge.card.spellability.SpellAbility; import forge.game.GameState; @@ -41,7 +42,7 @@ public class InputPayManaExecuteCommands extends InputPayManaBase implements Inp */ private static final long serialVersionUID = 3836655722696348713L; - private String originalManaCost; + private ManaCost originalManaCost; private String message = ""; private boolean bPaid = false; @@ -65,7 +66,7 @@ public class InputPayManaExecuteCommands extends InputPayManaBase implements Inp * @param unpaidCommand2 * a {@link forge.Command} object. */ - public InputPayManaExecuteCommands(final GameState game, final String prompt, final String manaCost2) { + public InputPayManaExecuteCommands(final GameState game, final String prompt, final ManaCost manaCost2) { this(game, prompt, manaCost2, false); } @@ -85,7 +86,7 @@ public class InputPayManaExecuteCommands extends InputPayManaBase implements Inp * @param showOKButton * a boolean. */ - public InputPayManaExecuteCommands(final GameState game, final String prompt, final String manaCost2, final boolean showOKButton) { + public InputPayManaExecuteCommands(final GameState game, final String prompt, final ManaCost manaCost2, final boolean showOKButton) { super(game, new SpellAbility(null) { @Override public void resolve() {} diff --git a/src/main/java/forge/game/GameActionPlay.java b/src/main/java/forge/game/GameActionPlay.java index ba265b8888e..c9b7eaa1f5d 100644 --- a/src/main/java/forge/game/GameActionPlay.java +++ b/src/main/java/forge/game/GameActionPlay.java @@ -461,50 +461,6 @@ public class GameActionPlay { } - /** The Cost cutting_ get multi kicker mana cost paid. */ - private int costCuttingGetMultiKickerManaCostPaid = 0; - /** The Cost cutting_ get multi kicker mana cost paid_ colored. */ - private String costCuttingGetMultiKickerManaCostPaidColored = ""; - - /** - * Gets the cost cutting get multi kicker mana cost paid. - * - * @return the costCuttingGetMultiKickerManaCostPaid - */ - public int getCostCuttingGetMultiKickerManaCostPaid() { - return this.costCuttingGetMultiKickerManaCostPaid; - } - - /** - * Sets the cost cutting get multi kicker mana cost paid. - * - * @param costCuttingGetMultiKickerManaCostPaid0 - * the costCuttingGetMultiKickerManaCostPaid to set - */ - public void setCostCuttingGetMultiKickerManaCostPaid(final int costCuttingGetMultiKickerManaCostPaid0) { - this.costCuttingGetMultiKickerManaCostPaid = costCuttingGetMultiKickerManaCostPaid0; - } - - /** - * Gets the cost cutting get multi kicker mana cost paid colored. - * - * @return the costCuttingGetMultiKickerManaCostPaidColored - */ - public String getCostCuttingGetMultiKickerManaCostPaidColored() { - return this.costCuttingGetMultiKickerManaCostPaidColored; - } - - /** - * Sets the cost cutting get multi kicker mana cost paid colored. - * - * @param costCuttingGetMultiKickerManaCostPaidColored0 - * the costCuttingGetMultiKickerManaCostPaidColored to set - */ - public void setCostCuttingGetMultiKickerManaCostPaidColored( - final String costCuttingGetMultiKickerManaCostPaidColored0) { - this.costCuttingGetMultiKickerManaCostPaidColored = costCuttingGetMultiKickerManaCostPaidColored0; - } - /** * Gets the convokable colors. * diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index 52d58efaaf8..94e361bbf35 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -607,7 +607,7 @@ public final class GameActionUtil { // at some point in time, it's possible to restore the InputPaySacCost-based input // interface for sacrifice costs (instead of the menu-based one above). - InputPayment toSet = new InputPayManaExecuteCommands(game, source + "\r\n", ability.getManaCost().toString()); + InputPayment toSet = new InputPayManaExecuteCommands(game, source + "\r\n", ability.getManaCost()); FThreads.setInputAndWait(toSet); if (toSet.isPaid() ) { paid.execute(); diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 53646b173a1..fe594f40c68 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -286,7 +286,7 @@ public class Upkeep extends Phase { public void resolve() { final boolean isUpkeepPaid; if (controller.isHuman()) { - InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, sb, upkeepCost.toString()); + InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, sb, upkeepCost); FThreads.setInputAndWait(inp); isUpkeepPaid = inp.isPaid(); } else { // computer @@ -383,7 +383,7 @@ public class Upkeep extends Phase { public void resolve() { boolean isUpkeepPaid = false; if (controller.isHuman()) { - InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, sb, upkeepCost.toString()); + InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, sb, upkeepCost); FThreads.setInputAndWait(inp); isUpkeepPaid = inp.isPaid(); } else { // computers @@ -625,7 +625,7 @@ public class Upkeep extends Phase { @Override public void resolve() { if (game.getZoneOf(c).is(ZoneType.Battlefield)) { - InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, "Pay Demonic Hordes upkeep cost", cost.getManaCost().toString() /*, true */); + InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, "Pay Demonic Hordes upkeep cost", cost.getManaCost() /*, true */); FThreads.setInputAndWait(inp); if ( !inp.isPaid() ) unpaidHordesAb.resolve(); diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 70d687f17e0..79039e97003 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -34,7 +34,6 @@ import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactory; import forge.card.cardfactory.CardFactoryUtil; import forge.card.mana.ManaCost; -import forge.card.mana.ManaCostBeingPaid; import forge.card.spellability.Ability; import forge.card.spellability.AbilityStatic; import forge.card.spellability.AbilityTriggered; @@ -293,95 +292,6 @@ public class MagicStack extends MyObservable { } } - /** - *

- * getMultiKickerSpellCostChange. - *

- * - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.mana.ManaCostBeingPaid} object. - */ - public final ManaCostBeingPaid getMultiKickerSpellCostChange(final SpellAbility sa) { - final int max = 25; - final String[] numbers = new String[max]; - for (int no = 0; no < max; no++) { - numbers[no] = String.valueOf(no); - } - - ManaCostBeingPaid manaCost = new ManaCostBeingPaid(sa.getManaCost()); - String mana = manaCost.toString(); - - int multiKickerPaid = game.getActionPlay().getCostCuttingGetMultiKickerManaCostPaid(); - - String numberManaCost = " "; - - if (mana.toString().length() == 1) { - numberManaCost = mana.toString().substring(0, 1); - } else if (mana.toString().length() == 0) { - numberManaCost = "0"; // Should Never Occur - } else { - numberManaCost = mana.toString().substring(0, 2); - } - - numberManaCost = numberManaCost.trim(); - - for (int check = 0; check < max; check++) { - if (numberManaCost.equals(numbers[check])) { - - if ((check - multiKickerPaid) < 0) { - multiKickerPaid = multiKickerPaid - check; - game.getActionPlay().setCostCuttingGetMultiKickerManaCostPaid(multiKickerPaid); - mana = mana.replaceFirst(String.valueOf(check), "0"); - } else { - mana = mana.replaceFirst(String.valueOf(check), String.valueOf(check - multiKickerPaid)); - multiKickerPaid = 0; - game.getActionPlay().setCostCuttingGetMultiKickerManaCostPaid(multiKickerPaid); - } - } - mana = mana.trim(); - if (mana.equals("")) { - mana = "0"; - } - manaCost = new ManaCostBeingPaid(mana); - } - final String colorCut = game.getActionPlay().getCostCuttingGetMultiKickerManaCostPaidColored(); - - for (int colorCutIx = 0; colorCutIx < colorCut.length(); colorCutIx++) { - if ("WUGRB".contains(colorCut.substring(colorCutIx, colorCutIx + 1)) - && !mana.equals(mana.replaceFirst((colorCut.substring(colorCutIx, colorCutIx + 1)), ""))) { - mana = mana.replaceFirst(colorCut.substring(colorCutIx, colorCutIx + 1), ""); - - game.getActionPlay().setCostCuttingGetMultiKickerManaCostPaidColored( - game.getActionPlay().getCostCuttingGetMultiKickerManaCostPaidColored() - .replaceFirst(colorCut.substring(colorCutIx, colorCutIx + 1), "")); - - mana = mana.trim(); - if (mana.equals("")) { - mana = "0"; - } - manaCost = new ManaCostBeingPaid(mana); - } - } - - return manaCost; - } - - // TODO: this may be able to use a straight copy of MultiKicker cost change - /** - *

- * getReplicateSpellCostChange. - *

- * - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.mana.ManaCostBeingPaid} object. - */ - public final ManaCostBeingPaid getReplicateSpellCostChange(final SpellAbility sa) { - final ManaCostBeingPaid manaCost = new ManaCostBeingPaid(sa.getManaCost()); - // String Mana = manaCost.toString(); - return manaCost; - } /** *

@@ -487,7 +397,7 @@ public class MagicStack extends MyObservable { final Card crd = sa.getSourceCard(); String message = "Pay X cost for " + crd.getName() + " (X=" + crd.getXManaCostPaid() + ")\r\n"; - InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, message, String.valueOf(xCost), true); + InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, message, ManaCost.get(xCost), true); FThreads.setInputAndWait(inp); if ( inp.isPaid() ) { crd.addXManaCostPaid(1); @@ -534,29 +444,15 @@ public class MagicStack extends MyObservable { @Override public void run() { abilityIncreaseMultikicker.resolve(); - - final ManaCostBeingPaid manaCost = MagicStack.this.getMultiKickerSpellCostChange(abilityIncreaseMultikicker); - - if (manaCost.isPaid()) { + int mkMagnitude = sa.getSourceCard().getMultiKickerMagnitude(); + String prompt = String.format("Multikicker for %s\r\nTimes Kicked: %d\r\n", sa.getSourceCard(), mkMagnitude ); + InputPayManaExecuteCommands toSet = new InputPayManaExecuteCommands(game, prompt, sp.getMultiKickerManaCost()); + FThreads.setInputAndWait(toSet); + if ( toSet.isPaid() ) { this.run(); - } else { - String prompt; - int mkCostPaid = game.getActionPlay().getCostCuttingGetMultiKickerManaCostPaid(); - String mkCostPaidColored = game.getActionPlay().getCostCuttingGetMultiKickerManaCostPaidColored(); - int mkMagnitude = sa.getSourceCard().getMultiKickerMagnitude(); - if ((mkCostPaid == 0) && mkCostPaidColored.equals("")) { - prompt = String.format("Multikicker for %s\r\nTimes Kicked: %d\r\n", sa.getSourceCard(), mkMagnitude ); - } else { - prompt = String.format("Multikicker for %s\r\nMana in Reserve: %s %s\r\nTimes Kicked: %d", sa.getSourceCard(), - (mkCostPaid != 0) ? Integer.toString(mkCostPaid) : "", mkCostPaidColored, mkMagnitude); - } - InputPayManaExecuteCommands toSet = new InputPayManaExecuteCommands(game, prompt, manaCost.toString()); - FThreads.setInputAndWait(toSet); - if ( toSet.isPaid() ) { - this.run(); - } else - MagicStack.this.push(sa); - } + } else + MagicStack.this.push(sa); + } }; paidCommand.run(); @@ -591,19 +487,14 @@ public class MagicStack extends MyObservable { @Override public void run() { ability.resolve(); - final ManaCostBeingPaid manaCost = MagicStack.this.getReplicateSpellCostChange(ability); - if (manaCost.isPaid()) { + String prompt = String.format("Replicate for %s\r\nTimes Replicated: %d\r\n", sa.getSourceCard(), sa.getSourceCard().getReplicateMagnitude()); + InputPayManaExecuteCommands toSet = new InputPayManaExecuteCommands(game, prompt, sp.getReplicateManaCost()); + FThreads.setInputAndWait(toSet); + if ( toSet.isPaid() ) { this.run(); } else { - String prompt = String.format("Replicate for %s\r\nTimes Replicated: %d\r\n", sa.getSourceCard(), sa.getSourceCard().getReplicateMagnitude()); - InputPayManaExecuteCommands toSet = new InputPayManaExecuteCommands(game, prompt, manaCost.toString()); - FThreads.setInputAndWait(toSet); - if ( toSet.isPaid() ) { - this.run(); - } else { - for (int i = 0; i < sp.getSourceCard().getReplicateMagnitude(); i++) { - CardFactory.copySpellontoStack(sp.getSourceCard(), sp.getSourceCard(), sp, false); - } + for (int i = 0; i < sp.getSourceCard().getReplicateMagnitude(); i++) { + CardFactory.copySpellontoStack(sp.getSourceCard(), sp.getSourceCard(), sp, false); } } }