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/
 /***************************************************************************
 *         SmaugWizard (C) 1998, 1999 by Russ Pillsbury       |             *
 *            SMAUG (C) 1994 - 1999 by Derek Snider.          |   \\._.//   *
 *                                                            |   (0...0)   *
 *   [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame    |    ).:.(    *
 *                                                            |    {o o}    *
 * -----------------------------------------------------------|   (0...0)   *
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |   / ' ' \   *
 * Scryn, Swordbearer, Rennard, Tricops, Gorog, Grishnakh,    |~'~.VxvxV.~'~*
 * Fireblade and Nivek.                                       |             *
 *  ----------------------------------------------------------------------- *
 * 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.    *
 * ------------------------------------------------------------------------ *
 *                         Main mud header file								*
 ***************************************************************************/

#pragma warning( disable: 4244 4996 )
#ifndef		SMAUG_H
#define		SMAUG_H

#define		then
#define new DEBUG_NEW

#define		CCP			(const char*)			// for CStrings
#define		NCCP		(char*)(const char*)	// for CStrings
#define 	DIM(a)		(sizeof(a)/sizeof(a[0]))

#define		HASHSTR							 // use string hashing
#define		Pnew				new
#define		free_string(s)		delete [] s
	

typedef	int				ch_ret;
typedef	int				obj_ret;

#define DECLARE_DO_FUN(fun)		DO_FUN    fun
#define DECLARE_SPEC_FUN(fun)	SPEC_FUN  fun
#define DECLARE_SPELL_FUN(fun)	SPELL_FUN fun


#if	!defined(BERR)
#define BERR	 255
#endif


// Forward declarations for classes
class	CSmaugWizDoc;
class	CSmaugSocket;
class	CSystemData;
class	CSkill;
class	CSkillTable;
class	CAffectData;
class	CAreaData;
class	CBanData;
class	CCharacter;
class	CDescriptor;
class	CBoardData;
class	CClanData;
class	CCouncilData;
class	CExitData;
class	CExtraDescrData;
class	CHelpData;
class	CFightData;
class	CMobIndexData;
class	CNoteData;
class	CObjData;
class	CObjIndexData;
class	pc_data;
class	CResetData;
class	CRoomIndexData;
class	CWizData;
class	CShopData;
class	CRepairShopData;
class	CMobProgData;
class	CMobProgActList;
class	CSocialType;
class	CSocialTable;
class	CTeleportData;
class	CExtractedCharData;
class	CTimerData;
class	CCmdType;
class	CDeityData;
class	CSmaugAffect;
class	time_info_data;
class	CWeatherData;
class	CSmaugMenu;
class	CAffectList;
class	CEditor;
class	CLog;
class	CSwTime;
class	CIntVector;
class	CBitVector;
class	CActFlags;
class	CResetList;
class	CObjectList;

// Structure types.
typedef struct	hunt_hate_fear	HHF_DATA;
typedef struct	menu_data		MENU_DATA;
typedef struct	comment_data	COMMENT_DATA;
typedef struct  tourney_data	TOURNEY_DATA;
typedef struct  godlist_data	GOD_DATA;
typedef	struct	killed_data		KILLED_DATA;

// Function types.
typedef	void	DO_FUN		(CCharacter *ch, char *argument);
typedef BOOL	SPEC_FUN	(CCharacter *ch);
typedef ch_ret	SPELL_FUN	(int sn, int level, CCharacter *ch, void *vo);

#define DUR_CONV		23.333333333333333333333333
#define HIDDEN_TILDE	'*'

#define BV00		(1 <<  0)
#define BV01		(1 <<  1)
#define BV02		(1 <<  2)
#define BV03		(1 <<  3)
#define BV04		(1 <<  4)
#define BV05		(1 <<  5)
#define BV06		(1 <<  6)
#define BV07		(1 <<  7)
#define BV08		(1 <<  8)
#define BV09		(1 <<  9)
#define BV10		(1 << 10)
#define BV11		(1 << 11)
#define BV12		(1 << 12)
#define BV13		(1 << 13)
#define BV14		(1 << 14)
#define BV15		(1 << 15)
#define BV16		(1 << 16)
#define BV17		(1 << 17)
#define BV18		(1 << 18)
#define BV19		(1 << 19)
#define BV20		(1 << 20)
#define BV21		(1 << 21)
#define BV22		(1 << 22)
#define BV23		(1 << 23)
#define BV24		(1 << 24)
#define BV25		(1 << 25)
#define BV26		(1 << 26)
#define BV27		(1 << 27)
#define BV28		(1 << 28)
#define BV29		(1 << 29)
#define BV30		(1 << 30)
#define BV31		(1 << 31)
// 32 USED! DO NOT ADD MORE! SB

// String and memory management parameters.
#define MAX_KEY_HASH		2048
#define MAX_STRING_LENGTH	4096  // buf
#define MAX_INPUT_LENGTH	1024  // arg
#define MAX_INBUF_SIZE		1024
#define	MAX_PAGER_BUFFER	0x8000


#define	MAX_LAYERS			8		// maximum clothing layers
#define MAX_NEST			100		// maximum container nesting

#define MAX_KILLTRACK		25		// track mob vnums killed

// Game parameters.
// Increase the max'es if you add more of something.
// Adjust the pulse numbers to suit yourself.
#define MAX_EXP_WORTH	       500000
#define MIN_EXP_WORTH		   20

#define MAX_REXITS			20	// Maximum exits allowed in 1 room
#define MAX_LEVEL			65
#define MAX_CLAN			50
#define MAX_DEITY			50
#define MAX_CPD				4   // Maximum council power level difference
#define MAX_SKILL			300
#define	MAX_HERB			20
#define MAX_SOCIALS			27
#define	MAX_COMMANDS		126
#define	MAX_VROOMS			64

#define LEVEL_HERO			   (MAX_LEVEL - 15)
#define LEVEL_IMMORTAL		   (MAX_LEVEL - 14)
#define LEVEL_SUPREME		   MAX_LEVEL
#define LEVEL_INFINITE		   (MAX_LEVEL - 1)
#define LEVEL_ETERNAL		   (MAX_LEVEL - 2)
#define LEVEL_IMPLEMENTOR	   (MAX_LEVEL - 3)
#define LEVEL_SUB_IMPLEM	   (MAX_LEVEL - 4)
#define LEVEL_ASCENDANT		   (MAX_LEVEL - 5)
#define LEVEL_GREATER		   (MAX_LEVEL - 6)
#define LEVEL_GOD			   (MAX_LEVEL - 7)
#define LEVEL_LESSER		   (MAX_LEVEL - 8)
#define LEVEL_TRUEIMM		   (MAX_LEVEL - 9)
#define LEVEL_DEMI			   (MAX_LEVEL - 10)
#define LEVEL_SAVIOR		   (MAX_LEVEL - 11)
#define LEVEL_CREATOR		   (MAX_LEVEL - 12)
#define LEVEL_ACOLYTE		   (MAX_LEVEL - 13)
#define LEVEL_NEOPHYTE		   (MAX_LEVEL - 14)
#define LEVEL_AVATAR		   (MAX_LEVEL - 15)

#define LEVEL_LOG		    LEVEL_LESSER
#define LEVEL_HIGOD		    LEVEL_GOD

#define PULSE_PER_SECOND		4
#define PULSE_VIOLENCE			(3 * PULSE_PER_SECOND)
#define PULSE_MOBILE			(4 * PULSE_PER_SECOND)
#define PULSE_TICK				(70 * PULSE_PER_SECOND)
#define PULSE_AREA				(60 * PULSE_PER_SECOND)
#define PULSE_AUCTION			(10 * PULSE_PER_SECOND)

// Return types for move_char, damage, greet_trigger, etc, etc
// Added by Thoric to get rid of bugs
enum ret_types { rNONE, rCHAR_DIED, rVICT_DIED, rBOTH_DIED, rCHAR_QUIT,
				 rVICT_QUIT, rBOTH_QUIT, rSPELL_FAILED, rOBJ_SCRAPPED,
				 rOBJ_EATEN, rOBJ_EXPIRED, rOBJ_TIMER, rOBJ_SACCED,
				 rOBJ_QUAFFED, rOBJ_USED, rOBJ_EXTRACTED, rOBJ_DRUNK,
				 rCHAR_IMMUNE, rVICT_IMMUNE, rCHAR_AND_OBJ_EXTRACTED = 128,
				 rERROR = 255 };

// Echo types for echo_to_all
#define		ECHOTAR_ALL		0
#define		ECHOTAR_PC		1
#define		ECHOTAR_IMM		2


// npc races
#define	RACE_DRAGON			31

#define CLASS_NONE			-1	// For skill/spells according to guild
#define RACE_NONE			-1

// TO types for act.
#define TO_ROOM		    0
#define TO_NOTVICT	    1
#define TO_VICT		    2
#define TO_CHAR		    3

// Real action "TYPES" for act.
#define AT_BLACK		0
#define AT_BLOOD		1
#define AT_DGREEN		2
#define AT_ORANGE		3
#define AT_DBLUE		4
#define AT_PURPLE		5
#define AT_CYAN			6
#define AT_GREY			7
#define AT_DGREY		8
#define AT_RED			9
#define AT_GREEN		10
#define AT_YELLOW		11
#define AT_BLUE			12
#define AT_PINK			13
#define AT_LBLUE		14
#define AT_WHITE		15
#define AT_BLINK		16
#define AT_PLAIN		AT_GREY
#define AT_ACTION		AT_GREY
#define AT_SAY			AT_LBLUE
#define AT_GOSSIP		AT_LBLUE
#define AT_YELL			AT_WHITE
#define AT_TELL			AT_WHITE
#define AT_HIT			AT_WHITE
#define AT_HITME		AT_YELLOW
#define AT_IMMORT		AT_YELLOW
#define AT_HURT			AT_RED
#define AT_FALLING		AT_WHITE + AT_BLINK
#define AT_DANGER		AT_RED + AT_BLINK
#define AT_MAGIC		AT_BLUE
#define AT_CONSIDER		AT_GREY
#define AT_REPORT		AT_GREY
#define AT_POISON		AT_GREEN
#define AT_SOCIAL		AT_CYAN
#define AT_DYING		AT_YELLOW
#define AT_DEAD			AT_RED
#define AT_SKILL		AT_GREEN
#define AT_CARNAGE		AT_BLOOD
#define AT_DAMAGE		AT_WHITE
#define AT_FLEE			AT_YELLOW
#define AT_RMNAME		AT_WHITE
#define AT_RMDESC		AT_YELLOW
#define AT_OBJECT		AT_GREEN
#define AT_PERSON		AT_PINK
#define AT_LIST			AT_BLUE
#define AT_BYE			AT_GREEN
#define AT_GOLD			AT_YELLOW
#define AT_GTELL		AT_BLUE
#define AT_NOTE			AT_GREEN
#define AT_HUNGRY		AT_ORANGE
#define AT_THIRSTY		AT_BLUE
#define	AT_FIRE			AT_RED
#define AT_SOBER		AT_WHITE
#define AT_WEAROFF		AT_YELLOW
#define AT_EXITS		AT_WHITE
#define AT_SCORE		AT_LBLUE
#define AT_RESET		AT_DGREEN
#define AT_LOG			AT_PURPLE
#define AT_DIEMSG		AT_WHITE
#define AT_WARTALK		AT_RED
#define AT_RACETALK		AT_DGREEN
#define AT_IGNORE		AT_GREEN
#define AT_DIVIDER		AT_PLAIN
#define AT_MORPH		AT_GREY

#define INIT_WEAPON_CONDITION	12
#define MAX_ITEM_IMPACT			30

#define	LANG_ALL		0

// Connected state for a channel.
enum connection_types {
  CON_PLAYING = 1,
  CON_GET_NAME,			CON_GET_NEW_NAME,		CON_CONFIRM_NEW_NAME,
  CON_GET_OLD_PASSWORD,	CON_GET_NEW_PASSWORD,	CON_CONFIRM_NEW_PASSWORD,
  CON_GET_NEW_SEX,		CON_GET_NEW_CLASS,		CON_GET_NEW_RACE,
  CON_READ_MOTD,		CON_EDITING,			CON_GET_WANT_RIPANSI,
  CON_PRESS_ENTER,		CON_REDO_CLASS,			CON_REDO_RACE
};


// Character substates
enum char_substates {
  SUB_NONE, SUB_PAUSE, SUB_PERSONAL_DESC, SUB_OBJ_SHORT, SUB_OBJ_LONG,
  SUB_OBJ_EXTRA, SUB_MOB_LONG, SUB_MOB_DESC, SUB_ROOM_DESC, SUB_ROOM_EXTRA,
  SUB_ROOM_EXIT_DESC, SUB_WRITING_NOTE, SUB_MPROG_EDIT, SUB_HELP_EDIT,
  SUB_WRITING_MAP, SUB_PERSONAL_BIO, SUB_REPEATCMD, SUB_RESTRICTED,
  SUB_DEITYDESC,
  // timer types ONLY below this point
  SUB_TIMER_DO_ABORT = 128, SUB_TIMER_CANT_ABORT };


// Site ban structure.
class CBanData {
public:
				CBanData () { memset (this, 0, sizeof (CBanData)); }
				~CBanData () { delete name; delete ban_time; }
	CBanData	*GetNext () { return m_pNext; }
	void		SetNext (CBanData* n) { m_pNext = n; }
	CBanData	*GetPrev () { return m_pPrev; }
	void		SetPrev (CBanData* n) { m_pPrev = n; }

	CBanData	*m_pNext;
	CBanData	*m_pPrev;
	char		*name;
	int			level;
	char		*ban_time;
};


// Time and weather stuff.
typedef enum
{
  SUN_DARK, SUN_RISE, SUN_LIGHT, SUN_SET
} sun_positions;

typedef enum
{
  SKY_CLOUDLESS, SKY_CLOUDY, SKY_RAINING, SKY_LIGHTNING
} sky_conditions;

class time_info_data {
public:
	int		hour;
	int		day;
	int		month;
	int		year;
};

class CWeatherData {
public:
	int		mmhg;
	int		change;
	int		sky;
	int		sunlight;
};


// Wislist data item
class CWizData {
public:
				CWizData () { memset (this, 0, sizeof (CWizData)); }
				~CWizData () { delete name; }
	CWizData	*GetNext () { return m_pNext; }
	void		SetNext (CWizData* n) { m_pNext = n; }
	CWizData	*GetLast () { return m_pLast; }
	void		SetLast (CWizData* n) { m_pLast = n; }

	CWizData	*m_pNext;
	CWizData	*m_pLast;
	char		*name;
	short		level;
};


// Attribute bonus structures.
struct str_app_type
{
	short	tohit;
	short	todam;
	short	carry;
	short	wield;
};

struct int_app_type
{
	short	learn;
};

struct wis_app_type
{
	short	practice;
};

struct dex_app_type
{
	short	defensive;
};

struct con_app_type
{
	short	hitp;
	short	shock;
};

struct cha_app_type
{
	short	charm;
};

struct lck_app_type
{
	short	luck;
};


// Shop types.
#define MAX_TRADE	 5

class CShopData {
public:
				CShopData () { memset (this, 0, sizeof (CShopData)); }
	CShopData	*GetNext () { return m_pNext; }
	void		SetNext (CShopData* n) { m_pNext = n; }
	CShopData	*GetPrev () { return m_pPrev; }
	void		SetPrev (CShopData* n) { m_pPrev = n; }

	CShopData	*m_pNext;				// Next shop in list
	CShopData	*m_pPrev;				// Previous shop in list
	int			keeper;					// Vnum of shop keeper mob
	short		buy_type [MAX_TRADE];	// Item types shop will buy
	short		profit_buy;				// Cost multiplier for buying
	short		profit_sell;			// Cost multiplier for selling
	short		open_hour;				// First opening hour
	short		close_hour;				// First closing hour
};

#define MAX_FIX			3
#define SHOP_FIX		1
#define SHOP_RECHARGE	2

class CRepairShopData {
public:
					CRepairShopData () { memset (this, 0, sizeof (CRepairShopData)); }
	CRepairShopData	*GetNext () { return m_pNext; }
	void			SetNext (CRepairShopData* n) { m_pNext = n; }
	CRepairShopData	*GetPrev () { return m_pPrev; }
	void			SetPrev (CRepairShopData* n) { m_pPrev = n; }

	CRepairShopData	*m_pNext;			// Next shop in list
	CRepairShopData	*m_pPrev;			// Previous shop in list
	int				keeper;				// Vnum of shop keeper mob
	short			fix_type [MAX_FIX];	// Item types shop will fix
	short			profit_fix;			// Cost multiplier for fixing
	short			shop_type;			// Repair shop type
	short			open_hour;			// First opening hour
	short			close_hour;			// First closing hour
};


// Mob program structures
class CActProgData {
public:
					CActProgData () { m_pNext = NULL; vo = NULL; }
	CActProgData	*GetNext () { return m_pNext; }
	void			SetNext (CActProgData* n) { m_pNext = n; }

	CActProgData	*m_pNext;
	void			*vo;
};


class CMobProgActList {
public:
					CMobProgActList () { memset (this, 0, sizeof (CMobProgActList)); }
					~CMobProgActList ();
	CMobProgActList	*GetNext () { return m_pNext; }
	void			SetNext (CMobProgActList* n) { m_pNext = n; }

	CMobProgActList	*m_pNext;
	char			*buf;
	CCharacter		*ch;
	CObjData		*obj;
	void			*vo;
};


class CMobProgData {
public:
					CMobProgData () { memset (this, 0, sizeof (CMobProgData)); }
					~CMobProgData ();

	int				type;
	BOOL			triggered;
	int				resetdelay;
	char			*arglist;
	char			*comlist;
};


enum group_types { GROUP_CLAN, GROUP_COUNCIL, GROUP_GUILD };


class CCouncilData {
public:
					CCouncilData () { memset (this, 0, sizeof (CCouncilData)); }
					~CCouncilData ();
	CCouncilData	*GetNext () { return m_pNext; }
	void			SetNext (CCouncilData* n) { m_pNext = n; }
	CCouncilData	*GetPrev () { return m_pPrev; }
	void			SetPrev (CCouncilData* n) { m_pPrev = n; }

	char		*GetName () { return name; }
	void		SetName (char* n) { name = n; }
	short		GetMembers () { return m_Members; }
	void		SetMembers (short n) { m_Members = n; }
	void		AddMembers (short n) { m_Members = max (0, m_Members + n); }

	CCouncilData	*m_pNext;		// next council in list
	CCouncilData	*m_pPrev;		// previous council in list
	char			*filename;		// Council filename
	char			*name;			// Council name
	char			*description;	// A brief description of the council
	char			*head;			// Council head
	char			*powers;		// Council powers
	short			m_Members;		// Number of council members
	int				board;			// Vnum of council board
	int				meeting;		// Vnum of council's meeting room
};


struct tourney_data
{
	int		open;
	int		low_level;
	int		hi_level;
};

// Data structure for notes.
class CNoteData {
public:
				CNoteData () { memset (this, 0, sizeof (CNoteData)); }
				~CNoteData ();
	CNoteData	*GetNext () { return m_pNext; }
	void		SetNext (CNoteData* n) { m_pNext = n; }
	CNoteData	*GetPrev () { return m_pPrev; }
	void		SetPrev (CNoteData* n) { m_pPrev = n; }

	CNoteData	*m_pNext;
	CNoteData	*m_pPrev;
	char		*sender;
	char		*date;
	char		*to_list;
	char		*subject;
	int         voting;
	char		*yesvotes;
	char		*novotes;
	char		*abstentions;
	char		*text;					// STRALLOC
};


/***************************************************************************
 *                                                                         *
 *                   VALUES OF INTEREST TO AREA BUILDERS                   *
 *                   (Start of section ... start here)                     *
 *                                                                         *
 ***************************************************************************/

// Well known mob virtual numbers.
// Defined in #MOBILES.
#define MOB_VNUM_CITYGUARD			3060
#define MOB_VNUM_VAMPIRE			3404
#define MOB_VNUM_ANIMATED_CORPSE	5
#define MOB_VNUM_POLY_WOLF			10
#define MOB_VNUM_POLY_MIST			11
#define MOB_VNUM_POLY_BAT			12
#define MOB_VNUM_POLY_HAWK			13
#define MOB_VNUM_POLY_CAT			14
#define MOB_VNUM_POLY_DOVE			15
#define MOB_VNUM_POLY_FISH			16


// Resistant Immune Susceptible flags
#define RIS_FIRE		BV00
#define RIS_COLD		BV01
#define RIS_ELECTRICITY	BV02
#define RIS_ENERGY		BV03
#define RIS_BLUNT		BV04
#define RIS_PIERCE		BV05
#define RIS_SLASH		BV06
#define RIS_ACID		BV07
#define RIS_POISON		BV08
#define RIS_DRAIN		BV09
#define RIS_SLEEP		BV10
#define RIS_CHARM		BV11
#define RIS_HOLD		BV12
#define RIS_NONMAGIC	BV13
#define RIS_PLUS1		BV14
#define RIS_PLUS2		BV15
#define RIS_PLUS3		BV16
#define RIS_PLUS4		BV17
#define RIS_PLUS5		BV18
#define RIS_PLUS6		BV19
#define RIS_MAGIC		BV20
#define RIS_PARALYSIS	BV21
// 22 RIS's

// Body parts
#define PART_HEAD			BV00
#define PART_ARMS			BV01
#define PART_LEGS			BV02
#define PART_HEART			BV03
#define PART_BRAINS			BV04
#define PART_GUTS			BV05
#define PART_HANDS			BV06
#define PART_FEET			BV07
#define PART_FINGERS		BV08
#define PART_EAR			BV09
#define PART_EYE			BV10
#define PART_LONG_TONGUE	BV11
#define PART_EYESTALKS		BV12
#define PART_TENTACLES		BV13
#define PART_FINS			BV14
#define PART_WINGS			BV15
#define PART_TAIL			BV16
#define PART_SCALES			BV17
// for combat
#define PART_CLAWS			BV18
#define PART_FANGS			BV19
#define PART_HORNS			BV20
#define PART_TUSKS			BV21
#define PART_TAILATTACK		BV22
#define PART_SHARPSCALES	BV23
#define PART_BEAK			BV24

#define PART_HAUNCH			BV25
#define PART_HOOVES			BV26
#define PART_PAWS			BV27
#define PART_FORELEGS		BV28
#define PART_FEATHERS		BV29

// Autosave flags
#define SV_DEATH		  BV00
#define SV_KILL			  BV01
#define SV_PASSCHG		  BV02
#define SV_DROP			  BV03
#define SV_PUT			  BV04
#define SV_GIVE			  BV05
#define SV_AUTO			  BV06
#define SV_ZAPDROP		  BV07
#define SV_AUCTION		  BV08
#define SV_GET			  BV09
#define SV_RECEIVE		  BV10
#define SV_IDLE			  BV11
#define SV_BACKUP		  BV12

// Pipe flags
#define PIPE_TAMPED			BV01
#define PIPE_LIT			BV02
#define PIPE_HOT			BV03
#define PIPE_DIRTY			BV04
#define PIPE_FILTHY			BV05
#define PIPE_GOINGOUT		BV06
#define PIPE_BURNT			BV07
#define PIPE_FULLOFASH		BV08

// Skill/Spell flags
#define SF_WATER		BV00
#define SF_EARTH		BV01
#define SF_AIR			BV02
#define SF_ASTRAL		BV03
#define SF_AREA			BV04	// is an area spell
#define SF_DISTANT		BV05	// affects something far away
#define SF_REVERSE		BV06
#define SF_NOSELF		BV07	// Can't target yourself!
#define SF_UNUSED2		BV08	// free for use!
#define SF_ACCUMULATIVE	BV09	// is accumulative
#define SF_RECASTABLE	BV10	// can be refreshed
#define SF_NOSCRIBE		BV11	// cannot be scribed
#define SF_NOBREW		BV12	// cannot be brewed
#define SF_GROUPSPELL	BV13	// only affects group members
#define SF_OBJECT		BV14	// directed at an object
#define SF_CHARACTER	BV15	// directed at a character
#define SF_SECRETSKILL	BV16	// hidden unless learned
#define SF_PKSENSITIVE	BV17	// much harder for plr vs. plr
#define SF_STOPONFAIL	BV18	// stops spell on first failure
#define SF_NOFIGHT		BV19	// stops if char fighting
#define SF_NODISPEL		BV20	// stops spell from being dispelled

enum save_types { SS_NONE, SS_POISON_DEATH, SS_ROD_WANDS, SS_PARA_PETRI,
				  SS_BREATH, SS_SPELL_STAFF };

#define ALL_BITS		INT_MAX
#define SDAM_MASK		ALL_BITS & ~(BV00 | BV01 | BV02)
#define SACT_MASK		ALL_BITS & ~(BV03 | BV04 | BV05)
#define SCLA_MASK		ALL_BITS & ~(BV06 | BV07 | BV08)
#define SPOW_MASK		ALL_BITS & ~(BV09 | BV10)

enum spell_dam_types { SD_NONE, SD_FIRE, SD_COLD, SD_ELECTRICITY, SD_ENERGY,
					   SD_ACID, SD_POISON, SD_DRAIN };

enum spell_act_types { SA_NONE, SA_CREATE, SA_DESTROY, SA_RESIST, SA_SUSCEPT,
					   SA_DIVINATE, SA_OBSCURE, SA_CHANGE };

enum spell_power_types { SP_NONE, SP_MINOR, SP_GREATER, SP_MAJOR };

enum spell_class_types { SC_NONE, SC_LUNAR, SC_SOLAR, SC_TRAVEL, SC_SUMMON,
						 SC_LIFE, SC_DEATH, SC_ILLUSION };

enum spell_save_effects { SE_NONE, SE_NEGATE, SE_EIGHTHDAM, SE_QUARTERDAM,
						  SE_HALFDAM, SE_3QTRDAM, SE_REFLECT, SE_ABSORB };

// Sex.
// Used in #MOBILES.
enum sex_types { SEX_NEUTRAL, SEX_MALE, SEX_FEMALE };

enum trap_types {
  TRAP_TYPE_POISON_GAS = 1, TRAP_TYPE_POISON_DART,    TRAP_TYPE_POISON_NEEDLE,
  TRAP_TYPE_POISON_DAGGER,  TRAP_TYPE_POISON_ARROW,   TRAP_TYPE_BLINDNESS_GAS,
  TRAP_TYPE_SLEEPING_GAS,   TRAP_TYPE_FLAME,	      TRAP_TYPE_EXPLOSION,
  TRAP_TYPE_ACID_SPRAY,	    TRAP_TYPE_ELECTRIC_SHOCK, TRAP_TYPE_BLADE,
  TRAP_TYPE_SEX_CHANGE };

#define MAX_TRAPTYPE		TRAP_TYPE_SEX_CHANGE

#define TRAP_ROOM			BV00
#define TRAP_OBJ			BV01
#define TRAP_ENTER_ROOM		BV02
#define TRAP_LEAVE_ROOM		BV03
#define TRAP_OPEN			BV04 
#define TRAP_CLOSE			BV05
#define TRAP_GET			BV06
#define TRAP_PUT			BV07
#define TRAP_PICK			BV08
#define TRAP_UNLOCK			BV09
#define TRAP_N				BV10
#define TRAP_S				BV11 
#define TRAP_E				BV12
#define TRAP_W				BV13
#define TRAP_U				BV14
#define TRAP_D				BV15
#define TRAP_EXAMINE		BV16
#define TRAP_NE				BV17
#define TRAP_NW				BV18
#define TRAP_SE				BV19
#define TRAP_SW				BV20

// Well known object virtual numbers.
// Defined in #OBJECTS.
#define OBJ_VNUM_MONEY_ONE		2
#define OBJ_VNUM_MONEY_SOME		3

#define OBJ_VNUM_CORPSE_NPC		10
#define OBJ_VNUM_CORPSE_PC		11
#define OBJ_VNUM_SEVERED_HEAD	12
#define OBJ_VNUM_TORN_HEART		13
#define OBJ_VNUM_SLICED_ARM		14
#define OBJ_VNUM_SLICED_LEG		15
#define OBJ_VNUM_SPILLED_GUTS	16
#define OBJ_VNUM_BLOOD			17
#define OBJ_VNUM_BLOODSTAIN		18
#define OBJ_VNUM_SCRAPS			19

#define OBJ_VNUM_MUSHROOM		20
#define OBJ_VNUM_LIGHT_BALL		21
#define OBJ_VNUM_SPRING			22

#define OBJ_VNUM_SLICE			24
#define OBJ_VNUM_SHOPPING_BAG	25
#define OBJ_VNUM_BLOODLET		26

#define OBJ_VNUM_FIRE			30
#define OBJ_VNUM_TRAP			31
#define OBJ_VNUM_PORTAL			32

#define OBJ_VNUM_BLACK_POWDER		33
#define OBJ_VNUM_SCROLL_SCRIBING	34
#define OBJ_VNUM_FLASK_BREWING		35
#define OBJ_VNUM_NOTE				36

// Academy eq
#define OBJ_VNUM_SCHOOL_VEST		10308
#define OBJ_VNUM_SCHOOL_SHIELD		10310
#define OBJ_VNUM_SCHOOL_BANNER		10311
#define OBJ_VNUM_SCHOOL_DAGGER		10312
#define OBJ_VNUM_SCHOOL_SWORD		10313
#define OBJ_VNUM_SCHOOL_MACE		10315
#define	OBJ_VNUM_GUIDE				10333
#define	OBJ_VNUM_SACK				123		// Spectral gate

// Item types.
// Used in #OBJECTS.
enum item_types {
  ITEM_NONE, ITEM_LIGHT, ITEM_SCROLL, ITEM_WAND, ITEM_STAFF, ITEM_WEAPON,
  ITEM_FIREWEAPON, ITEM_MISSILE, ITEM_TREASURE, ITEM_ARMOR, ITEM_POTION,
  ITEM_WORN, ITEM_FURNITURE, ITEM_TRASH, ITEM_OLDTRAP, ITEM_CONTAINER,
  ITEM_NOTE, ITEM_DRINK_CON, ITEM_KEY, ITEM_FOOD, ITEM_MONEY, ITEM_PEN,
  ITEM_BOAT, ITEM_CORPSE_NPC, ITEM_CORPSE_PC, ITEM_FOUNTAIN, ITEM_PILL,
  ITEM_BLOOD, ITEM_BLOODSTAIN, ITEM_SCRAPS, ITEM_PIPE, ITEM_HERB_CON,
  ITEM_HERB, ITEM_INCENSE, ITEM_FIRE, ITEM_BOOK, ITEM_SWITCH, ITEM_LEVER,
  ITEM_PULLCHAIN, ITEM_BUTTON, ITEM_DIAL, ITEM_RUNE, ITEM_RUNEPOUCH,
  ITEM_MATCH, ITEM_TRAP, ITEM_MAP, ITEM_PORTAL, ITEM_PAPER,
  ITEM_TINDER, ITEM_LOCKPICK, ITEM_SPIKE, ITEM_DISEASE, ITEM_OIL, ITEM_FUEL,
  ITEM_EMPTY1, ITEM_EMPTY2, ITEM_MISSILE_WEAPON, ITEM_PROJECTILE, ITEM_QUIVER,
  ITEM_SHOVEL, ITEM_SALVE, ITEM_COOK, ITEM_KEYRING, ITEM_ODOR };


#define MAX_ITEM_TYPE		ITEM_ODOR

// Magic flags - extra extra_flags for objects that are used in spells
#define ITEM_RETURNING			BV00
#define ITEM_BACKSTABBER		BV01
#define ITEM_BANE				BV02
#define ITEM_MAGIC_LOYAL		BV03
#define ITEM_HASTE				BV04
#define ITEM_DRAIN				BV05
#define ITEM_LIGHTNING_BLADE  	BV06
#define ITEM_PKDISARMED			BV07 // Maybe temporary, not a perma flag

// Lever/dial/switch/button/pullchain flags
#define TRIG_UP				BV00
#define TRIG_UNLOCK			BV01
#define TRIG_LOCK			BV02
#define TRIG_D_NORTH		BV03
#define TRIG_D_SOUTH		BV04
#define TRIG_D_EAST			BV05
#define TRIG_D_WEST			BV06
#define TRIG_D_UP			BV07
#define TRIG_D_DOWN			BV08
#define TRIG_DOOR			BV09
#define TRIG_CONTAINER		BV10
#define TRIG_OPEN			BV11
#define TRIG_CLOSE			BV12
#define TRIG_PASSAGE		BV13
#define TRIG_OLOAD			BV14
#define TRIG_MLOAD			BV15
#define TRIG_TELEPORT		BV16
#define TRIG_TELEPORTALL	BV17
#define TRIG_TELEPORTPLUS	BV18
#define TRIG_DEATH			BV19
#define TRIG_CAST			BV20
#define TRIG_FAKEBLADE		BV21
#define TRIG_RAND4			BV22
#define TRIG_RAND6			BV23
#define TRIG_TRAPDOOR		BV24
#define TRIG_ANOTHEROOM		BV25
#define TRIG_USEDIAL		BV26
#define TRIG_ABSOLUTEVNUM	BV27
#define TRIG_SHOWROOMDESC	BV28
#define TRIG_AUTORETURN		BV29

#define TELE_SHOWDESC		BV00
#define TELE_TRANSALL		BV01
#define TELE_TRANSALLPLUS	BV02


// Wear flags.
// Used in #OBJECTS.
#define ITEM_TAKE			BV00
#define ITEM_WEAR_FINGER	BV01
#define ITEM_WEAR_NECK		BV02
#define ITEM_WEAR_BODY		BV03
#define ITEM_WEAR_HEAD		BV04
#define ITEM_WEAR_LEGS		BV05
#define ITEM_WEAR_FEET		BV06
#define ITEM_WEAR_HANDS		BV07
#define ITEM_WEAR_ARMS		BV08
#define ITEM_WEAR_SHIELD	BV09
#define ITEM_WEAR_ABOUT		BV10
#define ITEM_WEAR_WAIST		BV11
#define ITEM_WEAR_WRIST		BV12
#define ITEM_WIELD			BV13
#define ITEM_HOLD			BV14
#define ITEM_DUAL_WIELD		BV15
#define ITEM_WEAR_EARS		BV16
#define ITEM_WEAR_EYES		BV17
#define ITEM_MISSILE_WIELD	BV18
#define ITEM_WEAR_BACK		BV19
#define ITEM_WEAR_FACE		BV20
#define ITEM_WEAR_ANKLE		BV21
#define ITEM_WEAR_MAX		21


// Apply types (for affects).
// Used in #OBJECTS.
enum apply_types {
  APPLY_NONE, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_WIS, APPLY_CON,	// 0
  APPLY_SEX, APPLY_CLASS, APPLY_LEVEL, APPLY_AGE, APPLY_HEIGHT,			// 6
  APPLY_WEIGHT, APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_GOLD,			// 11
  APPLY_EXP, APPLY_AC, APPLY_HITROLL, APPLY_DAMROLL,					// 16
  APPLY_SAVING_POISON, APPLY_SAVING_ROD, APPLY_SAVING_PARA,				// 20
  APPLY_SAVING_BREATH, APPLY_SAVING_SPELL, APPLY_CHA, APPLY_AFFECT,		// 23
  APPLY_RESISTANT, APPLY_IMMUNE, APPLY_SUSCEPTIBLE, APPLY_WEAPONSPELL,	// 27
  APPLY_LCK, APPLY_BACKSTAB, APPLY_PICK, APPLY_TRACK, APPLY_STEAL,		// 31
  APPLY_SNEAK, APPLY_HIDE, APPLY_PALM, APPLY_DETRAP, APPLY_DODGE,		// 36
  APPLY_PEEK, APPLY_SCAN, APPLY_GOUGE, APPLY_SEARCH, APPLY_MOUNT,		// 41
  APPLY_DISARM, APPLY_KICK, APPLY_PARRY, APPLY_BASH, APPLY_STUN,		// 46
  APPLY_PUNCH, APPLY_CLIMB, APPLY_GRIP, APPLY_SCRIBE, APPLY_BREW,		// 51
  APPLY_WEARSPELL, APPLY_REMOVESPELL, APPLY_EMOTION, APPLY_MENTALSTATE,	// 56
  APPLY_STRIPSN, APPLY_REMOVE, APPLY_DIG, APPLY_FULL, APPLY_THIRST,		// 60
  APPLY_DRUNK, APPLY_BLOOD, APPLY_COOK, APPLY_RECURRINGSPELL,			// 65
  APPLY_CONTAGIOUS, APPLY_EXT_AFFECT, APPLY_ODOR, APPLY_ROOMFLAG,		// 69
  APPLY_SECTORTYPE, APPLY_ROOMLIGHT, APPLY_TELEVNUM, APPLY_TELEDELAY,	// 73
  MAX_APPLY_TYPE };														// 77

#define REVERSE_APPLY		1000

// Values for containers (value[1]).
// Used in #OBJECTS.
#define CONT_CLOSEABLE		1
#define CONT_PICKPROOF		2
#define CONT_CLOSED			4
#define CONT_LOCKED			8

// Directions.
// Used in #ROOMS.
enum dir_types {
  DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_UP, DIR_DOWN,
  DIR_NORTHEAST, DIR_NORTHWEST, DIR_SOUTHEAST, DIR_SOUTHWEST, DIR_SOMEWHERE
};

#define MAX_DIR			DIR_SOUTHWEST	// max for normal walking
#define DIR_PORTAL		DIR_SOMEWHERE	// portal direction


// Sector types.
// Used in #ROOMS.
enum SectorTypes {
  SECT_INSIDE, SECT_CITY, SECT_FIELD, SECT_FOREST, SECT_HILLS, SECT_MOUNTAIN,
  SECT_WATER_SWIM, SECT_WATER_NOSWIM, SECT_UNDERWATER, SECT_AIR, SECT_DESERT,
  SECT_DUNNO, SECT_OCEANFLOOR, SECT_UNDERGROUND, SECT_MAX
};

// Equpiment wear locations.
// Used in #RESETS.
enum wear_locations {
	WEAR_NONE = -1, WEAR_LIGHT = 0, WEAR_FINGER_L, WEAR_FINGER_R,
	WEAR_NECK_1, WEAR_NECK_2, WEAR_BODY, WEAR_HEAD, WEAR_LEGS, WEAR_FEET,
	WEAR_HANDS, WEAR_ARMS, WEAR_SHIELD, WEAR_ABOUT, WEAR_WAIST, WEAR_WRIST_L,
	WEAR_WRIST_R, WEAR_WIELD, WEAR_HOLD, WEAR_DUAL_WIELD, WEAR_EARS,
	WEAR_EYES, WEAR_MISSILE_WIELD, WEAR_BACK, WEAR_FACE, WEAR_ANKLE_L,
	WEAR_ANKLE_R, MAX_WEAR
};

// Board Types
enum board_types { BOARD_NOTE, BOARD_MAIL };

// Auth Flags
#define FLAG_WRAUTH		      1
#define FLAG_AUTH		      2

/***************************************************************************
 *                                                                         *
 *                   VALUES OF INTEREST TO AREA BUILDERS                   *
 *                   (End of this section ... stop here)                   *
 *                                                                         *
 ***************************************************************************/

// Conditions.
enum conditions { COND_DRUNK, COND_FULL, COND_THIRST, COND_BLOODTHIRST,
				  MAX_CONDS };

// Positions.
enum positions { POS_DEAD, POS_MORTAL, POS_INCAP, POS_STUNNED, POS_SLEEPING,
				 POS_BERSERK, POS_RESTING, POS_AGGRESSIVE, POS_SITTING,
				 POS_FIGHTING, POS_DEFENSIVE, POS_EVASIVE, POS_STANDING,
				 POS_MOUNTED, POS_SHOVE, POS_DRAG, POS_MAX };


// Bits for pc_data->flags.
#define PCFLAG_R1			BV00
#define PCFLAG_DEADLY		BV01
#define PCFLAG_UNAUTHED		BV02
#define PCFLAG_NORECALL		BV03
#define PCFLAG_NOINTRO		BV04
#define PCFLAG_GAG			BV05
#define PCFLAG_RETIRED		BV06
#define PCFLAG_GUEST		BV07
#define PCFLAG_NOSUMMON		BV08
#define PCFLAG_PAGERON		BV09
#define PCFLAG_NOTITLE		BV10

enum timer_types { TIMER_NONE, TIMER_RECENTFIGHT, TIMER_SHOVEDRAG,
				   TIMER_DO_FUN, TIMER_AUTH, TIMER_PKILLED,
				   TIMER_ASUPRESSED, TIMER_NUISANCE };

class CTimerData {
public:
				CTimerData () { memset (this, 0, sizeof (CTimerData)); }
				CTimerData (short ty, short ct, int val, DO_FUN* fun)
				{ m_Type = ty; m_Count = ct; m_Value = val; m_DoFun = fun; }

	short		CountDown () { return --m_Count; }

	short		GetType () { return m_Type; }
	short		GetCount () { return m_Count; }
	int			GetValue () { return m_Value; }

	DO_FUN		*GetDoFun () { return m_DoFun; }
	void		DoFun (CCharacter* ch, char* arg)
				{ ASSERT (m_DoFun); m_DoFun (ch, arg); }

	void		SetType (short t) { m_Type = t; }
	void		SetCount (short c) { m_Count = c; }
	void		SetValue (int v) { m_Value = v; }
	void		SetDoFun (DO_FUN* f) { m_DoFun = f; }

	CTimerData	*GetNext () { return m_pNext; }
	void		SetNext (CTimerData* n) { m_pNext = n; }
	CTimerData	*GetPrev () { return m_pPrev; }
	void		SetPrev (CTimerData* n) { m_pPrev = n; }

private:
	CTimerData	*m_pNext;
	CTimerData	*m_pPrev;
	short		m_Type;
	short		m_Count;
	int			m_Value;
	DO_FUN		*m_DoFun;
};


// Channel bits.
#define	CHANNEL_AUCTION			BV00
#define	CHANNEL_CHAT			BV01
#define	CHANNEL_QUEST			BV02
#define	CHANNEL_IMMTALK			BV03
#define	CHANNEL_MUSIC			BV04
#define	CHANNEL_ASK				BV05
#define	CHANNEL_SHOUT			BV06
#define	CHANNEL_YELL			BV07
#define CHANNEL_MONITOR			BV08
#define CHANNEL_LOG				BV09
#define CHANNEL_HIGHGOD			BV10
#define CHANNEL_CLAN			BV11
#define CHANNEL_BUILD			BV12
#define CHANNEL_HIGH			BV13
#define CHANNEL_AVTALK			BV14
#define CHANNEL_PRAY			BV15
#define CHANNEL_COUNCIL			BV16
#define CHANNEL_GUILD			BV17
#define CHANNEL_COMM			BV18
#define CHANNEL_TELLS			BV19
#define CHANNEL_ORDER			BV20
#define CHANNEL_NEWBIE			BV21
#define CHANNEL_WARTALK			BV22
#define CHANNEL_RACETALK		BV23
#define CHANNEL_WARN			BV24
#define CHANNEL_WHISPER			BV25
#define CHANNEL_AUTH			BV26

// Area defines - Scryn 8/11
#define AREA_DELETED		   BV00
#define AREA_LOADED            BV01

// Area flags - Narn Mar/96
#define AFLAG_NOPKILL			BV00
#define AFLAG_FREEKILL			BV01
#define AFLAG_NOTELEPORT		BV02

struct hunt_hate_fear
{
	char		*name;
	CCharacter	*who;
};

class CFightData {
public:
				CFightData () { memset (this, 0, sizeof (CFightData)); }

	CCharacter	*who;
	int			xp;
	short		align;
	short		duration;
	short		timeskilled;
};


class CExtractedCharData {
public:
						CExtractedCharData ()
						{ memset (this, 0, sizeof (CExtractedCharData)); }
	CExtractedCharData	*GetNext () { return m_pNext; }
	void				SetNext (CExtractedCharData* n) { m_pNext = n; }

	CExtractedCharData	*m_pNext;
	CCharacter			*ch;
	CRoomIndexData		*room;
	ch_ret				retcode;
	BOOL				extract;
};


struct killed_data
{
	int		vnum;
	char	count;
};


// Liquids.
#define LIQ_WATER	0
#define LIQ_MAX		18

struct liq_type
{
	char	*liq_name;
	char	*liq_color;
	short	liq_affect[3];
};



// Extra description data for a room or object.
// destructor is in Objects.cpp
class CExtraDescrData {
public:
			CExtraDescrData () { keyword = description = NULL; }
			~CExtraDescrData ();

	char	*GetDescription () { return description; }
	void	SetDescription (char* p) { description = p; }

	char	*keyword;           // Keyword in look/examine
	char	*description;       // What to see
};



// Constants for arg2 of 'B' resets.
#define	BIT_RESET_DOOR				0
#define BIT_RESET_OBJECT			1
#define BIT_RESET_MOBILE			2
#define BIT_RESET_ROOM				3
#define BIT_RESET_TYPE_MASK			0xFF		// 256 should be enough
#define BIT_RESET_DOOR_THRESHOLD	8
#define BIT_RESET_DOOR_MASK			0xFF00		// 256 should be enough
#define BIT_RESET_SET				BV30
#define BIT_RESET_TOGGLE			BV31
#define BIT_RESET_FREEBITS			0x3FFF0000	// For reference



// Load in the gods building data. -- Altrag
struct	godlist_data
{
	GOD_DATA	*next;
	GOD_DATA	*prev;
	int			level;
	int			low_r_vnum;
	int			hi_r_vnum;
	int			low_o_vnum;
	int			hi_o_vnum;
	int			low_m_vnum;
	int			hi_m_vnum;
};


// Delayed teleport type.
class CTeleportData {
public:
					CTeleportData () { memset (this, 0, sizeof (CTeleportData)); }
	CTeleportData	*GetNext () { return m_pNext; }
	void			SetNext (CTeleportData* n) { m_pNext = n; }
	CTeleportData	*GetPrev () { return m_pPrev; }
	void			SetPrev (CTeleportData* n) { m_pPrev = n; }

	CTeleportData	*m_pNext;
	CTeleportData	*m_pPrev;
	CRoomIndexData	*room;
	short			timer;
};


// Types of skill numbers.  Used to keep separate lists of sn's
// Must be non-overlapping with spell/skill types,
// but may be arbitrary beyond that.
#define TYPE_UNDEFINED	-1
#define TYPE_HIT		1000	// allows for 1000 skills/spells
#define TYPE_HERB		2000	// allows for 1000 attack types
#define TYPE_PERSONAL	3000	// allows for 1000 herb types
#define TYPE_RACIAL		4000	// allows for 1000 personal types
#define TYPE_DISEASE	5000	// allows for 1000 racial types

//  Target types.
typedef enum
{
  TAR_IGNORE, TAR_CHAR_OFFENSIVE, TAR_CHAR_DEFENSIVE, TAR_CHAR_SELF,
  TAR_OBJ_INV
} target_types;

enum CSkills {
  SKILL_UNKNOWN, SKILL_SPELL, SKILL_SKILL, SKILL_WEAPON, SKILL_TONGUE,
  SKILL_HERB, SKILL_RACIAL, SKILL_DISEASE
};



struct timerset
{
	int				num_uses;
	struct timeval	total_time;
	struct timeval	min_time;
	struct timeval	max_time;
};


// These are skill_lookup return values for common skills and spells.
extern short	gsn_detrap;
extern short	gsn_backstab;
extern short	gsn_circle;
extern short	gsn_cook;
extern short	gsn_dodge;
extern short	gsn_hide;
extern short	gsn_peek;
extern short	gsn_pick_lock;
extern short	gsn_scan;
extern short	gsn_sneak;
extern short	gsn_steal;
extern short	gsn_gouge;
extern short	gsn_track;
extern short	gsn_search;
extern short	gsn_dig;
extern short	gsn_mount;
extern short	gsn_bashdoor;
extern short	gsn_berserk;
extern short	gsn_hitall;

extern short	gsn_disarm;
extern short	gsn_enhanced_damage;
extern short	gsn_kick;
extern short	gsn_parry;
extern short	gsn_rescue;
extern short	gsn_second_attack;
extern short	gsn_third_attack;
extern short	gsn_fourth_attack;
extern short	gsn_fifth_attack;
extern short	gsn_dual_wield;

extern short	gsn_feed;
extern short	gsn_bloodlet;
extern short	gsn_broach;
extern short	gsn_mistwalk;
extern short	gsn_aid;

// used to do specific lookups
extern short	gsn_first_spell;
extern short	gsn_first_skill;
extern short	gsn_first_weapon;
extern short	gsn_first_tongue;
extern short	gsn_top_sn;

// styles
extern short	gsn_style_evasive;
extern short	gsn_style_defensive;
extern short	gsn_style_standard;
extern short	gsn_style_aggressive;
extern short	gsn_style_berserk;

// spells
extern short	gsn_blindness;
extern short	gsn_charm_person;
extern short	gsn_aqua_breath;
extern short	gsn_curse;
extern short	gsn_invis;
extern short	gsn_mass_invis;
extern short	gsn_poison;
extern short	gsn_sleep;
extern short	gsn_possess;
extern short	gsn_fireball;			// for fireshield
extern short	gsn_chill_touch;		// for iceshield
extern short	gsn_lightning_bolt;		// for shockshield

// newer attack skills
extern short	gsn_punch;
extern short	gsn_bash;
extern short	gsn_stun;
extern short	gsn_bite;
extern short	gsn_claw;
extern short	gsn_sting;
extern short	gsn_tail;

extern short	gsn_poison_weapon;
extern short	gsn_scribe;
extern short	gsn_brew;
extern short	gsn_climb;

extern short	gsn_pugilism;
extern short	gsn_long_blades;
extern short	gsn_short_blades;
extern short	gsn_flexible_arms;
extern short	gsn_talonous_arms;
extern short	gsn_bludgeons;
extern short	gsn_missile_weapons;
extern short	gsn_shieldwork;

extern short	 gsn_grip;
extern short	 gsn_slice;

// Language gsns. -- Altrag
extern short	 gsn_common;
extern short	 gsn_elven;
extern short	 gsn_dwarven;
extern short	 gsn_pixie;
extern short	 gsn_ogre;
extern short	 gsn_orcish;
extern short	 gsn_trollish;
extern short	 gsn_goblin;
extern short	 gsn_halfling;

// Utility macros.
#define UMIN(a, b)		((a) < (b) ? (a) : (b))
#define UMAX(a, b)		((a) > (b) ? (a) : (b))
#define URANGE(a,b,c)	((b) < (a) ? (a) : ((b) > (c) ? (c) : (b)))
#define LOWER(c)		((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c))
#define UPPER(c)		((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c))
#define IS_SET(flag,bit)	((flag) & (bit)) != 0
#define SET_BIT(var,bit)	((var) |= (bit))
#define REMOVE_BIT(var,bit)	((var) &= ~(bit))
#define TOGGLE_BIT(var,bit)	((var) ^= (bit))


// Memory allocation macros.
// Since we are using two different memory allocation schemes, we have to
// make sure we handle each block with the same allocation and de-allocation
// method.  The schemes we're currently using are:
// a) c++ new and delete.
// b) STRALLOC macro - maps to the built-in string hashing scheme.
//
// Internally, the hashed strings also use new and delete. (RCP)
#ifdef HASHSTR
#define STRALLOC(point)		str_alloc((point))
#define QUICKLINK(point)	quick_link((point))
#define QUICKMATCH(p1,p2)	(int) (p1) == (int) (p2)

#define	STRFREE(point)	StrFree (point, __FILE__, __LINE__)

//#define STRFREE(point)							\
//do {												\
//  if ((point))									\
//	if (str_free(point) == -1) 						\
//	gpDoc->m_pLog->Printf							\
//		("STRFREEing bad pointer in %s, line %d\n",	\
//		__FILE__, __LINE__ );						\
//} while(0)

#else
#define STRALLOC(point)		str_dup((point))
#define QUICKLINK(point)	str_dup((point))
#define QUICKMATCH(p1,p2)	strcmp((p1), (p2)) == 0
#define STRFREE(point)		if (point) free(point)
} while(0)
#endif



// double-linked list handling macros -Thoric
// I've converted some of the linked lists over to use the MFC CPtrList,
// so far I don't see any noticable performance hit.  I'll continue to
// convert these lists, especially the ones which have code to maintain
// them other than these three macros.  The chances of a program error are
// much smaller with the CPtrLists - RCP.
#define LINK(link,first,last)		\
do									\
{									\
	if (!(first))					\
		(first) = (link);			\
	else (last)->SetNext (link);	\
	(link)->SetNext (NULL);			\
	(link)->SetPrev (last);			\
	(last) = (link);				\
} while(0)

#define INSERT(link,insert,first)				\
do {											\
    (link)->SetPrev ((insert)->GetPrev ());		\
    if (!(insert)->GetPrev ())					\
      (first) = (link);							\
    else										\
      (insert)->GetPrev()->SetNext (link);		\
    (insert)->SetPrev (link);					\
    (link)->SetNext (insert);					\
} while(0)

#define UNLINK(link,first,last)								\
do															\
{															\
	if (!(link)->GetPrev ())								\
		(first) = (link)->GetNext ();						\
	else (link)->GetPrev()->SetNext((link)->GetNext());		\
	if (!(link)->GetNext ())								\
		(last) = (link)->GetPrev ();						\
	else (link)->GetNext()->SetPrev((link)->GetPrev());		\
} while(0)


// Global constants.
extern const	struct	str_app_type	str_app		[26];
extern const	struct	int_app_type	int_app		[26];
extern const	struct	wis_app_type	wis_app		[26];
extern const	struct	dex_app_type	dex_app		[26];
extern const	struct	con_app_type	con_app		[26];
extern const	struct	cha_app_type	cha_app		[26];
extern const	struct	lck_app_type	lck_app		[26];

extern const	struct	liq_type	liq_table	[LIQ_MAX];
extern char*	const			attack_table	[18];

extern char*	const	skill_tname [];
extern short	const	movement_loss [SECT_MAX];
extern char*	const	dir_name	[];
extern char*	const	where_name	[];
extern const	short	rev_dir		[];
extern const	int		trap_door	[];
extern char*	const	r_flags		[];
extern char*	const	w_flags		[];
extern char*	const	o_types		[];
extern char*	const	a_types		[];
extern char*	const	pc_flags	[];
extern char*	const	trap_flags	[];
extern char*	const	ris_flags	[];
extern char*	const	trig_flags	[];
extern char*	const	part_flags	[];
extern char*	const	area_flags [];

// Global variables.
extern int				numobjsloaded;
extern int				top_vroom;

extern CRoomIndexData	*vroom_hash [MAX_VROOMS];


extern CCharacter		*cur_char;
extern CRoomIndexData	*cur_room;
extern BOOL				cur_char_died;
extern ch_ret			global_retcode;

extern int				cur_obj;
extern int				cur_obj_serial;
extern BOOL				cur_obj_extracted;
extern obj_ret			global_objcode;

extern CShopData		*first_shop;
extern CShopData		*last_shop;
extern CRepairShopData	*first_repair;
extern CRepairShopData	*last_repair;

extern CBanData			*first_ban;
extern CBanData			*last_ban;
extern CCharacter		*first_char;
extern CCharacter		*last_char;
extern CCouncilData		*first_council;
extern CCouncilData		*last_council;
extern CDeityData		*first_deity;
extern CDeityData		*last_deity;

extern CTeleportData	*first_teleport;
extern CTeleportData	*last_teleport;
extern CObjData			*extracted_obj_queue;
extern CExtractedCharData	*extracted_char_queue;
extern CObjData			*save_equipment [MAX_WEAR][MAX_LAYERS];
extern CCharacter		*quitting_char;
extern CCharacter		*loading_char;
extern CCharacter		*saving_char;
extern CObjData			*all_obj;

extern char				bug_buf		[];
extern BOOL				fLogAll;
extern char				log_buf		[];
extern time_info_data	time_info;
extern CWeatherData		weather_info;

extern int				top_ed;
extern int				top_exit;
extern int				top_affect;
extern CActProgData		*mob_act_list;


// Command functions.
// Defined in act_*.c (mostly).
DECLARE_DO_FUN(skill_notfound);
DECLARE_DO_FUN(do_aassign);
DECLARE_DO_FUN(do_advance);
DECLARE_DO_FUN(do_affected);
DECLARE_DO_FUN(do_afk);
DECLARE_DO_FUN(do_aid);
DECLARE_DO_FUN(do_allow);
DECLARE_DO_FUN(do_ansi);
DECLARE_DO_FUN(do_answer);
DECLARE_DO_FUN(do_apply);
DECLARE_DO_FUN(do_appraise);
DECLARE_DO_FUN(do_areas);
DECLARE_DO_FUN(do_aset);
DECLARE_DO_FUN(do_ask);
DECLARE_DO_FUN(do_astat);
DECLARE_DO_FUN(do_at);
DECLARE_DO_FUN(do_atmob);
DECLARE_DO_FUN(do_atobj);
DECLARE_DO_FUN(do_auction);
DECLARE_DO_FUN(do_authorize);
DECLARE_DO_FUN(do_AutoAuthorize);
DECLARE_DO_FUN(do_avtalk);
DECLARE_DO_FUN(do_backstab);
DECLARE_DO_FUN(do_balzhur);
DECLARE_DO_FUN(do_bamfin);
DECLARE_DO_FUN(do_bamfout);
DECLARE_DO_FUN(do_ban);
DECLARE_DO_FUN(do_bash);
DECLARE_DO_FUN(do_bashdoor);
DECLARE_DO_FUN(do_berserk);
DECLARE_DO_FUN(do_bestow);
DECLARE_DO_FUN(do_bestowarea);
DECLARE_DO_FUN(do_bio);
DECLARE_DO_FUN(do_bite);
DECLARE_DO_FUN(do_boards);
DECLARE_DO_FUN(do_bodybag);
DECLARE_DO_FUN(do_brandish);
DECLARE_DO_FUN(do_brew);
DECLARE_DO_FUN(do_bset);
DECLARE_DO_FUN(do_bstat);
DECLARE_DO_FUN(do_bug);
DECLARE_DO_FUN(do_bury);
DECLARE_DO_FUN(do_buy);
DECLARE_DO_FUN(do_cast);
DECLARE_DO_FUN(do_cedit);
DECLARE_DO_FUN(do_channels);
DECLARE_DO_FUN(do_chat);
DECLARE_DO_FUN(do_check_vnums);
DECLARE_DO_FUN(do_circle);
DECLARE_DO_FUN(do_clans);
DECLARE_DO_FUN(do_clantalk);
DECLARE_DO_FUN(do_claw);
DECLARE_DO_FUN(do_climb);
DECLARE_DO_FUN(do_close);
DECLARE_DO_FUN(do_cmdtable);
DECLARE_DO_FUN(do_commands);
DECLARE_DO_FUN(do_comment);
DECLARE_DO_FUN(do_compare);
DECLARE_DO_FUN(do_config);
DECLARE_DO_FUN(do_consider);
DECLARE_DO_FUN(do_cook);
DECLARE_DO_FUN(do_council_induct);
DECLARE_DO_FUN(do_council_outcast);
DECLARE_DO_FUN(do_councils);
DECLARE_DO_FUN(do_counciltalk);
DECLARE_DO_FUN(do_credits);
DECLARE_DO_FUN(do_cset);
DECLARE_DO_FUN(do_deities);
DECLARE_DO_FUN(do_deny);
DECLARE_DO_FUN(do_description);
DECLARE_DO_FUN(do_destro);
DECLARE_DO_FUN(do_destroy);
DECLARE_DO_FUN(do_detrap);
DECLARE_DO_FUN(do_devote);
DECLARE_DO_FUN(do_dig);
DECLARE_DO_FUN(do_disarm);
DECLARE_DO_FUN(do_disconnect);
DECLARE_DO_FUN(do_dismiss);
DECLARE_DO_FUN(do_dismount);
DECLARE_DO_FUN(do_dmesg);
DECLARE_DO_FUN(do_down);
DECLARE_DO_FUN(do_drag);
DECLARE_DO_FUN(do_drink);
DECLARE_DO_FUN(do_drop);
DECLARE_DO_FUN(do_diagnose);
DECLARE_DO_FUN(do_east);
DECLARE_DO_FUN(do_eat);
DECLARE_DO_FUN(do_echo);
DECLARE_DO_FUN(do_elevate);
DECLARE_DO_FUN(do_emote);
DECLARE_DO_FUN(do_empty);
DECLARE_DO_FUN(do_enter);
DECLARE_DO_FUN(do_equipment);
DECLARE_DO_FUN(do_examine);
DECLARE_DO_FUN(do_exits);
DECLARE_DO_FUN(do_feed);
DECLARE_DO_FUN(do_fill);
DECLARE_DO_FUN(do_fire);
DECLARE_DO_FUN(do_fixchar);
DECLARE_DO_FUN(do_flee);
DECLARE_DO_FUN(do_foldarea);
DECLARE_DO_FUN(do_follow);
DECLARE_DO_FUN(do_for);
DECLARE_DO_FUN(do_force);
DECLARE_DO_FUN(do_forceclose);
DECLARE_DO_FUN(do_fquit);			// Gorog
DECLARE_DO_FUN(do_form_password);
DECLARE_DO_FUN(do_freeze);
DECLARE_DO_FUN(do_get);
DECLARE_DO_FUN(do_gfighting);
DECLARE_DO_FUN(do_give);
DECLARE_DO_FUN(do_glance);
DECLARE_DO_FUN(do_gold);
DECLARE_DO_FUN(do_goto);
DECLARE_DO_FUN(do_gouge);
DECLARE_DO_FUN(do_group);
DECLARE_DO_FUN(do_grub);
DECLARE_DO_FUN(do_gtell);
DECLARE_DO_FUN(do_guilds);
DECLARE_DO_FUN(do_guildtalk);
DECLARE_DO_FUN(do_gwhere);
DECLARE_DO_FUN(do_hedit);
DECLARE_DO_FUN(do_hell);
DECLARE_DO_FUN(do_help);
DECLARE_DO_FUN(do_hide);
DECLARE_DO_FUN(do_hitall);
DECLARE_DO_FUN(do_hlist);
DECLARE_DO_FUN(do_holylight);
DECLARE_DO_FUN(do_homepage);
DECLARE_DO_FUN(do_hset);
DECLARE_DO_FUN(do_ide);
DECLARE_DO_FUN(do_idea);
DECLARE_DO_FUN(do_ignore);
DECLARE_DO_FUN(do_immortalize);
DECLARE_DO_FUN(do_immtalk);
DECLARE_DO_FUN(do_induct);
DECLARE_DO_FUN(do_installarea);
DECLARE_DO_FUN(do_instaroom);
DECLARE_DO_FUN(do_instazone);
DECLARE_DO_FUN(do_inventory);
DECLARE_DO_FUN(do_invis);
DECLARE_DO_FUN(do_kick);
DECLARE_DO_FUN(do_kill);
DECLARE_DO_FUN(do_languages);
DECLARE_DO_FUN(do_last);
DECLARE_DO_FUN(do_leave);
DECLARE_DO_FUN(do_level);
DECLARE_DO_FUN(do_light);
DECLARE_DO_FUN(do_list);
DECLARE_DO_FUN(do_litterbug);
DECLARE_DO_FUN(do_loadarea);
DECLARE_DO_FUN(do_loadup);
DECLARE_DO_FUN(do_lock);
DECLARE_DO_FUN(do_log);
DECLARE_DO_FUN(do_look);
DECLARE_DO_FUN(do_low_purge);
DECLARE_DO_FUN(do_mailroom);
DECLARE_DO_FUN(do_make);
DECLARE_DO_FUN(do_makeboard);
DECLARE_DO_FUN(do_makeclan);
DECLARE_DO_FUN(do_makecouncil);
DECLARE_DO_FUN(do_makedeity);
DECLARE_DO_FUN(do_makeguild);
DECLARE_DO_FUN(do_makeorder);
DECLARE_DO_FUN(do_makerepair);
DECLARE_DO_FUN(do_makeshop);
DECLARE_DO_FUN(do_makewizlist);
DECLARE_DO_FUN(do_massign);
DECLARE_DO_FUN(do_memory);
DECLARE_DO_FUN(do_mcreate);
DECLARE_DO_FUN(do_mdelete);
DECLARE_DO_FUN(do_mfind);
DECLARE_DO_FUN(do_minvoke);
DECLARE_DO_FUN(do_mlist);
DECLARE_DO_FUN(do_mount);
DECLARE_DO_FUN(do_mset);
DECLARE_DO_FUN(do_mstat);
DECLARE_DO_FUN(do_murde);
DECLARE_DO_FUN(do_murder);
DECLARE_DO_FUN(do_muse);
DECLARE_DO_FUN(do_music);
DECLARE_DO_FUN(do_mwhere);
DECLARE_DO_FUN(do_name);
DECLARE_DO_FUN(do_newbiechat);
DECLARE_DO_FUN(do_newbieset);
DECLARE_DO_FUN(do_newzones);
DECLARE_DO_FUN(do_noemote);
DECLARE_DO_FUN(do_noresolve);
DECLARE_DO_FUN(do_north);
DECLARE_DO_FUN(do_northeast);
DECLARE_DO_FUN(do_northwest);
DECLARE_DO_FUN(do_notell);
DECLARE_DO_FUN(do_notitle);
DECLARE_DO_FUN(do_noteroom);
DECLARE_DO_FUN(do_oassign);
DECLARE_DO_FUN(do_ocreate);
DECLARE_DO_FUN(do_odelete);
DECLARE_DO_FUN(do_ofind);
DECLARE_DO_FUN(do_ogrub);
DECLARE_DO_FUN(do_oinvoke);
DECLARE_DO_FUN(do_oldscore);
DECLARE_DO_FUN(do_olist);
DECLARE_DO_FUN(do_open);
DECLARE_DO_FUN(do_opentourney);
DECLARE_DO_FUN(do_order);
DECLARE_DO_FUN(do_orders);
DECLARE_DO_FUN(do_ordertalk);
DECLARE_DO_FUN(do_oset);
DECLARE_DO_FUN(do_ostat);
DECLARE_DO_FUN(do_ot);
DECLARE_DO_FUN(do_outcast);
DECLARE_DO_FUN(do_owhere);
DECLARE_DO_FUN(do_pager);
DECLARE_DO_FUN(do_pardon);
DECLARE_DO_FUN(do_password);
DECLARE_DO_FUN(do_pcrename);
DECLARE_DO_FUN(do_peace);
DECLARE_DO_FUN(do_pick);
DECLARE_DO_FUN(do_poison_weapon);
DECLARE_DO_FUN(do_pose);
DECLARE_DO_FUN(do_practice);
DECLARE_DO_FUN(do_prompt);
DECLARE_DO_FUN(do_fprompt);
DECLARE_DO_FUN(do_pull);
DECLARE_DO_FUN(do_punch);
DECLARE_DO_FUN(do_purge);
DECLARE_DO_FUN(do_push);
DECLARE_DO_FUN(do_put);
DECLARE_DO_FUN(do_qpset);
DECLARE_DO_FUN(do_quaff);
DECLARE_DO_FUN(do_quest);
DECLARE_DO_FUN(do_qui);
DECLARE_DO_FUN(do_quit);
DECLARE_DO_FUN(do_racetalk);
DECLARE_DO_FUN(do_rank);
DECLARE_DO_FUN(do_rap);
DECLARE_DO_FUN(do_rassign);
DECLARE_DO_FUN(do_rat);
DECLARE_DO_FUN(do_rdelete);
DECLARE_DO_FUN(do_remains);
DECLARE_DO_FUN(do_reserve);
DECLARE_DO_FUN(do_reboo);
DECLARE_DO_FUN(do_reboot);
DECLARE_DO_FUN(do_recall);
DECLARE_DO_FUN(do_recho);
DECLARE_DO_FUN(do_recite);
DECLARE_DO_FUN(do_redit);
DECLARE_DO_FUN(do_regoto);
DECLARE_DO_FUN(do_remove);
DECLARE_DO_FUN(do_rent);
DECLARE_DO_FUN(do_repair);
DECLARE_DO_FUN(do_repairset);
DECLARE_DO_FUN(do_repairshops);
DECLARE_DO_FUN(do_repairstat);
DECLARE_DO_FUN(do_reply);
DECLARE_DO_FUN(do_report);
DECLARE_DO_FUN(do_rescue);
DECLARE_DO_FUN(do_rest);
DECLARE_DO_FUN(do_reset);
DECLARE_DO_FUN(do_restore);
DECLARE_DO_FUN(do_restoretime);
DECLARE_DO_FUN(do_restrict);
DECLARE_DO_FUN(do_retire);
DECLARE_DO_FUN(do_retran);
DECLARE_DO_FUN(do_return);
DECLARE_DO_FUN(do_revert);
DECLARE_DO_FUN(do_rip);
DECLARE_DO_FUN(do_rlist);
DECLARE_DO_FUN(do_rreset);
DECLARE_DO_FUN(do_rset);
DECLARE_DO_FUN(do_rstat);
DECLARE_DO_FUN(do_sacrifice);
DECLARE_DO_FUN(do_save);
DECLARE_DO_FUN(do_savearea);
DECLARE_DO_FUN(do_say);
DECLARE_DO_FUN(do_scan);
DECLARE_DO_FUN(do_score);
DECLARE_DO_FUN(do_scribe);
DECLARE_DO_FUN(do_search);
DECLARE_DO_FUN(do_sedit);
DECLARE_DO_FUN(do_sell);
DECLARE_DO_FUN(do_set_boot_time);
DECLARE_DO_FUN(do_setclan);
DECLARE_DO_FUN(do_setclass);
DECLARE_DO_FUN(do_setcouncil);
DECLARE_DO_FUN(do_setdeity);
DECLARE_DO_FUN(do_setguild);
DECLARE_DO_FUN(do_setorder);
DECLARE_DO_FUN(do_setrace);
DECLARE_DO_FUN(do_shops);
DECLARE_DO_FUN(do_shopset);
DECLARE_DO_FUN(do_shopstat);
DECLARE_DO_FUN(do_shout);
DECLARE_DO_FUN(do_shove);
DECLARE_DO_FUN(do_showclass);
DECLARE_DO_FUN(do_showclan);
DECLARE_DO_FUN(do_showcouncil);
DECLARE_DO_FUN(do_showdeity);
DECLARE_DO_FUN(do_showguild);
DECLARE_DO_FUN(do_showorder);
DECLARE_DO_FUN(do_showrace);
DECLARE_DO_FUN(do_showbytes);
DECLARE_DO_FUN(do_shutdow);
DECLARE_DO_FUN(do_shutdown);
DECLARE_DO_FUN(do_silence);
DECLARE_DO_FUN(do_sit);
DECLARE_DO_FUN(do_sla);
DECLARE_DO_FUN(do_slay);
DECLARE_DO_FUN(do_sleep);
DECLARE_DO_FUN(do_slice);
DECLARE_DO_FUN(do_slist);
DECLARE_DO_FUN(do_slookup);
DECLARE_DO_FUN(do_smoke);
DECLARE_DO_FUN(do_sneak);
DECLARE_DO_FUN(do_snoop);
DECLARE_DO_FUN(do_sober);
DECLARE_DO_FUN(do_socials);
DECLARE_DO_FUN(do_south);
DECLARE_DO_FUN(do_southeast);
DECLARE_DO_FUN(do_southwest);
DECLARE_DO_FUN(do_speak);
DECLARE_DO_FUN(do_split);
DECLARE_DO_FUN(do_sset);
DECLARE_DO_FUN(do_stand);
DECLARE_DO_FUN(do_starttourney);
DECLARE_DO_FUN(do_stat);
DECLARE_DO_FUN(do_statreport);
DECLARE_DO_FUN(do_steal);
DECLARE_DO_FUN(do_sting);
DECLARE_DO_FUN(do_stun);
DECLARE_DO_FUN(do_supplicate);
DECLARE_DO_FUN(do_switch);
DECLARE_DO_FUN(do_tail);
DECLARE_DO_FUN(do_tamp);
DECLARE_DO_FUN(do_tell);
DECLARE_DO_FUN(do_think);
DECLARE_DO_FUN(do_time);
DECLARE_DO_FUN(do_timecmd);
DECLARE_DO_FUN(do_title);
DECLARE_DO_FUN(do_track);
DECLARE_DO_FUN(do_transfer);
DECLARE_DO_FUN(do_trust);
DECLARE_DO_FUN(do_typo);
DECLARE_DO_FUN(do_unfoldarea);
DECLARE_DO_FUN(do_unhell);
DECLARE_DO_FUN(do_unlock);
DECLARE_DO_FUN(do_unsilence);
DECLARE_DO_FUN(do_up);
DECLARE_DO_FUN(do_users);
DECLARE_DO_FUN(do_value);
DECLARE_DO_FUN(do_versio);
DECLARE_DO_FUN(do_version);
DECLARE_DO_FUN(do_visible);
DECLARE_DO_FUN(do_vnums);
DECLARE_DO_FUN(do_vsearch);
DECLARE_DO_FUN(do_wake);
DECLARE_DO_FUN(do_wartalk);
DECLARE_DO_FUN(do_wear);
DECLARE_DO_FUN(do_weather);
DECLARE_DO_FUN(do_west);
DECLARE_DO_FUN(do_where);
DECLARE_DO_FUN(do_who);
DECLARE_DO_FUN(do_whois);
DECLARE_DO_FUN(do_wimpy);
DECLARE_DO_FUN(do_wizhelp);
DECLARE_DO_FUN(do_wizlist);
DECLARE_DO_FUN(do_wizlock);
DECLARE_DO_FUN(do_yell);
DECLARE_DO_FUN(do_zap);
DECLARE_DO_FUN(do_zones);

// mob prog stuff
DECLARE_DO_FUN(do_mp_close_passage);
DECLARE_DO_FUN(do_mp_damage);
DECLARE_DO_FUN(do_mp_deposit);
DECLARE_DO_FUN(do_mp_withdraw);
DECLARE_DO_FUN(do_mp_restore);
DECLARE_DO_FUN(do_mp_open_passage);
DECLARE_DO_FUN(do_mp_practice);
DECLARE_DO_FUN(do_mp_slay);
DECLARE_DO_FUN(do_mpadvance);
DECLARE_DO_FUN(do_mpasound);
DECLARE_DO_FUN(do_mpasupress);
DECLARE_DO_FUN(do_mpat);
DECLARE_DO_FUN(do_mpbodybag);
DECLARE_DO_FUN(do_mpdream);
DECLARE_DO_FUN(do_mpecho);
DECLARE_DO_FUN(do_mpechoaround);
DECLARE_DO_FUN(do_mpechoat);
DECLARE_DO_FUN(do_mpedit);
DECLARE_DO_FUN(do_mrange);
DECLARE_DO_FUN(do_opedit);
DECLARE_DO_FUN(do_orange);
DECLARE_DO_FUN(do_rpedit);
DECLARE_DO_FUN(do_mpforce);
DECLARE_DO_FUN(do_mpinvis);
DECLARE_DO_FUN(do_mpgoto);
DECLARE_DO_FUN(do_mpjunk);
DECLARE_DO_FUN(do_mpkill);
DECLARE_DO_FUN(do_mpmload);
DECLARE_DO_FUN(do_mpmset);
DECLARE_DO_FUN(do_mpnothing);
DECLARE_DO_FUN(do_mpoload);
DECLARE_DO_FUN(do_mposet);
DECLARE_DO_FUN(do_mppardon);
DECLARE_DO_FUN(do_mppurge);
DECLARE_DO_FUN(do_mpstat);
DECLARE_DO_FUN(do_opstat);
DECLARE_DO_FUN(do_rpstat);
DECLARE_DO_FUN(do_mptransfer);
DECLARE_DO_FUN(do_mpapply);
DECLARE_DO_FUN(do_mpapplyb);
DECLARE_DO_FUN(do_mppkset);
DECLARE_DO_FUN(do_mpfavor);

// Spell functions.
// Defined in magic.c.
DECLARE_SPELL_FUN(	spell_null);
DECLARE_SPELL_FUN(	spell_notfound);
DECLARE_SPELL_FUN(	spell_acid_blast);
DECLARE_SPELL_FUN(	spell_animate_dead);
DECLARE_SPELL_FUN(	spell_astral_walk);
DECLARE_SPELL_FUN(	spell_blindness);
DECLARE_SPELL_FUN(	spell_burning_hands);
DECLARE_SPELL_FUN(	spell_call_lightning);
DECLARE_SPELL_FUN(	spell_cause_critical);
DECLARE_SPELL_FUN(	spell_cause_light);
DECLARE_SPELL_FUN(	spell_cause_serious);
DECLARE_SPELL_FUN(	spell_change_sex);
DECLARE_SPELL_FUN(	spell_charm_person);
DECLARE_SPELL_FUN(	spell_chill_touch);
DECLARE_SPELL_FUN(	spell_colour_spray);
DECLARE_SPELL_FUN(	spell_control_weather);
DECLARE_SPELL_FUN(	spell_create_food);
DECLARE_SPELL_FUN(	spell_create_water);
DECLARE_SPELL_FUN(	spell_cure_blindness);
DECLARE_SPELL_FUN(	spell_cure_poison);
DECLARE_SPELL_FUN(	spell_curse);
DECLARE_SPELL_FUN(	spell_detect_poison);
DECLARE_SPELL_FUN(	spell_dispel_evil);
DECLARE_SPELL_FUN(	spell_dispel_magic);
DECLARE_SPELL_FUN(	spell_dream);
DECLARE_SPELL_FUN(	spell_earthquake);
DECLARE_SPELL_FUN(	spell_enchant_weapon);
DECLARE_SPELL_FUN(	spell_energy_drain);
DECLARE_SPELL_FUN(	spell_faerie_fire);
DECLARE_SPELL_FUN(	spell_faerie_fog);
DECLARE_SPELL_FUN(	spell_farsight);
DECLARE_SPELL_FUN(	spell_fireball);
DECLARE_SPELL_FUN(	spell_flamestrike);
DECLARE_SPELL_FUN(	spell_gate);
DECLARE_SPELL_FUN(	spell_knock);
DECLARE_SPELL_FUN(	spell_harm);
DECLARE_SPELL_FUN(	spell_identify);
DECLARE_SPELL_FUN(	spell_invis);
DECLARE_SPELL_FUN(	spell_know_alignment);
DECLARE_SPELL_FUN(	spell_lightning_bolt);
DECLARE_SPELL_FUN(	spell_locate_object);
DECLARE_SPELL_FUN(	spell_magic_missile);
DECLARE_SPELL_FUN(	spell_mist_walk);
DECLARE_SPELL_FUN(	spell_pass_door);
DECLARE_SPELL_FUN(	spell_plant_pass);
DECLARE_SPELL_FUN(	spell_poison);
DECLARE_SPELL_FUN(	spell_polymorph);
DECLARE_SPELL_FUN(	spell_possess);
DECLARE_SPELL_FUN(	spell_recharge);
DECLARE_SPELL_FUN(	spell_remove_curse);
DECLARE_SPELL_FUN(	spell_remove_invis);
DECLARE_SPELL_FUN(	spell_remove_trap);
DECLARE_SPELL_FUN(	spell_shocking_grasp);
DECLARE_SPELL_FUN(	spell_sleep);
DECLARE_SPELL_FUN(	spell_smaug);
DECLARE_SPELL_FUN(	spell_solar_flight);
DECLARE_SPELL_FUN(	spell_summon);
DECLARE_SPELL_FUN(	spell_teleport);
DECLARE_SPELL_FUN(	spell_ventriloquate);
DECLARE_SPELL_FUN(	spell_weaken);
DECLARE_SPELL_FUN(	spell_word_of_recall);
DECLARE_SPELL_FUN(	spell_acid_breath);
DECLARE_SPELL_FUN(	spell_fire_breath);
DECLARE_SPELL_FUN(	spell_frost_breath);
DECLARE_SPELL_FUN(	spell_gas_breath);
DECLARE_SPELL_FUN(	spell_lightning_breath);
DECLARE_SPELL_FUN(	spell_spiral_blast);
DECLARE_SPELL_FUN(	spell_scorching_surge);
DECLARE_SPELL_FUN(	spell_helical_flow);
DECLARE_SPELL_FUN(	spell_transport);
DECLARE_SPELL_FUN(	spell_portal);

DECLARE_SPELL_FUN(	spell_ethereal_fist);
DECLARE_SPELL_FUN(	spell_spectral_furor);
DECLARE_SPELL_FUN(	spell_hand_of_chaos);
DECLARE_SPELL_FUN(	spell_disruption);
DECLARE_SPELL_FUN(	spell_sonic_resonance);
DECLARE_SPELL_FUN(	spell_mind_wrack);
DECLARE_SPELL_FUN(	spell_mind_wrench);
DECLARE_SPELL_FUN(	spell_revive);
DECLARE_SPELL_FUN(	spell_sulfurous_spray);
DECLARE_SPELL_FUN(	spell_caustic_fount);
DECLARE_SPELL_FUN(	spell_acetum_primus);
DECLARE_SPELL_FUN(	spell_galvanic_whip);
DECLARE_SPELL_FUN(	spell_magnetic_thrust);
DECLARE_SPELL_FUN(	spell_quantum_spike);
DECLARE_SPELL_FUN(	spell_black_hand);
DECLARE_SPELL_FUN(	spell_black_fist);
DECLARE_SPELL_FUN(	spell_black_lightning);
DECLARE_SPELL_FUN(	spell_midas_touch);

DECLARE_SPELL_FUN(	spell_bethsaidean_touch);
DECLARE_SPELL_FUN(	spell_expurgation);
DECLARE_SPELL_FUN(	spell_sacral_divinity);

// The encryption functions are not available on some operating systems.
// In particular, the U.S. Government prohibits its export from the
// United States to foreign countries.
// Turn on NOCRYPT (in Crypt.cpp) to keep passwords in plain text.
CString	Crypt (const char* pwd, const char* name);


// Our function prototypes.
// act_comm.cpp
BOOL	circle_follow (CCharacter *ch, CCharacter *victim);
void	add_follower (CCharacter *ch, CCharacter *master);
void	stop_follower (CCharacter *ch);
void	die_follower (CCharacter *ch);
BOOL	is_same_group (CCharacter *ach, CCharacter *bch );
void	send_rip_screen (CCharacter *ch);
void	send_rip_title (CCharacter *ch);
void	send_ansi_title (CCharacter *ch);
void	send_ascii_title (CCharacter *ch);
void	to_channel (const char *argument, int channel, const char *verb,
			short level);
void	talk_auction (const char *argument);
BOOL	knows_language (CCharacter *victim, int language, CCharacter *ch);
BOOL	can_learn_lang (CCharacter *ch, int language);
char	*translate (CCharacter *ch, CCharacter *victim, const char *argument);
char	*obj_short (CObjData *obj);

// act_info.cpp
int		get_door (char *arg);
CString	FormatObjToChar (const CObjData& Obj, CCharacter *ch, BOOL bShort);
void	show_char_to_char (CCharacter *list, CCharacter *ch);
void	ShowListToChar (const CObjectList& List, CCharacter *ch,
			BOOL bShort, BOOL bShowNothing);

// act_move.cpp
void	clear_vrooms ();
ch_ret	move_char (CCharacter *ch, CExitData *pexit, int fall);
void	teleport (CCharacter *ch, short room, int flags);
short	encumbrance (CCharacter *ch, short move);
BOOL	will_fall (CCharacter *ch, int fall);
CExitData	*find_door (CCharacter *ch, char *arg, BOOL quiet);
CExitData	*get_exit (CRoomIndexData *room, short dir, BOOL bDisabled = FALSE);
CExitData	*get_exit_to (CRoomIndexData *room, short dir, int vnum,
				BOOL bDisabled = FALSE);
CExitData	*get_exit_num (CRoomIndexData *room, short count);
char		*ReverseExit (short vdir);

// act_obj.cpp
obj_ret	damage_obj (CObjData *obj);
short	get_obj_resistance (CObjData *obj);
void	obj_fall (CObjData *obj, BOOL through);

// act_wiz.cpp
void	echo_to_all (short AT_COLOR, const char *argument, short tar);
CRoomIndexData	*find_location (CCharacter *ch, char *arg);

// build.cpp
char	*flag_string (int bitvector, char* const flagarray []);
int		get_mpflag (char *flag);
int		get_dir (char *txt);
char	*strip_cr (const char *str);
int		get_risflag (const char *flag);
int		get_defenseflag (const char *flag);
int		get_attackflag (const char *flag);

// clans.cpp
void	load_clans ();
void	load_councils ();
void	save_council (CCouncilData *council);
CCouncilData	*get_council (char *name);

// comm.cpp
void	close_socket (CDescriptor& dclose /*, BOOL force */);
void	write_to_pager (CDescriptor *d, const char *txt, int length);
void	send_to_pager (const char *txt, CCharacter *ch);
void	set_char_color (short AType, CCharacter *ch);
void	set_pager_color (short AType, CCharacter *ch);
void	pager_printf (CCharacter *ch, char *fmt, ...);
void	act (short AType, const char *format, CCharacter *ch,
			    const void *arg1, const void *arg2, int type);

// db.cpp
void	show_file (CCharacter *ch, const char *filename);
char	*str_dup (char const *str);
void	boot_db ();
void	area_update ();
void	add_char (CCharacter *ch);
char	*GetExtraDescr (const char *name, CPtrList &EList);
void	AddArea (CAreaData* pArea);

char	*ParseString (char*& pLine, FILE* fp);
CString	ParseCString (char*& pLine, FILE* fp);
char	*ParseStringNohash (char* pLine, FILE* fp);
char	*ParseWord (char*& pLine);
char	*ParseLine (char* pLine);
int		ParseNumber (char*& pLine);
char	fread_letter (FILE *fp);
char	*fread_line (FILE *fp, BOOL bTrim = TRUE);
void	ScanToEnd (FILE* fp, const char* end);

int		number_fuzzy (int number);
int		number_range (int from, int to);
int		number_percent ();
int		number_door ();
int		number_bits (int width);
int		number_mm ();
int		dice (int number, int size);
int		interpolate (int level, int value_00, int value_32);
void	smash_tilde (char *str);
void	hide_tilde (char *str);
char	*show_tilde (char *str);
BOOL	str_cmp (const char *astr, const char *bstr);
BOOL	str_prefix (const char *astr, const char *bstr);
BOOL	str_infix (const char *astr, const char *bstr);
BOOL	str_suffix (const char *astr, const char *bstr);
char	*capitalize (const char *str);
char	*strlower (const char *str);
char	*strupper (const char *str);
char	*aoran (const char *str);
void	append_file (CCharacter *ch, const char *file, char *str);
void	append_to_file (const char *file, char *str);
void	bug (const char *str, ...);
void	log_string_plus (const char *str, short log_type, short level);
void	add_help (CHelpData *pHelp);
void	fix_area_exits (CAreaData *tarea);
void	randomize_exits (CRoomIndexData *room, short maxdir);
void	make_wizlist ();
BOOL	delete_obj (CObjIndexData *obj);
BOOL	delete_mob (CMobIndexData *mob);
extern void	sort_area (CAreaData *pArea, BOOL proto);
extern void	fix_exits (BOOL bBoot = TRUE);

CAreaData		*LoadAreaFile (const CString Fname, BOOL bBoot = FALSE,
					 CAreaData* pArea = NULL, BOOL bBuild = FALSE);
CCharacter		*create_mobile (CMobIndexData *pMobIndex);
CObjData		*create_object (CObjIndexData *pObjIndex, int level);
CRoomIndexData	*make_room (int vnum);
CObjIndexData	*make_object (int vnum, int cvnum, char *name);
CMobIndexData	*make_mobile (int vnum, int cvnum, char *name);
CExitData		*make_exit (CRoomIndexData *pRoomIndex,
					CRoomIndexData *to_room, short door);

// Functions to add to sorting lists. -- Altrag
//void	mob_sort (CMobIndexData *pMob);
//void	obj_sort (CObjIndexData *pObj);
//void	room_sort (CRoomIndexData *pRoom);

// build.cpp
void	smush_tilde (char *str);
BOOL	can_rmodify (CCharacter *ch, CRoomIndexData *room);
BOOL	can_omodify (CCharacter *ch, CObjData *obj);
BOOL	can_mmodify (CCharacter *ch, CCharacter *mob);
BOOL	can_medit (CCharacter *ch, CMobIndexData *mob);
void	assign_area (CCharacter *ch);
BOOL	DelRExtra (CRoomIndexData *room, char *keywords);
BOOL	DelOExtra (CObjData *obj, char *keywords);
BOOL	DelOExtraProto (CObjIndexData *obj, char *keywords);

// Define area types and an install boolean for fold_area
enum { FA_LIVE=1, FA_BUILD };
#define	FA_INSTALL	TRUE
void	fold_area (CAreaData *tarea, int Type = FA_LIVE,
				   BOOL bInstall = FALSE);

int		get_otype (const char *type);
int		get_atype (const char *type);
int		get_aflag (const char *flag);
int		get_oflag (const char *flag);
int		get_wflag (const char *flag);
int		get_exflag (const char *flag);
int		get_rflag (const char *flag);
CExtraDescrData	*SetRExtra (CRoomIndexData *room, char *keywords);
CExtraDescrData	*SetOExtra (CObjData *obj, char *keywords);
CExtraDescrData	*SetOExtraProto (CObjIndexData *obj, char *keywords);

// fight.cpp
int		max_fight (CCharacter *ch);
void	violence_update ();
ch_ret	multi_hit (CCharacter *ch, CCharacter *victim, int dt);
short	ris_damage (CCharacter *ch, short dam, int ris);
ch_ret	damage (CCharacter *ch, CCharacter *victim, int dam, int dt);
void	update_pos (CCharacter *victim);
void	set_fighting (CCharacter *ch, CCharacter *victim);
void	stop_fighting (CCharacter *ch, BOOL fBoth);
void	free_fight (CCharacter *ch);
void	check_killer (CCharacter *ch, CCharacter *victim);
void	check_attacker (CCharacter *ch, CCharacter *victim);
void	death_cry (CCharacter *ch);
void	stop_hunting (CCharacter *ch);
void	stop_hating (CCharacter *ch);
void	stop_fearing (CCharacter *ch);
void	start_hunting (CCharacter *ch, CCharacter *victim);
void	start_hating (CCharacter *ch, CCharacter *victim);
void	start_fearing (CCharacter *ch, CCharacter *victim);
BOOL	is_hunting (CCharacter *ch, CCharacter *victim);
BOOL	is_hating (CCharacter *ch, CCharacter *victim);
BOOL	is_fearing (CCharacter *ch, CCharacter *victim);
BOOL	is_safe (CCharacter *ch, CCharacter *victim);
BOOL	legal_loot (CCharacter *ch, CCharacter *victim);
short	VAMP_AC (CCharacter *ch);
BOOL	check_illegal_pk (CCharacter *ch, CCharacter *victim);
void	raw_kill (CCharacter *ch, CCharacter *victim);   
BOOL	in_arena (CCharacter *ch);
ch_ret	projectile_hit (CCharacter *ch, CCharacter *victim, CObjData *wield,
			CObjData *projectile, short dist);

// makeobjs.cpp
void	make_corpse (CCharacter *ch, CCharacter *killer);
void	make_blood (CCharacter *ch);
void	make_bloodstain (CCharacter *ch);
void	make_scraps (CObjData *obj);
void	make_fire (CRoomIndexData *in_room, short timer);
CObjData	*make_trap (int v0, int v1, int v2, int v3);
CObjData	*create_money (int amount);

// misc.cpp
void	actiondesc (CCharacter *ch, CObjData *obj, void *vo);

// mud_comm.cpp
char	*mprog_type_to_name (int type);

// mud_prog.cpp
void	mprog_wordlist_check (char * arg, CCharacter *mob,
			CCharacter* actor, CObjData* object, void* vo, int type);
void	mprog_percent_check (CCharacter *mob, CCharacter* actor,
			CObjData* object, void* vo, int type);
void	mprog_act_trigger (char* buf, CCharacter* mob, CCharacter* ch,
			CObjData* obj, void* vo);
void	mprog_bribe_trigger (CCharacter* mob, CCharacter* ch, int amount);
void	mprog_entry_trigger (CCharacter* mob);
void	mprog_give_trigger (CCharacter* mob, CCharacter* ch, CObjData* obj);
void	mprog_greet_trigger (CCharacter* mob);
void	mprog_fight_trigger (CCharacter* mob, CCharacter* ch);
void	mprog_hitprcnt_trigger (CCharacter* mob, CCharacter* ch);
void	mprog_death_trigger (CCharacter *killer, CCharacter* mob);
void	mprog_random_trigger (CCharacter* mob);
void	mprog_speech_trigger (char* txt, CCharacter* mob);
BOOL	mprog_script_trigger (CCharacter *mob);
void	mprog_hour_trigger (CCharacter *mob);
void	mprog_time_trigger (CCharacter *mob);
void	progbug (const char *str, CCharacter *mob);
void	rset_supermob (CRoomIndexData *room);
void	release_supermob ();

// player.cpp
void	set_title (CCharacter *ch, char *title);

// skills.cpp
BOOL	check_skill (CCharacter *ch, char *command, char *argument);
void	learn_from_success (CCharacter *ch, int sn);
void	learn_from_failure (CCharacter *ch, int sn);
BOOL	check_parry (CCharacter *ch, CCharacter *victim);
BOOL	check_dodge (CCharacter *ch, CCharacter *victim);
BOOL	check_grip (CCharacter *ch, CCharacter *victim);
void	disarm (CCharacter *ch, CCharacter *victim);
void	trip (CCharacter *ch, CCharacter *victim);
CCharacter *scan_for_victim (CCharacter *ch, CExitData *pexit, char *name);
ch_ret	ranged_attack (CCharacter *ch, char *argument, CObjData *weapon,
			CObjData *projectile, short dt, short range);
BOOL	mob_fire (CCharacter* ch, char* name);


// handler.cpp
int		get_exp_worth (CCharacter *ch);
int		exp_level (CCharacter *ch, short level);
short	get_curr_cha (CCharacter *ch);
short	get_curr_lck (CCharacter *ch);
BOOL	can_take_proto (CCharacter *ch);
int		can_carry_w (CCharacter *ch);
BOOL	is_name (const char *str, const char *namelist);
BOOL	is_name_prefix (const char *str, char *namelist);
BOOL	nifty_is_name (const char *str, const char *namelist);
BOOL	nifty_is_name_prefix (const char *str, const char *namelist);
void	affect_modify (CCharacter *ch, CAffectData *paf, BOOL bAddAffect);
void	affect_to_char (CCharacter *ch, CAffectData *paf);
void	affect_remove (CCharacter *ch, CAffectData *paf);
void	affect_strip (CCharacter *ch, int sn);
BOOL	is_affected (CCharacter *ch, int sn);
void	affect_join (CCharacter *ch, CAffectData *paf);
void	obj_from_char (CObjData *obj);
int		apply_ac (CObjData *obj, int iWear);
void	equip_char (CCharacter *ch, CObjData *obj, int iWear);
void	unequip_char (CCharacter *ch, CObjData *obj);
int		count_obj_list (CObjIndexData *obj, CObjectList& List);
void	obj_from_room (CObjData *obj);
void	obj_from_obj (CObjData *obj);
void	extract_obj (CObjData *obj);
void	extract_exit (CRoomIndexData *room, CExitData *pexit);
void	extract_room (CRoomIndexData *room);
void	clean_resets (CAreaData *tarea);
void	extract_char (CCharacter *ch, BOOL fPull);
CCharacter	*get_char_room (CCharacter *ch, char *argument);
CCharacter	*get_char_world (CCharacter *ch, char *argument);
CObjData	*obj_to_char (CObjData *obj, CCharacter *ch, BOOL bByLevel = FALSE);
CObjData	*get_eq_char (CCharacter *ch, int iWear);
CObjData	*obj_to_room (CObjData *obj, CRoomIndexData *pRoomIndex);
CObjData	*obj_to_obj (CObjData *obj, CObjData *obj_to);
CObjData	*get_obj_list (CCharacter *ch, char *argument, CObjectList& List);
CObjData	*get_obj_list_rev (CCharacter *ch, char *argument, CObjectList& List);
CObjData	*get_obj_carry (CCharacter *ch, char *argument);
CObjData	*get_obj_wear (CCharacter *ch, char *argument);
CObjData	*get_obj_here (CCharacter *ch, char *argument);
CObjData	*get_obj_world (CCharacter *ch, char *argument);
int		get_obj_number (CObjData *obj);
int		get_obj_weight (CObjData *obj);
BOOL	room_is_dark (CRoomIndexData *pRoomIndex);
BOOL	room_is_private (CRoomIndexData *pRoomIndex);
BOOL	can_see (CCharacter *ch, CCharacter *victim);
BOOL	can_see_obj (CCharacter *ch, const CObjData& Obj);
BOOL	can_drop_obj (CCharacter *ch, CObjData *obj);
char	*item_type_name (CObjData *obj);
char	*affect_loc_name (int location);
CString	ExtraBitName (const CBitVector& Ef);
char	*magic_bit_name (int magic_flags);
ch_ret	check_for_trap (CCharacter *ch, CObjData *obj, int flag);
ch_ret	check_room_for_traps (CCharacter *ch, int flag);
ch_ret	spring_trap (CCharacter *ch, CObjData *obj);
void	name_stamp_stats (CCharacter *ch);
void	fix_char (CCharacter *ch);
void	set_cur_obj (CObjData *obj);
BOOL	obj_extracted (CObjData *obj);
void	set_cur_char (CCharacter *ch);
BOOL	char_died (CCharacter *ch);
void	queue_extracted_char (CCharacter *ch, BOOL extract);
void	clean_char_queue ();
void	add_timer (CCharacter *ch, short type, short count, DO_FUN *fun, int value);
short	get_timer (CCharacter *ch, short type);
void	extract_timer (CCharacter *ch, CTimerData *timer);
void	remove_timer (CCharacter *ch, short type);
BOOL	in_soft_range (CCharacter *ch, CAreaData *tarea);
BOOL	in_hard_range (CCharacter *ch, CAreaData *tarea);
BOOL	chance (CCharacter *ch, short percent);
BOOL 	chance_attrib (CCharacter *ch, short percent, short attrib);
void	split_obj (CObjData *obj, int num);
void	separate_obj (CObjData *obj);
BOOL	empty_obj (CObjData *obj, CObjData *destobj, CRoomIndexData *destroom);
BOOL	ms_find_obj (CCharacter *ch);
void	worsen_mental_state (CCharacter *ch, int mod);
void	better_mental_state (CCharacter *ch, int mod);
void	economize_mobgold (CCharacter *mob);
void	add_kill (CCharacter *ch, CCharacter *mob);
int		times_killed (CCharacter *ch, CCharacter *mob);
CTimerData	*get_timerptr (CCharacter *ch, short type);
CObjData	*get_trap (CObjData *obj);
CObjData	*clone_object (CObjData *obj);
CObjData	*find_obj (CCharacter *ch, char *argument, BOOL carryonly);


// interp.cpp
void	interpret (CCharacter *ch, char *argument);
BOOL	is_number (char *arg);
int		number_argument (char *argument, char *arg);
char	*one_argument (const char *argument, char *arg_first);
BOOL    IS_SWITCHED (CCharacter *ch);
BOOL	check_pos (CCharacter *ch, short position);
char	*one_argument2 (const char *argument, char *arg_first);
void	start_timer (struct timeval *stime);
time_t	end_timer (struct timeval *stime);
void	send_timer (struct timerset *vtime, CCharacter *ch);
void	update_userec (struct timeval *time_used, timerset *userec);
BOOL	check_social (CCharacter *ch, char *command, const char *argument);

// magic.cpp
BOOL	process_spell_components (CCharacter *ch, int sn);
int		ch_slookup (CCharacter *ch, const char *name);
int		find_spell (CCharacter *ch, const char *name, BOOL know);
int		find_skill (CCharacter *ch, const char *name, BOOL know);
int		find_weapon (CCharacter *ch, const char *name, BOOL know);
int		find_tongue (CCharacter *ch, const char *name, BOOL know);
int		personal_lookup (CCharacter *ch, const char *name);
int		slot_lookup (int slot);
void	failed_casting (CSkill *skill, CCharacter *ch, CCharacter *victim,
			 CObjData *obj);
BOOL	saves_poison_death (int level, CCharacter *victim);
BOOL	saves_wand (int level, CCharacter *victim);
BOOL	saves_para_petri (int level, CCharacter *victim);
BOOL	saves_breath (int level, CCharacter *victim);
BOOL	saves_spell_staff (int level, CCharacter *victim);
ch_ret	obj_cast_spell (int sn, int level, CCharacter *ch,
			CCharacter *victim, CObjData *obj);
int		dice_parse (CCharacter *ch, int level, char *exp);
ch_ret	spell_attack (int sn, int level, CCharacter *ch, void *vo);


// request.cpp
void	init_request_pipe ();
void	check_requests ();

// save.cpp
void	save_char_obj (CCharacter *ch);
BOOL	load_char_obj (CDescriptor *d, char *name, BOOL preload);
void	set_alarm (long seconds);
void	requip_char (CCharacter *ch);
void	fwrite_obj (CObjectList& List, FILE *fp, int iNest,
					short os_type, short ChLevel = 0);
void	fread_obj (CCharacter *ch,  FILE *fp, short os_type);
void	de_equip_char (CCharacter *ch);
void	re_equip_char (CCharacter *ch);

CCharacter *fread_mobile (FILE *fp);

// special.cpp
SPEC_FUN	*spec_lookup (const char *name);
char		*lookup_spec (SPEC_FUN *special);

// tables.cpp
int			get_skill (char *skilltype);
char		*spell_name (SPELL_FUN *spell);
char		*skill_name (DO_FUN *skill);
void		load_skill_table ();
void		save_skill_table ();
void		load_herb_table ();
void		save_herb_table ();
SPELL_FUN	*spell_function (char *name);
DO_FUN		*skill_function (char *name);

// track.cpp
void	found_prey (CCharacter *ch, CCharacter *victim);
void	hunt_victim (CCharacter *ch);

// update.cpp
void	advance_level (CCharacter *ch);
void	gain_exp (CCharacter *ch, int gain);
void	gain_condition (CCharacter *ch, int iCond, int value);
void	update_handler ();
void	RebootCheck ();
void	ResetBootMessages ();
void	auction_update ();
void	remove_portal (CObjData *portal);

// hashstr.cpp
char	*str_alloc (const char *str);
char	*quick_link (const char *str);
int		str_free (char *str);
void	show_hash (int count);
char	*hash_stats ();
char	*check_hash (char *str);
void	hash_dump (int hash);
void	show_high_hash (int top);

//  Data for a menu page
struct	menu_data
{
    char		*sectionNum;
    char		*charChoice;
    int			x;
    int			y;
    char		*outFormat;
    void		*data;
    int			ptrType;
    int			cmdArgs;
    char		*cmdString;
};

DECLARE_DO_FUN(do_omenu);
DECLARE_DO_FUN(do_rmenu);
DECLARE_DO_FUN(do_mmenu);
DECLARE_DO_FUN(do_pmenu);
DECLARE_DO_FUN(do_cmenu);
DECLARE_DO_FUN(do_pagelen);

extern		MENU_DATA		room_page_a_data [];
extern		MENU_DATA		room_page_b_data [];
extern		MENU_DATA		room_page_c_data [];
extern		MENU_DATA		room_help_page_data [];

extern		MENU_DATA		mob_page_a_data [];
extern		MENU_DATA		mob_page_b_data [];
extern		MENU_DATA		mob_page_c_data [];
extern		MENU_DATA		mob_page_d_data [];
extern		MENU_DATA		mob_page_e_data [];
extern		MENU_DATA		mob_page_f_data [];
extern		MENU_DATA		mob_help_page_data [];

extern		MENU_DATA		obj_page_a_data [];
extern		MENU_DATA		obj_page_b_data [];
extern		MENU_DATA		obj_page_c_data [];
extern		MENU_DATA		obj_page_d_data [];
extern		MENU_DATA		obj_page_e_data [];
extern		MENU_DATA		obj_help_page_data [];

extern		MENU_DATA		control_page_a_data [];
extern		MENU_DATA		control_help_page_data [];

extern	const   char    room_page_a [];
extern	const   char    room_page_b [];
extern	const   char    room_page_c [];
extern	const   char    room_help_page [];

extern	const   char    obj_page_a [];
extern	const   char    obj_page_b [];
extern	const   char    obj_page_c [];
extern	const   char    obj_page_d [];
extern	const   char    obj_page_e [];
extern	const   char    obj_help_page [];

extern	const   char    mob_page_a [];
extern	const   char    mob_page_b [];
extern	const   char    mob_page_c [];
extern	const   char    mob_page_d [];
extern	const   char    mob_page_e [];
extern	const   char    mob_page_f [];
extern	const   char    mob_help_page [];
extern	const   char	*npc_sex [3];
extern	const   char	*ris_strings [];

extern	const   char    control_page_a [];
extern	const   char    control_help_page [];

#define SH_INT	1
#define INT		2
#define CHAR	3
#define STRING	4
#define SPECIAL	5
#define SSH_INT	6		// signed short int


#define NO_PAGE			0
#define MOB_PAGE_A		1
#define MOB_PAGE_B		2
#define MOB_PAGE_C		3
#define MOB_PAGE_D		4
#define MOB_PAGE_E		5
#define MOB_PAGE_F		17
#define MOB_HELP_PAGE	14
#define ROOM_PAGE_A		6
#define ROOM_PAGE_B		7
#define ROOM_PAGE_C		8
#define ROOM_HELP_PAGE	15
#define OBJ_PAGE_A		9
#define OBJ_PAGE_B		10
#define OBJ_PAGE_C		11
#define OBJ_PAGE_D		12
#define OBJ_PAGE_E		13
#define OBJ_HELP_PAGE	16
#define CONTROL_PAGE_A	18
#define CONTROL_HELP_PAGE 19

#define NO_TYPE		0
#define MOB_TYPE	1
#define OBJ_TYPE	2
#define ROOM_TYPE	3
#define CONTROL_TYPE 4

#define SUB_NORTH DIR_NORTH
#define SUB_EAST  DIR_EAST
#define SUB_SOUTH DIR_SOUTH
#define SUB_WEST  DIR_WEST
#define SUB_UP    DIR_UP
#define SUB_DOWN  DIR_DOWN
#define SUB_NE    DIR_NORTHEAST
#define SUB_NW    DIR_NORTHWEST
#define SUB_SE    DIR_SOUTHEAST
#define SUB_SW    DIR_SOUTHWEST

// defines for use with this get_affect function
#define RIS_000		BV00
#define RIS_R00		BV01
#define RIS_0I0		BV02
#define RIS_RI0		BV03
#define RIS_00S		BV04
#define RIS_R0S		BV05
#define RIS_0IS		BV06
#define RIS_RIS		BV07

#define GA_AFFECTED		BV09
#define GA_RESISTANT	BV10
#define GA_IMMUNE		BV11
#define GA_SUSCEPTIBLE	BV12
#define GA_RIS			BV30


// mudprograms stuff
extern CCharacter	*supermob;

void	oprog_speech_trigger (char *txt, CCharacter *ch);
void	oprog_random_trigger (CObjData *obj);
void	oprog_wear_trigger (CCharacter *ch, CObjData *obj);
BOOL	oprog_use_trigger (CCharacter *ch, CObjData *obj, 
			CCharacter *vict, CObjData *targ, void *vo);
void	oprog_remove_trigger (CCharacter *ch, CObjData *obj);
void	oprog_sac_trigger (CCharacter *ch, CObjData *obj);
void	oprog_damage_trigger (CCharacter *ch, CObjData *obj);
void	oprog_repair_trigger (CCharacter *ch, CObjData *obj);
void	oprog_drop_trigger (CCharacter *ch, CObjData *obj);
void	oprog_zap_trigger (CCharacter *ch, CObjData *obj);
char	*oprog_type_to_name (int type);

// MUD_PROGS START HERE
// (object stuff)
void	oprog_greet_trigger (CCharacter *ch);
void	oprog_speech_trigger (char *txt, CCharacter *ch);
void	oprog_random_trigger (CObjData *obj);
void	oprog_random_trigger (CObjData *obj);
void	oprog_remove_trigger (CCharacter *ch, CObjData *obj);
void	oprog_sac_trigger (CCharacter *ch, CObjData *obj);
void	oprog_get_trigger (CCharacter *ch, CObjData *obj);
void	oprog_damage_trigger (CCharacter *ch, CObjData *obj);
void	oprog_repair_trigger (CCharacter *ch, CObjData *obj);
void	oprog_drop_trigger (CCharacter *ch, CObjData *obj);
void	oprog_examine_trigger (CCharacter *ch, CObjData *obj);
void	oprog_zap_trigger (CCharacter *ch, CObjData *obj);
void	oprog_pull_trigger (CCharacter *ch, CObjData *obj);
void	oprog_push_trigger (CCharacter *ch, CObjData *obj);


// mud prog defines
#define ERROR_PROG        -1
#define IN_FILE_PROG      -2

enum ProgTypes {
  ACT_PROG, SPEECH_PROG, RAND_PROG, FIGHT_PROG, DEATH_PROG, HITPRCNT_PROG, 
  ENTRY_PROG, GREET_PROG, ALL_GREET_PROG, GIVE_PROG, BRIBE_PROG, HOUR_PROG, 
  TIME_PROG, WEAR_PROG, REMOVE_PROG, SAC_PROG, LOOK_PROG, EXA_PROG, ZAP_PROG, 
  GET_PROG, DROP_PROG, DAMAGE_PROG, REPAIR_PROG, RANDIW_PROG, SPEECHIW_PROG, 
  PULL_PROG, PUSH_PROG, SLEEP_PROG, REST_PROG, LEAVE_PROG, SCRIPT_PROG,
  USE_PROG
};

void	rprog_leave_trigger (CCharacter *ch);
void	rprog_enter_trigger (CCharacter *ch);
void	rprog_sleep_trigger (CCharacter *ch);
void	rprog_rest_trigger (CCharacter *ch);
void	rprog_rfight_trigger (CCharacter *ch);
void	rprog_death_trigger (CCharacter *killer, CCharacter *ch);
void	rprog_speech_trigger (char *txt, CCharacter *ch);
void	rprog_random_trigger (CCharacter *ch);
void	rprog_time_trigger (CCharacter *ch);
void	rprog_hour_trigger (CCharacter *ch);
char	*rprog_type_to_name (int type);

#define	OPROG_ACT_TRIGGER
#ifdef OPROG_ACT_TRIGGER
void	oprog_act_trigger (char *buf, CObjData *mobj, CCharacter *ch,
			CObjData *obj, void *vo);
#endif
#define RPROG_ACT_TRIGGER
#ifdef RPROG_ACT_TRIGGER
void	rprog_act_trigger (char *buf, CRoomIndexData *room, CCharacter *ch,
			CObjData *obj, void *vo);
#endif


// Stuff added by RCP

// Definitions for the TELNET protocol.
#define	IAC		(char)255		// interpret as command:
#define	WONT	(char)252		// I won't use option
#define	WILL	(char)251		// I will use option
#define	GA		(char)249		// you may reverse the line

// telnet options
#define	TELOPT_ECHO	1			// echo

// #defines for Win32
//#define MAKEWORD (a, b) ((WORD) (((BYTE) (a)) | (((WORD) ((BYTE) (b))) << 8)))

#define WM_NET_ACCEPT		(WM_USER+500)
#define WM_NET_READWRITE	(WM_USER+501)
#define WM_NET_GETHOST		(WM_USER+502)
#define WM_NET_AUTHCONNECT	(WM_USER+503)
#define	WM_BOOT_SMAUG		(WM_USER+600)


// Const externs must be declared in a header file in C++ !
extern char*	const	wear_locs [];



#ifdef	SMAUGSERVER_CPP
	CSmaugWizDoc	*gpDoc;						// global pointer to doc
	BOOL			wizlock;					// Game is wizlocked
	BOOL			MOBtrigger;
	FILE			*fpReserve;
	FILE			*fpLOG;
	CSwTime			CurrentTime;				// Time of this pulse
	CSwTime			LastRestoreAllTime;
	char			lastplayercmd [MAX_INPUT_LENGTH*2];
	BOOL			bSmaugDown;					// Shutdown
	CStringList		ReservedNamesList;
#endif

#undef DEBUG

extern CSmaugWizDoc	*gpDoc;						// global pointer to doc
extern BOOL			wizlock;
extern BOOL			MOBtrigger;
extern FILE			*fpReserve;
extern FILE			*fpLOG;
extern CSwTime		CurrentTime;
extern CSwTime		LastRestoreAllTime;
extern char			lastplayercmd [MAX_INPUT_LENGTH*2];
extern BOOL			bSmaugDown;
extern CStringList	ReservedNamesList;


extern char		*default_prompt (CCharacter *ch);
extern CString	StripColor (const char* str);
extern bool		HasColor (const char* str);
extern bool		IsColor (const char* pCol);
extern int		GetColorSize (const char* str);
extern int		ColorLen (const char* str);
extern int		MakeColorSequence (UCHAR Col, char *buf, CDescriptor *d);
extern int		MakeColorSequence (const char *col, char *buf, CDescriptor *d);
extern BOOL		check_parse_name (const char* name, BOOL bNewchar = TRUE);
extern void		nanny (CDescriptor *d, char *argument);
extern void		mail_count (CCharacter *ch);
extern void		RemoveCharacter (CDescriptor& Dclose);
extern void		load_corpses ();
extern void		RenumberPutResets (CAreaData *pArea);
extern void		fwrite_comments (CCharacter *ch, FILE *fp);
extern void		fread_comment (CCharacter *ch, FILE *fp);
extern void		ClearDatabase ();
extern void		DeleteAllHash ();
extern void		shutdown_mud (char *reason);
extern void		oprog_read_programs (char* pLine, FILE* fp,
					CObjIndexData *pObjIndex);
extern void   	rprog_read_programs (char* pLine, FILE* fp,
					CRoomIndexData *pRoomIndex);
extern void		write_corpses (CCharacter *ch, const char *name);
extern void		start_editing (CCharacter *ch, const char *data);
extern void		StrFree (char *str, const char* file, int line);
extern void		ClearAddrRange (void* start, void* end, UINT SizEnd);
extern int 		mprog_name_to_type (const char* name);
extern void		BootLog (const char *str, ...);

extern CRoomIndexData *GetVRoomFromHash (int hash);


#endif		// SMAUG_H