tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
#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" );
}