From cd8e03867925e9c543ebacd4a5f25795fdafe85a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 21 Jun 2018 16:27:05 +0200 Subject: [PATCH] * Changes for netMana null handling #5023. --- .../src/mage/cards/o/OrcishLumberjack.java | 3 +- .../org/mage/test/utils/ManaOptionsTest.java | 39 ++++++++++++++++++- Mage/src/main/java/mage/Mana.java | 26 ++++++++----- .../mana/ActivatedManaAbilityImpl.java | 5 ++- .../java/mage/abilities/mana/ManaOptions.java | 5 ++- 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java b/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java index fe0f317c572..7dbd242d0b2 100644 --- a/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java +++ b/Mage.Sets/src/mage/cards/o/OrcishLumberjack.java @@ -1,4 +1,3 @@ - package mage.cards.o; import java.util.ArrayList; @@ -65,7 +64,7 @@ public final class OrcishLumberjack extends CardImpl { class OrcishLumberjackManaEffect extends ManaEffect { - private List netMana = new ArrayList(); + private List netMana = new ArrayList<>(); public OrcishLumberjackManaEffect() { super(); 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 index f1c70e08386..b72003e40f6 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ManaOptionsTest.java @@ -1,4 +1,3 @@ - package org.mage.test.utils; import mage.abilities.mana.ManaOptions; @@ -233,6 +232,25 @@ public class ManaOptionsTest extends CardTestPlayerBase { } + @Test + public void testNykthos5() { + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 2); + addCard(Zone.BATTLEFIELD, playerA, "Sedge Scorpion", 4); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + addCard(Zone.BATTLEFIELD, playerA, "Nykthos, Shrine to Nyx", 1); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + assertDuplicatedManaOptions(manaOptions); + + Assert.assertEquals("mana variations don't fit", 3, manaOptions.size()); + assertManaOptions("{W}{W}{G}", manaOptions); + assertManaOptions("{C}{G}{G}{G}", manaOptions); + assertManaOptions("{G}{G}{G}{G}{G}", manaOptions); + } + @Test public void testDuplicatedDontHave1() { addCard(Zone.BATTLEFIELD, playerA, "City of Brass", 2); // Any @@ -417,4 +435,23 @@ public class ManaOptionsTest extends CardTestPlayerBase { Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); assertManaOptions("{C}", manaOptions); } + + @Test + public void testCharmedPedant() { + // {T}, Put the top card of your library into your graveyard: For each colored mana symbol in that card's mana cost, add one mana of that color. + // Activate this ability only any time you could cast an instant. + addCard(Zone.BATTLEFIELD, playerA, "Charmed Pendant", 1); + // {T}: Add {C}. + // {T}: Add {C}{C}. Spend this mana only to cast colorless Eldrazi spells or activate abilities of colorless Eldrazi. + addCard(Zone.BATTLEFIELD, playerA, "Eldrazi Temple", 1); + + setStopAt(1, PhaseStep.UPKEEP); + execute(); + + ManaOptions manaOptions = playerA.getAvailableManaTest(currentGame); + assertDuplicatedManaOptions(manaOptions); + + Assert.assertEquals("mana variations don't fit", 1, manaOptions.size()); + assertManaOptions("{C}{C}", manaOptions); + } } diff --git a/Mage/src/main/java/mage/Mana.java b/Mage/src/main/java/mage/Mana.java index a3900cf9475..1788fd264e4 100644 --- a/Mage/src/main/java/mage/Mana.java +++ b/Mage/src/main/java/mage/Mana.java @@ -1,4 +1,3 @@ - package mage; import java.io.Serializable; @@ -30,6 +29,14 @@ public class Mana implements Comparable, Serializable, Copyable { * Default constructor. Creates a {@link Mana} object with 0 values. */ public Mana() { + red = 0; + green = 0; + blue = 0; + white = 0; + black = 0; + generic = 0; + colorless = 0; + flag = false; } /** @@ -54,6 +61,7 @@ public class Mana implements Comparable, Serializable, Copyable { this.generic = notNegative(generic, "Generic"); this.colorless = notNegative(colorless, "Colorless"); this.any = notNegative(any, "Any"); + this.flag = false; } /** @@ -492,25 +500,25 @@ public class Mana implements Comparable, Serializable, Copyable { if (generic > 0) { sbMana.append('{').append(Integer.toString(generic)).append('}'); } - if (colorless >= 20) { + if (colorless >= 20) { sbMana.append(Integer.toString(colorless)).append("{C}"); } - if (white >= 20) { + if (white >= 20) { sbMana.append(Integer.toString(white)).append("{W}"); } - if (blue >= 20) { + if (blue >= 20) { sbMana.append(Integer.toString(blue)).append("{U}"); } - if (black >= 20) { + if (black >= 20) { sbMana.append(Integer.toString(black)).append("{B}"); } - if (red >= 20) { + if (red >= 20) { sbMana.append(Integer.toString(red)).append("{R}"); } - if (green >= 20) { + if (green >= 20) { sbMana.append(Integer.toString(green)).append("{G}"); } - if (any >= 20) { + if (any >= 20) { sbMana.append(Integer.toString(any)).append("{Any}"); } for (int i = 0; i < colorless && colorless < 20; i++) { @@ -908,7 +916,7 @@ public class Mana implements Comparable, Serializable, Copyable { return true; } else if (mana.colorless > 0 && this.colorless > 0 && includeColorless) { return true; - } else if (mana.any > 0 && this.count() > 0){ + } else if (mana.any > 0 && this.count() > 0) { return true; } diff --git a/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java b/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java index 0d5f9b861f3..59806252712 100644 --- a/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/mana/ActivatedManaAbilityImpl.java @@ -73,7 +73,10 @@ public abstract class ActivatedManaAbilityImpl extends ActivatedAbilityImpl impl ArrayList dynamicNetMana = new ArrayList<>(); for (Effect effect : getEffects()) { if (effect instanceof ManaEffect) { - dynamicNetMana.addAll(((ManaEffect) effect).getNetMana(game, this)); + List effectNetMana = ((ManaEffect) effect).getNetMana(game, this); + if (effectNetMana != null) { + dynamicNetMana.addAll(effectNetMana); + } } } return dynamicNetMana; diff --git a/Mage/src/main/java/mage/abilities/mana/ManaOptions.java b/Mage/src/main/java/mage/abilities/mana/ManaOptions.java index ebebd74b2df..077b77fad43 100644 --- a/Mage/src/main/java/mage/abilities/mana/ManaOptions.java +++ b/Mage/src/main/java/mage/abilities/mana/ManaOptions.java @@ -1,4 +1,3 @@ - package mage.abilities.mana; import java.util.ArrayList; @@ -12,6 +11,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ManaEvent; +import org.apache.log4j.Logger; /** * @@ -24,6 +24,8 @@ import mage.game.events.ManaEvent; */ public class ManaOptions extends ArrayList { + private static final Logger logger = Logger.getLogger(ManaOptions.class); + public ManaOptions() { } @@ -185,6 +187,7 @@ public class ManaOptions extends ArrayList { Mana moreValuable = Mana.getMoreValuableMana(newMana, existingMana); if (moreValuable != null) { existingMana.setToMana(moreValuable); + logger.trace("mana replaced " + newMana.toString() + " <=> " + existingMana.toString() + " from " + ability.getRule()); continue CombineWithExisting; } }