key0-96/
key0-96/doc/key/
key0-96/doc/key/credits/
key0-96/doc/key/developers/
key0-96/doc/key/developers/resources/
key0-96/setup/caves/
key0-96/setup/help/
key0-96/setup/ruins/
key0-96/src/
key0-96/src/commands/
key0-96/src/events/
key0-96/src/hack/
key0-96/src/sql/
key0-96/src/swing/
key0-96/src/talker/forest/
key0-96/src/talker/objects/
key0-96/src/terminals/
/*
**               j###t  ########## ####   ####
**              j###t   ########## ####   ####
**             j###T               "###L J###"
**          ######P'    ##########  #########
**          ######k,    ##########   T######T
**          ####~###L   ####
**          #### q###L  ##########   .#####
**          ####  \###L ##########   #####"
**
**  Class History
**  
**  Date        Name         Description
**  ---------|------------|-----------------------------------------------
**  18Jul97     subtle       created this class
**
*/

package key;

import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;

/**
  *  This classes isn't strictly _necessary_.  We use it to add
  *  some very forest specific behaviour to Key.  (Our special
  *  rooms, the concept of realms, which we never did finish,
  *  and our ranks.)  You could modify this fairly easily to do
  *  this for your own talker.  It isn't, of course, necessary
  *  to spell out your categories of rooms in seperate landscapes
  *  files here - indeed, most of this class only exists because we
  *  wanted to seperate the data into different files, as opposed
  *  to leaving it all in the main one (probably online, but who
  *  knows.)
 */
public class Forest extends Key
{
	private static final long serialVersionUID = 4168035326113564429L;
	
	protected transient Realm realm;
	protected transient Realm marshLand;

	protected transient Container ranks;

	protected transient Rank player;
	
	public Forest()
	{
		try
		{
			realm = (Realm) Factory.makeAtom( Realm.class, "realm" );
			add( realm );
			
			marshLand = (Realm) Factory.makeAtom( Realm.class, "marshLand" );
			add( marshLand );
			
			Landscape ruins = (Landscape) Factory.makeAtom( Landscape.class, "ruins" );
			realm.add( ruins );
			
			Landscape city = (Landscape) Factory.makeAtom( Landscape.class, "city" );
			realm.add( city );
			
			Landscape outside = (Landscape) Factory.makeAtom( Landscape.class, "outside" );
			realm.add( outside );
			
			Landscape caves = (Landscape) Factory.makeAtom( Landscape.class, "caves" );
			realm.add( caves );
			
			Log.bootLog( "set up default forest landscape" );
		}
		catch( NonUniqueKeyException e )
		{
			Log.debug( this, "couldn't fill forest landscape: " + e.toString() );
		}
		catch( BadKeyException e )
		{
			Log.debug( this, "bad forest landscape: " + e.toString() );
		}
		
		try
		{
			ranks = (Container) Factory.makeAtom( Container.class, "ranks" );
			ranks.setConstraint( Type.RANK );
			add( ranks );
			
			player = (ReverseRank) Factory.makeAtom( ReverseRank.class, "everyone" );
			ranks.add( player );
			
			Log.bootLog( "set up default forest ranks" );
		}
		catch( NonUniqueKeyException e )
		{
			Log.debug( this, "couldn't fill forest ranks: " + e.toString() );
		}
		catch( BadKeyException e )
		{
			Log.debug( this, "bad forest ranks: " + e.toString() );
		}
		
		realm.addTopLevel( shortcuts );
		marshLand.addTopLevel( shortcuts );
		ranks.addTopLevel( shortcuts );
	}
	
	protected void initFieldCache()
	{
		super.initFieldCache();
		
		realm = (Realm) getElement( "realm" );
		realm.addReference( this );
		
		marshLand = (Realm) getElement( "marshland" );
		marshLand.addReference( this );
		
		ranks = (Container) getElement( "ranks" );
		ranks.addReference( this );
		player = (Rank) ranks.getElement( "everyone" );
		player.addReference( this );
	}
	
	public Room getConnectRoom( Player p )
	{
			//  if they had a last public
			//  location, use it.
		{
			Room r = p.getLastPublicRoom();
			
			if( r != null )
				return( r );
		}
		
			//  pick a random room for them from the
			//  entry rooms for realm.
		Landscape er = realm.getEntryRooms();
		int c = er.count();
		
		if( c == 0 )
			return( super.getConnectRoom( p ) );
		else
		{
			Random r = new Random();
			int ran = Math.abs( r.nextInt() ) % c;
			return( (Room) er.getElementAt( ran ) );
		}
	}
	
		//  the rank a new player gets put in
	public Rank getInitialRank()
	{
		return( null );
	}
	
	public Container getRanks()
	{
		return( ranks );
	}
	
	public Realm getDefaultRealm()
	{
		return( realm );
	}
}