From 0250fd271a62895c075ec6c8c1f9c893d0836ee8 Mon Sep 17 00:00:00 2001 From: North Date: Sun, 2 Oct 2011 13:14:54 +0300 Subject: [PATCH] [ISD] 5 cards --- .../mage/sets/innistrad/AshmouthHound.java | 66 +++++++++ .../sets/innistrad/MoldgrafMonstrosity.java | 126 +++++++++++++++++ .../mage/sets/innistrad/NightRevelers.java | 94 +++++++++++++ .../mage/sets/innistrad/OrchardSpirit.java | 130 ++++++++++++++++++ .../mage/sets/innistrad/SpiderSpawning.java | 83 +++++++++++ 5 files changed, 499 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/innistrad/AshmouthHound.java create mode 100644 Mage.Sets/src/mage/sets/innistrad/MoldgrafMonstrosity.java create mode 100644 Mage.Sets/src/mage/sets/innistrad/NightRevelers.java create mode 100644 Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java create mode 100644 Mage.Sets/src/mage/sets/innistrad/SpiderSpawning.java diff --git a/Mage.Sets/src/mage/sets/innistrad/AshmouthHound.java b/Mage.Sets/src/mage/sets/innistrad/AshmouthHound.java new file mode 100644 index 00000000000..f59843006ab --- /dev/null +++ b/Mage.Sets/src/mage/sets/innistrad/AshmouthHound.java @@ -0,0 +1,66 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.innistrad; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.common.BlocksOrBecomesBlockedTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; + +/** + * + * @author North + */ +public class AshmouthHound extends CardImpl { + + public AshmouthHound(UUID ownerId) { + super(ownerId, 128, "Ashmouth Hound", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "ISD"; + this.subtype.add("Elemental"); + this.subtype.add("Hound"); + + this.color.setRed(true); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Ashmouth Hound blocks or becomes blocked by a creature, Ashmouth Hound deals 1 damage to that creature. + this.addAbility(new BlocksOrBecomesBlockedTriggeredAbility(new DamageTargetEffect(1), false)); + } + + public AshmouthHound(final AshmouthHound card) { + super(card); + } + + @Override + public AshmouthHound copy() { + return new AshmouthHound(this); + } +} diff --git a/Mage.Sets/src/mage/sets/innistrad/MoldgrafMonstrosity.java b/Mage.Sets/src/mage/sets/innistrad/MoldgrafMonstrosity.java new file mode 100644 index 00000000000..8a3bdd3847f --- /dev/null +++ b/Mage.Sets/src/mage/sets/innistrad/MoldgrafMonstrosity.java @@ -0,0 +1,126 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.innistrad; + +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author North + */ +public class MoldgrafMonstrosity extends CardImpl { + + public MoldgrafMonstrosity(UUID ownerId) { + super(ownerId, 194, "Moldgraf Monstrosity", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{G}{G}{G}"); + this.expansionSetCode = "ISD"; + this.subtype.add("Insect"); + + this.color.setGreen(true); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + this.addAbility(TrampleAbility.getInstance()); + // When Moldgraf Monstrosity dies, exile it, then return two creature cards at random from your graveyard to the battlefield. + DiesTriggeredAbility ability = new DiesTriggeredAbility(new ExileSourceEffect()); + ability.addEffect(null); + this.addAbility(ability); + } + + public MoldgrafMonstrosity(final MoldgrafMonstrosity card) { + super(card); + } + + @Override + public MoldgrafMonstrosity copy() { + return new MoldgrafMonstrosity(this); + } +} + +class MoldgrafMonstrosityEffect extends OneShotEffect { + + public MoldgrafMonstrosityEffect() { + super(Outcome.ReturnToHand); + this.staticText = "then return two creature cards at random from your graveyard to the battlefield"; + } + + public MoldgrafMonstrosityEffect(final MoldgrafMonstrosityEffect effect) { + super(effect); + } + + @Override + public MoldgrafMonstrosityEffect copy() { + return new MoldgrafMonstrosityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + boolean returned = false; + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + Set cards = player.getGraveyard().getCards(new FilterCreatureCard("creature cards"), game); + + for (int i = 0; i < 2; i++) { + Card card = getRandomCard(cards); + if (card != null) { + returned |= card.putOntoBattlefield(game, Zone.GRAVEYARD, source.getId(), source.getControllerId()); + cards.remove(card); + } + } + } + return returned; + } + + private Card getRandomCard(Set cards) { + int i = 0; + int pick = new Random().nextInt(cards.size()); + for (Card card : cards) { + if (i == pick) { + return card; + } + i = i + 1; + } + return null; + } +} diff --git a/Mage.Sets/src/mage/sets/innistrad/NightRevelers.java b/Mage.Sets/src/mage/sets/innistrad/NightRevelers.java new file mode 100644 index 00000000000..35b08de5853 --- /dev/null +++ b/Mage.Sets/src/mage/sets/innistrad/NightRevelers.java @@ -0,0 +1,94 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.innistrad; + +import java.util.Set; +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalStaticAbility; +import mage.abilities.effects.common.continious.GainAbilitySourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.filter.FilterPermanent; +import mage.game.Game; + +/** + * + * @author North + */ +public class NightRevelers extends CardImpl { + + private static final String rule = "{this} has haste as long as an opponent controls a Human."; + + public NightRevelers(UUID ownerId) { + super(ownerId, 153, "Night Revelers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{R}"); + this.expansionSetCode = "ISD"; + this.subtype.add("Vampire"); + + this.color.setRed(true); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Night Revelers has haste as long as an opponent controls a Human. + this.addAbility(new ConditionalStaticAbility(Zone.BATTLEFIELD, + new GainAbilitySourceEffect(HasteAbility.getInstance()), + new NightRevelersCondition(), + rule)); + + } + + public NightRevelers(final NightRevelers card) { + super(card); + } + + @Override + public NightRevelers copy() { + return new NightRevelers(this); + } +} + +class NightRevelersCondition implements Condition { + + @Override + public boolean apply(Game game, Ability source) { + boolean conditionApplies = false; + FilterPermanent filter = new FilterPermanent(); + filter.getSubtype().add("Human"); + + Set opponents = game.getOpponents(source.getControllerId()); + for (UUID opponentId : opponents) { + conditionApplies |= game.getBattlefield().countAll(filter, opponentId) > 0; + } + return conditionApplies; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java b/Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java new file mode 100644 index 00000000000..f5693b5f11b --- /dev/null +++ b/Mage.Sets/src/mage/sets/innistrad/OrchardSpirit.java @@ -0,0 +1,130 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.innistrad; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Rarity; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.EvasionAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author North + */ +public class OrchardSpirit extends CardImpl { + + public OrchardSpirit(UUID ownerId) { + super(ownerId, 198, "Orchard Spirit", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "ISD"; + this.subtype.add("Spirit"); + + this.color.setGreen(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Orchard Spirit can't be blocked except by creatures with flying or reach. + this.addAbility(OrchardSpiritAbility.getInstance()); + + } + + public OrchardSpirit(final OrchardSpirit card) { + super(card); + } + + @Override + public OrchardSpirit copy() { + return new OrchardSpirit(this); + } +} + +class OrchardSpiritAbility extends EvasionAbility { + + private static OrchardSpiritAbility instance; + + public static OrchardSpiritAbility getInstance() { + if (instance == null) { + instance = new OrchardSpiritAbility(); + } + return instance; + } + + private OrchardSpiritAbility() { + this.addEffect(new OrchardSpiritEffect()); + } + + @Override + public String getRule() { + return "{this} can't be blocked except by creatures with flying or reach"; + } + + @Override + public OrchardSpiritAbility copy() { + return getInstance(); + } +} + +class OrchardSpiritEffect extends RestrictionEffect { + + public OrchardSpiritEffect() { + super(Duration.WhileOnBattlefield); + } + + public OrchardSpiritEffect(final OrchardSpiritEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + if (permanent.getAbilities().containsKey(OrchardSpiritAbility.getInstance().getId())) { + return true; + } + return false; + } + + @Override + public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { + if (blocker.getAbilities().contains(FlyingAbility.getInstance()) || blocker.getAbilities().contains(ReachAbility.getInstance())) { + return true; + } + return false; + } + + @Override + public OrchardSpiritEffect copy() { + return new OrchardSpiritEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/innistrad/SpiderSpawning.java b/Mage.Sets/src/mage/sets/innistrad/SpiderSpawning.java new file mode 100644 index 00000000000..7cf23c507c5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/innistrad/SpiderSpawning.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.innistrad; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.TimingRule; +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.FlashbackAbility; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.filter.common.FilterCreatureCard; +import mage.game.permanent.token.Token; + +/** + * + * @author North + */ +public class SpiderSpawning extends CardImpl { + + public SpiderSpawning(UUID ownerId) { + super(ownerId, 203, "Spider Spawning", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{4}{G}"); + this.expansionSetCode = "ISD"; + + this.color.setGreen(true); + + // Put a 1/2 green Spider creature token with reach onto the battlefield for each creature card in your graveyard. + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiderToken(), new CardsInControllerGraveyardCount(FilterCreatureCard.getDefault()))); + // Flashback {6}{B} + this.addAbility(new FlashbackAbility(new ManaCostsImpl("{6}{B}"), TimingRule.SORCERY)); + } + + public SpiderSpawning(final SpiderSpawning card) { + super(card); + } + + @Override + public SpiderSpawning copy() { + return new SpiderSpawning(this); + } +} + +class SpiderToken extends Token { + + public SpiderToken() { + super("Spider", "1/2 green Spider creature token with reach"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add("Spider"); + power = new MageInt(1); + toughness = new MageInt(2); + addAbility(ReachAbility.getInstance()); + } +}