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; }
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; }
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; }
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 ); } } }
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 ); } } }
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; }