/
mudtem/
mudtem/area/scripts/
mudtem/bin/
mudtem/log/
mudtem/player/
mudtem/slang/autoconf/
mudtem/slang/doc/
mudtem/slang/doc/OLD/help/
mudtem/slang/doc/internal/
mudtem/slang/doc/text/
mudtem/slang/doc/tm/tools/
mudtem/slang/examples/
mudtem/slang/modules/
mudtem/slang/slsh/
mudtem/slang/slsh/lib/
mudtem/slang/slsh/scripts/
mudtem/slang/src/mkfiles/
mudtem/slang/src/util/
mudtem/src/CVS/
mudtem/src/include/
mudtem/src/include/CVS/
mudtem/src/var/CVS/
void new_load_skill( FILE *fp, struct skill_type *skill )
{
	char *word;
	bool fMatch;
	int clase;

	for ( ; ; )
	{
		word   = feof( fp ) ? "End" : fread_word( fp );
		fMatch = FALSE;

		switch ( UPPER(word[0]) )
		{
			default:
			bug( "New_load_skill: clave inexistente", 0 );
			bug( word, 0 );
			exit(1);
			break;

			case 'B':
			KEY( "Beats", skill->beats, fread_number( fp ) );
			break;

			case 'C':
			if ( !str_cmp( word, "Clase" ) )
			{
				if ( ( clase = class_lookup(fread_string(fp)) ) == -1 )
				{
					bug( "New_load_skill : clase invalida", 0 );
					exit(1);
				}
				fread_word( fp ); /* Level  */
				skill->skill_level[clase]	 = fread_number( fp );
				fread_word( fp ); /* Rating */
				skill->rating[clase]		    = fread_number( fp );
				fMatch = TRUE;
				break;
			}
			if ( !str_cmp( word, "CMsgVict" ) )
			{
				fread_string(fp);
				fMatch = TRUE;
				break;
			}
			if ( !str_cmp( word, "CMsgChar" ) )
			{
				fread_string(fp);
				fMatch = TRUE;
				break;
			}
			if ( !str_cmp( word, "CMsgRoom" ) )
			{
				fread_string(fp);
				fMatch = TRUE;
				break;
			}
			if ( !str_cmp( word, "Callback" ) )
			{
				skill->spell_callback = spcb_lookup( fread_word(fp) );

				fMatch = TRUE;
				break;
			}
			break;

			case 'E':
			if ( !str_cmp( word, "End" ) )
				return;
			break;

			case 'F':
			KEY( "Flags",	skill->flags,		fread_flag( fp ) );
			break;

			case 'G':
			KEY( "Gsn",	skill->pgsn,		gsn_lookup( fread_string( fp ) ) );
			break;

			case 'M':
			KEY( "Mana",	skill->min_mana,	fread_number( fp ) );
			break;

			case 'N':
			KEY( "Name",	skill->name,		fread_string( fp ) );
			KEY( "Nombre",	skill->nombre,		fread_string( fp ) );
			KEY( "Noun",	skill->noun_damage,	fread_string( fp ) );
			break;

			case 'O':
			KEY( "Off",	skill->msg_off,		fread_string( fp ) );
			KEY( "Obj",	skill->msg_obj,		fread_string( fp ) );
			break;

			case 'P':
			KEY( "Pos",	skill->minimum_position,position_lookup( fread_string( fp ) ) );
			break;

			case 'R':
			KEY( "Room",	skill->msg_room,	fread_string( fp ) );
			break;

			case 'S':
			KEY( "Spell",	skill->spell_fun,	spell_function( fread_string( fp ) ) );
			if ( !str_cmp( word, "Sc_dam" ) )
			{
				fread_string(fp);
				fMatch = TRUE;
				break;
			}
			if ( !str_cmp( word, "Script" ) )
			{
				fread_string(fp);
				fMatch = TRUE;
				break;
			}
			KEY( "Slot",	skill->slot,		fread_number( fp ) );
			break;

			case 'T':
			KEY( "Target",	skill->target,		flag_value( target_table, fread_string( fp ) ) );
			break;
		} /* switch */

		if ( !fMatch )
		{
			bugf( "New_load_skill : clave inexistente (%s)", word );
			exit(1);
		}
	} /* for */
}

void	new_save_skill( FILE *fp, struct skill_type *skill )
{
	int i;

	fprintf( fp, "#SKILL\n" );
	fprintf( fp, "Name   %s~\n", CHECKNULLSTR(skill->name) );
	fprintf( fp, "Nombre %s~\n", CHECKNULLSTR(skill->nombre) );

	for ( i = 0; i < MAX_CLASS; ++i )
		fprintf( fp, "Clase  %-3.3s~ Level %2d Rating %2d\n",
			CHECKNULLSTR(class_table[i].name),
			skill->skill_level[i],
			skill->rating[i] );

	fprintf( fp, "Spell  %s~\n", CHECKNULLSTR(spell_name(skill->spell_fun)) );
	fprintf( fp, "Target %s~\n", flag_string( target_table, skill->target ) );
	fprintf( fp, "Pos    %s~\n", position_table[skill->minimum_position].name );
	fprintf( fp, "Gsn    %s~\n", CHECKNULLSTR(gsn_name(skill->pgsn)) );
	fprintf( fp, "Slot   %d\n",  skill->slot );
	fprintf( fp, "Mana   %d\n",  skill->min_mana );
	fprintf( fp, "Beats  %d\n",  skill->beats );
	fprintf( fp, "Noun   %s~\n", CHECKNULLSTR(skill->noun_damage) );
	fprintf( fp, "Off    %s~\n", CHECKNULLSTR(skill->msg_off) );
	fprintf( fp, "Obj    %s~\n", CHECKNULLSTR(skill->msg_obj) );
	fprintf( fp, "Room   %s~\n", CHECKNULLSTR(skill->msg_room) );
	fprintf( fp, "Callback '%s'\n", spcb_name_lookup(skill->spell_callback) );
	fprintf( fp, "Flags  %s\n",  print_flags(skill->flags) );
	fprintf( fp, "End\n\n" );
}

void save_skills( void )
{
	FILE *fpn;
	int i;

	fpn = fopen( SKILL_FILE, "w" );

	if ( !fpn )
	{
		bug( "Save_skills : NULL fpn", 0 );
		fclose( fpn );
		return;
	}

	fprintf( fpn, "%d\n", MAX_SKILL );

	for ( i = 0; i < MAX_SKILL; ++i )
		new_save_skill( fpn, &skill_table[i] );

	fprintf( fpn, "#END\n" );
	fclose( fpn );
}

void	load_skills( void )
{
	FILE *fp;
static	struct skill_type skzero;
	int i = 0;
	char *word;

	fp = fopen( SKILL_FILE, "r" );

	if ( !fp )
	{
		bug( "No se pudo leer " SKILL_FILE " para cargar skills.", 0 );
		exit(1);
	}

	fscanf( fp, "%d\n", &MAX_SKILL );

	skill_table = malloc( sizeof(struct skill_type) * (MAX_SKILL + 1) );

	if ( !skill_table )
	{
		bug( "Error! Skill_table == NULL, MAX_SKILL : %d", MAX_SKILL );
		exit(1);
	}

	for ( ; ; )
	{
		word = fread_word( fp );
		if ( !str_cmp( word, "#END" ) )
			break;
		if ( str_cmp( word, "#SKILL" ) )
		{
			bug( "Load_skills : clave inexistente", 0 );
			bug( word, 0 );
			exit(1);
		}
		if ( i >= MAX_SKILL )
		{
			bug( "Load_skills : numero de skills mayor que MAX_SKILL", 0 );
			exit(1);
		}
		skill_table[i] = skzero;
		new_load_skill( fp, &skill_table[i++] );
	}

	skill_table[MAX_SKILL].name = NULL;

	fclose(fp);
}