[LRW] various text fixes

This commit is contained in:
Evan Kranzler 2022-03-07 20:19:20 -05:00
parent 605e7a7e50
commit 50b3d3d8d9
43 changed files with 318 additions and 339 deletions

View file

@ -45,8 +45,8 @@ public final class Benthicore extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new MerfolkWizardToken(), 2), false)); 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. // 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 ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), new TapTargetCost(new TargetControlledPermanent(2, filter)));
ability.addEffect(new GainAbilitySourceEffect(ShroudAbility.getInstance(), Duration.EndOfTurn)); ability.addEffect(new GainAbilitySourceEffect(ShroudAbility.getInstance(), Duration.EndOfTurn).setText("it gains shroud until end of turn"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,8 +1,6 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -10,8 +8,9 @@ import mage.constants.SubType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class BoggartBirthRite extends CardImpl { public final class BoggartBirthRite extends CardImpl {
@ -23,10 +22,10 @@ public final class BoggartBirthRite extends CardImpl {
} }
public BoggartBirthRite(UUID ownerId, CardSetInfo setInfo) { 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.subtype.add(SubType.GOBLIN);
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect());
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter));
} }

View file

@ -1,7 +1,5 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
@ -9,21 +7,22 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.TargetController; import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetPlayerOrPlaneswalker; import mage.target.common.TargetPlayerOrPlaneswalker;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class BoggartShenanigans extends CardImpl { 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 { static {
filter.add(TargetController.YOU.getControllerPredicate()); filter.add(AnotherPredicate.instance);
filter.add(SubType.GOBLIN.getPredicate());
} }
public BoggartShenanigans(UUID ownerId, CardSetInfo setInfo) { public BoggartShenanigans(UUID ownerId, CardSetInfo setInfo) {
@ -31,7 +30,9 @@ public final class BoggartShenanigans extends CardImpl {
this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.GOBLIN);
// Whenever another Goblin you control dies, you may have Boggart Shenanigans deal 1 damage to target player. // 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()); ability.addTarget(new TargetPlayerOrPlaneswalker());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,7 +1,5 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
@ -14,25 +12,22 @@ import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.constants.Outcome;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetPlayerOrPlaneswalker; import mage.target.common.TargetPlayerOrPlaneswalker;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class BrionStoutarm extends CardImpl { 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) { public BrionStoutarm(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{W}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{W}");
addSuperType(SuperType.LEGENDARY); addSuperType(SuperType.LEGENDARY);
@ -43,10 +38,11 @@ public final class BrionStoutarm extends CardImpl {
// Lifelink // Lifelink
this.addAbility(LifelinkAbility.getInstance()); 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. // {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 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()); ability.addTarget(new TargetPlayerOrPlaneswalker());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,53 +1,45 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility; 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.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicates;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class CaterwaulingBoggart extends CardImpl { public final class CaterwaulingBoggart extends CardImpl {
private static final FilterPermanent filterGoblin = new FilterControlledCreaturePermanent("Goblin"); private static final FilterPermanent filter = new FilterPermanent("Goblins you control and Elementals");
private static final FilterPermanent filterElemental = new FilterControlledCreaturePermanent("Elemental");
static { static {
filterGoblin.add(SubType.GOBLIN.getPredicate()); filter.add(Predicates.or(
filterElemental.add(SubType.ELEMENTAL.getPredicate()); SubType.GOBLIN.getPredicate(),
SubType.ELEMENTAL.getPredicate()
));
} }
public CaterwaulingBoggart(UUID ownerId, CardSetInfo setInfo) { 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.GOBLIN);
this.subtype.add(SubType.SHAMAN); this.subtype.add(SubType.SHAMAN);
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = 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.) // Goblins you control and Elementals you control have menace.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect( this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
new MenaceAbility(), new MenaceAbility(false), Duration.WhileOnBattlefield, filter
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.)")));
} }
private CaterwaulingBoggart(final CaterwaulingBoggart card) { private CaterwaulingBoggart(final CaterwaulingBoggart card) {

View file

@ -42,7 +42,7 @@ public final class Cloudthresher extends CardImpl {
this.addAbility(ReachAbility.getInstance()); this.addAbility(ReachAbility.getInstance());
// When Cloudthresher enters the battlefield, it deals 2 damage to each creature with flying and each player. // 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 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); this.addAbility(ability);
// Evoke {2}{G}{G} // Evoke {2}{G}{G}
this.addAbility(new EvokeAbility("{2}{G}{G}")); this.addAbility(new EvokeAbility("{2}{G}{G}"));

View file

@ -44,7 +44,7 @@ public final class ColfenorsUrn extends CardImpl {
new ExileTargetForSourceEffect().setText("exile it"), true, filter, true, true)); 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. // 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) { private ColfenorsUrn(final ColfenorsUrn card) {

View file

@ -13,7 +13,6 @@ import mage.game.permanent.Permanent;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.UUID; import java.util.UUID;
/** /**
@ -28,9 +27,8 @@ public final class EgoErasure extends CardImpl {
// Changeling // Changeling
this.addAbility(new ChangelingAbility()); this.addAbility(new ChangelingAbility());
//Creatures target player controls get -2/+0 and lose all creature types until end of turn. // 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 EgoErasureEffect());
this.getSpellAbility().addEffect(new EgoErasureLoseEffect());
this.getSpellAbility().addTarget(new TargetPlayer()); 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() { public EgoErasureEffect() {
super(Duration.EndOfTurn, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Neutral); super(Duration.EndOfTurn, Outcome.Neutral);
staticText = "and lose all creature types until end of turn"; 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); super(effect);
} }
@Override @Override
public EgoErasureLoseEffect copy() { public EgoErasureEffect copy() {
return new EgoErasureLoseEffect(this); return new EgoErasureEffect(this);
} }
@Override @Override
public void init(Ability source, Game game) { public void init(Ability source, Game game) {
super.init(source, game); super.init(source, game);
if (this.affectedObjectsSet) { game.getBattlefield()
List<Permanent> creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getFirstTarget(), game); .getActivePermanents(
for (Permanent creature : creatures) { StaticFilters.FILTER_CONTROLLED_CREATURE,
affectedObjectList.add(new MageObjectReference(creature, game)); source.getFirstTarget(), source.getSourceId(), game
} ).stream()
} .map(permanent -> new MageObjectReference(permanent, game))
.forEach(affectedObjectList::add);
} }
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
for (Iterator<MageObjectReference> it = affectedObjectList.iterator(); it.hasNext(); ) { for (Iterator<MageObjectReference> it = affectedObjectList.iterator(); it.hasNext(); ) {
Permanent permanent = it.next().getPermanent(game); Permanent permanent = it.next().getPermanent(game);
if (permanent != null) { if (permanent == null) {
it.remove();
continue;
}
switch (layer) {
case TypeChangingEffects_4:
permanent.removeAllCreatureTypes(game); permanent.removeAllCreatureTypes(game);
} else { break;
it.remove(); case PTChangingEffects_7:
if (sublayer == SubLayer.ModifyPT_7c) {
permanent.addPower(-2);
} }
break;
}
}
if (affectedObjectList.isEmpty()) {
discard();
return false;
} }
return true; 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<Permanent> creatures = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getFirstTarget(), game);
for (Permanent creature : creatures) {
affectedObjectList.add(new MageObjectReference(creature, game));
}
}
}
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
for (Iterator<MageObjectReference> it = affectedObjectList.iterator(); it.hasNext(); ) { return false;
Permanent permanent = it.next().getPermanent(game);
if (permanent != null) {
permanent.addPower(-2);
} else {
it.remove();
} }
}
return true; @Override
public boolean hasLayer(Layer layer) {
return layer == Layer.TypeChangingEffects_4 || layer == Layer.PTChangingEffects_7;
} }
} }

View file

@ -18,7 +18,7 @@ import mage.filter.FilterSpell;
*/ */
public final class ElvishHandservant extends CardImpl { public final class ElvishHandservant extends CardImpl {
private static final FilterSpell filter = new FilterSpell("Giant"); private static final FilterSpell filter = new FilterSpell("Giant spell");
static { static {
filter.add(SubType.GIANT.getPredicate()); filter.add(SubType.GIANT.getPredicate());

View file

@ -1,7 +1,5 @@
package mage.cards.e; package mage.cards.e;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
@ -16,24 +14,30 @@ import mage.constants.*;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class EpicProportions extends CardImpl { public final class EpicProportions extends CardImpl {
public EpicProportions(UUID ownerId, CardSetInfo setInfo) { 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.subtype.add(SubType.AURA);
this.addAbility(FlashAbility.getInstance()); this.addAbility(FlashAbility.getInstance());
TargetPermanent auraTarget = new TargetCreaturePermanent(); TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); 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(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) { private EpicProportions(final EpicProportions card) {

View file

@ -1,7 +1,5 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.abilities.Mode; import mage.abilities.Mode;
import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -10,8 +8,9 @@ import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class FinalRevels extends CardImpl { public final class FinalRevels extends CardImpl {
@ -19,10 +18,14 @@ public final class FinalRevels extends CardImpl {
public FinalRevels(UUID ownerId, CardSetInfo setInfo) { public FinalRevels(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}");
this.getSpellAbility().addEffect(new BoostAllEffect(2, 0, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false)); this.getSpellAbility().addEffect(new BoostAllEffect(
Mode mode = new Mode(); 2, 0, Duration.EndOfTurn,
mode.addEffect(new BoostAllEffect(0, -2, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false)); StaticFilters.FILTER_PERMANENT_ALL_CREATURES, false
this.getSpellAbility().addMode(mode); ));
this.getSpellAbility().addMode(new Mode(new BoostAllEffect(
0, -2, Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENT_ALL_CREATURES, false
)));
} }
private FinalRevels(final FinalRevels card) { private FinalRevels(final FinalRevels card) {

View file

@ -36,7 +36,7 @@ public final class FlamekinBladewhirl extends CardImpl {
this.getSpellAbility().addCost(new OrCost( this.getSpellAbility().addCost(new OrCost(
new RevealTargetFromHandCost(new TargetCardInHand(filter)), new RevealTargetFromHandCost(new TargetCardInHand(filter)),
new GenericManaCost(3), 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) { private FlamekinBladewhirl(final FlamekinBladewhirl card) {

View file

@ -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. //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().addEffect(new BoostTargetEffect(-5, -5, Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); 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) { private FodderLaunch(final FodderLaunch card) {

View file

@ -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)); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, StaticFilters.FILTER_CARD_CREATURES_YOUR_GRAVEYARD));
// Draw a card. // Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
} }
private FootbottomFeast(final FootbottomFeast card) { private FootbottomFeast(final FootbottomFeast card) {

View file

@ -23,7 +23,7 @@ public final class ForcedFruition extends CardImpl {
// Whenever an opponent casts a spell, that player draws seven cards. // Whenever an opponent casts a spell, that player draws seven cards.
this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, new DrawCardTargetEffect(7), 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) { private ForcedFruition(final ForcedFruition card) {

View file

@ -29,7 +29,7 @@ public final class GiltLeafPalace extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); 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. // 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}. // {tap}: Add {B} or {G}.
this.addAbility(new BlackManaAbility()); this.addAbility(new BlackManaAbility());
this.addAbility(new GreenManaAbility()); this.addAbility(new GreenManaAbility());

View file

@ -28,7 +28,7 @@ import mage.target.common.TargetCreaturePermanent;
public final class HearthcageGiant extends CardImpl { public final class HearthcageGiant extends CardImpl {
private static final FilterControlledPermanent filterElemental = new FilterControlledPermanent("Elemental"); 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 { static {
filterElemental.add(SubType.ELEMENTAL.getPredicate()); filterElemental.add(SubType.ELEMENTAL.getPredicate());

View file

@ -1,7 +1,5 @@
package mage.cards.i; package mage.cards.i;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -12,12 +10,13 @@ import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class InnerFlameAcolyte extends CardImpl { public final class InnerFlameAcolyte extends CardImpl {
@ -31,9 +30,12 @@ public final class InnerFlameAcolyte extends CardImpl {
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// When Inner-Flame Acolyte enters the battlefield, target creature gets +2/+0 and gains haste until end of turn. // 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 ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(
ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn) 2, 0, Duration.EndOfTurn
.setText("and gains haste until end of turn")); ).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()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);

View file

@ -1,10 +1,9 @@
package mage.cards.k; package mage.cards.k;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect; 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.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; 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 mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class KithkinGreatheart extends CardImpl { public final class KithkinGreatheart extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Giant"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Giant");
static { static {
filter.add(TargetController.YOU.getControllerPredicate()); filter.add(TargetController.YOU.getControllerPredicate());
filter.add(SubType.GIANT.getPredicate()); 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) { 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.KITHKIN);
this.subtype.add(SubType.SOLDIER); this.subtype.add(SubType.SOLDIER);
this.color.setWhite(true);
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// As long as you control a Giant, Kithkin Greatheart gets +1/+1 and has first strike. // As long as you control a Giant, Kithkin Greatheart gets +1/+1 and has first strike.
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(1,1, Duration.WhileOnBattlefield), new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield),
new PermanentsOnTheBattlefieldCondition(filter), condition, "As long as you control a Giant, {this} gets +1/+1"
"As long as you control a Giant, Kithkin Greatheart gets +1/+1")); ));
this.addAbility(ability); ability.addEffect(new ConditionalContinuousEffect(
ConditionalContinuousEffect effect2 = new ConditionalContinuousEffect(
new GainAbilitySourceEffect(FirstStrikeAbility.getInstance()), new GainAbilitySourceEffect(FirstStrikeAbility.getInstance()),
new PermanentsOnTheBattlefieldCondition(filter), condition, "and has first strike"
rule2); ));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect2)); this.addAbility(ability);
} }
private KithkinGreatheart(final KithkinGreatheart card) { private KithkinGreatheart(final KithkinGreatheart card) {

View file

@ -1,7 +1,5 @@
package mage.cards.k; package mage.cards.k;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
@ -9,32 +7,30 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
/** /**
*
* @author markedagain * @author markedagain
*/ */
public final class KnuckleboneWitch extends CardImpl { public final class KnuckleboneWitch extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin you control"); private static final FilterPermanent filter = new FilterControlledPermanent(SubType.GOBLIN);
static {
filter.add(TargetController.YOU.getControllerPredicate());
filter.add(SubType.GOBLIN.getPredicate());
}
public KnuckleboneWitch(UUID ownerId, CardSetInfo setInfo) { 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.GOBLIN);
this.subtype.add(SubType.SHAMAN); this.subtype.add(SubType.SHAMAN);
this.power = new MageInt(1); this.power = new MageInt(1);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// Whenever a Goblin you control dies, you may put a +1/+1 counter on Knucklebone Witch. // 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) { private KnuckleboneWitch(final KnuckleboneWitch card) {

View file

@ -22,7 +22,7 @@ public final class LaceWithMoonglove extends CardImpl {
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn)); this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
} }
private LaceWithMoonglove(final LaceWithMoonglove card) { private LaceWithMoonglove(final LaceWithMoonglove card) {

View file

@ -49,7 +49,7 @@ public final class LowlandOaf extends CardImpl {
effect.setText("Target Goblin creature you control gets +1/+0"); effect.setText("Target Goblin creature you control gets +1/+0");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost()); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost());
effect = new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn); 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(effect);
ability.addEffect(new LowlandOafEffect()); ability.addEffect(new LowlandOafEffect());
ability.addTarget(new TargetCreaturePermanent(filter)); ability.addTarget(new TargetCreaturePermanent(filter));

View file

@ -23,7 +23,7 @@ import mage.target.TargetPermanent;
public final class MerrowReejerey extends CardImpl { public final class MerrowReejerey extends CardImpl {
private static final FilterCreaturePermanent filter1 = new FilterCreaturePermanent("Merfolk creatures you control"); 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 { static {
filter1.add(SubType.MERFOLK.getPredicate()); filter1.add(SubType.MERFOLK.getPredicate());

View file

@ -22,7 +22,7 @@ public final class MoongloveExtract extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
// Sacrifice Moonglove Extract: Moonglove Extract deals 2 damage to any target. // 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()); ability.addTarget(new TargetAnyTarget());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -39,7 +39,7 @@ public final class NeedleDrop extends CardImpl {
this.getSpellAbility().addTarget(new TargetAnyTarget(1, 1, filer)); this.getSpellAbility().addTarget(new TargetAnyTarget(1, 1, filer));
// Draw a card. // Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
} }
private NeedleDrop(final NeedleDrop card) { private NeedleDrop(final NeedleDrop card) {

View file

@ -1,7 +1,6 @@
package mage.cards.p; package mage.cards.p;
import java.util.UUID; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.combat.CantBeBlockedAttachedEffect; import mage.abilities.effects.common.combat.CantBeBlockedAttachedEffect;
@ -12,31 +11,34 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AttachmentType; import mage.constants.AttachmentType;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.SubType;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class ProtectiveBubble extends CardImpl { public final class ProtectiveBubble extends CardImpl {
public ProtectiveBubble(UUID ownerId, CardSetInfo setInfo) { 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); this.subtype.add(SubType.AURA);
// Enchant creature // Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent(); TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.addAbility(new EnchantAbility(auraTarget.getTargetName())); this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
// Enchanted creature can't be blocked and has shroud. // Enchanted creature can't be blocked and has shroud.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedAttachedEffect(AttachmentType.AURA))); Ability ability = new SimpleStaticAbility(new CantBeBlockedAttachedEffect(AttachmentType.AURA));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ShroudAbility.getInstance(), AttachmentType.AURA))); ability.addEffect(new GainAbilityAttachedEffect(
ShroudAbility.getInstance(), AttachmentType.AURA
).setText("and has shroud"));
this.addAbility(ability);
} }
private ProtectiveBubble(final ProtectiveBubble card) { private ProtectiveBubble(final ProtectiveBubble card) {

View file

@ -22,7 +22,7 @@ import mage.filter.common.FilterCreaturePermanent;
public final class ScionOfOona extends CardImpl { public final class ScionOfOona extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("Faeries"); 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 { static {
filter.add(SubType.FAERIE.getPredicate()); filter.add(SubType.FAERIE.getPredicate());

View file

@ -1,4 +1,3 @@
package mage.cards.s; package mage.cards.s;
import mage.MageInt; import mage.MageInt;
@ -14,27 +13,21 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetLandPermanent; import mage.target.common.TargetLandPermanent;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class StreambedAquitects extends CardImpl { public final class StreambedAquitects extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Merfolk creature"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.MERFOLK, "Merfolk creature");
static {
filter.add(SubType.MERFOLK.getPredicate());
}
public StreambedAquitects(UUID ownerId, CardSetInfo setInfo) { 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.MERFOLK);
this.subtype.add(SubType.SCOUT); this.subtype.add(SubType.SCOUT);
@ -42,16 +35,18 @@ public final class StreambedAquitects extends CardImpl {
this.toughness = new MageInt(3); this.toughness = new MageInt(3);
// {tap}: Target Merfolk creature gets +1/+1 and gains islandwalk until end of turn. // {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 ability = new SimpleActivatedAbility(new BoostTargetEffect(
ability.addEffect(new GainAbilityTargetEffect(new IslandwalkAbility(false), Duration.EndOfTurn)); 1, 1, Duration.EndOfTurn
Target target = new TargetCreaturePermanent(filter); ).setText("target Merfolk creature gets +1/+1"), new TapSourceCost());
ability.addTarget(target); 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); this.addAbility(ability);
// {tap}: Target land becomes an Island until end of turn. // {tap}: Target land becomes an Island until end of turn.
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new TapSourceCost()); ability = new SimpleActivatedAbility(new BecomesBasicLandTargetEffect(Duration.EndOfTurn, SubType.ISLAND), new TapSourceCost());
target = new TargetLandPermanent(); ability.addTarget(new TargetLandPermanent());
ability.addTarget(target);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,11 +1,9 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.common.TapTargetCost;
import mage.abilities.effects.common.CreateTokenEffect; 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.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -16,27 +14,32 @@ import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.permanent.token.MerfolkWizardToken; import mage.game.permanent.token.MerfolkWizardToken;
import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class SummonTheSchool extends CardImpl { 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 { static {
filter.add(TappedPredicate.UNTAPPED); filter.add(TappedPredicate.UNTAPPED);
filter.add(SubType.MERFOLK.getPredicate());
} }
public SummonTheSchool(UUID ownerId, CardSetInfo setInfo) { 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); this.subtype.add(SubType.MERFOLK);
// Create two 1/1 blue Merfolk Wizard creature tokens. // Create two 1/1 blue Merfolk Wizard creature tokens.
this.getSpellAbility().addEffect(new CreateTokenEffect(new MerfolkWizardToken(), 2)); this.getSpellAbility().addEffect(new CreateTokenEffect(new MerfolkWizardToken(), 2));
// Tap four untapped Merfolk you control: Return Summon the School from your graveyard to your hand. // 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) { private SummonTheSchool(final SummonTheSchool card) {

View file

@ -1,8 +1,7 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
@ -12,31 +11,37 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class SunriseSovereign extends CardImpl { public final class SunriseSovereign extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Giant"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Giant creatures");
static { static {
filter.add(SubType.GIANT.getPredicate()); filter.add(SubType.GIANT.getPredicate());
} }
public SunriseSovereign(UUID ownerId, CardSetInfo setInfo) { 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.GIANT);
this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(5); this.power = new MageInt(5);
this.toughness = new MageInt(5); this.toughness = new MageInt(5);
// Other Giant creatures you control get +2/+2 and have trample. // 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))); Ability ability = new SimpleStaticAbility(new BoostControlledEffect(
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true))); 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) { private SunriseSovereign(final SunriseSovereign card) {

View file

@ -60,6 +60,6 @@ class SylvanEchoesTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { 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.";
} }
} }

View file

@ -20,7 +20,7 @@ import mage.target.common.TargetCreaturePermanent;
*/ */
public final class ThorntoothWitch extends CardImpl { 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 { static {
filter.add(SubType.TREEFOLK.getPredicate()); filter.add(SubType.TREEFOLK.getPredicate());

View file

@ -1,10 +1,8 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.MageObject;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.keyword.IndestructibleAbility; import mage.abilities.keyword.IndestructibleAbility;
@ -13,31 +11,32 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates; import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class TimberProtector extends CardImpl { public final class TimberProtector extends CardImpl {
private static final FilterCreaturePermanent filterTreefolk = new FilterCreaturePermanent("Treefolk creatures"); private static final FilterCreaturePermanent filterTreefolk
private static final FilterControlledPermanent filterBoth = new FilterControlledPermanent("Other Treefolk and Forests you control"); = new FilterCreaturePermanent("Treefolk creatures");
private static final FilterControlledPermanent filterBoth
= new FilterControlledPermanent("other Treefolk and Forests you control");
static { static {
filterTreefolk.add(SubType.TREEFOLK.getPredicate()); filterTreefolk.add(SubType.TREEFOLK.getPredicate());
filterBoth.add(Predicates.or( filterBoth.add(TimberProtectorPredicate.instance);
SubType.TREEFOLK.getPredicate(),
SubType.FOREST.getPredicate()));
filterBoth.add(AnotherPredicate.instance);
} }
public TimberProtector(UUID ownerId, CardSetInfo setInfo) { 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.TREEFOLK);
this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WARRIOR);
@ -45,11 +44,14 @@ public final class TimberProtector extends CardImpl {
this.toughness = new MageInt(6); this.toughness = new MageInt(6);
// Other Treefolk creatures you control get +1/+1. // 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. // Other Treefolk and Forests you control are indestructible.
Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filterBoth, true); this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
effect.setText("Other Treefolk and Forests you control are indestructible"); IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filterBoth
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); )));
} }
private TimberProtector(final TimberProtector card) { private TimberProtector(final TimberProtector card) {
@ -61,3 +63,17 @@ public final class TimberProtector extends CardImpl {
return new TimberProtector(this); return new TimberProtector(this);
} }
} }
enum TimberProtectorPredicate implements ObjectSourcePlayerPredicate<Permanent> {
instance;
@Override
public boolean apply(ObjectSourcePlayer<Permanent> 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);
}
}

View file

@ -1,7 +1,5 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
@ -14,23 +12,19 @@ import mage.abilities.keyword.FlashAbility;
import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AttachmentType; import mage.constants.*;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author fireshoes * @author fireshoes
*/ */
public final class TriclopeanSight extends CardImpl { public final class TriclopeanSight extends CardImpl {
public TriclopeanSight(UUID ownerId, CardSetInfo setInfo) { 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); this.subtype.add(SubType.AURA);
// Flash // Flash
@ -40,15 +34,20 @@ public final class TriclopeanSight extends CardImpl {
TargetPermanent auraTarget = new TargetCreaturePermanent(); TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.Neutral)); this.getSpellAbility().addEffect(new AttachEffect(Outcome.Neutral));
Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
this.addAbility(ability);
// When Triclopean Sight enters the battlefield, untap enchanted creature. // When Triclopean Sight enters the battlefield, untap enchanted creature.
this.addAbility(new EntersBattlefieldTriggeredAbility(new UntapEnchantedEffect())); this.addAbility(new EntersBattlefieldTriggeredAbility(new UntapEnchantedEffect()));
// Enchanted creature gets +1/+1 and has vigilance. // Enchanted creature gets +1/+1 and has vigilance.
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1,1, Duration.WhileOnBattlefield)); Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(
ability.addEffect(new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield)); 1, 1, Duration.WhileOnBattlefield
));
ability.addEffect(new GainAbilityAttachedEffect(
VigilanceAbility.getInstance(),
AttachmentType.AURA,
Duration.WhileOnBattlefield
).setText("and has vigilance"));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,9 +1,6 @@
package mage.cards.v; package mage.cards.v;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BecomesTappedSourceTriggeredAbility; import mage.abilities.common.BecomesTappedSourceTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -12,22 +9,25 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Wehk * @author Wehk
*/ */
public final class VeteranOfTheDepths extends CardImpl { public final class VeteranOfTheDepths extends CardImpl {
public VeteranOfTheDepths(UUID ownerId, CardSetInfo setInfo) { 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.MERFOLK);
this.subtype.add(SubType.SOLDIER); this.subtype.add(SubType.SOLDIER);
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// Whenever Veteran of the Depths becomes tapped, you may put a +1/+1 counter on it. // 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(new BecomesTappedSourceTriggeredAbility(
this.addAbility(ability); new AddCountersSourceEffect(CounterType.P1P1.createInstance())
.setText("put a +1/+1 counter on it"), true
));
} }
private VeteranOfTheDepths(final VeteranOfTheDepths card) { private VeteranOfTheDepths(final VeteranOfTheDepths card) {

View file

@ -57,7 +57,7 @@ class VigorReplacementEffect extends ReplacementEffectImpl {
VigorReplacementEffect() { VigorReplacementEffect() {
super(Duration.WhileOnBattlefield, Outcome.BoostCreature); 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) { VigorReplacementEffect(final VigorReplacementEffect effect) {

View file

@ -23,7 +23,7 @@ import mage.target.common.TargetCreaturePermanent;
*/ */
public final class WellgabberApothecary extends CardImpl { 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 { static {
filter.add(TappedPredicate.TAPPED); filter.add(TappedPredicate.TAPPED);

View file

@ -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. // 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) 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) this.getSpellAbility().addEffect(new GainAllCreatureTypesTargetEffect(Duration.EndOfTurn)
.setText(", gains all creature types")); .setText(", gains all creature types"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn) 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()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
} }

View file

@ -1,11 +1,9 @@
package mage.cards.w; package mage.cards.w;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.abilities.keyword.FearAbility; import mage.abilities.keyword.FearAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
@ -16,8 +14,9 @@ import mage.constants.TargetController;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/** /**
*
* @author Loki * @author Loki
*/ */
public final class WortBoggartAuntie extends CardImpl { public final class WortBoggartAuntie extends CardImpl {
@ -29,7 +28,7 @@ public final class WortBoggartAuntie extends CardImpl {
} }
public WortBoggartAuntie(UUID ownerId, CardSetInfo setInfo) { 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); addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.SHAMAN); this.subtype.add(SubType.SHAMAN);
@ -40,7 +39,9 @@ public final class WortBoggartAuntie extends CardImpl {
this.addAbility(FearAbility.getInstance()); this.addAbility(FearAbility.getInstance());
// At the beginning of your upkeep, you may return target Goblin card from your graveyard to your hand. // 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)); ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,36 +1,32 @@
package mage.cards.w; package mage.cards.w;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect; 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.ChampionAbility;
import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.DeathtouchAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; 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.filter.FilterPermanent;
import mage.game.permanent.token.WolfToken; import mage.game.permanent.token.WolfToken;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class WrensRunPackmaster extends CardImpl { public final class WrensRunPackmaster extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("Wolf"); private static final FilterPermanent filter = new FilterPermanent(SubType.WOLF, "Wolves");
static {
filter.add(TargetController.YOU.getControllerPredicate());
filter.add(SubType.WOLF.getPredicate());
}
public WrensRunPackmaster(UUID ownerId, CardSetInfo setInfo) { 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.ELF);
this.subtype.add(SubType.WARRIOR); this.subtype.add(SubType.WARRIOR);
@ -41,12 +37,14 @@ public final class WrensRunPackmaster extends CardImpl {
this.addAbility(new ChampionAbility(this, SubType.ELF, false)); this.addAbility(new ChampionAbility(this, SubType.ELF, false));
// {2}{G}: Create a 2/2 green Wolf creature token. // {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. // Each Wolf you control has deathtouch.
Effect effect = new GainAbilityAllEffect(DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter); this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
effect.setText("Each Wolf you control has deathtouch"); DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); )));
} }
private WrensRunPackmaster(final WrensRunPackmaster card) { private WrensRunPackmaster(final WrensRunPackmaster card) {

View file

@ -62,7 +62,7 @@ public class VerifyCardDataTest {
private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class); 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 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 private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages

View file

@ -12,7 +12,6 @@ import mage.game.permanent.Permanent;
import mage.util.CardUtil; import mage.util.CardUtil;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public class CanBlockAdditionalCreatureEffect extends ContinuousEffectImpl { public class CanBlockAdditionalCreatureEffect extends ContinuousEffectImpl {
@ -69,21 +68,21 @@ public class CanBlockAdditionalCreatureEffect extends ContinuousEffectImpl {
} }
private String setText() { private String setText() {
String text = "{this} can block "; StringBuilder sb = new StringBuilder("{this} can block ");
switch (amount) { if (amount == 0) {
case 0: sb.append("any number of creatures");
text += "any number of creatures"; } else {
break; sb.append(CardUtil.numberToText(amount, "an"));
default: sb.append(" additional creature");
text += CardUtil.numberToText(amount, "an") + " additional creature" + (amount > 1 ? "s" : ""); sb.append((amount > 1 ? "s" : ""));
} }
if (duration == Duration.EndOfTurn) { if (duration == Duration.EndOfTurn) {
text += " this turn"; sb.append(" this turn");
} }
if (duration == Duration.WhileOnBattlefield) { if (duration == Duration.WhileOnBattlefield && amount == 1) {
text += " each combat"; sb.append(" each combat");
} }
return text; return sb.toString();
} }
@Override @Override

View file

@ -1,17 +1,16 @@
package mage.abilities.effects.common.combat; package mage.abilities.effects.common.combat;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Layer; import mage.constants.Layer;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SubLayer; import mage.constants.SubLayer;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.util.CardUtil;
/** /**
*
* @author North * @author North
*/ */
public class CantBeBlockedByOneEffect extends ContinuousEffectImpl { public class CantBeBlockedByOneEffect extends ContinuousEffectImpl {
@ -23,9 +22,9 @@ public class CantBeBlockedByOneEffect extends ContinuousEffectImpl {
} }
public CantBeBlockedByOneEffect(int amount, Duration duration) { public CantBeBlockedByOneEffect(int amount, Duration duration) {
super(duration, Outcome.Benefit); super(duration, Layer.RulesEffects, SubLayer.NA, Outcome.Benefit);
this.amount = amount; 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) { public CantBeBlockedByOneEffect(final CantBeBlockedByOneEffect effect) {
@ -39,26 +38,12 @@ public class CantBeBlockedByOneEffect extends ContinuousEffectImpl {
} }
@Override @Override
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { public boolean apply(Game game, Ability source) {
Permanent perm = game.getPermanent(source.getSourceId()); Permanent perm = source.getSourcePermanentIfItStillExists(game);
if (perm != null) { if (perm != null) {
switch (layer) {
case RulesEffects:
perm.setMinBlockedBy(amount); perm.setMinBlockedBy(amount);
break;
}
return true; return true;
} }
return false; return false;
} }
@Override
public boolean apply(Game game, Ability source) {
return false;
}
@Override
public boolean hasLayer(Layer layer) {
return layer == Layer.RulesEffects;
}
} }