From 1de997fd3356ac88f93b9c19b5665b68952b0023 Mon Sep 17 00:00:00 2001 From: Plopman Date: Mon, 3 Feb 2014 21:48:27 +0100 Subject: [PATCH] Added Genesis Chambe, Proclamation of Rebirth and Ichorid --- .../mage/sets/darksteel/GenesisChamber.java | 142 ++++++++++++++++++ .../dissension/ProclamationOfRebirth.java | 78 ++++++++++ Mage.Sets/src/mage/sets/torment/Ichorid.java | 125 +++++++++++++++ 3 files changed, 345 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/darksteel/GenesisChamber.java create mode 100644 Mage.Sets/src/mage/sets/dissension/ProclamationOfRebirth.java create mode 100644 Mage.Sets/src/mage/sets/torment/Ichorid.java diff --git a/Mage.Sets/src/mage/sets/darksteel/GenesisChamber.java b/Mage.Sets/src/mage/sets/darksteel/GenesisChamber.java new file mode 100644 index 0000000000..ce660b092a --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/GenesisChamber.java @@ -0,0 +1,142 @@ +/* + * 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.darksteel; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.BeastToken; +import mage.game.permanent.token.MyrToken; +import mage.game.permanent.token.Token; +import mage.game.stack.Spell; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author Plopman + */ +public class GenesisChamber extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature"); + static{ + filter.add(Predicates.not(new TokenPredicate())); + } + public GenesisChamber(UUID ownerId) { + super(ownerId, 122, "Genesis Chamber", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "DST"; + + // Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller puts a 1/1 colorless Myr artifact creature token onto the battlefield. + this.addAbility(new GenesisChamberTriggeredAbility(new GenesisChamberEffect(), filter)); + } + + public GenesisChamber(final GenesisChamber card) { + super(card); + } + + @Override + public GenesisChamber copy() { + return new GenesisChamber(this); + } +} + +class GenesisChamberTriggeredAbility extends EntersBattlefieldAllTriggeredAbility +{ + private static final String rule = "Whenever a nontoken creature enters the battlefield, if {this} is untapped, that creature's controller puts a 1/1 colorless Myr artifact creature token onto the battlefield"; + public GenesisChamberTriggeredAbility(Effect effect, FilterPermanent filter) + { + super(Zone.BATTLEFIELD, effect, filter, false, true, rule); + } + + public GenesisChamberTriggeredAbility(final GenesisChamberTriggeredAbility ability) { + super(ability); + } + @Override + public GenesisChamberTriggeredAbility copy() { + return new GenesisChamberTriggeredAbility(this); + } + + + @Override + public boolean checkInterveningIfClause(Game game) { + Permanent permanent = game.getPermanent(this.sourceId); + if(permanent == null){ + permanent = (Permanent)game.getLastKnownInformation(sourceId, Zone.BATTLEFIELD); + } + if(permanent != null){ + return !permanent.isTapped(); + } + return false; + } + +} + + +class GenesisChamberEffect extends OneShotEffect { + + public GenesisChamberEffect() { + super(Outcome.Benefit); + this.staticText = "that creature's controller puts a 1/1 colorless Myr artifact creature token onto the battlefield"; + } + + public GenesisChamberEffect(final GenesisChamberEffect effect) { + super(effect); + } + + @Override + public GenesisChamberEffect copy() { + return new GenesisChamberEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); + if(permanent == null){ + permanent = (Permanent)game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.BATTLEFIELD); + } + if (permanent != null) { + MyrToken token = new MyrToken(); + token.putOntoBattlefield(1, game, source.getId(), permanent.getControllerId()); + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/dissension/ProclamationOfRebirth.java b/Mage.Sets/src/mage/sets/dissension/ProclamationOfRebirth.java new file mode 100644 index 0000000000..d88ffec32f --- /dev/null +++ b/Mage.Sets/src/mage/sets/dissension/ProclamationOfRebirth.java @@ -0,0 +1,78 @@ +/* + * 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.dissension; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; +import mage.abilities.keyword.ForecastAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author Plopman + */ +public class ProclamationOfRebirth extends CardImpl { + + private static final FilterCreatureCard filter1 = new FilterCreatureCard("creature card with converted mana cost {1} or less from your graveyard"); + private static final FilterCreatureCard filter3 = new FilterCreatureCard("creature cards with converted mana cost {1} or less from your graveyard"); + static { + filter1.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 2)); + filter3.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 2)); + } + public ProclamationOfRebirth(UUID ownerId) { + super(ownerId, 15, "Proclamation of Rebirth", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{W}"); + this.expansionSetCode = "DIS"; + + this.color.setWhite(true); + + // Return up to three target creature cards with converted mana cost 1 or less from your graveyard to the battlefield. + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,3,filter3)); + this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); + // Forecast - {5}{W}, Reveal Proclamation of Rebirth from your hand: Return target creature card with converted mana cost 1 or less from your graveyard to the battlefield. + ForecastAbility ability = new ForecastAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), new ManaCostsImpl("{5}{W}")); + ability.addTarget(new TargetCardInYourGraveyard(filter1)); + this.addAbility(ability); + } + + public ProclamationOfRebirth(final ProclamationOfRebirth card) { + super(card); + } + + @Override + public ProclamationOfRebirth copy() { + return new ProclamationOfRebirth(this); + } +} diff --git a/Mage.Sets/src/mage/sets/torment/Ichorid.java b/Mage.Sets/src/mage/sets/torment/Ichorid.java new file mode 100644 index 0000000000..c19efefc31 --- /dev/null +++ b/Mage.Sets/src/mage/sets/torment/Ichorid.java @@ -0,0 +1,125 @@ +/* + * 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.torment; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardIdPredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author Plopman + */ +public class Ichorid extends CardImpl { + + public Ichorid(UUID ownerId) { + super(ownerId, 65, "Ichorid", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "TOR"; + this.subtype.add("Horror"); + + this.color.setBlack(true); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + // At the beginning of the end step, sacrifice Ichorid. + this.addAbility(new BeginningOfYourEndStepTriggeredAbility(new SacrificeSourceEffect(), false)); + // At the beginning of your upkeep, if Ichorid is in your graveyard, you may exile a black creature card other than Ichorid from your graveyard. If you do, return Ichorid to the battlefield. + Ability ability = new IchoridTriggerdAbility(); + FilterCard filter = new FilterCreatureCard("an other black creature card from your graveyard"); + filter.add(Predicates.not(new CardIdPredicate(this.getId()))); + filter.add(new ColorPredicate(ObjectColor.BLACK)); + ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(filter))); + this.addAbility(ability); + + } + + public Ichorid(final Ichorid card) { + super(card); + } + + @Override + public Ichorid copy() { + return new Ichorid(this); + } +} + +class IchoridTriggerdAbility extends BeginningOfUpkeepTriggeredAbility{ + + public IchoridTriggerdAbility(){ + super(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), TargetController.YOU, false); + } + + public IchoridTriggerdAbility(IchoridTriggerdAbility ability) { + super(ability); + } + + @Override + public BeginningOfUpkeepTriggeredAbility copy() { + return new IchoridTriggerdAbility(this); + } + + + @Override + public boolean checkInterveningIfClause(Game game) { + Player controller = game.getPlayer(controllerId); + if(controller != null && controller.getGraveyard().contains(sourceId)){ + return super.checkInterveningIfClause(game); + } + return false; + } + + @Override + public String getRule() { + return "At the beginning of your upkeep, if {source} is in your graveyard, you may exile a black creature card other than {source} from your graveyard. If you do, return {source} to the battlefield"; + } + + + +} \ No newline at end of file