shadow/
shadow/data/command/
shadow/data/help/
shadow/data/religion/
shadow/data/skill/
/****************************************************************************
 *  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;
}