package org.ggp.base.server.threads; import java.util.HashSet; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import org.ggp.base.server.GameServer; import org.ggp.base.server.event.ServerIllegalMoveEvent; import org.ggp.base.server.request.RequestBuilder; import org.ggp.base.util.gdl.factory.GdlFactory; import org.ggp.base.util.gdl.factory.exceptions.GdlFormatException; import org.ggp.base.util.match.Match; import org.ggp.base.util.statemachine.Move; import org.ggp.base.util.statemachine.Role; import org.ggp.base.util.symbol.factory.exceptions.SymbolFormatException; public class PlayRequestThread extends RequestThread { private final GameServer gameServer; private final List<Move> legalMoves; private final Match match; private final Role role; private Move move; public PlayRequestThread(GameServer gameServer, Match match, List<Move> previousMoves, List<Move> legalMoves, Role role, String host, int port, String playerName, boolean unlimitedTime) { super(gameServer, role, host, port, playerName, unlimitedTime ? -1 : (match.getPlayClock() * 1000 + 1000), RequestBuilder.getPlayRequest(match.getMatchId(), previousMoves, match.getGdlScrambler())); this.gameServer = gameServer; this.legalMoves = legalMoves; this.match = match; this.role = role; move = legalMoves.get(ThreadLocalRandom.current().nextInt(legalMoves.size())); } public Move getMove() { return move; } @Override protected void handleResponse(String response) { try { Move candidateMove = gameServer.getStateMachine().getMoveFromTerm(GdlFactory.createTerm(match.getGdlScrambler().unscramble(response).toString())); if (new HashSet<Move>(legalMoves).contains(candidateMove)) { move = candidateMove; } else { gameServer.notifyObservers(new ServerIllegalMoveEvent(role, candidateMove)); } } catch (GdlFormatException e) { gameServer.notifyObservers(new ServerIllegalMoveEvent(role, null)); } catch (SymbolFormatException e) { gameServer.notifyObservers(new ServerIllegalMoveEvent(role, null)); } } }