mirror of
https://github.com/magefree/mage.git
synced 2025-12-25 04:52:07 -08:00
Merge branch 'planeswalkerErrata' into master
This commit is contained in:
commit
95d2721421
754 changed files with 3085 additions and 3051 deletions
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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")) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue