Пример #1
0
affect_data *fread_fuss_affect( FILE * fp, const char *word )
{
   int pafmod;

   affect_data *paf = new affect_data;
   paf->location = APPLY_NONE;
   paf->type = -1;
   paf->duration = -1;
   paf->bit = 0;
   paf->modifier = 0;
   paf->rismod.reset(  );

   if( !strcmp( word, "Affect" ) )
   {
      paf->type = fread_number( fp );
   }
   else
   {
      int sn;

      sn = skill_lookup( fread_word( fp ) );
      if( sn < 0 )
         bug( "%s: unknown skill.", __func__ );
      else
         paf->type = sn;
   }

   paf->duration = fread_number( fp );
   pafmod = fread_number( fp );
   paf->location = fread_number( fp );
   fread_bitvector( fp ); // Bit conversions don't take for this.

   if( paf->location == APPLY_WEAPONSPELL
       || paf->location == APPLY_WEARSPELL
       || paf->location == APPLY_STRIPSN || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_RECURRINGSPELL )
      paf->modifier = slot_lookup( pafmod );
   else
      paf->modifier = pafmod;

   ++top_affect;
   return paf;
}
Пример #2
0
CHAR_DATA *load_mobile( FILE * fp )
{
   CHAR_DATA *mob = NULL;
   const char *word;
   bool fMatch;
   int inroom = 0;
   ROOM_INDEX_DATA *pRoomIndex = NULL;

   word = feof( fp ) ? "EndMobile" : fread_word( fp );
   if( !str_cmp( word, "Vnum" ) )
   {
      int vnum;

      vnum = fread_number( fp );
      if( get_mob_index( vnum ) == NULL )
      {
         bug( "%s: No index data for vnum %d", __FUNCTION__, vnum );
         return NULL;
      }
      mob = create_mobile( get_mob_index( vnum ) );
      if( !mob )
      {
         for( ;; )
         {
            word = feof( fp ) ? "EndMobile" : fread_word( fp );
            /*
             * So we don't get so many bug messages when something messes up
             * * --Shaddai 
             */
            if( !str_cmp( word, "EndMobile" ) )
               break;
         }
         bug( "%s: Unable to create mobile for vnum %d", __FUNCTION__, vnum );
         return NULL;
      }
   }
   else
   {
      for( ;; )
      {
         word = feof( fp ) ? "EndMobile" : fread_word( fp );
         /*
          * So we don't get so many bug messages when something messes up
          * * --Shaddai 
          */
         if( !str_cmp( word, "EndMobile" ) )
            break;
      }
      extract_char( mob, TRUE );
      bug( "%s: Vnum not found", __FUNCTION__ );
      return NULL;
   }

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

         case '#':
            if( !str_cmp( word, "#OBJECT" ) )
            {
               mob->tempnum = -9999;   /* Hackish, yes. Works though doesn't it? */
               fread_obj( mob, fp, OS_CARRY );
            }
            break;

         case 'A':
            if( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
            {
               AFFECT_DATA *paf;

               CREATE( paf, AFFECT_DATA, 1 );
               if( !str_cmp( word, "Affect" ) )
               {
                  paf->type = fread_number( fp );
               }
               else
               {
                  int sn;
                  const char *sname = fread_word( fp );

                  if( ( sn = skill_lookup( sname ) ) < 0 )
                  {
                     if( ( sn = herb_lookup( sname ) ) < 0 )
                        bug( "%s", "load_mobile: unknown skill." );
                     else
                        sn += TYPE_HERB;
                  }
                  paf->type = sn;
               }

               paf->duration = fread_number( fp );
               paf->modifier = fread_number( fp );
               paf->location = fread_number( fp );
               if( paf->location == APPLY_WEAPONSPELL
                   || paf->location == APPLY_WEARSPELL
                   || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN )
                  paf->modifier = slot_lookup( paf->modifier );
               paf->bitvector = fread_bitvector( fp );
               LINK( paf, mob->first_affect, mob->last_affect, next, prev );
               fMatch = TRUE;
               break;
            }
            KEY( "AffectedBy", mob->affected_by, fread_bitvector( fp ) );
            break;

#ifdef OVERLANDCODE
         case 'C':
            if( !str_cmp( word, "Coordinates" ) )
            {
               mob->x = fread_number( fp );
               mob->y = fread_number( fp );
               mob->map = fread_number( fp );

               fMatch = TRUE;
               break;
            }
            break;
#endif

         case 'D':
            if( !str_cmp( word, "Description" ) )
            {
               STRFREE( mob->description );
               mob->description = fread_string( fp );
               fMatch = TRUE;
               break;
            }
            break;

         case 'E':
            if( !str_cmp( word, "EndMobile" ) )
            {
               if( inroom == 0 )
                  inroom = ROOM_VNUM_LIMBO;
               pRoomIndex = get_room_index( inroom );
               if( !pRoomIndex )
                  pRoomIndex = get_room_index( ROOM_VNUM_LIMBO );
               char_to_room( mob, pRoomIndex );
               mob->tempnum = -9998;   /* Yet another hackish fix! */
               update_room_reset( mob, FALSE );
               return mob;
            }
            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 'F':
            KEY( "Flags", mob->act, fread_number( fp ) );
            break;

         case 'G':
            KEY( "Gold", mob->gold, fread_number( fp ) );
            break;

         case 'H':
            if( !str_cmp( word, "HpManaMove" ) )
            {
               mob->hit = fread_number( fp );
               mob->max_hit = fread_number( fp );
               mob->mana = fread_number( fp );
               mob->max_mana = fread_number( fp );
               mob->move = fread_number( fp );
               mob->max_move = fread_number( fp );

               if( mob->max_move <= 0 )
                  mob->max_move = 150;

               fMatch = TRUE;
               break;
            }
            break;

         case 'L':
            if( !str_cmp( word, "Long" ) )
            {
               STRFREE( mob->long_descr );
               mob->long_descr = fread_string( fp );
               fMatch = TRUE;
               break;
            }
            KEY( "Level", mob->top_level, fread_number( fp ) );
            break;

         case 'M':
            if( !str_cmp( word, "Mobclan" ) )
            {
               STRFREE( mob->mob_clan );
               mob->mob_clan = fread_string( fp );
               fMatch = TRUE;
               break;
            }
            break;

         case 'N':
            if( !str_cmp( word, "Name" ) )
            {
               STRFREE( mob->name );
               mob->name = fread_string( fp );
               fMatch = TRUE;
               break;
            }
            break;

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

         case 'R':
            KEY( "Room", inroom, fread_number( fp ) );
            KEY( "Resetvnum", mob->resetvnum, fread_number( fp ) );
            KEY( "Resetnum", mob->resetnum, fread_number( fp ) );
            break;

         case 'S':
            if( !str_cmp( word, "Short" ) )
            {
               STRFREE( mob->short_descr );
               mob->short_descr = fread_string( fp );
               fMatch = TRUE;
               break;
            }
            break;
      }
      if( !fMatch && str_cmp( word, "End" ) )
         bug( "%s: no match: %s", __FUNCTION__, word );
   }
   return NULL;
}
Пример #3
0
bool load_class_file( const char *fname )
{
    char                    buf[MSL];
    const char             *word;
    bool                    fMatch;
    struct class_type      *Class;
    int                     cl = -1,
        tlev = 0;
    FILE                   *fp;

    snprintf( buf, MSL, "%s%s", CLASSDIR, fname );
    if ( ( fp = FileOpen( buf, "r" ) ) == NULL ) {
        perror( buf );
        return FALSE;
    }
    CREATE( Class, struct class_type, 1 );
    /*
     * Setup defaults for additions to class structure
     */
    Class->starting = FALSE;
    Class->attr_second = 0;
    Class->attr_deficient = 0;
    xCLEAR_BITS( Class->affected );
    Class->resist = 0;
    Class->suscept = 0;

    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( "Affected", Class->affected, fread_bitvector( fp ) );
                KEY( "AttrPrime", Class->attr_prime, fread_number( fp ) );
                KEY( "AttrSecond", Class->attr_second, fread_number( fp ) );
                KEY( "AttrDeficient", Class->attr_deficient, fread_number( fp ) );
                break;
            case 'C':
                KEY( "Class", cl, fread_number( fp ) );
                KEY( "Craftbase", Class->craft_base, fread_number( fp ) );
                break;
            case 'E':
                if ( !str_cmp( word, "End" ) )
                    if ( !str_cmp( word, "End" ) ) {
                        FileClose( fp );
                        if ( cl < 0 || cl >= MAX_CLASS ) {
                            bug( "Load_class_file: Class (%s) bad/not found (%d)",
                                 Class->who_name ? Class->who_name : "name not found", cl );
                            if ( VLD_STR( Class->who_name ) )
                                STRFREE( Class->who_name );
                            if ( VLD_STR( Class->filename ) )
                                STRFREE( Class->filename );
                            DISPOSE( Class );
                            return FALSE;
                        }
                        if ( !Class->filename )
                            Class->filename = STRALLOC( Class->who_name );
                        class_table[cl] = Class;
                        return TRUE;
                    }
                KEY( "ExpBase", Class->exp_base, fread_number( fp ) );
                break;
            case 'F':
                KEY( "Filename", Class->filename, fread_string( fp ) );
            case 'H':
                KEY( "HpMax", Class->hp_max, fread_number( fp ) );
                KEY( "HpMin", Class->hp_min, fread_number( fp ) );
                break;
            case 'M':
                KEY( "ManaMax", Class->mana_max, fread_number( fp ) );
                KEY( "ManaMin", Class->mana_min, fread_number( fp ) );
                break;
            case 'N':
                KEY( "Nocombo", Class->combo_restriction, fread_number( fp ) );
                KEY( "Name", Class->who_name, fread_string( fp ) );
                break;
            case 'R':
                KEY( "Races", Class->race_restriction, fread_number( fp ) );
                if ( !str_cmp( word, "Reclass" ) ) {
                    Class->reclass1 = fread_number( fp );
                    Class->reclass2 = fread_number( fp );
                    Class->reclass3 = fread_number( fp );
                    fMatch = TRUE;
                    break;
                }
                KEY( "Resist", Class->resist, fread_number( fp ) );
                break;
            case 'S':
                KEY( "Starting", Class->starting, 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 ( cl < 0 || cl >= MAX_CLASS )
                        bug( "load_class_file: Skill %s -- class bad/not found (%d)", word, cl );
                    else if ( !IS_VALID_SN( sn ) )
                        bug( "load_class_file: Skill %s unknown", word );
                    else {
                        skill_table[sn]->skill_level[cl] = lev;
                        skill_table[sn]->skill_adept[cl] = adp;
                    }
                    fMatch = TRUE;
                    break;
                }
                KEY( "Skilladept", Class->skill_adept, fread_number( fp ) );
                KEY( "Suscept", Class->suscept, fread_number( fp ) );
                break;
            case 'T':
                if ( !str_cmp( word, "Title" ) ) {
                    if ( cl < 0 || cl >= MAX_CLASS ) {
                        char                   *tmp;

                        bug( "load_class_file: Title -- class bad/not found (%d)", cl );
                        tmp = fread_string( fp );
                        DISPOSE( tmp );
                        tmp = fread_string( fp );
                        DISPOSE( tmp );
                    }
                    else if ( tlev < MAX_LEVEL + 1 ) {
                        title_table[cl][tlev][0] = fread_string( fp );
                        title_table[cl][tlev][1] = fread_string( fp );
                        ++tlev;
                    }
                    else
                        bug( "%s", "load_class_file: Too many titles" );
                    fMatch = TRUE;
                    break;
                }
                KEY( "Thac0", Class->thac0_00, fread_number( fp ) );
                KEY( "Thac32", Class->thac0_32, fread_number( fp ) );
                break;
        }
        if ( !fMatch ) {
            bug( "load_class_file: no match: %s", word );
            fread_to_eol( fp );
        }
    }
    return FALSE;
}
Пример #4
0
DISC_DATA *fread_discipline( FILE * fp )
{
   char buf[MAX_STRING_LENGTH];
   DISC_DATA *disc;
   bool fMatch;
   const char *word;

   CREATE( disc, DISC_DATA, 1 );

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

      switch( UPPER( word[0] ) )
      {
         case '*':
            fMatch = TRUE;
            fread_to_eol( fp );
            break;
         case '#':
            if( !str_cmp( word, "#Factor" ) )
            {
               fMatch = TRUE;
               FACTOR_DATA *factor;
               CREATE( factor, FACTOR_DATA, 1 );
               factor->id = fread_number( fp );
               factor->factor_type = fread_number( fp );
               factor->location = fread_number( fp );
               factor->affect = fread_bitvector( fp );
               factor->modifier = fread_float( fp );
               factor->apply_type = fread_number( fp );
               factor->duration = fread_float( fp );
               factor->owner = disc;
               LINK( factor, disc->first_factor, disc->last_factor, next, prev );
               break;
            }
            break;
         case 'C':
            KEY( "Cost", disc->cost, fread_bitvector( fp ) );
            break;
         case 'D':
            KEY( "Damtype", disc->damtype, fread_bitvector( fp ) );
            break;
         case 'E':
            if( !str_cmp( word, "End" ) )
               return disc;
         case 'G':
            if( !str_cmp( word, "Gains" ) )
            {
               fMatch = TRUE;
               disc->hit_gain = fread_number( fp );
               disc->move_gain = fread_number( fp );
               disc->mana_gain = fread_number( fp );
               break;
            }
            break;
         case 'I':
            KEY( "ID", disc->id, fread_number( fp ) );
         case 'M':
            KEY( "MinLevel", disc->min_level, fread_number( fp ) );
            break;

         case 'N':
            KEY( "Name", disc->name, fread_string( fp ) );
            break;
         case 'S':
            KEY( "SkillStyle", disc->skill_style, fread_bitvector( fp ) );
            KEY( "SkillType", disc->skill_type, fread_bitvector( fp ) );
            break;
         case 'T':
            KEY( "TargetType", disc->target_type, fread_bitvector( fp ) );
            break;
      }
      if( !fMatch )
      {
         sprintf( buf, "Fread_discipline: no match: %s", word );
         bug( buf, 0 );
      }
   }
}
Пример #5
0
SKILLTYPE *fread_skill( FILE * fp, bool Player )
{
   char buf[MAX_STRING_LENGTH];
   const char *word;
   bool fMatch;
   SKILLTYPE *skill;

   CREATE( skill, SKILLTYPE, 1 );

   skill->guild = -1;
   skill->style = -1;

   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( "Alignment", skill->alignment, fread_number( fp ) );
            if( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
            {
               AFFECT_DATA *aff = fread_fuss_affect( fp, word );

               if( aff )
                  LINK( aff, skill->first_affect, skill->last_affect, next, prev );
               fMatch = TRUE;
               break;
            }
            break;

         case 'C':
            KEY( "Charge", skill->charge, fread_float( fp ) );
            if ( !str_cmp( word, "Code" ) )
            {
               if( Player )
                  break;
               SPELL_FUN *spellfun;
               DO_FUN *dofun;
               const char *w = fread_word( fp );

               fMatch = TRUE;
               if( !str_cmp( word, "(null)" ) )
                  break;
               else if( !str_prefix( "do_", w ) && ( dofun = skill_function(w) ) != skill_notfound )
               {
                  skill->skill_fun = dofun;
                  skill->spell_fun = NULL;
                  skill->skill_fun_name = str_dup(w);
               }
               else if( str_prefix( "do_", w ) && ( spellfun = spell_function(w) ) != spell_notfound )
               {
                  skill->spell_fun = spellfun;
                  skill->skill_fun = NULL;
                  skill->spell_fun_name = str_dup(w);
               }
               else
               {
                  bug( "%s: unknown skill/spell %s", __FUNCTION__, w );
                  skill->spell_fun = spell_null;
               }
               break;
            }
            KEY( "Components", skill->components, fread_string( fp ) );
            KEY( "Cooldown", skill->cooldown, fread_number( fp ) );
            KEY( "Cost", skill->cost, fread_bitvector( fp ) );
            break;

         case 'D':
            KEY( "DamageDetails", skill->base_roll_boost, fread_float( fp ) );
            KEY( "Dammsg", skill->noun_damage, fread_string( fp ) );
            KEY( "Damtype", skill->damtype, fread_bitvector( fp ) );
            KEY( "Dice", skill->dice, fread_string( fp ) );
            KEY( "Diechar", skill->die_char, fread_string( fp ) );
            KEY( "Dieroom", skill->die_room, fread_string( fp ) );
            KEY( "Dievict", skill->die_vict, fread_string( fp ) );
            KEY( "Difficulty", skill->difficulty, fread_number( fp ) );
            break;

         case 'E':
            if( !str_cmp( word, "End" ) )
               return skill;
            break;

         case 'F':
            if( !str_cmp( word, "FactorID" ) )
            {
               FACTOR_DATA *factor;
               fMatch = TRUE;
               if( ( factor = copy_factor( get_factor_from_id( fread_number( fp ) ) ) ) == NULL )
                  break;
               LINK( factor, skill->first_factor, skill->last_factor, next, prev );
               break;
            }
            KEY( "Flags", skill->flags, fread_number( fp ) );
            break;

         case 'G':
            KEY( "Guild", skill->guild, fread_number( fp ) );
            break;

         case 'H':
            KEY( "Hitchar", skill->hit_char, fread_string( fp ) );
            KEY( "Hitroom", skill->hit_room, fread_string( fp ) );
            KEY( "Hitvict", skill->hit_vict, fread_string( fp ) );
            KEY( "HP", skill->min_hp, fread_number( fp ) );
            break;

         case 'I':
            KEY( "Immchar", skill->imm_char, fread_string( fp ) );
            KEY( "Immroom", skill->imm_room, fread_string( fp ) );
            KEY( "Immvict", skill->imm_vict, fread_string( fp ) );
            break;

         case 'M':
            KEY( "Mana", skill->min_mana, fread_number( fp ) );
            KEY( "Minlevel", skill->min_level, fread_number( fp ) );
            KEY( "Minpos", skill->minimum_position, fread_number( fp ) );
            KEY( "Misschar", skill->miss_char, fread_string( fp ) );
            KEY( "Missroom", skill->miss_room, fread_string( fp ) );
            KEY( "Missvict", skill->miss_vict, fread_string( fp ) );
            KEY( "Move", skill->min_move, fread_number( fp ) );
            break;

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

         case 'P':
            KEY( "Participants", skill->participants, fread_number( fp ) );
            break;

         case 'R':
            KEY( "Rounds", skill->beats, fread_number( fp ) );
            break;

         case 'S':
            KEY( "Saves", skill->saves, fread_number( fp ) );
            KEY( "Slot", skill->slot, fread_number( fp ) );
            if( !str_cmp( word, "StatBoost" ) )
            {
               STAT_BOOST *stat_boost;

               fMatch = TRUE;

               CREATE( stat_boost, STAT_BOOST, 1 );
               stat_boost->from_id = fread_number( fp );
               stat_boost->location = fread_number( fp );
               stat_boost->modifier = fread_float( fp );
               LINK( stat_boost, skill->first_statboost, skill->last_statboost, next, prev );
            }
            KEY( "Style", skill->style, fread_number( fp ) );
            break;

         case 'T':
            KEY( "Target", skill->target, fread_number( fp ) );
            KEY( "Teachers", skill->teachers, fread_string( fp ) );
            KEY( "Threat", skill->threat, fread_number( fp ) );
            KEY( "Type", skill->type, get_skill( fread_word( fp ) ) );
            break;

         case 'V':
            KEY( "Value", skill->value, fread_number( fp ) );
            break;

         case 'W':
            KEY( "Wearoff", skill->msg_off, fread_string( fp ) );
            break;
      }

      if( !fMatch )
      {
         sprintf( buf, "Fread_skill: no match: %s", word );
         bug( buf, 0 );
      }
   }
}
Пример #6
0
void fread_pfile( FILE * fp, time_t tdiff, char *fname, bool count )
{
   const char *word;
   char *name = NULL;
   char *clan = NULL;
   char *deity = NULL;
   short level = 0;
   short file_ver = 0;
   EXT_BV pact;
   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( "Act", pact, fread_bitvector( fp ) );
            break;

         case 'C':
            KEY( "Clan", clan, fread_string( fp ) );
            break;

         case 'D':
            KEY( "Deity", deity, fread_string( fp ) );
            break;

         case 'E':
            if( !strcmp( word, "End" ) )
               goto timecheck;
            break;

         case 'L':
            KEY( "Level", level, fread_number( fp ) );
            break;

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

         case 'V':
            KEY( "Version", file_ver, fread_number( fp ) );
            break;
      }

      if( !fMatch )
         fread_to_eol( fp );
   }

 timecheck:

   if( count == FALSE && !xIS_SET( pact, PLR_EXEMPT ) )
   {
      if( level < 10 && tdiff > sysdata.newbie_purge )
      {
         if( unlink( fname ) == -1 )
            perror( "Unlink" );
         else
         {
            days = sysdata.newbie_purge;
            snprintf( log_buf, MAX_STRING_LENGTH, "Player %s was deleted. Exceeded time limit of %d days.", name, days );
            log_string( log_buf );
#ifdef AUTO_AUTH
            remove_from_auth( name );
#endif
            deleted++;
            return;
         }
      }

      if( level < LEVEL_IMMORTAL && tdiff > sysdata.regular_purge )
      {
         if( level < LEVEL_IMMORTAL )
         {
            if( unlink( fname ) == -1 )
               perror( "Unlink" );
            else
            {
               days = sysdata.regular_purge;
               snprintf( log_buf, MAX_STRING_LENGTH, "Player %s was deleted. Exceeded time limit of %d days.", name, days );
               log_string( log_buf );
#ifdef AUTO_AUTH
               remove_from_auth( name );
#endif
               deleted++;
               return;
            }
         }
      }
   }

   if( clan != NULL )
   {
      CLAN_DATA *guild = get_clan( clan );

      if( guild )
         guild->members++;
   }

   if( deity != NULL )
   {
      DEITY_DATA *god = get_deity( deity );

      if( god )
         god->worshippers++;
   }

   if( clan )
      STRFREE( clan );
   if( name )
      STRFREE( name );
   if( deity )
      STRFREE( deity );

   return;
}