From e56b8545c7ddf6bce363c4751c50858a09638f67 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Tue, 18 May 2021 23:36:56 +0200 Subject: [PATCH 1/3] Fix paying negative life --- forge-game/src/main/java/forge/game/cost/CostPayLife.java | 6 +++++- forge-game/src/main/java/forge/game/player/Player.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) 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."); From ce3bab8a33c2ae04e6941e74987ee54c85b4d09d Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 19 May 2021 00:09:55 +0200 Subject: [PATCH 2/3] Fix for Temporal Extortion --- .../src/main/java/forge/game/ability/AbilityUtils.java | 3 +-- forge-gui/src/main/java/forge/player/HumanPlay.java | 10 ++++++---- 2 files changed, 7 insertions(+), 6 deletions(-) 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 d358d55f990..e032ec7137a 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1551,8 +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)); - cost = new Cost("PayLife<" + halfup + ">", true); + cost = new Cost("PayLife", true); } alreadyPaid |= payer.getController().payCostToPreventEffect(cost, sa, alreadyPaid, allPayers); } diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 8a76b21a2f3..2436caba15d 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); @@ -267,11 +265,15 @@ public class HumanPlay { boolean mayRemovePart = true; if (part instanceof CostPayLife) { - final int amount = getAmountFromPart(part, source, sourceAbility); - if (!p.canPayLife(amount)) { + if (!part.canPay(sourceAbility, p)) { return false; } + int amount = getAmountFromPart(part, source, sourceAbility); + if (part.getAmount().contains("/Half")) { + amount = Math.max(amount, 0); + } + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPayNLife", String.valueOf(amount)) + orString, sourceAbility)) { return false; } From 6f9d557a640413df2edc09bd68243d3b58b10c8e Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 19 May 2021 16:29:38 +0200 Subject: [PATCH 3/3] Clean up --- .../src/main/java/forge/game/ability/AbilityUtils.java | 3 ++- forge-gui/src/main/java/forge/player/HumanPlay.java | 8 ++------ 2 files changed, 4 insertions(+), 7 deletions(-) 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 e032ec7137a..256e0fe46ec 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,8 @@ public class AbilityUtils { boolean alreadyPaid = false; for (Player payer : allPayers) { if (unlessCost.equals("LifeTotalHalfUp")) { - cost = new Cost("PayLife", true); + 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-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 2436caba15d..ba58489a1cf 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -265,15 +265,11 @@ public class HumanPlay { boolean mayRemovePart = true; if (part instanceof CostPayLife) { - if (!part.canPay(sourceAbility, p)) { + final int amount = getAmountFromPart(part, source, sourceAbility); + if (!p.canPayLife(amount)) { return false; } - int amount = getAmountFromPart(part, source, sourceAbility); - if (part.getAmount().contains("/Half")) { - amount = Math.max(amount, 0); - } - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPayNLife", String.valueOf(amount)) + orString, sourceAbility)) { return false; }