From 3a52ce609d9e3f2f0c1d9f7c2ad2d436110839d8 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Thu, 10 Aug 2017 00:13:36 -0400 Subject: [PATCH 1/9] Implemented Carrion, Cephalid Pathmage, Cephalid Inkshrouder and Ceremonial Guard (#3793) * Implement Epicenter * Implement Infested Roothold * Implement Brown Ouphe * Implement Rust * Implement Ouphe Vandals * Implement Fatal Attraction * Implement Fighting Chance * Implement Arcbound Fiend * Implement Carry Away * Implement Caverns of Despair * Implement Amulet of Unmaking * Implement Aphetto Exterminator * Implement Balduvian Conjurer, Barrin's Unmaking, Each Mana Battery, Blood Hound and Boa Constrictor * Implement Bola Warrior, Brass Talon Chimera, Briar Patch and Brine Shaman * Implemented Call to Arms, Goham Djinn, Halam Djinn, Ruham Djinn, Sulam Djinn, Zanam Djinn, Heroic Defiance and Tsabo's Assassin, updated Barrin's Unmaking and Epicenter * Implement Brown Ouphe * Implemented Break Open * Implemented Carrion * Implemented Cephalid Pathmage * Implemented Cephalid Inkshrouder * Implemented Ceremonial Guard --- Mage.Sets/src/mage/cards/b/BreakOpen.java | 103 ++++++++++++++++++ Mage.Sets/src/mage/cards/c/Carrion.java | 65 +++++++++++ .../src/mage/cards/c/CephalidInkshrouder.java | 71 ++++++++++++ .../src/mage/cards/c/CephalidPathmage.java | 77 +++++++++++++ .../src/mage/cards/c/CeremonialGuard.java | 69 ++++++++++++ Mage.Sets/src/mage/sets/IceAge.java | 8 +- Mage.Sets/src/mage/sets/Judgment.java | 1 + Mage.Sets/src/mage/sets/Legions.java | 1 + Mage.Sets/src/mage/sets/MercadianMasques.java | 1 + Mage.Sets/src/mage/sets/Mirage.java | 1 + Mage.Sets/src/mage/sets/Onslaught.java | 1 + .../token/CarrionBlackInsectToken.java | 47 ++++++++ .../token/NestOfScarabsBlackInsectToken.java | 2 +- 13 files changed, 442 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/b/BreakOpen.java create mode 100644 Mage.Sets/src/mage/cards/c/Carrion.java create mode 100644 Mage.Sets/src/mage/cards/c/CephalidInkshrouder.java create mode 100644 Mage.Sets/src/mage/cards/c/CephalidPathmage.java create mode 100644 Mage.Sets/src/mage/cards/c/CeremonialGuard.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/CarrionBlackInsectToken.java diff --git a/Mage.Sets/src/mage/cards/b/BreakOpen.java b/Mage.Sets/src/mage/cards/b/BreakOpen.java new file mode 100644 index 00000000000..44cda67427b --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BreakOpen.java @@ -0,0 +1,103 @@ +/* + * 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.cards.b; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.other.FaceDownPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class BreakOpen extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Face-down creature an opponent controls"); + + static { + filter.add(new FaceDownPredicate()); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public BreakOpen(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + + // Turn target face-down creature an opponent controls face up. + this.getSpellAbility().addEffect(new TurnFaceUpTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public BreakOpen(final BreakOpen card) { + super(card); + } + + @Override + public BreakOpen copy() { + return new BreakOpen(this); + } +} + +class TurnFaceUpTargetEffect extends OneShotEffect { + + public TurnFaceUpTargetEffect() { + super(Outcome.Benefit); + this.staticText = "Turn target face-down creature an opponen controls face up."; + } + + public TurnFaceUpTargetEffect(final TurnFaceUpTargetEffect effect) { + super(effect); + } + + @Override + public TurnFaceUpTargetEffect copy() { + return new TurnFaceUpTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + UUID target = targetPointer.getFirst(game, source); + if (target != null) { + Permanent permanent = game.getPermanent(target); + if (permanent != null) { + return permanent.turnFaceUp(game, source.getControllerId()); + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/Carrion.java b/Mage.Sets/src/mage/cards/c/Carrion.java new file mode 100644 index 00000000000..36707992bd3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Carrion.java @@ -0,0 +1,65 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.permanent.token.CarrionBlackInsectToken; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class Carrion extends CardImpl { + + public Carrion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}{B}"); + + // As an additional cost to cast Carrion, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("a creature"), false))); + + // Put X 0/1 black Insect creature tokens onto the battlefield, where X is the sacrificed creature's power. + this.getSpellAbility().addEffect(new CreateTokenEffect(new CarrionBlackInsectToken(), new SacrificeCostCreaturesPower())); + } + + public Carrion(final Carrion card) { + super(card); + } + + @Override + public Carrion copy() { + return new Carrion(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CephalidInkshrouder.java b/Mage.Sets/src/mage/cards/c/CephalidInkshrouder.java new file mode 100644 index 00000000000..8f2c4260edd --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CephalidInkshrouder.java @@ -0,0 +1,71 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public class CephalidInkshrouder extends CardImpl { + + public CephalidInkshrouder(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add("Cephalid"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Discard a card: Cephalid Inkshrouder gains shroud until end of turn and is unblockable this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(ShroudAbility.getInstance(),Duration.EndOfTurn), new DiscardCardCost()); + ability.addEffect(new CantBeBlockedSourceEffect(Duration.EndOfTurn)); + this.addAbility(ability); + } + + public CephalidInkshrouder(final CephalidInkshrouder card) { + super(card); + } + + @Override + public CephalidInkshrouder copy() { + return new CephalidInkshrouder(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CephalidPathmage.java b/Mage.Sets/src/mage/cards/c/CephalidPathmage.java new file mode 100644 index 00000000000..7dfd9e2ebc5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CephalidPathmage.java @@ -0,0 +1,77 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; +import mage.abilities.keyword.CantBeBlockedSourceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class CephalidPathmage extends CardImpl { + + public CephalidPathmage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add("Cephalid"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Cephalid Pathmage is unblockable. + this.addAbility(new CantBeBlockedSourceAbility()); + + // {tap}, Sacrifice Cephalid Pathmage: Target creature is unblockable this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(Duration.EndOfTurn), new SacrificeSourceCost()); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public CephalidPathmage(final CephalidPathmage card) { + super(card); + } + + @Override + public CephalidPathmage copy() { + return new CephalidPathmage(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CeremonialGuard.java b/Mage.Sets/src/mage/cards/c/CeremonialGuard.java new file mode 100644 index 00000000000..11ebeef6d60 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CeremonialGuard.java @@ -0,0 +1,69 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksOrBlocksTriggeredAbility; +import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DestroySourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public class CeremonialGuard extends CardImpl { + + public CeremonialGuard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add("Human"); + this.subtype.add("Soldier"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // When Ceremonial Guard attacks or blocks, destroy it at end of combat. + this.addAbility(new AttacksOrBlocksTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheEndOfCombatDelayedTriggeredAbility(new DestroySourceEffect())), + false)); + } + + public CeremonialGuard(final CeremonialGuard card) { + super(card); + } + + @Override + public CeremonialGuard copy() { + return new CeremonialGuard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index d63d6a81410..e8f9e590ce0 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -64,7 +64,7 @@ public class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Aurochs", 113, Rarity.COMMON, mage.cards.a.Aurochs.class)); cards.add(new SetCardInfo("Balduvian Barbarians", 172, Rarity.COMMON, mage.cards.b.BalduvianBarbarians.class)); cards.add(new SetCardInfo("Balduvian Bears", 114, Rarity.COMMON, mage.cards.b.BalduvianBears.class)); - cards.add(new SetCardInfo("Balduvian Conjurer", 58, Rarity.UNCOMMON, mage.cards.b.BalduvianConjurer.class)); + cards.add(new SetCardInfo("Balduvian Conjurer", 58, Rarity.UNCOMMON, mage.cards.b.BalduvianConjurer.class)); cards.add(new SetCardInfo("Balduvian Hydra", 173, Rarity.RARE, mage.cards.b.BalduvianHydra.class)); cards.add(new SetCardInfo("Barbed Sextant", 287, Rarity.COMMON, mage.cards.b.BarbedSextant.class)); cards.add(new SetCardInfo("Battle Frenzy", 175, Rarity.COMMON, mage.cards.b.BattleFrenzy.class)); @@ -75,11 +75,11 @@ public class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Blue Scarab", 233, Rarity.UNCOMMON, mage.cards.b.BlueScarab.class)); cards.add(new SetCardInfo("Brainstorm", 61, Rarity.COMMON, mage.cards.b.Brainstorm.class)); cards.add(new SetCardInfo("Brand of Ill Omen", 177, Rarity.RARE, mage.cards.b.BrandOfIllOmen.class)); - cards.add(new SetCardInfo("Brine Shaman", 3, Rarity.COMMON, mage.cards.b.BrineShaman.class)); - cards.add(new SetCardInfo("Brown Ouphe", 116, Rarity.COMMON, mage.cards.b.BrownOuphe.class)); + cards.add(new SetCardInfo("Brine Shaman", 3, Rarity.COMMON, mage.cards.b.BrineShaman.class)); + cards.add(new SetCardInfo("Brown Ouphe", 116, Rarity.COMMON, mage.cards.b.BrownOuphe.class)); cards.add(new SetCardInfo("Brushland", 327, Rarity.RARE, mage.cards.b.Brushland.class)); cards.add(new SetCardInfo("Burnt Offering", 4, Rarity.COMMON, mage.cards.b.BurntOffering.class)); - cards.add(new SetCardInfo("Call to Arms", 234, Rarity.RARE, mage.cards.c.CallToArms.class)); + cards.add(new SetCardInfo("Call to Arms", 234, Rarity.RARE, mage.cards.c.CallToArms.class)); cards.add(new SetCardInfo("Caribou Range", 235, Rarity.RARE, mage.cards.c.CaribouRange.class)); cards.add(new SetCardInfo("Celestial Sword", 289, Rarity.RARE, mage.cards.c.CelestialSword.class)); cards.add(new SetCardInfo("Centaur Archer", 360, Rarity.UNCOMMON, mage.cards.c.CentaurArcher.class)); diff --git a/Mage.Sets/src/mage/sets/Judgment.java b/Mage.Sets/src/mage/sets/Judgment.java index b1cb49a0261..7443e32904e 100644 --- a/Mage.Sets/src/mage/sets/Judgment.java +++ b/Mage.Sets/src/mage/sets/Judgment.java @@ -78,6 +78,7 @@ public class Judgment extends ExpansionSet { cards.add(new SetCardInfo("Canopy Claws", 108, Rarity.COMMON, mage.cards.c.CanopyClaws.class)); cards.add(new SetCardInfo("Centaur Rootcaster", 109, Rarity.COMMON, mage.cards.c.CentaurRootcaster.class)); cards.add(new SetCardInfo("Cephalid Constable", 35, Rarity.RARE, mage.cards.c.CephalidConstable.class)); + cards.add(new SetCardInfo("Cephalid Inkshrouder", 36, Rarity.UNCOMMON, mage.cards.c.CephalidInkshrouder.class)); cards.add(new SetCardInfo("Chastise", 8, Rarity.UNCOMMON, mage.cards.c.Chastise.class)); cards.add(new SetCardInfo("Commander Eesha", 9, Rarity.RARE, mage.cards.c.CommanderEesha.class)); cards.add(new SetCardInfo("Crush of Wurms", 110, Rarity.RARE, mage.cards.c.CrushOfWurms.class)); diff --git a/Mage.Sets/src/mage/sets/Legions.java b/Mage.Sets/src/mage/sets/Legions.java index 47c63b27e47..ca0b546f054 100644 --- a/Mage.Sets/src/mage/sets/Legions.java +++ b/Mage.Sets/src/mage/sets/Legions.java @@ -69,6 +69,7 @@ public class Legions extends ExpansionSet { cards.add(new SetCardInfo("Brood Sliver", 120, Rarity.RARE, mage.cards.b.BroodSliver.class)); cards.add(new SetCardInfo("Caller of the Claw", 121, Rarity.RARE, mage.cards.c.CallerOfTheClaw.class)); cards.add(new SetCardInfo("Canopy Crawler", 122, Rarity.UNCOMMON, mage.cards.c.CanopyCrawler.class)); + cards.add(new SetCardInfo("Cephalid Pathmage", 31, Rarity.COMMON, mage.cards.c.CephalidPathmage.class)); cards.add(new SetCardInfo("Chromeshell Crab", 32, Rarity.RARE, mage.cards.c.ChromeshellCrab.class)); cards.add(new SetCardInfo("Clickslither", 90, Rarity.RARE, mage.cards.c.Clickslither.class)); cards.add(new SetCardInfo("Cloudreach Cavalry", 7, Rarity.UNCOMMON, mage.cards.c.CloudreachCavalry.class)); diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java index ee14c79b3bb..25b51eb5dab 100644 --- a/Mage.Sets/src/mage/sets/MercadianMasques.java +++ b/Mage.Sets/src/mage/sets/MercadianMasques.java @@ -87,6 +87,7 @@ public class MercadianMasques extends ExpansionSet { cards.add(new SetCardInfo("Cave-In", 180, Rarity.RARE, mage.cards.c.CaveIn.class)); cards.add(new SetCardInfo("Cavern Crawler", 181, Rarity.COMMON, mage.cards.c.CavernCrawler.class)); cards.add(new SetCardInfo("Cave Sense", 179, Rarity.COMMON, mage.cards.c.CaveSense.class)); + cards.add(new SetCardInfo("Ceremonial Guard", 182, Rarity.COMMON, mage.cards.c.CeremonialGuard.class)); cards.add(new SetCardInfo("Chambered Nautilus", 64, Rarity.UNCOMMON, mage.cards.c.ChamberedNautilus.class)); cards.add(new SetCardInfo("Charisma", 66, Rarity.RARE, mage.cards.c.Charisma.class)); cards.add(new SetCardInfo("Cho-Arrim Alchemist", 8, Rarity.RARE, mage.cards.c.ChoArrimAlchemist.class)); diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java index 72418f8f492..255d8661b96 100644 --- a/Mage.Sets/src/mage/sets/Mirage.java +++ b/Mage.Sets/src/mage/sets/Mirage.java @@ -82,6 +82,7 @@ public class Mirage extends ExpansionSet { cards.add(new SetCardInfo("Cadaverous Bloom", 318, Rarity.RARE, mage.cards.c.CadaverousBloom.class)); cards.add(new SetCardInfo("Cadaverous Knight", 8, Rarity.COMMON, mage.cards.c.CadaverousKnight.class)); cards.add(new SetCardInfo("Canopy Dragon", 107, Rarity.RARE, mage.cards.c.CanopyDragon.class)); + cards.add(new SetCardInfo("Carrion", 9, Rarity.RARE, mage.cards.c.Carrion.class)); cards.add(new SetCardInfo("Celestial Dawn", 210, Rarity.RARE, mage.cards.c.CelestialDawn.class)); cards.add(new SetCardInfo("Cerulean Wyvern", 57, Rarity.UNCOMMON, mage.cards.c.CeruleanWyvern.class)); cards.add(new SetCardInfo("Chaos Charm", 163, Rarity.COMMON, mage.cards.c.ChaosCharm.class)); diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 5339c73962e..3437ea31a94 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -56,6 +56,7 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Bloodline Shaman", 249, Rarity.UNCOMMON, mage.cards.b.BloodlineShaman.class)); cards.add(new SetCardInfo("Bloodstained Mire", 313, Rarity.RARE, mage.cards.b.BloodstainedMire.class, new CardGraphicInfo(new ObjectColor("RB"), null,false))); cards.add(new SetCardInfo("Boneknitter", 128, Rarity.UNCOMMON, mage.cards.b.Boneknitter.class)); + cards.add(new SetCardInfo("Break Open", 190, Rarity.COMMON, mage.cards.b.BreakOpen.class)); cards.add(new SetCardInfo("Brightstone Ritual", 191, Rarity.COMMON, mage.cards.b.BrightstoneRitual.class)); cards.add(new SetCardInfo("Broodhatch Nantuko", 250, Rarity.UNCOMMON, mage.cards.b.BroodhatchNantuko.class)); cards.add(new SetCardInfo("Cabal Archon", 129, Rarity.UNCOMMON, mage.cards.c.CabalArchon.class)); diff --git a/Mage/src/main/java/mage/game/permanent/token/CarrionBlackInsectToken.java b/Mage/src/main/java/mage/game/permanent/token/CarrionBlackInsectToken.java new file mode 100644 index 00000000000..764b99070a2 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/CarrionBlackInsectToken.java @@ -0,0 +1,47 @@ +/* +* 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.game.permanent.token; +import mage.constants.CardType; +import mage.MageInt; + +/** + * + * @author TheElk801 + */ +public class CarrionBlackInsectToken extends Token { + + public CarrionBlackInsectToken() { + super("Insect", "0/1 black Insect creature token"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add("Insect"); + power = new MageInt(0); + toughness = new MageInt(1); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/NestOfScarabsBlackInsectToken.java b/Mage/src/main/java/mage/game/permanent/token/NestOfScarabsBlackInsectToken.java index 8434fa6d65b..565e0863049 100644 --- a/Mage/src/main/java/mage/game/permanent/token/NestOfScarabsBlackInsectToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/NestOfScarabsBlackInsectToken.java @@ -37,7 +37,7 @@ import mage.MageInt; public class NestOfScarabsBlackInsectToken extends Token { public NestOfScarabsBlackInsectToken() { - super("Insect", "1/1 black Insect token"); + super("Insect", "1/1 black Insect creature token"); cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add("Insect"); From a3e7aa62302481037d8ec8b52c345da764b6d653 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 10 Aug 2017 07:04:32 +0200 Subject: [PATCH 2/9] * Karn Liberated - fixed that after using its -14 ability the game does not properly set the starting player of the new game (fixes #3786). --- Mage.Sets/src/mage/cards/k/KarnLiberated.java | 1 + Mage/src/main/java/mage/game/Game.java | 2 + Mage/src/main/java/mage/game/GameImpl.java | 83 +++++++++++-------- 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/Mage.Sets/src/mage/cards/k/KarnLiberated.java b/Mage.Sets/src/mage/cards/k/KarnLiberated.java index 6d7c6867f39..e0a35d5bd66 100644 --- a/Mage.Sets/src/mage/cards/k/KarnLiberated.java +++ b/Mage.Sets/src/mage/cards/k/KarnLiberated.java @@ -157,6 +157,7 @@ class KarnLiberatedEffect extends OneShotEffect { } } game.addDelayedTriggeredAbility(new KarnLiberatedDelayedTriggeredAbility(exileId), source); + game.setStartingPlayerId(source.getControllerId()); game.start(null); return true; } diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index 87040399b57..9ac4302df8e 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -442,6 +442,8 @@ public interface Game extends MageItem, Serializable { UUID getStartingPlayerId(); + void setStartingPlayerId(UUID startingPlayerId); + void saveRollBackGameState(); boolean canRollbackTurns(int turnsToRollback); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 41d2996498a..7f4f936bba3 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -27,6 +27,10 @@ */ package mage.game; +import java.io.IOException; +import java.io.Serializable; +import java.util.*; +import java.util.Map.Entry; import mage.MageException; import mage.MageObject; import mage.abilities.*; @@ -92,11 +96,6 @@ import mage.watchers.Watchers; import mage.watchers.common.*; import org.apache.log4j.Logger; -import java.io.IOException; -import java.io.Serializable; -import java.util.*; -import java.util.Map.Entry; - public abstract class GameImpl implements Game, Serializable { private static final int ROLLBACK_TURNS_MAX = 4; @@ -855,31 +854,33 @@ public abstract class GameImpl implements Game, Serializable { } //20091005 - 103.2 - TargetPlayer targetPlayer = new TargetPlayer(); - targetPlayer.setTargetName("starting player"); Player choosingPlayer = null; - if (choosingPlayerId != null) { - choosingPlayer = this.getPlayer(choosingPlayerId); - if (choosingPlayer != null && !choosingPlayer.isInGame()) { - choosingPlayer = null; + if (startingPlayerId == null) { + TargetPlayer targetPlayer = new TargetPlayer(); + targetPlayer.setTargetName("starting player"); + if (choosingPlayerId != null) { + choosingPlayer = this.getPlayer(choosingPlayerId); + if (choosingPlayer != null && !choosingPlayer.isInGame()) { + choosingPlayer = null; + } } - } - if (choosingPlayer == null) { - choosingPlayerId = pickChoosingPlayer(); - if (choosingPlayerId == null) { + if (choosingPlayer == null) { + choosingPlayerId = pickChoosingPlayer(); + if (choosingPlayerId == null) { + return; + } + choosingPlayer = getPlayer(choosingPlayerId); + } + if (choosingPlayer == null) { + return; + } + getState().setChoosingPlayerId(choosingPlayerId); // needed to start/stop the timer if active + if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, null, this)) { + startingPlayerId = targetPlayer.getTargets().get(0); + } else if (getState().getPlayers().size() < 3) { + // not possible to choose starting player, choosing player has probably conceded, so stop here return; } - choosingPlayer = getPlayer(choosingPlayerId); - } - if (choosingPlayer == null) { - return; - } - getState().setChoosingPlayerId(choosingPlayerId); // needed to start/stop the timer if active - if (choosingPlayer.choose(Outcome.Benefit, targetPlayer, null, this)) { - startingPlayerId = targetPlayer.getTargets().get(0); - } else if (getState().getPlayers().size() < 3) { - // not possible to choose starting player, choosing player has probably conceded, so stop here - return; } if (startingPlayerId == null) { // choose any available player as starting player @@ -898,15 +899,7 @@ public abstract class GameImpl implements Game, Serializable { logger.debug("Starting player not found. playerId:" + startingPlayerId); return; } - StringBuilder message = new StringBuilder(choosingPlayer.getLogName()).append(" chooses that "); - if (choosingPlayer.getId().equals(startingPlayerId)) { - message.append("he or she"); - } else { - message.append(startingPlayer.getLogName()); - } - message.append(" takes the first turn"); - - this.informPlayers(message.toString()); + sendStartMessage(choosingPlayer, startingPlayer); //20091005 - 103.3 int startingHandSize = 7; @@ -1019,6 +1012,21 @@ public abstract class GameImpl implements Game, Serializable { } + protected void sendStartMessage(Player choosingPlayer, Player startingPlayer) { + StringBuilder message = new StringBuilder(); + if (choosingPlayer != null) { + message.append(choosingPlayer.getLogName()).append(" chooses that "); + } + if (choosingPlayer != null && choosingPlayer.getId().equals(startingPlayer.getId())) { + message.append("he or she"); + } else { + message.append(startingPlayer.getLogName()); + } + message.append(" takes the first turn"); + + this.informPlayers(message.toString()); + } + protected UUID findWinnersAndLosers() { UUID winnerIdFound = null; for (Player player : state.getPlayers().values()) { @@ -2834,6 +2842,11 @@ public abstract class GameImpl implements Game, Serializable { return startingPlayerId; } + @Override + public void setStartingPlayerId(UUID startingPlayerId) { + this.startingPlayerId = startingPlayerId; + } + @Override public int getLife() { return startLife; From 127f8d2b963c2f195601de1a6a81ba74b3417a8d Mon Sep 17 00:00:00 2001 From: spjspj Date: Thu, 10 Aug 2017 20:52:49 +1000 Subject: [PATCH 3/9] C17 spoilers (201708) --- Utils/mtg-cards-data.txt | 53 ++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 22b29c48675..d0ef58e3cbe 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31684,32 +31684,49 @@ Forest|Planechase Anthology|153|L||Basic Land - Forest|||| Forest|Planechase Anthology|154|L||Basic Land - Forest|||| Forest|Planechase Anthology|155|L||Basic Land - Forest|||| Forest|Planechase Anthology|156|L||Basic Land - Forest|||| -The Ur-Dragon|Commander 2017|48|M|{4}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Avatar|10|10|Eminence - As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast.$Flying$Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield| -O-Kagachi, Vengeful Kami|Commander 2017|45|M|{1}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Spirit|6|6|Flying, Trample$Whenever O-Kagachi, Vengeful Kami deals combat damage to a player, if that player attacked you during his or her last turn, exile target nonland permanent that player controls| +Alms Collector|Commander 2017|1|R|{3}{W}|Creature - Cat Cleric|3|4|Flash$If an opponent would draw two or more cards, instead you and that player each draw a card.| Arahbo, Roar of the World|Commander 2017|35|M|{3}{G}{W}|Legendary Creature - Cat Avatar|5|5|Eminence — At the beginning of combat on your turn, if Arahbo, Roar of the World is in the command zone or on the battlefield, another target Cat you control gets +3/+3 until end of turn.$Whenever another Cat you control attacks, you may pay {1}{G}{W}. If you do, it gains trample and gets +X/+X until end of turn, where X is its power.| -Taigam, Ojutai Master|Commander 2017|46|R|{2}{W}{U}|Legendary Creature - Human Monk|3|4|Instant, sorcery, and Dragon spells you control can't be countered by spells or abilities.$Whenever you cast an instant or sorcery spell from your hand, if Taigam, Ojutai Master attacked this turn, that spell gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)| -Wasitora, Nekoru Queen|Commander 2017|49|M|{2}{B}{R}{G}|Legendary Creature - Cat Dragon|5|4|Flying, trample$Whenever Wasitora, Nekoru Queen deals combat damage to a player, that player sacrifices a creature. If the player can't, you create a 3/3 black, red, and green Cat Dragon creature token with flying| -Ramos, Dragon Engine|Commander 2017|55|M|{6}|Legendary Artifact Creature - Dragon|4|4|Flying$Whenever you cast a spell, put a +1/+1 counter on Ramos, Dragon Engine for each of that spell's colors. Remove five +1/+1 counters from Ramos: Add {W}{W}{U}{U}{B}{B}{R}{R}{G}{G} to your mana pool. Activate this ability only once each turn.| +Balan, Wandering Knight|Commander 2017|2|R|{2}{W}{W}|Legendary Creature - Cat Knight|3|3|First strike$Balan, Wandering Knight has double strike as long as two or more Equipment are attached to it.$1W: Attach all Equipment you control to Balan.| +Bloodforged War Axe|Commander 2017|50|R|{1}|Artifact - Equipment|||Equipped creature gets +2/+0.$Whenever equipped creature deals combat damage to a player, create a token that's a copy of Bloodforged War Axe.$Equip 2| +Bloodline Necromancer|Commander 2017|14|U|{4}{B}|Creature - Vampire Wizard|3|2|Lifelink$When Bloodline Necromancer enters the battlefield, you may return target Vampire or Wizard creature card from your graveyard to the battlefield.| +Bloodsworn Steward|Commander 2017|22|R|{2}{R}{R}|Creature - Vampire Knight|4|4|Flying$Commander creatures you control get +2/+2 and have haste.| +Boneyard Scourge|Commander 2017|15|R|{2}{B}{B}|Creature - Zombie Dragon|4|3|Flying$Whenever a Dragon you control dies while Boneyard Scourge is in your graveyard, you may pay 1B. If you do, return Boneyard Scourge from your graveyard to the battlefield.| +Crimson Honor Guard|Commander 2017|23|R|{3}{R}{R}|Creature - Vampire Knight|4|5|Trample$At the beginning of each player's end step, Crimson Honor Guard deals 4 damage to that player unless he or she controls a commander.| +Curse of Bounty|Commander 2017|30|U|{1}{G}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player is attacked, untap all nonland permanents you control. Each opponent attacking that player untaps all nonland permanents he or she controls.| +Curse of Disturbance|Commander 2017|16|U|{2}{B}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player is attacked, create a 2/2 black Zombie creature token. Each opponent attacking that player does the same.| +Curse of Opulence|Commander 2017|24|U|{R}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player is attacked, create a colorless artifact token named Gold. It has "sacrifice this artifact: Add one mana of any color to your mana pool." Each opponent attacking that player does the same.| +Curse of Verbosity|Commander 2017|9|U|{2}{U}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player is attacked, draw a card. Each opponent attacking that player does the same.| +Curse of Vitality|Commander 2017|3|U|{2}{W}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player is attacked, you gain 2 life. Each opponent attacking that player does the same.| +Disrupt Decorum|Commander 2017|25|R|{2}{R}{R}|Sorcery|||Goad all creatures you don't control.$(Until your next turn, those creatures attack each combat if able and attack a player other than you if able.)| +Edgar Markov|Commander 2017|36|M|{3}{R}{W}{B}|Legendary Creature - Vampire Knight|4|4|Eminence - Whenever you cast another Vampire spell, if Edgar Markov is in the command zone or on the battlefield, create a 1/1 black Vampire creature token.$First strike, haste$Whenever Edgar Markov attacks, put a +1/+1 counter on each Vampire you control.| +Fortunate Few|Commander 2017|4|R|{3}{W}{W}|Sorcery|||Choose a nonland permanent you don't control, then each other player chooses a nonland permanent he or she doesn't control that hasn't been chosen this way. Destroy all other nonland permanents.| +Fractured Identity|Commander 2017|37|R|{3}{W}{U}|Sorcery|||Exile target nonland permanent. Each player other than its controller creates a token that's a copy of it.| +Hammer of Nazahn|Commander 2017|51|R|{4}|Legendary Artifact - Equipment|||Whenever Hammer of Nazahn or another Equipment enters the battlefield under your control, you may attach that Equipment to target creature you control.$Equipped creature gets +2/+0 and has indestructible.$Equip 4| +Heirloom Blade|Commander 2017|52|U|{3}|Artifact - Equipment|||Equipped creature gets +3/+1.$Whenever equipped creature dies, you may reveal cards from the top of your library until you reveal a creature card that shares a creature type with it. Put that card into your hand and the rest on the bottom of your library in a random order.$Equip 1| +Herald's Horn|Commander 2017|53|U|{3}|Artifact|||When Herald's Horn enters the battlefield, choose a creature type.$Creature spells you cast of the chosen type cost 1 less.$At the beginning of your upkeep, look at the top card of your library. If it's a creature card of the chosen type, you may reveal it and put it into your hand.| +Hungry Lynx|Commander 2017|31|R|{1}{G}|Creature - Cat|2|2|Cats you control have protection from Rats. (They can't be blocked, targeted, or dealt damage by Rats.)$At the beginning of your end step, target opponent creates a 1/1 black Rat creature token with deathtouch.$Whenever a Rat dies, put a +1/+1 counter on each Cat you control.| +Inalla, Archmage Ritualist|Commander 2017|??|M|{2}{U}{B}{R}|Legendary Creature - Human Wizard|4|5|Eminence - Whenever another nontoken Wizard enters the battlefield under your control, if Inalla, Archmage Ritualist is in the command zone or on the battlefield, you may pay {1}. If you do, create a token that's a copy of that Wizard. The token gains haste. Exile it at the beginning of the next end step.$Tap five untapped Wizards you control: Target player loses 7 life.| +Kheru Mind-Eater|Commander 2017|17|R|{2}{B}|Creature - Vampire|1|3|Menace$Whenever Kheru Mind-Eater deals combat damage to a player, that player exiles a card from his or her hand face down.$You may look at and play cards exiled with Kheru Mind-Eater.| +Kindred Charge|Commander 2017|27|R|{4}{R}{R}|Sorcery|||Choose a creature type. For each creature you control of the chosen type, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step.| +Kindred Discovery|Commander 2017|11|R|{3}{U}{U}|Enchantment|||As Kindred Discovery enters the battlefield, choose a creature type.$Whenever a creature you control of the chose type enters the battlefield or attacks, draw a card.| Licia, Sanguine Tribune|Commander 2017|40|M|{5}{R}{W}{B}|Legendary Creature - Vampire Soldier|4|4|Licia, Sanguine Tribune costs 1 less to cast for each 1 life you gained this turn.$First strike, lifelink$Pay 5 life: Put three +1/+1 counters on Licia. Activate this ability only on your turn and only once each turn.| +Mathas, Fiend Seeker|Commander 2017|42|M|{R}{W}{B}|Legendary Creature - Vampire|3|3|Menace$At the beginning of your end step, put a bounty counter on target creature an opponent controls. For as long as that creature has a bounty counter on it, it has "When this creature dies, each opponent draws a card and gains 2 life."| Mirri, Weatherlight Duelist|Commander 2017|43|M|{1}{G}{W}|Legendary Creature - Cat Warrior|3|2|First Strike$Whenever Mirri, Weatherlight Duelist attacks, each opponent can't block with more than one creature this combat.$As long as Mirri, Weatherlight Duelist is tapped, no more than one creature can attack you each combat.| Nazahn, Revered Bladesmith|Commander 2017|44|M|{4}{G}{W}|Legendary Creature - Cat Artificer|5|4|When Nazahn, Revered Bladesmith enters the battlefield, search your library for an Equipment card and reveal it. If you reveal a card named Hammer of Nazahn this way, put it onto the battlefield. Otherwise, put that card into your hand. Then shuffle your library.$Whenever an equipped creature you control attacks, you may tap target creature defending player controls.| -Bloodforged War Axe|Commander 2017|50|R|{1}|Artifact - Equipment|||Equipped creature gets +2/+0.$Whenever equipped creature deals combat damage to a player, create a token that's a copy of Bloodforged War Axe.$Equip 2| -Hammer of Nazahn|Commander 2017|51|R|{4}|Legendary Artifact - Equipment|||Whenever Hammer of Nazahn or another Equipment enters the battlefield under your control, you may attach that Equipment to target creature you control.$Equipped creature gets +2/+0 and has indestructible.$Equip 4| -Herald's Horn|Commander 2017|53|U|{3}|Artifact|||When Herald's Horn enters the battlefield, choose a creature type.$Creature spells you cast of the chosen type cost 1 less.$At the beginning of your upkeep, look at the top card of your library. If it's a creature card of the chosen type, you may reveal it and put it into your hand.| -Fractured Identity|Commander 2017|37|R|{3}{W}{U}|Sorcery|||Exile target nonland permanent. Each player other than its controller creates a token that's a copy of it.| +New Blood|Commander 2017|19|R|{2}{B}{B}|Sorcery|||As an additional cost to cast New Blood, tap an untapped Vampire you control.$Gain control of target creature. Change the text of that creature by replacing all instances of one creature type with Vampire.| +O-Kagachi, Vengeful Kami|Commander 2017|45|M|{1}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Spirit|6|6|Flying, Trample$Whenever O-Kagachi, Vengeful Kami deals combat damage to a player, if that player attacked you during his or her last turn, exile target nonland permanent that player controls| Path of Ancestry|Commander 2017|56|C||Land|||Path of Ancestry enters the battlefield tapped.$T: Add to your mana pool one mana of any color in your commander's color identity. When that mana is spent to cast a creature spell that shares a creature type with your commander, scry 1.| -Fortunate Few|Commander 2017|4|R|{3}{W}{W}|Sorcery|||Choose a nonland permanent you don't control, then each other player chooses a nonland permanent he or she doesn't control that hasn't been chosen this way. Destroy all other nonland permanents.| +Patron of the Vein|Commander 2017|20|R|{4}{B}{B}|Creature - Vampire Shaman|4|4|Flying$When Patron of the Vein enters the battlefield, destroy target creature an opponent controls.$Whenever a creature an opponent controls dies, exile it and put a +1/+1 counter on each Vampire you control.| +Ramos, Dragon Engine|Commander 2017|55|M|{6}|Legendary Artifact Creature - Dragon|4|4|Flying$Whenever you cast a spell, put a +1/+1 counter on Ramos, Dragon Engine for each of that spell's colors. Remove five +1/+1 counters from Ramos: Add {W}{W}{U}{U}{B}{B}{R}{R}{G}{G} to your mana pool. Activate this ability only once each turn.| Scalelord Reckoner|Commander 2017|??|R|{5}{W}{W}|Creature - Dragon|4|4|Flying$Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, destroy target nonland permanent that player controls.| -Alms Collector|Commander 2017|1|R|{3}{W}|Creature - Cat Cleric|3|4|Flash$If an opponent would draw two or more cards, instead you and that player each draw a card.| -Balan, Wandering Knight|Commander 2017|2|R|{2}{W}{W}|Legendary Creature - Cat Knight|3|3|First strike$Balan, Wandering Knight has double strike as long as two or more Equipment are attached to it.$1W: Attach all Equipment you control to Balan.| Stalking Leonin|Commander 2017|7|R|{2}{W}|Creature - Cat Archer|3|3|When Stalking Leonin enters the battlefield, secretly choose an opponent.$Reveal the player you chose: Exile target creature that's attacking you if it's controlled by the chosen player. Activate this ability only once.| -Kindred Discovery|Commander 2017|11|R|{3}{U}{U}|Enchantment|||As Kindred Discovery enters the battlefield, choose a creature type.$Whenever a creature you control of the chose type enters the battlefield or attacks, draw a card.| -Boneyard Scourge|Commander 2017|15|R|{2}{B}{B}|Creature - Zombie Dragon|4|3|Flying$Whenever a Dragon you control dies while Boneyard Scourge is in your graveyard, you may pay 1B. If you do, return Boneyard Scourge from your graveyard to the battlefield.| -Bloodline Necromancer|Commander 2017|14|U|{4}{B}|Creature - Vampire Wizard|3|2|Lifelink$When Bloodline Necromancer enters the battlefield, you may return target Vampire or Wizard creature card from your graveyard to the battlefield.| -Territorial Hellkite|Commander 2017|??|R|{2}{R}{R}|Creature - Dragon|6|5|Flying, haste$At the beginning of combat on your turn, choose an opponent at random that Territorial Hellkite didn't attack during your last combat. Territorial Hellkite attacks that player this combat if able. If you can't choose an opponent this way, tap Territorial Hellkite.| Summon the Tribe|Commander 2017|32|R|{5}{G}{G}|Instant|||Choose a creature type. Reveal the top card card of your library until you reveal X creatures of the chosen type, where X is the number of creatures you control of the chosen type, and place them onto the battlefield. Shuffle the other revealed cards into your library.| -Hungry Lynx|Commander 2017|31|R|{1}{G}|Creature - Cat|2|2|Cats you control have protection from Rats. (They can't be blocked, targeted, or dealt damage by Rats.)$At the beginning of your end step, target opponent creates a 1/1 black Rat creature token with deathtouch.$Whenever a Rat dies, put a +1/+1 counter on each Cat you control.| +Taigam, Ojutai Master|Commander 2017|46|R|{2}{W}{U}|Legendary Creature - Human Monk|3|4|Instant, sorcery, and Dragon spells you control can't be countered by spells or abilities.$Whenever you cast an instant or sorcery spell from your hand, if Taigam, Ojutai Master attacked this turn, that spell gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)| +Teferi's Protection|Commander 2017|8|R|{2}{W}|Instant|||Until your next turn, your life total can't change, and you have protection from everything. All permanents you control phase out. (While they're phased out, they're treated as though they don't exist. They phase in before you untap during your untap step.)$Exile Teferi's Protection.| +Territorial Hellkite|Commander 2017|??|R|{2}{R}{R}|Creature - Dragon|6|5|Flying, haste$At the beginning of combat on your turn, choose an opponent at random that Territorial Hellkite didn't attack during your last combat. Territorial Hellkite attacks that player this combat if able. If you can't choose an opponent this way, tap Territorial Hellkite.| +The Ur-Dragon|Commander 2017|48|M|{4}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Avatar|10|10|Eminence - As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast.$Flying$Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield| Traverse the Outlands|Commander 2017|34|R|{4}{G}|Sorcery|||Search your library for up to X basic land cards, where X is the greatest power among creatures you control. Put those cards onto the battlefield tapped, then shuffle your library.| +Wasitora, Nekoru Queen|Commander 2017|49|M|{2}{B}{R}{G}|Legendary Creature - Cat Dragon|5|4|Flying, trample$Whenever Wasitora, Nekoru Queen deals combat damage to a player, that player sacrifices a creature. If the player can't, you create a 3/3 black, red, and green Cat Dragon creature token with flying| Aegis Angel|Archenemy: Nicol Bolas|1|R|{4}{W}{W}|Creature - Angel|5|5|Flying$When Aegis Angel enters the battlefield, another target creature gains indestructible for as long as you control Aegis Angel.| Aerial Responder|Archenemy: Nicol Bolas|2|U|{1}{W}{W}|Creature - Dwarf Soldier|2|3|Flying, vigilance, lifelink| Anointer of Champions|Archenemy: Nicol Bolas|3|U|{W}|Creature - Human Cleric|1|1|{T}: Target attacking creature gets +1/+1 until end of turn.| @@ -31866,7 +31883,7 @@ Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Countervailing Winds|Hour of Devastation|32|C|{2}{U}|Instant|||Counter target spell unless its controller pays {1} for each card in your graveyard.$Cycling {2} ({2}, Discard this card: Draw a card.)| Cunning Survivor|Hour of Devastation|33|C|{1}{U}|Creature - Human Warrior|1|3|Whenever you cycle or discard a card, Cunning Survivor gets +1/+0 until end of turn and can't be blocked this turn.| Eternal of Harsh Truths|Hour of Devastation|34|U|{2}{U}|Creature - Zombie Cleric|1|3|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)$Whenever Eternal of Harsh Truths attacks and isn't blocked, draw a card.| -Fraying Sanity|Hour of Devastation|35|R|{2}{U}|Enchantment - Aura Curse|||Enchant player$At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn. | +Fraying Sanity|Hour of Devastation|35|R|{2}{U}|Enchantment - Aura Curse|||Enchant player$At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn.| Hour of Eternity|Hour of Devastation|36|R|{X}{X}{U}{U}{U}|Sorcery|||Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie.| Imaginary Threats|Hour of Devastation|37|U|{2}{U}{U}|Instant|||Creatures target opponent controls attack this turn if able. During that player's next untap step, creatures he or she controls don't untap.$Cycling {2} ({2}, Discard this card: Draw a card.)| Jace's Defeat|Hour of Devastation|38|U|{1}{U}|Instant|||Counter target blue spell. If it was a Jace planeswalker spell, scry 2.| From 8b88e9eed4c2d7ff6b735ce8da21300521a93ae7 Mon Sep 17 00:00:00 2001 From: spjspj Date: Fri, 11 Aug 2017 14:18:44 +1000 Subject: [PATCH 4/9] C17 spoilers (201708) --- Utils/mtg-cards-data.txt | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index d0ef58e3cbe..41b2ec251f6 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31701,31 +31701,44 @@ Disrupt Decorum|Commander 2017|25|R|{2}{R}{R}|Sorcery|||Goad all creatures you d Edgar Markov|Commander 2017|36|M|{3}{R}{W}{B}|Legendary Creature - Vampire Knight|4|4|Eminence - Whenever you cast another Vampire spell, if Edgar Markov is in the command zone or on the battlefield, create a 1/1 black Vampire creature token.$First strike, haste$Whenever Edgar Markov attacks, put a +1/+1 counter on each Vampire you control.| Fortunate Few|Commander 2017|4|R|{3}{W}{W}|Sorcery|||Choose a nonland permanent you don't control, then each other player chooses a nonland permanent he or she doesn't control that hasn't been chosen this way. Destroy all other nonland permanents.| Fractured Identity|Commander 2017|37|R|{3}{W}{U}|Sorcery|||Exile target nonland permanent. Each player other than its controller creates a token that's a copy of it.| +Galecaster Colossus|Commander 2017|10|R|{5}{U}{U}|Creature - Giant Wizard|5|6|Tap an untapped Wizard you control: Return target non-land permanent you don't control to its owner's hand.| Hammer of Nazahn|Commander 2017|51|R|{4}|Legendary Artifact - Equipment|||Whenever Hammer of Nazahn or another Equipment enters the battlefield under your control, you may attach that Equipment to target creature you control.$Equipped creature gets +2/+0 and has indestructible.$Equip 4| Heirloom Blade|Commander 2017|52|U|{3}|Artifact - Equipment|||Equipped creature gets +3/+1.$Whenever equipped creature dies, you may reveal cards from the top of your library until you reveal a creature card that shares a creature type with it. Put that card into your hand and the rest on the bottom of your library in a random order.$Equip 1| Herald's Horn|Commander 2017|53|U|{3}|Artifact|||When Herald's Horn enters the battlefield, choose a creature type.$Creature spells you cast of the chosen type cost 1 less.$At the beginning of your upkeep, look at the top card of your library. If it's a creature card of the chosen type, you may reveal it and put it into your hand.| Hungry Lynx|Commander 2017|31|R|{1}{G}|Creature - Cat|2|2|Cats you control have protection from Rats. (They can't be blocked, targeted, or dealt damage by Rats.)$At the beginning of your end step, target opponent creates a 1/1 black Rat creature token with deathtouch.$Whenever a Rat dies, put a +1/+1 counter on each Cat you control.| -Inalla, Archmage Ritualist|Commander 2017|??|M|{2}{U}{B}{R}|Legendary Creature - Human Wizard|4|5|Eminence - Whenever another nontoken Wizard enters the battlefield under your control, if Inalla, Archmage Ritualist is in the command zone or on the battlefield, you may pay {1}. If you do, create a token that's a copy of that Wizard. The token gains haste. Exile it at the beginning of the next end step.$Tap five untapped Wizards you control: Target player loses 7 life.| +Inalla, Archmage Ritualist|Commander 2017|38|M|{2}{U}{B}{R}|Legendary Creature - Human Wizard|4|5|Eminence - Whenever another nontoken Wizard enters the battlefield under your control, if Inalla, Archmage Ritualist is in the command zone or on the battlefield, you may pay {1}. If you do, create a token that's a copy of that Wizard. The token gains haste. Exile it at the beginning of the next end step.$Tap five untapped Wizards you control: Target player loses 7 life.| +Izzet Chemister|Commander 2017|26|R|{2}{R}|Creature - Goblin Chemister|1|3|Haste$R, T: Exile target instant or sorcery card from your graveyard.$1R, T: Sacrifice Izzet Chemister: Cast any number of cards exiled with Izzet Chemister without paying their mana costs.| +Kess, Dissident Mage|Commander 2017|39|M|{1}{U}{B}{R}|Legendary Creature - Human Wizard|3|4|Flying$During each of your turns, you may cast an instant or sorcery card from your graveyard. If a card cast this way would be put into your graveyard this turn, exile it instead.| Kheru Mind-Eater|Commander 2017|17|R|{2}{B}|Creature - Vampire|1|3|Menace$Whenever Kheru Mind-Eater deals combat damage to a player, that player exiles a card from his or her hand face down.$You may look at and play cards exiled with Kheru Mind-Eater.| +Kindred Boon|Commander 2017|5|R|{2}{W}{W}|Enchantment|||When Kindred Boon enters the battlefield choose a creature type.$1W: Put a divinity counter on target creature you control with the chosen type.$All creatures you control with a divinity counter become indestructible.| Kindred Charge|Commander 2017|27|R|{4}{R}{R}|Sorcery|||Choose a creature type. For each creature you control of the chosen type, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step.| Kindred Discovery|Commander 2017|11|R|{3}{U}{U}|Enchantment|||As Kindred Discovery enters the battlefield, choose a creature type.$Whenever a creature you control of the chose type enters the battlefield or attacks, draw a card.| +Kindred Dominance|Commander 2017|18|R|{5}{B}{B}|Sorcery|||Choose a creature type. Destroy all creatures that are not the chosen type.| +Kindred Summons|Commander 2017|32|R|{5}{G}{G}|Instant|||Choose a creature type. Reveal the top card card of your library until you reveal X creatures of the chosen type, where X is the number of creatures you control of the chosen type, and place them onto the battlefield. Shuffle the other revealed cards into your library.| Licia, Sanguine Tribune|Commander 2017|40|M|{5}{R}{W}{B}|Legendary Creature - Vampire Soldier|4|4|Licia, Sanguine Tribune costs 1 less to cast for each 1 life you gained this turn.$First strike, lifelink$Pay 5 life: Put three +1/+1 counters on Licia. Activate this ability only on your turn and only once each turn.| +Magus of the Mind|Commander 2017|12|R|{4}{U}{U}|Creature - Human Wizard|4|5|U, T: Sacrifice Magus of the Mind: Shuffle your library, then exile the top X cards, where X is one plus the number of spells cast this turn. Until end of turn, you may play cards exiled this way without paying their mana costs.| +Mairsil, the Pretender|Commander 2017|41|M|{1}{U}{B}{R}|Legendary Creature - Human Wizard|4|4|When Mairsil, the Pretender enters the battlefield, you may exile an artifact or creature card from your hand or graveyard and put a cage counter on it.$Mairsil, the Pretender has all activated abilities of all cards you own in exile with cage counters on them. You may activate each of those abilities only once each turn.| Mathas, Fiend Seeker|Commander 2017|42|M|{R}{W}{B}|Legendary Creature - Vampire|3|3|Menace$At the beginning of your end step, put a bounty counter on target creature an opponent controls. For as long as that creature has a bounty counter on it, it has "When this creature dies, each opponent draws a card and gains 2 life."| Mirri, Weatherlight Duelist|Commander 2017|43|M|{1}{G}{W}|Legendary Creature - Cat Warrior|3|2|First Strike$Whenever Mirri, Weatherlight Duelist attacks, each opponent can't block with more than one creature this combat.$As long as Mirri, Weatherlight Duelist is tapped, no more than one creature can attack you each combat.| +Mirror of the Forebears|Commander 2017|54|U|{2}|Artifact|||As Mirror of the Forebears enters the battlefield, choose a creature type.$1: Until end of turn, Mirror of the Forebears becomes a copy of target creature you control of the chosen type, except it's an artifact in addition to its other types.| Nazahn, Revered Bladesmith|Commander 2017|44|M|{4}{G}{W}|Legendary Creature - Cat Artificer|5|4|When Nazahn, Revered Bladesmith enters the battlefield, search your library for an Equipment card and reveal it. If you reveal a card named Hammer of Nazahn this way, put it onto the battlefield. Otherwise, put that card into your hand. Then shuffle your library.$Whenever an equipped creature you control attacks, you may tap target creature defending player controls.| New Blood|Commander 2017|19|R|{2}{B}{B}|Sorcery|||As an additional cost to cast New Blood, tap an untapped Vampire you control.$Gain control of target creature. Change the text of that creature by replacing all instances of one creature type with Vampire.| O-Kagachi, Vengeful Kami|Commander 2017|45|M|{1}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Spirit|6|6|Flying, Trample$Whenever O-Kagachi, Vengeful Kami deals combat damage to a player, if that player attacked you during his or her last turn, exile target nonland permanent that player controls| Path of Ancestry|Commander 2017|56|C||Land|||Path of Ancestry enters the battlefield tapped.$T: Add to your mana pool one mana of any color in your commander's color identity. When that mana is spent to cast a creature spell that shares a creature type with your commander, scry 1.| Patron of the Vein|Commander 2017|20|R|{4}{B}{B}|Creature - Vampire Shaman|4|4|Flying$When Patron of the Vein enters the battlefield, destroy target creature an opponent controls.$Whenever a creature an opponent controls dies, exile it and put a +1/+1 counter on each Vampire you control.| +Portal Mage|Commander 2017|13|R|{2}{U}|Creature - Human Wizard|2|2|Flash$If Portal Mage enters the battlefield during the declare attackers step, you may reselect the player or planeswalker that the target attacking creature attacks.| +Qasali Slingers|Commander 2017|33|R|{4}{G}|Creature - Cat Warrior|3|5|Reach$Whenever Qasali Slingers or another Cat enters the battlefield under your control, you may destroy target artifact or enchantment.| Ramos, Dragon Engine|Commander 2017|55|M|{6}|Legendary Artifact Creature - Dragon|4|4|Flying$Whenever you cast a spell, put a +1/+1 counter on Ramos, Dragon Engine for each of that spell's colors. Remove five +1/+1 counters from Ramos: Add {W}{W}{U}{U}{B}{B}{R}{R}{G}{G} to your mana pool. Activate this ability only once each turn.| -Scalelord Reckoner|Commander 2017|??|R|{5}{W}{W}|Creature - Dragon|4|4|Flying$Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, destroy target nonland permanent that player controls.| +Scalelord Reckoner|Commander 2017|6|R|{5}{W}{W}|Creature - Dragon|4|4|Flying$Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, destroy target nonland permanent that player controls.| +Shifting Shadow|Commander 2017|28|R|{2}{R}|Enchantment - Aura|||Enchant creature$Enchanted creature has haste and "At the beginning of your upkeep, destroy this creature. Reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and attach Shifting Shadow to it, then put all other cards revealed this way on the bottom of your library in a random order."| Stalking Leonin|Commander 2017|7|R|{2}{W}|Creature - Cat Archer|3|3|When Stalking Leonin enters the battlefield, secretly choose an opponent.$Reveal the player you chose: Exile target creature that's attacking you if it's controlled by the chosen player. Activate this ability only once.| -Summon the Tribe|Commander 2017|32|R|{5}{G}{G}|Instant|||Choose a creature type. Reveal the top card card of your library until you reveal X creatures of the chosen type, where X is the number of creatures you control of the chosen type, and place them onto the battlefield. Shuffle the other revealed cards into your library.| Taigam, Ojutai Master|Commander 2017|46|R|{2}{W}{U}|Legendary Creature - Human Monk|3|4|Instant, sorcery, and Dragon spells you control can't be countered by spells or abilities.$Whenever you cast an instant or sorcery spell from your hand, if Taigam, Ojutai Master attacked this turn, that spell gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)| +Taigam, Sidisi's Hand|Commander 2017|47|R|{3}{U}{B}|Legendary Creature - Human Wizard|3|4|Skip your draw step.$At the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard.$B, T, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn.| Teferi's Protection|Commander 2017|8|R|{2}{W}|Instant|||Until your next turn, your life total can't change, and you have protection from everything. All permanents you control phase out. (While they're phased out, they're treated as though they don't exist. They phase in before you untap during your untap step.)$Exile Teferi's Protection.| -Territorial Hellkite|Commander 2017|??|R|{2}{R}{R}|Creature - Dragon|6|5|Flying, haste$At the beginning of combat on your turn, choose an opponent at random that Territorial Hellkite didn't attack during your last combat. Territorial Hellkite attacks that player this combat if able. If you can't choose an opponent this way, tap Territorial Hellkite.| +Territorial Hellkite|Commander 2017|29|R|{2}{R}{R}|Creature - Dragon|6|5|Flying, haste$At the beginning of combat on your turn, choose an opponent at random that Territorial Hellkite didn't attack during your last combat. Territorial Hellkite attacks that player this combat if able. If you can't choose an opponent this way, tap Territorial Hellkite.| The Ur-Dragon|Commander 2017|48|M|{4}{W}{U}{B}{R}{G}|Legendary Creature - Dragon Avatar|10|10|Eminence - As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast.$Flying$Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield| Traverse the Outlands|Commander 2017|34|R|{4}{G}|Sorcery|||Search your library for up to X basic land cards, where X is the greatest power among creatures you control. Put those cards onto the battlefield tapped, then shuffle your library.| +Vindictive Lich|Commander 2017|21|R|{3}{B}|Creature - Zombie Wizard|4|1|When Vindictive Lich dies, choose one or more. Each mode must target a different player.$*Target opponent sacrifices a creature.$*Target opponent discards two cards.$*Target opponent loses 5 life.| Wasitora, Nekoru Queen|Commander 2017|49|M|{2}{B}{R}{G}|Legendary Creature - Cat Dragon|5|4|Flying, trample$Whenever Wasitora, Nekoru Queen deals combat damage to a player, that player sacrifices a creature. If the player can't, you create a 3/3 black, red, and green Cat Dragon creature token with flying| Aegis Angel|Archenemy: Nicol Bolas|1|R|{4}{W}{W}|Creature - Angel|5|5|Flying$When Aegis Angel enters the battlefield, another target creature gains indestructible for as long as you control Aegis Angel.| Aerial Responder|Archenemy: Nicol Bolas|2|U|{1}{W}{W}|Creature - Dwarf Soldier|2|3|Flying, vigilance, lifelink| From 625620efcc3708eb0de8aca8b6d8a7ab52af4105 Mon Sep 17 00:00:00 2001 From: spjspj Date: Fri, 11 Aug 2017 16:50:57 +1000 Subject: [PATCH 5/9] Implement Traverse the Outlands (C17) --- .../src/mage/cards/t/TraverseTheOutlands.java | 113 ++++++++++++++++++ Mage.Sets/src/mage/sets/Commander2017.java | 1 + 2 files changed, 114 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TraverseTheOutlands.java diff --git a/Mage.Sets/src/mage/cards/t/TraverseTheOutlands.java b/Mage.Sets/src/mage/cards/t/TraverseTheOutlands.java new file mode 100644 index 00000000000..1e5a20f88fb --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TraverseTheOutlands.java @@ -0,0 +1,113 @@ +/* + * 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.cards.t; + +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author spjspj + */ +public class TraverseTheOutlands extends CardImpl { + + public TraverseTheOutlands(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}"); + + // Search your library for up to X basic land cards, where X is the greatest power among creatures you control. Put those cards onto the battlefield tapped, then shuffle your library. + this.getSpellAbility().addEffect(new TraverseTheOutlandsEffect()); + } + + public TraverseTheOutlands(final TraverseTheOutlands card) { + super(card); + } + + @Override + public TraverseTheOutlands copy() { + return new TraverseTheOutlands(this); + } +} + +class TraverseTheOutlandsEffect extends OneShotEffect { + + public TraverseTheOutlandsEffect() { + super(Outcome.Benefit); + this.staticText = "Search your library for up to X basic land cards, where X is the greatest power among creatures you control. Put those cards onto the battlefield tapped, then shuffle your library."; + } + + public TraverseTheOutlandsEffect(final TraverseTheOutlandsEffect effect) { + super(effect); + } + + @Override + public TraverseTheOutlandsEffect copy() { + return new TraverseTheOutlandsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + FilterLandPermanent filter = new FilterLandPermanent(); + filter.add(new ControllerPredicate(TargetController.YOU)); + + List creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, controller.getId(), game); + int amount = 0; + for (Permanent creature : creatures) { + int power = creature.getPower().getValue(); + if (amount < power) { + amount = power; + } + } + + TargetCardInLibrary target = new TargetCardInLibrary(0, amount, StaticFilters.FILTER_BASIC_LAND_CARD); + if (controller.searchLibrary(target, game)) { + controller.moveCards(new CardsImpl(target.getTargets()).getCards(game), Zone.BATTLEFIELD, source, game, true, false, false, null); + } + controller.shuffleLibrary(source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/Commander2017.java b/Mage.Sets/src/mage/sets/Commander2017.java index fccef4be601..55ba042ce5c 100644 --- a/Mage.Sets/src/mage/sets/Commander2017.java +++ b/Mage.Sets/src/mage/sets/Commander2017.java @@ -50,6 +50,7 @@ public class Commander2017 extends ExpansionSet { cards.add(new SetCardInfo("O-Kagachi, Vengeful Kami", 45, Rarity.MYTHIC, mage.cards.o.OKagachiVengefulKami.class)); cards.add(new SetCardInfo("Ramos, Dragon Engine", 55, Rarity.MYTHIC, mage.cards.r.RamosDragonEngine.class)); cards.add(new SetCardInfo("Taigam, Ojutai Master", 46, Rarity.MYTHIC, mage.cards.t.TaigamOjutaiMaster.class)); + cards.add(new SetCardInfo("Traverse the Outlands", 34, Rarity.RARE, mage.cards.t.TraverseTheOutlands.class)); cards.add(new SetCardInfo("Wasitora, Nekoru Queen", 49, Rarity.MYTHIC, mage.cards.w.WasitoraNekoruQueen.class)); } From 7d2c4b9ab3281be57a73e17a7c67ed9371adbcec Mon Sep 17 00:00:00 2001 From: spjspj Date: Fri, 11 Aug 2017 17:28:03 +1000 Subject: [PATCH 6/9] Implement Teferi's Protection (C17) --- .../src/mage/cards/t/TeferisProtection.java | 139 ++++++++++++++++++ Mage.Sets/src/mage/sets/Commander2017.java | 1 + 2 files changed, 140 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TeferisProtection.java diff --git a/Mage.Sets/src/mage/cards/t/TeferisProtection.java b/Mage.Sets/src/mage/cards/t/TeferisProtection.java new file mode 100644 index 00000000000..1c606c02f2d --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TeferisProtection.java @@ -0,0 +1,139 @@ +/* + * 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.cards.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileSpellEffect; +import mage.abilities.effects.common.NameACardEffect; +import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; +import mage.abilities.effects.common.continuous.LifeTotalCantChangeControllerEffect; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.FilterObject; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class TeferisProtection extends CardImpl { + + public TeferisProtection(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}"); + + // Until your next turn, your life total can't change, and you have protection from everything. All permanents you control phase out. (While they're phased out, they're treated as though they don't exist. They phase in before you untap during your untap step.) + this.getSpellAbility().addEffect(new LifeTotalCantChangeControllerEffect(Duration.UntilYourNextTurn)); + this.getSpellAbility().addEffect(new TeferisProtectionEffect()); + this.getSpellAbility().addEffect(new TeferisProtectionPhaseOutEffect()); + + // Exile Teferi's Protection. + this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); + } + + public TeferisProtection(final TeferisProtection card) { + super(card); + } + + @Override + public TeferisProtection copy() { + return new TeferisProtection(this); + } +} + +class TeferisProtectionEffect extends OneShotEffect { + + public TeferisProtectionEffect() { + super(Outcome.Protect); + staticText = "

You have protection from everything(You can't be targeted, dealt damage, or enchanted by anything.)"; + } + + public TeferisProtectionEffect(final TeferisProtectionEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY); + if (controller != null) { + FilterObject filter = new FilterObject("the name [everything]"); + filter.add(new NamePredicate("everything")); + ContinuousEffect effect = new GainAbilityControllerEffect(new ProtectionAbility(filter), Duration.Custom); + game.addEffect(effect, source); + return true; + } + return false; + } + + @Override + public TeferisProtectionEffect copy() { + return new TeferisProtectionEffect(this); + } +} + +class TeferisProtectionPhaseOutEffect extends OneShotEffect { + + private FilterControlledPermanent permanentsYouControl = new FilterControlledPermanent("all permanents you control"); + + public TeferisProtectionPhaseOutEffect() { + super(Outcome.Benefit); + this.staticText = "All permanents you control phase out. (While they're phased out, they're treated as though they don't exist. They phase in before you untap during your untap step.)"; + } + + public TeferisProtectionPhaseOutEffect(final TeferisProtectionPhaseOutEffect effect) { + super(effect); + } + + @Override + public TeferisProtectionPhaseOutEffect copy() { + return new TeferisProtectionPhaseOutEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(permanentsYouControl, controller.getId(), game)) { + permanent.phaseOut(game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Commander2017.java b/Mage.Sets/src/mage/sets/Commander2017.java index 55ba042ce5c..ee2da1568b9 100644 --- a/Mage.Sets/src/mage/sets/Commander2017.java +++ b/Mage.Sets/src/mage/sets/Commander2017.java @@ -50,6 +50,7 @@ public class Commander2017 extends ExpansionSet { cards.add(new SetCardInfo("O-Kagachi, Vengeful Kami", 45, Rarity.MYTHIC, mage.cards.o.OKagachiVengefulKami.class)); cards.add(new SetCardInfo("Ramos, Dragon Engine", 55, Rarity.MYTHIC, mage.cards.r.RamosDragonEngine.class)); cards.add(new SetCardInfo("Taigam, Ojutai Master", 46, Rarity.MYTHIC, mage.cards.t.TaigamOjutaiMaster.class)); + cards.add(new SetCardInfo("Teferi's Protection", 8, Rarity.RARE, mage.cards.t.TeferisProtection.class)); cards.add(new SetCardInfo("Traverse the Outlands", 34, Rarity.RARE, mage.cards.t.TraverseTheOutlands.class)); cards.add(new SetCardInfo("Wasitora, Nekoru Queen", 49, Rarity.MYTHIC, mage.cards.w.WasitoraNekoruQueen.class)); From 10159cd157cde83e1eb354be588ce9cda9a5fd3b Mon Sep 17 00:00:00 2001 From: spjspj Date: Fri, 11 Aug 2017 19:56:25 +1000 Subject: [PATCH 7/9] Implement Taigam, Sidisi's Hand (C17) --- .../src/mage/cards/t/TaigamSidisisHand.java | 180 ++++++++++++++++++ Mage.Sets/src/mage/sets/Commander2017.java | 1 + 2 files changed, 181 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java diff --git a/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java b/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java new file mode 100644 index 00000000000..a80ef013ffc --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TaigamSidisisHand.java @@ -0,0 +1,180 @@ +/* + * 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.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.SkipDrawStepEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author spjspj + */ +public class TaigamSidisisHand extends CardImpl { + + public TaigamSidisisHand(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Skip your draw step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SkipDrawStepEffect())); + + // At the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TaigamSidisisHandDrawEffect(), TargetController.YOU, false)); + + // {B}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TaigamSidisisHandEffect(), new ManaCostsImpl("{B}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCard("cards from your graveyard")))); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public TaigamSidisisHand(final TaigamSidisisHand card) { + super(card); + } + + @Override + public TaigamSidisisHand copy() { + return new TaigamSidisisHand(this); + } +} + +class TaigamSidisisHandEffect extends OneShotEffect { + + public TaigamSidisisHandEffect() { + super(Outcome.Benefit); + this.staticText = "creature gets -X/-X until end of turn"; + } + + public TaigamSidisisHandEffect(final TaigamSidisisHandEffect effect) { + super(effect); + } + + @Override + public TaigamSidisisHandEffect copy() { + return new TaigamSidisisHandEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + + if (targetCreature != null) { + int amount = 0; + for (Cost cost : source.getCosts()) { + if (cost instanceof ExileFromGraveCost) { + amount = ((ExileFromGraveCost) cost).getExiledCards().size(); + ContinuousEffect effect = new BoostTargetEffect(-amount, -amount, Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(source.getTargets().getFirstTarget())); + game.addEffect(effect, source); + } + } + } + } + return false; + } +} + +class TaigamSidisisHandDrawEffect extends OneShotEffect { + + public TaigamSidisisHandDrawEffect() { + super(Outcome.DrawCard); + this.staticText = "Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard"; + } + + public TaigamSidisisHandDrawEffect(final TaigamSidisisHandDrawEffect effect) { + super(effect); + } + + @Override + public TaigamSidisisHandDrawEffect copy() { + return new TaigamSidisisHandDrawEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + + if (controller != null) { + Cards cards = new CardsImpl(); + cards.addAll(controller.getLibrary().getTopCards(game, 3)); + if (!cards.isEmpty()) { + controller.lookAtCards("Taigam, Sidisi's Hand", cards, game); + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put in your hand")); + if (controller.choose(Outcome.Benefit, cards, target, game)) { + Card card = cards.get(target.getFirstTarget(), game); + if (card != null) { + controller.moveCards(card, Zone.HAND, source, game); + cards.remove(card); + } + } + controller.moveCards(cards, Zone.GRAVEYARD, source, game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Commander2017.java b/Mage.Sets/src/mage/sets/Commander2017.java index ee2da1568b9..e37371c2806 100644 --- a/Mage.Sets/src/mage/sets/Commander2017.java +++ b/Mage.Sets/src/mage/sets/Commander2017.java @@ -50,6 +50,7 @@ public class Commander2017 extends ExpansionSet { cards.add(new SetCardInfo("O-Kagachi, Vengeful Kami", 45, Rarity.MYTHIC, mage.cards.o.OKagachiVengefulKami.class)); cards.add(new SetCardInfo("Ramos, Dragon Engine", 55, Rarity.MYTHIC, mage.cards.r.RamosDragonEngine.class)); cards.add(new SetCardInfo("Taigam, Ojutai Master", 46, Rarity.MYTHIC, mage.cards.t.TaigamOjutaiMaster.class)); + cards.add(new SetCardInfo("Taigam, Sidisi's Hand", 47, Rarity.RARE, mage.cards.t.TaigamSidisisHand.class)); cards.add(new SetCardInfo("Teferi's Protection", 8, Rarity.RARE, mage.cards.t.TeferisProtection.class)); cards.add(new SetCardInfo("Traverse the Outlands", 34, Rarity.RARE, mage.cards.t.TraverseTheOutlands.class)); cards.add(new SetCardInfo("Wasitora, Nekoru Queen", 49, Rarity.MYTHIC, mage.cards.w.WasitoraNekoruQueen.class)); From 04037a6d700870cb144dc02085805d700aace421 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 12 Aug 2017 01:12:30 +1000 Subject: [PATCH 8/9] Implement Scalelord Reckoner (C17) --- .../src/mage/cards/s/ScalelordReckoner.java | 127 ++++++++++++++++++ Mage.Sets/src/mage/sets/Commander2017.java | 1 + 2 files changed, 128 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ScalelordReckoner.java diff --git a/Mage.Sets/src/mage/cards/s/ScalelordReckoner.java b/Mage.Sets/src/mage/cards/s/ScalelordReckoner.java new file mode 100644 index 00000000000..4426c44be61 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ScalelordReckoner.java @@ -0,0 +1,127 @@ +/* + * 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.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterNonlandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; + +/** + * + * @author spjspj + */ +public class ScalelordReckoner extends CardImpl { + + public ScalelordReckoner(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{W}"); + + this.subtype.add("Dragon"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, destroy target nonland permanent that player controls. + this.addAbility(new ScalelardReckonerTriggeredAbility(new DestroyTargetEffect())); + } + + public ScalelordReckoner(final ScalelordReckoner card) { + super(card); + } + + @Override + public ScalelordReckoner copy() { + return new ScalelordReckoner(this); + } +} + +class ScalelardReckonerTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Dragon creature you control"); + + static { + filter.add(new SubtypePredicate(SubType.DRAGON)); + } + + public ScalelardReckonerTriggeredAbility(Effect effect) { + super(Zone.BATTLEFIELD, new DestroyTargetEffect(), false); + } + + public ScalelardReckonerTriggeredAbility(final ScalelardReckonerTriggeredAbility ability) { + super(ability); + } + + @Override + public ScalelardReckonerTriggeredAbility copy() { + return new ScalelardReckonerTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.TARGETED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (game.getOpponents(this.controllerId).contains(event.getPlayerId())) { + Permanent creature = game.getPermanent(event.getTargetId()); + if (creature != null && filter.match(creature, getSourceId(), getControllerId(), game)) { + FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanent that player controls"); + filter.add(new ControllerIdPredicate(event.getPlayerId())); + // filter.setMessage("nonland permanent controlled by " + game.getPlayer(event.getTargetId()).getLogName()); + this.getTargets().clear(); + this.addTarget(new TargetPermanent(filter)); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, destroy target nonland permanent that player controls."; + } +} diff --git a/Mage.Sets/src/mage/sets/Commander2017.java b/Mage.Sets/src/mage/sets/Commander2017.java index e37371c2806..19f7ddeb0c3 100644 --- a/Mage.Sets/src/mage/sets/Commander2017.java +++ b/Mage.Sets/src/mage/sets/Commander2017.java @@ -49,6 +49,7 @@ public class Commander2017 extends ExpansionSet { cards.add(new SetCardInfo("O-Kagachi, Vengeful Kami", 45, Rarity.MYTHIC, mage.cards.o.OKagachiVengefulKami.class)); cards.add(new SetCardInfo("Ramos, Dragon Engine", 55, Rarity.MYTHIC, mage.cards.r.RamosDragonEngine.class)); + cards.add(new SetCardInfo("Scalelord Reckoner", 6, Rarity.RARE, mage.cards.s.ScalelordReckoner.class)); cards.add(new SetCardInfo("Taigam, Ojutai Master", 46, Rarity.MYTHIC, mage.cards.t.TaigamOjutaiMaster.class)); cards.add(new SetCardInfo("Taigam, Sidisi's Hand", 47, Rarity.RARE, mage.cards.t.TaigamSidisisHand.class)); cards.add(new SetCardInfo("Teferi's Protection", 8, Rarity.RARE, mage.cards.t.TeferisProtection.class)); From cfdf83929e1ffd8415fb9e6a101dfe0b0ead7b16 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 11 Aug 2017 18:01:57 -0400 Subject: [PATCH 9/9] Implemented Chain of Acid, Chain of Silence, Chain of Smog and Chain Stasis (#3796) * Implement Epicenter * Implement Infested Roothold * Implement Brown Ouphe * Implement Rust * Implement Ouphe Vandals * Implement Fatal Attraction * Implement Fighting Chance * Implement Arcbound Fiend * Implement Carry Away * Implement Caverns of Despair * Implement Amulet of Unmaking * Implement Aphetto Exterminator * Implement Balduvian Conjurer, Barrin's Unmaking, Each Mana Battery, Blood Hound and Boa Constrictor * Implement Bola Warrior, Brass Talon Chimera, Briar Patch and Brine Shaman * Implemented Call to Arms, Goham Djinn, Halam Djinn, Ruham Djinn, Sulam Djinn, Zanam Djinn, Heroic Defiance and Tsabo's Assassin, updated Barrin's Unmaking and Epicenter * Implement Brown Ouphe * Implemented Break Open * Implemented Carrion * Implemented Cephalid Pathmage * Implemented Cephalid Inkshrouder * Implemented Ceremonial Guard * Implemented Chain of Acid, Chain of Silence, and Chain of Smog * Implemented Chain of Acid, Chain of Silence, and Chain of Smog * Implemented Chain Stasis --- Mage.Sets/src/mage/cards/c/ChainOfAcid.java | 120 ++++++++++++++++ .../src/mage/cards/c/ChainOfSilence.java | 132 ++++++++++++++++++ Mage.Sets/src/mage/cards/c/ChainOfSmog.java | 107 ++++++++++++++ Mage.Sets/src/mage/cards/c/ChainStasis.java | 131 +++++++++++++++++ Mage.Sets/src/mage/sets/Homelands.java | 1 + Mage.Sets/src/mage/sets/Onslaught.java | 3 + 6 files changed, 494 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChainOfAcid.java create mode 100644 Mage.Sets/src/mage/cards/c/ChainOfSilence.java create mode 100644 Mage.Sets/src/mage/cards/c/ChainOfSmog.java create mode 100644 Mage.Sets/src/mage/cards/c/ChainStasis.java diff --git a/Mage.Sets/src/mage/cards/c/ChainOfAcid.java b/Mage.Sets/src/mage/cards/c/ChainOfAcid.java new file mode 100644 index 00000000000..e7ae7f47c8b --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChainOfAcid.java @@ -0,0 +1,120 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author TheElk801 + */ +public class ChainOfAcid extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("noncreature permanent"); + + static { + filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + } + + public ChainOfAcid(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}"); + + // Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy. + this.getSpellAbility().addEffect(new ChainOfAcidEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + public ChainOfAcid(final ChainOfAcid card) { + super(card); + } + + @Override + public ChainOfAcid copy() { + return new ChainOfAcid(this); + } +} + +class ChainOfAcidEffect extends OneShotEffect { + + ChainOfAcidEffect() { + super(Outcome.DestroyPermanent); + this.staticText = "Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy."; + } + + ChainOfAcidEffect(final ChainOfAcidEffect effect) { + super(effect); + } + + @Override + public ChainOfAcidEffect copy() { + return new ChainOfAcidEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + UUID targetId = source.getFirstTarget(); + Permanent permanent = game.getPermanent(targetId); + if (permanent != null) { + Player affectedPlayer = game.getPlayer(permanent.getControllerId()); + if (affectedPlayer != null) { + Effect effect = new DestroyTargetEffect(); + effect.setTargetPointer(new FixedTarget(targetId)); + effect.apply(game, source); + if (affectedPlayer.chooseUse(Outcome.Copy, "Copy the spell?", source, game)) { + Spell spell = game.getStack().getSpell(source.getSourceId()); + if (spell != null) { + spell.createCopyOnStack(game, source, affectedPlayer.getId(), true); + game.informPlayers(affectedPlayer.getLogName() + " copies " + spell.getName() + '.'); + } + } + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/ChainOfSilence.java b/Mage.Sets/src/mage/cards/c/ChainOfSilence.java new file mode 100644 index 00000000000..d2780688ddb --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChainOfSilence.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.cards.c; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PreventDamageByTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; +import mage.players.Player; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class ChainOfSilence extends CardImpl { + + public ChainOfSilence(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + + // Prevent all damage target creature would deal this turn. That creature's controller may sacrifice a land. If the player does, he or she may copy this spell and may choose a new target for that copy. + this.getSpellAbility().addEffect(new ChainOfSilenceEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public ChainOfSilence(final ChainOfSilence card) { + super(card); + } + + @Override + public ChainOfSilence copy() { + return new ChainOfSilence(this); + } +} +class ChainOfSilenceEffect extends OneShotEffect { + + public ChainOfSilenceEffect() { + super(Outcome.PreventDamage); + } + + public ChainOfSilenceEffect(final ChainOfSilenceEffect effect) { + super(effect); + } + + @Override + public ChainOfSilenceEffect copy() { + return new ChainOfSilenceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = source.getSourceObject(game); + if (controller == null || sourceObject == null) { + return false; + } + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent != null) { + ContinuousEffect effect = new PreventDamageByTargetEffect(Duration.EndOfTurn); + game.addEffect(effect, source); + Player player = game.getPlayer(permanent.getControllerId()); + TargetControlledPermanent target = new TargetControlledPermanent(0, 1, new FilterControlledLandPermanent("a land to sacrifice (to be able to copy " + sourceObject.getName() + ')'), true); + if (player.chooseTarget(Outcome.Sacrifice, target, source, game)) { + Permanent land = game.getPermanent(target.getFirstTarget()); + if (land != null && land.sacrifice(source.getSourceId(), game)) { + if (player.chooseUse(outcome, "Copy the spell?", source, game)) { + Spell spell = game.getStack().getSpell(source.getSourceId()); + if (spell != null) { + StackObject newStackObject = spell.createCopyOnStack(game, source, player.getId(), true); + if (newStackObject != null && newStackObject instanceof Spell) { + String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); + if (activateMessage.startsWith(" casts ")) { + activateMessage = activateMessage.substring(6); + } + game.informPlayers(player.getLogName() + ' ' + activateMessage); + } + } + } + } + } + return true; + } + + return false; + } + + @Override + public String getText(Mode mode) { + return "Prevent all damage target creature would deal this turn. That creature's controller may sacrifice a land. If the player does, he or she may copy this spell and may choose a new target for that copy"; + } + +} diff --git a/Mage.Sets/src/mage/cards/c/ChainOfSmog.java b/Mage.Sets/src/mage/cards/c/ChainOfSmog.java new file mode 100644 index 00000000000..5f6d76f0e4d --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChainOfSmog.java @@ -0,0 +1,107 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author TheElk801 + */ +public class ChainOfSmog extends CardImpl { + + public ChainOfSmog(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); + + // Target player discards two cards. That player may copy this spell and may choose a new target for that copy. + this.getSpellAbility().addEffect(new ChainOfSmogEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public ChainOfSmog(final ChainOfSmog card) { + super(card); + } + + @Override + public ChainOfSmog copy() { + return new ChainOfSmog(this); + } +} + +class ChainOfSmogEffect extends OneShotEffect { + + ChainOfSmogEffect() { + super(Outcome.Discard); + this.staticText = "Target player discards two cards. That player may copy this spell and may choose a new target for that copy."; + } + + ChainOfSmogEffect(final ChainOfSmogEffect effect) { + super(effect); + } + + @Override + public ChainOfSmogEffect copy() { + return new ChainOfSmogEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + UUID targetId = source.getFirstTarget(); + Player affectedPlayer = game.getPlayer(targetId); + if (affectedPlayer != null) { + Effect effect = new DiscardTargetEffect(2); + effect.setTargetPointer(new FixedTarget(targetId)); + effect.apply(game, source); + if (affectedPlayer.chooseUse(Outcome.Copy, "Copy the spell?", source, game)) { + Spell spell = game.getStack().getSpell(source.getSourceId()); + if (spell != null) { + spell.createCopyOnStack(game, source, affectedPlayer.getId(), true); + game.informPlayers(affectedPlayer.getLogName() + " copies " + spell.getName() + '.'); + } + } + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/ChainStasis.java b/Mage.Sets/src/mage/cards/c/ChainStasis.java new file mode 100644 index 00000000000..4db9cb1646d --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChainStasis.java @@ -0,0 +1,131 @@ +/* + * 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.cards.c; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.MayTapOrUntapTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author TheElk801 + */ +public class ChainStasis extends CardImpl { + + public ChainStasis(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}"); + + // You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, he or she may copy this spell and may choose a new target for that copy. + this.getSpellAbility().addEffect(new ChainStasisEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public ChainStasis(final ChainStasis card) { + super(card); + } + + @Override + public ChainStasis copy() { + return new ChainStasis(this); + } +} + +class ChainStasisEffect extends OneShotEffect { + + public ChainStasisEffect() { + super(Outcome.Benefit); + } + + public ChainStasisEffect(final ChainStasisEffect effect) { + super(effect); + } + + @Override + public ChainStasisEffect copy() { + return new ChainStasisEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = source.getSourceObject(game); + if (controller == null || sourceObject == null) { + return false; + } + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent != null) { + Effect effect = new MayTapOrUntapTargetEffect(); + effect.setTargetPointer(new FixedTarget(source.getFirstTarget())); + effect.apply(game, source); + Player player = game.getPlayer(permanent.getControllerId()); + Cost cost = new ManaCostsImpl("{2}{U}"); + if (cost.pay(source, game, player.getId(), controller.getId(), false)) { + if (player.chooseUse(outcome, "Copy the spell?", source, game)) { + Spell spell = game.getStack().getSpell(source.getSourceId()); + if (spell != null) { + StackObject newStackObject = spell.createCopyOnStack(game, source, player.getId(), true); + if (newStackObject != null && newStackObject instanceof Spell) { + String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); + if (activateMessage.startsWith(" casts ")) { + activateMessage = activateMessage.substring(6); + } + game.informPlayers(player.getLogName() + ' ' + activateMessage); + } + } + } + } + return true; + } + + return false; + } + + @Override + public String getText(Mode mode + ) { + return "You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, he or she may copy this spell and may choose a new target for that copy"; + } + +} diff --git a/Mage.Sets/src/mage/sets/Homelands.java b/Mage.Sets/src/mage/sets/Homelands.java index 5c5ec0f9b15..2a39d1d41d6 100644 --- a/Mage.Sets/src/mage/sets/Homelands.java +++ b/Mage.Sets/src/mage/sets/Homelands.java @@ -91,6 +91,7 @@ public class Homelands extends ExpansionSet { cards.add(new SetCardInfo("Castle Sengir", 138, Rarity.UNCOMMON, mage.cards.c.CastleSengir.class)); cards.add(new SetCardInfo("Cemetery Gate", 4, Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cemetery Gate", 5, Rarity.COMMON, CemeteryGate.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chain Stasis", 28, Rarity.RARE, mage.cards.c.ChainStasis.class)); cards.add(new SetCardInfo("Chandler", 88, Rarity.COMMON, mage.cards.c.Chandler.class)); cards.add(new SetCardInfo("Clockwork Gnomes", 127, Rarity.COMMON, mage.cards.c.ClockworkGnomes.class)); cards.add(new SetCardInfo("Coral Reef", 29, Rarity.COMMON, mage.cards.c.CoralReef.class)); diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 3437ea31a94..80f9e9d99a9 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -65,7 +65,10 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Catapult Master", 10, Rarity.RARE, mage.cards.c.CatapultMaster.class)); cards.add(new SetCardInfo("Catapult Squad", 11, Rarity.UNCOMMON, mage.cards.c.CatapultSquad.class)); cards.add(new SetCardInfo("Centaur Glade", 251, Rarity.UNCOMMON, mage.cards.c.CentaurGlade.class)); + cards.add(new SetCardInfo("Chain of Acid", 252, Rarity.UNCOMMON, mage.cards.c.ChainOfAcid.class)); cards.add(new SetCardInfo("Chain of Plasma", 193, Rarity.UNCOMMON, mage.cards.c.ChainOfPlasma.class)); + cards.add(new SetCardInfo("Chain of Silence", 12, Rarity.UNCOMMON, mage.cards.c.ChainOfSilence.class)); + cards.add(new SetCardInfo("Chain of Smog", 132, Rarity.UNCOMMON, mage.cards.c.ChainOfSmog.class)); cards.add(new SetCardInfo("Chain of Vapor", 73, Rarity.UNCOMMON, mage.cards.c.ChainOfVapor.class)); cards.add(new SetCardInfo("Charging Slateback", 194, Rarity.COMMON, mage.cards.c.ChargingSlateback.class)); cards.add(new SetCardInfo("Choking Tethers", 74, Rarity.COMMON, mage.cards.c.ChokingTethers.class));