From 2e574ab19edf4b637ae96c0d184b1deb543c2da0 Mon Sep 17 00:00:00 2001 From: Quercitron Date: Wed, 10 Feb 2016 01:02:57 +0300 Subject: [PATCH] Added Gnat Alley Creeper, Tephraderm, Inflame, Wojek Embermage --- .../src/mage/sets/darksteel/Inflame.java | 52 ++++++ .../sets/dissension/GnatAlleyCreeper.java | 77 ++++++++ .../src/mage/sets/onslaught/Tephraderm.java | 173 ++++++++++++++++++ Mage.Sets/src/mage/sets/prophecy/Inflame.java | 67 +++++++ .../src/mage/sets/ravnica/WojekEmbermage.java | 111 +++++++++++ 5 files changed, 480 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/darksteel/Inflame.java create mode 100644 Mage.Sets/src/mage/sets/dissension/GnatAlleyCreeper.java create mode 100644 Mage.Sets/src/mage/sets/onslaught/Tephraderm.java create mode 100644 Mage.Sets/src/mage/sets/prophecy/Inflame.java create mode 100644 Mage.Sets/src/mage/sets/ravnica/WojekEmbermage.java diff --git a/Mage.Sets/src/mage/sets/darksteel/Inflame.java b/Mage.Sets/src/mage/sets/darksteel/Inflame.java new file mode 100644 index 00000000000..1147a2232ec --- /dev/null +++ b/Mage.Sets/src/mage/sets/darksteel/Inflame.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.darksteel; + +import java.util.UUID; + +/** + * + * @author Quercitron + */ +public class Inflame extends mage.sets.prophecy.Inflame { + + public Inflame(UUID ownerId) { + super(ownerId); + this.cardNumber = 64; + this.expansionSetCode = "DST"; + } + + public Inflame(final Inflame card) { + super(card); + } + + @Override + public Inflame copy() { + return new Inflame(this); + } +} diff --git a/Mage.Sets/src/mage/sets/dissension/GnatAlleyCreeper.java b/Mage.Sets/src/mage/sets/dissension/GnatAlleyCreeper.java new file mode 100644 index 00000000000..1b7b52f0cd4 --- /dev/null +++ b/Mage.Sets/src/mage/sets/dissension/GnatAlleyCreeper.java @@ -0,0 +1,77 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.dissension; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect; +import mage.abilities.keyword.CantBeBlockedSourceAbility; +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.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author Quercitron + */ +public class GnatAlleyCreeper extends CardImpl { + + private static final FilterCreaturePermanent FILTER = new FilterCreaturePermanent("creatures with flying"); + + static { + FILTER.add(new AbilityPredicate(FlyingAbility.class)); + } + + public GnatAlleyCreeper(UUID ownerId) { + super(ownerId, 63, "Gnat Alley Creeper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "DIS"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Gnat Alley Creeper can't be blocked by creatures with flying. + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(FILTER, Duration.WhileOnBattlefield))); + } + + public GnatAlleyCreeper(final GnatAlleyCreeper card) { + super(card); + } + + @Override + public GnatAlleyCreeper copy() { + return new GnatAlleyCreeper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/onslaught/Tephraderm.java b/Mage.Sets/src/mage/sets/onslaught/Tephraderm.java new file mode 100644 index 00000000000..ef072d6249c --- /dev/null +++ b/Mage.Sets/src/mage/sets/onslaught/Tephraderm.java @@ -0,0 +1,173 @@ +/* + * 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.onslaught; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.StackObject; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author Quercitron + */ +public class Tephraderm extends CardImpl { + + public Tephraderm(UUID ownerId) { + super(ownerId, 239, "Tephraderm", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{R}"); + this.expansionSetCode = "ONS"; + this.subtype.add("Beast"); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // Whenever a creature deals damage to Tephraderm, Tephraderm deals that much damage to that creature. + this.addAbility(new TephradermCreatureDamageTriggeredAbility()); + + // Whenever a spell deals damage to Tephraderm, Tephraderm deals that much damage to that spell's controller. + this.addAbility(new TephradermSpellDamageTriggeredAbility()); + } + + public Tephraderm(final Tephraderm card) { + super(card); + } + + @Override + public Tephraderm copy() { + return new Tephraderm(this); + } +} + +class TephradermCreatureDamageTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterCreaturePermanent FILTER_CREATURE = new FilterCreaturePermanent(); + + public TephradermCreatureDamageTriggeredAbility() { + super(Zone.BATTLEFIELD, new DamageTargetEffect(0)); + } + + public TephradermCreatureDamageTriggeredAbility(final TephradermCreatureDamageTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_CREATURE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!event.getTargetId().equals(this.getSourceId())) { + return false; + } + + Permanent sourcePermanent = game.getPermanent(event.getSourceId()); + if (sourcePermanent != null && FILTER_CREATURE.match(sourcePermanent, getSourceId(), getControllerId(), game)) { + for (Effect effect : getEffects()) { + if (effect instanceof DamageTargetEffect) { + effect.setTargetPointer(new FixedTarget(sourcePermanent.getId())); + ((DamageTargetEffect) effect).setAmount(new StaticValue(event.getAmount())); + } + } + return true; + } + + return false; + } + + @Override + public TriggeredAbility copy() { + return new TephradermCreatureDamageTriggeredAbility(this); + } + + @Override + public String getRule() { + return "Whenever a creature deals damage to {this}, {this} deals that much damage to that creature."; + } +} + +class TephradermSpellDamageTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterSpell FILTER_SPELL = new FilterSpell(); + + public TephradermSpellDamageTriggeredAbility() { + super(Zone.BATTLEFIELD, new DamageTargetEffect(0)); + } + + public TephradermSpellDamageTriggeredAbility(final TephradermSpellDamageTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_CREATURE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!event.getTargetId().equals(this.getSourceId())) { + return false; + } + + StackObject sourceSpell = game.getStack().getStackObject(event.getSourceId()); + if (sourceSpell != null && FILTER_SPELL.match(sourceSpell, getSourceId(), getControllerId(), game)) { + for (Effect effect : getEffects()) { + if (effect instanceof DamageTargetEffect) { + effect.setTargetPointer(new FixedTarget(sourceSpell.getControllerId())); + ((DamageTargetEffect) effect).setAmount(new StaticValue(event.getAmount())); + } + } + return true; + } + + return false; + } + + @Override + public TriggeredAbility copy() { + return new TephradermSpellDamageTriggeredAbility(this); + } + + @Override + public String getRule() { + return "Whenever a spell deals damage to {this}, {this} deals that much damage to that spell's controller."; + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/Inflame.java b/Mage.Sets/src/mage/sets/prophecy/Inflame.java new file mode 100644 index 00000000000..05b279330ff --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/Inflame.java @@ -0,0 +1,67 @@ +/* + * 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.prophecy; + +import java.util.UUID; + +import mage.abilities.effects.common.DamageAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.WasDealtDamageThisTurnPredicate; + +/** + * + * @author Quercitron + */ +public class Inflame extends CardImpl { + + private static final FilterCreaturePermanent FILTER = new FilterCreaturePermanent("creature dealt damage this turn"); + + static { + FILTER.add(new WasDealtDamageThisTurnPredicate()); + } + + public Inflame(UUID ownerId) { + super(ownerId, 91, "Inflame", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{R}"); + this.expansionSetCode = "PCY"; + + // Inflame deals 2 damage to each creature dealt damage this turn. + this.getSpellAbility().addEffect(new DamageAllEffect(2, FILTER)); + } + + public Inflame(final Inflame card) { + super(card); + } + + @Override + public Inflame copy() { + return new Inflame(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnica/WojekEmbermage.java b/Mage.Sets/src/mage/sets/ravnica/WojekEmbermage.java new file mode 100644 index 00000000000..6954b453c72 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnica/WojekEmbermage.java @@ -0,0 +1,111 @@ +/* + * 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.ravnica; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Quercitron + */ +public class WojekEmbermage extends CardImpl { + + public WojekEmbermage(UUID ownerId) { + super(ownerId, 152, "Wojek Embermage", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "RAV"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Radiance - {tap}: Wojek Embermage deals 1 damage to target creature and each other creature that shares a color with it. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new WojekEmbermageEffect(), new TapSourceCost()); + ability.setAbilityWord(AbilityWord.RADIANCE); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public WojekEmbermage(final WojekEmbermage card) { + super(card); + } + + @Override + public WojekEmbermage copy() { + return new WojekEmbermage(this); + } +} + +class WojekEmbermageEffect extends OneShotEffect { + + private static final FilterCreaturePermanent FILTER = new FilterCreaturePermanent(); + + public WojekEmbermageEffect() { + super(Outcome.Damage); + this.staticText = "{this} deals 1 damage to target creature and each other creature that shares a color with it"; + } + + public WojekEmbermageEffect(final WojekEmbermageEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent target = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (target != null) { + ObjectColor targetColor = target.getColor(game); + for (Permanent permanent : game.getBattlefield().getActivePermanents(FILTER, source.getControllerId(), game)) { + if (target.getId().equals(permanent.getId()) || permanent.getColor(game).shares(targetColor)) { + permanent.damage(1, source.getSourceId(), game, false, true); + } + } + return true; + } + return false; + } + + @Override + public Effect copy() { + return new WojekEmbermageEffect(this); + } +}