Correct detection of player when playing InputPayManaExecuteCommands (used by all that propagandas)

Pay X mana (when spell is about to hit stack) is made by payManaX - it might have problems paying costs like 2XX
This commit is contained in:
Maxmtg
2013-03-28 08:59:06 +00:00
parent 98a539f23a
commit 4febcc2554
11 changed files with 37 additions and 98 deletions

View File

@@ -956,14 +956,7 @@ public class Card extends GameEntity implements Comparable<Card> {
return this.sunburstValue; return this.sunburstValue;
} }
/** // TODO: Append colors instead of replacing
* <p>
* Setter for the field <code>colorsPaid</code>.
* </p>
*
* @param s
* a String
*/
public final void setColorsPaid(final String s) { public final void setColorsPaid(final String s) {
this.colorsPaid = s; this.colorsPaid = s;
} }

View File

@@ -25,7 +25,6 @@ import com.google.common.collect.Iterables;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.Untap;
import forge.game.player.Player; import forge.game.player.Player;
import forge.util.PredicateString; import forge.util.PredicateString;
@@ -168,12 +167,6 @@ public final class CardPredicates {
} }
}; };
public static final Predicate<Card> CANUNTAP = new Predicate<Card>() {
@Override
public boolean apply(Card c) {
return Untap.canUntap(c);
}
};
/** /**
* a Predicate<Card> to get all cards that are untapped. * a Predicate<Card> to get all cards that are untapped.
*/ */

View File

@@ -462,7 +462,7 @@ public class CardFactorySorceries {
game.getAction().moveToPlay(newArtifact[0]); game.getAction().moveToPlay(newArtifact[0]);
} else { } else {
final int diffCost = newCMC - baseCMC; final int diffCost = newCMC - baseCMC;
InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, "Pay difference in artifacts CMC", ManaCost.get(diffCost)); InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(p, "Pay difference in artifacts CMC", ManaCost.get(diffCost));
FThreads.setInputAndWait(inp); FThreads.setInputAndWait(inp);
if ( inp.isPaid() ) if ( inp.isPaid() )
game.getAction().moveToPlay(newArtifact[0]); game.getAction().moveToPlay(newArtifact[0]);

View File

@@ -75,7 +75,7 @@ public class CostPartMana extends CostPart {
* *
* @return the x mana * @return the x mana
*/ */
public final int getXMana() { public final int getAmountOfX() {
return this.amountX; return this.amountX;
} }
@@ -85,7 +85,7 @@ public class CostPartMana extends CostPart {
* @param xCost * @param xCost
* the new x mana * the new x mana
*/ */
public final void setXMana(final int xCost) { public final void setAmountOfX(final int xCost) {
this.amountX = xCost; this.amountX = xCost;
} }
@@ -210,7 +210,7 @@ public class CostPartMana extends CostPart {
// if X cost is a defined value, other than xPaid // if X cost is a defined value, other than xPaid
if (!ability.getSVar("X").equals("Count$xPaid")) { if (!ability.getSVar("X").equals("Count$xPaid")) {
// this currently only works for things about Targeted object // this currently only works for things about Targeted object
manaToAdd = AbilityUtils.calculateAmount(source, "X", ability) * this.getXMana(); manaToAdd = AbilityUtils.calculateAmount(source, "X", ability) * this.getAmountOfX();
} }
} }
@@ -221,9 +221,9 @@ public class CostPartMana extends CostPart {
if(!inpPayment.isPaid()) if(!inpPayment.isPaid())
return false; return false;
} }
if (this.getXMana() > 0) { if (this.getAmountOfX() > 0) {
source.setXManaCostPaid(0); source.setXManaCostPaid(0);
InputPayment inpPayment = new InputPayManaX(game, ability, this); InputPayment inpPayment = new InputPayManaX(game, ability, this.getAmountOfX(), this.canXbe0());
FThreads.setInputAndWait(inpPayment); FThreads.setInputAndWait(inpPayment);
if(!inpPayment.isPaid()) if(!inpPayment.isPaid())
return false; return false;

View File

@@ -145,7 +145,7 @@ public class CostUtil {
CostPartMana newCostMana = cost2.getCostMana(); CostPartMana newCostMana = cost2.getCostMana();
if (newCostMana != null) { if (newCostMana != null) {
ManaCostBeingPaid oldManaCost = new ManaCostBeingPaid(part.toString()); ManaCostBeingPaid oldManaCost = new ManaCostBeingPaid(part.toString());
newCostMana.setXMana(oldManaCost.getXcounter() + newCostMana.getXMana()); newCostMana.setAmountOfX(oldManaCost.getXcounter() + newCostMana.getAmountOfX());
oldManaCost.combineManaCost(newCostMana.toString()); oldManaCost.combineManaCost(newCostMana.toString());
newCostMana.setMana(oldManaCost.toString(false)); newCostMana.setMana(oldManaCost.toString(false));
} else { } else {

View File

@@ -21,7 +21,6 @@ import forge.Singletons;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostBeingPaid; import forge.card.mana.ManaCostBeingPaid;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.GameState;
import forge.game.player.Player; import forge.game.player.Player;
import forge.view.ButtonUtil; import forge.view.ButtonUtil;
@@ -47,9 +46,6 @@ public class InputPayManaExecuteCommands extends InputPayManaBase implements Inp
private boolean bPaid = false; private boolean bPaid = false;
public boolean isPaid() { return bPaid; } public boolean isPaid() { return bPaid; }
// only used for X costs:
private boolean showOnlyOKButton = false;
/** /**
* <p> * <p>
@@ -65,31 +61,14 @@ public class InputPayManaExecuteCommands extends InputPayManaBase implements Inp
* @param unpaidCommand2 * @param unpaidCommand2
* a {@link forge.Command} object. * a {@link forge.Command} object.
*/ */
public InputPayManaExecuteCommands(final GameState game, final String prompt, final ManaCost manaCost2) { public InputPayManaExecuteCommands(final Player p, final String prompt, final ManaCost manaCost2) {
this(game, prompt, manaCost2, false); super(p.getGame(), new SpellAbility(null) {
}
/**
* <p>
* Constructor for Input_PayManaCost_Ability.
* </p>
*
* @param prompt
* a {@link java.lang.String} object.
* @param manaCost2
* a {@link java.lang.String} object.
* @param paidCommand2
* a {@link forge.Command} object.
* @param unpaidCommand2
* a {@link forge.Command} object.
* @param showOKButton
* a boolean.
*/
public InputPayManaExecuteCommands(final GameState game, final String prompt, final ManaCost manaCost2, final boolean showOKButton) {
super(game, new SpellAbility(null) {
@Override @Override
public void resolve() {} public void resolve() {}
@Override
public Player getActivatingPlayer() { return p; }
@Override @Override
public boolean canPlay() { return false; } public boolean canPlay() { return false; }
}); });
@@ -98,7 +77,7 @@ public class InputPayManaExecuteCommands extends InputPayManaBase implements Inp
this.message = prompt; this.message = prompt;
this.manaCost = new ManaCostBeingPaid(this.originalManaCost); this.manaCost = new ManaCostBeingPaid(this.originalManaCost);
this.showOnlyOKButton = showOKButton;
} }
/** /**
@@ -148,20 +127,12 @@ public class InputPayManaExecuteCommands extends InputPayManaBase implements Inp
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void selectButtonOK() { public final void selectButtonOK() {}
if (this.showOnlyOKButton) {
bPaid = false;
this.stop();
}
}
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void showMessage() { public final void showMessage() {
ButtonUtil.enableOnlyCancel(); ButtonUtil.enableOnlyCancel();
if (this.showOnlyOKButton) {
ButtonUtil.enableOnlyOk();
}
final StringBuilder msg = new StringBuilder(this.message + "Pay Mana Cost: " + this.manaCost); final StringBuilder msg = new StringBuilder(this.message + "Pay Mana Cost: " + this.manaCost);
if (this.phyLifeToLose > 0) { if (this.phyLifeToLose > 0) {
msg.append(" ("); msg.append(" (");

View File

@@ -1,7 +1,6 @@
package forge.control.input; package forge.control.input;
import forge.Card; import forge.Card;
import forge.card.cost.CostPartMana;
import forge.card.mana.ManaCostBeingPaid; import forge.card.mana.ManaCostBeingPaid;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.GameState; import forge.game.GameState;
@@ -13,19 +12,20 @@ public class InputPayManaX extends InputPayManaBase {
private final String colorX; private final String colorX;
private final String strX; private final String strX;
private String colorsPaid; private String colorsPaid;
private final CostPartMana costMana; private final boolean xCanBe0;
public InputPayManaX(final GameState game, final SpellAbility sa0, final CostPartMana costMana0) public InputPayManaX(final GameState game, final SpellAbility sa0, final int amountX, final boolean xCanBe0)
{ {
super(game, sa0); super(game, sa0);
xPaid = 0; xPaid = 0;
colorX = saPaidFor.hasParam("XColor") ? saPaidFor.getParam("XColor") : ""; colorX = saPaidFor.hasParam("XColor") ? saPaidFor.getParam("XColor") : "";
colorsPaid = saPaidFor.getSourceCard().getColorsPaid(); colorsPaid = saPaidFor.getSourceCard().getColorsPaid();
costMana = costMana0;
strX = Integer.toString(costMana.getXMana()); strX = Integer.toString(amountX);
manaCost = new ManaCostBeingPaid(strX); manaCost = new ManaCostBeingPaid(strX);
this.xCanBe0 = xCanBe0;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -35,7 +35,7 @@ public class InputPayManaX extends InputPayManaBase {
public boolean isPaid() { public boolean isPaid() {
//return !( xPaid == 0 && !costMana.canXbe0() || this.colorX.equals("") && !this.manaCost.toString().equals(strX) ); //return !( xPaid == 0 && !costMana.canXbe0() || this.colorX.equals("") && !this.manaCost.toString().equals(strX) );
// return !( xPaid == 0 && !costMana.canXbe0()) && !(this.colorX.equals("") && !this.manaCost.toString().equals(strX)); // return !( xPaid == 0 && !costMana.canXbe0()) && !(this.colorX.equals("") && !this.manaCost.toString().equals(strX));
return ( xPaid > 0 || costMana.canXbe0()) && (!this.colorX.equals("") || this.manaCost.toString().equals(strX)); return ( xPaid > 0 || xCanBe0) && (!this.colorX.equals("") || this.manaCost.toString().equals(strX));
} }
@Override @Override
@@ -51,7 +51,7 @@ public class InputPayManaX extends InputPayManaBase {
StringBuilder msg = new StringBuilder("Pay X Mana Cost for "); StringBuilder msg = new StringBuilder("Pay X Mana Cost for ");
msg.append(saPaidFor.getSourceCard().getName()).append("\n").append(this.xPaid); msg.append(saPaidFor.getSourceCard().getName()).append("\n").append(this.xPaid);
msg.append(" Paid so far."); msg.append(" Paid so far.");
if (!costMana.canXbe0()) { if (!xCanBe0) {
msg.append(" X Can't be 0."); msg.append(" X Can't be 0.");
} }

View File

@@ -585,7 +585,7 @@ public final class GameActionUtil {
if (!(costPart instanceof CostPartMana )) if (!(costPart instanceof CostPartMana ))
throw new RuntimeException("GameActionUtil.payCostDuringAbilityResolve - The remaining payment type is not Mana."); throw new RuntimeException("GameActionUtil.payCostDuringAbilityResolve - The remaining payment type is not Mana.");
InputPayment toSet = new InputPayManaExecuteCommands(game, source + "\r\n", ability.getManaCost()); InputPayment toSet = new InputPayManaExecuteCommands(p, source + "\r\n", ability.getManaCost());
FThreads.setInputAndWait(toSet); FThreads.setInputAndWait(toSet);
return toSet.isPaid(); return toSet.isPaid();
} }

View File

@@ -31,18 +31,13 @@ import forge.CounterType;
import forge.FThreads; import forge.FThreads;
import forge.GameEntity; import forge.GameEntity;
import forge.Singletons; import forge.Singletons;
import forge.control.input.InputBase;
import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCards;
import forge.control.input.InputSelectCardsFromList; import forge.control.input.InputSelectCardsFromList;
import forge.control.input.InputSyncronizedBase;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.gui.match.CMatchUI;
import forge.view.ButtonUtil;
/** /**
* <p> * <p>
@@ -245,7 +240,7 @@ public class Untap extends Phase {
final List<Card> creatures = CardLists.filter(player.getCreaturesInPlay(), tappedCanUntap); final List<Card> creatures = CardLists.filter(player.getCreaturesInPlay(), tappedCanUntap);
if (!creatures.isEmpty()) { if (!creatures.isEmpty()) {
if (player.isComputer()) { if (player.isComputer()) {
creatures.get(0).untap(); ComputerUtilCard.getBestCreatureAI(creatures).untap();
} else { } else {
final InputSelectCards target = new InputSelectCardsFromList(1, 1, creatures); final InputSelectCards target = new InputSelectCardsFromList(1, 1, creatures);
target.setMessage("Select one creature to untap"); target.setMessage("Select one creature to untap");

View File

@@ -275,7 +275,7 @@ public class Upkeep extends Phase {
public void resolve() { public void resolve() {
final boolean isUpkeepPaid; final boolean isUpkeepPaid;
if (controller.isHuman()) { if (controller.isHuman()) {
InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, sb, upkeepCost); InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(controller, sb, upkeepCost);
FThreads.setInputAndWait(inp); FThreads.setInputAndWait(inp);
isUpkeepPaid = inp.isPaid(); isUpkeepPaid = inp.isPaid();
} else { // computer } else { // computer
@@ -360,7 +360,7 @@ public class Upkeep extends Phase {
public void resolve() { public void resolve() {
boolean isUpkeepPaid = false; boolean isUpkeepPaid = false;
if (controller.isHuman()) { if (controller.isHuman()) {
InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, sb, upkeepCost); InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(controller, sb, upkeepCost);
FThreads.setInputAndWait(inp); FThreads.setInputAndWait(inp);
isUpkeepPaid = inp.isPaid(); isUpkeepPaid = inp.isPaid();
} else { // computers } else { // computers
@@ -602,7 +602,7 @@ public class Upkeep extends Phase {
@Override @Override
public void resolve() { public void resolve() {
if (game.getZoneOf(c).is(ZoneType.Battlefield)) { if (game.getZoneOf(c).is(ZoneType.Battlefield)) {
InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, "Pay Demonic Hordes upkeep cost", cost.getManaCost() /*, true */); InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(cp, "Pay Demonic Hordes upkeep cost", cost.getManaCost() /*, true */);
FThreads.setInputAndWait(inp); FThreads.setInputAndWait(inp);
if ( !inp.isPaid() ) if ( !inp.isPaid() )
unpaidHordesAb.resolve(); unpaidHordesAb.resolve();

View File

@@ -47,6 +47,8 @@ import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.control.input.InputBase; import forge.control.input.InputBase;
import forge.control.input.InputPayManaExecuteCommands; import forge.control.input.InputPayManaExecuteCommands;
import forge.control.input.InputPayManaX;
import forge.control.input.InputSynchronized;
import forge.game.GameActionUtil; import forge.game.GameActionUtil;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtil;
@@ -390,23 +392,9 @@ public class MagicStack extends MyObservable {
final int xCost = sa.getXManaCost(); final int xCost = sa.getXManaCost();
Player player = sp.getSourceCard().getController(); Player player = sp.getSourceCard().getController();
if (player.isHuman()) { if (player.isHuman()) {
final Runnable payNextX = new Runnable() { InputSynchronized inp = new InputPayManaX(game, sa, xCost, true);
@Override FThreads.setInputAndWait(inp);
public void run() { MagicStack.this.push(sa);
final Card crd = sa.getSourceCard();
String message = "Pay X cost for " + crd.getName() + " (X=" + crd.getXManaCostPaid() + ")\r\n";
InputPayManaExecuteCommands inp = new InputPayManaExecuteCommands(game, message, ManaCost.get(xCost), true);
FThreads.setInputAndWait(inp);
if ( inp.isPaid() ) {
crd.addXManaCostPaid(1);
this.run();
} else
MagicStack.this.push(sa);
}
};
payNextX.run();
} else { } else {
// computer // computer
final int neededDamage = CardFactoryUtil.getNeededXDamage(sa); final int neededDamage = CardFactoryUtil.getNeededXDamage(sa);
@@ -436,7 +424,7 @@ public class MagicStack extends MyObservable {
} }
}; };
Player activating = sp.getActivatingPlayer(); final Player activating = sp.getActivatingPlayer();
if (activating.isHuman()) { if (activating.isHuman()) {
sa.getSourceCard().addMultiKickerMagnitude(-1); sa.getSourceCard().addMultiKickerMagnitude(-1);
@@ -446,13 +434,12 @@ public class MagicStack extends MyObservable {
abilityIncreaseMultikicker.resolve(); abilityIncreaseMultikicker.resolve();
int mkMagnitude = sa.getSourceCard().getMultiKickerMagnitude(); int mkMagnitude = sa.getSourceCard().getMultiKickerMagnitude();
String prompt = String.format("Multikicker for %s\r\nTimes Kicked: %d\r\n", sa.getSourceCard(), mkMagnitude ); String prompt = String.format("Multikicker for %s\r\nTimes Kicked: %d\r\n", sa.getSourceCard(), mkMagnitude );
InputPayManaExecuteCommands toSet = new InputPayManaExecuteCommands(game, prompt, sp.getMultiKickerManaCost()); InputPayManaExecuteCommands toSet = new InputPayManaExecuteCommands(activating, prompt, sp.getMultiKickerManaCost());
FThreads.setInputAndWait(toSet); FThreads.setInputAndWait(toSet);
if ( toSet.isPaid() ) { if ( toSet.isPaid() ) {
this.run(); this.run();
} else } else
MagicStack.this.push(sa); MagicStack.this.push(sa);
} }
}; };
paidCommand.run(); paidCommand.run();
@@ -480,7 +467,7 @@ public class MagicStack extends MyObservable {
}; };
Player controller = sp.getSourceCard().getController(); final Player controller = sp.getSourceCard().getController();
if (controller.isHuman()) { if (controller.isHuman()) {
sa.getSourceCard().addReplicateMagnitude(-1); sa.getSourceCard().addReplicateMagnitude(-1);
final Runnable addMagnitude = new Runnable() { final Runnable addMagnitude = new Runnable() {
@@ -488,7 +475,7 @@ public class MagicStack extends MyObservable {
public void run() { public void run() {
ability.resolve(); ability.resolve();
String prompt = String.format("Replicate for %s\r\nTimes Replicated: %d\r\n", sa.getSourceCard(), sa.getSourceCard().getReplicateMagnitude()); 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()); InputPayManaExecuteCommands toSet = new InputPayManaExecuteCommands(controller, prompt, sp.getReplicateManaCost());
FThreads.setInputAndWait(toSet); FThreads.setInputAndWait(toSet);
if ( toSet.isPaid() ) { if ( toSet.isPaid() ) {
this.run(); this.run();