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

#ifndef	ROOMS_H
#define	ROOMS_H

#include	"Resets.h"

// Default values for well known room virtual numbers.
// These can be changed via the SysData Rooms configuration menu.
#define DEF_ROOM_VNUM_VOID			1
#define DEF_ROOM_VNUM_LIMBO			2
#define DEF_ROOM_VNUM_POLY			3
#define DEF_ROOM_VNUM_HELL			6
#define DEF_ROOM_AUTH_START			100
#define DEF_ROOM_VNUM_CHAT			1200
#define DEF_ROOM_VNUM_TEMPLE		21001
#define DEF_ROOM_VNUM_ALTAR			21194
#define	DEF_ROOM_VNUM_HALLOFFALLEN	21195 
#define DEF_ROOM_VNUM_SCHOOL		10300


// Room flag bits
#define ROOM_DARK			BV00
#define ROOM_DEATH			BV01
#define ROOM_NO_MOB			BV02
#define ROOM_INDOORS		BV03
#define ROOM_LAWFUL			BV04
#define ROOM_NEUTRAL		BV05
#define ROOM_CHAOTIC		BV06
#define ROOM_NO_MAGIC		BV07
#define ROOM_TUNNEL			BV08
#define ROOM_PRIVATE		BV09
#define ROOM_SAFE			BV10
#define ROOM_SOLITARY		BV11
#define ROOM_PET_SHOP		BV12
#define ROOM_NO_RECALL		BV13
#define ROOM_DONATION		BV14
#define ROOM_NODROPALL		BV15
#define ROOM_SILENCE		BV16
#define ROOM_LOGSPEECH		BV17
#define ROOM_NODROP			BV18
#define ROOM_CLANSTOREROOM	BV19
#define ROOM_NO_SUMMON		BV20
#define ROOM_NO_ASTRAL		BV21
#define ROOM_TELEPORT		BV22
#define ROOM_TELESHOWDESC	BV23
#define ROOM_NOFLOOR		BV24
#define ROOM_NOSUPPLICATE	BV25
#define ROOM_ARENA			BV26
#define ROOM_NOMISSILE		BV27
#define	ROOM_MARK			BV29
#define ROOM_PROTOTYPE		BV30


// Room type.
#ifdef _DEBUG
class CRoomIndexData : public CObject {
public:
			CRoomIndexData (int v)
			{ ClearAddrRange (&m_pNext, &tunnel, sizeof (tunnel)); vnum = v; }

	virtual void Dump (CDumpContext& dc) const;

#else

class CRoomIndexData {
	friend class	CObjIdxTable;
public:
			CRoomIndexData (int v)
			{ ClearAddrRange (&m_pNext, &tunnel, sizeof (tunnel)); vnum = v; }
#endif

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

	const char		*GetName () const { return m_pName; }
	void			SetName (const char* n)
					{ STRFREE (m_pName); m_pName = STRALLOC (n); }
	const char		*GetDescription () const { return m_pDescription; }
	void			SetDescription (const char* d)
					{ STRFREE (m_pDescription); m_pDescription = STRALLOC (d); }
	// Special for GetEditBuffer
	void			SetDescriptionNA (const char* p)
					{ STRFREE (m_pDescription); m_pDescription = NCCP p; }

	CAreaData		*GetArea () { return m_pArea; }
	void			SetArea (CAreaData* a) { m_pArea = a; }
	void			Clean ();

	void			Read (FILE *fp, BOOL bBug);
	void			ReadPrograms (char* pLine, FILE *fp);
	void			Write (FILE* fp);

	int		GetRoomFlags () { return m_flags; }
	void	SetRoomFlags (int f) { m_flags = f; }
	void	SetRoomBit (int bit) { m_flags |= bit; }
	void	ToggleRoomFlags (int bit) { m_flags ^= bit; }
	BOOL	IsIndoors () { return (m_flags & ROOM_INDOORS) != 0; }
	void	SetIndoors () { m_flags |= ROOM_INDOORS; }
    BOOL	IsSafe () { return (m_flags & ROOM_SAFE) != 0; }
	void	SetSafe () { m_flags |= ROOM_SAFE; }
	BOOL	IsNoRecall () { return (m_flags & ROOM_NO_RECALL) != 0; }
	void	SetNoRecall () { m_flags |= ROOM_NO_RECALL; }
	BOOL	IsClanStoreRoom () { return (m_flags & ROOM_CLANSTOREROOM) != 0; }
	void	SetClanStoreRoom () { m_flags |= ROOM_CLANSTOREROOM; }
	BOOL	IsDonationRoom () { return (m_flags & ROOM_DONATION) != 0; }
	void	SetDonationRoom () { m_flags |= ROOM_DONATION; }
	BOOL	IsNoDrop () { return (m_flags & ROOM_NODROP) != 0; }
	void	SetNoDrop () { m_flags |= ROOM_NODROP; }
	BOOL	IsNoDropAll () { return (m_flags & ROOM_NODROPALL) != 0; }
	void	SetNoDropAll () { m_flags |= ROOM_NODROPALL; }
	BOOL	HasNoFloor () { return (m_flags & ROOM_NOFLOOR) != 0; }
	void	SetNoFloor () { m_flags |= ROOM_NOFLOOR; }
	BOOL	IsDeathRoom () { return (m_flags & ROOM_DEATH) != 0; }
	void	SetDeathRoom () { m_flags |= ROOM_DEATH; }
	BOOL	IsNoMagic () { return (m_flags & ROOM_NO_MAGIC) != 0; }
	void	SetNoMagic () { m_flags |= ROOM_NO_MAGIC; }
	BOOL	IsNoAstral () { return (m_flags & ROOM_NO_ASTRAL) != 0; }
	void	SetNoAstral () { m_flags |= ROOM_NO_ASTRAL; }
	BOOL	IsPrivate () { return (m_flags & ROOM_PRIVATE) != 0; }
	void	SetPrivate () { m_flags |= ROOM_PRIVATE; }
	BOOL	IsSolitary () { return (m_flags & ROOM_SOLITARY) != 0; }
	void	SetSolitary () { m_flags |= ROOM_SOLITARY; }
	BOOL	IsNoSummon () { return (m_flags & ROOM_NO_SUMMON) != 0; }
	void	SetNoSummon () { m_flags |= ROOM_NO_SUMMON; }
	BOOL	IsNoMissile () { return (m_flags & ROOM_NOMISSILE) != 0; }
	void	SetNoMissile () { m_flags |= ROOM_NOMISSILE; }
	BOOL	IsPrototype () { return (m_flags & ROOM_PROTOTYPE) != 0; }
	void	SetPrototype () { m_flags |= ROOM_PROTOTYPE; }
	void	ClrPrototype () { m_flags &= ~ROOM_PROTOTYPE; }
	BOOL	IsNoMob () { return (m_flags & ROOM_NO_MOB) != 0; }
	void	SetNoMob () { m_flags |= ROOM_NO_MOB; }
	BOOL	IsSilent () { return (m_flags & ROOM_SILENCE) != 0; }
	void	SetSilent () { m_flags |= ROOM_SILENCE; }
	BOOL	IsLogSpeech () { return (m_flags & ROOM_LOGSPEECH) != 0; }
	void	SetLogSpeech () { m_flags |= ROOM_LOGSPEECH; }
	BOOL	IsTeleport () { return (m_flags & ROOM_TELEPORT) != 0; }
	void	SetTeleport () { m_flags |= ROOM_TELEPORT; }
	BOOL	IsDark () { return (m_flags & ROOM_DARK) != 0; }
	void	SetDark () { m_flags |= ROOM_DARK; }
	BOOL	IsPetShop () { return (m_flags & ROOM_PET_SHOP) != 0; }
	void	SetPetShop () { m_flags |= ROOM_PET_SHOP; }
	BOOL	IsTelePort () { return (m_flags & ROOM_TELEPORT) != 0; }
	void	SetTelePort () { m_flags |= ROOM_TELEPORT; }
	BOOL	IsTeleShow () { return (m_flags & ROOM_TELESHOWDESC) != 0; }
	void	SetTeleShow () { m_flags |= ROOM_TELESHOWDESC; }
	BOOL	IsLawful () { return (m_flags & ROOM_LAWFUL) != 0; }
	void	SetLawful () { m_flags |= ROOM_LAWFUL; }
	BOOL	IsNeutral () { return (m_flags & ROOM_NEUTRAL) != 0; }
	void	SetNeutral () { m_flags |= ROOM_NEUTRAL; }
	BOOL	IsChaotic () { return (m_flags & ROOM_CHAOTIC) != 0; }
	void	SetChaotic () { m_flags |= ROOM_CHAOTIC; }
	BOOL	IsTunnel () { return (m_flags & ROOM_TUNNEL) != 0; }
	void	SetTunnel () { m_flags |= ROOM_TUNNEL; }


	BOOL	IsMarked () { return (m_flags & ROOM_MARK) != 0; }
	void	MarkRoom () { m_flags |= ROOM_MARK; }
	void	UnMarkRoom () { m_flags &= ~ROOM_MARK; }

	int		*GetRoomFlagsAddr () { return &m_flags; }	// special for reset

	void	LinkPerson (CCharacter* ch);
	void	UnLinkPerson (CCharacter* ch);

	void	AddReset (char cm, int ex, int mob, int a1, int a2, int a3);
	void	FixExits (BOOL bBoot);

	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; }

private:
	CRoomIndexData	*m_pNext;
	CAreaData		*m_pArea;
	char			*m_pDescription;
	char			*m_pName;
	int				m_flags;

public:
	int				vnum;
	CRoomIndexData	*next_sort;
	CCharacter		*first_person;
	CCharacter		*last_person;
	CExitData		*first_exit;
	CExitData		*last_exit;
	CBitVector		m_Progtypes;				// mudprogs
	CMobProgActList	*mpact;					// mudprogs
	int				mpactnum;				// mudprogs
	short			mpscriptpos;
	short			light;
	short			sector_type;
	int				tele_vnum;
	short			tele_delay;
	short			tunnel;					// max people that will fit

	CPtrList		RoomPrgList;
	CPtrList		ExDesList;
	CResetList		ResetList;
	CObjectList		m_Content;
};





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

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

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

private:
	int				m_Count;
	CRoomIndexData	*m_rt [MAX_KEY_HASH];
};


#ifdef	SMAUGSERVER_CPP
	CRoomTable	RoomTable;
#endif

extern CRoomTable	RoomTable;

#endif