From 6acf9d6078d89eef5d2f2b19372b99baefd122af Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 21 Jun 2011 20:44:28 +0200 Subject: Fix redealing in network mode git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@554 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/control/GameControl.java | 2 +- src/jrummikub/control/RoundControl.java | 98 ++++++++++------------ .../control/network/ConnectionControl.java | 29 ++++++- .../control/network/IConnectionControl.java | 4 + .../control/network/NetworkRoundControl.java | 9 ++ .../control/network/NetworkTurnControl.java | 13 +++ 6 files changed, 101 insertions(+), 54 deletions(-) (limited to 'src/jrummikub') 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 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() { @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 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(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 roundStateUpdateEvent = new Event1(); private Event1 tableUpdateEvent = new Event1(); @@ -220,6 +221,11 @@ public class ConnectionControl implements IConnectionControl { return roundStartEvent; } + @Override + public IEvent getRedealEvent() { + return redealEvent; + } + @Override public IEvent1 getRoundStateUpdateEvent() { return roundStateUpdateEvent; @@ -367,6 +373,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(); @@ -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 getRoundStateUpdateEvent(); public IEvent1 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() { } -- cgit v1.2.3