/*************************************************************************** * char_cmp_sex ***************************************************************************/ bool char_cmp_sex(struct char_data *vch, const char *arg, struct buf_type *buf) { if (buf != NULL) { char flag[MAX_STRING_LENGTH]; int col = 0; int iter; add_buf(buf, "search by a mob's gender.\n\r"); add_buf(buf, "available sexs:\n\r"); add_buf(buf, "\n\r "); for (iter = 0; sex_table[iter].name != NULL; iter++) { sprintf(flag, "%-19.18s", sex_table[iter].name); add_buf(buf, flag); if (++col % 3 == 0) add_buf(buf, "\n\r "); } if (col % 3 != 0) add_buf(buf, "\n\r"); return false; } while (isspace((int)*arg) || arg[0] == '=') arg++; return vch->sex == sex_lookup(arg); }
void load_mobiles(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->long_descr_orig = 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->alignment = fread_number(fp); pMobIndex->group = 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); 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->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 (letter == 'M') { MPROG_LIST *pMprog; char *word; int trigger = 0; pMprog = alloc_perm(sizeof(*pMprog)); word = fread_word(fp); if (!(trigger = flag_lookup(word, mprog_flags))) { bug("MOBprogs: invalid trigger.", 0); exit(1); } SET_BIT(pMobIndex->mprog_flags, trigger); pMprog->trig_type = trigger; pMprog->vnum = fread_number(fp); pMprog->trig_phrase = fread_string(fp); pMprog->next = pMobIndex->mprogs; pMobIndex->mprogs = pMprog; } else { 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; /* OLC */ assign_area_vnum(vnum); /* OLC */ kill_table[URANGE(0, pMobIndex->level, MAX_LEVEL - 1)].number++; } return; }