package magic.model.trigger;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicLocationType;
import magic.model.event.MagicEvent;
import magic.model.event.MagicSourceEvent;
import magic.model.target.MagicTargetFilter;
import magic.model.action.RemoveFromPlayAction;
public abstract class LeavesBattlefieldTrigger extends MagicTrigger<RemoveFromPlayAction> {
public LeavesBattlefieldTrigger(final int priority) {
super(priority);
}
public LeavesBattlefieldTrigger() {}
public MagicTriggerType getType() {
return MagicTriggerType.WhenLeavesPlay;
}
public static final LeavesBattlefieldTrigger Exile = new LeavesBattlefieldTrigger(MagicTrigger.REPLACEMENT) {
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final RemoveFromPlayAction act) {
if (permanent == act.getPermanent()) {
act.setToLocation(MagicLocationType.Exile);
}
return MagicEvent.NONE;
}
};
public static final LeavesBattlefieldTrigger create(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent) {
return new LeavesBattlefieldTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final RemoveFromPlayAction act) {
return filter.accept(permanent, permanent.getController(), act.getPermanent());
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final RemoveFromPlayAction act) {
return sourceEvent.getTriggerEvent(permanent, act.getPermanent());
}
};
}
public static final LeavesBattlefieldTrigger createSelfOrAnother(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent) {
return new LeavesBattlefieldTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final RemoveFromPlayAction act) {
return permanent == act.getPermanent() || filter.accept(permanent, permanent.getController(), act.getPermanent());
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final RemoveFromPlayAction act) {
return sourceEvent.getTriggerEvent(permanent, act.getPermanent());
}
};
}
public static final LeavesBattlefieldTrigger createAnother(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent) {
return new LeavesBattlefieldTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final RemoveFromPlayAction act) {
return permanent != act.getPermanent() && filter.accept(permanent, permanent.getController(), act.getPermanent());
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final RemoveFromPlayAction act) {
return sourceEvent.getTriggerEvent(permanent, act.getPermanent());
}
};
}
}