#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include <sys/types.h> #include <sys/time.h> #include "merc.h" #include "db.h" #include "lookup.h" #include "clans/new_clans.h" #include "clans/new_clans_comm.h" #include "clans/new_clans_io.h" #include "clans/new_clans_util.h" #if defined(KEY) #undef KEY #endif /* */ #define KEY( literal, field, value ) \ if (!str_cmp(word, literal)) \ { \ field = value; \ fMatch = TRUE; \ break; \ } /* values for db2.c */ struct social_type social_table[MAX_SOCIALS]; int social_count; extern char strArea[]; extern FILE *fpArea; extern bool is_encrypted; extern int enc_shift; TRIGGER_DATA *fread_trigger (FILE * fp) { char *word; bool fMatch; TRIGGER_DATA *trigger; trigger = alloc_perm (sizeof (*trigger)); trigger->next = NULL; trigger->waiting = 0; trigger->current = NULL; trigger->script = NULL; trigger->trigger_type = 0; trigger->bits = 0; trigger->keywords = str_dup (""); trigger->name = str_dup (fread_word (fp)); { SCRIPT_DATA *scr; trigger->script = alloc_perm (sizeof (*scr)); scr = trigger->script; scr->command = str_dup (""); scr->next = NULL; } for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fread_to_eol (fp); fMatch = TRUE; break; case 'K': KEY ("Keywords", trigger->keywords, fread_string (fp)); break; case 'E': if (!str_cmp (word, "End")) { fMatch = TRUE; return trigger; } if (!str_cmp (word, "END")) { fMatch = TRUE; return trigger; } break; case 'S': if (!str_cmp (word, "Sc") || !str_cmp (word, "Script")) { SCRIPT_DATA *scr; if (trigger->script != NULL) { for (scr = trigger->script; scr->next != NULL; scr = scr->next); /* scan to the end */ scr->next = alloc_perm (sizeof (*scr)); scr = scr->next; } else { trigger->script = alloc_perm (sizeof (*scr)); scr = trigger->script; } scr->command = fread_string (fp); scr->next = NULL; fMatch = TRUE; } break; case 'T': KEY ("Type", trigger->trigger_type, fread_number (fp)); break; } if (!fMatch) { char buf[80]; sprintf (buf, "fread_trigger: incorrect '%s'", word); bug (buf, 0); fread_to_eol (fp); } }; } /* snarf a socials file */ void load_socials (FILE * fp) { #ifdef VERBOSE_BOOT log_string ("load_socials()"); #endif /* */ for (;;) { struct social_type social; char *temp; /* clear social */ social.char_no_arg = NULL; social.others_no_arg = NULL; social.char_found = NULL; social.others_found = NULL; social.vict_found = NULL; social.char_not_found = NULL; social.char_auto = NULL; social.others_auto = NULL; temp = fread_word (fp); if (!strcmp (temp, "#0")) return; /* done */ #if defined(social_debug) else fprintf (stderr, "%s\n\r", temp); #endif /* */ strcpy (social.name, temp); fread_to_eol (fp); temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.char_no_arg = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.char_no_arg = temp; temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.others_no_arg = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.others_no_arg = temp; temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.char_found = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.char_found = temp; temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.others_found = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.others_found = temp; temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.vict_found = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.vict_found = temp; temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.char_not_found = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.char_not_found = temp; temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.char_auto = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.char_auto = temp; temp = fread_string_eol (fp); if (!strcmp (temp, "$")) social.others_auto = NULL; else if (!strcmp (temp, "#")) { social_table[social_count] = social; social_count++; continue; } else social.others_auto = temp; social_table[social_count] = social; social_count++; } return; } void load_scripts (char *fn, MOB_INDEX_DATA * pMob) { FILE *fp; TRIGGER_DATA *trigger; char *word; bool fMatch = TRUE, was_encrypted; char fullpath[1024]; #ifdef VERBOSE_BOOT log_string ("load_scripts()"); log_string (fn); #endif /* */ was_encrypted = is_encrypted; is_encrypted = FALSE; pMob->triggers = NULL; sprintf (fullpath, "mobscr/%s", fn); if ((fp = fopen (fullpath, "r")) == NULL) { char buf[MAX_STRING_LENGTH]; sprintf (buf, "%s script file not found!", fn); bug (buf, 0); return; } for (; fMatch;) { fMatch = FALSE; word = feof (fp) ? "#END" : fread_word (fp); if (word[0] == '*') { /* In-file comments */ fread_to_eol (fp); fMatch = TRUE; } else if (word[0] == '#') { if (!str_cmp (word, "#END")) { fMatch = TRUE; break; } else if (!str_cmp (word, "#TRIGGER")) { fMatch = TRUE; trigger = fread_trigger (fp); trigger->next = pMob->triggers; pMob->triggers = trigger; } } } if (!fMatch) { strcpy (strArea, fn); fpArea = fp; bug ("Load_scripts: bad key word.", 0); exit (1); } fclose (fp); is_encrypted = was_encrypted; return; } /* * Snarf a mob section. new style */ void load_mobiles (FILE * fp) { MOB_INDEX_DATA *pMobIndex; int i=0; #ifdef VERBOSE_BOOT log_string ("load_mobiles()"); #endif /* */ if (!area_last) { /* OLC */ bug ("Load_mobiles: no #AREA seen yet.", 0); exit (1); } for (;;) { sh_int vnum; char letter; int iHash; letter = fread_letter (fp); if (letter != '#') { bug ("Load_mobiles: # not found.", 0); exit (1); } vnum = fread_number (fp); if (vnum == 0) break; fBootDb = FALSE; if (get_mob_index (vnum) != NULL) { bug ("Load_mobiles: vnum %d duplicated.", vnum); exit (1); } fBootDb = TRUE; pMobIndex = alloc_perm (sizeof (*pMobIndex)); pMobIndex->vnum = vnum; pMobIndex->area = area_last; /* OLC */ newmobs++; pMobIndex->player_name = fread_string (fp); pMobIndex->short_descr = fread_string (fp); pMobIndex->long_descr = fread_string (fp); pMobIndex->description = fread_string (fp); pMobIndex->race = race_lookup (fread_string (fp)); pMobIndex->triggers = NULL; pMobIndex->variables = NULL; pMobIndex->last_killer = NULL; pMobIndex->last_killer2 = NULL; pMobIndex->recruit_flags = fread_flag (fp); pMobIndex->recruit_value[0] = fread_number (fp); pMobIndex->recruit_value[1] = fread_number (fp); pMobIndex->recruit_value[2] = fread_number (fp); pMobIndex->long_descr[0] = UPPER (pMobIndex->long_descr[0]); pMobIndex->description[0] = UPPER (pMobIndex->description[0]); pMobIndex->act = fread_flag (fp) | ACT_IS_NPC | race_table[pMobIndex->race].act; pMobIndex->affected_by = fread_flag (fp) | race_table[pMobIndex->race].aff; pMobIndex->pShop = NULL; pMobIndex->alignment = fread_number (fp); pMobIndex->group = fread_number (fp); pMobIndex->level = fread_number (fp); pMobIndex->hitroll = fread_number (fp); //IBLIS TEMPORARY THING // if (pMobIndex->level < 61) // pMobIndex->hitroll = pMobIndex->level; /* read hit dice */ pMobIndex->hit[DICE_NUMBER] = fread_number (fp); /* 'd' */ fread_letter (fp); pMobIndex->hit[DICE_TYPE] = fread_number (fp); /* '+' */ fread_letter (fp); pMobIndex->hit[DICE_BONUS] = fread_number (fp); /* read mana dice */ pMobIndex->mana[DICE_NUMBER] = fread_number (fp); fread_letter (fp); pMobIndex->mana[DICE_TYPE] = fread_number (fp); fread_letter (fp); pMobIndex->mana[DICE_BONUS] = fread_number (fp); /* read damage dice */ pMobIndex->damage[DICE_NUMBER] = fread_number (fp); fread_letter (fp); pMobIndex->damage[DICE_TYPE] = fread_number (fp); fread_letter (fp); pMobIndex->damage[DICE_BONUS] = fread_number (fp); pMobIndex->dam_type = attack_lookup (fread_word (fp)); /* read armor class */ pMobIndex->ac[AC_PIERCE] = fread_number (fp) * 10; pMobIndex->ac[AC_BASH] = fread_number (fp) * 10; pMobIndex->ac[AC_SLASH] = fread_number (fp) * 10; pMobIndex->ac[AC_EXOTIC] = fread_number (fp) * 10; /*10/12/03 - Iblis - Added this to properly load new flags Cory added a couple months ago*/ if (pMobIndex->ac[AC_EXOTIC] == 9990) { pMobIndex->ac[AC_EXOTIC] = fread_number (fp) * 10; pMobIndex->act2 = fread_flag (fp); pMobIndex->blocks_exit = fread_number (fp); if (pMobIndex->blocks_exit > 50) { pMobIndex->blocks_exit -= 60; pMobIndex->number_of_attacks = fread_number (fp); } else pMobIndex->number_of_attacks = -1; } else { pMobIndex->blocks_exit = -1; pMobIndex->act2 = 0; pMobIndex->number_of_attacks = -1; } /* read flags and add in data from the race table */ pMobIndex->off_flags = fread_flag (fp) | race_table[pMobIndex->race].off; pMobIndex->imm_flags = fread_flag (fp) | race_table[pMobIndex->race].imm; pMobIndex->res_flags = fread_flag (fp) | race_table[pMobIndex->race].res; pMobIndex->vuln_flags = fread_flag (fp) | race_table[pMobIndex->race].vuln; /* vital statistics */ pMobIndex->start_pos = position_lookup (fread_word (fp)); pMobIndex->default_pos = position_lookup (fread_word (fp)); pMobIndex->sex = sex_lookup (fread_word (fp)); // fprintf (stderr, "!! - %d - %d - %ld - %d - %d - %d \n", pMobIndex->ac[AC_EXOTIC], pMobIndex->blocks_exit, pMobIndex->vuln_flags, // pMobIndex->start_pos, pMobIndex->default_pos, pMobIndex->sex); pMobIndex->wealth = fread_number (fp); pMobIndex->form = fread_flag (fp) | race_table[pMobIndex->race].form; pMobIndex->parts = fread_flag (fp) | race_table[pMobIndex->race].parts; //Iblis - 8/29/04 - Added a slot for a rune card vnum, and setable stats (con/str/etc) if (area_last->version >= AREA_VER_CARDS) { for (i=0;i<MAX_STATS;i++) pMobIndex->perm_stat[i] = fread_number (fp); pMobIndex->card_vnum = fread_number (fp); } else { pMobIndex->card_vnum = 0; //Iblis 8/29/04- Set Mob's stats according to Iverath's requests for (i=0;i<MAX_STATS;i++) pMobIndex->perm_stat[i] = 6 + (pMobIndex->level*(19/90.0)); } /* size */ pMobIndex->size = size_lookup (fread_word (fp)); pMobIndex->material = str_dup (fread_string (fp)); pMobIndex->defbonus = fread_number (fp); pMobIndex->attackbonus = fread_number (fp); pMobIndex->max_weight = fread_number (fp); pMobIndex->move = fread_number (fp); pMobIndex->default_mood = fread_number (fp); pMobIndex->vocfile = fread_string (fp); pMobIndex->script_fn = fread_string (fp); if (pMobIndex->script_fn[0] != '\0') load_scripts (pMobIndex->script_fn, pMobIndex); for (;;) { letter = fread_letter (fp); if (letter == 'F') { char *word; long vector; word = fread_word (fp); vector = fread_flag (fp); if (!str_prefix (word, "act")) REMOVE_BIT (pMobIndex->act, vector); else if (!str_prefix (word, "aff")) REMOVE_BIT (pMobIndex->affected_by, vector); else if (!str_prefix (word, "off")) REMOVE_BIT (pMobIndex->off_flags, vector); else if (!str_prefix (word, "imm")) REMOVE_BIT (pMobIndex->imm_flags, vector); else if (!str_prefix (word, "res")) REMOVE_BIT (pMobIndex->res_flags, vector); else if (!str_prefix (word, "vul")) REMOVE_BIT (pMobIndex->vuln_flags, vector); else if (!str_prefix (word, "for")) REMOVE_BIT (pMobIndex->form, vector); else if (!str_prefix (word, "par")) REMOVE_BIT (pMobIndex->parts, vector); else { bug ("Flag remove: flag not found.", 0); exit (1); } } else { if (is_encrypted) { if (letter > 8 && letter < 127) { letter = letter + enc_shift; if (letter > 126) letter = (letter - 126) + 8; } } ungetc (letter, fp); break; } } iHash = vnum % MAX_KEY_HASH; pMobIndex->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMobIndex; top_mob_index++; top_vnum_mob = top_vnum_mob < vnum ? vnum : top_vnum_mob; assign_area_vnum (vnum); kill_table[URANGE (0, pMobIndex->level, MAX_LEVEL - 1)].number++; } return; } /* * Snarf an obj section. new style */ void load_objects (FILE * fp) { #ifdef VERBOSE_BOOT char buf[MAX_INPUT_LENGTH]; #endif /* */ // char notice[MAX_INPUT_LENGTH]; OBJ_INDEX_DATA *pObjIndex; char *word; char *riname; int tsn, x, i; #ifdef VERBOSE_BOOT log_string ("load_objects()"); #endif /* */ if (!area_last) { /* OLC */ bug ("Load_objects: no #AREA seen yet.", 0); exit (1); } for (;;) { sh_int vnum; char letter; int iHash; letter = fread_letter (fp); if (letter != '#') { bug ("Load_objects: # not found.", 0); exit (1); } vnum = fread_number (fp); if (vnum == 0) break; fBootDb = FALSE; if (get_obj_index (vnum) != NULL) { bug ("Load_objects: vnum %d duplicated.", vnum); exit (1); } fBootDb = TRUE; pObjIndex = alloc_perm (sizeof (*pObjIndex)); pObjIndex->vnum = vnum; pObjIndex->area = area_last; /* OLC */ pObjIndex->reset_num = 0; newobjs++; pObjIndex->name = fread_string (fp); #ifdef VERBOSE_BOOT sprintf (buf, "Loading object: %s vnum: %d", pObjIndex->name, pObjIndex->vnum); log_string (buf); #endif /* */ pObjIndex->short_descr = fread_string (fp); pObjIndex->description = fread_string (fp); pObjIndex->material = fread_string (fp); pObjIndex->timer = fread_number (fp); riname = fread_word (fp); pObjIndex->item_type = item_lookup (riname); #ifdef VERBOSE_BOOT sprintf (buf, "load_objects: read type name: \"%s\" item_lookup: %d", riname, pObjIndex->item_type); log_string (buf); #endif /* */ if (area_last->version >= AREA_VER_EXTRA_FLAGS) { x = fread_number(fp); for (i=0;i<x;i++) { pObjIndex->extra_flags[i] = fread_flag(fp); } } else pObjIndex->extra_flags[0] = fread_flag (fp); pObjIndex->wear_flags = fread_flag (fp); // Akamai 4/30/99 - support for class/race specific equipment // If the version of the current area is a version supporting // class/race specific eq then load those flags if (area_last->version >= AREA_VER_CLASSRACE) { pObjIndex->class_flags = fread_flag (fp); pObjIndex->race_flags = fread_flag (fp); pObjIndex->clan_flags = fread_flag (fp); #ifdef VERBOSE_BOOT log_string ("load_objects: objects have class/race flags"); #endif /* */ } if (area_last->version == AREA_VER_OBJTRIG) { pObjIndex->obj_trig_vnum[0] = fread_number (fp); for (i=1;i<MAX_OBJ_TRIGS;i++) pObjIndex->obj_trig_vnum[i] = 0; #ifdef VERBOSE_BOOT log_string ("load_objects: objects have an obj_trigger vnum"); #endif /* */ } else if (area_last->version >= AREA_VER_OBJTRIG2) { for (i=0;i<MAX_OBJ_TRIGS;i++) pObjIndex->obj_trig_vnum[i] = fread_number (fp); #ifdef VERBOSE_BOOT log_string ("load_objects: objects have an obj_trigger vnum"); #endif /* */ } pObjIndex->rarity = fread_number (fp); pObjIndex->string1 = fread_string (fp); pObjIndex->string2 = fread_string (fp); pObjIndex->string3 = fread_string (fp); pObjIndex->string4 = fread_string (fp); pObjIndex->value[0] = fread_flag (fp); switch (pObjIndex->item_type) { default: #ifdef VERBOSE_BOOT sprintf (buf, "load_objects: %s item %d -> a %s", pObjIndex->name, pObjIndex->item_type, item_name (pObjIndex->item_type)); log_string (buf); #endif /* */ pObjIndex->value[1] = fread_flag (fp); pObjIndex->value[2] = fread_flag (fp); pObjIndex->value[3] = fread_flag (fp); pObjIndex->value[4] = fread_flag (fp); break; case ITEM_PILL: case ITEM_SCROLL: case ITEM_POTION: #ifdef VERBOSE_BOOT sprintf (buf, "load_objects: %s item %d -> a %s", pObjIndex->name, pObjIndex->item_type, item_name (pObjIndex->item_type)); log_string (buf); #endif /* */ for (x = 1; x < 5; x++) { word = fread_word (fp); if ((tsn = atoi (word)) == 0 && word[0] != '0') tsn = skill_lookup (word); pObjIndex->value[x] = tsn; } break; case ITEM_WAND: case ITEM_STAFF: #ifdef VERBOSE_BOOT sprintf (buf, "load_objects: %s item %d -> a %s", pObjIndex->name, pObjIndex->item_type, item_name (pObjIndex->item_type)); log_string (buf); #endif /* */ pObjIndex->value[1] = fread_flag (fp); pObjIndex->value[2] = fread_flag (fp); pObjIndex->value[3] = fread_flag (fp); word = fread_word (fp); if ((tsn = atoi (word)) == 0 && word[0] != '0') tsn = skill_lookup (word); pObjIndex->value[4] = tsn; break; case ITEM_CLAN_DONATION: // new_clans // this is paired with the the save_object write in olc_save.c // // note this works because if save_object did *not* already // save this donation box in the new format then this case is // not taken and the default case is used - however, if save_object // saved this box already once then this new object type is set // and this case will be taken, reading the name in the new way #ifdef VERBOSE_BOOT sprintf (buf, "load_objects: %s item %d -> a %s", pObjIndex->name, pObjIndex->item_type, item_name (pObjIndex->item_type)); log_string (buf); #endif /* */ pObjIndex->value[1] = fread_flag (fp); pObjIndex->value[1] = CLAN_BOGUS; pObjIndex->value[2] = fread_flag (fp); pObjIndex->value[3] = fread_flag (fp); pObjIndex->value[4] = fread_flag (fp); break; case ITEM_NEWCLANS_DBOX: // new_clans // this is paired with the the save_object write in olc_save.c // // note this works because if save_object did *not* already // save this donation box in the new format then this case is // not taken and the default case is used - however, if save_object // saved this box already once then this new object type is set // and this case will be taken, reading the name in the new way #ifdef VERBOSE_BOOT sprintf (buf, "load_objects: %s item %d -> a %s", pObjIndex->name, pObjIndex->item_type, item_name (pObjIndex->item_type)); log_string (buf); #endif /* */ word = fread_string (fp); pObjIndex->value[1] = clanname_to_slot (word); pObjIndex->value[2] = fread_flag (fp); pObjIndex->value[3] = fread_flag (fp); pObjIndex->value[4] = fread_flag (fp); break; } pObjIndex->value[5] = fread_flag (fp); //Iblis - 6/8/04 - No need to store/read the additional 4 values for item types // //that do not need them. This way I also don't have to update the version of // //areas // if (pObjIndex->item_type == ITEM_CARD) { word = fread_word (fp); if ((tsn = atoi (word)) == 0 && word[0] != '0') tsn = skill_lookup (word); pObjIndex->value[6] = tsn; pObjIndex->value[7] = fread_flag (fp); pObjIndex->value[8] = fread_flag (fp); pObjIndex->value[9] = fread_flag (fp); pObjIndex->value[10] = fread_flag (fp); pObjIndex->value[11] = fread_flag (fp); pObjIndex->value[12] = fread_flag (fp); }else if(pObjIndex->item_type == ITEM_OBJ_TRAP ||pObjIndex->item_type == ITEM_ROOM_TRAP ||pObjIndex->item_type == ITEM_PORTAL_TRAP ) { pObjIndex->value[6] = fread_flag (fp); pObjIndex->value[7] = fread_flag (fp); pObjIndex->value[8] = fread_flag (fp); pObjIndex->value[9] = fread_flag (fp); pObjIndex->value[10] = fread_flag (fp); pObjIndex->value[11] = fread_flag (fp); pObjIndex->value[12] = fread_flag (fp); } else pObjIndex->value[6] = fread_flag (fp); if (pObjIndex->item_type == ITEM_WEAPON) if (pObjIndex->value[3] < 0 || pObjIndex->value[3] > 39) { pObjIndex->value[3] = 0; SET_BIT (area_last->area_flags, AREA_CHANGED); } pObjIndex->level = fread_number (fp); pObjIndex->weight = fread_number (fp); pObjIndex->cost = fread_number (fp); //pObjIndex->condition = 100; /* condition */ letter = fread_letter (fp); switch (letter) { case ('P'): pObjIndex->condition = 100; break; case ('G'): pObjIndex->condition = 90; break; case ('A'): pObjIndex->condition = 75; break; case ('W'): pObjIndex->condition = 50; break; case ('D'): pObjIndex->condition = 25; break; case ('B'): pObjIndex->condition = 10; break; case ('R'): pObjIndex->condition = 1; break; default: pObjIndex->condition = 100; break; } for (;;) { char letter; letter = fread_letter (fp); if (letter == 'A') { AFFECT_DATA *paf; paf = alloc_perm (sizeof (*paf)); paf->where = TO_OBJECT; paf->type = -1; paf->level = pObjIndex->level; paf->duration = -1; paf->location = fread_number (fp); paf->modifier = fread_number (fp); paf->bitvector = 0; paf->composition = FALSE; paf->comp_name = str_dup (""); paf->next = pObjIndex->affected; pObjIndex->affected = paf; top_affect++; } else if (letter == 'S') //for super affect { AFFECT_DATA *paf; paf = alloc_perm (sizeof (*paf)); paf->where = fread_number (fp); paf->type = fread_number (fp); paf->level = fread_number (fp); paf->duration = fread_number (fp); paf->modifier = fread_number (fp); if (paf->where == TO_SKILL) { int sn = sn = exact_skill_lookup (fread_word (fp)); if (sn < 0) { bug ("Fread_obj_index: On item %d unknown skill.", pObjIndex->vnum); paf->location = 1; //to avoid further bugs } else paf->location = sn; } else paf->location = fread_number (fp); paf->bitvector = fread_number (fp); paf->composition = FALSE; paf->comp_name = str_dup (""); paf->next = pObjIndex->affected; pObjIndex->affected = paf; top_affect++; } else if (letter == 'F') { AFFECT_DATA *paf; paf = alloc_perm (sizeof (*paf)); letter = fread_letter (fp); switch (letter) { case 'A': paf->where = TO_AFFECTS; break; case 'I': paf->where = TO_IMMUNE; break; case 'R': paf->where = TO_RESIST; break; case 'V': paf->where = TO_VULN; break; default: bug ("Load_objects: Bad where on flag set.", 0); exit (1); } paf->type = -1; paf->level = pObjIndex->level; paf->duration = -1; paf->location = fread_number (fp); paf->modifier = fread_number (fp); paf->bitvector = fread_flag (fp); paf->composition = FALSE; paf->comp_name = str_dup (""); paf->next = pObjIndex->affected; pObjIndex->affected = paf; top_affect++; } else if (letter == 'E') { EXTRA_DESCR_DATA *ed; ed = alloc_perm (sizeof (*ed)); ed->keyword = fread_string (fp); ed->description = fread_string (fp); ed->next = pObjIndex->extra_descr; pObjIndex->extra_descr = ed; top_ed++; } else { if (is_encrypted) { if (letter > 8 && letter < 127) { letter = letter + enc_shift; if (letter > 126) letter = (letter - 126) + 8; } } ungetc (letter, fp); break; } } iHash = vnum % MAX_KEY_HASH; pObjIndex->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObjIndex; top_obj_index++; top_vnum_obj = top_vnum_obj < vnum ? vnum : top_vnum_obj; assign_area_vnum (vnum); } return; }