K, Ive reached the end of my resourcefulness in solving this one so its time to ask for help. What follows is 2 scan functions for mudwide and pfile wide checks for items with 3 specific flags so that they will only exist in limited numbers. Granted, I expected some insanity as this is originally from SMAUG and any help offered is hugely appreciated.
void scan_equipment( void )
{
DIR *dp;
struct dirent *dir_entry;
char dir_name[100];
int alpha_loop;
logf( "Updating rare/unique item counts....." );
logf( "Checking player files...." );
for ( alpha_loop = 0; alpha_loop <= 25; alpha_loop++ )
{
sprintf( dir_name, "%s%c", PLAYER_DIR, 'a' + alpha_loop );
dp = opendir( dir_name );
dir_entry = readdir( dp );
while ( dir_entry )
{
if ( dir_entry->d_name[0] != '.' )
{
if (scan_players( dir_name, dir_entry->d_name ))
logf( "Found rare/unique items...." );
}
dir_entry = readdir( dp );
}
closedir( dp );
}
logf( "Checking corpses...." );
sprintf( dir_name, "%s", CORPSES_FILE );
dp = opendir( dir_name );
dir_entry = readdir( dp );
while ( dir_entry )
{
if ( dir_entry->d_name[0] != '.' )
{
if(scan_corpses( dir_name, dir_entry->d_name ))
logf( "Found rare/unique items." );
}
dir_entry = readdir( dp );
}
closedir( dp );
return;
}
bool scan_players( char *dirname, char *filename )
{
FILE *player_file;
char file_name[MSL];
bool found = FALSE;
sprintf( file_name, "%s/%s", dirname, filename );
if ( ( player_file = fopen( file_name, "r" ) ) == NULL )
{
perror( file_name );
return found;
}
for ( ; ; )
{
int vnum, counter = 1;
char letter;
char *word;
OBJ_INDEX_DATA *pObjIndex;
letter = fread_letter( player_file );
if ( letter != '#' )
continue;
word = fread_word( player_file );
if ( !str_cmp( word, "End" ) )
break;
if ( !str_cmp( word, "OBJECT" ) )
{
word = fread_word( player_file );
if ( !str_cmp( word, "Count" ) )
{
counter = fread_number( player_file );
word = fread_word( player_file );
}
if ( !str_cmp( word, "Vnum" ) )
{
vnum = fread_number( player_file );
if ( ( get_obj_index( vnum ) ) == NULL )
{
bug("Bad obj vnum in limits: %d",vnum );
}
else
{
pObjIndex = get_obj_index( vnum );
if ( IS_OBJ2_STAT(pObjIndex,OBJEXTRA2_RARE)
|| IS_OBJ2_STAT(pObjIndex,OBJEXTRA2_UNIQUE)
|| IS_OBJ2_STAT(pObjIndex,OBJEXTRA2_LIMITED))
{
pObjIndex->count += counter;
found = TRUE;
}
}
}
}
}
fclose( player_file );
player_file = NULL;
return found;