diff --git a/Mage.Sets/src/mage/sets/commander2015/KalemneDiscipleOfIroas.java b/Mage.Sets/src/mage/sets/commander2015/KalemneDiscipleOfIroas.java index 6374e079bd9..eb779a5b60a 100644 --- a/Mage.Sets/src/mage/sets/commander2015/KalemneDiscipleOfIroas.java +++ b/Mage.Sets/src/mage/sets/commander2015/KalemneDiscipleOfIroas.java @@ -56,12 +56,12 @@ import mage.players.Player; * @author fireshoes */ public class KalemneDiscipleOfIroas extends CardImpl { - + private static final FilterSpell filterSpell = new FilterSpell("a creature spell with converted mana cost 5 or greater"); static { filterSpell.add(new CardTypePredicate(CardType.CREATURE)); - filterSpell.add(new ConvertedManaCostPredicate(Filter.ComparisonType.GreaterThan, 4)); + filterSpell.add(new ConvertedManaCostPredicate(Filter.ComparisonType.GreaterThan, 4)); } public KalemneDiscipleOfIroas(UUID ownerId) { @@ -75,16 +75,16 @@ public class KalemneDiscipleOfIroas extends CardImpl { // Double strike this.addAbility(DoubleStrikeAbility.getInstance()); - + // Vigilance this.addAbility(VigilanceAbility.getInstance()); - + // Whenever you cast a creature spell with converted mana cost 5 or greater, you get an experience counter. Effect effect = new AddCountersControllerEffect(CounterType.EXPERIENCE.createInstance(1), false); effect.setText("you get an experience counter"); Ability ability = new SpellCastControllerTriggeredAbility(effect, filterSpell, false); this.addAbility(ability); - + // Kalemne, Disciple of Iroas gets +1/+1 for each experience counter you have. DynamicValue value = new SourceControllerExperienceCountersCount(); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(value, value, Duration.WhileOnBattlefield))); @@ -107,13 +107,13 @@ class SourceControllerExperienceCountersCount implements DynamicValue { int amount = 0; Player player = game.getPlayer(sourceAbility.getControllerId()); if (player != null) { - amount = player.getCounters().getCount(CounterType.EXPERIENCE); - } + amount = player.getCounters().getCount(CounterType.EXPERIENCE); + } return amount; } @Override - public DynamicValue copy() { + public SourceControllerExperienceCountersCount copy() { return new SourceControllerExperienceCountersCount(); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java index 03e32789ffb..9446f81e023 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DeathtouchTest.java @@ -111,7 +111,7 @@ public class DeathtouchTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10); // Equipped creature has deathtouch and lifelink. - addCard(Zone.BATTLEFIELD, playerA, "Basilisk Collar"); + addCard(Zone.BATTLEFIELD, playerA, "Marchesa, the Black Rose"); /* {R}{G}{W} Legendary Creature - Elemental Beast Marath, Will of the Wild enters the battlefield with a number of +1/+1 counters on diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DethroneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DethroneTest.java new file mode 100644 index 00000000000..b43b59f298c --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/DethroneTest.java @@ -0,0 +1,64 @@ +/* + * 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.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class DethroneTest extends CardTestPlayerBase { + + @Test + public void testAddingOnceACounterForEqualLife() { + // Dethrone (Whenever this creature attacks the player with the most life or tied for most life, put a +1/+1 counter on it.)"; + // Other creatures you control have dethrone. + // Whenever a creature you control with a +1/+1 counter on it dies, return that card to the battlefield under your control at the beginning of the next end step. + addCard(Zone.BATTLEFIELD, playerA, "Marchesa, the Black Rose"); // 3/3 + + attack(1, playerA, "Marchesa, the Black Rose"); + + attack(3, playerA, "Marchesa, the Black Rose"); + + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 12); // 4 + 4 + + assertCounterCount(playerA, "Marchesa, the Black Rose", CounterType.P1P1, 1); + assertPowerToughness(playerA, "Marchesa, the Black Rose", 4, 4); + + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/MizzixOfTheIzmagnusTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/MizzixOfTheIzmagnusTest.java new file mode 100644 index 00000000000..131b85a69b6 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/MizzixOfTheIzmagnusTest.java @@ -0,0 +1,123 @@ +/* + * 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.cost.modification; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class MizzixOfTheIzmagnusTest extends CardTestPlayerBase { + + @Test + public void testSpellsFixedCost() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); + // Whenever you cast an instant or sorcery spell with converted mana cost greater than the number of experience counters you have, you get an experience counter. + // Instant and sorcery spells you cast cost {1} less to cast for each experience counter you have. + addCard(Zone.BATTLEFIELD, playerA, "Mizzix of the Izmagnus"); + addCard(Zone.HAND, playerA, "Lightning Bolt"); // {R} + // Incinerate deals 3 damage to target creature or player. A creature dealt damage this way can't be regenerated this turn. + addCard(Zone.HAND, playerA, "Incinerate"); // {1}{R} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Incinerate", playerB); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Lightning Bolt", 1); + assertGraveyardCount(playerA, "Incinerate", 1); + + assertCounterCount(playerA, CounterType.EXPERIENCE, 2); + assertLife(playerA, 20); + assertLife(playerB, 14); + + } + + /** + * Does not reduce the cost of {X} spells + */ + @Test + public void testSpellsVariableCost() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); + // Whenever you cast an instant or sorcery spell with converted mana cost greater than the number of experience counters you have, you get an experience counter. + // Instant and sorcery spells you cast cost {1} less to cast for each experience counter you have. + addCard(Zone.BATTLEFIELD, playerA, "Mizzix of the Izmagnus"); + // Blaze deals X damage to target creature or player. + addCard(Zone.HAND, playerA, "Blaze", 2); // Sorcery - {X}{R} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Blaze", playerB); + setChoice(playerA, "X=1"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Blaze", playerB); + setChoice(playerA, "X=2"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Blaze", 2); + + assertCounterCount(playerA, CounterType.EXPERIENCE, 2); + assertLife(playerA, 20); + assertLife(playerB, 17); + + } + + /** + * Test to reduce Buyback costs + */ + @Test + public void testSpellsBuybackCost() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); + // Whenever you cast an instant or sorcery spell with converted mana cost greater than the number of experience counters you have, you get an experience counter. + // Instant and sorcery spells you cast cost {1} less to cast for each experience counter you have. + addCard(Zone.BATTLEFIELD, playerA, "Mizzix of the Izmagnus");// 2/2 + addCard(Zone.HAND, playerA, "Lightning Bolt"); // {R} + // Target creature gets +3/+0 until end of turn. + addCard(Zone.HAND, playerA, "Seething Anger"); // {R} Buyback {3} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Seething Anger", "Mizzix of the Izmagnus"); + setChoice(playerA, "Yes"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Lightning Bolt", 1); + assertHandCount(playerA, "Seething Anger", 1); + + assertPowerToughness(playerA, "Mizzix of the Izmagnus", 5, 2); + assertCounterCount(playerA, CounterType.EXPERIENCE, 1); + assertLife(playerA, 20); + assertLife(playerB, 17); + + } +}