/****************************************************************************
* [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. *
* ------------------------------------------------------------------------ *
* Mobiles Interface file *
****************************************************************************/
#ifndef MOBILES_H
#define MOBILES_H
#include "ActFlags.h"
#include "Affect.h"
#include "Attack.h"
#include "Defense.h"
// Prototype for a mob.
// This is the in-memory version of #MOBILES.
#ifdef _DEBUG
class CMobIndexData : public CObject {
public:
CMobIndexData (int v)
{ ClearAddrRange (&m_pNext, &saving_spell_staff,
sizeof (saving_spell_staff)); vnum = v; }
virtual void Dump (CDumpContext& dc) const;
#else
class CMobIndexData {
public:
CMobIndexData (int v)
{ ClearAddrRange (&m_pNext, &saving_spell_staff,
sizeof (saving_spell_staff)); vnum = v; }
#endif
~CMobIndexData ();
CMobIndexData *GetNext () { return m_pNext; }
void SetNext (CMobIndexData* n) { m_pNext = n; }
void Clear ();
void Read (FILE *fp);
void Write (FILE* fp);
void ReadPrograms (FILE *fp);
char *GetPlayerName () { return m_pPlayerName; }
void SetPlayerName (char* n) { m_pPlayerName = n; }
char *GetShortDescr () { return m_pShortDescr; }
void SetShortDescr (char* d) { m_pShortDescr = d; }
char *GetLongDescr () { return m_pLongDescr; }
void SetLongDescr (char* d) { m_pLongDescr = d; }
char *GetDescription () { return m_pDescription; }
void SetDescription (char* d) { m_pDescription = d; }
WORD GetMobInvisLevel () { return m_MobInvisLevel; }
void SetMobInvisLevel (WORD i) { m_MobInvisLevel = i; }
void SetSex (int s) { sex = s; }
void SetLevel (int l) { level = l; }
BOOL IsPrototype () { return m_Act.IsPrototype (); }
void ClrPrototype () { m_Act.ClrPrototype (); }
void SetPrototype () { m_Act.SetPrototype (); }
const CActFlags& GetActFlags () { return m_Act; }
const CAffectFlags& GetAffectFlags () { return m_Affected; }
const CAttackFlags& GetAttackFlags () { return m_Attacks; }
const CDefenseFlags& GetDefenseFlags () { return m_Defenses; }
void SetActFlags (const CActFlags& f) { m_Act = f; }
void SetAffectFlags (const CAffectFlags& f) { m_Affected = f; }
void SetAttackFlags (const CAttackFlags& f) { m_Attacks = f; }
void SetDefenseFlags (const CDefenseFlags& f) { m_Defenses = f; }
void SetNpc () { m_Act.SetNpc (); }
BOOL IsComplex () { return m_bComplex; }
void SetComplex (BOOL f = TRUE) { m_bComplex = f; }
// Access functions for Languages
const CBitVector& GetSpeaksFlags () { return m_Speaks; }
void SetSpeaksFlags (const CBitVector& f) { m_Speaks = f; }
int GetSpeaking () { return m_Speaking; }
void SetSpeaking (int l) { m_Speaking = l; }
BOOL SpeaksLanguage (int l)
{ return m_Speaks.IsSet (LANG_ALL) || m_Speaks.IsSet (l); }
BOOL IsSpeaking (int l)
{ return m_Speaking == LANG_ALL || m_Speaking == l; }
void SetSpeaks (int l) { m_Speaks.SetBit (l); }
friend class CMobileTable;
private:
CMobIndexData *m_pNext;
char *m_pPlayerName;
char *m_pShortDescr;
char *m_pLongDescr;
char *m_pDescription;
CAffectFlags m_Affected;
CAttackFlags m_Attacks;
CDefenseFlags m_Defenses;
CBitVector m_Speaks;
int m_Speaking;
BOOL m_bComplex;
CActFlags m_Act;
WORD m_MobInvisLevel;
public:
int vnum;
CBitVector m_Progtypes;
CMobIndexData *next_sort;
SPEC_FUN *spec_fun;
CShopData *pShop;
CRepairShopData *rShop;
short count;
short killed;
short sex;
short level;
short alignment;
short mobthac0;
short ac;
short hitnodice;
short hitsizedice;
short hitplus;
short damnodice;
short damsizedice;
short damplus;
short numattacks;
int gold;
int exp;
int xflags;
int resistant;
int immune;
int susceptible;
short position;
short defposition;
short height;
short weight;
short race;
short m_Class;
short hitroll;
short damroll;
short perm_str;
short perm_int;
short perm_wis;
short perm_dex;
short perm_con;
short perm_cha;
short perm_lck;
short saving_poison_death;
short saving_wand;
short saving_para_petri;
short saving_breath;
short saving_spell_staff;
CPtrList MobPrgList;
};
class CMobileTable {
public:
CMobileTable () { Empty (); }
~CMobileTable () { RemoveAll (); }
int GetCount () { return m_Count; }
int GetHash (int vnum) { return vnum % MAX_KEY_HASH; }
CMobIndexData *GetFirstByHash (int hash)
{ ASSERT (hash >= 0 && hash < MAX_KEY_HASH);
return m_mt [hash]; }
CMobIndexData *GetFirst (int vnum)
{ return GetFirstByHash (GetHash (vnum)); }
void SetFirst (int vnum, CMobIndexData* i)
{ m_mt [GetHash (vnum)] = i; }
void Add (CMobIndexData *pIndex, int vnum);
void Remove (CMobIndexData *pMob);
CMobIndexData *GetMob (int vnum, BOOL bBug = FALSE);
void Load ();
void Save ();
void Empty () { memset (this, 0, sizeof (CMobileTable)); }
void RemoveAll ();
private:
int m_Count;
CMobIndexData *m_mt [MAX_KEY_HASH];
};
#ifdef SMAUGSERVER_CPP
CMobileTable MobTable;
#endif
extern CMobileTable MobTable;
#endif