/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, 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.                                                  *
 ***************************************************************************/


#include "status.h"

#define exit(a) if (fBootDb && ((a) == STATUS_ERROR)) \
                exit (STATUS_BOOT_ERROR); else exit (a)
#define is_digit(a) (((a) >= '0') && ((a) <= '9'))
#define sbug(a) bug (a,0)
/*
 * Accommodate old non-Ansi compilers.
 */
#if defined(TRADITIONAL)
#define const
#define args( list )			( )
#define DECLARE_DO_FUN( fun )		void fun( )
#define DECLARE_SPEC_FUN( fun )		bool fun( )
#define DECLARE_SPELL_FUN( fun )	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
#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 int			        sh_int;
typedef unsigned char			bool;
#endif
typedef unsigned char			byte;


/*
 * Structure types.
 */
typedef struct	affect_data		AFFECT_DATA;
typedef struct	ban_data		BAN_DATA;
typedef struct	char_data		CHAR_DATA;
typedef struct  room_data               ROOM_DATA;
typedef struct  level_data              LEVEL_DATA;
typedef struct	descriptor_data		DESCRIPTOR_DATA;
typedef struct	help_data		HELP_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	time_info_data		TIME_INFO_DATA;
typedef struct  social_type             SOCIAL_TYPE;
typedef struct  god_type                GOD_TYPE;
typedef struct  account_data		ACCOUNT_DATA;
typedef struct  top_data		TOP_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 ) );



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

#define MAX_INT			32768

#define VALID_VALUE                82 /* some exact number to avoid accidental
                                         validation due to memory corruption */

/*
 * Game parameters.
 * Increase the max'es if you add more of something.
 * Adjust the pulse numbers to suit yourself.
 */
#define MAX_SOCIALS		  256
#define MAX_IN_GROUP		   15
#define MAX_TRUST                  10
#define MAX_NUMBER_CARRY           15
#define HIT_POINTS_MORTAL        6666
#define HIT_POINTS_IMMORTAL   1000000
#define NUM_TOP			   10
#define LD_TICKS		   30

#define PULSE_PER_SECOND	    4
#define PULSE_OBJECTS             ( 1 * PULSE_PER_SECOND)
#define PULSE_VIOLENCE		  ( 1 * PULSE_PER_SECOND)
#define PULSE_TICK		  (10 * PULSE_PER_SECOND)
#define PULSE_SAVE                (200 * PULSE_PER_SECOND)

/*
 * Site ban structure.
 */
struct	ban_data
{
    BAN_DATA *	next;
    char 	name[MAX_INPUT_LENGTH];
    char        reason[MAX_INPUT_LENGTH];
};

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

/*
 * Connected state for a channel.
 */
#define CON_PLAYING			 0
#define CON_RESOLVE_ADDRESS		 1
#define CON_GET_ANSI                     2
#define CON_GET_NAME			 3
#define CON_GET_OLD_PASSWORD		 4
#define CON_GET_ACCNT_PASS		 5
#define CON_GET_ACCNT_PASS_ADDING	 6
#define CON_GET_NEW_ACCOUNT		 7
#define CON_CONFIRM_NEW_NAME		 8
#define CON_GET_ADMIN_PASS               9
#define CON_GET_NEW_PASSWORD		10
#define CON_CONFIRM_NEW_PASSWORD	11
#define CON_GET_ADMIN_CHAR_NAME         12
#define CON_GET_NEW_SEX			13
#define CON_DEFAULT_CHOICE		15 
#define CON_READ_IMOTD			16
#define CON_READ_MOTD			17
#define CON_BREAK_CONNECT		18

#define COUNT_WEAPONS    0
#define COUNT_ARMOR      1
#define COUNT_EXPLOSIVES 2
#define COUNT_AMMO	 3
#define COUNT_MISC	 4
#define NUM_COUNTS	 5

#define ITEM_MISC                       0
#define ITEM_WEAPON                     1
#define ITEM_ARMOR                      2
#define ITEM_EXPLOSIVE                  3
#define ITEM_AMMO                       4
#define ITEM_TEAM_VEHICLE               5
#define ITEM_TEAM_ENTRANCE              6

/* ammo types */
#define AMMO_9MM                        0
#define AMMO_GREN_LAUNCHER              6
#define AMMO_FLARE                      13
#define AMMO_TANK_GUN                   14

/* general flags */
#define GEN_CAN_BURY                   (B)
#define GEN_BURNS_ROOM                 (D)
#define GEN_DETECT_MINE                (G)
#define GEN_ANTI_BLIND                 (H)
#define GEN_DARKS_ROOM		       (J)
#define GEN_EXTRACT_ON_IMPACT	       (K)
#define GEN_SEE_IN_DARK		       (L)

/* extract flags */
#define EXTRACT_EXPLODE_ON_EXTRACT     (A)
#define EXTRACT_BLIND_ON_EXTRACT       (B)
#define EXTRACT_BURN_ON_EXTRACT        (C)
#define EXTRACT_STUN_ON_EXTRACT        (D)
#define EXTRACT_DARK_ON_EXTRACT	       (E)

/* usage flags */
#define USE_HEAL                       (A)
#define USE_EVAC                       (D)
#define USE_MAKE_DROID                 (E)
#define USE_MAKE_SEEKER_DROID          (F)

/* search types */
#define SEARCH_ITEM_TYPE    0
#define SEARCH_GEN_FLAG     1
#define SEARCH_AMMO_TYPE    2

/* some common objects */
#define VNUM_GRENADE                   1
#define VNUM_9MM_CLIP                  2
#define VNUM_9MM_PISTOL                3
#define VNUM_FIRE                      5
#define VNUM_NAPALM                    6
#define VNUM_HQ			       7
#define VNUM_DARK		       24

/*
 * Descriptor (channel) structure.
 */
struct	descriptor_data
{
    DESCRIPTOR_DATA *	next;
    DESCRIPTOR_DATA *	snoop_by;
    CHAR_DATA *		character;
    CHAR_DATA *		original;
    GOD_TYPE           *adm_data;
    unsigned int	time;
    pid_t		host_lookup_pid;
    char		host[80];
    sh_int		descriptor;
    sh_int		connected;
    int                 wait;
    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;
    int			max_out;
    char *		showstr_head;
    char *		showstr_point;
};

/* allocation validation structure */
struct allocations_type
{
  void *ptr;
  int size;
  char *filename;
  int line_num;
  struct allocations_type *next;
};

struct god_type
{
  char                 *rl_name;
  sh_int                trust;
  char                 *game_names;
  char                 *password;
  char                 *room_name;
  int			honorary;
};

struct account_data
{
  char *login;
  char *password;
  char *character;
  struct account_data *next;
};

struct top_data
{
  char *name;
  int kills;
};

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

/* raw proportion (out of 1k) of kp to be transfered before tax */
#define KILL_TRANSFER_PROPORTION 2

#define KP_BADASS 1500
/*
 * Help table types.
 */
struct	help_data
{
    HELP_DATA *	next;
    sh_int	level;
    char *	keyword;
    char *	text;
};

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

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

#define A		  	1
#define B			2
#define C			4
#define D			8
#define E			16
#define F			32
#define G			64
#define H			128

#define I			256
#define J			512
#define K		        1024
#define L		 	2048
#define M			4096
#define N		 	8192
#define O			16384
#define P			32768

#define Q			65536
#define R			131072
#define S			262144
#define T			524288
#define U			1048576
#define V			2097152
#define W			4194304
#define X			8388608

#define Y			16777216
#define Z			33554432
#define aa			67108864 	/* doubled due to conflicts */
#define bb			134217728
#define cc			268435456    
#define dd			536870912
#define ee			1073741824

/* mob behaviors */
#define BEHAVIOR_LD 0
#define BEHAVIOR_GUARD 1
#define BEHAVIOR_SEEK 2
#define BEHAVIOR_WANDER 3
#define BEHAVIOR_PILLBOX 4
#define BEHAVIOR_SEEKING_PILLBOX 5
#define BEHAVIOR_PLAYER_CONTROL 6

#define LIFETIME_SMOKE 100

/*
 * Bits for 'affected_by'.
 * Used in #MOBILES.
 */
#define AFF_BLIND		(A)
#define AFF_DAZE		(B)

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

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

/*
 * 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_TWO_HANDS		(P)


/*
 * Room flags.
 * Used in #ROOMS.
 */
#define ROOM_DARK		(A)
#define ROOM_TANK               (B)
#define ROOM_CONNECTED          (C)/* used at boot to guarantee connectivity */
#define ROOM_PRIVATE		(J)
#define ROOM_SAFE		(K)
#define ROOM_SOLITARY		(L)
#define ROOM_GODS_ONLY		(P)
#define ROOM_NEWBIES_ONLY	(R)


/*
 * 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_ISWALL                     (D)
#define EX_ISNOBREAKWALL              (E)
#define EX_ISNOBREAKDOOR              (F)
#define EX_ISNOLOCKDOOR               (G)
#define EX_ISNOUNLOCKDOOR             (H)

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



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

/*
 * 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_AGGRO_ALL           (L)
#define PLR_HOLYLIGHT		(N)
#define PLR_WIZINVIS		(O)
#define PLR_NOLEADER		(P)
#define PLR_LOG			(W)
#define PLR_DENY		(X)
#define PLR_FREEZE		(Y)

/*temp flags*/
/*tank flags*/
#define IN_TANK                 (A)
#define MAN_SHIELD              (B)
#define MAN_TURRET              (C)
#define MAN_DRIVE               (D)
#define TRAITOR                 (E)

/* RT comm flags -- may be used on both mobs and chars */
#define COMM_QUIET              (A)
#define COMM_NOWIZ              (B)
#define COMM_NOIMP		(C)
#define COMM_NOBOUNTY           (F)
#define COMM_NOKILLS            (G)

/* 4 channels reserved, H-K */

/* display flags */
#define COMM_COMPACT		(L)
#define COMM_BRIEF		(M)
#define COMM_PROMPT		(N)
#define COMM_COMBINE		(O)
#define COMM_TELNET_GA		(P)
/* 3 flags reserved, Q-S */

/* penalties */
#define COMM_NOEMOTE		(T)
#define COMM_NOSHOUT		(U)
#define COMM_NOTELL		(V)
#define COMM_NOCHANNELS		(W) 

struct level_data
{
  sh_int                num_levels;
  sh_int                level_number;
  sh_int                x_size;
  sh_int                y_size;
  sh_int                reference_x;/* x,y coordinates of room directly below*/
  sh_int                reference_y;/* the reference from the previous level */
  ROOM_DATA *           rooms_on_level;
  LEVEL_DATA *          level_down;
  LEVEL_DATA *          level_up;
};

struct room_data
{
  CHAR_DATA *           people;
  OBJ_DATA *            contents;
  OBJ_DATA *            mine;
  LEVEL_DATA *          this_level;
  OBJ_DATA *            interior_of;
  CHAR_DATA *		inside_mob;
  long                  exit[6];
  long                  room_flags;
  int                   x, y, level;
  char *                name;
  char *                description;
};

/*
 * One character (PC or NPC).
 */
struct	char_data
{
    CHAR_DATA *		next;
    CHAR_DATA *		next_in_room;
    CHAR_DATA *         next_extract;
    CHAR_DATA *		leader;
    CHAR_DATA *		fighting;
    CHAR_DATA *		chasing;
    CHAR_DATA *		reply;
    CHAR_DATA *		last_hit_by;
    CHAR_DATA *		owner;
    SPEC_FUN *		spec_fun;
    DESCRIPTOR_DATA *	desc;
    NOTE_DATA *		pnote;
    OBJ_DATA *		carrying;
    ROOM_DATA *	        in_room;
    ROOM_DATA *		interior;
    PC_DATA *		pcdata;
    int			allows_followers;
    char		*kill_msg;
    char        	*names;
    char                *where_start;
    sh_int              valid; /* added for debugging purposes */
    sh_int              move_delay;
    sh_int              carry_number;
    sh_int              carry_weight;
    sh_int              ld_behavior;
    char 		*short_descript;
    sh_int		sex;
    sh_int		trust;
    byte 		color; 
    int			played;
    int			lines;  /* for the pager */
    time_t		logon;
    time_t		last_note;
    time_t		last_fight; 
    sh_int		timer;
    sh_int		wait;
    int                 kills, deaths;
    int			hit;
    int			max_hit;
    long		act, temp_flags;
    long		comm;   /* RT added to pad the vector */
    sh_int		invis_level;
    sh_int              armor;
    int			affected_by;
    sh_int		position;
    sh_int              start_pos;
    sh_int		donate_num;
    int			chan_delay;
    int			report;
    int			ld_timer;
    int			turret_dir, shield_dir; /* used only for tanks */
};

/*
 * Data which only PC's have.
 */
struct	pc_data
{
    PC_DATA *		next;
    char 		*password;
    char 		*poofin_msg;
    char 		*poofout_msg;
    char		*title_line;
    char                *account;
    int			solo_hit;
    bool              	confirm_delete;

    byte 		color_action;
    byte		color_combat_condition_s;
    byte		color_combat_condition_o;
    byte 		color_xy;
    byte 		color_wizi;
    byte 		color_hp;
    byte 		color_combat_o;
    byte 		color_level;
    byte 		color_exits;
    byte 		color_desc;
    byte		color_obj;
    byte		color_say;
    byte		color_tell;
    byte		color_reply;


};

struct	obj_index_data
{
/*    OBJ_INDEX_DATA *	next;*/
    char *		name;
    char *		short_descr;
    char *		description;
    char *              explode_desc;
    sh_int		vnum;
    int                 hp_struct;
    int                 hp_char;
    sh_int		item_type;
    sh_int              count;
    sh_int              prob_in, number_to_put_in;
    int			extract_flags, general_flags, usage_flags;
    sh_int		wear_flags;
    sh_int              ammo_type;
    sh_int              burn_time;
    sh_int              ammo;
    sh_int		weight;
    sh_int              range;
    sh_int              rounds_per_second;
    sh_int              armor;
    sh_int              damage_char[3]; /* 0. direct 1. in room 2. 1 away */
    sh_int              damage_structural[3];
};



/*
 * One object.
 */
struct	obj_data
{
    OBJ_DATA *		next;
    OBJ_DATA *		next_content;
    OBJ_DATA *		contains;
    OBJ_DATA *          in_obj;
    CHAR_DATA *		carried_by;
    OBJ_INDEX_DATA *	pIndexData;
    ROOM_DATA *	        in_room;
    CHAR_DATA *	        owner;
    char *		name;
    char *		short_descr;
    char *		description;
    char *              explode_desc;
    sh_int              valid; /* added for debugging purposes */
    sh_int		item_type;
    sh_int              vnum;
    int			extract_flags, general_flags, usage_flags;
    int                 hp_struct;
    int                 hp_char;
    sh_int              extract_me;
    sh_int		wear_flags;
    sh_int		wear_loc;
    sh_int		weight;
    sh_int		timer;
    sh_int              range;
    sh_int              rounds_per_second;
    sh_int              armor;
    sh_int              arrival_time;
    sh_int              ammo;
    sh_int              ammo_type;
    sh_int              wait_time;
    sh_int              dir_facing;
    sh_int              burn_time;
    ROOM_DATA *         destination;
    ROOM_DATA *         interior; /* tank or plane interior */
    sh_int              damage_char[3]; /* 0. direct 1. in room 2. 1 away */
    sh_int              damage_structural[3];
};

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

/*
 * Character macros.
 */
#define IS_NPC(ch)		(((ch)->pcdata == NULL))
#define IS_IMMORTAL(ch)		(get_trust(ch))
#define IS_HERO(ch)		(get_trust(ch))
#define IS_IMP(ch)		(get_trust(ch) == MAX_TRUST)
#define IS_TRUSTED(ch,level)	(get_trust(ch))

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

#define IS_AWAKE(ch)		(ch->position > POS_SLEEPING)

#define WAIT_STATE(ch, npulse)	((ch)->wait = UMAX((ch)->wait, (npulse)))
#define DESC_WAIT_STATE(d, npulse) ((d)->wait = UMAX((d)->wait, (npulse)))


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



/*
 * Description macros.
 */
#define PERS(ch, looker)	( can_see( looker, (ch) ) ?		\
				( IS_NPC(ch) ? (ch)->short_descript	\
				: (ch)->names ) : "someone" )

/*
 * Structure for a social in the socials table.
 */
struct	social_type
{
    char *    name;
    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          struct social_type      social_table[MAX_SOCIALS];
extern  const   struct god_type         imp_table[];

/*
 * Global variables.
 */
extern		HELP_DATA	  *	help_first;
extern		BAN_DATA	  *	ban_list;
extern		BAN_DATA	  *	nban_list;
extern		CHAR_DATA	  *	char_list;
extern		DESCRIPTOR_DATA   *	descriptor_list;
extern		NOTE_DATA	  *	note_list;
extern		OBJ_DATA	  *	object_list;

extern          OBJ_DATA          *     object_list;
extern          OBJ_INDEX_DATA    *     all_objects;
extern          LEVEL_DATA        *     the_city;
extern		BAN_DATA	  *	ban_free;
extern		CHAR_DATA	  *	char_free;
extern		DESCRIPTOR_DATA	  *	descriptor_free;
extern		NOTE_DATA	  *	note_free;
extern		OBJ_DATA	  *	obj_free;
extern		PC_DATA		  *	pcdata_free;

extern		char			bug_buf		[];
extern		time_t			current_time;
extern		bool			fLogAll;
extern		FILE *			fpReserve;
extern		char			log_buf		[];
extern		TIME_INFO_DATA		time_info;
extern		sh_int      		team_choice;
extern          sh_int                  teleport_time;
extern          int                     tick_counter;
extern          int                     expansions;
extern          int                    ground0_down;
extern		ROOM_DATA	   *ammo_repop[3];
extern          ROOM_DATA              *safe_area, *someimp_area;
extern          ROOM_DATA              *god_general_area;
extern		ROOM_DATA	       *explosive_area;
extern		ROOM_DATA	       *store_area;
extern          int                     game_seed;
extern          int                     boot_seed;
extern          GOD_TYPE               *god_table;
extern          int                     iteration;
extern          CHAR_DATA              *next_violence;
extern		int		        max_on;
extern		CHAR_DATA	       *enforcer;
extern		CHAR_DATA	       *pill_box;
extern		CHAR_DATA	       *guardian;
extern		CHAR_DATA	       *tank_mob;
extern		ACCOUNT_DATA	       *accounts_list;
extern		TOP_DATA	        top_players_kills[NUM_TOP];
extern		CHAR_DATA	       *extract_list;
extern		int			expand_event;
extern		bool			fBootDb;

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

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

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

#if	defined(linux)
char *	crypt		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 *	crypt		args( ( const char *key, const char *salt ) );
#endif

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

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

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

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

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



/*
 * The crypt(3) function is not available on some operating systems.
 * In particular, the U.S. Government prohibits its export from the
 *   United States to foreign countries.
 * Turn on NOCRYPT to keep passwords in plain text.
 */
#if	defined(NOCRYPT)
#define crypt(s1, s2)	(s1)
#endif



/*
 * Data files used by the server.
 *
 * AREA_LIST contains a list of areas to boot.
 * All files are read in completely at bootup.
 * Most output files (bug, idea, typo, shutdown) are append-only.
 *
 * The NULL_FILE is held open so that we have a stream handle in reserve,
 *   so players can go ahead and telnet to all the other descriptors.
 * Then we close it whenever we need to open a file (e.g. a save file).
 */
#if defined(unix)
#define PLAYER_DIR	"../player/"	 /* Player files		*/
#define BAK_PLAYER_DIR	"../player/bak/" /* deleted player files       	*/
#define PLAYER_TEMP	"../player/temp"
#define GOD_DIR		"../gods/"	/* list of gods			*/
#define NULL_FILE	"/dev/null"	/* To reserve one stream	*/
#define BOOT_DIR	"../boot/"
#define ACCOUNTS_FILE   "../boot/accounts.boot" /* account list */
#define TOP_FILE        "../boot/top.boot" /* account list */
#endif

#define BOOT_LIST	"files.boot"	/* List of boot files		*/
#define BAN_LIST	"ban.boot"	/* List of banned sites		*/
#define NBAN_LIST	"nban.boot"	/* List of banned sites		*/

#define BUG_FILE	"../boot/bugs.txt"      /* For 'bug' and bug( )	*/
#define IDEA_FILE	"../boot/ideas.txt"	/* For 'idea'		*/
#define TYPO_FILE	"../boot/typos.txt"     /* For 'typo'		*/
#define NOTE_FILE	"../boot/notes.txt"	/* For 'notes'		*/
#define SHUTDOWN_FILE	"../boot/shutdown.txt"	/* For 'shutdown'	*/
#define REBOOT_FILE	"../boot/reboot.txt"	/* For 'reboot'	*/



/*
 * Our function prototypes.
 * One big lump ... this is every function in Merc.
 */
#define CD	CHAR_DATA
#define OD	OBJ_DATA
#define OID	OBJ_INDEX_DATA
#define RD	ROOM_DATA
#define SF	SPEC_FUN

/* act_comm.c */
bool    is_note_to      args( ( CHAR_DATA *ch, NOTE_DATA *pnote ) );
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 ) );

/* act_info.c */
void	set_title	args( ( CHAR_DATA *ch, char *title ) );
int get_num_rank (CHAR_DATA *ch);
char *get_rank (CHAR_DATA *ch);
int is_leader (CHAR_DATA *ch);

/* act_move.c */
void	move_char	args( ( CHAR_DATA *ch, int door, bool follow ) );
ROOM_DATA*  get_to_room args( ( ROOM_DATA *curr_room, sh_int door));
ROOM_DATA*  index_room  args( ( ROOM_DATA *curr_room, sh_int x, sh_int y));
void    complete_movement (CHAR_DATA *ch);

/* act_obj.c */
bool can_loot		args( (CHAR_DATA *ch, OBJ_DATA *obj) );
void    get_obj         args( ( CHAR_DATA *ch, OBJ_DATA *obj,
                            OBJ_DATA *container ) );
CHAR_DATA *owner_objective (int num);

/* act_wiz.c */

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

/* db.c */
void	boot_db		args( ( void ) );
void	area_update	args( ( void ) );
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 ) );
void	free_char	args( ( CHAR_DATA *ch ) );
OID *	get_obj_index	args( ( int vnum ) );
char	fread_letter	args( ( FILE *fp ) );
int	fread_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 mark_alloc (void *ptr, int size, struct allocations_type **first_alloc,
		 char *filename, int line_num);
void mark_free (void *ptr, struct allocations_type **first_alloc, 
		char *filename, int line_num);
struct allocations_type *get_mem_reference (void *ptr, 
				      struct allocations_type **first_alloc);
int size_correct (void *ptr, int size, struct allocations_type **first_alloc);
#define alloc_mem(sMem)      f_alloc_mem (sMem, __FILE__, __LINE__)
#define alloc_perm(sMem)     f_alloc_perm (sMem, __FILE__, __LINE__)
#define free_mem(pMem, sMem) f_free_mem (pMem, sMem, __FILE__, __LINE__)
#define str_dup(str)         f_str_dup (str, __FILE__, __LINE__)
#define really_str_dup(str)  f_really_str_dup (str, __FILE__, __LINE__)
#define free_string(pstr)    f_free_string (pstr, __FILE__, __LINE__)
void *	f_alloc_mem	args( ( int sMem, char *filename, int line_num ) );
void *	f_alloc_perm	args( ( int sMem, char *filename, int line_num ) );
void	f_free_mem	args( ( void *pMem, int sMem, char *filename, 
			       int line_num ) );
char *	f_str_dup		args( ( const char *str, char *filename,
				       int line_num) );
char *	f_really_str_dup	args( ( const char *str, char *filename,
				       int line_num) );
void	f_free_string	args( ( char *pstr, char *filename, int line_num) );
int	number_fuzzy	args( ( int number ) );
int	number_range	args( ( int from, int to ) );
int	number_percent	args( ( void ) );
int	number_door	args( ( void ) );
int	number_bits	args( ( int width ) );
int     number_mm       args( ( void ) );
int	dice		args( ( int number, int size ) );
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	(char *str, ...);
void	tail_chain	args( ( void ) );
void    expand_city ();  
void load_accounts (FILE *fp);

/* 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 ) );
void	update_pos	args( ( CHAR_DATA *victim ) );
void	stop_fighting	args( ( CHAR_DATA *ch, bool fBoth ) );

/* handler.c */
int 	check_immune	args( (CHAR_DATA *ch, int dam_type) );
int 	material_lookup args( ( const char *name) );
int	race_lookup	args( ( const char *name) );
int	class_lookup	args( ( const char *name) );
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_name_exact ( 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_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_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, int perm_extract) );
void	extract_char	args( ( CHAR_DATA *ch, bool fPull ) );
CD *	get_char_room	args( ( CHAR_DATA *ch, char *argument ) );
CD *	get_char_world	args( ( CHAR_DATA *ch, char *argument ) );
OD *	get_obj_type	args( ( OBJ_INDEX_DATA *pObjIndexData ) );
OD *	get_obj_list	args( ( CHAR_DATA *ch, char *argument,
			    OBJ_DATA *list ) );
OD *	get_obj_carry	args( ( CHAR_DATA *ch, char *argument ) );
OD *	get_obj_wear	args( ( CHAR_DATA *ch, char *argument ) );
OD *	get_obj_here	args( ( CHAR_DATA *ch, char *argument ) );
OD *	get_obj_world	args( ( CHAR_DATA *ch, char *argument ) );
OD *	create_money	args( ( int amount ) );
int	get_obj_number	args( ( OBJ_DATA *obj ) );
int	get_obj_weight	args( ( OBJ_DATA *obj ) );
bool	room_is_dark	args( ( ROOM_DATA *pRoomIndex ) );
bool	room_is_private	args( ( ROOM_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_DATA *pRoomIndex) );
bool	can_drop_obj	args( ( CHAR_DATA *ch, OBJ_DATA *obj ) );
char *	item_type_name	args( ( OBJ_DATA *obj ) );
char *	affect_loc_name	args( ( int location ) );
char *	affect_bit_name	args( ( 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 *	weapon_bit_name	args( ( int weapon_flags ) );
char *  comm_bit_name	args( ( int comm_flags ) );
int rem_from_top (TOP_DATA *top_array, CHAR_DATA *ch);
int better_than (CHAR_DATA *ch, TOP_DATA *top_array, int num);
void add_to_top (TOP_DATA *top_array, CHAR_DATA *ch, int num);
void show_top_list (CHAR_DATA *ch, TOP_DATA *top_array);
void insert_top (CHAR_DATA *ch, TOP_DATA *top_array);
void top_stuff (CHAR_DATA *ch);

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

/* magic.c */
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 ) );
void	obj_cast_spell	args( ( int sn, int level, CHAR_DATA *ch,
				    CHAR_DATA *victim, OBJ_DATA *obj ) );

/* save.c */
void	   save_char_obj	args( ( CHAR_DATA *ch ) );
CHAR_DATA *load_char_obj	args( ( DESCRIPTOR_DATA *d, char *name ) );
void save_account_list ();

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

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

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

#undef	CD
#undef	OD
#undef	OID
#undef	RID
#undef	SF