/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@falcon.mercer.peachnet.edu 
MUD++ development mailing list    mudpp-list@spice.com
------------------------------------------------------------------------------
npc.cc
*/

#include "string.h"
#include "llist.h"
#include "room.h"
#include "indexable.h"
#include "repop.h"
#include "area.h"
#include "npc.h"
#include "global.h"

const bitType npc_bit_list[] =
{
	{"undefined",	NPC_UNDEFINED	},
	{"unused-bit1",	NPC_UNUSED1		},
	{"wimpy",		NPC_WIMPY		},
	{"aggressive",	NPC_AGGRESSIVE	},
	{"sentinel",	NPC_SENTINEL	},
	{"stayzone",	NPC_STAY_ZONE	},
	{"scavenger",	NPC_SCAVENGER	},
	{"friendly",	NPC_FRIENDLY	},
	{"tame",		NPC_TAME		},
	{"charmed",		NPC_CHARMED		},
	{"banker",		NPC_BANKER		},
	{"trainer",		NPC_TRAINER		},
	{"guildmaster",	NPC_PRACTICER	},
	{0,	0}
};


NPC::~NPC()
{
	if( repop )
		repop->setPtr( 0 );
}


void NPC::out( const char * )
{

}


void NPC::fromWorld()
{
	npcs.remove( this );
}


void NPC::toWorld()
{
	npcs.add( this );
}


// will change to readProtoFrom

int NPC::readFrom( InFile &in )
{
	char buf[ BUF ];
	if( *in.getword( buf ) != '{' )
		in.error("NPC::readFrom() - expected '{'" );
//	index = in.getword( buf );
	setName( in.getstring( buf ) ); 
	setShort( in.getstring( buf ) );
	setLong( in.getstring( buf ) ); 
	/*obj_flags = */ in.getnum();
	/*char_flags = */ in.getnum();
	/*mob_flags  =*/ in.getnum();
	weight = in.getnum();
	exp = in.getnum();
	gold = in.getnum();
	silver = in.getnum();
	copper = in.getnum();
	hp = max_hp = in.getnum();
	mana = max_mana = in.getnum();
	/* */ in.getnum();

	if( *in.getword( buf ) != '}' )
		in.error("NPC::readFrom() - expected '}'" );
	return 1;
}


// will change to writeProtoTo

int NPC::writeTo( OutFile &out ) const
{
	out << '{' << endl;
//	out << index << endl;
	out << name << TERM_CHAR << endl;
	out << shortdesc << TERM_CHAR << endl;
	out << longdesc << TERM_CHAR << endl;
	out << 0 <<' '<< char_bits[0] <<' '<< npc_bits[0] <<' ';
	out << weight <<' '<< exp <<' '<< gold <<' '<< silver <<' '<< copper << endl;
	out << max_hp <<' '<< max_mana <<' '<< 0 << endl;
	out << '}' << endl;
	return 1;
}


void NPC::look( Object * )
{
}


void NPC::look( Char * )
{
}

void NPC::pulse()
{
}


NPC * lookupNPC( const Index & x )
{
	NPC *npc;
	Area *area;
	LList<Area> tlist = areas;
	tlist.reset();

	while( ( area = tlist.peek() ) )
	{
		tlist.next();

		if( !x.getScope() )
			if( ( npc = area->lookupNPC( x ) ) )
				return npc;

		if( area->getKey() == x.getScope() )
			break;
	}

	if( area )
		return area->lookupNPC( x );
	return 0;
}


NPC * lookupNPC( const String & x )
{
	return lookupNPC( Index( x ) );
}


NPC * lookupNPC( const char * x )
{
	return lookupNPC( Index( x ) );
}