diff options
-rw-r--r-- | src/jrummikub/ai/TurnLogic.java | 4 | ||||
-rw-r--r-- | src/jrummikub/control/ApplicationControl.java | 102 | ||||
-rw-r--r-- | src/jrummikub/control/LoginControl.java | 19 | ||||
-rw-r--r-- | src/jrummikub/control/RoundControl.java | 102 | ||||
-rw-r--r-- | src/jrummikub/control/turn/ITurnControl.java | 30 | ||||
-rw-r--r-- | src/jrummikub/server/DedicatedServer.java | 25 | ||||
-rw-r--r-- | src/jrummikub/view/IView.java | 3 | ||||
-rw-r--r-- | src/jrummikub/view/impl/TablePanel.java | 4 |
8 files changed, 174 insertions, 115 deletions
diff --git a/src/jrummikub/ai/TurnLogic.java b/src/jrummikub/ai/TurnLogic.java index 26318cf..5699b5f 100644 --- a/src/jrummikub/ai/TurnLogic.java +++ b/src/jrummikub/ai/TurnLogic.java @@ -6,7 +6,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import jrummikub.model.GameSettings; @@ -16,7 +15,8 @@ import jrummikub.model.StoneSet; import jrummikub.util.Pair; /** - * Logic behind the ai turns + * Logic behind the AI turns. Ability to correctly find turns is completly + * tested by the HandTest testcases. */ public class TurnLogic { private GameSettings settings; diff --git a/src/jrummikub/control/ApplicationControl.java b/src/jrummikub/control/ApplicationControl.java index 58d1690..7f5cf6d 100644 --- a/src/jrummikub/control/ApplicationControl.java +++ b/src/jrummikub/control/ApplicationControl.java @@ -38,22 +38,41 @@ public class ApplicationControl { this.view = view; saveControl = new SaveControl(view); + addQuitGameHandlers(); + + view.getNetworkGameEvent().add(new IListener() { + @Override + public void handle() { + abortControls(); + + createLoginControl(true); + } + }); + + saveControl.getLoadEvent().add( + new IListener3<GameSettings, GameState, IRoundState>() { + @Override + public void handle(GameSettings settings, GameState gameState, + IRoundState roundState) { + abortControls(); + gameControl = new GameControl(settings, saveControl, view); + addGameControlListeners(gameControl); + gameControl.continueGame(gameState, roundState); + } + }); + saveControl.getLoadErrorEvent().add(new IListener() { + @Override + public void handle() { + view.showLoadingError(); + } + }); + } + + private void addQuitGameHandlers() { view.getMenuNewGameEvent().add(new IListener() { @Override public void handle() { - view.getQuitWarningPanel().setMode(QuitMode.QUIT_GAME); - view.showQuitWarningPanel(true); - tempConnection = view.getQuitWarningPanel().getQuitEvent() - .add(new IListener() { - @Override - public void handle() { - abortControls(); - startApplication(); - view.showQuitWarningPanel(false); - tempConnection.remove(); - tempConnection = null; - } - }); + showRestartWarning(); } }); view.getQuitEvent().add(new IListener() { @@ -62,23 +81,13 @@ public class ApplicationControl { if (networkControl != null) { return; } - if (gameControl == null) { System.exit(0); } else { - view.getQuitWarningPanel().setMode(QuitMode.QUIT_PROCESS); - view.showQuitWarningPanel(true); - tempConnection = view.getQuitWarningPanel().getQuitEvent() - .add(new IListener() { - @Override - public void handle() { - System.exit(0); - } - }); + showQuitWarning(); } } }); - view.getQuitWarningPanel().getCancelEvent().add(new IListener() { @Override public void handle() { @@ -89,33 +98,34 @@ public class ApplicationControl { } } }); + } - view.getNetworkGameEvent().add(new IListener() { - @Override - public void handle() { - abortControls(); - - createLoginControl(true); - } - }); - - saveControl.getLoadEvent().add( - new IListener3<GameSettings, GameState, IRoundState>() { + private void showRestartWarning() { + view.getQuitWarningPanel().setMode(QuitMode.QUIT_GAME); + view.showQuitWarningPanel(true); + tempConnection = view.getQuitWarningPanel().getQuitEvent() + .add(new IListener() { @Override - public void handle(GameSettings settings, GameState gameState, - IRoundState roundState) { + public void handle() { abortControls(); - gameControl = new GameControl(settings, saveControl, view); - addGameControlListeners(gameControl); - gameControl.continueGame(gameState, roundState); + startApplication(); + view.showQuitWarningPanel(false); + tempConnection.remove(); + tempConnection = null; + } + }); + } + + private void showQuitWarning() { + view.getQuitWarningPanel().setMode(QuitMode.QUIT_PROCESS); + view.showQuitWarningPanel(true); + tempConnection = view.getQuitWarningPanel().getQuitEvent() + .add(new IListener() { + @Override + public void handle() { + System.exit(0); } }); - saveControl.getLoadErrorEvent().add(new IListener() { - @Override - public void handle() { - view.showLoadingError(); - } - }); } /** diff --git a/src/jrummikub/control/LoginControl.java b/src/jrummikub/control/LoginControl.java index 24bfcf6..8908c0d 100644 --- a/src/jrummikub/control/LoginControl.java +++ b/src/jrummikub/control/LoginControl.java @@ -27,7 +27,7 @@ public class LoginControl { * Constructor for login Control * * @param view - * for events which need handling + * for events which need handling */ public LoginControl(final IView view) { this.view = view; @@ -40,18 +40,21 @@ public class LoginControl { } })); - connections.add(view.getLoginPanel().getCancelEvent().add(new IListener() { - @Override - public void handle() { - abort(); - cancelEvent.emit(); - } - })); + connections.add(view.getLoginPanel().getCancelEvent() + .add(new IListener() { + @Override + public void handle() { + abort(); + cancelEvent.emit(); + } + })); } /** * Open Login panel * + * @param reset + * when true resets the information in the login panel */ public void startLogin(boolean reset) { if (reset) { diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java index c15eff7..7f3135a 100644 --- a/src/jrummikub/control/RoundControl.java +++ b/src/jrummikub/control/RoundControl.java @@ -44,19 +44,20 @@ public class RoundControl { /** There are invalid set(s) on the table */ INVALID_SETS, /** - * The player tried to modify the table without providing the initial meld - * threshold first + * The player tried to modify the table without providing the initial + * meld threshold first */ INITIAL_MELD_ERROR, /** - * The player didn't provide enough points for the initial meld threshold + * The player didn't provide enough points for the initial meld + * threshold */ NOT_ENOUGH_POINTS } /** - * Table, stone sets and type of an invalid turn to allow a user to track his - * own errors + * Table, stone sets and type of an invalid turn to allow a user to track + * his own errors */ public static class InvalidTurnInfo implements Serializable { private static final long serialVersionUID = -3591000741414366776L; @@ -69,11 +70,11 @@ public class RoundControl { * Creates new InvalidTurnInfo * * @param table - * the table after the turn + * the table after the turn * @param type - * the type of the invalid turn + * the type of the invalid turn * @param invalidSets - * the sets causing the turn to be invalid + * the sets causing the turn to be invalid */ public InvalidTurnInfo(ITable table, InvalidTurnType type, Collection<StoneSet> invalidSets) { @@ -119,17 +120,27 @@ public class RoundControl { protected List<Connection> connections = new ArrayList<Connection>(); private boolean mayPause; + /** + * Create a new RoundControl using the given roundState and view + * + * @param roundState + * initial round state + * @param view + * view used for user interaction + */ public RoundControl(IRoundState roundState, IView view) { this(roundState, view, true); } /** - * Create a new RoundControl using the given gameState and view + * Create a new RoundControl using the given roundState and view * * @param roundState - * initial round state + * initial round state * @param view - * view used for user interaction + * view used for user interaction + * @param mayPause + * true when players are allowed to pause */ protected RoundControl(IRoundState roundState, IView view, boolean mayPause) { this.roundState = roundState; @@ -205,7 +216,7 @@ public class RoundControl { * Sets the current round state * * @param state - * to be set + * to be set */ protected void setRoundState(IRoundState state) { roundState = state; @@ -244,11 +255,12 @@ public class RoundControl { } view.getTablePanel().setStoneSets(roundState.getTable().clone()); - view.setCurrentPlayerName(roundState.getActivePlayer().getPlayerSettings() - .getName()); - view.setCurrentPlayerColor(roundState.getActivePlayer().getPlayerSettings() - .getColor()); - view.setCurrentPlayerHasLaidOut(roundState.getActivePlayer().getLaidOut()); + view.setCurrentPlayerName(roundState.getActivePlayer() + .getPlayerSettings().getName()); + view.setCurrentPlayerColor(roundState.getActivePlayer() + .getPlayerSettings().getColor()); + view.setCurrentPlayerHasLaidOut(roundState.getActivePlayer() + .getLaidOut()); turnControl = createTurnControl(roundState.getActivePlayer() .getPlayerSettings().getType()); @@ -284,9 +296,8 @@ public class RoundControl { view.getPlayerPanel().setEndTurnMode(turnMode); } - turnControl.setup( - new ITurnControl.TurnInfo(roundState, turnMode, mayPause), - roundState.getGameSettings(), view); + turnControl.setup(new ITurnControl.TurnInfo(roundState, turnMode, + mayPause), roundState.getGameSettings(), view); turnControl.getEndOfTurnEvent().add( new IListener2<IRoundState, InvalidTurnInfo>() { @Override @@ -327,7 +338,7 @@ public class RoundControl { * Override this * * @param turnControl - * current turn control + * current turn control */ protected void addTurnControlListeners(ITurnControl turnControl) { } @@ -336,7 +347,7 @@ public class RoundControl { * Creates new turn control of the specified type * * @param type - * of the new turn control + * of the new turn control * @return the new turn control */ protected ITurnControl createTurnControl(Type type) { @@ -350,8 +361,10 @@ public class RoundControl { protected void deal() { for (int i = 0; i < roundState.getPlayerCount(); i++) { IHand hand = roundState.getNthNextPlayer(i).getHand(); - for (int j = 0; j < roundState.getGameSettings().getNumberOfStonesDealt(); j++) { - hand.drop(roundState.getGameHeap().drawStone(), new Position(0, 0)); + for (int j = 0; j < roundState.getGameSettings() + .getNumberOfStonesDealt(); j++) { + hand.drop(roundState.getGameHeap().drawStone(), new Position(0, + 0)); } } @@ -362,7 +375,7 @@ public class RoundControl { * End the players turn * * @param invalidTurnInfo - * info about the player's last turn + * info about the player's last turn */ protected void endOfTurn(InvalidTurnInfo invalidTurnInfo) { boolean isHuman = roundState.getActivePlayer().getPlayerSettings() @@ -380,16 +393,16 @@ public class RoundControl { view.setInvalidStoneSets(invalidTurnInfo.getInvalidSets()); switch (invalidTurnInfo.getType()) { - case INITIAL_MELD_ERROR: - view.setInitialMeldFirstError(); - break; - case INVALID_SETS: - view.setStoneCollectionHidden(true); - break; - case NOT_ENOUGH_POINTS: - view.setInitialMeldError(roundState.getGameSettings() - .getInitialMeldThreshold()); - break; + case INITIAL_MELD_ERROR: + view.setInitialMeldFirstError(); + break; + case INVALID_SETS: + view.setStoneCollectionHidden(true); + break; + case NOT_ENOUGH_POINTS: + view.setInitialMeldError(roundState.getGameSettings() + .getInitialMeldThreshold()); + break; } if (!isHuman) { @@ -399,7 +412,8 @@ public class RoundControl { } view.setBottomPanel(BottomPanelType.NONHUMAN_HAND_PANEL); - view.getPlayerPanel().setTime(roundState.getGameSettings().getTotalTime(), + view.getPlayerPanel().setTime( + roundState.getGameSettings().getTotalTime(), roundState.getGameSettings().getTotalTime()); nextPlayer(); @@ -487,10 +501,12 @@ public class RoundControl { stonePoints = playerHand.isInitialMeldPossible(roundState .getGameSettings()) ? 200 : 100; } else { - stonePoints = playerHand.getStonePoints(roundState.getGameSettings()); + stonePoints = playerHand.getStonePoints(roundState + .getGameSettings()); } - bestScore = updateBestScore(bestScore, -stonePoints, playerHand.getSize()); + bestScore = updateBestScore(bestScore, -stonePoints, + playerHand.getSize()); points.add(-stonePoints); pointSum += stonePoints; @@ -514,11 +530,11 @@ public class RoundControl { * (everybody still has stones on hand) * * @param bestScore - * of previous rounds + * of previous rounds * @param stonePoints - * sum of points still left on hands + * sum of points still left on hands * @param size - * number of players in game (= size of score list in columns) + * number of players in game (= size of score list in columns) * @return Pair of maximum points and hand size */ private static Pair<Integer, Integer> updateBestScore( @@ -542,8 +558,8 @@ public class RoundControl { } /** - * Redeal stones and restart round if a player was allowed to redeal and chose - * to do so + * Redeal stones and restart round if a player was allowed to redeal and + * chose to do so */ private void redeal() { turnControl = null; diff --git a/src/jrummikub/control/turn/ITurnControl.java b/src/jrummikub/control/turn/ITurnControl.java index ab4d6ae..62f9dfb 100644 --- a/src/jrummikub/control/turn/ITurnControl.java +++ b/src/jrummikub/control/turn/ITurnControl.java @@ -19,12 +19,12 @@ public interface ITurnControl { * Start the turn * * @param info - * the current turn state + * the current turn state * * @param settings - * the game settings + * the game settings * @param view - * view for user interaction. + * view for user interaction. */ public void setup(TurnInfo info, GameSettings settings, IView view); @@ -60,7 +60,8 @@ public interface ITurnControl { public IEvent1<ITable> getTableUpdateEvent(); /** - * The TurnInfo class encapsulates all information concerning the current turn + * The TurnInfo class encapsulates all information concerning the current + * turn */ public class TurnInfo { private IRoundState roundState; @@ -78,12 +79,15 @@ public interface ITurnControl { /** * Creates a new TurnInfo instance * - * @param hasLaidOut - * has the player laid out yet? + * @param roundState + * current round state * @param turnMode - * the turn mode + * the turn mode + * @param mayPause + * player is allowed to paues */ - public TurnInfo(IRoundState roundState, TurnMode turnMode, boolean mayPause) { + public TurnInfo(IRoundState roundState, TurnMode turnMode, + boolean mayPause) { this.roundState = roundState; oldTable = roundState.getTable(); @@ -97,6 +101,11 @@ public interface ITurnControl { this.mayPause = mayPause; } + /** + * Get the current round state + * + * @return the current round state + */ public IRoundState getRoundState() { return roundState; } @@ -155,6 +164,11 @@ public interface ITurnControl { return turnMode; } + /** + * Return whether pausing is allowed during this turn + * + * @return true if pause is allowed + */ public boolean isMayPause() { return mayPause; } diff --git a/src/jrummikub/server/DedicatedServer.java b/src/jrummikub/server/DedicatedServer.java index 42345a6..e27c74c 100644 --- a/src/jrummikub/server/DedicatedServer.java +++ b/src/jrummikub/server/DedicatedServer.java @@ -1,6 +1,5 @@ package jrummikub.server; -import java.io.IOException; import java.net.InetAddress; import org.apache.vysper.mina.TCPEndpoint; @@ -13,7 +12,9 @@ import org.apache.vysper.xmpp.modules.extension.xep0045_muc.storage.InMemoryRoom import org.apache.vysper.xmpp.modules.roster.persistence.MemoryRosterManager; import org.apache.vysper.xmpp.server.XMPPServer; -@SuppressWarnings("deprecation") +/** + * Implements a simple XMPP server with a global server password + */ public class DedicatedServer { String serverPassword; String hostName; @@ -44,6 +45,12 @@ public class DedicatedServer { return hostName; } + /** + * Start the server, this blocks + * + * @throws Exception + * when there is an error during startup + */ public void start() throws Exception { XMPPServer server = new XMPPServer(hostName); @@ -67,6 +74,9 @@ public class DedicatedServer { } + /** + * Allow authorization using a single password for all users + */ public class ServerPasswordAuthorization implements UserAuthorization { @Override public boolean verifyCredentials(Entity entity, String password, @@ -81,9 +91,16 @@ public class DedicatedServer { } } + /** + * Main for a simple command line dedicated server + * + * @param args + * first argument specifies the server password, it is "jrummikub" + * when none is specified + */ public static void main(String[] args) { - - DedicatedServer server = new DedicatedServer("password"); + DedicatedServer server = new DedicatedServer(args.length >= 1 ? args[0] + : "jrummikub"); System.out.println("Server hostname is " + server.getHostName()); try { server.start(); diff --git a/src/jrummikub/view/IView.java b/src/jrummikub/view/IView.java index c0dc675..a88d002 100644 --- a/src/jrummikub/view/IView.java +++ b/src/jrummikub/view/IView.java @@ -221,6 +221,9 @@ public interface IView { */ public void showLoginPanel(boolean show); + /** + * Clears user input of the resetLoginPanel + */ public void resetLoginPanel(); /** diff --git a/src/jrummikub/view/impl/TablePanel.java b/src/jrummikub/view/impl/TablePanel.java index 4db1a52..5677d9a 100644 --- a/src/jrummikub/view/impl/TablePanel.java +++ b/src/jrummikub/view/impl/TablePanel.java @@ -369,10 +369,6 @@ class TablePanel extends AbstractStonePanel implements ITablePanel { g.setClip(oldClip); - if (leftHoveredConnector == null && rightHoveredConnector == null) { - return; // We're done here... - } - g.translate(translation.getFirst(), translation.getSecond()); g.setClip(hoveredConnectorArea); g.setTransform(oldTransform); |