diff --git a/src/java/com/threerings/miso/client/Portal.java b/src/java/com/threerings/miso/client/Portal.java index d9efe0eb4..5b848655e 100644 --- a/src/java/com/threerings/miso/client/Portal.java +++ b/src/java/com/threerings/miso/client/Portal.java @@ -1,12 +1,12 @@ // -// $Id: Portal.java,v 1.2 2001/08/16 22:05:01 shaper Exp $ +// $Id: Portal.java,v 1.3 2001/08/21 01:15:16 shaper Exp $ package com.threerings.miso.scene; /** - * The Portal class represents a Location in - * a scene that both leads to a different scene and serves as a - * potential entrance into its containing scene. + * The portal class represents a {@link Location} in a scene that both + * leads to a different scene and serves as a potential entrance into + * its containing scene. */ public class Portal extends Location { @@ -20,7 +20,7 @@ public class Portal extends Location public Portal dest; /** - * Construct an Portal object. + * Construct a portal object. * * @param loc the location associated with the portal. * @param name the portal name. @@ -44,6 +44,15 @@ public class Portal extends Location this.dest = dest; } + /** + * Return whether this portal has a valid destination scene and + * portal. + */ + public boolean hasDestination () + { + return (sid != MisoScene.SID_INVALID && dest != null); + } + /** * Return a String representation of this object. */ diff --git a/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java b/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java index b54e4f97d..8037ff834 100644 --- a/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java +++ b/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java @@ -1,5 +1,5 @@ // -// $Id: XMLSceneGroupParser.java,v 1.2 2001/08/16 22:05:01 shaper Exp $ +// $Id: XMLSceneGroupParser.java,v 1.3 2001/08/21 01:15:16 shaper Exp $ package com.threerings.miso.scene.xml; @@ -74,6 +74,9 @@ public class XMLSceneGroupParser extends DefaultHandler // the associated scene objects, resolve bindings between // all scenes in the group. _info.resolveBindings(); + + // warn about any remaining un-bound portals + _info.checkUnboundPortals(); } // note that we're not within a tag to avoid considering any @@ -193,7 +196,7 @@ public class XMLSceneGroupParser extends DefaultHandler } /** - * Resolve portal bindings and set entrance portal for all scenes. + * Resolve the portal bindings and entrance portal for all scenes. */ public void resolveBindings () { @@ -210,9 +213,8 @@ public class XMLSceneGroupParser extends DefaultHandler // resolve the portal binding resolvePortal(sinfo, pinfo); - // set the entrance portal - Portal entrance = sinfo.scene.getPortal(sinfo.entrance); - sinfo.scene.setEntrance(entrance); + // resolve the entrance portal + resolveEntrance(sinfo); } } } @@ -228,31 +230,78 @@ public class XMLSceneGroupParser extends DefaultHandler // get the source portal object Portal src = sinfo.scene.getPortal(pinfo.src); if (src == null) { - Log.warning( - "Missing source portal [scene=" + sinfo.name + - ", pinfo=" + pinfo + "]."); + Log.warning("Missing source portal [scene=" + sinfo.name + + ", pinfo=" + pinfo + "]."); return; } // get the destination scene MisoScene destScene = getScene(pinfo.destScene); if (destScene == null) { - Log.warning( - "Missing destination scene [scene=" + sinfo.name + - ", pinfo=" + pinfo + "]."); + Log.warning("Missing destination scene [scene=" + sinfo.name + + ", pinfo=" + pinfo + "]."); + return; } // get the destination portal object Portal dest = destScene.getPortal(pinfo.dest); if (dest == null) { - Log.warning( - "Missing destination portal [scene=" + sinfo.name + - ", pinfo=" + pinfo + "]."); + Log.warning("Missing destination portal [scene=" + sinfo.name + + ", pinfo=" + pinfo + "]."); + return; } // update source portal with full destination information src.setDestination(destScene.getId(), dest); - } + } + + /** + * Resolve the binding for the entrance portal in the given scene. + * + * @param sinfo the scene info. + */ + protected void resolveEntrance (SceneInfo sinfo) + { + Portal entrance = sinfo.scene.getPortal(sinfo.entrance); + if (entrance == null) { + Log.warning( "Missing entrance portal [scene=" + sinfo.name + + ", entrance=" + sinfo.entrance + "]."); + return; + } + + sinfo.scene.setEntrance(entrance); + } + + /** + * Scan through all scenes and output a warning message if any + * portals are found that aren't bound to a destination + * portal. Intended for calling after {@link + * #resolveBindings} is called to make sure the scene group + * description wasn't lacking a binding for some portal; or, + * that the scenes don't contain any unintended or unnecessary + * portals. + */ + public void checkUnboundPortals () + { + int size = sceneinfo.size(); + for (int ii = 0; ii < size; ii++) { + // retrieve the next scene info object + SceneInfo sinfo = (SceneInfo)sceneinfo.get(ii); + + // get the portals in the scene + List portals = sinfo.scene.getPortals(); + + // check each portal to make sure it has a valid destination + int psize = portals.size(); + for (int jj = 0; jj < size; jj++) { + Portal portal = (Portal)portals.get(jj); + if (!portal.hasDestination()) { + Log.warning("Unbound portal [scene=" + sinfo.name + + ", portal=" + portal + "]."); + } + } + } + } } /**