diff --git a/Mage.Sets/src/mage/cards/b/Benthicore.java b/Mage.Sets/src/mage/cards/b/Benthicore.java index 7f9763a7040..f4151c1554f 100644 --- a/Mage.Sets/src/mage/cards/b/Benthicore.java +++ b/Mage.Sets/src/mage/cards/b/Benthicore.java @@ -45,8 +45,8 @@ public final class Benthicore extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new MerfolkWizardToken(), 2), false)); // Tap two untapped Merfolk you control: Untap Benthicore. It gains shroud until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new TapTargetCost(new TargetControlledPermanent(2, 2, filter, false))); - ability.addEffect(new GainAbilitySourceEffect(ShroudAbility.getInstance(), Duration.EndOfTurn)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new TapTargetCost(new TargetControlledPermanent(2, filter))); + ability.addEffect(new GainAbilitySourceEffect(ShroudAbility.getInstance(), Duration.EndOfTurn).setText("it gains shroud until end of turn")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BoggartBirthRite.java b/Mage.Sets/src/mage/cards/b/BoggartBirthRite.java index efd73cd9480..a4dfc023ee1 100644 --- a/Mage.Sets/src/mage/cards/b/BoggartBirthRite.java +++ b/Mage.Sets/src/mage/cards/b/BoggartBirthRite.java @@ -1,8 +1,6 @@ - package mage.cards.b; -import java.util.UUID; -import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -10,8 +8,9 @@ import mage.constants.SubType; import mage.filter.FilterCard; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** - * * @author Loki */ public final class BoggartBirthRite extends CardImpl { @@ -23,10 +22,10 @@ public final class BoggartBirthRite extends CardImpl { } public BoggartBirthRite(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.TRIBAL,CardType.SORCERY},"{B}"); + super(ownerId, setInfo, new CardType[]{CardType.TRIBAL, CardType.SORCERY}, "{B}"); this.subtype.add(SubType.GOBLIN); - this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect()); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); } diff --git a/Mage.Sets/src/mage/cards/b/BoggartShenanigans.java b/Mage.Sets/src/mage/cards/b/BoggartShenanigans.java index 32ac7a90116..83bf41637b6 100644 --- a/Mage.Sets/src/mage/cards/b/BoggartShenanigans.java +++ b/Mage.Sets/src/mage/cards/b/BoggartShenanigans.java @@ -1,7 +1,5 @@ - package mage.cards.b; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.effects.common.DamageTargetEffect; @@ -9,21 +7,22 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetController; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import mage.target.common.TargetPlayerOrPlaneswalker; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class BoggartShenanigans extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another Goblin you control"); + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.GOBLIN); static { - filter.add(TargetController.YOU.getControllerPredicate()); - filter.add(SubType.GOBLIN.getPredicate()); + filter.add(AnotherPredicate.instance); } public BoggartShenanigans(UUID ownerId, CardSetInfo setInfo) { @@ -31,7 +30,9 @@ public final class BoggartShenanigans extends CardImpl { this.subtype.add(SubType.GOBLIN); // Whenever another Goblin you control dies, you may have Boggart Shenanigans deal 1 damage to target player. - Ability ability = new DiesCreatureTriggeredAbility(new DamageTargetEffect(1), true, filter, false); + Ability ability = new DiesCreatureTriggeredAbility( + new DamageTargetEffect(1), true, filter, false + ).setTriggerPhrase("Whenever another Goblin you control is put into a graveyard from the battlefield, "); ability.addTarget(new TargetPlayerOrPlaneswalker()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BrionStoutarm.java b/Mage.Sets/src/mage/cards/b/BrionStoutarm.java index a0a6865c344..f4ad0f30562 100644 --- a/Mage.Sets/src/mage/cards/b/BrionStoutarm.java +++ b/Mage.Sets/src/mage/cards/b/BrionStoutarm.java @@ -1,7 +1,5 @@ - package mage.cards.b; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -14,25 +12,22 @@ import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; import mage.game.Game; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetPlayerOrPlaneswalker; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class BrionStoutarm extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature other than Brion Stoutarm"); - - static { - filter.add(AnotherPredicate.instance); - } - public BrionStoutarm(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{W}"); addSuperType(SuperType.LEGENDARY); @@ -43,10 +38,11 @@ public final class BrionStoutarm extends CardImpl { // Lifelink this.addAbility(LifelinkAbility.getInstance()); + // {R}, {tap}, Sacrifice a creature other than Brion Stoutarm: Brion Stoutarm deals damage equal to the sacrificed creature's power to target player. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BrionStoutarmEffect(), new ManaCostsImpl("{R}")); + Ability ability = new SimpleActivatedAbility(new BrionStoutarmEffect(), new ManaCostsImpl<>("{R}")); ability.addCost(new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); ability.addTarget(new TargetPlayerOrPlaneswalker()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/c/CaterwaulingBoggart.java b/Mage.Sets/src/mage/cards/c/CaterwaulingBoggart.java index 7e976c7b309..2a32a367448 100644 --- a/Mage.Sets/src/mage/cards/c/CaterwaulingBoggart.java +++ b/Mage.Sets/src/mage/cards/c/CaterwaulingBoggart.java @@ -1,53 +1,45 @@ - package mage.cards.c; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.FilterPermanent; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class CaterwaulingBoggart extends CardImpl { - private static final FilterPermanent filterGoblin = new FilterControlledCreaturePermanent("Goblin"); - private static final FilterPermanent filterElemental = new FilterControlledCreaturePermanent("Elemental"); + private static final FilterPermanent filter = new FilterPermanent("Goblins you control and Elementals"); static { - filterGoblin.add(SubType.GOBLIN.getPredicate()); - filterElemental.add(SubType.ELEMENTAL.getPredicate()); + filter.add(Predicates.or( + SubType.GOBLIN.getPredicate(), + SubType.ELEMENTAL.getPredicate() + )); } public CaterwaulingBoggart(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.SHAMAN); this.power = new MageInt(2); this.toughness = new MageInt(2); - // Each Goblin you control has menace. (They can't be blocked except by two or more creatures.) - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect( - new MenaceAbility(), - Duration.WhileOnBattlefield, filterGoblin, - "Each Goblin you control has menace. (They can't be blocked except by two or more creatures.)"))); - - // Each Elemental you control has menace. (They can't be blocked except by two or more creatures.) - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect( - new MenaceAbility(), - Duration.WhileOnBattlefield, filterElemental, - "Each Elemental you control has menace. (They can't be blocked except by two or more creatures.)"))); + // Goblins you control and Elementals you control have menace. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + new MenaceAbility(false), Duration.WhileOnBattlefield, filter + ))); } private CaterwaulingBoggart(final CaterwaulingBoggart card) { diff --git a/Mage.Sets/src/mage/cards/c/Cloudthresher.java b/Mage.Sets/src/mage/cards/c/Cloudthresher.java index 0139ffd66e9..7b16baa23f2 100644 --- a/Mage.Sets/src/mage/cards/c/Cloudthresher.java +++ b/Mage.Sets/src/mage/cards/c/Cloudthresher.java @@ -42,7 +42,7 @@ public final class Cloudthresher extends CardImpl { this.addAbility(ReachAbility.getInstance()); // When Cloudthresher enters the battlefield, it deals 2 damage to each creature with flying and each player. Ability ability = new EntersBattlefieldTriggeredAbility(new DamageAllEffect(2, "it", filter)); - ability.addEffect(new DamagePlayersEffect(2)); + ability.addEffect(new DamagePlayersEffect(2).setText("and each player")); this.addAbility(ability); // Evoke {2}{G}{G} this.addAbility(new EvokeAbility("{2}{G}{G}")); diff --git a/Mage.Sets/src/mage/cards/c/ColfenorsUrn.java b/Mage.Sets/src/mage/cards/c/ColfenorsUrn.java index 5ffe45ee082..46df2f9f3f9 100644 --- a/Mage.Sets/src/mage/cards/c/ColfenorsUrn.java +++ b/Mage.Sets/src/mage/cards/c/ColfenorsUrn.java @@ -44,7 +44,7 @@ public final class ColfenorsUrn extends CardImpl { new ExileTargetForSourceEffect().setText("exile it"), true, filter, true, true)); // At the beginning of the end step, if three or more cards have been exiled with Colfenor's Urn, sacrifice it. If you do, return those cards to the battlefield under their owner's control. - this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new ColfenorsUrnEffect(), TargetController.ANY, new ColfenorsUrnCondition(), false)); + this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new ColfenorsUrnEffect(), TargetController.NEXT, new ColfenorsUrnCondition(), false)); } private ColfenorsUrn(final ColfenorsUrn card) { diff --git a/Mage.Sets/src/mage/cards/e/EgoErasure.java b/Mage.Sets/src/mage/cards/e/EgoErasure.java index 15f98b62d6f..c0077e492c1 100644 --- a/Mage.Sets/src/mage/cards/e/EgoErasure.java +++ b/Mage.Sets/src/mage/cards/e/EgoErasure.java @@ -13,7 +13,6 @@ import mage.game.permanent.Permanent; import mage.target.TargetPlayer; import java.util.Iterator; -import java.util.List; import java.util.UUID; /** @@ -28,9 +27,8 @@ public final class EgoErasure extends CardImpl { // Changeling this.addAbility(new ChangelingAbility()); - //Creatures target player controls get -2/+0 and lose all creature types until end of turn. - this.getSpellAbility().addEffect(new EgoErasureBoostEffect()); - this.getSpellAbility().addEffect(new EgoErasureLoseEffect()); + // Creatures target player controls get -2/+0 and lose all creature types until end of turn. + this.getSpellAbility().addEffect(new EgoErasureEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); } @@ -44,84 +42,67 @@ public final class EgoErasure extends CardImpl { } } -class EgoErasureLoseEffect extends ContinuousEffectImpl { +class EgoErasureEffect extends ContinuousEffectImpl { - public EgoErasureLoseEffect() { - super(Duration.EndOfTurn, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Neutral); - staticText = "and lose all creature types until end of turn"; + public EgoErasureEffect() { + super(Duration.EndOfTurn, Outcome.Neutral); + staticText = "creatures target player controls get -2/-0 and lose all creature types until end of turn"; } - public EgoErasureLoseEffect(final EgoErasureLoseEffect effect) { + public EgoErasureEffect(final EgoErasureEffect effect) { super(effect); } @Override - public EgoErasureLoseEffect copy() { - return new EgoErasureLoseEffect(this); + public EgoErasureEffect copy() { + return new EgoErasureEffect(this); } @Override public void init(Ability source, Game game) { super.init(source, game); - if (this.affectedObjectsSet) { - List creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getFirstTarget(), game); - for (Permanent creature : creatures) { - affectedObjectList.add(new MageObjectReference(creature, game)); + game.getBattlefield() + .getActivePermanents( + StaticFilters.FILTER_CONTROLLED_CREATURE, + source.getFirstTarget(), source.getSourceId(), game + ).stream() + .map(permanent -> new MageObjectReference(permanent, game)) + .forEach(affectedObjectList::add); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + for (Iterator it = affectedObjectList.iterator(); it.hasNext(); ) { + Permanent permanent = it.next().getPermanent(game); + if (permanent == null) { + it.remove(); + continue; + } + switch (layer) { + case TypeChangingEffects_4: + permanent.removeAllCreatureTypes(game); + break; + case PTChangingEffects_7: + if (sublayer == SubLayer.ModifyPT_7c) { + permanent.addPower(-2); + } + break; } } + if (affectedObjectList.isEmpty()) { + discard(); + return false; + } + return true; } @Override public boolean apply(Game game, Ability source) { - for (Iterator it = affectedObjectList.iterator(); it.hasNext(); ) { - Permanent permanent = it.next().getPermanent(game); - if (permanent != null) { - permanent.removeAllCreatureTypes(game); - } else { - it.remove(); - } - } - return true; - } -} - -class EgoErasureBoostEffect extends ContinuousEffectImpl { - - public EgoErasureBoostEffect() { - super(Duration.EndOfTurn, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.Benefit); - staticText = "Creatures target player controls get -2/+0"; - } - - public EgoErasureBoostEffect(final EgoErasureBoostEffect effect) { - super(effect); - } - - @Override - public EgoErasureBoostEffect copy() { - return new EgoErasureBoostEffect(this); - } - - @Override - public void init(Ability source, Game game) { - super.init(source, game); - if (this.affectedObjectsSet) { - List creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getFirstTarget(), game); - for (Permanent creature : creatures) { - affectedObjectList.add(new MageObjectReference(creature, game)); - } - } - } - - @Override - public boolean apply(Game game, Ability source) { - for (Iterator it = affectedObjectList.iterator(); it.hasNext(); ) { - Permanent permanent = it.next().getPermanent(game); - if (permanent != null) { - permanent.addPower(-2); - } else { - it.remove(); - } - } - return true; + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.TypeChangingEffects_4 || layer == Layer.PTChangingEffects_7; } } diff --git a/Mage.Sets/src/mage/cards/e/ElvishHandservant.java b/Mage.Sets/src/mage/cards/e/ElvishHandservant.java index 5c9a739143d..0534c5d3d07 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishHandservant.java +++ b/Mage.Sets/src/mage/cards/e/ElvishHandservant.java @@ -18,7 +18,7 @@ import mage.filter.FilterSpell; */ public final class ElvishHandservant extends CardImpl { - private static final FilterSpell filter = new FilterSpell("Giant"); + private static final FilterSpell filter = new FilterSpell("Giant spell"); static { filter.add(SubType.GIANT.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/e/EpicProportions.java b/Mage.Sets/src/mage/cards/e/EpicProportions.java index 5a82c8ee010..737a88ffd6c 100644 --- a/Mage.Sets/src/mage/cards/e/EpicProportions.java +++ b/Mage.Sets/src/mage/cards/e/EpicProportions.java @@ -1,7 +1,5 @@ - package mage.cards.e; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; @@ -16,24 +14,30 @@ import mage.constants.*; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author Loki */ public final class EpicProportions extends CardImpl { public EpicProportions(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}{G}"); this.subtype.add(SubType.AURA); this.addAbility(FlashAbility.getInstance()); TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); - Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + + Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect( + 5, 5, Duration.WhileOnBattlefield + )); + ability.addEffect(new GainAbilityAttachedEffect( + TrampleAbility.getInstance(), AttachmentType.AURA + ).setText("and has trample")); this.addAbility(ability); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(5, 5, Duration.WhileOnBattlefield))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA))); } private EpicProportions(final EpicProportions card) { diff --git a/Mage.Sets/src/mage/cards/f/FinalRevels.java b/Mage.Sets/src/mage/cards/f/FinalRevels.java index 28e1f96279d..ee222a8c28b 100644 --- a/Mage.Sets/src/mage/cards/f/FinalRevels.java +++ b/Mage.Sets/src/mage/cards/f/FinalRevels.java @@ -1,7 +1,5 @@ - package mage.cards.f; -import java.util.UUID; import mage.abilities.Mode; import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.cards.CardImpl; @@ -10,8 +8,9 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author Loki */ public final class FinalRevels extends CardImpl { @@ -19,10 +18,14 @@ public final class FinalRevels extends CardImpl { public FinalRevels(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}"); - this.getSpellAbility().addEffect(new BoostAllEffect(2, 0, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false)); - Mode mode = new Mode(); - mode.addEffect(new BoostAllEffect(0, -2, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false)); - this.getSpellAbility().addMode(mode); + this.getSpellAbility().addEffect(new BoostAllEffect( + 2, 0, Duration.EndOfTurn, + StaticFilters.FILTER_PERMANENT_ALL_CREATURES, false + )); + this.getSpellAbility().addMode(new Mode(new BoostAllEffect( + 0, -2, Duration.EndOfTurn, + StaticFilters.FILTER_PERMANENT_ALL_CREATURES, false + ))); } private FinalRevels(final FinalRevels card) { diff --git a/Mage.Sets/src/mage/cards/f/FlamekinBladewhirl.java b/Mage.Sets/src/mage/cards/f/FlamekinBladewhirl.java index c79bf18007d..303cd6cf757 100644 --- a/Mage.Sets/src/mage/cards/f/FlamekinBladewhirl.java +++ b/Mage.Sets/src/mage/cards/f/FlamekinBladewhirl.java @@ -36,7 +36,7 @@ public final class FlamekinBladewhirl extends CardImpl { this.getSpellAbility().addCost(new OrCost( new RevealTargetFromHandCost(new TargetCardInHand(filter)), new GenericManaCost(3), - "reveal a Elemental card from your hand or pay {3}")); + "reveal an Elemental card from your hand or pay {3}")); } private FlamekinBladewhirl(final FlamekinBladewhirl card) { diff --git a/Mage.Sets/src/mage/cards/f/FodderLaunch.java b/Mage.Sets/src/mage/cards/f/FodderLaunch.java index 919ddf8629e..211152d0598 100644 --- a/Mage.Sets/src/mage/cards/f/FodderLaunch.java +++ b/Mage.Sets/src/mage/cards/f/FodderLaunch.java @@ -29,7 +29,7 @@ public final class FodderLaunch extends CardImpl { //Target creature gets -5/-5 until end of turn. Fodder Launch deals 5 damage to that creature's controller. this.getSpellAbility().addEffect(new BoostTargetEffect(-5, -5, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new DamageTargetControllerEffect(5)); + this.getSpellAbility().addEffect(new DamageTargetControllerEffect(5).setText("{this} deals 5 damage to that creature's controller")); } private FodderLaunch(final FodderLaunch card) { diff --git a/Mage.Sets/src/mage/cards/f/FootbottomFeast.java b/Mage.Sets/src/mage/cards/f/FootbottomFeast.java index e8c1078ee90..7dae2624520 100644 --- a/Mage.Sets/src/mage/cards/f/FootbottomFeast.java +++ b/Mage.Sets/src/mage/cards/f/FootbottomFeast.java @@ -23,7 +23,7 @@ public final class FootbottomFeast extends CardImpl { this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD)); // Draw a card. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); } private FootbottomFeast(final FootbottomFeast card) { diff --git a/Mage.Sets/src/mage/cards/f/ForcedFruition.java b/Mage.Sets/src/mage/cards/f/ForcedFruition.java index bc11aff54a2..95a7c83ffa3 100644 --- a/Mage.Sets/src/mage/cards/f/ForcedFruition.java +++ b/Mage.Sets/src/mage/cards/f/ForcedFruition.java @@ -23,7 +23,7 @@ public final class ForcedFruition extends CardImpl { // Whenever an opponent casts a spell, that player draws seven cards. this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new DrawCardTargetEffect(7), - StaticFilters.FILTER_SPELL, false, SetTargetPointer.PLAYER)); + StaticFilters.FILTER_SPELL_A, false, SetTargetPointer.PLAYER)); } private ForcedFruition(final ForcedFruition card) { diff --git a/Mage.Sets/src/mage/cards/g/GiltLeafPalace.java b/Mage.Sets/src/mage/cards/g/GiltLeafPalace.java index 4c47f0b7438..5a32e451415 100644 --- a/Mage.Sets/src/mage/cards/g/GiltLeafPalace.java +++ b/Mage.Sets/src/mage/cards/g/GiltLeafPalace.java @@ -29,7 +29,7 @@ public final class GiltLeafPalace extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.LAND},""); // As Gilt-Leaf Palace enters the battlefield, you may reveal an Elf card from your hand. If you don't, Gilt-Leaf Palace enters the battlefield tapped. - this.addAbility(new AsEntersBattlefieldAbility(new TapSourceUnlessPaysEffect(new RevealTargetFromHandCost(new TargetCardInHand(filter))), "you may reveal a Elf card from your hand. If you don't, {this} enters the battlefield tapped")); + this.addAbility(new AsEntersBattlefieldAbility(new TapSourceUnlessPaysEffect(new RevealTargetFromHandCost(new TargetCardInHand(filter))), "you may reveal an Elf card from your hand. If you don't, {this} enters the battlefield tapped")); // {tap}: Add {B} or {G}. this.addAbility(new BlackManaAbility()); this.addAbility(new GreenManaAbility()); diff --git a/Mage.Sets/src/mage/cards/h/HearthcageGiant.java b/Mage.Sets/src/mage/cards/h/HearthcageGiant.java index 08970c78af5..94eb0488f69 100644 --- a/Mage.Sets/src/mage/cards/h/HearthcageGiant.java +++ b/Mage.Sets/src/mage/cards/h/HearthcageGiant.java @@ -28,7 +28,7 @@ import mage.target.common.TargetCreaturePermanent; public final class HearthcageGiant extends CardImpl { private static final FilterControlledPermanent filterElemental = new FilterControlledPermanent("Elemental"); - private static final FilterCreaturePermanent filterGiant = new FilterCreaturePermanent("Giant"); + private static final FilterCreaturePermanent filterGiant = new FilterCreaturePermanent("Giant creature"); static { filterElemental.add(SubType.ELEMENTAL.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java b/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java index 6f45e6c334b..f065920893b 100644 --- a/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java +++ b/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java @@ -1,7 +1,5 @@ - package mage.cards.i; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -12,12 +10,13 @@ import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class InnerFlameAcolyte extends CardImpl { @@ -31,9 +30,12 @@ public final class InnerFlameAcolyte extends CardImpl { this.toughness = new MageInt(2); // When Inner-Flame Acolyte enters the battlefield, target creature gets +2/+0 and gains haste until end of turn. - Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(2, 0, Duration.EndOfTurn)); - ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn) - .setText("and gains haste until end of turn")); + Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect( + 2, 0, Duration.EndOfTurn + ).setText("target creature gets +2/+0")); + ability.addEffect(new GainAbilityTargetEffect( + HasteAbility.getInstance(), Duration.EndOfTurn + ).setText("and gains haste until end of turn")); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/k/KithkinGreatheart.java b/Mage.Sets/src/mage/cards/k/KithkinGreatheart.java index 40cb1872fe4..9de0c1b2081 100644 --- a/Mage.Sets/src/mage/cards/k/KithkinGreatheart.java +++ b/Mage.Sets/src/mage/cards/k/KithkinGreatheart.java @@ -1,10 +1,9 @@ - package mage.cards.k; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; @@ -12,43 +11,46 @@ import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.TargetController; import mage.filter.common.FilterCreaturePermanent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class KithkinGreatheart extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Giant"); + static { filter.add(TargetController.YOU.getControllerPredicate()); filter.add(SubType.GIANT.getPredicate()); } - private static final String rule2 = "As long as you control a Giant, {this} has first strike"; + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter); public KithkinGreatheart(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add(SubType.KITHKIN); this.subtype.add(SubType.SOLDIER); - this.color.setWhite(true); this.power = new MageInt(2); this.toughness = new MageInt(1); // As long as you control a Giant, Kithkin Greatheart gets +1/+1 and has first strike. - Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( - new BoostSourceEffect(1,1, Duration.WhileOnBattlefield), - new PermanentsOnTheBattlefieldCondition(filter), - "As long as you control a Giant, Kithkin Greatheart gets +1/+1")); + Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect( + new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), + condition, "As long as you control a Giant, {this} gets +1/+1" + )); + ability.addEffect(new ConditionalContinuousEffect( + new GainAbilitySourceEffect(FirstStrikeAbility.getInstance()), + condition, "and has first strike" + )); this.addAbility(ability); - ConditionalContinuousEffect effect2 = new ConditionalContinuousEffect( - new GainAbilitySourceEffect(FirstStrikeAbility.getInstance()), - new PermanentsOnTheBattlefieldCondition(filter), - rule2); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect2)); - } private KithkinGreatheart(final KithkinGreatheart card) { diff --git a/Mage.Sets/src/mage/cards/k/KnuckleboneWitch.java b/Mage.Sets/src/mage/cards/k/KnuckleboneWitch.java index c86cc70798c..885060a7617 100644 --- a/Mage.Sets/src/mage/cards/k/KnuckleboneWitch.java +++ b/Mage.Sets/src/mage/cards/k/KnuckleboneWitch.java @@ -1,7 +1,5 @@ - package mage.cards.k; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -9,32 +7,30 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.TargetController; import mage.counters.CounterType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; + +import java.util.UUID; /** - * * @author markedagain */ public final class KnuckleboneWitch extends CardImpl { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin you control"); - static { - filter.add(TargetController.YOU.getControllerPredicate()); - filter.add(SubType.GOBLIN.getPredicate()); - } - + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.GOBLIN); + public KnuckleboneWitch(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.SHAMAN); this.power = new MageInt(1); this.toughness = new MageInt(1); // Whenever a Goblin you control dies, you may put a +1/+1 counter on Knucklebone Witch. - this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), true, filter )); + this.addAbility(new DiesCreatureTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), true, filter + ).setTriggerPhrase("Whenever a Goblin you control is put into a graveyard from the battlefield, ")); } private KnuckleboneWitch(final KnuckleboneWitch card) { diff --git a/Mage.Sets/src/mage/cards/l/LaceWithMoonglove.java b/Mage.Sets/src/mage/cards/l/LaceWithMoonglove.java index 518a6355837..a8656cd7fd7 100644 --- a/Mage.Sets/src/mage/cards/l/LaceWithMoonglove.java +++ b/Mage.Sets/src/mage/cards/l/LaceWithMoonglove.java @@ -22,7 +22,7 @@ public final class LaceWithMoonglove extends CardImpl { this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); } private LaceWithMoonglove(final LaceWithMoonglove card) { diff --git a/Mage.Sets/src/mage/cards/l/LowlandOaf.java b/Mage.Sets/src/mage/cards/l/LowlandOaf.java index 83b598a6930..4a2b491377c 100644 --- a/Mage.Sets/src/mage/cards/l/LowlandOaf.java +++ b/Mage.Sets/src/mage/cards/l/LowlandOaf.java @@ -49,7 +49,7 @@ public final class LowlandOaf extends CardImpl { effect.setText("Target Goblin creature you control gets +1/+0"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost()); effect = new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn); - effect.setText("and gains flying until end of turn. "); + effect.setText("and gains flying until end of turn."); ability.addEffect(effect); ability.addEffect(new LowlandOafEffect()); ability.addTarget(new TargetCreaturePermanent(filter)); diff --git a/Mage.Sets/src/mage/cards/m/MerrowReejerey.java b/Mage.Sets/src/mage/cards/m/MerrowReejerey.java index 61e8d2c1c16..c729be9312d 100644 --- a/Mage.Sets/src/mage/cards/m/MerrowReejerey.java +++ b/Mage.Sets/src/mage/cards/m/MerrowReejerey.java @@ -23,7 +23,7 @@ import mage.target.TargetPermanent; public final class MerrowReejerey extends CardImpl { private static final FilterCreaturePermanent filter1 = new FilterCreaturePermanent("Merfolk creatures you control"); - private static final FilterSpell filter2 = new FilterSpell("Merfolk spell"); + private static final FilterSpell filter2 = new FilterSpell("a Merfolk spell"); static { filter1.add(SubType.MERFOLK.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/m/MoongloveExtract.java b/Mage.Sets/src/mage/cards/m/MoongloveExtract.java index 15acc9c1a76..ebe05d62697 100644 --- a/Mage.Sets/src/mage/cards/m/MoongloveExtract.java +++ b/Mage.Sets/src/mage/cards/m/MoongloveExtract.java @@ -22,7 +22,7 @@ public final class MoongloveExtract extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); // Sacrifice Moonglove Extract: Moonglove Extract deals 2 damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new SacrificeSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2, "it"), new SacrificeSourceCost()); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/n/NeedleDrop.java b/Mage.Sets/src/mage/cards/n/NeedleDrop.java index 549659c588a..7f7cb3f0680 100644 --- a/Mage.Sets/src/mage/cards/n/NeedleDrop.java +++ b/Mage.Sets/src/mage/cards/n/NeedleDrop.java @@ -39,7 +39,7 @@ public final class NeedleDrop extends CardImpl { this.getSpellAbility().addTarget(new TargetAnyTarget(1, 1, filer)); // Draw a card. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); } private NeedleDrop(final NeedleDrop card) { diff --git a/Mage.Sets/src/mage/cards/p/ProtectiveBubble.java b/Mage.Sets/src/mage/cards/p/ProtectiveBubble.java index b1354ce80fc..9e590f3b0e6 100644 --- a/Mage.Sets/src/mage/cards/p/ProtectiveBubble.java +++ b/Mage.Sets/src/mage/cards/p/ProtectiveBubble.java @@ -1,7 +1,6 @@ - package mage.cards.p; -import java.util.UUID; +import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.combat.CantBeBlockedAttachedEffect; @@ -12,31 +11,34 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AttachmentType; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.SubType; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author Loki */ public final class ProtectiveBubble extends CardImpl { public ProtectiveBubble(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); this.subtype.add(SubType.AURA); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + // Enchanted creature can't be blocked and has shroud. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedAttachedEffect(AttachmentType.AURA))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ShroudAbility.getInstance(), AttachmentType.AURA))); + Ability ability = new SimpleStaticAbility(new CantBeBlockedAttachedEffect(AttachmentType.AURA)); + ability.addEffect(new GainAbilityAttachedEffect( + ShroudAbility.getInstance(), AttachmentType.AURA + ).setText("and has shroud")); + this.addAbility(ability); } private ProtectiveBubble(final ProtectiveBubble card) { diff --git a/Mage.Sets/src/mage/cards/s/ScionOfOona.java b/Mage.Sets/src/mage/cards/s/ScionOfOona.java index 6050c7dc240..58876001ac5 100644 --- a/Mage.Sets/src/mage/cards/s/ScionOfOona.java +++ b/Mage.Sets/src/mage/cards/s/ScionOfOona.java @@ -22,7 +22,7 @@ import mage.filter.common.FilterCreaturePermanent; public final class ScionOfOona extends CardImpl { private static final FilterPermanent filter = new FilterPermanent("Faeries"); - private static final FilterCreaturePermanent filterCreature = new FilterCreaturePermanent("Faeries"); + private static final FilterCreaturePermanent filterCreature = new FilterCreaturePermanent("Faerie creatures"); static { filter.add(SubType.FAERIE.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/s/StreambedAquitects.java b/Mage.Sets/src/mage/cards/s/StreambedAquitects.java index 2d7f81b84d0..32ba35910ea 100644 --- a/Mage.Sets/src/mage/cards/s/StreambedAquitects.java +++ b/Mage.Sets/src/mage/cards/s/StreambedAquitects.java @@ -1,4 +1,3 @@ - package mage.cards.s; import mage.MageInt; @@ -14,27 +13,21 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; -import mage.target.Target; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetLandPermanent; import java.util.UUID; /** - * * @author LevelX2 */ public final class StreambedAquitects extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Merfolk creature"); - static { - filter.add(SubType.MERFOLK.getPredicate()); - } + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.MERFOLK, "Merfolk creature"); public StreambedAquitects(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); this.subtype.add(SubType.MERFOLK); this.subtype.add(SubType.SCOUT); @@ -42,16 +35,18 @@ public final class StreambedAquitects extends CardImpl { this.toughness = new MageInt(3); // {tap}: Target Merfolk creature gets +1/+1 and gains islandwalk until end of turn. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(1,1, Duration.EndOfTurn), new TapSourceCost()); - ability.addEffect(new GainAbilityTargetEffect(new IslandwalkAbility(false), Duration.EndOfTurn)); - Target target = new TargetCreaturePermanent(filter); - ability.addTarget(target); + Ability ability = new SimpleActivatedAbility(new BoostTargetEffect( + 1, 1, Duration.EndOfTurn + ).setText("target Merfolk creature gets +1/+1"), new TapSourceCost()); + ability.addEffect(new GainAbilityTargetEffect( + new IslandwalkAbility(false), Duration.EndOfTurn + ).setText("and gains islandwalk until end of turn")); + ability.addTarget(new TargetCreaturePermanent(filter)); this.addAbility(ability); // {tap}: Target land becomes an Island until end of turn. - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new TapSourceCost()); - target = new TargetLandPermanent(); - ability.addTarget(target); + ability = new SimpleActivatedAbility(new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new TapSourceCost()); + ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SummonTheSchool.java b/Mage.Sets/src/mage/cards/s/SummonTheSchool.java index 274ff5d580f..95a55524098 100644 --- a/Mage.Sets/src/mage/cards/s/SummonTheSchool.java +++ b/Mage.Sets/src/mage/cards/s/SummonTheSchool.java @@ -1,11 +1,9 @@ - package mage.cards.s; -import java.util.UUID; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -16,27 +14,32 @@ import mage.filter.predicate.permanent.TappedPredicate; import mage.game.permanent.token.MerfolkWizardToken; import mage.target.common.TargetControlledPermanent; +import java.util.UUID; + /** - * * @author Loki */ public final class SummonTheSchool extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Merfolk you control"); + private static final FilterControlledPermanent filter + = new FilterControlledPermanent(SubType.MERFOLK, "untapped Merfolk you control"); static { filter.add(TappedPredicate.UNTAPPED); - filter.add(SubType.MERFOLK.getPredicate()); } public SummonTheSchool(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.TRIBAL,CardType.SORCERY},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.TRIBAL, CardType.SORCERY}, "{3}{W}"); this.subtype.add(SubType.MERFOLK); - + // Create two 1/1 blue Merfolk Wizard creature tokens. this.getSpellAbility().addEffect(new CreateTokenEffect(new MerfolkWizardToken(), 2)); + // Tap four untapped Merfolk you control: Return Summon the School from your graveyard to your hand. - this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnToHandSourceEffect(), new TapTargetCost(new TargetControlledPermanent(4, 4, filter, false)))); + this.addAbility(new SimpleActivatedAbility( + Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), + new TapTargetCost(new TargetControlledPermanent(4, filter)) + )); } private SummonTheSchool(final SummonTheSchool card) { diff --git a/Mage.Sets/src/mage/cards/s/SunriseSovereign.java b/Mage.Sets/src/mage/cards/s/SunriseSovereign.java index 19297404286..d2865fc977b 100644 --- a/Mage.Sets/src/mage/cards/s/SunriseSovereign.java +++ b/Mage.Sets/src/mage/cards/s/SunriseSovereign.java @@ -1,8 +1,7 @@ - package mage.cards.s; -import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; @@ -12,31 +11,37 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; +import java.util.UUID; + /** - * * @author Loki */ public final class SunriseSovereign extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Giant"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Giant creatures"); static { filter.add(SubType.GIANT.getPredicate()); } public SunriseSovereign(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}"); this.subtype.add(SubType.GIANT); this.subtype.add(SubType.WARRIOR); this.power = new MageInt(5); this.toughness = new MageInt(5); + // Other Giant creatures you control get +2/+2 and have trample. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, filter, true))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true))); + Ability ability = new SimpleStaticAbility(new BoostControlledEffect( + 2, 2, Duration.WhileOnBattlefield, filter, true + )); + ability.addEffect(new GainAbilityControlledEffect( + TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true + ).setText("and have trample")); + this.addAbility(ability); } private SunriseSovereign(final SunriseSovereign card) { diff --git a/Mage.Sets/src/mage/cards/s/SylvanEchoes.java b/Mage.Sets/src/mage/cards/s/SylvanEchoes.java index f181a731563..47b86af15e4 100644 --- a/Mage.Sets/src/mage/cards/s/SylvanEchoes.java +++ b/Mage.Sets/src/mage/cards/s/SylvanEchoes.java @@ -60,6 +60,6 @@ class SylvanEchoesTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever you clash and win, you may draw a card"; + return "Whenever you clash and win, you may draw a card."; } } diff --git a/Mage.Sets/src/mage/cards/t/ThorntoothWitch.java b/Mage.Sets/src/mage/cards/t/ThorntoothWitch.java index 4cb0681eb9b..33cd5cf5f11 100644 --- a/Mage.Sets/src/mage/cards/t/ThorntoothWitch.java +++ b/Mage.Sets/src/mage/cards/t/ThorntoothWitch.java @@ -20,7 +20,7 @@ import mage.target.common.TargetCreaturePermanent; */ public final class ThorntoothWitch extends CardImpl { - private static final FilterSpell filter = new FilterSpell("Treefolk"); + private static final FilterSpell filter = new FilterSpell("a Treefolk spell"); static { filter.add(SubType.TREEFOLK.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/t/TimberProtector.java b/Mage.Sets/src/mage/cards/t/TimberProtector.java index 35ab5f860e8..fb608938189 100644 --- a/Mage.Sets/src/mage/cards/t/TimberProtector.java +++ b/Mage.Sets/src/mage/cards/t/TimberProtector.java @@ -1,10 +1,8 @@ - package mage.cards.t; -import java.util.UUID; import mage.MageInt; +import mage.MageObject; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.IndestructibleAbility; @@ -13,31 +11,32 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.UUID; /** - * * @author Loki */ public final class TimberProtector extends CardImpl { - private static final FilterCreaturePermanent filterTreefolk = new FilterCreaturePermanent("Treefolk creatures"); - private static final FilterControlledPermanent filterBoth = new FilterControlledPermanent("Other Treefolk and Forests you control"); + private static final FilterCreaturePermanent filterTreefolk + = new FilterCreaturePermanent("Treefolk creatures"); + private static final FilterControlledPermanent filterBoth + = new FilterControlledPermanent("other Treefolk and Forests you control"); static { filterTreefolk.add(SubType.TREEFOLK.getPredicate()); - filterBoth.add(Predicates.or( - SubType.TREEFOLK.getPredicate(), - SubType.FOREST.getPredicate())); - filterBoth.add(AnotherPredicate.instance); + filterBoth.add(TimberProtectorPredicate.instance); } public TimberProtector(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); this.subtype.add(SubType.TREEFOLK); this.subtype.add(SubType.WARRIOR); @@ -45,11 +44,14 @@ public final class TimberProtector extends CardImpl { this.toughness = new MageInt(6); // Other Treefolk creatures you control get +1/+1. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filterTreefolk, true))); + this.addAbility(new SimpleStaticAbility(new BoostControlledEffect( + 1, 1, Duration.WhileOnBattlefield, filterTreefolk, true + ))); + // Other Treefolk and Forests you control are indestructible. - Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filterBoth, true); - effect.setText("Other Treefolk and Forests you control are indestructible"); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect( + IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filterBoth + ))); } private TimberProtector(final TimberProtector card) { @@ -61,3 +63,17 @@ public final class TimberProtector extends CardImpl { return new TimberProtector(this); } } + +enum TimberProtectorPredicate implements ObjectSourcePlayerPredicate { + instance; + + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + MageObject obj = input.getObject(); + if (obj.getId().equals(input.getSourceId())) { + return obj.hasSubtype(SubType.FOREST, game); + } + return obj.hasSubtype(SubType.FOREST, game) + || obj.hasSubtype(SubType.TREEFOLK, game); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TriclopeanSight.java b/Mage.Sets/src/mage/cards/t/TriclopeanSight.java index 16a8872a280..703c7e027c3 100644 --- a/Mage.Sets/src/mage/cards/t/TriclopeanSight.java +++ b/Mage.Sets/src/mage/cards/t/TriclopeanSight.java @@ -1,7 +1,5 @@ - package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -14,41 +12,42 @@ import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AttachmentType; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class TriclopeanSight extends CardImpl { public TriclopeanSight(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); this.subtype.add(SubType.AURA); // Flash this.addAbility(FlashAbility.getInstance()); - + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.Neutral)); - Ability ability = new EnchantAbility(auraTarget.getTargetName()); - this.addAbility(ability); - + this.addAbility(new EnchantAbility(auraTarget.getTargetName())); + // When Triclopean Sight enters the battlefield, untap enchanted creature. this.addAbility(new EntersBattlefieldTriggeredAbility(new UntapEnchantedEffect())); - + // Enchanted creature gets +1/+1 and has vigilance. - ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1,1, Duration.WhileOnBattlefield)); - ability.addEffect(new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield)); + Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect( + 1, 1, Duration.WhileOnBattlefield + )); + ability.addEffect(new GainAbilityAttachedEffect( + VigilanceAbility.getInstance(), + AttachmentType.AURA, + Duration.WhileOnBattlefield + ).setText("and has vigilance")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VeteranOfTheDepths.java b/Mage.Sets/src/mage/cards/v/VeteranOfTheDepths.java index 47081f9c855..866de657964 100644 --- a/Mage.Sets/src/mage/cards/v/VeteranOfTheDepths.java +++ b/Mage.Sets/src/mage/cards/v/VeteranOfTheDepths.java @@ -1,9 +1,6 @@ - package mage.cards.v; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.BecomesTappedSourceTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -12,22 +9,25 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; +import java.util.UUID; + /** - * * @author Wehk */ public final class VeteranOfTheDepths extends CardImpl { public VeteranOfTheDepths(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add(SubType.MERFOLK); this.subtype.add(SubType.SOLDIER); this.power = new MageInt(2); this.toughness = new MageInt(2); // Whenever Veteran of the Depths becomes tapped, you may put a +1/+1 counter on it. - Ability ability = new BecomesTappedSourceTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), true); - this.addAbility(ability); + this.addAbility(new BecomesTappedSourceTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()) + .setText("put a +1/+1 counter on it"), true + )); } private VeteranOfTheDepths(final VeteranOfTheDepths card) { @@ -38,4 +38,4 @@ public final class VeteranOfTheDepths extends CardImpl { public VeteranOfTheDepths copy() { return new VeteranOfTheDepths(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/v/Vigor.java b/Mage.Sets/src/mage/cards/v/Vigor.java index 22ccb02da71..1d62170daf1 100644 --- a/Mage.Sets/src/mage/cards/v/Vigor.java +++ b/Mage.Sets/src/mage/cards/v/Vigor.java @@ -57,7 +57,7 @@ class VigorReplacementEffect extends ReplacementEffectImpl { VigorReplacementEffect() { super(Duration.WhileOnBattlefield, Outcome.BoostCreature); - staticText = "If damage would be dealt to a creature you control other than {this}, prevent that damage. Put a +1/+1 counter on that creature for each 1 damage prevented this way"; + staticText = "if damage would be dealt to another creature you control, prevent that damage. Put a +1/+1 counter on that creature for each 1 damage prevented this way"; } VigorReplacementEffect(final VigorReplacementEffect effect) { diff --git a/Mage.Sets/src/mage/cards/w/WellgabberApothecary.java b/Mage.Sets/src/mage/cards/w/WellgabberApothecary.java index 957b1d5d096..e73aec31ea5 100644 --- a/Mage.Sets/src/mage/cards/w/WellgabberApothecary.java +++ b/Mage.Sets/src/mage/cards/w/WellgabberApothecary.java @@ -23,7 +23,7 @@ import mage.target.common.TargetCreaturePermanent; */ public final class WellgabberApothecary extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("target tapped Merfolk or Kithkin creature this turn"); + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped Merfolk or Kithkin creature"); static { filter.add(TappedPredicate.TAPPED); diff --git a/Mage.Sets/src/mage/cards/w/WingsOfVelisVel.java b/Mage.Sets/src/mage/cards/w/WingsOfVelisVel.java index 9d13d2df672..573c1477dcb 100644 --- a/Mage.Sets/src/mage/cards/w/WingsOfVelisVel.java +++ b/Mage.Sets/src/mage/cards/w/WingsOfVelisVel.java @@ -28,11 +28,11 @@ public final class WingsOfVelisVel extends CardImpl { // Target creature becomes 4/4, gains all creature types, and gains flying until end of turn. this.getSpellAbility().addEffect(new SetPowerToughnessTargetEffect(4, 4, Duration.EndOfTurn) - .setText("Target creature becomes 4/4")); + .setText("Until end of turn, target creature has base power and toughness 4/4")); this.getSpellAbility().addEffect(new GainAllCreatureTypesTargetEffect(Duration.EndOfTurn) .setText(", gains all creature types")); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn) - .setText(", and gains flying until end of turn")); + .setText(", and gains flying")); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/cards/w/WortBoggartAuntie.java b/Mage.Sets/src/mage/cards/w/WortBoggartAuntie.java index c685f4e50f0..5383ae46459 100644 --- a/Mage.Sets/src/mage/cards/w/WortBoggartAuntie.java +++ b/Mage.Sets/src/mage/cards/w/WortBoggartAuntie.java @@ -1,11 +1,9 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.abilities.keyword.FearAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -16,8 +14,9 @@ import mage.constants.TargetController; import mage.filter.FilterCard; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** - * * @author Loki */ public final class WortBoggartAuntie extends CardImpl { @@ -29,7 +28,7 @@ public final class WortBoggartAuntie extends CardImpl { } public WortBoggartAuntie(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{R}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.SHAMAN); @@ -40,7 +39,9 @@ public final class WortBoggartAuntie extends CardImpl { this.addAbility(FearAbility.getInstance()); // At the beginning of your upkeep, you may return target Goblin card from your graveyard to your hand. - Ability ability = new BeginningOfUpkeepTriggeredAbility(new ReturnToHandTargetEffect(), TargetController.YOU, true); + Ability ability = new BeginningOfUpkeepTriggeredAbility( + new ReturnFromGraveyardToHandTargetEffect(), TargetController.YOU, true + ); ability.addTarget(new TargetCardInYourGraveyard(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/w/WrensRunPackmaster.java b/Mage.Sets/src/mage/cards/w/WrensRunPackmaster.java index f8dd682a04b..e9b17d621af 100644 --- a/Mage.Sets/src/mage/cards/w/WrensRunPackmaster.java +++ b/Mage.Sets/src/mage/cards/w/WrensRunPackmaster.java @@ -1,36 +1,32 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.ChampionAbility; import mage.abilities.keyword.DeathtouchAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.game.permanent.token.WolfToken; +import java.util.UUID; + /** - * * @author emerald000 */ public final class WrensRunPackmaster extends CardImpl { - - private static final FilterPermanent filter = new FilterPermanent("Wolf"); - static { - filter.add(TargetController.YOU.getControllerPredicate()); - filter.add(SubType.WOLF.getPredicate()); - } + + private static final FilterPermanent filter = new FilterPermanent(SubType.WOLF, "Wolves"); public WrensRunPackmaster(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); this.subtype.add(SubType.ELF); this.subtype.add(SubType.WARRIOR); @@ -39,14 +35,16 @@ public final class WrensRunPackmaster extends CardImpl { // Champion an Elf this.addAbility(new ChampionAbility(this, SubType.ELF, false)); - + // {2}{G}: Create a 2/2 green Wolf creature token. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new WolfToken()), new ManaCostsImpl<>("{2}{G}"))); - + this.addAbility(new SimpleActivatedAbility( + new CreateTokenEffect(new WolfToken()), new ManaCostsImpl<>("{2}{G}") + )); + // Each Wolf you control has deathtouch. - Effect effect = new GainAbilityAllEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter); - effect.setText("Each Wolf you control has deathtouch"); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter + ))); } private WrensRunPackmaster(final WrensRunPackmaster card) { diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index edb4950b8d2..3842df282f9 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -62,7 +62,7 @@ public class VerifyCardDataTest { private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class); - private static final String FULL_ABILITIES_CHECK_SET_CODE = "M10"; // check all abilities and output cards with wrong abilities texts; + private static final String FULL_ABILITIES_CHECK_SET_CODE = "LRW"; // check all abilities and output cards with wrong abilities texts; private static final boolean AUTO_FIX_SAMPLE_DECKS = false; // debug only: auto-fix sample decks by test_checkSampleDecks test run private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CanBlockAdditionalCreatureEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CanBlockAdditionalCreatureEffect.java index 242dc776035..a2e4f73f2b5 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/CanBlockAdditionalCreatureEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CanBlockAdditionalCreatureEffect.java @@ -12,7 +12,6 @@ import mage.game.permanent.Permanent; import mage.util.CardUtil; /** - * * @author LevelX2 */ public class CanBlockAdditionalCreatureEffect extends ContinuousEffectImpl { @@ -69,21 +68,21 @@ public class CanBlockAdditionalCreatureEffect extends ContinuousEffectImpl { } private String setText() { - String text = "{this} can block "; - switch (amount) { - case 0: - text += "any number of creatures"; - break; - default: - text += CardUtil.numberToText(amount, "an") + " additional creature" + (amount > 1 ? "s" : ""); + StringBuilder sb = new StringBuilder("{this} can block "); + if (amount == 0) { + sb.append("any number of creatures"); + } else { + sb.append(CardUtil.numberToText(amount, "an")); + sb.append(" additional creature"); + sb.append((amount > 1 ? "s" : "")); } if (duration == Duration.EndOfTurn) { - text += " this turn"; + sb.append(" this turn"); } - if (duration == Duration.WhileOnBattlefield) { - text += " each combat"; + if (duration == Duration.WhileOnBattlefield && amount == 1) { + sb.append(" each combat"); } - return text; + return sb.toString(); } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByOneEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByOneEffect.java index 326af72f953..7ee7bc31c57 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByOneEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CantBeBlockedByOneEffect.java @@ -1,17 +1,16 @@ - package mage.abilities.effects.common.combat; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; import mage.constants.Duration; import mage.constants.Layer; import mage.constants.Outcome; import mage.constants.SubLayer; -import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffectImpl; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** - * * @author North */ public class CantBeBlockedByOneEffect extends ContinuousEffectImpl { @@ -23,9 +22,9 @@ public class CantBeBlockedByOneEffect extends ContinuousEffectImpl { } public CantBeBlockedByOneEffect(int amount, Duration duration) { - super(duration, Outcome.Benefit); + super(duration, Layer.RulesEffects, SubLayer.NA, Outcome.Benefit); this.amount = amount; - staticText = "{this} can't be blocked except by " + amount + " or more creatures"; + staticText = "{this} can't be blocked except by " + CardUtil.numberToText(amount) + " or more creatures"; } public CantBeBlockedByOneEffect(final CantBeBlockedByOneEffect effect) { @@ -39,26 +38,12 @@ public class CantBeBlockedByOneEffect extends ContinuousEffectImpl { } @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - Permanent perm = game.getPermanent(source.getSourceId()); + public boolean apply(Game game, Ability source) { + Permanent perm = source.getSourcePermanentIfItStillExists(game); if (perm != null) { - switch (layer) { - case RulesEffects: - perm.setMinBlockedBy(amount); - break; - } + perm.setMinBlockedBy(amount); return true; } return false; } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public boolean hasLayer(Layer layer) { - return layer == Layer.RulesEffects; - } -} \ No newline at end of file +}