From 884a3af503ff3e481ce42120e9a22fed39a24c15 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 28 May 2017 23:45:41 +0200 Subject: [PATCH] * Norn's Annex - Fixed a bug with the payment of phyrexian mana (fixes #3178). --- .../abilities/costs/mana/ManaCostsImpl.java | 32 ++++++++++++++- .../costs/mana/PhyrexianManaCost.java | 6 --- .../PayCostToAttackBlockEffectImpl.java | 39 ++----------------- .../CantAttackYouUnlessPayManaAllEffect.java | 3 +- 4 files changed, 34 insertions(+), 46 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java index ac00686e7b3..e912ce2fb04 100644 --- a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java +++ b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java @@ -27,12 +27,17 @@ */ package mage.abilities.costs.mana; +import java.util.*; import mage.Mana; import mage.abilities.Ability; import mage.abilities.costs.Cost; +import mage.abilities.costs.Costs; +import mage.abilities.costs.CostsImpl; import mage.abilities.costs.VariableCost; +import mage.abilities.costs.common.PayLifeCost; import mage.abilities.mana.ManaOptions; import mage.constants.ColoredManaSymbol; +import mage.constants.Outcome; import mage.filter.Filter; import mage.game.Game; import mage.players.ManaPool; @@ -40,8 +45,6 @@ import mage.players.Player; import mage.target.Targets; import mage.util.ManaUtil; -import java.util.*; - /** * @author BetaSteward_at_googlemail.com * @param @@ -158,6 +161,7 @@ public class ManaCostsImpl extends ArrayList implements M @Override public boolean payOrRollback(Ability ability, Game game, UUID sourceId, UUID payingPlayerId) { int bookmark = game.bookmarkState(); + handlePhyrexianManaCosts(payingPlayerId, ability, game); if (pay(ability, game, sourceId, payingPlayerId, false, null)) { game.removeBookmark(bookmark); return true; @@ -166,6 +170,30 @@ public class ManaCostsImpl extends ArrayList implements M return false; } + private void handlePhyrexianManaCosts(UUID payingPlayerId, Ability source, Game game) { + Player player = game.getPlayer(payingPlayerId); + if (this == null || player == null) { + return; // nothing to be done without any mana costs. prevents NRE from occurring here + } + Iterator manaCostIterator = this.iterator(); + Costs tempCosts = new CostsImpl<>(); + + while (manaCostIterator.hasNext()) { + ManaCost manaCost = manaCostIterator.next(); + if (manaCost instanceof PhyrexianManaCost) { + PhyrexianManaCost phyrexianManaCost = (PhyrexianManaCost) manaCost; + PayLifeCost payLifeCost = new PayLifeCost(2); + if (payLifeCost.canPay(source, source.getSourceId(), player.getId(), game) + && player.chooseUse(Outcome.LoseLife, "Pay 2 life instead of " + phyrexianManaCost.getBaseText() + '?', source, game)) { + manaCostIterator.remove(); + tempCosts.add(payLifeCost); + } + } + } + + tempCosts.pay(source, game, source.getSourceId(), player.getId(), false, null); + } + @Override public ManaCosts getUnpaid() { ManaCosts unpaid = new ManaCostsImpl<>(); diff --git a/Mage/src/main/java/mage/abilities/costs/mana/PhyrexianManaCost.java b/Mage/src/main/java/mage/abilities/costs/mana/PhyrexianManaCost.java index 3dfad98d515..29a598c586d 100644 --- a/Mage/src/main/java/mage/abilities/costs/mana/PhyrexianManaCost.java +++ b/Mage/src/main/java/mage/abilities/costs/mana/PhyrexianManaCost.java @@ -27,13 +27,8 @@ */ package mage.abilities.costs.mana; -import java.util.UUID; import mage.Mana; -import mage.abilities.Ability; -import mage.abilities.costs.Cost; import mage.constants.ColoredManaSymbol; -import mage.game.Game; -import mage.players.ManaPool; /** * @@ -64,7 +59,6 @@ public class PhyrexianManaCost extends ColoredManaCost { return new ColoredManaCost(this); } - @Override public PhyrexianManaCost copy() { return new PhyrexianManaCost(this); diff --git a/Mage/src/main/java/mage/abilities/effects/PayCostToAttackBlockEffectImpl.java b/Mage/src/main/java/mage/abilities/effects/PayCostToAttackBlockEffectImpl.java index cad17d724e8..363762189f6 100644 --- a/Mage/src/main/java/mage/abilities/effects/PayCostToAttackBlockEffectImpl.java +++ b/Mage/src/main/java/mage/abilities/effects/PayCostToAttackBlockEffectImpl.java @@ -27,16 +27,10 @@ */ package mage.abilities.effects; -import java.util.Iterator; import mage.abilities.Ability; import mage.abilities.costs.Cost; -import mage.abilities.costs.Costs; -import mage.abilities.costs.CostsImpl; -import mage.abilities.costs.common.PayLifeCost; -import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.costs.mana.PhyrexianManaCost; import mage.constants.Duration; import mage.constants.Outcome; import mage.game.Game; @@ -93,7 +87,7 @@ public abstract class PayCostToAttackBlockEffectImpl extends ReplacementEffectIm this.manaCosts = manaCosts; } - public PayCostToAttackBlockEffectImpl(PayCostToAttackBlockEffectImpl effect) { + public PayCostToAttackBlockEffectImpl(final PayCostToAttackBlockEffectImpl effect) { super(effect); if (effect.cost != null) { this.cost = effect.cost.copy(); @@ -125,11 +119,11 @@ public abstract class PayCostToAttackBlockEffectImpl extends ReplacementEffectIm public boolean replaceEvent(GameEvent event, Ability source, Game game) { ManaCosts attackBlockManaTax = getManaCostToPay(event, source, game); if (attackBlockManaTax != null) { - return handleManaCosts(attackBlockManaTax, event, source, game); + return handleManaCosts(attackBlockManaTax.copy(), event, source, game); } Cost attackBlockOtherTax = getOtherCostToPay(event, source, game); if (attackBlockOtherTax != null) { - return handleOtherCosts(attackBlockOtherTax, event, source, game); + return handleOtherCosts(attackBlockOtherTax.copy(), event, source, game); } return false; } @@ -146,9 +140,6 @@ public abstract class PayCostToAttackBlockEffectImpl extends ReplacementEffectIm attackBlockManaTax.clearPaid(); if (attackBlockManaTax.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(Outcome.Neutral, chooseText, source, game)) { - - handlePhyrexianManaCosts(getManaCostToPay(event, source, game), player, source, game); - if (attackBlockManaTax instanceof ManaCostsImpl) { if (attackBlockManaTax.payOrRollback(source, game, source.getSourceId(), event.getPlayerId())) { return false; @@ -160,30 +151,6 @@ public abstract class PayCostToAttackBlockEffectImpl extends ReplacementEffectIm return false; } - private void handlePhyrexianManaCosts(ManaCosts manaCosts, Player player, Ability source, Game game) { - - if (manaCosts == null) return; // nothing to be done without any mana costs. prevents NRE from occurring here - - Iterator manaCostIterator = manaCosts.iterator(); - Costs costs = new CostsImpl<>(); - - while(manaCostIterator.hasNext()) { - ManaCost manaCost = manaCostIterator.next(); - if(manaCost instanceof PhyrexianManaCost) { - PhyrexianManaCost phyrexianManaCost = (PhyrexianManaCost)manaCost; - PayLifeCost payLifeCost = new PayLifeCost(2); - if(payLifeCost.canPay(source, source.getSourceId(), player.getId(), game) && - player.chooseUse(Outcome.LoseLife, "Pay 2 life instead of " + phyrexianManaCost.getBaseText() + '?', source, game)) { - manaCostIterator.remove(); - costs.add(payLifeCost); - } - } - } - - costs.pay(source, game, source.getSourceId(), player.getId(), false, null); - } - - private boolean handleOtherCosts(Cost attackBlockOtherTax, GameEvent event, Ability source, Game game) { Player player = game.getPlayer(event.getPlayerId()); if (player != null) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouUnlessPayManaAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouUnlessPayManaAllEffect.java index 49eec364564..e26c0710e45 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouUnlessPayManaAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouUnlessPayManaAllEffect.java @@ -30,7 +30,6 @@ package mage.abilities.effects.common.combat; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.effects.PayCostToAttackBlockEffectImpl; -import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.common.FilterCreaturePermanent; @@ -67,7 +66,7 @@ public class CantAttackYouUnlessPayManaAllEffect extends PayCostToAttackBlockEff + " for each creature he or she controls that's attacking you"; } - public CantAttackYouUnlessPayManaAllEffect(CantAttackYouUnlessPayManaAllEffect effect) { + public CantAttackYouUnlessPayManaAllEffect(final CantAttackYouUnlessPayManaAllEffect effect) { super(effect); this.payAlsoForAttackingPlaneswalker = effect.payAlsoForAttackingPlaneswalker; this.filterCreaturePermanent = effect.filterCreaturePermanent;