cm3/
cm3/clans/
cm3/mudprogs/
cm3/player/a/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |   \\._.//   *
 * -----------------------------------------------------------|   (0...0)   *
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998  by Derek Snider      |    ).:.(    *
 * -----------------------------------------------------------|    {o o}    *
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |   / ' ' \   *
 * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek,      |~'~.VxvxV.~'~*
 * Tricops and Fireblade                                      |             *
 * ------------------------------------------------------------------------ *
 * 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 St{rfeldt, Tom Madsen, and Katja Nyboe.     *
 * Win32 port by Nick Gammon                                                *
 * ------------------------------------------------------------------------ *
 * ResortMUD 4.0 improvements copyright (C) 1999 by Peter Keeler            *
 * ------------------------------------------------------------------------ *
 * Rogue Winds 2.0 copyright (C) 2000 by Heather Dunn                       *
 * ------------------------------------------------------------------------ *
 *			    Main mud header file			    *
 ****************************************************************************/

#include <stdarg.h>
#include <stdlib.h>
#include <limits.h>

/*
#include "/smaug/ucmm/dmalloc/include/dmalloc.h"
*/
/* Dmalloc is a memory debugging library -- Scion */

/* force the who command to require an argument (should use cset) */
// #define REQWHOARG /* I don't think so.. - shogar */

#ifdef WIN32
  #include <winsock.h>
  #include <sys/types.h>
  #pragma warning( disable: 4018 4244 4761)
  #define NOCRYPT
  #define index strchr
  #define rindex strrchr
#else
  #include <unistd.h>
#ifndef SYSV
  #include <sys/cdefs.h>
#else
  #include <re_comp.h>
#endif
  #include <sys/time.h>
#endif

typedef	int				ch_ret;
typedef	int				obj_ret;

/*
 * Accommodate old non-Ansi compilers.
 */
#if defined(TRADITIONAL)
#define const
#define args( list )			( )
#define DECLARE_DO_FUN( fun )		void fun( )
#define DECLARE_SPEC_FUN( fun )		bool fun( )
#define DECLARE_SPELL_FUN( fun )	ch_ret fun( )
#else
#define args( list )			list
#define DECLARE_DO_FUN( fun )		DO_FUN    fun
#define DECLARE_SPEC_FUN( fun )		SPEC_FUN  fun
#define DECLARE_SPELL_FUN( fun )	SPELL_FUN fun
#endif

/*
 * Short scalar types.
 * Diavolo reports AIX compiler has bugs with short types.
 */
#if	!defined(FALSE)
#define FALSE	 0
#endif

#if	!defined(TRUE)
#define TRUE	 1
#endif

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

#if	defined(_AIX)
#if	!defined(const)
#define const
#endif
typedef int				sh_int;
typedef int				bool;
#define unix
#else
/* enuf of this, too many places where this is messing things up -shogar */
/* typedef short    int			sh_int; */
typedef int			sh_int;
typedef unsigned char			bool;
#endif
/*
 * Structure types.
 */
typedef struct  alias_data              ALIAS_DATA;
typedef struct	affect_data		AFFECT_DATA;
typedef struct	area_data		AREA_DATA;
typedef struct	ban_data		BAN_DATA;
typedef struct	extracted_char_data	EXTRACT_CHAR_DATA;
typedef struct	char_data		CHAR_DATA;
typedef struct	hunt_hate_fear		HHF_DATA;
typedef struct	descriptor_data		DESCRIPTOR_DATA;
typedef struct	exit_data		EXIT_DATA;
typedef struct	extra_descr_data	EXTRA_DESCR_DATA;
typedef struct	help_data		HELP_DATA;
typedef struct	menu_data		MENU_DATA;
typedef struct	mob_index_data		MOB_INDEX_DATA;
typedef struct	obj_data		OBJ_DATA;
typedef struct	obj_index_data		OBJ_INDEX_DATA;
typedef struct	pc_data			PC_DATA;
typedef struct	reset_data		RESET_DATA;
typedef struct	map_index_data		MAP_INDEX_DATA;		/* maps */
typedef struct	map_data		MAP_DATA;		/* maps */
typedef struct	room_index_data		ROOM_INDEX_DATA;
typedef struct	shop_data		SHOP_DATA;
typedef struct	reserve_data		RESERVE_DATA;
typedef struct	time_info_data		TIME_INFO_DATA;
typedef struct	hour_min_sec		HOUR_MIN_SEC;
typedef struct	weather_data		WEATHER_DATA;
typedef struct	neighbor_data		NEIGHBOR_DATA; /* FB */
typedef struct	mob_prog_data		MPROG_DATA;
typedef struct	mob_prog_act_list	MPROG_ACT_LIST;
typedef	struct	editor_data		EDITOR_DATA;
typedef struct	timer_data		TIMER;
typedef struct  godlist_data		GOD_DATA;
typedef struct	system_data		SYSTEM_DATA;
typedef	struct	smaug_affect		SMAUG_AFF;
typedef struct  who_data                WHO_DATA;
typedef	struct	skill_type		SKILLTYPE;
typedef	struct	social_type		SOCIALTYPE;
typedef	struct	cmd_type		CMDTYPE;
typedef	struct	killed_data		KILLED_DATA;
typedef struct  deity_data		DEITY_DATA;
typedef struct	wizent			WIZENT;
typedef struct  ignore_data		IGNORE_DATA;
typedef struct  immortal_host           IMMORTAL_HOST;
typedef struct	extended_bitvector	EXT_BV;
typedef	struct	lcnv_data		LCNV_DATA;
typedef struct	olc_data		OLC_DATA;	/* Tagith */
typedef struct	material_data	MATERIAL_DATA; /* Scion */
typedef struct  trail_data		TRAIL_DATA; /* Scion */
typedef struct	spell_data		SPELL_DATA; /* Scion */
typedef struct  clan_member_data CLAN_MEMBER; /* Scion */
typedef struct  clan_data		CLAN_DATA; /* Scion */
typedef struct	bit_data		BIT_DATA;	/* Scion */
typedef struct	moon_data		MOON_DATA;	/* Keolah */
typedef struct	species_data		SPECIES_DATA;
typedef struct	nation_data		NATION_DATA;
typedef struct	part_data		PART_DATA;
typedef struct	recipe_data		RECIPE_DATA;
typedef struct	ingred_data		INGRED_DATA;
typedef struct	mat_shop_data		MAT_SHOP;
typedef	struct	generic_mob_data	GENERIC_MOB;
typedef struct	explored_area_data	EXPLORED_AREA;
typedef	struct	mutation_data		MUT_DATA;
typedef	struct	player_mutation_data	PMUT_DATA;
typedef struct	city_data		CITY_DATA;
typedef struct	construct_data		CONSTRUCT_DATA;
typedef struct	channel_data		CHANNEL_DATA;
typedef struct	channel_member_data	CHANNEL_MEMBER;
typedef struct	arena_data		ARENA_DATA;
typedef struct	arena_member_data	ARENA_MEMBER;
typedef struct	bet_data		BET_DATA;
typedef struct	new_help_data	NEW_HELP_DATA;
typedef struct	book_data		BOOK_DATA;

/*
 * Function types.
 */
typedef	void	DO_FUN		args( ( CHAR_DATA *ch, char *argument ) );
typedef bool	SPEC_FUN	args( ( CHAR_DATA *ch ) );
typedef ch_ret	SPELL_FUN	args( ( int sn, int wil, CHAR_DATA *ch, void *vo ) );

#define DUR_CONV	23.333333333333333333333333
#define HIDDEN_TILDE	'*'

/* 32bit bitvector defines */
#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.
 */
/* Desperation move on my part- the crashing started with the new 30+ areas,
   the links seem to be dropping on almost everything, so... what the hell
   ... maybe the btree cant support as many levels as are being created
       shogar
*/
/*
#define MAX_KEY_HASH		 2048
*/
#define MAX_KEY_HASH		 4096
#define MAX_STRING_LENGTH	 4096  /* buf */
#define MAX_INPUT_LENGTH	 1024  /* arg */
#define MAX_INBUF_SIZE		 1024

#define HASHSTR			 /* use string hashing */

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

/*
 * Color Alignment Parameters
 */
#define ALIGN_LEFT	1
#define ALIGN_CENTER	2
#define ALIGN_RIGHT	3

/*
 * 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_SKILL		  800
#define MAX_RACE                   40      /* (was 19)  added more 3/25/99 Scion */
#define MAX_NPC_RACE		   91
#define MAX_MATERIALS		200 /* Object material types -- Scion */
#define MAX_MOONS		50
#define MAX_DEITY		   50
#define	MAX_HERB		   20
#define MAX_ALIAS                  20   /* alias - shogar */
#define	MAX_DISEASE		   20
#define MAX_WHERE_NAME             27
#define MAX_MOBS			10 /* Areas won't reset if more than this * areas mobs in the game */
#define MAX_OBJS			50 /* Areas won't reset if more than this * areas objs in the game */
#define	MAX_xBITS			32000

#define	SECONDS_PER_TICK			 70

#define PULSE_PER_SECOND			  4
#define PULSE_VIOLENCE				 (3 * PULSE_PER_SECOND)
#define PULSE_MOBILE				 (4 * PULSE_PER_SECOND)
#define PULSE_TICK		  (SECONDS_PER_TICK * PULSE_PER_SECOND)
#define PULSE_AREA				(60 * PULSE_PER_SECOND)
#define PULSE_TIME				(60 * 10 * PULSE_PER_SECOND)


/*
 * Stuff for area versions --Shaddai
 */
int     area_version;
#define HAS_SPELL_INDEX     -1
#define AREA_VERSION_WRITE 1

/*
 * Command logging types.
 */
typedef enum
{
  LOG_NORMAL, LOG_ALWAYS, LOG_NEVER, LOG_BUILD, LOG_HIGH, LOG_COMM,
  LOG_WARN, LOG_ALL
} log_types;

/*
 * Return types for move_char, damage, greet_trigger, etc, etc
 * Added by Thoric to get rid of bugs
 */
typedef enum
{
  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
} ret_types;

/* Echo types for echo_to_all */
#define ECHOTAR_ALL	0
#define ECHOTAR_PC	1
#define ECHOTAR_IMM	2
#define ECHOTAR_ROOM	3
#define ECHOTAR_AREA	4
#define ECHOTAR_WORLD	5

/* defines for new do_who */
#define WT_MORTAL	0
#define WT_DEADLY	1
#define WT_IMM		2
#define WT_GROUPED	3
#define WT_GROUPWHO	4
#define WT_GUEST	5
#define WT_STAFF	6
#define WT_ADMIN	7

/*
 * Defines for extended bitvectors
 */
#ifndef INTBITS
  #define INTBITS	32
#endif
#define XBM		31	/* extended bitmask   ( INTBITS - 1 )	*/
#define RSV		5	/* right-shift value  ( sqrt(XBM+1) )	*/
#define XBI		4	/* integers in an extended bitvector	*/
#define MAX_BITS	XBI * INTBITS
/*
 * Structure for extended bitvectors -- Thoric
 */
struct extended_bitvector
{
    int		bits[XBI];
};

#ifdef I3
   #include "i3.h"
#endif
#ifdef IMC
   #include "imc.h"
#endif

/* abit and qbit struct */
struct bit_data {
	int number;
	char desc[MAX_STRING_LENGTH];

	BIT_DATA *next;
	BIT_DATA *prev;
};

struct clan_member_data {
	char		*name;
	char		*title;
	EXT_BV		flags;
	int		bank;
	CLAN_DATA	*clan;

	CLAN_MEMBER	*next;
	CLAN_MEMBER	*prev;
};


struct clan_data {
	char		*name;
	char		*title;
	char		*info;
	int		ext_sec;
	int		int_sec;
	int		bank;

	CLAN_MEMBER	*first_member;
	CLAN_MEMBER	*last_member;

	CLAN_DATA	*next;
	CLAN_DATA	*prev;
};


/*
 * do_who output structure -- Narn
 */
struct who_data
{
  WHO_DATA *prev;
  WHO_DATA *next;
  char *text;
  int  type;
};

/*
 * Site ban structure.
 */
struct	ban_data
{
    BAN_DATA *next;
    BAN_DATA *prev;
    char     *name;     /* Name of site/race banned */
    char     *user;     /* Name of user from site */
    char     *ban_by;   /* Who banned this site */
    char     *ban_time; /* Time it was banned */
    int      unban_date;/* When ban expires */
    sh_int   duration;  /* How long it is banned for */
    bool     warn;      /* Echo on warn channel */
    bool     prefix;    /* Use of *site */
    bool     suffix;    /* Use of site* */
};



/*
 * Yeesh.. remind us of the old MERC ban structure? :)
 */
struct	reserve_data
{
    RESERVE_DATA *next;
    RESERVE_DATA *prev;
    char *name;
};



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

struct	time_info_data
{
    int		hour;
    int		day;
    int		month;
    int		year;
    int		sunlight;
};

struct hour_min_sec
{
  int hour;
  int min;
  int sec;
  int manual;
};

/* Define maximum number of climate settings - FB */
#define MAX_CLIMATE 5

struct	weather_data
{
/*    int			mmhg;
    int			change;
    int			sky;
    int			sunlight; */
    int 		temp;		/* temperature */
    int			precip;		/* precipitation */
    int			wind;		/* umm... wind */
	int			mana;		/* base amount of mana in the zone */
    int			temp_vector;	/* vectors controlling */
    int			precip_vector;	/* rate of change */
    int			wind_vector;
	int			mana_vector;
    int			climate_temp;	/* climate of the area */
    int			climate_precip;
    int			climate_wind;
	int			climate_mana;
    NEIGHBOR_DATA *	first_neighbor;	/* areas which affect weather sys */
    NEIGHBOR_DATA *	last_neighbor;
    char *		echo;		/* echo string */
    int			echo_color;	/* color for the echo */
};

struct neighbor_data
{
    NEIGHBOR_DATA *next;
    NEIGHBOR_DATA *prev;
    char *name;
    AREA_DATA *address;
};

/*
 * Connected state for a channel.
 */
typedef enum {
  CON_GET_NAME = -100,
  CON_GET_OLD_PASSWORD,
  CON_CONFIRM_NEW_NAME,
  CON_GET_NEW_PASSWORD,
  CON_CONFIRM_NEW_PASSWORD,
  CON_READ_MOTD,
  CON_GET_WANT_RIPANSI,
  CON_TITLE,
  CON_PRESS_ENTER,
  CON_WAIT_1,
  CON_WAIT_2,
  CON_WAIT_3,
  CON_ACCEPTED,
  CON_GET_NEWBIE,
  CON_CHOOSE_SEX,
  CON_CHOOSE_SPECIES,
  CON_CHOOSE_NATION,
  CON_COPYOVER_RECOVER,

  CON_PLAYING = 0,
  CON_EDITING

} connection_types;

/*
 * Character substates
 */
typedef enum
{
  SUB_NONE, SUB_PAUSE, SUB_PERSONAL_DESC, SUB_BAN_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,
  SUB_PROJ_DESC,
  /* timer types ONLY below this point */
  SUB_TIMER_DO_ABORT = 128, SUB_TIMER_CANT_ABORT
} char_substates;

/*
 * Descriptor (channel) structure.
 */
struct	descriptor_data
{
    DESCRIPTOR_DATA *	next;
    DESCRIPTOR_DATA *	prev;
    DESCRIPTOR_DATA *	snoop_by;
    CHAR_DATA *		character;
    CHAR_DATA *		original;
    char *		host;
    int			port;
    int			descriptor;
    sh_int		connected;
    sh_int		idle;
    sh_int		lines;
    sh_int		scrlen;
    bool		fcommand;
    char		inbuf		[MAX_INBUF_SIZE];
    char		incomm		[MAX_INPUT_LENGTH];
    char		inlast		[MAX_INPUT_LENGTH];
    int			repeat;
    char *		outbuf;
    unsigned long	outsize;
    int			outtop;
    char *		pagebuf;
    unsigned long	pagesize;
    int			pagetop;
    char *		pagepoint;
    char		pagecmd;
    char		pagecolor;
    char *		user;
    int                 auth_fd;
    int                 auth_inc;
    int                 auth_state;
    int			newstate;
    unsigned char	prevcolor;
    OLC_DATA *		olc;	/* Tagith */
};



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

struct	int_app_type
{
    sh_int	learn;
};

struct	wis_app_type
{
    sh_int	practice;
};

struct	dex_app_type
{
    sh_int	defensive;
};

struct	con_app_type
{
    sh_int	hitp;
    sh_int	shock;
};

struct	cha_app_type
{
    sh_int	charm;
};

struct  lck_app_type
{
    sh_int	luck;
};

/*
 * TO types for act.
 */
typedef enum { TO_ROOM, TO_NOTVICT, TO_VICT, TO_CHAR, TO_CANSEE } to_types;

/*
 * 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_GREEN
#define AT_YELL	           AT_GREEN
#define AT_TELL		   AT_RED
#define AT_WHISPER	   AT_DGREY
#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_OBJECT	   AT_GREEN
#define AT_PERSON	   AT_PLAIN
#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_FROST	   AT_LBLUE
#define AT_CHAOS	   AT_PURPLE
#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_IGNORE	   AT_GREEN
#define AT_DIVIDER	   AT_PLAIN

#define INIT_WEAPON_CONDITION    12
#define MAX_ITEM_IMPACT		 30

/*
 * Help table types.
 */
struct	help_data
{
    HELP_DATA *	next;
    HELP_DATA * prev;
    sh_int	permit;
    char *	keyword;
    char *	text;
};

struct	new_help_data {
	NEW_HELP_DATA	*next;
	NEW_HELP_DATA	*prev;

	char			*name;
	char			*text;
	int			permit;
};

struct	book_data {
	BOOK_DATA	*next;
	BOOK_DATA	*prev;

	char		*title;
	char		*text;
	char		*name;
};

/*
 * Shop types.
 */

struct	shop_data
{
    SHOP_DATA *	next;			/* Next shop in list		*/
    SHOP_DATA * prev;			/* Previous shop in list	*/
    int		room;			/* Vnum of shop room		*/
    int		profit_buy;
    int		profit_sell;
    int		gold;
    int		type;		/* Only sell items of this type */
    int		flag;		/* Only sell items with this flag */
    char      * owner;			/* Allows player-owned shops	*/
};

/* Mob program structures */
struct  act_prog_data
{
    struct act_prog_data *next;
    void *vo;
};

struct	mob_prog_act_list
{
    MPROG_ACT_LIST * next;
    char *	     buf;
    CHAR_DATA *      ch;
    OBJ_DATA *	     obj;
    void *	     vo;
};

struct	mob_prog_data
{
    MPROG_DATA * next;
    sh_int	 type;
    bool	 triggered;
    int		 resetdelay;
    char *	 arglist;
    char *	 comlist;
};

bool	MOBtrigger;


struct channel_data {
	char		*name;
	char		*owner;
	int		flags;
	char		*tag;
	char		*div;
	char		*clan;
	int		permit;
	char		*access;
	char		*ban;
	char		*info;

	CHANNEL_MEMBER	*first_member;
	CHANNEL_MEMBER	*last_member;

	CHANNEL_DATA	*next;
	CHANNEL_DATA	*prev;
};

struct channel_member_data {
	CHAR_DATA	*ch;
	int		flags;

	CHANNEL_MEMBER	*next;
	CHANNEL_MEMBER	*prev;
};


struct explored_area_data
{
	EXT_BV	rooms;
	int	index;

	EXPLORED_AREA *next;
	EXPLORED_AREA *prev;
};

struct  species_data
{
    char        *name;   /* Species name */
    sh_int      skill_set;
    sh_int      saving_poison_death;
    sh_int      saving_wand;
    sh_int      saving_para_petri;
    sh_int      saving_breath;
    sh_int      saving_spell_staff;
    int         parts;
    int         disadvantage;
    char	*adj;

	SPECIES_DATA	*next;
	SPECIES_DATA	*prev;
};

struct  nation_data
{
    char        *name;        /* Nation name */
    char	*species;	/* Nation's species */
    EXT_BV      affected;               /* Default affect bitvectors    */
    sh_int      hit;
    sh_int      mana;
    int         unarmed;                /* Percentage modifier to unarmed skill */
    sh_int      resist;
    sh_int      suscept;
    sh_int      ac_plus;
    sh_int      exp_multiplier;
    sh_int      height;
    sh_int      weight;
    sh_int      metabolism;
    sh_int      sector;				/* Prefered sectortype */
    sh_int      base_age;
    int         flags;

	NATION_DATA	*next;
	NATION_DATA	*prev;

    sh_int	str_mod;
    sh_int      int_mod;
    sh_int	wis_mod;
    sh_int	dex_mod;
    sh_int	con_mod;
    sh_int	cha_mod;
    sh_int	lck_mod;
    int		parts;
    sh_int	weapon;
	char *eyes;
	char *hair;
	char *skin_color;
	char *skin_type;
	char *extra_color;
	char *extra_type;
};

struct	generic_mob_data
{
	NATION_DATA	*nation;
	int		chance;

	GENERIC_MOB *next;
	GENERIC_MOB *prev;
};

struct	mutation_data {
	int number;
	char	*desc;
	char	*gain_self;
	char	*gain_other;
	char	*lose_self;
	char	*lose_other;
	AFFECT_DATA *affect;
	int	rarity;

	MUT_DATA *next;
	MUT_DATA *prev;
};

struct	player_mutation_data {
	MUT_DATA *mut;
	int	duration;

	PMUT_DATA *next;
	PMUT_DATA *prev;
};

/* Something under construction in a city */
struct	construct_data {
	int		type;
	int		builders;
	int		done;
	int		needed;
	int		vnum;

	CONSTRUCT_DATA	*next;
	CONSTRUCT_DATA	*prev;
};


/* Data structure for the new city management code */
struct	city_data {
	AREA_DATA	*area;
	char		*name;
	int		gold;
	int		food;
	int		wood;
	int		iron;
	int		builders;
	int		farmers;
	int		merchants;
	int		miners;
	int		peasants;
	int		houses;
	int		farms;
	int		shops;
	int		forests;
	int		mines;

	CONSTRUCT_DATA	*first_building;
	CONSTRUCT_DATA	*last_building;

	CITY_DATA	*next;
	CITY_DATA	*prev;
};


struct	recipe_data {
	int	number;
	int	ingred1;	/* vnum of first ingredient */
	int	ingred2;	/* vnum of second ingredient */
	int	result;		/* vnum of alchemy result */
	int	flags;		/* does it need a fire/drinkcon/etc? */

	RECIPE_DATA *next;
	RECIPE_DATA *prev;
};

struct	ingred_data
{
	int	vnum;
	int	rarity;
	int	sector;
	int	moisture;
	int	elevation;
	int	temp;
	int	mana;
	int	precip;

	INGRED_DATA *next;
	INGRED_DATA *prev;
};

struct	deity_data
{
	int		index;
	DEITY_DATA * next;
    DEITY_DATA * prev;
    char *	filename;
    char *	name;
    char *	description;
	sh_int	cost;
	char *	message;
	int	count;
	char *	archmage;
	int	arch_lvl;
	char *	color;
};

/*
 * An affect.
 *
 * So limited... so few fields... should we add more?
 */
struct	affect_data
{
    AFFECT_DATA *	next;
    AFFECT_DATA *	prev;
    sh_int		type;
    sh_int		duration;
    sh_int		location;
    int			modifier;
    EXT_BV		bitvector;
};


/*
 * A SMAUG spell
 */
struct	smaug_affect
{
    SMAUG_AFF *		next;
    char *		duration;
    sh_int		location;
    char *		modifier;
    int			bitvector;	/* this is the bit number */
};


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

/*
 * Well known mob virtual numbers.
 * Defined in #MOBILES.
 */
#define MOB_VNUM_CITYGUARD	   5331
#define MOB_VNUM_VAMPIRE	   18
#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
#define MOB_VNUM_GENERIC	   17

/*
 * ACT bits for mobs.
 * Used in #MOBILES.
 */
#define ACT_IS_NPC		  0		/* Auto set for mobs	*/
#define ACT_SENTINEL		  1		/* Stays in one room	*/
#define ACT_SCAVENGER		  2		/* Picks up objects	*/
#define ACT_MAG_FAIL		  3		/* Tried to use spec, but pc was immune */
#define ACT_AGGRESSIVE		  5		/* Attacks PC's		*/
#define ACT_STAY_AREA		  6		/* Won't leave area	*/
#define ACT_WIMPY		  7		/* Flees when hurt	*/
#define ACT_PET			  8		/* Auto set for pets	*/
#define ACT_TRAIN		  9		/* Can train PC's	*/
#define ACT_PRACTICE		 10		/* Can practice PC's	*/
#define ACT_PHYS_FAIL		 11		/* Tried to use physical attack, but PC was ethereal	 */
#define ACT_DEADLY		     12		/* UNUSED  */
#define ACT_POLYSELF		 13
#define ACT_META_AGGR		 14		/* UNUSED	*/
#define ACT_GUARDIAN		 15		/* Protects master	*/
#define ACT_RUNNING		     16		/* Hunts quickly	*/
#define ACT_NOWANDER		 17		/* Doesn't wander	*/
#define ACT_MOUNTABLE		 18		/* Can be mounted	*/
#define ACT_MOUNTED		     19		/* Is mounted		*/
#define ACT_NO_CORPSE            20		/* Does not leave a corpse */
#define ACT_SECRETIVE		 21		/* actions aren't seen	*/
#define ACT_NAMED	         22		/* Gets generated names */
#define ACT_MOBINVIS		 23		/* Like wizinvis	*/
#define ACT_NOASSIST		 24		/* Doesn't assist mobs	*/
#define ACT_AUTONOMOUS		 25		/* UNUSED */
#define ACT_PACIFIST         26		/* Doesn't ever fight   */
#define ACT_NOATTACK		 27		/* No physical attacks */
#define ACT_ANNOYING		 28		/* UNUSED */
#define ACT_PROTOTYPE		 30		/* A prototype mob	*/
/* 26 acts */

/*
 * Bits for 'affected_by'.
 * Used in #MOBILES.
 */
typedef enum
{
  AFF_BLIND, AFF_INVISIBLE, AFF_DETECT_EVIL, AFF_DETECT_INVIS,
  AFF_DETECT_MAGIC, AFF_DETECT_HIDDEN, AFF_HOLD, AFF_HOLY,
  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_ANTHRO, AFF_HAS_ARTI, AFF_ANGEL, AFF_FEAR, AFF_BEAUTY,
  AFF_POSSESS, AFF_BERSERK, AFF_AQUA_BREATH, AFF_VOID,
  AFF_DREAMWORLD, AFF_HASTE, AFF_SLOW, AFF_DEAF, AFF_NONLIVING,
  AFF_COLDBLOOD, AFF_GUARD, AFF_GLOW, AFF_DARK, AFF_AQUATIC,
  AFF_DEMON, AFF_SILENT, AFF_PLAGUE, AFF_ROTTING, AFF_MOUNTABLE,
  AFF_MOUNTED, AFF_FELINE, AFF_NUISANCE, AFF_UNDEAD,
  AFF_CONSTRUCT, AFF_ETHEREAL, AFF_NO_CORPSE, AFF_UNHOLY, AFF_MAGICAL,
  MAX_AFFECTED_BY
} affected_by_types;


/*
 * 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_LIGHT		  BV18
#define RIS_PSIONIC		  BV19
#define RIS_MAGIC		  BV20
#define RIS_PARALYSIS		  BV21
/* 21 RIS's*/

/*
 * Attack types
 */
typedef enum
{
  ATCK_BITE, ATCK_CLAWS, ATCK_TAIL, ATCK_STING, ATCK_PUNCH, ATCK_KICK,
  ATCK_TRIP, ATCK_BASH, ATCK_STUN, ATCK_GOUGE, ATCK_BACKSTAB, ATCK_FEED,
  ATCK_DRAIN,  ATCK_FIREBREATH, ATCK_FROSTBREATH, ATCK_ACIDBREATH,
  ATCK_LIGHTNBREATH, ATCK_GASBREATH, ATCK_POISON, ATCK_NASTYPOISON, ATCK_GAZE,
  ATCK_BLINDNESS, ATCK_CAUSESERIOUS, ATCK_EARTHQUAKE, ATCK_CAUSECRITICAL,
  ATCK_CURSE, ATCK_FLAMESTRIKE, ATCK_HARM, ATCK_FIREBALL, ATCK_COLORSPRAY,
  ATCK_WEAKEN, ATCK_SPIRALBLAST, MAX_ATTACK_TYPE
} attack_types;

/*
 * Defense types
 */
typedef enum
{
  DFND_PARRY, DFND_DODGE, DFND_HEAL, DFND_CURELIGHT, DFND_CURESERIOUS,
  DFND_CURECRITICAL, DFND_DISPELMAGIC, DFND_DISPELEVIL, DFND_SANCTUARY,
  DFND_FIRESHIELD, DFND_SHOCKSHIELD, DFND_SHIELD, DFND_BLESS, DFND_STONESKIN,
  DFND_TELEPORT, DFND_MONSUM1, DFND_MONSUM2, DFND_MONSUM3, DFND_MONSUM4,
  DFND_DISARM, DFND_ICESHIELD, DFND_GRIP, DFND_TRUESIGHT, DFND_TUMBLE,
  MAX_DEFENSE_TYPE
} defense_types;

/*
 * Body parts
 */
#define PART_HEAD		  0
#define PART_ARMS		  1
#define PART_LEGS		  2
#define PART_HEART		  3
#define PART_BRAINS		  4
#define PART_GUTS		  5
#define PART_HANDS		  6
#define PART_FEET		  7
#define PART_FINGERS	  8
#define PART_EAR		  9
#define PART_EYE		  10
#define PART_LONG_TONGUE  11
#define PART_EYESTALKS	  12
#define PART_TENTACLES	  13
#define PART_FINS		  14
#define PART_WINGS		  15
#define PART_TAIL		  16
#define PART_SCALES		  17
#define PART_CLAWS		  18
#define PART_FANGS		  19
#define PART_HORNS		  20
#define PART_TUSKS		  21
#define PART_TAILATTACK	  22
#define PART_SHARPSCALES  23
#define PART_BEAK		  24
#define PART_HAUNCH		  25
#define PART_HOOVES		  26
#define PART_PAWS		  27
#define PART_FORELEGS	  28
#define PART_FEATHERS	  29
#define MAX_PARTS		  30

/* Conditions of parts */
#define PART_MISSING		0
#define PART_WELL		100
#define PART_BOUND		99
#define PART_BROKEN		50
#define PART_SEVERED		1

/* New part flags */
typedef enum
{
BP_HEAD, BP_NECK, BP_CHEST, BP_STOMACH, BP_BACK, BP_NOSE,
BP_TAIL, BP_RHAND, BP_LHAND, BP_RARM, BP_LARM, BP_RLEG,
BP_LLEG, BP_RFOOT, BP_LFOOT, BP_REYE, BP_LEYE, BP_RWRIST,
BP_LWRIST, BP_RANKLE, BP_LANKLE, BP_RHOOF, BP_LHOOF, BP_RPAW,
BP_LPAW, BP_RWING, BP_LWING, BP_REAR, BP_LEAR, BP_HORN,
BP_RHORN, BP_LHORN, BP_TONGUE, BP_FANGS, BP_TENTACLES, BP_BEAK,
BP_RFLEG, BP_LFLEG, BP_RRLEG, BP_LRLEG, BP_ASS, BP_FACE,
BP_RFIN, BP_LFIN, BP_DFIN, BP_PENIS, BP_VAGINA, BP_CLAWS
} part_bits;

/*
 * Autosave flags
 */
#define SV_DEATH		  BV00 /* Save on death */
#define SV_KILL			  BV01 /* Save when kill made */
#define SV_PASSCHG		  BV02 /* Save on password change */
#define SV_DROP			  BV03 /* Save on drop */
#define SV_PUT			  BV04 /* Save on put */
#define SV_GIVE			  BV05 /* Save on give */
#define SV_AUTO			  BV06 /* Auto save every x minutes (define in cset) */
#define SV_ZAPDROP		  BV07 /* Save when eq zaps */
#define SV_UNUSED		  BV08 /* Not used */
#define SV_GET			  BV09 /* Save on get */
#define SV_RECEIVE		  BV10 /* Save when receiving */
#define SV_IDLE			  BV11 /* Save when char goes idle */
#define SV_BACKUP		  BV12 /* Make backup of pfile on save */
#define SV_QUITBACKUP	  BV13 /* Backup on quit only --Blod */

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

/*
 * Flags for act_string -- Shaddai
 */
#define STRING_NONE               0
#define STRING_IMM                BV01


/*
 * old flags for conversion purposes -- will not conflict with the flags below
 */
#define OLD_SF_SAVE_HALF_DAMAGE	  BV18  /* old save for half damage	*/
#define OLD_SF_SAVE_NEGATES	  BV19  /* old save negates affect	*/

/*
 * Skill/Spell flags	The minimum BV *MUST* be 11!
 */
#define SF_WATER		  BV00 /* won't work without water	*/
#define SF_EARTH		  BV01 /* won't work without plants	*/
#define SF_AIR			  BV02 /* won't work without air	*/
#define SF_ASTRAL		  BV03 /* dreamworld */
#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_GROUND		  BV08  /* won't work unless on ground	*/
#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 */
#define SF_INSTANT		  BV21 /* spell is cast instantly */
typedef enum { SS_NONE, SS_POISON_DEATH, SS_ROD_WANDS, SS_PARA_PETRI,
	       SS_BREATH, SS_SPELL_STAFF } save_types;

#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)
#define SSAV_MASK		ALL_BITS & ~(BV11 | BV12 | BV13)

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

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

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

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

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

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

typedef enum {
  BLDG_ROAD, BLDG_HOUSE, BLDG_SHOP, BLDG_WALL
} building_types;

typedef enum
{
  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
} trap_types;

#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_PART	     12
#define OBJ_VNUM_BLOOD		     17
#define OBJ_VNUM_PUDDLE		     55
#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_SKIN		     23
#define OBJ_VNUM_SLICE		     24
#define OBJ_VNUM_SHOPPING_BAG	     25

#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_EMPTY_FLASK         35
#define OBJ_VNUM_NOTE		     36

#define OBJ_VNUM_BAG_OF_HOLDING		44
#define OBJ_VNUM_STATUE			45 /* Gargoyles turn into statues */
#define OBJ_VNUM_MAGIC_MARKER		46
#define OBJ_VNUM_WINE			48
#define OBJ_VNUM_BALL_DARK		49
#define OBJ_VNUM_MYSTIC_SHOVEL		52

#define OBJ_VNUM_KEY			47

#define OBJ_VNUM_CHAOS_CHEESE		17001

/*
 * Item types.
 * Used in #OBJECTS.
 */
typedef enum
{
  ITEM_NONE, ITEM_LIGHT, ITEM_SCROLL, ITEM_WAND, ITEM_STAFF, ITEM_WEAPON,
  ITEM_RADIO, ITEM_SCANNER, ITEM_TREASURE, ITEM_ARMOR, ITEM_POTION,
  ITEM_WORN, ITEM_FURNITURE, ITEM_TRASH, ITEM_INSTRUMENT, 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_SHEATH, ITEM_TRAP, ITEM_MAP, ITEM_PORTAL, ITEM_PAPER,
  ITEM_TINDER, ITEM_LOCKPICK, ITEM_LOCK, ITEM_DISEASE, ITEM_OIL, ITEM_FUEL,
  ITEM_VEHICLE, ITEM_BANK, ITEM_MISSILE_WEAPON, ITEM_PROJECTILE,
  ITEM_QUIVER, ITEM_SHOVEL, ITEM_SALVE, ITEM_COOK, ITEM_KEYRING, ITEM_ODOR
} item_types;

#define MAX_ITEM_TYPE		     ITEM_ODOR

/*
 * Extra flags.
 * Used in #OBJECTS.
 */
typedef enum
{
  ITEM_GLOW, ITEM_HUM, ITEM_DARK, ITEM_LOYAL, ITEM_EVIL, ITEM_INVIS, ITEM_MAGIC,
  ITEM_NODROP, ITEM_BLESS, ITEM_IN_USE, ITEM_HOVER, ITEM_NO_RESET,
  ITEM_NOREMOVE, ITEM_INVENTORY, ITEM_DREAMWORLD, ITEM_EXPLOSIVE,
  ITEM_FLAMMABLE, ITEM_NO_TAKE, ITEM_ORGANIC, ITEM_METAL, ITEM_RETURNING,
  ITEM_GEM, ITEM_DURABLE, ITEM_SHIELD, ITEM_TWO_HANDED,
  ITEM_HIDDEN, ITEM_POISONED, ITEM_COVERING, ITEM_DEATHROT, ITEM_BURIED,
  ITEM_PROTOTYPE, ITEM_NOLOCATE, ITEM_GROUNDROT, ITEM_ARTIFACT, ITEM_PLRBLD,
  MAX_ITEM_FLAG
} item_extra_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_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_WEAR_HAND		BV13 /* formerly wield */
#define ITEM_UNUSED			BV14 /* formerly hold */
#define ITEM_WEAR_HOOVES	BV15 /* formerly dual-wield */
#define ITEM_WEAR_EARS		BV16
#define ITEM_WEAR_EYES		BV17
#define ITEM_UNUSED3		BV18 /* formerly missile_wield */
#define ITEM_WEAR_BACK		BV19
#define ITEM_WEAR_FACE		BV20
#define ITEM_WEAR_ANKLE		BV21
#define ITEM_WEAR_FLOAT		BV22
#define ITEM_WEAR_MAX		23

/*
 * Apply types (for affects).
 * Used in #OBJECTS.
 */
typedef enum
{
  APPLY_NONE, APPLY_STR, APPLY_DEX, APPLY_INT, APPLY_WIS, APPLY_CON,
  APPLY_SEX, APPLY_UNUSED, APPLY_UNUSED2, APPLY_AGE, APPLY_HEIGHT, APPLY_WEIGHT,
  APPLY_MANA, APPLY_HIT, APPLY_MOVE, APPLY_GOLD, APPLY_EXP, APPLY_AC,
  APPLY_HITROLL, APPLY_DAMROLL, APPLY_SAVING_POISON, APPLY_SAVING_ROD,
  APPLY_SAVING_PARA, APPLY_SAVING_BREATH, APPLY_SAVING_SPELL, APPLY_CHA,
  APPLY_AFFECT, APPLY_RESISTANT, APPLY_IMMUNE, APPLY_SUSCEPTIBLE,
  APPLY_WEAPONSPELL, APPLY_LCK, APPLY_FIRE_MAGIC,
  APPLY_EARTH_MAGIC, APPLY_WIND_MAGIC, APPLY_FROST_MAGIC,
  APPLY_LIGHTNING_MAGIC, APPLY_WATER_MAGIC, APPLY_DREAM_MAGIC,
  APPLY_SPEECH_MAGIC, APPLY_HEALING_MAGIC, APPLY_DEATH_MAGIC,
  APPLY_CHANGE_MAGIC, APPLY_TIME_MAGIC, APPLY_MOTION_MAGIC,
  APPLY_MIND_MAGIC, APPLY_ILLUSION_MAGIC, APPLY_SEEKING_MAGIC,
  APPLY_SECURITY_MAGIC, APPLY_CATALYSM_MAGIC, APPLY_VOID_MAGIC,
  APPLY_CLIMB, APPLY_GRIP, APPLY_NOTHING, APPLY_SCRIBE, APPLY_BREW,
  APPLY_WEARSPELL,
  APPLY_REMOVESPELL, APPLY_EMOTION, APPLY_MENTALSTATE, APPLY_STRIPSN,
  APPLY_REMOVE, APPLY_DIG, APPLY_FULL, APPLY_THIRST, APPLY_DRUNK,
  APPLY_BLOOD, APPLY_COOK, APPLY_RECURRINGSPELL, APPLY_CONTAGIOUS,
  APPLY_EXT_AFFECT, APPLY_ODOR, APPLY_ROOMFLAG, APPLY_SECTORTYPE,
  APPLY_ROOMLIGHT, APPLY_TELEVNUM, APPLY_TELEDELAY, MAX_APPLY_TYPE
} apply_types;

#define REVERSE_APPLY		   1000

/*
 * Values for containers (value[1]).
 * Used in #OBJECTS.
 */
#define CONT_CLOSEABLE		   BV00
#define CONT_PICKPROOF		   BV01
#define CONT_CLOSED		   BV02
#define CONT_LOCKED		   BV03
#define CONT_EATKEY		   BV04

/*
 * Well known room virtual numbers.
 * Defined in #ROOMS.
 */
#define ROOM_VNUM_LIMBO		      2
#define ROOM_VNUM_POLY		      3
#define ROOM_VNUM_HELL                6  /* for hell fix - shogar */
#define ROOM_VNUM_NEXUS		  20000
#define ROOM_VNUM_PKILL		  5000
#define ROOM_VNUM_SCHOOL	  100

/*
 * Room flags.           Holy cow!  Talked about stripped away..
 * Used in #ROOMS.       Those merc guys know how to strip code down.
 *			 Lets put it all back... ;)
 */

#define ROOM_DARK		BV00
#define ROOM_NO_QUIT		BV01
#define ROOM_NO_MOB		BV02
#define ROOM_INDOORS		BV03
#define ROOM_SLIPPERY		BV04
#define ROOM_STICKY		BV05
#define ROOM_BURNING		BV06
#define ROOM_NO_MAGIC		BV07
#define ROOM_TUNNEL		BV08
#define ROOM_PRIVATE		BV09
#define ROOM_SAFE		BV10
#define ROOM_SOLITARY		BV11
#define ROOM_PET_SHOP		BV12
#define ROOM_NO_RECALL		BV13
#define ROOM_DONATION		BV14
#define ROOM_NODROPALL		BV15
#define ROOM_SILENCE		BV16
#define ROOM_LOGSPEECH		BV17
#define ROOM_NODROP		BV18
#define ROOM_NO_DREAM		BV19
#define ROOM_NO_SUMMON		BV20
#define ROOM_NO_ASTRAL		BV21
#define ROOM_NOFLOOR		BV24
#define ROOM_NOSUPPLICATE       BV25
#define ROOM_R26		BV26
#define ROOM_NOMISSILE		BV27
#define ROOM_AMPLIFY		BV28
#define ROOM_R29		BV29
#define ROOM_PROTOTYPE	     	BV30

#define RUNE_FIRE		BV00
#define RUNE_FROST		BV01
#define RUNE_SHOCK		BV02
#define RUNE_LIGHT		BV03
#define RUNE_PAIN		BV04
#define RUNE_ACID		BV05
#define RUNE_POISON		BV06
#define RUNE_TRAVEL		BV07
#define RUNE_LIFE		BV08
#define RUNE_WIND		BV09
#define RUNE_DISTRACT		BV10
#define RUNE_WARD		BV11


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

#define PT_WATER	100
#define PT_AIR		200
#define PT_EARTH	300
#define PT_FIRE		400

/*
 * Push/pull types for exits					-Thoric
 * To differentiate between the current of a river, or a strong gust of wind
 */
typedef enum
{
  PULL_UNDEFINED, PULL_VORTEX, PULL_VACUUM, PULL_SLIP, PULL_ICE, PULL_MYSTERIOUS,
  PULL_CURRENT	 = PT_WATER, PULL_WAVE,	    PULL_WHIRLPOOL, PULL_GEYSER,
  PULL_WIND	 = PT_AIR,   PULL_STORM,    PULL_COLDWIND,  PULL_BREEZE,
  PULL_LANDSLIDE = PT_EARTH, PULL_SINKHOLE, PULL_QUICKSAND, PULL_EARTHQUAKE,
  PULL_LAVA 	 = PT_FIRE,  PULL_HOTAIR
} dir_pulltypes;


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


/*
 * Exit flags.			EX_RES# are reserved for use by the
 * Used in #ROOMS.		SMAUG development team
 */
#define EX_ISDOOR		  BV00
#define EX_CLOSED		  BV01
#define EX_LOCKED		  BV02
#define EX_SECRET		  BV03
#define EX_SWIM			  BV04
#define EX_PICKPROOF		  BV05
#define EX_FLY			  BV06
#define EX_CLIMB		  BV07
#define EX_DIG			  BV08
#define EX_EATKEY		  BV09
#define EX_NOPASSDOOR		  BV10
#define EX_HIDDEN		  BV11
#define EX_PASSAGE		  BV12
#define EX_PORTAL 		  BV13
#define EX_RES1			  BV14
#define EX_RES2			  BV15
#define EX_xCLIMB		  BV16
#define EX_xENTER		  BV17
#define EX_xLEAVE		  BV18
#define EX_xAUTO		  BV19
#define EX_NOFLEE	  	  BV20
#define EX_xSEARCHABLE		  BV21
#define EX_BASHED                 BV22
#define EX_BASHPROOF              BV23
#define EX_NOMOB		  BV24
#define EX_WINDOW		  BV25
#define EX_xLOOK		  BV26
#define EX_NEEDLE_TRAP		  BV27
#define MAX_EXFLAG		  27

/*
 * Sector types.
 * Used in #ROOMS.
 */
typedef enum
{
  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_LAVA,
  SECT_SWAMP, SECT_ICE, SECT_BEACH, SECT_MAX
} sector_types;

#define MAX_WEAR	52

/*
 * Equpiment wear locations.
 * Used in #RESETS.
 */
typedef enum
{
  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_HAND, WEAR_HAND2, WEAR_HOOVES, WEAR_EARS, WEAR_EYES,
  WEAR_UNUSED, WEAR_BACK, WEAR_FACE, WEAR_ANKLE_L, WEAR_ANKLE_R,
  WEAR_FLOAT, MAX_WEAR_OLD
} wear_locations;

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

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

/*
 * Positions.
 */
typedef enum
{
  POS_DEAD, POS_MORTAL, POS_INCAP, POS_STUNNED, POS_SLEEPING, POS_CHANNEL,
  POS_RESTING, POS_SITTING, POS_KNEELING, POS_SQUATTING, POS_SWIMMING,
  POS_FIGHTING, POS_STANDING, POS_MOUNTED, POS_FLYING, POS_SHOVE, POS_DRAG
} positions;

/*
 * ACT bits for players.
 */
typedef enum
{
  PLR_IS_NPC, PLR_LONG_EXIT, PLR_DEFENSE, PLR_AUTOEXIT, PLR_AUTOLOOT,
  PLR_NOHUNGER, PLR_BLANK, PLR_OUTCAST, PLR_BRIEF, PLR_COMBINE, PLR_PROMPT,
  PLR_TELNET_GA, PLR_HOLYLIGHT, PLR_WIZINVIS, PLR_ROOMVNUM, PLR_SILENCE,
  PLR_NO_EMOTE, PLR_ATTACKER, PLR_NO_TELL, PLR_LOG, PLR_DENY, PLR_FREEZE,
  PLR_THIEF, PLR_KILLER, PLR_LITTERBUG, PLR_ANSI, PLR_MULTI, PLR_OOC,
  PLR_SHOW_EXP, PLR_AUTOGOLD, PLR_AUTOMAP, PLR_AFK, PLR_INVISPROMPT,
  PLR_UNUSED, PLR_AUTOSEX, PLR_NO_CHANNEL, PLR_BOUNTY
} player_flags;

/*Bits for pc_data->flags. */
#define PCFLAG_MASK                BV00 /* illusion conceal aura */
#define PCFLAG_CHEAT               BV01 /* flag set if a char's levels are set */
#define PCFLAG_UNAUTHED		   BV02 /* has been counted in race/talent */
#define PCFLAG_NORECALL            BV03
#define PCFLAG_NOINTRO             BV04
#define PCFLAG_GAG		   BV05
#define PCFLAG_GUEST               BV07
#define PCFLAG_NOSUMMON		   BV08
#define PCFLAG_PAGERON		   BV09
#define PCFLAG_NOTITLE             BV10
#define PCFLAG_SHIELD	  	   BV11 /* mental shield */
#define PCFLAG_DIAGNOSE		   BV12
#define PCFLAG_HIGHGAG		   BV13
#define PCFLAG_HELPSTART	   BV15 /* Force new players to help start */
#define PCFLAG_UNUSED	 	   BV16
#define PCFLAG_NOBEEP		   BV17 /* stop people from beeping you -- Scion */
#define PCFLAG_ANONYMOUS	   BV18 /* Stop mortals' ranks and levels from showing up -- Scion */
#define PCFLAG_SPAR		   BV19 /* Will not fight to kill -keo */
#define PCFLAG_VAMPIRE		   BV20 /* Player is a vampire -keo */
#define PCFLAG_RW2		   BV21 /* Player has been updated for RW2 -keo */
#define PCFLAG_COUNTED		   BV22

typedef enum
{
  TIMER_NONE, TIMER_RECENTFIGHT, TIMER_SHOVEDRAG, TIMER_DO_FUN,
  TIMER_APPLIED, TIMER_PKILLED, TIMER_ASUPRESSED, TIMER_NUISANCE,
  TIMER_MAGIC
} timer_types;

struct timer_data
{
    TIMER  *	prev;
    TIMER  *	next;
    DO_FUN *	do_fun;
    int		value;
    sh_int	type;
    int		count;
};


/*
 * Channel bits.
 */
#define	CHANNEL_GENERAL		   BV00
#define	CHANNEL_CHAT		   BV01
#define	CHANNEL_SPEECH		   BV02
#define	CHANNEL_IMMTALK		   BV03
#define	CHANNEL_MUSIC		   BV04
#define	CHANNEL_TWINK		   BV05
#define	CHANNEL_SHOUT		   BV06
#define	CHANNEL_YELL		   BV07
#define CHANNEL_MONITOR		   BV08
#define CHANNEL_LOG		   BV09
#define CHANNEL_HIGHGOD		   BV10
#define CHANNEL_PRIVATE		   BV11
#define CHANNEL_BUILD		   BV12
#define CHANNEL_HIGH		   BV13
#define CHANNEL_OOC		   BV14
#define CHANNEL_PRAY		   BV15
#define CHANNEL_UNUSED2 	     BV16
#define CHANNEL_UNUSED3              BV17
#define CHANNEL_COMM		   BV18
#define CHANNEL_TELLS		   BV19
#define CHANNEL_FOREIGN            BV20
#define CHANNEL_NEWBIE             BV21
#define CHANNEL_WARTALK            BV22
#define CHANNEL_RACETALK           BV23
#define CHANNEL_WARN               BV24
#define CHANNEL_WHISPER		   BV25
#define CHANNEL_HUMOR		   BV26
#define	CHANNEL_GRATZ			BV27
#define CHANNEL_THINK			BV28

/* 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
#define AFLAG_NOQUIT		    BV03
#define AFLAG_NOBYPASS		    BV04
#define AFLAG_NOTRAVEL		    BV05

/* Mud wide quests - Keolah Nov 30 2000 */
#define QUEST_ETERNAL_NIGHT		BV00
#define QUEST_TEMPEST			BV01
#define QUEST_EVIL			BV02

/* Command Permissions - Keolah Aug 16 2001 */
#define PERMIT_ADMIN		BV00
#define PERMIT_HELP		BV01
#define PERMIT_BUILD		BV02
#define PERMIT_HIBUILD		BV03
#define PERMIT_SECURITY		BV04
#define PERMIT_TALENT		BV05
#define PERMIT_ITEM		BV06
#define PERMIT_MISC		BV07
#define PERMIT_CHANNEL		BV08
#define PERMIT_MOB		BV09
#define PERMIT_PROG		BV11

/* Flags for recipes -keo */
#define RECIPE_FIRE		BV00
#define RECIPE_WATER		BV01
#define RECIPE_DRINKCON		BV02
#define RECIPE_CONTAINER	BV03
#define RECIPE_ICE		BV04
#define RECIPE_SUN		BV05
#define RECIPE_MOON		BV06
#define RECIPE_LIGHT		BV07
#define RECIPE_DARK		BV08
#define RECIPE_KNIFE		BV09
#define RECIPE_BLOOD		BV10

/* Mood flags -keo */
#define MOOD_RELAXED		BV00
#define MOOD_READY		BV01
#define MOOD_ANGRY		BV02
#define MOOD_AFRAID		BV03
#define MOOD_FRIENDY		BV04
#define MOOD_GUARD		BV05
#define MOOD_DEFENSE		BV06

/* Vehicle flags -keo */
#define VEHICLE_LAND		BV00
#define VEHICLE_SURFACE		BV01
#define VEHICLE_UNDERWATER	BV02
#define VEHICLE_AIR		BV03
#define	VEHICLE_SPACE		BV04
#define VEHICLE_UNDERGROUND	BV05
#define VEHICLE_CLIMB		BV06
#define VEHICLE_AIRTIGHT	BV07
#define VEHICLE_SAND		BV08
#define VEHICLE_ICE		BV09

/* Social flags -keo */
#define SOC_SLEEP			BV00
#define SOC_POLITE		BV01
#define SOC_RUDE			BV02
#define SOC_SEXUAL		BV03
#define SOC_VISUAL		BV04
#define SOC_AUDITORY		BV05
#define SOC_TOUCH			BV06
#define SOC_ANNOYING		BV06

/* Race flags */
#define NAT_NPC			BV00 /* Nation is NPC only */
#define NAT_NEWBIE		BV01 /* Newbie approved */

/* Arena flags */
#define ARENA_TEAM		BV00
#define ARENA_HALT		BV01
#define ARENA_DEBUG		BV02

/* Gladiator flags */
#define GLAD_RANDOM		BV00
#define GLAD_WAIT		BV01
#define GLAD_TOGGLE		BV02

typedef enum
{
   CL_LEADER, CL_INDUCT, CL_OUTCAST, CL_BANK, CL_FINANCE, CL_BESTOW,
   CL_SECRET, CL_KNOWLEDGE, CL_ALLOW
} clan_flags;

typedef enum
{
  LANG_KALORESE, LANG_ELVEN, LANG_DWARVEN, LANG_SUNRISE, LANG_ORCISH, 
  LANG_DRAGON, LANG_ISLANDIC, LANG_DROW
} languages;

typedef enum
{
   SK_SMITH, SK_ALCHEMY, SK_TAILOR, SK_STEALTH, SK_STREET, SK_JEWEL,
   SK_NATURE, SK_MEDICINE, SK_MINING, SK_CHANNEL, SK_LINGUIST
} noncombat_skills;

typedef enum
{
   SK_COMBAT, SK_SWORD, SK_DAGGER, SK_AXE, SK_WHIP, SK_MACE, SK_WAND,
   SK_FIREARMS, SK_BOW, SK_CROSSBOW, SK_STAFF, SK_HALBERD, SK_SPEAR,
   SK_POLEARM, SK_CLAW, SK_FANG, SK_HEAD, SK_TAIL, SK_HAND, SK_KICK
} combat_skills;

typedef enum
{
   PHASE_NEW, PHASE_CRESCENT, PHASE_HALF, PHASE_GIBBOUS, PHASE_FULL
} moon_phases;

typedef enum
{
   MOON_DARK, MOON_HUNGER, MOON_BLOOD
} moon_affects;

typedef enum
{
   BANE_NONE, BANE_UNDEAD, BANE_DEMON, BANE_ELF, BANE_ORC, BANE_DRAGON,
   BANE_HUMAN, BANE_DWARF, BANE_FAERIE, BANE_GIANT, BANE_MINOTAUR,
   BANE_TROLL, BANE_HALFLING, BANE_ANIMAL, BANE_FELINE, BANE_CENTAUR,
   BANE_CONSTRUCT, BANE_ANGEL
} weapons_banes;

typedef enum
{
   BRAND_NONE, BRAND_POISON, BRAND_FLAMING, BRAND_VORPAL, BRAND_FROZEN,
   BRAND_ELEC, BRAND_ACID, BRAND_STORM, BRAND_RADIANT, BRAND_CRUSH,
   BRAND_DRAIN, BRAND_PSIONIC, BRAND_ANTI_MATTER, BRAND_SONIC,
   BRAND_DISTORT
} weapon_brands;

typedef enum
{
   SONG_NONE, SONG_PEACE, SONG_SILENCE, SONG_SLEEP, SONG_FLIGHT,
   SONG_CHARM, SONG_STRENGTH, SONG_SPEED, SONG_PROTECT,
   SONG_VIGOR, SONG_FIRE, SONG_THUNDER, SONG_WIND, SONG_RIVERS,
   SONG_SIGHT, SONG_SHADOWS, SONG_LIGHT, SONG_WINTER, SONG_LIFE, 
   MAX_SONG
} speech_songs;

typedef enum
{
   TAL_FIRE, TAL_EARTH, TAL_WIND, TAL_FROST, TAL_LIGHTNING, TAL_WATER,
   TAL_DREAM, TAL_SPEECH, TAL_HEALING, TAL_DEATH, TAL_CHANGE, TAL_TIME,
   TAL_MOTION, TAL_MIND, TAL_ILLUSION, TAL_SEEKING, TAL_SECURITY,
   TAL_CATALYSM, TAL_VOID
} talents;

typedef enum
{
   MAG_NONE, MAG_FIRE, MAG_COLD, MAG_ELECTRICITY, MAG_ENERGY, MAG_ACID,
   MAG_POISON, MAG_DRAIN, MAG_PSIONIC, MAG_LIGHT, MAG_BLUNT, MAG_PIERCE,
   MAG_SLASH, MAG_WIND, MAG_WATER, MAG_EARTH, MAG_SOUND, MAG_DREAM,
   MAG_CHANGE, MAG_ANTIMATTER, MAG_ANTIMAGIC, MAG_HOLY, MAG_UNHOLY, 
   MAG_TELEKINETIC, MAG_ETHER, MAG_TIME, MAG_SEEK, MAG_ALL
} magic_dam_types;

/*
 * Prototype for a mob.
 * This is the in-memory version of #MOBILES.
 */
struct	mob_index_data
{
    MOB_INDEX_DATA *	next;
    MOB_INDEX_DATA *	next_sort;
    SPEC_FUN *		spec_fun;
    MPROG_DATA *	mudprogs;
    EXT_BV		progtypes;
    char *		player_name;
    char *		short_descr;
    char *		description;
    int			vnum;
    sh_int		count;
    sh_int		killed;
    sh_int		sex;
    EXT_BV		act;
    EXT_BV		affected_by;
    sh_int		mobthac0;		/* Unused */
    sh_int		ac;
    sh_int		hitnodice;
    sh_int		hitsizedice;
    sh_int		hitplus;
    sh_int		damnodice;
    sh_int		damsizedice;
    sh_int		damplus;
    sh_int		numattacks;
    int			gold;
    int			exp;
    int			xflags;
    int			resistant;
    int			immune;
    int			susceptible;
    EXT_BV		attacks;
    EXT_BV		defenses;
    sh_int		position;
    sh_int		defposition;
    sh_int		height;
    sh_int		weight;
    sh_int		race;
    sh_int		hitroll;
    sh_int		damroll;
    sh_int		perm_str;
    sh_int		perm_int;
    sh_int		perm_wis;
    sh_int		perm_dex;
    sh_int		perm_con;
    sh_int		perm_cha;
    sh_int		perm_lck;
    sh_int		saving_poison_death;
    sh_int		saving_wand;
    sh_int		saving_para_petri;
    sh_int		saving_breath;
    sh_int		saving_spell_staff;
};


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

struct	editor_data
{
    sh_int		numlines;
    sh_int		on_line;
    sh_int		size;
    char		line[49][81];
};

struct	extracted_char_data
{
    EXTRACT_CHAR_DATA *	next;
    CHAR_DATA *		ch;
    ROOM_INDEX_DATA *	room;
    ch_ret		retcode;
    bool		extract;
};

/*
 * One character (PC or NPC).
 */
struct	char_data
{
    CHAR_DATA *		next;
    CHAR_DATA *		prev;
    CHAR_DATA *		next_in_room;
    CHAR_DATA *		prev_in_room;
    CHAR_DATA *		master;
    CHAR_DATA *		leader;
	CHAR_DATA *		protected_by; /* Scion */
    CHAR_DATA *		reply;
    CHAR_DATA *		retell;
    CHAR_DATA *		switched;
    CHAR_DATA *		mount;
    HHF_DATA *		hunting;
    HHF_DATA *		fearing;
    HHF_DATA *		hating;
    SPEC_FUN *		spec_fun;
    MPROG_ACT_LIST *	mpact;
    int			mpactnum;
    sh_int		mpscriptpos;
    MOB_INDEX_DATA *	pIndexData;
    DESCRIPTOR_DATA *	desc;
    AFFECT_DATA *	first_affect;
    AFFECT_DATA *	last_affect;
    OBJ_DATA *		first_carrying;
    OBJ_DATA *		last_carrying;
    ROOM_INDEX_DATA *	in_room;
    OBJ_DATA *		on;			/* furniture, stand on objects */
    ROOM_INDEX_DATA *	was_in_room;
	int				home_room; /* So sentinel mobs know how to go home after chasing down PCs */
    RESET_DATA *reset; /* So mobs know what reset spawned them when they leave the game */
	PC_DATA *		pcdata;
    DO_FUN *		last_cmd;
    DO_FUN *		prev_cmd;   /* mapping */
    void *		dest_buf;  /* This one is to assign to differen things */
    char *		alloc_ptr; /* Must str_dup and free this one */
    void *		spare_ptr;
    int			tempnum;
    EDITOR_DATA *	editor;
    TIMER	*	first_timer;
    TIMER	*	last_timer;
    char *		name;
    char *		short_descr;
    char *		description;
    sh_int		substate;
    sh_int		sex;
    sh_int		race;
	sh_int		talent[MAX_DEITY]; /* 'levels' of each talent the player has access to */
	sh_int		curr_talent[MAX_DEITY];
    sh_int		trust;
    int			played;
    time_t		logon;
    time_t		save_time;
    sh_int		timer;
    sh_int		wait;
    sh_int		hit;
    sh_int		max_hit;
	sh_int		base_hit;
    sh_int		mana;
    sh_int		max_mana;
	sh_int		base_mana;
    sh_int		move;
    sh_int		max_move;
	sh_int		base_move;
    sh_int		numattacks;
    unsigned long	gold;
    int			exp;
    EXT_BV		act;
    EXT_BV		affected_by;
    EXT_BV		no_affected_by;
    int			carry_weight;
    int			carry_number;
    int			xflags;
    int			resistant;
    int			no_resistant;
    int			immune;
    int			no_immune;
    int			susceptible;
    int			no_susceptible;
    EXT_BV		attacks;
    EXT_BV		defenses;
    sh_int		saving_poison_death;
    sh_int		saving_wand;
    sh_int		saving_para_petri;
    sh_int		saving_breath;
    sh_int		saving_spell_staff;
    sh_int		barenumdie;
    sh_int		baresizedie;
    sh_int		mobthac0;
    sh_int		hitroll;
    sh_int		damroll;
    sh_int		hitplus;
    sh_int		damplus;
    sh_int		position;
    sh_int		height;
    sh_int		weight;
    sh_int		armor;
    sh_int		wimpy;
    sh_int		perm_str;
    sh_int		perm_int;
    sh_int		perm_wis;
    sh_int		perm_dex;
    sh_int		perm_con;
    sh_int		perm_cha;
    sh_int		perm_lck;
    sh_int		mod_str;
    sh_int		mod_int;
    sh_int		mod_wis;
    sh_int		mod_dex;
    sh_int		mod_con;
    sh_int		mod_cha;
    sh_int		mod_lck;
    sh_int		mental_state;		/* simplified */
    sh_int		emotional_state;	/* simplified */
    int			pagelen;                        /* BUILD INTERFACE */
    int			retran;
    int			regoto;
    sh_int		mobinvis;	/* Mobinvis level SB */
    int			fur_pos;		/* furniture pos. */
    int			recall; /* Where to recall to -- Scion */
	char *		last_taken; /* Name of the last object picked up by mob/pc */
	BIT_DATA	*first_abit;
	BIT_DATA	*last_abit;
	char 		*species;
	NATION_DATA	*nation;
	int		singing;
	int		shield;
	int		mod_talent[MAX_DEITY];
	CHAR_DATA	*last_hit;		/* char that last damaged char */
	PART_DATA	*first_part;		/* list of bodyparts */
	PART_DATA	*last_part;
	OBJ_DATA	*main_hand;		/* wielded weapons etc */
	OBJ_DATA	*off_hand;
	int		mood;		/* anger, fear, etc */
	int		encumberance;	/* weight of items being worn */
	int		speed;
	OBJ_DATA	*in_obj;	/* for vehicles */
};


struct killed_data
{
    int			vnum;
    char		count;
};


typedef  struct  alias_queue   ALIAS_QUEUE;

struct alias_queue
{
    ALIAS_QUEUE   *next;
    char          *cmd;
};

/*
 * Data which only PC's have.
 */
struct	pc_data
{
    ALIAS_DATA         *first_alias;
    ALIAS_DATA         *last_alias;
	ALIAS_QUEUE		*alias_queue;
	int				alias_used; /* Alias used x times -- Scion */
    CHAR_DATA *		pet;
    AREA_DATA *		area;
    DEITY_DATA *	deity;
	BIT_DATA *first_qbit;
	BIT_DATA *last_qbit;
    char *		homepage;
    char *		deity_name;
    char *		pwd;
    char *		bamfin;
    char *		bamfout;
    char *		filename;       /* For the safe mset name -Shaddai */
    char *      rank;
    char *		title;
    int         flags;		/* Whether the player is deadly and whatever else we add.      */
    int			pkills;		/* Number of pkills */
    int			pdeaths;	/* Number of times pkilled (legally)  */
    int			mkills;		/* Number of mobs killed		   */
    int			mdeaths;	/* Number of deaths due to mobs       */

    long int            restore_time;	/* The last time the char did a restore all */
    int			r_range_lo;	/* room range */
    int			r_range_hi;
    int			m_range_lo;	/* mob range  */
    int			m_range_hi;
    int			o_range_lo;	/* obj range  */
    int			o_range_hi;
    sh_int		wizinvis;	/* wizinvis level */
    sh_int		condition	[MAX_CONDS];
    sh_int		learned		[MAX_SKILL];
    time_t		release_date;	/* Auto-helling.. Altrag */
    char *		helled_by;
    char *		bio;		/* Personal Bio */
    char *		prompt;		/* User config prompts */
    char *		fprompt;	/* Fight prompts */
    char *		subprompt;	/* Substate prompt */
    sh_int		pagerlen;	/* For pager (NOT menus) */

    char *      alias[MAX_ALIAS]; /* alias - shogar */
    char *      alias_sub[MAX_ALIAS];

	char *  outputprefix;
	char *  outputsuffix;

	int memorize[8]; /* Locations that can be memorized with the memorize command -- Scion */

	unsigned long	balance; /* Bank balance -- Scion */
	int bounty;  /* Cash reward for pkilling this char -- Scion */
	char *family;
	int gen;
	char *spouse;
	char *maiden_name;
	char *name_disguise;
	int age_adjust;
	CHAR_DATA *mindlink;
	sh_int weapon[20];
	int rkills;	/* real kills */
	int rdeaths;	/* real deaths */
	char *were_race;
	int weapon_exp[20];
	int talent_exp[MAX_DEITY];
	int points;	/* unspent points for talents */
	int inborn;	/* talent that the player is naturally good at */
	EXT_BV perm_aff; /* affects that dont come off automatically */
	int noncombat[20];
	int noncombat_exp[20];
	CHAR_DATA *consenting;
	char *parent;	/* the mother,father or sire of ch */
	char *auto_attack;
	EXPLORED_AREA *first_explored; /* what rooms have been explored */
	EXPLORED_AREA *last_explored;
	PMUT_DATA *first_mutation;
	PMUT_DATA *last_mutation;
	CHAR_DATA *magiclink;
	char *type;
	int permissions;
	char *channels;
	char *eyes;
	char *hair;
	char *skin_color;
	char *skin_type;
	char *extra_color;
	char *extra_type;
#ifdef I3
    I3_CHARDATA  *i3chardata;
#endif
#ifdef IMC
    IMC_CHARDATA  *imcchardata;
#endif
};



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

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


/*
 * Damage types from the attack_table[]
 */
typedef enum
{
   DAM_HIT, DAM_SLICE, DAM_STAB, DAM_SLASH, DAM_WHIP, DAM_CLAW,
   DAM_BLAST, DAM_POUND, DAM_CRUSH, DAM_GREP, DAM_BITE, DAM_PIERCE,
   DAM_SUCTION, DAM_BOLT, DAM_ARROW, DAM_DART, DAM_STONE, DAM_PEA
} damage_types;


/*
 * Extra description data for a room or object.
 */
struct	extra_descr_data
{
    EXTRA_DESCR_DATA *next;	/* Next in list                     */
    EXTRA_DESCR_DATA *prev;	/* Previous in list                 */
    char *keyword;              /* Keyword in look/examine          */
    char *description;          /* What to see                      */
};



/*
 * Prototype for an object.
 */
struct	obj_index_data
{
    OBJ_INDEX_DATA *	next;
    OBJ_INDEX_DATA *	next_sort;
    EXTRA_DESCR_DATA *	first_extradesc;
    EXTRA_DESCR_DATA *	last_extradesc;
    AFFECT_DATA *	first_affect;
    AFFECT_DATA *	last_affect;
    MPROG_DATA *	mudprogs;               /* objprogs */
    EXT_BV		progtypes;              /* objprogs */
    char *		name;
    char *		short_descr;
    char *		description;
    char *		action_desc;
    int			vnum;
    sh_int		item_type;
    EXT_BV		extra_flags;
    int			tech;
    sh_int		count;
    sh_int		weight;
    int			cost;
    int			value	[7]; /* Added one extra -- Scion */
    int			serial;
    sh_int		layers;
    EXT_BV		parts;
};


/*
 * One object.
 */
struct	obj_data
{
    OBJ_DATA *		next;
    OBJ_DATA *		prev;
    OBJ_DATA *		next_content;
    OBJ_DATA *		prev_content;
    OBJ_DATA *		first_content;
    OBJ_DATA *		last_content;
    OBJ_DATA *		in_obj;
    CHAR_DATA *		carried_by;
    EXTRA_DESCR_DATA *	first_extradesc;
    EXTRA_DESCR_DATA *	last_extradesc;
    AFFECT_DATA *	first_affect;
    AFFECT_DATA *	last_affect;
    OBJ_INDEX_DATA *	pIndexData;
    ROOM_INDEX_DATA *	in_room;
    char *		name;
    char *		short_descr;
    char *		description;
    char *		action_desc;
	char *		obj_by; /* Who invoked/fashioned this object? -- Scion */
    sh_int		item_type;
    sh_int		mpscriptpos;
    EXT_BV		extra_flags;
    MPROG_ACT_LIST *	mpact;		/* mudprogs */
    int			mpactnum;	/* mudprogs */
    sh_int		wear_loc;
    sh_int		weight;
    int			cost;
	int			condition; /* Damage to the object -- Scion */
    sh_int		timer;
    int			value	[7]; /* Added one extra -- Scion */
    MATERIAL_DATA	*material;
    sh_int		count;		/* support for object grouping */
    int			serial;		/* serial number	       */
    int			size;
	int		raw_mana;
	int		mana;
	EXT_BV		parts;		/* which parts the item is worn on */
	OBJ_DATA	*gem;		/* what gem is attached to it */
};

/* Data for a material type -- Scion */
struct material_data {
	int number; /* Number to reference the material by */
	char *name; /* Namelist of raw material */
	char *short_descr; /* Short desc of raw material */
	char *description; /* Long desc of raw material */
	int weight; /* Weight modifier for finished product */
	int cost; /* Cost modifier */
	int rarity; /* How often does this material load? (percentage) */
	int sector; /* Sectory type this ore can be found in */
	int race; /* Race that generates this ore when killed (ie. dragon
                     scales */
	EXT_BV extra_flags; /* Same flags as objects, they get transferred to finished product */

	AFFECT_DATA *	first_affect;
    AFFECT_DATA *	last_affect;

	MATERIAL_DATA *next;
	MATERIAL_DATA *prev;

	int magic;	/* magic absorbiency -keo */
};


struct mat_shop_data {
	int	room;
	int	mat[5];

	MAT_SHOP	*next;
	MAT_SHOP	*prev;
};

struct 	arena_data {
	char *name;
	int   phase;
	int vnum;
	char *winner;
	int flags;

	ROOM_INDEX_DATA *room;

	ARENA_MEMBER *first_member;
	ARENA_MEMBER *last_member;

	ARENA_DATA *next;
	ARENA_DATA *prev;
};

struct 	arena_member_data {
	char *name;
	char *owner;
	int	wins;
	int	kills;
	int	played;
	int	team;
	int	age;
	int	hp;
	int	str;
	int	con;
	int	dex;
	int	spd;
	int	end;
	int	skill;
	int	flags;
	int	score;
	int	total;

	ARENA_DATA *arena;

	BET_DATA *first_bet;
	BET_DATA *last_bet;

	ARENA_MEMBER *next;
	ARENA_MEMBER *prev;
};

struct	bet_data {
	char	*better;
	int	wager;
	int	odds;
	unsigned long	winnings;

	BET_DATA *member;

	BET_DATA *next;
	BET_DATA *prev;
};

struct	moon_data {
	char *name;
	char *world;
	char *color;
	int	rise;
	int	set;
	int	phase;
	int	type;
	bool	up;
	bool	waning;

	MOON_DATA *next;
	MOON_DATA *prev;
};

struct part_data
{
	int	loc;	/* points to specific name of part in part_locs */
	int	armor;	/* ac of the part */
	int	cond;	/* hp of the part */
	int	flags;	/* is it broken or missing? */

	PART_DATA	*prev;
	PART_DATA	*next;

	OBJ_DATA	*obj;	/* armor worn there */
	OBJ_DATA	*obj2;	/* second layer of armor */
	PART_DATA	*connect_to;
};

/*
 * Exit data.
 */
struct	exit_data
{
    EXIT_DATA *		prev;		/* previous exit in linked list	*/
    EXIT_DATA *		next;		/* next exit in linked list	*/
    EXIT_DATA *		rexit;		/* Reverse exit pointer		*/
    ROOM_INDEX_DATA *	to_room;	/* Pointer to destination room	*/
    char *		keyword;	/* Keywords for exit or door	*/
    char *		description;	/* Description of exit		*/
    int			vnum;		/* Vnum of room exit leads to	*/
    int			rvnum;		/* Vnum of room in opposite dir	*/
    int			exit_info;	/* door states & other flags	*/
    int			key;		/* Key vnum			*/
    sh_int		vdir;		/* Physical "direction"		*/
    sh_int		distance;	/* how far to the next room	*/
    sh_int		pull;		/* pull of direction (current)	*/
    sh_int		pulltype;	/* type of pull (current, wind)	*/
    int			wall;		/* type of wall, if any		*/
};



/*
 * Reset commands:
 *   '*': comment
 *   'M': read a mobile
 *   'O': read an object
 *   'P': put object in object
 *   'G': give object to mobile
 *   'E': equip object to mobile
 *   'H': hide an object
 *   'B': set a bitvector
 *   'T': trap an object
 *   'D': set state of door
 *   'R': randomize room exits
 *   'S': stop (end of list)
 */

/*
 * Area-reset definition.
 */
struct	reset_data
{
    RESET_DATA *	next;
    RESET_DATA *	prev;
    char		command;
    int			extra;
    int			arg1;
    int			arg2;
    int			arg3;
	bool		active;
};

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



/*
 * Area definition.
 */
struct	area_data
{
    AREA_DATA *		next;
    AREA_DATA *		prev;
    AREA_DATA *		next_sort;
    AREA_DATA *		prev_sort;
    AREA_DATA *         next_sort_name; /* Used for alphanum. sort */
    AREA_DATA *         prev_sort_name; /* Ditto, Fireblade */
    RESET_DATA *	first_reset;
    RESET_DATA *	last_reset;
    char *		name;
    char *		filename;
    int                 flags;
    sh_int              status;  /* h, 8/11 */
    sh_int		age;
    sh_int		nplayer;
    sh_int		reset_frequency;
    int			low_r_vnum;
    int			hi_r_vnum;
    int			low_o_vnum;
    int			hi_o_vnum;
    int			low_m_vnum;
    int			hi_m_vnum;
    int			low_soft_range;
    int			hi_soft_range;
    int			low_hard_range;
    int			hi_hard_range;
    char *		author; /* Scryn */
    char *              resetmsg; /* Rennard */
    RESET_DATA *	last_mob_reset;
    RESET_DATA *	last_obj_reset;
    sh_int		max_players;
    int			mkills;
    int			mdeaths;
    int			pkills;
    int			pdeaths;
    int			gold_looted;
    int			illegal_pk;
    int			high_economy;
    int			low_economy;
    WEATHER_DATA *	weather; /* FB */
	GENERIC_MOB *	first_race;
	GENERIC_MOB *	last_race;
	int		nmob;		/* number of mobs in the area */
    CITY_DATA *		city;
};


/*
 * Used to keep track of system settings and statistics		-Thoric
 */
struct	system_data
{
    int         alias_wait;             /* Command wait on aliases */
    int		maxplayers;		/* Maximum players this boot   */
    int		alltimemax;		/* Maximum players ever	  */
    char *	time_of_max;		/* Time of max ever */
    char *	mud_name;		/* Name of mud */
    bool	NO_NAME_RESOLVING;	/* Hostnames are not resolved  */
    bool    	DENY_NEW_PLAYERS;	/* New players cannot connect  */
    sh_int	max_sn;			/* Max skills */
    int		save_flags;		/* Toggles for saving conditions */
    sh_int	save_frequency;		/* How old to autosave someone */
    sh_int save_pets;		/* Do pets save? */
    sh_int ident_retries;	/* Number of times to retry broken pipes. */
	bool	crashguard; /* Toggles crashguard on or off.. no core dumps with it on! -- Scion */
	int		morts_allowed; /* Number of characters allowed at once for multiplaying -- Scion */
	int     exp_base;
	int	quest;	/* mud wide quests -keo */
	char *	email; /* support email */
};



/* For blood trails mostly, but could be very useful later -- Scion */
struct trail_data {
	TRAIL_DATA *next;
	TRAIL_DATA *prev;

	char *name;
	NATION_DATA *race;
	bool blood;
	bool fly;
	char *graffiti;

	int from;
	int to;
	time_t age;
};

/*
 * Room type.
 */
struct	room_index_data
{
    ROOM_INDEX_DATA *	next;
    ROOM_INDEX_DATA *	next_sort;
    CHAR_DATA *		first_person;	    /* people in the room	*/
    CHAR_DATA *		last_person;	    /*		..		*/
    OBJ_DATA *		first_content;	    /* objects on floor		*/
    OBJ_DATA *		last_content;	    /*		..		*/
    EXTRA_DESCR_DATA *	first_extradesc;    /* extra descriptions	*/
    EXTRA_DESCR_DATA *	last_extradesc;	    /*		..		*/
    AREA_DATA *		area;
    EXIT_DATA *		first_exit;	    /* exits from the room	*/
    EXIT_DATA *		last_exit;	    /*		..		*/
    AFFECT_DATA *	first_affect;	    /* effects on the room	*/
    AFFECT_DATA *	last_affect;	    /*		..		*/
    TRAIL_DATA *	first_trail;	/* Remember who goes through the room -- Scion */
	TRAIL_DATA *	last_trail;
	MAP_DATA *		map;		    /* maps */
    MPROG_ACT_LIST *	mpact;		    /* mudprogs */
    int			mpactnum;	    /* mudprogs */
    MPROG_DATA *	mudprogs;	    /* mudprogs */
    sh_int		mpscriptpos;
    SHOP_DATA *		pShop;
    char *		name;
    char *		description;
    int			vnum;
    int			room_flags;
    EXT_BV		progtypes;           /* mudprogs */
    sh_int		sector_type;
    int			tele_vnum;
    sh_int		tele_delay;
    sh_int		runes;		     /* rune flags */
    sh_int		virtual;	     /* neccessary for bilvnums shogar */
	/* Advanced sector types -- Scion */
	int			vegetation;
	int			water;
	int			elevation;
	int			resources;
	int			curr_vegetation;
	int			curr_water;
	int			curr_elevation;
	int			curr_resources;
};


/*
 * 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_RACIAL		     3000  /* allows for 1000 herb types */
#define TYPE_DISEASE		     4000  /* allows for 1000 racial types */
#define TYPE_MAGIC		     5000  /* New magic system needs a special type -- Scion */
/*
 *  Target types.
 */
typedef enum
{
  TAR_IGNORE, TAR_CHAR_OFFENSIVE, TAR_CHAR_DEFENSIVE, TAR_CHAR_SELF,
  TAR_OBJ_INV
} target_types;

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



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



/*
 * Skills include spells as a particular case.
 */
struct	skill_type
{
    char *	name;			/* Name of skill		*/
    sh_int	skill_level[MAX_DEITY];	/* x Level needed by talent	*/
    sh_int	race_level[MAX_RACE];	/* Racial abilities: level      */
    SPELL_FUN *	spell_fun;		/* Spell pointer (for spells)	*/
    DO_FUN *	skill_fun;		/* Skill pointer (for skills)	*/
    sh_int	target;			/* Legal targets		*/
    sh_int	minimum_position;	/* Position for caster / user	*/
    sh_int	slot;			/* Slot for #OBJECT loading	*/
    sh_int	min_mana;		/* Minimum mana used		*/
    sh_int	beats;			/* Rounds required to use skill	*/
    char *	noun_damage;		/* Damage message		*/
    char *	msg_off;		/* Wear off message		*/
    sh_int	guild;			/* Which guild the skill belongs to */
    sh_int	min_level;		/* x Minimum level to be able to cast */
    sh_int	type;			/* Spell/Skill/Weapon/Tongue	*/
    sh_int	range;			/* Range of spell (rooms)	*/
    int		info;			/* x Spell action/class/etc	*/
    int		flags;			/* x Flags			*/
    char *	hit_char;		/* Success message to caster	*/
    char *	hit_vict;		/* Success message to victim	*/
    char *	hit_room;		/* Success message to room	*/
    char *	hit_dest;		/* Success message to dest room	*/
    char *	miss_char;		/* Failure message to caster	*/
    char *	miss_vict;		/* Failure message to victim	*/
    char *	miss_room;		/* Failure message to room	*/
    char *	die_char;		/* Victim death msg to caster	*/
    char *	die_vict;		/* Victim death msg to victim	*/
    char *	die_room;		/* Victim death msg to room	*/
    char *	imm_char;		/* Victim immune msg to caster	*/
    char *	imm_vict;		/* Victim immune msg to victim	*/
    char *	imm_room;		/* Victim immune msg to room	*/
    char *	dice;			/* Dice roll			*/
    int		value;			/* x Misc value			*/
    char	saves;			/* What saving spell applies	*/
    char	difficulty;		/* Difficulty of casting/learning */
    SMAUG_AFF *	affects;	/* Spell affects, if any	*/
    char *	components;		/* Spell components, if any	*/
    char *	teachers;		/* x Skill requires a special teacher */
    char	participants;	/* # of required participants	*/
    struct	timerset	userec;	/* Usage record			*/
	int	stat1;	/* First stat the skill cap depends on -- Scion */
	int stat2;	/* Second stat the skill cap depends on -- Scion */
	char *	talent;			/* Name of the talent this skill belongs to (spells only) */
};


/*
 * So we can have different configs for different ports -- Shaddai
 */
extern int port;

/*
 * These are skill_lookup return values for common skills and spells.
 */
extern	sh_int	gsn_detrap;
extern	sh_int	gsn_backstab;
extern  sh_int  gsn_circle;
extern	sh_int	gsn_dodge;
extern	sh_int	gsn_hide;
extern	sh_int	gsn_peek;
extern	sh_int	gsn_pick_lock;
extern	sh_int	gsn_locksmith;
extern  sh_int  gsn_scan;
extern	sh_int	gsn_sneak;
extern	sh_int	gsn_steal;
extern	sh_int	gsn_track;
extern  sh_int  gsn_throw;
extern	sh_int	gsn_search;
extern  sh_int  gsn_dig;
extern	sh_int	gsn_mount;
extern  sh_int  gsn_bashdoor;
extern	sh_int	gsn_berserk;

extern	sh_int	gsn_disarm;
extern	sh_int	gsn_parry;
extern	sh_int	gsn_rescue;

extern	sh_int	gsn_aid;

/* used to do specific lookups */
extern	sh_int	gsn_first_spell;
extern	sh_int	gsn_first_skill;
extern	sh_int	gsn_first_tongue;
extern	sh_int	gsn_top_sn;

/* auto spells -keo */
extern	sh_int	gsn_counterspell;

/* spells */
extern	sh_int	gsn_blindness;
extern	sh_int	gsn_charm_person;
extern  sh_int  gsn_weaken;
extern	sh_int	gsn_corruption;
extern	sh_int	gsn_curse;
extern	sh_int	gsn_poison;
extern	sh_int	gsn_sticky_flame;
extern	sh_int	gsn_sleep;
extern	sh_int	gsn_mummy_rot;
extern	sh_int	gsn_disease;

/* magic */
extern	sh_int	gsn_fire;
extern	sh_int	gsn_water;
extern	sh_int	gsn_mind;
extern	sh_int	gsn_wind;
extern	sh_int	gsn_earth;
extern	sh_int	gsn_seeking;
extern	sh_int	gsn_frost;
extern	sh_int	gsn_security;
extern	sh_int	gsn_motion;
extern	sh_int	gsn_lightning;
extern	sh_int	gsn_dream;
extern	sh_int	gsn_illusion;
extern	sh_int	gsn_death;

/* newer attack skills */
extern	sh_int	gsn_bash;
extern	sh_int	gsn_stun;

extern  sh_int  gsn_poison_weapon;
extern  sh_int  gsn_scribe;
extern  sh_int  gsn_brew;
extern	sh_int	gsn_climb;

extern  sh_int  gsn_grip;
extern	sh_int	gsn_swim;

extern  sh_int  gsn_tumble;

extern	sh_int	gsn_combine;
extern  sh_int  gsn_dye;
extern  sh_int  gsn_affix;
extern	sh_int	gsn_repair;
extern	sh_int	gsn_mix;


/*
 * Cmd flag names --Shaddai
 */
extern char *const cmd_flags[];
extern char *const permit_flags[];

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


/*
 * Old-style Bit manipulation macros
 *
 * The bit passed is the actual value of the bit (Use the BV## defines)
 */
#define IS_SET(flag, bit)	((flag) & (bit))
#define SET_BIT(var, bit)	((var) |= (bit))
#define REMOVE_BIT(var, bit)	((var) &= ~(bit))
#define TOGGLE_BIT(var, bit)	((var) ^= (bit))
#define CH(d)			((d)->original ? (d)->original : (d)->character)

/*
 * Macros for accessing virtually unlimited bitvectors.		-Thoric
 *
 * Note that these macros use the bit number rather than the bit value
 * itself -- which means that you can only access _one_ bit at a time
 *
 * This code uses an array of integers
 */

/*
 * The functions for these prototypes can be found in misc.c
 * They are up here because they are used by the macros below
 */
bool	ext_is_empty		args( ( EXT_BV *bits ) );
void	ext_clear_bits		args( ( EXT_BV *bits ) );
int	ext_has_bits		args( ( EXT_BV *var, EXT_BV *bits) );
bool	ext_same_bits		args( ( EXT_BV *var, EXT_BV *bits) );
void	ext_set_bits		args( ( EXT_BV *var, EXT_BV *bits) );
void	ext_remove_bits		args( ( EXT_BV *var, EXT_BV *bits) );
void	ext_toggle_bits		args( ( EXT_BV *var, EXT_BV *bits) );

/*
 * Here are the extended bitvector macros:
 */
#define xIS_SET(var, bit)	((var).bits[(bit) >> RSV] & 1 << ((bit) & XBM))
#define xSET_BIT(var, bit)	((var).bits[(bit) >> RSV] |= 1 << ((bit) & XBM))
#define xSET_BITS(var, bit)	(ext_set_bits(&(var), &(bit)))
#define xREMOVE_BIT(var, bit)	((var).bits[(bit) >> RSV] &= ~(1 << ((bit) & XBM)))
#define xREMOVE_BITS(var, bit)	(ext_remove_bits(&(var), &(bit)))
#define xTOGGLE_BIT(var, bit)	((var).bits[(bit) >> RSV] ^= 1 << ((bit) & XBM))
#define xTOGGLE_BITS(var, bit)	(ext_toggle_bits(&(var), &(bit)))
#define xCLEAR_BITS(var)	(ext_clear_bits(&(var)))
#define xIS_EMPTY(var)		(ext_is_empty(&(var)))
#define xHAS_BITS(var, bit)	(ext_has_bits(&(var), &(bit)))
#define xSAME_BITS(var, bit)	(ext_same_bits(&(var), &(bit)))

/*
 * Memory allocation macros.
 */

/* Added the +1 thing because we were going over our spending limit
   on memory -every- time CREATE got used. It was only by one, but once we
   got up over about 110 areas and started to have regular players, things
   were crashing us quite often. -- Scion */

#define CREATE(result, type, number)				\
do								\
{								\
    if (!((result) = (type *) calloc ((number), (sizeof(type)))))	\
    {								\
	perror("malloc failure.");\
	fprintf(stderr, "Malloc failure @ %s:%d\n", __FILE__, __LINE__ ); \
	abort();						\
    }								\
} while(0)

#define RECREATE(result,type,number)				\
do								\
{								\
    if (!((result) = (type *) realloc ((result), (sizeof(type)) * (number))))\
    {								\
	perror("realloc failure");				\
	fprintf(stderr, "Realloc failure @ %s:%d\n", __FILE__, __LINE__ ); \
	abort();						\
    }								\
} while(0)


#define DISPOSE(point) 						\
do								\
{								\
  if ((point))							\
    free(point);						\
  point = NULL;							\
} while(0)

#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)						\
do								\
{								\
    if ((point) && str_free((point))==-1) 			\
      fprintf( stderr, "STRFREEing bad pointer in %s, line %d\n", __FILE__, __LINE__ ); \
    point = NULL;							\
} 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)						\
do								\
{								\
  if ((point))							\
    free((point));						\
  point = NULL;							\
} while(0)
#endif

/* double-linked list handling macros -Thoric */
/* Updated by Scion 8/6/1999 */
/*
#define LINK(link, first, last, next, prev)                     \
do                                                              \
{                                                               \
    if ( !(first) ) {                                           \
      (first)                   = (link);                       \
      (last)					= (link);						\
    } else                                                      \
      (last)->next              = (link);                       \
    (link)->next                = NULL;                         \
    if (first == link)											\
      (link)->prev 				= NULL;							\
    else														\
      (link)->prev              = (last);                       \
    (last)                      = (link);                       \
} while(0)

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

#define UNLINK(link, first, last, next, prev)                   \
do                                                              \
{                                                               \
	if ( !(link)->prev ) {                                      \
      (first)                   = (link)->next;                 \
	  if ((first))												\
	  (first)->prev				= NULL;							\
	} else {                                                    \
      (link)->prev->next        = (link)->next;                 \
	}															\
	if ( !(link)->next ) {                                      \
      (last)                    = (link)->prev;                 \
	  if ((last))												\
	  (last)->next				= NULL;							\
	} else {                                                    \
      (link)->next->prev        = (link)->prev;                 \
	}															\
} while(0)
*/

/* double-linked list handling macros -Thoric */

#define LINK(link, first, last, next, prev)			\
do								\
{								\
    if ( !(first) )						\
      (first)			= (link);			\
    else							\
      (last)->next		= (link);			\
    (link)->next		= NULL;				\
    (link)->prev		= (last);			\
    (last)			= (link);			\
} while(0)

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

#define UNLINK(link, first, last, next, prev)			\
do								\
{								\
    if ( !(link)->prev )					\
      (first)			= (link)->next;			\
    else							\
      (link)->prev->next	= (link)->next;			\
    if ( !(link)->next )					\
      (last)			= (link)->prev;			\
    else							\
      (link)->next->prev	= (link)->prev;			\
} while(0)

#define CHECK_LINKS(first, last, next, prev, type)		\
do {								\
  type *ptr, *pptr = NULL;					\
  if ( !(first) && !(last) )					\
    break;							\
  if ( !(first) )						\
  {								\
    bug( "CHECK_LINKS: last with NULL first!  %s.",		\
        __STRING(first) );					\
    for ( ptr = (last); ptr->prev; ptr = ptr->prev );		\
    (first) = ptr;						\
  }								\
  else if ( !(last) )						\
  {								\
    bug( "CHECK_LINKS: first with NULL last!  %s.",		\
        __STRING(first) );					\
    for ( ptr = (first); ptr->next; ptr = ptr->next );		\
    (last) = ptr;						\
  }								\
  if ( (first) )						\
  {								\
    for ( ptr = (first); ptr; ptr = ptr->next )			\
    {								\
      if ( ptr->prev != pptr )					\
      {								\
        bug( "CHECK_LINKS(%s): %p:->prev != %p.  Fixing.",	\
            __STRING(first), ptr, pptr );			\
        ptr->prev = pptr;					\
      }								\
      if ( ptr->prev && ptr->prev->next != ptr )		\
      {								\
        bug( "CHECK_LINKS(%s): %p:->prev->next != %p.  Fixing.",\
            __STRING(first), ptr, ptr );			\
        ptr->prev->next = ptr;					\
      }								\
      pptr = ptr;						\
    }								\
    pptr = NULL;						\
  }								\
  if ( (last) )							\
  {								\
    for ( ptr = (last); ptr; ptr = ptr->prev )			\
    {								\
      if ( ptr->next != pptr )					\
      {								\
        bug( "CHECK_LINKS (%s): %p:->next != %p.  Fixing.",	\
            __STRING(first), ptr, pptr );			\
        ptr->next = pptr;					\
      }								\
      if ( ptr->next && ptr->next->prev != ptr )		\
      {								\
        bug( "CHECK_LINKS(%s): %p:->next->prev != %p.  Fixing.",\
            __STRING(first), ptr, ptr );			\
        ptr->next->prev = ptr;					\
      }								\
      pptr = ptr;						\
    }								\
  }								\
} while(0)


#define ASSIGN_GSN(gsn, skill)					\
do								\
{								\
    if ( ((gsn) = skill_lookup((skill))) == -1 )		\
	fprintf( stderr, "ASSIGN_GSN: Skill %s not found.\n",	\
		(skill) );					\
} while(0)

#define CHECK_SUBRESTRICTED(ch)					\
do								\
{								\
    if ( (ch)->substate == SUB_RESTRICTED )			\
    {								\
	send_to_char( "You cannot use this command from within another command.\n\r", ch );	\
	return;							\
    }								\
} while(0)


/*
 * Character macros.
 */
#define IS_NPC(ch)		(xIS_SET((ch)->act, ACT_IS_NPC) && !(ch)->pcdata)
#define IS_NEWBIE(ch)		((ch)->pcdata && ((ch)->played + \
					(current_time - (ch)->logon)) / 3600 < 10)
#define IS_WRITING(ch)          (((ch)->desc && (ch)->desc->connected) ? TRUE : FALSE)
#define IS_AFFECTED(ch, sn)	(xIS_SET((ch)->affected_by, (sn)) \
				|| (!IS_NPC(ch)	                  \
				&& xIS_SET((ch)->pcdata->perm_aff, (sn))))
#define TALENT(ch, tal)		(IS_NPC(ch) ? 0 : \
				(((ch)->curr_talent[(tal)]/3 \
				+ (ch)->talent[(tal)] \
				+ ch->mod_talent[(tal)]) * \
				(ch->pcdata->inborn == tal ? 2 : 1) \
				+ (ch->pcdata->magiclink ? \
				ch->pcdata->magiclink->talent[(tal)] \
				: 0)))
#define IS_FIGHTING(ch)		((ch)->last_hit && \
				(ch)->last_hit != (ch) && \
				(ch)->in_room == (ch)->last_hit->in_room)
#define IS_SAME_PLANE(ch, vch)	((IS_AFFECTED((ch), AFF_DREAMWORLD) ? \
				IS_AFFECTED((vch), AFF_DREAMWORLD) : \
				!IS_AFFECTED((vch), AFF_DREAMWORLD)) ? \
				(IS_AFFECTED((ch), AFF_VOID) ? \
				IS_AFFECTED((vch), AFF_VOID) : \
				!IS_AFFECTED((vch), AFF_VOID)) : \
				1==2)

#define CAN_SEE_PLANE(ch,vch)   ((IS_AFFECTED((ch), AFF_DREAMWORLD) || \
                                IS_AFFECTED((ch), AFF_VOID)) || \
                                (!IS_AFFECTED((vch), AFF_DREAMWORLD) && \
                                !IS_AFFECTED((vch), AFF_VOID)))

#define CAN_CAST(ch)		(1==1)

#define IS_VAMPIRE(ch)		(!IS_NPC(ch) && IS_SET(ch->pcdata->flags, PCFLAG_VAMPIRE))
#define IS_UNDEAD(ch)		(IS_AFFECTED(ch, AFF_UNDEAD))
#define IS_GARGOYLE(ch)

#define IS_CONSENTING(ch, victim) (!IS_NPC((ch)) && !IS_NPC((victim)) \
				&& (victim == ch \
				|| (IS_SET((victim)->pcdata->permissions, PERMIT_SECURITY) || \
				((ch)->pcdata->consenting \
				&& (ch)->pcdata->consenting == (victim)))))

#define IS_AWAKE(ch)		((ch)->position > POS_SLEEPING)
#define GET_AC(ch)		(UMAX(0, (ch)->armor))
#define GET_HITROLL(ch)		((ch)->hitroll + (int)(get_curr_per(ch)/3) \
				    + (2-(abs((ch)->mental_state)/10)))

/* Thanks to Chriss Baeke for noticing damplus was unused */
#define GET_DAMROLL(ch)		((ch)->damroll                              \
				    +(ch)->damplus			    \
				    +(int)(get_curr_str(ch)/3)	    \
				    +(((ch)->mental_state > 5		    \
				    &&(ch)->mental_state < 15) ? 1 : 0) )

#define IS_OUTSIDE(ch)		(!IS_SET(				    \
				    (ch)->in_room->room_flags,		    \
				    ROOM_INDOORS) && !IS_SET(               \
				    (ch)->in_room->room_flags,              \
				    ROOM_TUNNEL))

#define IS_UNDERWATER(ch)	((((ch)->in_room->sector_type == SECT_WATER_SWIM \
				|| (ch)->in_room->sector_type == SECT_WATER_NOSWIM \
				|| (ch)->in_room->sector_type == SECT_UNDERWATER) \
				&& !IS_AFFECTED((ch), AFF_FLYING)) \
				|| ((ch)->in_room->sector_type == SECT_OCEANFLOOR \
				|| (ch)->in_room->sector_type == SECT_LAVA))

#define NO_WEATHER_SECT(sect)  (  sect == SECT_INSIDE || 	           \
				  sect == SECT_UNDERWATER ||               \
                                  sect == SECT_OCEANFLOOR ||               \
                                  sect == SECT_UNDERGROUND )

#define IS_DRUNK(ch, drunk)     (number_percent() < \
			        ( (ch)->pcdata->condition[COND_DRUNK] \
				* 2 / (drunk) ) )

#define IS_DEVOTED(ch)		(!IS_NPC((ch))				    \
				&& (ch)->pcdata->deity)

#define IS_PKILL(ch)            (1==1)

#define CAN_PKILL(ch)           (1==1)

#define IS_SILENT(ch)		(!IS_NPC(ch) && (IS_AFFECTED(ch, AFF_SILENT) || \
				xIS_SET(ch->act, PLR_SILENCE) || \
				!can_use_bodypart(ch, BP_TONGUE) || \
				IS_SET(ch->in_room->room_flags, ROOM_SILENCE)))

#define WAIT_STATE(ch, npulse) ((ch)->wait=(UMAX((ch)->wait, (npulse - \
                        (int) TALENT((ch), TAL_TIME) / 50))))

#define EXIT(ch, door)		( get_exit( (ch)->in_room, door ) )

#define CAN_GO(ch, door)	(EXIT((ch),(door))			 \
				&& (EXIT((ch),(door))->to_room != NULL)  \
                          	&& !IS_SET(EXIT((ch), (door))->exit_info, EX_CLOSED))

#define IS_FLOATING(ch)		( IS_AFFECTED((ch), AFF_FLYING) || IS_AFFECTED((ch), AFF_FLOATING) )

#define IS_VALID_SN(sn)		( (sn) >=0 && (sn) < MAX_SKILL		     \
				&& skill_table[(sn)]			     \
				&& skill_table[(sn)]->name )

#define IS_VALID_HERB(sn)	( (sn) >=0 && (sn) < MAX_HERB		     \
				&& herb_table[(sn)]			     \
				&& herb_table[(sn)]->name )

#define IS_VALID_DISEASE(sn)	( (sn) >=0 && (sn) < MAX_DISEASE	     \
				&& disease_table[(sn)]			     \
				&& disease_table[(sn)]->name )

#define IS_PACIFIST(ch)		(IS_NPC(ch) && xIS_SET(ch->act, ACT_PACIFIST))

#define SPELL_FLAG(skill, flag)	( IS_SET((skill)->flags, (flag)) )
#define SPELL_DAMAGE(skill)	( ((skill)->info      ) & 7 )
#define SPELL_ACTION(skill)	( ((skill)->info >>  3) & 7 )
#define SPELL_CLASS(skill)	( ((skill)->info >>  6) & 7 )
#define SPELL_POWER(skill)	( ((skill)->info >>  9) & 3 )
#define SPELL_SAVE(skill)	( ((skill)->info >> 11) & 7 )
#define SET_SDAM(skill, val)	( (skill)->info =  ((skill)->info & SDAM_MASK) + ((val) & 7) )
#define SET_SACT(skill, val)	( (skill)->info =  ((skill)->info & SACT_MASK) + (((val) & 7) << 3) )
#define SET_SCLA(skill, val)	( (skill)->info =  ((skill)->info & SCLA_MASK) + (((val) & 7) << 6) )
#define SET_SPOW(skill, val)	( (skill)->info =  ((skill)->info & SPOW_MASK) + (((val) & 3) << 9) )
#define SET_SSAV(skill, val)	( (skill)->info =  ((skill)->info & SSAV_MASK) + (((val) & 7) << 11) )

/* RIS by gsn lookups. -- Altrag.
   Will need to add some || stuff for spells that need a special GSN. */

#define IS_FIRE(dt)		(IS_VALID_SN(dt) && \
				SPELL_DAMAGE(skill_table[(dt)]) == SD_FIRE)
#define IS_COLD(dt)		(IS_VALID_SN(dt) && \
				SPELL_DAMAGE(skill_table[(dt)]) == SD_COLD)
#define IS_ACID(dt)		( IS_VALID_SN(dt) &&			     \
				SPELL_DAMAGE(skill_table[(dt)]) == SD_ACID )
#define IS_ELECTRICITY(dt)	( IS_VALID_SN(dt) &&			     \
				SPELL_DAMAGE(skill_table[(dt)]) == SD_ELECTRICITY )
#define IS_ENERGY(dt)		( IS_VALID_SN(dt) &&			     \
				SPELL_DAMAGE(skill_table[(dt)]) == SD_ENERGY )

#define IS_DRAIN(dt)		( IS_VALID_SN(dt) &&			     \
				SPELL_DAMAGE(skill_table[(dt)]) == SD_DRAIN )

#define IS_POISON(dt)		( IS_VALID_SN(dt) &&			     \
				SPELL_DAMAGE(skill_table[(dt)]) == SD_POISON )

/*
 * Object macros.
 */
#define IS_OBJ_STAT(obj, stat)	(xIS_SET((obj)->extra_flags, (stat)))

/*
 * MudProg macros.						-Thoric
 */
#define HAS_PROG(what, prog)	((what) && xIS_SET((what)->progtypes,(prog)))

/*
 * Description macros.
 */
#define PERS(ch, looker)	( (ch)->name ? (can_see( (looker), (ch) ) ? \
( IS_NPC(ch) ? (xIS_SET((ch)->act, ACT_NAMED) ? \
(ch)->short_descr : aoran(themob(ch))) : \
TALENT((looker), TAL_SEEKING) >= TALENT((ch), TAL_ILLUSION) + TALENT((ch), TAL_CHANGE) ? (ch)->name : \
ch->pcdata->name_disguise ? ch->pcdata->name_disguise \
: (ch)->name) : "Someone") : "Nobody" )

#define log_string(txt)		( log_string_plus( (txt), LOG_NORMAL, 0 ))
#define dam_message(ch, victim, dam, dt, obj, part)	(new_dam_message((ch), (victim), (dam), (dt), (obj), (part)) )

/*
 * Structure for a command in the command lookup table.
 */
struct	cmd_type
{
    CMDTYPE *		next;
    char *		name;
    DO_FUN *		do_fun;
    int                 flags;  /* Added for Checking interpret stuff -Shaddai*/
    sh_int		position;
    sh_int		log;
    struct		timerset	userec;
    int			lag_count;	/* count lag flags for this cmd - FB */
    int			permit;		/* permission required */
};

struct alias_data
{
    ALIAS_DATA  *next;
    ALIAS_DATA  *prev;
    char        *name;
    char        *alias;
};

/*
 * Structure for a social in the socials table.
 */
struct	social_type
{
    SOCIALTYPE *	next;
    char *		name;
    char *		char_no_arg;
    char *		others_no_arg;
    char *		char_found;
    char *		others_found;
    char *		vict_found;
    char *		char_auto;
    char *		others_auto;
    char *		adj;
	int		flags;
};



/*
 * Global constants.
 */
extern  time_t last_restore_all_time;
extern  time_t boot_time;  /* this should be moved down */
extern  HOUR_MIN_SEC * set_boot_time;
extern  struct  tm *new_boot_time;
extern  time_t new_boot_time_t;

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	char *	const			part_locs	[];
extern	const	struct	liq_type	liq_table	[LIQ_MAX];
extern	char *	const			attack_table	[18];
extern	char *	const			part_cond_table [7]; /* Scion */
extern	char *	const			part_name_singular []; /* Scion */
extern	char *	const			magic_table [29];

extern  char ** const			s_message_table [20];
extern	char ** const			p_message_table	[20];

extern	char *	const	skill_tname	[];
extern	sh_int	const	movement_loss	[SECT_MAX];
extern	char *	const	dir_name	[];
extern  char *  const   rev_dir_name	[];
extern	char *	const	where_name	[];
extern	const	sh_int	rev_dir		[];
extern	const	int	trap_door	[];
extern	char *	const	r_flags		[];
extern	char *	const	w_flags		[];
extern	char *	const	o_flags		[];
extern	char *	const	a_flags		[];
extern	char *	const	o_types		[];
extern	char *	const	a_types		[];
extern	char *	const	bp_flags	[];
extern	char *	const	rune_flags	[];
extern	char *	const	act_flags	[];
extern	char *	const	plr_flags	[];
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	npc_race	[];
extern	char *	const	area_flags	[];
extern	char *	const	container_flags	[]; /* Tagith */
extern	char *	const	ex_pmisc	[];
extern	char *	const	ex_pwater	[];
extern	char *	const	ex_pair		[];
extern	char *	const	ex_pearth	[];
extern	char *	const	ex_pfire	[];

extern	char *	const	temp_settings	[]; /* FB */
extern	char *	const	precip_settings	[];
extern	char *	const	wind_settings	[];
extern	char *	const	mana_settings	[];
extern	char *	const	preciptemp_msg	[6][6];
extern	char *	const	windtemp_msg	[6][6];
extern	char *	const	manatemp_msg	[6][6];
extern	char *	const	precip_msg	[];
extern	char *	const	wind_msg	[];
extern	char *	const	moon_phase	[];
extern	char *	const	clearday_msg	[];
extern	char *	const	cloudyday_msg	[];
extern	char *	const	talent_name	[MAX_DEITY];
extern	char *	const	talent_rank	[MAX_DEITY][12];
extern	char *	const	lang_names	[];
extern	char *	const	weapon_bane	[];
extern	char *	const	weapon_brand	[];
extern	char *	const	pos_names	[];
extern	char *	const	song_name	[MAX_SONG];
extern	char *	const	weapon_skill	[];
extern	char *	const	noncombat_skill	[];

/*
 * Global variables.
 */
extern char *   bigregex;
extern char *   preg;

extern char *	target_name;
extern char *	ranged_target_name;
extern	int	numobjsloaded;
extern	int	nummobsloaded;
extern	int	physicalobjects;
extern	int	num_descriptors;
extern	struct	system_data		sysdata;
extern	int	top_sn;
extern	int	top_vroom;
extern	int	top_herb;
extern	AREA_DATA	*stockobj;

extern		CMDTYPE		  *	command_hash	[126];
NEW_HELP_DATA		*		help_hash		[126];

extern		SKILLTYPE	  *	skill_table	[MAX_SKILL];
extern		SOCIALTYPE	  *	social_index	[27];
extern		CHAR_DATA	  *	cur_char;
extern		ROOM_INDEX_DATA	  *	cur_room;
extern		bool			cur_char_died;
extern		ch_ret			global_retcode;
extern		SKILLTYPE	  *	herb_table	[MAX_HERB];
extern		SKILLTYPE	  *	disease_table	[MAX_DISEASE];

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

extern		HELP_DATA	  *	first_help;
extern		HELP_DATA	  *	last_help;
extern		SHOP_DATA	  *	first_shop;
extern		SHOP_DATA	  *	last_shop;
extern		BOOK_DATA     *   first_book;
extern		BOOK_DATA	  *   last_book;

extern		CLAN_DATA	* first_clan;
extern		CLAN_DATA	* last_clan;

extern		CHANNEL_DATA	* first_channel;
extern		CHANNEL_DATA	* last_channel;

extern		BIT_DATA	* first_abit;
extern		BIT_DATA	* last_abit;
extern		BIT_DATA	* first_qbit;
extern		BIT_DATA	* last_qbit;

extern		BAN_DATA	  *	first_ban;
extern		BAN_DATA	  *	last_ban;
extern		RESERVE_DATA	  *	first_reserved;
extern		RESERVE_DATA	  *	last_reserved;
extern		CHAR_DATA	  *	first_char;
extern		CHAR_DATA	  *	last_char;
extern		DESCRIPTOR_DATA   *	first_descriptor;
extern		DESCRIPTOR_DATA   *	last_descriptor;
extern		OBJ_DATA	  *	first_object;
extern		OBJ_DATA	  *	last_object;
extern		DEITY_DATA	  *	first_deity;
extern		DEITY_DATA	  *	last_deity;
extern		AREA_DATA	  *	first_area;
extern		AREA_DATA	  *	last_area;
extern		AREA_DATA	  *	first_build;
extern		AREA_DATA	  *	last_build;
extern		AREA_DATA	  *	first_asort;
extern		AREA_DATA	  *	last_asort;
extern		AREA_DATA	  *	first_bsort;
extern		AREA_DATA	  *	last_bsort;
extern          AREA_DATA         *     first_area_name; /*alphanum. sort*/
extern          AREA_DATA         *     last_area_name;  /* Fireblade */

extern		MATERIAL_DATA * first_material; /* Scion */
extern		MATERIAL_DATA * last_material; /* Scion */
extern		MAT_SHOP	*	first_matshop; /* keo */
extern		MAT_SHOP	*	last_matshop; /* keo */

extern		MOON_DATA	*	first_moon;
extern		MOON_DATA	*	last_moon;

extern		RECIPE_DATA	*	first_recipe;
extern		RECIPE_DATA	*	last_recipe;
extern		INGRED_DATA	*	first_ingred;
extern		INGRED_DATA	*	last_ingred;

extern		SPECIES_DATA	*	first_species;
extern		SPECIES_DATA	*	last_species;
extern		NATION_DATA	*	first_nation;
extern		NATION_DATA	*	last_nation;

extern		MUT_DATA	*	first_mutation;
extern		MUT_DATA	*	last_mutation;

extern		OBJ_DATA	  *	extracted_obj_queue;
extern		EXTRACT_CHAR_DATA *	extracted_char_queue;
extern		OBJ_DATA	  *	save_equipment[MAX_WEAR][MAX_LAYERS];
extern		CHAR_DATA	  *	quitting_char;
extern		CHAR_DATA	  *	loading_char;
extern		CHAR_DATA	  *	saving_char;
extern		OBJ_DATA	  *	all_obj;

extern		CITY_DATA	  *	first_city;
extern		CITY_DATA	  *	last_city;

extern		ARENA_DATA	  *	first_arena;
extern		ARENA_DATA	  *	last_arena;

extern		char			bug_buf		[];
extern		time_t			current_time;
extern		bool			fLogAll;
extern		FILE *			fpReserve;
extern		FILE *			fpLOG;
extern		char			log_buf		[];
extern		TIME_INFO_DATA		time_info;
extern		WEATHER_DATA		weather_info;
extern          IMMORTAL_HOST *         immortal_host_start;
extern          IMMORTAL_HOST *         immortal_host_end;
extern		int			weath_unit;
extern		int			rand_factor;
extern		int			climate_factor;
extern		int			neigh_factor;
extern		int			max_vector;

extern		struct act_prog_data *	mob_act_list;


/*
 * Command functions.
 * Defined in act_*.c (mostly).
 */
DECLARE_DO_FUN( skill_notfound	);
DECLARE_DO_FUN( do_aassign	);
DECLARE_DO_FUN( do_adopt	);
DECLARE_DO_FUN(	do_aentrance	);
DECLARE_DO_FUN(	do_aexit	);
DECLARE_DO_FUN( do_affected     );
DECLARE_DO_FUN( do_affix	);
DECLARE_DO_FUN( do_afk          );
DECLARE_DO_FUN(	do_aid		);
DECLARE_DO_FUN(	do_alias	);
DECLARE_DO_FUN( do_allow	);
DECLARE_DO_FUN( do_alter	);
DECLARE_DO_FUN( do_ansi		);
DECLARE_DO_FUN( do_antimatter	);
DECLARE_DO_FUN( do_apply	);
DECLARE_DO_FUN( do_archmages	);
DECLARE_DO_FUN(	do_areas	);
DECLARE_DO_FUN( do_arena	);
DECLARE_DO_FUN( do_aset		);
DECLARE_DO_FUN( do_astat	);
DECLARE_DO_FUN(	do_at		);
DECLARE_DO_FUN(	do_atmob	);
DECLARE_DO_FUN(	do_atobj	);
DECLARE_DO_FUN( do_attributes	);
DECLARE_DO_FUN( do_auto		);
DECLARE_DO_FUN( do_award	);
DECLARE_DO_FUN( do_balefire	);
DECLARE_DO_FUN(	do_bamfin	);
DECLARE_DO_FUN(	do_bamfout	);
DECLARE_DO_FUN(	do_ban		);
DECLARE_DO_FUN( do_bandage	);
DECLARE_DO_FUN(	do_bash		);
DECLARE_DO_FUN( do_bashdoor     );
DECLARE_DO_FUN( do_beep 	);
DECLARE_DO_FUN( do_berserk	);
DECLARE_DO_FUN( do_bestow	);
DECLARE_DO_FUN( do_bind		);
DECLARE_DO_FUN(	do_bio		);
DECLARE_DO_FUN(	do_bite		);
DECLARE_DO_FUN( do_blast	);
DECLARE_DO_FUN( do_blink	);
DECLARE_DO_FUN( do_blizzard	);
DECLARE_DO_FUN( do_bloodlet     );
DECLARE_DO_FUN( do_body		);
DECLARE_DO_FUN( do_bodybag	);
DECLARE_DO_FUN( do_boneset	);
DECLARE_DO_FUN( do_bookwrite	);
DECLARE_DO_FUN( do_bounty	);
DECLARE_DO_FUN( do_brainshock	);
DECLARE_DO_FUN(	do_brand	);
DECLARE_DO_FUN( do_brew 	);
DECLARE_DO_FUN( do_bset		);
DECLARE_DO_FUN( do_bstat	);
DECLARE_DO_FUN(	do_bug		);
DECLARE_DO_FUN( do_build	);
DECLARE_DO_FUN( do_burn		);
DECLARE_DO_FUN( do_bury		);
DECLARE_DO_FUN(	do_buy		);
DECLARE_DO_FUN(	do_cast		);
DECLARE_DO_FUN(	do_cedit	);
DECLARE_DO_FUN( do_chainlightning);
DECLARE_DO_FUN( do_change	);
DECLARE_DO_FUN(	do_channels	);
DECLARE_DO_FUN( do_chat		);
DECLARE_DO_FUN(	do_check_vnums  );
DECLARE_DO_FUN( do_chill	);
DECLARE_DO_FUN( do_chop		);
DECLARE_DO_FUN( do_city		);
DECLARE_DO_FUN( do_circle	);
DECLARE_DO_FUN( do_clan		); /* Scion */
DECLARE_DO_FUN(	do_claw		);
DECLARE_DO_FUN( do_climate	); /* FB */
DECLARE_DO_FUN(	do_climb	);
DECLARE_DO_FUN(	do_close	);
DECLARE_DO_FUN(	do_cmdtable	);
DECLARE_DO_FUN(	do_cmenu	);
DECLARE_DO_FUN( do_combine	);
DECLARE_DO_FUN(	do_commands	);
DECLARE_DO_FUN( do_compare	);
DECLARE_DO_FUN(	do_config	);
DECLARE_DO_FUN( do_connect	);
DECLARE_DO_FUN( do_consent	);
DECLARE_DO_FUN(	do_consider	);
DECLARE_DO_FUN( do_copyover	);
DECLARE_DO_FUN( do_cook		);
DECLARE_DO_FUN( do_credits	);
DECLARE_DO_FUN(	do_cset		);
DECLARE_DO_FUN( do_cure		);
DECLARE_DO_FUN( do_decay	);
DECLARE_DO_FUN( do_deduct	);
DECLARE_DO_FUN( do_deities	);
DECLARE_DO_FUN( do_delay	);
DECLARE_DO_FUN(	do_deny		);
DECLARE_DO_FUN( do_deposit	);
DECLARE_DO_FUN(	do_description	);
DECLARE_DO_FUN( do_destro       );
DECLARE_DO_FUN( do_destroy      );
DECLARE_DO_FUN( do_detonate	);
DECLARE_DO_FUN(	do_detrap	);
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_disown	);
DECLARE_DO_FUN( do_dispel	);
DECLARE_DO_FUN( do_distort	);
DECLARE_DO_FUN( do_divorce	);
DECLARE_DO_FUN(	do_dmesg	);
DECLARE_DO_FUN(	do_down		);
DECLARE_DO_FUN( do_drag 	);
DECLARE_DO_FUN( do_drain	);
DECLARE_DO_FUN( do_dream	);
DECLARE_DO_FUN(	do_drink	);
DECLARE_DO_FUN(	do_drop		);
DECLARE_DO_FUN(	do_diagnose	);
DECLARE_DO_FUN( do_dye		);
DECLARE_DO_FUN(	do_east		);
DECLARE_DO_FUN(	do_eat		);
DECLARE_DO_FUN(	do_echo		);
DECLARE_DO_FUN( do_elbow	);
DECLARE_DO_FUN( do_electrocute	);
DECLARE_DO_FUN( do_emerge	);
DECLARE_DO_FUN(	do_emote	);
DECLARE_DO_FUN(	do_empty	);
DECLARE_DO_FUN( do_enchant	);
DECLARE_DO_FUN( do_engrave	);
DECLARE_DO_FUN(	do_enter	);
DECLARE_DO_FUN(	do_equipment	);
DECLARE_DO_FUN(	do_examine	);
DECLARE_DO_FUN(	do_exits	);
DECLARE_DO_FUN( do_experience	);
DECLARE_DO_FUN( do_family	);
DECLARE_DO_FUN( do_fashion	);
DECLARE_DO_FUN(	do_feed		);
DECLARE_DO_FUN(	do_fill		);
DECLARE_DO_FUN(	do_fixchar	);
DECLARE_DO_FUN( do_flamingrain	);
DECLARE_DO_FUN( do_flare	);
DECLARE_DO_FUN(	do_flee		);
DECLARE_DO_FUN( do_flood	);
DECLARE_DO_FUN( do_fly		);
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_foreign	);
DECLARE_DO_FUN( do_fprompt	);
DECLARE_DO_FUN( do_fquit	);     /* Gorog */
DECLARE_DO_FUN( do_form_password);
DECLARE_DO_FUN(	do_freeze	);
DECLARE_DO_FUN( do_frostbite	);
DECLARE_DO_FUN( do_funnel	);
DECLARE_DO_FUN(	do_get		);
DECLARE_DO_FUN( do_genarea	);
DECLARE_DO_FUN( do_geyser	);
DECLARE_DO_FUN(	do_give		);
DECLARE_DO_FUN(	do_glance	);
DECLARE_DO_FUN( do_gold         );
DECLARE_DO_FUN(	do_goto		);
DECLARE_DO_FUN( do_graffiti );
DECLARE_DO_FUN(	do_group	);
DECLARE_DO_FUN(	do_grub 	);
DECLARE_DO_FUN(	do_gtell	);
DECLARE_DO_FUN( do_guard	);
DECLARE_DO_FUN( do_gwhere	);
DECLARE_DO_FUN( do_heal		);
DECLARE_DO_FUN( do_headbutt	);
DECLARE_DO_FUN( do_hell		);
DECLARE_DO_FUN(	do_hide		);
DECLARE_DO_FUN( do_hire		);
DECLARE_DO_FUN( do_hiscore	);
DECLARE_DO_FUN( do_hiscoset	);
DECLARE_DO_FUN( do_hit		);
DECLARE_DO_FUN( do_holyblast	);
DECLARE_DO_FUN(	do_holylight	);
DECLARE_DO_FUN( do_home	);
DECLARE_DO_FUN(	do_homepage	);
DECLARE_DO_FUN(	do_ide		);
DECLARE_DO_FUN(	do_idea		);
DECLARE_DO_FUN( do_identify	);
DECLARE_DO_FUN( do_immobilize	);
DECLARE_DO_FUN( do_induct	);
DECLARE_DO_FUN( do_info		);
DECLARE_DO_FUN( do_ingredient	);
DECLARE_DO_FUN( do_installarea	);
DECLARE_DO_FUN( do_instaroom	);
DECLARE_DO_FUN( do_instazone	);
DECLARE_DO_FUN( do_introduce	);
DECLARE_DO_FUN(	do_inventory	);
DECLARE_DO_FUN(	do_invis	);
DECLARE_DO_FUN(	do_kick		);
DECLARE_DO_FUN( do_knee		);
DECLARE_DO_FUN( do_kneel	);
DECLARE_DO_FUN( do_last		);
DECLARE_DO_FUN( do_laws		);
DECLARE_DO_FUN(	do_leave	);
DECLARE_DO_FUN(	do_light	);
DECLARE_DO_FUN( do_lightning	);
DECLARE_DO_FUN( do_link		);
DECLARE_DO_FUN(	do_list		);
DECLARE_DO_FUN(	do_litterbug	);
DECLARE_DO_FUN( do_land		);
DECLARE_DO_FUN( do_load		);
DECLARE_DO_FUN( do_loadarea	);
DECLARE_DO_FUN( do_loadup	);
DECLARE_DO_FUN(	do_lock		);
DECLARE_DO_FUN( do_locksmith );
DECLARE_DO_FUN(	do_log		);
DECLARE_DO_FUN(	do_look		);
DECLARE_DO_FUN(	do_low_purge	);
DECLARE_DO_FUN( do_lunge	);
DECLARE_DO_FUN( do_magic	);
DECLARE_DO_FUN( do_magma	);
DECLARE_DO_FUN( do_manastorm	);
DECLARE_DO_FUN( do_mailroom	);
DECLARE_DO_FUN( do_makedeity	);
DECLARE_DO_FUN( do_makeore	);
DECLARE_DO_FUN( do_makerooms	);
DECLARE_DO_FUN( do_makeshop	);
DECLARE_DO_FUN( do_marry	);
DECLARE_DO_FUN( do_massign	);
DECLARE_DO_FUN( do_material	);
DECLARE_DO_FUN( do_matshop	);
DECLARE_DO_FUN(	do_memory	);
DECLARE_DO_FUN( do_meteor	);
DECLARE_DO_FUN( do_mcreate	);
DECLARE_DO_FUN( do_mdelete	);
DECLARE_DO_FUN(	do_mfind	);
DECLARE_DO_FUN( do_mindflay	);
DECLARE_DO_FUN(	do_minvoke	);
DECLARE_DO_FUN( do_mix		);
DECLARE_DO_FUN( do_mlist	);
DECLARE_DO_FUN( do_moblog	);
DECLARE_DO_FUN( do_moon		);
DECLARE_DO_FUN( do_morph	);
DECLARE_DO_FUN( do_mount	);
DECLARE_DO_FUN( do_motd		);
DECLARE_DO_FUN(	do_mset		);
DECLARE_DO_FUN(	do_mstat	);
DECLARE_DO_FUN( do_mutation	);
DECLARE_DO_FUN(	do_mwhere	);
DECLARE_DO_FUN( do_namegen	);
DECLARE_DO_FUN( do_nation	);
DECLARE_DO_FUN( do_neighbors	);
DECLARE_DO_FUN( do_news         );
DECLARE_DO_FUN( do_new_help	);
DECLARE_DO_FUN( do_nightmare	);
DECLARE_DO_FUN( do_nochannel	);
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_nuisance	);
DECLARE_DO_FUN( do_oassign	);
DECLARE_DO_FUN( do_ocopy	); /* tag */
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_olist	);
DECLARE_DO_FUN( do_ooedit	); /* Tag */
DECLARE_DO_FUN( do_omedit	); /* Tag */
DECLARE_DO_FUN( do_oredit	); /* Tag */
DECLARE_DO_FUN(	do_open	);
DECLARE_DO_FUN( do_ooc_say	);
DECLARE_DO_FUN(	do_order	);
DECLARE_DO_FUN(	do_oset	);
DECLARE_DO_FUN( do_osearch  );
DECLARE_DO_FUN(	do_ostat	);
DECLARE_DO_FUN(	do_otransfer	);
DECLARE_DO_FUN( do_outcast	);
DECLARE_DO_FUN( do_outputprefix);
DECLARE_DO_FUN( do_outputsuffix);
DECLARE_DO_FUN(	do_owhere	);
DECLARE_DO_FUN( do_pacify	);
DECLARE_DO_FUN( do_pager	);
DECLARE_DO_FUN(	do_password	);
DECLARE_DO_FUN( do_plant	);
DECLARE_DO_FUN( do_player_echo	);
DECLARE_DO_FUN( do_pcrename	);
DECLARE_DO_FUN(	do_peace	);
DECLARE_DO_FUN( do_permit	);
DECLARE_DO_FUN(	do_pick		);
DECLARE_DO_FUN( do_piss		);
DECLARE_DO_FUN( do_pound	);
DECLARE_DO_FUN( do_poisoncloud	);
DECLARE_DO_FUN(	do_pose		);
DECLARE_DO_FUN(	do_practice	);
DECLARE_DO_FUN( do_preserve	);
DECLARE_DO_FUN( do_protect	); /* Scion */
DECLARE_DO_FUN( do_prompt	);
DECLARE_DO_FUN( do_pry		);
DECLARE_DO_FUN( do_pull		);
DECLARE_DO_FUN(	do_punch	);
DECLARE_DO_FUN(	do_purge	);
DECLARE_DO_FUN( do_purify	);
DECLARE_DO_FUN( do_push		);
DECLARE_DO_FUN(	do_put		);
DECLARE_DO_FUN( do_pyrokinetics	);
DECLARE_DO_FUN( do_abit		);
DECLARE_DO_FUN( do_qbit		);
DECLARE_DO_FUN(	do_quaff	);
DECLARE_DO_FUN( do_quake	);
DECLARE_DO_FUN(	do_qui		);
DECLARE_DO_FUN(	do_quit		);
DECLARE_DO_FUN( do_races	);
DECLARE_DO_FUN( do_radio	);
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_ready	);
DECLARE_DO_FUN(	do_rebirth	);
DECLARE_DO_FUN(	do_reboo	);
DECLARE_DO_FUN(	do_reboot	);
DECLARE_DO_FUN( do_recall	);
DECLARE_DO_FUN(	do_recho	);
DECLARE_DO_FUN( do_recipe	);
DECLARE_DO_FUN(	do_recite	);
DECLARE_DO_FUN(	do_redit	);
DECLARE_DO_FUN( do_regoto       );
DECLARE_DO_FUN( do_relax	);
DECLARE_DO_FUN(	do_remove	);
DECLARE_DO_FUN(	do_rent		);
DECLARE_DO_FUN(	do_repair	);
DECLARE_DO_FUN(	do_reply	);
DECLARE_DO_FUN(	do_report	);
DECLARE_DO_FUN(	do_rescue	);
DECLARE_DO_FUN( do_reserve	);
DECLARE_DO_FUN( do_reset	);
DECLARE_DO_FUN( do_reshape	);
DECLARE_DO_FUN(	do_rest		);
DECLARE_DO_FUN(	do_restore	);
DECLARE_DO_FUN(	do_restoretime	);
DECLARE_DO_FUN( do_resurrect	);
DECLARE_DO_FUN( do_retell	);
DECLARE_DO_FUN( do_retran       );
DECLARE_DO_FUN( do_retrieve	);
DECLARE_DO_FUN(	do_return	);
DECLARE_DO_FUN(	do_revert	);
DECLARE_DO_FUN( do_rgrub	);
DECLARE_DO_FUN( do_rip		);
DECLARE_DO_FUN( do_rfind	);
DECLARE_DO_FUN( do_rlist	);
DECLARE_DO_FUN( do_roleplay	);
DECLARE_DO_FUN( do_roll		);
DECLARE_DO_FUN( do_rreset	);
DECLARE_DO_FUN(	do_rset		);
DECLARE_DO_FUN(	do_rstat	);
DECLARE_DO_FUN( do_rune		);
DECLARE_DO_FUN(	do_sandstorm	);
DECLARE_DO_FUN(	do_save		);
DECLARE_DO_FUN(	do_saveall	);
DECLARE_DO_FUN( do_savearea	);
DECLARE_DO_FUN(	do_say		);
DECLARE_DO_FUN( do_scan         );
DECLARE_DO_FUN( do_scatter      );
DECLARE_DO_FUN(	do_score	);
DECLARE_DO_FUN( do_scribe       );
DECLARE_DO_FUN( do_search	);
DECLARE_DO_FUN(	do_sedit	);
DECLARE_DO_FUN( do_seek		);
DECLARE_DO_FUN(	do_sell		);
DECLARE_DO_FUN( do_set_boot_time);
DECLARE_DO_FUN( do_setdeity	);
DECLARE_DO_FUN( do_set_book	);
DECLARE_DO_FUN( do_set_help	);
DECLARE_DO_FUN( do_setweather	);
DECLARE_DO_FUN( do_sheathe	);
DECLARE_DO_FUN( do_shield	);
DECLARE_DO_FUN( do_shock	);
DECLARE_DO_FUN( do_shoot	);
DECLARE_DO_FUN(	do_shops	);
DECLARE_DO_FUN(	do_shopset	);
DECLARE_DO_FUN(	do_shopstat	);
DECLARE_DO_FUN( do_shove  	);
DECLARE_DO_FUN( do_showabit	);
DECLARE_DO_FUN( do_showqbit );
DECLARE_DO_FUN( do_setabit	);
DECLARE_DO_FUN( do_setqbit	);
DECLARE_DO_FUN( do_showdeity	);
DECLARE_DO_FUN( do_showweather	);	/* FB */
DECLARE_DO_FUN(	do_shutdow	);
DECLARE_DO_FUN(	do_shutdown	);
DECLARE_DO_FUN(	do_silence	);
DECLARE_DO_FUN( do_sing		);
DECLARE_DO_FUN(	do_sit		);
DECLARE_DO_FUN( do_skills	);
DECLARE_DO_FUN( do_skin		);
DECLARE_DO_FUN(	do_slap		);
DECLARE_DO_FUN( do_slash	);
DECLARE_DO_FUN(	do_slay		);
DECLARE_DO_FUN(	do_sleep	);
DECLARE_DO_FUN(	do_slookup	);
DECLARE_DO_FUN( do_smite	);
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_sonics	);
DECLARE_DO_FUN( do_soulfire	);
DECLARE_DO_FUN(	do_south	);
DECLARE_DO_FUN(	do_southeast	);
DECLARE_DO_FUN(	do_southwest	);
DECLARE_DO_FUN( do_squat	);
DECLARE_DO_FUN( do_species	);
DECLARE_DO_FUN( do_spike	);
DECLARE_DO_FUN( do_splash	);
DECLARE_DO_FUN(	do_split	);
DECLARE_DO_FUN(	do_sset		);
DECLARE_DO_FUN( do_stab		);
DECLARE_DO_FUN(	do_stand	);
DECLARE_DO_FUN( do_status	);
DECLARE_DO_FUN(	do_steal	);
DECLARE_DO_FUN( do_steam	);
DECLARE_DO_FUN(	do_sting	);
DECLARE_DO_FUN( do_storm	);
DECLARE_DO_FUN( do_story	);
DECLARE_DO_FUN( do_strew	);
DECLARE_DO_FUN( do_strip	);
DECLARE_DO_FUN( do_summon	);
DECLARE_DO_FUN( do_sunstroke	);
DECLARE_DO_FUN(	do_switch	);
DECLARE_DO_FUN( do_sworddance	);
DECLARE_DO_FUN(	do_showlayers	);
DECLARE_DO_FUN( do_suicide	);
DECLARE_DO_FUN( do_taint	);
DECLARE_DO_FUN( do_talent_advance);
DECLARE_DO_FUN( do_tap		);
DECLARE_DO_FUN(	do_tail		);
DECLARE_DO_FUN(	do_tamp		);
DECLARE_DO_FUN( do_telekinetics	);
DECLARE_DO_FUN(	do_tell		);
DECLARE_DO_FUN(	do_think	);
DECLARE_DO_FUN( do_throw	);
DECLARE_DO_FUN(	do_time		);
DECLARE_DO_FUN(	do_timecmd	);
DECLARE_DO_FUN(	do_title	);
DECLARE_DO_FUN( do_track	);
DECLARE_DO_FUN( do_tradein	);
DECLARE_DO_FUN( do_train	);
DECLARE_DO_FUN(	do_transfer	);
DECLARE_DO_FUN( do_travel	);
DECLARE_DO_FUN( do_turn		);
DECLARE_DO_FUN(	do_typo		);
DECLARE_DO_FUN(	do_unfoldarea	);
DECLARE_DO_FUN( do_unhell	);
DECLARE_DO_FUN( do_unholyblast	);
DECLARE_DO_FUN(	do_unlock	);
DECLARE_DO_FUN( do_unnuisance   );
DECLARE_DO_FUN( do_unsilence    );
DECLARE_DO_FUN(	do_up		);
DECLARE_DO_FUN(	do_users	);
DECLARE_DO_FUN(	do_value	);
DECLARE_DO_FUN( do_ventriloquate);
DECLARE_DO_FUN( do_vines	);
DECLARE_DO_FUN( do_vnums	);
DECLARE_DO_FUN( do_void		);
DECLARE_DO_FUN( do_vsearch	);
DECLARE_DO_FUN( do_wail		);
DECLARE_DO_FUN(	do_wake		);
DECLARE_DO_FUN( do_weapons	);
DECLARE_DO_FUN(	do_wear		);
DECLARE_DO_FUN(	do_weather	);
DECLARE_DO_FUN(	do_west		);
DECLARE_DO_FUN(	do_where	);
DECLARE_DO_FUN( do_whip		);
DECLARE_DO_FUN( do_whisper	);
DECLARE_DO_FUN(	do_who		);
DECLARE_DO_FUN(	do_whois	);
DECLARE_DO_FUN( do_wield	);
DECLARE_DO_FUN( do_wind		);
DECLARE_DO_FUN( do_withdraw	);
DECLARE_DO_FUN(	do_wizhelp	);
DECLARE_DO_FUN(	do_wizlock	);
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_log	);
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_mpaset );
DECLARE_DO_FUN( do_mpqset );
DECLARE_DO_FUN( do_mpadvance    );
DECLARE_DO_FUN( do_mpaddpoints	);
DECLARE_DO_FUN( do_mpasound     );
DECLARE_DO_FUN( do_mpasupress	);
DECLARE_DO_FUN( do_mpat         );
DECLARE_DO_FUN( do_mpdream	);
DECLARE_DO_FUN( do_mp_deposit	);
DECLARE_DO_FUN( do_mp_fill_in   );
DECLARE_DO_FUN( do_mp_withdraw	);
DECLARE_DO_FUN( do_mpecho       );
DECLARE_DO_FUN( do_mpechoaround );
DECLARE_DO_FUN( do_mpechoat     );
DECLARE_DO_FUN( do_mpechozone	);
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_mppeace	);
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_mpnuisance   );
DECLARE_DO_FUN( do_mpunnuisance );
DECLARE_DO_FUN( do_mpbodybag    );
DECLARE_DO_FUN( do_mpmakeore	);
DECLARE_DO_FUN( do_mpmakeitem );
DECLARE_DO_FUN( do_mpscatter    );
DECLARE_DO_FUN( do_mpdelay      );
DECLARE_DO_FUN( do_mpsellrand	);
DECLARE_DO_FUN( do_mpsetquest	);
DECLARE_DO_FUN( do_mpshowtalents);
DECLARE_DO_FUN( do_mpsound	);
DECLARE_DO_FUN( do_mpsoundaround);
DECLARE_DO_FUN( do_mpsoundat	);
DECLARE_DO_FUN( do_mpmusic	);
DECLARE_DO_FUN( do_mpmusicaround);
DECLARE_DO_FUN( do_mpmusicat	);

/*
 * Spell functions.
 * Defined in magic.c.
 */
DECLARE_SPELL_FUN(	spell_null		);
DECLARE_SPELL_FUN(	spell_notfound		);
DECLARE_SPELL_FUN(	spell_blindness		);
DECLARE_SPELL_FUN(	spell_cure_blindness	);
DECLARE_SPELL_FUN(	spell_cure_poison	);
DECLARE_SPELL_FUN(	spell_curse		);
DECLARE_SPELL_FUN(	spell_pigeon		);
DECLARE_SPELL_FUN(	spell_poison		);
DECLARE_SPELL_FUN(	spell_remove_curse	);
DECLARE_SPELL_FUN(	spell_sleep		);
DECLARE_SPELL_FUN(	spell_smaug		);
DECLARE_SPELL_FUN(      spell_portal            );


/*
 * OS-dependent declarations.
 * These are all very standard library functions,
 *   but some systems have incomplete or non-ansi header files.
 */
#if	defined(_AIX)
char *	crypt		args( ( const char *key, const char *salt ) );
#endif

#if	defined(apollo)
int	atoi		args( ( const char *string ) );
void *	calloc		args( ( unsigned nelem, size_t size ) );
char *	crypt		args( ( const char *key, const char *salt ) );
#endif

#if	defined(hpux)
char *	crypt		args( ( const char *key, const char *salt ) );
#endif

#if	defined(interactive)
#endif

#if	defined(linux)
char *	crypt		args( ( const char *key, const char *salt ) );
#endif

#if	defined(MIPS_OS)
char *	crypt		args( ( const char *key, const char *salt ) );
#endif

#if	defined(NeXT)
char *	crypt		args( ( const char *key, const char *salt ) );
#endif

#if	defined(sequent)
char *	crypt		args( ( const char *key, const char *salt ) );
int	fclose		args( ( FILE *stream ) );
int	fprintf		args( ( FILE *stream, const char *format, ... ) );
int	fread		args( ( void *ptr, int size, int n, FILE *stream ) );
int	fseek		args( ( FILE *stream, long offset, int ptrname ) );
void	perror		args( ( const char *s ) );
int	ungetc		args( ( int c, FILE *stream ) );
#endif

#if	defined(sun)
char *	crypt		args( ( const char *key, const char *salt ) );
int	fclose		args( ( FILE *stream ) );
int	fprintf		args( ( FILE *stream, const char *format, ... ) );
#if 	defined(SYSV)
size_t 	fread		args( ( void *ptr, size_t size, size_t n,
				FILE *stream ) );
#else
int	fread		args( ( void *ptr, int size, int n, FILE *stream ) );
#endif
int	fseek		args( ( FILE *stream, long offset, int ptrname ) );
void	perror		args( ( const char *s ) );
int	ungetc		args( ( int c, FILE *stream ) );
#endif

#if	defined(ultrix)
char *	crypt		args( ( const char *key, const char *salt ) );
#endif

/*
 * The crypt(3) function is 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 to keep passwords in plain text.
 */
#if	defined(NOCRYPT)
#define crypt(s1, s2)	(s1)
#endif



/*
 * Data files used by the server.
 *
 * AREA_LIST contains a list of areas to boot.
 * All files are read in completely at bootup.
 * Most output files (bug, idea, typo, shutdown) are append-only.
 *
 * The NULL_FILE is held open so that we have a stream handle in reserve,
 *   so players can go ahead and telnet to all the other descriptors.
 * Then we close it whenever we need to open a file (e.g. a save file).
 */
#define PLAYER_DIR	"../player/"	/* Player files			*/
#define BACKUP_DIR	"../backup/"    /* Backup Player files		*/
#define GOD_DIR		"../gods/"	/* God Info Dir			*/
#define DEITY_DIR	"../deity/"	/* Deity data dir		*/
#define BUILD_DIR       "../building/"  /* Online building save dir     */
#define SYSTEM_DIR	"../system/"	/* Main system files		*/
#define PROG_DIR	"mudprogs/"	/* MUDProg files		*/
#define CORPSE_DIR	"../corpses/"	/* Corpses			*/
#ifdef WIN32
  #define NULL_FILE	"nul"		/* To reserve one stream        */
#else
  #define NULL_FILE	"/dev/null"	/* To reserve one stream        */
#endif
#define CLAN_DIR	"../clans/" /* Clan files -- Scion */
#define AREA_LIST	"area.lst"	/* List of areas		*/
#define BAN_LIST        "ban.lst"       /* List of bans                 */
#define RESERVED_LIST	"reserved.lst"	/* List of reserved names	*/
#define GOD_LIST	"gods.lst"	/* List of gods			*/
#define DEITY_LIST	"deity.lst"	/* List of deities		*/
#define	RACE_LIST	"race.lst"	/* List of races		*/
#define CLAN_LIST	"clan.lst"  /* List of clans		*/

#define SHUTDOWN_FILE	"shutdown.txt"		/* For 'shutdown'	 */
#define OBJ_FILE		"objects.dat"	/* For storing objects across reboots */
#define MOB_FILE		"mobs.dat"		/* For storing mobs across reboots */

#define RIPSCREEN_FILE	SYSTEM_DIR "mudrip.rip"
#define BOOTLOG_FILE	SYSTEM_DIR "boot.txt"	  /* Boot up error file	 */
#define BUG_FILE	SYSTEM_DIR "bugs.txt"	  /* For bug( )          */
#define PBUG_FILE	SYSTEM_DIR "pbugs.txt"	  /* For 'bug' command   */
#define IDEA_FILE	SYSTEM_DIR "ideas.txt"	  /* For 'idea'		 */
#define TYPO_FILE	SYSTEM_DIR "typos.txt"	  /* For 'typo'		 */
#define RP_FILE		SYSTEM_DIR "rp.txt"	  /* For 'rp'            */
#define LOG_FILE	SYSTEM_DIR "log.txt"	  /* For talking in logged rooms */
#define MOBLOG_FILE	SYSTEM_DIR "moblog.txt"   /* For mplog messages  */
#define WIZLIST_FILE	SYSTEM_DIR "WIZLIST"	  /* Wizlist		 */
#define WHO_FILE	SYSTEM_DIR "WHO"	  /* Who output file	 */
#define WEBWHO_FILE	SYSTEM_DIR "WEBWHO"	  /* WWW Who output file */
#define REQUEST_PIPE	SYSTEM_DIR "REQUESTS"	  /* Request FIFO	 */
#define SKILL_FILE	SYSTEM_DIR "skills.dat"   /* Skill table	 */
#define HERB_FILE	SYSTEM_DIR "herbs.dat"	  /* Herb table		 */
#define TONGUE_FILE	SYSTEM_DIR "tongues.dat"  /* Tongue tables	 */
#define SOCIAL_FILE	SYSTEM_DIR "socials.dat"  /* Socials		 */
#define COMMAND_FILE	SYSTEM_DIR "commands.dat" /* Commands		 */
#define HELP_FILE		SYSTEM_DIR "help.dat"	/* Help Files		 */
#define USAGE_FILE	SYSTEM_DIR "usage.txt"    /* How many people are on
 						     every half hour - trying to
						     determine best reboot time */
#define ECONOMY_FILE	SYSTEM_DIR "economy.txt"  /* Gold looted, value of
						     used potions/pills  */
#define RACEDIR 	"../races/"
#define COPYOVER_FILE	SYSTEM_DIR "copyover.dat" /* for warm reboots	 */
#define EXE_FILE	"../src/rmexe"		  /* executable path	 */
#define MATERIAL_FILE SYSTEM_DIR "materials.dat" /* for materials - Scion */
#define MATSHOP_FILE	SYSTEM_DIR "matshops.dat"
#define MOON_FILE	SYSTEM_DIR "moons.dat" 	/* for moons -keo */
#define	RECIPE_FILE	SYSTEM_DIR "recipes.dat"
#define	INGRED_FILE	SYSTEM_DIR "ingreds.dat"
#define	SPECIES_FILE	SYSTEM_DIR "species.dat"
#define NATION_FILE	SYSTEM_DIR "nation.dat"
#define MUT_FILE	SYSTEM_DIR "mutations.dat"
#define CITY_FILE	SYSTEM_DIR "cities.dat"
#define CHANNEL_FILE	SYSTEM_DIR "channels.dat"
#define ARENA_FILE	SYSTEM_DIR "arenas.dat"
#define BOOK_FILE		SYSTEM_DIR "book.dat"

/*
 * Our function prototypes.
 * One big lump ... this is every function in Merc.
 */
#define CD	CHAR_DATA
#define MID	MOB_INDEX_DATA
#define OD	OBJ_DATA
#define OID	OBJ_INDEX_DATA
#define RID	ROOM_INDEX_DATA
#define SF	SPEC_FUN
#define EDD	EXTRA_DESCR_DATA
#define RD	RESET_DATA
#define ED	EXIT_DATA
#define	ST	SOCIALTYPE
#define DE	DEITY_DATA
#define SK	SKILLTYPE
#define PD	PART_DATA

/* act_comm.c */
bool	circle_follow	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void	add_follower	args( ( CHAR_DATA *ch, CHAR_DATA *master ) );
void	stop_follower	args( ( CHAR_DATA *ch ) );
void	die_follower	args( ( CHAR_DATA *ch ) );
bool	is_same_group	args( ( CHAR_DATA *ach, CHAR_DATA *bch ) );
void	send_rip_screen args( ( CHAR_DATA *ch ) );
void	to_channel	args( ( const char *argument, const char *verb, sh_int level ) );
char *	obj_short	args( ( OBJ_DATA *obj ) );
void    init_profanity_checker	args( ( void ) );
void	init_signals	args( ( void ) );
void	do_crashguard	args( ( void ) );
void	sig_handler	args( ( int sig ) );

/* act_info.c */
int	get_door	args( ( char *arg ) );
char *	format_obj_to_char	args( ( OBJ_DATA *obj, CHAR_DATA *ch,
				    bool fShort ) );
void	show_list_to_char	args( ( OBJ_DATA *list, CHAR_DATA *ch,
				    bool fShort, bool fShowNothing ) );
bool	is_ignoring	args( (CHAR_DATA *ch, CHAR_DATA *ign_ch) );
void	show_race_line	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );

/* act_move.c */
void	clear_vrooms	args( ( void ) );
ED *	find_door	args( ( CHAR_DATA *ch, char *arg, bool quiet ) );
ED *	get_exit	args( ( ROOM_INDEX_DATA *room, sh_int dir ) );
ED *	get_exit_to	args( ( ROOM_INDEX_DATA *room, sh_int dir, int vnum ) );
ED *	get_exit_num	args( ( ROOM_INDEX_DATA *room, sh_int count ) );
ch_ret	move_char	args( ( CHAR_DATA *ch, EXIT_DATA *pexit, int fall ) );
sh_int	encumbrance	args( ( CHAR_DATA *ch, sh_int move ) );
bool	will_fall	args( ( CHAR_DATA *ch, int fall ) );
ch_ret	pullcheck	args( ( CHAR_DATA *ch, int pulse ) );
char *	rev_exit	args( ( sh_int vdir ) );

/* act_obj.c */

obj_ret	damage_obj	args( ( OBJ_DATA *obj ) );
sh_int	get_obj_resistance args( ( OBJ_DATA *obj ) );
void    obj_fall  	args( ( OBJ_DATA *obj, bool through ) );

/* act_wiz.c */
RID *	find_location	args( ( CHAR_DATA *ch, char *arg ) );
void	echo_to_all	args( ( sh_int AT_COLOR, char *argument,
				sh_int tar ) );
void   	get_reboot_string args( ( void ) );
struct tm *update_time  args( ( struct tm *old_time ) );
void	free_social	args( ( SOCIALTYPE *social ) );
void	add_social	args( ( SOCIALTYPE *social ) );
void	free_command	args( ( CMDTYPE *command ) );
void	unlink_command	args( ( CMDTYPE *command ) );
void	add_command	args( ( CMDTYPE *command ) );

/* birth.c */
bool	check_rebirth	args((CHAR_DATA *ch, int i));

/* build.c */
int     get_cmdflag     args (( char *flag ));
char *	flag_string	args( ( int bitvector, char * const flagarray[] ) );
char *	ext_flag_string	args( ( EXT_BV *bitvector, char * const flagarray[] ) );
int	get_mpflag	args( ( char *flag ) );
int	get_dir		args( ( char *txt  ) );
char *	strip_cr	args( ( char *str  ) );
char *  strip_crn	args( ( char *str  ) );
char *  strip_crns	args( ( char *str  ) );

/* deity.c */
DE *	get_deity	args( ( char *name ) );
void	load_deity	args( ( void ) );
void	save_deity	args( ( DEITY_DATA *deity ) );

/* comm.c */
char *color_align( char *argument, int size, int align );
const char *const_color_align( const char *argument, int size, int align );
int color_str_len( char *argument );
int const_color_str_len( const char *argument );
int color_strnlen( char *argument, int maxlength );
int const_color_strnlen( const char *argument, int maxlength );
void	close_socket	args( ( DESCRIPTOR_DATA *dclose, bool force ) );
void	write_to_buffer	args( ( DESCRIPTOR_DATA *d, const char *txt,
				int length ) );
void	write_to_pager	args( ( DESCRIPTOR_DATA *d, const char *txt,
				int length ) );
void	send_to_char	args( ( const char *txt, CHAR_DATA *ch ) );
void	send_to_char_color	args( ( const char *txt, CHAR_DATA *ch ) );
void	send_to_pager	args( ( const char *txt, CHAR_DATA *ch ) );
void	send_to_pager_color	args( ( const char *txt, CHAR_DATA *ch ) );
void	set_char_color  args( ( sh_int AType, CHAR_DATA *ch ) );
void	set_pager_color	args( ( sh_int AType, CHAR_DATA *ch ) );
void	ch_printf	args( ( CHAR_DATA *ch, char *fmt, ... ) );
void	ch_printf_color	args( ( CHAR_DATA *ch, char *fmt, ... ) );
void	pager_printf	args( (CHAR_DATA *ch, char *fmt, ...) );
void	pager_printf_color	args( ( CHAR_DATA *ch, char *fmt, ... ) );
void	act		args( ( sh_int AType, const char *format, CHAR_DATA *ch,
			    const void *arg1, const void *arg2, int type ) );
void	log_printf	args( (char *fmt, ...) );
void	copyover_recover	args( (void) );

char *	myobj		args( ( OBJ_DATA *obj ) );
char *	themob		args( ( CHAR_DATA *mob ) );
char *	obj_short	args( ( OBJ_DATA *obj ) );

/* reset.c */
RD  *	make_reset	args( ( char letter, int extra, int arg1, int arg2, int arg3 ) );
RD  *	add_reset	args( ( AREA_DATA *tarea, char letter, int extra, int arg1, int arg2, int arg3 ) );
RD  *	place_reset	args( ( AREA_DATA *tarea, char letter, int extra, int arg1, int arg2, int arg3 ) );
void	reset_area	args( ( AREA_DATA * pArea ) );

/* db.c */
void	show_file	args( ( CHAR_DATA *ch, char *filename ) );
char *	str_dup		args( ( char const *str ) );
void	boot_db		args( ( void ) );
void	area_update	args( ( void ) );
void	add_char	args( ( CHAR_DATA *ch ) );
CD *	create_mobile	args( ( MOB_INDEX_DATA *pMobIndex ) );
OD *	create_object	args( ( OBJ_INDEX_DATA *pObjIndex, int level ) );
void	clear_char	args( ( CHAR_DATA *ch ) );
void	free_char	args( ( CHAR_DATA *ch ) );
char *	get_extra_descr	args( ( const char *name, EXTRA_DESCR_DATA *ed ) );
MID *	get_mob_index	args( ( int vnum ) );
OID *	get_obj_index	args( ( int vnum ) );
RID *	get_room_index	args( ( int vnum ) );
char	fread_letter	args( ( FILE *fp ) );
int	fread_number	args( ( FILE *fp ) );
EXT_BV  fread_bitvector	args( ( FILE *fp ) );
void	fwrite_bitvector args( ( EXT_BV *bits, FILE *fp ) );
char *	print_bitvector	args( ( EXT_BV *bits ) );
char *	fread_string	args( ( FILE *fp ) );
char *	fread_string_nohash args( ( FILE *fp ) );
void	fread_to_eol	args( ( FILE *fp ) );
char *	fread_word	args( ( FILE *fp ) );
char *	fread_line	args( ( FILE *fp ) );
int	number_fuzzy	args( ( int number ) );
int	number_range	args( ( int from, int to ) );
int	number_percent	args( ( void ) );
int	number_door	args( ( void ) );
int	number_bits	args( ( int width ) );
int	number_mm	args( ( void ) );
int	dice		args( ( int number, int size ) );
void	smash_tilde	args( ( char *str ) );
void	hide_tilde	args( ( char *str ) );
char *	show_tilde	args( ( char *str ) );
bool	str_cmp		args( ( const char *astr, const char *bstr ) );
bool	str_prefix	args( ( const char *astr, const char *bstr ) );
bool	str_infix	args( ( const char *astr, const char *bstr ) );
bool	str_suffix	args( ( const char *astr, const char *bstr ) );
char *	capitalize	args( ( const char *str ) );
char *	strlower	args( ( const char *str ) );
char *	strupper	args( ( const char *str ) );
char *  aoran		args( ( const char *str ) );
void	append_file	args( ( CHAR_DATA *ch, char *file, char *str ) );
void	append_to_file	args( ( char *file, char *str ) );
void	bug		args( ( const char *str, ... ) );
void	log_string_plus	args( ( const char *str, sh_int log_type, sh_int level ) );
RID *	make_room	args( ( int vnum ) );
OID *	make_object	args( ( int vnum, int cvnum, char *name ) );
MID *	make_mobile	args( ( int vnum, int cvnum, char *name ) );
ED  *	make_exit	args( ( ROOM_INDEX_DATA *pRoomIndex, ROOM_INDEX_DATA *to_room, sh_int door ) );
void	add_help	args( ( HELP_DATA *pHelp ) );
void	fix_area_exits	args( ( AREA_DATA *tarea ) );
void	load_area_file	args( ( AREA_DATA *tarea, char *filename ) );
void	randomize_exits	args( ( ROOM_INDEX_DATA *room, sh_int maxdir ) );
void	make_wizlist	args( ( void ) );
void	tail_chain	args( ( void ) );
bool    delete_room     args( ( ROOM_INDEX_DATA *room ) );
bool    delete_obj      args( ( OBJ_INDEX_DATA *obj ) );
bool    delete_mob      args( ( MOB_INDEX_DATA *mob ) );
/* Functions to add to sorting lists. -- Altrag */
/*void	mob_sort	args( ( MOB_INDEX_DATA *pMob ) );
void	obj_sort	args( ( OBJ_INDEX_DATA *pObj ) );
void	room_sort	args( ( ROOM_INDEX_DATA *pRoom ) );*/
void	sort_area	args( ( AREA_DATA *pArea, bool proto ) );
void    sort_area_by_name  args( (AREA_DATA *pArea) ); /* Fireblade */

/* build.c */
void	start_editing	args( ( CHAR_DATA *ch, char *data ) );
void	stop_editing	args( ( CHAR_DATA *ch ) );
void	edit_buffer	args( ( CHAR_DATA *ch, char *argument ) );
char *	copy_buffer	args( ( CHAR_DATA *ch ) );
bool	can_rmodify	args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *room ) );
bool	can_omodify	args( ( CHAR_DATA *ch, OBJ_DATA *obj  ) );
bool	can_mmodify	args( ( CHAR_DATA *ch, CHAR_DATA *mob ) );
bool	can_medit	args( ( CHAR_DATA *ch, MOB_INDEX_DATA *mob ) );
void	free_reset	args( ( AREA_DATA *are, RESET_DATA *res ) );
void	free_area	args( ( AREA_DATA *are ) );
void	assign_area	args( ( CHAR_DATA *ch ) );
EDD *	SetRExtra	args( ( ROOM_INDEX_DATA *room, char *keywords ) );
bool	DelRExtra	args( ( ROOM_INDEX_DATA *room, char *keywords ) );
EDD *	SetOExtra	args( ( OBJ_DATA *obj, char *keywords ) );
bool	DelOExtra	args( ( OBJ_DATA *obj, char *keywords ) );
EDD *	SetOExtraProto	args( ( OBJ_INDEX_DATA *obj, char *keywords ) );
bool	DelOExtraProto	args( ( OBJ_INDEX_DATA *obj, char *keywords ) );
void	fold_area	args( ( AREA_DATA *tarea, char *filename, bool install ) );
int	get_otype	args( ( char *type ) );
int	get_atype	args( ( char *type ) );
int	get_aflag	args( ( char *flag ) );
int	get_oflag	args( ( char *flag ) );
int	get_wflag	args( ( char *flag ) );
void	init_area_weather args(( void ) );
void	save_weatherdata args( ( void ) );

/* bodyparts.c */
void	hurt_part	args( ( CHAR_DATA *ch, PART_DATA *part, int dam ));
void	check_bodyparts	args( ( CHAR_DATA *ch ) );
PD *	find_bodypart	args( ( CHAR_DATA *ch, int loc ) );
bool	has_bodypart	args( ( CHAR_DATA *ch, int loc ) );
bool	can_use_bodypart args(( CHAR_DATA *ch, int loc ) );
OD *	outer_layer	args( ( PART_DATA *part ) );
char *	hands		args( ( CHAR_DATA *ch ) );
int	find_part_name	args( ( char *argument ) );
void	show_equip	args( ( CHAR_DATA *ch, CHAR_DATA *to ) );
void	obj_affect_ch	args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
void	obj_unaffect_ch	args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
bool    equip_char      args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
void    unequip_char    args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
void	break_part	args( ( CHAR_DATA *ch, PART_DATA *part ) );

/* combat.c */
void	die		args( ( CHAR_DATA *ch ) );
void	uncon		args( ( CHAR_DATA *ch ) );
void    gain_exp        args( ( CHAR_DATA *ch, int gain ) );
bool	lose_hp		args( ( CHAR_DATA *ch, int amt ) );
bool	lose_ep		args( ( CHAR_DATA *ch, int amt ) );
void	check_hit	args( ( CHAR_DATA *ch, CHAR_DATA *victim, int part, int dam, int type));
void	mob_attack	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
OD *	get_weapon	args( ( CHAR_DATA *ch, int skill) );
bool	direct_damage	args( ( CHAR_DATA *ch, int amt) );
void	pain		args( ( CHAR_DATA *ch, int dam) );
void    stop_fighting	args( ( CHAR_DATA *ch, bool fBoth) );

/* fight.c */
int	max_fight	args( ( CHAR_DATA *ch ) );
void	violence_update	args( ( void ) );
ch_ret	multi_hit	args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) );
ch_ret	projectile_hit	args( ( CHAR_DATA *ch, CHAR_DATA *victim, OBJ_DATA *wield,
			    OBJ_DATA *projectile, sh_int dist ) );
sh_int	ris_damage	args( ( CHAR_DATA *ch, sh_int dam, int ris ) );
ch_ret	damage		args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam,
			    int dt ) );
void	update_pos	args( ( CHAR_DATA *victim ) );
void	death_cry	args( ( CHAR_DATA *ch ) );
void	stop_hunting	args( ( CHAR_DATA *ch ) );
void	stop_hating	args( ( CHAR_DATA *ch ) );
void	stop_fearing	args( ( CHAR_DATA *ch ) );
void	start_hunting	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void	start_hating	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void	start_fearing	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	is_hunting	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	is_hating	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	is_fearing	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	is_safe		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	legal_loot	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
sh_int	VAMP_AC		args( ( CHAR_DATA *ch ) );
bool    check_illegal_pk args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void    raw_kill        args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	can_astral	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );

/* makeobjs.c */
CD *	generate_mob_nation	args( ( char *argument ) );
CD *	generate_mob	args( ( NATION_DATA *nation ) );
void	mob_to_area	args( ( CHAR_DATA *mob, AREA_DATA *tarea ) );
void	make_corpse	args( ( CHAR_DATA *ch ) );
void	make_blood	args( ( CHAR_DATA *ch, int amt ) );
void	make_bloodstain args( ( CHAR_DATA *ch ) );
void	make_scraps	args( ( OBJ_DATA *obj ) );
void	make_fire	args( ( ROOM_INDEX_DATA *in_room, sh_int timer) );
OD *	make_trap	args( ( int v0, int v1, int v2, int v3 ) );
OD *	create_money	args( ( int amount ) );

/* misc.c */
void actiondesc args( ( CHAR_DATA *ch, OBJ_DATA *obj, void *vo ) );
EXT_BV	meb		args( ( int bit ) );
EXT_BV	multimeb	args( ( int bit, ... ) );

/* mud_comm.c */
char *	mprog_type_to_name	args( ( int type ) );

/* mud_prog.c */
#ifdef DUNNO_STRSTR
char *  strstr                  args ( (const char *s1, const char *s2 ) );
#endif

void	mprog_wordlist_check    args ( ( char * arg, CHAR_DATA *mob,
                			CHAR_DATA* actor, OBJ_DATA* object,
					void* vo, int type ) );
void	mprog_percent_check     args ( ( CHAR_DATA *mob, CHAR_DATA* actor,
					OBJ_DATA* object, void* vo,
					int type ) );
void	mprog_act_trigger       args ( ( char* buf, CHAR_DATA* mob,
		                        CHAR_DATA* ch, OBJ_DATA* obj,
					void* vo ) );
void	mprog_bribe_trigger     args ( ( CHAR_DATA* mob, CHAR_DATA* ch,
		                        int amount ) );
void	mprog_entry_trigger     args ( ( CHAR_DATA* mob ) );
void	mprog_give_trigger      args ( ( CHAR_DATA* mob, CHAR_DATA* ch,
                		        OBJ_DATA* obj ) );
void	mprog_greet_trigger     args ( ( CHAR_DATA* mob ) );
void    mprog_fight_trigger     args ( ( CHAR_DATA* mob, CHAR_DATA* ch ) );
void    mprog_hitprcnt_trigger  args ( ( CHAR_DATA* mob, CHAR_DATA* ch ) );
void    mprog_death_trigger     args ( ( CHAR_DATA *killer, CHAR_DATA* mob ) );
void    mprog_random_trigger    args ( ( CHAR_DATA* mob ) );
void    mprog_speech_trigger    args ( ( char* txt, CHAR_DATA* mob ) );
void    mprog_script_trigger    args ( ( CHAR_DATA *mob ) );
void    mprog_hour_trigger      args ( ( CHAR_DATA *mob ) );
void    mprog_time_trigger      args ( ( CHAR_DATA *mob ) );
void    progbug                 args( ( char *str, CHAR_DATA *mob ) );
void	rset_supermob		args( ( ROOM_INDEX_DATA *room) );
void	release_supermob	args( ( ) );

/* player.c */
void	set_title	args( ( CHAR_DATA *ch, char *title ) );
bool	add_mutation	args( ( CHAR_DATA *ch, int i ) );
int	get_height_weight	args((CHAR_DATA *ch) );

/* skills.c */
int		learned			args((CHAR_DATA *ch, int sn));
bool	skill_available	args((CHAR_DATA *ch, int sn));
int		get_best_talent	args((CHAR_DATA *ch, int sn));
int		get_adept		args((CHAR_DATA *ch, int sn));
bool    can_use_skill           args( ( CHAR_DATA *ch, int percent, int gsn));
bool	check_skill		args( ( CHAR_DATA *ch, char *command, char *argument ) );
void	learn_from_success	args( ( CHAR_DATA *ch, int sn ) );
void	learn_from_failure	args( ( CHAR_DATA *ch, int sn ) );
bool	check_shieldwork	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	check_parry		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	check_dodge		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool    check_tumble            args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool 	check_grip		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void	disarm			args( ( CHAR_DATA *ch, CHAR_DATA *victim) );
void	trip			args( ( CHAR_DATA *ch, CHAR_DATA *victim) );
bool	mob_fire		args( ( CHAR_DATA *ch, char *name ) );
CD *	scan_for_victim		args( ( CHAR_DATA *ch, EXIT_DATA *pexit,
					 char *name ) );

/* ban.c */
int add_ban args( ( CHAR_DATA *ch, char *arg1, int time ) );
void show_bans args ( ( CHAR_DATA *ch ) );
void save_banlist args ( ( void ) );
void load_banlist args ( ( void ) );
bool check_total_bans args ( ( DESCRIPTOR_DATA *d ) );
bool check_bans args ( ( CHAR_DATA *ch ) );
bool check_multi args ( ( CHAR_DATA *ch ) );

/* handler.c */
void	huh		args( ( CHAR_DATA *ch ) );
DEITY_DATA *get_talent_by_index( int index ); /* Scion */
int get_char_worth args((CHAR_DATA *ch)); /* Scion */
int get_light_char args((CHAR_DATA *ch)); /* Scion */
int get_light_room args((ROOM_INDEX_DATA *room)); /* Scion */
int	get_exp		args( ( CHAR_DATA *ch ) );
int	get_exp_worth	args( ( CHAR_DATA *ch ) );
int	exp_level	args( ( CHAR_DATA *ch, sh_int level ) );
int	talent_exp	args( ( CHAR_DATA *ch, sh_int level, int tal ) );
int level_exp	args( ( CHAR_DATA *ch, int exp	) );
sh_int	get_trust	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_str	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_int	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_wis	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_wil	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_dex	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_con	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_cha	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_per	args( ( CHAR_DATA *ch ) );
sh_int  get_curr_lck	args( ( CHAR_DATA *ch ) );
sh_int	get_curr_end	args( ( CHAR_DATA *ch ) );
bool	can_take_proto	args( ( CHAR_DATA *ch ) );
int	can_carry_n	args( ( CHAR_DATA *ch ) );
int	can_carry_w	args( ( CHAR_DATA *ch ) );
bool	is_name		args( ( const char *str, char *namelist ) );
bool	is_name_prefix	args( ( const char *str, char *namelist ) );
bool	nifty_is_name	args( ( char *str, char *namelist ) );
bool	nifty_is_name_prefix args( ( char *str, char *namelist ) );
void	affect_modify	args( ( CHAR_DATA *ch, AFFECT_DATA *paf, bool fAdd ) );
void	affect_to_char	args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void	affect_remove	args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void	affect_strip	args( ( CHAR_DATA *ch, int sn ) );
bool	is_affected	args( ( CHAR_DATA *ch, int sn ) );
void	affect_join	args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void	obj_affect_join(OBJ_DATA *obj, AFFECT_DATA *paf); /* Scion */
void	char_from_room	args( ( CHAR_DATA *ch ) );
void	char_to_room	args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex ) );
OD *	obj_to_char	args( ( OBJ_DATA *obj, CHAR_DATA *ch ) );
void	obj_from_char	args( ( OBJ_DATA *obj ) );
int	apply_ac	args( ( OBJ_DATA *obj, int iWear ) );
OD *	get_eq_char	args( ( CHAR_DATA *ch, int iWear ) );
int	count_obj_list	args( ( OBJ_INDEX_DATA *obj, OBJ_DATA *list ) );
void	obj_from_room	args( ( OBJ_DATA *obj ) );
OD *	obj_to_room	args( ( OBJ_DATA *obj, ROOM_INDEX_DATA *pRoomIndex ) );
OD *	obj_to_obj	args( ( OBJ_DATA *obj, OBJ_DATA *obj_to ) );
void	obj_from_obj	args( ( OBJ_DATA *obj ) );
void	extract_obj	args( ( OBJ_DATA *obj ) );
void	extract_exit	args( ( ROOM_INDEX_DATA *room, EXIT_DATA *pexit ) );
void	extract_room	args( ( ROOM_INDEX_DATA *room ) );
void	clean_room	args( ( ROOM_INDEX_DATA *room ) );
void	clean_obj	args( ( OBJ_INDEX_DATA *obj ) );
void	clean_mob	args( ( MOB_INDEX_DATA *mob ) );
void	clean_resets	args( ( AREA_DATA *tarea ) );
void	extract_char	args( ( CHAR_DATA *ch, bool fPull ) );
char *  fur_pos_string	args( ( int pos ) );		/* furniture */
char * pos_string       args( (CHAR_DATA *victim) );    /* furniture */
int	count_users	args( ( OBJ_DATA *obj ) );      /* furniture */
CD *	get_char_room	args( ( CHAR_DATA *ch, char *argument ) );
CD *	get_char_world	args( ( CHAR_DATA *ch, char *argument ) );
OD *	get_obj_type	args( ( OBJ_INDEX_DATA *pObjIndexData ) );
OD *	get_obj_list	args( ( CHAR_DATA *ch, char *argument,
			    OBJ_DATA *list ) );
OD *	get_obj_list_rev args( ( CHAR_DATA *ch, char *argument,
			    OBJ_DATA *list ) );
OD *	get_obj_carry	args( ( CHAR_DATA *ch, char *argument ) );
OD *	get_obj_wear	args( ( CHAR_DATA *ch, char *argument ) );
OD *    get_obj_vnum    args( ( CHAR_DATA *ch, int vnum ) );
OD *	get_obj_here	args( ( CHAR_DATA *ch, char *argument ) );
OD *	get_obj_world	args( ( CHAR_DATA *ch, char *argument ) );
int	get_obj_number	args( ( OBJ_DATA *obj ) );
int	get_obj_weight	args( ( OBJ_DATA *obj ) );
int	get_real_obj_weight args( ( OBJ_DATA *obj ) );
bool	room_is_dark	args( ( ROOM_INDEX_DATA *pRoomIndex ) );
bool	room_is_private	args( ( ROOM_INDEX_DATA *pRoomIndex ) );
bool	can_see		args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
bool	can_see_obj	args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
bool	can_drop_obj	args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
char *	item_type_name	args( ( OBJ_DATA *obj ) );
char *	affect_loc_name	args( ( int location ) );
char *	affect_bit_name	args( ( EXT_BV *vector ) );
char *	extra_bit_name	args( ( EXT_BV *extra_flags ) );
char *  pull_type_name	args( ( int pulltype ) );
ch_ret	check_for_trap	args( ( CHAR_DATA *ch, OBJ_DATA *obj, int flag ) );
ch_ret	check_room_for_traps args( ( CHAR_DATA *ch, int flag ) );
bool	is_trapped	args( ( OBJ_DATA *obj ) );
OD *	get_trap	args( ( OBJ_DATA *obj ) );
ch_ret	spring_trap     args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
void	throw_rider	args( ( CHAR_DATA *ch) );
void	dump_passenger	args( (OBJ_DATA *obj) );
void	dump_container	args( (OBJ_DATA *obj) );
void	fix_char	args( ( CHAR_DATA *ch ) );
void	showaffect	args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void	set_cur_obj	args( ( OBJ_DATA *obj ) );
bool	obj_extracted	args( ( OBJ_DATA *obj ) );
void	queue_extracted_obj	args( ( OBJ_DATA *obj ) );
void	clean_obj_queue	args( ( void ) );
void	set_cur_char	args( ( CHAR_DATA *ch ) );
bool	char_died	args( ( CHAR_DATA *ch ) );
void	queue_extracted_char	args( ( CHAR_DATA *ch, bool extract ) );
void	clean_char_queue	args( ( void ) );
void	add_timer	args( ( CHAR_DATA *ch, sh_int type, sh_int count, DO_FUN *fun, int value ) );
TIMER * get_timerptr	args( ( CHAR_DATA *ch, sh_int type ) );
sh_int	get_timer	args( ( CHAR_DATA *ch, sh_int type ) );
void	extract_timer	args( ( CHAR_DATA *ch, TIMER *timer ) );
void	remove_timer	args( ( CHAR_DATA *ch, sh_int type ) );
bool	in_hard_range	args( ( CHAR_DATA *ch, AREA_DATA *tarea ) );
bool	chance  	args( ( CHAR_DATA *ch, sh_int percent ) );
bool 	chance_attrib	args( ( CHAR_DATA *ch, sh_int percent, sh_int attrib ) );
OD *	clone_object	args( ( OBJ_DATA *obj ) );
void	split_obj	args( ( OBJ_DATA *obj, int num ) );
void	separate_obj	args( ( OBJ_DATA *obj ) );
bool	empty_obj	args( ( OBJ_DATA *obj, OBJ_DATA *destobj,
				ROOM_INDEX_DATA *destroom ) );
OD *	find_obj	args( ( CHAR_DATA *ch, char *argument,
				bool carryonly ) );
bool	ms_find_obj	args( ( CHAR_DATA *ch ) );
void	worsen_mental_state args( ( CHAR_DATA *ch, int mod ) );
void	better_mental_state args( ( CHAR_DATA *ch, int mod ) );
void	boost_economy	args( ( AREA_DATA *tarea, int gold ) );
void	lower_economy	args( ( AREA_DATA *tarea, int gold ) );
void	economize_mobgold args( ( CHAR_DATA *mob ) );
bool	economy_has	args( ( AREA_DATA *tarea, int gold ) );
void	add_kill	args( ( CHAR_DATA *ch, CHAR_DATA *mob ) );
int	times_killed	args( ( CHAR_DATA *ch, CHAR_DATA *mob ) );
void	update_aris	args( ( CHAR_DATA *ch) );
AREA_DATA *get_area	args( ( char *name ) ); /* FB */
OD *	get_objtype	args( ( CHAR_DATA *ch, sh_int type ) );
void	learn_weapon	args( (CHAR_DATA *ch, int i) );
void	learn_noncombat	args( (CHAR_DATA *ch, int i) );
NATION_DATA *find_nation args( (char *name) );

/* hiscore.c */
void adjust_hiscore	args( (char *argument, CHAR_DATA *ch, int i) );
bool add_hiscore	args( (char *keyword, char *name, int score) );
void load_hiscores	args( ( void ) );

/* interp.c */
bool	check_pos	args( ( CHAR_DATA *ch, sh_int position ) );
void	interpret	args( ( CHAR_DATA *ch, char *argument, bool forced ) );
bool	is_number	args( ( char *arg ) );
int	number_argument	args( ( char *argument, char *arg ) );
char *	one_argument	args( ( char *argument, char *arg_first ) );
char *	one_argument2	args( ( char *argument, char *arg_first ) );
char * one_argument_retain_case args((char *argument, char *arg_first));
ST *	find_social	args( ( char *command ) );
CMDTYPE *find_command	args( ( char *command ) );
void	hash_commands	args( ( ) );
void	start_timer	args( ( struct timeval *stime ) );
time_t	end_timer	args( ( struct timeval *stime ) );
void	send_timer	args( ( struct timerset *vtime, CHAR_DATA *ch ) );
void	update_userec	args( ( struct timeval *time_used,
				struct timerset *userec ) );

/* magic.c */
bool	process_spell_components args( ( CHAR_DATA *ch, int sn ) );
int	ch_slookup	args( ( CHAR_DATA *ch, const char *name ) );
int	find_spell	args( ( CHAR_DATA *ch, const char *name, bool know ) );
int	find_skill	args( ( CHAR_DATA *ch, const char *name, bool know ) );
int	skill_lookup	args( ( const char *name ) );
int	herb_lookup	args( ( const char *name ) );
int	slot_lookup	args( ( int slot ) );
int	bsearch_skill	args( ( const char *name, int first, int top ) );
int	bsearch_skill_exact args( ( const char *name, int first, int top ) );
int	bsearch_skill_prefix args( ( const char *name, int first, int top ) );
ch_ret	obj_cast_spell	args( ( int sn, int level, CHAR_DATA *ch, CHAR_DATA *victim, OBJ_DATA *obj ) );
int	dice_parse	args( (CHAR_DATA *ch, char *exp) );
SK *	get_skilltype	args( ( int sn ) );
bool	check_manastorm	args( ( CHAR_DATA *ch ) );

/* namegen.c */
char	*random_name		args( ( char *word, int lang ) );

/* talent.c */
CD	*find_target		args((CHAR_DATA *ch, char *argument, bool offense));
bool    check_displacement      args( ( CHAR_DATA *ch, CHAR_DATA *victim ));
bool	check_blur		args( ( CHAR_DATA *ch, CHAR_DATA *victim ));
bool	check_antimagic		args( ( CHAR_DATA *ch, CHAR_DATA *victim ));
void	learn_talent		args( ( CHAR_DATA *ch, int tal ));
void	mana_from_char		args( ( CHAR_DATA *ch, int mana ));
void	use_magic		args( ( CHAR_DATA *ch, int tal, int mana));
void	magic_damage		args( ( CHAR_DATA *victim, CHAR_DATA *ch, int dam, int type, int tal, bool dont_wait) );

/* request.c */
void	init_request_pipe	args( ( void ) );
void	check_requests		args( ( void ) );

/* save.c */
/* object saving defines for fread/write_obj. -- Altrag */
#define OS_CARRY	0
#define OS_GEM		1
#define OS_GROUND	2
int		get_obj_room_vnum_recursive(OBJ_DATA *obj);
void	save_char_obj	args( ( CHAR_DATA *ch ) );
bool	load_char_obj	args( ( DESCRIPTOR_DATA *d, char *name, bool preload ) );
void	set_alarm	args( ( long seconds ) );
void	requip_char	args( ( CHAR_DATA *ch ) );
void    fwrite_obj      args( ( CHAR_DATA *ch,  OBJ_DATA  *obj, FILE *fp,
				int iNest, sh_int os_type ) );
void	fread_obj	args( ( CHAR_DATA *ch,  FILE *fp, sh_int os_type ) );
void	de_equip_char	args( ( CHAR_DATA *ch ) );
void	re_equip_char	args( ( CHAR_DATA *ch ) );
void    read_char_mobile args( ( char *argument ) );
void    write_char_mobile args( (  CHAR_DATA *ch, char *argument ) );
CHAR_DATA * fread_mobile args( ( FILE *fp ) );
void    fwrite_mobile	args ( ( FILE *fp, CHAR_DATA *mob ) );

/* special.c */
SF *	spec_lookup	args( ( const char *name ) );
char *	lookup_spec	args( ( SPEC_FUN *special ) );

/* tables.c */
int	get_skill	args( ( char *skilltype ) );
char *	spell_name	args( ( SPELL_FUN *spell ) );
char *	skill_name	args( ( DO_FUN *skill ) );
void	load_skill_table args( ( void ) );
void	save_skill_table args( ( void ) );
void	sort_skill_table args( ( void ) );
void	remap_slot_numbers args( ( void ) );
void	load_socials	args( ( void ) );
void	save_socials	args( ( void ) );
void	load_commands	args( ( void ) );
void	save_commands	args( ( void ) );
SPELL_FUN *spell_function args( ( char *name ) );
DO_FUN *skill_function  args( ( char *name ) );
void	write_clan_file	args( ( CLAN_DATA *clan, char filename[MAX_INPUT_LENGTH] ) );
void	save_clans		args( ( void ) );
void	load_clans		args( ( void ) );
void	load_herb_table	args( ( void ) );
void	save_herb_table	args( ( void ) );
void	load_tongues	args( ( void ) );
void	save_bits(void);
void	load_bits(void);


/* track.c */
void	found_prey	args( ( CHAR_DATA *ch, CHAR_DATA *victim ) );
void	hunt_victim	args( ( CHAR_DATA *ch) );

/* update.c */
void	gain_condition	args( ( CHAR_DATA *ch, int iCond, int value ) );
bool	climate_affect	args( ( CHAR_DATA *ch, int type ) );
void	update_handler	args( ( void ) );
void	reboot_check	args( ( time_t reset ) );
#if 0
void    reboot_check    args( ( char *arg ) );
#endif
void	remove_portal	args( ( OBJ_DATA *portal ) );
void	weather_update	args( ( void ) );

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

/* newscore.c */
char *  get_race 	args( (CHAR_DATA *ch) );

/* bits.c */
BIT_DATA *find_abit(int number);
BIT_DATA *find_qbit(int number);
BIT_DATA *get_abit(CHAR_DATA *ch, int number);
BIT_DATA *get_qbit(CHAR_DATA *ch, int number);
void load_bits(void);
void save_bits(void);
void set_abit(CHAR_DATA *ch, int number);
void set_qbit(CHAR_DATA *ch, int number);
void remove_abit(CHAR_DATA *ch, int number);
void remove_qbit(CHAR_DATA *ch, int number);
void do_showabit(CHAR_DATA *ch, char *argument);
void do_showqbit(CHAR_DATA *ch, char *argument);

/* makezone.c */
int makezone(CHAR_DATA *ch, char note[MAX_STRING_LENGTH]);
//void spell_parse(CHAR_DATA *ch, char *argument);

#undef	SK
#undef	CO
#undef	ST
#undef	CD
#undef	MID
#undef	OD
#undef	OID
#undef	RID
#undef	SF
#undef	BD
#undef	CL
#undef	EDD
#undef	RD
#undef	ED

/*
 *
 *  New Build Interface Stuff Follows
 *
 */


/*
 *  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_redraw_page  );
DECLARE_DO_FUN( do_refresh_page );
DECLARE_DO_FUN( do_pagelen	);
DECLARE_DO_FUN( do_omenu  	);
DECLARE_DO_FUN( do_rmenu  	);
DECLARE_DO_FUN( do_mmenu  	);
DECLARE_DO_FUN( do_clear  	);

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 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

/* furniture flags */
#define STAND_AT		BV00
#define STAND_ON		BV01
#define STAND_IN		BV02
#define SIT_AT			BV03
#define SIT_ON			BV04
#define SIT_IN			BV05
#define REST_AT			BV06
#define REST_ON			BV07
#define REST_IN			BV08
#define SLEEP_AT		BV09
#define SLEEP_ON		BV10
#define SLEEP_IN		BV11
#define PUT_AT			BV12
#define PUT_ON			BV13
#define PUT_IN			BV14
#define PUT_INSIDE		BV15

#define FURNITURE_UNUSED	-1
#define FURNITURE_NONE		0
#define ST_AT			BV00	/*	Stand at	*/
#define ST_ON			BV01	/*	Stand on	*/
#define ST_IN			BV02	/*	Stand in	*/
#define SI_AT			BV03	/*	Sit at		*/
#define SI_ON			BV04	/*	Sit on		*/
#define SI_IN			BV05	/*	Sit in		*/
#define RE_AT			BV06	/*	Rest at		*/
#define RE_ON			BV07	/*	Rest on		*/
#define RE_IN			BV08	/*	Rest in		*/
#define SL_AT			BV09	/*	Sleep at	*/
#define SL_ON			BV10	/*	Sleep on	*/
#define SL_IN			BV11	/*	Sleep in	*/
#define PT_AT			BV12	/*	Put at		*/
#define PT_ON			BV13	/*	Put on		*/
#define PT_IN			BV14	/*	Put in		*/
#define PT_INSIDE		BV15	/*	Put inside	*/

/* New spell sys, globally available function prototypes -- Scion */
void start_spell(CHAR_DATA *ch);
SPELL_DATA *get_spell(CHAR_DATA *ch);
void add_command_spell(CHAR_DATA *ch, char *cmd);

/*
 *   Map Structures
 */

/*DECLARE_DO_FUN( do_mapout 	);
DECLARE_DO_FUN( do_lookmap	);
*/
//struct  map_data	/* contains per-room data */
//{
//  int vnum;		/* which map this room belongs to */
//  int x;		/* horizontal coordinate */
//  int y;		/* vertical coordinate */
//  char entry;		/* code that shows up on map */
//};


//struct  map_index_data
//{
//  MAP_INDEX_DATA  *next;
//  int 		  vnum;  		  /* vnum of the map */
//  int             map_of_vnums[49][81];   /* room vnums aranged as a map */
//};


//MAP_INDEX_DATA *get_map_index(int vnum);
//void            init_maps();


/*
 * mudprograms stuff
 */
extern	CHAR_DATA *supermob;

void oprog_speech_trigger( char *txt, CHAR_DATA *ch );
void oprog_random_trigger( OBJ_DATA *obj );
void oprog_wear_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
bool oprog_use_trigger( CHAR_DATA *ch, OBJ_DATA *obj,
                        CHAR_DATA *vict, OBJ_DATA *targ, void *vo );
void oprog_remove_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_sac_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_damage_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_drop_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
void oprog_zap_trigger( CHAR_DATA *ch, OBJ_DATA *obj );
char *oprog_type_to_name( int type );

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


/* mud prog defines */

#define ERROR_PROG        -1
#define IN_FILE_PROG      -2

typedef enum
{
  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
} prog_types;

/*
 * For backwards compatability
 */
#define RDEATH_PROG DEATH_PROG
#define ENTER_PROG  ENTRY_PROG
#define RFIGHT_PROG FIGHT_PROG
#define RGREET_PROG GREET_PROG
#define OGREET_PROG GREET_PROG

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

#define OPROG_ACT_TRIGGER
#ifdef OPROG_ACT_TRIGGER
void oprog_act_trigger( char *buf, OBJ_DATA *mobj, CHAR_DATA *ch,
			OBJ_DATA *obj, void *vo );
#endif
#define RPROG_ACT_TRIGGER
#ifdef RPROG_ACT_TRIGGER
void rprog_act_trigger( char *buf, ROOM_INDEX_DATA *room, CHAR_DATA *ch,
			OBJ_DATA *obj, void *vo );
#endif

#define GET_ADEPT(ch, sn)	(get_adept((ch), (sn)))

#define LEARNED(ch,sn)	    (learned((ch), (sn)))

/* Structure and macros for using long bit vectors */
#define CHAR_SIZE sizeof(char)

typedef char * LONG_VECTOR;

#define LV_CREATE(vector, bit_length)					\
do									\
{									\
	int i;								\
	CREATE(vector, char, 1 + bit_length/CHAR_SIZE);			\
									\
	for(i = 0; i <= bit_length/CHAR_SIZE; i++)			\
		*(vector + i) = 0;					\
}while(0)

#define LV_IS_SET(vector, index)					\
	(*(vector + index/CHAR_SIZE) & (1 << index%CHAR_SIZE))

#define LV_SET_BIT(vector, index)					\
	(*(vector + index/CHAR_SIZE) |= (1 << index%CHAR_SIZE))

#define LV_REMOVE_BIT(vector, index)					\
	(*(vector + index/CHAR_SIZE) &= ~(1 << index%CHAR_SIZE))

#define LV_TOGGLE_BIT(vector, index)					\
	(*(vector + index/CHAR_SIZE) ^= (1 << index%CHAR_SIZE))

#ifdef WIN32
void gettimeofday(struct timeval *tv, struct timezone *tz);
void kill_timer();

/* directory scanning stuff */

typedef struct dirent
{
    char *	d_name;
};

typedef struct
{
    HANDLE		hDirectory;
    WIN32_FIND_DATA	Win32FindData;
    struct dirent	dirinfo;
    char		sDirName[MAX_PATH];
} DIR;


DIR *opendir(char * sDirName);
struct dirent *readdir (DIR * dp);
void closedir(DIR * dp);

/* --------------- Stuff for Win32 services ------------------ */
/*

   NJG:

   When "exit" is called to handle an error condition, we really want to
   terminate the game thread, not the whole process.

 */

#define exit(arg) Win32_Exit(arg)
void Win32_Exit(int exit_code);

#endif

#define send_to_char send_to_char_color
#define send_to_pager send_to_pager_color