diff --git a/src/java/com/threerings/crowd/client/PlaceController.java b/src/java/com/threerings/crowd/client/PlaceController.java
index e5594d25d..573ec3ca6 100644
--- a/src/java/com/threerings/crowd/client/PlaceController.java
+++ b/src/java/com/threerings/crowd/client/PlaceController.java
@@ -1,9 +1,10 @@
//
-// $Id: PlaceController.java,v 1.5 2001/10/12 19:31:15 mdb Exp $
+// $Id: PlaceController.java,v 1.6 2002/02/13 03:21:28 mdb Exp $
package com.threerings.crowd.client;
import java.awt.event.ActionEvent;
+import java.util.ArrayList;
import com.samskivert.swing.Controller;
import com.threerings.crowd.data.PlaceConfig;
@@ -41,6 +42,13 @@ public abstract class PlaceController
// create our user interface
_view = createPlaceView();
+ // initialize our delegates
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ delegate.init(_ctx, _config);
+ }
+ });
+
// let the derived classes do any initialization stuff
didInit();
}
@@ -54,6 +62,16 @@ public abstract class PlaceController
{
}
+ /**
+ * Returns a reference to the place view associated with this
+ * controller. This is only valid after a call has been made to {@link
+ * #init}.
+ */
+ public PlaceView getPlaceView ()
+ {
+ return _view;
+ }
+
/**
* Creates the user interface that will be used to display this place.
* The view instance returned will later be configured with the place
@@ -68,7 +86,7 @@ public abstract class PlaceController
* PlaceViewUtil#dispatchWillEnterPlace}. Derived classes can override
* this and perform any other starting up that they need to do
*/
- public void willEnterPlace (PlaceObject plobj)
+ public void willEnterPlace (final PlaceObject plobj)
{
if (_view != null ) {
// let the UI hierarchy know that we've got our place
@@ -76,6 +94,13 @@ public abstract class PlaceController
// and display the user interface
_ctx.setPlaceView(_view);
}
+
+ // let our delegates know what's up
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ delegate.willEnterPlace(plobj);
+ }
+ });
}
/**
@@ -85,12 +110,19 @@ public abstract class PlaceController
* super.didLeavePlace) and perform any necessary
* cleanup.
*/
- public void didLeavePlace (PlaceObject plobj)
+ public void didLeavePlace (final PlaceObject plobj)
{
// let the UI hierarchy know that we're outta here
if (_view != null ) {
PlaceViewUtil.dispatchDidLeavePlace(_view, plobj);
}
+
+ // let our delegates know what's up
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ delegate.didLeavePlace(plobj);
+ }
+ });
}
/**
@@ -98,9 +130,51 @@ public abstract class PlaceController
* should be sure to call super.handleAction for events
* they don't specifically handle.
*/
- public boolean handleAction (ActionEvent action)
+ public boolean handleAction (final ActionEvent action)
{
- return false;
+ final boolean[] handled = new boolean[0];
+
+ // let our delegates have a crack at the action
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ // we take advantage of short-circuiting here
+ handled[0] = handled[0] || delegate.handleAction(action);
+ }
+ });
+
+ return handled[0];
+ }
+
+ /**
+ * Adds the supplied delegate to the list for this controller.
+ */
+ protected void addDelegate (PlaceControllerDelegate delegate)
+ {
+ if (_delegates == null) {
+ _delegates = new ArrayList();
+ }
+ _delegates.add(delegate);
+ }
+
+ /**
+ * Used to call methods in delegates.
+ */
+ protected static interface DelegateOp
+ {
+ public void apply (PlaceControllerDelegate delegate);
+ }
+
+ /**
+ * Applies the supplied operation to the registered delegates.
+ */
+ protected void applyToDelegates (DelegateOp op)
+ {
+ if (_delegates != null) {
+ int dcount = _delegates.size();
+ for (int i = 0; i < dcount; i++) {
+ op.apply((PlaceControllerDelegate)_delegates.get(i));
+ }
+ }
}
/** A reference to the active client context. */
@@ -115,4 +189,7 @@ public abstract class PlaceController
/** A reference to the root user interface component. */
protected PlaceView _view;
+
+ /** A list of the delegates in use by this controller. */
+ protected ArrayList _delegates;
}
diff --git a/src/java/com/threerings/crowd/client/PlaceControllerDelegate.java b/src/java/com/threerings/crowd/client/PlaceControllerDelegate.java
new file mode 100644
index 000000000..f556a97cb
--- /dev/null
+++ b/src/java/com/threerings/crowd/client/PlaceControllerDelegate.java
@@ -0,0 +1,67 @@
+//
+// $Id: PlaceControllerDelegate.java,v 1.1 2002/02/13 03:21:28 mdb Exp $
+
+package com.threerings.crowd.client;
+
+import java.awt.event.ActionEvent;
+
+import com.threerings.crowd.data.PlaceConfig;
+import com.threerings.crowd.data.PlaceObject;
+import com.threerings.crowd.util.CrowdContext;
+
+/**
+ * Provides an extensible mechanism for encapsulating delegated
+ * functionality that works with the place services.
+ *
+ *
Thanks to Java's lack of multiple inheritance, it will likely + * become necessary to factor certain services that might be used by a + * variety of {@link PlaceController} derived classes into delegate + * classes because they do not fit into the single inheritance hierarchy + * that makes sense for a particular application. To facilitate this + * process, this delegate class is provided which the standard place + * controller can be made to call out to for all of the standard methods. + */ +public class PlaceControllerDelegate +{ + /** + * Constructs the delegate with the controller for which it is + * delegating. + */ + public PlaceControllerDelegate (PlaceController controller) + { + _controller = controller; + } + + /** + * Called to initialize the delegate. + */ + public void init (CrowdContext ctx, PlaceConfig config) + { + } + + /** + * Called to let the delegate know that we're entering a place. + */ + public void willEnterPlace (PlaceObject plobj) + { + } + + /** + * Called to let the delegate know that we've left the place. + */ + public void didLeavePlace (PlaceObject plobj) + { + } + + /** + * Called to give the delegate a chance to handle controller actions + * that weren't handled by the main controller. + */ + public boolean handleAction (ActionEvent action) + { + return false; + } + + /** A reference to the controller for which we are delegating. */ + protected PlaceController _controller; +} diff --git a/src/java/com/threerings/crowd/server/PlaceManager.java b/src/java/com/threerings/crowd/server/PlaceManager.java index 1cfc0d77a..9ab7a8ab5 100644 --- a/src/java/com/threerings/crowd/server/PlaceManager.java +++ b/src/java/com/threerings/crowd/server/PlaceManager.java @@ -1,8 +1,9 @@ // -// $Id: PlaceManager.java,v 1.25 2001/12/14 00:11:17 mdb Exp $ +// $Id: PlaceManager.java,v 1.26 2002/02/13 03:21:28 mdb Exp $ package com.threerings.crowd.server; +import java.util.ArrayList; import java.util.HashMap; import java.util.Properties; @@ -16,7 +17,10 @@ import com.threerings.presents.dobj.ObjectRemovedEvent; import com.threerings.presents.dobj.OidListListener; import com.threerings.crowd.Log; -import com.threerings.crowd.data.*; +import com.threerings.crowd.data.BodyObject; +import com.threerings.crowd.data.OccupantInfo; +import com.threerings.crowd.data.PlaceConfig; +import com.threerings.crowd.data.PlaceObject; /** * The place manager is the server-side entity that handles all @@ -101,6 +105,13 @@ public class PlaceManager _config = config; _omgr = omgr; + // initialize our delegates + applyToDelegates(new DelegateOp() { + public void apply (PlaceManagerDelegate delegate) { + delegate.didInit(_config); + } + }); + // let derived classes do initialization stuff didInit(); } @@ -131,6 +142,13 @@ public class PlaceManager // we'll need to hear about place object events plobj.addListener(this); + // let our delegates know that we've started up + applyToDelegates(new DelegateOp() { + public void apply (PlaceManagerDelegate delegate) { + delegate.didStartup(_plobj); + } + }); + // let our derived classes do their thang didStartup(); } @@ -153,6 +171,16 @@ public class PlaceManager { // destroy the object and everything will follow from that CrowdServer.omgr.destroyObject(_plobj.getOid()); + + // let our delegates know that we've shut down + applyToDelegates(new DelegateOp() { + public void apply (PlaceManagerDelegate delegate) { + delegate.didShutdown(); + } + }); + + // let our derived classes do their thang + didShutdown(); } /** @@ -217,16 +245,23 @@ public class PlaceManager /** * Called when a body object enters this place. */ - protected void bodyEntered (int bodyOid) + protected void bodyEntered (final int bodyOid) { Log.info("Body entered [ploid=" + _plobj.getOid() + ", oid=" + bodyOid + "]."); + + // let our delegates know what's up + applyToDelegates(new DelegateOp() { + public void apply (PlaceManagerDelegate delegate) { + delegate.bodyEntered(bodyOid); + } + }); } /** * Called when a body object leaves this place. */ - protected void bodyLeft (int bodyOid) + protected void bodyLeft (final int bodyOid) { Log.info("Body left [ploid=" + _plobj.getOid() + ", oid=" + bodyOid + "]."); @@ -239,6 +274,13 @@ public class PlaceManager _plobj.removeFromOccupantInfo(key); } + // let our delegates know what's up + applyToDelegates(new DelegateOp() { + public void apply (PlaceManagerDelegate delegate) { + delegate.bodyLeft(bodyOid); + } + }); + // if that leaves us with zero occupants, maybe do something if (_plobj.occupants.size() == 0) { placeBecameEmpty(); @@ -253,6 +295,12 @@ public class PlaceManager */ protected void placeBecameEmpty () { + // let our delegates know what's up + applyToDelegates(new DelegateOp() { + public void apply (PlaceManagerDelegate delegate) { + delegate.placeBecameEmpty(); + } + }); } /** @@ -356,6 +404,38 @@ public class PlaceManager buf.append(", config=").append(_config); } + /** + * Adds the supplied delegate to the list for this manager. + */ + protected void addDelegate (PlaceManagerDelegate delegate) + { + if (_delegates == null) { + _delegates = new ArrayList(); + } + _delegates.add(delegate); + } + + /** + * Used to call methods in delegates. + */ + protected static interface DelegateOp + { + public void apply (PlaceManagerDelegate delegate); + } + + /** + * Applies the supplied operation to the registered delegates. + */ + protected void applyToDelegates (DelegateOp op) + { + if (_delegates != null) { + int dcount = _delegates.size(); + for (int i = 0; i < dcount; i++) { + op.apply((PlaceManagerDelegate)_delegates.get(i)); + } + } + } + /** A distributed object manager for doing dobj stuff. */ protected DObjectManager _omgr; @@ -370,4 +450,7 @@ public class PlaceManager /** Message handlers are used to process message events. */ protected HashMap _msghandlers; + + /** A list of the delegates in use by this manager. */ + protected ArrayList _delegates; } diff --git a/src/java/com/threerings/crowd/server/PlaceManagerDelegate.java b/src/java/com/threerings/crowd/server/PlaceManagerDelegate.java new file mode 100644 index 000000000..5d0970401 --- /dev/null +++ b/src/java/com/threerings/crowd/server/PlaceManagerDelegate.java @@ -0,0 +1,76 @@ +// +// $Id: PlaceManagerDelegate.java,v 1.1 2002/02/13 03:21:28 mdb Exp $ + +package com.threerings.crowd.server; + +import com.threerings.crowd.data.PlaceConfig; +import com.threerings.crowd.data.PlaceObject; + +/** + * Provides an extensible mechanism for encapsulating delegated + * functionality that works with the place services. + * + *
Thanks to Java's lack of multiple inheritance, it will likely
+ * become necessary to factor certain services that might be used by a
+ * variety of {@link PlaceManager} derived classes into delegate classes
+ * because they do not fit into the single inheritance hierarchy that
+ * makes sense for a particular application. To facilitate this process,
+ * this delegate class is provided which the standard place manager can be
+ * made to call out to for all of the standard methods.
+ */
+public class PlaceManagerDelegate
+{
+ /**
+ * Provides the delegate with a reference to the manager for which it
+ * is delegating.
+ */
+ public PlaceManagerDelegate (PlaceManager plmgr)
+ {
+ _plmgr = plmgr;
+ }
+
+ /**
+ * Called when the place manager is initialized.
+ */
+ public void didInit (PlaceConfig config)
+ {
+ }
+
+ /**
+ * Called when the place manager is started up.
+ */
+ public void didStartup (PlaceObject plobj)
+ {
+ }
+
+ /**
+ * Called when the place manager is shut down.
+ */
+ public void didShutdown ()
+ {
+ }
+
+ /**
+ * Called when a body enters the place.
+ */
+ public void bodyEntered (int bodyOid)
+ {
+ }
+
+ /**
+ * Called when a body leaves the place.
+ */
+ public void bodyLeft (int bodyOid)
+ {
+ }
+
+ /**
+ * Called when the last body leaves the place.
+ */
+ public void placeBecameEmpty ()
+ {
+ }
+
+ /** A reference to the manager for which we are delegating. */
+ protected PlaceManager _plmgr;
+}
diff --git a/src/java/com/threerings/parlor/game/GameController.java b/src/java/com/threerings/parlor/game/GameController.java
index b2fe34dce..d7db4ce4c 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.8 2001/10/12 00:03:03 mdb Exp $
+// $Id: GameController.java,v 1.9 2002/02/13 03:21:28 mdb Exp $
package com.threerings.parlor.game;
@@ -8,7 +8,9 @@ import java.awt.event.ActionEvent;
import com.samskivert.swing.Controller;
import com.threerings.presents.dobj.*;
+
import com.threerings.crowd.client.PlaceController;
+import com.threerings.crowd.client.PlaceControllerDelegate;
import com.threerings.crowd.data.PlaceConfig;
import com.threerings.crowd.data.PlaceObject;
import com.threerings.crowd.util.CrowdContext;
@@ -26,8 +28,7 @@ import com.threerings.parlor.util.ParlorContext;
* subscription to the game object and dispatch of commands and
* distributed object events.
*/
-public abstract class GameController
- extends PlaceController
+public abstract class GameController extends PlaceController
implements AttributeChangeListener, GameCodes
{
/**
@@ -127,6 +128,12 @@ public abstract class GameController
*/
protected void gameDidStart ()
{
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ ((GameControllerDelegate)delegate).gameDidStart();
+ }
+ });
}
/**
@@ -136,6 +143,12 @@ public abstract class GameController
*/
protected void gameDidEnd ()
{
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ ((GameControllerDelegate)delegate).gameDidEnd();
+ }
+ });
}
/**
@@ -143,6 +156,12 @@ public abstract class GameController
*/
protected void gameWasCancelled ()
{
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceControllerDelegate delegate) {
+ ((GameControllerDelegate)delegate).gameWasCancelled();
+ }
+ });
}
/** A reference to the active parlor context. */
diff --git a/src/java/com/threerings/parlor/game/GameControllerDelegate.java b/src/java/com/threerings/parlor/game/GameControllerDelegate.java
new file mode 100644
index 000000000..60c004ef6
--- /dev/null
+++ b/src/java/com/threerings/parlor/game/GameControllerDelegate.java
@@ -0,0 +1,47 @@
+//
+// $Id: GameControllerDelegate.java,v 1.1 2002/02/13 03:21:28 mdb Exp $
+
+package com.threerings.parlor.game;
+
+import com.threerings.crowd.client.PlaceControllerDelegate;
+
+/**
+ * Extends the {@link PlaceControllerDelegate} mechanism with game
+ * controller specific methods.
+ */
+public class GameControllerDelegate extends PlaceControllerDelegate
+{
+ /**
+ * Provides the delegate with a reference to the game controller for
+ * which it is delegating.
+ */
+ public GameControllerDelegate (GameController ctrl)
+ {
+ super(ctrl);
+ }
+
+ /**
+ * Called when the game transitions to the IN_PLAY
+ * state. This happens when all of the players have arrived and the
+ * server starts the game.
+ */
+ public void gameDidStart ()
+ {
+ }
+
+ /**
+ * Called when the game transitions to the GAME_OVER
+ * state. This happens when the game reaches some end condition by
+ * normal means (is not cancelled or aborted).
+ */
+ public void gameDidEnd ()
+ {
+ }
+
+ /**
+ * Called when the game was cancelled for some reason.
+ */
+ public void gameWasCancelled ()
+ {
+ }
+}
diff --git a/src/java/com/threerings/parlor/game/GameManager.java b/src/java/com/threerings/parlor/game/GameManager.java
index 227951203..47dd91b6a 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.18 2002/02/12 06:57:29 mdb Exp $
+// $Id: GameManager.java,v 1.19 2002/02/13 03:21:28 mdb Exp $
package com.threerings.parlor.game;
@@ -9,9 +9,11 @@ import com.threerings.presents.dobj.MessageEvent;
import com.threerings.crowd.data.BodyObject;
import com.threerings.crowd.data.PlaceObject;
+
import com.threerings.crowd.server.PlaceManager;
import com.threerings.crowd.server.CrowdServer;
import com.threerings.crowd.server.CrowdServer;
+import com.threerings.crowd.server.PlaceManagerDelegate;
import com.threerings.parlor.Log;
import com.threerings.parlor.client.ParlorCodes;
@@ -25,8 +27,7 @@ import com.threerings.parlor.client.ParlorCodes;
* implicitly played in a location, the players of the game implicitly
* bodies in that location.
*/
-public class GameManager
- extends PlaceManager
+public class GameManager extends PlaceManager
implements ParlorCodes, GameCodes, AttributeChangeListener
{
// documentation inherited
@@ -158,6 +159,12 @@ public class GameManager
*/
protected void gameWillStart ()
{
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceManagerDelegate delegate) {
+ ((GameManagerDelegate)delegate).gameWillStart();
+ }
+ });
}
/**
@@ -168,6 +175,12 @@ public class GameManager
*/
protected void gameDidStart ()
{
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceManagerDelegate delegate) {
+ ((GameManagerDelegate)delegate).gameDidStart();
+ }
+ });
}
/**
@@ -195,6 +208,13 @@ public class GameManager
*/
protected void gameDidEnd ()
{
+ // let our delegates do their business
+ applyToDelegates(new DelegateOp() {
+ public void apply (PlaceManagerDelegate delegate) {
+ ((GameManagerDelegate)delegate).gameDidEnd();
+ }
+ });
+
// calculate ratings and all that...
}
diff --git a/src/java/com/threerings/parlor/game/GameManagerDelegate.java b/src/java/com/threerings/parlor/game/GameManagerDelegate.java
new file mode 100644
index 000000000..5059b1bf3
--- /dev/null
+++ b/src/java/com/threerings/parlor/game/GameManagerDelegate.java
@@ -0,0 +1,43 @@
+//
+// $Id: GameManagerDelegate.java,v 1.1 2002/02/13 03:21:28 mdb Exp $
+
+package com.threerings.parlor.game;
+
+import com.threerings.crowd.server.PlaceManagerDelegate;
+
+/**
+ * Extends the {@link PlaceManagerDelegate} mechanism with game manager
+ * specific methods.
+ */
+public class GameManagerDelegate extends PlaceManagerDelegate
+{
+ /**
+ * Provides the delegate with a reference to the game manager for
+ * which it is delegating.
+ */
+ public GameManagerDelegate (GameManager gmgr)
+ {
+ super(gmgr);
+ }
+
+ /**
+ * Called by the game manager when the game is about to start.
+ */
+ public void gameWillStart ()
+ {
+ }
+
+ /**
+ * Called by the game manager after the game was started.
+ */
+ public void gameDidStart ()
+ {
+ }
+
+ /**
+ * Called by the game manager after the game ended.
+ */
+ public void gameDidEnd ()
+ {
+ }
+}
diff --git a/src/java/com/threerings/parlor/game/GameObject.dobj b/src/java/com/threerings/parlor/game/GameObject.dobj
index ab2d19516..c002c760d 100644
--- a/src/java/com/threerings/parlor/game/GameObject.dobj
+++ b/src/java/com/threerings/parlor/game/GameObject.dobj
@@ -1,5 +1,5 @@
//
-// $Id: GameObject.dobj,v 1.7 2002/02/08 23:55:25 mdb Exp $
+// $Id: GameObject.dobj,v 1.8 2002/02/13 03:21:28 mdb Exp $
package com.threerings.parlor.game;
@@ -23,13 +23,13 @@ public class GameObject extends PlaceObject
public static final int AWAITING_PLAYERS = 0;
/** A game state constant indicating that the game is in play. */
- public static final int IN_PLAY = 1;
+ public static final int IN_PLAY = AWAITING_PLAYERS+1;
/** A game state constant indicating that the game ended normally. */
- public static final int GAME_OVER = 2;
+ public static final int GAME_OVER = IN_PLAY+2;
/** A game state constant indicating that the game was cancelled. */
- public static final int CANCELLED = 3;
+ public static final int CANCELLED = GAME_OVER+3;
/** The game state, one of {@link #AWAITING_PLAYERS}, {@link #IN_PLAY},
* {@link #GAME_OVER}, or {@link #CANCELLED}. */
diff --git a/src/java/com/threerings/parlor/game/GameObject.java b/src/java/com/threerings/parlor/game/GameObject.java
index 4b3da6988..9cda19cd7 100644
--- a/src/java/com/threerings/parlor/game/GameObject.java
+++ b/src/java/com/threerings/parlor/game/GameObject.java
@@ -1,5 +1,5 @@
//
-// $Id: GameObject.java,v 1.1 2002/02/08 23:55:25 mdb Exp $
+// $Id: GameObject.java,v 1.2 2002/02/13 03:21:28 mdb Exp $
package com.threerings.parlor.game;
@@ -32,13 +32,13 @@ public class GameObject extends PlaceObject
public static final int AWAITING_PLAYERS = 0;
/** A game state constant indicating that the game is in play. */
- public static final int IN_PLAY = 1;
+ public static final int IN_PLAY = AWAITING_PLAYERS+1;
/** A game state constant indicating that the game ended normally. */
- public static final int GAME_OVER = 2;
+ public static final int GAME_OVER = IN_PLAY+2;
/** A game state constant indicating that the game was cancelled. */
- public static final int CANCELLED = 3;
+ public static final int CANCELLED = GAME_OVER+3;
/** The game state, one of {@link #AWAITING_PLAYERS}, {@link #IN_PLAY},
* {@link #GAME_OVER}, or {@link #CANCELLED}. */
diff --git a/src/java/com/threerings/parlor/turn/TurnGameController.java b/src/java/com/threerings/parlor/turn/TurnGameController.java
index 75af4b903..c175967cf 100644
--- a/src/java/com/threerings/parlor/turn/TurnGameController.java
+++ b/src/java/com/threerings/parlor/turn/TurnGameController.java
@@ -1,13 +1,15 @@
//
-// $Id: TurnGameController.java,v 1.3 2002/02/12 06:57:30 mdb Exp $
+// $Id: TurnGameController.java,v 1.4 2002/02/13 03:21:28 mdb Exp $
package com.threerings.parlor.turn;
+import com.threerings.parlor.game.GameController;
+
/**
* Games that wish to make use of the turn game services should have their
* controller implement this interface and create an instance of {@link
- * TurnGameControllerDelegate}, calling out to it at the appropriate
- * times.
+ * TurnGameControllerDelegate} which should be passed to {@link
+ * GameController#addDelegate}.
*/
public interface TurnGameController
{
diff --git a/src/java/com/threerings/parlor/turn/TurnGameControllerDelegate.java b/src/java/com/threerings/parlor/turn/TurnGameControllerDelegate.java
index e8b2fa74c..429b88b84 100644
--- a/src/java/com/threerings/parlor/turn/TurnGameControllerDelegate.java
+++ b/src/java/com/threerings/parlor/turn/TurnGameControllerDelegate.java
@@ -1,5 +1,5 @@
//
-// $Id: TurnGameControllerDelegate.java,v 1.1 2002/02/12 06:57:30 mdb Exp $
+// $Id: TurnGameControllerDelegate.java,v 1.2 2002/02/13 03:21:28 mdb Exp $
package com.threerings.parlor.turn;
@@ -7,9 +7,12 @@ import com.threerings.presents.dobj.AttributeChangedEvent;
import com.threerings.presents.dobj.AttributeChangeListener;
import com.threerings.crowd.data.BodyObject;
+import com.threerings.crowd.data.PlaceConfig;
+import com.threerings.crowd.data.PlaceObject;
import com.threerings.crowd.util.CrowdContext;
import com.threerings.parlor.game.GameController;
+import com.threerings.parlor.game.GameControllerDelegate;
import com.threerings.parlor.game.GameObject;
/**
@@ -20,7 +23,7 @@ import com.threerings.parlor.game.GameObject;
* implement the {@link TurnGameController} interface so that it can be
* notified when turn-based game events take place.
*/
-public class TurnGameControllerDelegate
+public class TurnGameControllerDelegate extends GameControllerDelegate
implements AttributeChangeListener
{
/**
@@ -30,15 +33,10 @@ public class TurnGameControllerDelegate
*/
public TurnGameControllerDelegate (TurnGameController tgctrl)
{
- _tgctrl = tgctrl;
- }
+ super((GameController)tgctrl);
- /**
- * This must be called from {@link GameController#init}.
- */
- public void init (CrowdContext ctx)
- {
- _ctx = ctx;
+ // keep this around for later
+ _tgctrl = tgctrl;
}
/**
@@ -52,27 +50,29 @@ public class TurnGameControllerDelegate
_turnGame.getTurnHolder().equals(self.username));
}
- /**
- * This must be called from {@link GameController#willEnterPlace}.
- */
- public void willEnterPlace (GameObject gobj)
+ // documentation inherited
+ public void init (CrowdContext ctx, PlaceConfig config)
+ {
+ _ctx = ctx;
+ }
+
+ // documentation inherited
+ public void willEnterPlace (PlaceObject plobj)
{
// get a casted reference to the object
- _gameObj = gobj;
- _turnGame = (TurnGameObject)gobj;
+ _gameObj = (GameObject)plobj;
+ _turnGame = (TurnGameObject)plobj;
_thfield = _turnGame.getTurnHolderFieldName();
// and add ourselves as a listener
- gobj.addListener(this);
+ plobj.addListener(this);
}
- /**
- * This must be called from {@link GameController#didLeavePlace}.
- */
- public void didLeavePlace (GameObject gobj)
+ // documentation inherited
+ public void didLeavePlace (PlaceObject plobj)
{
// remove our listenership
- gobj.removeListener(this);
+ plobj.removeListener(this);
// clean up
_turnGame = null;
@@ -87,12 +87,12 @@ public class TurnGameControllerDelegate
}
}
- /** A reference to our client context. */
- protected CrowdContext _ctx;
-
/** The turn game controller for whom we are delegating. */
protected TurnGameController _tgctrl;
+ /** A reference to our client context. */
+ protected CrowdContext _ctx;
+
/** A reference to our game object. */
protected GameObject _gameObj;
diff --git a/src/java/com/threerings/parlor/turn/TurnGameManagerDelegate.java b/src/java/com/threerings/parlor/turn/TurnGameManagerDelegate.java
index 191039f18..768898238 100644
--- a/src/java/com/threerings/parlor/turn/TurnGameManagerDelegate.java
+++ b/src/java/com/threerings/parlor/turn/TurnGameManagerDelegate.java
@@ -1,31 +1,24 @@
//
-// $Id: TurnGameManagerDelegate.java,v 1.3 2002/02/12 07:17:33 mdb Exp $
+// $Id: TurnGameManagerDelegate.java,v 1.4 2002/02/13 03:21:28 mdb Exp $
package com.threerings.parlor.turn;
+import com.threerings.crowd.data.PlaceObject;
+
import com.threerings.parlor.Log;
import com.threerings.parlor.game.GameManager;
+import com.threerings.parlor.game.GameManagerDelegate;
import com.threerings.parlor.util.MathUtil;
/**
* Performs the server-side turn-based game processing for a turn based
- * game. Games which wish to make use of the turn services must call the
- * following methods on the delegate at the appropriate times:
- *
- *
- * init() - * gameDidStart() - * startTurn() - * endTurn() - *- * - * They must also implement the {@link TurnGameManager} interface. If the - * game requires specialized behavior from its delegate, it can extend the - * delegate and override the many methods that have been provided for just - * such a purpose (e.g. {@link #setFirstTurnHolder}, {@link - * #setNextTurnHolder}). + * game. Game managers which wish to make use of the turn services must + * implement {@link TurnGameManager} either create an instance of this + * class, or an instance of a derivation which customizes the behavior, + * either of which would be passed to {@link GameManager#addDelegate} to + * be activated. */ -public class TurnGameManagerDelegate +public class TurnGameManagerDelegate extends GameManagerDelegate { /** * Constructs a delegate that will manage the turn game state and call @@ -34,36 +27,10 @@ public class TurnGameManagerDelegate */ public TurnGameManagerDelegate (TurnGameManager tgmgr) { + super((GameManager)tgmgr); _tgmgr = tgmgr; } - /** - * This should be called from {@link GameManager#didStartup} to - * initialize the delegate. - */ - public void init (TurnGameObject turnGame) - { - _turnGame = turnGame; - } - - /** - * This should be called from {@link GameManager#gameDidStart} to let - * the turn delegate perform start of game processing. - */ - public void gameDidStart () - { - // grab the players array - _players = _tgmgr.getPlayers(); - - // figure out who will be first - setFirstTurnHolder(); - - // and start the first turn if we should apparently do so - if (_turnIdx != -1) { - startTurn(); - } - } - /** * Returns the index of the current turn holder as configured in the * game object. @@ -82,17 +49,6 @@ public class TurnGameManagerDelegate return -1; } - /** - * This is called to determine whichi player will take the first - * turn. The default implementation chooses a player at random. - */ - protected void setFirstTurnHolder () - { - // TODO: sort out a better random number generator and make it - // available via the parlor services - _turnIdx = MathUtil.random(_players.length); - } - /** * Called to start the next turn. It calls {@link * TurnGameManager#turnWillStart} to allow our owning manager to @@ -149,6 +105,41 @@ public class TurnGameManagerDelegate } } + // documentation inherited + public void didStartup (PlaceObject plobj) + { + _turnGame = (TurnGameObject)plobj; + } + + /** + * This should be called from {@link GameManager#gameDidStart} to let + * the turn delegate perform start of game processing. + */ + public void gameDidStart () + { + // grab the players array + _players = _tgmgr.getPlayers(); + + // figure out who will be first + setFirstTurnHolder(); + + // and start the first turn if we should apparently do so + if (_turnIdx != -1) { + startTurn(); + } + } + + /** + * This is called to determine whichi player will take the first + * turn. The default implementation chooses a player at random. + */ + protected void setFirstTurnHolder () + { + // TODO: sort out a better random number generator and make it + // available via the parlor services + _turnIdx = MathUtil.random(_players.length); + } + /** * This is called to determine which player will next hold the turn. * The default implementation simply rotates through the players in