ForEachOpponentTargetsAdjuster -> ForEachPlayerTargetsAdjuster

This commit is contained in:
Steven Knipe 2025-05-31 19:28:08 -07:00
parent fc1d5ce4cf
commit 7a3b069d9e
45 changed files with 165 additions and 377 deletions

View file

@ -1,8 +1,5 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect; import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect;
import mage.abilities.keyword.DelveAbility; import mage.abilities.keyword.DelveAbility;
@ -11,14 +8,13 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.common.FilterCreatureCard; import mage.filter.StaticFilters;
import mage.filter.predicate.card.OwnerIdPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCardInGraveyard;
import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
/** /**
* *
* @author Jmlundeen * @author Jmlundeen
@ -39,7 +35,8 @@ public final class AfterlifeFromTheLoam extends CardImpl {
this.getSpellAbility().addEffect(new AddCardSubTypeTargetEffect(SubType.ZOMBIE, Duration.WhileOnBattlefield) this.getSpellAbility().addEffect(new AddCardSubTypeTargetEffect(SubType.ZOMBIE, Duration.WhileOnBattlefield)
.setTargetPointer(new EachTargetPointer()) .setTargetPointer(new EachTargetPointer())
.setText("they're Zombies in addition to their other types")); .setText("they're Zombies in addition to their other types"));
this.getSpellAbility().setTargetAdjuster(AfterlifeFromTheLoamAdjuster.instance); this.getSpellAbility().addTarget(new TargetCardInGraveyard(0, 1, StaticFilters.FILTER_CARD_CREATURE_A_GRAVEYARD));
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(true, false));
} }
private AfterlifeFromTheLoam(final AfterlifeFromTheLoam card) { private AfterlifeFromTheLoam(final AfterlifeFromTheLoam card) {
@ -51,22 +48,3 @@ public final class AfterlifeFromTheLoam extends CardImpl {
return new AfterlifeFromTheLoam(this); return new AfterlifeFromTheLoam(this);
} }
} }
enum AfterlifeFromTheLoamAdjuster implements TargetAdjuster {
instance;
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
for (UUID playerId : game.getState().getPlayersInRange(ability.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;
}
String playerName = ability.isControlledBy(playerId) ? "your" : player.getName() + "'s";
FilterCreatureCard filter = new FilterCreatureCard("creature card in " + playerName + " graveyard");
filter.add(new OwnerIdPredicate(playerId));
ability.addTarget(new TargetCardInGraveyard(0, 1, filter));
}
}
}

View file

@ -1,7 +1,5 @@
package mage.cards.b; package mage.cards.b;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility; import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
@ -11,15 +9,10 @@ import mage.constants.CardType;
import mage.constants.SagaChapter; import mage.constants.SagaChapter;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.token.AvacynToken; import mage.game.permanent.token.AvacynToken;
import mage.players.Player;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -28,6 +21,11 @@ import java.util.UUID;
* @author TheElk801 * @author TheElk801
*/ */
public final class BattleAtTheHelvault extends CardImpl { public final class BattleAtTheHelvault extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("non-Saga, nonland permanent");
static {
filter.add(Predicates.not(CardType.LAND.getPredicate()));
filter.add(Predicates.not(SubType.SAGA.getPredicate()));
}
public BattleAtTheHelvault(UUID ownerId, CardSetInfo setInfo) { public BattleAtTheHelvault(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}{W}");
@ -45,7 +43,8 @@ public final class BattleAtTheHelvault extends CardImpl {
.setText("for each player, exile up to one target non-Saga, " + .setText("for each player, exile up to one target non-Saga, " +
"nonland permanent that player controls until {this} leaves the battlefield") "nonland permanent that player controls until {this} leaves the battlefield")
.setTargetPointer(new EachTargetPointer())); .setTargetPointer(new EachTargetPointer()));
ability.setTargetAdjuster(BattleAtTheHelvaultAdjuster.instance); ability.addTarget(new TargetPermanent(0, 1, filter));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
}); });
// III -- Create Avacyn, a legendary 8/8 white Angel creature token with flying, vigilance, and indestructible. // III -- Create Avacyn, a legendary 8/8 white Angel creature token with flying, vigilance, and indestructible.
@ -65,26 +64,3 @@ public final class BattleAtTheHelvault extends CardImpl {
return new BattleAtTheHelvault(this); return new BattleAtTheHelvault(this);
} }
} }
enum BattleAtTheHelvaultAdjuster implements TargetAdjuster {
instance;
private static final Predicate<MageObject> predicate = Predicates.not(SubType.SAGA.getPredicate());
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
for (UUID playerId : game.getState().getPlayersInRange(ability.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;
}
FilterPermanent filter = new FilterNonlandPermanent(
"non-Saga, nonland permanent "
+ (ability.isControlledBy(playerId) ? "you control" : "controlled by " + player.getName())
);
filter.add(predicate);
filter.add(new ControllerIdPredicate(playerId));
ability.addTarget(new TargetPermanent(0, 1, filter));
}
}
}

View file

@ -6,7 +6,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -24,7 +24,7 @@ public final class BlatantThievery extends CardImpl {
.setTargetPointer(new EachTargetPointer()) .setTargetPointer(new EachTargetPointer())
.setText("for each opponent, gain control of target permanent that player controls")); .setText("for each opponent, gain control of target permanent that player controls"));
this.getSpellAbility().addTarget(new TargetPermanent()); this.getSpellAbility().addTarget(new TargetPermanent());
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
private BlatantThievery(final BlatantThievery card) { private BlatantThievery(final BlatantThievery card) {

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetCardInExile; import mage.target.common.TargetCardInExile;
import mage.target.common.TargetNonlandPermanent; import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import mage.util.CardUtil; import mage.util.CardUtil;
@ -47,7 +47,7 @@ public final class BronzebeakForagers extends CardImpl {
.setText("for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield") .setText("for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield")
); );
etbAbility.addTarget(new TargetNonlandPermanent(0, 1)); etbAbility.addTarget(new TargetNonlandPermanent(0, 1));
etbAbility.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); etbAbility.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(etbAbility); this.addAbility(etbAbility);
// {X}{W}: Put target card with mana value X exiled with Bronzebeak Foragers into its owner's graveyard. // {X}{W}: Put target card with mana value X exiled with Bronzebeak Foragers into its owner's graveyard.

View file

@ -14,7 +14,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -34,7 +34,7 @@ public final class DecoyGambit extends CardImpl {
// then return that creature to its owner's hand unless its controller has you draw a card. // then return that creature to its owner's hand unless its controller has you draw a card.
this.getSpellAbility().addEffect(new DecoyGambitEffect()); this.getSpellAbility().addEffect(new DecoyGambitEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
private DecoyGambit(final DecoyGambit card) { private DecoyGambit(final DecoyGambit card) {

View file

@ -1,28 +1,25 @@
package mage.cards.d; package mage.cards.d;
import java.util.*;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.abilities.keyword.AffinityForArtifactsAbility; import mage.abilities.keyword.AffinityForArtifactsAbility;
import mage.abilities.keyword.CrewAbility; import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
/** /**
* *
* @author Jmlundeen * @author Jmlundeen
@ -43,7 +40,9 @@ public final class DemonicJunker extends CardImpl {
Ability ability = new EntersBattlefieldTriggeredAbility(new DemonicJunkerEffect() Ability ability = new EntersBattlefieldTriggeredAbility(new DemonicJunkerEffect()
.setTargetPointer(new EachTargetPointer())) .setTargetPointer(new EachTargetPointer()))
.setTriggerPhrase("When this Vehicle enters, "); .setTriggerPhrase("When this Vehicle enters, ");
this.addAbility(ability.setTargetAdjuster(DemonicJunkerAdjuster.instance)); ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
this.addAbility(ability);
// Crew 2 // Crew 2
this.addAbility(new CrewAbility(2)); this.addAbility(new CrewAbility(2));
@ -60,24 +59,6 @@ public final class DemonicJunker extends CardImpl {
} }
} }
enum DemonicJunkerAdjuster implements TargetAdjuster {
instance;
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
for (UUID playerId : game.getState().getPlayersInRange(ability.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;
}
String playerName = ability.isControlledBy(playerId) ? "you" : player.getName();
FilterCreaturePermanent filter = new FilterCreaturePermanent("creature controlled by " + playerName);
filter.add(new ControllerIdPredicate(playerId));
ability.addTarget(new TargetPermanent(0, 1, filter));
}
}
}
class DemonicJunkerEffect extends OneShotEffect { class DemonicJunkerEffect extends OneShotEffect {
DemonicJunkerEffect() { DemonicJunkerEffect() {

View file

@ -20,7 +20,7 @@ import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
@ -45,7 +45,7 @@ public final class DesecrateReality extends CardImpl {
.setTargetPointer(new EachTargetPointer()) .setTargetPointer(new EachTargetPointer())
.setText("for each opponent, exile up to one target permanent that player controls with an even mana value.")); .setText("for each opponent, exile up to one target permanent that player controls with an even mana value."));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, evenFilter)); this.getSpellAbility().addTarget(new TargetPermanent(0, 1, evenFilter));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
// Adamant -- If at least three colorless mana was spent to cast this spell, return a permanent card with an odd mana value from your graveyard to the battlefield. // Adamant -- If at least three colorless mana was spent to cast this spell, return a permanent card with an odd mana value from your graveyard to the battlefield.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect( this.getSpellAbility().addEffect(new ConditionalOneShotEffect(

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.common.TargetCardInOpponentsGraveyard; import mage.target.common.TargetCardInOpponentsGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import java.util.UUID; import java.util.UUID;
@ -44,7 +44,7 @@ public final class DiluvianPrimordial extends CardImpl {
// When Diluvian Primordial enters the battlefield, for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead. // When Diluvian Primordial enters the battlefield, for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead.
Ability ability = new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false); Ability ability = new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false);
ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filter)); ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filter));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster(true)); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(true, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -10,7 +10,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -28,7 +28,7 @@ public final class DismantlingWave extends CardImpl {
.setTargetPointer(new EachTargetPointer()) .setTargetPointer(new EachTargetPointer())
.setText("For each opponent, destroy up to one target artifact or enchantment that player controls.")); .setText("For each opponent, destroy up to one target artifact or enchantment that player controls."));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); this.getSpellAbility().addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
// Cycling {6}{W}{W} // Cycling {6}{W}{W}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{6}{W}{W}"))); this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{6}{W}{W}")));

View file

@ -20,7 +20,7 @@ import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
/** /**
* *
@ -34,7 +34,7 @@ public final class DisorientingChoice extends CardImpl {
// For each opponent, choose up to one target artifact or enchantment that player controls. For each permanent chosen this way, its controller may exile it. Then if one or more of the chosen permanents are still on the battlefield, you search your library for up to that many land cards, put them onto the battlefield tapped, then shuffle. // For each opponent, choose up to one target artifact or enchantment that player controls. For each permanent chosen this way, its controller may exile it. Then if one or more of the chosen permanents are still on the battlefield, you search your library for up to that many land cards, put them onto the battlefield tapped, then shuffle.
this.getSpellAbility().addEffect(new DisorientingChoiceEffect()); this.getSpellAbility().addEffect(new DisorientingChoiceEffect());
this.getSpellAbility().addTarget(new TargetPermanent(0,1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); this.getSpellAbility().addTarget(new TargetPermanent(0,1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
private DisorientingChoice(final DisorientingChoice card) { private DisorientingChoice(final DisorientingChoice card) {

View file

@ -10,7 +10,7 @@ import mage.constants.Outcome;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -26,7 +26,7 @@ public final class ElminstersSimulacrum extends CardImpl {
// For each opponent, you create a token that's a copy of up to one target creature that player controls. // For each opponent, you create a token that's a copy of up to one target creature that player controls.
this.getSpellAbility().addEffect(new ElminstersSimulacrumAdjusterEffect()); this.getSpellAbility().addEffect(new ElminstersSimulacrumAdjusterEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
private ElminstersSimulacrum(final ElminstersSimulacrum card) { private ElminstersSimulacrum(final ElminstersSimulacrum card) {

View file

@ -11,7 +11,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.target.common.TargetNonlandPermanent; import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -40,7 +40,7 @@ public final class EnigmaThief extends CardImpl {
.setTargetPointer(new EachTargetPointer()) .setTargetPointer(new EachTargetPointer())
.setText("for each opponent, return up to one target nonland permanent that player controls to its owner's hand")); .setText("for each opponent, return up to one target nonland permanent that player controls to its owner's hand"));
ability.addTarget(new TargetNonlandPermanent(0,1)); ability.addTarget(new TargetNonlandPermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -16,7 +16,7 @@ import mage.game.Game;
import mage.game.events.DefenderAttackedEvent; import mage.game.events.DefenderAttackedEvent;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTargets; import mage.target.targetpointer.FixedTargets;
import java.util.UUID; import java.util.UUID;
@ -37,7 +37,7 @@ public final class FrenziedGorespawn extends CardImpl {
Ability ability = new EntersBattlefieldTriggeredAbility(new GoadTargetEffect() Ability ability = new EntersBattlefieldTriggeredAbility(new GoadTargetEffect()
.setText("for each opponent, goad target creature that player controls")); .setText("for each opponent, goad target creature that player controls"));
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
// Whenever one or more creatures attack one of your opponents, those creatures gain menace until end of turn. // Whenever one or more creatures attack one of your opponents, those creatures gain menace until end of turn.

View file

@ -7,7 +7,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.target.common.TargetNonlandPermanent; import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -26,7 +26,7 @@ public final class GraspOfFate extends CardImpl {
.setText("for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield") .setText("for each opponent, exile up to one target nonland permanent that player controls until {this} leaves the battlefield")
); );
ability.addTarget(new TargetNonlandPermanent(0,1)); ability.addTarget(new TargetNonlandPermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,6 +1,5 @@
package mage.cards.g; package mage.cards.g;
import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.cards.*; import mage.cards.*;
@ -8,15 +7,13 @@ import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import mage.util.CardUtil; import mage.util.CardUtil;
@ -27,6 +24,15 @@ import java.util.*;
*/ */
public final class GuffRewritesHistory extends CardImpl { public final class GuffRewritesHistory extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("target nonenchantment, nonland permanent");
static {
filter.add(Predicates.and(
Predicates.not(CardType.ENCHANTMENT.getPredicate()),
Predicates.not(CardType.LAND.getPredicate())
));
}
public GuffRewritesHistory(UUID ownerId, CardSetInfo setInfo) { public GuffRewritesHistory(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}");
@ -41,8 +47,8 @@ public final class GuffRewritesHistory extends CardImpl {
+ "nonland card, then puts the rest on the bottom of their library in a random order. " + "nonland card, then puts the rest on the bottom of their library in a random order. "
+ "Each player may cast the nonland card they exiled without paying its mana cost.") + "Each player may cast the nonland card they exiled without paying its mana cost.")
); );
this.getSpellAbility().addTarget(new TargetPermanent(filter));
this.getSpellAbility().setTargetAdjuster(GuffRewritesHistoryAdjuster.instance); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
} }
private GuffRewritesHistory(final GuffRewritesHistory card) { private GuffRewritesHistory(final GuffRewritesHistory card) {
@ -55,33 +61,6 @@ public final class GuffRewritesHistory extends CardImpl {
} }
} }
enum GuffRewritesHistoryAdjuster implements TargetAdjuster {
instance;
private static final Predicate<MageObject> predicate =
Predicates.and(
Predicates.not(CardType.ENCHANTMENT.getPredicate()),
Predicates.not(CardType.LAND.getPredicate())
);
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
for (UUID playerId : game.getState().getPlayersInRange(ability.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;
}
FilterPermanent filter = new FilterPermanent(
"nonenchantment, nonland permanent "
+ (ability.isControlledBy(playerId) ? "you control" : "controlled by " + player.getName())
);
filter.add(predicate);
filter.add(new ControllerIdPredicate(playerId));
ability.addTarget(new TargetPermanent(filter));
}
}
}
class GuffRewritesHistoryEffect extends OneShotEffect { class GuffRewritesHistoryEffect extends OneShotEffect {
GuffRewritesHistoryEffect() { GuffRewritesHistoryEffect() {

View file

@ -10,7 +10,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -38,7 +38,7 @@ public final class HammersOfMoradin extends CardImpl {
.setText("for each opponent, tap up to one target creature that player controls") .setText("for each opponent, tap up to one target creature that player controls")
); );
ability.addTarget(new TargetCreaturePermanent(0,1)); ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -16,7 +16,7 @@ import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.Objects; import java.util.Objects;
@ -44,7 +44,7 @@ public final class HavocEater extends CardImpl {
.setTargetPointer(new EachTargetPointer())); .setTargetPointer(new EachTargetPointer()));
ability.addEffect(new HavocEaterEffect()); ability.addEffect(new HavocEaterEffect());
ability.addTarget(new TargetCreaturePermanent(0, 1)); ability.addTarget(new TargetCreaturePermanent(0, 1));
this.addAbility(ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster())); this.addAbility(ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true)));
} }
private HavocEater(final HavocEater card) { private HavocEater(final HavocEater card) {

View file

@ -17,7 +17,7 @@ import mage.constants.SuperType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -59,7 +59,7 @@ public final class HaythamKenway extends CardImpl {
.setText("for each opponent, exile up to one target creature that player controls until {this} leaves the battlefield") .setText("for each opponent, exile up to one target creature that player controls until {this} leaves the battlefield")
); );
ability2.addTarget(new TargetCreaturePermanent(0, 1)); ability2.addTarget(new TargetCreaturePermanent(0, 1));
ability2.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability2.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability2); this.addAbility(ability2);
} }

View file

@ -16,7 +16,7 @@ import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -42,7 +42,7 @@ public final class HideousTaskmaster extends CardImpl {
new GainControlTargetEffect(Duration.EndOfTurn).setTargetPointer(new EachTargetPointer()).setText( new GainControlTargetEffect(Duration.EndOfTurn).setTargetPointer(new EachTargetPointer()).setText(
"for each opponent, gain control of up to one target creature that player controls until end of turn")); "for each opponent, gain control of up to one target creature that player controls until end of turn"));
ability.addTarget(new TargetCreaturePermanent(0, 1)); ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
ability.addEffect( ability.addEffect(
new UntapTargetEffect().setTargetPointer(new EachTargetPointer()).setText("Untap those creatures")); new UntapTargetEffect().setTargetPointer(new EachTargetPointer()).setText("Untap those creatures"));
ability.addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn) ability.addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)

View file

@ -16,7 +16,7 @@ import mage.constants.SagaChapter;
import mage.constants.SubType; import mage.constants.SubType;
import mage.game.permanent.token.WraithToken; import mage.game.permanent.token.WraithToken;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -58,7 +58,7 @@ public final class InTheDarknessBindThem extends CardImpl {
ability.getEffects().setTargetPointer(new EachTargetPointer()); ability.getEffects().setTargetPointer(new EachTargetPointer());
ability.addTarget(new TargetCreaturePermanent(0,1)); ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
); );

View file

@ -11,7 +11,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -43,7 +43,7 @@ public final class JuvenileMistDragon extends CardImpl {
.setText("Each of those creatures doesn't untap during its controller's next untap step") .setText("Each of those creatures doesn't untap during its controller's next untap step")
); );
ability.addTarget(new TargetCreaturePermanent(0,1)); ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability.withFlavorWord("Confounding Clouds")); this.addAbility(ability.withFlavorWord("Confounding Clouds"));
} }

View file

@ -15,12 +15,9 @@ import mage.constants.SubType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.token.TreasureToken; import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -30,6 +27,16 @@ import java.util.UUID;
*/ */
public final class KitesailLarcenist extends CardImpl { public final class KitesailLarcenist extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("other target artifact or creature");
static {
filter.add(AnotherPredicate.instance);
filter.add(Predicates.or(
CardType.ARTIFACT.getPredicate(),
CardType.CREATURE.getPredicate()
));
}
public KitesailLarcenist(UUID ownerId, CardSetInfo setInfo) { public KitesailLarcenist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
@ -53,7 +60,9 @@ public final class KitesailLarcenist extends CardImpl {
"target artifact or creature that player controls. For as long as {this} " + "target artifact or creature that player controls. For as long as {this} " +
"remains on the battlefield, the chosen permanents become Treasure artifacts with " + "remains on the battlefield, the chosen permanents become Treasure artifacts with " +
"\"{T}, Sacrifice this artifact: Add one mana of any color\" and lose all other abilities")); "\"{T}, Sacrifice this artifact: Add one mana of any color\" and lose all other abilities"));
this.addAbility(ability.setTargetAdjuster(KitesailLarcenistAdjuster.instance)); ability.addTarget(new TargetPermanent(0, 1, filter));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
this.addAbility(ability);
} }
private KitesailLarcenist(final KitesailLarcenist card) { private KitesailLarcenist(final KitesailLarcenist card) {
@ -65,28 +74,3 @@ public final class KitesailLarcenist extends CardImpl {
return new KitesailLarcenist(this); return new KitesailLarcenist(this);
} }
} }
enum KitesailLarcenistAdjuster implements TargetAdjuster {
instance;
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
for (UUID playerId : game.getState().getPlayersInRange(ability.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;
}
FilterPermanent filter = new FilterPermanent(
"other artifact or creature " + (ability.isControlledBy(playerId) ? " you control" : player.getName() + " controls")
);
filter.add(new ControllerIdPredicate(playerId));
filter.add(AnotherPredicate.instance);
filter.add(Predicates.or(
CardType.ARTIFACT.getPredicate(),
CardType.CREATURE.getPredicate()
));
ability.addTarget(new TargetPermanent(0, 1, filter));
}
}
}

View file

@ -17,7 +17,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -41,7 +41,7 @@ public final class LuminatePrimordial extends CardImpl {
// that player controls and that player gains life equal to its power. // that player controls and that player gains life equal to its power.
Ability ability = new EntersBattlefieldTriggeredAbility(new LuminatePrimordialEffect(), false); Ability ability = new EntersBattlefieldTriggeredAbility(new LuminatePrimordialEffect(), false);
ability.addTarget(new TargetCreaturePermanent(0,1)); ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -15,7 +15,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.Target; import mage.target.Target;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import java.util.UUID; import java.util.UUID;
@ -32,7 +32,7 @@ public final class MassMutiny extends CardImpl {
// For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn. // For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn.
this.getSpellAbility().addEffect(new MassMutinyEffect()); this.getSpellAbility().addEffect(new MassMutinyEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
private MassMutiny(final MassMutiny card) { private MassMutiny(final MassMutiny card) {

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.Target; import mage.target.Target;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import java.util.UUID; import java.util.UUID;
@ -42,7 +42,7 @@ public final class MoltenPrimordial extends CardImpl {
// When Molten Primordial enters the battlefield, for each opponent, take control of up to one target creature that player controls until end of turn. Untap those creatures. They have haste until end of turn. // When Molten Primordial enters the battlefield, for each opponent, take control of up to one target creature that player controls until end of turn. Untap those creatures. They have haste until end of turn.
Ability ability = new EntersBattlefieldTriggeredAbility(new MoltenPrimordialEffect(), false); Ability ability = new EntersBattlefieldTriggeredAbility(new MoltenPrimordialEffect(), false);
ability.addTarget(new TargetCreaturePermanent(0,1)); ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -2,25 +2,21 @@ package mage.cards.n;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.combat.CantAttackYouUnlessPayAllEffect; import mage.abilities.effects.common.combat.CantAttackYouUnlessPayAllEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.target.common.TargetCreaturePermanent;
import mage.target.TargetPermanent; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetadjustment.TargetAdjuster;
import java.util.UUID; import java.util.UUID;
@ -42,7 +38,8 @@ public final class NilsDisciplineEnforcer extends CardImpl {
Ability ability = new BeginningOfEndStepTriggeredAbility( Ability ability = new BeginningOfEndStepTriggeredAbility(
new NilsDisciplineEnforcerCountersEffect() new NilsDisciplineEnforcerCountersEffect()
); );
ability.setTargetAdjuster(NilsDisciplineEnforcerAdjuster.instance); ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
this.addAbility(ability); this.addAbility(ability);
// Each creature with one or more counters on it can't attack you or planeswalkers you control unless its controller pays {X}, where X is the number of counters on that creature. // Each creature with one or more counters on it can't attack you or planeswalkers you control unless its controller pays {X}, where X is the number of counters on that creature.
@ -59,23 +56,6 @@ public final class NilsDisciplineEnforcer extends CardImpl {
} }
} }
enum NilsDisciplineEnforcerAdjuster implements TargetAdjuster {
instance;
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
game.getState().getPlayersInRange(ability.getControllerId(), game).forEach(playerId -> {
Player player = game.getPlayer(playerId);
if (!(player == null)) {
FilterPermanent filter = new FilterCreaturePermanent("creature controlled by " + player.getName());
filter.add(new ControllerIdPredicate(playerId));
ability.addTarget(new TargetPermanent(0, 1, filter));
}
});
}
}
class NilsDisciplineEnforcerCountersEffect extends OneShotEffect { class NilsDisciplineEnforcerCountersEffect extends OneShotEffect {
NilsDisciplineEnforcerCountersEffect() { NilsDisciplineEnforcerCountersEffect() {

View file

@ -19,7 +19,7 @@ import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -54,7 +54,7 @@ public final class OmegaHeartlessEvolution extends CardImpl {
.setText("Put X stun counters on each of those permanents")); .setText("Put X stun counters on each of those permanents"));
ability.addEffect(new GainLifeEffect(xValue).setText("and you gain X life, where X is the number of nonbasic lands you control")); ability.addEffect(new GainLifeEffect(xValue).setText("and you gain X life, where X is the number of nonbasic lands you control"));
ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_NON_LAND)); ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_PERMANENT_NON_LAND));
this.addAbility(ability.withFlavorWord("Wave Cannon").setTargetAdjuster(new ForEachOpponentTargetsAdjuster())); this.addAbility(ability.withFlavorWord("Wave Cannon").setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true)));
} }
private OmegaHeartlessEvolution(final OmegaHeartlessEvolution card) { private OmegaHeartlessEvolution(final OmegaHeartlessEvolution card) {

View file

@ -13,13 +13,12 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.UUID; import java.util.UUID;
@ -36,7 +35,7 @@ public final class OpenSeason extends CardImpl {
effect.setText("for each opponent, put a bounty counter on target creature that player controls"); effect.setText("for each opponent, put a bounty counter on target creature that player controls");
Ability ability = new EntersBattlefieldTriggeredAbility(effect); Ability ability = new EntersBattlefieldTriggeredAbility(effect);
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
// Creatures your opponent control with bounty counters on them can't activate abilities // Creatures your opponent control with bounty counters on them can't activate abilities

View file

@ -13,7 +13,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.target.common.TargetNonlandPermanent; import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
/** /**
@ -41,7 +41,7 @@ public final class RiptideGearhulk extends CardImpl {
.setTargetPointer(new EachTargetPointer()); .setTargetPointer(new EachTargetPointer());
Ability ability = new EntersBattlefieldTriggeredAbility(effect); Ability ability = new EntersBattlefieldTriggeredAbility(effect);
ability.addTarget(new TargetNonlandPermanent(0, 1)); ability.addTarget(new TargetNonlandPermanent(0, 1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.common.TargetCardInOpponentsGraveyard; import mage.target.common.TargetCardInOpponentsGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -45,7 +45,7 @@ public final class SepulchralPrimordial extends CardImpl {
// target creature card from that player's graveyard onto the battlefield under your control. // target creature card from that player's graveyard onto the battlefield under your control.
Ability ability = new EntersBattlefieldTriggeredAbility(new SepulchralPrimordialEffect(), false); Ability ability = new EntersBattlefieldTriggeredAbility(new SepulchralPrimordialEffect(), false);
ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filter)); ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filter));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster(true)); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(true, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -13,7 +13,7 @@ import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -44,7 +44,7 @@ public final class SontaranGeneral extends CardImpl {
ability.addEffect(new CantBlockTargetEffect(Duration.EndOfTurn).setTargetPointer(new EachTargetPointer()) ability.addEffect(new CantBlockTargetEffect(Duration.EndOfTurn).setTargetPointer(new EachTargetPointer())
.setText("Those creatures can't block this turn.")); .setText("Those creatures can't block this turn."));
ability.addTarget(new TargetCreaturePermanent(0, 1)); ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -20,7 +20,7 @@ import mage.game.permanent.Permanent;
import mage.target.Target; import mage.target.Target;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.UUID; import java.util.UUID;
@ -47,7 +47,7 @@ public final class SylvanPrimordial extends CardImpl {
// When Sylvan Primordial enters the battlefield, for each opponent, destroy target noncreature permanent that player controls. For each permanent destroyed this way, search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library. // When Sylvan Primordial enters the battlefield, for each opponent, destroy target noncreature permanent that player controls. For each permanent destroyed this way, search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library.
Ability ability = new EntersBattlefieldTriggeredAbility(new SylvanPrimordialEffect(), false); Ability ability = new EntersBattlefieldTriggeredAbility(new SylvanPrimordialEffect(), false);
ability.addTarget(new TargetPermanent(filter)); ability.addTarget(new TargetPermanent(filter));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -18,7 +18,7 @@ import mage.game.Game;
import mage.game.permanent.token.Demon33Token; import mage.game.permanent.token.Demon33Token;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetCardInOpponentsGraveyard; import mage.target.common.TargetCardInOpponentsGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import mage.util.CardUtil; import mage.util.CardUtil;
@ -50,7 +50,7 @@ public final class TashaTheWitchQueen extends CardImpl {
Ability ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1); Ability ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1);
ability.addEffect(new TashaTheWitchQueenExileEffect()); ability.addEffect(new TashaTheWitchQueenExileEffect());
ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filterCard)); ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filterCard));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster(true)); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(true, true));
this.addAbility(ability); this.addAbility(ability);
// 3: You may cast a spell from among cards in exile with page counters on them without paying its mana cost. // 3: You may cast a spell from among cards in exile with page counters on them without paying its mana cost.

View file

@ -9,7 +9,7 @@ import mage.constants.Duration;
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -32,7 +32,7 @@ public final class TemptedByTheOriq extends CardImpl {
.setText("for each opponent, gain control of up to one target creature " + .setText("for each opponent, gain control of up to one target creature " +
"or planeswalker that player controls with mana value 3 or less")); "or planeswalker that player controls with mana value 3 or less"));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter)); this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
private TemptedByTheOriq(final TemptedByTheOriq card) { private TemptedByTheOriq(final TemptedByTheOriq card) {

View file

@ -19,7 +19,7 @@ import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.game.permanent.token.TreasureToken; import mage.game.permanent.token.TreasureToken;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -52,7 +52,7 @@ public final class TheBalrogOfMoria extends CardImpl {
false false
); );
reflexiveAbility.addTarget(new TargetCreaturePermanent(0,1)); reflexiveAbility.addTarget(new TargetCreaturePermanent(0,1));
reflexiveAbility.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); reflexiveAbility.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(new DiesSourceTriggeredAbility( this.addAbility(new DiesSourceTriggeredAbility(
new DoWhenCostPaid( new DoWhenCostPaid(

View file

@ -22,7 +22,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.HashSet; import java.util.HashSet;
@ -58,7 +58,7 @@ public final class TheHorusHeresy extends CardImpl {
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, ability -> { sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, ability -> {
ability.addEffect(new TheHorusHeresyControlEffect()); ability.addEffect(new TheHorusHeresyControlEffect());
ability.addTarget(new TargetPermanent(0, 1, filterNonlegendary)); ability.addTarget(new TargetPermanent(0, 1, filterNonlegendary));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}); });
// II -- Draw a card for each creature you control but don't own. // II -- Draw a card for each creature you control but don't own.

View file

@ -12,7 +12,7 @@ import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetArtifactPermanent; import mage.target.common.TargetArtifactPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.UUID; import java.util.UUID;
@ -47,7 +47,7 @@ public final class ThePartingOfTheWays extends CardImpl {
ability.addEffect(new DestroyTargetEffect() ability.addEffect(new DestroyTargetEffect()
.setText("For each opponent, destroy up to one target artifact that player controls")); .setText("For each opponent, destroy up to one target artifact that player controls"));
ability.addTarget(new TargetArtifactPermanent(0, 1)); ability.addTarget(new TargetArtifactPermanent(0, 1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
); );
this.addAbility(sagaAbility); this.addAbility(sagaAbility);

View file

@ -17,7 +17,7 @@ import mage.filter.StaticFilters;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetCreatureOrPlaneswalker; import mage.target.common.TargetCreatureOrPlaneswalker;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.Collection; import java.util.Collection;
@ -47,7 +47,7 @@ public final class TheTrueScriptures extends CardImpl {
ability.addEffect(new DestroyTargetEffect().setTargetPointer(new EachTargetPointer()) ability.addEffect(new DestroyTargetEffect().setTargetPointer(new EachTargetPointer())
.setText("for each opponent, destroy up to one target creature or planeswalker that player controls")); .setText("for each opponent, destroy up to one target creature or planeswalker that player controls"));
ability.addTarget(new TargetCreatureOrPlaneswalker(0,1)); ability.addTarget(new TargetCreatureOrPlaneswalker(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
); );

View file

@ -17,7 +17,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -47,7 +47,7 @@ public final class TolarianContempt extends CardImpl {
// At the beginning of your end step, for each opponent, choose up to one target creature they control with a rejection counter on it. That creature's owner puts it on the top or bottom of their library. // At the beginning of your end step, for each opponent, choose up to one target creature they control with a rejection counter on it. That creature's owner puts it on the top or bottom of their library.
Ability ability = new BeginningOfEndStepTriggeredAbility(new TolarianContemptEffect()); Ability ability = new BeginningOfEndStepTriggeredAbility(new TolarianContemptEffect());
ability.addTarget(new TargetPermanent(0,1, filterRejection)); ability.addTarget(new TargetPermanent(0,1, filterRejection));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,11 +1,11 @@
package mage.cards.t; package mage.cards.t;
import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -23,9 +23,10 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.players.PlayerList; import mage.players.PlayerList;
import mage.target.Target;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster; import mage.target.common.TargetLandPermanent;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import java.util.UUID; import java.util.UUID;
@ -39,8 +40,12 @@ public final class TurfWar extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}");
// When Turf War enters the battlefield, for each player, put a contested counter on target land that player controls. // When Turf War enters the battlefield, for each player, put a contested counter on target land that player controls.
this.addAbility(new EntersBattlefieldTriggeredAbility(new TurfWarCounterEffect()) Ability ability = new EntersBattlefieldTriggeredAbility(
.setTargetAdjuster(TurfWarAdjuster.instance)); new AddCountersTargetEffect(CounterType.CONTESTED.createInstance()).setTargetPointer(new EachTargetPointer())
.setText("for each player, put a contested counter on target land that player controls"));
ability.addTarget(new TargetLandPermanent());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
this.addAbility(ability);
// Whenever a creature deals combat damage to a player, if that player controls one or more lands with contested counters on them, that creature's controller gains control of one of those lands of their choice and untaps it. // Whenever a creature deals combat damage to a player, if that player controls one or more lands with contested counters on them, that creature's controller gains control of one of those lands of their choice and untaps it.
this.addAbility(new TurfWarTriggeredAbility()); this.addAbility(new TurfWarTriggeredAbility());
@ -56,62 +61,6 @@ public final class TurfWar extends CardImpl {
} }
} }
class TurfWarCounterEffect extends OneShotEffect {
TurfWarCounterEffect() {
super(Outcome.Benefit);
this.staticText = "for each player, put a contested counter on target land that player controls";
}
private TurfWarCounterEffect(final TurfWarCounterEffect effect) {
super(effect);
}
@Override
public TurfWarCounterEffect copy() {
return new TurfWarCounterEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = game.getObject(source);
if (controller == null || sourceObject == null) {
return false;
}
boolean success = false;
for (Target target : source.getTargets()) {
for (UUID uuid : target.getTargets()) {
Permanent permanent = game.getPermanent(uuid);
if (permanent != null && permanent.addCounters(CounterType.CONTESTED.createInstance(), source, game)) {
game.informPlayers(sourceObject.getLogName() + ": " + controller.getLogName()
+ " puts a contested counter on " + permanent.getLogName());
success = true;
}
}
}
return success;
}
}
enum TurfWarAdjuster implements TargetAdjuster {
instance;
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
for (UUID playerId : game.getState().getPlayersInRange(ability.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;
}
FilterLandPermanent filter = new FilterLandPermanent("land controlled by " + player.getName());
filter.add(new ControllerIdPredicate(playerId));
ability.addTarget(new TargetPermanent(filter));
}
}
}
class TurfWarTriggeredAbility extends TriggeredAbilityImpl { class TurfWarTriggeredAbility extends TriggeredAbilityImpl {
public TurfWarTriggeredAbility() { public TurfWarTriggeredAbility() {

View file

@ -1,30 +1,25 @@
package mage.cards.v; package mage.cards.v;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.cards.CardsImpl; import mage.cards.CardsImpl;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.Target; import mage.target.Target;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/** /**
* *
@ -45,7 +40,10 @@ public final class VaevictisAsmadiTheDire extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// Whenever Vaevictis Asmadi, the Dire attacks, for each player, choose target permanent that player controls. Those players sacrifice those permanents. Each player who sacrificed a permanent this way reveals the top card of their library, then puts it onto the battlefield if it's a permanent card. // Whenever Vaevictis Asmadi, the Dire attacks, for each player, choose target permanent that player controls. Those players sacrifice those permanents. Each player who sacrificed a permanent this way reveals the top card of their library, then puts it onto the battlefield if it's a permanent card.
this.addAbility(new VaevictisAsmadiTheDireTriggeredAbility()); Ability ability = new AttacksTriggeredAbility(new VaevictisAsmadiTheDireEffect());
ability.addTarget(new TargetPermanent());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
this.addAbility(ability);
} }
private VaevictisAsmadiTheDire(final VaevictisAsmadiTheDire card) { private VaevictisAsmadiTheDire(final VaevictisAsmadiTheDire card) {
@ -58,48 +56,6 @@ public final class VaevictisAsmadiTheDire extends CardImpl {
} }
} }
class VaevictisAsmadiTheDireTriggeredAbility extends TriggeredAbilityImpl {
VaevictisAsmadiTheDireTriggeredAbility() {
super(Zone.BATTLEFIELD, new VaevictisAsmadiTheDireEffect(), false);
setTriggerPhrase("Whenever {this} attacks, ");
}
private VaevictisAsmadiTheDireTriggeredAbility(final VaevictisAsmadiTheDireTriggeredAbility ability) {
super(ability);
}
@Override
public VaevictisAsmadiTheDireTriggeredAbility copy() {
return new VaevictisAsmadiTheDireTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (!game.getCombat().getAttackers().contains(this.getSourceId())) {
return false;
}
this.getTargets().clear();
for (UUID playerId : game.getState().getPlayerList(this.getControllerId())) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;
}
FilterPermanent filter = new FilterPermanent("permanent controlled by " + player.getName());
filter.add(new ControllerIdPredicate(playerId));
TargetPermanent target = new TargetPermanent(filter);
this.addTarget(target);
}
return true;
}
}
class VaevictisAsmadiTheDireEffect extends OneShotEffect { class VaevictisAsmadiTheDireEffect extends OneShotEffect {
VaevictisAsmadiTheDireEffect() { VaevictisAsmadiTheDireEffect() {

View file

@ -24,7 +24,7 @@ import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.permanent.token.custom.CreatureToken; import mage.game.permanent.token.custom.CreatureToken;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.common.TargetNonlandPermanent; import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -57,7 +57,7 @@ public final class VronosMaskedInquisitor extends CardImpl {
LoyaltyAbility ability2 = new LoyaltyAbility(new ReturnToHandTargetEffect().setTargetPointer(new EachTargetPointer()) LoyaltyAbility ability2 = new LoyaltyAbility(new ReturnToHandTargetEffect().setTargetPointer(new EachTargetPointer())
.setText("for each opponent, return up to one target nonland permanent that player controls to its owner's hand"), -2); .setText("for each opponent, return up to one target nonland permanent that player controls to its owner's hand"), -2);
ability2.addTarget(new TargetNonlandPermanent(0,1)); ability2.addTarget(new TargetNonlandPermanent(0,1));
ability2.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability2.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability2); this.addAbility(ability2);
// 7: Target artifact you control becomes a 9/9 Construct artifact creature and gains vigilance, indestructible, and "This creature can't be blocked." // 7: Target artifact you control becomes a 9/9 Construct artifact creature and gains vigilance, indestructible, and "This creature can't be blocked."

View file

@ -21,7 +21,7 @@ import mage.game.Game;
import mage.game.permanent.token.DinosaurToken; import mage.game.permanent.token.DinosaurToken;
import mage.game.permanent.token.custom.CreatureToken; import mage.game.permanent.token.custom.CreatureToken;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
@ -64,7 +64,7 @@ public final class WelcomeTo extends CardImpl {
"a 0/4 Wall artifact creature with defender for as long as you control this Saga.")); "a 0/4 Wall artifact creature with defender for as long as you control this Saga."));
ability.getEffects().setTargetPointer(new EachTargetPointer()); ability.getEffects().setTargetPointer(new EachTargetPointer());
ability.addTarget(new TargetPermanent(0, 1, filterNoncreatureArtifact)); ability.addTarget(new TargetPermanent(0, 1, filterNoncreatureArtifact));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}); });
// II -- Create a 3/3 green Dinosaur creature token with trample. It gains haste until end of turn. // II -- Create a 3/3 green Dinosaur creature token with trample. It gains haste until end of turn.

View file

@ -5,7 +5,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.target.common.TargetNonlandPermanent; import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster; import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer; import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID; import java.util.UUID;
@ -24,7 +24,7 @@ public final class WindgracesJudgment extends CardImpl {
.setText("For any number of opponents, destroy target nonland permanent that player controls") .setText("For any number of opponents, destroy target nonland permanent that player controls")
); );
this.getSpellAbility().addTarget(new TargetNonlandPermanent(0, 1)); this.getSpellAbility().addTarget(new TargetNonlandPermanent(0, 1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster()); this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
} }
private WindgracesJudgment(final WindgracesJudgment card) { private WindgracesJudgment(final WindgracesJudgment card) {

View file

@ -11,24 +11,24 @@ import mage.target.TargetCard;
import mage.util.CardUtil; import mage.util.CardUtil;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Stream;
/** /**
* @author notgreat * @author notgreat
*/ */
public class ForEachOpponentTargetsAdjuster extends GenericTargetAdjuster { public class ForEachPlayerTargetsAdjuster extends GenericTargetAdjuster {
private final boolean owner; private final boolean owner;
private final boolean onlyOpponents; //Makes this a "For Each Opponent" adjuster
/** /**
* Duplicates the permanent target for each opponent. * Duplicates the permanent target for each player (or opponent).
* Filtering of permanent's controllers will be handled inside, so * Filtering of permanent's controllers will be handled inside, so
* do not pass a blueprint target with a controller restriction filter/predicate. * do not pass a blueprint target with a controller restriction filter/predicate.
*/ */
public ForEachOpponentTargetsAdjuster() {
this(false);
}
public ForEachOpponentTargetsAdjuster(boolean owner) { public ForEachPlayerTargetsAdjuster(boolean owner, boolean onlyOpponents) {
this.owner = owner; this.owner = owner;
this.onlyOpponents = onlyOpponents;
} }
@Override @Override
@ -43,21 +43,27 @@ public class ForEachOpponentTargetsAdjuster extends GenericTargetAdjuster {
@Override @Override
public void adjustTargets(Ability ability, Game game) { public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear(); ability.getTargets().clear();
for (UUID opponentId : game.getOpponents(ability.getControllerId())) { Stream<UUID> ids;
Player opponent = game.getPlayer(opponentId); if (onlyOpponents) {
ids = game.getOpponents(ability.getControllerId()).stream();
} else {
ids = game.getState().getPlayersInRange(ability.getControllerId(), game).stream();
}
ids.forEach( id -> {
Player opponent = game.getPlayer(id);
if (opponent == null) { if (opponent == null) {
continue; return;
} }
Target newTarget = blueprintTarget.copy(); Target newTarget = blueprintTarget.copy();
Filter filter = newTarget.getFilter(); Filter filter = newTarget.getFilter();
if (owner) { if (owner) {
filter.add(new OwnerIdPredicate(opponentId)); filter.add(new OwnerIdPredicate(id));
newTarget.withTargetName(filter.getMessage() + " (owned by " + opponent.getLogName() + ")"); newTarget.withTargetName(filter.getMessage() + " (owned by " + opponent.getLogName() + ")");
} else { } else {
filter.add(new ControllerIdPredicate(opponentId)); filter.add(new ControllerIdPredicate(id));
newTarget.withTargetName(filter.getMessage() + " (controlled by " + opponent.getLogName() + ")"); newTarget.withTargetName(filter.getMessage() + " (controlled by " + opponent.getLogName() + ")");
} }
ability.addTarget(newTarget); ability.addTarget(newTarget);
} });
} }
} }