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 "define.h"
#include "struct.h"


trainer_data*  trainer_list;


/*
 *  SET TRAINER 
 */


void set_trainer( mob_data* mob, room_data* room )
{
  trainer_data*   trainer;
  
  for( trainer = trainer_list; trainer != NULL; trainer = trainer->next ) 
    if( trainer->room == room && trainer->mob == NULL
      && trainer->trainer == mob->species->vnum ) {
      mob->pTrainer  = trainer;
      trainer->mob   = mob;
      break;
      }

  return;
}


/*
 *   TFIND ROUTINE
 */


void do_tfind( char_data* ch, char* argument )
{
  bool               first  = TRUE;
  bool               found;
  room_data*          room;
  species_data*    species;
  trainer_data*    trainer;
  int                    i;

  if( *argument == '\0' ) { 
    send( ch, "Syntax: tfind <skill>\r\n" );
    return;
    }

  for( i = 0; i < MAX_SKILL; i++ ) {
    if( !fmatches( argument, skill_table[i].name ) )
      continue;

    if( !first ) 
      page( ch, "\r\n" );

    page( ch, "%s:\r\n", skill_table[i].name );

    found = FALSE;
    first = FALSE;

    for( trainer = trainer_list; trainer != NULL; trainer = trainer->next ) {
      species = get_species( trainer->trainer );
      room    = trainer->room; 
      if( is_set( trainer->skill, i ) ) {
        page( ch, "  [%4d] %-30s [%5d] %s\r\n", trainer->trainer,
          species == NULL ? "noone?" : species->Name( ),
          trainer->room->vnum, room == NULL ? "nowhere?" : room->name );
        found = TRUE;
        }
      }
     
    if( !found )
      page( ch, "  no trainers found\r\n" );
    }

  if( first )
    send( ch, "No skill by that name found.\r\n" );

  return;      
}


/*
 *   TRAIN ROUTINE
 */


void do_train( char_data* ch, char* argument )
{
  char                arg  [ MAX_INPUT_LENGTH ];
  char_data*       victim;
  mob_data*           npc;
  trainer_data*   trainer;
  bool              found  = FALSE;
  int                   i;

  argument = one_argument( argument, arg );

  if( *arg == '\0' ) {
    send( ch, "Syntax: train [mob] <field> <value>\r\n" );
    return;
    }

  if( ( victim = one_character( ch, arg, "train", ch->array ) ) == NULL ) 
    return;

  if( ( npc = mob( victim ) ) == NULL ) {
    send( ch, "Players can't be trainers.\r\n" );
    return;
    }

  if( npc->reset == NULL ) {
    send( ch, "Only mobs with resets can be assigned as trainers.\r\n" );
    return;
    }

  trainer = npc->pTrainer;

  if( !strcasecmp( argument, "new" ) ) {
    if( trainer != NULL ) {
      send( ch, "Victim is already a trainer.\r\n" );
      return;
      }
    if( !is_listed( ch->in_room->reset, victim->reset ) ) {
      send( ch, "The mob must reset in the room you are in.\r\n" );
      return;
      }
    trainer          = new trainer_data;
    npc->pTrainer    = trainer;
    trainer->room    = ch->in_room;
    trainer->trainer = npc->species->vnum;
    append( trainer_list, trainer );
    send( ch, "%s set as a trainer.\r\n", victim );
    return;
    }

  if( trainer == NULL ) {
    send( ch, "%s is not a trainer.", victim );
    return;
    }

  if( !strcasecmp( argument, "delete" ) ) {
    remove( trainer_list, trainer );
    delete trainer;
    npc->pTrainer = NULL;
    send( ch, "%s is no longer a trainer.\r\n", victim );  
    return;
    }          

  if( *argument == '\0' ) {
    for( i = 0; i < MAX_SKILL; i++ ) {
      if( is_set( trainer->skill, i ) ) {
        if( !found ) {
          found = TRUE;
          send( ch, "%s can train the following skills:\r\n",
            victim->Seen_Name( ch ) );
          } 
        send( ch, "  %s\r\n", skill_table[i].name );
        }
      }
    if( !found ) 
      send( ch, "%s trains no skills.\r\n", victim->Seen_Name( ch ) );
    return;
    }

  for( i = 0; i < MAX_SKILL; i++ ) {
    if( fmatches( argument, skill_table[i].name ) ) {
      switch_bit( trainer->skill, i );
      send( ch, "%s can %s train %s.\r\n",
        victim->descr->name, is_set( trainer->skill, i ) ?
        "now" : "no longer", skill_table[i].name );
      return;
      }
    }

  send( ch, "Unknown skill.\r\n" );

  return;
}    


/*
 *   DISK ROUTINES
 */


void load_trainers( void )
{
  FILE*                fp;
  trainer_data*   trainer;
  char*              word;
  char             letter;
  int                room;
  int                   i;

  printf( "Loading Trainers...\r\n" );

  if( MAX_TRAIN*32 < MAX_SKILL ) 
    panic( "Load_Trainers: Skill array insufficent." );

  fp = open_file( TRAINER_FILE, "r" );

  if( strcmp( fread_word( fp ), "#TRAINERS" ) ) 
    panic( "Load_trainers: header not found" );

  for( ; ; ) {
    if( ( room = fread_number( fp ) ) == -1 )
      break;

    trainer           = new trainer_data;
    trainer->trainer  = fread_number( fp );
    trainer->room     = get_room_index( room );

    if( trainer->room == NULL ) {
      roach( "Load_Trainers: Deleting as room %d is non-existent.", room );
      delete trainer;
      trainer = NULL;
      }
    else {
      append( trainer_list, trainer );
      }

    for( ; ; ) {
      letter = fread_letter( fp );
      ungetc( letter, fp );
      if( isdigit( letter ) || letter == '-' )
        break;
      if( strcmp( word = fread_word( fp ), "none" ) ) {
        for( i = 0; i < MAX_SKILL; i++ ) 
          if( !strcmp( word, skill_table[i].name ) ) {
            if( trainer != NULL )
              set_bit( trainer->skill, i );
            break;
	    }
        if( i == MAX_SKILL ) 
          panic( "Load_Trainers: Unknown Skill - %s", word );
        }
      }
    }

  fclose( fp );
  return;
}


void save_trainers( )
{
  trainer_data*  trainer;
  FILE*               fp;
  int                  i;

  if( ( fp = open_file( TRAINER_FILE, "w" ) ) == NULL ) 
    return;

  fprintf( fp, "#TRAINERS\n" );

  for( trainer = trainer_list; trainer != NULL; trainer = trainer->next ) {
    fprintf( fp, "%5d %5d  ", trainer->room->vnum, trainer->trainer );
    for( i = 0; i < MAX_SKILL; i++ )
      if( is_set( trainer->skill, i ) )
        fprintf( fp, " '%s'", skill_table[i].name );
    fprintf( fp, "\n" );
    }

  fprintf( fp, "-1\n\n#$\n\n" );
  fclose( fp );

  return;
}