forked from External/mage
* fix Unsettled Mariner + Field of Ruin There was something weird with zcc on TargetOfOpponentsSpellOrAbilityTriggeredAbility setting the target to the stack object for its triggered effect. I do not entirely comprehend how FixedTarget works, in particular regarding zcc of stack objects. However all configurations of the trigger seem to work with the uninitialized FixedTarget constructor, instead of the one initialized with a game's zcc. * slight refactor of TargetOfOpponentsSpellOrAbilityTriggeredAbility
82 lines
3 KiB
Java
82 lines
3 KiB
Java
package mage.abilities.common;
|
|
|
|
import mage.abilities.TriggeredAbilityImpl;
|
|
import mage.abilities.effects.Effect;
|
|
import mage.constants.Zone;
|
|
import mage.game.Game;
|
|
import mage.game.events.GameEvent;
|
|
import mage.game.permanent.Permanent;
|
|
import mage.players.Player;
|
|
import mage.target.targetpointer.FixedTarget;
|
|
|
|
/**
|
|
* "Whenever you or a permanent you control becomes the target of a spell or ability an opponent controls,"
|
|
* AND
|
|
* "Whenever you become the target of a spell or ability an opponent controls,"
|
|
*
|
|
* @author Alex-Vasile
|
|
*/
|
|
public class TargetOfOpponentsSpellOrAbilityTriggeredAbility extends TriggeredAbilityImpl {
|
|
|
|
private boolean onlyController = false;
|
|
|
|
public TargetOfOpponentsSpellOrAbilityTriggeredAbility(Effect effect) {
|
|
this(effect, false, false);
|
|
}
|
|
|
|
public TargetOfOpponentsSpellOrAbilityTriggeredAbility(Effect effect, boolean optional, boolean onlyController) {
|
|
super(Zone.BATTLEFIELD, effect, optional);
|
|
this.onlyController = onlyController;
|
|
if (this.onlyController) {
|
|
setTriggerPhrase("Whenever you become the target of a spell or ability an opponent controls, ");
|
|
} else {
|
|
setTriggerPhrase("Whenever you or a permanent you control becomes the target of a spell or ability an opponent controls, ");
|
|
}
|
|
}
|
|
|
|
private TargetOfOpponentsSpellOrAbilityTriggeredAbility(final TargetOfOpponentsSpellOrAbilityTriggeredAbility ability) {
|
|
super(ability);
|
|
this.onlyController = ability.onlyController;
|
|
}
|
|
|
|
@Override
|
|
public boolean checkEventType(GameEvent event, Game game) {
|
|
return event.getType() == GameEvent.EventType.TARGETED;
|
|
}
|
|
|
|
@Override
|
|
public boolean checkTrigger(GameEvent event, Game game) {
|
|
Player controller = game.getPlayer(this.getControllerId());
|
|
Player targetter = game.getPlayer(event.getPlayerId());
|
|
if (controller == null || targetter == null || controller.getId().equals(targetter.getId())) {
|
|
return false;
|
|
}
|
|
|
|
// Check if player was targeted
|
|
if (controller.getId().equals(event.getTargetId())) {
|
|
// Add target for effects which need it (e.g. the counter effect from AmuletOfSafekeeping)
|
|
this.getEffects().setTargetPointer(new FixedTarget(event.getSourceId()));
|
|
return true;
|
|
}
|
|
|
|
// If only the controller is
|
|
if (this.onlyController) {
|
|
return false;
|
|
}
|
|
|
|
// Check if permanent was targeted
|
|
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId());
|
|
if (permanent == null || !controller.getId().equals(permanent.getControllerId())) {
|
|
return false;
|
|
}
|
|
|
|
// Add target for effects which need it (e.g. the counter effect from AmuletOfSafekeeping)
|
|
this.getEffects().setTargetPointer(new FixedTarget(event.getSourceId()));
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public TargetOfOpponentsSpellOrAbilityTriggeredAbility copy() {
|
|
return new TargetOfOpponentsSpellOrAbilityTriggeredAbility(this);
|
|
}
|
|
}
|