area/
build/testing/
log/
player/
player/backup/
#include <glib.h>
#include <sys/types.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#include <merc.h>
#include <recycle.h>
#include <tables.h>

extern bool			fBootDb;

/*
 * Translates mob virtual number to its mob index struct.
 * Hash table lookup.
 */
MOB_INDEX_DATA *get_mob_index( int vnum )
{
	MOB_INDEX_DATA *pMobIndex;
	
	for ( pMobIndex  = mob_index_hash[vnum % MAX_KEY_HASH];
		pMobIndex != NULL;
		pMobIndex  = pMobIndex->next )
	{
		if ( pMobIndex->vnum == vnum )
			return pMobIndex;
	}
	
	if ( fBootDb )
	{
		bug( "Get_mob_index: bad vnum %d.", vnum );
		exit( 1 );
	}
	
	return NULL;
}
/*
 * Create an instance of a mobile.
 */
CHAR_DATA *create_mobile( MOB_INDEX_DATA *pMobIndex )
{
	CHAR_DATA *mob;
	int tempvalue = 0;
	
	if (pMobIndex == NULL){
		bug("Null pMobIndex used as a argument.",0);
		return NULL;
	}

	//DEBUG
	check_both("Call Create Mobile");
	
	mob = new_char();	

	mob->pIndexData		= pMobIndex;
	mob->hunting 		= g_string_assign(mob->hunting,"");
	mob->lord 		= g_string_assign(mob->lord,"");
	mob->clan		= 0;
	mob->morph 		= g_string_assign(mob->morph,"");
	mob->createtime 	= g_string_assign(mob->createtime,"");
	mob->lasttime 		= g_string_assign(mob->lasttime,"");
	mob->lasthost 		= g_string_assign(mob->lasthost,"");
	mob->powertype 		= g_string_assign(mob->powertype,"");
	mob->poweraction 	= g_string_assign(mob->poweraction,"");
	mob->pload 		= g_string_assign(mob->pload,"");
	mob->prompt 		= g_string_assign(mob->prompt,"");
	mob->cprompt 		= g_string_assign(mob->cprompt,"");
	mob->sect		= 0;
	mob->pk_sect		= 0;
	mob->id			= get_mob_id();
	mob->delay_timer	= 0;
	mob->pk_timer		= 0;
	mob->killed_by		= NULL;
	
	mob->name 		= g_string_assign(mob->name,pMobIndex->player_name);
	mob->short_descr 	= g_string_assign(mob->short_descr,pMobIndex->short_descr);
	mob->long_descr 	= g_string_assign(mob->long_descr,pMobIndex->long_descr);
	mob->description 	= g_string_assign(mob->description,pMobIndex->description);
	
	mob->spec_fun		= pMobIndex->spec_fun;
	
	mob->home		= 3001;
	mob->form		= 32767;
	mob->level		= number_fuzzy( pMobIndex->level );
	mob->act		= pMobIndex->act;
	mob->affected_by	= pMobIndex->affected_by;

	if (IS_SET(mob->affected_by,AFF_SHADOWPLANE))
		mob->plane		= PLANE_SHADOW;
	else
		mob->plane 		= PLANE_NORMAL;

	mob->alignment		= pMobIndex->alignment;
	mob->sex		= pMobIndex->sex;
	mob->added		= pMobIndex->added;
	mob->mob_fight		= pMobIndex->mob_fight;
	mob->sphere_spaffect	= pMobIndex->sphere_spaffect;
	mob->mob_con		= pMobIndex->mob_con;
	mob->mprog_target  	= NULL;
	
	mob->sphere_spaffect       = 0;
	mob->added                 = 0;
	mob->sphere_affected_by[0] = 0;
	mob->sphere_affected_by[1] = 0;
	mob->sphere_affected_by[2] = 0;
	mob->sphere_affected_by[3] = 0;
	
	mob->armor		= (pMobIndex->ac == 0) ?
		interpolate( mob->level, 100, -100 ):
		pMobIndex->ac;
	
	tempvalue		= mob->level * 8 + number_range(
			mob->level * mob->level / 4,
			mob->level * mob->level );
	
	
	if (pMobIndex->hitnodice == 0
		&&  pMobIndex->hitsizedice == 0
		&&  pMobIndex->hitplus == 0)
	{
		mob->max_hit	= tempvalue;
	}
	else
	{
		mob->max_hit    = dice(pMobIndex->hitnodice, pMobIndex->hitsizedice)
			+ pMobIndex->hitplus;
	}
	
	
	mob->hit		= mob->max_hit;
	
	mob->hitroll	= (pMobIndex->hitroll == 0) ?
		mob->level:
		pMobIndex->hitroll;
	
	
	if (pMobIndex->damnodice == 0
		&&  pMobIndex->damsizedice == 0
		&&  pMobIndex->damplus == 0)
	{
		mob->damroll	= mob->level;
	}
	else 
	{    
		mob->damroll    = dice(pMobIndex->damnodice, pMobIndex->damsizedice)
			+ pMobIndex->damplus;
	}
	/*
	 * Set the mobile stance here
	 */
	
	
/*
     * Insert in list.
     */
	
	mob->next		= char_list;
	char_list		= mob;
	pMobIndex->count++;
	
	//Add the total of mobiles to the list -- Spiral
	mudsetting->total_mobiles_created++;
	mudsetting->mobiles_created++;

	check_both("Call Create Mobile Finished");
	return mob;
}


void set_random_stance( CHAR_DATA *ch)
{
	/*
	 * this little jewl is cause I need to call it 2 times or more
	 */
	int num;
	char buf[MAX_STRING_LENGTH];
	
	num = number_range(1,10);
	ch->stance[num] = 200;
	ch->stance[0] = num;
	sprintf(buf,"%s", stance_msg_table[num].haunt);
	act(buf,ch,NULL,NULL,TO_ROOM);
	ch->pk_timer = 1;
	
}

void set_mob_stance ( CHAR_DATA *ch )
{
	char buf[MAX_STRING_LENGTH];
	switch ( ch->mob_fight )
	{
		case FIGHT_VIPER:
			ch->stance[0] = STANCE_VIPER;
			ch->stance[STANCE_VIPER] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_VIPER].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_CRANE:
			ch->stance[0] = STANCE_CRANE;
			ch->stance[STANCE_CRANE] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_CRANE].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_MONGOOSE:
			ch->stance[0] = STANCE_MONGOOSE;
			ch->stance[STANCE_MONGOOSE] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_MONGOOSE].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_BULL:
			ch->stance[0] = STANCE_BULL;
			ch->stance[STANCE_BULL] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_BULL].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_CRAB:
			ch->stance[0] = STANCE_CRAB;
			ch->stance[STANCE_CRAB] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_CRAB].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_MANTIS:
			ch->stance[0] = STANCE_MANTIS;
			ch->stance[STANCE_MANTIS] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_MANTIS].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_TIGER:
			ch->stance[0] = STANCE_TIGER;
			ch->stance[STANCE_TIGER] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_TIGER].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_DRAGON:
			ch->stance[0] = STANCE_DRAGON;
			ch->stance[STANCE_DRAGON] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_DRAGON].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_MONKEY:
			ch->stance[0] = STANCE_MONKEY;
			ch->stance[STANCE_MONKEY] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_MONKEY].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_SWALLOW:
			ch->stance[0] = STANCE_SWALLOW;
			ch->stance[STANCE_SWALLOW] = 200;
			sprintf(buf,"%s", stance_msg_table[STANCE_SWALLOW].haunt);
			act(buf,ch,NULL,NULL,TO_ROOM);
			break;
			
		case FIGHT_RANDOM:
			set_random_stance(ch);
			break;
			
		case FIGHT_MASTER:
			set_master_stance(ch);
			break;
			
		default:
			break;
	}	
}
void set_master_stance ( CHAR_DATA *ch )
{
	CHAR_DATA *victim;
	char buf2[MAX_STRING_LENGTH];
	
	victim = ch->fighting;
	
	if ( victim == NULL )
		return;
	
	if ( ch->in_room == NULL )
		return;
	
	switch ( victim->stance[0] )
	{
		default:
			ch->stance[0] = STANCE_DRAGON;
			ch->stance[STANCE_DRAGON] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_DRAGON].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_VIPER:
			ch->stance[0] = STANCE_VIPER;
			ch->stance[STANCE_VIPER] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_VIPER].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_CRANE:
			ch->stance[0] = STANCE_CRANE;
			ch->stance[STANCE_CRANE] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_CRANE].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_MONGOOSE:
			ch->stance[0] = STANCE_MANTIS;
			ch->stance[STANCE_MANTIS] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_MANTIS].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_BULL:
			ch->stance[0] = STANCE_MANTIS;
			ch->stance[STANCE_MANTIS] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_MANTIS].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_CRAB:
			ch->stance[0] = STANCE_MANTIS;
			ch->stance[STANCE_MANTIS] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_MANTIS].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_MANTIS:
			ch->stance[0] = STANCE_MANTIS;
			ch->stance[STANCE_MANTIS] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_MANTIS].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_TIGER:
			ch->stance[0] = STANCE_DRAGON;
			ch->stance[STANCE_DRAGON] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_DRAGON].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_DRAGON:
			ch->stance[0] = STANCE_SWALLOW;
			ch->stance[STANCE_SWALLOW] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_SWALLOW].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_MONKEY:
			ch->stance[0] = STANCE_MONKEY;
			ch->stance[STANCE_MONKEY] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_MONKEY].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
			
		case STANCE_SWALLOW:
			ch->stance[0] = STANCE_MANTIS;
			ch->stance[STANCE_MANTIS] = 200;
			sprintf(buf2,"%s", stance_msg_table[STANCE_MANTIS].haunt);
			act(buf2,ch,NULL,victim,TO_ROOM);
			break;
	}
	
	return;
}