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

#ifndef AFFECT_H
#define	AFFECT_H

#ifndef	BITVECTOR_H
	#include	"BitVector.h"
#endif


// Bits for 'affected_by'.
// Used in #MOBILES.
enum AffectTypes {
	AFF_BLIND, AFF_INVISIBLE, AFF_DETECT_EVIL, AFF_DETECT_INVIS, 
	AFF_DETECT_MAGIC, AFF_DETECT_HIDDEN, AFF_HOLD, AFF_SANCTUARY, 
	AFF_FAERIE_FIRE, AFF_INFRARED, AFF_CURSE, AFF_FLAMING, AFF_POISON, 
	AFF_PROTECT, AFF_PARALYSIS, AFF_SNEAK, AFF_HIDE, AFF_SLEEP, AFF_CHARM, 
	AFF_FLYING, AFF_PASS_DOOR, AFF_FLOATING, AFF_TRUESIGHT, AFF_DETECTTRAPS, 
	AFF_SCRYING, AFF_FIRESHIELD, AFF_SHOCKSHIELD, AFF_HAUS1, AFF_ICESHIELD, 
	AFF_POSSESS, AFF_BERSERK, AFF_AQUA_BREATH, AFF_RECURRINGSPELL,
	AFF_CONTAGIOUS, MAX_AFFECTED_BY };

#ifdef SMAUGSERVER_CPP
const char*	AffectNames [MAX_AFFECTED_BY] = {
	"blind", "invisible", "detect_evil", "detect_invis", "detect_magic",
	"detect_hidden", "hold", "sanctuary", "faerie_fire", "infrared", "curse",
	"_flaming", "poison", "protect", "_paralysis", "sneak", "hide", "sleep",
	"charm", "flying", "pass_door", "floating", "truesight", "detect_traps",
	"scrying", "fireshield", "shockshield", "r1", "iceshield", "possess", 
	"berserk", "aqua_breath", "recurringspell", "contagious" };
#endif

extern	const char* AffectNames [MAX_AFFECTED_BY];


class CAffectFlags : public CBitVector {
public:
	CString			PrintString () const
					{ return CBitVector::PrintString (
					    AffectNames, DIM (AffectNames)); }

	static const char*	GetName (UINT bit)
						{ return (bit < MAX_AFFECTED_BY) ?
						    AffectNames [bit] : "none"; }
	static int			GetVector (const char* name)
						{ return get_aflag (name); }
};


// An affect.
class CAffectData {
public:
				CAffectData ()
				{ memset (this, 0, sizeof (CAffectData));
				  type = duration = bitvector = -1; }
				CAffectData (const CAffectData& Af) { *this = Af; }

	const char	*GetVectorName ()
				{ return CAffectFlags::GetName (bitvector); }
	void		SetVector (const char* name)
				{ bitvector = CAffectFlags::GetVector (name); }
	void		ShowAffect (CCharacter *ch, int nItem=0, BOOL bExtra=FALSE);
				// in Handler.cpp

	const		CAffectData& operator= (const CAffectData& Af)
				{ memcpy (this, &Af, sizeof (CAffectData)); return *this; }

	int			type;
	int			duration;
	int			location;
	int			modifier;
	int			bitvector;
};


class CAffectList : public CPtrList {
public:
				CAffectList () {}
				~CAffectList () { RemoveAll (); }

	void		RemoveAll ()
				{ while (! IsEmpty ()) delete RemoveTail ();
				  CPtrList::RemoveAll (); }

	CAffectData	*GetNext (POSITION& pos)
				{ return (CAffectData*) CPtrList::GetNext (pos); }

	CAffectData	*GetAt (POSITION& pos)
				{ return (CAffectData*) CPtrList::GetAt (pos); }

	CAffectData	*RemoveTail ()
				{ return (CAffectData*) CPtrList::RemoveTail (); }

	CAffectData	*GetAffect (int loc);
};


// A SMAUG spell
class CSmaugAffect {
public:
					CSmaugAffect () { memset (this, 0, sizeof (CSmaugAffect)); }
					~CSmaugAffect () { delete duration; delete modifier; }
	CSmaugAffect	*GetNext () { return m_pNext; }
	void			SetNext (CSmaugAffect* n) { m_pNext = n; }

	CSmaugAffect	*m_pNext;
	char			*duration;
	int				location;
	char			*modifier;
	int				bitvector;
};


#endif