summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jrummikub/ai/TurnLogic.java4
-rw-r--r--src/jrummikub/control/ApplicationControl.java102
-rw-r--r--src/jrummikub/control/LoginControl.java19
-rw-r--r--src/jrummikub/control/RoundControl.java102
-rw-r--r--src/jrummikub/control/turn/ITurnControl.java30
-rw-r--r--src/jrummikub/server/DedicatedServer.java25
-rw-r--r--src/jrummikub/view/IView.java3
-rw-r--r--src/jrummikub/view/impl/TablePanel.java4
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);