From e60c9e724dd2db609d29e88ec6cdd3f52a7905d7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 24 Jan 2014 13:03:57 +0100 Subject: [PATCH] Some updates/changes/refactoring to PutTopCardOfYourLibararyIntoGraveEffects. --- .../sets/darkascension/ScreechingSkaab.java | 4 +- .../sets/dragonsmaze/DeadbridgeChant.java | 4 +- .../mage/sets/dragonsmaze/DrownInFilth.java | 4 +- .../src/mage/sets/innistrad/ArmoredSkaab.java | 4 +- .../mage/sets/innistrad/Splinterfright.java | 4 +- .../src/mage/sets/odyssey/Bloodcurdler.java | 4 +- .../common/DiscardEachPlayerEffect.java | 2 +- ...YourLibraryIntoGraveControllerEffect.java} | 12 +- ...fYourLibraryIntoGraveEachPlayerEffect.java | 144 ++++++++++++++++++ 9 files changed, 163 insertions(+), 19 deletions(-) rename Mage/src/mage/abilities/effects/common/{PutTopCardOfYourLibraryIntoGraveEffect.java => PutTopCardOfYourLibraryIntoGraveControllerEffect.java} (83%) create mode 100644 Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveEachPlayerEffect.java diff --git a/Mage.Sets/src/mage/sets/darkascension/ScreechingSkaab.java b/Mage.Sets/src/mage/sets/darkascension/ScreechingSkaab.java index 595b40e3ed..7d1fdf98b6 100644 --- a/Mage.Sets/src/mage/sets/darkascension/ScreechingSkaab.java +++ b/Mage.Sets/src/mage/sets/darkascension/ScreechingSkaab.java @@ -33,7 +33,7 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveEffect; +import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveControllerEffect; import mage.cards.CardImpl; /** @@ -52,7 +52,7 @@ public class ScreechingSkaab extends CardImpl { this.toughness = new MageInt(1); // When Screeching Skaab enters the battlefield, put the top two cards of your library into your graveyard. - this.addAbility(new EntersBattlefieldTriggeredAbility(new PutTopCardOfYourLibraryIntoGraveEffect(2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new PutTopCardOfYourLibraryIntoGraveControllerEffect(2))); } public ScreechingSkaab(final ScreechingSkaab card) { diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/DeadbridgeChant.java b/Mage.Sets/src/mage/sets/dragonsmaze/DeadbridgeChant.java index b2b8deb4ac..d47b01d348 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/DeadbridgeChant.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/DeadbridgeChant.java @@ -37,7 +37,7 @@ import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveEffect; +import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveControllerEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.TargetController; @@ -60,7 +60,7 @@ public class DeadbridgeChant extends CardImpl { this.color.setGreen(true); // When Deadbridge Chant enters the battlefield, put the top ten cards of your library into your graveyard. - this.addAbility(new EntersBattlefieldTriggeredAbility(new PutTopCardOfYourLibraryIntoGraveEffect(10))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new PutTopCardOfYourLibraryIntoGraveControllerEffect(10))); // At the beginning of your upkeep, choose a card at random in your graveyard. If it's a creature card, put it onto the battlefield. Otherwise, put it into your hand. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new DeadbridgeChantEffect(), TargetController.YOU, false)); diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/DrownInFilth.java b/Mage.Sets/src/mage/sets/dragonsmaze/DrownInFilth.java index b1c78991ed..7f7f58ef7a 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/DrownInFilth.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/DrownInFilth.java @@ -35,7 +35,7 @@ import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveEffect; +import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveControllerEffect; import mage.abilities.effects.common.continious.BoostTargetEffect; import mage.cards.CardImpl; import mage.filter.common.FilterLandCard; @@ -56,7 +56,7 @@ public class DrownInFilth extends CardImpl { // Choose target creature. Put the top four cards of your library into your graveyard, then that creature gets -1/-1 until end of turn for each land card in your graveyard. this.getSpellAbility().addTarget(new TargetCreaturePermanent(true)); - Effect effect = new PutTopCardOfYourLibraryIntoGraveEffect(4); + Effect effect = new PutTopCardOfYourLibraryIntoGraveControllerEffect(4); effect.setText("Choose target creature. Put the top four cards of your library into your graveyard"); this.getSpellAbility().addEffect(effect); DynamicValue landCards = new SignInversionDynamicValue(new CardsInControllerGraveyardCount(new FilterLandCard())); diff --git a/Mage.Sets/src/mage/sets/innistrad/ArmoredSkaab.java b/Mage.Sets/src/mage/sets/innistrad/ArmoredSkaab.java index 78edbdf8d9..9e44c9f9d4 100644 --- a/Mage.Sets/src/mage/sets/innistrad/ArmoredSkaab.java +++ b/Mage.Sets/src/mage/sets/innistrad/ArmoredSkaab.java @@ -36,7 +36,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveEffect; +import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveControllerEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.game.Game; @@ -59,7 +59,7 @@ public class ArmoredSkaab extends CardImpl { this.toughness = new MageInt(4); // When Armored Skaab enters the battlefield, put the top four cards of your library into your graveyard. - this.addAbility(new EntersBattlefieldTriggeredAbility(new PutTopCardOfYourLibraryIntoGraveEffect(4))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new PutTopCardOfYourLibraryIntoGraveControllerEffect(4))); } public ArmoredSkaab(final ArmoredSkaab card) { diff --git a/Mage.Sets/src/mage/sets/innistrad/Splinterfright.java b/Mage.Sets/src/mage/sets/innistrad/Splinterfright.java index 1f7e7bf4c3..6ce1947967 100644 --- a/Mage.Sets/src/mage/sets/innistrad/Splinterfright.java +++ b/Mage.Sets/src/mage/sets/innistrad/Splinterfright.java @@ -36,7 +36,7 @@ import mage.MageInt; import mage.abilities.common.OnEventTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; -import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveEffect; +import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveControllerEffect; import mage.abilities.effects.common.continious.SetPowerToughnessSourceEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; @@ -63,7 +63,7 @@ public class Splinterfright extends CardImpl { CardsInControllerGraveyardCount count = new CardsInControllerGraveyardCount(new FilterCreatureCard("creature cards")); this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(count, Duration.EndOfGame))); // At the beginning of your upkeep, put the top two cards of your library into your graveyard. - this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, "beginning of your upkeep", new PutTopCardOfYourLibraryIntoGraveEffect(2), false)); + this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, "beginning of your upkeep", new PutTopCardOfYourLibraryIntoGraveControllerEffect(2), false)); } public Splinterfright(final Splinterfright card) { diff --git a/Mage.Sets/src/mage/sets/odyssey/Bloodcurdler.java b/Mage.Sets/src/mage/sets/odyssey/Bloodcurdler.java index 10e9cd0fe0..0c06f0ed83 100644 --- a/Mage.Sets/src/mage/sets/odyssey/Bloodcurdler.java +++ b/Mage.Sets/src/mage/sets/odyssey/Bloodcurdler.java @@ -39,7 +39,7 @@ import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.decorator.ConditionalContinousEffect; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.ExileCardFromOwnGraveyardControllerEffect; -import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveEffect; +import mage.abilities.effects.common.PutTopCardOfYourLibraryIntoGraveControllerEffect; import mage.abilities.effects.common.continious.BoostSourceEffect; import mage.abilities.effects.common.continious.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -71,7 +71,7 @@ public class Bloodcurdler extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // At the beginning of your upkeep, put the top card of your library into your graveyard. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new PutTopCardOfYourLibraryIntoGraveEffect(1), TargetController.YOU, false)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new PutTopCardOfYourLibraryIntoGraveControllerEffect(1), TargetController.YOU, false)); Condition thresholdCondition = new CardsInControllerGraveCondition(7); // Threshold - As long as seven or more cards are in your graveyard, Bloodcurdler gets +1/+1 and has "At the beginning of your end step, exile two cards from your graveyard." diff --git a/Mage/src/mage/abilities/effects/common/DiscardEachPlayerEffect.java b/Mage/src/mage/abilities/effects/common/DiscardEachPlayerEffect.java index 41267f11c9..147107a0ca 100644 --- a/Mage/src/mage/abilities/effects/common/DiscardEachPlayerEffect.java +++ b/Mage/src/mage/abilities/effects/common/DiscardEachPlayerEffect.java @@ -140,7 +140,7 @@ public class DiscardEachPlayerEffect extends OneShotEffect 1) { sb.append("s"); diff --git a/Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveEffect.java b/Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveControllerEffect.java similarity index 83% rename from Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveEffect.java rename to Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveControllerEffect.java index c888214e68..3439ecdc07 100644 --- a/Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveEffect.java +++ b/Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveControllerEffect.java @@ -42,24 +42,24 @@ import mage.util.CardUtil; * @author LevelX2 */ -public class PutTopCardOfYourLibraryIntoGraveEffect extends OneShotEffect { +public class PutTopCardOfYourLibraryIntoGraveControllerEffect extends OneShotEffect { - private int numberCards; + private final int numberCards; - public PutTopCardOfYourLibraryIntoGraveEffect(int numberCards) { + public PutTopCardOfYourLibraryIntoGraveControllerEffect(int numberCards) { super(Outcome.Discard); this.numberCards = numberCards; this.staticText = setText(); } - public PutTopCardOfYourLibraryIntoGraveEffect(final PutTopCardOfYourLibraryIntoGraveEffect effect) { + public PutTopCardOfYourLibraryIntoGraveControllerEffect(final PutTopCardOfYourLibraryIntoGraveControllerEffect effect) { super(effect); this.numberCards = effect.numberCards; } @Override - public PutTopCardOfYourLibraryIntoGraveEffect copy() { - return new PutTopCardOfYourLibraryIntoGraveEffect(this); + public PutTopCardOfYourLibraryIntoGraveControllerEffect copy() { + return new PutTopCardOfYourLibraryIntoGraveControllerEffect(this); } @Override diff --git a/Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveEachPlayerEffect.java b/Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveEachPlayerEffect.java new file mode 100644 index 0000000000..f3d6e6685f --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/PutTopCardOfYourLibraryIntoGraveEachPlayerEffect.java @@ -0,0 +1,144 @@ +/* + * 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 java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author LevelX2 + */ + +public class PutTopCardOfYourLibraryIntoGraveEachPlayerEffect extends OneShotEffect { + + private final int numberCards; + private final TargetController targetController; + + public PutTopCardOfYourLibraryIntoGraveEachPlayerEffect(int numberCards, TargetController targetController) { + super(Outcome.Discard); + this.numberCards = numberCards; + this.targetController = targetController; + this.staticText = setText(); + } + + public PutTopCardOfYourLibraryIntoGraveEachPlayerEffect(final PutTopCardOfYourLibraryIntoGraveEachPlayerEffect effect) { + super(effect); + this.numberCards = effect.numberCards; + this.targetController = effect.targetController; + } + + @Override + public PutTopCardOfYourLibraryIntoGraveEachPlayerEffect copy() { + return new PutTopCardOfYourLibraryIntoGraveEachPlayerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + switch(targetController) { + case OPPONENT: + for(UUID playerId: game.getOpponents(source.getControllerId()) ) { + putCardsToGravecard(playerId, source, game); + } + break; + case ANY: + for(UUID playerId: player.getInRange() ) { + putCardsToGravecard(playerId, source, game); + } + break; + case NOT_YOU: + for(UUID playerId: player.getInRange() ) { + if (!playerId.equals(source.getSourceId())) { + putCardsToGravecard(playerId, source, game); + } + } + default: + throw new UnsupportedOperationException("TargetController type not supported."); + } + int cardsCount = Math.min(numberCards, player.getLibrary().size()); + for (int i = 0; i < cardsCount; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + card.moveToZone(Zone.GRAVEYARD, source.getId(), game, true); + } + } + return true; + } + return false; + } + + private void putCardsToGravecard(UUID playerId, Ability source, Game game) { + Player player = game.getPlayer(id); + if (player != null) { + int cardsCount = Math.min(numberCards, player.getLibrary().size()); + for (int i = 0; i < cardsCount; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + card.moveToZone(Zone.GRAVEYARD, source.getId(), game, true); + } + } + } + } + + private String setText() { + StringBuilder sb = new StringBuilder(); + switch(targetController) { + case OPPONENT: + sb.append("Each opponent "); + break; + case ANY: + sb.append("Each player "); + break; + case NOT_YOU: + sb.append("Each other player "); + break; + default: + throw new UnsupportedOperationException("TargetController type not supported."); + } + sb.append("puts the top "); + if (numberCards == 1) { + sb.append(" card"); + } else { + sb.append(CardUtil.numberToText(numberCards)); + sb.append(" cards"); + } + sb.append(" of his or her library into his or her graveyard"); + return sb.toString(); + } +}