From b4a8bb2df0a098902590f2fcc54993f6b1fd9afb Mon Sep 17 00:00:00 2001 From: Plopman Date: Tue, 30 Oct 2012 13:12:52 +0100 Subject: [PATCH] [JUD][FUT] Add Wish --- .../mage/sets/futuresight/GlitteringWish.java | 157 ++++++++++++++++++ .../src/mage/sets/judgment/BurningWish.java | 141 ++++++++++++++++ .../src/mage/sets/judgment/CunningWish.java | 140 ++++++++++++++++ .../src/mage/sets/judgment/DeathWish.java | 140 ++++++++++++++++ .../src/mage/sets/judgment/GoldenWish.java | 143 ++++++++++++++++ .../src/mage/sets/judgment/LivingWish.java | 143 ++++++++++++++++ Mage/src/mage/cards/CardImpl.java | 7 +- Mage/src/mage/game/stack/Spell.java | 2 +- 8 files changed, 871 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/futuresight/GlitteringWish.java create mode 100644 Mage.Sets/src/mage/sets/judgment/BurningWish.java create mode 100644 Mage.Sets/src/mage/sets/judgment/CunningWish.java create mode 100644 Mage.Sets/src/mage/sets/judgment/DeathWish.java create mode 100644 Mage.Sets/src/mage/sets/judgment/GoldenWish.java create mode 100644 Mage.Sets/src/mage/sets/judgment/LivingWish.java diff --git a/Mage.Sets/src/mage/sets/futuresight/GlitteringWish.java b/Mage.Sets/src/mage/sets/futuresight/GlitteringWish.java new file mode 100644 index 0000000000..82d3887083 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/GlitteringWish.java @@ -0,0 +1,157 @@ +/* + * 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.sets.futuresight; + +import java.util.Set; +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageObject; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.ColorlessPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author Plopman + */ +public class GlitteringWish extends CardImpl { + + public GlitteringWish(UUID ownerId) { + super(ownerId, 156, "Glittering Wish", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{G}{W}"); + this.expansionSetCode = "FUT"; + + this.color.setGreen(true); + this.color.setWhite(true); + + // You may choose a multicolored card you own from outside the game, reveal that card, and put it into your hand. Exile Glittering Wish. + this.getSpellAbility().addEffect(new GlitteringWishEffect()); + } + + public GlitteringWish(final GlitteringWish card) { + super(card); + } + + @Override + public GlitteringWish copy() { + return new GlitteringWish(this); + } +} + +class GlitteringWishEffect extends OneShotEffect { + + private static final String choiceText = "Choose a multicolored card you own from outside the game, and put it into your hand"; + + private static final FilterCard filter = new FilterCard("multicolored card"); + static{ + filter.add(new Predicate() { + + @Override + public boolean apply(MageObject input, Game game) { + return input.getColor().isMulticolored(); + } + + @Override + public String toString() { + return "Multicolored"; + } + }); + } + + public GlitteringWishEffect() { + super(Constants.Outcome.Benefit); + this.staticText = "You may choose a multicolored card you own from outside the game, reveal that card, and put it into your hand. Exile Glittering Wish"; + } + + public GlitteringWishEffect(final GlitteringWishEffect effect) { + super(effect); + } + + @Override + public GlitteringWishEffect copy() { + return new GlitteringWishEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + while (player.chooseUse(Constants.Outcome.Benefit, choiceText, game)) { + Cards cards = player.getSideboard(); + if(cards.isEmpty()) { + game.informPlayer(player, "You have no cards outside the game."); + break; + } + + Set filtered = cards.getCards(filter, game); + if (filtered.isEmpty()) { + game.informPlayer(player, "You have no " + filter.getMessage() + " outside the game."); + break; + } + + Cards filteredCards = new CardsImpl(); + for (Card card : filtered) { + filteredCards.add(card.getId()); + } + + TargetCard target = new TargetCard(Constants.Zone.PICK, filter); + if (player.choose(Constants.Outcome.Benefit, filteredCards, target, game)) { + Card card = player.getSideboard().get(target.getFirstTarget(), game); + if (card != null) { + + card.moveToZone(Constants.Zone.HAND, source.getId(), game, false); + Cards revealCard = new CardsImpl(); + revealCard.add(card); + player.revealCards("Glittering Wish", revealCard, game); + break; + } + } + } + Card cardToExile = game.getCard(source.getSourceId()); + if(cardToExile != null) + { + cardToExile.moveToExile(null, "", source.getId(), game); + } + } + return true; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/judgment/BurningWish.java b/Mage.Sets/src/mage/sets/judgment/BurningWish.java new file mode 100644 index 0000000000..1010e073b9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/BurningWish.java @@ -0,0 +1,141 @@ +/* + * 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.sets.judgment; + +import java.util.Set; +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author Plopman + */ +public class BurningWish extends CardImpl { + + public BurningWish(UUID ownerId) { + super(ownerId, 83, "Burning Wish", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{R}"); + this.expansionSetCode = "JUD"; + + this.color.setRed(true); + + // You may choose a sorcery card you own from outside the game, reveal that card, and put it into your hand. Exile Burning Wish. + this.getSpellAbility().addEffect(new BurningWishEffect()); + } + + public BurningWish(final BurningWish card) { + super(card); + } + + @Override + public BurningWish copy() { + return new BurningWish(this); + } +} + +class BurningWishEffect extends OneShotEffect { + + private static final String choiceText = "Choose a sorcery card you own from outside the game, and put it into your hand"; + + private static final FilterCard filter = new FilterCard("sorcery card"); + static{ + filter.add(new CardTypePredicate(CardType.SORCERY)); + } + + public BurningWishEffect() { + super(Constants.Outcome.Benefit); + this.staticText = "You may choose a sorcery card you own from outside the game, reveal that card, and put it into your hand. Exile Burning Wish"; + } + + public BurningWishEffect(final BurningWishEffect effect) { + super(effect); + } + + @Override + public BurningWishEffect copy() { + return new BurningWishEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + while (player.chooseUse(Constants.Outcome.Benefit, choiceText, game)) { + Cards cards = player.getSideboard(); + if(cards.isEmpty()) { + game.informPlayer(player, "You have no cards outside the game."); + break; + } + + Set filtered = cards.getCards(filter, game); + if (filtered.isEmpty()) { + game.informPlayer(player, "You have no " + filter.getMessage() + " outside the game."); + break; + } + + Cards filteredCards = new CardsImpl(); + for (Card card : filtered) { + filteredCards.add(card.getId()); + } + + TargetCard target = new TargetCard(Constants.Zone.PICK, filter); + if (player.choose(Constants.Outcome.Benefit, filteredCards, target, game)) { + Card card = player.getSideboard().get(target.getFirstTarget(), game); + if (card != null) { + + card.moveToZone(Constants.Zone.HAND, source.getId(), game, false); + Cards revealCard = new CardsImpl(); + revealCard.add(card); + player.revealCards("Burning Wish", revealCard, game); + break; + } + } + } + Card cardToExile = game.getCard(source.getSourceId()); + if(cardToExile != null) + { + cardToExile.moveToExile(null, "", source.getId(), game); + } + } + return true; + } + +} diff --git a/Mage.Sets/src/mage/sets/judgment/CunningWish.java b/Mage.Sets/src/mage/sets/judgment/CunningWish.java new file mode 100644 index 0000000000..56eb145918 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/CunningWish.java @@ -0,0 +1,140 @@ +/* + * 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.sets.judgment; + +import java.util.Set; +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author Plopman + */ +public class CunningWish extends CardImpl { + + public CunningWish(UUID ownerId) { + super(ownerId, 37, "Cunning Wish", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{U}"); + this.expansionSetCode = "JUD"; + + this.color.setBlue(true); + + // You may choose an instant card you own from outside the game, reveal that card, and put it into your hand. Exile Cunning Wish. + this.getSpellAbility().addEffect(new CunningWishEffect()); + } + + public CunningWish(final CunningWish card) { + super(card); + } + + @Override + public CunningWish copy() { + return new CunningWish(this); + } +} + +class CunningWishEffect extends OneShotEffect { + + private static final String choiceText = "Choose an instant card you own from outside the game, and put it into your hand"; + + private static final FilterCard filter = new FilterCard("instant card"); + static{ + filter.add(new CardTypePredicate(CardType.INSTANT)); + } + + public CunningWishEffect() { + super(Constants.Outcome.Benefit); + this.staticText = "You may choose an instant card you own from outside the game, reveal that card, and put it into your hand. Exile Cunning Wish"; + } + + public CunningWishEffect(final CunningWishEffect effect) { + super(effect); + } + + @Override + public CunningWishEffect copy() { + return new CunningWishEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + while (player.chooseUse(Constants.Outcome.Benefit, choiceText, game)) { + Cards cards = player.getSideboard(); + if(cards.isEmpty()) { + game.informPlayer(player, "You have no cards outside the game."); + break; + } + + Set filtered = cards.getCards(filter, game); + if (filtered.isEmpty()) { + game.informPlayer(player, "You have no " + filter.getMessage() + " outside the game."); + break; + } + + Cards filteredCards = new CardsImpl(); + for (Card card : filtered) { + filteredCards.add(card.getId()); + } + + TargetCard target = new TargetCard(Constants.Zone.PICK, filter); + if (player.choose(Constants.Outcome.Benefit, filteredCards, target, game)) { + Card card = player.getSideboard().get(target.getFirstTarget(), game); + if (card != null) { + + card.moveToZone(Constants.Zone.HAND, source.getId(), game, false); + Cards revealCard = new CardsImpl(); + revealCard.add(card); + player.revealCards("Cunning Wish", revealCard, game); + break; + } + } + } + Card cardToExile = game.getCard(source.getSourceId()); + if(cardToExile != null) + { + cardToExile.moveToExile(null, "", source.getId(), game); + } + } + return true; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/judgment/DeathWish.java b/Mage.Sets/src/mage/sets/judgment/DeathWish.java new file mode 100644 index 0000000000..b8ec7c72a8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/DeathWish.java @@ -0,0 +1,140 @@ +/* + * 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.sets.judgment; + +import java.util.Set; +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author Plopman + */ +public class DeathWish extends CardImpl { + + public DeathWish(UUID ownerId) { + super(ownerId, 64, "Death Wish", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{B}{B}"); + this.expansionSetCode = "JUD"; + + this.color.setBlack(true); + + // You may choose a card you own from outside the game and put it into your hand. You lose half your life, rounded up. Exile Death Wish. + this.getSpellAbility().addEffect(new DeathWishEffect()); + } + + public DeathWish(final DeathWish card) { + super(card); + } + + @Override + public DeathWish copy() { + return new DeathWish(this); + } +} + +class DeathWishEffect extends OneShotEffect { + + private static final String choiceText = "Choose a card you own from outside the game, and put it into your hand"; + + private static final FilterCard filter = new FilterCard("card"); + + + public DeathWishEffect() { + super(Constants.Outcome.Benefit); + this.staticText = "You may choose a card you own from outside the game, reveal that card, and put it into your hand. Exile Death Wish"; + } + + public DeathWishEffect(final DeathWishEffect effect) { + super(effect); + } + + @Override + public DeathWishEffect copy() { + return new DeathWishEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + while (player.chooseUse(Constants.Outcome.Benefit, choiceText, game)) { + Cards cards = player.getSideboard(); + if(cards.isEmpty()) { + game.informPlayer(player, "You have no cards outside the game."); + break; + } + + Set filtered = cards.getCards(filter, game); + if (filtered.isEmpty()) { + game.informPlayer(player, "You have no " + filter.getMessage() + " outside the game."); + break; + } + + Cards filteredCards = new CardsImpl(); + for (Card card : filtered) { + filteredCards.add(card.getId()); + } + + TargetCard target = new TargetCard(Constants.Zone.PICK, filter); + if (player.choose(Constants.Outcome.Benefit, filteredCards, target, game)) { + Card card = player.getSideboard().get(target.getFirstTarget(), game); + if (card != null) { + + card.moveToZone(Constants.Zone.HAND, source.getId(), game, false); + } + } + } + + int amount = (player.getLife() + 1)/2; + if(amount > 0) + { + player.loseLife(amount, game); + } + + Card cardToExile = game.getCard(source.getSourceId()); + if(cardToExile != null) + { + cardToExile.moveToExile(null, "", source.getId(), game); + } + } + return true; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/judgment/GoldenWish.java b/Mage.Sets/src/mage/sets/judgment/GoldenWish.java new file mode 100644 index 0000000000..54b6afb637 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/GoldenWish.java @@ -0,0 +1,143 @@ +/* + * 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.sets.judgment; + +import java.util.Set; +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author Plopman + */ +public class GoldenWish extends CardImpl { + + public GoldenWish(UUID ownerId) { + super(ownerId, 12, "Golden Wish", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{W}{W}"); + this.expansionSetCode = "JUD"; + + this.color.setWhite(true); + + // You may choose an artifact or enchantment card you own from outside the game, reveal that card, and put it into your hand. Exile Golden Wish. + this.getSpellAbility().addEffect(new GoldenWishEffect()); + } + + public GoldenWish(final GoldenWish card) { + super(card); + } + + @Override + public GoldenWish copy() { + return new GoldenWish(this); + } +} + +class GoldenWishEffect extends OneShotEffect { + + private static final String choiceText = "Choose an artifact or enchantment card you own from outside the game, and put it into your hand"; + + private static final FilterCard filter = new FilterCard("artifact or enchantment card"); + static{ + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.ENCHANTMENT))); + } + + public GoldenWishEffect() { + super(Constants.Outcome.Benefit); + this.staticText = "You may choose a artifact or enchantment card you own from outside the game, reveal that card, and put it into your hand. Exile Golden Wish"; + } + + public GoldenWishEffect(final GoldenWishEffect effect) { + super(effect); + } + + @Override + public GoldenWishEffect copy() { + return new GoldenWishEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + while (player.chooseUse(Constants.Outcome.Benefit, choiceText, game)) { + Cards cards = player.getSideboard(); + if(cards.isEmpty()) { + game.informPlayer(player, "You have no cards outside the game."); + break; + } + + Set filtered = cards.getCards(filter, game); + if (filtered.isEmpty()) { + game.informPlayer(player, "You have no " + filter.getMessage() + " outside the game."); + break; + } + + Cards filteredCards = new CardsImpl(); + for (Card card : filtered) { + filteredCards.add(card.getId()); + } + + TargetCard target = new TargetCard(Constants.Zone.PICK, filter); + if (player.choose(Constants.Outcome.Benefit, filteredCards, target, game)) { + Card card = player.getSideboard().get(target.getFirstTarget(), game); + if (card != null) { + + card.moveToZone(Constants.Zone.HAND, source.getId(), game, false); + Cards revealCard = new CardsImpl(); + revealCard.add(card); + player.revealCards("Golden Wish", revealCard, game); + break; + } + } + } + Card cardToExile = game.getCard(source.getSourceId()); + if(cardToExile != null) + { + cardToExile.moveToExile(null, "", source.getId(), game); + } + } + return true; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/judgment/LivingWish.java b/Mage.Sets/src/mage/sets/judgment/LivingWish.java new file mode 100644 index 0000000000..1d399526b6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/judgment/LivingWish.java @@ -0,0 +1,143 @@ +/* + * 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.sets.judgment; + +import java.util.Set; +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author Plopman + */ +public class LivingWish extends CardImpl { + + public LivingWish(UUID ownerId) { + super(ownerId, 124, "Living Wish", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{G}"); + this.expansionSetCode = "JUD"; + + this.color.setGreen(true); + + // You may choose a creature or land card you own from outside the game, reveal that card, and put it into your hand. Exile Living Wish. + this.getSpellAbility().addEffect(new LivingWishEffect()); + } + + public LivingWish(final LivingWish card) { + super(card); + } + + @Override + public LivingWish copy() { + return new LivingWish(this); + } +} + +class LivingWishEffect extends OneShotEffect { + + private static final String choiceText = "Choose a creature or land card you own from outside the game, and put it into your hand"; + + private static final FilterCard filter = new FilterCard("creature or land card"); + static{ + filter.add(Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public LivingWishEffect() { + super(Constants.Outcome.Benefit); + this.staticText = "You may choose a creature or land card you own from outside the game, reveal that card, and put it into your hand. Exile Living Wish"; + } + + public LivingWishEffect(final LivingWishEffect effect) { + super(effect); + } + + @Override + public LivingWishEffect copy() { + return new LivingWishEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + while (player.chooseUse(Constants.Outcome.Benefit, choiceText, game)) { + Cards cards = player.getSideboard(); + if(cards.isEmpty()) { + game.informPlayer(player, "You have no cards outside the game."); + break; + } + + Set filtered = cards.getCards(filter, game); + if (filtered.isEmpty()) { + game.informPlayer(player, "You have no " + filter.getMessage() + " outside the game."); + break; + } + + Cards filteredCards = new CardsImpl(); + for (Card card : filtered) { + filteredCards.add(card.getId()); + } + + TargetCard target = new TargetCard(Constants.Zone.PICK, filter); + if (player.choose(Constants.Outcome.Benefit, filteredCards, target, game)) { + Card card = player.getSideboard().get(target.getFirstTarget(), game); + if (card != null) { + + card.moveToZone(Constants.Zone.HAND, source.getId(), game, false); + Cards revealCard = new CardsImpl(); + revealCard.add(card); + player.revealCards("Living Wish", revealCard, game); + break; + } + } + } + Card cardToExile = game.getCard(source.getSourceId()); + if(cardToExile != null) + { + cardToExile.moveToExile(null, "", source.getId(), game); + } + } + return true; + } + +} diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index 7f9b8bc3a0..d8ec8ea9f0 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -249,8 +249,10 @@ public abstract class CardImpl> extends MageObjectImpl case EXILED: game.getExile().removeCard(this, game); break; - case STACK: case OUTSIDE: + game.getPlayer(ownerId).getSideboard().remove(this); + break; + case STACK: case PICK: break; default: @@ -321,6 +323,9 @@ public abstract class CardImpl> extends MageObjectImpl case EXILED: game.getExile().removeCard(this, game); break; + case OUTSIDE: + game.getPlayer(ownerId).getSideboard().remove(this); + break; default: //logger.warning("moveToZone, not fully implemented: from="+event.getFromZone() + ", to="+event.getToZone()); } diff --git a/Mage/src/mage/game/stack/Spell.java b/Mage/src/mage/game/stack/Spell.java index 131973d987..7d2b44ac75 100644 --- a/Mage/src/mage/game/stack/Spell.java +++ b/Mage/src/mage/game/stack/Spell.java @@ -101,7 +101,7 @@ public class Spell> implements StackObject, Card { return result; } } - if (!card.isCopy()) { + if (!card.isCopy() && game.getState().getZone(card.getId()) == Zone.STACK) { card.moveToZone(Zone.GRAVEYARD, ability.getId(), game, false); } }