partially refactor TargetCreaturePermanent constructors

This commit is contained in:
theelk801 2025-06-19 16:00:31 -04:00
parent 80500b5b94
commit 3e65021150
99 changed files with 724 additions and 911 deletions

View file

@ -1,11 +1,12 @@
package mage.utils.testers;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.constants.ComparisonType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetPermanentOrPlayer;
/**
@ -79,12 +80,14 @@ abstract class BaseTestableDialog implements TestableDialog {
return new TargetPermanentOrPlayer(min, max).withNotTarget(notTarget);
}
static Target createImpossibleTarget(int min, int max) {
return createImpossibleTarget(min, max, false);
private static final FilterPermanent impossibleFilter = new FilterPermanent();
static {
impossibleFilter.add(new ManaValuePredicate(ComparisonType.OR_LESS, -1));
}
private static Target createImpossibleTarget(int min, int max, boolean notTarget) {
return new TargetCreaturePermanent(min, max, new FilterCreaturePermanent(SubType.TROOPER, "rare type"), notTarget);
static Target createImpossibleTarget(int min, int max) {
return new TargetPermanent(min, max, impossibleFilter);
}
@Override

View file

@ -1,21 +1,21 @@
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.constants.SubType;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class AirCultElemental extends CardImpl {
@ -38,7 +38,7 @@ public final class AirCultElemental extends CardImpl {
// Whirlwind When Air-Cult Elemental enters the battlefield, return up to one other target creature to its owner's hand.
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability.withFlavorWord("Whirlwind"));
}

View file

@ -8,7 +8,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.targetpointer.EachTargetPointer;
import mage.target.targetpointer.SecondTargetPointer;
import mage.target.targetpointer.ThirdTargetPointer;
@ -35,23 +35,17 @@ public final class ArmTheCathars extends CardImpl {
// Until end of turn, target creature gets +3/+3, up to one other target creature gets +2/+2, and up to one other target creature gets +1/+1. Those creatures gain vigilance until end of turn.
this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3)
.setText("until end of turn, target creature gets +3/+3"));
TargetCreaturePermanent target1 = new TargetCreaturePermanent(filter1);
target1.setTargetTag(1);
this.getSpellAbility().addTarget(target1.withChooseHint("+3/+3"));
this.getSpellAbility().addTarget(new TargetPermanent(filter1).setTargetTag(1).withChooseHint("+3/+3"));
this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2)
.setTargetPointer(new SecondTargetPointer())
.setText(", up to one other target creature gets +2/+2"));
TargetCreaturePermanent target2 = new TargetCreaturePermanent(0, 1, filter2, false);
target2.setTargetTag(2);
this.getSpellAbility().addTarget(target2.withChooseHint("+2/+2"));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter2).setTargetTag(2).withChooseHint("+2/+2"));
this.getSpellAbility().addEffect(new BoostTargetEffect(1, 1)
.setTargetPointer(new ThirdTargetPointer())
.setText(", and up to one other target creature gets +1/+1"));
TargetCreaturePermanent target3 = new TargetCreaturePermanent(0, 1, filter3, false);
target3.setTargetTag(3);
this.getSpellAbility().addTarget(target3.withChooseHint("+1/+1"));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter3).setTargetTag(3).withChooseHint("+1/+1"));
this.getSpellAbility().addEffect(
new GainAbilityTargetEffect(VigilanceAbility.getInstance())

View file

@ -13,7 +13,7 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -28,7 +28,6 @@ public final class AtraxiWarden extends CardImpl {
filter.add(TappedPredicate.TAPPED);
}
public AtraxiWarden(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}");
@ -42,7 +41,7 @@ public final class AtraxiWarden extends CardImpl {
// When Atraxi Warden enters the battlefield, exile up to one target tapped creature.
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
// Suspend 5--{1}{W}

View file

@ -10,7 +10,7 @@ import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -18,13 +18,13 @@ import java.util.UUID;
* @author Merlingilb
*/
public class Betray extends CardImpl {
public Betray(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}");
//Target creature an opponent controls deals damage to its controller equal to that creature's power.
this.getSpellAbility().addEffect(new BetrayEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(1, 1,
StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false));
this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE));
}
private Betray(final Betray card) {

View file

@ -11,8 +11,8 @@ import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.List;
import java.util.Objects;
@ -35,7 +35,7 @@ public final class BetrayalAtTheVault extends CardImpl {
// Target creature you control deals damage equal to its power to each of two other target creatures.
this.getSpellAbility().addEffect(new BetrayalAtTheVaultEffect());
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent().setTargetTag(1));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, filter, false).setTargetTag(2));
this.getSpellAbility().addTarget(new TargetPermanent(2, filter).setTargetTag(2));
}
private BetrayalAtTheVault(final BetrayalAtTheVault card) {

View file

@ -2,7 +2,6 @@ package mage.cards.b;
import mage.abilities.Mode;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.GainLifeTargetEffect;
import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.effects.common.UntapTargetEffect;
@ -10,10 +9,7 @@ import mage.abilities.keyword.EscalateAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.TargetController;
import mage.filter.FilterPlayer;
import mage.filter.common.FilterAttackingCreature;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
@ -24,14 +20,6 @@ import java.util.UUID;
*/
public final class BlessedAlliance extends CardImpl {
private static final FilterPlayer filterSacrifice = new FilterPlayer("opponent to sacrifice an attacking creature");
private static final FilterCreaturePermanent filterCreature = new FilterCreaturePermanent("creatures to untap");
private static final FilterPlayer filterGainLife = new FilterPlayer("player to gain life");
static {
filterSacrifice.add(TargetController.OPPONENT.getPlayerPredicate());
}
public BlessedAlliance(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
@ -43,21 +31,17 @@ public final class BlessedAlliance extends CardImpl {
this.getSpellAbility().getModes().setMaxModes(3);
// Target player gains 4 life.
Effect effect = new GainLifeTargetEffect(4);
effect.setText("Target player gains 4 life");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetPlayer(1, 1, false, filterGainLife).withChooseHint("player gains 4 life"));
this.getSpellAbility().addEffect(new GainLifeTargetEffect(4));
this.getSpellAbility().addTarget(new TargetPlayer().withChooseHint("player gains 4 life"));
// Untap up to two target creatures.
effect = new UntapTargetEffect();
effect.setText("Untap up to two target creatures");
Mode mode = new Mode(effect);
mode.addTarget(new TargetCreaturePermanent(0, 2, filterCreature, false).withChooseHint("untap"));
Mode mode = new Mode(new UntapTargetEffect());
mode.addTarget(new TargetCreaturePermanent(0, 2).withChooseHint("untap"));
this.getSpellAbility().addMode(mode);
// Target opponent sacrifices an attacking creature.
mode = new Mode(new SacrificeEffect(new FilterAttackingCreature(), 1, "Target opponent"));
mode.addTarget(new TargetPlayer(1, 1, false, filterSacrifice).withChooseHint("sacrifices an attacking creature"));
mode.addTarget(new TargetPlayer().withChooseHint("sacrifices an attacking creature"));
this.getSpellAbility().addMode(mode);
}

View file

@ -1,24 +1,24 @@
package mage.cards.b;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.constants.*;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class BlueDragon extends CardImpl {
@ -43,19 +43,9 @@ public final class BlueDragon extends CardImpl {
// Lightning Breath When Blue Dragon enters the battlefield, until your next turn, target creature an opponent controls gets -3/-0, up to one other target creature gets -2/-0, and up to one other target creature gets -1/-0.
Ability ability = new EntersBattlefieldTriggeredAbility(new BlueDragonEffect());
Target target = new TargetOpponentsCreaturePermanent();
target.setTargetTag(1);
ability.addTarget(target.withChooseHint("-3/-0"));
target = new TargetCreaturePermanent(0, 1, filter2, false);
target.setTargetTag(2);
ability.addTarget(target.withChooseHint("-2/-0"));
target = new TargetCreaturePermanent(0, 1, filter3, false);
target.setTargetTag(3);
ability.addTarget(target.withChooseHint("-1/-0"));
ability.addTarget(new TargetOpponentsCreaturePermanent().setTargetTag(1).withChooseHint("-3/-0"));
ability.addTarget(new TargetPermanent(0, 1, filter2).setTargetTag(2).withChooseHint("-2/-0"));
ability.addTarget(new TargetPermanent(0, 1, filter3).setTargetTag(3).withChooseHint("-1/-0"));
this.addAbility(ability.withFlavorWord("Lightning Breath"));
}

View file

@ -16,6 +16,7 @@ import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -30,8 +31,8 @@ public final class BreakingOfTheFellowship extends CardImpl {
// Target creature an opponent controls deals damage equal to its power to another target creature that player controls.
this.getSpellAbility().addEffect(new BreakingOfTheFellowshipEffect());
this.getSpellAbility().addTarget(new BreakingOfTheFellowshipFirstTarget(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("another target creature that player controls")));
this.getSpellAbility().addTarget(new BreakingOfTheFellowshipFirstTarget());
this.getSpellAbility().addTarget(new TargetPermanent(new FilterCreaturePermanent("another target creature that player controls")));
// The Ring tempts you.
this.getSpellAbility().addEffect(new TheRingTemptsYouEffect());
@ -78,10 +79,10 @@ class BreakingOfTheFellowshipEffect extends OneShotEffect {
}
class BreakingOfTheFellowshipFirstTarget extends TargetCreaturePermanent {
class BreakingOfTheFellowshipFirstTarget extends TargetPermanent {
public BreakingOfTheFellowshipFirstTarget(FilterCreaturePermanent filter) {
super(1, 1, filter, false);
public BreakingOfTheFellowshipFirstTarget() {
super(1, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false);
}
private BreakingOfTheFellowshipFirstTarget(final BreakingOfTheFellowshipFirstTarget target) {

View file

@ -1,7 +1,5 @@
package mage.cards.b;
import java.util.UUID;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.keyword.HorsemanshipAbility;
import mage.cards.CardImpl;
@ -10,15 +8,16 @@ import mage.constants.CardType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AbilityPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author LoneFox
*/
public final class BrokenDam extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures without horsemanship");
static {
filter.add(Predicates.not(new AbilityPredicate(HorsemanshipAbility.class)));
@ -29,7 +28,7 @@ public final class BrokenDam extends CardImpl {
// Tap one or two target creatures without horsemanship.
this.getSpellAbility().addEffect(new TapTargetEffect("tap one or two target creatures without horsemanship"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(1, 2, filter, false));
this.getSpellAbility().addTarget(new TargetPermanent(1, 2, filter));
}
private BrokenDam(final BrokenDam card) {

View file

@ -1,23 +1,19 @@
package mage.cards.c;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.PersistAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class CauldronOfSouls extends CardImpl {
@ -26,12 +22,13 @@ public final class CauldronOfSouls extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}");
// {tap}: Choose any number of target creatures. Each of those creatures gains persist until end of turn.
Effect effect = new GainAbilityTargetEffect(new PersistAbility(), Duration.EndOfTurn);
effect.setText("choose any number of target creatures. Each of those creatures gains persist until end of turn");
Ability ability = new SimpleActivatedAbility(effect, new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_PERMANENT_CREATURE, false));
Ability ability = new SimpleActivatedAbility(
new GainAbilityTargetEffect(new PersistAbility(), Duration.EndOfTurn)
.setText("choose any number of target creatures. Each of those creatures gains persist until end of turn"),
new TapSourceCost()
);
ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE));
this.addAbility(ability);
}
private CauldronOfSouls(final CauldronOfSouls card) {

View file

@ -16,7 +16,6 @@ import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.Objects;
import java.util.UUID;
@ -67,9 +66,9 @@ public final class CloudsLimitBreak extends CardImpl {
}
}
class CloudsLimitBreakTarget extends TargetCreaturePermanent {
class CloudsLimitBreakTarget extends TargetPermanent {
private static final FilterCreaturePermanent filter
private static final FilterPermanent filter
= new FilterCreaturePermanent("tapped creatures with different controllers");
CloudsLimitBreakTarget() {

View file

@ -1,30 +1,34 @@
package mage.cards.c;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterTeamCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class ComboAttack extends CardImpl {
private static final FilterPermanent filter = new FilterTeamCreaturePermanent("creatures your team controls");
public ComboAttack(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}");
// Two target creatures your team controls each deal damage equal to their power to target creature.
this.getSpellAbility().addEffect(new ComboAttackEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, new FilterTeamCreaturePermanent(), false));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(1));
this.getSpellAbility().addTarget(new TargetPermanent(2, filter));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
private ComboAttack(final ComboAttack card) {

View file

@ -14,8 +14,8 @@ import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
@ -79,10 +79,10 @@ class CulturalExchangeEffect extends OneShotEffect {
if (creaturesToSwitch == 0) {
return true;
}
TargetCreaturePermanent target1 = new TargetCreaturePermanent(0, creaturesToSwitch, filter1, true);
TargetPermanent target1 = new TargetPermanent(0, creaturesToSwitch, filter1, true);
if (target1.choose(Outcome.Benefit, controller.getId(), source.getSourceId(), source, game)) {
int otherToSwitch = target1.getTargets().size();
TargetCreaturePermanent target2 = new TargetCreaturePermanent(otherToSwitch, otherToSwitch, filter2, true);
TargetPermanent target2 = new TargetPermanent(otherToSwitch, otherToSwitch, filter2, true);
if (target2.choose(Outcome.Benefit, controller.getId(), source.getSourceId(), source, game)) {
for (UUID creatureId : target1.getTargets()) {
Permanent creature = game.getPermanent(creatureId);

View file

@ -3,8 +3,6 @@ package mage.cards.c;
import mage.abilities.Ability;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateRoleAttachedTargetEffect;
import mage.abilities.effects.common.FightTargetsEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -13,11 +11,9 @@ import mage.constants.RoleType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
import mage.util.GameLog;
import java.util.UUID;
@ -64,24 +60,15 @@ class CurseOfTheWerefoxEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent target = game.getPermanent(source.getFirstTarget());
if (target == null) {
return false;
}
boolean didCreate =
new CreateRoleAttachedTargetEffect(RoleType.MONSTER)
.setTargetPointer(new FixedTarget(target, game))
.apply(game, source);
if (!didCreate) {
if (target == null || !RoleType.MONSTER.createToken(target, game, source).getLastAddedTokenIds().isEmpty()) {
return false;
}
ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(
new CurseOfTheWerefoxFightEffect(), false,
"that creature fights up to one target creature you don't control"
new CurseOfTheWerefoxFightEffect().setTargetPointer(new FixedTarget(target.getId(), game)),
false, "that creature fights up to one target creature you don't control"
);
ability.getEffects().setTargetPointer(new FixedTarget(target.getId(), game));
ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false));
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
game.fireReflexiveTriggeredAbility(ability, source);
return true;
}

View file

@ -1,4 +1,3 @@
package mage.cards.c;
import mage.abilities.Ability;
@ -14,26 +13,22 @@ import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.util.functions.EmptyCopyApplier;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class Cytoshape extends CardImpl {
public Cytoshape(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}{U}");
// Choose a nonlegendary creature on the battlefield. Target creature becomes a copy of that creature until end of turn.
this.getSpellAbility().addEffect(new CytoshapeEffect());
FilterCreaturePermanent filter = new FilterCreaturePermanent("target creature that will become a copy");
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
this.getSpellAbility().addTarget(new TargetPermanent().withChooseHint("to become a copy"));
}
private Cytoshape(final Cytoshape card) {
@ -53,9 +48,11 @@ class CytoshapeEffect extends OneShotEffect {
static {
filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate()));
}
CytoshapeEffect() {
super(Outcome.Copy);
this.staticText = "Choose a nonlegendary creature on the battlefield. Target creature becomes a copy of that creature until end of turn.";
this.staticText = "Choose a nonlegendary creature on the battlefield. " +
"Target creature becomes a copy of that creature until end of turn.";
}
private CytoshapeEffect(final CytoshapeEffect effect) {
@ -69,7 +66,7 @@ class CytoshapeEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability ability) {
Target target = new TargetCreaturePermanent(1, 1, filter, true);
Target target = new TargetPermanent(1, 1, filter, true);
target.choose(Outcome.Copy, ability.getControllerId(), ability, game);
Permanent copyFrom = game.getPermanent(target.getFirstTarget());
if (copyFrom != null) {

View file

@ -1,19 +1,22 @@
package mage.cards.d;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
/**
*
* @author LoneFox
*/
public final class DeadRingers extends CardImpl {
@ -23,7 +26,7 @@ public final class DeadRingers extends CardImpl {
// Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated.
this.getSpellAbility().addEffect(new DeadRingersEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK, false));
this.getSpellAbility().addTarget(new TargetPermanent(2, StaticFilters.FILTER_PERMANENT_CREATURE_NON_BLACK));
}
private DeadRingers(final DeadRingers card) {
@ -36,11 +39,11 @@ public final class DeadRingers extends CardImpl {
}
}
class DeadRingersEffect extends DestroyTargetEffect {
class DeadRingersEffect extends OneShotEffect {
DeadRingersEffect() {
super(true);
staticText = "Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated.";
super(Outcome.DestroyPermanent);
staticText = "destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated.";
}
private DeadRingersEffect(final DeadRingersEffect effect) {
@ -54,17 +57,23 @@ class DeadRingersEffect extends DestroyTargetEffect {
@Override
public boolean apply(Game game, Ability source) {
Target target = source.getTargets().get(0);
if (target != null
&& target.getTargets().size() > 1) {
Permanent first = game.getPermanentOrLKIBattlefield(target.getTargets().get(0));
Permanent second = game.getPermanentOrLKIBattlefield(target.getTargets().get(1));
if (first != null
&& second != null
&& first.getColor(game).equals(second.getColor(game))) {
return super.apply(game, source);
}
}
List<Permanent> permanents = this
.getTargetPointer()
.getTargets(game, source)
.stream()
.map(game::getPermanent)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (permanents.size() < 2) {
return false;
}
Permanent first = permanents.get(0);
Permanent second = permanents.get(1);
if (!first.getColor(game).equals(second.getColor(game))) {
return false;
}
first.destroy(source, game, true);
second.destroy(source, game, true);
return true;
}
}

View file

@ -18,8 +18,8 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
@ -51,7 +51,7 @@ public final class DecimatorBeetle extends CardImpl {
// Whenever Decimator Beetle attacks, remove a -1/-1 counter from target creature you control and put a -1/-1 counter on up to one target creature defending player controls.
ability = new AttacksTriggeredAbility(new DecimatorBeetleEffect(), false);
ability.addTarget(new TargetControlledCreaturePermanent());
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}

View file

@ -19,7 +19,7 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -51,7 +51,7 @@ public final class DihadaBinderOfWills extends CardImpl {
ability.addEffect(new GainAbilityTargetEffect(
IndestructibleAbility.getInstance(), Duration.UntilYourNextTurn
).setText(", and indestructible until your next turn."));
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
// -3: Reveal the top four cards of your library.

View file

@ -1,7 +1,5 @@
package mage.cards.d;
import java.util.UUID;
import mage.abilities.effects.common.FightTargetsEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -9,18 +7,22 @@ import mage.constants.CardType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.filter.predicate.permanent.BlockingPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class DissensionInTheRanks extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blocking creature");
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("another target blocking creature");
static {
filter.add(BlockingPredicate.instance);
filter2.add(new AnotherTargetPredicate(2));
filter2.add(BlockingPredicate.instance);
}
public DissensionInTheRanks(UUID ownerId, CardSetInfo setInfo) {
@ -28,16 +30,8 @@ public final class DissensionInTheRanks extends CardImpl {
// Target blocking creature fights another target blocking creature.
this.getSpellAbility().addEffect(new FightTargetsEffect(false));
TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, false);
target.setTargetTag(1);
this.getSpellAbility().addTarget(target);
FilterCreaturePermanent filter2 = new FilterCreaturePermanent("another target blocking creature");
filter2.add(new AnotherTargetPredicate(2));
filter2.add(BlockingPredicate.instance);
TargetCreaturePermanent target2 = new TargetCreaturePermanent(filter2);
target2.setTargetTag(2);
this.getSpellAbility().addTarget(target2);
this.getSpellAbility().addTarget(new TargetPermanent(filter).setTargetTag(1));
this.getSpellAbility().addTarget(new TargetPermanent(filter2).setTargetTag(2));
}
private DissensionInTheRanks(final DissensionInTheRanks card) {

View file

@ -12,15 +12,14 @@ import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class DoOrDie extends CardImpl {
@ -68,7 +67,7 @@ class DoOrDieEffect extends OneShotEffect {
}
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures to put in the first pile");
filter.add(new ControllerIdPredicate(targetPlayer.getId()));
TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true);
TargetPermanent creatures = new TargetPermanent(0, Integer.MAX_VALUE, filter, true);
List<Permanent> pile1 = new ArrayList<>();
if (player.choose(Outcome.Neutral, creatures, source, game)) {
List<UUID> targets = creatures.getTargets();

View file

@ -1,7 +1,5 @@
package mage.cards.d;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
@ -20,12 +18,13 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.AttackingPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class DomineeringWill extends CardImpl {
@ -42,8 +41,7 @@ public final class DomineeringWill extends CardImpl {
// Target player gains control of up to three target nonattacking creatures until end of turn. Untap those creatures. They block this turn if able.
this.getSpellAbility().addEffect(new DomineeringWillEffect());
this.getSpellAbility().addTarget(new TargetPlayer());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 3, filter, false));
this.getSpellAbility().addTarget(new TargetPermanent(0, 3, filter));
}
private DomineeringWill(final DomineeringWill card) {

View file

@ -1,8 +1,5 @@
package mage.cards.d;
import java.util.Objects;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
@ -10,15 +7,15 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class Duneblast extends CardImpl {
@ -26,10 +23,8 @@ public final class Duneblast extends CardImpl {
public Duneblast(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}{B}{G}");
// Choose up to one creature. Destroy the rest.
this.getSpellAbility().addEffect(new DuneblastEffect());
}
private Duneblast(final Duneblast card) {
@ -61,20 +56,22 @@ class DuneblastEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Target target = new TargetCreaturePermanent(0,1,new FilterCreaturePermanent("creature to keep"), true);
target.setRequired(true);
Permanent creatureToKeep = null;
if (controller.choose(outcome, target, source, game)) {
creatureToKeep = game.getPermanent(target.getFirstTarget());
if (controller == null) {
return false;
}
for(Permanent creature: game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source, game)) {
if (!Objects.equals(creature, creatureToKeep)) {
Target target = new TargetCreaturePermanent(0, 1);
target.withNotTarget(true);
target.withChooseHint("to keep");
target.setRequired(true);
controller.choose(outcome, target, source, game);
Permanent creatureToKeep = game.getPermanent(target.getFirstTarget());
for (Permanent creature : game.getBattlefield().getActivePermanents(
StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source, game
)) {
if (!creature.equals(creatureToKeep)) {
creature.destroy(source, game, false);
}
}
return true;
}
return false;
}
}

View file

@ -1,16 +1,16 @@
package mage.cards.f;
import java.util.List;
import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
@ -18,11 +18,14 @@ import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponent;
import java.util.List;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class FallOfTheImpostor extends CardImpl {
@ -77,33 +80,35 @@ class FallOfTheImpostorEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player opponent = game.getPlayer(source.getFirstTarget());
if (controller != null && opponent != null) {
List<Permanent> permanents = game.getBattlefield().getAllActivePermanents(
StaticFilters.FILTER_PERMANENT_CREATURE, opponent.getId(), game
);
Integer maxPower = null;
for (Permanent permanent : permanents) {
if (permanent != null) {
int power = permanent.getPower().getValue();
if (maxPower == null || power > maxPower) {
maxPower = power;
}
}
}
if (maxPower != null) {
FilterCreaturePermanent filter = new FilterCreaturePermanent();
filter.add(new ControllerIdPredicate(opponent.getId()));
filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, maxPower));
TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true);
controller.chooseTarget(outcome, target, source, game);
Permanent permanent = game.getPermanent(target.getFirstTarget());
if (permanent != null) {
controller.moveCardsToExile(permanent, source, game, true, null, null);
return true;
}
}
}
Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source));
if (controller == null || opponent == null) {
return false;
}
List<Permanent> permanents = game.getBattlefield().getActivePermanents(
StaticFilters.FILTER_CONTROLLED_CREATURE, opponent.getId(), game
);
Permanent permanent;
switch (permanents.size()) {
case 0:
return false;
case 1:
permanent = permanents.get(0);
break;
default:
int power = permanents
.stream()
.map(MageObject::getPower)
.mapToInt(MageInt::getValue)
.max()
.orElse(Integer.MIN_VALUE);
FilterPermanent filter = new FilterCreaturePermanent();
filter.add(new ControllerIdPredicate(opponent.getId()));
filter.add(new PowerPredicate(ComparisonType.OR_GREATER, power));
TargetPermanent target = new TargetPermanent(filter);
target.withNotTarget(true);
controller.chooseTarget(outcome, target, source, game);
permanent = game.getPermanent(target.getFirstTarget());
}
return permanent != null && controller.moveCards(permanent, Zone.EXILED, source, game);
}
}

View file

@ -17,8 +17,8 @@ import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.util.CardUtil;
import java.util.UUID;
@ -36,7 +36,7 @@ public final class FeralEncounter extends CardImpl {
DelayedTriggeredAbility delayed = new FeralEncounterDelayedTriggeredAbility();
delayed.addTarget(new TargetControlledCreaturePermanent());
delayed.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false));
delayed.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(delayed));
}

View file

@ -1,9 +1,9 @@
package mage.cards.f;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.combat.CantAttackAllEffect;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -18,7 +18,7 @@ import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.ArrayList;
import java.util.List;
@ -26,7 +26,6 @@ import java.util.UUID;
import java.util.stream.Collectors;
/**
*
* @author LevelX2 & L_J
*/
public final class FightOrFlight extends CardImpl {
@ -73,7 +72,7 @@ class FightOrFlightEffect extends OneShotEffect {
}
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures to put in the first pile");
filter.add(new ControllerIdPredicate(targetPlayer.getId()));
TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true);
TargetPermanent creatures = new TargetPermanent(0, Integer.MAX_VALUE, filter, true);
List<Permanent> pile1 = new ArrayList<>();
if (player.choose(Outcome.Neutral, creatures, source, game)) {
List<UUID> targets = creatures.getTargets();

View file

@ -10,12 +10,11 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.util.functions.EmptyCopyApplier;
import java.util.UUID;
@ -25,18 +24,14 @@ import java.util.UUID;
*/
public final class FleetingReflection extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other target creature");
static {
filter.add(new AnotherTargetPredicate(2));
}
public FleetingReflection(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
// Target creature you control gains hexproof until end of turn. Untap that creature. Until end of turn, it becomes a copy of up to one other target creature.
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent().setTargetTag(1));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, filter, false).setTargetTag(2));
this.getSpellAbility().addTarget(new TargetPermanent(
0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2
).setTargetTag(2));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HexproofAbility.getInstance(), Duration.EndOfTurn));
this.getSpellAbility().addEffect(new UntapTargetEffect().setText("Untap that creature"));
this.getSpellAbility().addEffect(new FleetingReflectionEffect());

View file

@ -1,6 +1,5 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@ -13,7 +12,6 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.UnblockedPredicate;
import mage.game.Game;
@ -21,11 +19,12 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
*
* @author emerald000
*/
public final class Forcefield extends CardImpl {
@ -74,7 +73,7 @@ class ForcefieldEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = source.getSourceObject(game);
if (controller != null && sourceObject != null) {
Target target = new TargetCreaturePermanent(1, 1, filter, true);
Target target = new TargetPermanent(1, 1, filter, true);
if (controller.choose(Outcome.PreventDamage, target, source, game)) {
Permanent creature = game.getPermanent(target.getFirstTarget());
if (creature != null) {

View file

@ -2,22 +2,24 @@ package mage.cards.f;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SpellCastAllTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.ArrayList;
import java.util.List;
@ -35,9 +37,9 @@ public final class ForgottenAncient extends CardImpl {
this.toughness = new MageInt(3);
// Whenever a player casts a spell, you may put a +1/+1 counter on Forgotten Ancient.
Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance());
Ability ability = new SpellCastAllTriggeredAbility(effect, true);
this.addAbility(ability);
this.addAbility(new SpellCastAllTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), true
));
// At the beginning of your upkeep, you may move any number of +1/+1 counters from Forgotten Ancient onto other creatures.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new ForgottenAncientEffect(), true));
@ -56,7 +58,7 @@ public final class ForgottenAncient extends CardImpl {
class ForgottenAncientEffect extends OneShotEffect {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
private static final FilterPermanent filter = new FilterCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
@ -98,7 +100,7 @@ class ForgottenAncientEffect extends OneShotEffect {
List<CounterMovement> counterMovements = new ArrayList<>();
do {
Target target = new TargetCreaturePermanent(1, 1, filter, true);
Target target = new TargetPermanent(1, 1, filter, true);
if (!target.canChoose(controller.getId(), source, game)) {
break;
}

View file

@ -1,8 +1,5 @@
package mage.cards.f;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
@ -14,7 +11,6 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@ -22,8 +18,11 @@ import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class Fumble extends CardImpl {
@ -84,7 +83,8 @@ class FumbleEffect extends OneShotEffect {
new ReturnToHandTargetEffect().apply(game, source);
if (!attachments.isEmpty()) {
Target target = new TargetCreaturePermanent(1, 1, StaticFilters.FILTER_PERMANENT_CREATURE, true);
Target target = new TargetCreaturePermanent();
target.withNotTarget(true);
Permanent newCreature = null;
if (player.choose(Outcome.BoostCreature, target, source, game)) {
newCreature = game.getPermanent(target.getFirstTarget());

View file

@ -15,7 +15,7 @@ import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -45,10 +45,11 @@ public final class GargosViciousWatcher extends CardImpl {
this.addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 4)));
// Whenever a creature you control becomes the target of a spell, Gargos, Vicious Watcher fights up to one target creature you don't control.
TriggeredAbility ability = new BecomesTargetAnyTriggeredAbility(new FightTargetSourceEffect(),
StaticFilters.FILTER_CONTROLLED_A_CREATURE, StaticFilters.FILTER_SPELL_A,
SetTargetPointer.NONE, false);
ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false));
TriggeredAbility ability = new BecomesTargetAnyTriggeredAbility(
new FightTargetSourceEffect(), StaticFilters.FILTER_CONTROLLED_A_CREATURE,
StaticFilters.FILTER_SPELL_A, SetTargetPointer.NONE, false
);
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
this.addAbility(ability);
}

View file

@ -18,6 +18,7 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.TokenImpl;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -46,7 +47,7 @@ public final class GideonBattleForged extends CardImpl {
// +2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controller's next turn if able.
LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new GideonBattleForgedAttacksIfAbleTargetEffect(Duration.Custom), 2);
loyaltyAbility.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
loyaltyAbility.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(loyaltyAbility);
// +1: Until your next turn, target creature gains indestructible. Untap that creature.

View file

@ -1,7 +1,5 @@
package mage.cards.g;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -12,17 +10,17 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.constants.SubType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class GildedDrake extends CardImpl {
@ -36,11 +34,12 @@ public final class GildedDrake extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// When Gilded Drake enters the battlefield, exchange control of Gilded Drake and up to one target creature an opponent controls. If you don't make an exchange, sacrifice Gilded Drake.
// This ability can't be countered except by spells and abilities.
Ability ability = new EntersBattlefieldTriggeredAbility(new GildedDrakeEffect());
ability.setCanFizzle(false);
ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false));
ability.addTarget(new TargetOpponentsCreaturePermanent(0, 1));
this.addAbility(ability);
}

View file

@ -1,8 +1,5 @@
package mage.cards.g;
import java.util.UUID;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.AftermathAbility;
@ -11,34 +8,40 @@ import mage.cards.SplitCard;
import mage.constants.CardType;
import mage.constants.SpellAbilityType;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class GrindDust extends SplitCard {
private static final FilterPermanent filter = new FilterCreaturePermanent("creatures that have -1/-1 counters on them");
static {
filter.add(CounterType.M1M1.getPredicate());
}
public GrindDust(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{1}{B}", "{3}{W}", SpellAbilityType.SPLIT_AFTERMATH);
// Grind
// Put a -1/-1 counter on each of up to two target creatures.
Effect effect = new AddCountersTargetEffect(CounterType.M1M1.createInstance());
effect.setText("Put a -1/-1 counter on each of up to two target creatures");
getLeftHalfCard().getSpellAbility().addEffect(effect);
getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
this.getLeftHalfCard().getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance())
.setText("Put a -1/-1 counter on each of up to two target creatures"));
this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
// Dust
// Aftermath
getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Exile any number of target creatures that have -1/-1 counters on them.
getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect());
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures that have -1/-1 counters on them");
filter.add(CounterType.M1M1.getPredicate());
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, false));
this.getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Exile any number of target creatures that have -1/-1 counters on them.
this.getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect());
this.getRightHalfCard().getSpellAbility().addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter));
}
private GrindDust(final GrindDust card) {

View file

@ -1,7 +1,5 @@
package mage.cards.h;
import java.util.UUID;
import mage.abilities.effects.common.DamageAllEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect;
import mage.cards.CardImpl;
@ -9,41 +7,33 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class HostileTakeover extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other target creature");
static {
filter.add(new AnotherTargetPredicate(2));
}
public HostileTakeover(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{B}{R}");
// Up to one target creature has base power and toughness 1/1 until end of turn. Up to one other target creature has base power and toughness 4/4 until end of turn. Then Hostile Takeover deals 3 damage to each creature.
this.getSpellAbility().addEffect(new SetBasePowerToughnessTargetEffect(1, 1, Duration.EndOfTurn));
TargetCreaturePermanent target1 = new TargetCreaturePermanent(0, 1);
target1.setTargetTag(1);
this.getSpellAbility().addTarget(target1.withChooseHint("1/1"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1).setTargetTag(1).withChooseHint("1/1"));
this.getSpellAbility().addEffect(new SetBasePowerToughnessTargetEffect(4, 4, Duration.EndOfTurn)
.setTargetPointer(new SecondTargetPointer())
.setText("up to one other target creature has base power and toughness 4/4 until end of turn"));
TargetCreaturePermanent target2 = new TargetCreaturePermanent(0, 1, filter, false);
target2.setTargetTag(2);
this.getSpellAbility().addTarget(target2.withChooseHint("4/4"));
this.getSpellAbility().addEffect(new DamageAllEffect(3, StaticFilters.FILTER_PERMANENT_CREATURE)
.concatBy("Then"));
this.getSpellAbility().addTarget(new TargetPermanent(
0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2
).setTargetTag(2).withChooseHint("4/4"));
this.getSpellAbility().addEffect(new DamageAllEffect(
3, StaticFilters.FILTER_PERMANENT_CREATURE
).concatBy("Then"));
}
private HostileTakeover(final HostileTakeover card) {

View file

@ -7,10 +7,16 @@ import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
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.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -20,14 +26,8 @@ import java.util.UUID;
*/
public final class HuatliDinosaurKnight extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Dinosaur you control");
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("Dinosaurs");
static {
filter.add(SubType.DINOSAUR.getPredicate());
filter.add(TargetController.YOU.getControllerPredicate());
filter2.add(SubType.DINOSAUR.getPredicate());
}
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DINOSAUR);
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent(SubType.DINOSAUR, "Dinosaurs");
public HuatliDinosaurKnight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{R}{W}");
@ -41,12 +41,12 @@ public final class HuatliDinosaurKnight extends CardImpl {
Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2))
.setText("Put two +1/+1 counters on up to one target Dinosaur you control."), 2
);
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
// -3: Target Dinosaur you control deals damage equal to its power to target creature you don't control.
ability = new LoyaltyAbility(new DamageWithPowerFromOneToAnotherTargetEffect(), -3);
ability.addTarget(new TargetCreaturePermanent(filter));
ability.addTarget(new TargetPermanent(filter));
ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
this.addAbility(ability);

View file

@ -3,26 +3,26 @@ package mage.cards.i;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CopyEffect;
import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import java.util.UUID;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.CopyEffect;
import mage.util.CardUtil;
/**
* @author spjspj
@ -32,6 +32,7 @@ public final class IdentityThief extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("target nontoken creature");
static {
filter.add(AnotherPredicate.instance);
filter.add(TokenPredicate.FALSE);
}
@ -44,8 +45,8 @@ public final class IdentityThief extends CardImpl {
// Whenever Identity Thief attacks, you may exile another target nontoken creature.
// If you do, Identity Thief becomes a copy of that creature until end of turn.
// Return the exiled card to the battlefield under its owner's control at the beginning of the next end step.
Ability ability = new IdentityThiefAbility();
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
Ability ability = new AttacksTriggeredAbility(new IdentityThiefEffect(), true);
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}
@ -101,27 +102,29 @@ class IdentityThiefEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent targetPermanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
Player controller = game.getPlayer(source.getControllerId());
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (controller != null
&& targetPermanent != null
&& sourcePermanent != null) {
ContinuousEffect copyEffect = new CopyEffect(Duration.EndOfTurn, targetPermanent, source.getSourceId());
copyEffect.setTargetPointer(new FixedTarget(sourcePermanent.getId(), game));
game.addEffect(copyEffect, source);
UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter());
if (controller.moveCardsToExile(targetPermanent, source, game, true, exileZoneId, sourcePermanent.getName())) {
Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect(false, true);
effect.setText("Return the exiled card to the battlefield under its owner's control at the beginning of the next end step");
effect.setTargetPointer(new FixedTarget(source.getFirstTarget(), game));
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source);
Permanent targetPermanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (controller == null || targetPermanent == null) {
return false;
}
controller.moveCardsToExile(
targetPermanent, source, game, true,
CardUtil.getExileZoneId(game, source),
CardUtil.getSourceName(game, source)
);
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(
new ReturnToBattlefieldUnderOwnerControlTargetEffect(false, true)
.setText("Return the exiled card to the battlefield under its owner's control at the beginning of the next end step")
.setTargetPointer(new FixedTarget(source.getFirstTarget(), game))
), source);
Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game);
if (sourcePermanent != null) {
game.addEffect(new CopyEffect(
Duration.EndOfTurn, targetPermanent, source.getSourceId()
).setTargetPointer(new FixedTarget(sourcePermanent.getId(), game)), source);
}
return true;
}
return false;
}
@Override
public IdentityThiefEffect copy() {

View file

@ -14,6 +14,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
@ -23,6 +24,7 @@ import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.XTargetsCountAdjuster;
@ -34,7 +36,7 @@ import java.util.UUID;
*/
public final class IllithidHarvester extends AdventureCard {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped nontoken creatures");
private static final FilterPermanent filter = new FilterCreaturePermanent("tapped nontoken creatures");
static {
filter.add(TappedPredicate.TAPPED);
@ -50,7 +52,7 @@ public final class IllithidHarvester extends AdventureCard {
// Ceremorphosis When Illithid Harvester enters the battlefield, turn any number
// of target tapped nontoken creatures face down. They're 2/2 Horror creatures.
Ability ability = new EntersBattlefieldTriggeredAbility(new IllithidHarvesterEffect());
ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, false));
ability.addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter));
this.addAbility(ability.withFlavorWord("Ceremorphosis"));
// Plant Tadpoles

View file

@ -1,40 +1,36 @@
package mage.cards.i;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.common.SourceOnBattlefieldCondition;
import mage.abilities.condition.common.SourceRemainsInZoneCondition;
import mage.abilities.costs.Cost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.SacrificeControllerEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class InfernalDenizen extends CardImpl {
@ -50,11 +46,11 @@ public final class InfernalDenizen extends CardImpl {
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new InfernalDenizenEffect()));
// {tap}: Gain control of target creature for as long as Infernal Denizen remains on the battlefield.
ConditionalContinuousEffect effect = new ConditionalContinuousEffect(
new GainControlTargetEffect(Duration.Custom, true),
new SourceRemainsInZoneCondition(Zone.BATTLEFIELD),
"gain control of target creature for as long as {this} remains on the battlefield");
Ability ability = new SimpleActivatedAbility(effect, new TapSourceCost());
Ability ability = new SimpleActivatedAbility(
new GainControlTargetEffect(Duration.UntilSourceLeavesBattlefield, true)
.setText("gain control of target creature for as long as {this} remains on the battlefield"),
new TapSourceCost()
);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
@ -71,12 +67,7 @@ public final class InfernalDenizen extends CardImpl {
class InfernalDenizenEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterPermanent();
static {
filter.add(SubType.SWAMP.getPredicate());
filter.add(TargetController.YOU.getControllerPredicate());
}
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SWAMP);
InfernalDenizenEffect() {
super(Outcome.Benefit);
@ -96,41 +87,36 @@ class InfernalDenizenEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent creature = game.getPermanent(source.getSourceId());
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
DynamicValue swamps = new PermanentsOnBattlefieldCount(filter);
boolean canSac = swamps.calculate(game, source, this) > 1;
Effect effect = new SacrificeControllerEffect(filter, 2, "Sacrifice two Swamps");
effect.apply(game, source);
if (!canSac) {
if (creature != null) {
creature.tap(source, game);
Cost cost = new SacrificeTargetCost(filter);
if (cost.canPay(source, source, source.getControllerId(), game)
&& cost.pay(source, game, source, source.getControllerId(), true)) {
return true;
}
Permanent creature = source.getSourcePermanentIfItStillExists(game);
if (creature == null) {
return false;
}
creature.tap(source, game);
TargetPlayer targetPlayer = new TargetOpponent(true);
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return true;
}
player.choose(outcome, targetPlayer, source, game);
Player opponent = game.getPlayer(targetPlayer.getFirstTarget());
if (opponent == null) {
return true;
}
FilterPermanent filterPermanent = new FilterCreaturePermanent("creature controlled by " + player.getName());
filterPermanent.add(new ControllerIdPredicate(player.getId()));
TargetPermanent target = new TargetPermanent(0, 1, filterPermanent, true);
opponent.choose(outcome, target, source, game);
Permanent permanent = game.getPermanent(target.getFirstTarget());
if (permanent != null) {
game.addEffect(new GainControlTargetEffect(
Duration.UntilSourceLeavesBattlefield, true, opponent.getId()
).setTargetPointer(new FixedTarget(permanent, game)), source);
}
TargetOpponent targetOpp = new TargetOpponent(true);
if (targetOpp.canChoose(player.getId(), source, game)
&& targetOpp.choose(Outcome.Detriment, player.getId(), source.getSourceId(), source, game)) {
Player opponent = game.getPlayer(targetOpp.getFirstTarget());
if (opponent != null) {
FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creature controlled by " + player.getLogName());
filter2.add(new ControllerIdPredicate(player.getId()));
TargetCreaturePermanent targetCreature = new TargetCreaturePermanent(1, 1, filter2, true);
targetCreature.setTargetController(opponent.getId());
if (targetCreature.canChoose(source.getControllerId(), source, game)
&& opponent.chooseUse(Outcome.GainControl, "Gain control of a creature?", source, game)
&& opponent.chooseTarget(Outcome.GainControl, targetCreature, source, game)) {
ConditionalContinuousEffect giveEffect = new ConditionalContinuousEffect(
new GainControlTargetEffect(Duration.Custom, true, opponent.getId()),
SourceOnBattlefieldCondition.instance,
"");
giveEffect.setTargetPointer(new FixedTarget(targetCreature.getFirstTarget(), game));
game.addEffect(giveEffect, source);
return true;
}
}
}
}
}
return false;
}
}

View file

@ -1,7 +1,5 @@
package mage.cards.j;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
@ -10,14 +8,15 @@ import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class JaceIngeniousMindMage extends CardImpl {
@ -38,7 +37,7 @@ public final class JaceIngeniousMindMage extends CardImpl {
// -9: Gain control of up to three target creatures.
Ability ability = new LoyaltyAbility(new GainControlTargetEffect(Duration.Custom), -9);
ability.addTarget(new TargetCreaturePermanent(0, 3, StaticFilters.FILTER_PERMANENT_CREATURES, false));
ability.addTarget(new TargetCreaturePermanent(0, 3));
this.addAbility(ability);
}

View file

@ -15,7 +15,7 @@ import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -67,7 +67,7 @@ class JaddiLifestriderEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
int tappedAmount = 0;
Player you = game.getPlayer(source.getControllerId());
TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true);
TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true);
if (target.canChoose(source.getControllerId(), source, game) && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) {
for (UUID creatureId : target.getTargets()) {
Permanent creature = game.getPermanent(creatureId);

View file

@ -1,16 +1,14 @@
package mage.cards.j;
import java.util.UUID;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LoneFox
*/
public final class JaggedLightning extends CardImpl {
@ -20,7 +18,7 @@ public final class JaggedLightning extends CardImpl {
// Jagged Lightning deals 3 damage to each of two target creatures.
this.getSpellAbility().addEffect(new DamageTargetEffect(3, true, "each of two target creatures"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE, false));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(2));
}
private JaggedLightning(final JaggedLightning card) {

View file

@ -1,7 +1,6 @@
package mage.cards.j;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
@ -15,10 +14,11 @@ import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author Styxo
*/
public final class JediStarfighter extends CardImpl {
@ -42,7 +42,7 @@ public final class JediStarfighter extends CardImpl {
// When Jedi Starfighter enters the battlefield, up to two Jedi creatures you control gain spaceflight until end of turn.
EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainAbilityTargetEffect(SpaceflightAbility.getInstance(), Duration.EndOfTurn));
ability.addTarget(new TargetCreaturePermanent(0, 2, filter, true));
ability.addTarget(new TargetPermanent(0, 2, filter, true));
this.addAbility(ability);
// Meditate {1}{W}

View file

@ -1,7 +1,5 @@
package mage.cards.j;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@ -11,13 +9,13 @@ 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.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class JoragaAuxiliary extends CardImpl {
@ -38,7 +36,7 @@ public final class JoragaAuxiliary extends CardImpl {
// {4}{G}{W}: Support 2. (Put a +1/+1 counter on each of up to two other target creatures.)
Ability ability = new SimpleActivatedAbility(new SupportEffect(this, 2, true), new ManaCostsImpl<>("{4}{G}{W}"));
ability.addTarget(new TargetCreaturePermanent(0, 2, filter, false));
ability.addTarget(new TargetPermanent(0, 2, filter));
this.addAbility(ability);
}

View file

@ -1,24 +1,24 @@
package mage.cards.j;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.constants.SubType;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class JubilantMascot extends CardImpl {
@ -43,7 +43,7 @@ public final class JubilantMascot extends CardImpl {
.setText("support 2"),
new ManaCostsImpl<>("{3}{W}")
));
ability.addTarget(new TargetCreaturePermanent(0, 2, filter, false));
ability.addTarget(new TargetPermanent(0, 2, filter));
this.addAbility(ability);
}

View file

@ -13,7 +13,6 @@ import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@ -27,8 +26,6 @@ import java.util.UUID;
*/
public final class KayaGhostAssassin extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("target creature to exile. Choose no targets to exile Kaya.");
public KayaGhostAssassin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{B}");
this.supertype.add(SuperType.LEGENDARY);
@ -39,21 +36,17 @@ public final class KayaGhostAssassin extends CardImpl {
// 0: Exile Kaya, Ghost Assassin or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep.
// You lose 2 life.
Ability ability = new LoyaltyAbility(new KayaGhostAssassinEffect(), 0);
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetCreaturePermanent(0, 1).withChooseHint("Choose no targets to exile Kaya"));
this.addAbility(ability);
// -1: Each opponent loses 2 life and you gain 2 life.
ability = new LoyaltyAbility(new LoseLifeOpponentsEffect(2), -1);
Effect effect = new GainLifeEffect(2);
effect.setText("and you gain 2 life");
ability.addEffect(effect);
ability.addEffect(new GainLifeEffect(2).setText("and you gain 2 life"));
this.addAbility(ability);
// -2: Each opponent discards a card and you draw a card.
ability = new LoyaltyAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT), -2);
effect = new DrawCardSourceControllerEffect(1);
effect.setText("and you draw a card");
ability.addEffect(effect);
ability.addEffect(new DrawCardSourceControllerEffect(1).setText("and you draw a card"));
this.addAbility(ability);
}

View file

@ -1,6 +1,5 @@
package mage.cards.k;
import mage.MageObject;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
@ -22,21 +21,20 @@ import mage.game.Game;
import mage.game.command.emblems.KayaTheInexorableEmblem;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.SpiritWhiteToken;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetNonlandPermanent;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class KayaTheInexorable extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
filter.add(TokenPredicate.FALSE);
}
@ -52,7 +50,7 @@ public final class KayaTheInexorable extends CardImpl {
LoyaltyAbility ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.GHOSTFORM.createInstance()), 1);
ability.addEffect(new GainAbilityTargetEffect(new KayaTheInexorableTriggeredAbility(), Duration.WhileOnBattlefield,
"It gains \"When this creature dies or is put into exile, return it to its owner's hand and create a 1/1 white Spirit creature token with flying.\""));
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
// 3: Exile target nonland permanent.

View file

@ -6,7 +6,6 @@ import mage.abilities.common.AttacksEachCombatStaticAbility;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.FirstStrikeAbility;
@ -23,7 +22,7 @@ import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPre
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -58,11 +57,9 @@ public final class KyloRen extends CardImpl {
// Whenever Kylo Ren attacks, it gets +1/+0 for each creature in your graveyard and you may tap target creature defending player controls.
CardsInControllerGraveyardCount value = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE);
Effect effect = new BoostSourceEffect(value, StaticValue.get(0), Duration.WhileOnBattlefield);
effect.setText("it gets +1/+0 for each creature in your graveyard");
Ability ability = new AttacksTriggeredAbility(effect, false);
Ability ability = new AttacksTriggeredAbility(new BoostSourceEffect(value, StaticValue.get(0), Duration.WhileOnBattlefield).setText("it gets +1/+0 for each creature in your graveyard"));
ability.addEffect(new KyloRenTapTargetEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}

View file

@ -10,13 +10,15 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.SoldierLifelinkToken;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -57,13 +59,6 @@ public final class LedevChampion extends CardImpl {
class LedevChampionEffect extends OneShotEffect {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creatures you control");
static {
filter.add(TargetController.YOU.getControllerPredicate());
filter.add(TappedPredicate.UNTAPPED);
}
public LedevChampionEffect() {
super(Outcome.GainLife);
staticText = "you may tap any number of untapped creatures you control. "
@ -76,10 +71,9 @@ class LedevChampionEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURES, true);
target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game);
int tappedAmount = 0;
TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true);
if (target.canChoose(source.getControllerId(), source, game)
&& target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) {
for (UUID creatureId : target.getTargets()) {
Permanent creature = game.getPermanent(creatureId);
if (creature != null) {
@ -87,7 +81,6 @@ class LedevChampionEffect extends OneShotEffect {
tappedAmount++;
}
}
}
if (tappedAmount > 0) {
game.addEffect(new BoostSourceEffect(tappedAmount, tappedAmount, Duration.EndOfTurn), source);
return true;

View file

@ -44,7 +44,7 @@ public final class LilianaTheNecromancer extends CardImpl {
// 7: Destroy up to two target creatures. Put up to two creature cards from graveyards onto the battlefield under your control.
ability = new LoyaltyAbility(new DestroyTargetEffect(), -7);
ability.addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false));
ability.addTarget(new TargetCreaturePermanent(0, 2));
ability.addEffect(new LilianaTheNecromancerEffect());
this.addAbility(ability);
}

View file

@ -5,6 +5,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
@ -18,12 +19,11 @@ public final class MabelsMettle extends CardImpl {
public MabelsMettle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
// Target creature gets +2/+2 until end of turn. Up to one other target creature gets +1/+1 until end of turn.
this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2));
this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1));
this.getSpellAbility().addEffect(new BoostTargetEffect(1, 1).setTargetPointer(new SecondTargetPointer()));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2, false).setTargetTag(2));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2).setTargetTag(2));
}
private MabelsMettle(final MabelsMettle card) {

View file

@ -17,7 +17,7 @@ import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -52,7 +52,7 @@ public final class MarthaJones extends CardImpl {
);
ability.addEffect(new CantBeBlockedTargetEffect()
.setText("and up to one other target creature can't be blocked this turn"));
ability.addTarget(new TargetCreaturePermanent(0, 1, filterOther, false));
ability.addTarget(new TargetPermanent(0, 1, filterOther));
this.addAbility(ability);
// Doctor's companion

View file

@ -1,11 +1,9 @@
package mage.cards.m;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
import mage.constants.SubType;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureAllEffect;
@ -14,6 +12,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
@ -21,10 +20,11 @@ import mage.filter.predicate.mageobject.AbilityPredicate;
import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class MasterOfTheVeil extends CardImpl {
@ -48,7 +48,7 @@ public final class MasterOfTheVeil extends CardImpl {
// When Master of the Veil is turned face up, you may turn target creature with a morph ability face down.
Ability ability = new TurnedFaceUpSourceTriggeredAbility(new MasterOfTheVeilEffect(), false, true);
ability.addTarget(new TargetCreaturePermanent(1, 1, filter, false));
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}

View file

@ -21,7 +21,7 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.targetpointer.FixedTarget;
import mage.watchers.common.ControlCombatRedundancyWatcher;
@ -107,7 +107,7 @@ class MasterWarcraftChooseAttackersEffect extends ContinuousRuleModifyingEffectI
if (controller == null || attackingPlayer == null || attackingPlayer.getAvailableAttackers(game).isEmpty()) {
return false; // the attack declaration resumes for the active player as normal
}
Target target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true);
Target target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true);
if (!controller.chooseTarget(Outcome.Benefit, target, source, game)) {
return false; // the attack declaration resumes for the active player as normal
}

View file

@ -1,16 +1,15 @@
package mage.cards.m;
import java.util.UUID;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class MischiefAndMayhem extends CardImpl {
@ -20,7 +19,7 @@ public final class MischiefAndMayhem extends CardImpl {
// Up to two target creatures each get +4/+4 until end of turn.
this.getSpellAbility().addEffect(new BoostTargetEffect(4, 4, Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
}
private MischiefAndMayhem(final MischiefAndMayhem card) {

View file

@ -14,7 +14,7 @@ import mage.game.Controllable;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.targetpointer.EachTargetPointer;
import java.util.Collection;
@ -67,7 +67,7 @@ enum ModifyMemoryCondition implements Condition {
}
}
class ModifyMemoryTarget extends TargetCreaturePermanent {
class ModifyMemoryTarget extends TargetPermanent {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent("creatures controlled by different players");

View file

@ -15,6 +15,7 @@ import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -31,7 +32,6 @@ public final class Mutiny extends CardImpl {
this.getSpellAbility().addEffect(new MutinyEffect());
this.getSpellAbility().addTarget(new MutinyFirstTarget(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("another target creature that player controls")));
}
private Mutiny(final Mutiny card) {
@ -75,7 +75,7 @@ class MutinyEffect extends OneShotEffect {
}
class MutinyFirstTarget extends TargetCreaturePermanent {
class MutinyFirstTarget extends TargetPermanent {
public MutinyFirstTarget(FilterCreaturePermanent filter) {
super(1, 1, filter, false);

View file

@ -1,6 +1,5 @@
package mage.cards.n;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
@ -13,11 +12,12 @@ import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class NissasJudgment extends CardImpl {
@ -32,7 +32,7 @@ public final class NissasJudgment extends CardImpl {
// Choose up to one target creature an opponent controls. Each creature you control with a +1/+1 counter on it deals damage equal to its power to that creature.
effect = new NissasJudgmentEffect();
effect.setTargetPointer(new SecondTargetPointer()); // First target is used by Support
getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, false));
getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent(0, 1));
getSpellAbility().addEffect(effect);
}

View file

@ -16,8 +16,8 @@ import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
@ -37,7 +37,7 @@ public final class PhantomBlade extends CardImpl {
ability.addTarget(new TargetControlledCreaturePermanent(0, 1).setTargetTag(1));
ability.addEffect(new DestroyTargetEffect().setTargetPointer(new SecondTargetPointer()));
ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2, false).setTargetTag(2));
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE_TARGET_2).setTargetTag(2));
this.addAbility(ability);
// Equipped creature gets +1/+1 and has menace.

View file

@ -8,12 +8,12 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.util.functions.EmptyCopyApplier;
@ -31,9 +31,8 @@ public final class PolymorphousRush extends CardImpl {
this.addAbility(new StriveAbility("{1}{U}"));
// Choose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn.
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED, false));
this.getSpellAbility().addEffect(new PolymorphousRushCopyEffect());
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE));
}
private PolymorphousRush(final PolymorphousRush card) {

View file

@ -21,6 +21,7 @@ import mage.filter.common.FilterCreatureCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.game.Game;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
@ -37,13 +38,12 @@ public final class ProfaneCommand extends CardImpl {
public ProfaneCommand(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{B}");
DynamicValue xValue = GetXValue.instance;
// Choose two -
this.getSpellAbility().getModes().setMinModes(2);
this.getSpellAbility().getModes().setMaxModes(2);
// * Target player loses X life.
this.getSpellAbility().addEffect(new LoseLifeTargetEffect(xValue));
this.getSpellAbility().addEffect(new LoseLifeTargetEffect(GetXValue.instance));
this.getSpellAbility().addTarget(new TargetPlayer());
// * Return target creature card with converted mana cost X or less from your graveyard to the battlefield.
@ -52,15 +52,13 @@ public final class ProfaneCommand extends CardImpl {
this.getSpellAbility().addMode(mode);
// * Target creature gets -X/-X until end of turn.
DynamicValue minusValue = new SignInversionDynamicValue(xValue);
DynamicValue minusValue = new SignInversionDynamicValue(GetXValue.instance);
mode = new Mode(new BoostTargetEffect(minusValue, minusValue, Duration.EndOfTurn));
mode.addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addMode(mode);
// * Up to X target creatures gain fear until end of turn.
Effect effect = new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn);
effect.setText("Up to X target creatures gain fear until end of turn");
mode = new Mode(effect);
mode = new Mode(new GainAbilityTargetEffect(FearAbility.getInstance(), Duration.EndOfTurn).setText("Up to X target creatures gain fear until end of turn"));
mode.addTarget(new TargetCreaturePermanent(0, 1));
this.getSpellAbility().addMode(mode);
@ -95,7 +93,7 @@ enum ProfaneCommandAdjuster implements TargetAdjuster {
if (effect instanceof GainAbilityTargetEffect) {
mode.getTargets().clear();
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain fear until end of turn");
mode.addTarget(new TargetCreaturePermanent(0, xValue, filter, false));
mode.addTarget(new TargetPermanent(0, xValue, filter));
}
}
}

View file

@ -1,7 +1,5 @@
package mage.cards.r;
import java.util.UUID;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.FirstStrikeAbility;
@ -12,11 +10,13 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class RallyManeuver extends CardImpl {
@ -31,25 +31,22 @@ public final class RallyManeuver extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}");
// Target creature gets +2/+0 and gains first strike until end of turn. Up to one other target creature gets +0/+2 and gains lifelink until end of turn.
TargetCreaturePermanent target = new TargetCreaturePermanent();
target.setTargetTag(1);
this.getSpellAbility().addTarget(target.withChooseHint("+2/+0 and first strike"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1).withChooseHint("+2/+0 and first strike"));
this.getSpellAbility().addEffect(new BoostTargetEffect(2, 0).setText("Target creature gets +2/+0"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
FirstStrikeAbility.getInstance(), Duration.EndOfTurn, "and gains first strike until end of turn"
FirstStrikeAbility.getInstance(), Duration.EndOfTurn,
"and gains first strike until end of turn"
));
target = new TargetCreaturePermanent(0, 1, filter2, false);
target.setTargetTag(2);
this.getSpellAbility().addTarget(target.withChooseHint("+0/+2 and lifelink"));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter2)
.setTargetTag(2).withChooseHint("+0/+2 and lifelink"));
this.getSpellAbility().addEffect(new BoostTargetEffect(0, 2)
.setText("Up to one other target creature gets +0/+2")
.setTargetPointer(new SecondTargetPointer())
);
this.getSpellAbility().addEffect(
new GainAbilityTargetEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, "and gains lifelink until end of turn")
.setTargetPointer(new SecondTargetPointer())
);
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
LifelinkAbility.getInstance(), Duration.EndOfTurn,
"and gains lifelink until end of turn"
).setTargetPointer(new SecondTargetPointer()));
}
private RallyManeuver(final RallyManeuver card) {

View file

@ -12,12 +12,11 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author notgreat
*/
public final class RavenousTyrannosaurus extends CardImpl {
@ -27,6 +26,7 @@ public final class RavenousTyrannosaurus extends CardImpl {
static {
filter.add(AnotherPredicate.instance);
}
public RavenousTyrannosaurus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{G}");
this.subtype.add(SubType.DINOSAUR);
@ -39,7 +39,7 @@ public final class RavenousTyrannosaurus extends CardImpl {
// Whenever Ravenous Tyrannosaurus attacks, it deals damage equal to its power to up to one other target creature. Excess damage is dealt to that creature's controller instead.
Ability ability = new AttacksTriggeredAbility(new DamageWithExcessEffect(SourcePermanentPowerValue.NOT_NEGATIVE)
.setText("it deals damage equal to its power to up to one other target creature. Excess damage is dealt to that creature's controller instead."));
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}

View file

@ -13,7 +13,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -36,7 +36,7 @@ public final class RazorgrassInvoker extends CardImpl {
// {8}: Razorgrass Invoker and up to one other target creature each get +3/+3 until end of turn.
Ability ability = new SimpleActivatedAbility(new BoostSourceEffect(3, 3, Duration.EndOfTurn).setText("{this}"), new ManaCostsImpl<>("{8}"));
ability.addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("and up to one other target creature each get +3/+3 until end of turn"));
ability.addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_ANOTHER_TARGET_CREATURE, false));
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
this.addAbility(ability);
}

View file

@ -6,12 +6,11 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author Loki
*/
public final class RecklessSpite extends CardImpl {
@ -20,7 +19,7 @@ public final class RecklessSpite extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}{B}");
this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK, false));
this.getSpellAbility().addTarget(new TargetPermanent(2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK));
this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(5));
}

View file

@ -18,7 +18,7 @@ import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.permanent.token.custom.CreatureToken;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -53,7 +53,7 @@ public final class RestlessVinestalk extends CardImpl {
// Whenever Restless Vinestalk attacks, up to one other target creature has base power and toughness 3/3 until end of turn.
Ability ability = new AttacksTriggeredAbility(new SetBasePowerToughnessTargetEffect(3, 3, Duration.EndOfTurn), false);
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}

View file

@ -1,8 +1,6 @@
package mage.cards.r;
import java.util.UUID;
import mage.MageObject;
import mage.MageItem;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
@ -10,15 +8,23 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetImpl;
import mage.target.TargetPermanent;
import mage.target.common.TargetPermanentSameController;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
/**
*
* @author jeffwadsworth
*/
public final class Retribution extends CardImpl {
@ -28,8 +34,7 @@ public final class Retribution extends CardImpl {
// Choose two target creatures an opponent controls. That player chooses and sacrifices one of those creatures. Put a -1/-1 counter on the other.
this.getSpellAbility().addEffect(new RetributionEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanentOpponentSameController(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE, false));
this.getSpellAbility().addTarget(new TargetPermanentSameController(2, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES));
}
private Retribution(final Retribution card) {
@ -60,66 +65,53 @@ class RetributionEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
MageObject sourceObject = source.getSourceObject(game);
if (sourceObject != null) {
boolean sacrificeDone = false;
int count = 0;
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
Permanent creature = game.getPermanent(targetId);
if (creature != null) {
Player controllerOfCreature = game.getPlayer(creature.getControllerId());
if ((count == 0 && controllerOfCreature != null
&& controllerOfCreature.chooseUse(Outcome.Sacrifice, "Sacrifice " + creature.getLogName() + '?', source, game))
|| (count == 1
&& !sacrificeDone)) {
creature.sacrifice(source, game);
sacrificeDone = true;
} else {
creature.addCounters(CounterType.M1M1.createInstance(), source.getControllerId(), source, game);
}
count++;
}
}
return true;
}
return false;
}
}
class TargetCreaturePermanentOpponentSameController extends TargetCreaturePermanent {
public TargetCreaturePermanentOpponentSameController(int minNumTargets, int maxNumTargets, FilterCreaturePermanent filter, boolean notTarget) {
super(minNumTargets, maxNumTargets, filter, notTarget);
}
private TargetCreaturePermanentOpponentSameController(final TargetCreaturePermanentOpponentSameController target) {
super(target);
}
@Override
public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) {
if (super.canTarget(controllerId, id, source, game)) {
Permanent firstTargetPermanent = game.getPermanent(id);
if (firstTargetPermanent != null
&& game.getOpponents(controllerId).contains(firstTargetPermanent.getControllerId())) {
for (UUID targetId : getTargets()) {
Permanent targetPermanent = game.getPermanent(targetId);
if (targetPermanent != null) {
if (!firstTargetPermanent.getId().equals(targetPermanent.getId())) {
if (!firstTargetPermanent.isControlledBy(targetPermanent.getOwnerId())) {
return false;
}
List<Permanent> permanents = this
.getTargetPointer()
.getTargets(game, source)
.stream()
.map(game::getPermanent)
.filter(Objects::nonNull)
.collect(Collectors.toList());
List<Permanent> canSac = permanents
.stream()
.filter(Permanent::canBeSacrificed)
.collect(Collectors.toList());
Permanent toSacrifice;
switch (canSac.size()) {
case 0:
toSacrifice = null;
break;
case 1:
toSacrifice = canSac.get(0);
break;
default:
toSacrifice = Optional
.ofNullable(canSac.get(0).getControllerId())
.map(game::getPlayer)
.map(player -> {
FilterPermanent filter = new FilterPermanent();
filter.add(Predicates.or(
canSac.stream()
.map(MageItem::getId)
.map(PermanentIdPredicate::new)
.collect(Collectors.toList())
));
TargetPermanent target = new TargetPermanent(filter);
target.withNotTarget(true);
player.choose(Outcome.Sacrifice, target, source, game);
return target;
})
.map(TargetImpl::getFirstTarget)
.map(game::getPermanent)
.orElse(null);
}
if (toSacrifice != null) {
permanents.remove(toSacrifice);
toSacrifice.sacrifice(source, game);
}
for (Permanent permanent : permanents) {
permanent.addCounters(CounterType.M1M1.createInstance(), source, game);
}
return true;
}
}
return false;
}
@Override
public TargetCreaturePermanentOpponentSameController copy() {
return new TargetCreaturePermanentOpponentSameController(this);
}
}

View file

@ -1,19 +1,20 @@
package mage.cards.r;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.FightTargetsEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.StaticFilters;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanentWithDifferentTypes;
import mage.target.TargetPermanent;
import java.util.Objects;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class RivalsDuel extends CardImpl {
@ -22,9 +23,9 @@ public final class RivalsDuel extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}");
// Choose two target creatures that share no creature types. Those creatures fight each other.
this.getSpellAbility().addEffect(new RivalsDuelFightTargetsEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanentWithDifferentTypes(2, 2, StaticFilters.FILTER_PERMANENT_CREATURE, false));
this.getSpellAbility().addEffect(new FightTargetsEffect()
.setText("Choose two target creatures that share no creature types. Those creatures fight each other."));
this.getSpellAbility().addTarget(new RivalsDuelTarget());
}
private RivalsDuel(final RivalsDuel card) {
@ -37,42 +38,35 @@ public final class RivalsDuel extends CardImpl {
}
}
class RivalsDuelFightTargetsEffect extends OneShotEffect {
class RivalsDuelTarget extends TargetPermanent {
RivalsDuelFightTargetsEffect() {
super(Outcome.Damage);
staticText = "Choose two target creatures that share no creature types. " +
"Those creatures fight each other. <i>(Each deals damage equal to its power to the other.)</i>";
private static final FilterPermanent filter = new FilterCreaturePermanent("creatures that share no creature types");
RivalsDuelTarget() {
super(2, 2, filter, false);
}
private RivalsDuelFightTargetsEffect(final RivalsDuelFightTargetsEffect effect) {
super(effect);
private RivalsDuelTarget(final RivalsDuelTarget target) {
super(target);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent creature1 = null;
Permanent creature2 = null;
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
if (creature1 == null) {
creature1 = game.getPermanent(targetId);
} else {
creature2 = game.getPermanent(targetId);
}
public RivalsDuelTarget copy() {
return new RivalsDuelTarget(this);
}
// 20110930 - 701.10
if (creature1 != null
&& creature2 != null) {
creature1.damage(creature2.getPower().getValue(), creature2.getId(), source, game, false, true);
creature2.damage(creature1.getPower().getValue(), creature1.getId(), source, game, false, true);
return true;
}
@Override
public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) {
if (!super.canTarget(controllerId, id, source, game)) {
return false;
}
@Override
public RivalsDuelFightTargetsEffect copy() {
return new RivalsDuelFightTargetsEffect(this);
Permanent creature = game.getPermanent(id);
return creature != null
&& this
.getTargets()
.stream()
.map(game::getPermanent)
.filter(Objects::nonNull)
.noneMatch(permanent -> permanent.shareCreatureTypes(game, creature));
}
}

View file

@ -1,36 +1,34 @@
package mage.cards.r;
import java.util.UUID;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.FilterPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class RiverHeraldsBoon extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(SubType.MERFOLK, "Merfolk");
public RiverHeraldsBoon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
// Put a +1/+1 counter on target creature and a +1/+1 counter on up to one target Merfolk.
this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance());
effect.setTargetPointer(new SecondTargetPointer());
effect.setText("and a +1/+1 counter on up to one target Merfolk");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, new FilterCreaturePermanent(SubType.MERFOLK, "Merfolk"), false));
this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance())
.setTargetPointer(new SecondTargetPointer()).setText("and a +1/+1 counter on up to one target Merfolk"));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter));
}
private RiverHeraldsBoon(final RiverHeraldsBoon card) {

View file

@ -11,7 +11,7 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -38,7 +38,7 @@ public final class RoamingGhostlight extends CardImpl {
// When Roaming Ghostlight enters the battlefield, return up to one target non-Spirit creature to its owner's hand.
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}

View file

@ -5,10 +5,11 @@ import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.Objects;
import java.util.UUID;
@ -39,9 +40,9 @@ public final class RunAwayTogether extends CardImpl {
}
}
class RunAwayTogetherTarget extends TargetCreaturePermanent {
class RunAwayTogetherTarget extends TargetPermanent {
private static final FilterCreaturePermanent filter
private static final FilterPermanent filter
= new FilterCreaturePermanent("creatures controlled by different players");
RunAwayTogetherTarget() {

View file

@ -1,7 +1,5 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@ -14,8 +12,9 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SaddlebackLagac extends CardImpl {
@ -34,9 +33,8 @@ public final class SaddlebackLagac extends CardImpl {
// When Saddleback Lagac enters the battlefield, support 2.
Ability ability = new EntersBattlefieldTriggeredAbility(new SupportEffect(this, 2, true), false);
ability.addTarget(new TargetCreaturePermanent(0, 2, FILTER, false));
ability.addTarget(new TargetCreaturePermanent(0, 2));
this.addAbility(ability);
}
private SaddlebackLagac(final SaddlebackLagac card) {

View file

@ -1,20 +1,18 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.combat.CantBlockTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetLandPermanent;
import mage.target.targetpointer.SecondTargetPointer;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SeismicShift extends CardImpl {
@ -28,7 +26,7 @@ public final class SeismicShift extends CardImpl {
this.getSpellAbility().addEffect(new CantBlockTargetEffect(Duration.EndOfTurn)
.setText("Up to two target creatures can't block this turn")
.setTargetPointer(new SecondTargetPointer()));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
}
private SeismicShift(final SeismicShift card) {

View file

@ -11,14 +11,13 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
import java.util.UUID;
@ -52,12 +51,6 @@ public final class ShelteringAncient extends CardImpl {
class ShelteringAncientCost extends CostImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
filter.add(TargetController.OPPONENT.getControllerPredicate());
}
ShelteringAncientCost() {
this.text = "Put a +1/+1 counter on a creature an opponent controls";
}
@ -70,7 +63,8 @@ class ShelteringAncientCost extends CostImpl {
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
Player controller = game.getPlayer(controllerId);
if (controller != null) {
Target target = new TargetCreaturePermanent(1, 1, filter, true);
Target target = new TargetOpponentsCreaturePermanent();
target.withNotTarget(true);
if (target.choose(Outcome.BoostCreature, controllerId, source.getSourceId(), source, game)) {
Permanent permanent = game.getPermanent(target.getFirstTarget());
if (permanent != null) {
@ -85,7 +79,7 @@ class ShelteringAncientCost extends CostImpl {
@Override
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
return game.getBattlefield().contains(filter, source, game, 1);
return game.getBattlefield().contains(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, source, game, 1);
}
@Override

View file

@ -8,12 +8,14 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -34,10 +36,7 @@ public final class SiegeStriker extends CardImpl {
this.addAbility(DoubleStrikeAbility.getInstance());
// Whenever Siege Striker attacks, you may tap any number of untapped creatures you control. Siege Striker gets +1/+1 until end of turn for each creature tapped this way.
this.addAbility(new AttacksTriggeredAbility(
new SiegeStrikerEffect(), true
));
this.addAbility(new AttacksTriggeredAbility(new SiegeStrikerEffect(), true));
}
private SiegeStriker(final SiegeStriker card) {
@ -52,13 +51,6 @@ public final class SiegeStriker extends CardImpl {
class SiegeStrikerEffect extends OneShotEffect {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creatures you control");
static {
filter.add(TargetController.YOU.getControllerPredicate());
filter.add(TappedPredicate.UNTAPPED);
}
public SiegeStrikerEffect() {
super(Outcome.GainLife);
staticText = "you may tap any number of untapped creatures you control. "
@ -72,9 +64,8 @@ class SiegeStrikerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
int tappedAmount = 0;
TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true);
if (target.canChoose(source.getControllerId(), source, game)
&& target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) {
TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURES, true);
target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game);
for (UUID creatureId : target.getTargets()) {
Permanent creature = game.getPermanent(creatureId);
if (creature != null) {
@ -82,7 +73,6 @@ class SiegeStrikerEffect extends OneShotEffect {
tappedAmount++;
}
}
}
if (tappedAmount > 0) {
game.addEffect(new BoostSourceEffect(tappedAmount, tappedAmount, Duration.EndOfTurn), source);
return true;

View file

@ -1,7 +1,5 @@
package mage.cards.s;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@ -12,13 +10,13 @@ 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.predicate.Predicates;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class SigardianPriest extends CardImpl {
@ -39,7 +37,7 @@ public final class SigardianPriest extends CardImpl {
// {1}, {T}: Tap target non-Human creature.
Ability ability = new SimpleActivatedAbility(new TapTargetEffect(), new GenericManaCost(1));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent(1, 1, filter, false));
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}

View file

@ -6,8 +6,8 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -27,7 +27,7 @@ public final class SmellFear extends CardImpl {
"<br>Target creature you control fights up to one target creature you don't control"
));
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
}
private SmellFear(final SmellFear card) {

View file

@ -1,9 +1,5 @@
package mage.cards.s;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
@ -17,11 +13,14 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class SplitTheParty extends CardImpl {
@ -72,7 +71,7 @@ class SplitThePartyEffect extends OneShotEffect {
int halfCreatures = (numCreatures / 2) + (numCreatures % 2);
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures controlled by " + targetPlayer.getName());
filter.add(new ControllerIdPredicate(targetPlayer.getId()));
TargetCreaturePermanent target = new TargetCreaturePermanent(halfCreatures, halfCreatures, filter, true);
TargetPermanent target = new TargetPermanent(halfCreatures, halfCreatures, filter, true);
if (controller.chooseTarget(outcome, target, source, game)) {
Set<Card> cardsToHand = new HashSet<>();
for (UUID creatureId : target.getTargets()) {

View file

@ -16,8 +16,8 @@ import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -103,7 +103,7 @@ class SpyNetworkFaceDownEffect extends OneShotEffect {
FilterCreaturePermanent filter = new FilterCreaturePermanent("face down creature controlled by " + player.getLogName());
filter.add(FaceDownPredicate.instance);
filter.add(new ControllerIdPredicate(player.getId()));
TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true);
TargetPermanent target = new TargetPermanent(1, 1, filter, true);
if (target.canChoose(controller.getId(), source, game)) {
while (controller.chooseUse(outcome, "Look at a face down creature controlled by " + player.getLogName() + "?", source, game)) {
target.clearChosen();

View file

@ -1,9 +1,9 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.combat.CantBlockAllEffect;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -17,7 +17,7 @@ import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.ArrayList;
import java.util.List;
@ -77,7 +77,7 @@ class StandOrFallEffect extends OneShotEffect {
}
FilterCreaturePermanent opponentFilter = new FilterCreaturePermanent();
opponentFilter.add(new ControllerIdPredicate(oppId));
TargetCreaturePermanent creatures = new TargetCreaturePermanent(0, Integer.MAX_VALUE, opponentFilter, true);
TargetPermanent creatures = new TargetPermanent(0, Integer.MAX_VALUE, opponentFilter, true);
List<Permanent> pile1 = new ArrayList<>();
if (player.choose(Outcome.Neutral, creatures, source, game)) {
List<UUID> targets = creatures.getTargets();

View file

@ -8,8 +8,8 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -28,8 +28,8 @@ public final class StruggleForSkemfar extends CardImpl {
"<i>(Each deals damage equal to its power to the other.)</i>"
));
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(
0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL, false
this.getSpellAbility().addTarget(new TargetPermanent(
0, 1, StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL
));
// Foretell {G}

View file

@ -1,19 +1,16 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.BecomesColorTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class SwayOfIllusion extends CardImpl {
@ -22,10 +19,9 @@ public final class SwayOfIllusion extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
// Any number of target creatures become the color of your choice until end of turn.
Effect effect = new BecomesColorTargetEffect(Duration.EndOfTurn);
effect.setText("Any number of target creatures become the color of your choice until end of turn");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, StaticFilters.FILTER_PERMANENT_CREATURE, false));
this.getSpellAbility().addEffect(new BecomesColorTargetEffect(Duration.EndOfTurn)
.setText("Any number of target creatures become the color of your choice until end of turn"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE));
// Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));

View file

@ -42,7 +42,7 @@ public final class TamiyoFieldResearcher extends CardImpl {
// +1: Choose up to two target creatures. Until your next turn, whenever either of those creatures deals combat damage, you draw a card.
Ability ability = new LoyaltyAbility(new TamiyoFieldResearcherEffect1(), 1);
ability.addTarget(new TargetCreaturePermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false));
ability.addTarget(new TargetCreaturePermanent(0, 2));
this.addAbility(ability);
// -2: Tap up to two target nonland permanents. They don't untap during their controller's next untap step.

View file

@ -1,21 +1,26 @@
package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ShuffleIntoLibraryTargetEffect;
import mage.cards.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.choices.FaceVillainousChoice;
import mage.choices.VillainousChoice;
import mage.constants.*;
import mage.game.Game;
import mage.filter.StaticFilters;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author padfoothelix
*/
public final class ThisIsHowItEnds extends CardImpl {
@ -30,7 +35,6 @@ public final class ThisIsHowItEnds extends CardImpl {
);
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new ThisIsHowItEndsEffect());
}
private ThisIsHowItEnds(final ThisIsHowItEnds card) {
@ -98,7 +102,8 @@ class ThisIsHowItEndsSecondChoice extends VillainousChoice {
@Override
public boolean doChoice(Player player, Game game, Ability source) {
TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true);
TargetPermanent target = new TargetPermanent(filter);
target.withNotTarget(true);
target.withChooseHint("to shuffle into your library");
player.chooseTarget(Outcome.Detriment, target, source, game);
Cards cards = new CardsImpl(target.getTargets());

View file

@ -1,7 +1,5 @@
package mage.cards.t;
import java.util.UUID;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
@ -10,10 +8,11 @@ import mage.constants.CardType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AbilityPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author Quercitron
*/
public final class TidalSurge extends CardImpl {
@ -27,10 +26,9 @@ public final class TidalSurge extends CardImpl {
public TidalSurge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}");
// Tap up to three target creatures without flying.
this.getSpellAbility().addEffect(new TapTargetEffect("tap up to three target creatures without flying"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 3, filter, false));
this.getSpellAbility().addTarget(new TargetPermanent(0, 3, filter));
}
private TidalSurge(final TidalSurge card) {

View file

@ -7,6 +7,7 @@ import mage.constants.CardType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.AnotherTargetPredicate;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.SecondTargetPointer;
@ -29,7 +30,7 @@ public final class TrickShot extends CardImpl {
// Trick Shot deals 6 damage to target creature and 2 damage to up to one other target creature token.
this.getSpellAbility().addTarget(new TargetCreaturePermanent().setTargetTag(1));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, filter, false).setTargetTag(2));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter).setTargetTag(2));
this.getSpellAbility().addEffect(new DamageTargetEffect(6, true, "", true));
this.getSpellAbility().addEffect(
new DamageTargetEffect(2, true, "", true)

View file

@ -1,22 +1,21 @@
package mage.cards.t;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.filter.StaticFilters;
import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class Twigwalker extends CardImpl {
@ -31,7 +30,7 @@ public final class Twigwalker extends CardImpl {
// {1}{G}, Sacrifice Twigwalker: Two target creatures each get +2/+2 until end of turn.
Ability ability = new SimpleActivatedAbility(new BoostTargetEffect(2, 2, Duration.EndOfTurn), new ManaCostsImpl<>("{1}{G}"));
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURES, false));
ability.addTarget(new TargetCreaturePermanent(2));
this.addAbility(ability);
}

View file

@ -1,7 +1,5 @@
package mage.cards.u;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
@ -13,10 +11,12 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class UrgeToFeed extends CardImpl {
@ -62,8 +62,8 @@ class UrgeToFeedEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true);
if (target.canChoose(source.getControllerId(), source, game) && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game)) {
TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true);
target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), source, game);
for (UUID vampireId : target.getTargets()) {
Permanent vampire = game.getPermanent(vampireId);
if (vampire != null) {
@ -71,7 +71,6 @@ class UrgeToFeedEffect extends OneShotEffect {
vampire.addCounters(CounterType.P1P1.createInstance(), source.getControllerId(), source, game);
}
}
}
return true;
}

View file

@ -4,7 +4,6 @@ import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.AsTurnedFaceUpEffect;
@ -13,16 +12,18 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CopyEffect;
import mage.abilities.effects.common.CopyPermanentEffect;
import mage.abilities.keyword.MorphAbility;
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.Outcome;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.util.functions.CopyApplier;
import java.util.UUID;
@ -104,11 +105,7 @@ class VesuvanShapeshifterEffect extends OneShotEffect {
Permanent copyToCreature = game.getPermanent(source.getSourceId());
if (copyToCreature != null) {
FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
filter.add(AnotherPredicate.instance);
TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, true);
TargetPermanent target = new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_CREATURE, true);
if (controller != null && controller.chooseTarget(Outcome.BecomeCreature, target, source, game) && !target.getTargets().isEmpty()) {
Permanent copyFromCreature = game.getPermanentOrLKIBattlefield(target.getFirstTarget());
if (copyFromCreature != null) {

View file

@ -1,11 +1,8 @@
package mage.cards.w;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility;
import mage.constants.SubType;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureAllEffect;
@ -14,6 +11,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
@ -22,10 +20,11 @@ import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class WeaverOfLies extends CardImpl {
@ -49,7 +48,7 @@ public final class WeaverOfLies extends CardImpl {
// When Weaver of Lies is turned face up, turn any number of target creatures with a morph ability other than Weaver of Lies face down.
Ability ability = new TurnedFaceUpSourceTriggeredAbility(new WeaverOfLiesEffect(), false, false);
ability.addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, false));
ability.addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter));
this.addAbility(ability);
}

View file

@ -16,7 +16,7 @@ import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -46,7 +46,7 @@ public final class WerefoxBodyguard extends CardImpl {
// When Werefox Bodyguard enters the battlefield, exile up to one other target non-Fox creature until Werefox Bodyguard leaves the battlefield.
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
// {1}{W}, Sacrifice Werefox Bodyguard: You gain 2 life.

View file

@ -1,16 +1,16 @@
package mage.cards.w;
import java.util.UUID;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class WickedPact extends CardImpl {
@ -20,7 +20,7 @@ public final class WickedPact extends CardImpl {
// Destroy two target nonblack creatures. You lose 5 life.
this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK, false));
this.getSpellAbility().addTarget(new TargetPermanent(2, StaticFilters.FILTER_PERMANENT_CREATURES_NON_BLACK));
this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(5));
}

View file

@ -1,7 +1,5 @@
package mage.cards.z;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
@ -16,11 +14,12 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class ZndrspltsJudgment extends CardImpl {
@ -72,7 +71,8 @@ class ZndrspltsJudgmentEffect extends OneShotEffect {
}
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control");
filter.add(new ControllerIdPredicate(player.getId()));
TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true);
TargetPermanent target = new TargetPermanent(filter);
target.withNotTarget(true);
if (!player.choose(Outcome.Copy, target, source, game)) {
continue;
}
@ -83,7 +83,8 @@ class ZndrspltsJudgmentEffect extends OneShotEffect {
for (Player player : choice.getFoes()) {
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control");
filter.add(new ControllerIdPredicate(player.getId()));
TargetCreaturePermanent target = new TargetCreaturePermanent(1, 1, filter, true);
TargetPermanent target = new TargetPermanent(filter);
target.withNotTarget(true);
if (!player.choose(Outcome.ReturnToHand, target, source, game)) {
continue;
}

View file

@ -6,7 +6,6 @@ import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.cards.Card;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.util.CardUtil;
@ -23,7 +22,7 @@ public class SupportEffect extends AddCountersTargetEffect {
this.amountSupportTargets = StaticValue.get(amount);
this.otherPermanent = otherPermanent;
if (card.isInstantOrSorcery()) {
card.getSpellAbility().addTarget(new TargetCreaturePermanent(0, amount, new FilterCreaturePermanent("target creatures"), false));
card.getSpellAbility().addTarget(new TargetCreaturePermanent(0, amount));
}
staticText = setText();
}

View file

@ -1,12 +1,13 @@
package mage.abilities.keyword;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.keyword.SupportEffect;
import mage.cards.Card;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
/**
* 701.32. Support
@ -19,19 +20,25 @@ import mage.target.common.TargetCreaturePermanent;
*/
public class SupportAbility extends EntersBattlefieldTriggeredAbility {
private static final FilterPermanent filter = new FilterCreaturePermanent("other target creatures");
static {
filter.add(AnotherPredicate.instance);
}
/*
* For enchantments, the text should not include the word "other".
* The otherPermanent choice removes the word "other" from rule text creation.
*/
public SupportAbility(Card card, int amount, boolean otherPermanent) {
super(new SupportEffect(card, amount, otherPermanent));
if (!card.isInstantOrSorcery()) {
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures");
if (card.isCreature()) {
filter.add(AnotherPredicate.instance);
filter.setMessage("other target creatures");
if (card.isInstantOrSorcery()) {
return;
}
addTarget(new TargetCreaturePermanent(0, amount, filter, false));
if (card.isCreature()) {
addTarget(new TargetPermanent(0, amount, StaticFilters.FILTER_PERMANENT_CREATURES));
} else {
addTarget(new TargetPermanent(0, amount, filter));
}
}

View file

@ -27,7 +27,7 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.command.Plane;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.watchers.common.PlanarRollWatcher;
import java.util.ArrayList;
@ -62,7 +62,7 @@ public class BantPlane extends Plane {
// Active player can roll the planar die: Whenever you roll {CHAOS}, put a divinity counter on target green, white, or blue creature. That creature gains indestructible for as long as it has a divinity counter on it.
Effect chaosEffect = new ConditionalContinuousEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.Custom), new TargetHasCounterCondition(CounterType.DIVINITY), rule);
Target chaosTarget = new TargetCreaturePermanent(1, 1, filter2, false);
Target chaosTarget = new TargetPermanent(filter2);
Effect chaosEffect2 = new AddCountersTargetEffect(CounterType.DIVINITY.createInstance());
List<Effect> chaosEffects = new ArrayList<Effect>();

View file

@ -25,7 +25,7 @@ import mage.game.Game;
import mage.game.command.Plane;
import mage.game.stack.Spell;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent;
import mage.util.CardUtil;
import mage.watchers.common.PlanarRollWatcher;
@ -48,7 +48,7 @@ public class FeedingGroundsPlane extends Plane {
// Active player can roll the planar die: Whenever you roll {CHAOS}, target red or green creature gets X +1/+1 counters
Effect chaosEffect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(), TargetManaValue.instance);
Target chaosTarget = new TargetCreaturePermanent(1, 1, StaticFilters.FILTER_PERMANENT_A_CREATURE, false);
Target chaosTarget = new TargetPermanent(StaticFilters.FILTER_PERMANENT_A_CREATURE);
List<Effect> chaosEffects = new ArrayList<>();
chaosEffects.add(chaosEffect);

View file

@ -1,4 +1,3 @@
package mage.target.common;
import mage.filter.StaticFilters;
@ -15,7 +14,7 @@ public class TargetCreaturePermanent extends TargetPermanent {
}
public TargetCreaturePermanent(FilterCreaturePermanent filter) {
this(1, 1, filter, false);
super(1, 1, filter, false);
}
public TargetCreaturePermanent(int numTargets) {
@ -23,11 +22,7 @@ public class TargetCreaturePermanent extends TargetPermanent {
}
public TargetCreaturePermanent(int minNumTargets, int maxNumTargets) {
this(minNumTargets, maxNumTargets, maxNumTargets > 1 ? StaticFilters.FILTER_PERMANENT_CREATURES : StaticFilters.FILTER_PERMANENT_CREATURE, false);
}
public TargetCreaturePermanent(int minNumTargets, int maxNumTargets, FilterCreaturePermanent filter, boolean notTarget) {
super(minNumTargets, maxNumTargets, filter, notTarget);
super(minNumTargets, maxNumTargets, maxNumTargets > 1 ? StaticFilters.FILTER_PERMANENT_CREATURES : StaticFilters.FILTER_PERMANENT_CREATURE, false);
}
protected TargetCreaturePermanent(final TargetCreaturePermanent target) {

View file

@ -1,49 +0,0 @@
package mage.target.common;
import mage.abilities.Ability;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID;
/**
* @author LevelX2
*/
public class TargetCreaturePermanentWithDifferentTypes extends TargetCreaturePermanent {
public TargetCreaturePermanentWithDifferentTypes(int minNumTargets, int maxNumTargets, FilterCreaturePermanent filter, boolean notTarget) {
super(minNumTargets, maxNumTargets, filter, notTarget);
}
protected TargetCreaturePermanentWithDifferentTypes(final TargetCreaturePermanentWithDifferentTypes target) {
super(target);
}
@Override
public TargetCreaturePermanentWithDifferentTypes copy() {
return new TargetCreaturePermanentWithDifferentTypes(this);
}
@Override
public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) {
if (super.canTarget(controllerId, id, source, game)) {
Permanent creature = game.getPermanent(id);
if (creature != null) {
for (Object object : getTargets()) {
UUID targetId = (UUID) object;
Permanent selectedCreature = game.getPermanent(targetId);
if (selectedCreature != null
&& !creature.getId().equals(selectedCreature.getId())) {
if (creature.shareCreatureTypes(game, selectedCreature)) {
return false;
}
}
}
return true;
}
}
return false;
}
}