diff --git a/.gitattributes b/.gitattributes index 9fd4bd9c65c..2f20753e4f5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15364,6 +15364,7 @@ forge-gui/src/main/java/forge/gui/input/Input.java -text forge-gui/src/main/java/forge/gui/input/InputAttack.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/input/InputBase.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/input/InputBlock.java svneol=native#text/plain +forge-gui/src/main/java/forge/gui/input/InputConfirm.java -text forge-gui/src/main/java/forge/gui/input/InputConfirmMulligan.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/input/InputLockUI.java -text forge-gui/src/main/java/forge/gui/input/InputPassPriority.java svneol=native#text/plain @@ -15382,7 +15383,6 @@ forge-gui/src/main/java/forge/gui/input/InputSelectManyBase.java -text forge-gui/src/main/java/forge/gui/input/InputSelectTargets.java -text forge-gui/src/main/java/forge/gui/input/InputSynchronized.java -text forge-gui/src/main/java/forge/gui/input/InputSyncronizedBase.java -text -forge-gui/src/main/java/forge/gui/input/InputYesOrNo.java -text forge-gui/src/main/java/forge/gui/input/package-info.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/match/CMatchUI.java -text forge-gui/src/main/java/forge/gui/match/ControlWinLose.java -text diff --git a/forge-gui/src/main/java/forge/ai/AiController.java b/forge-gui/src/main/java/forge/ai/AiController.java index 7341dc45074..43a7afdb23e 100644 --- a/forge-gui/src/main/java/forge/ai/AiController.java +++ b/forge-gui/src/main/java/forge/ai/AiController.java @@ -910,5 +910,9 @@ public class AiController { } return max; } + + public boolean confirmPayment(CostPart costPart) { + throw new UnsupportedOperationException("AI is not supposed to reach this code at the moment"); + } } diff --git a/forge-gui/src/main/java/forge/game/cost/CostAddMana.java b/forge-gui/src/main/java/forge/game/cost/CostAddMana.java index 04baa2828ff..f4a831cf071 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostAddMana.java +++ b/forge-gui/src/main/java/forge/game/cost/CostAddMana.java @@ -22,7 +22,6 @@ import org.apache.commons.lang3.StringUtils; import forge.card.ColorSet; import forge.card.MagicColor; -import forge.game.Game; import forge.game.GameType; import forge.game.ability.AbilityUtils; import forge.game.card.Card; @@ -121,8 +120,7 @@ public class CostAddMana extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { - final Player activator = ability.getActivatingPlayer(); + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); Integer c = this.convertAmount(); if (c == null) { diff --git a/forge-gui/src/main/java/forge/game/cost/CostChooseCreatureType.java b/forge-gui/src/main/java/forge/game/cost/CostChooseCreatureType.java index e2b58398622..a5dc7bba994 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostChooseCreatureType.java +++ b/forge-gui/src/main/java/forge/game/cost/CostChooseCreatureType.java @@ -20,12 +20,11 @@ package forge.game.cost; import java.util.ArrayList; import forge.card.CardType; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.gui.input.InputYesOrNo; +import forge.gui.input.InputConfirm; /** * The Class CostChooseCreatureType. @@ -62,15 +61,15 @@ public class CostChooseCreatureType extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { - final Player activator = ability.getActivatingPlayer(); + public final boolean payHuman(final SpellAbility ability, final Player payer) { final Card source = ability.getSourceCard(); - - if (!InputYesOrNo.ask("Choose a creature type for " + source.getName() + "?")) { + InputConfirm inp = new InputConfirm("Choose a creature type for " + source.getName() + "?"); + inp.showAndWait(); + if (!inp.getResult()) { return false; } - String choice = activator.getController().chooseSomeType("Creature", ability, new ArrayList(CardType.getCreatureTypes()), new ArrayList()); + String choice = payer.getController().chooseSomeType("Creature", ability, new ArrayList(CardType.getCreatureTypes()), new ArrayList()); source.setChosenType(choice); return true; } diff --git a/forge-gui/src/main/java/forge/game/cost/CostDamage.java b/forge-gui/src/main/java/forge/game/cost/CostDamage.java index b030faf0280..dabb515ee49 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostDamage.java +++ b/forge-gui/src/main/java/forge/game/cost/CostDamage.java @@ -17,12 +17,10 @@ */ package forge.game.cost; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.gui.input.InputYesOrNo; /** * The Class CostPayLife. @@ -76,9 +74,8 @@ public class CostDamage extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final String amount = this.getAmount(); - final Player activator = ability.getActivatingPlayer(); final int life = activator.getLife(); final Card source = ability.getSourceCard(); @@ -94,7 +91,7 @@ public class CostDamage extends CostPart { } } - if (activator.canPayLife(c) && InputYesOrNo.ask("Pay " + c + " Life?")) { + if (activator.canPayLife(c) && activator.getController().confirmPayment(this, "Pay " + c + " Life?")) { activator.addDamage(c, source); return true; } diff --git a/forge-gui/src/main/java/forge/game/cost/CostDiscard.java b/forge-gui/src/main/java/forge/game/cost/CostDiscard.java index 77b77c06650..85093ee8f93 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostDiscard.java +++ b/forge-gui/src/main/java/forge/game/cost/CostDiscard.java @@ -22,7 +22,6 @@ import java.util.List; import com.google.common.base.Predicate; import forge.ai.AiController; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -162,11 +161,10 @@ public class CostDiscard extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { - final Player activator = ability.getActivatingPlayer(); + public final boolean payHuman(final SpellAbility ability, final Player payer) { final Card source = ability.getSourceCard(); - List handList = new ArrayList(activator.getCardsIn(ZoneType.Hand)); + List handList = new ArrayList(payer.getCardsIn(ZoneType.Hand)); String discardType = this.getType(); final String amount = this.getAmount(); @@ -179,7 +177,7 @@ public class CostDiscard extends CostPartWithList { } if (discardType.equals("LastDrawn")) { - final Card lastDrawn = activator.getLastDrawnCard(); + final Card lastDrawn = payer.getLastDrawnCard(); return handList.contains(lastDrawn) && executePayment(ability, lastDrawn); } @@ -201,7 +199,7 @@ public class CostDiscard extends CostPartWithList { } if (discardType.contains("+WithSameName")) { String type = discardType.replace("+WithSameName", ""); - handList = CardLists.getValidCards(handList, type.split(";"), activator, source); + handList = CardLists.getValidCards(handList, type.split(";"), payer, source); final List landList2 = handList; handList = CardLists.filter(handList, new Predicate() { @Override @@ -235,7 +233,7 @@ public class CostDiscard extends CostPartWithList { else { String type = new String(discardType); final String[] validType = type.split(";"); - handList = CardLists.getValidCards(handList, validType, activator, source); + handList = CardLists.getValidCards(handList, validType, payer, source); if (c == null) { final String sVar = ability.getSVar(amount); diff --git a/forge-gui/src/main/java/forge/game/cost/CostDraw.java b/forge-gui/src/main/java/forge/game/cost/CostDraw.java index 3cb6780e6fd..f3b5184453b 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostDraw.java +++ b/forge-gui/src/main/java/forge/game/cost/CostDraw.java @@ -20,12 +20,10 @@ package forge.game.cost; import java.util.ArrayList; import java.util.List; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.gui.input.InputYesOrNo; /** * The Class CostPayLife. @@ -104,9 +102,9 @@ public class CostDraw extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player payer) { final String amount = this.getAmount(); - final List players = getPotentialPlayers(ability.getActivatingPlayer(), ability.getSourceCard()); + final List players = getPotentialPlayers(payer, ability.getSourceCard()); final Card source = ability.getSourceCard(); Integer c = this.convertAmount(); @@ -114,7 +112,7 @@ public class CostDraw extends CostPart { c = AbilityUtils.calculateAmount(source, amount, ability); } - if (!InputYesOrNo.ask("Draw " + c + " Card" + (c == 1 ? "" : "s"))) { + if (!payer.getController().confirmPayment(this, "Draw " + c + " Card" + (c == 1 ? "" : "s"))) { return false; } diff --git a/forge-gui/src/main/java/forge/game/cost/CostExile.java b/forge-gui/src/main/java/forge/game/cost/CostExile.java index b45f5008b00..cb8cc320add 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostExile.java +++ b/forge-gui/src/main/java/forge/game/cost/CostExile.java @@ -35,7 +35,6 @@ import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.input.InputSelectCards; import forge.gui.input.InputSelectCardsFromList; -import forge.gui.input.InputYesOrNo; /** * The Class CostExile. @@ -214,10 +213,10 @@ public class CostExile extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final String amount = this.getAmount(); final Card source = ability.getSourceCard(); - final Player activator = ability.getActivatingPlayer(); + final Game game = activator.getGame(); Integer c = this.convertAmount(); String type = this.getType(); @@ -242,9 +241,9 @@ public class CostExile extends CostPartWithList { } if (this.payCostFromSource()) { - return source.getZone() == activator.getZone(from) && - InputYesOrNo.ask("Exile " + source.getName() + "?") && - executePayment(ability, source); + return source.getZone() == activator.getZone(from) + && activator.getController().confirmPayment(this, "Exile " + source.getName() + "?") + && executePayment(ability, source); } if (type.equals("All")) { @@ -274,7 +273,7 @@ public class CostExile extends CostPartWithList { } if (this.from == ZoneType.Stack) { return exileFromStack(ability, c); } - if (this.from == ZoneType.Library) { return exileFromTop(ability, c); } + if (this.from == ZoneType.Library) { return exileFromTop(ability, activator, c); } if (fromTopGrave) { return exileFromTopGraveType(ability, c, list); } if (!this.sameZone) { return exileFromMiscZone(ability, c, list); } @@ -391,17 +390,17 @@ public class CostExile extends CostPartWithList { return true; } - private boolean exileFromTop(final SpellAbility sa, final int nNeeded) { + private boolean exileFromTop(final SpellAbility sa, final Player payer, final int nNeeded) { final StringBuilder sb = new StringBuilder(); sb.append("Exile ").append(nNeeded).append(" cards from the top of your library?"); - final List list = sa.getActivatingPlayer().getCardsIn(ZoneType.Library, nNeeded); + final List list = payer.getCardsIn(ZoneType.Library, nNeeded); if (list.size() > nNeeded) { // I don't believe this is possible return false; } - if (!InputYesOrNo.ask("Exile " + nNeeded + " card" + (nNeeded == 1 ? "" : "s") + + if (!payer.getController().confirmPayment(this, "Exile " + nNeeded + " card" + (nNeeded == 1 ? "" : "s") + " from the top of your library?")) { return false; } diff --git a/forge-gui/src/main/java/forge/game/cost/CostExileAndPay.java b/forge-gui/src/main/java/forge/game/cost/CostExileAndPay.java index 9b4d1c5efca..501c4708752 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostExileAndPay.java +++ b/forge-gui/src/main/java/forge/game/cost/CostExileAndPay.java @@ -5,7 +5,6 @@ import java.util.List; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCost; -import forge.game.Game; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.player.Player; @@ -93,8 +92,8 @@ public class CostExileAndPay extends CostPartWithList { * @see forge.card.cost.CostPart#payHuman(forge.card.spellability.SpellAbility, forge.game.GameState) */ @Override - public boolean payHuman(SpellAbility ability, Game game) { - List validGrave = CardLists.getValidCards(ability.getActivatingPlayer().getZone(ZoneType.Graveyard), "Creature", ability.getActivatingPlayer(), ability.getSourceCard()); + public boolean payHuman(SpellAbility ability, Player payer) { + List validGrave = CardLists.getValidCards(payer.getZone(ZoneType.Graveyard), "Creature", payer, ability.getSourceCard()); Card selectedCard = GuiChoose.oneOrNone("Choose a creature card to exile.", validGrave); if(selectedCard == null) @@ -127,7 +126,7 @@ public class CostExileAndPay extends CostPartWithList { } final CostPayment pay = new CostPayment(selectedCost, ability); - pay.payCost(game); + pay.payCost(payer); if(!pay.isFullyPaid()) { return false; diff --git a/forge-gui/src/main/java/forge/game/cost/CostExiledMoveToGrave.java b/forge-gui/src/main/java/forge/game/cost/CostExiledMoveToGrave.java index 23919ea0a13..df15fbaa359 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostExiledMoveToGrave.java +++ b/forge-gui/src/main/java/forge/game/cost/CostExiledMoveToGrave.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -115,7 +114,7 @@ public class CostExiledMoveToGrave extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player payer) { final String amount = this.getAmount(); Integer c = this.convertAmount(); final Card source = ability.getSourceCard(); diff --git a/forge-gui/src/main/java/forge/game/cost/CostFlipCoin.java b/forge-gui/src/main/java/forge/game/cost/CostFlipCoin.java index e488830195e..55f93a507d4 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostFlipCoin.java +++ b/forge-gui/src/main/java/forge/game/cost/CostFlipCoin.java @@ -17,7 +17,6 @@ */ package forge.game.cost; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.effects.FlipCoinEffect; import forge.game.card.Card; @@ -67,7 +66,7 @@ public class CostFlipCoin extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final String amount = this.getAmount(); Integer c = this.convertAmount(); final Card source = ability.getSourceCard(); diff --git a/forge-gui/src/main/java/forge/game/cost/CostGainControl.java b/forge-gui/src/main/java/forge/game/cost/CostGainControl.java index 332cf1173f5..1dd9320dca0 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostGainControl.java +++ b/forge-gui/src/main/java/forge/game/cost/CostGainControl.java @@ -19,7 +19,6 @@ package forge.game.cost; import java.util.ArrayList; import java.util.List; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -94,20 +93,19 @@ public class CostGainControl extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player payer) { final String amount = this.getAmount(); final Card source = ability.getSourceCard(); - Integer c = this.convertAmount(); - final Player activator = ability.getActivatingPlayer(); - final List list = activator.getGame().getCardsIn(ZoneType.Battlefield); - final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription(); + Integer c = this.convertAmount(); if (c == null) { c = AbilityUtils.calculateAmount(source, amount, ability); } - List validCards = CardLists.getValidCards(list, this.getType().split(";"), activator, source); + final List list = payer.getCardsIn(ZoneType.Battlefield); + List validCards = CardLists.getValidCards(list, this.getType().split(";"), payer, source); InputSelectCards inp = new InputSelectCardsFromList(c, c, validCards); + final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription(); inp.setMessage("Gain control of %d " + desc); inp.showAndWait(); if (inp.hasCancelled()) { diff --git a/forge-gui/src/main/java/forge/game/cost/CostGainLife.java b/forge-gui/src/main/java/forge/game/cost/CostGainLife.java index 2d5eb9315c5..8a4f7562f0f 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostGainLife.java +++ b/forge-gui/src/main/java/forge/game/cost/CostGainLife.java @@ -20,7 +20,6 @@ package forge.game.cost; import java.util.ArrayList; import java.util.List; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.player.Player; @@ -117,10 +116,10 @@ public class CostGainLife extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); final String amount = this.getAmount(); - final Player activator = ability.getActivatingPlayer(); + final int life = activator.getLife(); Integer c = this.convertAmount(); diff --git a/forge-gui/src/main/java/forge/game/cost/CostMill.java b/forge-gui/src/main/java/forge/game/cost/CostMill.java index f0b557f127d..61dd229ed94 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostMill.java +++ b/forge-gui/src/main/java/forge/game/cost/CostMill.java @@ -19,14 +19,12 @@ package forge.game.cost; import java.util.List; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; -import forge.gui.input.InputYesOrNo; /** * This is for the "Mill" Cost. Putting cards from the top of your library into @@ -88,11 +86,11 @@ public class CostMill extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final String amount = this.getAmount(); Integer c = this.convertAmount(); final Card source = ability.getSourceCard(); - final Player activator = ability.getActivatingPlayer(); + if (c == null) { final String sVar = ability.getSVar(amount); @@ -104,7 +102,7 @@ public class CostMill extends CostPartWithList { } } - if (!InputYesOrNo.ask("Mill " + c + " card" + (c == 1 ? "" : "s") + " from your library?")) { + if (!activator.getController().confirmPayment(this, "Mill " + c + " card" + (c == 1 ? "" : "s") + " from your library?")) { return false; } diff --git a/forge-gui/src/main/java/forge/game/cost/CostPart.java b/forge-gui/src/main/java/forge/game/cost/CostPart.java index 770ee7f6e6e..6e461a0410d 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostPart.java +++ b/forge-gui/src/main/java/forge/game/cost/CostPart.java @@ -20,7 +20,6 @@ package forge.game.cost; import org.apache.commons.lang3.StringUtils; -import forge.game.Game; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -193,7 +192,7 @@ public abstract class CostPart { * @param game * @return true, if successful */ - public abstract boolean payHuman(SpellAbility ability, Game game); + public abstract boolean payHuman(SpellAbility ability, Player humanPayer); /* * (non-Javadoc) diff --git a/forge-gui/src/main/java/forge/game/cost/CostPartMana.java b/forge-gui/src/main/java/forge/game/cost/CostPartMana.java index f0810fab9e2..bac6969d862 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostPartMana.java +++ b/forge-gui/src/main/java/forge/game/cost/CostPartMana.java @@ -21,7 +21,6 @@ import forge.ai.ComputerUtilMana; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.mana.ManaCostBeingPaid; @@ -106,7 +105,7 @@ public class CostPartMana extends CostPart { } @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); ManaCostBeingPaid toPay = new ManaCostBeingPaid(getManaToPay(), restriction); @@ -161,7 +160,7 @@ public class CostPartMana extends CostPart { System.out.println("Finishing up Offering"); final Card offering = ability.getSacrificedAsOffering(); offering.setUsedToPay(false); - game.getAction().sacrifice(offering, ability); + activator.getGame().getAction().sacrifice(offering, ability); ability.resetSacrificedAsOffering(); } if (ability.getTappedForConvoke() != null) { diff --git a/forge-gui/src/main/java/forge/game/cost/CostPayLife.java b/forge-gui/src/main/java/forge/game/cost/CostPayLife.java index 81dbb2087fc..4f1b6e7da12 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostPayLife.java +++ b/forge-gui/src/main/java/forge/game/cost/CostPayLife.java @@ -17,12 +17,10 @@ */ package forge.game.cost; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.gui.input.InputYesOrNo; /** * The Class CostPayLife. @@ -111,10 +109,9 @@ public class CostPayLife extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); final String amount = this.getAmount(); - final Player activator = ability.getActivatingPlayer(); final int life = activator.getLife(); Integer c = this.convertAmount(); @@ -133,7 +130,7 @@ public class CostPayLife extends CostPart { } } - if (activator.canPayLife(c) && InputYesOrNo.ask("Pay " + c + " Life?")) { + if (activator.canPayLife(c) && activator.getController().confirmPayment(this, "Pay " + c + " Life?")) { activator.payLife(c, null); paidAmount = c; return true; diff --git a/forge-gui/src/main/java/forge/game/cost/CostPayment.java b/forge-gui/src/main/java/forge/game/cost/CostPayment.java index 3f47eca5d8a..2a0fc463aeb 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostPayment.java +++ b/forge-gui/src/main/java/forge/game/cost/CostPayment.java @@ -104,9 +104,9 @@ public class CostPayment { * * @return a boolean. */ - public boolean payCost(final Game game) { + public boolean payCost(final Player payer) { for (final CostPart part : this.cost.getCostParts()) { - if ( false == part.payHuman(this.ability, game) ) { + if ( false == part.payHuman(this.ability, payer) ) { return false; } diff --git a/forge-gui/src/main/java/forge/game/cost/CostPutCardToLib.java b/forge-gui/src/main/java/forge/game/cost/CostPutCardToLib.java index 3d55c5d65db..7af5ce1b539 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostPutCardToLib.java +++ b/forge-gui/src/main/java/forge/game/cost/CostPutCardToLib.java @@ -207,16 +207,15 @@ public class CostPutCardToLib extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final String amount = this.getAmount(); Integer c = this.convertAmount(); final Card source = ability.getSourceCard(); - final Player activator = ability.getActivatingPlayer(); List list; if (this.sameZone) { - list = new ArrayList(game.getCardsIn(this.getFrom())); + list = new ArrayList(activator.getGame().getCardsIn(this.getFrom())); } else { list = new ArrayList(activator.getCardsIn(this.getFrom())); } @@ -242,7 +241,7 @@ public class CostPutCardToLib extends CostPartWithList { } if (this.sameZone){ - List players = game.getPlayers(); + List players = activator.getGame().getPlayers(); List payableZone = new ArrayList(); for (Player p : players) { List enoughType = CardLists.filter(list, CardPredicates.isOwner(p)); diff --git a/forge-gui/src/main/java/forge/game/cost/CostPutCounter.java b/forge-gui/src/main/java/forge/game/cost/CostPutCounter.java index 2588d393789..5cc2649badc 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostPutCounter.java +++ b/forge-gui/src/main/java/forge/game/cost/CostPutCounter.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import forge.ai.ComputerUtilCard; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -254,7 +253,7 @@ public class CostPutCounter extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); Integer c = getNumberOfCounters(ability); @@ -264,8 +263,8 @@ public class CostPutCounter extends CostPartWithList { return true; } else { // Cards to use this branch: Scarscale Ritual, Wandering Mage - each adds only one counter - final Player actor = ability.getActivatingPlayer(); - List typeList = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), getType().split(";"), actor, ability.getSourceCard()); + + List typeList = CardLists.getValidCards(activator.getCardsIn(ZoneType.Battlefield), getType().split(";"), activator, ability.getSourceCard()); InputSelectCardToPutCounter inp = new InputSelectCardToPutCounter(c, typeList); inp.setMessage("Put %d " + getCounter().getName() + " counter on " + getDescriptiveType()); diff --git a/forge-gui/src/main/java/forge/game/cost/CostRemoveAnyCounter.java b/forge-gui/src/main/java/forge/game/cost/CostRemoveAnyCounter.java index 60ac75db7e0..943b23e77a0 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostRemoveAnyCounter.java +++ b/forge-gui/src/main/java/forge/game/cost/CostRemoveAnyCounter.java @@ -23,7 +23,6 @@ import java.util.Map; import com.google.common.base.Predicate; import forge.ai.ComputerUtil; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -109,11 +108,10 @@ public class CostRemoveAnyCounter extends CostPartWithList { } @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); Integer c = this.convertAmount(); final String type = this.getType(); - final Player activator = ability.getActivatingPlayer(); if (c == null) { c = AbilityUtils.calculateAmount(source, this.getAmount(), ability); diff --git a/forge-gui/src/main/java/forge/game/cost/CostRemoveCounter.java b/forge-gui/src/main/java/forge/game/cost/CostRemoveCounter.java index 3143b28871a..b9d98cb123c 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostRemoveCounter.java +++ b/forge-gui/src/main/java/forge/game/cost/CostRemoveCounter.java @@ -24,7 +24,6 @@ import java.util.Map; import com.google.common.collect.Lists; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -116,12 +115,11 @@ public class CostRemoveCounter extends CostPartWithList { } @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final String amount = this.getAmount(); final Card source = ability.getSourceCard(); Integer c = this.convertAmount(); final String type = this.getType(); - final Player activator = ability.getActivatingPlayer(); String sVarAmount = ability.getSVar(amount); cntRemoved = 1; diff --git a/forge-gui/src/main/java/forge/game/cost/CostReturn.java b/forge-gui/src/main/java/forge/game/cost/CostReturn.java index 986f7b4312b..0c5a6ade34b 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostReturn.java +++ b/forge-gui/src/main/java/forge/game/cost/CostReturn.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; import forge.ai.ComputerUtil; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -30,7 +29,6 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.gui.input.InputSelectCards; import forge.gui.input.InputSelectCardsFromList; -import forge.gui.input.InputYesOrNo; /** * The Class CostReturn. @@ -120,12 +118,12 @@ public class CostReturn extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player payer) { final String amount = this.getAmount(); final Card source = ability.getSourceCard(); Integer c = this.convertAmount(); - final Player activator = ability.getActivatingPlayer(); - final List list = activator.getCardsIn(ZoneType.Battlefield); + + final List list = payer.getCardsIn(ZoneType.Battlefield); if (c == null) { final String sVar = ability.getSVar(amount); // Generalize this @@ -137,8 +135,8 @@ public class CostReturn extends CostPartWithList { } if (this.payCostFromSource()) { final Card card = ability.getSourceCard(); - if (card.getController() == ability.getActivatingPlayer() && card.isInPlay()) { - return InputYesOrNo.ask("Return " + card.getName() + " to hand?") && executePayment(ability, card); + if (card.getController() == payer && card.isInPlay()) { + return payer.getController().confirmPayment(this, "Return " + card.getName() + " to hand?") && executePayment(ability, card); } } else { diff --git a/forge-gui/src/main/java/forge/game/cost/CostReveal.java b/forge-gui/src/main/java/forge/game/cost/CostReveal.java index d23fafefc40..5356939bd2d 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostReveal.java +++ b/forge-gui/src/main/java/forge/game/cost/CostReveal.java @@ -24,7 +24,6 @@ import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.ai.AiController; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -161,8 +160,7 @@ public class CostReveal extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { - final Player activator = ability.getActivatingPlayer(); + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); final String amount = this.getAmount(); diff --git a/forge-gui/src/main/java/forge/game/cost/CostSacrifice.java b/forge-gui/src/main/java/forge/game/cost/CostSacrifice.java index dbc6f618719..28166d2b186 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostSacrifice.java +++ b/forge-gui/src/main/java/forge/game/cost/CostSacrifice.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; import forge.ai.ComputerUtil; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -30,7 +29,6 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.gui.input.InputSelectCards; import forge.gui.input.InputSelectCardsFromList; -import forge.gui.input.InputYesOrNo; /** * The Class CostSacrifice. @@ -129,11 +127,11 @@ public class CostSacrifice extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final String amount = this.getAmount(); final Card source = ability.getSourceCard(); final String type = this.getType(); - final Player activator = ability.getActivatingPlayer(); + List list = new ArrayList(activator.getCardsIn(ZoneType.Battlefield)); list = CardLists.getValidCards(list, type.split(";"), activator, source); if (activator.hasKeyword("You can't sacrifice creatures to cast spells or activate abilities.")) { @@ -142,7 +140,7 @@ public class CostSacrifice extends CostPartWithList { if (this.payCostFromSource()) { if (source.getController() == ability.getActivatingPlayer() && source.isInPlay()) { - return InputYesOrNo.ask("Sacrifice " + source.getName() + "?") && executePayment(ability, source); + return activator.getController().confirmPayment(this, "Sacrifice " + source.getName() + "?") && executePayment(ability, source); } } else if (amount.equals("All")) { diff --git a/forge-gui/src/main/java/forge/game/cost/CostTap.java b/forge-gui/src/main/java/forge/game/cost/CostTap.java index 13d5e2dc3c3..b556c64a805 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostTap.java +++ b/forge-gui/src/main/java/forge/game/cost/CostTap.java @@ -17,7 +17,6 @@ */ package forge.game.cost; -import forge.game.Game; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -93,7 +92,7 @@ public class CostTap extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { // if (!canPay(ability, source, ability.getActivatingPlayer(), // payment.getCost())) // return false; diff --git a/forge-gui/src/main/java/forge/game/cost/CostTapType.java b/forge-gui/src/main/java/forge/game/cost/CostTapType.java index c60d15cde91..dba1355a76c 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostTapType.java +++ b/forge-gui/src/main/java/forge/game/cost/CostTapType.java @@ -23,7 +23,6 @@ import java.util.List; import com.google.common.base.Predicate; import forge.ai.ComputerUtil; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -172,8 +171,8 @@ public class CostTapType extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { - List typeList = new ArrayList(ability.getActivatingPlayer().getCardsIn(ZoneType.Battlefield)); + public final boolean payHuman(final SpellAbility ability, final Player activator) { + List typeList = new ArrayList(activator.getCardsIn(ZoneType.Battlefield)); String type = this.getType(); final String amount = this.getAmount(); final Card source = ability.getSourceCard(); @@ -193,7 +192,7 @@ public class CostTapType extends CostPartWithList { type = type.replace("+withTotalPowerGE" + totalP, ""); } - typeList = CardLists.getValidCards(typeList, type.split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); + typeList = CardLists.getValidCards(typeList, type.split(";"), activator, ability.getSourceCard()); typeList = CardLists.filter(typeList, Presets.UNTAPPED); if (c == null && !amount.equals("Any")) { final String sVar = ability.getSVar(amount); diff --git a/forge-gui/src/main/java/forge/game/cost/CostUnattach.java b/forge-gui/src/main/java/forge/game/cost/CostUnattach.java index d46053cc0f1..3e2a0b435fb 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-gui/src/main/java/forge/game/cost/CostUnattach.java @@ -19,12 +19,10 @@ package forge.game.cost; import java.util.List; -import forge.game.Game; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.gui.input.InputYesOrNo; /** * The Class CostUnattach. @@ -96,11 +94,11 @@ public class CostUnattach extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { final Card source = ability.getSourceCard(); - Player activator = ability.getActivatingPlayer(); + Card cardToUnattach = findCardToUnattach(source, activator, ability); - if (cardToUnattach != null && InputYesOrNo.ask("Unattach " + cardToUnattach.getName() + "?")) { + if (cardToUnattach != null && activator.getController().confirmPayment(this, "Unattach " + cardToUnattach.getName() + "?")) { return executePayment(ability, cardToUnattach); } return false; diff --git a/forge-gui/src/main/java/forge/game/cost/CostUntap.java b/forge-gui/src/main/java/forge/game/cost/CostUntap.java index f261395ef28..02e336bebf1 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostUntap.java +++ b/forge-gui/src/main/java/forge/game/cost/CostUntap.java @@ -17,7 +17,6 @@ */ package forge.game.cost; -import forge.game.Game; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -84,7 +83,7 @@ public class CostUntap extends CostPart { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { + public final boolean payHuman(final SpellAbility ability, final Player activator) { // if (!canPay(ability, source, ability.getActivatingPlayer(), // payment.getCost())) // return false; diff --git a/forge-gui/src/main/java/forge/game/cost/CostUntapType.java b/forge-gui/src/main/java/forge/game/cost/CostUntapType.java index ff487eccbaf..1a2b7c123d0 100644 --- a/forge-gui/src/main/java/forge/game/cost/CostUntapType.java +++ b/forge-gui/src/main/java/forge/game/cost/CostUntapType.java @@ -19,7 +19,6 @@ package forge.game.cost; import java.util.List; import forge.ai.ComputerUtil; -import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; @@ -131,9 +130,9 @@ public class CostUntapType extends CostPartWithList { * forge.Card, forge.card.cost.Cost_Payment) */ @Override - public final boolean payHuman(final SpellAbility ability, final Game game) { - List typeList = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), this.getType().split(";"), - ability.getActivatingPlayer(), ability.getSourceCard()); + public final boolean payHuman(final SpellAbility ability, final Player payer) { + List typeList = CardLists.getValidCards(payer.getGame().getCardsIn(ZoneType.Battlefield), this.getType().split(";"), + payer, ability.getSourceCard()); typeList = CardLists.filter(typeList, Presets.TAPPED); final Card source = ability.getSourceCard(); if (!canUntapSource) { diff --git a/forge-gui/src/main/java/forge/game/player/HumanPlay.java b/forge-gui/src/main/java/forge/game/player/HumanPlay.java index 560bf15ff94..c917697848f 100644 --- a/forge-gui/src/main/java/forge/game/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/game/player/HumanPlay.java @@ -58,7 +58,6 @@ import forge.gui.input.InputPayManaExecuteCommands; import forge.gui.input.InputPayManaSimple; import forge.gui.input.InputSelectCards; import forge.gui.input.InputSelectCardsFromList; -import forge.gui.input.InputYesOrNo; import forge.util.Lang; /** @@ -305,12 +304,12 @@ public class HumanPlay { } if (parts.isEmpty() || (costPart.getAmount().equals("0") && parts.size() < 2)) { - return InputYesOrNo.ask("Do you want to pay {0}?" + orString); + return p.getController().confirmPayment(costPart, "Do you want to pay {0}?" + orString); } // 0 mana costs were slipping through because CostPart.getAmount returns 1 else if (costPart instanceof CostPartMana && parts.size() < 2) { if (((CostPartMana) costPart).getManaToPay().isZero()) { - return InputYesOrNo.ask("Do you want to pay {0}?" + orString); + return p.getController().confirmPayment(costPart, "Do you want to pay {0}?" + orString); } } @@ -324,7 +323,7 @@ public class HumanPlay { return false; } - if (!InputYesOrNo.ask("Do you want to pay " + amount + " life?" + orString)) { + if (!p.getController().confirmPayment(part, "Do you want to pay " + amount + " life?" + orString)) { return false; } @@ -355,7 +354,7 @@ public class HumanPlay { } sb.append("?" + orString); - if (!InputYesOrNo.ask(sb.toString())) { + if (!p.getController().confirmPayment(part,sb.toString())) { return false; } @@ -364,17 +363,15 @@ public class HumanPlay { } } else if (part instanceof CostGainLife) { - if (!part.payHuman(sourceAbility, p.getGame())) { + if (!part.payHuman(sourceAbility, p)) { return false; } } else if (part instanceof CostAddMana) { - if (!InputYesOrNo.ask("Do you want to add " - + ((CostAddMana) part).toString() - + " to your mana pool?" + orString)) { + if (!p.getController().confirmPayment(part, "Do you want to add " + ((CostAddMana) part).toString() + " to your mana pool?" + orString)) { return false; } - if (!part.payHuman(sourceAbility, p.getGame())) { + if (!part.payHuman(sourceAbility, p)) { return false; } } @@ -382,8 +379,7 @@ public class HumanPlay { final int amount = getAmountFromPart(part, source, sourceAbility); final List list = p.getCardsIn(ZoneType.Library); if (list.size() < amount) { return false; } - if (!InputYesOrNo.ask("Do you want to mill " + amount + - " card" + (amount == 1 ? "" : "s") + "?" + orString)) { + if (!p.getController().confirmPayment(part, "Do you want to mill " + amount + " card" + (amount == 1 ? "" : "s") + "?" + orString)) { return false; } List listmill = p.getCardsIn(ZoneType.Library, amount); @@ -391,8 +387,7 @@ public class HumanPlay { } else if (part instanceof CostFlipCoin) { final int amount = getAmountFromPart(part, source, sourceAbility); - if (!InputYesOrNo.ask("Do you want to flip " + amount + - " coin" + (amount == 1 ? "" : "s") + "?" + orString)) { + if (!p.getController().confirmPayment(part, "Do you want to flip " + amount + " coin" + (amount == 1 ? "" : "s") + "?" + orString)) { return false; } final int n = FlipCoinEffect.getFilpMultiplier(p); @@ -406,7 +401,7 @@ public class HumanPlay { return false; } - if (!InputYesOrNo.ask("Do you want " + source + " to deal " + amount + " damage to you?")) { + if (!p.getController().confirmPayment(part, "Do you want " + source + " to deal " + amount + " damage to you?")) { return false; } @@ -422,7 +417,7 @@ public class HumanPlay { return false; } - if (!InputYesOrNo.ask("Do you want to put " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " on " + source + "?")) { + if (!p.getController().confirmPayment(part, "Do you want to put " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " on " + source + "?")) { return false; } @@ -432,7 +427,7 @@ public class HumanPlay { List list = p.getGame().getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, part.getType().split(";"), p, source); if (list.isEmpty()) { return false; } - if (!InputYesOrNo.ask("Do you want to put " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " on " + part.getTypeDescription() + "?")) { + if (!p.getController().confirmPayment(part, "Do you want to put " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " on " + part.getTypeDescription() + "?")) { return false; } while (amount > 0) { @@ -457,7 +452,7 @@ public class HumanPlay { return false; } - if (!InputYesOrNo.ask("Do you want to remove " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " from " + source + "?")) { + if (!p.getController().confirmPayment(part, "Do you want to remove " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " from " + source + "?")) { return false; } @@ -474,7 +469,7 @@ public class HumanPlay { } } if (allCounters < amount) { return false; } - if (!InputYesOrNo.ask("Do you want to remove counters from " + part.getDescriptiveType() + " ?")) { + if (!p.getController().confirmPayment(part, "Do you want to remove counters from " + part.getDescriptiveType() + " ?")) { return false; } @@ -516,7 +511,7 @@ public class HumanPlay { } else if (part instanceof CostExile) { if ("All".equals(part.getType())) { - if (!InputYesOrNo.ask("Do you want to exile all cards in your graveyard?")) { + if (!p.getController().confirmPayment(part, "Do you want to exile all cards in your graveyard?")) { return false; } @@ -534,7 +529,7 @@ public class HumanPlay { return false; } if (from == ZoneType.Library) { - if (!InputYesOrNo.ask("Do you want to exile " + nNeeded + + if (!p.getController().confirmPayment(part, "Do you want to exile " + nNeeded + " card" + (nNeeded == 1 ? "" : "s") + " from your library?")) { return false; } diff --git a/forge-gui/src/main/java/forge/game/player/PlayerController.java b/forge-gui/src/main/java/forge/game/player/PlayerController.java index f26492bedd2..82d4433c49f 100644 --- a/forge-gui/src/main/java/forge/game/player/PlayerController.java +++ b/forge-gui/src/main/java/forge/game/player/PlayerController.java @@ -21,6 +21,7 @@ import forge.game.card.Card; import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.Cost; +import forge.game.cost.CostPart; import forge.game.mana.Mana; import forge.game.phase.PhaseType; import forge.game.replacement.ReplacementEffect; @@ -188,4 +189,6 @@ public abstract class PlayerController { public abstract PaperCard chooseSinglePaperCard(SpellAbility sa, String message, Predicate cpp, String name); public abstract List chooseColors(String message, SpellAbility sa, int min, int max, List options); public abstract CounterType chooseCounterType(Collection options, SpellAbility sa, String prompt); + + public abstract boolean confirmPayment(CostPart costPart, String string); } diff --git a/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java b/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java index f5f6645d017..f6a2a79e7d2 100644 --- a/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/forge-gui/src/main/java/forge/game/player/PlayerControllerAi.java @@ -38,6 +38,7 @@ import forge.game.card.CardPredicates; import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.Cost; +import forge.game.cost.CostPart; import forge.game.mana.Mana; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.Ability; @@ -574,4 +575,9 @@ public class PlayerControllerAi extends PlayerController { // find first nonzero counter on target return Iterables.getFirst(options, null); } + + @Override + public boolean confirmPayment(CostPart costPart, String prompt) { + return brains.confirmPayment(costPart); // AI is expected to know what it is paying for at the moment (otherwise add another parameter to this method) + } } diff --git a/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java index f42da842345..d7658d37195 100644 --- a/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -41,6 +41,7 @@ import forge.game.card.Card; import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.Cost; +import forge.game.cost.CostPart; import forge.game.mana.Mana; import forge.game.phase.PhaseType; import forge.game.replacement.ReplacementEffect; @@ -62,7 +63,7 @@ import forge.gui.input.InputPassPriority; import forge.gui.input.InputPlayOrDraw; import forge.gui.input.InputSelectCards; import forge.gui.input.InputSelectCardsFromList; -import forge.gui.input.InputYesOrNo; +import forge.gui.input.InputConfirm; import forge.gui.match.CMatchUI; import forge.gui.match.controllers.CPrompt; import forge.gui.toolbox.FSkin; @@ -435,7 +436,9 @@ public class PlayerControllerHuman extends PlayerController { } } - return InputYesOrNo.ask(buildQuestion.toString()); + InputConfirm inp = new InputConfirm(buildQuestion.toString()); + inp.showAndWait(); + return inp.getResult(); } @Override @@ -924,4 +927,11 @@ public class PlayerControllerHuman extends PlayerController { } return GuiChoose.one(prompt, options); } + + @Override + public boolean confirmPayment(CostPart costPart, String question) { + InputConfirm inp = new InputConfirm(question); + inp.showAndWait(); + return inp.getResult(); + } } diff --git a/forge-gui/src/main/java/forge/game/spellability/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/game/spellability/HumanPlaySpellAbility.java index eb9a956f575..b8c8b8838d0 100644 --- a/forge-gui/src/main/java/forge/game/spellability/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/game/spellability/HumanPlaySpellAbility.java @@ -52,8 +52,9 @@ public class HumanPlaySpellAbility { } public final void playAbility(boolean mayChooseTargets, boolean isFree, boolean skipStack) { + final Player human = ability.getActivatingPlayer(); final Game game = ability.getActivatingPlayer().getGame(); - + // used to rollback Zone fromZone = null; int zonePosition = 0; @@ -73,7 +74,7 @@ public class HumanPlaySpellAbility { boolean prerequisitesMet = this.announceValuesLikeX() && this.announceType() && (!mayChooseTargets || setupTargets()) // if you can choose targets, then do choose them. - && (isFree || this.payment.payCost(game)); + && (isFree || this.payment.payCost(human)); if (!prerequisitesMet) { if (!ability.isTrigger()) { diff --git a/forge-gui/src/main/java/forge/gui/input/InputYesOrNo.java b/forge-gui/src/main/java/forge/gui/input/InputConfirm.java similarity index 67% rename from forge-gui/src/main/java/forge/gui/input/InputYesOrNo.java rename to forge-gui/src/main/java/forge/gui/input/InputConfirm.java index 9621838a73b..5d47ed32dd8 100644 --- a/forge-gui/src/main/java/forge/gui/input/InputYesOrNo.java +++ b/forge-gui/src/main/java/forge/gui/input/InputConfirm.java @@ -27,43 +27,28 @@ import forge.view.ButtonUtil; * @author Forge * @version $Id: InputConfirmMulligan.java 21647 2013-05-24 22:31:11Z Max mtg $ */ -public class InputYesOrNo extends InputSyncronizedBase { +public class InputConfirm extends InputSyncronizedBase { private static final long serialVersionUID = -3591794991788531626L; - public static boolean ask(String message0) { - return ask(message0, "Yes", "No", true); - } - public static boolean ask(String message0, boolean defaultYes0) { - return ask(message0, "Yes", "No", defaultYes0); - } - public static boolean ask(String message0, String yesButtonText0, String noButtonText0) { - return ask(message0, yesButtonText0, noButtonText0, true); - } - public static boolean ask(String message0, String yesButtonText0, String noButtonText0, boolean defaultYes0) { - InputYesOrNo inp = new InputYesOrNo(message0, yesButtonText0, noButtonText0, defaultYes0); - inp.showAndWait(); - return inp.getResult(); - } - private final String message; private final String yesButtonText; private final String noButtonText; private final boolean defaultYes; private boolean result; - public InputYesOrNo(String message0) { + public InputConfirm(String message0) { this(message0, "Yes", "No", true); } - public InputYesOrNo(String message0, boolean defaultYes0) { + public InputConfirm(String message0, boolean defaultYes0) { this(message0, "Yes", "No", defaultYes0); } - public InputYesOrNo(String message0, String yesButtonText0, String noButtonText0) { + public InputConfirm(String message0, String yesButtonText0, String noButtonText0) { this(message0, yesButtonText0, noButtonText0, true); } - public InputYesOrNo(String message0, String yesButtonText0, String noButtonText0, boolean defaultYes0) { + public InputConfirm(String message0, String yesButtonText0, String noButtonText0, boolean defaultYes0) { this.message = message0; this.yesButtonText = yesButtonText0; this.noButtonText = noButtonText0; @@ -73,7 +58,7 @@ public class InputYesOrNo extends InputSyncronizedBase { /** {@inheritDoc} */ @Override - public final void showMessage() { + protected final void showMessage() { ButtonUtil.setButtonText(this.yesButtonText, this.noButtonText); if (this.defaultYes) { ButtonUtil.enableAllFocusOk(); diff --git a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index ccd84726de5..58e532c239d 100644 --- a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -30,6 +30,7 @@ import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.Cost; +import forge.game.cost.CostPart; import forge.game.mana.Mana; import forge.game.player.HumanPlay; import forge.game.player.LobbyPlayer; @@ -461,4 +462,9 @@ public class PlayerControllerForTests extends PlayerController { public CounterType chooseCounterType(Collection options, SpellAbility sa, String prompt) { return Iterables.getFirst(options, CounterType.P1P1); } + + @Override + public boolean confirmPayment(CostPart costPart, String string) { + return true; + } }