diff --git a/src/java/com/threerings/miso/client/DisplayMisoScene.java b/src/java/com/threerings/miso/client/DisplayMisoScene.java index a7350792d..e685a2af3 100644 --- a/src/java/com/threerings/miso/client/DisplayMisoScene.java +++ b/src/java/com/threerings/miso/client/DisplayMisoScene.java @@ -1,5 +1,5 @@ // -// $Id: DisplayMisoScene.java,v 1.7 2002/09/23 21:54:50 mdb Exp $ +// $Id: DisplayMisoScene.java,v 1.8 2003/01/13 22:53:56 mdb Exp $ package com.threerings.miso.scene; @@ -34,4 +34,14 @@ public interface DisplayMisoScene * origin falls in the requested region. */ public void getSceneObjects (Rectangle region, ObjectSet set); + + /** + * Returns true if the supplied traverser can traverse the specified + * tile coordinate. The traverser is whatever object is passed along + * to the path finder when a path is being computed. Scene + * implementations which support custom traversal based on the type of + * the traverser will want to reflect the traverser's class and act + * acordingly. + */ + public boolean canTraverse (Object traverser, int x, int y); } diff --git a/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java b/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java index 539e1b497..289ede2cc 100644 --- a/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java +++ b/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java @@ -1,5 +1,5 @@ // -// $Id: DisplayMisoSceneImpl.java,v 1.63 2002/12/11 23:05:07 shaper Exp $ +// $Id: DisplayMisoSceneImpl.java,v 1.64 2003/01/13 22:53:56 mdb Exp $ package com.threerings.miso.scene; @@ -14,7 +14,6 @@ import com.threerings.media.tile.NoSuchTileException; import com.threerings.media.tile.NoSuchTileSetException; import com.threerings.media.tile.ObjectTile; import com.threerings.media.tile.Tile; -import com.threerings.media.tile.TileException; import com.threerings.media.tile.TileLayer; import com.threerings.miso.Log; @@ -73,6 +72,7 @@ public class DisplayMisoSceneImpl // create the individual tile layer objects _base = new BaseTileLayer(new BaseTile[swid*shei], swid, shei); _fringe = new TileLayer(new Tile[swid*shei], swid, shei); + _covered = new boolean[swid*shei]; } /** @@ -142,7 +142,7 @@ public class DisplayMisoSceneImpl int tsid = (fqTid >> 16) & 0xFFFF, tid = (fqTid & 0xFFFF); try { expandObject(col, row, tsid, tid, fqTid, ii/3); - } catch (TileException te) { + } catch (NoSuchTileSetException te) { Log.warning("Scene contains non-existent object tile " + "[tsid=" + tsid + ", tid=" + tid + ", col=" + col + ", row=" + row + "]."); @@ -213,6 +213,14 @@ public class DisplayMisoSceneImpl } } + // documentation inherited from interface + public boolean canTraverse (Object trav, int x, int y) + { + BaseTile tile = getBaseTile(x, y); + return (((tile == null) || tile.isPassable()) && + !_covered[y*_model.width+x]); + } + /** * Return a string representation of this Miso scene object. */ @@ -276,10 +284,7 @@ public class DisplayMisoSceneImpl continue; } - BaseTile tile = _base.getTile(xx, yy); - if (tile != null) { - tile.setCovered(covered); - } + _covered[yy*_model.width+xx] = true; } } @@ -299,6 +304,9 @@ public class DisplayMisoSceneImpl /** The fringe layer of tiles. */ protected TileLayer _fringe; + /** Information on which tiles are covered by object tiles. */ + protected boolean[] _covered; + /** The scene object records. */ protected ArrayList _objects = new ArrayList(); diff --git a/src/java/com/threerings/miso/client/IsoSceneView.java b/src/java/com/threerings/miso/client/IsoSceneView.java index 4dec14657..d29baefbd 100644 --- a/src/java/com/threerings/miso/client/IsoSceneView.java +++ b/src/java/com/threerings/miso/client/IsoSceneView.java @@ -1,5 +1,5 @@ // -// $Id: IsoSceneView.java,v 1.127 2002/12/05 23:06:30 mdb Exp $ +// $Id: IsoSceneView.java,v 1.128 2003/01/13 22:53:56 mdb Exp $ package com.threerings.miso.scene; @@ -455,7 +455,7 @@ public class IsoSceneView implements SceneView } // documentation inherited - public Path getPath (MisoCharacterSprite sprite, int x, int y) + public Path getPath (Sprite sprite, int x, int y) { // make sure we have a scene if (_scene == null) { diff --git a/src/java/com/threerings/miso/client/MisoCharacterSprite.java b/src/java/com/threerings/miso/client/MisoCharacterSprite.java deleted file mode 100644 index 25fb9075f..000000000 --- a/src/java/com/threerings/miso/client/MisoCharacterSprite.java +++ /dev/null @@ -1,22 +0,0 @@ -// -// $Id: MisoCharacterSprite.java,v 1.7 2002/12/05 23:06:30 mdb Exp $ - -package com.threerings.miso.scene; - -import com.threerings.cast.CharacterSprite; -import com.threerings.miso.tile.BaseTile; - -/** - * The miso character sprite extends the basic character sprite to support - * the notion of tile passability. - */ -public class MisoCharacterSprite extends CharacterSprite - implements Traverser -{ - // documentation inherited - public boolean canTraverse (BaseTile tile) - { - // by default, passability is solely the province of the tile - return tile.isPassable(); - } -} diff --git a/src/java/com/threerings/miso/client/SceneView.java b/src/java/com/threerings/miso/client/SceneView.java index 10f072e2b..ae3f886c7 100644 --- a/src/java/com/threerings/miso/client/SceneView.java +++ b/src/java/com/threerings/miso/client/SceneView.java @@ -1,5 +1,5 @@ // -// $Id: SceneView.java,v 1.31 2002/09/24 05:33:05 mdb Exp $ +// $Id: SceneView.java,v 1.32 2003/01/13 22:53:56 mdb Exp $ package com.threerings.miso.scene; @@ -9,6 +9,7 @@ import java.awt.Polygon; import java.awt.Rectangle; import java.awt.event.MouseEvent; +import com.threerings.media.sprite.Sprite; import com.threerings.media.util.Path; /** @@ -50,7 +51,7 @@ public interface SceneView * * @return the sprite's path, or null if no valid path exists. */ - public Path getPath (MisoCharacterSprite sprite, int x, int y); + public Path getPath (Sprite sprite, int x, int y); /** * Returns screen coordinates given the specified full coordinates. @@ -79,8 +80,8 @@ public interface SceneView /** * Returns information about the object over which the mouse is * currently hovering (either a {@link SceneObject} or a {@link - * MisoCharacterSprite}), or null if the mouse is not hovering over - * anything of interest. + * Sprite}), or null if the mouse is not hovering over anything of + * interest. */ public Object getHoverObject (); } diff --git a/src/java/com/threerings/miso/client/TilePath.java b/src/java/com/threerings/miso/client/TilePath.java index 8f5f864f3..a32b7ae57 100644 --- a/src/java/com/threerings/miso/client/TilePath.java +++ b/src/java/com/threerings/miso/client/TilePath.java @@ -1,5 +1,5 @@ // -// $Id: TilePath.java,v 1.11 2002/12/05 23:06:30 mdb Exp $ +// $Id: TilePath.java,v 1.12 2003/01/13 22:53:56 mdb Exp $ package com.threerings.miso.scene; @@ -8,6 +8,7 @@ import java.util.List; import com.threerings.util.DirectionCodes; +import com.threerings.media.sprite.Sprite; import com.threerings.media.util.LineSegmentPath; import com.threerings.media.util.PathNode; import com.threerings.media.util.Pathable; @@ -35,9 +36,8 @@ public class TilePath extends LineSegmentPath * @param desty the destination y-position in screen pixel * coordinates. */ - public TilePath ( - IsoSceneViewModel model, MisoCharacterSprite sprite, List tiles, - int destx, int desty) + public TilePath (IsoSceneViewModel model, Sprite sprite, + List tiles, int destx, int desty) { _model = model; @@ -51,7 +51,7 @@ public class TilePath extends LineSegmentPath boolean moved = super.tick(pable, timestamp); if (moved) { - MisoCharacterSprite mcs = (MisoCharacterSprite)pable; + Sprite mcs = (Sprite)pable; int sx = mcs.getX(), sy = mcs.getY(); Point pos = new Point(); @@ -94,8 +94,7 @@ public class TilePath extends LineSegmentPath * from its starting position to the given destination coordinates * following the given list of tile coordinates. */ - protected void createPath ( - MisoCharacterSprite sprite, List tiles, int destx, int desty) + protected void createPath (Sprite sprite, List tiles, int destx, int desty) { // constrain destination pixels to fine coordinates Point fpos = new Point(); diff --git a/src/java/com/threerings/miso/client/Traverser.java b/src/java/com/threerings/miso/client/Traverser.java deleted file mode 100644 index b113a7350..000000000 --- a/src/java/com/threerings/miso/client/Traverser.java +++ /dev/null @@ -1,25 +0,0 @@ -// -// $Id: Traverser.java,v 1.4 2001/11/27 22:17:42 mdb Exp $ - -package com.threerings.miso.scene; - -import com.threerings.miso.tile.BaseTile; - -/** - * The Traverser interface should be implemented by - * sprites that are going to traverse some path in a scene. This - * allows path determination to take into account any special - * abilities the traverser may have that alter the traversability of - * tiles. - */ -public interface Traverser -{ - /** - * Return whether the traverser can traverse the specified tile. - * - * @param tile the tile to traverse. - * - * @return whether the tile is traversable. - */ - public boolean canTraverse (BaseTile tile); -} diff --git a/src/java/com/threerings/miso/client/util/AStarPathUtil.java b/src/java/com/threerings/miso/client/util/AStarPathUtil.java index 3d68b8a69..3e05f65b1 100644 --- a/src/java/com/threerings/miso/client/util/AStarPathUtil.java +++ b/src/java/com/threerings/miso/client/util/AStarPathUtil.java @@ -1,5 +1,5 @@ // -// $Id: AStarPathUtil.java,v 1.20 2002/09/13 00:51:19 ray Exp $ +// $Id: AStarPathUtil.java,v 1.21 2003/01/13 22:53:56 mdb Exp $ package com.threerings.miso.scene.util; @@ -12,7 +12,6 @@ import com.threerings.media.util.MathUtil; import com.threerings.miso.Log; import com.threerings.miso.scene.DisplayMisoScene; -import com.threerings.miso.scene.Traverser; import com.threerings.miso.tile.BaseTile; /** @@ -45,7 +44,7 @@ public class AStarPathUtil * @return the list of points in the path. */ public static List getPath ( - DisplayMisoScene scene, int tilewid, int tilehei, Traverser trav, + DisplayMisoScene scene, int tilewid, int tilehei, Object trav, int ax, int ay, int bx, int by) { AStarInfo info = new AStarInfo(scene, tilewid, tilehei, trav, bx, by); @@ -212,7 +211,7 @@ class AStarInfo public int tilewid, tilehei; /** The traverser moving along the path. */ - public Traverser trav; + public Object trav; /** The set of open nodes being searched. */ public SortedSet open; @@ -227,7 +226,7 @@ class AStarInfo public int maxcost; public AStarInfo ( - DisplayMisoScene scene, int tilewid, int tilehei, Traverser trav, + DisplayMisoScene scene, int tilewid, int tilehei, Object trav, int destx, int desty) { // save off references @@ -284,11 +283,7 @@ class AStarInfo */ protected boolean isTraversable (int x, int y) { - if (isCoordinateValid(x, y)) { - BaseTile tile = scene.getBaseTile(x, y); - return (tile == null) || trav.canTraverse(tile); - } - return true; + return isCoordinateValid(x, y) && scene.canTraverse(trav, x, y); } /** diff --git a/src/java/com/threerings/miso/client/util/IsoUtil.java b/src/java/com/threerings/miso/client/util/IsoUtil.java index a80ef2d42..2909c16e4 100644 --- a/src/java/com/threerings/miso/client/util/IsoUtil.java +++ b/src/java/com/threerings/miso/client/util/IsoUtil.java @@ -1,5 +1,5 @@ // -// $Id: IsoUtil.java,v 1.41 2002/12/05 23:06:30 mdb Exp $ +// $Id: IsoUtil.java,v 1.42 2003/01/13 22:53:56 mdb Exp $ package com.threerings.miso.scene.util; @@ -17,7 +17,6 @@ import com.threerings.util.DirectionUtil; import com.threerings.miso.Log; import com.threerings.miso.scene.IsoSceneViewModel; -import com.threerings.miso.scene.MisoCharacterSprite; import com.threerings.miso.scene.SceneObject; /**