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