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