/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik Strfeldt, Tom Madsen, and Katja Nyboe.    *
 *                                                                         *
 *  Merc Diku Mud improvments 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          *
 *  benefitting.  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                       *
 ***************************************************************************/


#include "vnum.h"

/*
 * Accommodate old non-Ansi compilers.
 */
#if defined(TRADITIONAL)
#define DECLARE_OBJ_FUN( fun )		void fun( )
#define DECLARE_ROOM_FUN( fun )		void fun( )
#define const
#define args( list )            ( )
#define DECLARE_DO_FUN( fun )        void fun( )
#define DECLARE_SPEC_FUN( fun )        bool fun( )
#define DECLARE_SPELL_FUN( fun )    void 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
#define DECLARE_OBJ_FUN( fun )		OBJ_FUN	  fun
#define DECLARE_ROOM_FUN( fun )		ROOM_FUN  fun
#endif

/* system calls */
int unlink();
int system();


/*
 * 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(_AIX)
#if    !defined(const)
#define const
#endif
typedef int                sh_int;
typedef int                bool;
#define unix
#else
typedef short   int            sh_int;
typedef unsigned char            bool;
#endif

/* ea */
#define MSL MAX_STRING_LENGTH
#define MIL MAX_INPUT_LENGTH
#define MAX_NESTED_LEVEL 12 /* Maximum nested if-else-endif's (stack size) */

/*
 * 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    help_area_data    HELP_AREA;
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    mprog_list        MPROG_LIST;
typedef struct    mprog_code        MPROG_CODE;
typedef struct  prog_list               	PROG_LIST;
typedef struct  prog_code               PROG_CODE;
typedef struct    colour_data       COLOUR_DATA;
typedef struct    disabled_data			DISABLED_DATA;
typedef struct  clan_type               CLAN_DATA;
typedef struct mprog_queue_type MPROG_QUEUE_DATA;
typedef struct proxy_table              PROXY_DATA;
/*
 * Function types.
 */
typedef void DO_FUN    	args( ( CHAR_DATA *ch, 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 void OBJ_FUN	args( ( OBJ_DATA *obj, char *argument ) );
typedef void ROOM_FUN	args( ( ROOM_INDEX_DATA *room, char *argument ) );


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

/* I am lazy :) */
#define MSL MAX_STRING_LENGTH
#define MIL MAX_INPUT_LENGTH

//Not as lazy as me :) (Xeric)
#define MCLT_1			( MAX_CLASS-7 )
#define MCLT_2			( MAX_CLASS-7 )
#define MCLT_3			( MAX_CLASS )
#define vhunger  ( victim->pcdata->condition[COND_HUNGER] )
#define vthirst  ( victim->pcdata->condition[COND_THIRST] )
#define vdrunk   ( victim->pcdata->condition[COND_DRUNK] )
/*
 * Game parameters.
 * Increase the max'es if you add more of something.
 * Adjust the pulse numbers to suit yourself.
 */
#define MAX_SOCIALS         340
#define MAX_SKILL          	335
#define MAX_GROUP           85
#define MAX_IN_GROUP        15
#define MAX_ALIAS           50
#define MAX_CLASS           26
#define MAX_PC_RACE         101
#define MAX_SPECIES         25
#define MAX_CLAN            100
#define MAX_RANK            6 /* guild.c */
#define MAX_DAMAGE_MESSAGE  48
#define MAX_LEVEL           110
#define LEVEL_HERO          (MAX_LEVEL - 9)
#define LEVEL_IMMORTAL      (MAX_LEVEL - 8)
#define MAX_GRANT            10

#define PULSE_PER_SECOND      4 
#define PULSE_VIOLENCE      ( 2 * PULSE_PER_SECOND)
#define PULSE_MOBILE        ( 4 * PULSE_PER_SECOND)
#define PULSE_MUSIC         ( 2 )
#define PULSE_TICK          ( 65 * PULSE_PER_SECOND)
#define PULSE_TICK2          ( 66 * PULSE_PER_SECOND)
#define PULSE_TICK3          ( 67 * PULSE_PER_SECOND)
#define PULSE_AREA          ( 120 * PULSE_PER_SECOND)
#define PULSE_UNDERWATER   (20 * PULSE_PER_SECOND)
#define PULSE_MPROG_QUEUE  (2)

#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 PROTECTOR           LEVEL_HERO

/*
 * ColoUr stuff v2.0, by Lope.
 */
#define CLEAR        	"\e[1;37m"        /* Resets Colour    */
#define C_RED        	"\e[0;31m"    /* Normal Colours    */
#define C_GREEN      	"\e[0;32m"
#define C_YELLOW    	"\e[0;33m"
#define C_BLUE        	"\e[0;34m"
#define C_MAGENTA    	"\e[0;35m"
#define C_CYAN        	"\e[0;36m"
#define C_WHITE        	"\e[0;37m"
#define C_D_GREY    	"\e[1;30m"      /* Light Colors        */
#define C_B_RED        	"\e[1;31m"
#define C_B_GREEN    	"\e[1;32m"
#define C_B_YELLOW    	"\e[1;33m"
#define C_B_BLUE    	"\e[1;34m"
#define C_B_MAGENTA    	"\e[1;35m"
#define C_B_CYAN    	"\e[1;36m"
#define C_B_WHITE    	"\e[1;37m"
#define RETURN      	"\n\r"

#define COLOUR_NONE    	7        /* White, hmm...    */
#define RED        		1        /* Normal Colours    */
#define GREEN        	2
#define YELLOW       	3
#define BLUE        	4
#define MAGENTA        	5
#define CYAN        	6
#define WHITE        	7
#define BLACK        	0

#define NORMAL        	0        /* Bright/Normal colours */
#define BRIGHT        	1

#define ALTER_COLOUR( type )    if( !str_prefix( argument, "red" ) )        \
                {                        \
                    ch->pcdata->type[0] = NORMAL;        \
                    ch->pcdata->type[1] = RED;            \
                }                        \
                else if( !str_prefix( argument, "hi-red" ) )    \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = RED;            \
                }                        \
                else if( !str_prefix( argument, "green" ) )    \
                {                        \
                    ch->pcdata->type[0] = NORMAL;        \
                    ch->pcdata->type[1] = GREEN;        \
                }                        \
                else if( !str_prefix( argument, "hi-green" ) )    \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = GREEN;        \
                }                        \
                else if( !str_prefix( argument, "yellow" ) )    \
                {                        \
                    ch->pcdata->type[0] = NORMAL;        \
                    ch->pcdata->type[1] = YELLOW;        \
                }                        \
                else if( !str_prefix( argument, "hi-yellow" ) )    \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = YELLOW;        \
                }                        \
                else if( !str_prefix( argument, "blue" ) )    \
                {                        \
                    ch->pcdata->type[0] = NORMAL;        \
                    ch->pcdata->type[1] = BLUE;        \
                }                        \
                else if( !str_prefix( argument, "hi-blue" ) )    \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = BLUE;        \
                }                        \
                else if( !str_prefix( argument, "magenta" ) )    \
                {                        \
                    ch->pcdata->type[0] = NORMAL;        \
                    ch->pcdata->type[1] = MAGENTA;        \
                }                        \
                else if( !str_prefix( argument, "hi-magenta" ) ) \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = MAGENTA;        \
                }                        \
                else if( !str_prefix( argument, "cyan" ) )    \
                {                        \
                    ch->pcdata->type[0] = NORMAL;        \
                    ch->pcdata->type[1] = CYAN;            \
                }                        \
                else if( !str_prefix( argument, "hi-cyan" ) )    \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = CYAN;            \
                }                        \
                else if( !str_prefix( argument, "white" ) )    \
                {                        \
                    ch->pcdata->type[0] = NORMAL;        \
                    ch->pcdata->type[1] = WHITE;        \
                }                        \
                else if( !str_prefix( argument, "hi-white" ) )    \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = WHITE;        \
                }                        \
                else if( !str_prefix( argument, "grey" ) )    \
                {                        \
                    ch->pcdata->type[0] = BRIGHT;        \
                    ch->pcdata->type[1] = BLACK;        \
                }                        \
                else if( !str_prefix( argument, "beep" ) )    \
                {                        \
                    ch->pcdata->type[2] = 1;            \
                }                        \
                else if( !str_prefix( argument, "nobeep" ) )    \
                {                        \
                    ch->pcdata->type[2] = 0;            \
                }                        \
                else                        \
                {                        \
        			send_to_char_bw( "Unrecognised colour, unchanged.\n\r", ch );    \
                    return;                    \
                }

#define LOAD_COLOUR( field )    ch->pcdata->field[1] = fread_number( fp );    \
                if( ch->pcdata->field[1] > 100 )        \
                {                        \
                    ch->pcdata->field[1] -= 100;        \
                    ch->pcdata->field[2] = 1;            \
                }                        \
                else                        \
                {                        \
                    ch->pcdata->field[2] = 0;            \
                }                        \
                if( ch->pcdata->field[1] > 10 )            \
                {                        \
                    ch->pcdata->field[1] -= 10;            \
                    ch->pcdata->field[0] = 1;            \
                }                        \
                else                        \
                {                        \
                    ch->pcdata->field[0] = 0;            \
                }

/** Clan flags
 */
#define GUILD_DELETED		A
#define GUILD_CHANGED		B
#define GUILD_INDEPENDENT 	C /* a "loner" guild */
#define GUILD_IMMORTAL		E /* immortal only clan */
#define GUILD_WOLF   		F /* Test Clan */

/*
 * Site ban structure.
 */

#define BAN_SUFFIX        A
#define BAN_PREFIX        B
#define BAN_NEWBIES       C
#define BAN_ALL           D
#define BAN_PERMIT        E
#define BAN_PERMANENT     F

struct    ban_data
{
    BAN_DATA *    	next;
    bool    		valid;
    sh_int    		ban_flags;
    sh_int    		level;
    char *    		name;
};
struct struckdrunk
{
	int	min_drunk_level;
	int	number_of_rep;
	char	*replacement[11];
};

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



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

#define SKY_CLOUDLESS               0
#define SKY_CLOUDY                  1
#define SKY_RAINING                 2
#define SKY_LIGHTNING               3
#define SKY_SNOWING                 4
#define SKY_BLIZZARD                5
#define SKY_FOGGY                   6
#define SKY_HAILSTORM               7
#define SKY_THUNDERSTORM            8
#define SKY_ICESTORM                9
#define PLR_AUTOWEATHER            10


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

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

};



/*
 * Connected state for a channel.
 */
//#define CON_ANSI                    -13
#define CON_GET_NAME                -13
#define CON_GET_OLD_PASSWORD        -12
#define CON_CONFIRM_NEW_NAME        -11
#define CON_GET_NEW_PASSWORD        -10
#define CON_CONFIRM_NEW_PASSWORD    -9
#define CON_GET_NEW_SPECIES            -8
#define CON_GET_NEW_RACE            -7
#define CON_GET_NEW_SEX             -6
#define CON_GET_NEW_CLASS           -5
#define CON_GET_ALIGNMENT           -4
#define CON_DEFAULT_CHOICE          -3
#define CON_GEN_GROUPS              -2
#define CON_PICK_WEAPON             -1
#define CON_PLAYING                  0
#define CON_READ_IMOTD               1
#define CON_READ_MOTD                2
#define CON_BREAK_CONNECT            3
#define CON_COPYOVER_RECOVER         4
#define CON_BEGIN_REMORT			 5
#define CON_IMM_FLAG                 6
#define CON_IMM_FLAG_LEVEL           7

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


/*
 * Descriptor (channel) structure.
 */
struct    descriptor_data
{
    DESCRIPTOR_DATA *   next;
    DESCRIPTOR_DATA *   snoop_by;
    CHAR_DATA *         character;
    CHAR_DATA *         original;
    bool        		valid;
	bool        		ansi;
    char *      		host;
    sh_int      		descriptor;
    sh_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;
    char *      		showstr_head;
    char *      		showstr_point;
    void *      		pEdit;        /* OLC */
    char **     		pString;    /* OLC */
    int         		editor;        /* OLC */
};





/*
 * 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    spi_app_type
{
    sh_int    practice;
};

struct    dex_app_type
{
    sh_int    defensive;
};

struct    con_app_type
{
    sh_int    hitp;
    sh_int    shock;
};

struct    agi_app_type
{
//    sh_int   practice;
};


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



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

struct help_area_data
{
    HELP_AREA *    	next;
    HELP_DATA *    	first;
    HELP_DATA *    	last;
    AREA_DATA *    	area;
    char *        	filename;
    bool        	changed;
};


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

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



/*
 * Per-class stuff.
 */

#define MAX_GUILD   2
#define MAX_STATS   6
#define STAT_STR    0
#define STAT_DEX    1
#define STAT_AGI    2
#define STAT_INT    3
#define STAT_SPI    4
#define STAT_PRE    5   
#define CURR_STAT_FOR    ((((get_curr_stat(ch,STAT_STR)) + (get_curr_stat(ch,STAT_DEX))) + (get_curr_stat(ch,STAT_AGI)))/3)
#define PERM_STAT_FOR    ((((ch->perm_stat[STAT_STR]) + (ch->perm_stat[STAT_DEX])) + (ch->perm_stat[STAT_AGI]))/3)
#define CURR_STAT_WIL    ((((get_curr_stat(ch,STAT_INT)) + (get_curr_stat(ch,STAT_SPI))) + (get_curr_stat(ch,STAT_PRE)))/3)
#define PERM_STAT_WIL    ((((ch->perm_stat[STAT_INT]) + (ch->perm_stat[STAT_SPI])) + (ch->perm_stat[STAT_PRE]))/3)
#define STAT_CON CURR_STAT_FOR
#define STAT_WIS STAT_PRE

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

};

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

struct weapon_type
{
    char *  name;
    long    vnum;
    sh_int  type;
    sh_int  *gsn;
};

struct wiznet_type
{
    char *    	name;
    long     	flag;
    int        	level;
};

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

struct race_type
{
    char *    	name;            /* call name of the race */
    bool    	pc_race;        /* can be chosen by pcs */
    long    	act;            /* act bits for the race */
    long    	aff;            /* aff bits for the race */
    long    	off;            /* off bits for the race */
    long    	imm;            /* imm bits for the race */
    long        res;            /* res bits for the race */
    long    	vuln;            /* vuln bits for the race */
    long    	form;            /* default form flag for the race */
    long    	parts;            /* default parts for the race */
    int			remort_race;	/* was bool --- TAKA changed for multi level remort */
    sh_int          species;
};


struct pc_race_type  /* additional data for pc races */
{
    char *    	name;            /* MUST be in race_type */
    char     	who_name[6];
    sh_int    	points;            /* cost in points of the race */
    sh_int    	class_mult[MAX_CLASS];    /* exp multiplier for class, * 100 */
    char *    	skills[5];        /* bonus skills for the race */
    sh_int     	stats[MAX_STATS];    /* starting stats */
    sh_int    	max_stats[MAX_STATS];    /* maximum stats */
    sh_int    	size;            /* aff bits for the race */
};


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



/*
 * Data structure for notes.
 */

#define NOTE_NOTE    0
#define NOTE_IDEA    1
#define NOTE_PENALTY 2
#define NOTE_NEWS    3
#define NOTE_CHANGES 4

struct    note_data
{
    NOTE_DATA *    	next;
    bool     		valid;
    sh_int    		type;
    char *    		sender;
    char *    		date;
    char *    		to_list;
    char *    		subject;
    char *    		text;
    time_t      	date_stamp;
};



/*
 * An affect.
 */
struct    affect_data
{
    AFFECT_DATA *    next;
    bool        valid;
    sh_int        where;
    sh_int        type;
    sh_int        level;
    sh_int        duration;
    sh_int        location;
    sh_int        modifier;
    int            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
#define TO_AFFECTS2     6

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



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




/* RT ASCII conversions -- used so we can have letters in this file */

#define A			0x1 
#define B			0x2
#define C			0x4
#define D			0x8
#define E			0x10
#define F			0x20
#define G			0x40
#define H			0x80
#define I			0x100
#define J			0x200
#define K		    0x400
#define L		 	0x800
#define M			0x1000
#define N		 	0x2000
#define O			0x4000
#define P			0x8000
#define Q			0x10000
#define R			0x20000
#define S			0x40000
#define T			0x80000
#define U			0x100000
#define V			0x200000
#define W			0x400000
#define X			0x800000
#define Y			0x1000000
#define Z			0x2000000
#define aa			0x4000000 
#define bb			0x8000000 
#define cc			0x10000000   
#define dd	        0x20000000
#define ee          0x40000000
#define ff          0x80000000


/* defines the cybernetic parts */
#define CYBER_COMM				(A)
#define CYBER_EYES				(B)
#define CYBER_LEGS				(C)
#define CYBER_CHEST				(D)
#define CYBER_REFLEXES			(E)
#define CYBER_MIND				(F)
#define CYBER_STRENGTH			(G)



/*
 * ACT bits for mobs.
 * Used in #MOBILES.
 */
#define ACT_IS_NPC        	(A)        /* Auto set for mobs    */
#define ACT_SENTINEL        (B)        /* Stays in one room    */
#define ACT_SCAVENGER       (C)        /* Picks up objects    */
#define ACT_BANKER			(D)		/* is banker	TAKA banking code */
#define ACT_MOUNT          (E)
#define ACT_AGGRESSIVE      (F)            /* Attacks PC's        */
#define ACT_STAY_AREA       (G)        /* Won't leave area    */
#define ACT_WIMPY        	(H)
#define ACT_PET            	(I)        /* Auto set for pets    */
#define ACT_TRAIN        	(J)        /* Can train PC's    */
#define ACT_PRACTICE        (K)        /* Can practice PC's    */
//L
//M
//N
#define ACT_UNDEAD        	(O)
#define ACT_ATM				(P)	/* mob is an ATM */
#define ACT_CLERIC        	(Q)
#define ACT_MAGE        	(R)
#define ACT_THIEF        	(S)
#define ACT_WARRIOR        	(T)
#define ACT_NOALIGN        	(U)
#define ACT_NOPURGE        	(V)
#define ACT_OUTDOORS        (W)
#define ACT_IS_SURGEON		(X) 
#define ACT_INDOORS        	(Y)
#define ACT_IS_DRUNK       (Z)
#define ACT_IS_HEALER      	(aa)
#define ACT_GAIN        	(bb)
#define ACT_UPDATE_ALWAYS   (cc)
#define ACT_IS_CHANGER      (dd)



/* 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
#define DAM_SHOCK        		20


/* OFF bits for mobiles */
#define OFF_AREA_ATTACK         (A)
#define OFF_BACKSTAB            (B)
#define OFF_BASH                (C)
#define OFF_BERSERK             (D)
#define OFF_DISARM              (E)
#define OFF_DODGE               (F)
#define OFF_FADE                (G)
#define OFF_FAST                (H)
#define OFF_KICK                (I)
#define OFF_KICK_DIRT           (J)
#define OFF_PARRY               (K)
#define OFF_RESCUE              (L)
#define OFF_TAIL                (M)
#define OFF_TRIP                (N)
#define OFF_CRUSH        		(O)
#define ASSIST_ALL           	(P)
#define ASSIST_ALIGN            (Q)
#define ASSIST_RACE             (R)
#define ASSIST_PLAYERS          (S)
#define ASSIST_GUARD            (T)
#define ASSIST_VNUM        		(U)
#define OFF_CIRCLE              (V) /* circle skill by TAKA */

/* 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              (A)
#define IMM_CHARM               (B)
#define IMM_MAGIC               (C)
#define IMM_WEAPON              (D)
#define IMM_BASH                (E)
#define IMM_PIERCE              (F)
#define IMM_SLASH               (G)
#define IMM_FIRE                (H)
#define IMM_COLD                (I)
#define IMM_LIGHTNING           (J)
#define IMM_ACID                (K)
#define IMM_POISON              (L)
#define IMM_NEGATIVE            (M)
#define IMM_HOLY                (N)
#define IMM_ENERGY              (O)
#define IMM_MENTAL              (P)
#define IMM_DISEASE             (Q)
#define IMM_DROWNING            (R)
#define IMM_LIGHT        (S)
#define IMM_SOUND        (T)
#define IMM_WOOD                (X)
#define IMM_SILVER              (Y)
#define IMM_IRON                (Z)

/* RES bits for mobs */
#define RES_SUMMON        (A)
#define RES_CHARM        (B)
#define RES_MAGIC               (C)
#define RES_WEAPON              (D)
#define RES_BASH                (E)
#define RES_PIERCE              (F)
#define RES_SLASH               (G)
#define RES_FIRE                (H)
#define RES_COLD                (I)
#define RES_LIGHTNING           (J)
#define RES_ACID                (K)
#define RES_POISON              (L)
#define RES_NEGATIVE            (M)
#define RES_HOLY                (N)
#define RES_ENERGY              (O)
#define RES_MENTAL              (P)
#define RES_DISEASE             (Q)
#define RES_DROWNING            (R)
#define RES_LIGHT        (S)
#define RES_SOUND        (T)
#define RES_WOOD                (X)
#define RES_SILVER              (Y)
#define RES_IRON                (Z)

/* VULN bits for mobs */
#define VULN_SUMMON        (A)
#define VULN_CHARM        (B)
#define VULN_MAGIC              (C)
#define VULN_WEAPON             (D)
#define VULN_BASH               (E)
#define VULN_PIERCE             (F)
#define VULN_SLASH              (G)
#define VULN_FIRE               (H)
#define VULN_COLD               (I)
#define VULN_LIGHTNING          (J)
#define VULN_ACID               (K)
#define VULN_POISON             (L)
#define VULN_NEGATIVE           (M)
#define VULN_HOLY               (N)
#define VULN_ENERGY             (O)
#define VULN_MENTAL             (P)
#define VULN_DISEASE            (Q)
#define VULN_DROWNING           (R)
#define VULN_LIGHT        (S)
#define VULN_SOUND        (T)
#define VULN_WOOD               (X)
#define VULN_SILVER             (Y)
#define VULN_IRON        (Z)

/* body form */
#define FORM_EDIBLE             (A)
#define FORM_POISON             (B)
#define FORM_MAGICAL            (C)
#define FORM_INSTANT_DECAY      (D)
#define FORM_OTHER              (E)  /* defined by material bit */

/* actual form */
#define FORM_ANIMAL             (G)
#define FORM_SENTIENT           (H)
#define FORM_UNDEAD             (I)
#define FORM_CONSTRUCT          (J)
#define FORM_MIST               (K)
#define FORM_INTANGIBLE         (L)

#define FORM_BIPED              (M)
#define FORM_CENTAUR            (N)
#define FORM_INSECT             (O)
#define FORM_SPIDER             (P)
#define FORM_CRUSTACEAN         (Q)
#define FORM_WORM               (R)
#define FORM_BLOB        (S)

#define FORM_MAMMAL             (V)
#define FORM_BIRD               (W)
#define FORM_REPTILE            (X)
#define FORM_SNAKE              (Y)
#define FORM_DRAGON             (Z)
#define FORM_AMPHIBIAN          (aa)
#define FORM_FISH               (bb)
#define FORM_COLD_BLOOD        (cc)

/* body parts */
#define PART_HEAD               (A)
#define PART_ARMS               (B)
#define PART_LEGS               (C)
#define PART_HEART              (D)
#define PART_BRAINS             (E)
#define PART_GUTS               (F)
#define PART_HANDS              (G)
#define PART_FEET               (H)
#define PART_FINGERS            (I)
#define PART_EAR                (J)
#define PART_EYE        (K)
#define PART_LONG_TONGUE        (L)
#define PART_EYESTALKS          (M)
#define PART_TENTACLES          (N)
#define PART_FINS               (O)
#define PART_WINGS              (P)
#define PART_TAIL               (Q)
/* for combat */
#define PART_CLAWS              (U)
#define PART_FANGS              (V)
#define PART_HORNS              (W)
#define PART_SCALES             (X)
#define PART_TUSKS        (Y)


/*
 * Bits for 'affected_by'.
 * Used in #MOBILES.
 */
#define AFF_BLIND        (A)
#define AFF_INVISIBLE        (B)
#define AFF_DETECT_EVIL        (C)
#define AFF_DETECT_INVIS    (D)
#define AFF_DETECT_MAGIC    (E)
#define AFF_DETECT_HIDDEN    (F)
#define AFF_DETECT_GOOD        (G)
#define AFF_SANCTUARY        (H)
#define AFF_FAERIE_FIRE        (I)
#define AFF_INFRARED        (J)
#define AFF_CURSE        (K)
#define AFF_UNUSED_FLAG        (L)    /* unused */
#define AFF_POISON        (M)
#define AFF_PROTECT_EVIL    (N)
#define AFF_PROTECT_GOOD    (O)
#define AFF_SNEAK        (P)
#define AFF_HIDE        (Q)
#define AFF_SLEEP        (R)
#define AFF_CHARM        (S)
#define AFF_FLYING        (T)
#define AFF_PASS_DOOR        (U)
#define AFF_HASTE        (V)
#define AFF_CALM        (W)
#define AFF_PLAGUE        (X)
#define AFF_WEAKEN        (Y)
#define AFF_DARK_VISION        (Z)
#define AFF_BERSERK        (aa)
#define AFF_SWIM        (bb)
#define AFF_REGENERATION        (cc)
#define AFF_SLOW        (dd)
#define AFF_CONFUSE                (ee)
/*Extra Bits from Xeric*/
#define AFF_NOWEAPON (ff)
#define AFF_NOREGEN  (gg)
#define AFF_SLUR_SPEACH (hh)

/*

 * Bits for 'affected2_by'.

 * Used in #MOBILES.

 */

#define SHD_PROTECT_VOODOO	(A)
#define SHD_INVISIBLE		(B)
#define SHD_ICE			(C)
#define SHD_FIRE		(D)
#define SHD_SHOCK		(E)
#define SHD_SANCTUARY		(H)
#define SHD_PROTECT_EVIL	(N)
#define SHD_PROTECT_GOOD	(O)
 
/*
 * 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
#define AC_ARMOR_ABSORB            4

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





#define ROOM_MOUNT_SHOP		(U)

/*
 * 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
#define ITEM_INK            	35
#define ITEM_QUILL            	36
#define ITEM_GLASS            	37
#define ITEM_PARCHMENT         	38
#define ITEM_DART              	39
#define ITEM_QUIVER			 	40
#define ITEM_ARROW				41
#define ITEM_SOCKET				42
#define ITEM_CONTROLS           43
#define ITEM_VEHICLE             44



/*
 * Extra flags.
 * Used in #OBJECTS.
 */
#define ITEM_GLOW        	(A)
#define ITEM_HUM        	(B)
#define ITEM_DARK        	(C)
#define ITEM_LOCK        	(D)
#define ITEM_EVIL        	(E)
#define ITEM_INVIS        	(F)
#define ITEM_MAGIC        	(G)
#define ITEM_NODROP        	(H)
#define ITEM_BLESS        	(I)
#define ITEM_ANTI_GOOD      (J)
#define ITEM_ANTI_EVIL      (K)
#define ITEM_ANTI_NEUTRAL   (L)
#define ITEM_NOREMOVE       (M)
#define ITEM_INVENTORY      (N)
#define ITEM_NOPURGE        (O)
#define ITEM_ROT_DEATH      (P)
#define ITEM_VIS_DEATH      (Q)
#define ITEM_NONMETAL       (S)
#define ITEM_NOLOCATE       (T)
#define ITEM_MELT_DROP      (U)
#define ITEM_HAD_TIMER      (V)
#define ITEM_SELL_EXTRACT   (W)
#define ITEM_BURN_PROOF     (Y)
#define ITEM_NOUNCURSE      (Z)
#define ITEM_HIDDEN         (aa)
#define ITEM_LODGED			(bb)


/*
 * Wear flags.
 * Used in #OBJECTS.
 */
#define ITEM_TAKE			(A)
#define ITEM_WEAR_FINGER	(B)
#define ITEM_WEAR_NECK		(C)
#define ITEM_WEAR_BODY		(D)
#define ITEM_WEAR_HEAD		(E)
#define ITEM_WEAR_LEGS		(F)
#define ITEM_WEAR_FEET		(G)
#define ITEM_WEAR_HANDS		(H)
#define ITEM_WEAR_ARMS		(I)
#define ITEM_WEAR_SHIELD	(J)
#define ITEM_WEAR_ABOUT		(K)
#define ITEM_WEAR_WAIST		(L)
#define ITEM_WEAR_WRIST		(M)
#define ITEM_WIELD			(N)
#define ITEM_HOLD			(O)
#define ITEM_NO_SAC			(P)
#define ITEM_WEAR_FLOAT		(Q)
#define ITEM_WEAR_FACE		(R)
#define ITEM_WEAR_SHOULDERS (S)
#define ITEM_WEAR_KNEES		(T)
#define ITEM_WEAR_EYES		(U)
#define ITEM_WEAR_EARS		(V)
#define ITEM_WEAR_BACK		(W)
#define ITEM_WEAR_SECONDARY	(X)
#define ITEM_WEAR_TAIL		(Y)
#define ITEM_WEAR_ANKLE		(Z)
#define ITEM_WEAR_UNDERWEAR	(aa)
#define ITEM_WEAR_BELLY		(bb)

/* 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
#define WEAPON_DART        9
#define WEAPON_BOW        10

/* weapon types */
#define WEAPON_FLAMING        (A)
#define WEAPON_FROST        (B)
#define WEAPON_VAMPIRIC        (C)
#define WEAPON_SHARP        (D)
#define WEAPON_VORPAL        (E)
#define WEAPON_TWO_HANDS    (F)
#define WEAPON_SHOCKING        (G)
#define WEAPON_POISON        (H)

/* gate flags */
#define GATE_NORMAL_EXIT    (A)
#define GATE_NOCURSE        (B)
#define GATE_GOWITH        (C)
#define GATE_BUGGY        (D)
#define GATE_RANDOM        (E)

/* furniture flags */
#define STAND_AT        (A)
#define STAND_ON        (B)
#define STAND_IN        (C)
#define SIT_AT            (D)
#define SIT_ON            (E)
#define SIT_IN            (F)
#define REST_AT            (G)
#define REST_ON            (H)
#define REST_IN            (I)
#define SLEEP_AT        (J)
#define SLEEP_ON        (K)
#define SLEEP_IN        (L)
#define PUT_AT            (M)
#define PUT_ON            (N)
#define PUT_IN            (O)
#define PUT_INSIDE        (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_SPI              4
#define APPLY_PRE              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
#define APPLY_AGI                  26

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





/*
 * Room flags.
 * Used in #ROOMS.
 */
#define ROOM_DARK        (A)
#define ROOM_NO_MOB        (C)
#define ROOM_INDOORS        (D)

#define ROOM_PRIVATE        (J)
#define ROOM_SAFE        (K)
#define ROOM_SOLITARY        (L)
#define ROOM_PET_SHOP        (M)
#define ROOM_NO_RECALL        (N)
#define ROOM_IMP_ONLY        (O)
#define ROOM_GODS_ONLY        (P)
#define ROOM_HEROES_ONLY    (Q)
#define ROOM_NEWBIES_ONLY    (R)
#define ROOM_LAW        (S)
#define ROOM_NOWHERE        (T)
#define ROOM_UNDER_WATER      (U)
#define ROOM_NOVEHICLE      (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              (A)
#define EX_CLOSED              (B)
#define EX_LOCKED              (C)
#define EX_PICKPROOF              (F)
#define EX_NOPASS              (G)
#define EX_EASY                  (H)
#define EX_HARD                  (I)
#define EX_INFURIATING              (J)
#define EX_NOCLOSE              (K)
#define EX_NOLOCK              (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

//Duplicate Sectors for Vehicles
#define V_SECT_INSIDE              (A)
#define V_SECT_CITY              (B)
#define V_SECT_FIELD              (C)
#define V_SECT_FOREST              (D)
#define V_SECT_HILLS              (E)
#define V_SECT_MOUNTAIN              (F)
#define V_SECT_WATER_SWIM              (G)
#define V_SECT_WATER_NOSWIM          (H)
#define V_SECT_UNUSED              (I)
#define V_SECT_AIR              (J)
#define V_SECT_DESERT             (K)
#define V_SECT_MAX             (L)


/*
 * 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_TAIL            	19
#define WEAR_FACE            	20
#define WEAR_EYES            	21
#define WEAR_EARS            	22
#define WEAR_ANKLE_L         	23
#define WEAR_ANKLE_R         	24
#define WEAR_UNDERWEAR       	25
#define WEAR_BELLY			 	26
#define WEAR_KNEES			 	27
#define WEAR_BACK			 	28
#define WEAR_SECONDARY		 	29
#define WEAR_SHOULDERS			30
#define WEAR_LODGE_LEG				31
#define WEAR_LODGE_ARM				32
#define WEAR_LODGE_RIB				33
#define MAX_WEAR                34
/******************************************************************************
 * SETUP ARRAY bits for multi flags above 32
 * BY TAKA of GHOST DANCER
 *
 * 8 bits per element of the character array.
 * This idea is by Azash for more efficient use of our array flagging system
 * The class/race specific idea was by Vincent.
 *
 * Use these flags on your mud anyway you see fit. This is how we used them on
 * ours. Increasing the size of the array makes for larger numbers able to be
 * stored. Or you can define multiple arrays for different needs. They are
 * literally unlimited.
 *
 * This is the example of how it works.
 * 1) define a character array.
 * 2) use the IS_SETX/SET_BITX/REMOVE_BITX supplied to check and set the bits
 *    inside the array.
 * 3) each character in the array has 8 bits.
 *
 * All this goes in MERC.H
 *
 * Some of the advantages of doing things this way is no changing existing areas
 * unless you want to add some new affects to items/mobiles/rooms. This is done
 * by adding at the end of the OBJECT a new type of attribute that looks like
 * this.
 * From the lines below we will make an object mage only.
 * #30036
 * sword justice~
 * Oyate Sword~
 * The Oyate Sword of Justice~
 * steel~
 * weapon I AN
 * sword 35 35 acid ABCDEGH
 * 1 10 0 P
 * X               <- This lines tells the program new effects are coming
 * 1 50 0          <- 1= mage 50= class limits flag 0= terminate line
 * To make the same weapon mage/necromancer/witch/and enchanter
 * X               <- This lines tells the program new effects are coming
 * 1 8 9 10 50 0   <- 1= mage 8= witch 9= necromancer 10= enchanter
 *						50= class limits flag 0= terminate line
 * NOTE you can have as many indicator numbers as you like in a line always
 *      close with a 0 (zero)
 *
 ******************************************************************************/

/*
 * New utility macros by TAKA
 *
 * IS_SETX 		used to determine if a bit within the array is on or off
 * SET_BITX		used to set a bit within the array on.
 * REMOVE_BITX	used to set a bit within the array off.
 */

#define IS_SETX(flag, bit)  ((flag) & \
	(bit % 8 == 0 ? H : bit % 8 == 1 ? A : \
	 bit % 8 == 2 ? B : bit % 8 == 3 ? C : \
	 bit % 8 == 4 ? D : bit % 8 == 5 ? E : \
	 bit % 8 == 6 ? F : G ))
#define SET_BITX(var, bit) ((var) |= \
	(bit % 8 == 0 ? H : bit % 8 == 1 ? A : \
	 bit % 8 == 2 ? B : bit % 8 == 3 ? C : \
	 bit % 8 == 4 ? D : bit % 8 == 5 ? E : \
	 bit % 8 == 6 ? F : G))
#define REMOVE_BITX(var, bit) ((var) &= \
	~(bit % 8 == 0 ? H : bit % 8 == 1 ? A : \
	  bit % 8 == 2 ? B : bit % 8 == 3 ? C : \
	  bit % 8 == 4 ? D : bit % 8 == 5 ? E : \
	  bit % 8 == 6 ? F : G))

/*
 *      List of some of the flags on Ghost Dancer by TAKA
 * Class only definitions
 * 1-50 reserved for class only flags
 * use more if you like
 */
#define CLASS_MAGE				1
#define CLASS_CLERIC			2
#define CLASS_THIEF				3
#define CLASS_WARRIOR			4
#define CLASS_RANGER			5
#define CLASS_ASSASSIN			6
#define CLASS_PALADIN			7
#define CLASS_WITCH				8
#define CLASS_NECROMANCER		9
#define CLASS_ENCHANTER			10
#define CLASS_BERSERKER			11
#define CLASS_DEATH_KNIGHT		12
#define CLASS_SOLDIER			13
#define CLASS_OPOYA				14
#define CLASS_WICASA			15
#define CLASS_DRUID				16
#define CLASS_TELEPATH			17
#define CLASS_PRIEST			18
#define CLASS_BARD				19
#define CLASS_SAGE				20
#define CLASS_SORCERER			21
#define CLASS_BISHOP			22
#define CLASS_TEMPLAR			23
#define CLASS_MONK				24
#define CLASS_PSIONIST			25
#define CLASS_NINJA				26

#define CLASS_ONLY				50

/* Race only definitions
 * 51-100 reserved for race only flags
 * use more if you like
 */
#define R_ARCHON				51
#define R_HUMAN					52
#define R_ELF					53
#define R_SYLVAN				54
#define R_DAERGAR				55
#define R_DROW					56
#define R_DRACON				57
#define R_DWARF					58
#define R_GIANT					59
#define R_GOBLIN				60
#define R_GNOME					61
#define R_KYRIE					62
#define R_SAURIAL				63
#define R_VAMPIRE				64
#define R_TIGRIAT				65
#define R_DRAGONKIN				66
#define R_BARBARIAN				67
#define R_ORC					68
#define R_TROLL					69
#define R_OYATE					70
#define R_HALFELF				71
#define R_HALFORC				72
#define R_HALFGIANT				73
#define R_WEREWOLF				74
#define R_LICH					75

#define RACE_ONLY				100
/* Immortal only definitions
 * 50-59 used for IMMORTAL/REMORT only flags
 */
#define R_IMMORTAL				101
#define REMORT_ONLY				102

/** room only **/
#define ROOM_CHAMPION			103

/** object only **/
#define OBJ_DAMAGE_SPIKE		103
#define OBJ_DAMAGE_RAZOR		104
#define OBJ_DAMAGE_SHARP		105
#define OBJ_DAMAGE_FIRE			106
#define OBJ_DAMAGE_ICE			107
#define OBJ_DAMAGE_RACE			108



/* End of array setup */

/*
 * define size of arrary here to make it so we can dynamically
 * control its size. I have tested it up to 299 arrary elements
 *
 * RACE and CLASS indexs used to dynamically define and use
 * for race/class testing see the do_wear procedure in act_obj.c
 */

#define MAX_NEWAFF				15
#define RACE_INDEX				50
#define CLASS_INDEX				1

/* New GLOBALS by TAKA */
char newaff[MAX_NEWAFF];


/******************************************************************************
 * SETUP ARRAY for multi flag above 32
 ******************************************************************************/



/***************************************************************************
 *                                                                         *
 *                   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_KILLER           0
#define PLR_IS_NPC        	(A)        /* Don't EVER set.    */
#define PLR_AUTOCONSUME		(B) /* UNDEAD PC RACES ONLY */
/* RT auto flags */
#define PLR_AUTOASSIST      (C)

#define PLR_AUTODAMAGE      (D)
#define PLR_AUTOEXIT        (E)
#define PLR_AUTOLOOT        (F)
#define PLR_AUTOSAC         (G)
#define PLR_AUTOGOLD        (H)
#define PLR_AUTOSPLIT       (I)
#define PLR_REMORT2 		(J)
#define PLR_EQLIST 		(K)

/* RT personal flags */
#define PLR_HOLYLIGHT       (N)
#define PLR_CANLOOT        	(P)
#define PLR_NOSUMMON        (Q)
#define PLR_NOFOLLOW        (R)
#define PLR_COLOUR        	(T)
/* 1 bit reserved, S */

/* penalty flags */
#define PLR_PERMIT        	(U)
#define PLR_LOG            	(W)
#define PLR_DENY        	(X)
#define PLR_FREEZE        	(Y)
#define PLR_THIEF        	(Z)
#define PLR_MORTAL_LEADER   (aa)
#define PLR_NOCAST			(bb)
#define	PLR_NOTITLE			(cc)
#define PLR_NOEXP			(dd)
#define PLR_REMORT			(ee)



/* RT comm flags -- may be used on both mobs and chars */
#define COMM_QUIET              (A)
#define COMM_DEAF                (B)
#define COMM_NOWIZ              (C)
#define COMM_NOAUCTION          (D)
#define COMM_NOGOSSIP           (E)
#define COMM_NOQUESTION         (F)
#define COMM_NOMUSIC            (G)
#define COMM_NOCLAN        (H)
#define COMM_NOQUOTE        (I)
#define COMM_SHOUTSOFF        (J)

/* display flags */
#define COMM_COMPACT        (L)
#define COMM_BRIEF        (M)
#define COMM_PROMPT        (N)
#define COMM_COMBINE        (O)
#define COMM_TELNET_GA        (P)
#define COMM_SHOW_AFFECTS    (Q)
#define COMM_NOGRATS        (R)

/* penalties */
#define COMM_NOEMOTE        (T)
#define COMM_NOSHOUT        (U)
#define COMM_NOTELL        (V)
#define COMM_NOCHANNELS        (W)
#define COMM_SNOOP_PROOF    (Y)
#define COMM_AFK        (Z)

/* WIZnet flags */
#define WIZ_ON            	(A)
#define WIZ_TICKS        	(B)
#define WIZ_LOGINS        	(C)
#define WIZ_SITES        	(D)
#define WIZ_LINKS        	(E)
#define WIZ_DEATHS        	(F)
#define WIZ_RESETS        	(G)
#define WIZ_MOBDEATHS       (H)
#define WIZ_FLAGS        	(I)
#define WIZ_PENALTIES       (J)
#define WIZ_SACCING        	(K)
#define WIZ_LEVELS        	(L)
#define WIZ_SECURE        	(M)
#define WIZ_SWITCHES        (N)
#define WIZ_SNOOPS        	(O)
#define WIZ_RESTORE        	(P)
#define WIZ_LOAD        	(Q)
#define WIZ_NEWBIE        	(R)
#define WIZ_PREFIX        	(S)
#define WIZ_SPAM        	(T)

#define WIZ_MEMCHECK		(W)
#define WIZ_STOCKS			(X) /* added for crashes and peeks monitoring */
#define WIZ_PWORD			(aa) /* added for password invalids */


/* Prototypes for clan data */

typedef struct guild_rank       rankdata;

struct guild_rank
{
  char *rankname;               /* name of rank                         */
  char *skillname;              /* name of skill earned at this rank    */
};

/* mortal leader rights are as follows;
 ml[0] = can_guild
 ml[1] = can_deguild
 ml[2] = can_promote
 ml[3] = can_demote
*/

struct clan_type
{
  long flags;                   /* flags for guild                      */
  char *name;			/* name of guild                        */
  char *who_name;		/* name sent for "who" command		*/
  int room[3];                  /* hall/morgue/temple rooms             */
  rankdata rank[MAX_RANK];	/* guilds rank system                   */
  int ml[4];			/* mortal leader rights 		*/
};


/*
 * 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 *        mprogs;
    AREA_DATA *        area;        /* OLC */
    long        vnum;
    sh_int        group;
    bool        new_format;
    sh_int        count;
    sh_int        killed;
    char *        player_name;
    char *        short_descr;
    char *        long_descr;
    char *        description;
    /*
	This code replaced by TAKA     to add mud time to a file for better
	tracking :) Also for our own birthday code logic!
	*/
	sh_int		startyear; /* beginning of age code */
	sh_int		startmonth;
	sh_int		startday;
	/* end for time mods TAKA     */
    long        act;
    long        affected_by;

    long        affected2_by;
    sh_int        alignment;
    sh_int        level;
    sh_int        hitroll;
    long        hit[3];
    long        mana[3];
    long        damage[3];
    sh_int        ac[4];
    sh_int         dam_type;


    long        off_flags;
    long        imm_flags;
    long        res_flags;
    long        vuln_flags;
    sh_int        start_pos;
    sh_int        default_pos;
    sh_int        sex;
    sh_int        race;
    long        wealth;
    long        form;
    long        parts;
    sh_int        size;
    char *        material;
    long        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;
    bool    valid;
    int        id;
    int     reaction;
    time_t     when;
};


/*
 * One character (PC or NPC).
 */
struct    char_data
{
    CHAR_DATA *        next;
    CHAR_DATA *        next_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 *    affected;
    NOTE_DATA *        pnote;
    OBJ_DATA *        carrying;
    OBJ_DATA *        on;
    OBJ_DATA *       is_driving;
    OBJ_DATA *       ve_control;
    ROOM_INDEX_DATA *    in_room;
    ROOM_INDEX_DATA *    was_in_room;
    AREA_DATA *        zone;
    PC_DATA *        pcdata;
    GEN_DATA *        gen_data;
    bool        valid;
    char *        name;
    long        id;
    sh_int		ghost_level;
    sh_int        version;
    char *        short_descr;
    char *        long_descr;
    char *        description;
    char *        prompt;
    char *        prefix;
    sh_int        group;
    sh_int        clan;
    sh_int        rank;   /* clan rank/status */
    sh_int        sex;
    sh_int        class;
    sh_int        species;
    sh_int        race;
    sh_int        level;
    sh_int        trust;
    int            played;
    int            lines;  /* for the pager */
    time_t        logon;
    sh_int        timer;
    sh_int        wait;
    sh_int        daze;
    int        hit;
    int        max_hit;
    int        mana;
    int        max_mana;
    int        move;
    int        max_move;
    long        gold;
    long        silver;
    int            exp;
    long        act;
    long        comm;   /* RT added to pad the vector */
    long        wiznet; /* wiz stuff */
    long        imm_flags;
    long        res_flags;
    long        vuln_flags;
    sh_int        invis_level;
    sh_int        incog_level;
    long            affected_by;

    long        affected2_by;
    sh_int        position;
    sh_int        practice;
    sh_int        train;
    sh_int        carry_weight;
    sh_int        carry_number;
    sh_int        saving_throw;
    sh_int        alignment;
    sh_int        hitroll;
    sh_int        damroll;
    sh_int        armor[5];
    sh_int        wimpy;
    /* stats */
    sh_int        perm_stat[MAX_STATS];
    sh_int        mod_stat[MAX_STATS];
    /* parts stuff */
    long        form;
    long        parts;
    sh_int        size;
    char*        material;
    /* mobile stuff */
    long        off_flags;
    sh_int        damage[3];
    sh_int        dam_type;
    sh_int        start_pos;
    sh_int        default_pos;
    CHAR_DATA *		mount;
    bool		riding;
   	/*
	This code replaced by TAKA     to add mud time to a file for better
	tracking :) Also for our own birthday code logic!
	*/
	sh_int		startyear; /* beginning of age code */
    sh_int		startmonth;
    sh_int		startday;
	/* End TAKA     time mods */
    sh_int        mprog_delay;
	long		cyber;
//Added by Xeric
    long         shield;
	
};



/*
 * Data which only PC's have.
 */
struct    pc_data
{
    PC_DATA *        next;
    BUFFER *         buffer;
    COLOUR_DATA *    code;        /* Data for coloUr configuration    */
    bool        valid;
    char *        pwd;
    char *        bamfin;
    char *        bamfout;
    char *        title;
    /*
	This code replaced by TAKA     to add mud time to a file for better
	tracking :) Also for our own birthday code logic!
	*/
	sh_int              startyear;
	sh_int              startmonth;
	sh_int              startday; /* beginings of age code */
	int					age_mod; /* for youth spells, etc */
	/* End TAKA     mods for time */
    time_t              last_note;
    time_t              last_idea;
    time_t              last_penalty;
    time_t              last_news;
    time_t              last_changes;
    int        perm_hit;
    int        perm_mana;
    int        perm_move;
    sh_int        true_sex;
    int            last_level;
    sh_int        condition    [4];
    sh_int        learned        [MAX_SKILL];
    bool        group_known    [MAX_GROUP];
    sh_int        points;
    bool                  confirm_delete;
    char *        alias[MAX_ALIAS];
    char *         alias_sub[MAX_ALIAS];
    int         security;    /* OLC */ /* Builder security */
     int                       text[3];                /* {t */
     int                       auction[3];             /* {a */
     int                       auction_text[3];        /* {A */
     int                       gossip[3];              /* {d */
     int                       gossip_text[3];         /* {9 */
     int                       music[3];               /* {e */
     int                       music_text[3];          /* {E */
     int                       question[3];            /* {q */
     int                       question_text[3];       /* {Q */
     int                       answer[3];              /* {f */
     int                       answer_text[3];         /* {F */
     int                       quote[3];               /* {h */
     int                       quote_text[3];          /* {H */
     int                       immtalk_text[3];        /* {i */
     int                       immtalk_type[3];        /* {I */
     int                       info[3];                /* {j */
     int                       say[3];                 /* {6 */
     int                       say_text[3];            /* {7 */
     int                       tell[3];                /* {k */
     int                       tell_text[3];           /* {K */
     int                       reply[3];               /* {l */
     int                       reply_text[3];          /* {L */
     int                       gtell_text[3];          /* {n */
     int                       gtell_type[3];          /* {N */
     int                       wiznet[3];              /* {B */
     int                       room_title[3];          /* {s */
     int                       room_text[3];           /* {S */
     int                       room_exits[3];          /* {o */
     int                       room_things[3];         /* {O */
     int                       prompt[3];              /* {p */
     int                       fight_death[3];         /* {1 */
     int                       fight_yhit[3];          /* {2 */
     int                       fight_ohit[3];          /* {3 */
     int                       fight_thit[3];          /* {4 */
     int                       fight_skill[3];         /* {5 */
     bool			confirm_remort;
	int			incarnations;
	long			balance;
	long			sbalance;
	int				dailylimit;
	int			shares1;
	int			shares2;
	int			shares3;
	int			shares4;
	long		hrecall;
    char *		history;
    char *		grant[MAX_GRANT];

};

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



/*
 * Liquids.
 */
#define LIQ_WATER        0

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



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



/*
 * Prototype for an object.
 */
struct    obj_index_data
{
	OBJ_DATA * inside_of;
    OBJ_INDEX_DATA *    	next;
    EXTRA_DESCR_DATA *    	extra_descr;
    AFFECT_DATA *   affected;
    AREA_DATA *     area;        /* OLC */
    bool        	new_format;
    char *        	name;
    char *        	short_descr;
    char *        	description;
    long        	vnum;
    long        	reset_num;
    char *        	material;
    sh_int        	item_type;
    int            	extra_flags;
    int            	wear_flags;
    sh_int        	level;
    sh_int         	condition;
    sh_int        	count;
    sh_int        	weight;
    int            	cost;
    int            	value[11];
    char			newoaff[MAX_NEWAFF];
    PROG_LIST *		oprogs;
 long		oprog_flags;
  bool		gun;
};



/*
 * One object.
 */
struct    obj_data
{
	
    OBJ_DATA *        next;
    OBJ_DATA *        next_content;
    OBJ_DATA *        contains;
    OBJ_DATA *        in_obj;
    OBJ_DATA *        on;
    CHAR_DATA *        carried_by;
    EXTRA_DESCR_DATA *    extra_descr;
    AFFECT_DATA *    affected;
    OBJ_INDEX_DATA *    pIndexData;
    ROOM_INDEX_DATA *    in_room;
    bool        valid;
    bool        enchanted;
    char *            owner;
    char *        name;
    char *        short_descr;
    char *        description;
    sh_int        item_type;
    int            extra_flags;
    int            wear_flags;
    sh_int        wear_loc;
    sh_int        weight;
    int            cost;
    sh_int        level;
    sh_int         condition;
    char *        material;
    sh_int        timer;
    int            value    [11];
    CHAR_DATA *	oprog_target;
sh_int			oprog_delay;
};



/*
 * Exit data.
 */
struct    exit_data
{
    union
    {
    ROOM_INDEX_DATA *    to_room;
    long            vnum;
    } u1;
    sh_int        exit_info;
    sh_int        key;
    char *        keyword;
    char *        description;
    EXIT_DATA *        next;        /* OLC */
    int            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;
    char        command;
    sh_int        arg1;
    sh_int        arg2;
    sh_int        arg3;
    sh_int        arg4;
};



/*
 * Area definition.
 */
struct    area_data
{
    AREA_DATA *     next;
    AREA_DATA *     next_sort;
    HELP_AREA *     helps;
    char *        	file_name;
    char *        	name;
    char *        	credits;
    sh_int        	age;
    sh_int        	nplayer;
    sh_int        	low_range;
    sh_int        	high_range;
    long         	min_vnum;
    long         	max_vnum;
    bool        	empty;
    char *        	builders;    /* OLC */ /* Listing of */
    long            vnum;        /* OLC */ /* Area vnum  */
    int            	area_flags;    /* OLC */
    int            	security;    /* OLC */ /* Value 1-9  */
    char *		    repop_msg;
};


/*
 * Room type.
 */
struct    room_index_data
{
    ROOM_INDEX_DATA *    next;
    CHAR_DATA *        people;
    OBJ_DATA *        contents;
    EXTRA_DESCR_DATA *    extra_descr;
    AREA_DATA *        area;
    EXIT_DATA *        exit    [6];
    OBJ_DATA * inside_of;
    RESET_DATA *    reset_first;    /* OLC */
    RESET_DATA *    reset_last;    /* OLC */
    char *        name;
    char *        description;
    char *        owner;
    long        vnum;
    int            room_flags;
    sh_int        light;
    sh_int        sector_type;
    sh_int        heal_rate;
    sh_int         mana_rate;
    sh_int        clan;
	char		newraff[MAX_NEWAFF];
	    PROG_LIST *		rprogs;
    CHAR_DATA *		rprog_target;
    long		rprog_flags;
    sh_int		rprog_delay;
};



/*
 * 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
{
    char *    name;            /* Name of skill        */
    sh_int    skill_level[MAX_CLASS];    /* Level needed by class    */
    sh_int    rating[MAX_CLASS];    /* How hard it is to learn    */
    SPELL_FUN *    spell_fun;        /* Spell pointer (for spells)    */
    sh_int    target;            /* Legal targets        */
    sh_int    minimum_position;    /* Position for caster / user    */
    sh_int *    pgsn;            /* Pointer to associated gsn    */
    sh_int    slot;            /* Slot for #OBJECT loading    */
    sh_int    min_mana;        /* Minimum mana used        */
    sh_int    beats;            /* Waiting time after use    */
    char *    noun_damage;        /* Damage message        */
    char *    msg_off;        /* Wear off message        */
    char *    msg_obj;        /* Wear off message for obects    */
};

struct  group_type
{
    char *    name;
    sh_int    rating[MAX_CLASS];
    char *    spells[MAX_IN_GROUP];
};

/*
 * MOBprog definitions
 */
#define TRIG_ACT    (A)
#define TRIG_BRIBE    (B)
#define TRIG_DEATH    (C)
#define TRIG_ENTRY    (D)
#define TRIG_FIGHT    (E)
#define TRIG_GIVE    (F)
#define TRIG_GREET    (G)
#define TRIG_GRALL    (H)
#define TRIG_KILL    (I)
#define TRIG_HPCNT    (J)
#define TRIG_RANDOM    (K)
#define TRIG_SPEECH    (L)
#define TRIG_EXIT    (M)
#define TRIG_EXALL    (N)
#define TRIG_DELAY    (O)
#define TRIG_SURR    (P)
#define TRIG_GET		(Q)
#define TRIG_DROP	(R)
#define TRIG_SIT	(S)
#define TRIG_WEAR	(T)
#define TRIG_COMMAND (U)
#define TRIG_WEARING (V)
/*
 * Prog types
 */
#define PRG_MPROG	0
#define PRG_OPROG	1
#define PRG_RPROG	2

struct prog_list
{
    int                 trig_type;
    char *              trig_phrase;
    long              vnum;
    char *              code;
    PROG_LIST *         next;
    bool                valid;
};

struct prog_code
{
    long              vnum;
    char *              code;
    PROG_CODE *         next;
}; 


/*
 * These are skill_lookup return values for common skills and spells.
 */
extern    sh_int    gsn_backstab;
extern    sh_int    gsn_dodge;
extern  sh_int  gsn_envenom;
extern    sh_int    gsn_hide;
extern    sh_int    gsn_peek;
extern    sh_int    gsn_pick_lock;
extern    sh_int    gsn_sneak;
extern    sh_int    gsn_steal;
extern    sh_int    gsn_hunt;

extern    sh_int    gsn_disarm;
extern    sh_int    gsn_enhanced_damage;
extern    sh_int    gsn_kick;
extern    sh_int    gsn_parry;
extern    sh_int    gsn_rescue;
extern    sh_int    gsn_second_attack;
extern    sh_int    gsn_third_attack;

extern    sh_int    gsn_blindness;
extern    sh_int    gsn_charm_person;
extern    sh_int    gsn_curse;
extern    sh_int    gsn_invis;
extern    sh_int    gsn_mass_invis;
extern  sh_int  gsn_plague;
extern    sh_int    gsn_poison;
extern    sh_int    gsn_sleep;
extern  sh_int  gsn_fly;
extern  sh_int  gsn_sanctuary;

/* new gsns */
extern sh_int  gsn_axe;
extern sh_int  gsn_dagger;
extern sh_int  gsn_flail;
extern sh_int  gsn_mace;
extern sh_int  gsn_polearm;
extern sh_int  gsn_shield_block;
extern sh_int  gsn_spear;
extern sh_int  gsn_sword;
extern sh_int  gsn_whip;
extern sh_int  gsn_bow;

extern sh_int  gsn_bash;
extern sh_int  gsn_berserk;
extern sh_int  gsn_dirt;
extern sh_int  gsn_hand_to_hand;
extern sh_int  gsn_trip;

extern sh_int  gsn_fast_healing;
extern sh_int  gsn_haggle;
extern sh_int  gsn_lore;
extern sh_int  gsn_meditation;
extern sh_int  gsn_throw;
extern sh_int  gsn_scrolls;
extern sh_int  gsn_staves;
extern sh_int  gsn_wands;
extern sh_int  gsn_recall;
extern sh_int  gsn_counter;
extern sh_int  gsn_circle;	/* circle skill by TAKA */
extern sh_int  gsn_butcher;
extern sh_int  gsn_search;
extern sh_int  gsn_assassinate;
extern sh_int  gsn_mpill;
extern sh_int  gsn_brew;
extern sh_int  gsn_riding;


extern		int			reboot_counter;
/*
 * 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 );    \
                }                            \
/* TAKA added here these macros */
#define IS_REMORT(ch)				((ch)->pcdata->incarnations >= 2)

// Macro's by Xeric
#define EDIT_GUILD(Ch, Clan)    ( Clan = Ch->desc->pEdit )
#define DRIVING(ch) (ch->is_driving != NULL)
#define NDRIVING(ch) (ch->is_driving == NULL)
/*
 * 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 IS_AFFECTED2(ch, sn)    (IS_SET((ch)->affected2_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_AC2(ch,type)       ((ch)->armor[type])            
#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 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 MOUNTED(ch) \
 		((!IS_NPC(ch) && ch->mount && ch->riding) ? ch->mount : NULL)
 #define RIDDEN(ch) \
 		((IS_NPC(ch) && ch->mount && ch->riding) ? ch->mount : NULL)
 #define IS_DRUNK(ch)		((ch->pcdata->condition[COND_DRUNK] > 10))
 
#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" ) ) )

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



/*
 * 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
{
    char      name[20];
    char *    char_no_arg;
    char *    others_no_arg;
    char *    char_found;
    char *    others_found;
    char *    vict_found;
    char *    char_not_found;
    char *      char_auto;
    char *      others_auto;
};



/*
 * Global constants.
 */
extern    const    struct    str_app_type    str_app        [26];
extern    const    struct    int_app_type    int_app        [26];
extern    const    struct    spi_app_type    spi_app        [26];
extern    const    struct    dex_app_type    dex_app        [26];
extern    const    struct    con_app_type    con_app        [26];
//extern    const    struct    agi_app_type    agi_app        [26];

extern    const    struct    class_type    class_table    [MAX_CLASS];
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  race_type    species_table    [];
extern  const    struct  race_type    race_table    [];
extern    const    struct    pc_race_type    pc_race_table    [MAX_PC_RACE];
extern  const    struct    spec_type    spec_table    [];
extern    const    struct    liq_type    liq_table    [];
extern    const    struct    skill_type    skill_table    [MAX_SKILL];
extern  const   struct  group_type      group_table    [MAX_GROUP];
extern          struct social_type      social_table    [MAX_SOCIALS];
extern    char *    const            title_table    [MAX_CLASS]
                            [MAX_LEVEL+1]
                            [2];




/*
 * Global variables.
 */
extern        HELP_DATA      *    help_first;
extern        SHOP_DATA      *    shop_first;
extern          AREA_DATA         *     area_first;

extern        CHAR_DATA      *    char_list;
extern        DESCRIPTOR_DATA   *    descriptor_list;
extern        OBJ_DATA      *    object_list;

extern          PROG_CODE         *     mprog_list;
extern          PROG_CODE         *     rprog_list;
extern          PROG_CODE         *     oprog_list;

extern        char            bug_buf        [];
extern        time_t            current_time;
extern        bool            fLogAll;
extern        FILE *            fpReserve;
extern        KILL_DATA        kill_table    [];
extern        char            log_buf        [];
extern        TIME_INFO_DATA        time_info;
extern        WEATHER_DATA        weather_info;
extern        ROOM_INDEX_DATA   *	room_index_hash[MAX_KEY_HASH];
extern        bool            MOBtrigger;
extern        char            last_command[MAX_STRING_LENGTH];
extern			DISABLED_DATA	  *		disabled_first; /* interp.c */
extern          AREA_DATA *             area_first_sorted;
extern        MPROG_QUEUE_DATA  *   mprog_queue;
extern        MPROG_QUEUE_DATA  *   mprog_queue_last;
extern          AREA_DATA *             area_first_sorted;
extern        MPROG_QUEUE_DATA  *   mprog_queue;
//rage.c
extern        char *     times_string      [];
extern  struct DamMesgType dam_weapon   [];


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

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

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

#if    defined(macintosh)
#define NOCRYPT
#if    defined(unix)
#undef    unix
#endif
#endif

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

#if    defined(MSDOS)
#define NOCRYPT
#if    defined(unix)
#undef    unix
#endif
#endif

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

#if    defined(sequent)
char *    NOCRYPT        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 *    NOCRYPT        args( ( const char *key, const char *salt ) );
int    fclose        args( ( FILE *stream ) );
int    fprintf        args( ( FILE *stream, const char *format, ... ) );
#if    defined(SYSV)
siz_t    fread        args( ( void *ptr, size_t size, size_t n,
                FILE *stream) );
#elif !defined(__SVR4)
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 *    NOCRYPT        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).
 */
#if defined(macintosh)
#define PLAYER_DIR    ""            /* Player files    */
#define TEMP_FILE    "romtmp"
#define NULL_FILE    "proto.are"        /* To reserve one stream */
#endif

#if defined(MSDOS)
#define PLAYER_DIR    ""            /* Player files */
#define TEMP_FILE    "romtmp"
#define NULL_FILE    "nul"            /* To reserve one stream */
#endif

#if defined(unix)
#define LAST_COMMAND    "../data/last_command.txt"  /*For the signal handler.*/
#define PLAYER_DIR      "../player/"            /* Player files */
#define GOD_DIR         "../gods/"          /* list of gods */
#define TEMP_FILE    "../player/romtmp"
#define NULL_FILE    "/dev/null"        /* To reserve one stream */
#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 NOTE_FILE       "notes.not"/* For 'notes'*/
#define IDEA_FILE    "ideas.not"
#define PENALTY_FILE    "penal.not"
#define NEWS_FILE    "news.not"
#define CHANGES_FILE    "chang.not"
#define SHUTDOWN_FILE   "shutdown.txt"/* For 'shutdown'*/
#define BAN_FILE    "ban.txt"
#define MUSIC_FILE    "music.txt"
#define STARTUP_FILE  "/cygdrive/c/Aeternity/AREA/AEternity"


/*
 * files added by TAKA
 * help.txt - used to store unfound help requests
 * version.txt - used to store/display version number information
 * bank.txt - used to store banking information
 * mudtime.txt - used to store mud time in
 */
#define HELP_FILE    "../data/help.txt"   /* For undefined helps */
#define VERSION_FILE       "../data/version.txt"   /* For version maitenance online */
#define BANK_FILE       "../data/bank.txt"      /* For bank info */
#define TIME_FILE		"../data/mudtime.txt"
#define time_file		"../data/mudtime.txt"
#define DISABLED_FILE	"../data/disabled.txt"  /* disabled commands */
#define DATA_DIR        "../data/"

/*
 * 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 AD    AFFECT_DATA
#define MPC    MPROG_CODE

/* act_comm.c */
void      check_sex    args( ( CHAR_DATA *ch) );
void    add_follower    args( ( CHAR_DATA *ch, CHAR_DATA *master ) );
void    stop_follower    args( ( CHAR_DATA *ch ) );
void     nuke_pets    args( ( CHAR_DATA *ch ) );
void    die_follower    args( ( CHAR_DATA *ch ) );
bool    is_same_group    args( ( CHAR_DATA *ach, CHAR_DATA *bch ) );
void     logf             args((char * fmt, ...));


/* act_enter.c */
RID  *get_random_room   args ( (CHAR_DATA *ch) );

/* act_info.c */
void    set_title    args( ( CHAR_DATA *ch, char *title ) );
bool check_blind args ((CHAR_DATA * ch));
void show_char_to_char args ((CHAR_DATA * list, CHAR_DATA * ch));
void show_list_to_char args ((OBJ_DATA * list, CHAR_DATA * ch, bool fShort, bool fShowNothing));
void show_char_to_char_1 args ((CHAR_DATA * victim, CHAR_DATA * ch));

/* act_move.c */
void    move_char    args( ( CHAR_DATA *ch, int door, bool follow ) );
void    do_outside_exits args((CHAR_DATA * ch, char *argument));
//Stuff added for Vehicles.
void    do_drive args((CHAR_DATA * ch, char *argument));
void move_obj args((CHAR_DATA * ch, OBJ_DATA * obj, int door));
void do_outside_look args((CHAR_DATA * ch, char *argument));
void check_driving args((CHAR_DATA *ch));

/* act_obj.c */
bool can_loot        args( (CHAR_DATA *ch, OBJ_DATA *obj) );
void    wear_obj    args( (CHAR_DATA *ch, OBJ_DATA *obj, bool fReplace) );
void    get_obj         args( ( CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *container ) );


/* act_wiz.c */
void wiznet        args( (char *string, CHAR_DATA *ch, OBJ_DATA *obj,
                   long flag, long flag_skip, int min_level ) );
void copyover_recover args((void));
void reboot_rot 	args( ( void) );
void reboot_countdown args( ( void ) );

/* alias.c */
void     substitute_alias args( (DESCRIPTOR_DATA *d, char *input) );

/* ban.c */
bool    check_ban    args( ( char *site, int type) );


/* comm.c */
void    show_string    args( ( struct descriptor_data *d, char *input) );
void    close_socket    args( ( DESCRIPTOR_DATA *dclose ) );
void    write_to_buffer    args( ( DESCRIPTOR_DATA *d, const char *txt,
                int length ) );
void    send_to_desc    args( ( const char *txt, DESCRIPTOR_DATA *d ) );
void    send_to_char    args( ( const char *txt, CHAR_DATA *ch ) );
void    page_to_char    args( ( const char *txt, CHAR_DATA *ch ) );
void    act        args( ( const char *format, CHAR_DATA *ch,
                const void *arg1, const void *arg2, int type ) );
void    act_new        args( ( const char *format, CHAR_DATA *ch,
                const void *arg1, const void *arg2, int type,
                int min_pos) );
void    printf_to_char    args( ( CHAR_DATA *, char *, ... ) );
void    bugf        args( ( char *, ... ) );
bool    write_to_descriptor args ( ( int desc, char *txt, int length ) );
void init_descriptor args ((int control));
int species_lookup args ((const char *name));
bool c_is_number args ((const char *arg));

/* db.c */
void    reset_area      args( ( AREA_DATA * pArea ) );        /* OLC */
void    reset_room    args( ( ROOM_INDEX_DATA *pRoom ) );    /* OLC */
char *    print_flags    args( ( int flag ));
void    boot_db        args( ( bool fCopyOver ) );
void    area_update    args( ( void ) );
CD *    create_mobile    args( ( MOB_INDEX_DATA *pMobIndex ) );
void    clone_mobile    args( ( CHAR_DATA *parent, CHAR_DATA *clone) );
OD *    create_object    args( ( OBJ_INDEX_DATA *pObjIndex, int level ) );
void    clone_object    args( ( OBJ_DATA *parent, OBJ_DATA *clone ) );
void    clear_char    args( ( CHAR_DATA *ch ) );
char *    get_extra_descr    args( ( const char *name, EXTRA_DESCR_DATA *ed ) );
MID *    get_mob_index    args( ( long vnum ) );
OID *    get_obj_index    args( ( long vnum ) );
RID *    get_room_index    args( ( long vnum ) );
PROG_CODE *get_prog_index args(( int vnum, int type ));
char    fread_letter    args( ( FILE *fp ) );
int    fread_number    args( ( FILE *fp ) );
long    fread_long_number    args( ( FILE *fp ) );
long     fread_flag    args( ( FILE *fp ) );
char *    fread_string    args( ( FILE *fp ) );
char *  fread_string_eol args(( FILE *fp ) );
void    fread_to_eol    args( ( FILE *fp ) );
char *    fread_word    args( ( FILE *fp ) );
long    flag_convert    args( ( char letter) );
void *    alloc_mem    args( ( int sMem ) );
void *    alloc_perm    args( ( int sMem ) );
void    free_mem    args( ( void *pMem, int sMem ) );
char *    str_dup        args( ( const char *str ) );
void    free_string    args( ( char *pstr ) );
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 ) );
long     number_mm       args( ( void ) );
int    dice        args( ( int number, int size ) );
int    interpolate    args( ( int level, int value_00, int value_32 ) );
void    smash_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 ) );
void    append_file    args( ( CHAR_DATA *ch, char *file, char *str ) );
void    bug        args( ( const char *str, int param ) );
void    log_string    args( ( const char *str ) );
void    tail_chain    args( ( void ) );
void	load_disabled	args( ( void ) );
void	save_disabled	args( ( void ) );

 /*
  * Colour stuff by Lope
  */
 int   colour          args( ( char type, CHAR_DATA *ch, char *string ) );
 void  colourconv      args( ( char *buffer, const char *txt, CHAR_DATA*ch));
 void  send_to_char_bw args( ( const char *txt, CHAR_DATA *ch ) );
 void  page_to_char_bw args( ( const char *txt, CHAR_DATA *ch ) );


/* effect.c */
void    acid_effect    args( (void *vo, int level, int dam, int target) );
void    cold_effect    args( (void *vo, int level, int dam, int target) );
void    fire_effect    args( (void *vo, int level, int dam, int target) );
void    poison_effect    args( (void *vo, int level, int dam, int target) );
void    shock_effect    args( (void *vo, int level, int dam, int target) );


/* fight.c */
bool     is_safe        args( (CHAR_DATA *ch, CHAR_DATA *victim ) );
bool     is_safe_spell    args( (CHAR_DATA *ch, CHAR_DATA *victim, bool area ) );
void    violence_update    args( ( void ) );
void    multi_hit    args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) );
bool    damage        args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int class, bool show ) );
bool    damage_old      args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int class, bool show ) );
void    update_pos    args( ( CHAR_DATA *victim ) );
void    stop_fighting    args( ( CHAR_DATA *ch, bool fBoth ) );
void    check_killer    args( ( CHAR_DATA *ch, CHAR_DATA *victim) );
bool	damage_mock	args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int class, bool show ) );
void raw_kill args ((CHAR_DATA * victim));

/* guild.c */
struct	clan_type	clan_table[MAX_CLAN];
char *  guild_bit_name  args( ( int guild_flags ) );
bool    is_clan         args( (CHAR_DATA *ch) );
bool    is_same_clan    args( (CHAR_DATA *ch, CHAR_DATA *victim) );
int 	clan_lookup	args( (const char *name) );
void 	do_guild	args( (CHAR_DATA *ch, char *argument ) );
void	do_promote	args( (CHAR_DATA *ch, char *argument) );
char 	*player_rank	args( (CHAR_DATA *ch) );
char	*player_clan	args( (CHAR_DATA *ch) );
bool	can_guild	args( (CHAR_DATA *ch) );
bool    can_deguild     args( (CHAR_DATA *ch) );
bool    can_promote     args( (CHAR_DATA *ch) );
bool    can_demote      args( (CHAR_DATA *ch) );

/* handler.c */
AD      *affect_find args( (AFFECT_DATA *paf, int sn));
void    affect_check    args( (CHAR_DATA *ch, int where, int vector) );
int    count_users    args( (OBJ_DATA *obj) );
void     deduct_cost    args( (CHAR_DATA *ch, int cost) );
void    affect_enchant    args( (OBJ_DATA *obj) );
int     check_immune    args( (CHAR_DATA *ch, int dam_type) );
int     material_lookup args( ( const char *name) );
int    weapon_lookup    args( ( const char *name) );
int    weapon_type    args( ( const char *name) );
char     *weapon_name    args( ( int weapon_Type) );
char    *item_name    args( ( int item_type) );
int    attack_lookup    args( ( const char *name) );
long    wiznet_lookup    args( ( const char *name) );
int    class_lookup    args( ( const char *name) );
//bool    is_clan        args( (CHAR_DATA *ch) );
//bool    is_same_clan    args( (CHAR_DATA *ch, CHAR_DATA *victim));
bool    is_old_mob    args ( (CHAR_DATA *ch) );
int    get_skill    args( ( CHAR_DATA *ch, int sn ) );
int    get_weapon_sn    args( ( CHAR_DATA *ch ) );
int    get_weapon_skill args(( CHAR_DATA *ch, int sn ) );
int     get_age         args( ( CHAR_DATA *ch ) );
void    reset_char    args( ( CHAR_DATA *ch )  );
int    get_trust    args( ( CHAR_DATA *ch ) );
int    get_curr_stat    args( ( CHAR_DATA *ch, int stat ) );
int     get_max_train    args( ( CHAR_DATA *ch, int stat ) );
int    can_carry_n    args( ( CHAR_DATA *ch ) );
int    can_carry_w    args( ( CHAR_DATA *ch ) );
bool    is_name        args( ( char *str, char *namelist ) );
bool    is_exact_name    args( ( char *str, char *namelist ) );
void    affect_to_char    args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void    affect_to_obj    args( ( OBJ_DATA *obj, AFFECT_DATA *paf ) );
void    affect_remove    args( ( CHAR_DATA *ch, AFFECT_DATA *paf ) );
void    affect_remove_obj args( (OBJ_DATA *obj, 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    char_from_room    args( ( CHAR_DATA *ch ) );
void    char_to_room    args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex ) );
void    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, int type ) );
OD *    get_eq_char    args( ( CHAR_DATA *ch, int iWear ) );
void    equip_char    args( ( CHAR_DATA *ch, OBJ_DATA *obj, int iWear ) );
void    unequip_char    args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
int    count_obj_list    args( ( OBJ_INDEX_DATA *obj, OBJ_DATA *list ) );
void    obj_from_room    args( ( OBJ_DATA *obj ) );
void    obj_to_room    args( ( OBJ_DATA *obj, ROOM_INDEX_DATA *pRoomIndex ) );
void    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_char    args( ( CHAR_DATA *ch, bool fPull ) );
CD *	get_char_room		args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *room, 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_carry    args( ( CHAR_DATA *ch, char *argument,
                CHAR_DATA *viewer ) );
OD *get_obj_wear	args( ( CHAR_DATA *ch, char *argument, bool character ));
OD *	get_obj_here	args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *room, char *argument ) );
OD *    get_obj_world    args( ( CHAR_DATA *ch, char *argument ) );
OD *    create_money    args( ( int gold, int silver ) );
int    get_obj_number    args( ( OBJ_DATA *obj ) );
int    get_obj_weight    args( ( OBJ_DATA *obj ) );
int    get_true_weight    args( ( OBJ_DATA *obj ) );
bool    room_is_dark    args( ( ROOM_INDEX_DATA *pRoomIndex ) );
bool    is_room_owner    args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *room) );
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_see_room    args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *pRoomIndex) );
bool    can_drop_obj    args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
char *    affect_loc_name    args( ( int location ) );
char *    affect_bit_name    args( ( int vector ) );

char *  affect2_bit_name args( ( int vector ) );
char *    extra_bit_name    args( ( int extra_flags ) );
char *     wear_bit_name    args( ( int wear_flags ) );
char *    act_bit_name    args( ( int act_flags ) );
char *    off_bit_name    args( ( int off_flags ) );
char *  imm_bit_name    args( ( int imm_flags ) );
char *     form_bit_name    args( ( int form_flags ) );
char *    part_bit_name    args( ( int part_flags ) );
char *  cyber_bit_name  args( ( int cyber_flags ) );
char *    weapon_bit_name    args( ( int weapon_flags ) );
char *  comm_bit_name    args( ( int comm_flags ) );
char *    cont_bit_name    args( ( int cont_flags) );

char *	affect_bit_name2	args( ( OBJ_DATA *obj, CHAR_DATA *ch ) );

/*
 * Colour Config
 */
void    default_colour    args( ( CHAR_DATA *ch ) );
void    all_colour    args( ( CHAR_DATA *ch, char *argument ) );
void    strip_mortal_color(char *bufin, bool GLOBAL);

/* interp.c */
void    interpret    args( ( CHAR_DATA *ch, char *argument ) );
bool    is_number    args( ( char *arg ) );
int    number_argument    args( ( char *argument, char *arg ) );
int    mult_argument    args( ( char *argument, char *arg) );
char *    one_argument    args( ( char *argument, char *arg_first ) );
void check_stats args( (CHAR_DATA *ch) );

/* magic.c */
int    find_spell    args( ( CHAR_DATA *ch, const char *name) );
int     mana_cost     (CHAR_DATA *ch, int min_mana, int level);
int    skill_lookup    args( ( const char *name ) );
int    slot_lookup    args( ( int slot ) );
bool    saves_spell    args( ( int level, CHAR_DATA *victim, int dam_type ) );
void    obj_cast_spell    args( ( int sn, int level, CHAR_DATA *ch,
                    CHAR_DATA *victim, OBJ_DATA *obj ) );

/* mob_prog.c */
void	program_flow	args( ( sh_int vnum, char *source, CHAR_DATA *mob, 
				OBJ_DATA *obj, ROOM_INDEX_DATA *room,
				CHAR_DATA *ch, const void *arg1,
				const void *arg2 ) );
void	p_act_trigger	args( ( char *argument, CHAR_DATA *mob, 
				OBJ_DATA *obj, ROOM_INDEX_DATA *room,
				CHAR_DATA *ch, const void *arg1,
				const void *arg2, int type ) );
bool	p_percent_trigger args( ( CHAR_DATA *mob, OBJ_DATA *obj,
				ROOM_INDEX_DATA *room, CHAR_DATA *ch, 
				const void *arg1, const void *arg2, int type ) );
void	p_bribe_trigger  args( ( CHAR_DATA *mob, CHAR_DATA *ch, int amount ) );
bool	p_exit_trigger   args( ( CHAR_DATA *ch, int dir, int type ) );
void	p_give_trigger   args( ( CHAR_DATA *mob, OBJ_DATA *obj, 
				ROOM_INDEX_DATA *room, CHAR_DATA *ch,
				OBJ_DATA *dropped, int type ) );
void 	p_greet_trigger  args( ( CHAR_DATA *ch, int type ) );
void	p_hprct_trigger  args( ( CHAR_DATA *mob, CHAR_DATA *ch ) );


/* mob_cmds.c */
void    mob_interpret    args( ( CHAR_DATA *ch, char *argument ) );
void	obj_interpret	args( ( OBJ_DATA *obj, char *argument ) );
void room_interpret	args( ( ROOM_INDEX_DATA *room, char *argument ) );
//Rage.c
int check_hit (CHAR_DATA *ch, CHAR_DATA *victim, int wear_loc);
int hit_roller (CHAR_DATA *ch, CHAR_DATA *victim, bool secondary, int hits, int dam_type);
int get_dtype args ((CHAR_DATA *ch, int dam_class, int wear_loc));
int get_dclass args ((CHAR_DATA *ch, int dam_class, int wear_loc));
    
/* save.c */
void    save_char_obj    args( ( CHAR_DATA *ch ) );
bool    load_char_obj    args( ( DESCRIPTOR_DATA *d, char *name ) );

/* skills.c */
bool     parse_gen_groups args( ( CHAR_DATA *ch,char *argument ) );
void     list_group_costs args( ( CHAR_DATA *ch ) );
void    list_group_known args( ( CHAR_DATA *ch ) );
int     exp_per_level    args( ( CHAR_DATA *ch, int points ) );
void     check_improve    args( ( CHAR_DATA *ch, int sn, bool success,
                    int multiplier ) );
int     group_lookup    args( (const char *name) );
void    gn_add        args( ( CHAR_DATA *ch, int gn) );
void     gn_remove    args( ( CHAR_DATA *ch, int gn) );
void     group_add    args( ( CHAR_DATA *ch, const char *name, bool deduct) );
void    group_remove    args( ( CHAR_DATA *ch, const char *name) );
void	do_second		(CHAR_DATA *ch, char *argument);

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

/* teleport.c */
RID *    room_by_name    args( ( char *target, int level, bool error) );

/* update.c */
void    advance_level    args( ( CHAR_DATA *ch, bool hide ) );
void    gain_exp    args( ( CHAR_DATA *ch, int gain ) );
void    gain_condition    args( ( CHAR_DATA *ch, int iCond, int value ) );
void    update_handler    args( ( void ) );

 /* mount.c */
 int     mount_success	args( ( CHAR_DATA *ch, CHAR_DATA *mount, int canattack ) );
 void    do_mount        args( ( CHAR_DATA *ch, char *argument ) );
 void    do_dismount     args( ( CHAR_DATA *ch, char *argument ) );
 void	do_buy_mount	args( ( CHAR_DATA *ch, char *argument ) );

/* string.c */
void    string_edit    args( ( CHAR_DATA *ch, char **pString ) );
void    string_append   args( ( CHAR_DATA *ch, char **pString ) );
char *    string_replace    args( ( char * orig, char * old, char * new ) );
void    string_add      args( ( CHAR_DATA *ch, char *argument ) );
char *  format_string   args( ( char *oldstring /*, bool fSpace */ ) );
char *  first_arg       args( ( char *argument, char *arg_first, bool fCase ) );
char *    string_unpad    args( ( char * argument ) );
char *    string_proper    args( ( char * argument ) );

/* olc.c */
bool    run_olc_editor    args( ( DESCRIPTOR_DATA *d ) );
char    *olc_ed_name    args( ( CHAR_DATA *ch ) );
char    *olc_ed_vnum    args( ( CHAR_DATA *ch ) );
CLAN_DATA *get_clan_data	args( ( int clan ) );

// olc_save.c
void    save_guilds     args( ( CHAR_DATA *ch, char *argument ) );
char 	*fwrite_flag	args( ( long flags, char buf[] ) );

/* lookup.c */
int    race_lookup    args( ( const char *name) );
int    item_lookup    args( ( const char *name) );
int    liq_lookup    args( ( const char *name) );
int race_lookup_by_spec args ((const char * name, CHAR_DATA *ch));

/* weather.c */
bool    number_chance 		args((int num));
void    show_weather            args(( CHAR_DATA *ch ));
bool    IS_OUTDOORS      args(( CHAR_DATA *ch ));

/* act_newc.c */
void    bank_update     args( ( void ) );
void    bank_update2     args( ( void ) );
char	*makedrunk	args( (char *string, CHAR_DATA *ch) );
char *strip_color args(( char *string ));
int strlen_color args(( char *argument ));

/* track.c */
CD *      get_char_area	args( ( CHAR_DATA *ch, char *argument ) );

/*char * crypt (char *, char *);*/

#undef    CD
#undef    MID
#undef    OD
#undef    OID
#undef    RID
#undef    SF
#undef AD

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


/*
 * Area flags.
 */
#define         AREA_NONE       0
#define         AREA_CHANGED    1    /* Area has been modified. */
#define         AREA_ADDED      2    /* Area has been added to. */
#define         AREA_LOADING    4    /* Used for counting in db.c */

#define MAX_DIR    6
#define NO_FLAG -99    /* Must not be used in flags or stats. */

/*
 * Global Constants
 */
extern    char *    const    dir_name        [];
extern    const    sh_int    rev_dir         [];          /* sh_int - ROM OLC */
extern    const    struct    spec_type    spec_table    [];

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

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

extern        long            top_vnum_mob;
extern        long            top_vnum_obj;
extern        long            top_vnum_room;

extern        char            str_empty       [1];

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        MPROG_QUEUE_DATA *   mprog_queue;

extern        MPROG_QUEUE_DATA *   mprog_queue_last;
extern        char             **r_argv;

/* FastRom Additions
 *
 * I reserve this spot for stuff I might add specifically for
 * FastRom. -- Jim Robinson
 */
#define DEFAULT_ANSI TRUE

// This was done by Ammaross Danan (ammaross@ardenmore.com)

void     queue_mprog args(( int vnum, char *pos, CHAR_DATA *mob, CHAR_DATA *ch, const void *arg1, const void *arg2, sh_int delay, int level, int *state, int *cond ));
void 	exec_mprog_queue	args(( MPROG_QUEUE_DATA *mpq ));
void 	dequeue_mprog		args(( MPROG_QUEUE_DATA *mpq ));
void 	mprog_queue_update	args(( void ));


struct mprog_queue_type
{
	int 		vnum;
	CHAR_DATA *	mob;
	CHAR_DATA *	ch;
	void *		arg1;
	void *		arg2;
	sh_int 		delay;
	char *		pos;
	/* program_flow state data */
	int level;
	int state[MAX_NESTED_LEVEL], /* Block state (BEGIN,IN,END) */
		cond[MAX_NESTED_LEVEL];  /* Boolean value based on the last if-check */
	/* next in queue */
	MPROG_QUEUE_DATA *next;

};