From d7c3a34d3fce8a56e43bfa5e5f07ed6e4a49f17b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 2 May 2013 16:08:27 +0200 Subject: [PATCH] [DGM] Restore the Peace, Ral Zarek, Progenitor Mimic --- .../sets/dragonsmaze/ProgenitorMimic.java | 132 +++++++++++++++ .../src/mage/sets/dragonsmaze/RalZarek.java | 160 ++++++++++++++++++ .../sets/dragonsmaze/RestoreThePeace.java | 101 +++++++++++ 3 files changed, 393 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java create mode 100644 Mage.Sets/src/mage/sets/dragonsmaze/RalZarek.java create mode 100644 Mage.Sets/src/mage/sets/dragonsmaze/RestoreThePeace.java diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java b/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java new file mode 100644 index 0000000000..75011110f5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java @@ -0,0 +1,132 @@ +/* + * 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.dragonsmaze; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.TargetController; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.SourceMatchesFilterCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.EntersBattlefieldEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyPermanentEffect; +import mage.cards.CardImpl; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.sets.tokens.EmptyToken; +import mage.util.CardUtil; +import mage.util.functions.ApplyToPermanent; + +/** + * + * @author LevelX2 + */ +public class ProgenitorMimic extends CardImpl { + + public ProgenitorMimic(UUID ownerId) { + super(ownerId, 92, "Progenitor Mimic", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{4}{G}{U}"); + this.expansionSetCode = "DGM"; + this.subtype.add("Shapeshifter"); + + this.color.setBlue(true); + this.color.setGreen(true); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield except it gains "At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature." + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new EntersBattlefieldEffect(new CopyPermanentEffect(new ProgenitorMimicApplyToPermanent()), + "You may have {this} enter the battlefield as a copy of any creature on the battlefield except it gains \"At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature.\"", + true))); + } + + public ProgenitorMimic(final ProgenitorMimic card) { + super(card); + } + + @Override + public ProgenitorMimic copy() { + return new ProgenitorMimic(this); + } +} +class ProgenitorMimicApplyToPermanent extends ApplyToPermanent { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("no Token"); + static { + filter.add(Predicates.not(new TokenPredicate())); + } + @Override + public Boolean apply(Game game, Permanent permanent) { + Ability ability = new ConditionalTriggeredAbility( + new BeginningOfUpkeepTriggeredAbility(new CopySourceEffect(), TargetController.YOU, false), + new SourceMatchesFilterCondition(filter), + "At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature."); + permanent.addAbility(ability, game); + return true; + } +} + +class CopySourceEffect extends OneShotEffect { + + public CopySourceEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "put a token onto the battlefield that's a copy of this creature"; + } + + public CopySourceEffect(final CopySourceEffect effect) { + super(effect); + } + + @Override + public CopySourceEffect copy() { + return new CopySourceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent copyFromPermanent = game.getPermanent(source.getSourceId()); + if (copyFromPermanent != null) { + EmptyToken token = new EmptyToken(); + CardUtil.copyTo(token).from(copyFromPermanent); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/RalZarek.java b/Mage.Sets/src/mage/sets/dragonsmaze/RalZarek.java new file mode 100644 index 0000000000..cea078dfd9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dragonsmaze/RalZarek.java @@ -0,0 +1,160 @@ +/* + * 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.dragonsmaze; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.turn.TurnMod; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LevelX2 + */ +public class RalZarek extends CardImpl { + + public RalZarek(UUID ownerId) { + super(ownerId, 94, "Ral Zarek", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{2}{U}{R}"); + this.expansionSetCode = "DGM"; + this.subtype.add("Ral"); + + this.color.setRed(true); + this.color.setBlue(true); + + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(4)), false)); + + // +1: Tap target permanent, then untap another target permanent. + LoyaltyAbility ability1 = new LoyaltyAbility(new RalZarekTapUntapEffect(), 1); + ability1.addTarget(new TargetPermanent(2, 2, new FilterPermanent(), false)); + this.addAbility(ability1); + + // -2: Ral Zarek deals 3 damage to target creature or player. + LoyaltyAbility ability2 = new LoyaltyAbility(new DamageTargetEffect(3), -2); + ability2.addTarget(new TargetCreatureOrPlayer(true)); + this.addAbility(ability2); + + // -7: Flip five coins. Take an extra turn after this one for each coin that comes up heads. + this.addAbility(new LoyaltyAbility(new RalZarekExtraTurnsEffect(), -7)); + + } + + public RalZarek(final RalZarek card) { + super(card); + } + + @Override + public RalZarek copy() { + return new RalZarek(this); + } +} + + +class RalZarekTapUntapEffect extends OneShotEffect { + + public RalZarekTapUntapEffect() { + super(Outcome.Tap); + this.staticText = "Tap target permanent, then untap another target permanent"; + } + + public RalZarekTapUntapEffect(final RalZarekTapUntapEffect effect) { + super(effect); + } + + @Override + public RalZarekTapUntapEffect copy() { + return new RalZarekTapUntapEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + int i = 0; + for (UUID targetId : source.getTargets().get(0).getTargets()) { + i++; + Permanent permanent = game.getPermanent(targetId); + if (permanent != null) { + if (i==1) { + permanent.tap(game); + } + if (i==2) { + permanent.untap(game); + } + } + } + return true; + } + return false; + } +} + +class RalZarekExtraTurnsEffect extends OneShotEffect { + + public RalZarekExtraTurnsEffect() { + super(Outcome.ExtraTurn); + this.staticText = "Flip five coins. Take an extra turn after this one for each coin that comes up heads"; + } + + public RalZarekExtraTurnsEffect(final RalZarekExtraTurnsEffect effect) { + super(effect); + } + + @Override + public RalZarekExtraTurnsEffect copy() { + return new RalZarekExtraTurnsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (int i=0; i<5; i++) { + if (controller.flipCoin(game)) { + game.getState().getTurnMods().add(new TurnMod(source.getControllerId(), false)); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/RestoreThePeace.java b/Mage.Sets/src/mage/sets/dragonsmaze/RestoreThePeace.java new file mode 100644 index 0000000000..96e031e634 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dragonsmaze/RestoreThePeace.java @@ -0,0 +1,101 @@ +/* + * 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.dragonsmaze; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.watchers.common.SourceDidDamageWatcher; + +/** + * + * @author LevelX2 + */ +public class RestoreThePeace extends CardImpl { + + public RestoreThePeace(UUID ownerId) { + super(ownerId, 97, "Restore the Peace", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{W}{U}"); + this.expansionSetCode = "DGM"; + + this.color.setBlue(true); + this.color.setWhite(true); + + // Return each creature that dealt damage this turn to its owner's hand. + this.getSpellAbility().addEffect(new RestoreThePeaceEffect()); + this.addWatcher(new SourceDidDamageWatcher()); + + } + + public RestoreThePeace(final RestoreThePeace card) { + super(card); + } + + @Override + public RestoreThePeace copy() { + return new RestoreThePeace(this); + } +} + +class RestoreThePeaceEffect extends OneShotEffect { + + public RestoreThePeaceEffect() { + super(Outcome.ReturnToHand); + this.staticText = "Return each creature that dealt damage this turn to its owner's hand"; + } + + public RestoreThePeaceEffect(final RestoreThePeaceEffect effect) { + super(effect); + } + + @Override + public RestoreThePeaceEffect copy() { + return new RestoreThePeaceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + SourceDidDamageWatcher watcher = (SourceDidDamageWatcher) game.getState().getWatchers().get("SourceDidDamageWatcher"); + if (watcher != null) { + for (UUID permId :watcher.damageSources) { + Permanent perm = game.getPermanent(permId); + if (perm != null) { + perm.moveToZone(Zone.HAND, source.getSourceId(), game, true); + } + } + return true; + } + return false; + } +}