package org.ggp.base.player.gamer.statemachine.human; import java.util.List; import org.ggp.base.apps.player.detail.DetailPanel; import org.ggp.base.player.gamer.exception.GamePreviewException; import org.ggp.base.player.gamer.statemachine.StateMachineGamer; import org.ggp.base.player.gamer.statemachine.human.event.HumanNewMovesEvent; import org.ggp.base.player.gamer.statemachine.human.event.HumanTimeoutEvent; import org.ggp.base.player.gamer.statemachine.human.gui.HumanDetailPanel; import org.ggp.base.util.game.Game; import org.ggp.base.util.statemachine.Move; import org.ggp.base.util.statemachine.StateMachine; import org.ggp.base.util.statemachine.cache.CachedStateMachine; import org.ggp.base.util.statemachine.exceptions.GoalDefinitionException; import org.ggp.base.util.statemachine.exceptions.MoveDefinitionException; import org.ggp.base.util.statemachine.exceptions.TransitionDefinitionException; import org.ggp.base.util.statemachine.implementation.prover.ProverStateMachine; /** * HumanGamer is a simple apparatus for letting a human control a player, * by manually choosing moves in the player's detail panel. This player will * not work without a human actually interacting with the detail panel. This * player has a very simplistic user interface; if you actually want to play * as a human, you're probably better off using the purpose-built Kiosk app. */ public final class HumanGamer extends StateMachineGamer { @Override public String getName() { return "Human"; } /** * Selects the default move as the first legal move, and then waits * while the Human sets their move. This is done via the HumanDetailPanel. */ @Override public synchronized Move stateMachineSelectMove(long timeout) throws TransitionDefinitionException, MoveDefinitionException, GoalDefinitionException { List<Move> moves = getStateMachine().getLegalMoves(getCurrentState(), getRole()); move = moves.get(0); try { notifyObservers(HumanNewMovesEvent.create(moves, move)); wait(timeout - System.currentTimeMillis() - 500); notifyObservers(new HumanTimeoutEvent(this)); } catch (Exception e) { e.printStackTrace(); } return move; } private Move move; public void setMove(Move move) { this.move = move; } @Override public DetailPanel getDetailPanel() { return new HumanDetailPanel(); } @Override public void preview(Game g, long timeout) throws GamePreviewException { // Human gamer does no game previewing. } @Override public void stateMachineMetaGame(long timeout) throws TransitionDefinitionException, MoveDefinitionException, GoalDefinitionException { // Human gamer does no metagaming at the beginning of the match. } @Override public void stateMachineStop() { // Human gamer does no special cleanup when the match ends normally. } @Override public void stateMachineAbort() { // Human gamer does no special cleanup when the match ends abruptly. } @Override public StateMachine getInitialStateMachine() { return new CachedStateMachine(new ProverStateMachine()); } @Override public boolean isComputerPlayer() { return false; } }