From 95699b7e1c522a0631b920a08dbb9e105a8c10e1 Mon Sep 17 00:00:00 2001 From: TGower Date: Wed, 20 May 2015 21:22:44 -0700 Subject: [PATCH 1/4] =?UTF-8?q?Added=20target.setNotTarget(true);=20as=20i?= =?UTF-8?q?t=20is=20a=20choose=20ability=20that=20does=20not=20target=20th?= =?UTF-8?q?e=20opponent.=20Gatherer=20Ruling=209/15/2013=09Akroan=20Horse?= =?UTF-8?q?=E2=80=99s=20enters-the-battlefield=20ability=20doesn=E2=80=99t?= =?UTF-8?q?=20target=20any=20opponent.=20In=20a=20multiplayer=20game,=20yo?= =?UTF-8?q?u=20choose=20the=20opponent=20as=20the=20ability=20resolves.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mage.Sets/src/mage/sets/theros/AkroanHorse.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/theros/AkroanHorse.java b/Mage.Sets/src/mage/sets/theros/AkroanHorse.java index fe4c0b1f05b..014fb58c23a 100644 --- a/Mage.Sets/src/mage/sets/theros/AkroanHorse.java +++ b/Mage.Sets/src/mage/sets/theros/AkroanHorse.java @@ -105,6 +105,7 @@ class AkroanHorseChangeControlEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Target target = new TargetOpponent(); + target.setNotTarget(true); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { if (controller.chooseTarget(outcome, target, source, game)) { From b2d12beb82c6a80d15dfc01fee8ab5b92f8ae539 Mon Sep 17 00:00:00 2001 From: TGower Date: Sun, 24 May 2015 22:49:56 -0700 Subject: [PATCH 2/4] Implemented Primal Beyond --- .../mage/sets/morningtide/PrimalBeyond.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java diff --git a/Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java b/Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java new file mode 100644 index 00000000000..c58aba7dd96 --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java @@ -0,0 +1,121 @@ +/* + * 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.morningtide; + +import java.util.UUID; +import mage.ConditionalMana; +import mage.MageObject; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.condition.Condition; +import mage.abilities.costs.common.RevealTargetFromHandCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.TapSourceUnlessPaysEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.abilities.mana.ConditionalAnyColorManaAbility; +import mage.abilities.mana.builder.ConditionalManaBuilder; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; + +import mage.target.common.TargetCardInHand; + +/** + * + * @author TGower + */ +public class PrimalBeyond extends CardImpl { + + private static final FilterCard filter = new FilterCard("a Elemental card from your hand"); + + static { + filter.add(new SubtypePredicate("Elemental")); + } + + + public PrimalBeyond(UUID ownerId) { + super(ownerId, 149, "Primal Beyond", Rarity.RARE, new CardType[]{CardType.LAND}, ""); + this.expansionSetCode = "MOR"; + + // As Primal Beyond enters the battlefield, you may reveal an Elemental card from your hand. If you don't, Primal Beyond enters the battlefield tapped. + this.addAbility(new AsEntersBattlefieldAbility(new TapSourceUnlessPaysEffect(new RevealTargetFromHandCost(new TargetCardInHand(filter))), "you may reveal a Elemental card from your hand. If you don't, {this} enters the battlefield tapped")); + // {tap}: Add {1} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + // {tap}: Add one mana of any color to your mana pool. Spend this mana only to cast an Elemental spell or activate an ability of an Elemental. + Ability ability = new ConditionalAnyColorManaAbility(new TapSourceCost(), 1, new PrimalBeyondManaBuilder(), true); + this.addAbility(ability); + } + + public PrimalBeyond(final PrimalBeyond card) { + super(card); + } + + @Override + public PrimalBeyond copy() { + return new PrimalBeyond(this); + } +} + + +class PrimalBeyondManaBuilder extends ConditionalManaBuilder { + + @Override + public ConditionalMana build(Object... options) { + return new PrimalBeyondConditionalMana(this.mana); + } + + @Override + public String getRule() { + return "Spend this mana only to cast Elemental spells or activate abilities of Elementals"; + } +} + +class PrimalBeyondConditionalMana extends ConditionalMana { + + public PrimalBeyondConditionalMana(Mana mana) { + super(mana); + this.staticText = "Spend this mana only to cast Elemental spells or activate abilities of Elementals"; + addCondition(new PrimalBeyondManaCondition()); + } +} + +class PrimalBeyondManaCondition implements Condition { + + @Override + public boolean apply(Game game, Ability source) { + MageObject object = game.getObject(source.getSourceId()); + if (object != null && object.hasSubtype("Elemental")) { + return true; + } + return false; + } +} \ No newline at end of file From 10a55716d353007296a8fb576fe70c7f6f942ae2 Mon Sep 17 00:00:00 2001 From: TGower Date: Mon, 25 May 2015 12:56:25 -0700 Subject: [PATCH 3/4] Implemented Mystic Remora --- .../src/mage/sets/iceage/MysticRemora.java | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/iceage/MysticRemora.java diff --git a/Mage.Sets/src/mage/sets/iceage/MysticRemora.java b/Mage.Sets/src/mage/sets/iceage/MysticRemora.java new file mode 100644 index 00000000000..4d9f6ae3efb --- /dev/null +++ b/Mage.Sets/src/mage/sets/iceage/MysticRemora.java @@ -0,0 +1,162 @@ +/* + * 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.iceage; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.CumulativeUpkeepAbility; +import mage.game.stack.Spell; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + + +/** + * + * @author TGower + */ +public class MysticRemora extends CardImpl { + + public MysticRemora(UUID ownerId) { + super(ownerId, 87, "Mystic Remora", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + this.expansionSetCode = "ICE"; + + // Cumulative upkeep {1} + this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{1}"))); + // Whenever an opponent casts a noncreature spell, you may draw a card unless that player pays {4}. + this.addAbility(new MysticRemoraTriggeredAbility()); + + } + + public MysticRemora(final MysticRemora card) { + super(card); + } + + @Override + public MysticRemora copy() { + return new MysticRemora(this); + } +} + +class MysticRemoraTriggeredAbility extends TriggeredAbilityImpl { + + + public MysticRemoraTriggeredAbility() { + super(Zone.BATTLEFIELD, new MysticRemoraEffect(), false); + + } + + public MysticRemoraTriggeredAbility(final MysticRemoraTriggeredAbility ability) { + super(ability); + } + + @Override + public MysticRemoraTriggeredAbility copy() { + return new MysticRemoraTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (game.getOpponents(controllerId).contains(event.getPlayerId())) { + if (event.getType() == GameEvent.EventType.SPELL_CAST) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null && !spell.getCardType().contains(CardType.CREATURE)) { + Player controller = game.getPlayer(game.getControllerId(this.controllerId)); + Player player = game.getPlayer(spell.getControllerId()); + if (controller != player) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); + } + return true; + } + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever an opponent casts a noncreature spell, you may draw a card unless that player pays {4}."; + } +} + + class MysticRemoraEffect extends OneShotEffect { + + public MysticRemoraEffect() { + super(Outcome.DrawCard); + this.staticText = "you may draw a card unless that player pays {4}"; + } + + public MysticRemoraEffect(final MysticRemoraEffect effect) { + super(effect); + } + + @Override + public MysticRemoraEffect copy() { + return new MysticRemoraEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player opponent = game.getPlayer(targetPointer.getFirst(game, source)); + MageObject sourceObject = source.getSourceObject(game); + if (controller != null && opponent != null && sourceObject != null) { + Cost cost = new GenericManaCost(4); + String message = "Would you like to pay {4} to prevent the opponent to draw a card?"; + if (!(opponent.chooseUse(Outcome.Benefit, message, game) && cost.pay(source, game, source.getSourceId(), opponent.getId(), false))) { + if(controller.chooseUse(Outcome.DrawCard, "Draw a card (" + sourceObject.getLogName() +")", game)) { + controller.drawCards(1, game); + } + } + return true; + } + return false; + } + +} + + + + From 19f6148c6dafbee1550b284a384a1bb9b35a7e97 Mon Sep 17 00:00:00 2001 From: TGower Date: Mon, 25 May 2015 12:57:41 -0700 Subject: [PATCH 4/4] Implemented Mystic Remora --- .../sets/mastersedition/MysticRemora.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/mastersedition/MysticRemora.java diff --git a/Mage.Sets/src/mage/sets/mastersedition/MysticRemora.java b/Mage.Sets/src/mage/sets/mastersedition/MysticRemora.java new file mode 100644 index 00000000000..8d8ecb153fd --- /dev/null +++ b/Mage.Sets/src/mage/sets/mastersedition/MysticRemora.java @@ -0,0 +1,54 @@ +/* + * 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.mastersedition; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author TGower + */ +public class MysticRemora extends mage.sets.iceage.MysticRemora { + + public MysticRemora(UUID ownerId) { + super(ownerId); + this.cardNumber = 42; + this.expansionSetCode = "MED"; + this.rarity = Rarity.UNCOMMON; + } + + public MysticRemora(final MysticRemora card) { + super(card); + } + + @Override + public MysticRemora copy() { + return new MysticRemora(this); + } +}