/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** ** Class History ** ** Date Name Description ** ---------|------------|----------------------------------------------- ** 19Jul97 subtle created this command ** 28Jul97 exile fixed the "fades from view" thing ** */ package key.commands; import key.*; import java.io.*; import java.util.StringTokenizer; /** * ChangeRoom returns you to the last public room * you were in. It will mainly be used to * leave someone's rooms (including your own) */ public class ChangeRoom extends Command { public static final AtomicElement[] ELEMENTS = { AtomicElement.construct( ChangeRoom.class, String.class, "leave", AtomicElement.PUBLIC_FIELD, "the message sent to the room when a player leaves" ), AtomicElement.construct( ChangeRoom.class, String.class, "enter", AtomicElement.PUBLIC_FIELD, "the message sent to the room when a player enters" ), AtomicElement.construct( ChangeRoom.class, String.class, "failure", AtomicElement.PUBLIC_FIELD, "the message sent to the player when the move fails" ), AtomicElement.construct( ChangeRoom.class, String.class, "noFind", AtomicElement.PUBLIC_FIELD, "the message sent to the player when the room cannot be found" ), AtomicElement.construct( ChangeRoom.class, Atom.class, "referenceIn", AtomicElement.PUBLIC_FIELD, "the place to look for the room" ), AtomicElement.construct( ChangeRoom.class, String.class, "roomProperty", AtomicElement.PUBLIC_FIELD, "the property within the reference to search for the room (eg, 'home', if the reference is to a player)" ) }; public static final AtomicStructure STRUCTURE = new AtomicStructure( Command.STRUCTURE, ELEMENTS ); public static final char playerCode = 'o'; public String leave = "%o slowly fades from view..."; public String enter = "%o materialises before you..."; public String roomProperty = ""; public String failure = "But you are already there."; public String noFind = "Cannot find that place."; public Reference referenceIn = Key.shortcuts().getThis(); public ChangeRoom() { setKey( "changeRoom" ); usage = ""; } public AtomicStructure getDeclaredStructure() { return( STRUCTURE ); } public void run( Player p, StringTokenizer args, String fullLine, CategoryCommand caller, InteractiveConnection ic, Flags flags ) throws IOException { Room current = p.getLocation(); Atom in = (Atom) referenceIn.get(); if( in != null ) { Room wanted = null; try { wanted = (Room) in.getProperty( roomProperty ); } catch( NoSuchPropertyException e ) { ic.sendFailure( noFind ); return; } catch( ClassCastException e ) { ic.sendFailure( noFind ); return; } if( wanted == null ) { wanted = noSuchRoom( p, ic ); if( wanted == null ) return; } if( current == wanted ) ic.sendFailure( failure ); else if( wanted.canMoveInto( p ) ) { String e; String l; p.putCode( playerCode, p.getName() ); e = Grammar.substitute( enter, p.getCodes() ); l = 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, l ); p.moveTo( wanted, le, ee ); p.roomLook(); } else ic.sendFailure( "You may not use this mode of travel to go there." ); } else ic.sendFailure( "The command is temporarily unavailable" ); } protected Room noSuchRoom( Player p, InteractiveConnection ic ) { ic.sendFailure( noFind ); return null; } }