diff --git a/Mage.Sets/src/mage/cards/a/AnointedProcession.java b/Mage.Sets/src/mage/cards/a/AnointedProcession.java index b4ab67cf2e3..0b666b621f8 100644 --- a/Mage.Sets/src/mage/cards/a/AnointedProcession.java +++ b/Mage.Sets/src/mage/cards/a/AnointedProcession.java @@ -28,19 +28,12 @@ package mage.cards.a; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.replacement.CreateTwiceThatManyTokensEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.stack.StackObject; /** * @@ -52,7 +45,7 @@ public class AnointedProcession extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); // If an effect would create one or more tokens under your control, it creates twice that many of those tokens instead. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AnointedProcessionEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreateTwiceThatManyTokensEffect())); } public AnointedProcession(final AnointedProcession card) { @@ -64,43 +57,3 @@ public class AnointedProcession extends CardImpl { return new AnointedProcession(this); } } - -class AnointedProcessionEffect extends ReplacementEffectImpl { - - public AnointedProcessionEffect() { - super(Duration.WhileOnBattlefield, Outcome.Copy); - staticText = "If an effect would create one or more tokens under your control, it creates twice that many of those tokens instead"; - } - - public AnointedProcessionEffect(final AnointedProcessionEffect effect) { - super(effect); - } - - @Override - public AnointedProcessionEffect copy() { - return new AnointedProcessionEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == EventType.CREATE_TOKEN; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - StackObject spell = game.getStack().getStackObject(event.getSourceId()); - return spell != null && spell.getControllerId().equals(source.getControllerId()); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); - return false; - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/b/BattlefieldScavenger.java b/Mage.Sets/src/mage/cards/b/BattlefieldScavenger.java index 46726a0b23c..8507a57279e 100644 --- a/Mage.Sets/src/mage/cards/b/BattlefieldScavenger.java +++ b/Mage.Sets/src/mage/cards/b/BattlefieldScavenger.java @@ -29,19 +29,12 @@ package mage.cards.b; import java.util.UUID; import mage.MageInt; -import mage.abilities.AbilityImpl; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.common.WheneverYouExertCreatureTriggeredAbility; -import mage.abilities.effects.Effect; +import mage.abilities.common.ExertCreatureControllerTriggeredAbility; import mage.abilities.effects.common.RummageEffect; import mage.abilities.keyword.ExertAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; /** * @@ -51,7 +44,7 @@ public class BattlefieldScavenger extends CardImpl { public BattlefieldScavenger(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); - + this.subtype.add("Jackal"); this.subtype.add("Rogue"); this.power = new MageInt(2); @@ -61,7 +54,7 @@ public class BattlefieldScavenger extends CardImpl { this.addAbility(new ExertAbility(null, false)); // Whenever you exert a creature, you may discard a card. If you do, draw a card. - this.addAbility(new WheneverYouExertCreatureTriggeredAbility(new RummageEffect())); + this.addAbility(new ExertCreatureControllerTriggeredAbility(new RummageEffect())); } public BattlefieldScavenger(final BattlefieldScavenger card) { @@ -73,5 +66,3 @@ public class BattlefieldScavenger extends CardImpl { return new BattlefieldScavenger(this); } } - - diff --git a/Mage.Sets/src/mage/cards/b/BedlamReveler.java b/Mage.Sets/src/mage/cards/b/BedlamReveler.java index 4a27b5141bd..b0a2370d0f6 100644 --- a/Mage.Sets/src/mage/cards/b/BedlamReveler.java +++ b/Mage.Sets/src/mage/cards/b/BedlamReveler.java @@ -27,25 +27,20 @@ */ package mage.cards.b; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.SpellAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.effects.common.cost.SourceCostReductionForEachCardInGraveyardEffect; import mage.abilities.effects.common.discard.DiscardHandControllerEffect; import mage.abilities.keyword.ProwessAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.common.FilterInstantOrSorceryCard; -import mage.game.Game; -import mage.players.Player; -import mage.util.CardUtil; - -import java.util.UUID; /** * @@ -54,14 +49,14 @@ import java.util.UUID; public class BedlamReveler extends CardImpl { public BedlamReveler(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{6}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{R}{R}"); this.subtype.add("Devil"); this.subtype.add("Horror"); this.power = new MageInt(3); this.toughness = new MageInt(4); // Bedlam Reveler costs {1} less to cast for each instant or sorcery card in your graveyard. - Ability ability = new SimpleStaticAbility(Zone.ALL, new BedlamRevelerCostReductionEffect()); + Ability ability = new SimpleStaticAbility(Zone.ALL, new SourceCostReductionForEachCardInGraveyardEffect(new FilterInstantOrSorceryCard())); ability.setRuleAtTheTop(true); this.addAbility(ability); @@ -85,39 +80,3 @@ public class BedlamReveler extends CardImpl { return new BedlamReveler(this); } } - -class BedlamRevelerCostReductionEffect extends CostModificationEffectImpl { - - BedlamRevelerCostReductionEffect() { - super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); - staticText = "{this} costs {1} less to cast for each instant or sorcery card in your graveyard"; - } - - BedlamRevelerCostReductionEffect(BedlamRevelerCostReductionEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source, Ability abilityToModify) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - int reductionAmount = player.getGraveyard().count(new FilterInstantOrSorceryCard(), game); - CardUtil.reduceCost(abilityToModify, reductionAmount); - return true; - } - return false; - } - - @Override - public boolean applies(Ability abilityToModify, Ability source, Game game) { - if ((abilityToModify instanceof SpellAbility) && abilityToModify.getSourceId().equals(source.getSourceId())) { - return game.getCard(abilityToModify.getSourceId()) != null; - } - return false; - } - - @Override - public BedlamRevelerCostReductionEffect copy() { - return new BedlamRevelerCostReductionEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BindingMummy.java b/Mage.Sets/src/mage/cards/b/BindingMummy.java index fe681b5e7e1..e84f8dbf919 100644 --- a/Mage.Sets/src/mage/cards/b/BindingMummy.java +++ b/Mage.Sets/src/mage/cards/b/BindingMummy.java @@ -36,10 +36,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.FilterPermanent; +import static mage.filter.StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE; import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.TargetPermanent; @@ -50,14 +48,11 @@ import mage.target.TargetPermanent; */ public class BindingMummy extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); - private static final FilterPermanent filter2 = new FilterPermanent("artifact or creature"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); static { filter.add(new AnotherPredicate()); filter.add(new SubtypePredicate("Zombie")); - filter2.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), - new CardTypePredicate(CardType.CREATURE))); } public BindingMummy(UUID ownerId, CardSetInfo setInfo) { @@ -68,8 +63,8 @@ public class BindingMummy extends CardImpl { this.toughness = new MageInt(2); // Whenever another Zombie enters the battlefield under your control, you may tap target artifact or creature. - Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new TapTargetEffect(), filter, true); - ability.addTarget(new TargetPermanent(filter2)); + Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new TapTargetEffect(), filter, true, null, true); + ability.addTarget(new TargetPermanent(FILTER_PERMANENT_ARTIFACT_OR_CREATURE)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BlazingVolley.java b/Mage.Sets/src/mage/cards/b/BlazingVolley.java index 5b456706260..c2d7958281d 100644 --- a/Mage.Sets/src/mage/cards/b/BlazingVolley.java +++ b/Mage.Sets/src/mage/cards/b/BlazingVolley.java @@ -32,9 +32,7 @@ import mage.abilities.effects.common.DamageAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.TargetController; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.ControllerPredicate; +import mage.filter.common.FilterOpponentsCreaturePermanent; /** * @@ -42,17 +40,11 @@ import mage.filter.predicate.permanent.ControllerPredicate; */ public class BlazingVolley extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature your opponents control"); - - static { - filter.add(new ControllerPredicate(TargetController.OPPONENT)); - } - public BlazingVolley(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}"); - // Blazing Volley deals damage to each creature your opponents control. - getSpellAbility().addEffect(new DamageAllEffect(1, filter)); + // Blazing Volley deals 1 damage to each creature your opponents control. + getSpellAbility().addEffect(new DamageAllEffect(1, new FilterOpponentsCreaturePermanent("creature your opponents control"))); } public BlazingVolley(final BlazingVolley card) { diff --git a/Mage.Sets/src/mage/cards/b/BontusMonument.java b/Mage.Sets/src/mage/cards/b/BontusMonument.java index 668e474597d..f60d6c9bd0b 100644 --- a/Mage.Sets/src/mage/cards/b/BontusMonument.java +++ b/Mage.Sets/src/mage/cards/b/BontusMonument.java @@ -42,7 +42,7 @@ import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.FilterSpell; +import static mage.filter.StaticFilters.FILTER_SPELL_A_CREATURE; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.ColorPredicate; @@ -53,15 +53,11 @@ import mage.filter.predicate.mageobject.ColorPredicate; */ public class BontusMonument extends CardImpl { - private static final FilterCard filter = new FilterCard("Black creature spells"); - private static final FilterSpell filter2 = new FilterSpell("a creature spell"); + private static final FilterCard filter = new FilterCard("black creature spells"); static { filter.add(Predicates.and(new ColorPredicate(ObjectColor.BLACK), new CardTypePredicate(CardType.CREATURE))); } - static { - filter2.add(new CardTypePredicate(CardType.CREATURE)); - } public BontusMonument(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); @@ -72,7 +68,7 @@ public class BontusMonument extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 1))); // Whenever you cast a creature spell, each opponent loses 1 life and you gain 1 life. - Ability ability = new SpellCastControllerTriggeredAbility(new LoseLifeOpponentsEffect(1), filter2, false); + Ability ability = new SpellCastControllerTriggeredAbility(new LoseLifeOpponentsEffect(1), FILTER_SPELL_A_CREATURE, false); Effect effect = new GainLifeEffect(1); effect.setText("and you gain 1 life"); ability.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java b/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java index a6076e767d2..cca0812bd69 100644 --- a/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java +++ b/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java @@ -31,6 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; @@ -71,8 +72,11 @@ public class CartoucheOfSolidarity extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WarriorVigilantToken()))); // Enchanted creature gets +1/+1 and has first strike. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA))); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)); + Effect effect = new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has first strike"); + ability.addEffect(effect); + this.addAbility(ability); } public CartoucheOfSolidarity(final CartoucheOfSolidarity card) { diff --git a/Mage.Sets/src/mage/cards/c/CrypticSerpent.java b/Mage.Sets/src/mage/cards/c/CrypticSerpent.java index de09958f464..b6b1eeabb2c 100644 --- a/Mage.Sets/src/mage/cards/c/CrypticSerpent.java +++ b/Mage.Sets/src/mage/cards/c/CrypticSerpent.java @@ -30,20 +30,13 @@ package mage.cards.c; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.effects.common.cost.SourceCostReductionForEachCardInGraveyardEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.CostModificationType; -import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.common.FilterInstantOrSorceryCard; -import mage.game.Game; -import mage.players.Player; -import mage.util.CardUtil; /** * @@ -59,9 +52,7 @@ public class CrypticSerpent extends CardImpl { this.toughness = new MageInt(5); // Cryptic Serpent costs {1} less to cast for each instant and sorcery card in your graveyard. - Ability ability = new SimpleStaticAbility(Zone.ALL, new CrypticSerpentCostReductionEffect()); - ability.setRuleAtTheTop(true); - this.addAbility(ability); + this.addAbility(new SimpleStaticAbility(Zone.ALL, new SourceCostReductionForEachCardInGraveyardEffect(new FilterInstantOrSorceryCard()))); } public CrypticSerpent(final CrypticSerpent card) { @@ -73,39 +64,3 @@ public class CrypticSerpent extends CardImpl { return new CrypticSerpent(this); } } - -class CrypticSerpentCostReductionEffect extends CostModificationEffectImpl { - - CrypticSerpentCostReductionEffect() { - super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); - staticText = "{this} costs {1} less to cast for each instant or sorcery card in your graveyard"; - } - - CrypticSerpentCostReductionEffect(CrypticSerpentCostReductionEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source, Ability abilityToModify) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - int reductionAmount = player.getGraveyard().count(new FilterInstantOrSorceryCard(), game); - CardUtil.reduceCost(abilityToModify, reductionAmount); - return true; - } - return false; - } - - @Override - public boolean applies(Ability abilityToModify, Ability source, Game game) { - if ((abilityToModify instanceof SpellAbility) && abilityToModify.getSourceId().equals(source.getSourceId())) { - return game.getCard(abilityToModify.getSourceId()) != null; - } - return false; - } - - @Override - public CrypticSerpentCostReductionEffect copy() { - return new CrypticSerpentCostReductionEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/c/CutRibbons.java b/Mage.Sets/src/mage/cards/c/CutRibbons.java index 994302b4c85..551324b99be 100644 --- a/Mage.Sets/src/mage/cards/c/CutRibbons.java +++ b/Mage.Sets/src/mage/cards/c/CutRibbons.java @@ -16,8 +16,9 @@ import java.util.UUID; * @author Stravant */ public class CutRibbons extends SplitCard { + public CutRibbons(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{R}","{X}{B}{B}",false); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}", "{X}{B}{B}", false); // Cut // Cut deals 4 damage to target creature. @@ -25,9 +26,9 @@ public class CutRibbons extends SplitCard { getLeftHalfCard().getSpellAbility().addEffect(new DamageTargetEffect(4)); // to - - // Feed - // Draw a card for each creature you control with power 3 or greater + + // Ribbons + // Each opponent loses X life. ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility()); getRightHalfCard().getSpellAbility().addEffect(new LoseLifeOpponentsEffect(new ManacostVariableValue())); @@ -41,4 +42,4 @@ public class CutRibbons extends SplitCard { public CutRibbons copy() { return new CutRibbons(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/d/DoublingSeason.java b/Mage.Sets/src/mage/cards/d/DoublingSeason.java index 78ace98682b..6d051176af1 100644 --- a/Mage.Sets/src/mage/cards/d/DoublingSeason.java +++ b/Mage.Sets/src/mage/cards/d/DoublingSeason.java @@ -27,9 +27,11 @@ */ package mage.cards.d; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.replacement.CreateTwiceThatManyTokensEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -40,8 +42,6 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import java.util.UUID; - /** * * @author LevelX2 @@ -52,7 +52,8 @@ public class DoublingSeason extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}"); // If an effect would create one or more tokens under your control, it creates twice that many of those tokens instead. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DoublingSeasonTokenEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreateTwiceThatManyTokensEffect())); + // If an effect would place one or more counters on a permanent you control, it places twice that many of those counters on that permanent instead. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DoublingSeasonCounterEffect())); @@ -68,40 +69,6 @@ public class DoublingSeason extends CardImpl { } } -class DoublingSeasonTokenEffect extends ReplacementEffectImpl { - - public DoublingSeasonTokenEffect() { - super(Duration.WhileOnBattlefield, Outcome.Copy); - staticText = "If an effect would create one or more tokens under your control, it creates twice that many of those tokens instead"; - } - - public DoublingSeasonTokenEffect(final DoublingSeasonTokenEffect effect) { - super(effect); - } - - @Override - public DoublingSeasonTokenEffect copy() { - return new DoublingSeasonTokenEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.CREATE_TOKEN; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - return event.getPlayerId().equals(source.getControllerId()); - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); - return false; - } - -} - class DoublingSeasonCounterEffect extends ReplacementEffectImpl { DoublingSeasonCounterEffect() { diff --git a/Mage.Sets/src/mage/cards/d/DreadWanderer.java b/Mage.Sets/src/mage/cards/d/DreadWanderer.java index c8b7dd76c05..cf13c8f04e4 100644 --- a/Mage.Sets/src/mage/cards/d/DreadWanderer.java +++ b/Mage.Sets/src/mage/cards/d/DreadWanderer.java @@ -29,18 +29,17 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTappedAbility; -import mage.abilities.condition.common.CardsInHandCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; import mage.constants.TimingRule; import mage.constants.Zone; import java.util.UUID; +import mage.abilities.condition.common.HeckbentCondition; /** * @@ -61,8 +60,7 @@ public class DreadWanderer extends CardImpl { // {2}{B}: Return Dread Wanderer from your graveyard to the battlefield. // Activate this ability only any time you could cast a sorcery and only if you have one or fewer cards in hand. - CardsInHandCondition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 2); - ConditionalActivatedAbility ability = new ConditionalActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl("{2}{B}"), condition); + ConditionalActivatedAbility ability = new ConditionalActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl("{2}{B}"), HeckbentCondition.instance); ability.setTiming(TimingRule.SORCERY); addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/e/EssenceScatter.java b/Mage.Sets/src/mage/cards/e/EssenceScatter.java index d0e00574847..8e15cfc7fe4 100644 --- a/Mage.Sets/src/mage/cards/e/EssenceScatter.java +++ b/Mage.Sets/src/mage/cards/e/EssenceScatter.java @@ -31,11 +31,10 @@ import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterSpell; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.TargetSpell; import java.util.UUID; +import mage.filter.common.FilterCreatureSpell; /** * @@ -43,17 +42,10 @@ import java.util.UUID; */ public class EssenceScatter extends CardImpl { - private static final FilterSpell filter = new FilterSpell("creature spell"); - - static { - filter.add(new CardTypePredicate(CardType.CREATURE)); - } - public EssenceScatter(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); - - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getSpellAbility().addTarget(new TargetSpell(new FilterCreatureSpell())); this.getSpellAbility().addEffect(new CounterTargetEffect()); } diff --git a/Mage.Sets/src/mage/cards/f/Fling.java b/Mage.Sets/src/mage/cards/f/Fling.java index e54a2547cf9..947139f3b04 100644 --- a/Mage.Sets/src/mage/cards/f/Fling.java +++ b/Mage.Sets/src/mage/cards/f/Fling.java @@ -25,24 +25,19 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.f; -import mage.abilities.Ability; -import mage.abilities.costs.Cost; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreatureOrPlayer; import java.util.UUID; +import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; /** * @@ -51,11 +46,13 @@ import java.util.UUID; public class Fling extends CardImpl { public Fling(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + Effect effect = new DamageTargetEffect(new SacrificeCostCreaturesPower()); + effect.setText("{this} deals damage equal to the sacrificed creature's power to target creature or player"); this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); - this.getSpellAbility().addEffect(new FlingEffect()); + this.getSpellAbility().addEffect(effect); } public Fling(final Fling card) { @@ -67,45 +64,3 @@ public class Fling extends CardImpl { return new Fling(this); } } - -class FlingEffect extends OneShotEffect { - - public FlingEffect() { - super(Outcome.Damage); - staticText = "{this} deals damage equal to the sacrificed creature's power to target creature or player"; - } - - public FlingEffect(final FlingEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - int amount = 0; - for (Cost cost: source.getCosts()) { - if (cost instanceof SacrificeTargetCost && !((SacrificeTargetCost) cost).getPermanents().isEmpty()) { - amount = ((SacrificeTargetCost)cost).getPermanents().get(0).getPower().getValue(); - break; - } - } - if (amount > 0) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null) { - permanent.damage(amount, source.getSourceId(), game, false, true); - return true; - } - Player player = game.getPlayer(source.getFirstTarget()); - if (player != null) { - player.damage(amount, source.getSourceId(), game, false, true); - return true; - } - } - return false; - } - - @Override - public FlingEffect copy() { - return new FlingEffect(this); - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/Ghoultree.java b/Mage.Sets/src/mage/cards/g/Ghoultree.java index fb259b14af2..8a8bc52c3eb 100644 --- a/Mage.Sets/src/mage/cards/g/Ghoultree.java +++ b/Mage.Sets/src/mage/cards/g/Ghoultree.java @@ -27,20 +27,15 @@ */ package mage.cards.g; +import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.effects.common.cost.SourceCostReductionForEachCardInGraveyardEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.players.Player; -import mage.util.CardUtil; - -import java.util.UUID; /** * @@ -49,7 +44,7 @@ import java.util.UUID; public class Ghoultree extends CardImpl { public Ghoultree(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{7}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{7}{G}"); this.subtype.add("Zombie"); this.subtype.add("Treefolk"); @@ -57,9 +52,7 @@ public class Ghoultree extends CardImpl { this.toughness = new MageInt(10); // Ghoultree costs {1} less to cast for each creature card in your graveyard. - Ability ability = new SimpleStaticAbility(Zone.ALL, new GhoultreeCostReductionEffect()); - ability.setRuleAtTheTop(true); - this.addAbility(ability); + this.addAbility(new SimpleStaticAbility(Zone.ALL, new SourceCostReductionForEachCardInGraveyardEffect(new FilterCreatureCard()))); } public Ghoultree(final Ghoultree card) { @@ -71,40 +64,3 @@ public class Ghoultree extends CardImpl { return new Ghoultree(this); } } - -class GhoultreeCostReductionEffect extends CostModificationEffectImpl { - - GhoultreeCostReductionEffect() { - super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); - staticText = "{this} costs {1} less to cast for each creature card in your graveyard"; - } - - GhoultreeCostReductionEffect(GhoultreeCostReductionEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source, Ability abilityToModify) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - int reductionAmount = player.getGraveyard().count(new FilterCreatureCard(), game); - CardUtil.reduceCost(abilityToModify, reductionAmount); - return true; - } - return false; - } - - @Override - public boolean applies(Ability abilityToModify, Ability source, Game game) { - if ((abilityToModify instanceof SpellAbility) && abilityToModify.getSourceId().equals(source.getSourceId())) { - return game.getCard(abilityToModify.getSourceId()) != null; - } - return false; - } - - @Override - public GhoultreeCostReductionEffect copy() { - return new GhoultreeCostReductionEffect(this); - } -} - diff --git a/Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java b/Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java index 079c01a3a17..cb00e8d7b0b 100644 --- a/Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java +++ b/Mage.Sets/src/mage/cards/g/GloryBoundInitiate.java @@ -30,6 +30,7 @@ package mage.cards.g; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.ExertAbility; @@ -54,8 +55,12 @@ public class GloryBoundInitiate extends CardImpl { this.toughness = new MageInt(1); // You may exert Glory-Bound Initiate as it attacks. When you do, it gets +1/+3 and gains lifelink until end of turn. - BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new BoostSourceEffect(1, 3, Duration.EndOfTurn)); - ability.addEffect(new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn)); + Effect effect = new BoostSourceEffect(1, 3, Duration.EndOfTurn); + effect.setText("it gets +1/+3"); + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(effect); + effect = new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains lifelink until end of turn"); + ability.addEffect(effect); this.addAbility(new ExertAbility(ability)); } diff --git a/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java b/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java index 439c37eb9a1..1ef69472349 100644 --- a/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java +++ b/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java @@ -30,22 +30,15 @@ package mage.cards.n; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.effects.common.cost.SourceCostReductionForEachCardInGraveyardEffect; import mage.abilities.keyword.MonstrosityAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.CostModificationType; -import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.players.Player; -import mage.util.CardUtil; /** * @@ -54,17 +47,17 @@ import mage.util.CardUtil; public class NemesisOfMortals extends CardImpl { public NemesisOfMortals(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.subtype.add("Snake"); this.power = new MageInt(5); this.toughness = new MageInt(5); // Nemesis of Mortals costs {1} less to cast for each creature card in your graveyard. - Ability ability = new SimpleStaticAbility(Zone.ALL, new NemesisOfMortalsCostReductionEffect()); + Ability ability = new SimpleStaticAbility(Zone.ALL, new SourceCostReductionForEachCardInGraveyardEffect(new FilterCreatureCard())); ability.setRuleAtTheTop(true); this.addAbility(ability); - + // {7}{G}{G}: Monstrosity 5. This ability costs {1} less to activate for each creature card in your graveyard. ability = new MonstrosityAbility("{7}{G}{G}", 5); for (Effect effect : ability.getEffects()) { @@ -82,41 +75,3 @@ public class NemesisOfMortals extends CardImpl { return new NemesisOfMortals(this); } } - -class NemesisOfMortalsCostReductionEffect extends CostModificationEffectImpl { - - NemesisOfMortalsCostReductionEffect() { - super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); - staticText = "{this} costs {1} less to cast for each creature card in your graveyard"; - } - - NemesisOfMortalsCostReductionEffect(NemesisOfMortalsCostReductionEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source, Ability abilityToModify) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - int reductionAmount = controller.getGraveyard().count(new FilterCreatureCard(), game); - CardUtil.reduceCost(abilityToModify, reductionAmount); - return true; - } - return false; - } - - @Override - public boolean applies(Ability abilityToModify, Ability source, Game game) { - if (((abilityToModify instanceof SpellAbility) || (abilityToModify instanceof MonstrosityAbility)) - && abilityToModify.getSourceId().equals(source.getSourceId())) { - return true; - } - return false; - } - - @Override - public NemesisOfMortalsCostReductionEffect copy() { - return new NemesisOfMortalsCostReductionEffect(this); - } -} - diff --git a/Mage.Sets/src/mage/cards/p/ParallelLives.java b/Mage.Sets/src/mage/cards/p/ParallelLives.java index 558a58d56af..40108f74544 100644 --- a/Mage.Sets/src/mage/cards/p/ParallelLives.java +++ b/Mage.Sets/src/mage/cards/p/ParallelLives.java @@ -28,19 +28,12 @@ package mage.cards.p; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.replacement.CreateTwiceThatManyTokensEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.stack.StackObject; /** * @@ -49,10 +42,10 @@ import mage.game.stack.StackObject; public class ParallelLives extends CardImpl { public ParallelLives(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); // If an effect would create one or more tokens under your control, it creates twice that many of those tokens instead. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ParallelLivesEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CreateTwiceThatManyTokensEffect())); } public ParallelLives(final ParallelLives card) { @@ -64,43 +57,3 @@ public class ParallelLives extends CardImpl { return new ParallelLives(this); } } - -class ParallelLivesEffect extends ReplacementEffectImpl { - - public ParallelLivesEffect() { - super(Duration.WhileOnBattlefield, Outcome.Copy); - staticText = "If an effect would create one or more tokens under your control, it creates twice that many of those tokens instead"; - } - - public ParallelLivesEffect(final ParallelLivesEffect effect) { - super(effect); - } - - @Override - public ParallelLivesEffect copy() { - return new ParallelLivesEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == EventType.CREATE_TOKEN; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - StackObject spell = game.getStack().getStackObject(event.getSourceId()); - return spell != null && spell.getControllerId().equals(source.getControllerId()); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); - return false; - } - -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/t/TrueheartTwins.java b/Mage.Sets/src/mage/cards/t/TrueheartTwins.java index 80002c43a20..1eca9ca7544 100644 --- a/Mage.Sets/src/mage/cards/t/TrueheartTwins.java +++ b/Mage.Sets/src/mage/cards/t/TrueheartTwins.java @@ -29,7 +29,7 @@ package mage.cards.t; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.WheneverYouExertCreatureTriggeredAbility; +import mage.abilities.common.ExertCreatureControllerTriggeredAbility; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.keyword.ExertAbility; import mage.cards.CardImpl; @@ -55,7 +55,7 @@ public class TrueheartTwins extends CardImpl { this.addAbility(new ExertAbility(null, false)); // Whenever you exert a creature, creatures you control get +1/+0 until end of turn. - this.addAbility(new WheneverYouExertCreatureTriggeredAbility(new BoostControlledEffect(1, 0, Duration.EndOfTurn))); + this.addAbility(new ExertCreatureControllerTriggeredAbility(new BoostControlledEffect(1, 0, Duration.EndOfTurn))); } public TrueheartTwins(final TrueheartTwins card) { diff --git a/Mage/src/main/java/mage/abilities/common/WheneverYouExertCreatureTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/ExertCreatureControllerTriggeredAbility.java similarity index 71% rename from Mage/src/main/java/mage/abilities/common/WheneverYouExertCreatureTriggeredAbility.java rename to Mage/src/main/java/mage/abilities/common/ExertCreatureControllerTriggeredAbility.java index 56099f422f3..ff91f35fb00 100644 --- a/Mage/src/main/java/mage/abilities/common/WheneverYouExertCreatureTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/ExertCreatureControllerTriggeredAbility.java @@ -10,13 +10,13 @@ import mage.game.permanent.Permanent; /** * @author stravant */ -public class WheneverYouExertCreatureTriggeredAbility extends TriggeredAbilityImpl { +public class ExertCreatureControllerTriggeredAbility extends TriggeredAbilityImpl { - public WheneverYouExertCreatureTriggeredAbility(Effect effect) { + public ExertCreatureControllerTriggeredAbility(Effect effect) { super(Zone.BATTLEFIELD, effect); } - public WheneverYouExertCreatureTriggeredAbility(final WheneverYouExertCreatureTriggeredAbility ability) { + public ExertCreatureControllerTriggeredAbility(final ExertCreatureControllerTriggeredAbility ability) { super(ability); } @@ -34,8 +34,8 @@ public class WheneverYouExertCreatureTriggeredAbility extends TriggeredAbilityIm } @Override - public WheneverYouExertCreatureTriggeredAbility copy() { - return new WheneverYouExertCreatureTriggeredAbility(this); + public ExertCreatureControllerTriggeredAbility copy() { + return new ExertCreatureControllerTriggeredAbility(this); } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SourceCostReductionForEachCardInGraveyardEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SourceCostReductionForEachCardInGraveyardEffect.java new file mode 100644 index 00000000000..4cd0dd416fc --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SourceCostReductionForEachCardInGraveyardEffect.java @@ -0,0 +1,86 @@ +/* + * 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.effects.common.cost; + +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author Styxo + */ +public class SourceCostReductionForEachCardInGraveyardEffect extends CostModificationEffectImpl { + + private FilterCard filter; + + public SourceCostReductionForEachCardInGraveyardEffect() { + this(new FilterCard()); + } + + public SourceCostReductionForEachCardInGraveyardEffect(FilterCard filter) { + super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); + this.filter = filter; + staticText = "{this} costs {1} less to cast for each " + filter.getMessage() + " in your graveyard"; + } + + SourceCostReductionForEachCardInGraveyardEffect(SourceCostReductionForEachCardInGraveyardEffect effect) { + super(effect); + this.filter = effect.filter.copy(); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + int reductionAmount = player.getGraveyard().count(filter, game); + CardUtil.reduceCost(abilityToModify, reductionAmount); + return true; + } + return false; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + if ((abilityToModify instanceof SpellAbility) && abilityToModify.getSourceId().equals(source.getSourceId())) { + return game.getCard(abilityToModify.getSourceId()) != null; + } + return false; + } + + @Override + public SourceCostReductionForEachCardInGraveyardEffect copy() { + return new SourceCostReductionForEachCardInGraveyardEffect(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/replacement/CreateTwiceThatManyTokensEffect.java b/Mage/src/main/java/mage/abilities/effects/common/replacement/CreateTwiceThatManyTokensEffect.java new file mode 100644 index 00000000000..3459ae69f12 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/replacement/CreateTwiceThatManyTokensEffect.java @@ -0,0 +1,73 @@ +/* + * 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.effects.common.replacement; + +import mage.abilities.Ability; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author LevelX2 + */ +public class CreateTwiceThatManyTokensEffect extends ReplacementEffectImpl { + + public CreateTwiceThatManyTokensEffect() { + super(Duration.WhileOnBattlefield, Outcome.Copy); + staticText = "If an effect would create one or more tokens under your control, it creates twice that many of those tokens instead"; + } + + public CreateTwiceThatManyTokensEffect(final CreateTwiceThatManyTokensEffect effect) { + super(effect); + } + + @Override + public CreateTwiceThatManyTokensEffect copy() { + return new CreateTwiceThatManyTokensEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.CREATE_TOKEN; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getPlayerId().equals(source.getControllerId()); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(event.getAmount() * 2); + return false; + } + +}