Merge branch 'planeswalkerErrata' into master

This commit is contained in:
theelk801 2018-04-20 16:21:44 -04:00 committed by GitHub
commit 95d2721421
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
754 changed files with 3085 additions and 3051 deletions

View file

@ -79,7 +79,7 @@ public class ContinuousEffects implements Serializable {
private final Map<AsThoughEffectType, ContinuousEffectsList<AsThoughEffect>> asThoughEffectsMap = new EnumMap<>(AsThoughEffectType.class);
public final List<ContinuousEffectsList<?>> allEffectsLists = new ArrayList<>();
private final ApplyCountersEffect applyCounters;
private final PlaneswalkerRedirectionEffect planeswalkerRedirectionEffect;
// private final PlaneswalkerRedirectionEffect planeswalkerRedirectionEffect;
private final AuraReplacementEffect auraReplacementEffect;
private final List<ContinuousEffect> previous = new ArrayList<>();
@ -89,14 +89,14 @@ public class ContinuousEffects implements Serializable {
public ContinuousEffects() {
applyCounters = new ApplyCountersEffect();
planeswalkerRedirectionEffect = new PlaneswalkerRedirectionEffect();
// planeswalkerRedirectionEffect = new PlaneswalkerRedirectionEffect();
auraReplacementEffect = new AuraReplacementEffect();
collectAllEffects();
}
public ContinuousEffects(final ContinuousEffects effect) {
this.applyCounters = effect.applyCounters.copy();
this.planeswalkerRedirectionEffect = effect.planeswalkerRedirectionEffect.copy();
// this.planeswalkerRedirectionEffect = effect.planeswalkerRedirectionEffect.copy();
this.auraReplacementEffect = effect.auraReplacementEffect.copy();
layeredEffects = effect.layeredEffects.copy();
continuousRuleModifyingEffects = effect.continuousRuleModifyingEffects.copy();
@ -339,9 +339,9 @@ public class ContinuousEffects implements Serializable {
*/
private Map<ReplacementEffect, Set<Ability>> getApplicableReplacementEffects(GameEvent event, Game game) {
Map<ReplacementEffect, Set<Ability>> replaceEffects = new HashMap<>();
if (planeswalkerRedirectionEffect.checksEventType(event, game) && planeswalkerRedirectionEffect.applies(event, null, game)) {
replaceEffects.put(planeswalkerRedirectionEffect, null);
}
// if (planeswalkerRedirectionEffect.checksEventType(event, game) && planeswalkerRedirectionEffect.applies(event, null, game)) {
// replaceEffects.put(planeswalkerRedirectionEffect, null);
// }
if (auraReplacementEffect.checksEventType(event, game) && auraReplacementEffect.applies(event, null, game)) {
replaceEffects.put(auraReplacementEffect, null);
}
@ -1235,8 +1235,8 @@ public class ContinuousEffects implements Serializable {
}
}
} else {
if (!(entry.getKey() instanceof AuraReplacementEffect)
&& !(entry.getKey() instanceof PlaneswalkerRedirectionEffect)) {
if (!(entry.getKey() instanceof AuraReplacementEffect)) {
// && !(entry.getKey() instanceof PlaneswalkerRedirectionEffect)) {
logger.error("Replacement effect without ability: " + entry.getKey().toString());
}
}

View file

@ -43,9 +43,12 @@ import mage.players.Player;
import mage.target.TargetPermanent;
/**
* NOTE: This is no longer used, but I'm leaving it in because why not
* -TheElk801
*
* @author BetaSteward_at_googlemail.com
*/
@Deprecated
public class PlaneswalkerRedirectionEffect extends RedirectionEffect {
public PlaneswalkerRedirectionEffect() {

View file

@ -33,6 +33,7 @@ import mage.abilities.effects.OneShotEffect;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
*
@ -63,7 +64,11 @@ public class DamageAllControlledTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, source.getFirstTarget(), game)) {
Player player = game.getPlayerOrPlaneswalkerController(source.getFirstTarget());
if (player == null) {
return false;
}
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, player.getId(), game)) {
permanent.damage(amount, source.getSourceId(), game, false, true);
}
return true;

View file

@ -187,7 +187,12 @@ public class DamageTargetEffect extends OneShotEffect {
if (!targetDescription.isEmpty()) {
sb.append(targetDescription);
} else {
sb.append("target ").append(mode.getTargets().get(0).getTargetName());
String targetName = mode.getTargets().get(0).getTargetName();
if (targetName.contains("any")) {
sb.append(targetName);
} else {
sb.append("target ").append(targetName);
}
}
if (!message.isEmpty()) {
if (message.equals("1")) {

View file

@ -82,11 +82,16 @@ public class PreventDamageToTargetEffect extends PreventionEffectImpl {
}
StringBuilder sb = new StringBuilder();
if (amountToPrevent == Integer.MAX_VALUE) {
sb.append("prevent all damage that would be dealt to target ");
sb.append("prevent all damage that would be dealt to ");
} else {
sb.append("prevent the next ").append(amountToPrevent).append(" damage that would be dealt to target ");
sb.append("prevent the next ").append(amountToPrevent).append(" damage that would be dealt to ");
}
String targetName = mode.getTargets().get(0).getTargetName();
if (targetName.contains("any")) {
sb.append(targetName);
} else {
sb.append("target ").append(targetName);
}
sb.append(mode.getTargets().get(0).getTargetName());
if (!duration.toString().isEmpty()) {
sb.append(' ');
if (duration == Duration.EndOfTurn) {

View file

@ -0,0 +1,28 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.filter.common;
import mage.filter.FilterOpponent;
import mage.filter.FilterPermanent;
/**
*
* @author LevelX2
*/
public class FilterOpponentOrPlaneswalker extends FilterPermanentOrPlayer {
public FilterOpponentOrPlaneswalker() {
this("opponent or planeswalker");
}
public FilterOpponentOrPlaneswalker(String name) {
super(name, new FilterPermanent(), new FilterOpponent());
}
public FilterOpponentOrPlaneswalker(final FilterOpponentOrPlaneswalker filter) {
super(filter);
}
}

View file

@ -50,9 +50,13 @@ public class FilterPermanentOrPlayer extends FilterImpl<MageItem> implements Fil
}
public FilterPermanentOrPlayer(String name) {
this(name, new FilterPermanent(), new FilterPlayer());
}
public FilterPermanentOrPlayer(String name, FilterPermanent permanentFilter, FilterPlayer playerFilter) {
super(name);
permanentFilter = new FilterPermanent();
playerFilter = new FilterPlayer();
this.permanentFilter = permanentFilter;
this.playerFilter = playerFilter;
}
public FilterPermanentOrPlayer(final FilterPermanentOrPlayer filter) {

View file

@ -5,80 +5,24 @@
*/
package mage.filter.common;
import java.util.UUID;
import mage.MageItem;
import mage.filter.FilterImpl;
import mage.filter.FilterInPlay;
import mage.filter.FilterPermanent;
import mage.filter.FilterPlayer;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
*
* @author LevelX2
*/
public class FilterPlayerOrPlaneswalker extends FilterImpl<MageItem> implements FilterInPlay<MageItem> {
protected FilterPlaneswalkerPermanent planeswalkerFilter;
protected final FilterPlayer playerFilter;
public class FilterPlayerOrPlaneswalker extends FilterPermanentOrPlayer {
public FilterPlayerOrPlaneswalker() {
this("player or planeswalker");
}
public FilterPlayerOrPlaneswalker(String name) {
super(name);
planeswalkerFilter = new FilterPlaneswalkerPermanent();
playerFilter = new FilterPlayer();
super(name, new FilterPermanent(), new FilterPlayer());
}
public FilterPlayerOrPlaneswalker(final FilterPlayerOrPlaneswalker filter) {
super(filter);
this.planeswalkerFilter = filter.planeswalkerFilter.copy();
this.playerFilter = filter.playerFilter.copy();
}
@Override
public boolean checkObjectClass(Object object) {
return true;
}
@Override
public boolean match(MageItem o, Game game) {
if (o instanceof Player) {
return playerFilter.match((Player) o, game);
} else if (o instanceof Permanent) {
return planeswalkerFilter.match((Permanent) o, game);
}
return false;
}
@Override
public boolean match(MageItem o, UUID sourceId, UUID playerId, Game game) {
if (o instanceof Player) {
return playerFilter.match((Player) o, sourceId, playerId, game);
} else if (o instanceof Permanent) {
return planeswalkerFilter.match((Permanent) o, sourceId, playerId, game);
}
return false;
}
public FilterPlaneswalkerPermanent getPlaneswalkerFilter() {
return this.planeswalkerFilter;
}
public FilterPlayer getPlayerFilter() {
return this.playerFilter;
}
public void setPlaneswalkerFilter(FilterPlaneswalkerPermanent planeswalkerFilter) {
this.planeswalkerFilter = planeswalkerFilter;
}
@Override
public FilterPlayerOrPlaneswalker copy() {
return new FilterPlayerOrPlaneswalker(this);
}
}

View file

@ -132,6 +132,8 @@ public interface Game extends MageItem, Serializable {
Player getPlayer(UUID playerId);
Player getPlayerOrPlaneswalkerController(UUID playerId);
Players getPlayers();
PlayerList getPlayerList();
@ -469,4 +471,8 @@ public interface Game extends MageItem, Serializable {
UUID getMonarchId();
void setMonarchId(Ability source, UUID monarchId);
int damagePlayerOrPlaneswalker(UUID playerOrWalker, int damage, UUID sourceId, Game game, boolean combatDamage, boolean preventable);
int damagePlayerOrPlaneswalker(UUID playerOrWalker, int damage, UUID sourceId, Game game, boolean combatDamage, boolean preventable, List<UUID> appliedEffects);
}

View file

@ -306,6 +306,20 @@ public abstract class GameImpl implements Game, Serializable {
return state.getPlayer(playerId);
}
@Override
public Player getPlayerOrPlaneswalkerController(UUID playerId) {
Player player = getPlayer(playerId);
if (player != null) {
return player;
}
Permanent permanent = getPermanent(playerId);
if (permanent == null) {
return null;
}
player = getPlayer(permanent.getControllerId());
return player;
}
@Override
public MageObject getObject(UUID objectId) {
if (objectId == null) {
@ -1565,14 +1579,14 @@ public abstract class GameImpl implements Game, Serializable {
}
state.addCommandObject(newPlane);
informPlayers("You have planeswalked to " + newPlane.getLogName());
// Fire off the planeswalked event
GameEvent event = new GameEvent(GameEvent.EventType.PLANESWALK, newPlane.getId(), null, newPlane.getId(), 0, true);
if (!replaceEvent(event)) {
GameEvent ge = new GameEvent(GameEvent.EventType.PLANESWALKED, newPlane.getId(), null, newPlane.getId(), 0, true);
fireEvent(ge);
}
return true;
}
@ -3145,4 +3159,22 @@ public abstract class GameImpl implements Game, Serializable {
fireEvent(new GameEvent(GameEvent.EventType.BECOMES_MONARCH, monarchId, source == null ? null : source.getSourceId(), monarchId));
}
}
@Override
public int damagePlayerOrPlaneswalker(UUID playerOrWalker, int damage, UUID sourceId, Game game, boolean combatDamage, boolean preventable) {
return damagePlayerOrPlaneswalker(playerOrWalker, damage, sourceId, game, combatDamage, preventable, null);
}
@Override
public int damagePlayerOrPlaneswalker(UUID playerOrWalker, int damage, UUID sourceId, Game game, boolean combatDamage, boolean preventable, List<UUID> appliedEffects) {
Player player = getPlayer(playerOrWalker);
if (player != null) {
return player.damage(damage, sourceId, game, combatDamage, preventable, appliedEffects);
}
Permanent permanent = getPermanent(playerOrWalker);
if (permanent != null) {
return permanent.damage(damage, sourceId, game, combatDamage, preventable, appliedEffects);
}
return 0;
}
}

View file

@ -41,7 +41,7 @@ import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.game.command.Emblem;
import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetAnyTarget;
/**
*
@ -59,7 +59,7 @@ public class ArlinnEmbracedByTheMoonEmblem extends Emblem {
Effect effect2 = new DamageTargetEffect(new SourcePermanentPowerCount());
effect2.setText("This creature deals damage equal to its power to target creature or player");
Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect2, new TapSourceCost());
ability2.addTarget(new TargetCreatureOrPlayer());
ability2.addTarget(new TargetAnyTarget());
effect = new GainAbilityControlledEffect(ability2, Duration.EndOfGame, filter);
effect.setText("and '{T}: This creature deals damage equal to its power to target creature or player");
ability.addEffect(effect);

View file

@ -34,7 +34,7 @@ import mage.abilities.effects.common.DamageTargetEffect;
import mage.constants.Zone;
import mage.filter.FilterSpell;
import mage.game.command.Emblem;
import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetAnyTarget;
/**
*
@ -48,7 +48,7 @@ public class ChandraTorchOfDefianceEmblem extends Emblem {
Effect effect = new DamageTargetEffect(5);
effect.setText("this emblem deals 5 damage to target creature or player");
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false);
ability.addTarget(new TargetCreatureOrPlayer());
ability.addTarget(new TargetAnyTarget());
getAbilities().add(ability);
}
}

View file

@ -43,7 +43,7 @@ import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
import mage.game.command.Emblem;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetAnyTarget;
/**
*
@ -83,7 +83,7 @@ class KothOfTheHammerThirdEffect extends ContinuousEffectImpl {
if (sublayer == SubLayer.NA) {
for (Permanent permanent : game.getBattlefield().getActivePermanents(mountains, source.getControllerId(), source.getSourceId(), game)) {
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost());
ability.addTarget(new TargetCreatureOrPlayer());
ability.addTarget(new TargetAnyTarget());
permanent.addAbility(ability, source.getSourceId(), game);
}
}

View file

@ -36,7 +36,7 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetAnyTarget;
/**
*
@ -45,7 +45,7 @@ import mage.target.common.TargetCreatureOrPlayer;
public class DevilToken extends TokenImpl {
public DevilToken() {
super("Devil", "1/1 red Devil creature with \"When this creature dies, it deals 1 damage to target creature or player.\"");
super("Devil", "1/1 red Devil creature with \"When this creature dies, it deals 1 damage to any target.\"");
availableImageSetCodes.addAll(Collections.singletonList("SOI"));
cardType.add(CardType.CREATURE);
subtype.add(SubType.DEVIL);
@ -53,9 +53,9 @@ public class DevilToken extends TokenImpl {
power = new MageInt(1);
toughness = new MageInt(1);
Effect effect = new DamageTargetEffect(1);
effect.setText("it deals 1 damage to target creature or player");
effect.setText("it deals 1 damage to any target");
Ability ability = new DiesTriggeredAbility(effect);
ability.addTarget(new TargetCreatureOrPlayer());
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}

View file

@ -36,7 +36,7 @@ import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.constants.Zone;
import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetAnyTarget;
/**
*
@ -54,7 +54,7 @@ public class TriskelaviteToken extends TokenImpl {
toughness = new MageInt(1);
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new SacrificeSourceCost());
ability.addTarget(new TargetCreatureOrPlayer());
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
addAbility(FlyingAbility.getInstance());

View file

@ -440,7 +440,7 @@ public abstract class PlayerImpl implements Player, Serializable {
this.canLoseLife = true;
this.topCardRevealed = false;
this.payManaMode = false;
this.setLife(game.getLife(), game, UUID.randomUUID());
this.setLife(game.getLife(), game, (UUID) null);
this.setReachedNextTurnAfterLeaving(false);
this.castSourceIdWithAlternateMana = null;

View file

@ -15,8 +15,7 @@ import mage.players.Player;
import mage.target.TargetImpl;
/**
* @author JRHerlehy
* Created on 4/8/18.
* @author JRHerlehy Created on 4/8/18.
*/
public class TargetAnyTarget extends TargetImpl {
@ -165,14 +164,14 @@ public class TargetAnyTarget extends TargetImpl {
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
Player player = game.getPlayer(playerId);
if (player != null
&& player.canBeTargetedBy(targetSource, sourceControllerId, game)
&& filter.getPlayerFilter().match(player, sourceId, sourceControllerId, game)) {
&& player.canBeTargetedBy(targetSource, sourceControllerId, game)
&& filter.getPlayerFilter().match(player, sourceId, sourceControllerId, game)) {
possibleTargets.add(playerId);
}
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getCreatureFilter(), sourceControllerId, game)) {
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game)
&& filter.getCreatureFilter().match(permanent, sourceId, sourceControllerId, game)) {
&& filter.getCreatureFilter().match(permanent, sourceId, sourceControllerId, game)) {
possibleTargets.add(permanent.getId());
}
}

View file

@ -0,0 +1,35 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.target.common;
import mage.filter.common.FilterOpponentOrPlaneswalker;
/**
*
* @author LevelX2
*/
public class TargetOpponentOrPlaneswalker extends TargetPermanentOrPlayer {
public TargetOpponentOrPlaneswalker() {
this(1, 1, new FilterOpponentOrPlaneswalker(), false);
}
public TargetOpponentOrPlaneswalker(int numTargets) {
this(numTargets, numTargets, new FilterOpponentOrPlaneswalker(), false);
}
public TargetOpponentOrPlaneswalker(FilterOpponentOrPlaneswalker filter) {
this(1, 1, filter, false);
}
public TargetOpponentOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterOpponentOrPlaneswalker filter, boolean notTarget) {
super(minNumTargets, maxNumTargets, filter, notTarget);
}
public TargetOpponentOrPlaneswalker(final TargetOpponentOrPlaneswalker target) {
super(target);
}
}

View file

@ -65,7 +65,7 @@ public class TargetPermanentOrPlayer extends TargetImpl {
this.zone = Zone.ALL;
this.filter = new FilterPermanentOrPlayer();
this.targetName = filter.getMessage();
this.filterPermanent = new FilterPermanent();
this.filterPermanent = this.filter.getPermanentFilter();
}
public TargetPermanentOrPlayer(int minNumTargets, int maxNumTargets, boolean notTarget) {
@ -73,6 +73,11 @@ public class TargetPermanentOrPlayer extends TargetImpl {
this.notTarget = notTarget;
}
public TargetPermanentOrPlayer(int minNumTargets, int maxNumTargets, FilterPermanentOrPlayer filter, boolean notTarget) {
this(minNumTargets, maxNumTargets, notTarget);
this.filter = filter;
}
public TargetPermanentOrPlayer(final TargetPermanentOrPlayer target) {
super(target);
this.filter = target.filter.copy();

View file

@ -14,204 +14,31 @@ import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.common.FilterPlaneswalkerPermanent;
import mage.filter.common.FilterPlayerOrPlaneswalker;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetImpl;
/**
*
* @author LevelX2
*/
public class TargetPlayerOrPlaneswalker extends TargetImpl {
protected FilterPlayerOrPlaneswalker filter;
public class TargetPlayerOrPlaneswalker extends TargetPermanentOrPlayer {
public TargetPlayerOrPlaneswalker() {
this(1, 1, new FilterPlayerOrPlaneswalker());
this(1, 1, new FilterPlayerOrPlaneswalker(), false);
}
public TargetPlayerOrPlaneswalker(int numTargets) {
this(numTargets, numTargets, new FilterPlayerOrPlaneswalker());
this(numTargets, numTargets, new FilterPlayerOrPlaneswalker(), false);
}
public TargetPlayerOrPlaneswalker(FilterPlayerOrPlaneswalker filter) {
this(1, 1, filter);
this(1, 1, filter, false);
}
public TargetPlayerOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterPlayerOrPlaneswalker filter) {
this.minNumberOfTargets = minNumTargets;
this.maxNumberOfTargets = maxNumTargets;
this.zone = Zone.ALL;
this.filter = filter;
this.targetName = filter.getMessage();
public TargetPlayerOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterPlayerOrPlaneswalker filter, boolean notTarget) {
super(minNumTargets, maxNumTargets, filter, notTarget);
}
public TargetPlayerOrPlaneswalker(final TargetPlayerOrPlaneswalker target) {
super(target);
this.filter = target.filter.copy();
}
@Override
public Filter getFilter() {
return this.filter;
}
@Override
public boolean canTarget(UUID id, Game game) {
Permanent permanent = game.getPermanent(id);
if (permanent != null) {
return filter.match(permanent, game);
}
Player player = game.getPlayer(id);
return player != null && filter.match(player, game);
}
@Override
public boolean canTarget(UUID id, Ability source, Game game) {
return canTarget(source.getControllerId(), id, source, game);
}
@Override
public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) {
Permanent permanent = game.getPermanent(id);
Player player = game.getPlayer(id);
if (source != null) {
MageObject targetSource = game.getObject(source.getSourceId());
if (permanent != null) {
return permanent.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(permanent, source.getSourceId(), source.getControllerId(), game);
}
if (player != null) {
return player.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(player, game);
}
}
if (permanent != null) {
return filter.match(permanent, game);
}
return player != null && filter.match(player, game);
}
/**
* Checks if there are enough {@link Permanent} or {@link Player} that can
* be chosen. Should only be used for Ability targets since this checks for
* protection, shroud etc.
*
* @param sourceId - the target event source
* @param sourceControllerId - controller of the target event source
* @param game
* @return - true if enough valid {@link Permanent} or {@link Player} exist
*/
@Override
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
int count = 0;
MageObject targetSource = game.getObject(sourceId);
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
Player player = game.getPlayer(playerId);
if (player != null && player.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(player, game)) {
count++;
if (count >= this.minNumberOfTargets) {
return true;
}
}
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) {
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(permanent, sourceId, sourceControllerId, game)) {
count++;
if (count >= this.minNumberOfTargets) {
return true;
}
}
}
return false;
}
/**
* Checks if there are enough {@link Permanent} or {@link Player} that can
* be selected. Should not be used for Ability targets since this does not
* check for protection, shroud etc.
*
* @param sourceControllerId - controller of the select event
* @param game
* @return - true if enough valid {@link Permanent} or {@link Player} exist
*/
@Override
public boolean canChoose(UUID sourceControllerId, Game game) {
int count = 0;
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
Player player = game.getPlayer(playerId);
if (player != null && filter.match(player, game)) {
count++;
if (count >= this.minNumberOfTargets) {
return true;
}
}
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) {
if (filter.match(permanent, null, sourceControllerId, game)) {
count++;
if (count >= this.minNumberOfTargets) {
return true;
}
}
}
return false;
}
@Override
public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set<UUID> possibleTargets = new HashSet<>();
MageObject targetSource = game.getObject(sourceId);
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
Player player = game.getPlayer(playerId);
if (player != null
&& player.canBeTargetedBy(targetSource, sourceControllerId, game)
&& filter.getPlayerFilter().match(player, sourceId, sourceControllerId, game)) {
possibleTargets.add(playerId);
}
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) {
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game)
&& filter.getPlaneswalkerFilter().match(permanent, sourceId, sourceControllerId, game)) {
possibleTargets.add(permanent.getId());
}
}
return possibleTargets;
}
@Override
public Set<UUID> possibleTargets(UUID sourceControllerId, Game game) {
Set<UUID> possibleTargets = new HashSet<>();
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
Player player = game.getPlayer(playerId);
if (player != null && filter.getPlayerFilter().match(player, game)) {
possibleTargets.add(playerId);
}
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) {
if (filter.getPlaneswalkerFilter().match(permanent, null, sourceControllerId, game)) {
possibleTargets.add(permanent.getId());
}
}
return possibleTargets;
}
@Override
public String getTargetedName(Game game) {
StringBuilder sb = new StringBuilder();
for (UUID targetId : getTargets()) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null) {
sb.append(permanent.getLogName()).append(' ');
} else {
Player player = game.getPlayer(targetId);
if (player != null) {
sb.append(player.getLogName()).append(' ');
}
}
}
return sb.toString();
}
public FilterPlaneswalkerPermanent getPlaneswalkerFilter() {
@ -222,5 +49,4 @@ public class TargetPlayerOrPlaneswalker extends TargetImpl {
public TargetPlayerOrPlaneswalker copy() {
return new TargetPlayerOrPlaneswalker(this);
}
}