diff --git a/Mage.Sets/src/mage/cards/p/PowerSurge.java b/Mage.Sets/src/mage/cards/p/PowerSurge.java index 1eb7bc9cfc..2c34402795 100644 --- a/Mage.Sets/src/mage/cards/p/PowerSurge.java +++ b/Mage.Sets/src/mage/cards/p/PowerSurge.java @@ -37,10 +37,16 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; +import mage.constants.WatcherScope; import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; +import mage.game.events.GameEvent; import mage.players.Player; -import mage.watchers.common.UntappedLandsAtBeginningOfTurnWatcher; +import mage.watchers.Watcher; /** * @@ -50,10 +56,9 @@ public class PowerSurge extends CardImpl { public PowerSurge(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}{R}"); - // At the beginning of each player's upkeep, Power Surge deals X damage to that player, where X is the number of untapped lands he or she controlled at the beginning of this turn. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new PowerSurgeDamageEffect(), TargetController.ANY, false, true), new UntappedLandsAtBeginningOfTurnWatcher()); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new PowerSurgeDamageEffect(), TargetController.ANY, false, true), new PowerSurgeWatcher()); } public PowerSurge(final PowerSurge card) { @@ -66,18 +71,16 @@ public class PowerSurge extends CardImpl { } } -class PowerSurgeDamageEffect extends OneShotEffect{ - - public PowerSurgeDamageEffect() - { +class PowerSurgeDamageEffect extends OneShotEffect { + + public PowerSurgeDamageEffect() { super(Outcome.Damage); } - - public PowerSurgeDamageEffect(PowerSurgeDamageEffect copy) - { + + public PowerSurgeDamageEffect(PowerSurgeDamageEffect copy) { super(copy); } - + @Override public String getText(Mode mode) { return "{this} deals X damage to that player where X is the number of untapped lands he or she controlled at the beginning of this turn"; @@ -87,8 +90,8 @@ class PowerSurgeDamageEffect extends OneShotEffect{ public boolean apply(Game game, Ability source) { Player player = game.getPlayer(targetPointer.getFirst(game, source)); if (player != null) { - UntappedLandsAtBeginningOfTurnWatcher watcher = (UntappedLandsAtBeginningOfTurnWatcher) game.getState().getWatchers().get("UntappedLandsAtBeginningOfTurn"); - int damage = watcher.getUntappedLandCount(targetPointer.getFirst(game, source)); + PowerSurgeWatcher watcher = (PowerSurgeWatcher) game.getState().getWatchers().get(PowerSurgeWatcher.class.getName()); + int damage = watcher.getUntappedLandCount(); player.damage(damage, source.getSourceId(), game, false, true); return true; } @@ -100,3 +103,45 @@ class PowerSurgeDamageEffect extends OneShotEffect{ return new PowerSurgeDamageEffect(this); } } + +class PowerSurgeWatcher extends Watcher { + + private static final FilterPermanent filter = new FilterControlledLandPermanent(); + + static { + filter.add(Predicates.not(new TappedPredicate())); + } + + private int untappedLandCount; + + public PowerSurgeWatcher() { + super(PowerSurgeWatcher.class.getName(), WatcherScope.GAME); + } + + public PowerSurgeWatcher(final PowerSurgeWatcher watcher) { + super(watcher); + untappedLandCount = watcher.untappedLandCount; + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.BEGINNING_PHASE_PRE + && game.getPhase() != null) { + untappedLandCount = game.getBattlefield().countAll(filter, game.getActivePlayerId(), game); + } + } + + public int getUntappedLandCount() { + return untappedLandCount; + } + + @Override + public void reset() { + untappedLandCount = 0; + } + + @Override + public PowerSurgeWatcher copy() { + return new PowerSurgeWatcher(this); + } +} diff --git a/Mage/src/main/java/mage/filter/common/FilterControlledUntappedLandPermanent.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/damage/PowerSurgeTest.java similarity index 65% rename from Mage/src/main/java/mage/filter/common/FilterControlledUntappedLandPermanent.java rename to Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/damage/PowerSurgeTest.java index 20c4a5ac1c..311fec76e3 100644 --- a/Mage/src/main/java/mage/filter/common/FilterControlledUntappedLandPermanent.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/damage/PowerSurgeTest.java @@ -25,37 +25,32 @@ * 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.damage; -package mage.filter.common; - -import mage.constants.CardType; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.filter.predicate.permanent.TappedPredicate; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; /** * - * @author MTGfan + * @author LevelX2 */ -public class FilterControlledUntappedLandPermanent extends FilterControlledPermanent { +public class PowerSurgeTest extends CardTestPlayerBase { - public FilterControlledUntappedLandPermanent() { - this("untapped land you control"); + @Test + public void testDamageInPlayer() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); + // At the beginning of each player's upkeep, Power Surge deals X damage to that player, where X is the number of untapped lands he or she controlled at the beginning of this turn. + addCard(Zone.HAND, playerA, "Power Surge"); + + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 3); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Power Surge"); + setStopAt(3, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertLife(playerA, 19); + assertLife(playerB, 17); } - - public FilterControlledUntappedLandPermanent(String name) { - super(name); - this.add(new CardTypePredicate(CardType.LAND)); - this.add(Predicates.not(new TappedPredicate())); - } - - public FilterControlledUntappedLandPermanent(final FilterControlledUntappedLandPermanent filter) { - super(filter); - } - - @Override - public FilterControlledUntappedLandPermanent copy() { - return new FilterControlledUntappedLandPermanent(this); - } - } diff --git a/Mage/src/main/java/mage/watchers/common/UntappedLandsAtBeginningOfTurnWatcher.java b/Mage/src/main/java/mage/watchers/common/UntappedLandsAtBeginningOfTurnWatcher.java deleted file mode 100644 index 14a676d9c7..0000000000 --- a/Mage/src/main/java/mage/watchers/common/UntappedLandsAtBeginningOfTurnWatcher.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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.watchers.common; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; -import mage.constants.WatcherScope; -import mage.filter.common.FilterControlledUntappedLandPermanent; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.watchers.Watcher; - -/** - * - * @author MTGfan - */ -public class UntappedLandsAtBeginningOfTurnWatcher extends Watcher { - - private final Map untappedLandCount = new HashMap<>(); - - public UntappedLandsAtBeginningOfTurnWatcher() { - super("UntappedLandsAtBeginningOfTurn", WatcherScope.GAME); - } - - public UntappedLandsAtBeginningOfTurnWatcher(final UntappedLandsAtBeginningOfTurnWatcher watcher) { - super(watcher); - for (Entry entry : watcher.untappedLandCount.entrySet()) { - untappedLandCount.put(entry.getKey(), entry.getValue()); - } - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.BEGINNING_PHASE - && game.getPhase() != null) { - UUID playerId = event.getPlayerId(); - if (playerId != null) { - Integer amount = game.getBattlefield().getAllActivePermanents(new FilterControlledUntappedLandPermanent(), playerId, game).size(); - - untappedLandCount.put(playerId, amount); - } - } - } - - public int getUntappedLandCount(UUID playerId) { - Integer amount = untappedLandCount.get(playerId); - if (amount != null) { - return amount; - } - return 0; - } - - @Override - public void reset() { - untappedLandCount.clear(); - } - - @Override - public UntappedLandsAtBeginningOfTurnWatcher copy() { - return new UntappedLandsAtBeginningOfTurnWatcher(this); - } -}