void load_objects(FILE * fp) { OBJ_INDEX_DATA *pObjIndex; 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->new_format = TRUE; pObjIndex->reset_num = 0; newobjs++; pObjIndex->name = fread_string(fp); pObjIndex->short_descr = fread_string(fp); pObjIndex->description = fread_string(fp); pObjIndex->material = fread_string(fp); pObjIndex->item_type = item_lookup(fread_word(fp)); pObjIndex->extra_flags = fread_flag(fp); pObjIndex->wear_flags = fread_flag(fp); switch (pObjIndex->item_type) { case ITEM_WEAPON: pObjIndex->value[0] = weapon_type(fread_word(fp)); pObjIndex->value[1] = fread_number(fp); pObjIndex->value[2] = fread_number(fp); pObjIndex->value[3] = attack_lookup(fread_word(fp)); pObjIndex->value[4] = fread_flag(fp); break; case ITEM_CONTAINER: pObjIndex->value[0] = fread_number(fp); pObjIndex->value[1] = fread_flag(fp); pObjIndex->value[2] = fread_number(fp); pObjIndex->value[3] = fread_number(fp); pObjIndex->value[4] = fread_number(fp); break; case ITEM_DRINK_CON: case ITEM_FOUNTAIN: pObjIndex->value[0] = fread_number(fp); pObjIndex->value[1] = fread_number(fp); pObjIndex->value[2] = liq_lookup(fread_word(fp)); pObjIndex->value[3] = fread_number(fp); pObjIndex->value[4] = fread_number(fp); break; case ITEM_WAND: case ITEM_STAFF: pObjIndex->value[0] = fread_number(fp); pObjIndex->value[1] = fread_number(fp); pObjIndex->value[2] = fread_number(fp); pObjIndex->value[3] = skill_lookup(fread_word(fp)); pObjIndex->value[4] = fread_number(fp); break; case ITEM_POTION: case ITEM_PILL: case ITEM_SCROLL: pObjIndex->value[0] = fread_number(fp); pObjIndex->value[1] = skill_lookup(fread_word(fp)); pObjIndex->value[2] = skill_lookup(fread_word(fp)); pObjIndex->value[3] = skill_lookup(fread_word(fp)); pObjIndex->value[4] = skill_lookup(fread_word(fp)); break; default: pObjIndex->value[0] = fread_flag(fp); 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; } pObjIndex->level = fread_number(fp); pObjIndex->weight = fread_number(fp); pObjIndex->cost = fread_number(fp); /* 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 = 0; 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->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->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 { 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; /* OLC */ assign_area_vnum(vnum); /* OLC */ } return; }
/* * Snarf an obj section. new style */ void load_objects ( FILE *fp ) { ItemData *pObjIndex; if ( !area_last ) { /* OLC */ log_hd ( LOG_ERROR, "Load_objects: no #AREA seen yet." ); exit ( 1 ); } while ( true ) { int vnum; char letter; int iHash; letter = fread_letter ( fp ); if ( letter != '#' ) { log_hd ( LOG_ERROR, "Load_objects: # not found." ); exit ( 1 ); } vnum = fread_number ( fp ); if ( vnum == 0 ) { break; } fBootDb = FALSE; if ( get_obj_index ( vnum ) != NULL ) { log_hd ( LOG_ERROR, Format ( "Load_objects: vnum %d duplicated.", vnum ) ); exit ( 1 ); } fBootDb = TRUE; ALLOC_DATA ( pObjIndex, ItemData, 1 ); pObjIndex->vnum = vnum; pObjIndex->area = area_last; /* OLC */ pObjIndex->new_format = TRUE; pObjIndex->reset_num = 0; newobjs++; pObjIndex->name = fread_string ( fp ); pObjIndex->short_descr = fread_string ( fp ); pObjIndex->description = fread_string ( fp ); CHECK_POS ( pObjIndex->item_type, item_lookup ( fread_word ( fp ) ), "item_type" ); pObjIndex->extra_flags = fread_flag ( fp ); pObjIndex->wear_flags = fread_flag ( fp ); pObjIndex->material_flags = fread_flag ( fp ); switch ( pObjIndex->item_type ) { case ITEM_WEAPON: pObjIndex->value[0] = weapon_type ( fread_word ( fp ) ); pObjIndex->value[1] = fread_number ( fp ); pObjIndex->value[2] = fread_number ( fp ); pObjIndex->value[3] = attack_lookup ( fread_word ( fp ) ); pObjIndex->value[4] = fread_flag ( fp ); break; case ITEM_CONTAINER: pObjIndex->value[0] = fread_number ( fp ); pObjIndex->value[1] = fread_flag ( fp ); pObjIndex->value[2] = fread_number ( fp ); pObjIndex->value[3] = fread_number ( fp ); pObjIndex->value[4] = fread_number ( fp ); break; case ITEM_DRINK_CON: case ITEM_FOUNTAIN: pObjIndex->value[0] = fread_number ( fp ); pObjIndex->value[1] = fread_number ( fp ); CHECK_POS ( pObjIndex->value[2], liq_lookup ( fread_word ( fp ) ), "liq_lookup" ); pObjIndex->value[3] = fread_number ( fp ); pObjIndex->value[4] = fread_number ( fp ); break; case ITEM_WAND: case ITEM_STAFF: pObjIndex->value[0] = fread_number ( fp ); pObjIndex->value[1] = fread_number ( fp ); pObjIndex->value[2] = fread_number ( fp ); pObjIndex->value[3] = skill_lookup ( fread_word ( fp ) ); pObjIndex->value[4] = fread_number ( fp ); break; case ITEM_POTION: case ITEM_PILL: case ITEM_SCROLL: pObjIndex->value[0] = fread_number ( fp ); pObjIndex->value[1] = skill_lookup ( fread_word ( fp ) ); pObjIndex->value[2] = skill_lookup ( fread_word ( fp ) ); pObjIndex->value[3] = skill_lookup ( fread_word ( fp ) ); pObjIndex->value[4] = skill_lookup ( fread_word ( fp ) ); break; default: pObjIndex->value[0] = fread_flag ( fp ); 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; } pObjIndex->level = fread_number ( fp ); pObjIndex->weight = fread_number ( fp ); pObjIndex->cost = fread_number ( fp ); /* 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 = 0; break; default: pObjIndex->condition = 100; break; } while ( true ) { char letter; letter = fread_letter ( fp ); if ( letter == 'A' ) { Affect *paf; ALLOC_DATA ( paf, Affect, 1 ); 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->next = pObjIndex->affected; pObjIndex->affected = paf; top_affect++; } else if ( letter == 'F' ) { Affect *paf; ALLOC_DATA ( paf, Affect, 1 ); 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: log_hd ( LOG_ERROR, "Load_objects: Bad where on flag set." ); 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->next = pObjIndex->affected; pObjIndex->affected = paf; top_affect++; } else if ( letter == 'E' ) { DescriptionData *ed; ALLOC_DATA ( ed, DescriptionData, 1 ); ed->keyword = fread_string ( fp ); ed->description = fread_string ( fp ); ed->next = pObjIndex->extra_descr; pObjIndex->extra_descr = ed; top_ed++; } else if ( letter == 'R' ) { pObjIndex->requirements[SIZ_REQ] = fread_number ( fp ); pObjIndex->requirements[STR_REQ] = fread_number ( fp ); pObjIndex->requirements[DEX_REQ] = fread_number ( fp ); pObjIndex->requirements[CON_REQ] = fread_number ( fp ); pObjIndex->requirements[INT_REQ] = fread_number ( fp ); pObjIndex->requirements[WIS_REQ] = fread_number ( fp ); } else if ( letter == 'L' ) { pObjIndex->repop_percent = fread_number ( fp ); } else { 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; /* OLC */ assign_area_vnum ( vnum ); /* OLC */ } return; }