/* Do not remove the headers from this file! see /USAGE for more info. */
class flow_set
{
function cond;
string to;
string msg_here;
string msg_there;
int delay;
}
class flow_set array flow_arr = ({});
void add_hook( string tag, function hook );
void object_action( object obj, string msg, object where )
{
string array msgs = M_MESSAGES->action(({}), msg, obj);
msg = msgs[0];
tell_from_inside( where, msg );
}
void flow( object obj, string msg_here, string msg_there, string go_to )
{
object to = load_object( go_to );
if( !obj ) return;
if( environment( obj ) != this_object() ) return;
object_action( obj, msg_here, environment(obj));
object_action( obj, msg_there, to );
obj->move(to);
}
void fall_through( object obj)
{
// Not the most efficient of implementations .. a smarter one would
// sort by delay or something.
foreach( class flow_set fs in flow_arr )
{
if( !evaluate( fs->cond, obj )) continue;
if( fs->delay )
call_out((: flow( $(obj), $(fs->msg_here), $(fs->msg_there), $(fs->to)) :), fs->delay );
else flow( obj, fs->msg_here, fs->msg_there, fs->to );
}
}
void set_flow( mapping array flows )
{
foreach( mapping fs in flows )
{
class flow_set fl;
fl = new(class flow_set);
if( undefinedp( fl->cond = fs["cond"] ) )
error( "cond undefined" );
if( undefinedp( fl->to = fs["to"] ))
error( "to undefined" );
if( undefinedp( fl->msg_here = fs[ "msg_here"]))
error( "msg_here undefined");
if( undefinedp( fl->msg_there = fs["msg_there"]))
error( "msg_there undefined");
if( undefinedp( fl->delay = fs["delay"]))
fl->delay = 0;
flow_arr += ({ fl });
}
add_hook( "object_arrived", (: fall_through :));
}