/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** */ package key; import java.util.Enumeration; import java.util.StringTokenizer; import java.io.*; /** * Exits connect rooms. */ public class Exit extends Material implements Thing { private static final long serialVersionUID = -7925959907727440220L; public static final AtomicElement[] ELEMENTS = { // String getName(); AtomicElement.construct( Exit.class, Room.class, "to", AtomicElement.PUBLIC_FIELD, "the room this exit goes to" ), AtomicElement.construct( Exit.class, String.class, "departRoom", AtomicElement.PUBLIC_FIELD, "the message sent to the room when someone exits" ), AtomicElement.construct( Exit.class, String.class, "arriveRoom", AtomicElement.PUBLIC_FIELD, "the message sent to the room when someone arrives" ), AtomicElement.construct( Exit.class, Paragraph.class, "through", AtomicElement.PUBLIC_FIELD, "the message sent to the person who walks through the exit" ), AtomicElement.construct( Exit.class, Paragraph.class, "description", AtomicElement.PUBLIC_FIELD, "the message sent to a person who looks at the exit" ), AtomicElement.construct( Exit.class, Boolean.TYPE, "autoLook", AtomicElement.PUBLIC_FIELD, "whether an automatic 'look' command is performed when someone walks through the exit" ) }; public static final AtomicStructure STRUCTURE = new AtomicStructure( Material.STRUCTURE, ELEMENTS ); public Reference to = Reference.EMPTY; public String departRoom = "%o walks out"; public String arriveRoom = "%o walks in"; public Paragraph through = new TextParagraph( "You walk through the exit" ); public Paragraph description = new TextParagraph( "A rent in the fabric of reality" ); /** * determines if a 'look' command is automatically * invoked when you step through the exit. If true, * the rooms description is displayed. Otherwise, just * a listing of the other people here is displayed. */ public boolean autoLook = true; public static final char originatorCode = 'o'; public static final char hesheCode = 'h'; public static final char hisHerCode = 'i'; public Exit() { // exits are not getable, generally // speaking. getPermissionList().deny( Atom.moveAction ); } public AtomicStructure getDeclaredStructure() { return( STRUCTURE ); } public final String getDepartRoom() { return( departRoom ); } public final Paragraph getThrough() { return( through ); } public final String getArriveRoom() { return( arriveRoom ); } public final Paragraph getDescription() { return( description ); } public final Room getTo() { try { return( (Room)to.get() ); } catch( OutOfDateReferenceException e ) { to = Reference.EMPTY; return( null ); } catch( ClassCastException e ) { Log.error( getId() + ".to", e ); to = Reference.EMPTY; return( null ); } } public final boolean getAutoLook() { return( autoLook ); } public void look( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom item ) { ic.send( description ); } public void get( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom item ) { ic.sendFailure( "You can't pick up a direction!" ); } public void drop( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom item ) { ic.sendFailure( "You can't drop a direction!" ); } public static final Paragraph throughParagraph = new HeadingParagraph( "through" ); public static final Paragraph descriptionParagraph = new HeadingParagraph( "description" ); public static final Paragraph throughHelpParagraph = new TextParagraph( TextParagraph.CENTERALIGNED, "(the message a player sees when going through this exit is shown below)" ); public void inspect( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom item ) { defaultInspect( p, args, ic, flags, item ); putCodes( p ); ic.send( "Autolook: " + Grammar.onOff( autoLook ) ); ic.send( "The arriveRoom message is: " + Grammar.substitute( arriveRoom, p.getCodes() ) ); ic.send( "The departRoom message is: " + Grammar.substitute( departRoom, p.getCodes() ) ); ic.blankLine(); Room room = getTo(); if( room == null ) ic.send( "This exit doesn't lead anywhere, by the looks of it." ); else ic.send( "This exit leads to " + room.portrait() + ", designated by " + room.getId() + "." ); ic.blankLine(); ic.send( descriptionParagraph ); ic.send( description ); ic.blankLine(); ic.send( throughHelpParagraph ); ic.send( throughParagraph ); ic.send( through ); ic.sendLine(); } public String getFullPortrait( Player p ) { Room r = getTo(); if( r != null ) return( "exit to the " + r.portrait ); else return( "exit to nowhere" ); } public void putCodes( Player p ) { p.putCode( originatorCode, p.getName() ); p.putCode( hesheCode, p.heShe() ); p.putCode( hisHerCode, p.hisHer() ); } public void use( Player p, StringTokenizer _args, InteractiveConnection _ic, Flags _flags, Atom item ) { // the process: // 1. splash the exit messages to the players current location // 2. move the player to the new room (toProperty) // 3. splash the enter message to the players current location // (to room) String enter; String leave; putCodes( p ); // exile: swapped the exit events so that they splash correctly enter = Grammar.substitute( arriveRoom, p.getCodes() ); leave = Grammar.substitute( departRoom, p.getCodes() ); Effect le = null; Effect ee = null; Room wanted = (Room) to.get(); Room current = p.getLocation(); InteractiveConnection ic = p.getConnection(); if( ic == null ) throw new PlayerNotConnectedException(); if( wanted == null ) { ic.sendFailure( "You can't go that way. (We were lying about the exit)" ); return; } else ee = new key.effect.Enter( p, wanted, enter ); if( current != null ) le = new key.effect.Leave( p, current, leave ); p.moveTo( wanted, le, ee ); ic.send( through ); if( autoLook ) p.roomLook(); else { ic.send( wanted.called ); ic.send( wanted.who( p ) ); Paragraph exits = wanted.exits(); if( exits != null ) ic.send( exits ); } } public void setTo( Room r ) { to = r.getThis(); } }