#include "ctype.h"
#include "sys/types.h"
#include "stdio.h"
#include "stdlib.h"
#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>\n\r" );
return;
}
for( i = 0; i < MAX_SKILL; i++ ) {
if( !fmatches( argument, skill_table[i].name ) )
continue;
if( !first )
page( ch, "\n\r" );
page( ch, "%s:\n\r", 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\n\r", trainer->trainer,
species == NULL ? "noone?" : species->Name( ),
trainer->room->vnum, room == NULL ? "nowhere?" : room->name );
found = TRUE;
}
}
if( !found )
page( ch, " no trainers found\n\r" );
}
if( first )
send( ch, "No skill by that name found.\n\r" );
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>\n\r" );
return;
}
if( ( victim = one_character( ch, arg, "train", ch->array ) ) == NULL )
return;
if( ( npc = mob( victim ) ) == NULL ) {
send( ch, "Players can't be trainers.\n\r" );
return;
}
if( npc->reset == NULL ) {
send( ch, "Only mobs with resets can be assigned as trainers.\n\r" );
return;
}
trainer = npc->pTrainer;
if( !strcasecmp( argument, "new" ) ) {
if( trainer != NULL ) {
send( ch, "Victim is already a trainer.\n\r" );
return;
}
if( !is_listed( ch->in_room->reset, victim->reset ) ) {
send( ch, "The mob must reset in the room you are in.\n\r" );
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.\n\r", 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.\n\r", 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:\n\r",
victim->Seen_Name( ch ) );
}
send( ch, " %s\n\r", skill_table[i].name );
}
}
if( !found )
send( ch, "%s trains no skills.\n\r", 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.\n\r",
victim->descr->name, is_set( trainer->skill, i ) ?
"now" : "no longer", skill_table[i].name );
return;
}
}
send( ch, "Unknown skill.\n\r" );
return;
}
/*
* DISK ROUTINES
*/
void load_trainers( void )
{
FILE* fp;
trainer_data* trainer;
char* word;
char letter;
int room;
int i;
fprintf( stderr, "Loading Trainers...\n\r" );
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;
}