/*************************************************************************** * OBLIVION 1.2 is copyright by Wes Wagner August, 1996 * * by using this code you have agreed to the terms of the Oblivion License* **************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include "merc.h" #include "db.h" #include "recycle.h" #include "music.h" #include "lookup.h" /*Global Variables*/ CRITICAL_DATA critical_table[MAX_DAMAGE_TYPE+1][15][5]; MOOT_DATA *moot; /* Local functions */ CEFFECT_DATA *new_ceffect ( void ); char strCrit[MAX_INPUT_LENGTH]; FILE * fpCrit; sh_int fpDam; int top_rs; void load_criticals(void) { FILE *fpList; char buf[MAX_STRING_LENGTH]; int i,j,k,l; for(i=0; i<MAX_DAMAGE_TYPE+1; i++) for(j=0; j<15; j++) for(k=0; k<5; k++) { critical_table[i][j][k].act_to_victim="\0"; critical_table[i][j][k].act_to_room="\0"; critical_table[i][j][k].act_to_actor="\0"; for(l=0; l<3; l++) critical_table[i][j][k].victim_effects[l]=NULL; critical_table[i][j][k].actor_effects=NULL; } if ( ( fpList = fopen( CRITICAL_LIST, "r" ) ) == NULL ) { perror( CRITICAL_LIST ); exit( 1 ); } for ( ; ; ) { strcpy( strCrit, fread_word( fpList ) ); if ( strCrit[0] == '$' ) break; fpDam=fread_number( fpList ); sprintf(buf, "%s%s", CRITICAL_DIR, strCrit); log_string(buf); if ( ( fpCrit = fopen( buf, "r" ) ) == NULL ) { perror( strCrit ); exit( 1 ); } for(k=0; k<5; k++) for(j=0;j<15;j++) { critical_table[fpDam][j][k].act_to_victim=fread_string(fpCrit); critical_table[fpDam][j][k].act_to_room=fread_string(fpCrit); critical_table[fpDam][j][k].act_to_actor=fread_string(fpCrit); for(l=0; l<3; l++) { critical_table[fpDam][j][k].victim_effects[l]=new_ceffect(); critical_table[fpDam][j][k].victim_effects[l]->sn= skill_lookup(fread_word(fpCrit)); critical_table[fpDam][j][k].victim_effects[l]->aply= fread_number(fpCrit); critical_table[fpDam][j][k].victim_effects[l]->modifier= fread_number(fpCrit); critical_table[fpDam][j][k].victim_effects[l]->duration= fread_number(fpCrit); critical_table[fpDam][j][k].victim_effects[l]->stun_for= fread_number(fpCrit); critical_table[fpDam][j][k].victim_effects[l]->mortal_in= fread_number(fpCrit); critical_table[fpDam][j][k].victim_effects[l]->additional_damage= fread_number(fpCrit); critical_table[fpDam][j][k].victim_effects[l]->additional_mana_loss= fread_number(fpCrit); critical_table[fpDam][j][k].victim_effects[l]->hps_per_turn= fread_number(fpCrit); } critical_table[fpDam][j][k].actor_effects=new_ceffect(); critical_table[fpDam][j][k].actor_effects->sn=skill_lookup(fread_word(fpCrit)); critical_table[fpDam][j][k].actor_effects->aply=fread_number(fpCrit); critical_table[fpDam][j][k].actor_effects->modifier=fread_number(fpCrit); critical_table[fpDam][j][k].actor_effects->duration=fread_number(fpCrit); critical_table[fpDam][j][k].actor_effects->stun_for=fread_number(fpCrit); critical_table[fpDam][j][k].actor_effects->mortal_in=fread_number(fpCrit); critical_table[fpDam][j][k].actor_effects->additional_damage=fread_number(fpCrit); critical_table[fpDam][j][k].actor_effects->additional_mana_loss=fread_number(fpCrit); critical_table[fpDam][j][k].actor_effects->hps_per_turn=fread_number(fpCrit); log_string("Critical loaded."); } fclose(fpCrit); } fclose(fpList); return ; } CEFFECT_DATA *new_ceffect(void) { CEFFECT_DATA *af; af=alloc_perm(sizeof(*af)); return af; } /* * Snarf a room section. */ void load_rooms_two( FILE *fp ) { ROOM_INDEX_DATA *pRoomIndex; if ( area_last == NULL ) { bug( "Load_resets: no #AREA seen yet.", 0 ); exit( 1 ); } for ( ; ; ) { sh_int vnum; char letter; int door; int iHash; letter = fread_letter( fp ); if ( letter != '#' ) { bug( "Load_rooms: # not found.", 0 ); exit( 1 ); } vnum = fread_number( fp ); if ( vnum == 0 ) break; fBootDb = FALSE; if ( get_room_index( vnum ) != NULL ) { bug( "Load_rooms: vnum %d duplicated.", vnum ); exit( 1 ); } fBootDb = TRUE; pRoomIndex = alloc_perm( sizeof(*pRoomIndex) ); pRoomIndex->owner = str_dup(""); pRoomIndex->people = NULL; pRoomIndex->contents = NULL; pRoomIndex->extra_descr = NULL; pRoomIndex->area = area_last; pRoomIndex->vnum = vnum; pRoomIndex->name = fread_string( fp ); pRoomIndex->description = fread_string( fp ); /* Area number */ fread_number( fp ); pRoomIndex->room_flags = fread_flag( fp ); /* horrible hack */ if ( 3000 <= vnum && vnum < 3400) SET_BIT(pRoomIndex->room_flags,ROOM_LAW); pRoomIndex->sector_type = fread_number( fp ); pRoomIndex->light = 0; for ( door = 0; door <= 9; door++ ) pRoomIndex->exit[door] = NULL; /* defaults */ pRoomIndex->heal_rate = 100; pRoomIndex->mana_rate = 100; for ( ; ; ) { letter = fread_letter( fp ); if ( letter == 'S' ) break; if ( letter == 'H') /* healing room */ pRoomIndex->heal_rate = fread_number(fp); else if ( letter == 'M') /* mana room */ pRoomIndex->mana_rate = fread_number(fp); else if ( letter == 'C') /* clan */ { if (pRoomIndex->clan) { bug("Load_rooms: duplicate clan fields.",0); exit(1); } pRoomIndex->clan = clan_lookup(fread_string(fp)); } else if ( letter == 'D' ) { EXIT_DATA *pexit; door = fread_number( fp ); if ( door < 0 || door > MAX_DOORS ) { bug( "Fread_rooms: vnum %d has bad door number.", vnum ); exit( 1 ); } pexit = alloc_perm( sizeof(*pexit) ); pexit->description = fread_string( fp ); pexit->keyword = fread_string( fp ); pexit->rs_flags = fread_flag( fp ); pexit->key = fread_number( fp ); pexit->u1.vnum = fread_number( fp ); pexit->orig_door = door; /* OLC */ pexit->exit_info=pexit->rs_flags; pRoomIndex->exit[door] = pexit; pRoomIndex->old_exit[door] = pexit; top_exit++; } 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 = pRoomIndex->extra_descr; pRoomIndex->extra_descr = ed; top_ed++; } else if (letter == 'O') { if (pRoomIndex->owner[0] != '\0') { bug("Load_rooms: duplicate owner.",0); exit(1); } pRoomIndex->owner = fread_string(fp); } else if ( letter == 'F' ) { ROOM_SPEC_DATA *rs; rs = alloc_perm( sizeof(*rs) ); rs->lowhour = fread_number( fp ); rs->highhour = fread_number( fp ); rs->lowroll = fread_number( fp ); rs->highroll = fread_number( fp ); rs->special = fread_string( fp ); rs->next = pRoomIndex->spec_data; pRoomIndex->spec_data = rs; top_rs++; } else { bug( "Load_rooms: vnum %d has flag not 'DES'.", vnum ); exit( 1 ); } } iHash = vnum % MAX_KEY_HASH; pRoomIndex->next = room_index_hash[iHash]; room_index_hash[iHash] = pRoomIndex; top_room++; top_vnum_room = top_vnum_room < vnum ? vnum : top_vnum_room; /* OLC */ assign_area_vnum( vnum ); /* OLC */ } return; } /* * Snarf a mob section. new style */ void load_mobiles_two( FILE *fp ) { MOB_INDEX_DATA *pMobIndex; 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 */ pMobIndex->new_format = TRUE; 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->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->tendency = fread_number( fp ); pMobIndex->alliance = fread_number( fp ); pMobIndex->xp_mod = 100 ; pMobIndex->level = fread_number( fp ); pMobIndex->hitroll = fread_number( fp ); /* 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 ); pMobIndex->hit[DICE_NUMBER]=pMobIndex->hit[DICE_TYPE]=1; pMobIndex->hit[DICE_BONUS] = 6*pMobIndex->level ; /* 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; /* 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)); pMobIndex->wealth = fread_number( fp ); if(pMobIndex->wealth > pMobIndex->level*10) pMobIndex->wealth=pMobIndex->level*10; pMobIndex->form = fread_flag( fp ) | race_table[pMobIndex->race].form; pMobIndex->parts = fread_flag( fp ) | race_table[pMobIndex->race].parts; /* size */ pMobIndex->size = size_lookup(fread_word(fp)); pMobIndex->material = str_dup(fread_word( fp )); 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->affected_by,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 { ungetc(letter,fp); break; } } iHash = vnum % MAX_KEY_HASH; pMobIndex->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMobIndex; top_mob_index++; kill_table[URANGE(0, pMobIndex->level, MAX_LEVEL-1)].number++; } return; } /* * Snarf an obj section. new style */ void load_objects_two( 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] = weapontype(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; } pObjIndex->absolute_size = fread_number(fp); pObjIndex->relative_size = fread_number(fp); pObjIndex->class_restriction = 0 ; 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++; if(paf->location==1) paf->modifier=paf->modifier*2; else if(paf->location==2) { paf->modifier=paf->modifier*2; paf->location=APPLY_RE; } else if(paf->location==3) { paf->modifier=paf->modifier*2; paf->location=APPLY_ME; } else if(paf->location==4) { paf->modifier=paf->modifier*2; paf->location=APPLY_QU; } else if(paf->location==5) { paf->modifier=paf->modifier*2; paf->location=APPLY_CO; } else if(paf->location==APPLY_HIT) { paf->modifier=paf->modifier/3; } } 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++; } return; } void load_mobiles_three( FILE *fp ) { MOB_INDEX_DATA *pMobIndex; 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 */ pMobIndex->new_format = TRUE; 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->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->tendency = fread_number( fp ); pMobIndex->alliance = fread_number( fp ); pMobIndex->xp_mod = fread_number( fp ); pMobIndex->level = fread_number( fp ); pMobIndex->hitroll = fread_number( fp ); /* 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; /* 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)); pMobIndex->wealth = fread_number( fp ); if(pMobIndex->wealth > pMobIndex->level*10) pMobIndex->wealth=pMobIndex->level*10; pMobIndex->form = fread_flag( fp ) | race_table[pMobIndex->race].form; pMobIndex->parts = fread_flag( fp ) | race_table[pMobIndex->race].parts; /* size */ pMobIndex->size = size_lookup(fread_word(fp)); pMobIndex->material = str_dup(fread_word( fp )); 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->affected_by,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 { ungetc(letter,fp); break; } } iHash = vnum % MAX_KEY_HASH; pMobIndex->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMobIndex; top_mob_index++; kill_table[URANGE(0, pMobIndex->level, MAX_LEVEL-1)].number++; } return; } void load_objects_three( 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] = weapontype(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; } pObjIndex->absolute_size = fread_number(fp); pObjIndex->relative_size = fread_number(fp); pObjIndex->class_restriction = fread_flag(fp); 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++; } return; }