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 69287606ef3..4a1750f0ff3 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -625,11 +625,21 @@ public class Player extends GameEntity implements Comparable { return false; } - // Ashiok Exile instead of paying life - if (hasKeyword("Exile library instead of pay life") && lifePayment <= getZone(ZoneType.Library).size()) { - // TODO is cause always set or not? if not then the ChangeZoneTable needs to trigger differently? - getGame().getAction().exile(getTopXCardsFromLibrary(lifePayment), cause, null); - return true; + // Replacement only matters when life payment is greater than 0 + if (lifePayment > 0) { + Map replaceParams = AbilityKey.mapFromAffected(this); + replaceParams.put(AbilityKey.Amount, lifePayment); + replaceParams.put(AbilityKey.Cause, cause); + replaceParams.put(AbilityKey.EffectOnly, effect); + switch (getGame().getReplacementHandler().run(ReplacementType.PayLife, replaceParams)) { + case Replaced: + return true; + case Prevented: + case Skipped: + return false; + default: + break; + }; } final int lost = loseLife(lifePayment, false, false); diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacePayLife.java b/forge-game/src/main/java/forge/game/replacement/ReplacePayLife.java new file mode 100644 index 00000000000..68ca92a30a9 --- /dev/null +++ b/forge-game/src/main/java/forge/game/replacement/ReplacePayLife.java @@ -0,0 +1,41 @@ +package forge.game.replacement; + +import java.util.Map; + +import forge.game.ability.AbilityKey; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; +import forge.util.Expressions; + +public class ReplacePayLife extends ReplacementEffect { + + public ReplacePayLife(Map map, Card host, boolean intrinsic) { + super(map, host, intrinsic); + } + + @Override + public boolean canReplace(Map runParams) { + // TODO Auto-generated method stub + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; + } + + if (hasParam("Amount")) { + final int n = (Integer)runParams.get(AbilityKey.Amount); + String comparator = getParam("Amount"); + final String operator = comparator.substring(0, 2); + final int operandValue = Integer.parseInt(comparator.substring(2)); + if (!Expressions.compare(n, operator, operandValue)) { + return false; + } + } + return true; + } + + @Override + public void setReplacingObjects(Map runParams, SpellAbility sa) { + sa.setReplacingObject(AbilityKey.Player, runParams.get(AbilityKey.Affected)); + sa.setReplacingObjectsFrom(runParams, AbilityKey.Amount); + } + +} diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java index 2107dcb3c9d..2461d522b80 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java @@ -33,6 +33,7 @@ public enum ReplacementType { LoseMana(ReplaceLoseMana.class), Mill(ReplaceMill.class), Moved(ReplaceMoved.class), + PayLife(ReplacePayLife.class), PlanarDiceResult(ReplacePlanarDiceResult.class), ProduceMana(ReplaceProduceMana.class), Proliferate(ReplaceProliferate.class),