mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. 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@hom.net 
MUD++ development mailing list    mudpp@van.ml.org
------------------------------------------------------------------------------
npc.h
*/

#ifndef _NPC_H
#define _NPC_H

#include "char.h"

extern const bitType npc_bit_list[];

const int NPC_UNDEFINED		= 0;  // Dont use !
const int NPC_UNUSED1		= 1;
const int NPC_WIMPY			= 2;
const int NPC_AGGRESSIVE	= 3;
const int NPC_SENTINEL		= 4;
const int NPC_STAY_ZONE		= 5;
const int NPC_SCAVENGER		= 6;
const int NPC_FRIENDLY		= 7;
const int NPC_TAME			= 8;
const int NPC_CHARMED		= 9;
const int NPC_BANKER		= 10; 
const int NPC_TRAINER		= 11;
const int NPC_PRACTICER		= 12;

const int MAX_NPC_BIT_FIELDS	= 1;

inline int getNPCBit( const String & x )
{
	return lookupBit( npc_bit_list, x );
}

inline const char * getNPCBitName( int x )
{
	return lookupBitName( npc_bit_list, x );
}

class NPC : public Char
{
	private:
		static int total_count;
	protected:
		//Index index;
		unsigned long npc_bits[ MAX_NPC_BIT_FIELDS ];
		Repop *repop;

	public:
		NPC()
		:	repop(0)
		{
			total_count++;
			memset( npc_bits, 0, sizeof( npc_bits[0] ) * MAX_NPC_BIT_FIELDS );
		}

		NPC( const NPC & x )
		:	Char( x ),   // propagate up the hierarchy
			repop(0)
		{
			total_count++;
			memcpy( (void *)npc_bits, (void *)x.npc_bits,
								sizeof( npc_bits[0] ) * MAX_NPC_BIT_FIELDS );
		}

		virtual ~NPC();
		virtual vmtype getVMType() { return VMT_NPC; }
 
		bool isNPC() const { return true; }
		void setNPCBit( int x ) { SET_BIT( npc_bits, x ); }
		void clrNPCBit( int x ) { CLR_BIT( npc_bits, x ); }
		void toggleNPCBit( int x ) { TOGGLE_BIT( npc_bits, x ); }
		bool NPCBitSet( int x ) { return IS_SET( npc_bits, x ); }
		void out( const char * );
		void out( const String & x ) { NPC::out( x.chars() ); }
		virtual bool pulse();
		void extract();
		void fromWorld();
		void toWorld();
		void setRepop( Repop * x ) { repop = x; }
		Repop * getRepop() { return repop; }
		void readFrom_mainblock( StaticInput & );
		virtual bool readFrom_optionalblock( StaticInput & );
		int readFrom( StaticInput & );
		void writeTo_mainblock( Output & ) const;
		virtual void writeTo_optionalblock( Output & ) const;
		int writeTo( Output & ) const;
		void say( const String & ) {}
		void look( Object * );
		void look( Char * );
		void makeCorpse();
		virtual void describeItself( String &);

		static int getTotalCount() { return total_count; }
};

extern LList<NPC>	npcs;

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

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

#endif