From b62dadf95d45444ffcefb067debd23e792c273cb Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 25 Aug 2015 22:38:45 +0200 Subject: [PATCH] * Fixed that conditional mana (e.g. River of Tears) did not trigger mana adding effects like Vorinclex, Voice of Hunger. --- .../src/mage/sets/judgment/MirarisWake.java | 4 +- .../newphyrexia/VorinclexVoiceOfHunger.java | 2 + .../mana/VorinclexVoiceOfHungerTest.java | 65 +++++++++++++++++++ .../decorator/ConditionalManaEffect.java | 57 +++++++++++++--- .../abilities/mana/TriggeredManaAbility.java | 13 ++-- 5 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java diff --git a/Mage.Sets/src/mage/sets/judgment/MirarisWake.java b/Mage.Sets/src/mage/sets/judgment/MirarisWake.java index c59f9b7f1bf..f040d301d57 100644 --- a/Mage.Sets/src/mage/sets/judgment/MirarisWake.java +++ b/Mage.Sets/src/mage/sets/judgment/MirarisWake.java @@ -50,9 +50,9 @@ public class MirarisWake extends CardImpl { super(ownerId, 139, "Mirari's Wake", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{W}"); this.expansionSetCode = "JUD"; - // Creatures you control get +1/+1. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1,1,Duration.WhileOnBattlefield))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield))); + // Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. AddManaOfAnyTypeProducedEffect effect = new AddManaOfAnyTypeProducedEffect(); effect.setText("add one mana to your mana pool of any type that land produced"); diff --git a/Mage.Sets/src/mage/sets/newphyrexia/VorinclexVoiceOfHunger.java b/Mage.Sets/src/mage/sets/newphyrexia/VorinclexVoiceOfHunger.java index 00d838eea5e..90f4773e0d9 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/VorinclexVoiceOfHunger.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/VorinclexVoiceOfHunger.java @@ -62,7 +62,9 @@ public class VorinclexVoiceOfHunger extends CardImpl { this.power = new MageInt(7); this.toughness = new MageInt(6); + // Trample this.addAbility(TrampleAbility.getInstance()); + // Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. ManaEffect effect = new AddManaOfAnyTypeProducedEffect(); effect.setText("add one mana to your mana pool of any type that land produced"); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java new file mode 100644 index 00000000000..abc87ae69d3 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/VorinclexVoiceOfHungerTest.java @@ -0,0 +1,65 @@ +/* + * 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.cards.mana; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class VorinclexVoiceOfHungerTest extends CardTestPlayerBase { + + /** + * Vorinclex, Voice of Hunger is not mana doubling River of Tears. + */ + @Test + public void testRiverOfTears() { + // Trample + // Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. + // Whenever an opponent taps a land for mana, that land doesn't untap during its controller's next untap step. + addCard(Zone.BATTLEFIELD, playerA, "Vorinclex, Voice of Hunger", 1); + // {T}: Add {U} to your mana pool. If you played a land this turn, add {B} to your mana pool instead. + addCard(Zone.BATTLEFIELD, playerA, "River of Tears", 1); + addCard(Zone.HAND, playerA, "Vedalken Mastermind", 1); + + // because available mana calculation does not work correctly with Vorinclex, Voice of Hunger we have to tap the land manually + activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {U} to your mana pool"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Vedalken Mastermind"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Vedalken Mastermind", 1); + + } + +} diff --git a/Mage/src/mage/abilities/decorator/ConditionalManaEffect.java b/Mage/src/mage/abilities/decorator/ConditionalManaEffect.java index 4ec4d37870e..77eaf343e2e 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalManaEffect.java +++ b/Mage/src/mage/abilities/decorator/ConditionalManaEffect.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.decorator; import mage.Mana; @@ -33,14 +32,14 @@ import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.ManaEffect; +import mage.choices.ChoiceColor; import mage.game.Game; +import mage.players.Player; /** * * @author LevelX2 */ - - public class ConditionalManaEffect extends ManaEffect { private BasicManaEffect effect; @@ -70,14 +69,46 @@ public class ConditionalManaEffect extends ManaEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } if (condition.apply(game, source)) { effect.setTargetPointer(this.targetPointer); - return effect.apply(game, source); } else if (otherwiseEffect != null) { otherwiseEffect.setTargetPointer(this.targetPointer); - return otherwiseEffect.apply(game, source); } - return false; + Mana mana = getMana(game, source); + + if (mana != null && mana.getAny() > 0) { + int amount = mana.getAny(); + + ChoiceColor choice = new ChoiceColor(true); + Mana createdMana = null; + if (controller.choose(outcome, choice, game)) { + if (choice.getColor() == null) { + return false; // it happens, don't know how + } + + if (choice.getColor().isBlack()) { + createdMana = Mana.BlackMana(amount); + } else if (choice.getColor().isBlue()) { + createdMana = Mana.BlueMana(amount); + } else if (choice.getColor().isRed()) { + createdMana = Mana.RedMana(amount); + } else if (choice.getColor().isGreen()) { + createdMana = Mana.GreenMana(amount); + } else if (choice.getColor().isWhite()) { + createdMana = Mana.WhiteMana(amount); + } + } + mana = createdMana; + } + + if (mana != null) { + controller.getManaPool().addMana(mana, game, source); + } + return true; } @Override @@ -85,12 +116,18 @@ public class ConditionalManaEffect extends ManaEffect { return new ConditionalManaEffect(this); } - public Mana getMana(Game game, Ability source) { + @Override + public Mana getMana(Game game, Ability source + ) { + Mana mana = null; if (condition.apply(game, source)) { - return effect.getMana(); + mana = effect.getMana(); } else if (otherwiseEffect != null) { - return otherwiseEffect.getMana(); + mana = otherwiseEffect.getMana(); } - return null; + if (mana != null) { + checkToFirePossibleEvents(mana, game, source); + } + return mana; } } diff --git a/Mage/src/mage/abilities/mana/TriggeredManaAbility.java b/Mage/src/mage/abilities/mana/TriggeredManaAbility.java index 4a2c997d83a..f6f319a5ab3 100644 --- a/Mage/src/mage/abilities/mana/TriggeredManaAbility.java +++ b/Mage/src/mage/abilities/mana/TriggeredManaAbility.java @@ -1,16 +1,16 @@ /* * Copyright 2011 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 @@ -20,7 +20,7 @@ * 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. @@ -29,10 +29,12 @@ package mage.abilities.mana; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.common.ManaEffect; +import mage.constants.AbilityType; import mage.constants.Zone; /** * see 20110715 - 605.1b + * * @author BetaSteward_at_googlemail.com */ public abstract class TriggeredManaAbility extends TriggeredAbilityImpl { @@ -44,6 +46,7 @@ public abstract class TriggeredManaAbility extends TriggeredAbilityImpl { public TriggeredManaAbility(Zone zone, ManaEffect effect, boolean optional) { super(zone, effect, optional); this.usesStack = false; + this.abilityType = AbilityType.MANA; } public TriggeredManaAbility(final TriggeredManaAbility ability) {