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.MagicGame; import magic.model.MagicPermanent; import magic.model.MagicPlayer; import magic.model.MagicSource; import magic.model.MagicSubType; import magic.model.event.MagicEvent; import magic.model.target.MagicTargetFilterFactory; /** Contains optimal decision logic for each choice type. */ public class MagicBasicLandChoice extends MagicChoice { // translatable UI text (prefix with _S). private static final String _S1 = "Choose yes or no."; private static final int ALL=0; private static final int MOST=1; private static final int UNSUMMON=2; private static final List<Object> LAND_OPTIONS=Arrays.<Object>asList( MagicSubType.Plains, MagicSubType.Island, MagicSubType.Swamp, MagicSubType.Forest, MagicSubType.Mountain ); public static final MagicBasicLandChoice ALL_INSTANCE=new MagicBasicLandChoice(ALL); public static final MagicBasicLandChoice MOST_INSTANCE=new MagicBasicLandChoice(MOST); public static final MagicBasicLandChoice UNSUMMON_INSTANCE=new MagicBasicLandChoice(UNSUMMON); private final int type; private MagicBasicLandChoice(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[MagicSubType.ALL_BASIC_LANDS.size()]; for (final MagicPermanent permanent : targets) { for (final MagicSubType subType : MagicSubType.ALL_BASIC_LANDS) { if (permanent.hasSubType(subType)) { counts[subType.ordinal()]++; } } } int bestCount=Integer.MIN_VALUE; MagicSubType bestSubType=null; for (final MagicSubType subType : MagicSubType.ALL_BASIC_LANDS) { final int count=counts[subType.ordinal()]; if (count>bestCount) { bestCount=count; bestSubType=subType; } } return Collections.<Object>singletonList(bestSubType); } private static Collection<Object> getArtificialUnsummonOptions(final MagicGame game,final MagicPlayer player) { final Collection<MagicPermanent> targets = MagicTargetFilterFactory.CREATURE.filter(player); final int[] scores=new int[MagicSubType.ALL_BASIC_LANDS.size()]; for (final MagicPermanent permanent : targets) { int score=permanent.getScore(); if (permanent.getController()==player) { score=-score; } for (final MagicSubType subType : MagicSubType.ALL_BASIC_LANDS) { if (permanent.hasSubType(subType)) { scores[subType.ordinal()]+=score; } } } int bestScore=Integer.MIN_VALUE; MagicSubType bestSubType=null; for (final MagicSubType subType : MagicSubType.ALL_BASIC_LANDS) { final int score=scores[subType.ordinal()]; if (score>bestScore) { bestScore=score; bestSubType=subType; } } return Collections.<Object>singletonList(bestSubType); } @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); default: return LAND_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.getLandSubTypeChoice(source)}; } }