/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
*/
package key.talker.objects;
import key.*;
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.Vector;
import java.io.*;
/**
* Prop.
*
* A simple class that has no behaviour, only a particular appearance,
* just like a stage prop.
*/
public class Message extends Prop implements Thing
{
public static final AtomicElement[] ELEMENTS =
{
AtomicElement.construct( Message.class, String.class, "direct",
AtomicElement.PUBLIC_FIELD,
"the message sent to the recipient of the use command" ),
AtomicElement.construct( Message.class, String.class, "feedback",
AtomicElement.PUBLIC_FIELD,
"the message sent to the user" ),
AtomicElement.construct( Message.class, String.class, "room",
AtomicElement.PUBLIC_FIELD,
"the message sent to the current room (if set, the target must be in the same room as the originator)" ),
AtomicElement.construct( Message.class, Boolean.TYPE, "wieldToUse",
AtomicElement.PUBLIC_FIELD,
"true if the object must be wielded to be used" ),
};
public static final char originatorCode = 'o';
public static final char prefixNameCode = 'p';
public static final char targetCode = 't';
public static final AtomicStructure STRUCTURE = new AtomicStructure( Atom.STRUCTURE, ELEMENTS );
public String direct = null;
public String feedback = null;
public String room = null;
public boolean wieldToUse = true;
public Message()
{
}
public AtomicStructure getDeclaredStructure()
{
return( STRUCTURE );
}
public String getDirect()
{ return( direct ); }
public String getFeedback()
{ return( feedback ); }
public String getRoom()
{ return( room ); }
public boolean getWieldToUse()
{ return( wieldToUse ); }
public void use( Player p, StringTokenizer args, InteractiveConnection ic, Flags flags, Atom item )
{
if( direct != null )
{
if( args.hasMoreTokens() )
{
String name = args.nextToken();
Player target = (Player) Command.getOnlinePlayer( p, ic, name );
if( target == null )
return;
if( room != null )
{
if( target.getLocation() != p.getLocation() )
{
ic.sendError( target.getName() + " is not in the same room as you." );
}
}
p.putCode( originatorCode, p.getName() );
p.putCode( prefixNameCode, p.getFullName() );
p.putCode( targetCode, target.getName() );
String main = "";
String self = "";
String bcst = "";
if( direct != null )
main = direct;
if( room != null )
bcst = Grammar.substitute( room, p.getCodes() );
if( bcst.length() > 0 )
{
if( feedback != null )
self = Grammar.substitute( feedback, p.getCodes() );
new key.effect.DirectedBroadcast( p.getLocation(), p, target, bcst, self, main, targetCode ).cause();
}
else
{
self = feedback;
new key.effect.Directed( p, target, self, main, targetCode ).cause();
}
}
else
ic.sendError( "Usage: use <object> <player>" );
}
else
{
if( room != null )
{
String self = room;
p.putCode( originatorCode, p.getName() );
p.putCode( prefixNameCode, p.getFullName() );
if( feedback != null )
self = Grammar.substitute( feedback, p.getCodes() );
else
self = Grammar.substitute( room, p.getCodes() );
String main = Grammar.substitute( room, p.getCodes() );
new key.effect.Broadcast( p.getLocation(), p, main, self ).cause();
}
else
ic.sendFailure( "You cannot use this object." );
}
}
}