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.    *
 * ------------------------------------------------------------------------ *
 *			    Objects Interface file										*
 ****************************************************************************/

#ifndef	OBJECTS_H
#define	OBJECTS_H

// object saving defines for fread/write_obj. -- Altrag
enum ObjStorageTypes { OS_CARRY, OS_CORPSE };

class	CAreaList;			// forward declaration

#include "affect.h"
#include "ExtraFlags.h"

#ifndef	BITVECTOR_H
	#include "bitvector.h"
#endif

#define		ADDBYLEVEL	TRUE	// for AddByLevel function

enum ObjCountTypes { COUNT_OBJS, COUNT_TOTAL };


class	CObjData;			// forward declarations

class CParseinfo {
public:
				CParseinfo () { Reset (); }

	void		Reset ()
				{ ZeroMemory (this, sizeof (CParseinfo)); bFirst = TRUE; }

	int			GetCount (ObjCountTypes type);
	CObjData	*Parse (CAreaList& AList);
	CObjData	*ParseAreaLists (CPtrList& AllAreasList);

	POSITION	AApos;			// All areas list position
	POSITION	Apos;			// area list position
	POSITION	Ipos;			// Obj Index list position
	POSITION	Opos;			// Obj List position
	CAreaList	*pAreaList;
	CPtrList	*pIdxList;		// Current Index list
	CObjectList	*pObjList;		// Current Object List
	BOOL		bFirst;
};



class CObjectList : public CPtrList {
public:
				CObjectList () { m_Loaded = 0; }

	void		AddByLevel (CObjData* pObj, BOOL bLevSort);
	CObjData	*FindObject (int vnum);
	void		AddTail (CObjData* obj);
	CObjData	*GetNext (POSITION& pos) const
				{ return pos ? (CObjData*) CPtrList::GetNext (pos) : NULL; }
	CObjData	*GetPrev (POSITION& pos)
				{ return pos ? (CObjData*) CPtrList::GetPrev (pos) : NULL; }
	void		Remove (CObjData* obj);
	CObjData	*RemoveTail () { return (CObjData*) CPtrList::RemoveTail (); }
	void		RemoveAll ();
	int			GetTotalObjs () { return m_Loaded; }
	void		AdjustTotal (int n) { m_Loaded += n; }
	CObjData	*GetFirst ()
				{ return IsEmpty () ? NULL : (CObjData*) GetHead (); }
	CObjData	*GetLast ()
				{ return IsEmpty () ? NULL : (CObjData*) GetTail (); }

private:
	int			m_Loaded;
};

#ifdef	SMAUGSERVER_CPP
	CObjectList	ExtractedObjList;
#endif

extern CObjectList	ExtractedObjList;





// One object.
#ifdef _DEBUG
class CObjData : public CObject {
public:
				CObjData ()
				{ ClearAddrRange (&in_obj, &serial, sizeof (serial)); }

	virtual void Dump (CDumpContext& dc) const;
#else
class CObjData {
public:
				CObjData ()
				{ ClearAddrRange (&in_obj, &serial, sizeof (serial)); }
#endif

				~CObjData ();

	void		Write (FILE *fp, int iNest, short StorageType,
					   short ChLevel = 0);

	short		GetLevel () { return level; }
	void		SetLevel (short l) { level = l; }
	const char	*GetName () const { return m_pName; }
	void		SetName (const char* n)
				{ STRFREE (m_pName); m_pName = STRALLOC (n); }
	const char	*GetShortDescr () const { return m_pShortDescr; }
	void		SetShortDescr (const char* d)
				{ STRFREE (m_pShortDescr); m_pShortDescr = STRALLOC (d); }
	const char	*GetDescription () const { return m_pDescription; }
	void		SetDescription (const char* p)
				{ STRFREE (m_pDescription); m_pDescription = STRALLOC (p); }
	// Special for GetEditBuffer
	void		SetDescriptionNA (const char* p)
				{ STRFREE (m_pDescription); m_pDescription = NCCP p; }

	const char	*GetActionDescr () const { return m_pActionDesc; }
	void		SetActionDescr (const char* d)
				{ STRFREE (m_pActionDesc); m_pActionDesc = STRALLOC (d); }
	BOOL		HasValidActionDescr ()
				{ return m_pActionDesc && *m_pActionDesc != 0; }
	
	CRoomIndexData	*GetInRoom () { return in_room; }
	CObjIndexData	*GetIndex () { return pIndexData; }

	BOOL		CanWear (int part)
				{ return IS_SET (wear_flags, part); }
	BOOL		IsPrototype () const { return m_ExtraFlags.IsPrototype (); }
	void		SetPrototype () { m_ExtraFlags.SetPrototype (); }
	void		ClrPrototype () { m_ExtraFlags.ClrPrototype (); }
	BOOL		IsMagic () const { return m_ExtraFlags.IsMagic (); }
	BOOL		IsBuried () const { return m_ExtraFlags.IsBuried (); }
	void		SetBuried () { m_ExtraFlags.SetBuried (); }
	void		ClrBuried () { m_ExtraFlags.ClrBuried (); }
	BOOL		IsClanObject () const { return m_ExtraFlags.IsClanObject (); }
	void		SetClanObject () { m_ExtraFlags.SetClanObject (); }
	BOOL		IsPoisoned () const { return m_ExtraFlags.IsPoisoned (); }
	void		SetPoisoned () { m_ExtraFlags.SetPoisoned (); }
	BOOL		IsAntiEvil () const { return m_ExtraFlags.IsAntiEvil (); }
	void		SetAntiEvil () { m_ExtraFlags.SetAntiEvil (); }
	BOOL		IsAntiGood () const { return m_ExtraFlags.IsAntiGood (); }
	void		SetAntiGood () { m_ExtraFlags.SetAntiGood (); }
	BOOL		IsAntiNeutral () { return m_ExtraFlags.IsAntiNeutral (); }
	BOOL		IsInvisible () const { return m_ExtraFlags.IsInvisible (); }
	void		SetInvisible () { m_ExtraFlags.SetInvisible (); }
	void		ClrInvisible () { m_ExtraFlags.ClrInvisible (); }
	BOOL		IsNoRemove () const { return m_ExtraFlags.IsNoRemove (); }
	void		ClrNoRemove () { m_ExtraFlags.ClrNoRemove (); }
	BOOL		IsNoDrop () const { return m_ExtraFlags.IsNoDrop (); }
	void		ClrNoDrop () { m_ExtraFlags.ClrNoDrop (); }
	BOOL		IsClanCorpse () const { return m_ExtraFlags.IsClanCorpse (); }
	void		SetClanCorpse () { m_ExtraFlags.SetClanCorpse (); }
	BOOL		IsEvil () const { return m_ExtraFlags.IsEvil (); }
	BOOL		IsHidden () const { return m_ExtraFlags.IsHidden (); }
	void		SetHidden () { m_ExtraFlags.SetHidden (); }
	void		ClrHidden () { m_ExtraFlags.ClrHidden (); }
	BOOL		IsInventory () const { return m_ExtraFlags.IsInventory (); }
	void		SetInventory () { m_ExtraFlags.SetInventory (); }
	BOOL		IsGlowing () const { return m_ExtraFlags.IsGlowing (); }
	BOOL		IsBlessed () const { return m_ExtraFlags.IsBlessed (); }
	BOOL		IsDonation () const { return m_ExtraFlags.IsDonation (); }
	BOOL		IsHumming () const { return m_ExtraFlags.IsHumming (); }
	BOOL		IsMetal () const { return m_ExtraFlags.IsMetal (); }
	BOOL		IsDark () const { return m_ExtraFlags.IsDark (); }
	BOOL		IsOrganic () const { return m_ExtraFlags.IsOrganic (); }
	BOOL		IsLoyal () const { return m_ExtraFlags.IsLoyal (); }
	BOOL		IsDeathrot () const { return m_ExtraFlags.IsDeathrot (); }
	BOOL		IsCovering () const { return m_ExtraFlags.IsCovering (); }
	BOOL		IsTrapped () const;

	CBitVector	GetAntiClassFlags () { return m_AntiClassFlags; }
	void		SetAntiClassFlags (CBitVector f) { m_AntiClassFlags = f; }
	BOOL		IsAntiClass (int cl) { return m_AntiClassFlags.IsSet (cl); }
	void		SetAntiClass (int cl) { m_AntiClassFlags.SetBit (cl); }
	void		ClrAntiClass (int cl) { m_AntiClassFlags.ClrBit (cl); }
	void		ToggleAntiClass (int cl) { m_AntiClassFlags.ToggleBit (cl); }
	CString		AntiClassNames ();


	CExitData	*GetExit (short door)
				{ return get_exit (GetInRoom (), door); }
	BOOL		CanGo (short door);

	void	AddAffect (CAffectData* aff) { AffList.AddTail (aff); }
	BOOL	HasAffects () { return ! AffList.IsEmpty (); }


	BOOL		IsEmpty () const { return m_Content.IsEmpty (); }
	void		AddContent (CObjData* pObj, BOOL bLevSort = FALSE)
				{ m_Content.AddByLevel (pObj, bLevSort); }
	void		RemoveContent (CObjData* pObj) { m_Content.Remove (pObj); }
	CObjData	*GetFirstContent () { return m_Content.GetFirst (); }
	CObjData	*GetLastContent () { return m_Content.GetLast (); }

	POSITION	GetHeadContentPos () { return m_Content.GetHeadPosition (); }
	POSITION	GetTailContentPos () { return m_Content.GetTailPosition (); }
	CObjData	*GetNextContent (POSITION& pos)
				{ return m_Content.GetNext (pos); }
	CObjData	*GetPreviousContent (POSITION& pos)
				{ return m_Content.GetPrev (pos); }
	CObjectList	&GetContentList () { return m_Content; }


	CObjData		*in_obj;
	CCharacter		*carried_by;
	CObjIndexData	*pIndexData;
	CRoomIndexData	*in_room;
	char			*m_pName;
	char			*m_pShortDescr;
	char			*m_pDescription;
	char			*m_pActionDesc;
	short			item_type;
	short			mpscriptpos;
	CExtraFlags		m_ExtraFlags;
	int				magic_flags;  // Need more bitvectors for spells - Scryn
	int				wear_flags;
	CBitVector		m_AntiClassFlags;
	CMobProgActList	*mpact;				// mudprogs
	int				mpactnum;			// mudprogs
	short			wear_loc;
	short			weight;
	int				cost;
	short			level;
	short			timer;
	int				value [6];
	short			count;				// support for object grouping
	int				serial;				// serial number

	CAffectList		AffList;
	CPtrList		ExDesList;
	CObjectList		m_Content;
};





// Prototype for an object.
#ifdef _DEBUG
class CObjIndexData : public CObject {
public:
			CObjIndexData (int v)
			{ ClearAddrRange (&m_pNext, &cost, sizeof (cost)); vnum = v; }

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

					~CObjIndexData ();
	CObjIndexData	*GetNext () { return m_pNext; }
	void			SetNext (CObjIndexData* n) { m_pNext = n; }
	void			Clear ();

	const char		*GetName () const { return m_pName; }
	void			SetName (const char* n)
					{ STRFREE (m_pName); m_pName = STRALLOC (n); }

	const char		*GetShortDescr () const { return m_pShortDescr; }
	void			SetShortDescr (const char* d)
					{ STRFREE (m_pShortDescr); m_pShortDescr = STRALLOC (d); }
	const char		*GetDescription () const { return m_pDescription; }
	void			SetDescription (const char* p)
					{ STRFREE (m_pDescription); m_pDescription = STRALLOC (p); }
	// Special for GetEditBuffer
	void			SetDescriptionNA (const char* p)
					{ STRFREE (m_pDescription); m_pDescription = NCCP p; }

	const char		*GetActionDescr () const { return m_pActionDesc; }
	void			SetActionDescr (const char* p)
					{ STRFREE (m_pActionDesc); m_pActionDesc = STRALLOC (p); }

	void			AddAffect (CAffectData* aff) { AffList.AddTail (aff); }

	BOOL		IsPrototype () { return m_ExtraFlags.IsPrototype (); }
	void		SetPrototype () { m_ExtraFlags.SetPrototype (); }
	void		ClrPrototype () { m_ExtraFlags.ClrPrototype (); }
	BOOL		IsMagic () { return m_ExtraFlags.IsMagic (); }
	BOOL		IsBuried () { return m_ExtraFlags.IsBuried (); }
	void		SetBuried () { m_ExtraFlags.SetBuried (); }
	void		ClrBuried () { m_ExtraFlags.ClrBuried (); }
	BOOL		IsClanObject () { return m_ExtraFlags.IsClanObject (); }
	void		SetClanObject () { m_ExtraFlags.SetClanObject (); }
	BOOL		IsPoisoned () { return m_ExtraFlags.IsPoisoned (); }
	void		SetPoisoned () { m_ExtraFlags.SetPoisoned (); }
	BOOL		IsAntiEvil () { return m_ExtraFlags.IsAntiEvil (); }
	void		SetAntiEvil () { m_ExtraFlags.SetAntiEvil (); }
	BOOL		IsAntiGood () { return m_ExtraFlags.IsAntiGood (); }
	void		SetAntiGood () { m_ExtraFlags.SetAntiGood (); }
	BOOL		IsAntiNeutral () { return m_ExtraFlags.IsAntiNeutral (); }
	BOOL		IsInvisible () { return m_ExtraFlags.IsInvisible (); }
	void		SetInvisible () { m_ExtraFlags.SetInvisible (); }
	void		ClrInvisible () { m_ExtraFlags.ClrInvisible (); }
	BOOL		IsNoRemove () { return m_ExtraFlags.IsNoRemove (); }
	void		ClrNoRemove () { m_ExtraFlags.ClrNoRemove (); }
	BOOL		IsNoDrop () { return m_ExtraFlags.IsNoDrop (); }
	void		ClrNoDrop () { m_ExtraFlags.ClrNoDrop (); }
	BOOL		IsClanCorpse () { return m_ExtraFlags.IsClanCorpse (); }
	void		SetClanCorpse () { m_ExtraFlags.SetClanCorpse (); }
	BOOL		IsEvil () { return m_ExtraFlags.IsEvil (); }
	BOOL		IsHidden () { return m_ExtraFlags.IsHidden (); }
	void		SetHidden () { m_ExtraFlags.SetHidden (); }
	void		ClrHidden () { m_ExtraFlags.ClrHidden (); }
	BOOL		IsInventory () { return m_ExtraFlags.IsInventory (); }
	void		SetInventory () { m_ExtraFlags.SetInventory (); }
	BOOL		IsGlowing () { return m_ExtraFlags.IsGlowing (); }
	BOOL		IsBlessed () { return m_ExtraFlags.IsBlessed (); }
	BOOL		IsDonation () { return m_ExtraFlags.IsDonation (); }
	BOOL		IsHumming () { return m_ExtraFlags.IsHumming (); }
	BOOL		IsMetal () { return m_ExtraFlags.IsMetal (); }
	BOOL		IsDark () { return m_ExtraFlags.IsDark (); }
	BOOL		IsOrganic () { return m_ExtraFlags.IsOrganic (); }
	BOOL		IsLoyal () { return m_ExtraFlags.IsLoyal (); }
	BOOL		IsDeathrot () { return m_ExtraFlags.IsDeathrot (); }
	BOOL		IsCovering () { return m_ExtraFlags.IsCovering (); }

	BOOL		HasDropProg () { return m_Progtypes.IsSet (DROP_PROG); }
	BOOL		HasPullProg () { return m_Progtypes.IsSet (PULL_PROG); }
	BOOL		HasPushProg () { return m_Progtypes.IsSet (PUSH_PROG); }
	BOOL		HasScriptProg () { return m_Progtypes.IsSet (SCRIPT_PROG); }
	BOOL		HasGreetProg () { return m_Progtypes.IsSet (GREET_PROG); }
	BOOL		HasSpeechProg () { return m_Progtypes.IsSet (SPEECH_PROG); }
	BOOL		HasRandProg () { return m_Progtypes.IsSet (RAND_PROG); }
	BOOL		HasWearProg () { return m_Progtypes.IsSet (WEAR_PROG); }
	BOOL		HasUseProg () { return m_Progtypes.IsSet (USE_PROG); }
	BOOL		HasRemoveProg () { return m_Progtypes.IsSet (REMOVE_PROG); }
	BOOL		HasSacProg () { return m_Progtypes.IsSet (SAC_PROG); }
	BOOL		HasGetProg () { return m_Progtypes.IsSet (GET_PROG); }
	BOOL		HasDamageProg () { return m_Progtypes.IsSet (DAMAGE_PROG); }
	BOOL		HasRepairProg () { return m_Progtypes.IsSet (REPAIR_PROG); }
	BOOL		HasExamineProg () { return m_Progtypes.IsSet (EXA_PROG); }
	BOOL		HasZapProg () { return m_Progtypes.IsSet (ZAP_PROG); }
	BOOL		HasActProg () { return m_Progtypes.IsSet (ACT_PROG); }

	CBitVector	GetAntiClassFlags () { return m_AntiClassFlags; }
	void		SetAntiClassFlags (CBitVector f) { m_AntiClassFlags = f; }
	BOOL		IsAntiClass (int cl) { return m_AntiClassFlags.IsSet (cl); }
	void		SetAntiClass (int cl) { m_AntiClassFlags.SetBit (cl); }
	void		ToggleAntiClass (int cl) { m_AntiClassFlags.ToggleBit (cl); }

	char	*Read (FILE* fp, int AreaVersion);
	void	ReadPrograms (char* pLine, FILE *fp);
	void	Write (FILE* fp);

	int		GetCount () { return count; }

	CObjData	*GetLast () { return m_ObjList.GetLast (); }

	friend class	CObjIdxTable;

private:
	CObjIndexData	*m_pNext;
	char			*m_pName;
	char			*m_pShortDescr;
	char			*m_pDescription;
	char			*m_pActionDesc;

public:
	CObjIndexData	*next_sort;
	CBitVector		m_Progtypes;				// objprogs
	int				vnum;
	short			level;
	short			item_type;
	CExtraFlags		m_ExtraFlags;
	int				magic_flags; // Need more bitvectors for spells - Scryn
	int				wear_flags;
	CBitVector		m_AntiClassFlags;
	short			count;
	short			weight;
	int				value [6];
	int				serial;
	short			layers;
	int				cost;

	CAffectList		AffList;
	CPtrList		ObjPrgList;
	CPtrList		ExDesList;

	// Each object index has a list of all the objects made from it
	CObjectList		m_ObjList;
};





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

	int				GetCount () { return m_Count; }
	CObjIndexData	*Find (int vnum);

	int				GetHash (int vnum) { return vnum % MAX_KEY_HASH; }
	CObjIndexData	*GetFirstByHash (int hash)
					{ ASSERT (hash >= 0 && hash < MAX_KEY_HASH);
					  return m_ot [hash]; }
	CObjIndexData	*GetFirst (int vnum)
					{ return GetFirstByHash (GetHash (vnum)); }
	void			SetFirst (int hash, CObjIndexData* i)
					{ ASSERT (hash >= 0 && hash < MAX_KEY_HASH);
					  m_ot [hash] = i; }
	void			Add (CObjIndexData *pIndex, int vnum);
	CObjIndexData	*GetObj (int vnum, BOOL bBug = FALSE);

	void			Load ();
	void			Save ();
	void			Empty () { memset (this, 0, sizeof (CObjIdxTable)); }
	void			Remove (CObjIndexData* pIdx);
	void			RemoveAll ();

private:
	int				m_Count;
	CObjIndexData	*m_ot [MAX_KEY_HASH];
};


#ifdef	SMAUGSERVER_CPP
	CObjIdxTable	OIdxTable;
#endif

extern CObjIdxTable	OIdxTable;



#endif