/****************************************************************************
* [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