diff --git a/src/java/com/threerings/parlor/game/GameController.java b/src/java/com/threerings/parlor/game/GameController.java
index d7db4ce4c..215d2d05f 100644
--- a/src/java/com/threerings/parlor/game/GameController.java
+++ b/src/java/com/threerings/parlor/game/GameController.java
@@ -1,5 +1,5 @@
//
-// $Id: GameController.java,v 1.9 2002/02/13 03:21:28 mdb Exp $
+// $Id: GameController.java,v 1.10 2002/04/14 00:26:05 mdb Exp $
package com.threerings.parlor.game;
@@ -87,6 +87,42 @@ public abstract class GameController extends PlaceController
_gobj = null;
}
+ /**
+ * Returns whether the game is over.
+ */
+ public boolean isGameOver ()
+ {
+ return (_gameOver || _gobj.state == GameObject.GAME_OVER);
+ }
+
+ /**
+ * Sets the client game over override. This is used in situations
+ * where we determine that the game is over before the server has
+ * informed us of such.
+ */
+ public void setGameOver (boolean gameOver)
+ {
+ _gameOver = gameOver;
+ }
+
+ /**
+ * Calls {@link #gameWillReset}, ends the current game (locally, it
+ * does not tell the server to end the game), and waits to receive a
+ * reset notification (which is simply an event setting the game state
+ * to IN_PLAY even though it's already set to
+ * IN_PLAY) from the server which will start up a new
+ * game. Derived classes should override {@link #gameWillReset} to
+ * perform any game-specific animations.
+ */
+ public void resetGame ()
+ {
+ // let derived classes do their thing
+ gameWillReset();
+
+ // end the game until we receive a new board
+ setGameOver(true);
+ }
+
/**
* Handles basic game controller action events. Derived classes should
* be sure to call super.handleAction for events they
@@ -164,6 +200,21 @@ public abstract class GameController extends PlaceController
});
}
+ /**
+ * Called to give derived classes a chance to display animations, send
+ * a final packet, or do any other business they care to do when the
+ * game is about to reset.
+ */
+ protected void gameWillReset ()
+ {
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ ((GameControllerDelegate)delegate).gameWillReset();
+ }
+ });
+ }
+
/** A reference to the active parlor context. */
protected ParlorContext _ctx;
@@ -173,4 +224,9 @@ public abstract class GameController extends PlaceController
/** A reference to the game object for the game that we're
* controlling. */
protected GameObject _gobj;
+
+ /** A local flag overriding the game over state for situations where
+ * the client knows the game is over before the server has
+ * transitioned the game object accordingly. */
+ protected boolean _gameOver;
}
diff --git a/src/java/com/threerings/parlor/game/GameControllerDelegate.java b/src/java/com/threerings/parlor/game/GameControllerDelegate.java
index 60c004ef6..4dba3da31 100644
--- a/src/java/com/threerings/parlor/game/GameControllerDelegate.java
+++ b/src/java/com/threerings/parlor/game/GameControllerDelegate.java
@@ -1,5 +1,5 @@
//
-// $Id: GameControllerDelegate.java,v 1.1 2002/02/13 03:21:28 mdb Exp $
+// $Id: GameControllerDelegate.java,v 1.2 2002/04/14 00:26:05 mdb Exp $
package com.threerings.parlor.game;
@@ -44,4 +44,13 @@ public class GameControllerDelegate extends PlaceControllerDelegate
public void gameWasCancelled ()
{
}
+
+ /**
+ * Called to give derived classes a chance to display animations, send
+ * a final packet, or do any other business they care to do when the
+ * game is about to reset.
+ */
+ public void gameWillReset ()
+ {
+ }
}
diff --git a/src/java/com/threerings/parlor/game/GameManager.java b/src/java/com/threerings/parlor/game/GameManager.java
index daec9b8f8..492f7b225 100644
--- a/src/java/com/threerings/parlor/game/GameManager.java
+++ b/src/java/com/threerings/parlor/game/GameManager.java
@@ -1,5 +1,5 @@
//
-// $Id: GameManager.java,v 1.23 2002/02/20 23:35:42 mdb Exp $
+// $Id: GameManager.java,v 1.24 2002/04/14 00:26:05 mdb Exp $
package com.threerings.parlor.game;
@@ -173,10 +173,8 @@ public class GameManager extends PlaceManager
// transition the game to started
_gameobj.setState(GameObject.IN_PLAY);
- // wait until we hear the game state transition on the game object
- // to invoke our game did start code so that we can be sure that
- // any events dispatched on the game object prior to or during the
- // call to startGame() have been dispatched
+ // do post-start processing
+ gameDidStart();
}
/**
@@ -199,7 +197,7 @@ public class GameManager extends PlaceManager
* Called after the game start notification was dispatched. Derived
* classes can override this to put whatever wheels they might need
* into motion now that the game is started (if anything other than
- * issuing the game start notification is necessary).
+ * transitioning the game to IN_PLAY is necessary).
*/
protected void gameDidStart ()
{
@@ -246,16 +244,66 @@ public class GameManager extends PlaceManager
// calculate ratings and all that...
}
+ /**
+ * Called when the game is to be reset to its starting state in
+ * preparation for a new game without actually ending the current
+ * game. It calls {@link #gameWillReset} and {@link #gameDidReset}.
+ * The standard game start processing ({@link #gameWillStart} and
+ * {@link gameDidStart}) will also be called (in between the calls to
+ * will and did reset). Derived classes should override one or both of
+ * the calldown functions (rather than this function) if they need to
+ * do things before or after the game resets.
+ */
+ public void resetGame ()
+ {
+ // let the derived class do its pre-reset stuff
+ gameWillReset();
+
+ // do the standard game start processing
+ gameWillStart();
+ _gameobj.setState(GameObject.IN_PLAY);
+ gameDidStart();
+
+ // let the derived class do its post-reset stuff
+ gameDidReset();
+ }
+
+ /**
+ * Called when the game is about to reset, but before the board has
+ * been re-initialized or any other clearing out of game data has
+ * taken place. Derived classes should override this if they need to
+ * perform some pre-reset activities.
+ */
+ protected void gameWillReset ()
+ {
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceManagerDelegate delegate) {
+ ((GameManagerDelegate)delegate).gameWillReset();
+ }
+ });
+ }
+
+ /**
+ * Called after the game has been reset. Derived classes can override
+ * this to put whatever wheels they might need into motion now that
+ * the game is reset.
+ */
+ protected void gameDidReset ()
+ {
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceManagerDelegate delegate) {
+ ((GameManagerDelegate)delegate).gameDidReset();
+ }
+ });
+ }
+
// documentation inherited
public void attributeChanged (AttributeChangedEvent event)
{
if (event.getName().equals(GameObject.STATE)) {
switch (event.getIntValue()) {
- case GameObject.IN_PLAY:
- // now we do our start of game processing
- gameDidStart();
- break;
-
case GameObject.GAME_OVER:
// now we do our end of game processing
gameDidEnd();
diff --git a/src/java/com/threerings/parlor/game/GameManagerDelegate.java b/src/java/com/threerings/parlor/game/GameManagerDelegate.java
index 5059b1bf3..c5d46f5ad 100644
--- a/src/java/com/threerings/parlor/game/GameManagerDelegate.java
+++ b/src/java/com/threerings/parlor/game/GameManagerDelegate.java
@@ -1,5 +1,5 @@
//
-// $Id: GameManagerDelegate.java,v 1.1 2002/02/13 03:21:28 mdb Exp $
+// $Id: GameManagerDelegate.java,v 1.2 2002/04/14 00:26:05 mdb Exp $
package com.threerings.parlor.game;
@@ -40,4 +40,22 @@ public class GameManagerDelegate extends PlaceManagerDelegate
public void gameDidEnd ()
{
}
+
+ /**
+ * Called when the game is about to reset, but before any other
+ * clearing out of game data has taken place. Derived classes should
+ * override this if they need to perform some pre-reset activities.
+ */
+ public void gameWillReset ()
+ {
+ }
+
+ /**
+ * Called after the game has been reset. Derived classes can override
+ * this to put whatever wheels they might need into motion now that
+ * the game is reset.
+ */
+ public void gameDidReset ()
+ {
+ }
}