1stMUD/corefiles/
1stMUD/gods/
1stMUD/notes/
1stMUD/player/
1stMUD/win32/
1stMUD/win32/ROM/
/**************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*                                                                         *
*  Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael         *
*  Chastain, Michael Quan, and Mitchell Tse.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefiting.  We hope that you share your changes too.  What goes       *
*  around, comes around.                                                  *
***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                        *
*       ROM has been brought to you by the ROM consortium                 *
*           Russ Taylor (rtaylor@hypercube.org)                           *
*           Gabrielle Taylor (gtaylor@hypercube.org)                      *
*           Brian Moore (zump@rom.org)                                    *
*       By using this code, you have agreed to follow the terms of the    *
*       ROM license, in the file Rom24/doc/rom.license                    *
***************************************************************************
*       1stMUD ROM Derivative (c) 2001-2002 by Ryan Jennings              *
*            http://1stmud.dlmud.com/  <r-jenn@shaw.ca>                   *
***************************************************************************/

#if !defined(MERC_H)
#define MERC_H

#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
#define DECLARE_LOOKUP_FUN( fun )	LOOKUP_F  fun
#define DECLARE_ED_FUN( fun )	ED_FUN	   fun
#define DECLARE_VALIDATE_FUN(fun)	VALIDATE_FUN	fun
#define DECLARE_OBJ_FUN( fun )		OBJ_FUN	  fun
#define DECLARE_ROOM_FUN( fun )		ROOM_FUN  fun

/*
 * Short scalar types.
 * Diavolo reports AIX compiler has bugs with short types.
 */

#if !defined(__cplusplus)
typedef short int bool;
#endif

#if	!defined(FALSE)
#if defined(__cplusplus)
#define FALSE    false
#else
#define FALSE	 0
#endif
#endif

#if	!defined(TRUE)
#if defined(__cplusplus)
#define TRUE     true
#else
#define TRUE	 1
#endif
#endif

#if defined(WIN32)
#pragma warning( disable: 4018 4244 4305 4761 4800 4309)
#define __attribute__(x)
#if !defined(NOCRYPT)
#define NOCRYPT
#endif
typedef __int64 flag_t;
#else
#if defined(__CYGWIN__)
#define NOCRYPT
#define NO_MCCP
#endif
typedef int64_t flag_t;
#endif

typedef long vnum_t;

/* ea */
#define MSL MAX_STRING_LENGTH
#define MIL MAX_INPUT_LENGTH

#include "ansi.h"

#if !defined(NO_MCCP)

#if !defined(WIN32)
#include <zlib.h>
#else
#if defined(IN_WINSTUFF_C)
#include "zlib.h"
#else
#include "../win32/zlib.h"
#endif
#endif

#define TELOPT_COMPRESS 85
#define COMPRESS_BUF_SIZE 16384

#endif

/*
 * Structure types.
 */
typedef struct affect_data AFFECT_DATA;
typedef struct area_data AREA_DATA;
typedef struct ban_data BAN_DATA;
typedef struct buf_type BUFFER;
typedef struct char_data CHAR_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 kill_data KILL_DATA;
typedef struct mem_data MEM_DATA;
typedef struct mob_index_data MOB_INDEX_DATA;
typedef struct note_data NOTE_DATA;
typedef struct obj_data OBJ_DATA;
typedef struct obj_index_data OBJ_INDEX_DATA;
typedef struct pc_data PC_DATA;
typedef struct gen_data GEN_DATA;
typedef struct reset_data RESET_DATA;
typedef struct room_index_data ROOM_INDEX_DATA;
typedef struct shop_data SHOP_DATA;
typedef struct time_info_data TIME_INFO_DATA;
typedef struct weather_data WEATHER_DATA;
typedef struct prog_list PROG_LIST;
typedef struct prog_code PROG_CODE;
typedef struct disabled_data DISABLED_DATA;
typedef struct stat_data STAT_DATA;
typedef struct social_type SOCIAL_DATA;
typedef struct gquest_data GQUEST;
typedef struct war_data WAR_DATA;
typedef struct clan_type CLAN_DATA;
typedef struct cmd_type CMD_DATA;
typedef struct skill_type SKILL_DATA;
typedef struct group_type GROUP_DATA;
typedef struct race_type RACE_DATA;
typedef struct class_type CLASS_DATA;
typedef struct corpse_data CORPSE_DATA;
typedef struct auction_data AUCTION_DATA;
typedef struct clan_rank RANK_DATA;
typedef struct deity_type DEITY_DATA;
typedef struct wpwd_data WPWD_DATA;
typedef struct mbr_data MBR_DATA;

/*
 * Function types.
 */
typedef void DO_FUN args((CHAR_DATA * ch, const char *argument));
typedef bool SPEC_FUN args((CHAR_DATA * ch));
typedef void SPELL_FUN
args((int sn, int level, CHAR_DATA * ch, void *vo, int target));
typedef int LOOKUP_F args((const char *));
typedef bool ED_FUN
args((const char *, CHAR_DATA *, const char *, void *, const void *));
typedef bool VALIDATE_FUN args((CHAR_DATA * ch, const void *arg));
typedef void OBJ_FUN args((OBJ_DATA * obj, const char *argument));
typedef void ROOM_FUN args((ROOM_INDEX_DATA * room, const char *argument));

#define	CH_CMD(name) void name(CHAR_DATA * ch, const char *argument)
#define ED_FUN_DEC(blah)	bool blah ( const char * n_fun, CHAR_DATA *ch, const char *argument, void *arg, const void *par )
#define VALIDATE_FUN(fun)	bool fun(CHAR_DATA *ch, const void *arg)

/*
 * String and memory management parameters.
 */
#define	MAX_KEY_HASH		 1024
#define MAX_STRING_LENGTH	 4608
#define MAX_INPUT_LENGTH	  256
#define PAGELEN			   22
#define MAX_EXPLORE_HASH     8192

/*
 * Game parameters.
 * Increase the max'es if you add more of something.
 * Adjust the pulse numbers to suit yourself.
 */
#define MAX_IN_GROUP		   15
#define MAX_ALIAS		    5
#define MAX_BUDDY           10
#define MAX_REMORT          2	// should never be higher than maxClass
#define MAX_MCLASS          (MAX_REMORT + 3)
#define MAX_DAMAGE_MESSAGE	   41
#define    MAX_RANK    6
#define    MAX_HOUSE_ROOMS            5
#define MAX_LEVEL		   60
#define LEVEL_HERO		   (MAX_LEVEL - 9)
#define LEVEL_IMMORTAL		   (MAX_LEVEL - 8)

#define PULSE_PER_SECOND	    4
#define PULSE_VIOLENCE		  ( 3 * PULSE_PER_SECOND)
#define PULSE_MOBILE		  ( 4 * PULSE_PER_SECOND)
#define PULSE_MUSIC		  ( 6 * PULSE_PER_SECOND)
#define PULSE_TICK		  (60 * PULSE_PER_SECOND)
#define PULSE_AREA		  (120 * PULSE_PER_SECOND)

#define    AUCTION_LENGTH           (60 * PULSE_PER_SECOND)

#define IMPLEMENTOR		MAX_LEVEL
#define	CREATOR			(MAX_LEVEL - 1)
#define SUPREME			(MAX_LEVEL - 2)
#define DEITY			(MAX_LEVEL - 3)
#define GOD			(MAX_LEVEL - 4)
#define IMMORTAL		(MAX_LEVEL - 5)
#define DEMI			(MAX_LEVEL - 6)
#define ANGEL			(MAX_LEVEL - 7)
#define AVATAR			(MAX_LEVEL - 8)
#define HERO			LEVEL_HERO

/*
 * Site ban structure.
 */

#define BAN_SUFFIX		(BIT_A)
#define BAN_PREFIX		(BIT_B)
#define BAN_NEWBIES		(BIT_C)
#define BAN_ALL			(BIT_D)
#define BAN_PERMIT		(BIT_E)
#define BAN_PERMANENT   (BIT_F)

struct ban_data
{
	BAN_DATA *next;
	BAN_DATA *prev;
	bool valid;
	flag_t ban_flags;
	int level;
	const char *name;
};

struct buf_type
{
	BUFFER *next;
	BUFFER *prev;
	bool valid;
	int state;					/* error state of the buffer */
	int size;					/* size in k */
	char *string;				/* buffer's string */
};

struct auction_data
{
	AUCTION_DATA *next;
	AUCTION_DATA *prev;
	OBJ_DATA *item;
	CHAR_DATA *owner;
	CHAR_DATA *high_bidder;
	int status;
	int number;
	unsigned long bid;
	bool valid;
};

/*
 * Time and weather stuff.
 */
#define SUN_DARK		    0
#define SUN_RISE		    1
#define SUN_LIGHT		    2
#define SUN_SET			    3

#define SKY_CLOUDLESS		    0
#define SKY_CLOUDY		    1
#define SKY_RAINING		    2
#define SKY_LIGHTNING		    3

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

struct weather_data
{
	int mmhg;
	int change;
	int sky;
	int sunlight;
};

/* Bitvector defines, 52 for
   A-Z, a-z 
*/
#define BIT_A        ((flag_t) 1 <<  0)
#define BIT_B        ((flag_t) 1 <<  1)
#define BIT_C        ((flag_t) 1 <<  2)
#define BIT_D        ((flag_t) 1 <<  3)
#define BIT_E        ((flag_t) 1 <<  4)
#define BIT_F        ((flag_t) 1 <<  5)
#define BIT_G        ((flag_t) 1 <<  6)
#define BIT_H        ((flag_t) 1 <<  7)
#define BIT_I        ((flag_t) 1 <<  8)
#define BIT_J        ((flag_t) 1 <<  9)
#define BIT_K        ((flag_t) 1 << 10)
#define BIT_L        ((flag_t) 1 << 11)
#define BIT_M        ((flag_t) 1 << 12)
#define BIT_N        ((flag_t) 1 << 13)
#define BIT_O        ((flag_t) 1 << 14)
#define BIT_P        ((flag_t) 1 << 15)
#define BIT_Q        ((flag_t) 1 << 16)
#define BIT_R        ((flag_t) 1 << 17)
#define BIT_S        ((flag_t) 1 << 18)
#define BIT_T        ((flag_t) 1 << 19)
#define BIT_U        ((flag_t) 1 << 20)
#define BIT_V        ((flag_t) 1 << 21)
#define BIT_W        ((flag_t) 1 << 22)
#define BIT_X        ((flag_t) 1 << 23)
#define BIT_Y        ((flag_t) 1 << 24)
#define BIT_Z        ((flag_t) 1 << 25)
#define BIT_a        ((flag_t) 1 << 26)
#define BIT_b        ((flag_t) 1 << 27)
#define BIT_c        ((flag_t) 1 << 28)
#define BIT_d        ((flag_t) 1 << 29)
#define BIT_e        ((flag_t) 1 << 30)
#define BIT_f        ((flag_t) 1 << 31)
#define BIT_Ax	     ((flag_t) 1 << 32)
#define BIT_Bx	     ((flag_t) 1 << 33)
#define BIT_Cx	     ((flag_t) 1 << 34)
#define BIT_Dx	     ((flag_t) 1 << 35)
#define BIT_Ex	     ((flag_t) 1 << 36)
#define BIT_Fx	     ((flag_t) 1 << 37)
#define BIT_Gx	     ((flag_t) 1 << 38)
#define BIT_Hx	     ((flag_t) 1 << 39)
#define BIT_Ix	     ((flag_t) 1 << 40)
#define BIT_Jx	     ((flag_t) 1 << 41)
#define BIT_Kx	     ((flag_t) 1 << 42)
#define BIT_Lx	     ((flag_t) 1 << 43)
#define BIT_Mx	     ((flag_t) 1 << 44)
#define BIT_Nx	     ((flag_t) 1 << 45)
#define BIT_Ox	     ((flag_t) 1 << 46)
#define BIT_Px	     ((flag_t) 1 << 47)
#define BIT_Qx	     ((flag_t) 1 << 48)
#define BIT_Rx	     ((flag_t) 1 << 49)
#define BIT_Sx	     ((flag_t) 1 << 50)
#define BIT_Tx	     ((flag_t) 1 << 51)
#define BIT_Ux	     ((flag_t) 1 << 52)
#define BIT_Vx	     ((flag_t) 1 << 53)
#define BIT_Wx	     ((flag_t) 1 << 54)
#define BIT_Xx	     ((flag_t) 1 << 55)
#define BIT_Yx	     ((flag_t) 1 << 56)
#define BIT_Zx	     ((flag_t) 1 << 57)
#define BIT_ax	     ((flag_t) 1 << 58)
#define BIT_bx	     ((flag_t) 1 << 59)
#define BIT_cx	     ((flag_t) 1 << 60)
#define BIT_dx	     ((flag_t) 1 << 61)
#define BIT_ex	     ((flag_t) 1 << 62)
#define BIT_fx	     ((flag_t) 1 << 63)

/*
 * Connected state for a channel.
 */
#define CON_PLAYING			 0
#define CON_GET_NAME			 1
#define CON_GET_OLD_PASSWORD		 2
#define CON_CONFIRM_NEW_NAME		 3
#define CON_GET_NEW_PASSWORD		 4
#define CON_CONFIRM_NEW_PASSWORD	 5
#define CON_GET_NEW_RACE		 6
#define CON_GET_NEW_SEX			 7
#define CON_GET_NEW_CLASS		 8
#define CON_GET_ALIGNMENT		 9
#define CON_GET_DEITY           10
#define CON_DEFAULT_CHOICE		11
#define CON_GEN_GROUPS			12
#define CON_PICK_WEAPON			13
#define CON_READ_IMOTD			14
#define CON_READ_MOTD			15
#define CON_BREAK_CONNECT		16
#define CON_GET_TERM	        17
#define CON_COPYOVER_RECOVER    18
#define CON_NOTE_TO				19
#define CON_NOTE_SUBJECT		20
#define CON_NOTE_EXPIRE			21
#define CON_NOTE_TEXT			22
#define CON_NOTE_FINISH			23

/*
 * Descriptor (channel) structure.
 */
struct descriptor_data
{
	DESCRIPTOR_DATA *next;
	DESCRIPTOR_DATA *prev;
	DESCRIPTOR_DATA *snoop_by;
	CHAR_DATA *character;
	CHAR_DATA *original;
	bool valid;
	const char *host;
	int descriptor;
	int connected;
	bool fcommand;
	char inbuf[4 * MAX_INPUT_LENGTH];
	char incomm[MAX_INPUT_LENGTH];
	char inlast[MAX_INPUT_LENGTH];
	int repeat;
	char *outbuf;
	int outsize;
	int outtop;
	const char *showstr_head;
	const char *showstr_point;
	void *pEdit;				/* OLC */
	const char **pString;		/* OLC */
	int editor;					/* OLC */
	flag_t d_flags;
	unsigned int scr_width;		/* screen width */
	unsigned int scr_height;	/* screen height */
#if !defined(NO_MCCP)
	z_stream *out_compress;
	unsigned char *out_compress_buf;
#endif
	const char *run_buf;
	const char *run_head;
};

/* 
 * Descriptor Flags.
 */

#define DESC_COLOUR		    (BIT_A)
#define DESC_TELOPT_EOR		(BIT_B)
#define DESC_TELOPT_ECHO	(BIT_C)
#define DESC_TELOPT_NAWS	(BIT_D)

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

struct int_app_type
{
	int learn;
};

struct wis_app_type
{
	int practice;
};

struct dex_app_type
{
	int defensive;
};

struct con_app_type
{
	int hitp;
	int shock;
};

/*
 * TO types for act.
 */
#define TO_ROOM		    BIT_A
#define TO_NOTVICT	    BIT_B
#define TO_VICT		    BIT_C
#define TO_CHAR		    BIT_D
#define TO_ALL		    BIT_E
#define TO_DAMAGE       BIT_F
#define TO_ZONE         BIT_G

enum special_flags
{
	spec_public_flag,
	spec_clan_flag,
	spec_buddy_flag,
	spec_imm_flag
};

/*
 * Help table types.
 */
struct help_data
{
	HELP_DATA *next;
	HELP_DATA *prev;
	int level;
	const char *keyword;
	const char *text;
};

/*
 * Shop types.
 */
#define MAX_TRADE	 5

struct shop_data
{
	SHOP_DATA *next;
	SHOP_DATA *prev;			/* Next shop in list        */
	vnum_t keeper;				/* Vnum of shop keeper mob  */
	int buy_type[MAX_TRADE];	/* Item types shop will buy */
	int profit_buy;				/* Cost multiplier for buying   */
	int profit_sell;			/* Cost multiplier for selling  */
	int open_hour;				/* First opening hour       */
	int close_hour;				/* First closing hour       */
};

/*
 * Per-class stuff.
 */

#define MAX_GUILD 	2
#define MAX_STATS 	5
#define STAT_STR 	0
#define STAT_INT	1
#define STAT_WIS	2
#define STAT_DEX	3
#define STAT_CON	4
#define STAT_MAX    5

struct class_type
{
	const char *name;			/* the full name of the class */
	const char *who_name;		/* Three-letter name for 'who'  */
	int attr_prime;				/* Prime attribute      */
	vnum_t weapon;				/* First weapon         */
	vnum_t guild[MAX_GUILD];	/* Vnum of guild rooms      */
	int skill_adept;			/* Maximum skill level      */
	int thac0_00;				/* Thac0 for level  0       */
	int thac0_32;				/* Thac0 for level 32       */
	int hp_min;					/* Min hp gained on leveling    */
	int hp_max;					/* Max hp gained on leveling    */
	bool fMana;					/* Class gains mana on level    */
	const char *base_group;		/* base skills gained       */
	const char *default_group;	/* default skills gained    */
};

struct item_type
{
	int type;
	const char *name;
};

struct weapon_type
{
	const char *name;
	vnum_t vnum;
	int type;
	int *gsn;
};

struct wiznet_type
{
	const char *name;
	flag_t flag;
	int level;
};

struct attack_type
{
	const char *name;			/* name */
	const char *noun;			/* message */
	int damage;					/* damage class */
};

struct deity_type
{
	const char *name;
	const char *desc;
	const char *skillname;
	DEITY_DATA *next, *prev;
	bool valid;
};

struct corpse_data
{
	CORPSE_DATA *next;
	CORPSE_DATA *prev;
	OBJ_DATA *corpse;
};

struct race_type
{
	const char *name;			/* call name of the race */
	bool pc_race;				/* can be chosen by pcs */
	flag_t act;					/* act bits for the race */
	flag_t aff;					/* aff bits for the race */
	flag_t off;					/* off bits for the race */
	flag_t imm;					/* imm bits for the race */
	flag_t res;					/* res bits for the race */
	flag_t vuln;				/* vuln bits for the race */
	flag_t form;				/* default form flag_t for the race */
	flag_t parts;				/* default parts for the race */
	const char *who_name;
	int points;					/* cost in points of the race */
	int *class_mult;			/* exp multiplier for class, * 100 */
	const char *skills[5];		/* bonus skills for the race */
	int stats[MAX_STATS];		/* starting stats */
	int max_stats[MAX_STATS];	/* maximum stats */
	int size;					/* aff bits for the race */
	RACE_DATA *next, *prev;
	bool valid;
};

struct spec_type
{
	const char *name;			/* special function name */
	SPEC_FUN *function;			/* the function */
};

/*
 * Data structure for notes.
 */
struct note_data
{
	NOTE_DATA *next;
	NOTE_DATA *prev;
	bool valid;
	const char *sender;
	const char *date;
	const char *to_list;
	const char *subject;
	const char *text;
	time_t date_stamp;
	time_t expire;
};

#include "board.h"

#define	MAX_GQUEST_MOB 26

struct gquest_data
{
	CHAR_DATA *last_registar;
	vnum_t mobs[MAX_GQUEST_MOB];
	const char *who;
	int mob_count;
	int timer;
	int involved;
	int qpoints;
	int gold;
	int minlevel;
	int maxlevel;
	int running;
	int next;
};

#define		GQUEST_OFF			0
#define		GQUEST_WAITING		1
#define		GQUEST_RUNNING		2

/*
 * An affect.
 */
struct affect_data
{
	AFFECT_DATA *next;
	AFFECT_DATA *prev;
	bool valid;
	int where;
	int type;
	int level;
	int duration;
	int location;
	int modifier;
	flag_t bitvector;
};

/* where definitions */
#define TO_AFFECTS	0
#define TO_OBJECT	1
#define TO_IMMUNE	2
#define TO_RESIST	3
#define TO_VULN		4
#define TO_WEAPON	5

/*
 * A kill structure (indexed by level).
 */
struct kill_data
{
	int number;
	int killed;
};

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

/*
 * Well known mob virtual numbers.
 * Defined in #MOBILES.
 */
#define MOB_VNUM_FIDO		   3090
#define MOB_VNUM_CITYGUARD	   3060
#define MOB_VNUM_VAMPIRE	   3404
#define	MOB_VNUM_WARMASTER     17601
#define MOB_VNUM_PATROLMAN	   2106
#define GROUP_VNUM_TROLLS	   2100
#define GROUP_VNUM_OGRES	   2101

#define	MOB_VNUM_REGISTAR      202

/*
 * ACT bits for mobs.
 * Used in #MOBILES.
 */
#define ACT_IS_NPC		(BIT_A)	/* Auto set for mobs    */
#define ACT_SENTINEL	    	(BIT_B)	/* Stays in one room    */
#define ACT_SCAVENGER	      	(BIT_C)	/* Picks up objects */
#define ACT_AGGRESSIVE		(BIT_F)	/* Attacks PC's     */
#define ACT_STAY_AREA		(BIT_G)	/* Won't leave area */
#define ACT_WIMPY		(BIT_H)
#define ACT_PET			(BIT_I)	/* Auto set for pets    */
#define ACT_TRAIN		(BIT_J)	/* Can train PC's   */
#define ACT_PRACTICE		(BIT_K)	/* Can practice PC's    */
#define ACT_UNDEAD		(BIT_O)
#define ACT_CLERIC		(BIT_Q)
#define ACT_MAGE		(BIT_R)
#define ACT_THIEF		(BIT_S)
#define ACT_WARRIOR		(BIT_T)
#define ACT_NOALIGN		(BIT_U)
#define ACT_NOPURGE		(BIT_V)
#define ACT_OUTDOORS		(BIT_W)
#define ACT_INDOORS		(BIT_Y)
#define ACT_IS_HEALER		(BIT_a)
#define ACT_GAIN		(BIT_b)
#define ACT_UPDATE_ALWAYS	(BIT_c)
#define ACT_IS_CHANGER		(BIT_d)

/* damage classes */
#define DAM_NONE                0
#define DAM_BASH                1
#define DAM_PIERCE              2
#define DAM_SLASH               3
#define DAM_FIRE                4
#define DAM_COLD                5
#define DAM_LIGHTNING           6
#define DAM_ACID                7
#define DAM_POISON              8
#define DAM_NEGATIVE            9
#define DAM_HOLY                10
#define DAM_ENERGY              11
#define DAM_MENTAL              12
#define DAM_DISEASE             13
#define DAM_DROWNING            14
#define DAM_LIGHT		15
#define DAM_OTHER               16
#define DAM_HARM		17
#define DAM_CHARM		18
#define DAM_SOUND		19

/* OFF bits for mobiles */
#define OFF_AREA_ATTACK         (BIT_A)
#define OFF_BACKSTAB            (BIT_B)
#define OFF_BASH                (BIT_C)
#define OFF_BERSERK             (BIT_D)
#define OFF_DISARM              (BIT_E)
#define OFF_DODGE               (BIT_F)
#define OFF_FADE                (BIT_G)
#define OFF_FAST                (BIT_H)
#define OFF_KICK                (BIT_I)
#define OFF_KICK_DIRT           (BIT_J)
#define OFF_PARRY               (BIT_K)
#define OFF_RESCUE              (BIT_L)
#define OFF_TAIL                (BIT_M)
#define OFF_TRIP                (BIT_N)
#define OFF_CRUSH		(BIT_O)
#define ASSIST_ALL       	(BIT_P)
#define ASSIST_ALIGN	        (BIT_Q)
#define ASSIST_RACE    	     	(BIT_R)
#define ASSIST_PLAYERS      	(BIT_S)
#define ASSIST_GUARD        	(BIT_T)
#define ASSIST_VNUM		(BIT_U)

/* return values for check_imm */
#define IS_NORMAL		0
#define IS_IMMUNE		1
#define IS_RESISTANT		2
#define IS_VULNERABLE		3

/* IMM bits for mobs */
#define IMM_SUMMON              (BIT_A)
#define IMM_CHARM               (BIT_B)
#define IMM_MAGIC               (BIT_C)
#define IMM_WEAPON              (BIT_D)
#define IMM_BASH                (BIT_E)
#define IMM_PIERCE              (BIT_F)
#define IMM_SLASH               (BIT_G)
#define IMM_FIRE                (BIT_H)
#define IMM_COLD                (BIT_I)
#define IMM_LIGHTNING           (BIT_J)
#define IMM_ACID                (BIT_K)
#define IMM_POISON              (BIT_L)
#define IMM_NEGATIVE            (BIT_M)
#define IMM_HOLY                (BIT_N)
#define IMM_ENERGY              (BIT_O)
#define IMM_MENTAL              (BIT_P)
#define IMM_DISEASE             (BIT_Q)
#define IMM_DROWNING            (BIT_R)
#define IMM_LIGHT		(BIT_S)
#define IMM_SOUND		(BIT_T)
#define IMM_WOOD                (BIT_X)
#define IMM_SILVER              (BIT_Y)
#define IMM_IRON                (BIT_Z)

/* RES bits for mobs */
#define RES_SUMMON		(BIT_A)
#define RES_CHARM		(BIT_B)
#define RES_MAGIC               (BIT_C)
#define RES_WEAPON              (BIT_D)
#define RES_BASH                (BIT_E)
#define RES_PIERCE              (BIT_F)
#define RES_SLASH               (BIT_G)
#define RES_FIRE                (BIT_H)
#define RES_COLD                (BIT_I)
#define RES_LIGHTNING           (BIT_J)
#define RES_ACID                (BIT_K)
#define RES_POISON              (BIT_L)
#define RES_NEGATIVE            (BIT_M)
#define RES_HOLY                (BIT_N)
#define RES_ENERGY              (BIT_O)
#define RES_MENTAL              (BIT_P)
#define RES_DISEASE             (BIT_Q)
#define RES_DROWNING            (BIT_R)
#define RES_LIGHT		(BIT_S)
#define RES_SOUND		(BIT_T)
#define RES_WOOD                (BIT_X)
#define RES_SILVER              (BIT_Y)
#define RES_IRON                (BIT_Z)

/* VULN bits for mobs */
#define VULN_SUMMON		(BIT_A)
#define VULN_CHARM		(BIT_B)
#define VULN_MAGIC              (BIT_C)
#define VULN_WEAPON             (BIT_D)
#define VULN_BASH               (BIT_E)
#define VULN_PIERCE             (BIT_F)
#define VULN_SLASH              (BIT_G)
#define VULN_FIRE               (BIT_H)
#define VULN_COLD               (BIT_I)
#define VULN_LIGHTNING          (BIT_J)
#define VULN_ACID               (BIT_K)
#define VULN_POISON             (BIT_L)
#define VULN_NEGATIVE           (BIT_M)
#define VULN_HOLY               (BIT_N)
#define VULN_ENERGY             (BIT_O)
#define VULN_MENTAL             (BIT_P)
#define VULN_DISEASE            (BIT_Q)
#define VULN_DROWNING           (BIT_R)
#define VULN_LIGHT		(BIT_S)
#define VULN_SOUND		(BIT_T)
#define VULN_WOOD               (BIT_X)
#define VULN_SILVER             (BIT_Y)
#define VULN_IRON		(BIT_Z)

/* body form */
#define FORM_EDIBLE             (BIT_A)
#define FORM_POISON             (BIT_B)
#define FORM_MAGICAL            (BIT_C)
#define FORM_INSTANT_DECAY      (BIT_D)
#define FORM_OTHER              (BIT_E)	/* defined by material bit */

/* actual form */
#define FORM_ANIMAL             (BIT_G)
#define FORM_SENTIENT           (BIT_H)
#define FORM_UNDEAD             (BIT_I)
#define FORM_CONSTRUCT          (BIT_J)
#define FORM_MIST               (BIT_K)
#define FORM_INTANGIBLE         (BIT_L)

#define FORM_BIPED              (BIT_M)
#define FORM_CENTAUR            (BIT_N)
#define FORM_INSECT             (BIT_O)
#define FORM_SPIDER             (BIT_P)
#define FORM_CRUSTACEAN         (BIT_Q)
#define FORM_WORM               (BIT_R)
#define FORM_BLOB		(BIT_S)

#define FORM_MAMMAL             (BIT_V)
#define FORM_BIRD               (BIT_W)
#define FORM_REPTILE            (BIT_X)
#define FORM_SNAKE              (BIT_Y)
#define FORM_DRAGON             (BIT_Z)
#define FORM_AMPHIBIAN          (BIT_a)
#define FORM_FISH               (BIT_b)
#define FORM_COLD_BLOOD		(BIT_c)

/* body parts */
#define PART_HEAD               (BIT_A)
#define PART_ARMS               (BIT_B)
#define PART_LEGS               (BIT_C)
#define PART_HEART              (BIT_D)
#define PART_BRAINS             (BIT_E)
#define PART_GUTS               (BIT_F)
#define PART_HANDS              (BIT_G)
#define PART_FEET               (BIT_H)
#define PART_FINGERS            (BIT_I)
#define PART_EAR                (BIT_J)
#define PART_EYE		(BIT_K)
#define PART_LONG_TONGUE        (BIT_L)
#define PART_EYESTALKS          (BIT_M)
#define PART_TENTACLES          (BIT_N)
#define PART_FINS               (BIT_O)
#define PART_WINGS              (BIT_P)
#define PART_TAIL               (BIT_Q)
/* for combat */
#define PART_CLAWS              (BIT_U)
#define PART_FANGS              (BIT_V)
#define PART_HORNS              (BIT_W)
#define PART_SCALES             (BIT_X)
#define PART_TUSKS		(BIT_Y)

/*
 * Bits for 'affected_by'.
 * Used in #MOBILES.
 */
#define AFF_BLIND		(BIT_A)
#define AFF_INVISIBLE		(BIT_B)
#define AFF_DETECT_EVIL		(BIT_C)
#define AFF_DETECT_INVIS	(BIT_D)
#define AFF_DETECT_MAGIC	(BIT_E)
#define AFF_DETECT_HIDDEN	(BIT_F)
#define AFF_DETECT_GOOD		(BIT_G)
#define AFF_SANCTUARY		(BIT_H)
#define AFF_FAERIE_FIRE		(BIT_I)
#define AFF_INFRARED		(BIT_J)
#define AFF_CURSE		(BIT_K)
#define AFF_UNUSED_FLAG		(BIT_L)	/* unused */
#define AFF_POISON		(BIT_M)
#define AFF_PROTECT_EVIL	(BIT_N)
#define AFF_PROTECT_GOOD	(BIT_O)
#define AFF_SNEAK		(BIT_P)
#define AFF_HIDE		(BIT_Q)
#define AFF_SLEEP		(BIT_R)
#define AFF_CHARM		(BIT_S)
#define AFF_FLYING		(BIT_T)
#define AFF_PASS_DOOR		(BIT_U)
#define AFF_HASTE		(BIT_V)
#define AFF_CALM		(BIT_W)
#define AFF_PLAGUE		(BIT_X)
#define AFF_WEAKEN		(BIT_Y)
#define AFF_DARK_VISION		(BIT_Z)
#define AFF_BERSERK		(BIT_a)
#define AFF_SWIM		(BIT_b)
#define AFF_REGENERATION        (BIT_c)
#define AFF_SLOW		(BIT_d)

/*
 * Sex.
 * Used in #MOBILES.
 */
#define SEX_NEUTRAL		      0
#define SEX_MALE		      1
#define SEX_FEMALE		      2

/* AC types */
#define AC_PIERCE			0
#define AC_BASH				1
#define AC_SLASH			2
#define AC_EXOTIC			3

/* dice */
#define DICE_NUMBER			0
#define DICE_TYPE			1
#define DICE_BONUS			2

/* size */
#define SIZE_TINY			0
#define SIZE_SMALL			1
#define SIZE_MEDIUM			2
#define SIZE_LARGE			3
#define SIZE_HUGE			4
#define SIZE_GIANT			5

/*
 * Well known object virtual numbers.
 * Defined in #OBJECTS.
 */
#define OBJ_VNUM_SILVER_ONE	      1
#define OBJ_VNUM_GOLD_ONE	      2
#define OBJ_VNUM_GOLD_SOME	      3
#define OBJ_VNUM_SILVER_SOME	      4
#define OBJ_VNUM_COINS		      5

#define OBJ_VNUM_CORPSE_NPC	     10
#define OBJ_VNUM_CORPSE_PC	     11
#define OBJ_VNUM_SEVERED_HEAD	     12
#define OBJ_VNUM_TORN_HEART	     13
#define OBJ_VNUM_SLICED_ARM	     14
#define OBJ_VNUM_SLICED_LEG	     15
#define OBJ_VNUM_GUTS		     16
#define OBJ_VNUM_BRAINS		     17

#define OBJ_VNUM_MUSHROOM	     20
#define OBJ_VNUM_LIGHT_BALL	     21
#define OBJ_VNUM_SPRING		     22
#define OBJ_VNUM_DISC		     23
#define OBJ_VNUM_PORTAL		     25

#define OBJ_VNUM_ROSE		   1001

#define OBJ_VNUM_PIT		   3010

#define OBJ_VNUM_SCHOOL_MACE	   3700
#define OBJ_VNUM_SCHOOL_DAGGER	   3701
#define OBJ_VNUM_SCHOOL_SWORD	   3702
#define OBJ_VNUM_SCHOOL_SPEAR	   3717
#define OBJ_VNUM_SCHOOL_STAFF	   3718
#define OBJ_VNUM_SCHOOL_AXE	   3719
#define OBJ_VNUM_SCHOOL_FLAIL	   3720
#define OBJ_VNUM_SCHOOL_WHIP	   3721
#define OBJ_VNUM_SCHOOL_POLEARM    3722

#define OBJ_VNUM_SCHOOL_VEST	   3703
#define OBJ_VNUM_SCHOOL_SHIELD	   3704
#define OBJ_VNUM_SCHOOL_BANNER     3716
#define OBJ_VNUM_MAP		   3162

#define OBJ_VNUM_WHISTLE	   2116

#define OBJ_VNUM_TRIVIA_PILL   200

#define QUEST_AURA      201
#define QUEST_SWORD     203
#define QUEST_BPLATE    204
#define QUEST_BOOTS     205
#define QUEST_GLOVES    206
#define QUEST_FLAME     207
#define QUEST_HELM      208
#define QUEST_BAG       209
#define QUEST_SHIELD    210
#define QUEST_REGEN     211
#define QUEST_INVIS     212
#define QUEST_TRIVIA    OBJ_VNUM_TRIVIA_PILL

/*
 * Item types.
 * Used in #OBJECTS.
 */
#define ITEM_LIGHT		      1
#define ITEM_SCROLL		      2
#define ITEM_WAND		      3
#define ITEM_STAFF		      4
#define ITEM_WEAPON		      5
#define ITEM_TREASURE		      8
#define ITEM_ARMOR		      9
#define ITEM_POTION		     10
#define ITEM_CLOTHING		     11
#define ITEM_FURNITURE		     12
#define ITEM_TRASH		     13
#define ITEM_CONTAINER		     15
#define ITEM_DRINK_CON		     17
#define ITEM_KEY		     18
#define ITEM_FOOD		     19
#define ITEM_MONEY		     20
#define ITEM_BOAT		     22
#define ITEM_CORPSE_NPC		     23
#define ITEM_CORPSE_PC		     24
#define ITEM_FOUNTAIN		     25
#define ITEM_PILL		     26
#define ITEM_PROTECT		     27
#define ITEM_MAP		     28
#define ITEM_PORTAL		     29
#define ITEM_WARP_STONE		     30
#define ITEM_ROOM_KEY		     31
#define ITEM_GEM		     32
#define ITEM_JEWELRY		     33
#define ITEM_JUKEBOX		     34

/*
 * Extra flags.
 * Used in #OBJECTS.
 */
#define ITEM_GLOW		(BIT_A)
#define ITEM_HUM		(BIT_B)
#define ITEM_DARK		(BIT_C)
#define ITEM_LOCK		(BIT_D)
#define ITEM_EVIL		(BIT_E)
#define ITEM_INVIS		(BIT_F)
#define ITEM_MAGIC		(BIT_G)
#define ITEM_NODROP		(BIT_H)
#define ITEM_BLESS		(BIT_I)
#define ITEM_ANTI_GOOD		(BIT_J)
#define ITEM_ANTI_EVIL		(BIT_K)
#define ITEM_ANTI_NEUTRAL	(BIT_L)
#define ITEM_NOREMOVE		(BIT_M)
#define ITEM_INVENTORY		(BIT_N)
#define ITEM_NOPURGE		(BIT_O)
#define ITEM_ROT_DEATH		(BIT_P)
#define ITEM_VIS_DEATH		(BIT_Q)
#define ITEM_AUCTIONED      (BIT_R)
#define ITEM_NONMETAL		(BIT_S)
#define ITEM_NOLOCATE		(BIT_T)
#define ITEM_MELT_DROP		(BIT_U)
#define ITEM_HAD_TIMER		(BIT_V)
#define ITEM_SELL_EXTRACT	(BIT_W)
#define ITEM_BURN_PROOF		(BIT_Y)
#define ITEM_NOUNCURSE		(BIT_Z)
#define ITEM_QUEST          (BIT_a)

/*
 * Wear flags.
 * Used in #OBJECTS.
 */
#define ITEM_TAKE		(BIT_A)
#define ITEM_WEAR_FINGER	(BIT_B)
#define ITEM_WEAR_NECK		(BIT_C)
#define ITEM_WEAR_BODY		(BIT_D)
#define ITEM_WEAR_HEAD		(BIT_E)
#define ITEM_WEAR_LEGS		(BIT_F)
#define ITEM_WEAR_FEET		(BIT_G)
#define ITEM_WEAR_HANDS		(BIT_H)
#define ITEM_WEAR_ARMS		(BIT_I)
#define ITEM_WEAR_SHIELD	(BIT_J)
#define ITEM_WEAR_ABOUT		(BIT_K)
#define ITEM_WEAR_WAIST		(BIT_L)
#define ITEM_WEAR_WRIST		(BIT_M)
#define ITEM_WIELD		(BIT_N)
#define ITEM_HOLD		(BIT_O)
#define ITEM_NO_SAC		(BIT_P)
#define ITEM_WEAR_FLOAT		(BIT_Q)

/* weapon class */
#define WEAPON_EXOTIC		0
#define WEAPON_SWORD		1
#define WEAPON_DAGGER		2
#define WEAPON_SPEAR		3
#define WEAPON_MACE		4
#define WEAPON_AXE		5
#define WEAPON_FLAIL		6
#define WEAPON_WHIP		7
#define WEAPON_POLEARM		8

/* weapon types */
#define WEAPON_FLAMING		(BIT_A)
#define WEAPON_FROST		(BIT_B)
#define WEAPON_VAMPIRIC		(BIT_C)
#define WEAPON_SHARP		(BIT_D)
#define WEAPON_VORPAL		(BIT_E)
#define WEAPON_TWO_HANDS	(BIT_F)
#define WEAPON_SHOCKING		(BIT_G)
#define WEAPON_POISON		(BIT_H)

/* gate flags */
#define GATE_NORMAL_EXIT	(BIT_A)
#define GATE_NOCURSE		(BIT_B)
#define GATE_GOWITH		(BIT_C)
#define GATE_BUGGY		(BIT_D)
#define GATE_RANDOM		(BIT_E)

/* furniture flags */
#define STAND_AT		(BIT_A)
#define STAND_ON		(BIT_B)
#define STAND_IN		(BIT_C)
#define SIT_AT			(BIT_D)
#define SIT_ON			(BIT_E)
#define SIT_IN			(BIT_F)
#define REST_AT			(BIT_G)
#define REST_ON			(BIT_H)
#define REST_IN			(BIT_I)
#define SLEEP_AT		(BIT_J)
#define SLEEP_ON		(BIT_K)
#define SLEEP_IN		(BIT_L)
#define PUT_AT			(BIT_M)
#define PUT_ON			(BIT_N)
#define PUT_IN			(BIT_O)
#define PUT_INSIDE		(BIT_P)

/*
 * Apply types (for affects).
 * Used in #OBJECTS.
 */
#define APPLY_NONE		      0
#define APPLY_STR		      1
#define APPLY_DEX		      2
#define APPLY_INT		      3
#define APPLY_WIS		      4
#define APPLY_CON		      5
#define APPLY_SEX		      6
#define APPLY_CLASS		      7
#define APPLY_LEVEL		      8
#define APPLY_AGE		      9
#define APPLY_HEIGHT		     10
#define APPLY_WEIGHT		     11
#define APPLY_MANA		     12
#define APPLY_HIT		     13
#define APPLY_MOVE		     14
#define APPLY_GOLD		     15
#define APPLY_EXP		     16
#define APPLY_AC		     17
#define APPLY_HITROLL		     18
#define APPLY_DAMROLL		     19
#define APPLY_SAVES		     20
#define APPLY_SAVING_PARA	     20
#define APPLY_SAVING_ROD	     21
#define APPLY_SAVING_PETRI	     22
#define APPLY_SAVING_BREATH	     23
#define APPLY_SAVING_SPELL	     24
#define APPLY_SPELL_AFFECT	     25

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

/*
 * Well known room virtual numbers.
 * Defined in #ROOMS.
 */
#define ROOM_VNUM_LIMBO		      2
#define ROOM_VNUM_CHAT		   1200
#define ROOM_VNUM_TEMPLE	   3001
#define ROOM_VNUM_ALTAR		   3054
#define ROOM_VNUM_SCHOOL	   3700
#define ROOM_VNUM_WAITROOM     17600
#define ROOM_VNUM_MORGUE       2
#define ROOM_VNUM_DUEL_START   17596
#define ROOM_VNUM_DUEL_END     17597
#define ROOM_VNUM_DUEL_WINNER  17598
#define ROOM_VNUM_DUEL_LOSER   17599

/*
 * Room flags.
 * Used in #ROOMS.
 */
#define ROOM_DARK		(BIT_A)
#define    HOME_ENTRANCE           (BIT_B)
#define ROOM_NO_MOB		(BIT_C)
#define ROOM_INDOORS		(BIT_D)
#define	ROOM_ARENA       (BIT_E)
#define ROOM_BANK        (BIT_F)
#define ROOM_PRIVATE		(BIT_J)
#define ROOM_SAFE		(BIT_K)
#define ROOM_SOLITARY		(BIT_L)
#define ROOM_PET_SHOP		(BIT_M)
#define ROOM_NO_RECALL		(BIT_N)
#define ROOM_IMP_ONLY		(BIT_O)
#define ROOM_GODS_ONLY		(BIT_P)
#define ROOM_HEROES_ONLY	(BIT_Q)
#define ROOM_NEWBIES_ONLY	(BIT_R)
#define ROOM_LAW		(BIT_S)
#define ROOM_NOWHERE		(BIT_T)
#define ROOM_NOEXPLORE            (BIT_U)
#define ROOM_NOAUTOMAP          (BIT_V)

/*
 * Directions.
 * Used in #ROOMS.
 */
#define DIR_NORTH		      0
#define DIR_EAST		      1
#define DIR_SOUTH		      2
#define DIR_WEST		      3
#define DIR_UP			      4
#define DIR_DOWN		      5

/*
 * Exit flags.
 * Used in #ROOMS.
 */
#define EX_ISDOOR		      (BIT_A)
#define EX_CLOSED		      (BIT_B)
#define EX_LOCKED		      (BIT_C)
#define EX_PICKPROOF		      (BIT_F)
#define EX_NOPASS		      (BIT_G)
#define EX_EASY			      (BIT_H)
#define EX_HARD			      (BIT_I)
#define EX_INFURIATING		      (BIT_J)
#define EX_NOCLOSE		      (BIT_K)
#define EX_NOLOCK		      (BIT_L)

/*
 * Sector types.
 * Used in #ROOMS.
 */
#define SECT_INSIDE		      0
#define SECT_CITY		      1
#define SECT_FIELD		      2
#define SECT_FOREST		      3
#define SECT_HILLS		      4
#define SECT_MOUNTAIN		      5
#define SECT_WATER_SWIM		      6
#define SECT_WATER_NOSWIM	      7
#define SECT_UNUSED		      8
#define SECT_AIR		      9
#define SECT_DESERT		     10
#define SECT_MAX		     11

/*
 * Equpiment wear locations.
 * Used in #RESETS.
 */
#define WEAR_NONE		     -1
#define WEAR_LIGHT		      0
#define WEAR_FINGER_L		      1
#define WEAR_FINGER_R		      2
#define WEAR_NECK_1		      3
#define WEAR_NECK_2		      4
#define WEAR_BODY		      5
#define WEAR_HEAD		      6
#define WEAR_LEGS		      7
#define WEAR_FEET		      8
#define WEAR_HANDS		      9
#define WEAR_ARMS		     10
#define WEAR_SHIELD		     11
#define WEAR_ABOUT		     12
#define WEAR_WAIST		     13
#define WEAR_WRIST_L		     14
#define WEAR_WRIST_R		     15
#define WEAR_WIELD		     16
#define WEAR_HOLD		     17
#define WEAR_FLOAT		     18
#define WEAR_SECONDARY               19
#define MAX_WEAR                     20

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

/*
 * Conditions.
 */
#define COND_DRUNK		      0
#define COND_FULL		      1
#define COND_THIRST		      2
#define COND_HUNGER		      3

/*
 * Positions.
 */
#define POS_DEAD		      0
#define POS_MORTAL		      1
#define POS_INCAP		      2
#define POS_STUNNED		      3
#define POS_SLEEPING		      4
#define POS_RESTING		      5
#define POS_SITTING		      6
#define POS_FIGHTING		      7
#define POS_STANDING		      8

/*
 * ACT bits for players.
 */
#define PLR_IS_NPC		    (BIT_A)	/* Don't EVER set.  */
#define    PLR_AUTOMAP             (BIT_B)
/* RT auto flags */
#define PLR_AUTOASSIST		(BIT_C)
#define PLR_AUTOEXIT		(BIT_D)
#define PLR_AUTOLOOT		(BIT_E)
#define PLR_AUTOSAC         (BIT_F)
#define PLR_AUTOGOLD		(BIT_G)
#define PLR_AUTOSPLIT		(BIT_H)
#define PLR_GQUEST          (BIT_I)
#define	PLR_WAR         (BIT_J)
#define PLR_AUTODAMAGE  (BIT_K)

/* Arena flags */
#define PLR_CHALLENGED  (BIT_L)
#define PLR_CHALLENGER  (BIT_M)

/* RT personal flags */
#define PLR_HOLYLIGHT		(BIT_N)
#define PLR_CANLOOT		    (BIT_P)
#define PLR_NOSUMMON		(BIT_Q)
#define PLR_NOFOLLOW		(BIT_R)
/* 2 bits reserved, S-T */

/* penalty flags */
#define PLR_PERMIT		(BIT_U)
#define PLR_LOG			(BIT_W)
#define PLR_DENY		(BIT_X)
#define PLR_FREEZE		(BIT_Y)
#define PLR_THIEF		(BIT_Z)
#define PLR_KILLER		(BIT_a)
#define PLR_QUESTOR     (BIT_b)
#define PLR_REMORT      (BIT_c)

/* RT comm flags -- may be used on both mobs and chars */
#define COMM_QUIET              (BIT_A)
#define COMM_DEAF            	(BIT_B)
#define COMM_NOWIZ              (BIT_C)
#define COMM_NOAUCTION          (BIT_D)
#define COMM_NOGOSSIP           (BIT_E)
#define COMM_NOQUESTION         (BIT_F)
#define COMM_NOMUSIC            (BIT_G)
#define COMM_NOCLAN		        (BIT_H)
#define COMM_NOQUOTE		    (BIT_I)
#define COMM_SHOUTSOFF		    (BIT_J)

#define COMM_NOCOLOUR           (BIT_K)

/* display flags */
#define COMM_COMPACT		(BIT_L)
#define COMM_BRIEF		    (BIT_M)
#define COMM_PROMPT		    (BIT_N)
#define COMM_COMBINE		(BIT_O)
#define COMM_TELNET_GA		(BIT_P)
#define COMM_SHOW_AFFECTS	(BIT_Q)
#define COMM_NOGRATS		(BIT_R)
#define COMM_TELNET_EOR	    (BIT_S)	/* End Of Record - from telnet negotiation */

/* penalties */
#define COMM_NOEMOTE		(BIT_T)
#define COMM_NOSHOUT		(BIT_U)
#define COMM_NOTELL		    (BIT_V)
#define COMM_NOCHANNELS		(BIT_W)
#define COMM_SNOOP_PROOF	(BIT_Y)
#define COMM_AFK		    (BIT_Z)
#define COMM_NOGOCIAL       (BIT_a)
#define COMM_NOOOC          (BIT_b)
#define    COMM_NOBUDDY            (BIT_c)

/* WIZnet flags */
#define WIZ_ON			(BIT_A)
#define WIZ_TICKS		(BIT_B)
#define WIZ_LOGINS		(BIT_C)
#define WIZ_SITES		(BIT_D)
#define WIZ_LINKS		(BIT_E)
#define WIZ_DEATHS		(BIT_F)
#define WIZ_RESETS		(BIT_G)
#define WIZ_MOBDEATHS		(BIT_H)
#define WIZ_FLAGS		(BIT_I)
#define WIZ_PENALTIES		(BIT_J)
#define WIZ_SACCING		(BIT_K)
#define WIZ_LEVELS		(BIT_L)
#define WIZ_SECURE		(BIT_M)
#define WIZ_SWITCHES		(BIT_N)
#define WIZ_SNOOPS		(BIT_O)
#define WIZ_RESTORE		(BIT_P)
#define WIZ_LOAD		(BIT_Q)
#define WIZ_NEWBIE		(BIT_R)
#define WIZ_PREFIX		(BIT_S)
#define WIZ_SPAM		(BIT_T)
#define WIZ_BUGS        (BIT_U)

#define	WAR_OFF     0
#define	WAR_WAITING 1
#define	WAR_RUNNING 2

struct war_data
{
	const char *who;
	int min_level;
	int max_level;
	int inwar;
	int wartype;
	int timer;
	int iswar;
	int next;
};

struct wpwd_data
{
	WPWD_DATA *next;
	WPWD_DATA *prev;
	bool valid;
	const char *name;
	const char *passw;
};

#define INFO_ALL        (BIT_A)
#define INFO_QUIET      (BIT_B)
#define INFO_LOGIN      (BIT_C)
#define INFO_LOGOUT     (BIT_D)
#define INFO_DEATH      (BIT_E)
#define INFO_NOTE       (BIT_F)
#define INFO_LEVEL      (BIT_G)
#define INFO_PRIVATE    (BIT_H)
#define INFO_WAR        (BIT_I)
#define INFO_GQUEST     (BIT_J)
#define INFO_AUCTION    (BIT_K)
#define INFO_ARENA      (BIT_L)

/*
 * Prototype for a mob.
 * This is the in-memory version of #MOBILES.
 */
struct mob_index_data
{
	MOB_INDEX_DATA *next;
	SPEC_FUN *spec_fun;
	SHOP_DATA *pShop;
	PROG_LIST *first_mprog;
	PROG_LIST *last_mprog;
	AREA_DATA *area;			/* OLC */
	vnum_t vnum;
	vnum_t group;
	bool new_format;
	int count;
	int killed;
	const char *player_name;
	const char *short_descr;
	const char *long_descr;
	const char *description;
	flag_t act;
	flag_t affected_by;
	int alignment;
	int level;
	int hitroll;
	int hit[3];
	int mana[3];
	int damage[3];
	int ac[4];
	int dam_type;
	flag_t off_flags;
	flag_t imm_flags;
	flag_t res_flags;
	flag_t vuln_flags;
	int start_pos;
	int default_pos;
	int sex;
	RACE_DATA *race;
	long wealth;
	flag_t form;
	flag_t parts;
	int size;
	const char *material;
	flag_t mprog_flags;
};

/* memory settings */
#define MEM_CUSTOMER	A
#define MEM_SELLER	B
#define MEM_HOSTILE	C
#define MEM_AFRAID	D

/* memory for mobs */
struct mem_data
{
	MEM_DATA *next;
	MEM_DATA *prev;
	bool valid;
	int id;
	int reaction;
	time_t when;
};

#define PK_KILLS         0
#define MOB_KILLS        1
#define PK_DEATHS        2
#define MOB_DEATHS       3
#define MAX_GAMESTAT     4

struct stat_data
{
	STAT_DATA *next;
	STAT_DATA *prev;
	bool valid;
	const char *name;			// name of character
	long gamestat[MAX_GAMESTAT];	// stat data
};

struct mbr_data
{
	MBR_DATA *next;
	MBR_DATA *prev;
	bool valid;
	const char *name;
	int rank;
	CLAN_DATA *clan;
	int level;
};

/*
 * One character (PC or NPC).
 */
struct char_data
{
	CHAR_DATA *next;
	CHAR_DATA *prev;
	CHAR_DATA *next_player;
	CHAR_DATA *prev_player;
	CHAR_DATA *next_in_room;
	CHAR_DATA *prev_in_room;
	CHAR_DATA *master;
	CHAR_DATA *leader;
	CHAR_DATA *fighting;
	CHAR_DATA *reply;
	CHAR_DATA *pet;
	CHAR_DATA *mprog_target;
	MEM_DATA *memory;
	SPEC_FUN *spec_fun;
	MOB_INDEX_DATA *pIndexData;
	DESCRIPTOR_DATA *desc;
	AFFECT_DATA *first_affect;
	AFFECT_DATA *last_affect;
	OBJ_DATA *first_carrying;
	OBJ_DATA *last_carrying;
	OBJ_DATA *on;
	ROOM_INDEX_DATA *in_room;
	ROOM_INDEX_DATA *was_in_room;
	AREA_DATA *zone;
	PC_DATA *pcdata;
	GEN_DATA *gen_data;
	CHAR_DATA *hunting;
	bool valid;
	const char *name;
	long id;
	int version;
	const char *short_descr;
	const char *long_descr;
	const char *description;
	const char *prompt;
	const char *prefix;
	int group;
	CLAN_DATA *clan;
	int sex;
	int rank;
	CLAN_DATA *invited;
	int Class[MAX_MCLASS];
	RACE_DATA *race;
	int level;
	DEITY_DATA *deity;
	int trust;
	int played;
	int lines;					/* for the pager */
	time_t logon;
	int timer;
	int wait;
	int daze;
	long hit;
	long max_hit;
	long mana;
	long max_mana;
	long move;
	long max_move;
	long gold;
	long silver;
	int exp;
	flag_t act;
	flag_t comm;				/* RT added to pad the vector */
	flag_t wiznet;				/* wiz stuff */
	flag_t imm_flags;
	flag_t res_flags;
	flag_t vuln_flags;
	int invis_level;
	int incog_level;
	flag_t affected_by;
	int position;
	int practice;
	int train;
	int carry_weight;
	int carry_number;
	int saving_throw;
	int alignment;
	int hitroll;
	int damroll;
	int armor[4];
	int wimpy;
	/* stats */
	int perm_stat[MAX_STATS];
	int mod_stat[MAX_STATS];
	/* parts stuff */
	flag_t form;
	flag_t parts;
	int size;
	const char *material;
	/* mobile stuff */
	flag_t off_flags;
	int damage[3];
	int dam_type;
	int start_pos;
	int default_pos;
	flag_t info_settings;

	int mprog_delay;
};

/* Arena Defines */
#define FIGHT_OPEN 0
#define FIGHT_START 1
#define FIGHT_BUSY 2
#define FIGHT_LOCK 3

#define LAST_PAGE_LENGTH    20

#define LAST_NONE        -1
#define LAST_IMMTALK    0
#define LAST_GOSSIP        1
#define LAST_QA            2
#define LAST_MUSIC        3
#define LAST_CLANTALK    4
#define LAST_QUOTE        5
#define LAST_GRATS        6
#define LAST_BTALK        7
#define LAST_OOC          8
#define LAST_MAX        9

#define CHANNEL_NORMAL 0
#define CHANNEL_SOCIAL 1
#define CHANNEL_EMOTE  2

/*
 * Data which only PC's have.
 */
struct pc_data
{
	PC_DATA *next;
	PC_DATA *prev;
	BUFFER *buffer;
	CHAR_DATA *challenger;
	CHAR_DATA *challenged;
	CHAR_DATA *gladiator;
	bool valid;
	const char *pwd;
	const char *bamfin;
	const char *bamfout;
	const char *title;
	const char *who_descr;
	long perm_hit;
	long perm_mana;
	long perm_move;
	int true_sex;
	int last_level;
	int condition[4];
	int *learned;
	bool *group_known;
	int points;
	bool confirm_delete;
	BOARD_DATA *board;			/* The current board        */
	time_t last_note[MAX_BOARD];	/* last note for the boards */
	NOTE_DATA *in_progress;
	const char *alias[MAX_ALIAS];
	const char *alias_sub[MAX_ALIAS];
	int security;				/* OLC *//* Builder security */
	int colour[MAX_CUSTOM_COLOUR];
	long gamestat[MAX_GAMESTAT];
	int nextquest;
	int countdown;
	vnum_t questobj;
	vnum_t questmob;
	vnum_t questgiver;
	vnum_t questloc;
	int questpoints;
	int trivia;
	bool confirm_remort;
	bool stay_race;
	vnum_t gq_mobs[MAX_GQUEST_MOB];
	char explored[MAX_EXPLORE_HASH];
	bool still_in_war;
	long home_invite;
	vnum_t home[MAX_HOUSE_ROOMS];
	vnum_t home_key;
	int awins;
	int alosses;
	int plr_wager;
	long gold_bank;
	long silver_bank;
	int shares;
	const char *webpass;
	char str_ed_key;
	const char *buddies[MAX_BUDDY];
	const char *history[LAST_MAX][LAST_PAGE_LENGTH];
};

/* Data for generating characters -- only used during generation */
struct gen_data
{
	GEN_DATA *next;
	GEN_DATA *prev;
	bool valid;
	bool *skill_chosen;
	bool *group_chosen;
	int points_chosen;
};

/*
 * Liquids.
 */
#define LIQ_WATER        0

struct liq_type
{
	const char *liq_name;
	const char *liq_color;
	int liq_affect[5];
};

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

/*
 * Prototype for an object.
 */
struct obj_index_data
{
	OBJ_INDEX_DATA *next;
	EXTRA_DESCR_DATA *first_extra_descr;
	EXTRA_DESCR_DATA *last_extra_descr;
	AFFECT_DATA *first_affect;
	AFFECT_DATA *last_affect;
	PROG_LIST *first_oprog;
	PROG_LIST *last_oprog;
	AREA_DATA *area;			/* OLC */
	bool new_format;
	const char *name;
	const char *short_descr;
	const char *description;
	vnum_t vnum;
	int reset_num;
	const char *material;
	int item_type;
	flag_t extra_flags;
	flag_t wear_flags;
	int level;
	int condition;
	int count;
	int weight;
	int cost;
	long value[5];
	flag_t oprog_flags;
};

/*
 * 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;
	OBJ_DATA *on;
	CHAR_DATA *carried_by;
	EXTRA_DESCR_DATA *first_extra_descr;
	EXTRA_DESCR_DATA *last_extra_descr;
	AFFECT_DATA *first_affect;
	AFFECT_DATA *last_affect;
	OBJ_INDEX_DATA *pIndexData;
	ROOM_INDEX_DATA *in_room;
	CHAR_DATA *oprog_target;
	int oprog_delay;
	bool valid;
	bool enchanted;
	const char *owner;
	const char *name;
	const char *short_descr;
	const char *description;
	int item_type;
	flag_t extra_flags;
	flag_t wear_flags;
	int wear_loc;
	int weight;
	int cost;
	int level;
	int condition;
	const char *material;
	int timer;
	long value[5];
};

/*
 * Exit data.
 */
struct exit_data
{
	union
	{
		ROOM_INDEX_DATA *to_room;
		vnum_t vnum;
	}
	u1;
	flag_t exit_info;
	vnum_t key;
	const char *keyword;
	const char *description;
	EXIT_DATA *next;
	EXIT_DATA *prev;			/* OLC */
	flag_t rs_flags;			/* OLC */
	int orig_door;				/* OLC */
};

/*
 * 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
 *   '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;
	vnum_t arg1;
	int arg2;
	vnum_t arg3;
	int arg4;
};

/*
 * Area definition.
 */
struct area_data
{
	AREA_DATA *next;
	AREA_DATA *prev;
	const char *file_name;
	const char *name;
	const char *credits;
	int age;
	int nplayer;
	int low_range;
	int high_range;
	vnum_t min_vnum;
	vnum_t max_vnum;
	bool empty;
	const char *builders;		/* OLC *//* Listing of */
	int vnum;					/* OLC *//* Area vnum  */
	flag_t area_flags;			/* OLC */
	int security;				/* OLC *//* Value 1-9  */
};

/*
 * Room type.
 */
struct room_index_data
{
	ROOM_INDEX_DATA *next;
	CHAR_DATA *first_person;
	CHAR_DATA *last_person;
	OBJ_DATA *first_content;
	OBJ_DATA *last_content;
	EXTRA_DESCR_DATA *first_extra_descr;
	EXTRA_DESCR_DATA *last_extra_descr;
	AREA_DATA *area;
	EXIT_DATA *exit[6];
	RESET_DATA *reset_first;	/* OLC */
	RESET_DATA *reset_last;		/* OLC */
	PROG_LIST *first_rprog;
	PROG_LIST *last_rprog;
	CHAR_DATA *rprog_target;
	flag_t rprog_flags;
	int rprog_delay;
	const char *name;
	const char *description;
	const char *owner;
	vnum_t vnum;
	flag_t room_flags;
	int light;
	int sector_type;
	int heal_rate;
	int mana_rate;
	CLAN_DATA *clan;
};

 /* one disabled command */
struct disabled_data
{
	DISABLED_DATA *next;
	DISABLED_DATA *prev;		/* pointer to next node */
	struct cmd_type const *command;	/* pointer to the command struct */
	const char *disabled_by;	/* name of disabler */
	int level;					/* level of disabler */
};

/*
 * Types of attacks.
 * Must be non-overlapping with spell/skill types,
 * but may be arbitrary beyond that.
 */
#define TYPE_UNDEFINED               -1
#define TYPE_HIT                     1000

/*
 *  Target types.
 */
#define TAR_IGNORE		    0
#define TAR_CHAR_OFFENSIVE	    1
#define TAR_CHAR_DEFENSIVE	    2
#define TAR_CHAR_SELF		    3
#define TAR_OBJ_INV		    4
#define TAR_OBJ_CHAR_DEF	    5
#define TAR_OBJ_CHAR_OFF	    6

#define TARGET_CHAR		    0
#define TARGET_OBJ		    1
#define TARGET_ROOM		    2
#define TARGET_NONE		    3

/*
 * Skills include spells as a particular case.
 */
struct skill_type
{
	const char *name;			/* Name of skill        */
	int *skill_level;			/* Level needed by class    */
	int *rating;				/* How hard it is to learn  */
	SPELL_FUN *spell_fun;		/* Spell pointer (for spells)   */
	int target;					/* Legal targets        */
	int minimum_position;		/* Position for caster / user   */
	int *pgsn;					/* Pointer to associated gsn    */
	int min_mana;				/* Minimum mana used        */
	int beats;					/* Waiting time after use   */
	const char *noun_damage;	/* Damage message       */
	const char *msg_off;		/* Wear off message     */
	const char *msg_obj;		/* Wear off message for obects  */
};

struct group_type
{
	const char *name;
	int *rating;
	const char *spells[MAX_IN_GROUP];
};

/*
 * MOBprog definitions
 */
#define TRIG_ACT	(BIT_A)
#define TRIG_BRIBE	(BIT_B)
#define TRIG_DEATH	(BIT_C)
#define TRIG_ENTRY	(BIT_D)
#define TRIG_FIGHT	(BIT_E)
#define TRIG_GIVE	(BIT_F)
#define TRIG_GREET	(BIT_G)
#define TRIG_GRALL	(BIT_H)
#define TRIG_KILL	(BIT_I)
#define TRIG_HPCNT	(BIT_J)
#define TRIG_RANDOM	(BIT_K)
#define TRIG_SPEECH	(BIT_L)
#define TRIG_EXIT	(BIT_M)
#define TRIG_EXALL	(BIT_N)
#define TRIG_DELAY	(BIT_O)
#define TRIG_SURR	(BIT_P)
#define TRIG_GET	(BIT_Q)
#define TRIG_DROP	(BIT_R)
#define TRIG_SIT	(BIT_S)

#define PRG_MPROG	0
#define PRG_OPROG	1
#define PRG_RPROG	2

struct prog_list
{
	flag_t trig_type;
	const char *trig_phrase;
	vnum_t vnum;
	const char *code;
	PROG_LIST *next;
	PROG_LIST *prev;
	bool valid;
};

struct prog_code
{
	vnum_t vnum;
	const char *code;
	PROG_CODE *next;
	PROG_CODE *prev;
};

#include "gsn.h"

/*
 * Utility macros.
 */
#define IS_VALID(data)		((data) != NULL && (data)->valid)
#define VALIDATE(data)		((data)->valid = TRUE)
#define INVALIDATE(data)	((data)->valid = FALSE)
#define	UMIN(a, b)              ((a) < (b) ? (a) : (b))
#define	UMAX(a, b)              ((a) > (b) ? (a) : (b))
#define	URANGE(a, b, c)         ((b) < (a) ? (a) : ((b) > (c) ? (c) : (b)))
#define	LOWER(c)                ((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c))
#define	UPPER(c)                ((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c))
#define IS_SET(flag, bit)	((flag) & (bit))
#define SET_BIT(var, bit)	((var) |= (bit))
#define REMOVE_BIT(var, bit)	((var) &= ~(bit))
#define IS_NULLSTR(str)		((str) == NULL || (str)[0] == '\0')
#define ENTRE(min,num,max)	( ((min) < (num)) && ((num) < (max)) )
#define	CHECK_POS(a, b, c)      {                                                       \
	(a) = (b);                                  \
	if ( (a) < 0 )                                      \
					bug( "CHECK_POS : " c " == %d < 0", a );	\
				}

#define UNLINK_SINGLE(pdata,pnext,type,list) \
do                                          \
{                                          \
	if (list == pdata)                      \
	{                                       \
		list = pdata->pnext;                 \
	}                                       \
	else                                    \
	{                                       \
		type *prev;                         \
		for (prev = list; prev != NULL; prev = prev->pnext) \
		{                                   \
			if (prev->pnext == pdata)        \
			{                               \
				prev->pnext = pdata->pnext;   \
				break;                      \
			}                               \
		}                                   \
		if (prev == NULL)                   \
		{                                   \
			bugf (#pdata " not found in " #list "."); \
		}                                   \
	}                                       \
} while(0)

#define LINK_SINGLE(pdata,pnext,list) \
do \
{ \
		pdata->pnext = list; \
		list = pdata; \
} \
while (0)

#define LINK_LAST(pdata,pnext,type,list) \
do \
{ \
    type *tmp; \
    if((tmp = list) == NULL) \
    { \
		pdata->pnext = list; \
		list = pdata; \
        break; \
    } \
    for(; tmp; tmp = tmp->pnext) \
    { \
        if(!tmp->pnext) \
        { \
            tmp->pnext = pdata; \
            pdata->pnext = NULL; \
            break; \
        } \
    } \
} \
while (0)

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

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

#define replace_string(astr, bstr)  do{ free_string(astr); astr = str_dup(bstr); }while(0)

#define IS_STRSET(str)  ((str == NULL || str[0] == '\0') ? "Not set." : str)

/*
 * Character macros.
 */
#define IS_NPC(ch)		(IS_SET((ch)->act, ACT_IS_NPC))
#define IS_IMMORTAL(ch)		(get_trust(ch) >= LEVEL_IMMORTAL)
#define IS_HERO(ch)		(get_trust(ch) >= LEVEL_HERO)
#define IS_TRUSTED(ch,level)	(get_trust((ch)) >= (level))
#define IS_AFFECTED(ch, sn)	(IS_SET((ch)->affected_by, (sn)))

#define GET_AGE(ch)		((int) (17 + ((ch)->played \
				    + current_time - (ch)->logon )/72000))

#define IS_GOOD(ch)		(ch->alignment >= 350)
#define IS_EVIL(ch)		(ch->alignment <= -350)
#define IS_NEUTRAL(ch)		(!IS_GOOD(ch) && !IS_EVIL(ch))

#define IS_AWAKE(ch)		(ch->position > POS_SLEEPING)
#define GET_AC(ch,type)		((ch)->armor[type]			    \
		        + ( IS_AWAKE(ch)			    \
			? dex_app[get_curr_stat(ch,STAT_DEX)].defensive : 0 ))
#define GET_HITROLL(ch)	\
		((ch)->hitroll+str_app[get_curr_stat(ch,STAT_STR)].tohit)
#define GET_DAMROLL(ch) \
		((ch)->damroll+str_app[get_curr_stat(ch,STAT_STR)].todam)

#define IS_OUTSIDE(ch)		(!IS_SET(				    \
				    (ch)->in_room->room_flags,		    \
				    ROOM_INDOORS))
#define IS_IN_WAR(ch)   (!IS_NPC(ch) && IS_SET((ch)->act, PLR_WAR) \
                        && IS_SET((ch)->in_room->room_flags, ROOM_ARENA))

#define WAIT_STATE(ch, npulse)	((ch)->wait = UMAX((ch)->wait, (npulse)))
#define DAZE_STATE(ch, npulse)  ((ch)->daze = UMAX((ch)->daze, (npulse)))
#define get_carry_weight(ch)	((ch)->carry_weight + (ch)->silver/10 +  \
						      (ch)->gold * 2 / 5)

#define act(format,ch,arg1,arg2,type)\
	act_new((format),(ch),(arg1),(arg2),(type),POS_RESTING)

#define HAS_TRIGGER_MOB(ch,trig)	(IS_SET((ch)->pIndexData->mprog_flags,(trig)))
#define HAS_TRIGGER_OBJ(obj,trig) (IS_SET((obj)->pIndexData->oprog_flags,(trig)))
#define HAS_TRIGGER_ROOM(room,trig) (IS_SET((room)->rprog_flags,(trig)))

#define IS_SWITCHED( ch )       ( ch->desc && ch->desc->original )
#define IS_BUILDER(ch, Area)	( !IS_NPC(ch) && !IS_SWITCHED( ch ) &&	  \
				( ch->pcdata->security >= Area->security  \
				|| strstr( Area->builders, ch->name )	  \
				|| strstr( Area->builders, "All" ) ) )

#define DESC_FLAGGED(d, flag) (IS_SET((d)->d_flags, (flag)))

#define CH(descriptor)  ((descriptor)->original ? \
(descriptor)->original : (descriptor)->character)

#define IS_REMORT(ch)      (!IS_NPC(ch) && ( IS_SET((ch)->act, PLR_REMORT) \
                                || number_classes(ch) > 1))

#define	ON_GQUEST(ch)      (!IS_NPC(ch) && IS_SET((ch)->act, PLR_GQUEST) && gquest_info.running != GQUEST_OFF)

#define STR_EDIT_KEY(ch) (IS_NPC(ch) ? '.' : ch->pcdata->str_ed_key)

/*
 * Object macros.
 */
#define CAN_WEAR(obj, part)	(IS_SET((obj)->wear_flags,  (part)))
#define IS_OBJ_STAT(obj, stat)	(IS_SET((obj)->extra_flags, (stat)))
#define IS_WEAPON_STAT(obj,stat)(IS_SET((obj)->value[4],(stat)))
#define WEIGHT_MULT(obj)	((obj)->item_type == ITEM_CONTAINER ? \
	(obj)->value[4] : 100)

#define	IS_QUESTOR(ch)     (!IS_NPC(ch) && IS_SET((ch)->act, PLR_QUESTOR) && \
							(ch)->pcdata->questgiver != 0 )

/*
 * Description macros.
 */
#define PERS(ch, looker)	( can_see( looker, (ch) ) ?		\
				( IS_NPC(ch) ? (ch)->short_descr	\
				: (ch)->name ) : IS_IMMORTAL(ch) ? "an Immortal" : "someone" )

/*
 * Structure for a social in the socials table.
 */
struct social_type
{
	const char *name;
	const char *char_no_arg;
	const char *others_no_arg;
	const char *char_found;
	const char *others_found;
	const char *vict_found;
	const char *char_not_found;
	const char *char_auto;
	const char *others_auto;
	SOCIAL_DATA *next, *prev, *next_hash;
	bool valid;
};

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

extern const struct weapon_type weapon_table[];
extern const struct item_type item_table[];
extern const struct wiznet_type wiznet_table[];
extern const struct attack_type attack_table[];
extern const struct spec_type spec_table[];
extern const struct liq_type liq_table[];

/*
 * Global variables.
 */
#include "globals.h"

/*
 * 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)
#else
#include <crypt.h>
#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 GOD_DIR         "../gods/"	/* list of gods */
#define DATA_DIR        "../data/"
#define TEMP_FILE	"../player/romtmp"
#if !defined(WIN32)
#define NULL_FILE	"/dev/null"	/* To reserve one stream */
#else
#define NULL_FILE   "NUL"
#define WIN32_DIR   "../win32/"
#endif

#define AREA_LIST       "area.lst"	/* List of areas */
#define BUG_FILE        "bugs.txt"	/* For 'bug' and bug() */
#define TYPO_FILE       "typos.txt"	/* For 'typo' */
#define SHUTDOWN_FILE   "shutdown.txt"	/* For 'shutdown' */
#define HELP_FILE       "help.are"
#define BAN_FILE	    DATA_DIR "ban.dat"
#define MUSIC_FILE	    DATA_DIR "music.dat"
#define DISABLED_FILE	DATA_DIR "disabled.dat"	/* disabled commands */
#define STAT_FILE       DATA_DIR "statlist.dat"
#define	GQUEST_FILE		DATA_DIR "gquest.dat"
#define CLAN_FILE       DATA_DIR "clans.dat"
#define COMMAND_FILE    DATA_DIR "commands.dat"
#define SKILL_FILE      DATA_DIR "skills.dat"
#define GROUP_FILE      DATA_DIR "groups.dat"
#define RACE_FILE       DATA_DIR "races.dat"
#define CLASS_FILE      DATA_DIR "classes.dat"
#define SOCIAL_FILE     DATA_DIR "social.dat"
#define CORPSE_FILE     DATA_DIR "corpses.dat"
#define PIT_FILE        DATA_DIR "pit.dat"
#define BANK_FILE       DATA_DIR "bank.dat"
#define DEITY_FILE      DATA_DIR "deity.dat"
#define WPWD_FILE       DATA_DIR "webpass.dat"
#define MBR_FILE        DATA_DIR "mbr.dat"

#include "proto.h"

/*****************************************************************************
 *                                    OLC                                    *
 *****************************************************************************/

/*
 * Object defined in limbo.are
 * Used in save.c to load objects that don't exist.
 */
#define OBJ_VNUM_DUMMY	30

/*
 * Area flags.
 */
#define         AREA_NONE       0
#define         AREA_CHANGED    (BIT_A)	/* Area has been modified. */
#define         AREA_ADDED      (BIT_B)	/* Area has been added to. */
#define         AREA_LOADING    (BIT_C)	/* Used for counting in db.c */
#define    AREA_PLAYER_HOMES           (BIT_D)
#define    AREA_CLOSED                 (BIT_E)

#define MAX_DIR	6

/*
 * Global Constants
 */
extern char *const dir_name[];
extern const int rev_dir[];		/* int - ROM OLC */

/*
 * Global variables
 */
extern AREA_DATA *area_first;
extern AREA_DATA *area_last;

extern int top_affect;
extern int top_area;
extern int top_ed;
extern int top_exit;
extern int top_help;
extern int top_mob_index;
extern int top_obj_index;
extern int top_reset;
extern int top_room;
extern int top_explored;
extern int top_shop;

extern vnum_t top_vnum_mob;
extern vnum_t top_vnum_obj;
extern vnum_t top_vnum_room;

extern MOB_INDEX_DATA *mob_index_hash[MAX_KEY_HASH];
extern OBJ_INDEX_DATA *obj_index_hash[MAX_KEY_HASH];
extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH];

extern CORPSE_DATA *corpse_first;
extern CORPSE_DATA *corpse_last;

#define STRING_END      2
#define STRING_FOUND    1
#define STRING_NONE     0

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

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

#define free_mem(point)                                                         \
do                                                                                \
{                                                                                \
  if (!(point))                                                                    \
  {                                                                                \
    bugf("Freeing null pointer %s:%d", __FILE__, __LINE__ );               \
  }                                                                                \
  else free((void *)point);                                                                \
  point = NULL;                                                                    \
} while(0)

#endif