package magic.model.choice;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import magic.exception.UndoClickedException;
import magic.model.IUIGameController;
import magic.model.MagicColor;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
import magic.model.event.MagicEvent;
import magic.model.target.MagicTargetFilterFactory;
/** Contains optimal decision logic for each choice type. */
public class MagicColorChoice extends MagicChoice {
// translatable UI text (prefix with _S).
private static final String _S1 = "Choose a color.";
private static final int ALL=0;
private static final int MOST=1;
private static final int UNSUMMON=2;
private static final int RED_WHITE_BLUE=3;
private static final List<Object> COLOR_OPTIONS=Arrays.<Object>asList(
MagicColor.White,
MagicColor.Blue,
MagicColor.Black,
MagicColor.Green,
MagicColor.Red
);
private static final List<Object> RED_WHITE_BLUE_OPTIONS=Arrays.<Object>asList(
MagicColor.Red,
MagicColor.White,
MagicColor.Blue
);
public static final MagicColorChoice ALL_INSTANCE=new MagicColorChoice(ALL);
public static final MagicColorChoice MOST_INSTANCE=new MagicColorChoice(MOST);
public static final MagicColorChoice UNSUMMON_INSTANCE=new MagicColorChoice(UNSUMMON);
public static final MagicColorChoice RED_WHITE_BLUE_INSTANCE=new MagicColorChoice(RED_WHITE_BLUE);
private final int type;
private MagicColorChoice(final int type) {
super(_S1);
this.type=type;
}
private static Collection<Object> getArtificialMostOptions(final MagicGame game,final MagicPlayer player) {
final Collection<MagicPermanent> targets = MagicTargetFilterFactory.PERMANENT.filter(player);
final int[] counts=new int[MagicColor.NR_COLORS];
for (final MagicPermanent permanent : targets) {
for (final MagicColor color : MagicColor.values()) {
if (permanent.hasColor(color)) {
counts[color.ordinal()]++;
}
}
}
int bestCount=Integer.MIN_VALUE;
MagicColor bestColor=null;
for (final MagicColor color : MagicColor.values()) {
final int count=counts[color.ordinal()];
if (count>bestCount) {
bestCount=count;
bestColor=color;
}
}
return Collections.<Object>singletonList(bestColor);
}
private static Collection<Object> getArtificialUnsummonOptions(final MagicGame game,final MagicPlayer player) {
final Collection<MagicPermanent> targets = MagicTargetFilterFactory.CREATURE.filter(player);
final int[] scores=new int[MagicColor.NR_COLORS];
for (final MagicPermanent permanent : targets) {
int score=permanent.getScore();
if (permanent.getController()==player) {
score=-score;
}
for (final MagicColor color : MagicColor.values()) {
if (permanent.hasColor(color)) {
scores[color.ordinal()]+=score;
}
}
}
int bestScore=Integer.MIN_VALUE;
MagicColor bestColor=null;
for (final MagicColor color : MagicColor.values()) {
final int score=scores[color.ordinal()];
if (score>bestScore) {
bestScore=score;
bestColor=color;
}
}
return Collections.<Object>singletonList(bestColor);
}
@Override
Collection<Object> getArtificialOptions(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getPlayer();
switch (type) {
case MOST: return getArtificialMostOptions(game,player);
case UNSUMMON: return getArtificialUnsummonOptions(game,player);
case RED_WHITE_BLUE: return RED_WHITE_BLUE_OPTIONS;
default: return COLOR_OPTIONS;
}
}
@Override
public Object[] getPlayerChoiceResults(final IUIGameController controller, final MagicGame game, final MagicEvent event) throws UndoClickedException {
final MagicSource source = event.getSource();
controller.disableActionButton(false);
return new Object[]{controller.getColorChoice(source)};
}
}