/* Made to get the trust level of a pfile, used by do_destroy */
int get_pfile_trust( char *name )
{
   FILE *fp;
   EXT_BV flags;
   struct stat fst;
   char buf[MSL], *infoflags, flag[MIL];
   int level = 0, trust = 0, value;
   bool endfound, fMatch;

   snprintf( buf, sizeof( buf ), "%s%c/%s", PLAYER_DIR, tolower( name[0] ), capitalize( name ) );
   if( stat( buf, &fst ) == -1 )
      return -1;
   if( !( fp = fopen( buf, "r" ) ) )
   {
      bug( "%s: can't open %s for reading", __FUNCTION__, buf );
      perror( buf );
      return -1;
   }

   level = 0;
   trust = 0;
   xCLEAR_BITS( flags );
   for( ;; )
   {
      char letter;
      const char *word;

      letter = fread_letter( fp );
      if( letter == '*' )
      {
         fread_to_eol( fp );
         continue;
      }
      if( letter != '#' )
      {
         bug( "%s: # not found in %s.", __FUNCTION__, buf );
         break;
      }
      word = fread_word( fp );
      endfound = false;
      if( !strcmp( word, "PLAYER" ) )
      {
         for( ;; )
         {
            if( feof( fp ) )
            {
               endfound = true;
               break;
            }
            word = fread_word( fp );
            fMatch = false;
            switch( UPPER( word[0] ) )
            {
               default:
                  fread_to_eol( fp );
                  fMatch = true;
                  break;

               case 'F':
                  WEXTKEY( "Flags", flags, fp, pc_flags, PCFLAG_MAX );
                  break;

               case 'L':
                  KEY( "Level", level, fread_number( fp ) );
                  break;

               case 'S':
                  if( !str_cmp( word, "Sex" ) )
                  {
                     endfound = true;
                     fMatch = true;
                     break;
                  }

               case 'T':
                  KEY( "Trust", trust, fread_number( fp ) );
                  break;
            }
            if( !fMatch )
               fread_to_eol( fp );
            if( endfound )
               break;
         }
      }
      else
         break;
      if( endfound )
         break;
   }

   fclose( fp );
   fp = NULL;

   return trust;
}

CMDF( do_destroy )
{
   CHAR_DATA *victim;
   char buf[MSL], buf2[MSL], *name;

   set_char_color( AT_RED, ch );
   if( !argument || argument[0] == '\0' )
   {
      send_to_char( "Destroy what player file?\r\n", ch );
      return;
   }

   /* Set the file points. */
   name = capitalize( argument );
   if( !valid_pfile( name ) )
   {
      ch_printf( ch, "No player exists by the name %s.\r\n", name );
      return;
   }

   for( victim = first_char; victim; victim = victim->next )
      if( !is_npc( victim ) && !str_cmp( victim->name, name ) )
         break;

   if( !victim )
   {
      DESCRIPTOR_DATA *d;

      /* Make sure they aren't halfway logged in. */
      for( d = first_descriptor; d; d = d->next )
         if( ( victim = d->character ) && !is_npc( victim ) && !str_cmp( victim->name, name ) )
            break;
      if( d )
      {
         if( d->character && get_trust( d->character ) > get_trust( ch ) )
         {
            send_to_char( "You can't destroy someone that is trusted higher then you.\r\n", ch );
            return;
         }
         write_to_descriptor( d, (char *)"You have been destroyed.\r\n", 0 );
         close_socket( d, true );
      }
   }
   else
   {
      if( victim == ch )
      {
         send_to_char( "If you wish to destroy yourself use delete.\r\n", ch );
         return;
      }
      if( get_trust( victim ) > get_trust( ch ) )
      {
         send_to_char( "You can't destroy someone that is trusted higher then you.\r\n", ch );
         return;
      }
      send_to_char( "You have been destroyed.\r\n", victim );
      quitting_char = victim;
      save_char_obj( victim );
      saving_char = NULL;
      extract_char( victim, true );
   }

   if( get_pfile_trust( name ) > get_trust( ch ) )
   {
      send_to_char( "You can't destroy someone that is trusted higher then you.\r\n", ch );
      return;
   }

   snprintf( buf, sizeof( buf ), "%s%c/%s", PLAYER_DIR, tolower( name[0] ), name );
   if( !remove( buf ) )
   {
      AREA_DATA *pArea;

      set_char_color( AT_RED, ch );
      ch_printf( ch, "Player %s destroyed.\r\n", name );

      snprintf( buf, sizeof( buf ), "%s%s", LOCKER_DIR, name );
      if( !remove( buf ) )
         send_to_char( "Player's locker data destroyed.\r\n", ch );
      else if( errno != ENOENT )
      {
         ch_printf( ch, "Unknown error #%d - %s (locker data).\r\n", errno, strerror( errno ) );
         snprintf( buf2, sizeof( buf2 ), "%s destroying %s", ch->name, buf );
         perror( buf2 );
      }

      snprintf( buf, sizeof( buf ), "%s%s", GOD_DIR, name );
      if( !remove( buf ) )
         send_to_char( "Player's immortal data destroyed.\r\n", ch );
      else if( errno != ENOENT )
      {
         ch_printf( ch, "Unknown error #%d - %s (immortal data).\r\n", errno, strerror( errno ) );
         snprintf( buf2, sizeof( buf2 ), "%s destroying %s", ch->name, buf );
         perror( buf2 );
      }

      snprintf( buf2, sizeof( buf2 ), "%s.are", name );
      for( pArea = first_build; pArea; pArea = pArea->next )
      {
         if( !str_cmp( pArea->filename, buf2 ) )
         {
            snprintf( buf, sizeof( buf ), "%s", buf2 );
            if( IS_SET( pArea->status, AREA_LOADED ) )
               fold_area( pArea, buf, false );
            close_area( pArea );
            snprintf( buf2, sizeof( buf2 ), "%s.bak", buf );
            set_char_color( AT_RED, ch ); /* Log message changes colors */
            if( !rename( buf, buf2 ) )
               send_to_char( "Player's area data destroyed. Area saved as backup.\r\n", ch );
            else if( errno != ENOENT )
            {
               ch_printf( ch, "Unknown error #%d - %s (area data).\r\n", errno, strerror( errno ) );
               snprintf( buf2, sizeof( buf2 ), "%s destroying %s", ch->name, buf );
               perror( buf2 );
            }
            break;
         }
      }
   }
   else if( errno == ENOENT )
   {
      set_char_color( AT_PLAIN, ch );
      send_to_char( "Player does not exist.\r\n", ch );
   }
   else
   {
      set_char_color( AT_WHITE, ch );
      ch_printf( ch, "Unknown error #%d - %s.\r\n", errno, strerror( errno ) );
      snprintf( buf, sizeof( buf ), "%s destroying %s", ch->name, name );
      perror( buf );
   }
}
