package magic.model.target;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.event.MagicEvent;
public abstract class MagicTargetPicker<T> {
protected void setEvent(final MagicEvent event) {
//do nothing
}
protected abstract int getTargetScore(final MagicGame game,final MagicPlayer event,final T target);
public Collection<T> pickTargets(final MagicGame game,final MagicEvent event,final Collection<T> options) {
if (options.size()<2) {
return options;
}
T bestTarget=options.iterator().next();
int bestScore=Integer.MIN_VALUE;
setEvent(event);
for (final T target : options) {
final int score=getTargetScore(game,event.getPlayer(),target);
if (score>bestScore) {
bestTarget=target;
bestScore=score;
}
}
return Collections.singletonList(bestTarget);
}
private static final Map<String, MagicTargetPicker<MagicPermanent>> factory =
new HashMap<String, MagicTargetPicker<MagicPermanent>>();
static {
register("pump", MagicPumpTargetPicker.create());
register("weaken", new MagicWeakenTargetPicker(0,0));
register("flying", MagicFlyingTargetPicker.create());
register("lifelink", MagicLifelinkTargetPicker.create());
register("copy", MagicCopyPermanentPicker.create());
register("haste", MagicHasteTargetPicker.create());
register("trample", MagicTrampleTargetPicker.create());
register("unblockable", MagicUnblockableTargetPicker.create());
register("first strike", MagicFirstStrikeTargetPicker.create());
register("sacrifice", MagicSacrificeTargetPicker.create());
register("destroy", MagicDestroyTargetPicker.Destroy);
register("destroy no regen", MagicDestroyTargetPicker.DestroyNoRegen);
register("shroud", MagicShroudTargetPicker.create());
register("can't attack or block", new MagicNoCombatTargetPicker(true,true,true));
register("can't attack", new MagicNoCombatTargetPicker(true,false,true));
register("can't block", new MagicNoCombatTargetPicker(false,true,true));
register("defender", new MagicNoCombatTargetPicker(true,false,true));
register("tap", new MagicNoCombatTargetPicker(true,true,false));
register("untap", MagicTapTargetPicker.Untap);
register("indestructible", MagicIndestructibleTargetPicker.create());
register("must attack", MagicMustAttackTargetPicker.create());
register("lose flying", MagicLoseFlyingTargetPicker.create());
register("gain control", MagicExileTargetPicker.create());
register("exile", MagicExileTargetPicker.create());
register("power", MagicPowerTargetPicker.create());
register("toughness", MagicToughnessTargetPicker.create());
register("default", MagicDefaultPermanentTargetPicker.create());
register("regen", MagicRegenerateTargetPicker.create());
}
public MagicTargetPicker<MagicPermanent> create(final String arg) {
throw new UnsupportedOperationException();
}
public static MagicTargetPicker<MagicPermanent> build(final String arg) {
if (factory.containsKey(arg)) {
return factory.get(arg);
} else {
final String[] args = arg.split(" ", 2);
return factory.get(args[0]).create(args[1]);
}
}
public static void register(final String key, final MagicTargetPicker<MagicPermanent> tp) {
factory.put(key, tp);
}
}