From 23714d8634193b59881d3877268cd8e2b34677a0 Mon Sep 17 00:00:00 2001 From: Styxo Date: Thu, 7 Apr 2016 19:50:29 +0200 Subject: [PATCH] Added Rebellion of the Flamekin and Elemental Shaman Token, refactored Hostility and Hearthcage Giant to use the token as well --- .../mage/sets/jacevschandra/Hostility.java | 17 +- .../src/mage/sets/lorwyn/HearthcageGiant.java | 20 +-- .../sets/lorwyn/RebellionOfTheFlamekin.java | 154 ++++++++++++++++++ .../permanent/token/ElementalShamanToken.java | 51 ++++++ 4 files changed, 215 insertions(+), 27 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/lorwyn/RebellionOfTheFlamekin.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/ElementalShamanToken.java diff --git a/Mage.Sets/src/mage/sets/jacevschandra/Hostility.java b/Mage.Sets/src/mage/sets/jacevschandra/Hostility.java index 615e706f70..869cec4f56 100644 --- a/Mage.Sets/src/mage/sets/jacevschandra/Hostility.java +++ b/Mage.Sets/src/mage/sets/jacevschandra/Hostility.java @@ -27,7 +27,6 @@ */ package mage.sets.jacevschandra; -import java.util.Arrays; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; @@ -42,10 +41,10 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; +import mage.game.permanent.token.ElementalShamanToken; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; -import mage.game.permanent.token.Token; import mage.game.stack.Spell; /** @@ -131,19 +130,11 @@ class HostilityEffect extends PreventionEffectImpl { } } -class HostilityElementalToken extends Token { +class HostilityElementalToken extends ElementalShamanToken { public HostilityElementalToken() { - super("Elemental Shaman", "3/1 red Elemental Shaman creature token with haste"); - availableImageSetCodes.addAll(Arrays.asList("LRW", "DD2")); - cardType.add(CardType.CREATURE); - color.setRed(true); - subtype.add("Elemental"); - subtype.add("Shaman"); - power = new MageInt(3); - toughness = new MageInt(1); - + super(); + description = description + " with haste"; addAbility(HasteAbility.getInstance()); } - } diff --git a/Mage.Sets/src/mage/sets/lorwyn/HearthcageGiant.java b/Mage.Sets/src/mage/sets/lorwyn/HearthcageGiant.java index 7b5ecee990..0e02cad428 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/HearthcageGiant.java +++ b/Mage.Sets/src/mage/sets/lorwyn/HearthcageGiant.java @@ -42,7 +42,7 @@ import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.ElementalShamanToken; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreaturePermanent; @@ -70,7 +70,11 @@ public class HearthcageGiant extends CardImpl { this.power = new MageInt(5); this.toughness = new MageInt(5); - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new RedElementalToken(), 2), false)); + + //When Hearthcage Giant enters the battlefield, put two 3/1 red Elemental Shaman creature tokens onto the battlefield. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ElementalShamanToken(), 2), false)); + + //Sacrifice an Elemental: Target Giant creature gets +3/+1 until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(3, 1, Duration.EndOfTurn), new SacrificeTargetCost(new TargetControlledPermanent(filterElemental))); ability.addTarget(new TargetCreaturePermanent(filterGiant)); this.addAbility(ability); @@ -85,15 +89,3 @@ public class HearthcageGiant extends CardImpl { return new HearthcageGiant(this); } } - -class RedElementalToken extends Token { - RedElementalToken() { - super("Elemental Shaman", "3/1 red Elemental Shaman creature token"); - cardType.add(CardType.CREATURE); - color.setRed(true); - subtype.add("Elemental"); - subtype.add("Shaman"); - power = new MageInt(3); - toughness = new MageInt(1); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/lorwyn/RebellionOfTheFlamekin.java b/Mage.Sets/src/mage/sets/lorwyn/RebellionOfTheFlamekin.java new file mode 100644 index 0000000000..2849678b33 --- /dev/null +++ b/Mage.Sets/src/mage/sets/lorwyn/RebellionOfTheFlamekin.java @@ -0,0 +1,154 @@ +/* + * 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.lorwyn; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.token.ElementalShamanToken; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author Styxo + */ +public class RebellionOfTheFlamekin extends CardImpl { + + public RebellionOfTheFlamekin(UUID ownerId) { + super(ownerId, 188, "Rebellion of the Flamekin", Rarity.UNCOMMON, new CardType[]{CardType.TRIBAL, CardType.ENCHANTMENT}, "{3}{R}"); + this.expansionSetCode = "LRW"; + this.subtype.add("Elemental"); + + // Whenever you clash, you may pay {1}. If you do put a 3/1 Red Elemental Shaman creature token in play. If you won that token gains haste + this.addAbility(new RebellionOfTheFlamekinTriggeredAbility()); + } + + public RebellionOfTheFlamekin(final RebellionOfTheFlamekin card) { + super(card); + } + + @Override + public RebellionOfTheFlamekin copy() { + return new RebellionOfTheFlamekin(this); + } +} + +class RebellionOfTheFlamekinTriggeredAbility extends TriggeredAbilityImpl { + + public RebellionOfTheFlamekinTriggeredAbility() { + super(Zone.BATTLEFIELD, new RebellionOfTheFlamekinEffect()); + } + + public RebellionOfTheFlamekinTriggeredAbility(final RebellionOfTheFlamekinTriggeredAbility ability) { + super(ability); + } + + @Override + public RebellionOfTheFlamekinTriggeredAbility copy() { + return new RebellionOfTheFlamekinTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.CLASHED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + boolean youWonTheClash = false; + if (event.getData().equals("controller") && event.getPlayerId().equals(getControllerId()) + || event.getData().equals("opponent") && event.getTargetId().equals(getControllerId())) { + youWonTheClash = true; + } + for (Effect effect : getEffects()) { + if (effect instanceof RebellionOfTheFlamekinEffect) { + effect.setValue("clash", youWonTheClash); + } + } + return true; + } + + @Override + public String getRule() { + return "Whenever you clash, you may pay {1}. If you do put a 3/1 Red Elemental Shaman creature token in play. If you won that token gains haste until end of turn"; + } +} + +class RebellionOfTheFlamekinEffect extends OneShotEffect { + + public RebellionOfTheFlamekinEffect() { + super(Outcome.PutCreatureInPlay); + } + + public RebellionOfTheFlamekinEffect(final RebellionOfTheFlamekinEffect effect) { + super(effect); + } + + @Override + public RebellionOfTheFlamekinEffect copy() { + return new RebellionOfTheFlamekinEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + CreateTokenEffect createTokenEffect = new CreateTokenEffect(new ElementalShamanToken(), 1); + DoIfCostPaid doIfCostPaid = new DoIfCostPaid(createTokenEffect, new ManaCostsImpl("{1}")); + doIfCostPaid.apply(game, source); + Permanent token = game.getPermanent(createTokenEffect.getLastAddedTokenId()); + if (token != null && (boolean) (this.getValue("clash"))) { + ContinuousEffect continuousEffect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + continuousEffect.setTargetPointer(new FixedTarget(createTokenEffect.getLastAddedTokenId())); + game.addEffect(continuousEffect, source); + } + return true; + + } + return false; + + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/ElementalShamanToken.java b/Mage/src/main/java/mage/game/permanent/token/ElementalShamanToken.java new file mode 100644 index 0000000000..d0f44b8fc4 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ElementalShamanToken.java @@ -0,0 +1,51 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; + +/** + * + * @author Styxo + */ +public class ElementalShamanToken extends Token { + + public ElementalShamanToken() { + super("Elemental Shaman", "3/1 red Elemental Shaman creature token"); + availableImageSetCodes.addAll(Arrays.asList("LRW", "DD2")); + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add("Elemental"); + subtype.add("Shaman"); + power = new MageInt(3); + toughness = new MageInt(1); + } + +}