diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 135a52ea213..db20ea1e4f7 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1551,7 +1551,7 @@ public class AbilityUtils { boolean alreadyPaid = false; for (Player payer : allPayers) { if (unlessCost.equals("LifeTotalHalfUp")) { - String halfup = Integer.toString((int) Math.ceil(payer.getLife() / 2.0)); + String halfup = Integer.toString(Math.max(0,(int) Math.ceil(payer.getLife() / 2.0))); cost = new Cost("PayLife<" + halfup + ">", true); } alreadyPaid |= payer.getController().payCostToPreventEffect(cost, sa, alreadyPaid, allPayers); diff --git a/forge-game/src/main/java/forge/game/cost/CostPayLife.java b/forge-game/src/main/java/forge/game/cost/CostPayLife.java index 117fba983c3..7953ec78f7e 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayLife.java @@ -76,9 +76,13 @@ public class CostPayLife extends CostPart { Integer amount = this.convertAmount(); if (amount == null) { // try to calculate when it's defined. amount = AbilityUtils.calculateAmount(ability.getHostCard(), getAmount(), ability); + // CR 107.1b + if (getAmount().contains("/Half")) { + amount = Math.max(amount, 0); + } } - if ((amount != null) && !payer.canPayLife(amount)) { + if (amount != null && !payer.canPayLife(amount)) { return false; } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index b6043d78bbf..454026f3c6c 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -589,7 +589,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean canPayLife(final int lifePayment) { - if (life < lifePayment) { + if (lifePayment > 0 && life < lifePayment) { return false; } return (lifePayment <= 0) || !hasKeyword("Your life total can't change."); diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 8a76b21a2f3..ba58489a1cf 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -198,8 +198,6 @@ public class HumanPlay { req.playAbility(!useOldTargets, false, true); } - // ------------------------------------------------------------------------ - 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);