From bb70d9c02665de901b92e0e7b2fed88ee1d18e8a Mon Sep 17 00:00:00 2001 From: Hellfish Date: Sat, 5 Jan 2013 17:11:54 +0000 Subject: [PATCH] *Corrected mana ability flagging. *Fixed crash when using Metalworker-likes during mana payment. --- src/main/java/forge/card/mana/ManaPool.java | 10 +++++++- .../forge/card/spellability/SpellAbility.java | 24 ++++++++++++++----- .../control/input/InputPayManaCostUtil.java | 20 +++++++++++++--- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/java/forge/card/mana/ManaPool.java b/src/main/java/forge/card/mana/ManaPool.java index fae06df3ec2..e9aad233083 100644 --- a/src/main/java/forge/card/mana/ManaPool.java +++ b/src/main/java/forge/card/mana/ManaPool.java @@ -511,9 +511,17 @@ public class ManaPool { final List paidAbs = sa.getPayingManaAbilities(); final List manaPaid = sa.getPayingMana(); + + SpellAbility tail = ma; + AbilityManaPart abManaPart = null; + while(abManaPart == null && tail != null) + { + abManaPart = tail.getManaPart(); + tail = tail.getSubAbility(); + } paidAbs.add(ma); // assumes some part on the mana produced by the ability will get used - for (final Mana mana : ma.getManaPart().getLastProduced()) { + for (final Mana mana : abManaPart.getLastProduced()) { if (manaCost.isNeeded(mana)) { manaCost.payMana(mana); manaPaid.add(mana); diff --git a/src/main/java/forge/card/spellability/SpellAbility.java b/src/main/java/forge/card/spellability/SpellAbility.java index eedcb0b1bf1..d4bf6332cea 100644 --- a/src/main/java/forge/card/spellability/SpellAbility.java +++ b/src/main/java/forge/card/spellability/SpellAbility.java @@ -125,16 +125,28 @@ public abstract class SpellAbility implements ISpellAbility { } public final boolean isManaAbility() { - if(manaPart != null && isAbility()) + SpellAbility tail = this; + boolean manaProducing = false; + if(getRestrictions() != null) { - return true; + if(getRestrictions().getPlaneswalker()) + { + return false; //Loyalty ability, not a mana ability. + } } - if(this.getSubAbility() != null) - { - return this.getSubAbility().isManaAbility(); + while(tail != null) { + if(tail.getTarget() != null) { + return false; //Targeted ability,not a mana ability. + } + if(tail.getManaPart() != null) + { + manaProducing = true; //Can add mana to a players mana pool, possible mana ability. + } + + tail = tail.getSubAbility(); } - return false; + return manaProducing; } public final void setManaPart(AbilityManaPart manaPart) { diff --git a/src/main/java/forge/control/input/InputPayManaCostUtil.java b/src/main/java/forge/control/input/InputPayManaCostUtil.java index f3708a73f47..e926ed90d5d 100644 --- a/src/main/java/forge/control/input/InputPayManaCostUtil.java +++ b/src/main/java/forge/control/input/InputPayManaCostUtil.java @@ -82,8 +82,16 @@ public class InputPayManaCostUtil { for (SpellAbility ma : card.getManaAbility()) { ma.setActivatingPlayer(Singletons.getControl().getPlayer()); - AbilityManaPart m = ma.getManaPart(); - if (!ma.canPlay()) { + AbilityManaPart m = null; + SpellAbility tail = ma; + while(m == null && tail != null) + { + m = tail.getManaPart(); + tail = tail.getSubAbility(); + } + if(m == null) { + continue; + } else if (!ma.canPlay()) { continue; } else if (!InputPayManaCostUtil.canMake(ma, cneeded.toString())) { continue; @@ -191,9 +199,15 @@ public class InputPayManaCostUtil { } chosen = GuiChoose.one("Choose mana ability", abilities); } + + SpellAbility subchosen = chosen; + while(subchosen.getManaPart() == null) + { + subchosen = subchosen.getSubAbility(); + } // save off color needed for use by any mana and reflected mana - chosen.getManaPart().setExpressChoice(colorsNeeded); + subchosen.getManaPart().setExpressChoice(colorsNeeded); Singletons.getModel().getGame().getAction().playSpellAbility(chosen);