Files
narya/src/java/com/threerings/miso/client/DisplayMisoSceneImpl.java
T
Walter Korman 356f15595e Draw locations such that orientation is apparent. Added support for
editing existing location information.
 CVS: ----------------------------------------------------------------------


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@213 542714f4-19e9-0310-aa3c-eee0fc999fb1
2001-08-10 23:07:04 +00:00

268 lines
6.6 KiB
Java

//
// $Id: DisplayMisoSceneImpl.java,v 1.23 2001/08/10 23:07:04 shaper Exp $
package com.threerings.miso.scene;
import java.awt.Point;
import java.io.*;
import java.util.ArrayList;
import com.samskivert.util.StringUtil;
import com.threerings.miso.Log;
import com.threerings.miso.tile.Tile;
import com.threerings.miso.tile.TileManager;
/**
* A Scene object represents the data model corresponding to a single
* screen for game play. For instance, one scene might display a
* portion of a street with several buildings scattered about on the
* periphery.
*/
public class Scene
{
/** The base layer id. */
public static final int LAYER_BASE = 0;
/** The fringe layer id. */
public static final int LAYER_FRINGE = 1;
/** The object layer id. */
public static final int LAYER_OBJECT = 2;
/** The total number of layers. */
public static final int NUM_LAYERS = 3;
/** The latest scene file format version. */
public static final short VERSION = 1;
/** The scene width in tiles. */
public static final int TILE_WIDTH = 22;
/** The scene height in tiles. */
public static final int TILE_HEIGHT = 22;
/** String translations of each tile layer name. */
public static final String[] XLATE_LAYERS = { "Base", "Fringe", "Object" };
/** Scene id to denote an unset or otherwise invalid scene id. */
public static final short SID_INVALID = -1;
/** The tiles comprising the scene. */
public Tile tiles[][][];
/**
* Construct a new Scene object. The base layer tiles are
* initialized to contain tiles of the specified default tileset
* and tile id.
*
* @param tilemgr the tile manager.
* @param deftsid the default tileset id.
* @param deftid the default tile id.
*/
public Scene (TileManager tilemgr, int deftsid, int deftid)
{
_tilemgr = tilemgr;
_sid = SID_INVALID;
_name = DEF_SCENE_NAME;
_locations = new ArrayList();
_clusters = new ArrayList();
_exits = new ArrayList();
tiles = new Tile[TILE_WIDTH][TILE_HEIGHT][NUM_LAYERS];
_deftile = _tilemgr.getTile(deftsid, deftid);
for (int xx = 0; xx < TILE_WIDTH; xx++) {
for (int yy = 0; yy < TILE_HEIGHT; yy++) {
for (int ii = 0; ii < NUM_LAYERS; ii++) {
if (ii == LAYER_BASE) {
tiles[xx][yy][ii] = _deftile;
}
}
}
}
}
/**
* Construct a new Scene object with the given values.
*
* @param tilemgr the tile manager.
* @param name the scene name.
* @param locations the locations.
* @param exits the exits.
* @param tiles the tiles comprising the scene.
*/
public Scene (TileManager tilemgr, String name,
ArrayList locations, ArrayList clusters, ArrayList exits,
Tile tiles[][][])
{
_tilemgr = tilemgr;
_sid = SID_INVALID;
_name = name;
_locations = locations;
_clusters = clusters;
_exits = exits;
this.tiles = tiles;
}
/**
* Return the cluster index number the given location is in, or -1
* if the location is not in any cluster.
*
* @param loc the location.
*/
public int getClusterIndex (Location loc)
{
return ClusterUtil.getClusterIndex(_clusters, loc);
}
public void updateLocation (Location loc, int clusteridx)
{
// look the location up in our existing location list
int size = _locations.size();
for (int ii = 0; ii < size; ii++) {
Location tloc = (Location)_locations.get(ii);
if (tloc == loc) {
// if we found it, just update the cluster contents
ClusterUtil.regroup(_clusters, tloc, clusteridx);
return;
}
}
// else we didn't find it, so hold on to the sucker
_locations.add(loc);
// and update the cluster contents
ClusterUtil.regroup(_clusters, loc, clusteridx);
}
/**
* Return the location object at the given full coordinates, or
* null if no location is currently present.
*
* @param x the full x-position coordinate.
* @param y the full y-position coordinate.
*
* @return the location object.
*/
public Location getLocation (int x, int y)
{
int size = _locations.size();
for (int ii = 0; ii < size; ii++) {
Location loc = (Location)_locations.get(ii);
if (loc.x == x && loc.y == y) return loc;
}
return null;
}
/**
* Return the scene name.
*/
public String getName ()
{
return _name;
}
/**
* Return the scene identifier.
*/
public short getId ()
{
return _sid;
}
/**
* Return the scene locations list.
*/
public ArrayList getLocations ()
{
return _locations;
}
/**
* Return the cluster list.
*/
public ArrayList getClusters ()
{
return _clusters;
}
/**
* Return the scene exits list.
*/
public ArrayList getExits ()
{
return _exits;
}
public int getNumClusters ()
{
return _clusters.size();
}
/**
* Return the number of actual (non-null) tiles present in the
* specified tile layer for this scene.
*/
public int getNumLayerTiles (int lnum)
{
if (lnum == LAYER_BASE) return TILE_WIDTH * TILE_HEIGHT;
int numTiles = 0;
for (int xx = 0; xx < TILE_WIDTH; xx++) {
for (int yy = 0; yy < TILE_HEIGHT; yy++) {
if (tiles[xx][yy] != null) numTiles++;
}
}
return numTiles;
}
/**
* Return the default tile for the base layer of the scene.
*/
public Tile getDefaultTile ()
{
return _deftile;
}
/**
* Return a string representation of this Scene object.
*/
public String toString ()
{
StringBuffer buf = new StringBuffer();
buf.append("[name=").append(_name);
buf.append(", sid=").append(_sid);
buf.append(", locations=").append(StringUtil.toString(_locations));
buf.append(", clusters=").append(StringUtil.toString(_clusters));
buf.append(", exits=").append(StringUtil.toString(_exits));
return buf.append("]").toString();
}
/** The default scene name. */
protected static final String DEF_SCENE_NAME = "Untitled Scene";
/** The scene name. */
protected String _name;
/** The unique scene id. */
protected short _sid;
/** The locations within the scene. */
protected ArrayList _locations;
/** The clusters within the scene. */
protected ArrayList _clusters;
/** The exits to different scenes. */
protected ArrayList _exits;
/** The default tile for the base layer in the scene. */
protected Tile _deftile;
/** The tile manager. */
protected TileManager _tilemgr;
}