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;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect;
import mage.abilities.keyword.DelveAbility;
@ -11,14 +8,13 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.card.OwnerIdPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.filter.StaticFilters;
import mage.target.common.TargetCardInGraveyard;
import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
/**
*
* @author Jmlundeen
@ -39,7 +35,8 @@ public final class AfterlifeFromTheLoam extends CardImpl {
this.getSpellAbility().addEffect(new AddCardSubTypeTargetEffect(SubType.ZOMBIE, Duration.WhileOnBattlefield)
.setTargetPointer(new EachTargetPointer())
.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) {
@ -51,22 +48,3 @@ public final class AfterlifeFromTheLoam extends CardImpl {
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;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
@ -11,15 +9,10 @@ import mage.constants.CardType;
import mage.constants.SagaChapter;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.token.AvacynToken;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -28,6 +21,11 @@ import java.util.UUID;
* @author TheElk801
*/
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) {
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, " +
"nonland permanent that player controls until {this} leaves the battlefield")
.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.
@ -65,26 +64,3 @@ public final class BattleAtTheHelvault extends CardImpl {
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.Duration;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -24,7 +24,7 @@ public final class BlatantThievery extends CardImpl {
.setTargetPointer(new EachTargetPointer())
.setText("for each opponent, gain control of target permanent that player controls"));
this.getSpellAbility().addTarget(new TargetPermanent());
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}
private BlatantThievery(final BlatantThievery card) {

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInExile;
import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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")
);
etbAbility.addTarget(new TargetNonlandPermanent(0, 1));
etbAbility.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
etbAbility.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(etbAbility);
// {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.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.Collection;
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.
this.getSpellAbility().addEffect(new DecoyGambitEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}
private DecoyGambit(final DecoyGambit card) {

View file

@ -1,28 +1,25 @@
package mage.cards.d;
import java.util.*;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.abilities.keyword.AffinityForArtifactsAbility;
import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.counters.CounterType;
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.targetadjustment.TargetAdjuster;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
/**
*
* @author Jmlundeen
@ -43,7 +40,9 @@ public final class DemonicJunker extends CardImpl {
Ability ability = new EntersBattlefieldTriggeredAbility(new DemonicJunkerEffect()
.setTargetPointer(new EachTargetPointer()))
.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
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 {
DemonicJunkerEffect() {

View file

@ -20,7 +20,7 @@ import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import mage.target.targetpointer.FixedTarget;
@ -45,7 +45,7 @@ public final class DesecrateReality extends CardImpl {
.setTargetPointer(new EachTargetPointer())
.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().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.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInOpponentsGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTarget;
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.
Ability ability = new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false);
ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filter));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster(true));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(true, true));
this.addAbility(ability);
}

View file

@ -10,7 +10,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -28,7 +28,7 @@ public final class DismantlingWave extends CardImpl {
.setTargetPointer(new EachTargetPointer())
.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().setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
// Cycling {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.TargetPermanent;
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.
this.getSpellAbility().addEffect(new DisorientingChoiceEffect());
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) {

View file

@ -10,7 +10,7 @@ import mage.constants.Outcome;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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.
this.getSpellAbility().addEffect(new ElminstersSimulacrumAdjusterEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}
private ElminstersSimulacrum(final ElminstersSimulacrum card) {

View file

@ -11,7 +11,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -40,7 +40,7 @@ public final class EnigmaThief extends CardImpl {
.setTargetPointer(new EachTargetPointer())
.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.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
}

View file

@ -16,7 +16,7 @@ import mage.game.Game;
import mage.game.events.DefenderAttackedEvent;
import mage.game.events.GameEvent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTargets;
import java.util.UUID;
@ -37,7 +37,7 @@ public final class FrenziedGorespawn extends CardImpl {
Ability ability = new EntersBattlefieldTriggeredAbility(new GoadTargetEffect()
.setText("for each opponent, goad target creature that player controls"));
ability.addTarget(new TargetCreaturePermanent());
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
// 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.constants.CardType;
import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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")
);
ability.addTarget(new TargetNonlandPermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
}

View file

@ -1,6 +1,5 @@
package mage.cards.g;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.*;
@ -8,15 +7,13 @@ import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import mage.util.CardUtil;
@ -27,6 +24,15 @@ import java.util.*;
*/
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) {
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. "
+ "Each player may cast the nonland card they exiled without paying its mana cost.")
);
this.getSpellAbility().setTargetAdjuster(GuffRewritesHistoryAdjuster.instance);
this.getSpellAbility().addTarget(new TargetPermanent(filter));
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
}
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 {
GuffRewritesHistoryEffect() {

View file

@ -10,7 +10,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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")
);
ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
}

View file

@ -16,7 +16,7 @@ import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.Objects;
@ -44,7 +44,7 @@ public final class HavocEater extends CardImpl {
.setTargetPointer(new EachTargetPointer()));
ability.addEffect(new HavocEaterEffect());
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) {

View file

@ -17,7 +17,7 @@ import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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")
);
ability2.addTarget(new TargetCreaturePermanent(0, 1));
ability2.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability2.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability2);
}

View file

@ -16,7 +16,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -42,7 +42,7 @@ public final class HideousTaskmaster extends CardImpl {
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"));
ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
ability.addEffect(
new UntapTargetEffect().setTargetPointer(new EachTargetPointer()).setText("Untap those creatures"));
ability.addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)

View file

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

View file

@ -15,12 +15,9 @@ import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -30,6 +27,16 @@ import java.util.UUID;
*/
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) {
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} " +
"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"));
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) {
@ -65,28 +74,3 @@ public final class KitesailLarcenist extends CardImpl {
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.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.*;
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.
Ability ability = new EntersBattlefieldTriggeredAbility(new LuminatePrimordialEffect(), false);
ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
}

View file

@ -15,7 +15,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTarget;
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.
this.getSpellAbility().addEffect(new MassMutinyEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}
private MassMutiny(final MassMutiny card) {

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.FixedTarget;
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.
Ability ability = new EntersBattlefieldTriggeredAbility(new MoltenPrimordialEffect(), false);
ability.addTarget(new TargetCreaturePermanent(0,1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
}

View file

@ -2,25 +2,21 @@ package mage.cards.n;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.combat.CantAttackYouUnlessPayAllEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
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.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.TargetAdjuster;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.UUID;
@ -42,7 +38,8 @@ public final class NilsDisciplineEnforcer extends CardImpl {
Ability ability = new BeginningOfEndStepTriggeredAbility(
new NilsDisciplineEnforcerCountersEffect()
);
ability.setTargetAdjuster(NilsDisciplineEnforcerAdjuster.instance);
ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, false));
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.
@ -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 {
NilsDisciplineEnforcerCountersEffect() {

View file

@ -19,7 +19,7 @@ import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledLandPermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -54,7 +54,7 @@ public final class OmegaHeartlessEvolution extends CardImpl {
.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.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) {

View file

@ -13,13 +13,12 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
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");
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
ability.addTarget(new TargetCreaturePermanent());
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
// 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.constants.CardType;
import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
/**
@ -41,7 +41,7 @@ public final class RiptideGearhulk extends CardImpl {
.setTargetPointer(new EachTargetPointer());
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
ability.addTarget(new TargetNonlandPermanent(0, 1));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
}

View file

@ -19,7 +19,7 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInOpponentsGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import java.util.HashSet;
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.
Ability ability = new EntersBattlefieldTriggeredAbility(new SepulchralPrimordialEffect(), false);
ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filter));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster(true));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(true, true));
this.addAbility(ability);
}

View file

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

View file

@ -20,7 +20,7 @@ import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
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.
Ability ability = new EntersBattlefieldTriggeredAbility(new SylvanPrimordialEffect(), false);
ability.addTarget(new TargetPermanent(filter));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
this.addAbility(ability);
}

View file

@ -18,7 +18,7 @@ import mage.game.Game;
import mage.game.permanent.token.Demon33Token;
import mage.players.Player;
import mage.target.common.TargetCardInOpponentsGraveyard;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import mage.util.CardUtil;
@ -50,7 +50,7 @@ public final class TashaTheWitchQueen extends CardImpl {
Ability ability = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1);
ability.addEffect(new TashaTheWitchQueenExileEffect());
ability.addTarget(new TargetCardInOpponentsGraveyard(0, 1, filterCard));
ability.setTargetAdjuster(new ForEachOpponentTargetsAdjuster(true));
ability.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(true, true));
this.addAbility(ability);
// 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.predicate.mageobject.ManaValuePredicate;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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 " +
"or planeswalker that player controls with mana value 3 or less"));
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) {

View file

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

View file

@ -22,7 +22,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.HashSet;
@ -58,7 +58,7 @@ public final class TheHorusHeresy extends CardImpl {
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, ability -> {
ability.addEffect(new TheHorusHeresyControlEffect());
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.

View file

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

View file

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

View file

@ -1,11 +1,11 @@
package mage.cards.t;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -23,9 +23,10 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.players.PlayerList;
import mage.target.Target;
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 java.util.UUID;
@ -39,8 +40,12 @@ public final class TurfWar extends CardImpl {
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.
this.addAbility(new EntersBattlefieldTriggeredAbility(new TurfWarCounterEffect())
.setTargetAdjuster(TurfWarAdjuster.instance));
Ability ability = new EntersBattlefieldTriggeredAbility(
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.
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 {
public TurfWarTriggeredAbility() {

View file

@ -1,30 +1,25 @@
package mage.cards.v;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
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());
// 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) {
@ -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 {
VaevictisAsmadiTheDireEffect() {

View file

@ -24,7 +24,7 @@ import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.permanent.token.custom.CreatureToken;
import mage.target.TargetPermanent;
import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
import java.util.UUID;
@ -57,7 +57,7 @@ public final class VronosMaskedInquisitor extends CardImpl {
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);
ability2.addTarget(new TargetNonlandPermanent(0,1));
ability2.setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
ability2.setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
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."

View file

@ -21,7 +21,7 @@ import mage.game.Game;
import mage.game.permanent.token.DinosaurToken;
import mage.game.permanent.token.custom.CreatureToken;
import mage.target.TargetPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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."));
ability.getEffects().setTargetPointer(new EachTargetPointer());
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.

View file

@ -5,7 +5,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.common.TargetNonlandPermanent;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
import mage.target.targetadjustment.ForEachPlayerTargetsAdjuster;
import mage.target.targetpointer.EachTargetPointer;
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")
);
this.getSpellAbility().addTarget(new TargetNonlandPermanent(0, 1));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
this.getSpellAbility().setTargetAdjuster(new ForEachPlayerTargetsAdjuster(false, true));
}
private WindgracesJudgment(final WindgracesJudgment card) {

View file

@ -11,24 +11,24 @@ import mage.target.TargetCard;
import mage.util.CardUtil;
import java.util.UUID;
import java.util.stream.Stream;
/**
* @author notgreat
*/
public class ForEachOpponentTargetsAdjuster extends GenericTargetAdjuster {
public class ForEachPlayerTargetsAdjuster extends GenericTargetAdjuster {
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
* 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.onlyOpponents = onlyOpponents;
}
@Override
@ -43,21 +43,27 @@ public class ForEachOpponentTargetsAdjuster extends GenericTargetAdjuster {
@Override
public void adjustTargets(Ability ability, Game game) {
ability.getTargets().clear();
for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
Player opponent = game.getPlayer(opponentId);
Stream<UUID> ids;
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) {
continue;
return;
}
Target newTarget = blueprintTarget.copy();
Filter filter = newTarget.getFilter();
if (owner) {
filter.add(new OwnerIdPredicate(opponentId));
filter.add(new OwnerIdPredicate(id));
newTarget.withTargetName(filter.getMessage() + " (owned by " + opponent.getLogName() + ")");
} else {
filter.add(new ControllerIdPredicate(opponentId));
filter.add(new ControllerIdPredicate(id));
newTarget.withTargetName(filter.getMessage() + " (controlled by " + opponent.getLogName() + ")");
}
ability.addTarget(newTarget);
}
});
}
}