diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 53121986657..f08b9f321f0 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -533,7 +533,7 @@ public class GameAction { final Ability recoverAbility = new Ability(recoverable, ManaCost.ZERO) { @Override public void resolve() { - boolean hasPaid = recoverable.getController().getController().payManaOptional(recoverable, cost, sb.toString(), ManaPaymentPurpose.Recover); + boolean hasPaid = recoverable.getController().getController().payManaOptional(recoverable, cost, this, sb.toString(), ManaPaymentPurpose.Recover); if (hasPaid) moveToHand(recoverable); diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index cc6c6c8ace2..972be9f9293 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -979,7 +979,7 @@ public class CombatUtil { } boolean isFree = attackCost.getTotalMana().isZero() && attackCost.isOnlyManaCost(); // true if needless to pay - return isFree || c.getController().getController().payManaOptional(c, attackCost, "Pay additional cost to declare " + c + " an attacker", ManaPaymentPurpose.DeclareAttacker); + return isFree || c.getController().getController().payManaOptional(c, attackCost, null, "Pay additional cost to declare " + c + " an attacker", ManaPaymentPurpose.DeclareAttacker); } /** diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 3aa6ca7c496..ae2f8ae6b7d 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -595,7 +595,7 @@ public class PhaseHandler implements java.io.Serializable { boolean hasPaid = blockCost.getTotalMana().isZero() && blockCost.isOnlyManaCost(); // true if needless to pay if (!hasPaid) { - hasPaid = blocker.getController().getController().payManaOptional(blocker, blockCost, "Pay cost to declare " + blocker + " a blocker", ManaPaymentPurpose.DeclareBlocker); + hasPaid = blocker.getController().getController().payManaOptional(blocker, blockCost, null, "Pay cost to declare " + blocker + " a blocker", ManaPaymentPurpose.DeclareBlocker); } return hasPaid; } diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 1c0443f7ad5..0314374e0b0 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -171,7 +171,7 @@ public class Upkeep extends Phase { @Override public void resolve() { Cost cost = c.getEchoCost(); - boolean hasPaid = c.getController().getController().payManaOptional(c, cost, "Echo for " + c, ManaPaymentPurpose.Echo); + boolean hasPaid = c.getController().getController().payManaOptional(c, cost, this, "Echo for " + c, ManaPaymentPurpose.Echo); if (!hasPaid) game.getAction().sacrifice(c, this);; @@ -262,7 +262,7 @@ public class Upkeep extends Phase { final Ability upkeepAbility = new Ability(c, ManaCost.ZERO) { @Override public void resolve() { - boolean isPaid = controller.getController().payManaOptional(c, upkeepCost, "Cumulative upkeep for " + c, ManaPaymentPurpose.CumulativeUpkeep); + boolean isPaid = controller.getController().payManaOptional(c, upkeepCost, this, "Cumulative upkeep for " + c, ManaPaymentPurpose.CumulativeUpkeep); final HashMap runParams = new HashMap(); runParams.put("CumulativeUpkeepPaid", (Boolean) isPaid); runParams.put("Card", this.getSourceCard()); diff --git a/src/main/java/forge/game/player/HumanPlay.java b/src/main/java/forge/game/player/HumanPlay.java index 7dedd40abac..93e3044cf1d 100644 --- a/src/main/java/forge/game/player/HumanPlay.java +++ b/src/main/java/forge/game/player/HumanPlay.java @@ -25,6 +25,7 @@ import forge.card.cost.CostDamage; import forge.card.cost.CostDiscard; import forge.card.cost.CostDraw; import forge.card.cost.CostExile; +import forge.card.cost.CostGainLife; import forge.card.cost.CostMill; import forge.card.cost.CostPart; import forge.card.cost.CostPartMana; @@ -303,7 +304,7 @@ public class HumanPlay { if (!parts.isEmpty()) { costPart = parts.get(0); } - final String orString = sourceAbility == null ? "" : " (or: " + sourceAbility.getStackDescription() + ")"; + final String orString = prompt != null ? "" : " (or: " + sourceAbility.getStackDescription() + ")"; if (parts.isEmpty() || costPart.getAmount().equals("0")) { return GuiDialog.confirm(source, "Do you want to pay 0?" + orString); @@ -342,7 +343,7 @@ public class HumanPlay { sb.append("Do you want to "); sb.append(res.contains(p) ? "" : "let that player "); - sb.append(amount); + sb.append("draw " + amount); sb.append(" card(s)?" + orString); if (!GuiDialog.confirm(source, sb.toString())) { @@ -354,6 +355,12 @@ public class HumanPlay { } } + else if (part instanceof CostGainLife) { + if (!part.payHuman(sourceAbility, p.getGame())) { + return false; + } + } + else if (part instanceof CostMill) { final int amount = getAmountFromPart(part, source, sourceAbility); final List list = p.getCardsIn(ZoneType.Library); diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 4e2684bfefb..1a5284c48f7 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -140,7 +140,7 @@ public abstract class PlayerController { public abstract void takePriority(); public abstract List chooseCardsToDiscardToMaximumHandSize(int numDiscard); - public abstract boolean payManaOptional(Card card, Cost cost, String prompt, ManaPaymentPurpose purpose); + public abstract boolean payManaOptional(Card card, Cost cost, SpellAbility sa, String prompt, ManaPaymentPurpose purpose); public abstract int chooseNumber(SpellAbility sa, String title, int min, int max); diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index 7110b8c8980..fca4fbbbc4b 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -335,7 +335,7 @@ public class PlayerControllerAi extends PlayerController { } @Override - public boolean payManaOptional(Card c, Cost cost, String prompt, ManaPaymentPurpose purpose) { + public boolean payManaOptional(Card c, Cost cost, SpellAbility sa, String prompt, ManaPaymentPurpose purpose) { final Ability ability = new AbilityStatic(c, cost, null) { @Override public void resolve() {} }; ability.setActivatingPlayer(c.getController()); diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 98f8cc52838..d407c25a55d 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -585,8 +585,8 @@ public class PlayerControllerHuman extends PlayerController { * @see forge.game.player.PlayerController#payManaOptional(forge.Card, forge.card.cost.Cost) */ @Override - public boolean payManaOptional(Card c, Cost cost, String prompt, ManaPaymentPurpose purpose) { - return HumanPlay.payCostDuringAbilityResolve(player, c, cost, null, prompt); + public boolean payManaOptional(Card c, Cost cost, SpellAbility sa, String prompt, ManaPaymentPurpose purpose) { + return HumanPlay.payCostDuringAbilityResolve(player, c, cost, sa, prompt); } diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 918b6f4c642..43728b0e7e6 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -331,7 +331,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable