diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 60306d0d756..d69b3f862ce 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -64,6 +64,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import mage.abilities.mana.ManaAbility; +import mage.abilities.mana.ManaOptions; import mage.cards.Card; import mage.constants.Zone; import mage.target.TargetSource; @@ -366,12 +367,19 @@ public class TestPlayer extends ComputerPlayer { String[] targetList = targetDefinition.split("\\^"); boolean targetFound = false; for (String targetName: targetList) { + boolean allowCopy = true; + if (targetName.endsWith("[no copy]")) { + allowCopy = false; + targetName = targetName.substring(0, targetName.length()-9); + } for (Permanent permanent : game.getBattlefield().getAllActivePermanents((FilterPermanent)target.getFilter(), game)) { if (permanent.getName().equals(targetName) || (permanent.getName()+"-"+permanent.getExpansionSetCode()).equals(targetName)) { - if (((TargetPermanent)target).canTarget(source.getControllerId(), permanent.getId(), source, game) && !target.getTargets().contains(permanent.getId())) { - target.add(permanent.getId(), game); - targetFound = true; - break; + if (((TargetPermanent)target).canTarget(source == null ? this.getId(): source.getControllerId(), permanent.getId(), source, game) && !target.getTargets().contains(permanent.getId())) { + if (!permanent.isCopy() || allowCopy) { + target.add(permanent.getId(), game); + targetFound = true; + break; + } } } } @@ -621,5 +629,9 @@ public class TestPlayer extends ComputerPlayer { } return result; } + + public ManaOptions getAvailableManaTest(Game game) { + return getManaAvailable(game); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java new file mode 100644 index 00000000000..2da335fe1ba --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java @@ -0,0 +1,137 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.utils; + +import mage.abilities.mana.ManaOptions; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class ManaOptionsTest extends CardTestPlayerBase { + + @Test + public void testSimpleMana() { + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + + setStopAt(1, PhaseStep. UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions)); + + } + + // Tinder Farm enters the battlefield tapped. + // {T}: Add {G} to your mana pool. + // {T}, Sacrifice Tinder Farm: Add {R}{W} to your mana pool. + @Test + public void testTinderFarm() { + addCard(Zone.BATTLEFIELD, playerA, "Tinder Farm", 3); + + setStopAt(2, PhaseStep. UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit",4, manaOptions.size()); + Assert.assertEquals("{G}{G}{G}", getManaOption(0, manaOptions)); + Assert.assertEquals("{R}{G}{G}{W}", getManaOption(1, manaOptions)); + Assert.assertEquals("{R}{R}{G}{W}{W}", getManaOption(2, manaOptions)); + Assert.assertEquals("{R}{R}{R}{W}{W}{W}", getManaOption(3, manaOptions)); + + } + + // Adarkar Wastes + // {T}: Add {1} to your mana pool. + // {T}: Add {W} or {U} to your mana pool. Adarkar Wastes deals 1 damage to you. + @Test + public void testAdarkarWastes() { + addCard(Zone.BATTLEFIELD, playerA, "Adarkar Wastes", 3); + + setStopAt(1, PhaseStep. UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit",4, manaOptions.size()); + Assert.assertEquals("{W}{W}{W}", getManaOption(0, manaOptions)); + Assert.assertEquals("{U}{W}{W}", getManaOption(1, manaOptions)); + Assert.assertEquals("{U}{U}{W}", getManaOption(2, manaOptions)); + Assert.assertEquals("{U}{U}{U}", getManaOption(3, manaOptions)); + + } + + + // Chromatic Sphere + // {1}, {T}, Sacrifice Chromatic Sphere: Add one mana of any color to your mana pool. Draw a card. + @Test + public void testChromaticSphere() { + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + addCard(Zone.BATTLEFIELD, playerA, "Chromatic Sphere", 2); + + setStopAt(1, PhaseStep. UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("{Any}{Any}", getManaOption(0, manaOptions)); + } + + // Orochi Leafcaller + // {G}: Add one mana of any color to your mana pool. + @Test + public void testOrochiLeafcaller() { + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + addCard(Zone.BATTLEFIELD, playerA, "Orochi Leafcaller", 1); + + setStopAt(1, PhaseStep. UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + + Assert.assertEquals("mana variations don't fit",1, manaOptions.size()); + Assert.assertEquals("{W}{W}{Any}{Any}", getManaOption(0, manaOptions)); + } + + private String getManaOption(int index, ManaOptions manaOptions) { + if (manaOptions.size() < index + 1) { + return ""; + } + return manaOptions.get(index).toString(); + } +} \ No newline at end of file diff --git a/Mage/src/mage/Mana.java b/Mage/src/mage/Mana.java index e79e2cf945a..cf3962faffb 100644 --- a/Mage/src/mage/Mana.java +++ b/Mage/src/mage/Mana.java @@ -167,6 +167,43 @@ public class Mana implements Comparable, Serializable, Copyable { any -= mana.getAny(); } + public void subtractCost(Mana cost) { + red -= cost.getRed(); + green -= cost.getGreen(); + blue -= cost.getBlue(); + white -= cost.getWhite(); + black -= cost.getBlack(); + any -= cost.getAny(); + colorless -= cost.getColorless(); + while (colorless < 0) { + if (red > 0) { + red--; + colorless++; + continue; + } + if (green > 0) { + green--; + colorless++; + continue; + } + if (blue > 0) { + blue--; + colorless++; + continue; + } + if (white > 0) { + white--; + colorless++; + continue; + } + if (black > 0) { + black--; + colorless++; + } + } + } + + public int count() { return red + green + blue + white + black + colorless + any; } diff --git a/Mage/src/mage/abilities/mana/ManaOptions.java b/Mage/src/mage/abilities/mana/ManaOptions.java index 33a69f1bd7c..7f566e68b34 100644 --- a/Mage/src/mage/abilities/mana/ManaOptions.java +++ b/Mage/src/mage/abilities/mana/ManaOptions.java @@ -171,7 +171,7 @@ public class ManaOptions extends ArrayList { Mana newMana = new Mana(); newMana.add(mana); if (mana.contains(ability.getManaCosts().getMana())) { - newMana.subtract(ability.getManaCosts().getMana()); + newMana.subtractCost(ability.getManaCosts().getMana()); newMana.add(netMana); } this.add(newMana); @@ -231,7 +231,7 @@ public class ManaOptions extends ArrayList { } for (Mana mana: this) { while (mana.includesMana(cost)) { - mana.subtract(cost); + mana.subtractCost(cost); mana.add(addMana); if (!repeatable) { break;