diff --git a/src/main/java/forge/card/cost/CostSacrifice.java b/src/main/java/forge/card/cost/CostSacrifice.java index 2e68f4079ca..369b09bdd6c 100644 --- a/src/main/java/forge/card/cost/CostSacrifice.java +++ b/src/main/java/forge/card/cost/CostSacrifice.java @@ -236,7 +236,6 @@ public class CostSacrifice extends CostPartWithList { payment.getAbility().addCostToHashList(card, "Sacrificed"); Singletons.getModel().getGame().getAction().sacrifice(card, ability); } - payment.setPaidPart(this); } else { Integer c = this.convertAmount(); if (c == null) { @@ -252,6 +251,7 @@ public class CostSacrifice extends CostPartWithList { } FThreads.setInputAndWait(new InputPayCostSacrificeFromList(this, ability, c, payment, list)); } + if( !payment.isCanceled()) addListToHash(ability, "Sacrificed"); } diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index 7a6bcfae599..fa78df4e5b3 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -367,6 +367,23 @@ public final class GameActionUtil { ripple.execute(); } + private static int getAmountFromPart(CostPart part, Card source, SpellAbility sourceAbility) { + String amountString = part.getAmount(); + return StringUtils.isNumeric(amountString) ? Integer.parseInt(amountString) : AbilityUtils.calculateAmount(source, amountString, sourceAbility); + } + + /** + * TODO: Write javadoc for this method. + * @param part + * @param source + * @param sourceAbility + * @return + */ + private static int getAmountFromPartX(CostPart part, Card source, SpellAbility sourceAbility) { + String amountString = part.getAmount(); + return StringUtils.isNumeric(amountString) ? Integer.parseInt(amountString) : CardFactoryUtil.xCount(source, source.getSVar(amountString)); + } + /** *
* payCostDuringAbilityResolve.
@@ -390,10 +407,8 @@ public final class GameActionUtil {
if (!parts.isEmpty()) {
costPart = parts.get(0);
}
- String orString = "";
- if (sourceAbility != null) {
- orString = " (or: " + sourceAbility.getStackDescription() + ")";
- }
+ final String orString = sourceAbility == null ? "" : " (or: " + sourceAbility.getStackDescription() + ")";
+
if (parts.isEmpty() || costPart.getAmount().equals("0")) {
return GuiDialog.confirm(source, "Do you want to pay 0?" + orString);
}
@@ -401,38 +416,31 @@ public final class GameActionUtil {
boolean hasPaid = true;
//the following costs do not need inputs
for (CostPart part : parts) {
+ boolean dontRemove = false;
+
if (part instanceof CostPayLife) {
- String amountString = part.getAmount();
-
- final int amount = StringUtils.isNumeric(amountString) ? Integer.parseInt(amountString)
- : AbilityUtils.calculateAmount(source, amountString, sourceAbility);
+ final int amount = getAmountFromPart(part, source, sourceAbility);
if (p.canPayLife(amount) && GuiDialog.confirm(source, "Do you want to pay " + amount + " life?" + orString)) {
p.payLife(amount, null);
} else {
hasPaid = false;
break;
}
- remainingParts.remove(part);
}
else if (part instanceof CostDamage) {
- String amountString = part.getAmount();
- final int amount = StringUtils.isNumeric(amountString) ? Integer.parseInt(amountString)
- : CardFactoryUtil.xCount(source, source.getSVar(amountString));
+ int amount = getAmountFromPartX(part, source, sourceAbility);
if (p.canPayLife(amount) && GuiDialog.confirm(source, "Do you want " + source + " to deal " + amount + " damage to you?")) {
p.addDamage(amount, source);
} else {
hasPaid = false;
break;
}
- remainingParts.remove(part);
}
else if (part instanceof CostPutCounter) {
- String amountString = part.getAmount();
CounterType counterType = ((CostPutCounter) part).getCounter();
- int amount = StringUtils.isNumeric(amountString) ? Integer.parseInt(amountString)
- : CardFactoryUtil.xCount(source, source.getSVar(amountString));
+ int amount = getAmountFromPartX(part, source, sourceAbility);
String plural = amount > 1 ? "s" : "";
if (GuiDialog.confirm(source, "Do you want to put " + amount + " " + counterType.getName()
+ " counter" + plural + " on " + source + "?")) {
@@ -440,7 +448,7 @@ public final class GameActionUtil {
source.addCounter(counterType, amount, false);
} else {
hasPaid = false;
- Singletons.getModel().getGame().getGameLog().add("ResolveStack", "Trying to pay upkeep for " + source + " but it can't have "
+ p.getGame().getGameLog().add("ResolveStack", "Trying to pay upkeep for " + source + " but it can't have "
+ counterType.getName() + " counters put on it.", 2);
break;
}
@@ -448,14 +456,11 @@ public final class GameActionUtil {
hasPaid = false;
break;
}
- remainingParts.remove(part);
}
else if (part instanceof CostRemoveCounter) {
- String amountString = part.getAmount();
CounterType counterType = ((CostRemoveCounter) part).getCounter();
- int amount = StringUtils.isNumeric(amountString) ? Integer.parseInt(amountString)
- : CardFactoryUtil.xCount(source, source.getSVar(amountString));
+ int amount = getAmountFromPartX(part, source, sourceAbility);
String plural = amount > 1 ? "s" : "";
if (part.canPay(sourceAbility, source, p, cost, game)
&& GuiDialog.confirm(source, "Do you want to remove " + amount + " " + counterType.getName()
@@ -465,7 +470,6 @@ public final class GameActionUtil {
hasPaid = false;
break;
}
- remainingParts.remove(part);
}
else if (part instanceof CostExile) {
@@ -473,35 +477,32 @@ public final class GameActionUtil {
if (GuiDialog.confirm(source, "Do you want to exile all cards in your graveyard?")) {
List