From 3eb50bf1c232271ce4de4eb85fc397617f78cb50 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 25 Mar 2014 00:01:28 +0100 Subject: [PATCH] Added Sword of the Meek, Venser, Shaper Savant and Humility. --- .../mage/sets/futuresight/SwordOfTheMeek.java | 118 +++++++++++++++ .../sets/futuresight/VenserShaperSavant.java | 136 ++++++++++++++++++ Mage.Sets/src/mage/sets/tempest/Humility.java | 123 ++++++++++++++++ .../sets/torment/LlawanCephalidEmpress.java | 2 +- ...BattlefieldControlledTriggeredAbility.java | 11 +- 5 files changed, 381 insertions(+), 9 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/futuresight/SwordOfTheMeek.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java create mode 100644 Mage.Sets/src/mage/sets/tempest/Humility.java diff --git a/Mage.Sets/src/mage/sets/futuresight/SwordOfTheMeek.java b/Mage.Sets/src/mage/sets/futuresight/SwordOfTheMeek.java new file mode 100644 index 00000000000..36438f8d9c2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/SwordOfTheMeek.java @@ -0,0 +1,118 @@ +/* + * 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.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continious.BoostEquippedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.filter.predicate.mageobject.ToughnessPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class SwordOfTheMeek extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a 1/1 creature"); + + static { + filter.add(new PowerPredicate(Filter.ComparisonType.Equal, 1)); + filter.add(new ToughnessPredicate(Filter.ComparisonType.Equal, 1)); + } + + public SwordOfTheMeek(UUID ownerId) { + super(ownerId, 165, "Sword of the Meek", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Equipment"); + + // Equipped creature gets +1/+2. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1,2,Duration.WhileOnBattlefield))); + // Equip {2} + this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2))); + // Whenever a 1/1 creature enters the battlefield under your control, you may return Sword of the Meek from your graveyard to the battlefield, then attach it to that creature. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.GRAVEYARD, new SwordOfTheMeekEffect(), filter, true, true, "")); + } + + public SwordOfTheMeek(final SwordOfTheMeek card) { + super(card); + } + + @Override + public SwordOfTheMeek copy() { + return new SwordOfTheMeek(this); + } +} + +class SwordOfTheMeekEffect extends OneShotEffect { + + public SwordOfTheMeekEffect() { + super(Outcome.Benefit); + this.staticText = "you may return {this} from your graveyard to the battlefield, then attach it to that creature"; + } + + public SwordOfTheMeekEffect(final SwordOfTheMeekEffect effect) { + super(effect); + } + + @Override + public SwordOfTheMeekEffect copy() { + return new SwordOfTheMeekEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Card equipment = game.getCard(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (equipment != null && controller != null && game.getState().getZone(source.getSourceId()).equals(Zone.GRAVEYARD)) { + controller.putOntoBattlefieldWithInfo(equipment, game, Zone.GRAVEYARD, source.getSourceId()); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent != null) { + return permanent.addAttachment(equipment.getId(), game); + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java b/Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java new file mode 100644 index 00000000000..43839e9cf8e --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/VenserShaperSavant.java @@ -0,0 +1,136 @@ +/* + * 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.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlashAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetSpellOrPermanent; + +/** + * + * @author LevelX2 + */ +public class VenserShaperSavant extends CardImpl { + + public VenserShaperSavant(UUID ownerId) { + super(ownerId, 46, "Venser, Shaper Savant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + this.expansionSetCode = "FUT"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.color.setBlue(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + // When Venser, Shaper Savant enters the battlefield, return target spell or permanent to its owner's hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new VenserShaperSavantEffect(), false); + Target target = new TargetSpellOrPermanent(); + target.setRequired(true); + ability.addTarget(target); + this.addAbility(ability); + } + + public VenserShaperSavant(final VenserShaperSavant card) { + super(card); + } + + @Override + public VenserShaperSavant copy() { + return new VenserShaperSavant(this); + } +} + +class VenserShaperSavantEffect extends OneShotEffect { + + public VenserShaperSavantEffect() { + super(Outcome.ReturnToHand); + this.staticText = "return target spell or permanent to its owner's hand"; + } + + public VenserShaperSavantEffect(final VenserShaperSavantEffect effect) { + super(effect); + } + + @Override + public VenserShaperSavantEffect copy() { + return new VenserShaperSavantEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); + if (permanent != null) { + return controller.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + } + + /** + * 01.05.2007 If a spell is returned to its owner's hand, it's removed from + * the stack and thus will not resolve. The spell isn't countered; it just no longer exists. + * 01.05.2007 If a copy of a spell is returned to its owner's hand, it's moved there, + * then it will cease to exist as a state-based action. + * 01.05.2007 If Venser's enters-the-battlefield ability targets a spell cast with flashback, + * that spell will be exiled instead of returning to its owner's hand. + */ + + Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + if (spell != null) { + Card card = null; + if (!spell.isCopy()) { + card = spell.getCard(); + } + game.getStack().remove(spell); + if (card != null) { + controller.moveCardToHandWithInfo(card, source.getSourceId(), game, Zone.STACK); + } + return true; + } + + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/Humility.java b/Mage.Sets/src/mage/sets/tempest/Humility.java new file mode 100644 index 00000000000..4396ca8b5a5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/Humility.java @@ -0,0 +1,123 @@ +/* + * 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.tempest; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import static mage.constants.Layer.AbilityAddingRemovingEffects_6; +import static mage.constants.Layer.PTChangingEffects_7; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class Humility extends CardImpl { + + public Humility(UUID ownerId) { + super(ownerId, 236, "Humility", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}"); + this.expansionSetCode = "TMP"; + + this.color.setWhite(true); + + // All creatures lose all abilities and are 1/1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HumilityEffect(Duration.WhileOnBattlefield))); + + } + + public Humility(final Humility card) { + super(card); + } + + @Override + public Humility copy() { + return new Humility(this); + } +} + +class HumilityEffect extends ContinuousEffectImpl { + + public HumilityEffect(Duration duration) { + super(duration, Outcome.LoseAbility); + staticText = "All creatures lose all abilities and are 1/1"; + } + + public HumilityEffect(final HumilityEffect effect) { + super(effect); + } + + @Override + public HumilityEffect copy() { + return new HumilityEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + for (Permanent permanent : game.getState().getBattlefield().getActivePermanents(new FilterCreaturePermanent(), player.getId(), source.getSourceId(), game)) { + switch (layer) { + case AbilityAddingRemovingEffects_6: + permanent.removeAllAbilities(source.getSourceId(), game); + break; + case PTChangingEffects_7: + if (sublayer.equals(SubLayer.SetPT_7b)) { + permanent.getPower().setValue(1); + permanent.getToughness().setValue(1); + } + } + } + return true; + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.PTChangingEffects_7; + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/torment/LlawanCephalidEmpress.java b/Mage.Sets/src/mage/sets/torment/LlawanCephalidEmpress.java index 41791b76343..bea2d3be621 100644 --- a/Mage.Sets/src/mage/sets/torment/LlawanCephalidEmpress.java +++ b/Mage.Sets/src/mage/sets/torment/LlawanCephalidEmpress.java @@ -131,7 +131,7 @@ class LlawanCephalidEmpressReplacementEffect extends ReplacementEffectImpl