Пример #1
0
/* 
 * This function reads one immortal host to a file.
 * Shaddai  July 27, 1997
 */
int fread_imm_host( FILE * fp, IMMORTAL_HOST * data )
{
   const char *word;
   bool fMatch;
   int temp;

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

      switch ( UPPER( word[0] ) )
      {
         case 'E':
            if( !str_cmp( word, "End" ) )
               return rNONE;

         case 'H':
            KEY( "Host", data->host, fread_string_nohash( fp ) );
            break;

         case 'N':
            KEY( "Name", data->name, fread_string_nohash( fp ) );
            break;

         case 'P':
            if( !str_cmp( word, "Prefix" ) )
            {
               temp = fread_number( fp );
               if( temp )
                  data->prefix = TRUE;
               else
                  data->prefix = FALSE;
               fMatch = TRUE;
            }
            break;

         case 'S':
            if( !str_cmp( word, "Suffix" ) )
            {
               temp = fread_number( fp );
               if( temp )
                  data->suffix = TRUE;
               else
                  data->suffix = FALSE;
               fMatch = TRUE;
            }
            break;
      }
      if( !fMatch )
      {
         bug( "%s: no match: %s", __func__, word );
         fread_to_eol( fp );
      }
   }
}
Пример #2
0
int
fread_imm_host ( FILE *fp , IMMORTAL_HOST *data )
{
  char buf[MAX_STRING_LENGTH];
  char *word;
  bool fMatch;
  int temp;

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

    switch ( UPPER ( word[0] ) )
    {
        case 'E':
	  if ( !str_cmp( word, "End" ) )
		return rNONE;
	case 'H': 
	  KEY ("Host", data->host, fread_string_nohash (fp) );
	  break;
	case 'N':
	  KEY ("Name", data->name, fread_string_nohash ( fp ) );
	  break;
	case 'P':
	  if ( !str_cmp( word, "Prefix" ) ) 
	  {
		temp = fread_number ( fp );
		if ( temp )
			data->prefix = TRUE;
		else
			data->prefix = FALSE;
		fMatch = TRUE;
	  }	
	  break;
	case 'S':
	  if ( !str_cmp( word, "Suffix" ) ) 
	  {
		temp = fread_number ( fp );
		if ( temp )
			data->suffix = TRUE;
		else
			data->suffix = FALSE;
		fMatch = TRUE;
	  }	
	  break;
     }
     if (!fMatch)
     {
	sprintf (buf, "Fread_immortal_host: no match: %s", word );
	bug ( buf, 0 );
     }
  }
  return rNONE;
}
Пример #3
0
/* Read in an individual holiday */
void fread_day( HOLIDAY_DATA * day, FILE * fp )
{
   const char *word;
   bool fMatch;

   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( "Announce", day->announce, fread_string_nohash( fp ) );
            break;

         case 'D':
            KEY( "Day", day->day, fread_number( fp ) );
            break;

         case 'E':
            if( !str_cmp( word, "End" ) )
            {
               if( !day->announce )
                  day->announce = str_dup( "Today is a holiday, but who the hell knows which one." );
               return;
            }
            break;

         case 'M':
            KEY( "Month", day->month, fread_number( fp ) );
            break;

         case 'N':
            KEY( "Name", day->name, fread_string_nohash( fp ) );
            break;
      }

      if( !fMatch )
         bug( "fread_day: no match: %s", word );
   }
}
Пример #4
0
SHIP_DATA *load_ship( FILE * fp )
{
   SHIP_DATA *ship = NULL;
   const char *word;
   bool fMatch;

   word = feof( fp ) ? "EndShip" : fread_word( fp );
   if( !str_cmp( word, "EndShip" ) )
      return NULL;

   if( !str_cmp( word, "SHIPFNAME" ) )
   {
     const char *name = fread_string_nohash( fp ); /* is this right? - Gavin */
      SHIP_DATA *temp_ship = NULL;

      for( temp_ship = first_ship; temp_ship; temp_ship = temp_ship->next )
      {
         if( !str_cmp( name, temp_ship->filename ) )
         {
            ship = temp_ship;
            break;
         }
      }

      if( ship == NULL )
      {
         bug( "%s: No ship data for filename %s", __FUNCTION__, name );
         DISPOSE( name );
         return NULL;

         for( ;; )
         {
            word = feof( fp ) ? "EndShip" : fread_word( fp );
            if( !str_cmp( word, "EndShip" ) )
               break;
         }
      }
      DISPOSE( name );
   }
   else
   {
      for( ;; )
      {
         word = feof( fp ) ? "EndShip" : fread_word( fp );
         if( !str_cmp( word, "EndShip" ) )
            break;
      }
      bug( "%s: shipfname not found", __FUNCTION__ );
      return NULL;
   }

   for( ;; )
   {
      word = feof( fp ) ? "EndShip" : fread_word( fp );
      fMatch = FALSE;
      switch ( UPPER( word[0] ) )
      {
         case '*':
            fMatch = TRUE;
            fread_to_eol( fp );
            break;

            /*
             * case '#':
             * if ( !str_cmp( word, "#TORPEDO" ) )
             * {
             * mob->tempnum = -9999; 
             * fread_obj( mob, fp, OS_CARRY );
             * }
             * break;
             */

         case 'A':
            KEY( "Autorecharge", ship->autorecharge, ( bool ) fread_number( fp ) );
            KEY( "Autotrack", ship->autotrack, ( bool ) fread_number( fp ) );
            KEY( "Autospeed", ship->autospeed, ( bool ) fread_number( fp ) );
            KEY( "Autopilot", ship->autopilot, ( bool ) fread_number( fp ) );
            break;

         case 'C':
            KEY( "Currspeed", ship->currspeed, fread_number( fp ) );
            if( !str_cmp( word, "Currjump" ) )
            {
	      const char *temp = fread_string_nohash( fp );

               extract_ship( ship );
               ship->location = 0;
               ship->currjump = starsystem_from_name( temp );
               DISPOSE( temp );
               fMatch = TRUE;
               break;
            }
            KEY( "Chaff", ship->chaff, fread_number( fp ) );
            break;

         case 'E':
            KEY( "Energy", ship->energy, fread_number( fp ) );
            if( !str_cmp( word, "EndShip" ) )
            {
               return ship;
            }
            if( !str_cmp( word, "End" ) ) /* End of object, need to ignore this. sometimes they creep in there somehow -- Scion */
               fMatch = TRUE; /* Trick the system into thinking it matched something */
            break;

         case 'H':
            KEY( "Hull", ship->hull, fread_number( fp ) );
            KEY( "HX", ship->hx, ( float )fread_number( fp ) );
            KEY( "HY", ship->hy, ( float )fread_number( fp ) );
            KEY( "HZ", ship->hz, ( float )fread_number( fp ) );
            KEY( "Hyperdistance", ship->hyperdistance, fread_number( fp ) );
            break;

         case 'J':
            KEY( "JX", ship->jx, ( float )fread_number( fp ) );
            KEY( "JY", ship->jy, ( float )fread_number( fp ) );
            KEY( "JZ", ship->jz, ( float )fread_number( fp ) );
            break;

         case 'L':
            if( !str_cmp( word, "Landdest" ) )
            {
               STRFREE( ship->dest );
               ship->dest = fread_string( fp );
               fMatch = TRUE;
               break;
            }
            break;

         case 'M':
            KEY( "Missiles", ship->missiles, fread_number( fp ) );
            break;

         case 'R':
            KEY( "Rockets", ship->rockets, fread_number( fp ) );
            break;

         case 'S':
            KEY( "Shield", ship->shield, fread_number( fp ) );
            KEY( "Shipstate", ship->shipstate, fread_number( fp ) );

            if( !str_cmp( word, "Starsystem" ) )
            {
	      const char *star_name = fread_string_nohash( fp );
               SPACE_DATA *starsystem = starsystem_from_name( star_name );
               DISPOSE( star_name );
               fMatch = TRUE;

               extract_ship( ship );
               ship->location = 0;
               if( ship->starsystem )
                  ship_from_starsystem( ship, starsystem );
               ship_to_starsystem( ship, starsystem );
               break;
            }
            break;

         case 'T':
            KEY( "Torpedos", ship->torpedos, fread_number( fp ) );
            if( !str_cmp( word, "target0" ) )
            {
	      const char *temp = fread_string( fp );
               SHIP_DATA *target = get_ship( temp );

               ship->target0 = target;
               STRFREE( temp );
               fMatch = TRUE;
               break;
            }

            if( !str_cmp( word, "target1" ) )
            {
	      const char *temp = fread_string( fp );
               SHIP_DATA *target = get_ship( temp );

               ship->target1 = target;
               STRFREE( temp );
               fMatch = TRUE;
               break;
            }

            if( !str_cmp( word, "target2" ) )
            {
	      const char *temp = fread_string( fp );
               SHIP_DATA *target = get_ship( temp );

               ship->target2 = target;
               STRFREE( temp );
               fMatch = TRUE;
               break;
            }
            break;

         case 'V':
            KEY( "VX", ship->vx, ( float )fread_number( fp ) );
            KEY( "VY", ship->vy, ( float )fread_number( fp ) );
            KEY( "VZ", ship->vz, ( float )fread_number( fp ) );
            break;

      }
      if( !fMatch && str_cmp( word, "End" ) )
         bug( "%s: no match: %s", __FUNCTION__, word );
   }
   return NULL;
}
Пример #5
0
void fread_mssp_info( FILE * fp )
{
    const char             *word;
    bool                    fMatch;

    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( "AdultMaterial", mssp_info->adultMaterial, fread_number( fp ) );
                KEY( "Ansi", mssp_info->ansi, fread_number( fp ) );
                break;

            case 'C':
                KEY( "Contact", mssp_info->contact, fread_string_nohash( fp ) );
                KEY( "Created", mssp_info->created, fread_number( fp ) );
                break;

            case 'E':
                KEY( "EquipmentSystem", mssp_info->equipmentSystem, fread_string_nohash( fp ) );
                if ( !str_cmp( word, "End" ) )
                    return;
                break;

            case 'F':
                KEY( "Family", mssp_info->family, fread_string_nohash( fp ) );
                break;

            case 'G':
                KEY( "Genre", mssp_info->genre, fread_string_nohash( fp ) );
                KEY( "GamePlay", mssp_info->gamePlay, fread_string_nohash( fp ) );
                KEY( "GameSystem", mssp_info->gameSystem, fread_string_nohash( fp ) );
                break;

            case 'H':
                KEY( "Hostname", mssp_info->hostname, fread_string_nohash( fp ) );
                KEY( "HiringBuilders", mssp_info->hiringBuilders, fread_number( fp ) );
                KEY( "HiringCoders", mssp_info->hiringCoders, fread_number( fp ) );
                break;

            case 'I':
                KEY( "Icon", mssp_info->icon, fread_string_nohash( fp ) );
                KEY( "Intermud", mssp_info->intermud, fread_string_nohash( fp ) );
                break;

            case 'L':
                KEY( "Language", mssp_info->language, fread_string_nohash( fp ) );
                KEY( "Location", mssp_info->location, fread_string_nohash( fp ) );
                break;

            case 'M':
                KEY( "MCCP", mssp_info->mccp, fread_number( fp ) );
                KEY( "MCP", mssp_info->mcp, fread_number( fp ) );
                KEY( "MinAge", mssp_info->minAge, fread_number( fp ) );
                KEY( "MSP", mssp_info->msp, fread_number( fp ) );
                KEY( "Multiclassing", mssp_info->multiclassing, fread_number( fp ) );
                KEY( "Multiplaying", mssp_info->multiplaying, fread_string_nohash( fp ) );
                KEY( "MXP", mssp_info->mxp, fread_number( fp ) );
                break;

            case 'N':
                KEY( "NewbieFriendly", mssp_info->newbieFriendly, fread_number( fp ) );
                break;

            case 'P':
                KEY( "Pay2Play", mssp_info->pay2play, fread_number( fp ) );
                KEY( "Pay4Perks", mssp_info->pay4perks, fread_number( fp ) );
                KEY( "PlayerCities", mssp_info->playerCities, fread_number( fp ) );
                KEY( "PlayerClans", mssp_info->playerClans, fread_number( fp ) );
                KEY( "PlayerCrafting", mssp_info->playerCrafting, fread_number( fp ) );
                KEY( "PlayerGuilds", mssp_info->playerGuilds, fread_number( fp ) );
                KEY( "PlayerKilling", mssp_info->playerKilling, fread_string_nohash( fp ) );
                KEY( "Pueblo", mssp_info->pueblo, fread_number( fp ) );
                break;

            case 'Q':
                KEY( "QuestSystem", mssp_info->questSystem, fread_string_nohash( fp ) );
                break;

            case 'R':
                KEY( "RolePlaying", mssp_info->roleplaying, fread_string_nohash( fp ) );
                break;

            case 'S':
                KEY( "SSL", mssp_info->ssl, fread_number( fp ) );
                KEY( "Status", mssp_info->status, fread_string_nohash( fp ) );
                KEY( "SubGenre", mssp_info->subgenre, fread_string_nohash( fp ) );
                break;

            case 'T':
                KEY( "TrainingSystem", mssp_info->trainingSystem, fread_string_nohash( fp ) );
                break;

            case 'V':
                KEY( "Vt100", mssp_info->vt100, fread_number( fp ) );
                break;

            case 'W':
                KEY( "Website", mssp_info->website, fread_string_nohash( fp ) );
                KEY( "WorldOriginality", mssp_info->worldOriginality, fread_string_nohash( fp ) );
                KEY( "Worlds", mssp_info->worlds, fread_number( fp ) );
                break;

            case 'X':
                KEY( "Xterm256", mssp_info->xterm256, fread_number( fp ) );
                break;
        }
        if ( !fMatch )
            bug( "%s: no match: %s", __FUNCTION__, word );
    }
}
Пример #6
0
void fread_command( FILE * fp )
{
   char buf[MAX_STRING_LENGTH];
   const char *word;
   bool fMatch;
   CMDTYPE *command;

   CREATE( command, CMDTYPE, 1 );

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

      switch ( UPPER( word[0] ) )
      {
         case '*':
            fMatch = TRUE;
            fread_to_eol( fp );
            break;

	case 'C':
	    KEY( "Code",	command->fun_name, str_dup( fread_word( fp ) ) );
	    break;

	case 'E':
	    if ( !str_cmp( word, "End" ) )
	    {
		if( !command->name )
		{
		   bug( "%s", "Fread_command: Name not found" );
		   free_command( command );
		   return;
		}
		if( !command->fun_name )
		{
		   bug( "fread_command: No function name supplied for %s", command->name );
		   free_command( command );
		   return;
		}
		/*
	 	 * Mods by Trax
		 * Fread in code into char* and try linkage here then
		 * deal in the "usual" way I suppose..
		 */
	      command->do_fun = skill_function( command->fun_name );
		if( command->do_fun == skill_notfound )
		{
		   bug( "Fread_command: Function %s not found for %s", command->fun_name, command->name );
		   free_command( command );
		   return;
		}
		add_command( command );
		return;
	    }
	    break;

         case 'L':
            KEY( "Level", command->level, fread_number( fp ) );
            KEY( "Log", command->log, fread_number( fp ) );
            break;

         case 'N':
            KEY( "Name", command->name, fread_string_nohash( fp ) );
            break;

         case 'P':
            KEY( "Position", command->position, fread_number( fp ) );
            break;
      }

      if( !fMatch )
      {
         sprintf( buf, "Fread_command: no match: %s", word );
         bug( buf, 0 );
      }
   }
}
Пример #7
0
void fread_social( FILE * fp )
{
   char buf[MAX_STRING_LENGTH];
   const char *word;
   bool fMatch;
   SOCIALTYPE *social;

   CREATE( social, SOCIALTYPE, 1 );

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

      switch ( UPPER( word[0] ) )
      {
         case '*':
            fMatch = TRUE;
            fread_to_eol( fp );
            break;

         case 'C':
            KEY( "CharNoArg", social->char_no_arg, fread_string_nohash( fp ) );
            KEY( "CharFound", social->char_found, fread_string_nohash( fp ) );
            KEY( "CharAuto", social->char_auto, fread_string_nohash( fp ) );
            break;

         case 'E':
            if( !str_cmp( word, "End" ) )
            {
               if( !social->name )
               {
                  bug( "Fread_social: Name not found", 0 );
                  free_social( social );
                  return;
               }
               if( !social->char_no_arg )
               {
                  bug( "Fread_social: CharNoArg not found", 0 );
                  free_social( social );
                  return;
               }
               add_social( social );
               return;
            }
            break;

         case 'N':
            KEY( "Name", social->name, fread_string_nohash( fp ) );
            break;

         case 'O':
            KEY( "OthersNoArg", social->others_no_arg, fread_string_nohash( fp ) );
            KEY( "OthersFound", social->others_found, fread_string_nohash( fp ) );
            KEY( "OthersAuto", social->others_auto, fread_string_nohash( fp ) );
            break;

         case 'V':
            KEY( "VictFound", social->vict_found, fread_string_nohash( fp ) );
            break;
      }

      if( !fMatch )
      {
         sprintf( buf, "Fread_social: no match: %s", word );
         bug( buf, 0 );
      }
   }
}
Пример #8
0
void fread_fuss_room( FILE * fp, area_data * tarea )
{
   room_index *pRoomIndex = NULL;
   bool oldroom = false;

   for( ;; )
   {
      const char *word = ( feof( fp ) ? "#ENDROOM" : fread_word( fp ) );

      if( word[0] == '\0' )
      {
         log_printf( "%s: EOF encountered reading file!", __func__ );
         word = "#ENDROOM";
      }

      switch ( word[0] )
      {
         default:
            bug( "%s: no match: %s", __func__, word );
            fread_to_eol( fp );
            break;

         case '#':
            if( !str_cmp( word, "#ENDROOM" ) )
            {
               if( !oldroom )
               {
                  room_index_table.insert( map < int, room_index * >::value_type( pRoomIndex->vnum, pRoomIndex ) );
                  tarea->rooms.push_back( pRoomIndex );
                  ++top_room;
               }
               return;
            }

            // Format of this section is identical to AFKMud. Let's cheat :)
            if( !str_cmp( word, "#EXIT" ) )
            {
               fread_afk_exit( fp, pRoomIndex );
               break;
            }

            // Format of this section is identical to AFKMud. Let's cheat :)
            if( !str_cmp( word, "#EXDESC" ) )
            {
               extra_descr_data *ed = fread_afk_exdesc( fp );
               if( ed )
                  pRoomIndex->extradesc.push_back( ed );
               break;
            }

            // Format of this section is identical to AFKMud. Let's cheat :)
            if( !str_cmp( word, "#MUDPROG" ) )
            {
               mud_prog_data *mprg = new mud_prog_data;
               fread_afk_mudprog( fp, mprg, pRoomIndex );
               pRoomIndex->mudprogs.push_back( mprg );
               ++top_prog;
               break;
            }
            break;

         case 'A':
            if( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
            {
               affect_data *af = fread_fuss_affect( fp, word );

               if( af )
                  pRoomIndex->permaffects.push_back( af );
               break;
            }
            break;

         case 'D':
            KEY( "Desc", pRoomIndex->roomdesc, fread_string_nohash( fp ) );
            break;

         case 'F':
            if( !str_cmp( word, "Flags" ) )
            {
               flag_set( fp, pRoomIndex->flags, fuss_r_flags );
               break;
            }
            break;

         case 'N':
            KEY( "Name", pRoomIndex->name, fread_string( fp ) );
            break;

         // Format of this section is identical to AFKMud. Let's cheat :)
         case 'R':
            CLKEY( "Reset", pRoomIndex->load_reset( fp, false ) );
            break;

         case 'S':
            if( !str_cmp( word, "Sector" ) )
            {
               const char *sec_type = fread_flagstring( fp );
               int sector = get_fuss_sectypes( sec_type );

               if( sector < 0 || sector >= SECT_MAX )
               {
                  bug( "%s: Room #%d has bad sector type: %s", __func__, pRoomIndex->vnum, sec_type );
                  sector = 1;
               }

               pRoomIndex->sector_type = sector;
               pRoomIndex->winter_sector = -1;
               break;
            }

            if( !str_cmp( word, "Stats" ) )
            {
               const char *ln = fread_line( fp );
               int x1, x2, x3, x4;

               x1 = x2 = x3 = x4 = 0;
               sscanf( ln, "%d %d %d %d", &x1, &x2, &x3, &x4 );

               pRoomIndex->tele_delay = x1;
               pRoomIndex->tele_vnum = x2;
               pRoomIndex->tunnel = x3;
               pRoomIndex->max_weight = x4;

               break;
            }
            break;

         case 'V':
            if( !str_cmp( word, "Vnum" ) )
            {
               bool tmpBootDb = fBootDb;
               fBootDb = false;

               int vnum = fread_number( fp );

               list < area_data * >::iterator iarea;
               for( iarea = arealist.begin(  ); iarea != arealist.end(  ); ++iarea )
               {
                  area_data *area = *iarea;

                  if( !str_cmp( area->filename, tarea->filename ) )
                     continue;

                  bool area_conflict = check_area_conflict( area, vnum, vnum );

                  if( area_conflict )
                  {
                     log_printf( "ERROR: %s has vnum conflict with %s!", tarea->filename, ( area->filename ? area->filename : "(invalid)" ) );
                     log_printf( "%s occupies vnums   : %-6d - %-6d", ( area->filename ? area->filename : "(invalid)" ), area->low_vnum, area->hi_vnum );
                     log_printf( "%s wants to use vnum: %-6d", tarea->filename, vnum );
                     log_string( "This is a fatal error. Program terminated." );
                     exit( 1 );
                  }
               }

               if( get_room_index( vnum ) )
               {
                  if( tmpBootDb )
                  {
                     fBootDb = tmpBootDb;
                     bug( "%s: vnum %d duplicated.", __func__, vnum );

                     // Try to recover, read to end of duplicated room and then bail out
                     for( ;; )
                     {
                        word = feof( fp ) ? "#ENDROOM" : fread_word( fp );

                        if( !str_cmp( word, "#ENDROOM" ) )
                           return;
                     }
                  }
                  else
                  {
                     pRoomIndex = get_room_index( vnum );
                     log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning room: %d", vnum );
                     pRoomIndex->clean_room(  );
                     oldroom = true;
                  }
               }
               else
               {
                  pRoomIndex = new room_index;
                  pRoomIndex->clean_room(  );
               }
               pRoomIndex->vnum = vnum;
               pRoomIndex->area = tarea;
               fBootDb = tmpBootDb;

               if( fBootDb )
               {
                  if( !tarea->low_vnum )
                     tarea->low_vnum = vnum;
                  if( vnum > tarea->hi_vnum )
                     tarea->hi_vnum = vnum;
               }

               if( !pRoomIndex->resets.empty(  ) )
               {
                  if( fBootDb )
                  {
                     int count = 0;
                     list < reset_data * >::iterator rst;

                     bug( "%s: WARNING: resets already exist for this room.", __func__ );
                     for( rst = pRoomIndex->resets.begin(  ); rst != pRoomIndex->resets.end(  ); ++rst )
                     {
                        reset_data *rtmp = *rst;

                        ++count;
                        if( !rtmp->resets.empty(  ) )
                           count += rtmp->resets.size(  );
                     }
                  }
                  else
                  {
                     /*
                      * Clean out the old resets
                      */
                     log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning resets: %s", tarea->name );
                     pRoomIndex->clean_resets(  );
                  }
               }
               break;
            }
            break;
      }
   }
}
Пример #9
0
void fread_fuss_areadata( FILE * fp, area_data * tarea )
{
   for( ;; )
   {
      const char *word = ( feof( fp ) ? "#ENDAREADATA" : fread_word( fp ) );

      if( word[0] == '\0' )
      {
         log_printf( "%s: EOF encountered reading file!", __func__ );
         word = "#ENDAREADATA";
      }

      switch ( word[0] )
      {
         default:
            log_printf( "%s: no match: %s", __func__, word );
            fread_to_eol( fp );
            break;

         case '#':
            if( !str_cmp( word, "#ENDAREADATA" ) )
            {
               tarea->age = tarea->reset_frequency;
               return;
            }
            break;

         case 'A':
            KEY( "Author", tarea->author, fread_string( fp ) );
            break;

         case 'C':
            KEY( "Credits", tarea->credits, fread_string( fp ) );
            break;

         case 'E':
            // Economy field is unused by AFKMud - skip it.
            if( !str_cmp( word, "Economy" ) )
            {
               fread_number( fp );
               fread_number( fp );
               break;
            }
            break;

         case 'F':
            if( !str_cmp( word, "Flags" ) )
            {
               flag_set( fp, tarea->flags, area_flags );
               break;
            }
            break;

         case 'N':
            KEY( "Name", tarea->name, fread_string_nohash( fp ) );
            break;

         case 'R':
            if( !str_cmp( word, "Ranges" ) )
            {
               int x1, x2, x3, x4;
               const char *ln = fread_line( fp );

               x1 = x2 = x3 = x4 = 0;
               sscanf( ln, "%d %d %d %d", &x1, &x2, &x3, &x4 );

               tarea->low_soft_range = x1;
               tarea->hi_soft_range = x2;
               tarea->low_hard_range = x3;
               tarea->hi_hard_range = x4;

               break;
            }
            KEY( "ResetMsg", tarea->resetmsg, fread_string_nohash( fp ) );
            KEY( "ResetFreq", tarea->reset_frequency, fread_short( fp ) );
            break;

         case 'S':
            // Spelllimit field is unused by AFKMud - skip it.
            if( !str_cmp( word, "Spelllimit" ) )
            {
               fread_number( fp );
               break;
            }
            break;

         case 'V':
            KEY( "Version", tarea->version, fread_number( fp ) );
            break;

         // FIXME: Uncomment this when we've converted Kayle's weather code.
         //case 'W':
         //   KEY( "WeatherX", tarea->weatherx, fread_number( fp ) );
         //   KEY( "WeatherY", tarea->weathery, fread_number( fp ) );
         //   break;
      }
   }
}
Пример #10
0
NOTE_DATA *read_note( char *notefile, FILE * fp )
{
  NOTE_DATA *pnote = NULL;

  for( ;; )
  {
    const char *word = NULL;
    char letter = 0;

    do
    {
      letter = fgetc( fp );
      if( feof( fp ) )
      {
	fclose( fp );
	return NULL;
      }
    }
    while( isspace( ( int ) letter ) )
      ;

    ungetc( letter, fp );

    CREATE( pnote, NOTE_DATA, 1 );

    if( str_cmp( fread_word( fp ), "sender" ) )
      break;
    pnote->sender = fread_string( fp );

    if( str_cmp( fread_word( fp ), "date" ) )
      break;
    pnote->date = fread_string( fp );

    if( str_cmp( fread_word( fp ), "to" ) )
      break;
    pnote->to_list = fread_string( fp );

    if( str_cmp( fread_word( fp ), "subject" ) )
      break;
    pnote->subject = fread_string( fp );

    word = fread_word( fp );
    if( !str_cmp( word, "voting" ) )
    {
      pnote->voting = fread_number( fp );

      if( str_cmp( fread_word( fp ), "yesvotes" ) )
	break;
      pnote->yesvotes = fread_string_nohash( fp );

      if( str_cmp( fread_word( fp ), "novotes" ) )
	break;
      pnote->novotes = fread_string_nohash( fp );

      if( str_cmp( fread_word( fp ), "abstentions" ) )
	break;
      pnote->abstentions = fread_string_nohash( fp );

      word = fread_word( fp );
    }

    if( str_cmp( word, "text" ) )
      break;
    pnote->text = fread_string( fp );

    if( !pnote->yesvotes )
      pnote->yesvotes = str_dup( "" );
    if( !pnote->novotes )
      pnote->novotes = str_dup( "" );
    if( !pnote->abstentions )
      pnote->abstentions = str_dup( "" );
    pnote->next = NULL;
    pnote->prev = NULL;
    return pnote;
  }

  bug( "read_note: bad key word.", 0 );
  exit( 1 );
}
Пример #11
0
BOARD_DATA *read_board( const char *boardfile, FILE * fp )
{
  BOARD_DATA *board = NULL;
  char buf[MAX_STRING_LENGTH];
  bool fMatch = FALSE;
  char letter = 0;

  do
  {
    letter = fgetc( fp );
    if( feof( fp ) )
    {
      fclose( fp );
      return NULL;
    }
  } while( isspace( ( int ) letter ) );


  ungetc( letter, fp );

  CREATE( board, BOARD_DATA, 1 );

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

    switch ( UPPER( word[0] ) )
    {
      case '*':
	fMatch = TRUE;
	fread_to_eol( fp );
	break;
      case 'E':
	KEY( "Extra_readers", board->extra_readers,
	    fread_string_nohash( fp ) );
	KEY( "Extra_removers", board->extra_removers,
	    fread_string_nohash( fp ) );
	if( !str_cmp( word, "End" ) )
	{
	  board->num_posts = 0;
	  board->first_note = NULL;
	  board->last_note = NULL;
	  board->next = NULL;
	  board->prev = NULL;
	  if( !board->read_group )
	    board->read_group = str_dup( "" );
	  if( !board->post_group )
	    board->post_group = str_dup( "" );
	  if( !board->extra_readers )
	    board->extra_readers = str_dup( "" );
	  if( !board->extra_removers )
	    board->extra_removers = str_dup( "" );
	  return board;
	}
      case 'F':
	KEY( "Filename", board->note_file, fread_string_nohash( fp ) );
      case 'M':
	KEY( "Min_read_level", board->min_read_level, fread_number( fp ) );
	KEY( "Min_post_level", board->min_post_level, fread_number( fp ) );
	KEY( "Min_remove_level", board->min_remove_level,
	    fread_number( fp ) );
	KEY( "Max_posts", board->max_posts, fread_number( fp ) );
      case 'P':
	KEY( "Post_group", board->post_group, fread_string_nohash( fp ) );
      case 'R':
	KEY( "Read_group", board->read_group, fread_string_nohash( fp ) );
      case 'T':
	KEY( "Type", board->type, fread_number( fp ) );
      case 'V':
	KEY( "Vnum", board->board_obj, fread_number( fp ) );
    }
    if( !fMatch )
    {
      sprintf( buf, "read_board: no match: %s", word );
      bug( buf, 0 );
    }
  }

  return board;
}
Пример #12
0
void fread_finger( CHAR_DATA *ch, FILE *fp, char *laston )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    char *email = NULL;
    char *homepage = NULL;
    char *name = NULL;
    char *site = NULL;
    char *title = NULL;
    int  race = 0, sex = 0;
    int level = 0;
    bool fMatch;

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

	switch ( UPPER(word[0]) )
	{
	case '*':
	    fMatch = TRUE;
	    fread_to_eol( fp );
	    break;

      case 'E':
	    if ( !strcmp( word, "End" ) )
	        goto finger_display;
	    KEY( "Email",	    email,		fread_string_nohash( fp ) );
	    break;

   	case 'H':
	    KEY( "Homepage",	homepage,	fread_string_nohash( fp ) );
	    break;
	case 'L':
	    KEY( "Level",	level,		fread_number( fp ) );
	    break;
	case 'N':
	    KEY ("Name", 		name, 	fread_string( fp ) );
	    break;

	case 'R':
	    KEY( "Race",        race,		fread_number( fp ) );
	    break;

	case 'S':
	    KEY( "Sex",		sex,		fread_number( fp ) );
	    KEY( "Site",		site,		fread_string( fp ) );
	    break;

	case 'T':
	    KEY( "Title",		title,	fread_string( fp ) );
	    break;
	}

	if ( !fMatch )
	{
	    sprintf( buf, "finger.c: fread_finger: no match: %s", word );
	    bug( buf, 0 );
	}
    }

/* Extremely ugly and disgusting goto hack, if there's a better way to
   do this, I'd sure like to know - Samson */

finger_display:
/*
    if ( top_level >= LEVEL_IMMORTAL && !IS_IMMORTAL(ch) )
    {
	send_to_char( "Cannot finger an immortal.\n\r", ch );
	return;
    }

    if ( ( ch->top_level < top_level && ch->top_level < LEVEL_INFINITE ) 
&& IS_IMMORTAL(ch) )
    {
	send_to_char( "Cannot finger an immortal above your own level.\n\r", ch );
	return;
    }
*/

    if( level > 100 && !IS_IMMORTAL(ch) )
    {
	send_to_char("You can not finger an Immortal!\r\n", ch);
	return;
    }

    send_to_char("&w          Finger Info\n\r", ch);
    send_to_char("          -----------\n\r", ch);
    ch_printf(ch, "&wName : &G%-20s\n\r", name );
/*    ch_printf(ch, "&wLevel: &G%-20d\n\r",  top_level );*/
    ch_printf(ch, "&wSex  : &G%-20s &w\n\r",
                sex == SEX_MALE   ? "Male"   :
                sex == SEX_FEMALE ? "Female" : "Neutral");
    ch_printf(ch, "&wTitle: &G%s\n\r", title );
    ch_printf(ch, "&wHomepage: &G%s\n\r", homepage ? homepage : "None" );
    ch_printf(ch, "&wEmail: &G%s\n\r", email ? email : "None specified" );
    ch_printf(ch, "&wLast on: &G%s\n\r", laston );
    if ( IS_IMMORTAL(ch) )
      ch_printf(ch, "&wFrom site: &G%s\n\r", site );

    return;
}
Пример #13
0
void fread_ban( FILE * fp, int type )
{
    BAN_DATA *pban;
    unsigned int i = 0;
    bool fMatch = FALSE;

    CREATE( pban, BAN_DATA, 1 );

    pban->name = fread_string_nohash( fp );
    pban->level = fread_number( fp );
    pban->duration = fread_number( fp );
    pban->unban_date = fread_number( fp );
    if( type == BAN_SITE )
    {   /* Sites have 2 extra numbers written out */
        pban->prefix = fread_number( fp );
        pban->suffix = fread_number( fp );
    }
    pban->warn = fread_number( fp );
    pban->ban_by = fread_string_nohash( fp );
    pban->ban_time = fread_string_nohash( fp );
    pban->note = fread_string( fp );

    /*
     * Need to lookup the class or race number if it is of that type
     */

    if( type == BAN_CLASS )
        for( i = 0; i < MAX_CLASS; i++ )
        {
            if( !str_cmp( class_table[i]->who_name, pban->name ) )
            {
                fMatch = TRUE;
                break;
            }
        }
    else if( type == BAN_RACE )
        for( i = 0; i < MAX_RACE; i++ )
        {
            if( !str_cmp( race_table[i]->race_name, pban->name ) )
            {
                fMatch = TRUE;
                break;
            }
        }
    else if( type == BAN_SITE )
        for( i = 0; i < strlen( pban->name ); i++ )
        {
            if( pban->name[i] == '@' )
            {
                char *temp;
                const char *temp2;

                temp = str_dup( pban->name );
                temp[i] = '\0';
                temp2 = &pban->name[i + 1];
                DISPOSE( pban->name );
                pban->name = str_dup( temp2 );
                DISPOSE( temp );
                break;
            }
        }

    if( type == BAN_RACE || type == BAN_CLASS )
    {
        if( fMatch )
            pban->flag = i;
        else  /* The file is corupted throw out this ban structure */
        {
            bug( "Bad class structure %d.\r\n", i );
            free_ban( pban );
            return;
        }
    }
    if( type == BAN_CLASS )
        LINK( pban, first_ban_class, last_ban_class, next, prev );
    else if( type == BAN_RACE )
        LINK( pban, first_ban_race, last_ban_race, next, prev );
    else if( type == BAN_SITE )
        LINK( pban, first_ban, last_ban, next, prev );
    else  /* Bad type throw out the ban structure */
    {
        bug( "Fread_ban: Bad type %d", type );
        free_ban( pban );
    }
    return;
}