diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HisokasGuard.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HisokasGuard.java index 5c69f4a5895..2067289bb34 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/HisokasGuard.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HisokasGuard.java @@ -97,7 +97,7 @@ class HisokasGuardGainAbilityTargetEffect extends ContinuousEffectImpl { public HisokasGuardGainAbilityTargetEffect() { super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - staticText = "Target creature you control other than Hisoka's Guard has shroud for as long as Hisoka's Guard remains tapped"; + staticText = "Target creature you control other than {this} has shroud for as long as {this} remains tapped"; this.ability = ShroudAbility.getInstance(); } diff --git a/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java b/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java index ca83298e621..32b8642bee6 100644 --- a/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java +++ b/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java @@ -95,7 +95,7 @@ class JelevaNephaliasScourgeEffect extends OneShotEffect { public JelevaNephaliasScourgeEffect() { super(Outcome.Benefit); - this.staticText = "each player exiles the top X cards of his or her library, where X is the amount of mana spent to cast Jeleva"; + this.staticText = "each player exiles the top X cards of his or her library, where X is the amount of mana spent to cast {this}"; } public JelevaNephaliasScourgeEffect(final JelevaNephaliasScourgeEffect effect) { @@ -174,7 +174,7 @@ class JelevaNephaliasCastEffect extends OneShotEffect { class JelevaNephaliasWatcher extends Watcher { - private Map manaSpendToCast = new HashMap(); // cast + private Map manaSpendToCast = new HashMap<>(); // cast public JelevaNephaliasWatcher() { super("ManaPaidToCastJelevaNephalias", WatcherScope.CARD); diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/EidolonOfTheGreatRevel.java b/Mage.Sets/src/mage/sets/journeyintonyx/EidolonOfTheGreatRevel.java index c054d7847c3..62174fa331d 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/EidolonOfTheGreatRevel.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/EidolonOfTheGreatRevel.java @@ -105,6 +105,6 @@ class EidolonOfTheGreatRevelTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever a player casts a spell with converted mana cost 3 or less, Eidolon of the Great Revel deals 2 damage to that player."; + return "Whenever a player casts a spell with converted mana cost 3 or less, {this} deals 2 damage to that player."; } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java index b2e908f6218..f9dcd57ecdd 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DiscardTest.java @@ -41,7 +41,7 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class DiscardTest extends CardTestPlayerBase { /* - * If Rest in Peace is in play, every card going to the graveyard goes to exile intead. + * If Rest in Peace is in play, every card going to the graveyard goes to exile instead. * If a card is discarded while Rest in Peace is on the battlefield, abilities that function * when a card is discarded (such as madness) still work, even though that card never reaches * a graveyard. @@ -49,8 +49,6 @@ public class DiscardTest extends CardTestPlayerBase { @Test public void testRestInPeaceAndCycle() { - // Check that Lion goes to graveyard from evoke ability - // Check that evoke does not trigger again to sacrifice Shriekmaw if it's exhumed addCard(Zone.BATTLEFIELD, playerA, "Forest", 1); addCard(Zone.HAND, playerA, "Tranquil Thicket"); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/CounterbalanceTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/CounterbalanceTest.java new file mode 100644 index 00000000000..0f350df73a3 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/CounterbalanceTest.java @@ -0,0 +1,79 @@ +/* +* 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.abilities.oneshot.counterspell; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * Counterbalance + * Enchantment, UU + * Whenever an opponent casts a spell, you may reveal the top card of your library. If you do, counter that spell + * if it has the same converted mana cost as the revealed card. + * + * @author LevelX2 + */ +public class CounterbalanceTest extends CardTestPlayerBase { + + /** + * Test that X mana costs from spells are taken into account to calculate the converted mana costs + * of stack objects + */ + @Test + public void testCommand() { + addCard(Zone.HAND, playerA, "Death Grasp"); + // Sorcery {X}{W}{B} + // Death Grasp deals X damage to target creature or player. You gain X life. + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); + + addCard(Zone.BATTLEFIELD, playerB, "Counterbalance"); + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + + addCard(Zone.LIBRARY, playerB, "Desert Twister"); // cmc = 6 ({G}{G}{4} because DeatGrasp = 2 + 4 (of X) = 6 + skipInitShuffling(); // so the set to top card stays at top + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Death Grasp", "targetPlayer=PlayerB"); + setChoice(playerA, "X=4"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + assertGraveyardCount(playerA, "Death Grasp", 1); + assertGraveyardCount(playerA, 1); + assertGraveyardCount(playerB, 0); + + } + +} 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 1f1a8b8d518..ba82fd382f0 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 @@ -58,6 +58,7 @@ import mage.abilities.Mode; import mage.abilities.Modes; import mage.abilities.SpellAbility; import mage.abilities.TriggeredAbility; +import mage.abilities.costs.VariableCost; import mage.constants.SpellAbilityType; import mage.filter.common.FilterCreatureForCombatBlock; import mage.filter.common.FilterPlaneswalkerPermanent; @@ -319,6 +320,30 @@ public class TestPlayer extends ComputerPlayer { return true; } + @Override + public int announceXMana(int min, int max, String message, Game game, Ability ability) { + if (!choices.isEmpty()) { + if (choices.get(0).startsWith("X=")) { + int xValue = Integer.parseInt(choices.get(0).substring(2)); + choices.remove(0); + return xValue; + } + } + return super.announceXMana(min, max, message, game, ability); + } + + @Override + public int announceXCost(int min, int max, String message, Game game, Ability ability, VariableCost variablCost) { + if (!choices.isEmpty()) { + if (choices.get(0).startsWith("X=")) { + int xValue = Integer.parseInt(choices.get(0).substring(2)); + choices.remove(0); + return xValue; + } + } + return super.announceXCost(min, max, message, game, ability, null); + } + protected Permanent findPermanent(FilterPermanent filter, UUID controllerId, Game game) { List permanents = game.getBattlefield().getAllActivePermanents(filter, controllerId, game); if (permanents.size() > 0) { diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index b627d332d20..bcb986c593f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -699,6 +699,13 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement player.addAction(turnNum, PhaseStep.DECLARE_BLOCKERS, "block:"+blocker+";"+attacker); } + /** + * For use choices set "Yes" or "No" the the choice string. + * For X values set "X=[xValue]" example: for X=3 set choice string to "X=3". + * + * @param player + * @param choice + */ public void setChoice(TestPlayer player, String choice) { player.addChoice(choice); } diff --git a/Mage/src/mage/game/stack/Spell.java b/Mage/src/mage/game/stack/Spell.java index 515619c51df..a9893a68e99 100644 --- a/Mage/src/mage/game/stack/Spell.java +++ b/Mage/src/mage/game/stack/Spell.java @@ -601,7 +601,7 @@ public class Spell implements StackObject, Card { public int getConvertedManaCost() { int cmc = 0; for (Ability spellAbility: spellAbilities) { - cmc += spellAbility.getManaCostsToPay().convertedManaCost(); + cmc += spellAbility.getManaCosts().convertedManaCost() + spellAbility.getManaCostsToPay().getX(); } return cmc; }