From 56900a9b1f15c5a914966f7602035fed0fee3788 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 1 Nov 2016 11:47:40 +0100 Subject: [PATCH] [SWS] Yoda, Jedi Master - Fixed a problem with the +1 ability. --- .../src/mage/cards/y/YodaJediMaster.java | 310 +++++++++--------- .../LookLibraryAndPickControllerEffect.java | 42 ++- .../common/LookLibraryControllerEffect.java | 2 +- 3 files changed, 195 insertions(+), 159 deletions(-) diff --git a/Mage.Sets/src/mage/cards/y/YodaJediMaster.java b/Mage.Sets/src/mage/cards/y/YodaJediMaster.java index 0f6d7935b5..0bcecf68ac 100644 --- a/Mage.Sets/src/mage/cards/y/YodaJediMaster.java +++ b/Mage.Sets/src/mage/cards/y/YodaJediMaster.java @@ -1,155 +1,155 @@ -/* - * 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.cards.y; - -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; -import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; -import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; -import mage.abilities.keyword.HexproofAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.other.OwnerPredicate; -import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.permanent.Permanent; -import mage.target.TargetPermanent; -import mage.target.targetpointer.FixedTarget; - -/** - * - * @author Styxo - */ -public class YodaJediMaster extends CardImpl { - - private static final FilterPermanent filter = new FilterPermanent("another target permanent you own"); - - static { - filter.add(new AnotherPredicate()); - filter.add(new OwnerPredicate(TargetController.YOU)); - } - - public YodaJediMaster(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{G}{U}"); - this.subtype.add("Yoda"); - - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); - - // +1: Look at the top two cards of your library. Put one on the bottom of your library. - Effect effect = new LookLibraryAndPickControllerEffect(new StaticValue(2), false, new StaticValue(1), - new FilterCard(), Zone.LIBRARY, false, false, false, Zone.LIBRARY, false); - effect.setText("Look at the top two cards of your library. Put one on the bottom of your library"); - this.addAbility(new LoyaltyAbility(effect, 1)); - - // 0: Exile another target permanent you own. Return that card to the battlefield under your control at the beggining of your next end step. - Ability ability = new LoyaltyAbility(new YodaJediMasterEffect(), 0); - ability.addTarget(new TargetPermanent(filter)); - this.addAbility(ability); - - // -7: You get an emblem with "Hexproof, you and your creatures have." - this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new YodaEmblem()), -7)); - - } - - public YodaJediMaster(final YodaJediMaster card) { - super(card); - } - - @Override - public YodaJediMaster copy() { - return new YodaJediMaster(this); - } -} - -class YodaJediMasterEffect extends OneShotEffect { - - public YodaJediMasterEffect() { - super(Outcome.Detriment); - staticText = "Exile another target permanent you own. Return that card to the battlefield under your control at the beginning of your next end step"; - } - - public YodaJediMasterEffect(final YodaJediMasterEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (permanent != null && sourcePermanent != null) { - if (permanent.moveToExile(source.getSourceId(), sourcePermanent.getName(), source.getSourceId(), game)) { - //create delayed triggered ability - Effect effect = new ReturnToBattlefieldUnderYourControlTargetEffect(); - effect.setText("Return that card to the battlefield under your control at the beginning of your next end step"); - effect.setTargetPointer(new FixedTarget(permanent.getId(), game)); - game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source); - return true; - } - } - return false; - } - - @Override - public YodaJediMasterEffect copy() { - return new YodaJediMasterEffect(this); - } -} - -class YodaEmblem extends Emblem { - - // You get an emblem with "Hexproof, you and your creatures have." - public YodaEmblem() { - this.setName("Emblem - Yoda"); - Effect effect = new GainAbilityControllerEffect(HexproofAbility.getInstance(), Duration.EndOfGame); - effect.setText("Hexproof, you"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); - effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfGame, new FilterCreaturePermanent()); - effect.setText(" you and your creatures have"); - ability.addEffect(effect); - getAbilities().add(ability); - } -} +/* + * 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.cards.y; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.GetEmblemEffect; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.other.OwnerPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author Styxo + */ +public class YodaJediMaster extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("another target permanent you own"); + + static { + filter.add(new AnotherPredicate()); + filter.add(new OwnerPredicate(TargetController.YOU)); + } + + public YodaJediMaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{G}{U}"); + this.subtype.add("Yoda"); + + this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + + // +1: Look at the top two cards of your library. Put one on the bottom of your library. + Effect effect = new LookLibraryAndPickControllerEffect(new StaticValue(2), false, new StaticValue(1), + new FilterCard(), Zone.LIBRARY, true, false, false, Zone.LIBRARY, false, false); + effect.setText("Look at the top two cards of your library. Put one on the bottom of your library"); + this.addAbility(new LoyaltyAbility(effect, 1)); + + // 0: Exile another target permanent you own. Return that card to the battlefield under your control at the beggining of your next end step. + Ability ability = new LoyaltyAbility(new YodaJediMasterEffect(), 0); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + + // -7: You get an emblem with "Hexproof, you and your creatures have." + this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new YodaEmblem()), -7)); + + } + + public YodaJediMaster(final YodaJediMaster card) { + super(card); + } + + @Override + public YodaJediMaster copy() { + return new YodaJediMaster(this); + } +} + +class YodaJediMasterEffect extends OneShotEffect { + + public YodaJediMasterEffect() { + super(Outcome.Detriment); + staticText = "Exile another target permanent you own. Return that card to the battlefield under your control at the beginning of your next end step"; + } + + public YodaJediMasterEffect(final YodaJediMasterEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (permanent != null && sourcePermanent != null) { + if (permanent.moveToExile(source.getSourceId(), sourcePermanent.getName(), source.getSourceId(), game)) { + //create delayed triggered ability + Effect effect = new ReturnToBattlefieldUnderYourControlTargetEffect(); + effect.setText("Return that card to the battlefield under your control at the beginning of your next end step"); + effect.setTargetPointer(new FixedTarget(permanent.getId(), game)); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source); + return true; + } + } + return false; + } + + @Override + public YodaJediMasterEffect copy() { + return new YodaJediMasterEffect(this); + } +} + +class YodaEmblem extends Emblem { + + // You get an emblem with "Hexproof, you and your creatures have." + public YodaEmblem() { + this.setName("Emblem - Yoda"); + Effect effect = new GainAbilityControllerEffect(HexproofAbility.getInstance(), Duration.EndOfGame); + effect.setText("Hexproof, you"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); + effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfGame, new FilterCreaturePermanent()); + effect.setText(" you and your creatures have"); + ability.addEffect(effect); + getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java index aea63e004d..b8b7167858 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryAndPickControllerEffect.java @@ -57,6 +57,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff protected int foundCardsToPick = 0; protected boolean optional; private boolean upTo; + private boolean putOnTopSelected; public LookLibraryAndPickControllerEffect(DynamicValue numberOfCards, boolean mayShuffleAfter, DynamicValue numberToPick, FilterCard pickFilter, boolean putOnTop) { this(numberOfCards, mayShuffleAfter, numberToPick, pickFilter, putOnTop, true); @@ -98,7 +99,8 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff * @param numberToPick * @param pickFilter * @param targetZoneLookedCards - * @param putOnTop + * @param putOnTop if zone for the rest is library decide if cards go to top + * or butoom * @param reveal * @param upTo */ @@ -114,7 +116,8 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff * @param numberToPick * @param pickFilter * @param targetZoneLookedCards - * @param putOnTop + * @param putOnTop if zone for the rest is library decide if cards go to top + * or butoom * @param reveal * @param upTo * @param targetZonePickedCards @@ -122,6 +125,26 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff */ public LookLibraryAndPickControllerEffect(DynamicValue numberOfCards, boolean mayShuffleAfter, DynamicValue numberToPick, FilterCard pickFilter, Zone targetZoneLookedCards, boolean putOnTop, boolean reveal, boolean upTo, Zone targetZonePickedCards, boolean optional) { + this(numberOfCards, mayShuffleAfter, numberToPick, pickFilter, targetZoneLookedCards, putOnTop, reveal, upTo, targetZonePickedCards, optional, true); + } + + /** + * + * @param numberOfCards + * @param mayShuffleAfter + * @param numberToPick + * @param pickFilter + * @param targetZoneLookedCards + * @param putOnTop if zone for the rest is library decide if cards go to top + * or butoom + * @param reveal + * @param upTo + * @param targetZonePickedCards + * @param optional + * @param putOnTopSelected + */ + public LookLibraryAndPickControllerEffect(DynamicValue numberOfCards, boolean mayShuffleAfter, DynamicValue numberToPick, + FilterCard pickFilter, Zone targetZoneLookedCards, boolean putOnTop, boolean reveal, boolean upTo, Zone targetZonePickedCards, boolean optional, boolean putOnTopSelected) { super(Outcome.DrawCard, numberOfCards, mayShuffleAfter, targetZoneLookedCards, putOnTop); this.numberToPick = numberToPick; this.filter = pickFilter; @@ -129,6 +152,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff this.targetPickedCards = targetZonePickedCards; this.upTo = upTo; this.optional = optional; + this.putOnTopSelected = putOnTopSelected; } public LookLibraryAndPickControllerEffect(final LookLibraryAndPickControllerEffect effect) { @@ -139,6 +163,7 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff this.targetPickedCards = effect.targetPickedCards; this.upTo = effect.upTo; this.optional = effect.optional; + this.putOnTopSelected = effect.putOnTopSelected; } @Override @@ -165,7 +190,11 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff if (player.choose(Outcome.DrawCard, cards, target, game)) { Cards pickedCards = new CardsImpl(target.getTargets()); cards.removeAll(pickedCards); - player.moveCards(pickedCards.getCards(game), targetPickedCards, source, game); + if (targetPickedCards.equals(Zone.LIBRARY) && !putOnTopSelected) { + player.putCardsOnBottomOfLibrary(pickedCards, game, source, true); + } else { + player.moveCards(pickedCards.getCards(game), targetPickedCards, source, game); + } if (revealPickedCards) { player.revealCards(windowName, pickedCards, game); } @@ -199,6 +228,13 @@ public class LookLibraryAndPickControllerEffect extends LookLibraryControllerEff private String getPickText() { StringBuilder sb = new StringBuilder(filter.getMessage()).append(" to "); switch (targetPickedCards) { + case LIBRARY: + if (putOnTopSelected) { + sb.append("put on the top of your library"); + } else { + sb.append("put on the buttom of your library"); + } + break; case HAND: if (revealPickedCards) { sb.append("reveal and put into your hand"); diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java index cb152f0370..622f94ba11 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java @@ -51,7 +51,7 @@ public class LookLibraryControllerEffect extends OneShotEffect { protected DynamicValue numberOfCards; protected boolean mayShuffleAfter = false; - protected boolean putOnTop = true; // if false on put back on bottom of library + protected boolean putOnTop = true; // if false on put rest back on bottom of library protected Zone targetZoneLookedCards; // GRAVEYARD, LIBRARY public LookLibraryControllerEffect() {