Additional fixes for target adjusters, part of #12528 (#12550)

* Add support for non-permanent targets to EachOpponentPermanentTargetsAdjuster, add ownership check
* Rename EachOpponentPermanentTargetsAdjuster to ForEachOpponentTargetsAdjuster
This commit is contained in:
ssk97 2024-07-02 00:57:56 -07:00 committed by GitHub
parent 7cb669603f
commit 74804a468e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 91 additions and 129 deletions

View file

@ -7,6 +7,7 @@ import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetCard;
import mage.target.targetpointer.FirstTargetPointer;
import mage.util.CardUtil;
@ -35,6 +36,9 @@ public class DamagedPlayerControlsTargetAdjuster extends GenericTargetAdjuster {
@Override
public void addDefaultTargets(Ability ability) {
super.addDefaultTargets(ability);
if (blueprintTarget instanceof TargetCard && !owner) {
throw new IllegalArgumentException("DamagedPlayerControlsTargetAdjuster has TargetCard but checking for Controller instead of Owner - " + blueprintTarget);
}
CardUtil.AssertNoControllerOwnerPredicates(blueprintTarget);
}

View file

@ -2,11 +2,12 @@ package mage.target.targetadjustment;
import mage.abilities.Ability;
import mage.filter.Filter;
import mage.filter.predicate.card.OwnerIdPredicate;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.TargetCard;
import mage.util.CardUtil;
import java.util.UUID;
@ -14,21 +15,27 @@ import java.util.UUID;
/**
* @author notgreat
*/
public class EachOpponentPermanentTargetsAdjuster extends GenericTargetAdjuster {
public class ForEachOpponentTargetsAdjuster extends GenericTargetAdjuster {
private final boolean owner;
/**
* Duplicates the permanent target for each opponent.
* Filtering of permanent's controllers will be handled inside, so
* do not pass a blueprint target with a controller restriction filter/predicate.
*/
public EachOpponentPermanentTargetsAdjuster() {
public ForEachOpponentTargetsAdjuster() {
this(false);
}
public ForEachOpponentTargetsAdjuster(boolean owner) {
this.owner = owner;
}
@Override
public void addDefaultTargets(Ability ability) {
super.addDefaultTargets(ability);
if (!(blueprintTarget instanceof TargetPermanent)) {
throw new IllegalArgumentException("EachOpponentPermanentTargetsAdjuster must use Permanent target - " + blueprintTarget);
if (blueprintTarget instanceof TargetCard && !owner) {
throw new IllegalArgumentException("EachOpponentPermanentTargetsAdjuster has TargetCard but checking for Controller instead of Owner - " + blueprintTarget);
}
CardUtil.AssertNoControllerOwnerPredicates(blueprintTarget);
}
@ -43,8 +50,13 @@ public class EachOpponentPermanentTargetsAdjuster extends GenericTargetAdjuster
}
Target newTarget = blueprintTarget.copy();
Filter filter = newTarget.getFilter();
filter.add(new ControllerIdPredicate(opponentId));
newTarget.withTargetName(filter.getMessage() + " controlled by " + opponent.getLogName());
if (owner) {
filter.add(new OwnerIdPredicate(opponentId));
newTarget.withTargetName(filter.getMessage() + " (owned by " + opponent.getLogName() + ")");
} else {
filter.add(new ControllerIdPredicate(opponentId));
newTarget.withTargetName(filter.getMessage() + " (controlled by " + opponent.getLogName() + ")");
}
ability.addTarget(newTarget);
}
}