package magic.model.event;
import magic.model.MagicGame;
import magic.model.MagicMappable;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
public class MagicSourceActivation<T extends MagicSource & MagicMappable<T> & Comparable<T>> implements Comparable<MagicSourceActivation<T>> {
public final T source;
public final MagicActivation<T> activation;
private MagicSourceActivation(final T aSource, final MagicActivation<T> aActivation) {
source = aSource;
activation = aActivation;
}
public static <S extends MagicSource & MagicMappable<S> & Comparable<S>> MagicSourceActivation<S> create(final S aSource, final MagicActivation<S> aActivation) {
return new MagicSourceActivation<S>(aSource, aActivation);
}
public static <S extends MagicSource & MagicMappable<S> & Comparable<S>> MagicSourceActivation<S> create(final MagicGame game, final MagicSourceActivation<S> aSourceActivation) {
return new MagicSourceActivation<S>(aSourceActivation.source.map(game), aSourceActivation.activation);
}
public final boolean canPlay(final MagicGame game, final MagicPlayer player, final boolean useHints) {
return activation.canPlay(game, player, source, useHints);
}
public Iterable<? extends MagicEvent> getCostEvent() {
return activation.getCostEvent(source);
}
public MagicEvent getEvent() {
return activation.getEvent(source);
}
public boolean usesStack() {
return activation.usesStack();
}
public boolean isIndependent() {
return activation.getActivationHints().isIndependent();
}
public void changeActivationPriority() {
activation.changeActivationPriority(source.getController());
}
@Override
public int compareTo(final MagicSourceActivation<T> other) {
int c1 = activation.compareTo(other.activation);
if (c1 != 0) {
return c1;
} else {
return source.compareTo(other.source);
}
}
}