inherit M_MESSAGES;
#include <type.h>
static string *que;
static int time;
static string *actions;
static mapping item_commands; /* Commands that are local to worn/wielded items. */
/* Add to the item command mapping */
void add_item_command( string command, object ob ) {
if( item_commands == 0 )
item_commands = ([ ]);
item_commands[command] = ob;
}
void remove_item_command( string command ) {
if( item_commands == 0 )
item_commands = ([ ]);
item_commands[command] = 0;
}
void do_game_command( string message ) {
mixed result;
string cmd;
string arg;
int flag;
arg = "";
set_this_player( this_object() );
if( sscanf( message, "%s %s", cmd, arg ) != 2 ) {
cmd = message;
}
if( arg == "me" ) {
arg = this_player()->query_id();
}
flag = 0;
/* Check for a verb */
result = PARSE_D->parse( cmd + " " + arg );
if( result != 0 ) {
if( typeof( result ) == T_STRING ) {
write( result );
}
flag = 1;
}
/* check for non-player cmds first */
if( !this_player()->is_player() ) {
if( file_exists( "/cmds/monster/" + cmd + ".c" ) ) {
call_other( "/cmds/monster/" + cmd, "main", arg );
flag = 1;
}
}
/* check for normal player cmds */
if( !flag ) {
if( file_exists( "/cmds/player/" + cmd + ".c" ) ) {
call_other( "/cmds/player/" + cmd, "main", arg );
flag = 1;
}
}
if( !flag ) {
/* Check for an item command */
int i;
string *item_cmds;
if( item_commands == 0 )
item_commands = ([ ]);
item_cmds = map_indices( item_commands );
for( i = 0; i < sizeof( item_cmds ); i++ ) {
if( item_cmds[i] == cmd ) {
call_other( item_commands[ item_cmds[i] ], "do_" + cmd, arg );
flag = 1;
}
}
}
/* check for emotes */
if( !flag ) {
if( EMOTE_D->is_emote( cmd ) ) {
string *rules;
string rule;
object target;
rules = EMOTE_D->query_rules( cmd );
if( arg != "" ) {
target = this_environment()->find_object( arg );
} else {
target = 0;
}
if( target != 0 ) {
/* We've found our target, check for the correct rule */
if( target->is_living() ) {
/* We're looking for a LIV rule */
if( member_array( "LIV", rules ) != -1 ) {
rule = "LIV";
} else {
rule = "";
}
} else {
/* We're looking for a OBJ rule */
if( member_array( "OBJ", rules ) != -1 ) {
rule = "OBJ";
} else {
rule = "";
}
}
} else {
/* Or are we just looking for a string? */
if( member_array( "STR", rules ) != -1 && arg != "" ) {
rule = "STR";
} else {
rule = "";
}
}
if( rule == "LIV" ) {
targetted_action( EMOTE_D->query_emote( cmd, rule ), target );
} else if( rule == "OBJ" ) {
simple_action( EMOTE_D->query_emote( cmd, rule), target );
} else if( rule == "STR" ) {
simple_action( EMOTE_D->query_emote( cmd, rule), arg );
} else {
if( member_array( "", rules ) != -1 )
simple_action( EMOTE_D->query_emote( cmd, rule) );
else
write( "No such emote.\n" );
}
flag = 1;
}
}
set_this_player( 0 );
}
void do_respond() {
do_game_command( que[0] );
que = que[1..];
}
void respond( string message ) {
if( que == 0 )
que = ({ });
que += ({ message });
call_out( "do_respond", random(3) );
}
void do_action( void ) {
respond( actions[ random( sizeof( actions ) ) ] );
call_out( "do_action", time );
}
void set_actions( int t, string *act ) {
time = t;
actions = act;
call_out( "do_action", time );
}