Bah, I shouldn't try and help when I'm that tired, sorry. I guess you can try something like this:bool load_race_file( char *fname )
{
char buf[MAX_STRING_LENGTH];
char *word;
char *race_name = NULL;
char *race_name_color = NULL;
bool fMatch;
struct race_type *race;
int ra = -1;
FILE *fp;
int i, wear=0;
sprintf( buf, "%s%s", RACEDIR, fname );
if ( ( fp = fopen( buf, "r" ) ) == NULL )
{
perror( buf );
return FALSE;
}
CREATE( race, struct race_type, 1 );
for(i=0;i<MAX_WHERE_NAME;i++)
race->where_name = where_name;
for ( ; ; )
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
KEY( "Align", race->alignment, fread_number( fp ) );
KEY( "AC_Plus", race->ac_plus, fread_number( fp ) );
KEY( "Affected", race->affected, fread_bitvector( fp ) );
KEY( "Attacks", race->attacks, fread_bitvector( fp ) );
break;
case 'C':
KEY( "Con_Plus", race->con_plus, fread_number( fp ) );
KEY( "Cha_Plus", race->cha_plus, fread_number( fp ) );
KEY( "Classes", race->class_restriction, fread_number( fp ) );
break;
case 'D':
KEY( "Dex_Plus", race->dex_plus, fread_number( fp ) );
KEY( "Defenses", race->defenses, fread_bitvector( fp ) );
break;
case 'E':
if ( !str_cmp( word, "End" ) )
{
fclose( fp );
if ( ra < 0 || ra >= MAX_RACE )
{
bug( "Load_race_file: Race (%s) bad/not found (%d)",
race->race_name ? race->race_name : "name not found", ra );
if( race_name )
STRFREE( race_name );
if( race_name_color )
STRFREE( race_name_color );
DISPOSE( race );
return FALSE;
}
race_table[ra] = race;
if( race_name )
STRFREE( race_name );
if( race_name_color )
STRFREE( race_name_color );
return TRUE;
}
KEY( "Exp_Mult", race->exp_multiplier, fread_number( fp ) );
break;
case 'I':
KEY( "Int_Plus", race->int_plus, fread_number( fp ) );
break;
case 'H':
KEY( "Height", race->height, fread_number( fp ) );
KEY( "Hit", race->hit, fread_number( fp ) );
KEY( "HP_Regen", race->hp_regen, fread_number( fp ) );
KEY( "Hunger_Mod", race->hunger_mod, fread_number( fp ) );
break;
case 'L':
KEY( "Language", race->language, fread_number( fp ) );
KEY( "Lck_Plus", race->lck_plus, fread_number( fp ) );
break;
case 'M':
KEY( "Mana", race->mana, fread_number( fp ) );
KEY( "Mana_Regen", race->mana_regen, fread_number( fp ) );
KEY( "Min_Align", race->minalign, fread_number( fp ) );
race->minalign = -1000;
KEY( "Max_Align", race->maxalign, fread_number( fp ) );
race->maxalign = -1000;
break;
case 'N':
KEY( "Name", race_name, fread_string( fp ) );
KEY( "Namecolor", race_name_color, fread_string( fp ) );
break;
case 'R':
KEY( "Race", ra, fread_number( fp ) );
KEY( "Race_Recall", race->race_recall, fread_number( fp ) );
KEY( "Resist", race->resist, fread_number( fp ) );
break;
case 'S':
KEY( "Str_Plus", race->str_plus, fread_number( fp ) );
KEY( "Suscept", race->suscept, fread_number( fp ) );
if ( !str_cmp( word, "Skill" ) )
{
int sn, lev, adp;
word = fread_word( fp );
lev = fread_number( fp );
adp = fread_number( fp );
sn = skill_lookup( word );
if ( ra < 0 || ra >= MAX_RACE )
{
sprintf( buf, "load_race_file: Skill %s -- race bad/not found (%d)", word, ra );
bug( buf, 0 );
}
else
if ( !IS_VALID_SN(sn) )
{
sprintf( buf, "load_race_file: Skill %s unknown", word);
bug( buf, 0 );
}
else
{
skill_table[sn]->race_level[ra] = lev;
skill_table[sn]->race_adept[ra] = adp;
}
fMatch = TRUE;
break;
}
break;
case 'T':
KEY( "Thirst_Mod", race->thirst_mod, fread_number( fp ) );
break;
case 'W':
KEY( "Weight", race->weight, fread_number( fp ) );
KEY( "Wis_Plus", race->wis_plus, fread_number( fp ) );
if ( !str_cmp( word, "WhereName" ) )
{
if ( ra < 0 || ra >= MAX_RACE )
{
char *tmp;
sprintf( buf, "load_race_file: Title -- race bad/not found (%d)", ra );
bug( buf, 0 );
tmp = fread_string_nohash( fp );
DISPOSE( tmp );
tmp = fread_string_nohash( fp );
DISPOSE( tmp );
}
else
if ( wear < MAX_WHERE_NAME )
{
race->where_name[wear] = fread_string_nohash( fp );
++wear;
}
else
bug( "load_race_file: Too many where_names" );
fMatch = TRUE;
break;
}
break;
}
if ( race_name != NULL)
sprintf(race->race_name,"%-.16s",race_name);
if ( race_name_color != NULL)
sprintf(race->race_name_color,"%-.16s",race_name_color);
if ( !fMatch )
{
sprintf( buf, "load_race_file: no match: %s", word );
bug( buf, 0 );
}
}
return FALSE;
}
|