diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/CursesTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/curses/CursesTest.java similarity index 99% rename from Mage.Tests/src/test/java/org/mage/test/cards/single/CursesTest.java rename to Mage.Tests/src/test/java/org/mage/test/cards/abilities/curses/CursesTest.java index 2acb04fbf26..f492f2b14b3 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/CursesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/curses/CursesTest.java @@ -1,4 +1,4 @@ -package org.mage.test.cards.single; +package org.mage.test.cards.abilities.curses; import mage.Constants; import org.junit.Test; diff --git a/Mage/src/mage/ConditionalMana.java b/Mage/src/mage/ConditionalMana.java index dc598f0bc81..5b0fb3c57e6 100644 --- a/Mage/src/mage/ConditionalMana.java +++ b/Mage/src/mage/ConditionalMana.java @@ -27,9 +27,9 @@ */ package mage; -import mage.Constants.ManaType; import mage.abilities.Ability; import mage.abilities.condition.Condition; +import mage.abilities.mana.conditional.ManaCondition; import mage.filter.Filter; import mage.filter.FilterMana; import mage.game.Game; @@ -37,6 +37,7 @@ import mage.game.Game; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.UUID; /** * @author nantuko @@ -59,6 +60,11 @@ public class ConditionalMana extends Mana implements Serializable { */ private Filter.ComparisonScope scope = Filter.ComparisonScope.All; + /** + * UUID of source for mana. + */ + private UUID manaProducerId; + public ConditionalMana(Mana mana) { super(mana); } @@ -78,12 +84,15 @@ public class ConditionalMana extends Mana implements Serializable { this.scope = scope; } - public boolean apply(Ability ability, Game game) { + public boolean apply(Ability ability, Game game, UUID manaProducerId) { if (conditions.size() == 0) { throw new IllegalStateException("Conditional mana should contain at least one Condition"); } for (Condition condition : conditions) { - if (!condition.apply(game, ability)) { + boolean applied = (condition instanceof ManaCondition) ? + ((ManaCondition)condition).apply(game, ability, manaProducerId) : condition.apply(game, ability); + + if (!applied) { // if one condition fails, return false only if All conditions should be met // otherwise it may happen that Any other condition will be ok if (scope.equals(Filter.ComparisonScope.All)) { @@ -124,4 +133,11 @@ public class ConditionalMana extends Mana implements Serializable { if (filter.isColorless()) colorless = 0; } + public UUID getManaProducerId() { + return manaProducerId; + } + + public void setManaProducerId(UUID manaProducerId) { + this.manaProducerId = manaProducerId; + } } diff --git a/Mage/src/mage/abilities/condition/Condition.java b/Mage/src/mage/abilities/condition/Condition.java index d9d43341f49..9b19bbe0af7 100644 --- a/Mage/src/mage/abilities/condition/Condition.java +++ b/Mage/src/mage/abilities/condition/Condition.java @@ -8,10 +8,11 @@ import java.io.Serializable; /** * Interface describing condition occurrence. * - * @author nantuko + * @author nantuko, noxx */ public interface Condition extends Serializable { - /** + + /** * Checks the game to see if this condition applies for the given ability. * * @param game diff --git a/Mage/src/mage/abilities/condition/common/PermanentHasCounterCondition.java b/Mage/src/mage/abilities/condition/common/PermanentHasCounterCondition.java index 774f1de57ed..d53778d9095 100644 --- a/Mage/src/mage/abilities/condition/common/PermanentHasCounterCondition.java +++ b/Mage/src/mage/abilities/condition/common/PermanentHasCounterCondition.java @@ -33,57 +33,59 @@ import mage.counters.CounterType; import mage.game.Game; import mage.filter.FilterPermanent; import mage.game.permanent.Permanent; + import java.util.List; /** - * * @author jeffwadsworth */ public class PermanentHasCounterCondition implements Condition { - - public static enum CountType { MORE_THAN, FEWER_THAN, EQUAL_TO }; - private CounterType counterType; - private int amount; - private FilterPermanent filter; - private CountType type; - - public PermanentHasCounterCondition(CounterType counterType, int amount, FilterPermanent filter) { - this(counterType, amount, filter, CountType.EQUAL_TO); - } - - public PermanentHasCounterCondition(CounterType counterType, int amount, FilterPermanent filter, CountType type) { - this.counterType = counterType; - this.amount = amount; - this.filter = filter; - this.type = type; - } - @Override - public boolean apply(Game game, Ability source) { - boolean conditionApplies = false; - List permanents = game.getBattlefield().getAllActivePermanents(this.filter, source.getControllerId()); - for (Permanent permanent : permanents) { - switch ( this.type ) { - case FEWER_THAN: - if (permanent.getCounters().getCount(this.counterType) < this.amount) { - conditionApplies = true; - break; - } - break; - case MORE_THAN: - if (permanent.getCounters().getCount(this.counterType) > this.amount) { - conditionApplies = true; - break; - } - break; - case EQUAL_TO: - if (permanent.getCounters().getCount(this.counterType) == this.amount) { - conditionApplies = true; - break; - } - break; + public static enum CountType {MORE_THAN, FEWER_THAN, EQUAL_TO} + + ; + private CounterType counterType; + private int amount; + private FilterPermanent filter; + private CountType type; + + public PermanentHasCounterCondition(CounterType counterType, int amount, FilterPermanent filter) { + this(counterType, amount, filter, CountType.EQUAL_TO); + } + + public PermanentHasCounterCondition(CounterType counterType, int amount, FilterPermanent filter, CountType type) { + this.counterType = counterType; + this.amount = amount; + this.filter = filter; + this.type = type; + } + + @Override + public boolean apply(Game game, Ability source) { + boolean conditionApplies = false; + List permanents = game.getBattlefield().getAllActivePermanents(this.filter, source.getControllerId()); + for (Permanent permanent : permanents) { + switch (this.type) { + case FEWER_THAN: + if (permanent.getCounters().getCount(this.counterType) < this.amount) { + conditionApplies = true; + break; } - } - return conditionApplies; - } + break; + case MORE_THAN: + if (permanent.getCounters().getCount(this.counterType) > this.amount) { + conditionApplies = true; + break; + } + break; + case EQUAL_TO: + if (permanent.getCounters().getCount(this.counterType) == this.amount) { + conditionApplies = true; + break; + } + break; + } + } + return conditionApplies; + } } diff --git a/Mage/src/mage/abilities/costs/mana/ColoredManaCost.java b/Mage/src/mage/abilities/costs/mana/ColoredManaCost.java index 45978712b60..484076b46e1 100644 --- a/Mage/src/mage/abilities/costs/mana/ColoredManaCost.java +++ b/Mage/src/mage/abilities/costs/mana/ColoredManaCost.java @@ -78,6 +78,9 @@ public class ColoredManaCost extends ManaCostImpl { @Override public boolean testPay(Mana testMana) { + if (testMana.getAny() > 0) { + return true; + } switch (mana) { case B: return testMana.getBlack() > 0; diff --git a/Mage/src/mage/abilities/mana/AnyColorManaAbility.java b/Mage/src/mage/abilities/mana/AnyColorManaAbility.java index 8b01f515d98..a2c5040a007 100644 --- a/Mage/src/mage/abilities/mana/AnyColorManaAbility.java +++ b/Mage/src/mage/abilities/mana/AnyColorManaAbility.java @@ -41,6 +41,7 @@ public class AnyColorManaAbility extends ManaAbility { public AnyColorManaAbility(Cost cost) { super(Constants.Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), cost); this.addChoice(new ChoiceColor()); + this.netMana.setAny(1); } public AnyColorManaAbility(final AnyColorManaAbility ability) { diff --git a/Mage/src/mage/abilities/mana/ConditionalAnyColorManaAbility.java b/Mage/src/mage/abilities/mana/ConditionalAnyColorManaAbility.java index 09fe3bbec34..a68e72f12a7 100644 --- a/Mage/src/mage/abilities/mana/ConditionalAnyColorManaAbility.java +++ b/Mage/src/mage/abilities/mana/ConditionalAnyColorManaAbility.java @@ -51,6 +51,7 @@ public class ConditionalAnyColorManaAbility extends ManaAbility 0 && mana.getConditionalMana().apply(ability, game)) { + if (mana.isConditional() && mana.getConditionalMana().get(manaType) > 0 && mana.getConditionalMana().apply(ability, game, mana.getSourceId())) { if (filter == null || filter.match(game.getObject(mana.getSourceId()))) return mana.getConditionalMana().get(manaType); } @@ -117,7 +117,7 @@ public class ManaPool implements Serializable { } int count = 0; for (ConditionalMana mana : getConditionalMana()) { - if (mana.apply(ability, game)) { + if (mana.apply(ability, game, mana.getManaProducerId())) { count += mana.count(filter); } } @@ -140,7 +140,8 @@ public class ManaPool implements Serializable { while (it.hasNext()) { ManaPoolItem item = it.next(); if (item.isConditional()) { - if (item.getConditionalMana().apply(ability, game)) { + ConditionalMana cm = item.getConditionalMana(); + if (cm.apply(ability, game, cm.getManaProducerId())) { total += item.count(); it.remove(); } @@ -170,7 +171,7 @@ public class ManaPool implements Serializable { ManaPoolItem item = it.next(); if (item.isConditional()) { ConditionalMana c = item.getConditionalMana(); - if (c.apply(ability, game)) { + if (c.apply(ability, game, c.getManaProducerId())) { int count = c.count(filter); if (count > 0) { total += count; @@ -246,10 +247,10 @@ public class ManaPool implements Serializable { this.manaItems.add(new ManaPoolItem((ConditionalMana)mana, source.getSourceId())); } else { this.manaItems.add(new ManaPoolItem(mana.getRed(), mana.getGreen(), mana.getBlue(), mana.getWhite(), mana.getBlack(), mana.getColorless(), source.getSourceId())); - GameEvent event = GameEvent.getEvent(GameEvent.EventType.MANA_ADDED, source.getSourceId(), source.getId(), source.getControllerId()); - event.setData(mana.toString()); - game.fireEvent(event); } + GameEvent event = GameEvent.getEvent(GameEvent.EventType.MANA_ADDED, source.getSourceId(), source.getId(), source.getControllerId()); + event.setData(mana.toString()); + game.fireEvent(event); } public List getConditionalMana() { @@ -276,7 +277,7 @@ public class ManaPool implements Serializable { private void removeConditional(ManaType manaType, Ability ability, Game game) { for (ConditionalMana mana : getConditionalMana()) { - if (mana.get(manaType) > 0 && mana.apply(ability, game)) { + if (mana.get(manaType) > 0 && mana.apply(ability, game, mana.getManaProducerId())) { mana.set(manaType, mana.get(manaType) - 1); break; } diff --git a/Mage/src/mage/players/ManaPoolItem.java b/Mage/src/mage/players/ManaPoolItem.java index fcd67577543..02eb38dc060 100644 --- a/Mage/src/mage/players/ManaPoolItem.java +++ b/Mage/src/mage/players/ManaPoolItem.java @@ -27,12 +27,13 @@ */ package mage.players; -import java.io.Serializable; -import java.util.UUID; import mage.ConditionalMana; import mage.Constants.ManaType; import mage.Mana; +import java.io.Serializable; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -63,6 +64,7 @@ public class ManaPoolItem implements Serializable { public ManaPoolItem(ConditionalMana conditionalMana, UUID sourceId) { this.conditionalMana = conditionalMana; this.sourceId = sourceId; + this.conditionalMana.setManaProducerId(sourceId); } public ManaPoolItem(final ManaPoolItem item) {