diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BrandedHowler.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BrandedHowler.java new file mode 100644 index 0000000000..8b9a734e5d --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BrandedHowler.java @@ -0,0 +1,74 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.TwoOrMoreSpellsWereCastLastTurnCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author fireshoes + */ +public class BrandedHowler extends CardImpl { + + public BrandedHowler(UUID ownerId) { + super(ownerId, 149, "Branded Howler", Rarity.COMMON, new CardType[]{CardType.CREATURE}, ""); + this.expansionSetCode = "SOI"; + this.subtype.add("Werewolf"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + this.color.setRed(true); + + // this card is the second face of double-faced card + this.nightCard = true; + this.canTransform = true; + + // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Branded Howler. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(false), TargetController.ANY, false); + this.addAbility(new ConditionalTriggeredAbility(ability, TwoOrMoreSpellsWereCastLastTurnCondition.getInstance(), TransformAbility.TWO_OR_MORE_SPELLS_TRANSFORM_RULE)); + } + + public BrandedHowler(final BrandedHowler card) { + super(card); + } + + @Override + public BrandedHowler copy() { + return new BrandedHowler(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ConvictedKiller.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ConvictedKiller.java new file mode 100644 index 0000000000..07f01a6c7d --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ConvictedKiller.java @@ -0,0 +1,74 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.NoSpellsWereCastLastTurnCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author fireshoes + */ +public class ConvictedKiller extends CardImpl { + + public ConvictedKiller(UUID ownerId) { + super(ownerId, 149, "Convicted Killer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Werewolf"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + this.canTransform = true; + this.secondSideCard = new BrandedHowler(ownerId); + + // At the beginning of each upkeep, if no spells were cast last turn, transform Convicted Killer. + this.addAbility(new TransformAbility()); + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(true), TargetController.ANY, false); + this.addAbility(new ConditionalTriggeredAbility(ability, NoSpellsWereCastLastTurnCondition.getInstance(), TransformAbility.NO_SPELLS_TRANSFORM_RULE)); + } + + public ConvictedKiller(final ConvictedKiller card) { + super(card); + } + + @Override + public ConvictedKiller copy() { + return new ConvictedKiller(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InexorableBlob.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InexorableBlob.java new file mode 100644 index 0000000000..da318740e3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InexorableBlob.java @@ -0,0 +1,82 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.game.permanent.token.Token; + +/** + * + * @author fireshoes + */ +public class InexorableBlob extends CardImpl { + + public InexorableBlob(UUID ownerId) { + super(ownerId, 212, "Inexorable Blob", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Oooze"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Delirium — Whenever Inexorable Blob attacks and there are at least four card types among cards in your graveyard, + // put a 3/3 green Ooze creature token onto the battlefield tapped and attacking. + this.addAbility(new ConditionalTriggeredAbility(new AttacksTriggeredAbility(new CreateTokenEffect(new OozeToken(), 1, true, true), false), + DeliriumCondition.getInstance(), + "Delirium — Whenever {this} attacks and there are at least four card types among cards in your graveyard, " + + "put a 3/3 green Ooze creature token onto the battlefield tapped and attacking.")); + } + + public InexorableBlob(final InexorableBlob card) { + super(card); + } + + @Override + public InexorableBlob copy() { + return new InexorableBlob(this); + } +} + +class OozeToken extends Token { + + public OozeToken() { + super("Ooze", "3/3 green Ooze creature token"); + cardType.add(CardType.CREATURE); + subtype.add("Ooze"); + color.setGreen(true); + power = new MageInt(3); + toughness = new MageInt(3); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/MoonriseIntruder.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/MoonriseIntruder.java new file mode 100644 index 0000000000..a586c07449 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/MoonriseIntruder.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.TwoOrMoreSpellsWereCastLastTurnCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author fireshoes + */ +public class MoonriseIntruder extends CardImpl { + + public MoonriseIntruder(UUID ownerId) { + super(ownerId, 190, "Moonrise Intruder", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, ""); + this.expansionSetCode = "SOI"; + this.subtype.add("Werewolf"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + this.color.setRed(true); + + // this card is the second face of double-faced card + this.nightCard = true; + this.canTransform = true; + + // Menace + this.addAbility(new MenaceAbility()); + + // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Moonrise Intruder. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(false), TargetController.ANY, false); + this.addAbility(new ConditionalTriggeredAbility(ability, TwoOrMoreSpellsWereCastLastTurnCondition.getInstance(), TransformAbility.TWO_OR_MORE_SPELLS_TRANSFORM_RULE)); + } + + public MoonriseIntruder(final MoonriseIntruder card) { + super(card); + } + + @Override + public MoonriseIntruder copy() { + return new MoonriseIntruder(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ScourgeWolf.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ScourgeWolf.java new file mode 100644 index 0000000000..1c147ba54c --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ScourgeWolf.java @@ -0,0 +1,75 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.DeliriumCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author fireshoes + */ +public class ScourgeWolf extends CardImpl { + + public ScourgeWolf(UUID ownerId) { + super(ownerId, 179, "Scourge Wolf", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{R}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Wolf"); + this.subtype.add("Horror"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Delirium — Scourge Wolf has double strike as long as there are four or more card types among cards in your graveyard. + ConditionalContinuousEffect effect = new ConditionalContinuousEffect(new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield), + DeliriumCondition.getInstance(), "Delirium — {this} has double strike as long as there are four or more card types among cards in your graveyard."); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + } + + public ScourgeWolf(final ScourgeWolf card) { + super(card); + } + + @Override + public ScourgeWolf copy() { + return new ScourgeWolf(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TimberShredder.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TimberShredder.java index c24a0638c0..a7e04fc61a 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TimberShredder.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TimberShredder.java @@ -53,6 +53,7 @@ public class TimberShredder extends CardImpl { this.subtype.add("Werewolf"); this.power = new MageInt(4); this.toughness = new MageInt(2); + this.color.setGreen(true); // this card is the second face of double-faced card this.nightCard = true; diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfEphemera.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfEphemera.java new file mode 100644 index 0000000000..f28aa1f35d --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfEphemera.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.sets.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.permanent.token.SpiritWhiteToken; + +/** + * + * @author fireshoes + */ +public class VesselOfEphemera extends CardImpl { + + public VesselOfEphemera(UUID ownerId) { + super(ownerId, 48, "Vessel of Ephemera", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "SOI"; + + // {2}{W}, Sacrifice Vessel of Ephemera: Put two 1/1 white Spirit creature tokens with flying onto the battlefield. + Effect effect = new CreateTokenEffect(new SpiritWhiteToken(), 2); + effect.setText("Put two 1/1 white Spirit creature tokens with flying onto the battlefield"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}{W}")); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public VesselOfEphemera(final VesselOfEphemera card) { + super(card); + } + + @Override + public VesselOfEphemera copy() { + return new VesselOfEphemera(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfMalignity.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfMalignity.java new file mode 100644 index 0000000000..8c7ec6ea3b --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfMalignity.java @@ -0,0 +1,70 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ExileFromZoneTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.target.common.TargetOpponent; + +/** + * + * @author fireshoes + */ +public class VesselOfMalignity extends CardImpl { + + public VesselOfMalignity(UUID ownerId) { + super(ownerId, 144, "Vessel of Malignity", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + this.expansionSetCode = "SOI"; + + // {1}{B}, Sacrifice Vessel of Malignity: Target opponent exiles two cards from his or her hand. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, + new ExileFromZoneTargetEffect(Zone.HAND, null, "", new FilterCard("cards"), 2), + new ManaCostsImpl("{1}{B}")); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public VesselOfMalignity(final VesselOfMalignity card) { + super(card); + } + + @Override + public VesselOfMalignity copy() { + return new VesselOfMalignity(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfNascency.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfNascency.java new file mode 100644 index 0000000000..21c44d060f --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfNascency.java @@ -0,0 +1,134 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import static mage.filter.predicate.permanent.ControllerControlsIslandPredicate.filter; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author fireshoes + */ +public class VesselOfNascency extends CardImpl { + + public VesselOfNascency(UUID ownerId) { + super(ownerId, 237, "Vessel of Nascency", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{G}"); + this.expansionSetCode = "SOI"; + + // {1}{G}, Sacrifice Vessel of Nascency: Reveal the top four cards of your library. You may put an artifact, creature, enchantment, land, or + // planeswalker card from among them into your hand. Put the rest into your graveyard. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new VesselOfNascencyEffect(), new ManaCostsImpl("{1}{G}")); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public VesselOfNascency(final VesselOfNascency card) { + super(card); + } + + @Override + public VesselOfNascency copy() { + return new VesselOfNascency(this); + } +} + +class VesselOfNascencyEffect extends OneShotEffect { + + private static final FilterCard filterPutInHand = new FilterCard("an artifact, creature, enchantment, land, or planeswalker card"); + + static { + filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.ENCHANTMENT), + new CardTypePredicate(CardType.LAND), + new CardTypePredicate(CardType.PLANESWALKER))); + } + + public VesselOfNascencyEffect() { + super(Outcome.DrawCard); + this.staticText = "reveal the top four cards of your library. You may put artifact, creature, enchantment, land, or planeswalker card from among " + + "them into your hand. Put the rest into your graveyard"; + } + + public VesselOfNascencyEffect(final VesselOfNascencyEffect effect) { + super(effect); + } + + @Override + public VesselOfNascencyEffect copy() { + return new VesselOfNascencyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + Cards cards = new CardsImpl(); + cards.addAll(controller.getLibrary().getTopCards(game, 4)); + boolean properCardFound = cards.count(filterPutInHand, source.getControllerId(), source.getSourceId(), game) > 0; + if (!cards.isEmpty()) { + controller.revealCards(sourceObject.getName(), cards, game); + TargetCard target = new TargetCard(Zone.LIBRARY, filterPutInHand); + if (properCardFound + && controller.chooseUse(outcome, "Put an artifact, creature, enchantment, land, or planeswalker card into your hand?", source, game) + && controller.choose(Outcome.DrawCard, cards, target, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + cards.remove(card); + controller.moveCards(card, Zone.HAND, source, game); + } + + } + controller.moveCards(cards, Zone.GRAVEYARD, source, game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfParamnesia.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfParamnesia.java new file mode 100644 index 0000000000..ff7101f27b --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VesselOfParamnesia.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.sets.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPlayer; + +/** + * + * @author fireshoes + */ +public class VesselOfParamnesia extends CardImpl { + + public VesselOfParamnesia(UUID ownerId) { + super(ownerId, 95, "Vessel of Paramnesia", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "SOI"; + + // {U}, Sacrifice Vessel of Paramnesia: Target player puts the top three cards of his or her library into his or her graveyard. Draw a card. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutTopCardOfLibraryIntoGraveTargetEffect(3), new ManaCostsImpl("{U}")); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetPlayer()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + this.addAbility(ability); + } + + public VesselOfParamnesia(final VesselOfParamnesia card) { + super(card); + } + + @Override + public VesselOfParamnesia copy() { + return new VesselOfParamnesia(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VillageMessenger.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VillageMessenger.java new file mode 100644 index 0000000000..b9bc34ea5c --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/VillageMessenger.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.condition.common.NoSpellsWereCastLastTurnCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author fireshoes + */ +public class VillageMessenger extends CardImpl { + + public VillageMessenger(UUID ownerId) { + super(ownerId, 190, "Village Messenger", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Werewolf"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + this.canTransform = true; + this.secondSideCard = new MoonriseIntruder(ownerId); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // At the beginning of each upkeep, if no spells were cast last turn, transform Village Messenger. + this.addAbility(new TransformAbility()); + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(true), TargetController.ANY, false); + this.addAbility(new ConditionalTriggeredAbility(ability, NoSpellsWereCastLastTurnCondition.getInstance(), TransformAbility.NO_SPELLS_TRANSFORM_RULE)); + } + + public VillageMessenger(final VillageMessenger card) { + super(card); + } + + @Override + public VillageMessenger copy() { + return new VillageMessenger(this); + } +} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 4bba24797e..400045ef44 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -57043,6 +57043,8 @@ Avacyn's Judgment|Shadows over Innistrad|145|R|{1}{R}|Sorcery|||Madness {X}{R} < Breakneck Rider|Shadows over Innistrad|147a|U|{1}{R}{R}|Creature - Human Scout Werewolf|3|3|At the beginning of each upkeep, if no spells were cast last turn, transform Breakneck Rider.| Neck Breaker|Shadows over Innistrad|147b|U||Creature - Werewolf|4|3|Attacking creatures you control get +1/+0 and have trample.$At the beginning of each upkeep, if a player cast two or more spells last turn, transform Neck Breaker.| Burn from Within|Shadows over Innistrad|148|R|{X}{R}|Sorcery|||Burn from Within deals X damage to target creature or player. If a creature is dealt damage this way, it loses indestructible until end of turn. If that creature would die this turn, exile it instead.| +Convicted Killer|Shadows over Innistrad|149a|C|{2}{R}|Creature - Human Werewolf|2|2|At the beginning of each upkeep, if no spells were cast last turn, transform Convicted Killer.| +Branded Howler|Shadows over Innistrad|149b|C||Creature - Werewolf|4|4|At the beginning of each upkeep, if a player cast two or more spells last turn, transform Branded Howler.| Dance with Devils|Shadows over Innistrad|150|U|{3}{R}|Instant|||Put two 1/1 red Devil creature tokens onto the battlefield. They have "When this creature dies, it deals 1 damage to target creature or player."| Devil's Playground|Shadows over Innistrad|151|R|{4}{R}{R}|Sorcery|||Put four 1/1 red Devil creature tokens onto the battlefield. They have "When this creature dies, it deals 1 damage to target creature or player."| Ember-Eye Wolf|Shadows over Innistrad|154|C|{2}{R}|Creature - Wolf|1|2|Haste${1}{R}: Ember-Eye Wolf gets +2/+0 until end of turn.| @@ -57079,7 +57081,7 @@ Groundskeeper|Shadows over Innistrad|208|U|{G}|Creature - Human Druid|1|1|{1}{G} Hinterland Logger|Shadows over Innistrad|210a|C|{1}{G}|Creature - Human Werewolf|2|1|At the beginning of each upkeep, if no spells were cast last turn, transform Hinterland Logger.| Timber Shredder|Shadows over Innistrad|210b|C||Creature - Werewolf|4|2|Trample$At the beginning of each upkeep, if a player cast two or more spells last turn, transform Timber Shredder.| Howlpack Resurgence|Shadows over Innistrad|211|U|{2}{G}|Enchantment|||Flash (You may cast this spell any time you could cast an instant.)$Each creature you control that's a Wolf or a Werewolf gets +1/+1 and has trample.| -Inexorable Mass|Shadows over Innistrad|212|R|{2}{G}|Creature - Oooze|3|3|Delirium — Whenever Inexorable Mass attacks and there are at least four card types among cards in your graveyard, put a 3/3 green Ooze creature token onto the battlefield tapped and attacking.| +Inexorable Blob|Shadows over Innistrad|212|R|{2}{G}|Creature - Oooze|3|3|Delirium — Whenever Inexorable Blob attacks and there are at least four card types among cards in your graveyard, put a 3/3 green Ooze creature token onto the battlefield tapped and attacking.| Lambholt Pacifist|Shadows over Innistrad|215a|U|{1}{G}|Creature - Human Shaman Werewolf|3|3|Lambholt Pacifist can't attack unless you control a creature with power 4 or greater.$At the beginning of each upkeep, if no spells were cast last turn, transform Lambholt Pacifist.| Lambholt Butcher|Shadows over Innistrad|215b|U||Creature - Werewolf|4|4|At the beginning of each upkeep, if a player cast two or more spells last turn, transform Lambholt Butcher.| Obsessive Skinner|Shadows over Innistrad|220|U|{1}{G}|Creature - Human Rogue|1|1|When Obsessive Skinner enters the battlefield, put a +1/+1 counter on target creature.$Delirium — At the beginning of each opponent's upkeep, if there are four or more card types among cards in your graveyard, put a +1/+1 counter on target creature.|