package magic.model.trigger;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
import magic.model.action.DrawAction;
import magic.model.action.RemoveTriggerAction;
import magic.model.event.MagicEvent;
import magic.model.event.MagicSourceEvent;
public abstract class AtUpkeepTrigger extends MagicTrigger<MagicPlayer> {
public AtUpkeepTrigger(final int priority) {
super(priority);
}
public AtUpkeepTrigger() {}
public MagicTriggerType getType() {
return MagicTriggerType.AtUpkeep;
}
public static AtUpkeepTrigger create(final MagicSourceEvent sourceEvent) {
return new AtUpkeepTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return sourceEvent.getTriggerEvent(permanent, upkeepPlayer);
}
};
}
public static AtUpkeepTrigger createOpp(final MagicSourceEvent sourceEvent) {
return new AtUpkeepTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return permanent.isOpponent(upkeepPlayer);
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return sourceEvent.getTriggerEvent(permanent, upkeepPlayer);
}
};
}
public static final AtUpkeepTrigger YouDraw(final MagicSource staleSource, final MagicPlayer stalePlayer) {
return new AtUpkeepTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPlayer upkeepPlayer) {
game.addDelayedAction(new RemoveTriggerAction(this));
return new MagicEvent(
game.createDelayedSource(staleSource, stalePlayer),
this,
"PN draws a card."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new DrawAction(event.getPlayer()));
}
};
}
}