/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik Strfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * **************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * **************************************************************************/ #include <cstdio> #include <cstring> #include <cstdlib> #include <cctype> #include <ctime> #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include "merc.h" #include "db.h" #include "tables.h" #include "lookup.h" extern int flag_lookup args ((const char *name, const struct flag_type * flag_table)); /* values for db2.c */ //struct social_type social_table[MAX_SOCIALS]; //int social_count; /* snarf a socials file */ /*void load_socials (FILE * fp) { for (;;) { struct social_type social; char *temp; 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; #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; } */ /* * Snarf a mob section. new style */ 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 = (MOB_INDEX_DATA *) 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; #ifdef BIT_COMPILE STR_COPY_STR( pMobIndex->affected_by, aff_convert_fread_flag( fread_flag( fp ) ), AFF_FLAGS ); #else STR_COPY_STR( pMobIndex->affected_by, str_fread_flag( fp, AFF_FLAGS ), AFF_FLAGS ); #endif STR_OR_STR( pMobIndex->affected_by, race_table[pMobIndex->race].aff, AFF_FLAGS ); 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 Chi dice */ pMobIndex->chi[DICE_NUMBER] = fread_number (fp); /* 'd' */ fread_letter (fp); pMobIndex->chi[DICE_TYPE] = fread_number (fp); /* '+' */ fread_letter (fp); pMobIndex->chi[DICE_BONUS] = fread_number (fp); /* read Elemental dice */ pMobIndex->elemental[DICE_NUMBER] = fread_number (fp); /* 'd' */ fread_letter (fp); pMobIndex->elemental[DICE_TYPE] = fread_number (fp); /* '+' */ fread_letter (fp); pMobIndex->elemental[DICE_BONUS] = fread_number (fp); /* read Fae dice */ pMobIndex->fae[DICE_NUMBER] = fread_number (fp); /* 'd' */ fread_letter (fp); pMobIndex->fae[DICE_TYPE] = fread_number (fp); /* '+' */ fread_letter (fp); pMobIndex->fae[DICE_BONUS] = fread_number (fp); /* read Ley dice */ pMobIndex->ley[DICE_NUMBER] = fread_number (fp); /* 'd' */ fread_letter (fp); pMobIndex->ley[DICE_TYPE] = fread_number (fp); /* '+' */ fread_letter (fp); pMobIndex->ley[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 */ CHECK_POS (pMobIndex->size, size_lookup (fread_word (fp)), "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")) { FLAG vector[MAX_FLAGS]; #ifdef BIT_COMPILE STR_COPY_STR( vector, aff_convert_fread_flag( fread_flag( fp ) ), AFF_FLAGS ); STR_REMOVE_STR( pMobIndex->affected_by, vector, AFF_FLAGS ); #else STR_COPY_STR( vector, str_fread_flag(fp,AFF_FLAGS), AFF_FLAGS ); STR_REMOVE_STR( pMobIndex->affected_by, vector, AFF_FLAGS ); #endif } 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') { PROG_LIST *pMprog; char *word; int trigger = 0; pMprog = (PROG_LIST *) alloc_perm (sizeof (*pMprog)); word = fread_word (fp); if ((trigger = flag_lookup (word, mprog_flags)) == NO_FLAG) { 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; } /* * Snarf an obj section. new style */ void load_objects (FILE * fp) { OBJ_INDEX_DATA *pObjIndex; int w_type, i, j; 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 = (OBJ_INDEX_DATA *) 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); CHECK_POS (pObjIndex->item_type, item_lookup (fread_word (fp)), "item_type"); 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); 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] = fread_number (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] = fread_number (fp); pObjIndex->value[2] = fread_number (fp); pObjIndex->value[3] = fread_number (fp); pObjIndex->value[4] = fread_number (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; } //JH Added for weapons. if (pObjIndex->item_type == ITEM_WEAPON && !IS_OBJ_STAT(pObjIndex, ITEM_EXCEPTIONAL)) { w_type = pObjIndex->value[0] - 1; if (w_type < 0) w_type = 0; i = weapon_table[w_type].dice_start; j = pObjIndex->level / 10; j = static_cast<int>((float) j * weapon_table[w_type].dice_modifier); pObjIndex->value[1] = i + j; i = weapon_table[w_type].sides_start; j = pObjIndex->level / 10; j = static_cast<int>((float) j * weapon_table[w_type].sides_modifier); pObjIndex->value[2] = i + j; } for (;;) { char letter; letter = fread_letter (fp); if (letter == 'A') { AFFECT_DATA *paf; paf = (AFFECT_DATA *) 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 = (AFFECT_DATA *) 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); #ifdef BIT_COMPILE paf->bitvector = aff_bit_convert_fread_flag( fread_flag(fp) ); #else paf->bitvector = fread_number( fp ); #endif paf->next = pObjIndex->affected; pObjIndex->affected = paf; top_affect++; } else if (letter == 'E') { EXTRA_DESCR_DATA *ed; ed = (EXTRA_DESCR_DATA *) 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 ( letter == 'O' ) { PROG_LIST *pOprog; char *word; int trigger = 0; pOprog = (PROG_LIST *) alloc_perm(sizeof(*pOprog)); word = fread_word( fp ); if ( !(trigger = flag_lookup( word, oprog_flags )) ) { bug( "OBJprogs: invalid trigger.",0); exit(1); } SET_BIT( pObjIndex->oprog_flags, trigger ); pOprog->trig_type = trigger; pOprog->vnum = fread_number( fp ); pOprog->trig_phrase = fread_string( fp ); pOprog->next = pObjIndex->oprogs; pObjIndex->oprogs = pOprog; } 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; }