Fixed minor bugs in failed attempts to resolve portal bindings. Check

and report errors when attempting to bind entrance portal.
Sanity-check portals in all scenes in the group after bindings are
resolved and report warnings for any still-unbound portals.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@286 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Walter Korman
2001-08-21 01:15:16 +00:00
parent 4b0f742356
commit 56c48c011f
2 changed files with 78 additions and 20 deletions
@@ -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; package com.threerings.miso.scene;
/** /**
* The <code>Portal</code> class represents a <code>Location</code> in * The portal class represents a {@link Location} in a scene that both
* a scene that both leads to a different scene and serves as a * leads to a different scene and serves as a potential entrance into
* potential entrance into its containing scene. * its containing scene.
*/ */
public class Portal extends Location public class Portal extends Location
{ {
@@ -20,7 +20,7 @@ public class Portal extends Location
public Portal dest; public Portal dest;
/** /**
* Construct an <code>Portal</code> object. * Construct a portal object.
* *
* @param loc the location associated with the portal. * @param loc the location associated with the portal.
* @param name the portal name. * @param name the portal name.
@@ -44,6 +44,15 @@ public class Portal extends Location
this.dest = dest; 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. * Return a String representation of this object.
*/ */
@@ -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; package com.threerings.miso.scene.xml;
@@ -74,6 +74,9 @@ public class XMLSceneGroupParser extends DefaultHandler
// the associated scene objects, resolve bindings between // the associated scene objects, resolve bindings between
// all scenes in the group. // all scenes in the group.
_info.resolveBindings(); _info.resolveBindings();
// warn about any remaining un-bound portals
_info.checkUnboundPortals();
} }
// note that we're not within a tag to avoid considering any // 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 () public void resolveBindings ()
{ {
@@ -210,9 +213,8 @@ public class XMLSceneGroupParser extends DefaultHandler
// resolve the portal binding // resolve the portal binding
resolvePortal(sinfo, pinfo); resolvePortal(sinfo, pinfo);
// set the entrance portal // resolve the entrance portal
Portal entrance = sinfo.scene.getPortal(sinfo.entrance); resolveEntrance(sinfo);
sinfo.scene.setEntrance(entrance);
} }
} }
} }
@@ -228,31 +230,78 @@ public class XMLSceneGroupParser extends DefaultHandler
// get the source portal object // get the source portal object
Portal src = sinfo.scene.getPortal(pinfo.src); Portal src = sinfo.scene.getPortal(pinfo.src);
if (src == null) { if (src == null) {
Log.warning( Log.warning("Missing source portal [scene=" + sinfo.name +
"Missing source portal [scene=" + sinfo.name + ", pinfo=" + pinfo + "].");
", pinfo=" + pinfo + "].");
return; return;
} }
// get the destination scene // get the destination scene
MisoScene destScene = getScene(pinfo.destScene); MisoScene destScene = getScene(pinfo.destScene);
if (destScene == null) { if (destScene == null) {
Log.warning( Log.warning("Missing destination scene [scene=" + sinfo.name +
"Missing destination scene [scene=" + sinfo.name + ", pinfo=" + pinfo + "].");
", pinfo=" + pinfo + "]."); return;
} }
// get the destination portal object // get the destination portal object
Portal dest = destScene.getPortal(pinfo.dest); Portal dest = destScene.getPortal(pinfo.dest);
if (dest == null) { if (dest == null) {
Log.warning( Log.warning("Missing destination portal [scene=" + sinfo.name +
"Missing destination portal [scene=" + sinfo.name + ", pinfo=" + pinfo + "].");
", pinfo=" + pinfo + "]."); return;
} }
// update source portal with full destination information // update source portal with full destination information
src.setDestination(destScene.getId(), dest); 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 + "].");
}
}
}
}
} }
/** /**