diff --git a/src/as/com/threerings/stage/client/ClusterClickedInfo.as b/src/as/com/threerings/stage/client/ClusterClickedInfo.as
new file mode 100644
index 00000000..ed90e06b
--- /dev/null
+++ b/src/as/com/threerings/stage/client/ClusterClickedInfo.as
@@ -0,0 +1,41 @@
+// $Id: ClusterClickedInfo.as 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.client {
+
+import flash.geom.Point;
+
+import com.threerings.whirled.spot.data.Cluster;
+
+public class ClusterClickedInfo
+{
+ /** The description of the cluster in question. */
+ public var cluster :Cluster;
+
+ /** The point which was clicked. */
+ public var loc :Point;
+
+ public function ClusterClickedInfo (cluster :Cluster, loc :Point)
+ {
+ this.cluster = cluster;
+ this.loc = loc;
+ }
+}
+}
diff --git a/src/as/com/threerings/stage/client/StageSceneController.as b/src/as/com/threerings/stage/client/StageSceneController.as
new file mode 100644
index 00000000..74af7c8e
--- /dev/null
+++ b/src/as/com/threerings/stage/client/StageSceneController.as
@@ -0,0 +1,66 @@
+// $Id: ClusterClickedInfo.as 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.client {
+
+import com.threerings.crowd.client.PlaceView;
+import com.threerings.crowd.util.CrowdContext;
+import com.threerings.stage.data.StageLocation;
+import com.threerings.stage.util.StageContext;
+import com.threerings.util.Log;
+import com.threerings.whirled.data.SceneUpdate;
+import com.threerings.whirled.spot.client.SpotSceneController;
+
+public class StageSceneController extends SpotSceneController
+{
+ public var log :Log = Log.getLog(StageSceneController);
+
+ /**
+ * Called when the user clicks on a location within the scene.
+ */
+ public function handleLocationClicked (source :Object, loc :StageLocation) :void
+ {
+ log.warning("handleLocationClicked(" + source + ", " + loc + ")");
+ }
+
+ /**
+ * Handles a cluster clicked event.
+ *
+ * @param tuple the cluster that was clicked and the screen coords of the click.
+ */
+ public function handleClusterClicked (source :Object, clusterClick :ClusterClickedInfo) :void
+ {
+ log.warning("handleClusterClicked(" + source + ", " + clusterClick + ")");
+ }
+
+ override protected function createPlaceView (ctx :CrowdContext) :PlaceView
+ {
+ return new StageScenePanel(StageContext(ctx), this);
+ }
+
+ override protected function sceneUpdated (update :SceneUpdate) :void
+ {
+ super.sceneUpdated(update);
+
+ // let the scene panel know to rethink everything
+ (StageScenePanel(_view)).sceneUpdated(update);
+ }
+}
+}
diff --git a/src/as/com/threerings/stage/client/StageScenePanel.as b/src/as/com/threerings/stage/client/StageScenePanel.as
new file mode 100644
index 00000000..40e87b90
--- /dev/null
+++ b/src/as/com/threerings/stage/client/StageScenePanel.as
@@ -0,0 +1,85 @@
+// $Id: StageScenePanel.as 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.client {
+
+import flash.events.Event;
+import flash.events.EventDispatcher;
+
+import com.threerings.crowd.client.PlaceView;
+import com.threerings.crowd.data.PlaceObject;
+import com.threerings.whirled.data.SceneUpdate;
+import com.threerings.stage.util.StageContext;
+import com.threerings.util.Controller;
+
+/**
+ * Eventually responsible for rendering a stage scene - but for now it's a stub.
+ */
+public class StageScenePanel
+ implements PlaceView
+{
+ public function StageScenePanel (ctx :StageContext, ctrl :Controller)
+ {
+ _dispatcher = new EventDispatcher(this);
+ }
+
+ public function willEnterPlace (plobj :PlaceObject) :void
+ {
+ }
+
+ public function didLeavePlace (plobj :PlaceObject) :void
+ {
+ }
+
+ public function addEventListener (type :String, listener :Function, useCapture :Boolean = false,
+ priority:int = 0, useWeakReference :Boolean = false) :void
+ {
+ _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
+ }
+
+ public function dispatchEvent (event :Event) :Boolean
+ {
+ return _dispatcher.dispatchEvent(event);
+ }
+
+ public function hasEventListener (type :String) :Boolean
+ {
+ return _dispatcher.hasEventListener(type);
+ }
+
+ public function removeEventListener (type :String, listener :Function,
+ useCapture :Boolean = false) :void
+ {
+ _dispatcher.removeEventListener(type, listener, useCapture);
+ }
+
+ public function willTrigger (type :String) :Boolean
+ {
+ return _dispatcher.willTrigger(type);
+ }
+
+ public function sceneUpdated (update :SceneUpdate) :void
+ {
+ // TODO
+ }
+
+ protected var _dispatcher :EventDispatcher;
+}
+}
diff --git a/src/as/com/threerings/stage/data/DefaultColorUpdate.as b/src/as/com/threerings/stage/data/DefaultColorUpdate.as
new file mode 100644
index 00000000..beea99c9
--- /dev/null
+++ b/src/as/com/threerings/stage/data/DefaultColorUpdate.as
@@ -0,0 +1,78 @@
+//
+// $Id: DefaultColorUpdate.java 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.data {
+
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+
+import com.threerings.whirled.data.SceneUpdate;
+import com.threerings.whirled.data.SceneModel;
+
+/**
+ * Update to change the default colorization for objects in a scene which
+ * do not define their own colorization.
+ */
+public class DefaultColorUpdate extends SceneUpdate
+{
+ /** The class id of the colorization we're changing. */
+ public var classId :int;
+
+ /** The color id to set as the new default, or -1 to remove the default. */
+ public var colorId :int;
+
+ /**
+ * Initializes this update.
+ */
+ public function initUpdate (targetId :int, targetVersion :int,
+ classId :int, colorId :int) :void
+ {
+ init(targetId, targetVersion);
+ this.classId = classId;
+ this.colorId = colorId;
+ }
+
+ override public function apply (model :SceneModel) :void
+ {
+ super.apply(model);
+
+ var smodel :StageSceneModel = StageSceneModel(model);
+ smodel.setDefaultColor(classId, colorId);
+ }
+
+ // from interface Streamable
+ override public function readObject (ins :ObjectInputStream) :void
+ {
+ super.readObject(ins);
+ classId = ins.readInt();
+ colorId = ins.readInt();
+ }
+
+ // from interface Streamable
+ override public function writeObject (out :ObjectOutputStream) :void
+ {
+ super.writeObject(out);
+ out.writeInt(classId);
+ out.writeInt(colorId);
+ }
+
+}
+}
diff --git a/src/as/com/threerings/stage/data/ModifyObjectsUpdate.as b/src/as/com/threerings/stage/data/ModifyObjectsUpdate.as
new file mode 100644
index 00000000..3ed537e0
--- /dev/null
+++ b/src/as/com/threerings/stage/data/ModifyObjectsUpdate.as
@@ -0,0 +1,98 @@
+//
+// $Id: ModifyObjectsUpdate.java 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.data {
+
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+import com.threerings.io.TypedArray;
+
+import com.threerings.whirled.data.SceneUpdate;
+import com.threerings.whirled.data.SceneModel;
+import com.threerings.miso.data.ObjectInfo;
+
+/**
+ * A scene update that is broadcast when objects have been added to or removed
+ * from the scene.
+ */
+public class ModifyObjectsUpdate extends SceneUpdate
+{
+ /** The objects added to the scene (or null for none). */
+ public var added :TypedArray;
+
+ /** The objects removed from the scene (or null for none). */
+ public var removed :TypedArray;
+
+ /**
+ * Initializes this update with all necessary data.
+ *
+ * @param added the objects added to the scene, or null for
+ * none
+ * @param removed the objects removed from the scene, or null
+ * for none
+ */
+ public function initUpdate (targetId :int, targetVersion :int, added :Array,
+ removed :Array) :void
+ {
+ init(targetId, targetVersion);
+ this.added = TypedArray.create(ObjectInfo, added);
+ this.removed = TypedArray.create(ObjectInfo, removed);
+ }
+
+ override public function apply (model :SceneModel) :void
+ {
+ super.apply(model);
+
+ var mmodel :StageMisoSceneModel = StageMisoSceneModel.getSceneModel(model);
+
+ // wipe out the objects that need to go
+ if (removed != null) {
+ for each (var rmElement :ObjectInfo in removed) {
+ mmodel.removeObject(rmElement);
+ }
+ }
+
+ // add the new objects
+ if (added != null) {
+ for each (var addElement :ObjectInfo in added) {
+ mmodel.addObject(addElement);
+ }
+ }
+ }
+
+ // from interface Streamable
+ override public function readObject (ins :ObjectInputStream) :void
+ {
+ super.readObject(ins);
+ added = ins.readObject(TypedArray);
+ removed = ins.readObject(TypedArray);
+ }
+
+ // from interface Streamable
+ override public function writeObject (out :ObjectOutputStream) :void
+ {
+ super.writeObject(out);
+ out.writeObject(added);
+ out.writeObject(removed);
+ }
+
+}
+}
diff --git a/src/as/com/threerings/stage/data/StageLocation.as b/src/as/com/threerings/stage/data/StageLocation.as
new file mode 100644
index 00000000..bec2a1da
--- /dev/null
+++ b/src/as/com/threerings/stage/data/StageLocation.as
@@ -0,0 +1,121 @@
+//
+// $Id: StageLocation.java 889 2010-01-13 18:41:00Z ray $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.data {
+
+import com.threerings.util.ClassUtil;
+import com.threerings.util.DirectionCodes;
+import com.threerings.util.DirectionUtil;
+import com.threerings.util.Hashable;
+
+import com.threerings.io.SimpleStreamableObject;
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+
+import com.threerings.stage.data.StageLocation;
+import com.threerings.whirled.spot.data.Location;
+
+/**
+ * Contains information on a scene occupant's position and orientation.
+ */
+public class StageLocation extends SimpleStreamableObject
+ implements Location, Hashable
+{
+ /** The user's x position (interpreted by the display system). */
+ public var x :int;
+
+ /** The user's y position (interpreted by the display system). */
+ public var y :int;
+
+ /** The user's orientation (defined by {@link DirectionCodes}). */
+ public var orient :int;
+
+ /**
+ * Computes a reasonable hashcode for location instances.
+ */
+
+ public function hashCode () :int
+ {
+ return x ^ y;
+ }
+
+ public function clone () :Object
+ {
+ return (ClassUtil.newInstance(this) as StageLocation);
+ }
+
+ /**
+ * Location equality is determined by coordinates.
+ */
+ public function equals (other :Object) :Boolean
+ {
+ if (other is StageLocation) {
+ var that :StageLocation = StageLocation(other);
+ return (this.x == that.x) && (this.y == that.y);
+
+ } else {
+ return false;
+ }
+ }
+
+ /** {@link Object#toString} helper function. */
+ public function orientToString () :String
+ {
+ return DirectionUtil.toShortString(orient);
+ }
+
+ // documentation inherited from interface Location
+ public function getOpposite () :Location
+ {
+ var opp :StageLocation = StageLocation(clone());
+ opp.orient = DirectionUtil.getOpposite(orient);
+ return opp;
+ }
+
+ /**
+ * Location equivalence means that the coordinates and orientation are
+ * the same.
+ */
+ public function equivalent (oloc :Location) :Boolean
+ {
+ return equals(oloc) && (orient == (StageLocation(oloc)).orient);
+ }
+
+ // from interface Streamable
+ override public function readObject (ins :ObjectInputStream) :void
+ {
+ super.readObject(ins);
+ x = ins.readInt();
+ y = ins.readInt();
+ orient = ins.readByte();
+ }
+
+ // from interface Streamable
+ override public function writeObject (out :ObjectOutputStream) :void
+ {
+ super.writeObject(out);
+ out.writeInt(x);
+ out.writeInt(y);
+ out.writeByte(orient);
+ }
+
+}
+}
diff --git a/src/as/com/threerings/stage/data/StageMisoSceneModel.as b/src/as/com/threerings/stage/data/StageMisoSceneModel.as
new file mode 100644
index 00000000..c738f5a3
--- /dev/null
+++ b/src/as/com/threerings/stage/data/StageMisoSceneModel.as
@@ -0,0 +1,84 @@
+//
+// $Id: StageMisoSceneModel.java 890 2010-01-13 18:52:23Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.data {
+
+import com.threerings.miso.data.SparseMisoSceneModel;
+import com.threerings.whirled.data.AuxModel;
+import com.threerings.whirled.data.SceneModel;
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+import com.threerings.miso.data.SparseMisoSceneModel_Section;
+import com.threerings.stage.data.StageMisoSceneModel;
+
+/**
+ * Extends the {@link SparseMisoSceneModel} with the necessary interface
+ * to wire it up to the Whirled auxiliary model system.
+ */
+public class StageMisoSceneModel extends SparseMisoSceneModel
+ implements AuxModel
+{
+ /** The width (in tiles) of a scene section. */
+ public static const SECTION_WIDTH :int = 9;
+
+ /** The height (in tiles) of a scene section. */
+ public static const SECTION_HEIGHT :int = 9;
+
+ /**
+ * Locates and returns the {@link StageMisoSceneModel} among the
+ * auxiliary scene models associated with the supplied scene model.
+ * null is returned if no miso scene model could be
+ * found.
+ */
+ public static function getSceneModel (model :SceneModel) :StageMisoSceneModel
+ {
+ for each (var auxModel :AuxModel in model.auxModels) {
+ if (auxModel is StageMisoSceneModel) {
+ return StageMisoSceneModel(auxModel);
+ }
+ }
+ return null;
+ }
+
+ override public function clone () :Object
+ {
+ return StageMisoSceneModel(super.clone());
+ }
+
+ /**
+ * Returns the section identified by the specified key, or null if no
+ * section exists for that key.
+ */
+ public function getSectionByKey (key :int) :SparseMisoSceneModel_Section
+ {
+ return _sections.get(key);
+ }
+
+ /**
+ * Returns the section key for the specified tile coordinate.
+ */
+ public function getSectionKey (x :int, y :int) :int
+ {
+ return key(x, y);
+ }
+
+}
+}
diff --git a/src/as/com/threerings/stage/data/StageOccupantInfo.as b/src/as/com/threerings/stage/data/StageOccupantInfo.as
new file mode 100644
index 00000000..e52e843e
--- /dev/null
+++ b/src/as/com/threerings/stage/data/StageOccupantInfo.as
@@ -0,0 +1,46 @@
+//
+// $Id: StageOccupantInfo.java 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.data {
+
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+
+import com.threerings.crowd.data.OccupantInfo;
+import com.threerings.crowd.data.BodyObject;
+
+/**
+ * Extends the standard occupant info with stage specific business.
+ */
+public class StageOccupantInfo extends OccupantInfo
+{
+ /**
+ * Should return true if the occupant in question is available to be
+ * clustered with, false if they are "busy". This means that a user
+ * can click on them and start a chat circle.
+ */
+ public function isClusterable () :Boolean
+ {
+ return true;
+ }
+
+}
+}
diff --git a/src/as/com/threerings/stage/data/StageSceneConfig.as b/src/as/com/threerings/stage/data/StageSceneConfig.as
new file mode 100644
index 00000000..7d6b9438
--- /dev/null
+++ b/src/as/com/threerings/stage/data/StageSceneConfig.as
@@ -0,0 +1,46 @@
+//
+// $Id: StageSceneConfig.java 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.data {
+
+import com.threerings.crowd.data.PlaceConfig;
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+import com.threerings.stage.client.StageSceneController;
+import com.threerings.crowd.client.PlaceController;
+
+/**
+ * Place configuration for the main isometric scenes in Stage.
+ */
+public class StageSceneConfig extends PlaceConfig
+{
+ override public function createController () :PlaceController
+ {
+ return new StageSceneController();
+ }
+
+ override public function getManagerClassName () :String
+ {
+ return "com.threerings.stage.server.StageSceneManager";
+ }
+
+}
+}
diff --git a/src/as/com/threerings/stage/data/StageSceneModel.as b/src/as/com/threerings/stage/data/StageSceneModel.as
new file mode 100644
index 00000000..3a816f04
--- /dev/null
+++ b/src/as/com/threerings/stage/data/StageSceneModel.as
@@ -0,0 +1,125 @@
+//
+// $Id: StageSceneModel.java 887 2010-01-05 22:12:02Z dhoover $
+//
+// Vilya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/vilya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.stage.data {
+
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+
+import com.threerings.stage.data.StageSceneModel;
+import com.threerings.util.StreamableHashMap;
+import com.threerings.whirled.spot.data.SpotSceneModel;
+import com.threerings.whirled.data.SceneModel;
+
+/**
+ * Extends the basic scene model with the notion of a scene type and
+ * incorporates the necessary auxiliary models used by the Stage system.
+ */
+public class StageSceneModel extends SceneModel
+{
+ /** A scene type code. */
+ public static const WORLD :String = "world";
+
+ /** This scene's type which is a string identifier used to later
+ * construct a specific controller to handle this scene. */
+ public var type :String;
+
+ /** The zone id to which this scene belongs. */
+ public var zoneId :int;
+
+ /** If non-null, contains default colorizations to use for objects
+ * that do not have colorizations defined. */
+ public var defaultColors :StreamableHashMap;
+
+ /**
+ * Creates and returns a blank scene model.
+ */
+ public static function blankStageSceneModel () :StageSceneModel
+ {
+ var model :StageSceneModel = new StageSceneModel();
+ populateBlankStageSceneModel(model);
+ return model;
+ }
+
+ /**
+ * Set the default colorId to use for a specified colorization
+ * classId, or -1 to clear the default for that colorization.
+ */
+ public function setDefaultColor (classId :int, colorId :int) :void
+ {
+ if (colorId == -1) {
+ if (defaultColors != null) {
+ defaultColors.remove(classId);
+ if (defaultColors.size() == 0) {
+ defaultColors = null;
+ }
+ }
+
+ } else {
+ if (defaultColors == null) {
+ defaultColors = new StreamableHashMap();
+ }
+ defaultColors.put(classId, colorId);
+ }
+ }
+
+ /**
+ * Get the default color to use for the specified colorization
+ * classId, or -1 if no default is set for that colorization.
+ */
+ public function getDefaultColor (classId :int) :int
+ {
+ if (defaultColors != null) {
+ return defaultColors.get(classId);
+ }
+ return -1;
+ }
+
+ // from interface Streamable
+ override public function readObject (ins :ObjectInputStream) :void
+ {
+ super.readObject(ins);
+ type = ins.readField(String);
+ zoneId = ins.readInt();
+ defaultColors = ins.readObject(StreamableHashMap);
+ }
+
+ // from interface Streamable
+ override public function writeObject (out :ObjectOutputStream) :void
+ {
+ super.writeObject(out);
+ out.writeField(type);
+ out.writeInt(zoneId);
+ out.writeObject(defaultColors);
+ }
+
+ /**
+ * Populates a blank scene model with blank values.
+ */
+ protected static function populateBlankStageSceneModel (model :StageSceneModel) :void
+ {
+ populateBlankSceneModel(model);
+ model.addAuxModel(new SpotSceneModel());
+ model.addAuxModel(new StageMisoSceneModel());
+ }
+
+}
+}
diff --git a/src/as/com/threerings/stage/util/StageContext.as b/src/as/com/threerings/stage/util/StageContext.as
new file mode 100644
index 00000000..2e0a7be8
--- /dev/null
+++ b/src/as/com/threerings/stage/util/StageContext.as
@@ -0,0 +1,13 @@
+package com.threerings.stage.util {
+
+import com.threerings.miso.util.MisoContext;
+
+/**
+ * A context that provides for the myriad requirements of the Stage system.
+ * This is currently just a stub.
+ */
+public interface StageContext extends MisoContext
+{
+
+}
+}