summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2011-06-21 20:44:28 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2011-06-21 20:44:28 +0200
commit6acf9d6078d89eef5d2f2b19372b99baefd122af (patch)
treed9e74484006c39d17213bcee9b2ba907815832fd /src
parent5d0d5932971c456b85b142f9e483f0226dfefc2b (diff)
downloadJRummikub-6acf9d6078d89eef5d2f2b19372b99baefd122af.tar
JRummikub-6acf9d6078d89eef5d2f2b19372b99baefd122af.zip
Fix redealing in network mode
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@554 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src')
-rw-r--r--src/jrummikub/control/GameControl.java2
-rw-r--r--src/jrummikub/control/RoundControl.java98
-rw-r--r--src/jrummikub/control/network/ConnectionControl.java29
-rw-r--r--src/jrummikub/control/network/IConnectionControl.java4
-rw-r--r--src/jrummikub/control/network/NetworkRoundControl.java9
-rw-r--r--src/jrummikub/control/network/NetworkTurnControl.java13
6 files changed, 101 insertions, 54 deletions
diff --git a/src/jrummikub/control/GameControl.java b/src/jrummikub/control/GameControl.java
index a738223..1f659f8 100644
--- a/src/jrummikub/control/GameControl.java
+++ b/src/jrummikub/control/GameControl.java
@@ -217,7 +217,7 @@ public class GameControl {
}
/**
- * Restarts round after loading
+ * Restarts round after redealing
*/
private void restartRound() {
roundControl = null;
diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java
index 7f3135a..4227741 100644
--- a/src/jrummikub/control/RoundControl.java
+++ b/src/jrummikub/control/RoundControl.java
@@ -44,20 +44,19 @@ 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;
@@ -70,11 +69,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) {
@@ -124,9 +123,9 @@ public class RoundControl {
* 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
*/
public RoundControl(IRoundState roundState, IView view) {
this(roundState, view, true);
@@ -136,11 +135,11 @@ public class RoundControl {
* 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
+ * true when players are allowed to pause
*/
protected RoundControl(IRoundState roundState, IView view, boolean mayPause) {
this.roundState = roundState;
@@ -216,7 +215,7 @@ public class RoundControl {
* Sets the current round state
*
* @param state
- * to be set
+ * to be set
*/
protected void setRoundState(IRoundState state) {
roundState = state;
@@ -255,12 +254,11 @@ 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());
@@ -296,8 +294,9 @@ 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
@@ -338,7 +337,7 @@ public class RoundControl {
* Override this
*
* @param turnControl
- * current turn control
+ * current turn control
*/
protected void addTurnControlListeners(ITurnControl turnControl) {
}
@@ -347,7 +346,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) {
@@ -361,10 +360,8 @@ 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));
}
}
@@ -375,7 +372,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()
@@ -393,16 +390,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) {
@@ -412,8 +409,7 @@ 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();
@@ -501,12 +497,10 @@ 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;
@@ -530,11 +524,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(
@@ -558,10 +552,10 @@ 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() {
+ protected void redeal() {
turnControl = null;
for (Connection c : new ArrayList<Connection>(connections)) {
c.remove();
diff --git a/src/jrummikub/control/network/ConnectionControl.java b/src/jrummikub/control/network/ConnectionControl.java
index 832b067..785350e 100644
--- a/src/jrummikub/control/network/ConnectionControl.java
+++ b/src/jrummikub/control/network/ConnectionControl.java
@@ -107,6 +107,7 @@ public class ConnectionControl implements IConnectionControl {
private Event gameStartEvent = new Event();
private Event roundStartEvent = new Event();
+ private Event redealEvent = new Event();
private Event1<IRoundState> roundStateUpdateEvent = new Event1<IRoundState>();
private Event1<ITable> tableUpdateEvent = new Event1<ITable>();
@@ -221,6 +222,11 @@ public class ConnectionControl implements IConnectionControl {
}
@Override
+ public IEvent getRedealEvent() {
+ return redealEvent;
+ }
+
+ @Override
public IEvent1<IRoundState> getRoundStateUpdateEvent() {
return roundStateUpdateEvent;
}
@@ -368,6 +374,18 @@ public class ConnectionControl implements IConnectionControl {
}
@Override
+ public void redeal() {
+ final UUID uuid = currentGame.getGameID();
+ run(new SendRunner() {
+ @Override
+ protected void addData(DefaultPacketExtension extension) {
+ extension.setValue("messageType", "redeal");
+ extension.setValue("uuid", uuid.toString());
+ }
+ });
+ }
+
+ @Override
public void updateRoundState(final IRoundState roundState) {
final UUID uuid = currentGame.getGameID();
run(new SendRunner() {
@@ -541,7 +559,16 @@ public class ConnectionControl implements IConnectionControl {
gameStartEvent.emit();
} else if (messageType.equals("round_start")) {
roundStartEvent.emit();
- } else if (messageType.equals("round_state_update")) {
+ } else if (messageType.equals("redeal")) {
+ redealEvent.emit();
+ } else {
+ messagesDuringRound(extension, messageType);
+ }
+ }
+
+ private void messagesDuringRound(DefaultPacketExtension extension,
+ String messageType) {
+ if (messageType.equals("round_state_update")) {
IRoundState state = (IRoundState) Base64.decodeToObject(extension
.getValue("state"));
fixGameSettings(state.getGameSettings());
diff --git a/src/jrummikub/control/network/IConnectionControl.java b/src/jrummikub/control/network/IConnectionControl.java
index 667a4f9..19042c3 100644
--- a/src/jrummikub/control/network/IConnectionControl.java
+++ b/src/jrummikub/control/network/IConnectionControl.java
@@ -40,6 +40,8 @@ interface IConnectionControl {
public IEvent getRoundStartEvent();
+ public IEvent getRedealEvent();
+
public IEvent1<IRoundState> getRoundStateUpdateEvent();
public IEvent1<ITable> getTableUpdateEvent();
@@ -70,6 +72,8 @@ interface IConnectionControl {
public void startRound();
+ public void redeal();
+
public void updateRoundState(IRoundState roundState);
public void updateTable(ITable table);
diff --git a/src/jrummikub/control/network/NetworkRoundControl.java b/src/jrummikub/control/network/NetworkRoundControl.java
index 934abf0..20a4c28 100644
--- a/src/jrummikub/control/network/NetworkRoundControl.java
+++ b/src/jrummikub/control/network/NetworkRoundControl.java
@@ -102,4 +102,13 @@ public class NetworkRoundControl extends RoundControl {
super.endOfTurn(invalidTurnInfo);
}
+
+ @Override
+ protected void redeal() {
+ if (currentlyActive) {
+ connectionControl.redeal();
+ }
+
+ super.redeal();
+ }
}
diff --git a/src/jrummikub/control/network/NetworkTurnControl.java b/src/jrummikub/control/network/NetworkTurnControl.java
index dacc892..07d46ba 100644
--- a/src/jrummikub/control/network/NetworkTurnControl.java
+++ b/src/jrummikub/control/network/NetworkTurnControl.java
@@ -6,6 +6,7 @@ import jrummikub.model.IRoundState;
import jrummikub.model.ITable;
import jrummikub.util.Event1;
import jrummikub.util.IEvent1;
+import jrummikub.util.IListener;
import jrummikub.util.IListener1;
import jrummikub.util.IListener2;
@@ -37,6 +38,12 @@ public class NetworkTurnControl extends AbstractTurnControl {
endOfTurn(state, invalidTurnInfo);
}
}));
+ connections.add(connectionControl.getRedealEvent().add(new IListener() {
+ @Override
+ public void handle() {
+ redeal();
+ }
+ }));
timer.startTimer();
}
@@ -47,6 +54,12 @@ public class NetworkTurnControl extends AbstractTurnControl {
endOfTurnEvent.emit(roundState, invalidTurnInfo);
}
+ private void redeal() {
+ cleanUp();
+
+ redealEvent.emit();
+ }
+
@Override
protected void timeOut() {
}