/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
*/
package key.commands;
import key.*;
import java.io.*;
import java.util.StringTokenizer;
import java.util.Hashtable;
import java.util.Enumeration;
public class Travel extends Command
{
public static final AtomicElement[] ELEMENTS =
{
AtomicElement.construct( Trans.class, String.class, "leave",
AtomicElement.PUBLIC_FIELD,
"the message sent to the room when a player leaves" ),
AtomicElement.construct( Trans.class, String.class, "enter",
AtomicElement.PUBLIC_FIELD,
"the message sent to the room when a player enters" )
};
public static final AtomicStructure STRUCTURE = new AtomicStructure( Command.STRUCTURE, ELEMENTS );
public static final char playerCode = 'o';
public String enter = "A shimmering rift appears before you as %o steps out.";
public String leave = "A shimmering rift appears before you as %o steps in.";
public Travel()
{
setKey( "travel" );
usage = "<location>";
}
public AtomicStructure getDeclaredStructure()
{
return( STRUCTURE );
}
public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException
{
if( !args.hasMoreTokens() )
usage( ic );
else
{
String id = args.nextToken();
Object l = null;
if( id.indexOf( "/" ) == -1 )
{
l = new Search( id, p.getContext() ).result;
if( l == null )
{
ic.sendError( "Could not locate '" + id + "' in " + p.getContext().getId() );
return;
}
}
else
{
l = new Search( id, Key.shortcuts() ).result;
if( l == null )
{
ic.sendError( "Could not locate '" + id + "'" );
return;
}
}
if( l instanceof Room )
{
Room wanted = (Room) l;
Room current = p.getLocation();
// we're nice: if there is an exit
// to this room in the current room,
// we can use that instead.
{
Reference r = wanted.getThis();
for( Enumeration e = current.elements(); e.hasMoreElements(); )
{
Object o = e.nextElement();
if( o instanceof Exit )
{
Exit x = ((Exit)o);
if( x.to.equals( r ) )
{
x.use( p, args, ic, flags, null );
return;
}
}
}
}
// set the codes
p.putCode( playerCode, p.getName() );
// substitute name for %o
String e;
String lm;
p.putCode( playerCode, p.getName() );
e = Grammar.substitute( enter, p.getCodes() );
lm = Grammar.substitute( leave, p.getCodes() );
Effect ee = new key.effect.Enter( p, wanted, e );
Effect le = null;
if( current != null )
le = new key.effect.Leave( p, current, lm );
p.moveTo( wanted, le, ee );
// show them where they are
p.roomLook();
// tell them
ic.sendFeedback( "You have travelled to " + ( (Room) l).getId() + "." );
}
else if( l instanceof Atom )
ic.sendError( "'" + ((Atom)l).getId() + "' is not a room." );
else
ic.sendError( "Object of type " + Type.typeOf( l ).getName() + " is not a room" );
}
}
}