#include <ctype.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include "define.h"
#include "struct.h"
bool check_progs ( char_data*, char*, char* );
bool check_social ( char_data*, char*, char* );
/*
* DISALLOW COMMAND ROUTINES
*/
bool is_mob( char_data* ch )
{
if( not_player( ch ) )
return TRUE;
if( ch->species != NULL ) {
send( ch, "You unable to do that while switched.\n\r" );
return TRUE;
}
return FALSE;
}
bool not_player( char_data* ch )
{
if( is_confused_pet( ch ) )
return TRUE;
if( ch->pcdata == NULL ) {
send_seen( ch, "%s looks around in confusion.\n\r", ch );
return TRUE;
}
return FALSE;
}
bool is_confused_pet( char_data* ch )
{
if( ch->pcdata != NULL || ch->leader == NULL
|| !is_set( &ch->status, STAT_ORDERED ) )
return FALSE;
send( ch->leader, "%s looks at you in bewilderment.\n\r", ch );
send_seen( ch, "%s looks at %s in bewilderment.\n\r",
ch, ch->leader );
return TRUE;
}
bool pet_help( char_data* ch )
{
if( ch->pcdata != NULL || ch->leader == NULL )
return FALSE;
send( ch->leader, "%s thinks you need help more than %s does.\n\r",
ch, ch->He_She( ) );
return TRUE;
}
bool is_humanoid( char_data* ch )
{
if( ch->species == NULL )
return TRUE;
send( ch, "You can only do that in humanoid form.\n\r" );
return FALSE;
}
bool is_familiar( char_data* ch )
{
if( ch->pcdata == NULL || ch->species == NULL
|| ch->shdata->level >= LEVEL_BUILDER )
return FALSE;
send( ch, "You can't do that while switched.\n\r" );
return TRUE;
}
/*
* MAIN COMMAND HANDLER
*/
void interpret( char_data* ch, char* argument )
{
char command [ MAX_INPUT_LENGTH ];
int cmd;
int length;
bool found;
timeval start;
time_data time;
char* arg;
skip_spaces( argument );
if( *argument == '+' ) {
argument++;
clear( ch->cmd_queue );
disrupt_spell( ch, TRUE );
}
if( *argument == '\0' ) {
next_page( ch->link );
return;
}
if( ch->link != NULL && ch->link->snoop_by != NULL ) {
send( ch->link->snoop_by, argument );
send( ch->link->snoop_by, "\n\r" );
}
clear_pager( ch );
if( ch->pcdata != NULL && is_set( ch->pcdata->pfile->flags, PLR_FREEZE )
&& !is_god( ch ) ) {
send( ch, "You're totally frozen!\n\r" );
return;
}
if( !isalpha( *argument ) && !isdigit( *argument ) ) {
command[0] = argument[0];
command[1] = '\0';
arg = argument+1;
skip_spaces( arg );
}
else
arg = one_argument( argument, command );
if( check_progs( ch, command, arg ) )
return;
found = TRUE;
length = strlen( command );
cmd = search( command_table, MAX_ENTRY_COMMAND, command );
if( cmd < 0 || !has_permission( ch, command_table[cmd].level ) ) {
if( cmd < 0 )
cmd = -cmd-1;
found = FALSE;
for( ; cmd < MAX_ENTRY_COMMAND; cmd++ ) {
if( !has_permission( ch, command_table[cmd].level ) )
continue;
if( strncasecmp( command_table[cmd].name, command, length ) )
break;
if( length >= command_table[cmd].reqlen ) {
found = TRUE;
break;
}
}
}
if( !found ) {
if( !check_social( ch, command, arg )
&& !speed_walking( ch, command ) )
send( ch, "<Type 'help' for help>\n\r" );
return;
}
if( is_set( command_table[cmd].level, PERM_DISABLED ) ) {
send( ch, "The command %s has been disabled.\n\r",
command_table[cmd].name );
return;
}
if( command_table[cmd].queue && ch->active.time != -1 ) {
if( ( time_till( &ch->active ) > 5 || entries( ch->cmd_queue ) != 0 )
&& ch->pcdata != NULL
&& is_set( &ch->pcdata->message, MSG_QUEUE ) )
send( ch, "Queued: %s\n\r", argument );
push( ch->cmd_queue, argument, is_set( &ch->status, STAT_ORDERED ) );
return;
}
if( command_table[cmd].position > POS_SLEEPING
&& is_set( ch->affected_by, AFF_PARALYSIS ) ) {
send( ch, "You are paralysed and unable to move!\n\r" );
return;
}
if( ch->position < command_table[cmd].position ) {
switch( ch->position ) {
case POS_DEAD:
send( ch, "You have died, and are unable to do anything.\n\r" );
break;
case POS_MORTAL:
case POS_INCAP:
send( ch, "The bright white light has you distracted.\n\r" );
break;
case POS_STUNNED:
send( ch, "You are stunned and cannot move.\n\r" );
break;
case POS_SLEEPING:
send( ch, "You cannot do that while sleeping.\n\r" );
break;
case POS_MEDITATING:
send( ch, "You are deep in meditation.\n\r" );
break;
case POS_RESTING:
send( ch, "Perhaps you should stand first.\n\r" );
break;
}
return;
}
if( command_table[cmd].position > POS_FIGHTING
&& ch->fighting != NULL ) {
send( ch, "The current battle has you occupied.\n\r" );
return;
}
if( ( is_avatar( ch ) && !is_god( ch ) )
|| ( ch->pcdata != NULL
&& is_set( ch->pcdata->pfile->flags, PLR_LOGFILE ) ) )
immortal_log( ch, command, arg );
if( command_table[cmd].reveal )
spoil_hide( ch );
if( command_table[cmd].function == NULL ) {
send( ch, "Command %s has no routine assigned to it?!\n\r",
command_table[cmd].name );
bug( "Interpret: command %s has no routine.",
command_table[cmd].name );
return;
}
gettimeofday( &start, NULL );
( *command_table[cmd].function ) ( ch, arg );
in_character = TRUE;
msg_type = MSG_STANDARD;
time = stop_clock( start );
if( command_table[cmd].max_time < time )
command_table[cmd].max_time = time;
command_table[cmd].total_time += time;
command_table[cmd].calls++;
next_page( ch->link );
}
bool check_progs( char_data* ch, char* command, char* argument )
{
// list_data* list;
// obj_data* obj;
// oprog_data* oprog;
// int i;
if( check_actions( ch, command, argument ) )
return TRUE;
/*
list = content_list( ch->contents );
for( i = 0; i < list->length; i++ ) {
obj = (obj_data*) list->pntr[i];
if( obj->valid != OBJ_DATA || obj->array != ch )
continue;
for( oprog = obj->pIndexData->oprog; oprog != NULL;
oprog = oprog->next ) {
if( is_name( command, oprog->command, TRUE ) &&
( oprog->target[0] == '\0' || ( argument[0] != '\0'
&& is_name( argument, oprog->target ) ) ) ) {
disrupt_spell( ch );
var_ch = ch;
var_room = ch->in_room;
var_arg = argument;
var_obj = obj;
if( !execute( oprog ) ) {
delete list;
return TRUE;
}
}
}
}
delete list;
for( obj = *ch->array; obj != NULL; obj = obj->next_content ) {
for( oprog = obj->pIndexData->oprog; oprog != NULL;
oprog = oprog->next ) {
if( is_name( command, oprog->command, TRUE ) &&
( oprog->target[0] == '\0' || ( argument[0] != '\0'
&& is_name( argument, oprog->target ) ) ) ) {
disrupt_spell( ch );
var_ch = ch;
var_room = ch->in_room;
var_arg = argument;
var_obj = obj;
if( !execute( oprog ) )
return TRUE;
}
}
}
*/
return FALSE;
}
/*
* DO_COMMAND ROUTINE
*/
void do_commands( char_data* ch, char* argument )
{
int i;
int j;
int trust;
int flags;
int pf;
bool found = FALSE;
if( pet_help( ch ) )
return;
if( !get_flags( ch, argument, &flags, "p", "Commands" ) )
return;;
if( is_set( &flags, 0 ) ) {
for( pf = 0; pf < MAX_PERMISSION; pf++ )
if( matches( argument, permission_name[pf+1] ) )
break;
if( pf == MAX_PERMISSION ) {
send( ch, "Unknown permission flag.\n\r" );
return;
}
if( !has_permission( ch, pf ) ) {
send( ch,
"You cannot view commands you do not have permission for.\n\r" );
return;
}
for( i = 0, j = 0; i < MAX_ENTRY_COMMAND; i++ ) {
if( is_set( command_table[i].level, pf ) ) {
if( !found ) {
page_title( ch, "Commands requiring %s Flag",
permission_name[pf] );
found = TRUE;
}
page( ch, "%15s%s", command_table[i].name,
++j%4 ? "" : "\n\r" );
}
}
if( !found )
send( ch,
"There are no commands which require the %s permission flag.\n\r",
permission_name[pf+1] );
else if( j%4 != 0 )
page( ch, "\n\r" );
return;
}
trust = get_trust( ch );
if( *argument == '\0' ) {
page_title( ch, "Command Categories" );
for( i = 0, j = 0; i < MAX_ENTRY_CMD_CAT; i++ ) {
if( trust >= cmd_cat_table[i].level ) {
page( ch, "%15s%s", cmd_cat_table[i].name,
++j%4 ? "" : "\n\r" );
}
}
page( ch, "\n\r%s", j%4 != 0 ? "\n\r" : "" );
page_centered( ch, "[ Type command <category> to see a list commands\
in that category. ]" );
return;
}
for( i = 0; i < MAX_ENTRY_CMD_CAT; i++ )
if( trust >= cmd_cat_table[i].level
&& matches( argument, cmd_cat_table[i].name ) ) {
page_title( ch, "%s Commands", cmd_cat_table[i].name );
for( j = 0; j < MAX_ENTRY_COMMAND; j++ ) {
if( command_table[j].category == i
&& has_permission( ch, command_table[j].level ) ) {
page( ch, "%15s : %s\n\r", command_table[j].name,
command_table[j].help );
}
}
return;
}
send( ch, "Unknown command category.\n\r" );
}