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 ##########   #####"
*/

package key;

import java.util.StringTokenizer;
import java.io.File;

/*
**  The base class for all 'objects' that can be placed
**  in rooms or manipulated by players.
*/
public interface Thing
{
	/**
	  *  eg, "pink teddy bear", as in "You pick up a pink teddy bear".
	 */
	public String getFullPortrait( Player p );
	
	/**
	  *  eg, "use sword kill snapper". [ Hi J ;) ]
	 */
	public void use( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void wear( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void remove( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void wield( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void read( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void look( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void inspect( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void get( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void give( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void drop( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void sit( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );

	/**
	  *  Unlike the others, stand does not require the object 'argument' to be
	  *  specified - it is automatically determined.  It doesn't effect the
	  *  parameters of this call, though.
	 */
	public void stand( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void drink( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void eat( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void open( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void close( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void fill( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void lock( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	public void unlock( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom actual );
	
	/**
	  *  This routine builds a new type of this Thing.
	  *
	  *  To explain, most things don't require a seperate instantiation
	  *  of the actual Atom being built, so it is acceptable to just
	  *  return a reference to itself (which will generally be something
	  *  in /realm.objects).
	  *
	  *  However, some objects, such as a purse or backpack (which contain
	  *  things) require a seperate instantiation for each player that
	  *  owns it.  In this situation, it is necessary to create a new atom
	  *  in ~player.objects and return a reference to that.
	  *
	  *  There may be other situations in the future, as well.
	 */
	public Reference build( Player p );
	
	public boolean isMethodSpecial( java.lang.reflect.Method m );
}