package magic.model.trigger;
import magic.model.MagicCardDefinition;
import magic.model.MagicChangeCardDefinition;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.event.MagicEvent;
import magic.model.event.MagicEventAction;
import magic.exception.GameException;
/** Lower priority values trigger before higher priority values. */
public abstract class MagicTrigger<T> implements MagicEventAction,MagicChangeCardDefinition {
public static final int REPLACEMENT = 1;
public static final int REDIRECT_DAMAGE = 10;
public static final int CANT_BE_PREVENTED = 20;
public static final int INCREASE_DAMAGE = 30;
public static final int PREVENT_DAMAGE = 40;
public static final int REPLACE_DAMAGE = 60;
public static final int BEFORE_DEFAULT = 90;
private static final int DEFAULT_PRIORITY = 100;
private final int priority;
protected MagicTrigger(final int aPriority) {
priority = aPriority;
}
protected MagicTrigger() {
this(DEFAULT_PRIORITY);
}
public final int getPriority() {
return priority;
}
public boolean usesStack() {
return getType() != MagicTriggerType.IfDamageWouldBeDealt && priority > REPLACEMENT;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
throw new GameException(getClass() + " did not override executeEvent", game);
}
public abstract MagicTriggerType getType();
public abstract MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final T data);
public boolean accept(final MagicPermanent permanent, final T data) {
return true;
}
@Override
public void change(final MagicCardDefinition cdef) {
cdef.addTrigger(this);
}
}