package magic.model.choice;
import java.util.Collection;
import java.util.List;
import magic.exception.UndoClickedException;
import magic.model.IUIGameController;
import magic.model.MagicCard;
import magic.model.MagicGame;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
import magic.model.MagicType;
import magic.model.action.PlayCardAction;
import magic.model.event.MagicEvent;
import magic.model.phase.MagicMainPhase;
public class MagicMulliganChoice extends MagicChoice {
public MagicMulliganChoice() {
super("");
}
@Override
Collection<Object> getArtificialOptions(final MagicGame game, final MagicEvent event) {
throw new UnsupportedOperationException();
}
@Override
public List<Object[]> getArtificialChoiceResults(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getPlayer();
int costSum = 0;
for (final MagicCard card: player.getLibrary()){
costSum += card.getConvertedCost();
}
for (final MagicCard card: player.getHand()){
costSum += card.getConvertedCost();
//System.err.println("MULLIGAN: card=" + card);
}
// There is more fine tuning to be done here
int minLands = 2;
int maxLands = 3;
if (costSum > 90) {
minLands = 3;
maxLands = 4;
} else if(costSum > 70) {
minLands = 2;
maxLands = 4;
}
final int hand = player.getHandSize();
if (hand <= 4) {
return NO_CHOICE_LIST;
}
final MagicGame assumedGame = new MagicGame(game, player);
final MagicPlayer assumedPlayer = assumedGame.getPlayer(player.getIndex());
assumedGame.setPhase(MagicMainPhase.getFirstInstance());
int numLands = 0;
for (final MagicCard card : assumedPlayer.getHand()) {
if (card.hasType(MagicType.Land)) {
numLands++;
assumedGame.doAction(new PlayCardAction(card, assumedPlayer));
}
}
int playable = 0;
for (final MagicCard card : assumedPlayer.getHand()) {
if (card.hasType(MagicType.Land) == false &&
card.getCost().getCondition().accept(card)) {
playable++;
}
}
//System.err.println("MULLIGAN: hand=" + hand + " lands=" + numLands + " playable=" + playable);
if ((hand > 6 && playable > 1) ||
(hand <= 6 && playable > 0)) {
return NO_CHOICE_LIST;
} else if (numLands < minLands || numLands > maxLands) {
return YES_CHOICE_LIST;
} else {
return NO_CHOICE_LIST;
}
}
@Override
public Object[] getPlayerChoiceResults(final IUIGameController controller, final MagicGame game, final MagicEvent event) throws UndoClickedException {
final MagicPlayer player = event.getPlayer();
final MagicSource source = event.getSource();
if (player.getHandSize() <= 1) {
return new Object[]{NO_CHOICE};
}
controller.disableActionButton(false);
if (controller.getTakeMulliganChoice(source, player)) {
return new Object[]{YES_CHOICE};
}
return new Object[]{NO_CHOICE};
}
}