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.
This commit is contained in:
Maxmtg
2013-03-25 19:15:04 +00:00
parent 948ea6803c
commit 50bd7d43c9
7 changed files with 29 additions and 181 deletions

View File

@@ -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

View File

@@ -49,15 +49,14 @@ public final class ManaCost implements Comparable<ManaCost> {
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

View File

@@ -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() {}

View File

@@ -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.
*

View File

@@ -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();

View File

@@ -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();

View File

@@ -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 {
}
}
/**
* <p>
* getMultiKickerSpellCostChange.
* </p>
*
* @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
/**
* <p>
* getReplicateSpellCostChange.
* </p>
*
* @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;
}
/**
* <p>
@@ -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);
}
}
}