diff --git a/Mage.Sets/src/mage/sets/jacevschandra/ConeOfFlame.java b/Mage.Sets/src/mage/sets/jacevschandra/ConeOfFlame.java new file mode 100644 index 00000000000..b15065657d1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/jacevschandra/ConeOfFlame.java @@ -0,0 +1,52 @@ +/* + * 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.jacevschandra; + +import java.util.UUID; + +/** + * + * @author Quercitron + */ +public class ConeOfFlame extends mage.sets.knightsvsdragons.ConeOfFlame { + + public ConeOfFlame(UUID ownerId) { + super(ownerId); + this.cardNumber = 54; + this.expansionSetCode = "DD2"; + } + + public ConeOfFlame(final ConeOfFlame card) { + super(card); + } + + @Override + public ConeOfFlame copy() { + return new ConeOfFlame(this); + } +} diff --git a/Mage.Sets/src/mage/sets/knightsvsdragons/ConeOfFlame.java b/Mage.Sets/src/mage/sets/knightsvsdragons/ConeOfFlame.java new file mode 100644 index 00000000000..e0cca23b7de --- /dev/null +++ b/Mage.Sets/src/mage/sets/knightsvsdragons/ConeOfFlame.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.sets.knightsvsdragons; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author Quercitron + */ +public class ConeOfFlame extends CardImpl { + + public ConeOfFlame(UUID ownerId) { + super(ownerId, 75, "Cone of Flame", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{R}{R}"); + this.expansionSetCode = "DDG"; + + this.color.setRed(true); + + // Cone of Flame deals 1 damage to target creature or player, 2 damage to another target creature or player, and 3 damage to a third target creature or player. + this.getSpellAbility().addEffect(new ConeOfFlameEffect()); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer(3)); + } + + public ConeOfFlame(final ConeOfFlame card) { + super(card); + } + + @Override + public ConeOfFlame copy() { + return new ConeOfFlame(this); + } +} + +class ConeOfFlameEffect extends OneShotEffect { + + public ConeOfFlameEffect() { + super(Outcome.Damage); + this.staticText = "{source} deals 1 damage to target creature or player, 2 damage to another target creature or player, and 3 damage to a third target creature or player"; + } + + public ConeOfFlameEffect(final ConeOfFlameEffect effect) { + super(effect); + } + + @Override + public ConeOfFlameEffect copy() { + return new ConeOfFlameEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + boolean applied = false; + int damage = 1; + for (UUID targetId : targetPointer.getTargets(game, source)) { + Permanent permanent = game.getPermanent(targetId); + if (permanent != null) { + applied |= (permanent.damage(damage, source.getSourceId(), game, true, false) > 0); + } + Player player = game.getPlayer(targetId); + if (player != null) { + applied |= (player.damage(damage, source.getSourceId(), game, true, false) > 0); + } + damage++; + } + return applied; + } + +} diff --git a/Mage.Sets/src/mage/sets/magic2015/ActOnImpulse.java b/Mage.Sets/src/mage/sets/magic2015/ActOnImpulse.java new file mode 100644 index 00000000000..da44e8602c2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/ActOnImpulse.java @@ -0,0 +1,163 @@ +/* + * 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.magic2015; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Library; +import mage.players.Player; + +/** + * + * @author Quercitron + */ +public class ActOnImpulse extends CardImpl { + + public ActOnImpulse(UUID ownerId) { + super(ownerId, 126, "Act on Impulse", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{2}{R}"); + this.expansionSetCode = "M15"; + + this.color.setRed(true); + + // Exile the top three cards of your library. Until end of turn, you may play cards exiled this way. + this.getSpellAbility().addEffect(new ActOnImpulseExileEffect()); + } + + public ActOnImpulse(final ActOnImpulse card) { + super(card); + } + + @Override + public ActOnImpulse copy() { + return new ActOnImpulse(this); + } +} + +class ActOnImpulseExileEffect extends OneShotEffect { + + public ActOnImpulseExileEffect() { + super(Outcome.Benefit); + this.staticText = "Exile the top three cards of your library. Until end of turn, you may play cards exiled this way."; + } + + public ActOnImpulseExileEffect(final ActOnImpulseExileEffect effect) { + super(effect); + } + + @Override + public ActOnImpulseExileEffect copy() { + return new ActOnImpulseExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Library library = controller.getLibrary(); + List cards = new ArrayList<>(); + int count = Math.min(3, library.size()); + for (int i = 0; i < count; i++) { + Card card = library.removeFromTop(game); + if (card != null) { + cards.add(card); + } + } + if (cards.size() > 0) { + List cardsId = new ArrayList<>(); + for (Card card : cards) { + card.moveToExile(source.getSourceId(), "Act on Impulse", source.getSourceId(), game); + cardsId.add(card.getId()); + } + game.addEffect(new ActOnImpulseMayPlayExiledEffect(cardsId), source); + } + return true; + } + return false; + } + +} + +class ActOnImpulseMayPlayExiledEffect extends AsThoughEffectImpl { + + public List cards = new ArrayList<>(); + + public ActOnImpulseMayPlayExiledEffect(List cards) { + super(AsThoughEffectType.CAST, Duration.EndOfTurn, Outcome.Benefit); + this.cards.addAll(cards); + } + + public ActOnImpulseMayPlayExiledEffect(final ActOnImpulseMayPlayExiledEffect effect) { + super(effect); + this.cards.addAll(effect.cards); + } + + @Override + public ActOnImpulseMayPlayExiledEffect copy() { + return new ActOnImpulseMayPlayExiledEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean applies(UUID sourceId, Ability source, Game game) { + Card card = game.getCard(sourceId); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && card != null && game.getState().getZone(sourceId) == Zone.EXILED) { + if (cards.contains(sourceId)) { + if (card.getCardType().contains(CardType.LAND)) { + // If the revealed card is a land, you can play it only if it's your turn and you haven't yet played a land this turn. + if (game.getActivePlayerId().equals(source.getControllerId()) && controller.canPlayLand()) { + return true; + } + } else { + if (card.getSpellAbility().spellCanBeActivatedRegularlyNow(source.getControllerId(), game)) { + return true; + } + } + } + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/sets/magic2015/BroodKeeper.java b/Mage.Sets/src/mage/sets/magic2015/BroodKeeper.java new file mode 100644 index 00000000000..409b4061b40 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/BroodKeeper.java @@ -0,0 +1,90 @@ +/* + * 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.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AuraAttachedTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continious.BoostSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.permanent.token.Token; + +/** + * + * @author Quercitron + */ +public class BroodKeeper extends CardImpl { + + public BroodKeeper(UUID ownerId) { + super(ownerId, 132, "Brood Keeper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "M15"; + this.subtype.add("Human"); + this.subtype.add("Shaman"); + + this.color.setRed(true); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Whenever an Aura becomes attached to Brood Keeper, put a 2/2 red Dragon creature token with flying onto the battlefield. + // It has "{R}: This creature gets +1/+0 until end of turn." + this.addAbility(new AuraAttachedTriggeredAbility(new CreateTokenEffect(new BroodKeeperDragonToken()), false)); + } + + public BroodKeeper(final BroodKeeper card) { + super(card); + } + + @Override + public BroodKeeper copy() { + return new BroodKeeper(this); + } +} + +class BroodKeeperDragonToken extends Token { + + public BroodKeeperDragonToken() { + super("Dragon", "2/2 red Dragon creature token with flying. It has \"{R}: This creature gets +1/+0 until end of turn.\""); + this.setOriginalExpansionSetCode("M15"); + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add("Dragon"); + power = new MageInt(2); + toughness = new MageInt(2); + + this.addAbility(FlyingAbility.getInstance()); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl("{R}"))); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/ConeOfFlame.java b/Mage.Sets/src/mage/sets/magic2015/ConeOfFlame.java new file mode 100644 index 00000000000..e4787eb34d0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/ConeOfFlame.java @@ -0,0 +1,52 @@ +/* + * 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.magic2015; + +import java.util.UUID; + +/** + * + * @author Quercitron + */ +public class ConeOfFlame extends mage.sets.knightsvsdragons.ConeOfFlame { + + public ConeOfFlame(UUID ownerId) { + super(ownerId); + this.cardNumber = 137; + this.expansionSetCode = "M15"; + } + + public ConeOfFlame(final ConeOfFlame card) { + super(card); + } + + @Override + public ConeOfFlame copy() { + return new ConeOfFlame(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/GeneratorServant.java b/Mage.Sets/src/mage/sets/magic2015/GeneratorServant.java new file mode 100644 index 00000000000..e47437bf5db --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/GeneratorServant.java @@ -0,0 +1,164 @@ +/* + * 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.magic2015; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.WatcherScope; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.watchers.Watcher; + +/** + * + * @author Quercitron + */ +public class GeneratorServant extends CardImpl { + + public GeneratorServant(UUID ownerId) { + super(ownerId, 143, "Generator Servant", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "M15"; + this.subtype.add("Elemental"); + + this.color.setRed(true); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // {T}, Sacrifice Generator Servant: Add {2} to your mana pool. If that mana is spent on a creature spell, it gains haste until end of turn. + Mana mana = Mana.ColorlessMana(2); + mana.setFlag(true); // used to indicate this mana ability + SimpleManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, mana, new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.getEffects().get(0).setText("Add {2} to your mana pool. If that mana is spent on a creature spell, it gains haste until end of turn."); + this.addAbility(ability); + + this.addWatcher(new GeneratorServantWatcher()); + this.addAbility(new SimpleStaticAbility(Zone.ALL, new GeneratorServantHasteEffect())); + } + + public GeneratorServant(final GeneratorServant card) { + super(card); + } + + @Override + public GeneratorServant copy() { + return new GeneratorServant(this); + } +} + +class GeneratorServantWatcher extends Watcher { + + public List creatures = new ArrayList<>(); + + public GeneratorServantWatcher() { + super("GeneratorServantWatcher", WatcherScope.CARD); + } + + public GeneratorServantWatcher(final GeneratorServantWatcher watcher) { + super(watcher); + this.creatures.addAll(watcher.creatures); + } + + @Override + public GeneratorServantWatcher copy() { + return new GeneratorServantWatcher(this); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.MANA_PAYED) { + MageObject target = game.getObject(event.getTargetId()); + MageObject source = game.getObject(this.getSourceId()); + if (event.getSourceId() == this.getSourceId() && target != null && target.getCardType().contains(CardType.CREATURE) && event.getFlag()) { + if (target instanceof Spell) { + this.creatures.add(((Spell) target).getCard().getId()); + } + } + } + } + + @Override + public void reset() { + super.reset(); + creatures.clear(); + } + +} + +class GeneratorServantHasteEffect extends ContinuousEffectImpl { + + public GeneratorServantHasteEffect() { + super(Duration.EndOfGame, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + } + + public GeneratorServantHasteEffect(final GeneratorServantHasteEffect effect) { + super(effect); + } + + @Override + public ContinuousEffect copy() { + return new GeneratorServantHasteEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + GeneratorServantWatcher watcher = (GeneratorServantWatcher) game.getState().getWatchers().get("GeneratorServantWatcher", source.getSourceId()); + if (watcher != null) { + for (Permanent perm : game.getBattlefield().getAllActivePermanents()) { + if (watcher.creatures.contains(perm.getId())) { + perm.addAbility(HasteAbility.getInstance(), source.getSourceId(), game); + } + } + return true; + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/sets/magic2015/GoblinKaboomist.java b/Mage.Sets/src/mage/sets/magic2015/GoblinKaboomist.java new file mode 100644 index 00000000000..7e3647ce045 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/GoblinKaboomist.java @@ -0,0 +1,141 @@ +/* + * 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.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.Token; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Quercitron + */ +public class GoblinKaboomist extends CardImpl { + + public GoblinKaboomist(UUID ownerId) { + super(ownerId, 144, "Goblin Kaboomist", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "M15"; + this.subtype.add("Goblin"); + this.subtype.add("Warrior"); + + this.color.setRed(true); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // At the beginning of your upkeep, put a colorless artifact token named Land Mine onto the battlefield + // with "{R}, Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying." + // Then flip a coin. If you lose the flip, Goblin Kaboomist deals 2 damage to itself. + Ability ability = new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new LandMineToken()), TargetController.YOU, false); + ability.addEffect(new GoblinKaboomistFlipCoinEffect()); + this.addAbility(ability); + } + + public GoblinKaboomist(final GoblinKaboomist card) { + super(card); + } + + @Override + public GoblinKaboomist copy() { + return new GoblinKaboomist(this); + } +} + + +class GoblinKaboomistFlipCoinEffect extends OneShotEffect { + + public GoblinKaboomistFlipCoinEffect() { + super(Outcome.Damage); + } + + public GoblinKaboomistFlipCoinEffect(final GoblinKaboomistFlipCoinEffect effect) { + super(effect); + } + + @Override + public GoblinKaboomistFlipCoinEffect copy() { + return new GoblinKaboomistFlipCoinEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (player != null && permanent != null) { + if (!player.flipCoin(game)) { + String message = new StringBuilder(permanent.getName()).append(" deals 2 damage to itself").toString(); + game.informPlayers(message); + permanent.damage(2, source.getSourceId(), game, true, false); + } + return true; + } + return false; + } + +} + +class LandMineToken extends Token { + + private static final FilterAttackingCreature filter = new FilterAttackingCreature("attacking creature without flying"); + + static { + filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + } + + public LandMineToken() { + super("Land Mine", "colorless artifact token named Land Mine with \"{R}, Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying.\""); + this.setOriginalExpansionSetCode("M15"); + cardType.add(CardType.ARTIFACT); + + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{R}")); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/GoblinRabblemaster.java b/Mage.Sets/src/mage/sets/magic2015/GoblinRabblemaster.java new file mode 100644 index 00000000000..ad740f8cfd1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/GoblinRabblemaster.java @@ -0,0 +1,115 @@ +/* + * 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.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect; +import mage.abilities.effects.common.continious.BoostSourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.permanent.token.Token; + +/** + * + * @author Quercitron + */ +public class GoblinRabblemaster extends CardImpl { + + private static final FilterCreaturePermanent otherGoblinFilter = new FilterCreaturePermanent("Goblin", "Other Goblin creatures you control"); + private static final FilterCreaturePermanent attackingFilter = new FilterCreaturePermanent("Goblin", "other attacking Goblin"); + + static { + otherGoblinFilter.add(new AnotherPredicate()); + otherGoblinFilter.add(new ControllerPredicate(TargetController.YOU)); + + attackingFilter.add(new AttackingPredicate()); + attackingFilter.add(new AnotherPredicate()); + } + + public GoblinRabblemaster(UUID ownerId) { + super(ownerId, 145, "Goblin Rabblemaster", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "M15"; + this.subtype.add("Goblin"); + this.subtype.add("Warrior"); + + this.color.setRed(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Other Goblin creatures you control attack each turn if able. + Effect effect = new AttacksIfAbleAllEffect(otherGoblinFilter); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + + // At the beginning of combat on your turn, put a 1/1 red Goblin creature token with haste onto the battlefield. + this.addAbility(new BeginningOfCombatTriggeredAbility(new CreateTokenEffect(new GoblinToken()), TargetController.YOU, false)); + + // When Goblin Rabblemaster attacks, it gets +1/+0 until end of turn for each other attacking Goblin. + this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(new PermanentsOnBattlefieldCount(attackingFilter), new StaticValue(0), Duration.EndOfTurn), false)); + } + + public GoblinRabblemaster(final GoblinRabblemaster card) { + super(card); + } + + @Override + public GoblinRabblemaster copy() { + return new GoblinRabblemaster(this); + } +} + +class GoblinToken extends Token { + + public GoblinToken() { + super("Goblin", "1/1 red Goblin creature token with haste"); + this.setOriginalExpansionSetCode("M15"); + cardType.add(CardType.CREATURE); + subtype.add("Goblin"); + color.setRed(true); + power = new MageInt(1); + toughness = new MageInt(1); + addAbility(HasteAbility.getInstance()); + } + +} diff --git a/Mage.Sets/src/mage/sets/magic2015/KrenkosEnforcer.java b/Mage.Sets/src/mage/sets/magic2015/KrenkosEnforcer.java new file mode 100644 index 00000000000..23b20e98f4e --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/KrenkosEnforcer.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.sets.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.IntimidateAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author Quercitron + */ +public class KrenkosEnforcer extends CardImpl { + + public KrenkosEnforcer(UUID ownerId) { + super(ownerId, 152, "Krenko's Enforcer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); + this.expansionSetCode = "M15"; + this.subtype.add("Goblin"); + this.subtype.add("Warrior"); + + this.color.setRed(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Intimidate + this.addAbility(IntimidateAbility.getInstance()); + } + + public KrenkosEnforcer(final KrenkosEnforcer card) { + super(card); + } + + @Override + public KrenkosEnforcer copy() { + return new KrenkosEnforcer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/MightMakesRight.java b/Mage.Sets/src/mage/sets/magic2015/MightMakesRight.java new file mode 100644 index 00000000000..1ca2cd6db14 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/MightMakesRight.java @@ -0,0 +1,124 @@ +/* + * 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.magic2015; + +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continious.GainAbilityTargetEffect; +import mage.abilities.effects.common.continious.GainControlTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Quercitron + */ +public class MightMakesRight extends CardImpl { + + private static final String ruleText = "At the beginning of combat on your turn, if you control each creature on the battlefield with the greatest power, " + + "gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn."; + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public MightMakesRight(UUID ownerId) { + super(ownerId, 156, "Might Makes Right", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{5}{R}"); + this.expansionSetCode = "M15"; + + this.color.setRed(true); + + // At the beginning of combat on your turn, if you control each creature on the battlefield with the greatest power, gain control + // of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. + TriggeredAbility gainControlAbility = new BeginningOfCombatTriggeredAbility(new GainControlTargetEffect(Duration.EndOfTurn), TargetController.YOU, false); + gainControlAbility.addEffect(new UntapTargetEffect()); + gainControlAbility.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); + gainControlAbility.addTarget(new TargetCreaturePermanent(filter)); + Ability conditionalAbility = new ConditionalTriggeredAbility(gainControlAbility, ControlsEachCreatureWithGreatestPowerCondition.getInstance(), ruleText); + this.addAbility(conditionalAbility); + } + + public MightMakesRight(final MightMakesRight card) { + super(card); + } + + @Override + public MightMakesRight copy() { + return new MightMakesRight(this); + } +} + +class ControlsEachCreatureWithGreatestPowerCondition implements Condition { + + private static final ControlsEachCreatureWithGreatestPowerCondition fInstance = new ControlsEachCreatureWithGreatestPowerCondition(); + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + public static Condition getInstance() { + return fInstance; + } + + @Override + public boolean apply(Game game, Ability source) { + Integer maxPower = null; + boolean result = false; + List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); + for (Permanent permanent : permanents) { + if (permanent == null) { + continue; + } + int power = permanent.getPower().getValue(); + if (maxPower == null || power > maxPower) { + maxPower = permanent.getPower().getValue(); + result = true; + } + if (power == maxPower) { + result &= permanent.getControllerId().equals(source.getControllerId()); + } + } + return result; + } + +} diff --git a/Mage.Sets/src/mage/sets/planechase/ConeOfFlame.java b/Mage.Sets/src/mage/sets/planechase/ConeOfFlame.java new file mode 100644 index 00000000000..1e5062f5de2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/planechase/ConeOfFlame.java @@ -0,0 +1,52 @@ +/* + * 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.planechase; + +import java.util.UUID; + +/** + * + * @author Quercitron + */ +public class ConeOfFlame extends mage.sets.knightsvsdragons.ConeOfFlame { + + public ConeOfFlame(UUID ownerId) { + super(ownerId); + this.cardNumber = 52; + this.expansionSetCode = "HOP"; + } + + public ConeOfFlame(final ConeOfFlame card) { + super(card); + } + + @Override + public ConeOfFlame copy() { + return new ConeOfFlame(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnika/BrambleElemental.java b/Mage.Sets/src/mage/sets/ravnika/BrambleElemental.java index deef981a7ab..515f6c12d60 100644 --- a/Mage.Sets/src/mage/sets/ravnika/BrambleElemental.java +++ b/Mage.Sets/src/mage/sets/ravnika/BrambleElemental.java @@ -30,16 +30,10 @@ package mage.sets.ravnika; import java.util.UUID; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; +import mage.abilities.common.AuraAttachedTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.game.permanent.token.SaprolingToken; /** @@ -57,7 +51,7 @@ public class BrambleElemental extends CardImpl { this.toughness = new MageInt(4); // Whenever an Aura becomes attached to Bramble Elemental, put two 1/1 green Saproling creature tokens onto the battlefield. - this.addAbility(new AttachedTriggeredAbility(new CreateTokenEffect(new SaprolingToken(),2),false)); + this.addAbility(new AuraAttachedTriggeredAbility(new CreateTokenEffect(new SaprolingToken(),2),false)); } public BrambleElemental(final BrambleElemental card) { @@ -69,37 +63,3 @@ public class BrambleElemental extends CardImpl { return new BrambleElemental(this); } } - -class AttachedTriggeredAbility extends TriggeredAbilityImpl { - - public AttachedTriggeredAbility(Effect effect, boolean optional) { - super(Zone.BATTLEFIELD, effect, optional); - } - - public AttachedTriggeredAbility(final AttachedTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ATTACHED && event.getTargetId().equals(this.getSourceId()) ) { - Permanent attachment = game.getPermanent(event.getSourceId()); - if (attachment != null && attachment.getSubtype().contains("Aura")) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever an Aura becomes attached to {this}, " + super.getRule(); - } - - @Override - public AttachedTriggeredAbility copy() { - return new AttachedTriggeredAbility(this); - } - - -} diff --git a/Mage.Sets/src/mage/sets/tenth/ConeOfFlame.java b/Mage.Sets/src/mage/sets/tenth/ConeOfFlame.java new file mode 100644 index 00000000000..df055c00e99 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tenth/ConeOfFlame.java @@ -0,0 +1,52 @@ +/* + * 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.tenth; + +import java.util.UUID; + +/** + * + * @author Quercitron + */ +public class ConeOfFlame extends mage.sets.knightsvsdragons.ConeOfFlame { + + public ConeOfFlame(UUID ownerId) { + super(ownerId); + this.cardNumber = 194; + this.expansionSetCode = "10E"; + } + + public ConeOfFlame(final ConeOfFlame card) { + super(card); + } + + @Override + public ConeOfFlame copy() { + return new ConeOfFlame(this); + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/ConeOfFlame.java b/Mage.Sets/src/mage/sets/weatherlight/ConeOfFlame.java new file mode 100644 index 00000000000..c659ebc2d87 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/ConeOfFlame.java @@ -0,0 +1,52 @@ +/* + * 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.weatherlight; + +import java.util.UUID; + +/** + * + * @author Quercitron + */ +public class ConeOfFlame extends mage.sets.knightsvsdragons.ConeOfFlame { + + public ConeOfFlame(UUID ownerId) { + super(ownerId); + this.cardNumber = 95; + this.expansionSetCode = "WTH"; + } + + public ConeOfFlame(final ConeOfFlame card) { + super(card); + } + + @Override + public ConeOfFlame copy() { + return new ConeOfFlame(this); + } +} diff --git a/Mage/src/mage/abilities/common/AuraAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/AuraAttachedTriggeredAbility.java new file mode 100644 index 00000000000..0c070a0f22c --- /dev/null +++ b/Mage/src/mage/abilities/common/AuraAttachedTriggeredAbility.java @@ -0,0 +1,72 @@ +/* + * 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.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class AuraAttachedTriggeredAbility extends TriggeredAbilityImpl { + + public AuraAttachedTriggeredAbility(Effect effect, boolean optional) { + super(Zone.BATTLEFIELD, effect, optional); + } + + public AuraAttachedTriggeredAbility(final AuraAttachedTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.ATTACHED && event.getTargetId().equals(this.getSourceId())) { + Permanent attachment = game.getPermanent(event.getSourceId()); + if (attachment != null && attachment.getSubtype().contains("Aura")) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever an Aura becomes attached to {this}, " + super.getRule(); + } + + @Override + public AuraAttachedTriggeredAbility copy() { + return new AuraAttachedTriggeredAbility(this); + } + +}