- payManaOptional will now pass on the spellability to payCostDuringAbilityResolve.

- Added support for CostGainLife in payCostDuringAbilityResolve.
This commit is contained in:
Sloth
2013-06-17 21:48:45 +00:00
parent ae1e2dbbcb
commit d2e205a3fc
9 changed files with 21 additions and 14 deletions

View File

@@ -533,7 +533,7 @@ public class GameAction {
final Ability recoverAbility = new Ability(recoverable, ManaCost.ZERO) { final Ability recoverAbility = new Ability(recoverable, ManaCost.ZERO) {
@Override @Override
public void resolve() { 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) if (hasPaid)
moveToHand(recoverable); moveToHand(recoverable);

View File

@@ -979,7 +979,7 @@ public class CombatUtil {
} }
boolean isFree = attackCost.getTotalMana().isZero() && attackCost.isOnlyManaCost(); // true if needless to pay 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);
} }
/** /**

View File

@@ -595,7 +595,7 @@ public class PhaseHandler implements java.io.Serializable {
boolean hasPaid = blockCost.getTotalMana().isZero() && blockCost.isOnlyManaCost(); // true if needless to pay boolean hasPaid = blockCost.getTotalMana().isZero() && blockCost.isOnlyManaCost(); // true if needless to pay
if (!hasPaid) { 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; return hasPaid;
} }

View File

@@ -171,7 +171,7 @@ public class Upkeep extends Phase {
@Override @Override
public void resolve() { public void resolve() {
Cost cost = c.getEchoCost(); 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) if (!hasPaid)
game.getAction().sacrifice(c, this);; game.getAction().sacrifice(c, this);;
@@ -262,7 +262,7 @@ public class Upkeep extends Phase {
final Ability upkeepAbility = new Ability(c, ManaCost.ZERO) { final Ability upkeepAbility = new Ability(c, ManaCost.ZERO) {
@Override @Override
public void resolve() { 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<String, Object> runParams = new HashMap<String, Object>(); final HashMap<String, Object> runParams = new HashMap<String, Object>();
runParams.put("CumulativeUpkeepPaid", (Boolean) isPaid); runParams.put("CumulativeUpkeepPaid", (Boolean) isPaid);
runParams.put("Card", this.getSourceCard()); runParams.put("Card", this.getSourceCard());

View File

@@ -25,6 +25,7 @@ import forge.card.cost.CostDamage;
import forge.card.cost.CostDiscard; import forge.card.cost.CostDiscard;
import forge.card.cost.CostDraw; import forge.card.cost.CostDraw;
import forge.card.cost.CostExile; import forge.card.cost.CostExile;
import forge.card.cost.CostGainLife;
import forge.card.cost.CostMill; import forge.card.cost.CostMill;
import forge.card.cost.CostPart; import forge.card.cost.CostPart;
import forge.card.cost.CostPartMana; import forge.card.cost.CostPartMana;
@@ -303,7 +304,7 @@ public class HumanPlay {
if (!parts.isEmpty()) { if (!parts.isEmpty()) {
costPart = parts.get(0); 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")) { if (parts.isEmpty() || costPart.getAmount().equals("0")) {
return GuiDialog.confirm(source, "Do you want to pay 0?" + orString); 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("Do you want to ");
sb.append(res.contains(p) ? "" : "let that player "); sb.append(res.contains(p) ? "" : "let that player ");
sb.append(amount); sb.append("draw " + amount);
sb.append(" card(s)?" + orString); sb.append(" card(s)?" + orString);
if (!GuiDialog.confirm(source, sb.toString())) { 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) { else if (part instanceof CostMill) {
final int amount = getAmountFromPart(part, source, sourceAbility); final int amount = getAmountFromPart(part, source, sourceAbility);
final List<Card> list = p.getCardsIn(ZoneType.Library); final List<Card> list = p.getCardsIn(ZoneType.Library);

View File

@@ -140,7 +140,7 @@ public abstract class PlayerController {
public abstract void takePriority(); public abstract void takePriority();
public abstract List<Card> chooseCardsToDiscardToMaximumHandSize(int numDiscard); public abstract List<Card> 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); public abstract int chooseNumber(SpellAbility sa, String title, int min, int max);

View File

@@ -335,7 +335,7 @@ public class PlayerControllerAi extends PlayerController {
} }
@Override @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() {} }; final Ability ability = new AbilityStatic(c, cost, null) { @Override public void resolve() {} };
ability.setActivatingPlayer(c.getController()); ability.setActivatingPlayer(c.getController());

View File

@@ -585,8 +585,8 @@ public class PlayerControllerHuman extends PlayerController {
* @see forge.game.player.PlayerController#payManaOptional(forge.Card, forge.card.cost.Cost) * @see forge.game.player.PlayerController#payManaOptional(forge.Card, forge.card.cost.Cost)
*/ */
@Override @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) {
return HumanPlay.payCostDuringAbilityResolve(player, c, cost, null, prompt); return HumanPlay.payCostDuringAbilityResolve(player, c, cost, sa, prompt);
} }

View File

@@ -331,7 +331,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
do { do {
int mkMagnitude = sp.getSourceCard().getKickerMagnitude(); int mkMagnitude = sp.getSourceCard().getKickerMagnitude();
String prompt = String.format("Multikicker for %s\r\nTimes Kicked: %d\r\n", sp.getSourceCard(), mkMagnitude ); String prompt = String.format("Multikicker for %s\r\nTimes Kicked: %d\r\n", sp.getSourceCard(), mkMagnitude );
hasPaid = activating.getController().payManaOptional(sp.getSourceCard(), costMultikicker, prompt, ManaPaymentPurpose.Multikicker); hasPaid = activating.getController().payManaOptional(sp.getSourceCard(), costMultikicker, sp, prompt, ManaPaymentPurpose.Multikicker);
if( hasPaid ) if( hasPaid )
sp.getSourceCard().addMultiKickerMagnitude(1); sp.getSourceCard().addMultiKickerMagnitude(1);
} while( hasPaid ); } while( hasPaid );
@@ -348,12 +348,12 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
// doesn't happen here // doesn't happen here
final Player activating = sp.getActivatingPlayer(); final Player activating = sp.getActivatingPlayer();
final Cost costMultikicker = new Cost(sp.getPayCosts().getTotalMana(), false); final Cost costReplicate = new Cost(sp.getPayCosts().getTotalMana(), false);
boolean hasPaid = false; boolean hasPaid = false;
do { do {
String prompt = String.format("Replicate for %s\r\nTimes Replicated: %d\r\n", sp.getSourceCard(), magnitude); String prompt = String.format("Replicate for %s\r\nTimes Replicated: %d\r\n", sp.getSourceCard(), magnitude);
hasPaid = activating.getController().payManaOptional(sp.getSourceCard(), costMultikicker, prompt, ManaPaymentPurpose.Replicate); hasPaid = activating.getController().payManaOptional(sp.getSourceCard(), costReplicate, sp, prompt, ManaPaymentPurpose.Replicate);
if( hasPaid ) if( hasPaid )
magnitude++; magnitude++;
} while( hasPaid ); } while( hasPaid );