From 1e215319767b4781db66a9baa655e9a8686c52a7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 16 Sep 2013 17:05:08 +0200 Subject: [PATCH] [THS] Added 10 cards (gold). --- .../mage/sets/avacynrestored/StolenGoods.java | 2 +- .../src/mage/sets/theros/DaxosOfMeletis.java | 209 +++++++++++++++++ .../src/mage/sets/theros/HorizonChimera.java | 75 ++++++ .../src/mage/sets/theros/PharikasMender.java | 83 +++++++ .../mage/sets/theros/ProphetOfKruphix.java | 126 ++++++++++ .../mage/sets/theros/PsychicIntrusion.java | 221 ++++++++++++++++++ .../sets/theros/SentryOfTheUnderworld.java | 79 +++++++ .../src/mage/sets/theros/ShipwreckSinger.java | 97 ++++++++ .../src/mage/sets/theros/SteamAugury.java | 178 ++++++++++++++ .../src/mage/sets/theros/TriadOfFates.java | 143 ++++++++++++ .../sets/theros/TymaretTheMurderKing.java | 90 +++++++ .../mage/sets/worldwake/QuestForRenewal.java | 2 +- 12 files changed, 1303 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java create mode 100644 Mage.Sets/src/mage/sets/theros/HorizonChimera.java create mode 100644 Mage.Sets/src/mage/sets/theros/PharikasMender.java create mode 100644 Mage.Sets/src/mage/sets/theros/ProphetOfKruphix.java create mode 100644 Mage.Sets/src/mage/sets/theros/PsychicIntrusion.java create mode 100644 Mage.Sets/src/mage/sets/theros/SentryOfTheUnderworld.java create mode 100644 Mage.Sets/src/mage/sets/theros/ShipwreckSinger.java create mode 100644 Mage.Sets/src/mage/sets/theros/SteamAugury.java create mode 100644 Mage.Sets/src/mage/sets/theros/TriadOfFates.java create mode 100644 Mage.Sets/src/mage/sets/theros/TymaretTheMurderKing.java diff --git a/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java b/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java index 533d8d9f21..a0383c6f5f 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/StolenGoods.java @@ -141,7 +141,7 @@ class StolenGoodsCastFromExileEffect extends AsThoughEffectImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with power 3 or greater"); + static { + filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 2)); + } + + public DaxosOfMeletis(UUID ownerId) { + super(ownerId, 191, "Daxos of Meletis", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{W}{U}"); + this.expansionSetCode = "THS"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Soldier"); + + this.color.setBlue(true); + this.color.setWhite(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Daxos of Meletis can't be blocked by creatures with power 3 or greater. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield))); + + // Whenever Daxos of Meletis deals combat damage to a player, exile the top card of that player's library. You gain life equal to that card's converted mana cost. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DaxosOfMeletisEffect(), false, true)); + } + + public DaxosOfMeletis(final DaxosOfMeletis card) { + super(card); + } + + @Override + public DaxosOfMeletis copy() { + return new DaxosOfMeletis(this); + } +} + +class DaxosOfMeletisEffect extends OneShotEffect { + + public DaxosOfMeletisEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "exile the top card of that player's library. You gain life equal to that card's converted mana cost. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it"; + } + + public DaxosOfMeletisEffect(final DaxosOfMeletisEffect effect) { + super(effect); + } + + @Override + public DaxosOfMeletisEffect copy() { + return new DaxosOfMeletisEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player damagedPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (damagedPlayer != null) { + Player controller = game.getPlayer(source.getControllerId()); + UUID exileId = CardUtil.getCardExileZoneId(game, source); + Card card = damagedPlayer.getLibrary().getFromTop(game); + if (card != null && controller != null) { + // move card to exile + card.moveToExile(exileId, "Daxos of Meletis", source.getSourceId(), game); + // player gains life + int cmc = card.getManaCost().convertedManaCost(); + if (cmc > 0) { + controller.gainLife(cmc, game); + } + // allow to cast the card + game.addEffect(new DaxosOfMeletisCastFromExileEffect(card.getId(), exileId), source); + // and you may spend mana as though it were mana of any color to cast it + game.addEffect(new DaxosOfMeletisSpendAnyManaEffect(card.getId()), source); + } + return true; + } + return false; + } +} + +class DaxosOfMeletisCastFromExileEffect extends AsThoughEffectImpl { + + private UUID cardId; + private UUID exileId; + + public DaxosOfMeletisCastFromExileEffect(UUID cardId, UUID exileId) { + super(AsThoughEffectType.CAST, Duration.EndOfTurn, Outcome.Benefit); + staticText = "Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it"; + this.cardId = cardId; + this.exileId = exileId; + } + + public DaxosOfMeletisCastFromExileEffect(final DaxosOfMeletisCastFromExileEffect effect) { + super(effect); + this.cardId = effect.cardId; + this.exileId = effect.exileId; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public DaxosOfMeletisCastFromExileEffect copy() { + return new DaxosOfMeletisCastFromExileEffect(this); + } + + @Override + public boolean applies(UUID sourceId, Ability source, Game game) { + if (sourceId.equals(this.cardId)) { + Card card = game.getCard(this.cardId); + if (card != null && game.getState().getExile().getExileZone(exileId).contains(cardId)) { + if (card.getSpellAbility().spellCanBeActivatedRegularlyNow(source.getControllerId(), game)) { + return true; + } + } + } + return false; + } +} + +class DaxosOfMeletisSpendAnyManaEffect extends AsThoughEffectImpl { + + private UUID cardId; + + public DaxosOfMeletisSpendAnyManaEffect(UUID cardId) { + super(AsThoughEffectType.SPEND_ANY_MANA, Duration.EndOfTurn, Outcome.Benefit); + staticText = "you may spend mana as though it were mana of any color to cast it"; + this.cardId = cardId; + } + + public DaxosOfMeletisSpendAnyManaEffect(final DaxosOfMeletisSpendAnyManaEffect effect) { + super(effect); + this.cardId = effect.cardId; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public DaxosOfMeletisSpendAnyManaEffect copy() { + return new DaxosOfMeletisSpendAnyManaEffect(this); + } + + @Override + public boolean applies(UUID sourceId, Ability source, Game game) { + if (sourceId.equals(this.cardId)) { + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/theros/HorizonChimera.java b/Mage.Sets/src/mage/sets/theros/HorizonChimera.java new file mode 100644 index 0000000000..5ee43d9693 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/HorizonChimera.java @@ -0,0 +1,75 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DrawCardTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class HorizonChimera extends CardImpl { + + public HorizonChimera(UUID ownerId) { + super(ownerId, 194, "Horizon Chimera", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Chimera"); + + this.color.setBlue(true); + this.color.setGreen(true); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Trample + this.addAbility(TrampleAbility.getInstance()); + // Whenever you draw a card, you gain 1 life. + this.addAbility(new DrawCardTriggeredAbility(new GainLifeEffect(1), false)); + } + + public HorizonChimera(final HorizonChimera card) { + super(card); + } + + @Override + public HorizonChimera copy() { + return new HorizonChimera(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/PharikasMender.java b/Mage.Sets/src/mage/sets/theros/PharikasMender.java new file mode 100644 index 0000000000..113794ad3c --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/PharikasMender.java @@ -0,0 +1,83 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.Target; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author LevelX2 + */ +public class PharikasMender extends CardImpl { + + private static final FilterCard filter = new FilterCard("creature or enchantment card"); + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.ENCHANTMENT))); + } + + public PharikasMender(UUID ownerId) { + super(ownerId, 197, "Pharika's Mender", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}{G}"); + this.expansionSetCode = "THS"; + this.subtype.add("Gorgon"); + + this.color.setGreen(true); + this.color.setBlack(true); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // When Pharika's Mender enters the battlefield, you may return target creature or enchantment card from your graveyard to your hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); + Target target = new TargetCardInYourGraveyard(); + target.setRequired(true); + ability.addTarget(target); + this.addAbility(ability); + } + + public PharikasMender(final PharikasMender card) { + super(card); + } + + @Override + public PharikasMender copy() { + return new PharikasMender(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/ProphetOfKruphix.java b/Mage.Sets/src/mage/sets/theros/ProphetOfKruphix.java new file mode 100644 index 0000000000..a87188ee1b --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/ProphetOfKruphix.java @@ -0,0 +1,126 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUntapTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UntapAllControllerEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ +public class ProphetOfKruphix extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent(); + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.LAND))); + } + + public ProphetOfKruphix(UUID ownerId) { + super(ownerId, 199, "Prophet of Kruphix", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{G}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.color.setBlue(true); + this.color.setGreen(true); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Untap all creatures and lands you control during each other player's untap step. + Effect effect = new UntapAllControllerEffect(filter, "Untap all creatures and lands you control during each other player's untap step"); + this.addAbility(new BeginningOfUntapTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.NOT_YOU, false)); + // You may cast creature cards as though they had flash. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ProphetOfKruphixEffect())); + + } + + public ProphetOfKruphix(final ProphetOfKruphix card) { + super(card); + } + + @Override + public ProphetOfKruphix copy() { + return new ProphetOfKruphix(this); + } +} + +class ProphetOfKruphixEffect extends AsThoughEffectImpl { + + public ProphetOfKruphixEffect() { + super(AsThoughEffectType.CAST, Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "You may cast creature cards as though they had flash"; + } + + public ProphetOfKruphixEffect(final ProphetOfKruphixEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ProphetOfKruphixEffect copy() { + return new ProphetOfKruphixEffect(this); + } + + @Override + public boolean applies(UUID sourceId, Ability source, Game game) { + Card card = game.getCard(sourceId); + if (card != null) { + if (card.getCardType().contains(CardType.CREATURE) + && card.getOwnerId().equals(source.getControllerId())) { + return card.getSpellAbility().isInUseableZone(game, card, false); + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/theros/PsychicIntrusion.java b/Mage.Sets/src/mage/sets/theros/PsychicIntrusion.java new file mode 100644 index 0000000000..0231c2b52f --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/PsychicIntrusion.java @@ -0,0 +1,221 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterNonlandCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetOpponent; +import mage.util.CardUtil; + +/** + * + * @author LevelX2 + */ +public class PsychicIntrusion extends CardImpl { + + public PsychicIntrusion(UUID ownerId) { + super(ownerId, 200, "Psychic Intrusion", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}{B}"); + this.expansionSetCode = "THS"; + + this.color.setBlue(true); + this.color.setBlack(true); + + // Target opponent reveals his or her hand. You choose a nonland card from that player's graveyard or hand and exile it. + // You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color + // to cast that spell. + this.getSpellAbility().addTarget(new TargetOpponent()); + this.getSpellAbility().addEffect(new PsychicIntrusionExileEffect()); + + } + + public PsychicIntrusion(final PsychicIntrusion card) { + super(card); + } + + @Override + public PsychicIntrusion copy() { + return new PsychicIntrusion(this); + } +} + +class PsychicIntrusionExileEffect extends OneShotEffect { + + private static final FilterNonlandCard filter = new FilterNonlandCard(); + + public PsychicIntrusionExileEffect() { + super(Outcome.Benefit); + this.staticText = "Target opponent reveals his or her hand. You choose a nonland card from that player's graveyard or hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell"; + } + + public PsychicIntrusionExileEffect(final PsychicIntrusionExileEffect effect) { + super(effect); + } + + @Override + public PsychicIntrusionExileEffect copy() { + return new PsychicIntrusionExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player opponent = game.getPlayer(source.getFirstTarget()); + if (opponent != null) { + opponent.revealCards("Psychic Intrusion", opponent.getHand(), game); + Player you = game.getPlayer(source.getControllerId()); + if (you != null) { + int cardsGraveyard = opponent.getGraveyard().count(filter, game); + int cardsHand = opponent.getHand().count(filter, game); + boolean fromHand = false; + if (cardsGraveyard > 0 && cardsHand > 0) { + if (opponent.chooseUse(Outcome.Detriment, "Exile card from opponents Hand?", game)) { + fromHand = true; + } + } + Card card = null; + if (cardsHand > 0 && fromHand) { + TargetCard target = new TargetCard(Zone.PICK, filter); + target.setRequired(true); + if (you.choose(Outcome.Benefit, opponent.getHand(), target, game)) { + card = opponent.getHand().get(target.getFirstTarget(), game); + + } + } + if (cardsGraveyard > 0 && !fromHand) { + TargetCard target = new TargetCard(Zone.PICK, filter); + target.setRequired(true); + if (you.choose(Outcome.Benefit, opponent.getGraveyard(), target, game)) { + card = opponent.getGraveyard().get(target.getFirstTarget(), game); + + } + } + if (card != null) { + // move card to exile + UUID exileId = CardUtil.getCardExileZoneId(game, source); + card.moveToExile(exileId, "Daxos of Meletis", source.getSourceId(), game); + // allow to cast the card + game.addEffect(new PsychicIntrusionCastFromExileEffect(card.getId(), exileId), source); + // and you may spend mana as though it were mana of any color to cast it + game.addEffect(new PsychicIntrusionSpendAnyManaEffect(card.getId()), source); + } + + return true; + } + } + return false; + } +} + +class PsychicIntrusionCastFromExileEffect extends AsThoughEffectImpl { + + private UUID cardId; + private UUID exileId; + + public PsychicIntrusionCastFromExileEffect(UUID cardId, UUID exileId) { + super(AsThoughEffectType.CAST, Duration.EndOfGame, Outcome.Benefit); + staticText = "You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell"; + this.cardId = cardId; + this.exileId = exileId; + } + + public PsychicIntrusionCastFromExileEffect(final PsychicIntrusionCastFromExileEffect effect) { + super(effect); + this.cardId = effect.cardId; + this.exileId = effect.exileId; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public PsychicIntrusionCastFromExileEffect copy() { + return new PsychicIntrusionCastFromExileEffect(this); + } + + @Override + public boolean applies(UUID sourceId, Ability source, Game game) { + if (sourceId.equals(this.cardId)) { + Card card = game.getCard(this.cardId); + if (card != null && game.getState().getExile().getExileZone(exileId).contains(cardId)) { + if (card.getSpellAbility().spellCanBeActivatedRegularlyNow(source.getControllerId(), game)) { + return true; + } + } + } + return false; + } +} + +class PsychicIntrusionSpendAnyManaEffect extends AsThoughEffectImpl { + + private UUID cardId; + + public PsychicIntrusionSpendAnyManaEffect(UUID cardId) { + super(AsThoughEffectType.SPEND_ANY_MANA, Duration.EndOfGame, Outcome.Benefit); + staticText = "you may spend mana as though it were mana of any color to cast it"; + this.cardId = cardId; + } + + public PsychicIntrusionSpendAnyManaEffect(final PsychicIntrusionSpendAnyManaEffect effect) { + super(effect); + this.cardId = effect.cardId; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public PsychicIntrusionSpendAnyManaEffect copy() { + return new PsychicIntrusionSpendAnyManaEffect(this); + } + + @Override + public boolean applies(UUID sourceId, Ability source, Game game) { + if (sourceId.equals(this.cardId)) { + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/theros/SentryOfTheUnderworld.java b/Mage.Sets/src/mage/sets/theros/SentryOfTheUnderworld.java new file mode 100644 index 0000000000..7083e363b1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/SentryOfTheUnderworld.java @@ -0,0 +1,79 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class SentryOfTheUnderworld extends CardImpl { + + public SentryOfTheUnderworld(UUID ownerId) { + super(ownerId, 202, "Sentry of the Underworld", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}{B}"); + this.expansionSetCode = "THS"; + this.subtype.add("Griffin"); + this.subtype.add("Skeleton"); + + this.color.setBlack(true); + this.color.setWhite(true); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + // {W}{B}, Pay 3 life: Regenerate Sentry of the Underworld. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{W}{B}")); + ability.addCost(new PayLifeCost(3)); + this.addAbility(ability); + } + + public SentryOfTheUnderworld(final SentryOfTheUnderworld card) { + super(card); + } + + @Override + public SentryOfTheUnderworld copy() { + return new SentryOfTheUnderworld(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/ShipwreckSinger.java b/Mage.Sets/src/mage/sets/theros/ShipwreckSinger.java new file mode 100644 index 0000000000..b8bd0f45a8 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/ShipwreckSinger.java @@ -0,0 +1,97 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttacksIfAbleTargetEffect; +import mage.abilities.effects.common.continious.BoostAllEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class ShipwreckSinger extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private static final FilterCreaturePermanent filterAttacking = new FilterCreaturePermanent("Attacking creatures"); + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + filterAttacking.add(new AttackingPredicate()); + } + + public ShipwreckSinger(UUID ownerId) { + super(ownerId, 203, "Shipwreck Singer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{U}{B}"); + this.expansionSetCode = "THS"; + this.subtype.add("Siren"); + + this.color.setBlue(true); + this.color.setBlack(true); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // {1}{U}: Target creature an opponent controls attacks this turn if able. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AttacksIfAbleTargetEffect(Duration.EndOfTurn), new ManaCostsImpl("{1}{U}")); + Target target = new TargetCreaturePermanent(filter); + target.setRequired(true); + ability.addTarget(target); + this.addAbility(ability); + // {1}{B}, {T}: Attacking creatures get -1/-1 until end of turn. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(-1,-1, Duration.EndOfTurn, filterAttacking, false), new ManaCostsImpl("{1}{B}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + } + + public ShipwreckSinger(final ShipwreckSinger card) { + super(card); + } + + @Override + public ShipwreckSinger copy() { + return new ShipwreckSinger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/SteamAugury.java b/Mage.Sets/src/mage/sets/theros/SteamAugury.java new file mode 100644 index 0000000000..e5722ad47e --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/SteamAugury.java @@ -0,0 +1,178 @@ +/* + * 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.theros; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; +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.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class SteamAugury extends CardImpl { + + public SteamAugury(UUID ownerId) { + super(ownerId, 205, "Steam Augury", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{U}{R}"); + this.expansionSetCode = "THS"; + + this.color.setRed(true); + this.color.setBlue(true); + + // Reveal the top five cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. + this.getSpellAbility().addEffect(new SteamAuguryEffect()); + this.getSpellAbility().addTarget(new TargetOpponent(true)); + + } + + public SteamAugury(final SteamAugury card) { + super(card); + } + + @Override + public SteamAugury copy() { + return new SteamAugury(this); + } +} + +class SteamAuguryEffect extends OneShotEffect { + + public SteamAuguryEffect() { + super(Outcome.DrawCard); + this.staticText = "Reveal the top five cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard"; + } + + public SteamAuguryEffect(final SteamAuguryEffect effect) { + super(effect); + } + + @Override + public SteamAuguryEffect copy() { + return new SteamAuguryEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + + Cards cards = new CardsImpl(Zone.PICK); + int count = Math.min(player.getLibrary().size(), 5); + for (int i = 0; i < count; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + cards.add(card); + game.setZone(card.getId(), Zone.PICK); + } + } + player.revealCards("Steam Augury", cards, game); + Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (opponent != null) { + TargetCard target = new TargetCard(0, cards.size(), Zone.PICK, new FilterCard("cards to put in the first pile")); + List pile1 = new ArrayList(); + Cards pile1CardsIds = new CardsImpl(); + if (player.choose(Outcome.Neutral, cards, target, game)) { + List targets = target.getTargets(); + for (UUID targetId : targets) { + Card card = game.getCard(targetId); + if (card != null) { + pile1.add(card); + pile1CardsIds.add(card.getId()); + } + } + } + List pile2 = new ArrayList(); + Cards pile2CardsIds = new CardsImpl(); + for (UUID cardId :cards) { + Card card = game.getCard(cardId); + if (card != null && !pile1.contains(card)) { + pile2.add(card); + pile2CardsIds.add(card.getId()); + } + } + boolean choice = opponent.choosePile(Outcome.Detriment, new StringBuilder("Choose a pile to put into ").append(player.getName()).append("'s hand.").toString(), pile1, pile2, game); + + Zone pile1Zone = Zone.GRAVEYARD; + Zone pile2Zone = Zone.HAND; + if (choice) { + pile1Zone = Zone.HAND; + pile2Zone = Zone.GRAVEYARD; + } + + StringBuilder sb = new StringBuilder("Steam Augury: Pile 1, going to ").append(pile1Zone.equals(Zone.HAND)?"Hand":"Graveyard").append (": "); + int i = 0; + for (UUID cardUuid : pile1CardsIds) { + i++; + Card card = game.getCard(cardUuid); + if (card != null) { + sb.append(card.getName()); + if (i < pile1CardsIds.size()) { + sb.append(", "); + } + card.moveToZone(pile1Zone, source.getId(), game, false); + } + } + game.informPlayers(sb.toString()); + + sb = new StringBuilder("Steam Augury: Pile 2, going to ").append(pile2Zone.equals(Zone.HAND)?"Hand":"Graveyard").append (":"); + i = 0; + for (UUID cardUuid : pile2CardsIds) { + Card card = game.getCard(cardUuid); + if (card != null) { + i++; + sb.append(" ").append(card.getName()); + if (i < pile2CardsIds.size()) { + sb.append(", "); + } + card.moveToZone(pile2Zone, source.getId(), game, false); + } + } + game.informPlayers(sb.toString()); + } + + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/theros/TriadOfFates.java b/Mage.Sets/src/mage/sets/theros/TriadOfFates.java new file mode 100644 index 0000000000..78ef2300c7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/TriadOfFates.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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardTargetEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.ExileTargetForSourceEffect; +import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.CounterPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class TriadOfFates extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private static final FilterCreaturePermanent filterCounter = new FilterCreaturePermanent("creature that has a fate counter on it"); + static { + filter.add(new AnotherPredicate()); + filterCounter.add(new CounterPredicate(CounterType.FATE)); + } + + public TriadOfFates(UUID ownerId) { + super(ownerId, 206, "Triad of Fates", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}{B}"); + this.expansionSetCode = "THS"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.color.setBlack(true); + this.color.setWhite(true); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {1}, {T}: Put a fate counter on another target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.FATE.createInstance()), new ManaCostsImpl("{1}")); + ability.addCost(new TapSourceCost()); + Target target = new TargetCreaturePermanent(filter); + target.setRequired(true); + ability.addTarget(target); + this.addAbility(ability); + // {W}, {T}: Exile target creature that has a fate counter on it, then return it to the battlefield under its owner's control. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetForSourceEffect("Triad of Fates"), new ManaCostsImpl("{W}")); + target = new TargetCreaturePermanent(filterCounter); + target.setRequired(true); + ability.addTarget(target); + ability.addEffect(new ReturnToBattlefieldUnderOwnerControlTargetEffect()); + this.addAbility(ability); + // {B}, {T}: Exile target creature that has a fate counter on it. Its controller draws two cards. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl("{B}")); + target = new TargetCreaturePermanent(filterCounter); + target.setRequired(true); + ability.addTarget(target); + ability.addEffect(new DrawCardControllerTargetEffect()); + this.addAbility(ability); + + } + + public TriadOfFates(final TriadOfFates card) { + super(card); + } + + @Override + public TriadOfFates copy() { + return new TriadOfFates(this); + } +} + +class DrawCardControllerTargetEffect extends OneShotEffect { + + public DrawCardControllerTargetEffect() { + super(Outcome.Benefit); + this.staticText = "Its controller draws two cards"; + } + + public DrawCardControllerTargetEffect(final DrawCardControllerTargetEffect effect) { + super(effect); + } + + @Override + public DrawCardControllerTargetEffect copy() { + return new DrawCardControllerTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = (Permanent) game.getLastKnownInformation(this.getTargetPointer().getFirst(game, source), Zone.BATTLEFIELD); + if (creature != null) { + Player controllerOfTarget = game.getPlayer(creature.getControllerId()); + if (controllerOfTarget != null) { + controllerOfTarget.drawCards(2, game); + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/theros/TymaretTheMurderKing.java b/Mage.Sets/src/mage/sets/theros/TymaretTheMurderKing.java new file mode 100644 index 0000000000..8b0a0e3096 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/TymaretTheMurderKing.java @@ -0,0 +1,90 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.TargetPlayer; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class TymaretTheMurderKing extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); + static { + filter.add(new AnotherPredicate()); + } + + public TymaretTheMurderKing(UUID ownerId) { + super(ownerId, 207, "Tymaret, the Murder King", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{B}{R}"); + this.expansionSetCode = "THS"; + this.supertype.add("Legendary"); + this.subtype.add("Zombie"); + this.subtype.add("Warrior"); + + this.color.setRed(true); + this.color.setBlack(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {1}{R}, Sacrifice another creature: Tymaret, the Murder King deals 2 damage to target player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{1}{R}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1, filter, false, true))); + ability.addTarget(new TargetPlayer(true)); + this.addAbility(ability); + // {1}{B}, Sacrifice a creature: Return Tymaret from your graveyard to your hand. + ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{1}{B}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1, new FilterControlledCreaturePermanent("a creature"), false, true))); + this.addAbility(ability); + + } + + public TymaretTheMurderKing(final TymaretTheMurderKing card) { + super(card); + } + + @Override + public TymaretTheMurderKing copy() { + return new TymaretTheMurderKing(this); + } +} diff --git a/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java b/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java index 37990be2b7..797cd7de4b 100644 --- a/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java +++ b/Mage.Sets/src/mage/sets/worldwake/QuestForRenewal.java @@ -62,7 +62,7 @@ public class QuestForRenewal extends CardImpl { // As long as there are four or more quest counters on Quest for Renewal, untap all creatures you control during each other player's untap step. ConditionalOneShotEffect effect = new ConditionalOneShotEffect(new UntapAllControllerEffect(filter, ""), new HasCounterCondition(CounterType.QUEST, 4), "as long as there are four or more quest counters on , untap all creatures you control"); - this.addAbility(new BeginningOfUntapTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.OPPONENT, false)); + this.addAbility(new BeginningOfUntapTriggeredAbility(Zone.BATTLEFIELD, effect, TargetController.NOT_YOU, false)); }