001    package ai;
002    
003    import java.io.ByteArrayOutputStream;
004    import java.io.PrintStream;
005    import java.util.ArrayList;
006    import java.util.Collection;
007    import java.util.Map;
008    import java.util.Properties;
009    
010    import net.antichess.ai.AiPlayerFactory;
011    import net.antichess.ai.ChatHistoryViewer;
012    import net.antichess.ai.ChatProxy;
013    import core.Color;
014    import core.Piece;
015    import core.Player;
016    import core.Position;
017    import core.PowerupHelper;
018    
019    /**
020     * Implementation of AIPlayerFactory - See http://antichess.mit.edu:8080/core/index.html
021     */
022    public class AIFactory implements AiPlayerFactory{
023        public static final String PROPERTY_BLACK_NAME = "antichess.blackPlayerName";
024        public static final String PROPERTY_INIT_TIME_BLACK = "antichess.initTime.black";
025        public static final String PROPERTY_WHITE_NAME = "antichess.whitePlayerName";
026        public static final String PROPERTY_INIT_TIME_WHITE = "antichess.initTime.white";
027        public static final String PROPERTY_TIMED_GAME = "antichess.timedGame";
028        public static final String PROPERTY_RULE_SET = "antichess.ruleSet";
029        public static final String PROPERTY_POWERUP_PLACEMENT = "antichess.powerupPlacement";
030    
031        /**
032         * See http://antichess.mit.edu:8080/core/index.html
033         */
034        public AIFactory()
035        {
036        }
037        
038        public Player createPlayer(boolean isWhite, int whiteTime, int blackTime, 
039                                   String powerups){
040            Properties props = new Properties();
041            props.setProperty(PROPERTY_INIT_TIME_BLACK, ""+whiteTime);
042            props.setProperty(PROPERTY_INIT_TIME_WHITE, ""+blackTime);
043            if (powerups == null) {
044                props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007");
045            } else { 
046                props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007-powerups");
047                props.setProperty(PROPERTY_POWERUP_PLACEMENT, powerups);
048            }
049            //No chat or persistent state
050            return createPlayer(isWhite, props, null, null, null, 0);
051        }
052        public Player createPlayer(boolean isWhite, int whiteTime, int blackTime, 
053                                   String powerups, int w1, int w2, int w3, int w4){
054            Properties props = new Properties();
055            props.setProperty(PROPERTY_INIT_TIME_BLACK, ""+whiteTime);
056            props.setProperty(PROPERTY_INIT_TIME_WHITE, ""+blackTime);
057            if (powerups == null) {
058                props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007");
059            } else { 
060                props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007-powerups");
061                props.setProperty(PROPERTY_POWERUP_PLACEMENT, powerups);
062            }
063            //No chat or persistent state
064            return createPlayer(isWhite, props, null, null, null, 0, w1, w2, w3, w4);
065        }
066    
067        /**
068         * Wrapper to turn a ChatProxy into a PrintStream.
069         */
070        private class ChatOutput extends PrintStream {
071            private ChatProxy proxy;
072    
073            public ChatOutput(ChatProxy p){
074                super(new ByteArrayOutputStream());
075                proxy = p;
076            }
077    
078            public void println(String s){
079                proxy.sendChat(s);
080            }
081        }
082    
083        /**
084         * See http://antichess.mit.edu:8080/core/index.html
085         */
086        public Player createPlayer(boolean isWhite, Properties gameProperties, 
087                                   ChatProxy chatProxy, 
088                                   ChatHistoryViewer chatHistoryViewer, 
089                                   byte[] persistentState, 
090                                   int persistentStateSizeLimit) {
091            return createPlayer(isWhite, gameProperties, chatProxy, chatHistoryViewer,
092                                persistentState, persistentStateSizeLimit, -100, 0, 0, 1);
093        }
094        public Player createPlayer(boolean isWhite, Properties gameProperties, 
095                                   ChatProxy chatProxy, 
096                                   ChatHistoryViewer chatHistoryViewer, 
097                                   byte[] persistentState, 
098                                   int persistentStateSizeLimit,
099                                   int w1, int w2, int w3, int w4) {
100            Color c = (isWhite ? Color.WHITE : Color.BLACK);
101            Heuristic h = new PieceHeuristic();
102            Heuristic h2 = new NegativePieceHeuristic();
103            Heuristic h3 = new ScaledPieceHeuristic();
104            Heuristic h4 = new PawnWeightedPieceHeuristic(w1, w2, w3, w4);
105            PrintStream p = System.out;
106            Map<Position, Piece> diffs = null;
107            String powerupState = gameProperties.getProperty(PROPERTY_POWERUP_PLACEMENT);
108            if (chatProxy != null) {
109                p = new ChatOutput(chatProxy);
110                p.println("Starting up...");
111            }
112            if (powerupState != null && 
113                gameProperties.getProperty( PROPERTY_RULE_SET ) == 
114                "6170-fall-2007-powerups") {
115                diffs = PowerupHelper.stringToMap(powerupState);
116            }
117            if (isWhite) {
118                return new OptimizingAlphaBetaPlayer(c, h4, 2, p, diffs);
119            } else {
120                return new OptimizingAlphaBetaPlayer(c, h4, 2, p, diffs);
121            }
122        }
123        
124        /**
125         * See http://antichess.mit.edu:8080/core/index.html
126         */
127        public Collection<String> getSupportedRulesets() {
128            Collection<String> l = new ArrayList<String>();
129            l.add("6170-fall-2007");
130            l.add("6170-spring-2007-encastle");
131            l.add("6170-fall-2007-powerups");
132            return l;
133        }
134    }