a few more incorrect creature filter fixes

This commit is contained in:
theelk801 2026-01-23 10:42:55 -05:00
parent 242b664184
commit 5041256d43
38 changed files with 328 additions and 471 deletions

View file

@ -1,25 +1,26 @@
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
import mage.abilities.effects.common.RevealLibraryPickControllerEffect;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import java.util.UUID;
/**
*
* @author Grath
*/
public final class AdewaleBreakerOfChains extends CardImpl {
private static final FilterCard filter = new FilterCard("an Assassin, Pirate, or Vehicle card");
private static final FilterControlledCreaturePermanent filter2 = new FilterControlledCreaturePermanent("Vehicle you control");
private static final FilterPermanent filter2 = new FilterControlledPermanent(SubType.VEHICLE);
static {
filter.add(Predicates.or(
@ -27,12 +28,11 @@ public final class AdewaleBreakerOfChains extends CardImpl {
SubType.PIRATE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
filter2.add(SubType.VEHICLE.getPredicate());
}
public AdewaleBreakerOfChains(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ASSASSIN);
@ -41,15 +41,15 @@ public final class AdewaleBreakerOfChains extends CardImpl {
this.toughness = new MageInt(1);
// When Adewale enters the battlefield, reveal the top six cards of your library. Put an Assassin, Pirate, or Vehicle card from among them into your hand and the rest on the bottom of your library in a random order.
this.addAbility(new EntersBattlefieldTriggeredAbility(
new RevealLibraryPickControllerEffect(
6, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM, false
), false));
this.addAbility(new EntersBattlefieldTriggeredAbility(new RevealLibraryPickControllerEffect(
6, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM, false
), false));
// Whenever a Vehicle you control deals combat damage to a player, you may return Adewale from your graveyard to your hand.
this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(Zone.GRAVEYARD,
new ReturnSourceFromGraveyardToHandEffect(), filter2,
true, SetTargetPointer.NONE, true, false));
this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter2,
true, SetTargetPointer.NONE, true, false
));
}
private AdewaleBreakerOfChains(final AdewaleBreakerOfChains card) {

View file

@ -1,7 +1,6 @@
package mage.cards.a;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
@ -12,26 +11,21 @@ import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author Quercitron
*/
public final class AnimateWall extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Wall");
static {
filter.add(SubType.WALL.getPredicate());
}
public AnimateWall(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}");
this.subtype.add(SubType.AURA);
private static final FilterPermanent filter = new FilterPermanent(SubType.WALL);
public AnimateWall(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
this.subtype.add(SubType.AURA);
// Enchant Wall
TargetPermanent auraTarget = new TargetPermanent(filter);
@ -39,7 +33,7 @@ public final class AnimateWall extends CardImpl {
this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
Ability ability = new EnchantAbility(auraTarget);
this.addAbility(ability);
// Enchanted Wall can attack as though it didn't have defender.
Ability canAttackAbility = new SimpleStaticAbility(new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield));
Effect enchantEffect = new GainAbilityAttachedEffect(canAttackAbility, AttachmentType.AURA, Duration.WhileOnBattlefield);

View file

@ -11,7 +11,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import java.util.UUID;
@ -20,7 +20,7 @@ import java.util.UUID;
*/
public final class BiowasteBlob extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.OOZE, "Oozes");
private static final FilterPermanent filter = new FilterPermanent(SubType.OOZE, "Oozes");
public BiowasteBlob(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");

View file

@ -1,31 +1,27 @@
package mage.cards.b;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.Effect;
import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.FlashAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author Tsirides
*/
public final class BlacklanceParagon extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.KNIGHT, "Knight");
private static final FilterPermanent filter = new FilterPermanent(SubType.KNIGHT);
public BlacklanceParagon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
@ -38,17 +34,13 @@ public final class BlacklanceParagon extends CardImpl {
// Flash
this.addAbility(FlashAbility.getInstance());
// When Blacklance Paragon enters the battlefield, target Knight gains deathtouch and lifelink until end of turn.
Effect effect = new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn);
effect.setText("target Knight gains deathtouch");
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
effect = new GainAbilityTargetEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn);
effect.setText("and lifelink until end of turn");
ability.addEffect(effect);
Ability ability = new EntersBattlefieldTriggeredAbility(new GainAbilityTargetEffect(DeathtouchAbility.getInstance())
.setText("target Knight gains deathtouch"));
ability.addEffect(new GainAbilityTargetEffect(LifelinkAbility.getInstance())
.setText("and lifelink until end of turn"));
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
private BlacklanceParagon(final BlacklanceParagon card) {

View file

@ -1,20 +1,20 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
@ -24,13 +24,8 @@ import java.util.UUID;
*/
public final class BloodSpeaker extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a Demon under your control");
private static final FilterCard filterCard = new FilterCard("Demon card");
static {
filter.add(SubType.DEMON.getPredicate());
filterCard.add(SubType.DEMON.getPredicate());
}
private static final FilterCard filterCard = new FilterCard(SubType.DEMON);
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DEMON);
public BloodSpeaker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
@ -40,16 +35,16 @@ public final class BloodSpeaker extends CardImpl {
this.toughness = new MageInt(2);
// At the beginning of your upkeep, you may sacrifice Blood Speaker. If you do, search your library for a Demon card, reveal that card, and put it into your hand. Then shuffle your library.
Ability ability = new BeginningOfUpkeepTriggeredAbility(
new DoIfCostPaid(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filterCard), true, true),
new SacrificeSourceCost()
)
);
this.addAbility(ability);
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new DoIfCostPaid(new SearchLibraryPutInHandEffect(
new TargetCardInLibrary(filterCard), true, true
), new SacrificeSourceCost())
));
// Whenever a Demon you control enters, return Blood Speaker from your graveyard to your hand.
this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, false));
this.addAbility(new EntersBattlefieldAllTriggeredAbility(
Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), filter, false
));
}
private BloodSpeaker(final BloodSpeaker card) {

View file

@ -1,11 +1,8 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.TriggeredAbility;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
import mage.abilities.keyword.FlyingAbility;
@ -13,9 +10,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
@ -23,18 +18,10 @@ import mage.game.events.ZoneChangeEvent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class BoneyardScourge extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a Dragon you control");
static {
filter.add(SubType.DRAGON.getPredicate());
filter.add(TargetController.YOU.getControllerPredicate());
}
public BoneyardScourge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
@ -46,10 +33,7 @@ public final class BoneyardScourge extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever a Dragon you control dies while Boneyard Scourge is in your graveyard, you may pay 1B. If you do, return Boneyard Scourge from your graveyard to the battlefield.
TriggeredAbility ability = new DiesWhileInGraveyardTriggeredAbility(
new DoIfCostPaid(new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl<>("{1}{B}")),
filter);
this.addAbility(ability);
this.addAbility(new DiesWhileInGraveyardTriggeredAbility());
}
private BoneyardScourge(final BoneyardScourge card) {
@ -64,17 +48,13 @@ public final class BoneyardScourge extends CardImpl {
class DiesWhileInGraveyardTriggeredAbility extends TriggeredAbilityImpl {
private final FilterCreaturePermanent filter;
public DiesWhileInGraveyardTriggeredAbility(Effect effect, FilterCreaturePermanent filter) {
super(Zone.GRAVEYARD, effect, false);
this.filter = filter;
setTriggerPhrase("Whenever " + filter.getMessage() + " dies while {this} is in your graveyard, ");
public DiesWhileInGraveyardTriggeredAbility() {
super(Zone.GRAVEYARD, new DoIfCostPaid(new ReturnSourceFromGraveyardToBattlefieldEffect(), new ManaCostsImpl<>("{1}{B}")), false);
setTriggerPhrase("Whenever a Dragon you control dies while {this} is in your graveyard, ");
}
private DiesWhileInGraveyardTriggeredAbility(final DiesWhileInGraveyardTriggeredAbility ability) {
super(ability);
this.filter = ability.filter;
}
@Override
@ -90,16 +70,9 @@ class DiesWhileInGraveyardTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (!zEvent.isDiesEvent()) {
return false;
}
for (Zone z : Zone.values()) {
if (game.checkShortLivingLKI(sourceId, z) && z != Zone.GRAVEYARD) {
return false;
}
}
return filter.match(zEvent.getTarget(), controllerId,this, game);
return zEvent.isDiesEvent()
&& game.checkShortLivingLKI(sourceId, Zone.GRAVEYARD)
&& zEvent.getTarget().hasSubtype(SubType.DRAGON, game)
&& zEvent.getTarget().isControlledBy(getControllerId());
}
}

View file

@ -12,7 +12,6 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
@ -21,8 +20,7 @@ import java.util.UUID;
*/
public final class BrambleguardVeteran extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.RACCOON, "");
private static final FilterPermanent filter2 = new FilterPermanent(SubType.RACCOON, "");
private static final FilterPermanent filter = new FilterPermanent(SubType.RACCOON);
public BrambleguardVeteran(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
@ -40,7 +38,7 @@ public final class BrambleguardVeteran extends CardImpl {
ExpendTriggeredAbility.Expend.FOUR
);
ability.addEffect(new GainAbilityControlledEffect(
VigilanceAbility.getInstance(), Duration.EndOfTurn, filter2
VigilanceAbility.getInstance(), Duration.EndOfTurn, filter
).setText("and gain vigilance until end of turn"));
this.addAbility(ability);
}

View file

@ -11,7 +11,7 @@ import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.players.Player;
import mage.watchers.common.CommanderPlaysCountWatcher;
@ -23,7 +23,7 @@ import java.util.UUID;
*/
public final class CaptainVargusWrath extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.PIRATE, "");
private static final FilterPermanent filter = new FilterPermanent(SubType.PIRATE, "");
public CaptainVargusWrath(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{R}");

View file

@ -1,7 +1,5 @@
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@ -13,21 +11,22 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
import static mage.constants.SubType.KAVU;
/**
*
* @author Loki
*/
public final class CoastalDrake extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(KAVU);
public CoastalDrake(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.DRAKE);
this.power = new MageInt(2);
@ -38,7 +37,7 @@ public final class CoastalDrake extends CardImpl {
// {1}{U}, {T} : Return target Kavu to its owner's hand.
Ability ability = new SimpleActivatedAbility(new ReturnToHandTargetEffect(), new ManaCostsImpl<>("{1}{U}"));
ability.addTarget(new TargetPermanent(new FilterCreaturePermanent(KAVU, "Kavu")));
ability.addTarget(new TargetPermanent(filter));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}

View file

@ -1,14 +1,15 @@
package mage.cards.d;
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.Effect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.hint.ConditionHint;
import mage.abilities.hint.Hint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
@ -16,45 +17,36 @@ import mage.cards.CardSetInfo;
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.FilterControlledPermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class DragonloftIdol extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Dragon");
static {
filter.add(TargetController.YOU.getControllerPredicate());
filter.add(SubType.DRAGON.getPredicate());
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(SubType.DRAGON));
private static final Hint hint = new ConditionHint(condition, "You control a Dragon");
public DragonloftIdol(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}");
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}");
this.subtype.add(SubType.GARGOYLE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// As long as you control a Dragon, Dragonloft Idol gets +1/+1 and has flying and trample.
Effect effect = new ConditionalContinuousEffect(new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield),
new PermanentsOnTheBattlefieldCondition(filter),
"As long as you control a Dragon, {this} gets +1/+1");
Ability ability = new SimpleStaticAbility(effect);
effect = new ConditionalContinuousEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance()),
new PermanentsOnTheBattlefieldCondition(filter),
"and has flying");
ability.addEffect(effect);
effect = new ConditionalContinuousEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance()),
new PermanentsOnTheBattlefieldCondition(filter),
"and trample");
ability.addEffect(effect);
this.addAbility(ability);
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield),
condition, "as long as you control a Dragon, {this} gets +1/+1"
));
ability.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(FlyingAbility.getInstance()), condition, "and has flying"
));
ability.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(TrampleAbility.getInstance()), condition, "and trample"
));
this.addAbility(ability.addHint(hint));
}
private DragonloftIdol(final DragonloftIdol card) {

View file

@ -10,7 +10,6 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -20,7 +19,7 @@ import java.util.UUID;
*/
public final class DwarvenDemolitionTeam extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent(SubType.WALL, "Wall");
private static final FilterPermanent filter = new FilterPermanent(SubType.WALL);
public DwarvenDemolitionTeam(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");

View file

@ -1,29 +1,32 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileFaceDownTopNLibraryYouMayPlayAsLongAsExiledTargetEffect;
import mage.constants.*;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.permanent.token.TreasureToken;
import java.util.UUID;
/**
*
* @author Grath
*/
public final class EdwardKenway extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("tapped Assassin, Pirate, and/or Vehicle you control");
private static final FilterControlledCreaturePermanent filter2 = new FilterControlledCreaturePermanent("Vehicle you control");
private static final FilterPermanent filter2 = new FilterControlledPermanent(SubType.VEHICLE);
static {
filter.add(TappedPredicate.TAPPED);
@ -32,12 +35,14 @@ public final class EdwardKenway extends CardImpl {
SubType.PIRATE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
filter2.add(SubType.VEHICLE.getPredicate());
}
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter);
private static final Hint hint = new ValueHint("Tapped Assassins, Pirates, and Vehicles you control", xValue);
public EdwardKenway(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}{R}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ASSASSIN);
@ -46,15 +51,15 @@ public final class EdwardKenway extends CardImpl {
this.toughness = new MageInt(5);
// At the beginning of your end step, create a Treasure token for each tapped Assassin, Pirate, and/or Vehicle you control.
this.addAbility(new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(
new TreasureToken(), new PermanentsOnBattlefieldCount(filter))));
this.addAbility(new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(new TreasureToken(), xValue)).addHint(hint));
// Whenever a Vehicle you control deals combat damage to a player, look at the top card of that player's library, then exile it face down. You may play that card for as long as it remains exiled.
this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
new ExileFaceDownTopNLibraryYouMayPlayAsLongAsExiledTargetEffect(false, CastManaAdjustment.NONE)
.setText("look at the top card of that player's library, then exile it face down. "
+ "You may play that card for as long as it remains exiled"), filter2,
false, SetTargetPointer.PLAYER, true, true));
false, SetTargetPointer.PLAYER, true, true
));
}
private EdwardKenway(final EdwardKenway card) {

View file

@ -1,27 +1,27 @@
package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.keyword.MountainwalkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import java.util.UUID;
/**
* @author Loki
*/
public final class GoblinKing extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(SubType.GOBLIN, "Goblins");
public GoblinKing(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
this.subtype.add(SubType.GOBLIN);
@ -29,13 +29,13 @@ public final class GoblinKing extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Other Goblin creatures get +1/+1 and have mountainwalk.
Effect effect = new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE_GOBLINS, true);
effect.setText("Other Goblins get +1/+1");
Ability ability = new SimpleStaticAbility(effect);
effect = new GainAbilityAllEffect(new MountainwalkAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE_GOBLINS, true);
effect.setText("and have mountainwalk");
ability.addEffect(effect);
// Other Goblins get +1/+1 and have mountainwalk.
Ability ability = new SimpleStaticAbility(new BoostAllEffect(
1, 1, Duration.WhileOnBattlefield, filter, true
));
ability.addEffect(new GainAbilityAllEffect(
new MountainwalkAbility(), Duration.WhileOnBattlefield, filter, true
).setText("and have mountainwalk"));
this.addAbility(ability);
}

View file

@ -1,11 +1,8 @@
package mage.cards.h;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.FlashAbility;
@ -15,22 +12,19 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class HeronsGraceChampion extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other Humans");
static {
filter.add(SubType.HUMAN.getPredicate());
}
private static final FilterPermanent filter = new FilterPermanent(SubType.HUMAN);
public HeronsGraceChampion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{W}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(3);
@ -43,13 +37,13 @@ public final class HeronsGraceChampion extends CardImpl {
this.addAbility(LifelinkAbility.getInstance());
// When Heron's Grace Champion enters the battlefield, other Humans you control get +1/+1 and gain lifelink until end of turn.
Effect effect = new BoostControlledEffect(1, 1, Duration.EndOfTurn, filter, true);
effect.setText("other Humans you control get +1/+1");
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, filter, true);
effect.setText("and gain lifelink until end of turn");
ability.addEffect(effect);
this.addAbility(ability);
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostControlledEffect(
1, 1, Duration.EndOfTurn, filter, true
).setText("other Humans you control get +1/+1"));
ability.addEffect(new GainAbilityControlledEffect(
LifelinkAbility.getInstance(), Duration.EndOfTurn, filter, true
).setText("and gain lifelink until end of turn"));
this.addAbility(ability);
}
private HeronsGraceChampion(final HeronsGraceChampion card) {

View file

@ -1,7 +1,5 @@
package mage.cards.h;
import java.util.List;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@ -13,24 +11,26 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.hint.ValueHint;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.common.FilterCreaturePermanent;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetAnyTarget;
import mage.watchers.common.PermanentsEnteredBattlefieldWatcher;
import java.util.List;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class HobgoblinBanditLord extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.GOBLIN, "Goblins");
private static final FilterPermanent filter = new FilterPermanent(SubType.GOBLIN, "Goblins");
public HobgoblinBanditLord(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
@ -48,7 +48,7 @@ public final class HobgoblinBanditLord extends CardImpl {
// {R}, {T}: Hobgoblin Bandit Lord deals damage equal to the number of Goblins that entered the battlefield under your control this turn to any target.
Ability ability = new SimpleActivatedAbility(
new DamageTargetEffect(GoblinsEnteredThisTurnDynamicValue.instance)
.setText("{this} deals damage equal to the number of Goblins that entered the battlefield under your control this turn to any target"),
.setText("{this} deals damage equal to the number of Goblins that entered the battlefield under your control this turn to any target"),
new ManaCostsImpl<>("{R}")
);
ability.addCost(new TapSourceCost());

View file

@ -1,7 +1,5 @@
package mage.cards.h;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleEvasionAbility;
import mage.abilities.effects.common.combat.CantBlockCreaturesSourceEffect;
@ -11,20 +9,24 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/**
* @author noxx
*/
public final class HuntedGhoul extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.HUMAN, "Humans");
public HuntedGhoul(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
this.subtype.add(SubType.ZOMBIE);
this.power = new MageInt(1);
this.toughness = new MageInt(2);
// Hunted Ghoul can't block Humans.
this.addAbility(new SimpleEvasionAbility(new CantBlockCreaturesSourceEffect(new FilterCreaturePermanent(SubType.HUMAN, "Humans"))));
this.addAbility(new SimpleEvasionAbility(new CantBlockCreaturesSourceEffect(filter)));
}
private HuntedGhoul(final HuntedGhoul card) {

View file

@ -1,7 +1,5 @@
package mage.cards.j;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksEachCombatStaticAbility;
import mage.abilities.common.SimpleEvasionAbility;
@ -13,17 +11,14 @@ import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public final class Juggernaut extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Walls");
static {
filter.add(SubType.WALL.getPredicate());
}
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.WALL, "Walls");
public Juggernaut(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}");

View file

@ -1,8 +1,7 @@
package mage.cards.k;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
@ -12,29 +11,22 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.Target;
import mage.filter.FilterPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author North
*/
public final class KrosanWarchief extends CardImpl {
private static final FilterCard filter = new FilterCard("Beast spells");
private static final FilterCreaturePermanent filterTarget = new FilterCreaturePermanent("Beast");
static {
filter.add(SubType.BEAST.getPredicate());
filterTarget.add(SubType.BEAST.getPredicate());
}
private static final FilterCard filter = new FilterCard(SubType.BEAST, "Beast spells");
private static final FilterPermanent filter2 = new FilterPermanent(SubType.BEAST);
public KrosanWarchief(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
this.subtype.add(SubType.BEAST);
this.power = new MageInt(2);
@ -42,12 +34,10 @@ public final class KrosanWarchief extends CardImpl {
// Beast spells you cast cost {1} less to cast.
this.addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 1)));
// {1}{G}: Regenerate target Beast.
SimpleActivatedAbility ability = new SimpleActivatedAbility(
new RegenerateTargetEffect(),
new ManaCostsImpl<>("{1}{G}"));
Target target = new TargetPermanent(filterTarget);
ability.addTarget(target);
Ability ability = new SimpleActivatedAbility(new RegenerateTargetEffect(), new ManaCostsImpl<>("{1}{G}"));
ability.addTarget(new TargetPermanent(filter2));
this.addAbility(ability);
}

View file

@ -1,9 +1,7 @@
package mage.cards.l;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OneOrMoreDamagePlayerTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
@ -12,7 +10,7 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.HistoricPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
@ -25,14 +23,9 @@ import java.util.UUID;
*/
public final class LaylaHassan extends CardImpl {
private static final FilterCard filter = new FilterCard("historic card from your graveyard");
static {
filter.add(HistoricPredicate.instance);
}
public LaylaHassan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ASSASSIN);
@ -43,9 +36,7 @@ public final class LaylaHassan extends CardImpl {
this.addAbility(FirstStrikeAbility.getInstance());
// When Layla Hassan enters the battlefield and whenever one or more Assassins you control deal combat damage to a player, return target historic card from your graveyard to your hand.
Ability ability = new LaylaHassanTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect());
ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability);
this.addAbility(new LaylaHassanTriggeredAbility());
}
private LaylaHassan(final LaylaHassan card) {
@ -60,14 +51,16 @@ public final class LaylaHassan extends CardImpl {
class LaylaHassanTriggeredAbility extends OneOrMoreDamagePlayerTriggeredAbility {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Assassins");
private static final FilterPermanent filter = new FilterPermanent(SubType.ASSASSIN, "Assassins");
private static final FilterCard filter2 = new FilterCard("historic card from your graveyard");
static {
filter.add(SubType.ASSASSIN.getPredicate());
filter2.add(HistoricPredicate.instance);
}
public LaylaHassanTriggeredAbility(Effect effect) {
super(effect, filter, true, true);
public LaylaHassanTriggeredAbility() {
super(new ReturnFromGraveyardToHandTargetEffect(), filter, true, true);
this.addTarget(new TargetCardInYourGraveyard(filter2));
}
private LaylaHassanTriggeredAbility(final LaylaHassanTriggeredAbility ability) {
@ -76,8 +69,8 @@ class LaylaHassanTriggeredAbility extends OneOrMoreDamagePlayerTriggeredAbility
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD
|| event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ONE_PLAYER;
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD
|| event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ONE_PLAYER;
}
@Override
@ -94,7 +87,8 @@ class LaylaHassanTriggeredAbility extends OneOrMoreDamagePlayerTriggeredAbility
@Override
public String getRule() {
return "When {this} enters the battlefield and whenever one or more Assassins you control deal combat damage to a player, return target historic card from your graveyard to your hand.";
return "When {this} enters the battlefield and whenever one or more Assassins you control " +
"deal combat damage to a player, return target historic card from your graveyard to your hand.";
}
@Override

View file

@ -4,7 +4,6 @@ package mage.cards.l;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.keyword.IslandwalkAbility;
@ -13,8 +12,7 @@ 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.filter.FilterPermanent;
import java.util.UUID;
@ -23,7 +21,7 @@ import java.util.UUID;
*/
public final class LordOfAtlantis extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.MERFOLK, "Merfolk");
private static final FilterPermanent filter = new FilterPermanent(SubType.MERFOLK);
public LordOfAtlantis(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{U}");
@ -32,13 +30,13 @@ public final class LordOfAtlantis extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Other Merfolk creatures get +1/+1 and have islandwalk.
Effect effect = new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, true);
effect.setText("Other Merfolk get +1/+1");
Ability ability = new SimpleStaticAbility(effect);
effect = new GainAbilityAllEffect(new IslandwalkAbility(), Duration.WhileOnBattlefield, filter, true);
effect.setText("and have islandwalk");
ability.addEffect(effect);
// Other Merfolk get +1/+1 and have islandwalk.
Ability ability = new SimpleStaticAbility(new BoostAllEffect(
1, 1, Duration.WhileOnBattlefield, filter, true
));
ability.addEffect(new GainAbilityAllEffect(
new IslandwalkAbility(), Duration.WhileOnBattlefield, filter, true
).setText("and have islandwalk"));
this.addAbility(ability);
}

View file

@ -14,7 +14,8 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
@ -23,7 +24,7 @@ import java.util.UUID;
*/
public final class MiaraThornOfTheGlade extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.ELF, "Elf you control");
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.ELF);
static {
filter.add(TargetController.YOU.getControllerPredicate());
@ -39,16 +40,14 @@ public final class MiaraThornOfTheGlade extends CardImpl {
this.toughness = new MageInt(2);
// Whenever Miara, Thorn of the Glade or another Elf you control dies, you may pay {1} and 1 life. If you do, draw a card.
this.addAbility(new DiesThisOrAnotherTriggeredAbility(
new DoIfCostPaid(
new DrawCardSourceControllerEffect(1),
new CompositeCost(
new GenericManaCost(1),
new PayLifeCost(1),
"{1} and 1 life"
)
), false, filter
));
this.addAbility(new DiesThisOrAnotherTriggeredAbility(new DoIfCostPaid(
new DrawCardSourceControllerEffect(1),
new CompositeCost(
new GenericManaCost(1),
new PayLifeCost(1),
"{1} and 1 life"
)
), false, filter));
// Partner
this.addAbility(PartnerAbility.getInstance());

View file

@ -1,7 +1,5 @@
package mage.cards.m;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.ProtectionAbility;
import mage.cards.CardImpl;
@ -9,23 +7,18 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/**
*
* @author noxx
*/
public final class MidnightDuelist extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("Vampires");
static {
filter.add(SubType.VAMPIRE.getPredicate());
}
private static final FilterPermanent filter = new FilterPermanent(SubType.VAMPIRE, "Vampires");
public MidnightDuelist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SOLDIER);

View file

@ -4,14 +4,16 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
@ -20,12 +22,7 @@ import java.util.UUID;
*/
public final class MidnightEntourage extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Aetherborn you control");
static {
filter.add(SubType.AETHERBORN.getPredicate());
filter.add(TargetController.YOU.getControllerPredicate());
}
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.AETHERBORN);
public MidnightEntourage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
@ -36,12 +33,15 @@ public final class MidnightEntourage extends CardImpl {
this.toughness = new MageInt(3);
// Other Aetherborn you control get +1/+1.
this.addAbility(new SimpleStaticAbility(new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, true)));
this.addAbility(new SimpleStaticAbility(new BoostAllEffect(
1, 1, Duration.WhileOnBattlefield, filter, true
)));
// Whenever Midnight Entourage or another Aetherborn you control dies, you draw a card and you lose 1 life.
Ability ability = new DiesThisOrAnotherTriggeredAbility(new DrawCardSourceControllerEffect(1, true), false, filter);
Effect effect = new LoseLifeSourceControllerEffect(1);
ability.addEffect(effect.concatBy("and"));
Ability ability = new DiesThisOrAnotherTriggeredAbility(
new DrawCardSourceControllerEffect(1, true), false, filter
);
ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
this.addAbility(ability);
}

View file

@ -13,7 +13,6 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
@ -22,8 +21,7 @@ import java.util.UUID;
*/
public final class MoonstoneHarbinger extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.BAT, "");
private static final FilterPermanent filter2 = new FilterPermanent(SubType.BAT, "");
private static final FilterPermanent filter = new FilterPermanent(SubType.BAT);
public MoonstoneHarbinger(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
@ -44,7 +42,7 @@ public final class MoonstoneHarbinger extends CardImpl {
1, 0, Duration.EndOfTurn, filter
).setText("Bats you control get +1/+0")).setTriggersLimitEachTurn(1);
ability.addEffect(new GainAbilityControlledEffect(
DeathtouchAbility.getInstance(), Duration.EndOfTurn, filter2
DeathtouchAbility.getInstance(), Duration.EndOfTurn, filter
).setText("and gain deathtouch until end of turn"));
this.addAbility(ability);
}

View file

@ -1,13 +1,9 @@
package mage.cards.n;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInHandCondition;
import mage.abilities.condition.common.HeckbentCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
@ -15,21 +11,20 @@ import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class NehebTheWorthy extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Minotaurs");
static {
filter.add(SubType.MINOTAUR.getPredicate());
filter.add(TargetController.YOU.getControllerPredicate());
}
private static final FilterPermanent filter = new FilterPermanent(SubType.MINOTAUR, "Minotaurs");
public NehebTheWorthy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{R}");
@ -44,13 +39,15 @@ public final class NehebTheWorthy extends CardImpl {
this.addAbility(FirstStrikeAbility.getInstance());
// Other Minotaurs you control have first strike.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter, true)));
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter, true
)));
// As long as you have one or fewer cards in hand, Minotaurs you control get +2/+0.
Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 2);
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield, filter), condition, "As long as you have one or fewer cards in hand, Minotaurs you control get +2/+0"));
this.addAbility(ability);
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield, filter),
HeckbentCondition.instance, "as long as you have one or fewer cards in hand, Minotaurs you control get +2/+0"
)));
// Whenever Neheb, the Worthy deals combat damage to a player, each player discards a card.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardEachPlayerEffect(), false));

View file

@ -1,40 +1,29 @@
package mage.cards.o;
import java.util.UUID;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.common.FilterPermanentCard;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class ObzedatsAid extends CardImpl {
private static final FilterCard filter = new FilterCard("permanent card from your graveyard");
static {
filter.add(Predicates.or(
CardType.ARTIFACT.getPredicate(),
CardType.CREATURE.getPredicate(),
CardType.ENCHANTMENT.getPredicate(),
CardType.LAND.getPredicate(),
CardType.PLANESWALKER.getPredicate()));
}
private static final FilterCard filter = new FilterPermanentCard("permanent card from your graveyard");
public ObzedatsAid(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{W}{B}");
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}{B}");
// Return target permanent card from your graveyard to the battlefield.
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter));
}
private ObzedatsAid(final ObzedatsAid card) {

View file

@ -7,7 +7,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import java.util.UUID;
@ -16,7 +16,7 @@ import java.util.UUID;
*/
public final class PrideOfThePerfect extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.ELF, "Elves");
private static final FilterPermanent filter = new FilterPermanent(SubType.ELF, "Elves");
public PrideOfThePerfect(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");

View file

@ -2,8 +2,8 @@ package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OneOrMoreCombatDamagePlayerTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.OneOrMoreCombatDamagePlayerTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
@ -11,7 +11,7 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
@ -24,7 +24,7 @@ import java.util.UUID;
*/
public final class RamirezDePietroPillager extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.PIRATE, "Pirates");
private static final FilterPermanent filter = new FilterPermanent(SubType.PIRATE, "Pirates");
public RamirezDePietroPillager(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");

View file

@ -1,34 +1,28 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.common.SacrificeControllerEffect;
import mage.abilities.effects.common.SkipNextPlayerUntapStepEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.FilterPermanent;
import java.util.UUID;
/**
*
* @author LevelX
*/
public final class ShisatoWhisperingHunter extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Snake");
static {
filter.add(SubType.SNAKE.getPredicate());
}
private static final FilterPermanent filter = new FilterPermanent(SubType.SNAKE);
public ShisatoWhisperingHunter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SNAKE);
this.subtype.add(SubType.WARRIOR);
@ -37,9 +31,12 @@ public final class ShisatoWhisperingHunter extends CardImpl {
this.toughness = new MageInt(2);
// At the beginning of your upkeep, sacrifice a Snake.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(filter, 1,"")));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(filter, 1, "")));
// Whenever Shisato, Whispering Hunter deals combat damage to a player, that player skips their next untap step.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new SkipNextPlayerUntapStepEffect("that player"), false, true));
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new SkipNextPlayerUntapStepEffect("that player"), false, true
));
}
private ShisatoWhisperingHunter(final ShisatoWhisperingHunter card) {

View file

@ -1,19 +1,16 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.WatcherScope;
import mage.filter.common.FilterCreatureCard;
import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
@ -24,30 +21,30 @@ import mage.watchers.Watcher;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SiftThroughSands extends CardImpl {
private static final String rule = "<br>If you've cast a spell named Peer Through Depths and a spell named Reach Through Mists this turn, you may search your library for a card named The Unspeakable, put it onto the battlefield, then shuffle";
private static final FilterCreatureCard filter = new FilterCreatureCard("a card named The Unspeakable");
private static final FilterCard filter = new FilterCard("a card named The Unspeakable");
static {
filter.add(new NamePredicate("The Unspeakable"));
}
public SiftThroughSands(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{U}{U}");
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}{U}");
this.subtype.add(SubType.ARCANE);
// Draw two cards, then discard a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2));
Effect effect = new DiscardControllerEffect(1);
effect.setText(", then discard a card");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addEffect(new DrawDiscardControllerEffect(2, 1));
// If you've cast a spell named Peer Through Depths and a spell named Reach Through Mists this turn, you may search your library for a card named The Unspeakable, put it onto the battlefield, then shuffle your library.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), false), new SiftThroughSandsCondition(), rule));
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), false),
new SiftThroughSandsCondition(), "<br>If you've cast a spell named Peer Through Depths " +
"and a spell named Reach Through Mists this turn, you may search your library " +
"for a card named The Unspeakable, put it onto the battlefield, then shuffle"
));
this.getSpellAbility().addWatcher(new SiftThroughSandsWatcher());
}

View file

@ -1,6 +1,5 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
@ -13,17 +12,17 @@ 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.filter.FilterPermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SteamfloggerBoss extends CardImpl {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent(SubType.RIGGER, "Riggers");
private static final FilterPermanent filter
= new FilterPermanent(SubType.RIGGER, "Riggers");
public SteamfloggerBoss(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
@ -34,26 +33,19 @@ public final class SteamfloggerBoss extends CardImpl {
this.toughness = new MageInt(3);
// Other Rigger creatures you control get +1/+0 and have haste.
Ability ability = new SimpleStaticAbility(
new BoostControlledEffect(
1, 0, Duration.WhileOnBattlefield,
filter, true
)
);
Ability ability = new SimpleStaticAbility(new BoostControlledEffect(
1, 0, Duration.WhileOnBattlefield, filter, true
));
ability.addEffect(new GainAbilityControlledEffect(
HasteAbility.getInstance(),
Duration.WhileOnBattlefield,
filter
HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter
).setText("and have haste"));
this.addAbility(ability);
// If a Rigger you control would assemble a Contraption, it assembles two Contraptions instead.
this.addAbility(new SimpleStaticAbility(
new InfoEffect(
"If a Rigger you control would assemble a Contraption, "
this.addAbility(new SimpleStaticAbility(new InfoEffect(
"If a Rigger you control would assemble a Contraption, "
+ "it assembles two Contraptions instead"
)
));
)));
}

View file

@ -1,7 +1,5 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
@ -11,35 +9,34 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class Swarmyard extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Insect, Rat, Spider, or Squirrel");
private static final FilterPermanent filter = new FilterPermanent("Insect, Rat, Spider, or Squirrel");
static {
filter.add(Predicates.or(
SubType.INSECT.getPredicate(),
SubType.RAT.getPredicate(),
SubType.SPIDER.getPredicate(),
SubType.SQUIRREL.getPredicate()
SubType.INSECT.getPredicate(),
SubType.RAT.getPredicate(),
SubType.SPIDER.getPredicate(),
SubType.SQUIRREL.getPredicate()
));
}
public Swarmyard(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},"");
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// {tap}: Add {C}.
this.addAbility(new ColorlessManaAbility());
// {tap}: Regenerate target Insect, Rat, Spider, or Squirrel.
Ability ability = new SimpleActivatedAbility(new RegenerateTargetEffect(), new TapSourceCost());
ability.addTarget(new TargetPermanent(filter));

View file

@ -3,7 +3,6 @@ package mage.cards.t;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.GainLifeControllerTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapTargetCost;
@ -17,12 +16,15 @@ import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
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.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TappedPredicate;
@ -39,8 +41,7 @@ public final class TheArchimandrite extends CardImpl {
CardsInControllerHandCount.ANY, StaticValue.get(-4)
);
private static final FilterPermanent filter = new FilterControlledPermanent();
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent();
private static final FilterControlledPermanent filter3
private static final FilterControlledPermanent filter2
= new FilterControlledPermanent("untapped Advisors, Artificers, and/or Monks you control");
private static final Predicate<MageObject> predicate = Predicates.or(
SubType.ADVISOR.getPredicate(),
@ -51,8 +52,7 @@ public final class TheArchimandrite extends CardImpl {
static {
filter.add(predicate);
filter2.add(predicate);
filter3.add(predicate);
filter3.add(TappedPredicate.UNTAPPED);
filter2.add(TappedPredicate.UNTAPPED);
}
public TheArchimandrite(UUID ownerId, CardSetInfo setInfo) {
@ -65,25 +65,22 @@ public final class TheArchimandrite extends CardImpl {
this.toughness = new MageInt(5);
// At the beginning of your upkeep, you gain X life, where X is the number of cards in your hand minus 4.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new GainLifeEffect(xValue)
.setText("you gain X life, where X is the number of cards in your hand minus 4")
));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(xValue)
.setText("you gain X life, where X is the number of cards in your hand minus 4")));
// Whenever you gain life, each Advisor, Artificer, and Monk you control gains vigilance and gets +X/+0 until end of turn, where X is the amount of life you gained.
Ability ability = new GainLifeControllerTriggeredAbility(new GainAbilityControlledEffect(
VigilanceAbility.getInstance(), Duration.EndOfTurn, filter
).setText("each Advisor, Artificer, and Monk you control gains vigilance"));
ability.addEffect(new BoostControlledEffect(
SavedGainedLifeValue.MANY, StaticValue.get(0), Duration.EndOfTurn,
filter2, false
SavedGainedLifeValue.MANY, StaticValue.get(0), Duration.EndOfTurn, filter, false
).setText("and gets +X/+0 until end of turn, where X is the amount of life you gained"));
this.addAbility(ability);
// Tap three untapped Advisors, Artificers, and/or Monks you control: Draw a card.
this.addAbility(new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1),
new TapTargetCost(new TargetControlledPermanent(3, filter3))
new TapTargetCost(new TargetControlledPermanent(3, filter2))
));
}

View file

@ -1,6 +1,5 @@
package mage.cards.t;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
@ -11,31 +10,29 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.constants.*;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.ReachAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.filter.common.FilterCreaturePermanent;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author Grath
*/
public final class TheOddAcornGang extends CardImpl {
public static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.SQUIRREL, "Squirrels you control");
public static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent(SubType.SQUIRREL, "Squirrel");
static {
filter.add(TargetController.YOU.getControllerPredicate());
}
public static final FilterPermanent filter = new FilterControlledPermanent(SubType.SQUIRREL, "Squirrels you control");
public static final FilterPermanent filter2 = new FilterPermanent(SubType.SQUIRREL);
public TheOddAcornGang(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SQUIRREL);
this.subtype.add(SubType.WARRIOR);
@ -52,20 +49,24 @@ public final class TheOddAcornGang extends CardImpl {
this.addAbility(ReachAbility.getInstance());
// Squirrels you control have "{T}: Target Squirrel gets +2/+2 and gains trample until end of turn. Activate only as a sorcery."
Ability ability = new ActivateAsSorceryActivatedAbility(new BoostTargetEffect(2, 2)
.setText("Target Squirrel gets +2/+2"), new TapSourceCost());
ability.addEffect(
new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)
.setText("and gains trample until end of turn")
Ability ability = new ActivateAsSorceryActivatedAbility(
new BoostTargetEffect(2, 2)
.setText("target Squirrel gets +2/+2"),
new TapSourceCost()
);
ability.addEffect(new GainAbilityTargetEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn
).setText("and gains trample until end of turn"));
ability.addTarget(new TargetPermanent(filter2));
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
ability, Duration.WhileOnBattlefield, filter
)));
// Whenever one or more Squirrels you control deal combat damage to a player, draw a card.
this.addAbility(new OneOrMoreCombatDamagePlayerTriggeredAbility(Zone.BATTLEFIELD,
new DrawCardSourceControllerEffect(1), filter, SetTargetPointer.NONE, false));
this.addAbility(new OneOrMoreCombatDamagePlayerTriggeredAbility(
Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1),
filter, SetTargetPointer.NONE, false
));
}
private TheOddAcornGang(final TheOddAcornGang card) {

View file

@ -11,7 +11,6 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.target.common.TargetCardWithDifferentNameInLibrary;
@ -24,7 +23,7 @@ import java.util.UUID;
public final class Tiamat extends CardImpl {
private static final FilterCard filter
= new FilterCreatureCard("Dragon cards not named Tiamat that each have different names");
= new FilterCard("Dragon cards not named Tiamat that each have different names");
static {
filter.add(SubType.DRAGON.getPredicate());

View file

@ -1,29 +1,29 @@
package mage.cards.v;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldOneOrMoreTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
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.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import java.util.UUID;
/**
*
* @author Grath
*/
public final class ValleyQuestcaller extends CardImpl {
static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other Rabbits, Bats, Birds, and/or Mice");
static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("Rabbits, Bats, Birds, and Mice");
static final FilterPermanent filter = new FilterControlledPermanent("other Rabbits, Bats, Birds, and/or Mice");
static {
filter.add(AnotherPredicate.instance);
@ -33,17 +33,11 @@ public final class ValleyQuestcaller extends CardImpl {
SubType.BIRD.getPredicate(),
SubType.MOUSE.getPredicate()
));
filter2.add(Predicates.or(
SubType.RABBIT.getPredicate(),
SubType.BAT.getPredicate(),
SubType.BIRD.getPredicate(),
SubType.MOUSE.getPredicate()
));
}
public ValleyQuestcaller(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
this.subtype.add(SubType.RABBIT);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(2);
@ -51,15 +45,13 @@ public final class ValleyQuestcaller extends CardImpl {
// Whenever one or more other Rabbits, Bats, Birds, and/or Mice you control enter, scry 1.
this.addAbility(new EntersBattlefieldOneOrMoreTriggeredAbility(
new ScryEffect(1, false),
filter,
TargetController.YOU)
);
new ScryEffect(1, false), filter, TargetController.YOU
));
// Other Rabbits, Bats, Birds, and Mice you control get +1/+1.
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(
1, 1, Duration.WhileOnBattlefield, filter2, true
)));
1, 1, Duration.WhileOnBattlefield, filter, true
).setText("other Rabbits, Bats, Birds, and Mice you control get +1/+1")));
}
private ValleyQuestcaller(final ValleyQuestcaller card) {

View file

@ -2,14 +2,14 @@
package mage.cards.v;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.target.common.TargetAnyTarget;
import java.util.UUID;
@ -19,23 +19,13 @@ import java.util.UUID;
*/
public final class VigilanteJustice extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a Human");
static {
filter.add(SubType.HUMAN.getPredicate());
}
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.HUMAN);
public VigilanteJustice(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}");
// Whenever a Human you control enters, Vigilante Justice deals 1 damage to any target.
Ability ability = new EntersBattlefieldControlledTriggeredAbility(
Zone.BATTLEFIELD,
new DamageTargetEffect(1),
filter,
false
);
Ability ability = new EntersBattlefieldAllTriggeredAbility(new DamageTargetEffect(1), filter);
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}

View file

@ -11,7 +11,6 @@ import mage.constants.SubLayer;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.util.CardUtil;
@ -41,15 +40,15 @@ public class BoostAllEffect extends ContinuousEffectImpl {
this(power, toughness, duration, StaticFilters.FILTER_PERMANENT_ALL_CREATURES, excludeSource);
}
public BoostAllEffect(int power, int toughness, Duration duration, FilterCreaturePermanent filter, boolean excludeSource) {
public BoostAllEffect(int power, int toughness, Duration duration, FilterPermanent filter, boolean excludeSource) {
this(StaticValue.get(power), StaticValue.get(toughness), duration, filter, excludeSource);
}
public BoostAllEffect(DynamicValue power, DynamicValue toughness, Duration duration, FilterCreaturePermanent filter, boolean excludeSource) {
public BoostAllEffect(DynamicValue power, DynamicValue toughness, Duration duration, FilterPermanent filter, boolean excludeSource) {
this(power, toughness, duration, filter, excludeSource, null);
}
public BoostAllEffect(DynamicValue power, DynamicValue toughness, Duration duration, FilterCreaturePermanent filter, boolean excludeSource, String rule) {
public BoostAllEffect(DynamicValue power, DynamicValue toughness, Duration duration, FilterPermanent filter, boolean excludeSource, String rule) {
super(duration, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, CardUtil.getBoostOutcome(power, toughness));
this.power = power;
this.toughness = toughness;