diff --git a/Mage.Sets/src/mage/sets/mirrodin/Arrest.java b/Mage.Sets/src/mage/sets/mirrodin/Arrest.java index 01d4204336c..aaf206d24f5 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Arrest.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Arrest.java @@ -39,7 +39,6 @@ import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.combat.CantBlockAttackActivateAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; -import mage.constants.Duration; import mage.constants.Outcome; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/restriction/ArrestTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/restriction/ArrestTest.java new file mode 100644 index 00000000000..cd6671ee25e --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/restriction/ArrestTest.java @@ -0,0 +1,67 @@ +/* + * 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.restriction; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ + +public class ArrestTest extends CardTestPlayerBase { + + + @Test + public void testArrest1() { + addCard(Zone.HAND, playerA, "Arrest"); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); + + addCard(Zone.BATTLEFIELD, playerB, "Forest", 4); + // {3}{G}: Put a 1/1 green Saproling creature token onto the battlefield. + // {3}{W}: Creatures you control get +1/+1 until end of turn. + addCard(Zone.BATTLEFIELD, playerB, "Selesnya Guildmage"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Arrest", "Selesnya Guildmage"); + attack(2, playerB, "Selesnya Guildmage"); + + setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Arrest", 1); + assertPermanentCount(playerB, "Saproling", 0); // can't use ability so no Saproling + + assertLife(playerA, 20); // can't attack so no damage to player + assertLife(playerB, 20); + + } + +} diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 208179d0c93..20a8e6cd8aa 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2442,11 +2442,10 @@ public abstract class PlayerImpl implements Player, Serializable { // eliminate duplicate activated abilities Map playableActivated = new HashMap<>(); for (Permanent permanent : game.getBattlefield().getAllActivePermanents(playerId)) { - for (ActivatedAbility ability : permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { + LinkedHashMap useableAbilities = getUseableActivatedAbilities(permanent, Zone.BATTLEFIELD, game); + for (ActivatedAbility ability : useableAbilities.values()) { if (!playableActivated.containsKey(ability.toString())) { - if (canPlay(ability, availableMana, permanent, game)) { - playableActivated.put(ability.toString(), ability); - } + playableActivated.put(ability.toString(), ability); } } } @@ -2853,13 +2852,13 @@ public abstract class PlayerImpl implements Player, Serializable { case EXILED: boolean result = false; for(Card card: cards) { - result |= moveCardToExileWithInfo(card, null, "", source == null ? null : source.getSourceId(), game, true); + result |= moveCardToExileWithInfo(card, null, "", source == null ? null : source.getSourceId(), game, fromZone, true); } return result; case GRAVEYARD: return moveCardsToGraveyardWithInfo(cards, source, game, fromZone); case HAND: - boolean result = false; + result = false; for(Card card: cards) { result |= moveCardToHandWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone); }