diff --git a/src/java/com/threerings/parlor/game/data/GameObject.java b/src/java/com/threerings/parlor/game/data/GameObject.java index 194280f1b..0625b539f 100644 --- a/src/java/com/threerings/parlor/game/data/GameObject.java +++ b/src/java/com/threerings/parlor/game/data/GameObject.java @@ -67,7 +67,7 @@ public class GameObject extends PlaceObject /** A game state constant indicating that the game has not yet started * and is still awaiting the arrival of all of the players. */ - public static final int AWAITING_PLAYERS = 0; + public static final int PRE_GAME = 0; /** A game state constant indicating that the game is in play. */ public static final int IN_PLAY = 1; @@ -89,9 +89,9 @@ public class GameObject extends PlaceObject /** Provides general game invocation services. */ public GameMarshaller gameService; - /** The game state, one of {@link #AWAITING_PLAYERS}, {@link #IN_PLAY}, + /** The game state, one of {@link #PRE_GAME}, {@link #IN_PLAY}, * {@link #GAME_OVER}, or {@link #CANCELLED}. */ - public int state; + public int state = PRE_GAME; /** Indicates whether or not this game is rated. */ public boolean isRated; diff --git a/src/java/com/threerings/parlor/game/server/GameManager.java b/src/java/com/threerings/parlor/game/server/GameManager.java index a72eca7eb..1f1ff8f97 100644 --- a/src/java/com/threerings/parlor/game/server/GameManager.java +++ b/src/java/com/threerings/parlor/game/server/GameManager.java @@ -315,7 +315,7 @@ public class GameManager extends PlaceManager Name name = getPlayerName(playerIdx); return (name == null) ? null : CrowdServer.lookupBody(name); } - + /** * Sets the specified player as an AI with the specified * configuration. It is assumed that this will be set soon after the @@ -355,7 +355,7 @@ public class GameManager extends PlaceManager } /** - * Returns the player index of the given user in the game, or + * Returns the player index of the given user in the game, or * -1 if the player is not involved in the game. */ public int getPlayerIndex (Name username) @@ -431,8 +431,7 @@ public class GameManager extends PlaceManager String msgbundle, String msg, boolean waitForStart) { if (waitForStart && - ((_gameobj == null) || - (_gameobj.state == GameObject.AWAITING_PLAYERS))) { + ((_gameobj == null) || (_gameobj.state == GameObject.PRE_GAME))) { // queue up the message. if (_startmsgs == null) { _startmsgs = new ArrayList(); @@ -609,8 +608,7 @@ public class GameManager extends PlaceManager { // start up the game if we're not a party game and if we haven't // already done so - if (!isPartyGame() && - _gameobj.state == GameObject.AWAITING_PLAYERS) { + if (!isPartyGame() && _gameobj.state == GameObject.PRE_GAME) { startGame(); } } @@ -624,7 +622,7 @@ public class GameManager extends PlaceManager protected void checkForNoShows () { // nothing to worry about if we're already started - if (_gameobj.state != GameObject.AWAITING_PLAYERS) { + if (_gameobj.state != GameObject.PRE_GAME) { return; } @@ -740,7 +738,7 @@ public class GameManager extends PlaceManager { // initialize the player status _gameobj.setPlayerStatus(new int[getPlayerSlots()]); - + // increment the round identifier _gameobj.setRoundId(_gameobj.roundId + 1); @@ -752,6 +750,32 @@ public class GameManager extends PlaceManager }); } + /** + * Called when the game state changes. This happens after the attribute + * change event has propagated. + * + * @param state the new game state. + * @param oldState the previous game state. + */ + protected void stateDidChange (int state, int oldState) + { + switch (state) { + case GameObject.IN_PLAY: + gameDidStart(); + break; + + case GameObject.CANCELLED: + // fall through to GAME_OVER case + + case GameObject.GAME_OVER: + // call gameDidEnd() only if the game was previously in play + if (oldState == GameObject.IN_PLAY) { + gameDidEnd(); + } + break; + } + } + /** * Called after the game start notification was dispatched. Derived * classes can override this to put whatever wheels they might need @@ -941,7 +965,7 @@ public class GameManager extends PlaceManager { return (_gameobj.state == GameObject.GAME_OVER); } - + /** * Called when the game is about to end, but before the game end * notification has been delivered to the players. Derived classes @@ -984,7 +1008,7 @@ public class GameManager extends PlaceManager if (shouldConcludeGame() && winnerCount > 0 && !_gameobj.isDraw()) { reportWinnersAndLosers(); } - + // calculate ratings and all that... } @@ -1020,7 +1044,7 @@ public class GameManager extends PlaceManager } } } - + /** * Called when the game is to be reset to its starting state in * preparation for a new game without actually ending the current @@ -1124,22 +1148,8 @@ public class GameManager extends PlaceManager public void attributeChanged (AttributeChangedEvent event) { if (event.getName().equals(GameObject.STATE)) { - switch (_committedState = event.getIntValue()) { - case GameObject.IN_PLAY: - gameDidStart(); - break; - - case GameObject.CANCELLED: - // fall through to GAME_OVER case - - case GameObject.GAME_OVER: - // Call gameDidEnd only if it was actually started - if (((Integer)event.getOldValue()).intValue() == - GameObject.IN_PLAY) { - gameDidEnd(); - } - break; - } + stateDidChange(_committedState = event.getIntValue(), + ((Integer)event.getOldValue()).intValue()); } }