/* * 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.abilities.keyword.HasteAbility; import mage.constants.PhaseStep; import mage.constants.Zone; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** * * @author BetaSteward */ public class MadnessTest extends CardTestPlayerBase { /** * 702.34. Madness 702.34a Madness is a keyword that represents two * abilities. The first is a static ability that functions while the card * with madness is in a player’s hand. The second is a triggered ability * that functions when the first ability is applied. “Madness [cost]” means * “If a player would discard this card, that player discards it, but may * exile it instead of putting it into his or her graveyard” and “When this * card is exiled this way, its owner may cast it by paying [cost] rather * than paying its mana cost. If that player doesn’t, he or she puts this * card into his or her graveyard.” 702.34b Casting a spell using its * madness ability follows the rules for paying alternative costs in rules * 601.2b and 601.2e–g. * */ /** * Arrogant Wurm 3GG Creature -- Wurm 4/4 Trample Madness {2}{G} (If you * discard this card, you may cast it for its madness cost instead of * putting it into your graveyard.) * */ /** * Raven's Crime B Sorcery Target player discards a card. Retrace (You may * cast this card from your graveyard by discarding a land card in addition * to paying its other costs.) * */ @Test public void testMadness() { addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); addCard(Zone.HAND, playerA, "Arrogant Wurm"); addCard(Zone.HAND, playerA, "Raven's Crime"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime", playerA); setChoice(playerA, "Yes"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Arrogant Wurm", 1); assertGraveyardCount(playerA, "Raven's Crime", 1); assertHandCount(playerA, 0); } @Test public void testNoMadness() { addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1); addCard(Zone.HAND, playerA, "Arrogant Wurm"); addCard(Zone.HAND, playerA, "Raven's Crime"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Raven's Crime", playerA); setChoice(playerA, "No"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Arrogant Wurm", 0); assertGraveyardCount(playerA, "Raven's Crime", 1); assertGraveyardCount(playerA, "Arrogant Wurm", 1); assertHandCount(playerA, 0); } @Test public void testFalkenrathGorger() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); // Each Vampire creature card you own that isn't on the battlefield has madness. Its madness cost is equal to its mana cost. addCard(Zone.BATTLEFIELD, playerA, "Falkenrath Gorger", 1); // Sacrifice a creature: Vampire Aristocrat gets +2/+2 until end of turn. addCard(Zone.HAND, playerA, "Vampire Aristocrat"); // {2}{B} addCard(Zone.BATTLEFIELD, playerB, "Swamp", 6); // Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. addCard(Zone.HAND, playerB, "Haunting Hymn"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Haunting Hymn", playerA); setChoice(playerA, "Yes"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerB, "Haunting Hymn", 1); assertGraveyardCount(playerB, "Haunting Hymn", 1); assertPermanentCount(playerA, "Vampire Aristocrat", 1); } @Test public void testAvacynsJudgment() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5); // Madness {X}{R} // Avacyn's Judgment deals 2 damage divided as you choose among any number of target creatures and/or players. If Avacyn's Judgment's madness cost was paid, it deals X damage divided as you choose among those creatures and/or players instead. addCard(Zone.HAND, playerA, "Avacyn's Judgment", 1); addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 6); // Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. addCard(Zone.HAND, playerB, "Haunting Hymn"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Haunting Hymn", playerA); setChoice(playerA, "Yes"); setChoice(playerA, "X=4"); addTarget(playerA, "Pillarfield Ox"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerB, "Haunting Hymn", 1); assertGraveyardCount(playerA, "Avacyn's Judgment", 1); assertGraveyardCount(playerB, "Pillarfield Ox", 1); } /** * Falkenrath Gorger + Asylum Visitor (& probably any Vampire with printed * Madness) + Olivia, Mobilized for War - Haste part of the triggered effect * may not affect entering Vampire properly, please read further for more * details. * * When I cast Falkenrath Gorger and then discarded Asylum Visitor with * Olivia, Mobilized for War 's triggered ability, two Madness pop-ups * appeared, I have used the first one, Asylum Visitor entered the * battlefield, Olivia triggered again and I used the ability to give Asylum * Visitor Haste and +1/+1. Then the second Madness trigger resolved for the * Visitor and I have cancelled it (by choosing "No" at first pop-up, but * from what I have tested, the choice at this point does not matter). * Asylum Visitor lost Haste and was both visually and functionally affected * by Summoning Sickness. * * I was able to avoid this issue by cancelling the first Madness pop-up and * then using only the second one. */ @Test public void testFalkenrathGorgerWithAsylumVisitor() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); // Flying // Whenever another creature enters the battlefield under your control, you may discard a card. If you do, put a +1/+1 counter on that creature, // it gains haste until end of turn, and it becomes a Vampire in addition to its other types. addCard(Zone.BATTLEFIELD, playerA, "Olivia, Mobilized for War", 1); // Each Vampire creature card you own that isn't on the battlefield has madness. Its madness cost is equal to its mana cost. addCard(Zone.HAND, playerA, "Falkenrath Gorger", 1); // Creature Vampire 2/1 {R} // At the beginning of each player's upkeep, if that player has no cards in hand, you draw a card and you lose 1 life. // Madness {1}{B} addCard(Zone.HAND, playerA, "Asylum Visitor"); // Creature Vampire 3/1 {1}{B} addCard(Zone.HAND, playerA, "Forest"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Falkenrath Gorger"); setChoice(playerA, "Yes"); // Discard a card and put a +1/+1 counter on that creature, it gains haste until end of turn, and it becomes a Vampire in addition to its other types? setChoice(playerA, "Asylum Visitor"); setChoice(playerA, "Yes"); // When this card is exiled this way, you may cast it by paying {1}{B} instead of putting it into your graveyard. setChoice(playerA, "Yes"); // Cast Asylum Visitor by madness? setChoice(playerA, "Yes"); // Discard a card and put a +1/+1 counter on that creature, it gains haste until end of turn, and it becomes a Vampire in addition to its other types? setChoice(playerA, "Forest"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Falkenrath Gorger", 1); assertPermanentCount(playerA, "Asylum Visitor", 1); assertPowerToughness(playerA, "Falkenrath Gorger", 3, 2); assertAbility(playerA, "Falkenrath Gorger", HasteAbility.getInstance(), true); assertPowerToughness(playerA, "Asylum Visitor", 4, 2); assertAbility(playerA, "Asylum Visitor", HasteAbility.getInstance(), true); assertGraveyardCount(playerA, "Forest", 1); } }