/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
*/
package key.commands;
import key.*;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.Enumeration;
public class RefExit extends CommandCategoryContainer
{
public RefExit()
{
setKey( "exit" );
usage = "<exit> [<command>]";
}
/**
* @see key.Command.getMatch
*/
public Commandable getMatch( final Player p, key.util.StringTokenizer st )
{
if( st.hasMoreTokens() )
{
String ename = st.nextToken();
Commandable co = super.getMatch( p, st );
if( co != null && co != this )
{
Atom exit = getSymbolInside( p.getConnection(), ename, Type.EXIT, p.getLocation() );
if( exit != null )
return( new ContextChanger( co, exit ) );
else
return( co );
}
else
return( co );
}
else
return( this );
}
public Command.Match getFinalMatch( final Player p, key.util.StringTokenizer st )
{
if( st.hasMoreTokens() )
{
final String ename = st.nextToken();
Command.Match cm = super.getFinalMatch( p, st );
if( cm.match != null )
{
Atom exit = getSymbolInside( p.getConnection(), ename, p.getLocation() );
if( exit != null )
cm.match = new ContextChanger( cm.match, exit );
else
cm.match = null;
}
return( cm );
}
else
return( super.getFinalMatch( p, st ) );
}
/**
* should put the player into this mode
*/
public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
{
// this will only be called if none of the sub-commands
// were validated.
fullLine = fullLine.trim().toLowerCase();
StringTokenizer st = new StringTokenizer( fullLine );
String name = fullLine;
if( st.hasMoreTokens() )
{
name = st.nextToken();
if( st.hasMoreTokens() )
{
st.nextToken();
if( st.hasMoreTokens() )
st = new StringTokenizer( name + " " + st.nextToken( "" ) );
else
st = new StringTokenizer( name );
}
else
st = new StringTokenizer( name );
}
Vector v = new Vector( 25, 50 );
for( Enumeration e = p.getCategoryCommandsMatching( st ); e.hasMoreElements(); )
{
Object[] o = (Object[]) e.nextElement();
CommandList cl;
if( o[0] != null )
cl = ((CommandContainer) o[0]).getCommandList();
else
cl = (CommandList) o[1];
for( Enumeration f = cl.elements(); f.hasMoreElements(); )
{
String s = ((Command)f.nextElement()).getName();
if( !v.contains( s ) )
v.addElement( s );
}
}
if( v.size() > 0 )
{
ic.send( "'" + name +
"' is not a command, it is a category that contains other commands. For instance, you might type '" +
name + " gate " + ((String) v.elementAt( 0 )) +
"' (If 'gate' is an exit in this room). The full list of available commands is: ^h" +
Grammar.commaSeperate( v.elements() ) + "^-" );
}
else
ic.send( "There are no available sub-commands in this category." );
}
}