From 231a18a79cf3c8ea5d83c9642eaae30d401d7f02 Mon Sep 17 00:00:00 2001 From: fwannmacher Date: Tue, 26 Jul 2016 12:44:04 -0300 Subject: [PATCH 1/3] - Fixed Issue #2121 --- .../EntersTheBattlefieldTriggerTest.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java index 0db5891f29..36a23246fb 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/EntersTheBattlefieldTriggerTest.java @@ -309,10 +309,26 @@ public class EntersTheBattlefieldTriggerTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Scathe Zombies", 1); // 2/2 Zombie {2}{B} castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Noxious Ghoul"); + /* + * playerA's Carnivorous Plant will get -1/-1 from Noxious Ghoul -> 3/4 + * playerB's Carnivorous Plant will get -1/-1 from Noxious Ghoul -> 3/4 + */ castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Clone"); setChoice(playerA, "Noxious Ghoul"); + /* + * playerA's Carnivorous Plant will get -1/-1 from Clone -> 2/3 + * playerB's Carnivorous Plant will get -1/-1 from Clone -> 2/3 + */ castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Ego Erasure", "targetPlayer=PlayerA", "Whenever"); + /* + * playerA' Noxious Ghoul will get -2/0 -> 1/3 + * playerA's Carnivorous Plant will get -2/0 > 0/3 + * playerA' Noxious Ghoul will get -1/-1 from Clone -> 0/2 + * playerA' Noxious Ghoul will get -1/-1 from itself -> -1/1 + * playerA's Carnivorous Plant will get -1/-1 from Noxious Ghoul -> -1/2 + * playerB's Carnivorous Plant will get -1/-1 from Noxious Ghoul -> 1/2 + */ setStopAt(1, PhaseStep.END_TURN); execute(); @@ -322,7 +338,7 @@ public class EntersTheBattlefieldTriggerTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Noxious Ghoul", -1, 1, Filter.ComparisonScope.All);// -1/-1 from the second Noxious Ghoul also if it's no zombie assertGraveyardCount(playerB, "Zephyr Falcon", 1); - assertPowerToughness(playerB, "Carnivorous Plant", 2, 3); - assertPowerToughness(playerA, "Carnivorous Plant", 0, 3); + assertPowerToughness(playerB, "Carnivorous Plant", 1, 2); + assertPowerToughness(playerA, "Carnivorous Plant", -1, 2); } } From 3caf66e4b69875526be1e07f3de45120d4c70f64 Mon Sep 17 00:00:00 2001 From: fwannmacher Date: Tue, 26 Jul 2016 16:53:35 -0300 Subject: [PATCH 2/3] - Fixed Issue #2108 --- .../mage/sets/timespiral/PulmonicSliver.java | 4 +- .../ReturnToLibraryPermanentEffect.java | 74 +++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/effects/common/ReturnToLibraryPermanentEffect.java diff --git a/Mage.Sets/src/mage/sets/timespiral/PulmonicSliver.java b/Mage.Sets/src/mage/sets/timespiral/PulmonicSliver.java index b365d8168d..7704925e19 100644 --- a/Mage.Sets/src/mage/sets/timespiral/PulmonicSliver.java +++ b/Mage.Sets/src/mage/sets/timespiral/PulmonicSliver.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.PutIntoGraveFromAnywhereSourceAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.ReturnToLibrarySpellEffect; +import mage.abilities.effects.common.ReturnToLibraryPermanentEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -65,7 +65,7 @@ public class PulmonicSliver extends CardImpl { filter, "All Sliver creatures have flying."))); // All Slivers have "If this permanent would be put into a graveyard, you may put it on top of its owner's library instead." this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect( - new PutIntoGraveFromAnywhereSourceAbility(new ReturnToLibrarySpellEffect(true)), Duration.WhileOnBattlefield, + new PutIntoGraveFromAnywhereSourceAbility(new ReturnToLibraryPermanentEffect(true)), Duration.WhileOnBattlefield, filterSlivers, "All Slivers have \"If this permanent would be put into a graveyard, you may put it on top of its owner's library instead.\""))); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToLibraryPermanentEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToLibraryPermanentEffect.java new file mode 100644 index 0000000000..5974ab1c36 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToLibraryPermanentEffect.java @@ -0,0 +1,74 @@ +/* + * 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 mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author fwannmacher + */ +public class ReturnToLibraryPermanentEffect extends OneShotEffect { + + private final boolean toTop; + + public ReturnToLibraryPermanentEffect(boolean top) { + super(Outcome.Neutral); + staticText = "Put {this} on "+ (top ? "top":"the bottom") + " of its owner's library"; + this.toTop = top; + } + + public ReturnToLibraryPermanentEffect(final ReturnToLibraryPermanentEffect effect) { + super(effect); + this.toTop = effect.toTop; + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Card card = game.getPermanent(source.getSourceId()); + if (card != null) { + controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.STACK, toTop, true); + } + return true; + } + return false; + } + + @Override + public ReturnToLibraryPermanentEffect copy() { + return new ReturnToLibraryPermanentEffect(this); + } +} From ec0e8181d52d26dadf3cf9d34a4bc965b461585a Mon Sep 17 00:00:00 2001 From: fwannmacher Date: Tue, 26 Jul 2016 19:32:20 -0300 Subject: [PATCH 3/3] - Fixed Issue #1660 --- ...alsDamageToAPlayerAllTriggeredAbility.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java index 7aa70be9ab..1b15255bb9 100644 --- a/Mage/src/main/java/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java @@ -73,25 +73,28 @@ public class DealsDamageToAPlayerAllTriggeredAbility extends TriggeredAbilityImp } @Override - public boolean checkTrigger(GameEvent event, Game game) { + public boolean checkTrigger(GameEvent event, Game game) { if (!onlyCombat || ((DamagedPlayerEvent) event).isCombatDamage()) { Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && filter.match(permanent, sourceId, controllerId, game)) { - if (!setTargetPointer.equals(SetTargetPointer.NONE)) { - for (Effect effect : this.getEffects()) { - effect.setValue("damage", event.getAmount()); - switch (setTargetPointer) { - case PLAYER: - effect.setTargetPointer(new FixedTarget(permanent.getControllerId())); - break; - case PERMANENT: - effect.setTargetPointer(new FixedTarget(permanent.getId(), permanent.getZoneChangeCounter(game))); - break; - } + if (permanent != null) { + controllerId = permanent.getControllerId(); + if (filter.match(permanent, sourceId, controllerId, game)) { + if (!setTargetPointer.equals(SetTargetPointer.NONE)) { + for (Effect effect : this.getEffects()) { + effect.setValue("damage", event.getAmount()); + switch (setTargetPointer) { + case PLAYER: + effect.setTargetPointer(new FixedTarget(permanent.getControllerId())); + break; + case PERMANENT: + effect.setTargetPointer(new FixedTarget(permanent.getId(), permanent.getZoneChangeCounter(game))); + break; + } + } } + return true; } - return true; } } return false;