SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 * ------------------------------------------------------------------------ *
 *			    Mobiles Interface file										*
 ****************************************************************************/

#ifndef	MOBILES_H
#define	MOBILES_H

#include	"ActFlags.h"
#include	"Affect.h"
#include	"Attack.h"
#include	"Defense.h"

// Prototype for a mob.
// This is the in-memory version of #MOBILES.
#ifdef _DEBUG
class CMobIndexData : public CObject {
public:
			CMobIndexData (int v)
			{ ClearAddrRange (&m_pNext, &saving_spell_staff,
			  sizeof (saving_spell_staff)); vnum = v; }

	virtual void	Dump (CDumpContext& dc) const;
#else
class CMobIndexData {
public:
			CMobIndexData (int v)
			{ ClearAddrRange (&m_pNext, &saving_spell_staff,
			  sizeof (saving_spell_staff)); vnum = v; }
#endif

			~CMobIndexData ();

	CMobIndexData	*GetNext () { return m_pNext; }
	void			SetNext (CMobIndexData* n) { m_pNext = n; }

	void	Clear ();
	void	Read (FILE *fp);
	void	Write (FILE* fp);
	void	ReadPrograms (FILE *fp);

	char	*GetPlayerName () { return m_pPlayerName; }
	void	SetPlayerName (char* n) { m_pPlayerName = n; }
	char	*GetShortDescr () { return m_pShortDescr; }
	void	SetShortDescr (char* d) { m_pShortDescr = d; }
	char	*GetLongDescr () { return m_pLongDescr; }
	void	SetLongDescr (char* d) { m_pLongDescr = d; }
	char	*GetDescription () { return m_pDescription; }
	void	SetDescription (char* d) { m_pDescription = d; }

	WORD	GetMobInvisLevel () { return m_MobInvisLevel; }
	void	SetMobInvisLevel (WORD i) { m_MobInvisLevel = i; }

	void	SetSex (int s) { sex = s; }
	void	SetLevel (int l) { level = l; }

	BOOL	IsPrototype () { return m_Act.IsPrototype (); }
	void	ClrPrototype () { m_Act.ClrPrototype (); }
	void	SetPrototype () { m_Act.SetPrototype (); }

	const CActFlags&		GetActFlags () { return m_Act; }
	const CAffectFlags&		GetAffectFlags () { return m_Affected; }
	const CAttackFlags&		GetAttackFlags () { return m_Attacks; }
	const CDefenseFlags&	GetDefenseFlags () { return m_Defenses; }

	void	SetActFlags (const CActFlags& f) { m_Act = f; }
	void	SetAffectFlags (const CAffectFlags& f) { m_Affected = f; }
	void	SetAttackFlags (const CAttackFlags& f) { m_Attacks = f; }
	void	SetDefenseFlags (const CDefenseFlags& f) { m_Defenses = f; }
	void	SetNpc () { m_Act.SetNpc (); }

	BOOL	IsComplex () { return m_bComplex; }
	void	SetComplex (BOOL f = TRUE) { m_bComplex = f; }

	// Access functions for Languages
	const CBitVector&	GetSpeaksFlags () { return m_Speaks; }
	void		SetSpeaksFlags (const CBitVector& f) { m_Speaks = f; }
	int			GetSpeaking () { return m_Speaking; }
	void		SetSpeaking (int l) { m_Speaking = l; }
	BOOL		SpeaksLanguage (int l)
				{ return m_Speaks.IsSet (LANG_ALL) || m_Speaks.IsSet (l); }
	BOOL		IsSpeaking (int l)
				{ return m_Speaking == LANG_ALL || m_Speaking == l; }
	void		SetSpeaks (int l) { m_Speaks.SetBit (l); }

	friend class	CMobileTable;

private:
	CMobIndexData	*m_pNext;
	char			*m_pPlayerName;
	char			*m_pShortDescr;
	char			*m_pLongDescr;
	char			*m_pDescription;
	CAffectFlags	m_Affected;
	CAttackFlags	m_Attacks;
	CDefenseFlags	m_Defenses;

	CBitVector		m_Speaks;
	int 			m_Speaking;
	BOOL			m_bComplex;
	CActFlags		m_Act;
	WORD			m_MobInvisLevel;

public:
	int				vnum;
	CBitVector		m_Progtypes;
	CMobIndexData	*next_sort;
	SPEC_FUN		*spec_fun;
	CShopData		*pShop;
	CRepairShopData	*rShop;
	short			count;
	short			killed;
	short			sex;
	short			level;
	short			alignment;
	short			mobthac0;
	short			ac;
	short			hitnodice;
	short			hitsizedice;
	short			hitplus;
	short			damnodice;
	short			damsizedice;
	short			damplus;
	short			numattacks;
	int				gold;
	int				exp;
	int				xflags;
	int				resistant;
	int				immune;
	int				susceptible;
	short			position;
	short			defposition;
	short			height;
	short			weight;
	short			race;
	short			m_Class;
	short			hitroll;
	short			damroll;
	short			perm_str;
	short			perm_int;
	short			perm_wis;
	short			perm_dex;
	short			perm_con;
	short			perm_cha;
	short			perm_lck;
	short			saving_poison_death;
	short			saving_wand;
	short			saving_para_petri;
	short			saving_breath;
	short			saving_spell_staff;

	CPtrList		MobPrgList;
};




class CMobileTable {
public:
				CMobileTable () { Empty (); }
				~CMobileTable () { RemoveAll (); }

	int				GetCount () { return m_Count; }
	int				GetHash (int vnum) { return vnum % MAX_KEY_HASH; }
	CMobIndexData	*GetFirstByHash (int hash)
					{ ASSERT (hash >= 0 && hash < MAX_KEY_HASH);
					  return m_mt [hash]; }
	CMobIndexData	*GetFirst (int vnum)
					{ return GetFirstByHash (GetHash (vnum)); }
	void			SetFirst (int vnum, CMobIndexData* i)
					{ m_mt [GetHash (vnum)] = i; }
	void			Add (CMobIndexData *pIndex, int vnum);
	void			Remove (CMobIndexData *pMob);
	CMobIndexData	*GetMob (int vnum, BOOL bBug = FALSE);

	void			Load ();
	void			Save ();
	void			Empty () { memset (this, 0, sizeof (CMobileTable)); }
	void			RemoveAll ();

private:
	int				m_Count;
	CMobIndexData	*m_mt [MAX_KEY_HASH];
};


#ifdef	SMAUGSERVER_CPP
	CMobileTable	MobTable;
#endif

extern CMobileTable	MobTable;

#endif