/**************************************************************************** * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// * * -----------------------------------------------------------| (0...0) * * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( * * -----------------------------------------------------------| {o o} * * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ * * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~* * Tricops and Fireblade | * * ------------------------------------------------------------------------ * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * ------------------------------------------------------------------------ * * Rare Item Code Module * * Shadroth - Lands of Shadow * ****************************************************************************/ #include <sys/types.h> #include <sys/stat.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <time.h> #include <dirent.h> #include "mud.h" #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !strcmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void scan_equipment( void ) { DIR *dp; struct dirent *dir_entry; char dir_name[100]; int alpha_loop; log_string( "Updating rare/unique item counts....." ); log_string( "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 ) ) log_string( "Found rare/unique items...." ); } dir_entry = readdir( dp ); } closedir( dp ); } log_string( "Checking corpses...." ); sprintf( dir_name, "%s", CORPSE_DIR ); 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 ) ) log_string( "Found rare/unique items." ); } dir_entry = readdir( dp ); } closedir( dp ); return; } bool scan_players( char *dirname, char *filename ) { FILE *player_file; char file_name[MAX_STRING_LENGTH]; bool found = FALSE; bool fMatch; sprintf( file_name, "%s/%s", dirname, filename ); if( ( player_file = fopen( file_name, "r" ) ) == NULL ) { perror( file_name ); return found; } for( ;; ) { int counter = 1; char letter; char *word; char *short_descr; OBJ_INDEX_DATA *pObjIndex; letter = fread_letter( player_file ); /* TODO Another Bug */ if( ( letter != '#' ) && ( !feof( player_file ) ) ) continue; /* TODO Bug found by Elisa Fix suggested by Atyreus */ /* word = fread_word( player_file ); */ word = feof( player_file ) ? "End" : fread_word( player_file ); if( !str_cmp( word, "End" ) ) break; if( !str_cmp( word, "OBJECT" ) ) { bool eoo = FALSE; // for ( ; ; ) while( eoo == FALSE ) { /* TODO Bug found by Elisa Fix suggested by Atyreus */ /* word = fread_word( player_file );*/ word = feof( player_file ) ? "End" : fread_word( player_file ); switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( player_file ); break; case 'C': KEY( "Count", counter, fread_number( player_file ) ); break; case 'E': if( !str_cmp( word, "End" ) ) { eoo = TRUE; } break; case 'S': KEY( "ShortDescr", short_descr, fread_string( player_file ) ); break; case 'V': if( !strcmp( word, "vnum" ) ) { int vnum; vnum = fread_number( player_file ); if( ( pObjIndex = get_obj_index( vnum ) ) == NULL ) { bug( "Bad vnum while reading in rare.c" ); break; } else { if( IS_OBJ_STAT( pObjIndex, ITEM_RARE ) || IS_OBJ_STAT( pObjIndex, ITEM_UNIQUE ) ) { pObjIndex->count += counter; found = TRUE; } } } break; // default: // break; } // OLD OBJECT SCANNING THIS REALLY FUCKING SUCKS --SAIYR /* if( UPPER( word[0] ) != 'E' && UPPER( word[0] ) != 'C' && UPPER( word[0] != 'V' ) ) continue; if ( !str_cmp( word, "End" ) ) break; if ( !str_cmp( word, "Count" ) ) { counter = fread_number( 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_OBJ_STAT(pObjIndex,ITEM_RARE) || IS_OBJ_STAT(pObjIndex,ITEM_UNIQUE) ) { pObjIndex->count += counter; found = TRUE; } } } */ } } } fclose( player_file ); player_file = NULL; return found; } bool scan_corpses( char *dirname, char *filename ) { FILE *corpse_file; char file_name[MAX_STRING_LENGTH]; bool found = FALSE; sprintf( file_name, "%s/%s", dirname, filename ); if( ( corpse_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( corpse_file ); /* TODO Another Bug */ if( ( letter != '#' ) && ( !feof( corpse_file ) ) ) continue; /* TODO Bug found by Elisa Fix suggested by Atyreus */ /* word = fread_word( corpse_file );*/ word = feof( corpse_file ) ? "End" : fread_word( corpse_file ); if( !str_cmp( word, "End" ) ) break; if( !str_cmp( word, "OBJECT" ) ) { for( ;; ) { /* TODO Bug found by Elisa Fix suggested by Atyreus */ /* word = fread_word( corpse_file );*/ word = feof( corpse_file ) ? "End" : fread_word( corpse_file ); if( !str_cmp( word, "End" ) ) break; if( !str_cmp( word, "Count" ) ) { counter = fread_number( corpse_file ); } if( !str_cmp( word, "Vnum" ) ) { vnum = fread_number( corpse_file ); if( ( get_obj_index( vnum ) ) == NULL ) { bug( "Bad obj vnum in limits: %d", vnum ); } else { pObjIndex = get_obj_index( vnum ); if( IS_OBJ_STAT( pObjIndex, ITEM_RARE ) || IS_OBJ_STAT( pObjIndex, ITEM_UNIQUE ) ) { pObjIndex->count += counter; found = TRUE; } } } } } } fclose( corpse_file ); corpse_file = NULL; return found; }