/**************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, 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 * ***************************************************************************/ #if defined(macintosh) #include <types.h> #elif defined(WIN32) #include <sys/types.h> #include <time.h> #define NOCRYPT #else #include <sys/types.h> #include <sys/time.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include "merc.h" #include "interp.h" #include "magic.h" #include "recycle.h" #include "tables.h" #include "lookup.h" #include "olc.h" #include "db.h" #include "const.h" #define DIF(a,b) (~((~a)|(b))) /*stuff to set up key*/ #if defined(KEY) #undef KEY #endif #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) if ( !str_cmp( string, literal ) ) { field = value; fMatch = TRUE; break; } void fread_mobiles( FILE *fp ) { char buf[MSL]; for ( ;; ) { char letter; char *word; letter = fread_letter( fp ); if ( letter == '*' ) { fread_to_eol( fp ); continue; } if ( letter != '#' ) { bug( "Load_mobiles: # not found.", 0 ); break; } word = fread_word( fp ); if ( !str_cmp( word, "END" ) ) { sprintf(buf,"#END found\n\n" ); append_new_save(NEW_SAVE_TEST,buf); return; } else if ( !str_cmp( word, "MOB" ) ) { sprintf(buf,"#MOB found" ); append_new_save(NEW_SAVE_TEST,buf); fread_one_mobile( fp ); continue; } } } /* * Snarf a mob section. new style */ void fread_one_mobile( FILE *fp ) { MOB_INDEX_DATA *pMI; const char *string; char buf[MSL]; bool fMatch; long iHash; long vector; CREATE( pMI, MOB_INDEX_DATA, 1 ); for ( ; ; ) { string = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(string[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Aggression", pMI->aggression, fread_number( fp ) ); KEY( "Align", pMI->alignment, fread_number( fp )); if (!str_cmp(string,"Armor")) { /* read armor klass */ pMI->ac[AC_PIERCE] = fread_number( fp ) * 10; pMI->ac[AC_BASH] = fread_number( fp ) * 10; pMI->ac[AC_SLASH] = fread_number( fp ) * 10; pMI->ac[AC_EXOTIC] = fread_number( fp ) * 10; } if (!str_cmp(string,"Act_flags")) { pMI->act = fread_flag( fp ) | ACT_IS_NPC | race_table[pMI->race].act; } if (!str_cmp(string, "Aff")) { pMI->affected_by = fread_flag( fp ) | race_table[pMI->race].aff; } break; case 'C': KEY( "Clevel", pMI->cast_level, fread_number( fp ) ); KEY( "Cability", pMI->cast_ability, fread_number( fp ) ); break; case 'D': KEY( "Dam_type", pMI->dam_type, attack_lookup(fread_word(fp))); KEY( "Default_pos", pMI->default_pos, position_lookup(fread_word(fp))); KEY( "Description", pMI->description, fread_string( fp )); if (!str_cmp(string,"Dam_dice")) { /* read damage dice */ pMI->damage[DICE_NUMBER] = fread_number( fp ); fread_letter( fp ); pMI->damage[DICE_TYPE] = fread_number( fp ); fread_letter( fp ); pMI->damage[DICE_BONUS] = fread_number( fp ); } break; case 'E': if ( !str_cmp( string, "EndMOB" ) ) { pMI->area = area_last; /* OLC */ sprintf(buf,"EndMob %d\n",pMI->vnum); iHash = pMI->vnum % MAX_KEY_HASH; pMI->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMI; top_mob_index++; top_vnum_mob = top_vnum_mob < pMI->vnum ? pMI->vnum : top_vnum_mob; /* OLC */ assign_area_vnum( pMI->vnum ); /* OLC */ append_new_save(NEW_SAVE_TEST,buf); get_mob_index(pMI->vnum); return; } case 'F': if (!str_prefix(string,"Fact")) { vector = fread_flag(fp); REMOVE_BIT(pMI->act,vector); } if (!str_prefix(string,"Faff1")) { vector = fread_flag(fp); REMOVE_BIT(pMI->affected_by,vector); } if (!str_prefix(string,"Foff")) { vector = fread_flag(fp); REMOVE_BIT(pMI->off_flags,vector); } if (!str_prefix(string,"Fimm")) { vector = fread_flag(fp); REMOVE_BIT(pMI->imm_flags,vector); } if (!str_prefix(string,"Fres")) { vector = fread_flag(fp); REMOVE_BIT(pMI->res_flags,vector); } if (!str_prefix(string,"Fvul")) { vector = fread_flag(fp); REMOVE_BIT(pMI->vuln_flags,vector); } if (!str_prefix(string,"Ffor")) { vector = fread_flag(fp); REMOVE_BIT(pMI->form,vector); } if (!str_prefix(string,"Fpar")) { vector = fread_flag(fp); REMOVE_BIT(pMI->parts,vector); } if (!str_cmp(string,"Form")) { pMI->form = fread_flag( fp ) | race_table[pMI->race].form; } break; case 'G': KEY( "Group", pMI->group, fread_number( fp )); break; case 'H': KEY( "Hitroll", pMI->hitroll, fread_number( fp )); if (!str_cmp(string,"Hit_dice")) { /* read hit dice */ pMI->hit[DICE_NUMBER] = fread_number( fp ); /* 'd' */ fread_letter( fp ); pMI->hit[DICE_TYPE] = fread_number( fp ); /* '+' */ fread_letter( fp ); pMI->hit[DICE_BONUS] = fread_number( fp ); } break; case 'I': if (!str_cmp(string,"Imm")) { pMI->imm_flags = fread_flag( fp ) | race_table[pMI->race].imm; } break; case 'L': KEY( "Level", pMI->level, fread_number( fp )); KEY( "Long", pMI->long_descr, fread_string( fp )); break; case 'M': if (!str_cmp(string,"Mana_dice")) { /* read mana dice */ pMI->mana[DICE_NUMBER] = fread_number( fp ); fread_letter( fp ); pMI->mana[DICE_TYPE] = fread_number( fp ); fread_letter( fp ); pMI->mana[DICE_BONUS] = fread_number( fp ); } KEY( "Material", pMI->material, str_dup(fread_word( fp ))); if (!str_cmp(string,"MobTrig")) { 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 )) ) { bug("MOBprogs: invalid trigger.",0); exit(1); } SET_BIT( pMI->mprog_flags, trigger ); pMprog->trig_type = trigger; pMprog->vnum = fread_number( fp ); pMprog->trig_phrase = fread_string( fp ); pMprog->next = pMI->mprogs; pMI->mprogs = pMprog; } break; case 'N': KEY( "Name", pMI->player_name, fread_string( fp )); break; case 'O': if (!str_cmp(string,"Off")) { pMI->off_flags = fread_flag( fp ) | race_table[pMI->race].off; } break; case 'P': if (!str_cmp(string,"Parts")) { pMI->parts = fread_flag( fp ) | race_table[pMI->race].parts; } break; case 'R': KEY( "Race", pMI->race, race_lookup(fread_string( fp ))); if (!str_cmp(string,"Res")) { pMI->res_flags = fread_flag( fp ) | race_table[pMI->race].res; } break; case 'S': KEY( "Short", pMI->short_descr, fread_string( fp )); KEY( "Start_pos", pMI->start_pos, position_lookup(fread_word(fp))); KEY( "Sex", pMI->sex, sex_lookup(fread_word(fp))); if (!str_cmp(string,"Size")) { CHECK_POS( pMI->size, size_lookup(fread_word(fp)), "size" ); } break; case 'V': if (!str_cmp(string,"Vuln")) { pMI->vuln_flags = fread_flag( fp ) | race_table[pMI->race].vuln; } if (!str_cmp( string, "Vnum")) { pMI->vnum = fread_number( fp ); sprintf(buf,"mob->vnum %d",pMI->vnum); append_new_save(NEW_SAVE_TEST,buf); pMI->new_format = TRUE; } break; case 'W': KEY( "Wealth", pMI->wealth, fread_number( fp )); break; case 'X': KEY( "Xp_tolevel", pMI->xp_tolevel, fread_number( fp ) ); break; break; } } return; }